<?php
/**
 * File containing the ezcMailParser class
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 * @package Mail
 * @version //autogen//
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 */

/**
 * Parses a mail in RFC822 format to an ezcMail structure.
 *
 * By default an object of class {@link ezcMail} is returned by the parser. If
 * you want to use your own mail class (which extends {@link ezcMail}),
 * use {@link ezcMailParserOptions}. Example:
 *
 * <code>
 * $options = new ezcMailParserOptions();
 * $options->mailClass = 'myCustomMailClass'; // extends ezcMail
 *
 * $parser = new ezcMailParser( $options );
 * </code>
 *
 * Another way to do this is:
 * <code>
 * $parser = new ezcMailParser();
 * $parser->options->mailClass = 'myCustomMailClass'; // extends ezcMail
 * </code>
 *
 * File attachments will be written to disk in a temporary directory.
 * This temporary directory and the file attachment will be removed
 * when PHP ends execution. If you want to keep the file you should move it
 * to another directory.
 *
 * By default objects of class {@link ezcMailFile} are created to handle file
 * attachments. If you want to use your own file class (which extends
 * {@link ezcMailFile}), use {@link ezcMailParserOptions}. Example:
 *
 * <code>
 * $options = new ezcMailParserOptions();
 * $options->fileClass = 'myCustomFileClass'; // extends ezcMailFile
 *
 * $parser = new ezcMailParser( $options );
 * </code>
 *
 * Another way to do this is:
 * <code>
 * $parser = new ezcMailParser();
 * $parser->options->fileClass = 'myCustomFileClass'; // extends ezcMailFile
 * </code>
 *
 * By default objects of class {@link ezcMailTextPart} are created for text
 * attachments. If you want to use ezcMailFile objects instead, use
 * {@link ezcMailParserOptions}. Example:
 *
 * <code>
 * $options = new ezcMailParserOptions();
 * $options->parseTextAttachmentsAsFiles = true;
 *
 * $parser = new ezcMailParser( $options );
 * </code>
 *
 * Another way to do this is:
 * <code>
 * $parser = new ezcMailParser();
 * $parser->options->parseTextAttachmentsAsFiles = true;
 * </code>
 *
 * @property ezcMailParserOptions $options
 *           Holds the options you can set to the mail parser.
 *
 * @package Mail
 * @version //autogen//
 * @mainclass
 */
class ezcMailParser
{
    /**
     * Holds the parser of the current mail.
     *
     * @var ezcMailPartParser
     */
    private $partParser = null;

    /**
     * Holds the directory where parsed mail should store temporary files.
     *
     * @var string
     */
    private static $tmpDir = null;

    /**
     * Holds options you can be set to the mail parser.
     *
     * @var ezcMailParserOptions
     */
    private $options;

    /**
     * Constructs a new mail parser.
     *
     * For options you can set to the mail parser see {@link ezcMailParserOptions}.
     *
     * @throws ezcBasePropertyNotFoundException
     *         if $options contains a property not defined
     * @throws ezcBaseValueException
     *         if $options contains a property with a value not allowed
     * @param ezcMailParserOptions|array(string=>mixed) $options
     */
    public function __construct( $options = array() )
    {
        if ( $options instanceof ezcMailParserOptions )
        {
            $this->options = $options;
        }
        else if ( is_array( $options ) )
        {
            $this->options = new ezcMailParserOptions( $options );
        }
        else
        {
            throw new ezcBaseValueException( "options", $options, "ezcMailParserOptions|array" );
        }
    }

    /**
     * Sets the property $name to $value.
     *
     * @throws ezcBasePropertyNotFoundException
     *         if the property $name does not exist
     * @throws ezcBaseValueException
     *         if $value is not accepted for the property $name
     * @param string $name
     * @param mixed $value
     * @ignore
     */
    public function __set( $name, $value )
    {
        switch ( $name )
        {
            case 'options':
                if ( !( $value instanceof ezcMailParserOptions ) )
                {
                    throw new ezcBaseValueException( 'options', $value, 'instanceof ezcMailParserOptions' );
                }
                $this->options = $value;
                break;

            default:
                throw new ezcBasePropertyNotFoundException( $name );
        }
    }

    /**
     * Returns the value of the property $name.
     *
     * @throws ezcBasePropertyNotFoundException
     *         if the property $name does not exist
     * @param string $name
     * @ignore
     */
    public function __get( $name )
    {
        switch ( $name )
        {
            case 'options':
                return $this->options;
            
            default:
                throw new ezcBasePropertyNotFoundException( $name );
        }
    }

    /**
     * Returns true if the property $name is set, otherwise false.
     *
     * @param string $name
     * @return bool
     * @ignore
     */
    public function __isset( $name )
    {
        switch ( $name )
        {
            case 'options':
                return true;

            default:
                return false;
        }
    }

    /**
     * Returns an array of ezcMail objects parsed from the mail set $set.
     *
     * You can optionally use ezcMailParserOptions to provide an alternate class
     * name which will be instantiated instead of ezcMail, if you need to extend
     * ezcMail.
     *
     * Example:
     * <code>
     * $options = new ezcMailParserOptions();
     * $options->mailClass = 'MyMailClass';
     *
     * $parser = new ezcMailParser( $options );
     * // if you want to use MyMailClass which extends ezcMail
     * </code>
     *
     * @apichange Remove second parameter
     *
     * @throws ezcBaseFileNotFoundException
     *         if a neccessary temporary file could not be openened.
     * @param ezcMailParserSet $set
     * @param string $class Deprecated. Use $mailClass in ezcMailParserOptions class instead.
     * @return array(ezcMail)
     */
    public function parseMail( ezcMailParserSet $set, $class = null )
    {
        $mail = array();
        if ( !$set->hasData() )
        {
            return $mail;
        }
        if ( $class === null )
        {
            $class = $this->options->mailClass;
        }
        do
        {
            $this->partParser = new ezcMailRfc822Parser();
            $data = "";
            $size = 0;
            while ( ( $data = $set->getNextLine() ) !== null )
            {
                $this->partParser->parseBody( $data );
                $size += strlen( $data );
            }
            $part = $this->partParser->finish( $class );
            $part->size = $size;
            $mail[] = $part;
        } while ( $set->nextMail() );
        return $mail;
    }

    /**
     * Sets the temporary directory.
     *
     * The temporary directory must be writeable by PHP. It will be used to store
     * file attachments.
     *
     * @todo throw if the directory is not writeable.
     * @param string $dir
     */
    public static function setTmpDir( $dir )
    {
        self::$tmpDir = $dir;
    }

    /**
     * Returns the temporary directory.
     *
     * Uses the PHP 5.2.1 function sys_get_temp_dir().
     *
     * Note that the directory name returned will have a "slash" at the end
     * ("/" for Linux and "\" for Windows).
     *
     * @return string
     */
    public static function getTmpDir()
    {
        if ( self::$tmpDir === null )
        {
            self::$tmpDir = sys_get_temp_dir();
            if ( substr( self::$tmpDir, strlen( self::$tmpDir ) - 1 ) !== DIRECTORY_SEPARATOR )
            {
                self::$tmpDir = self::$tmpDir . DIRECTORY_SEPARATOR;
            }
        }
        return self::$tmpDir;
    }
}
?>
