<?php
/**
 * File containing the ezcMvcRequest 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.
 *
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 * @version //autogentag//
 * @filesource
 * @package MvcTools
 */

/**
 * The request object holds the request data.
 *
 * The request object should be created by the request parser
 * in the first place.
 * It may also be returned by the controller, in the case of an
 * internal redirection.
 *
 * It holds the protocol dependant data in an ezcMvcRawRequest
 * object that is held in property $raw.
 *
 * It holds several structs which contain some protocol abstract
 * data in the following properties:
 * - $files: array of instances of ezcMvcRequestFile.
 * - $cache: instance of ezcMvcRequestCache
 * - $content: instance of ezcMvcRequestContent
 * - $agent: instance of ezcMvcRequestAgent
 * - $authentication: instance of ezcMvcRequestAuthentication
 *
 * It holds request variables like an array. For example, to hold
 * a 'controller' GET variable in $request['controller'].
 *
 * @package MvcTools
 * @version //autogentag//
 */
class ezcMvcRequest extends ezcBaseStruct
{
    /**
     * Date of the request
     *
     * @var DateTime
     */
    public $date;

    /**
     * Protocol description in a normalized form
     * F.e. http-get, http-post, http-delete, mail, jabber
     *
     * @var string
     */
    public $protocol;

    /**
     * Hostname of the requested server
     *
     * @var string
     */
    public $host;

    /**
     * Uri of the requested resource
     *
     * @var string
     */
    public $uri;

    /**
     * Full Uri - combination of host name and uri in a protocol independent
     * order
     *
     * @var string
     */
    public $requestId;

    /**
     * Request ID of the referring URI in the same format as $requestId
     *
     * @var string
     */
    public $referrer;

    /**
     * Request variables.
     *
     * @var array
     */
    public $variables;

    /**
     * Request body.
     *
     * @var string
     */
    public $body;

    /**
     * Files bundled with the request.
     *
     * @var array(ezcMvcRequestFile)
     */
    public $files;

    /**
     * Request content type informations.
     *
     * @var ezcMvcRequestAccept
     */
    public $accept;

    /**
     * Request user agent informations.
     *
     * @var ezcMvcRequestUserAgent
     */
    public $agent;

    /**
     * Request authentication data.
     *
     * @var ezcMvcRequestAuthentication
     */
    public $authentication;

    /**
     * Raw request data
     *
     * @var ezcMvcRawRequest
     */
    public $raw;

    /**
     * Contains all the cookies to be set
     *
     * @var array(ezcMvcRequestCookie)
     */
    public $cookies;

    /**
     * Whether this is a fatal error request, or a normal one
     *
     * @var boolean
     */
    public $isFatal;

    /**
     * Constructs a new ezcMvcRequest.
     *
     * @param DateTime $date
     * @param string $protocol
     * @param string $host
     * @param string $uri
     * @param string $requestId
     * @param string $referrer
     * @param array $variables
     * @param string $body
     * @param array(ezcMvcRequestFile) $files
     * @param ezcMvcRequestAccept $accept
     * @param ezcMvcRequestUserAgent $agent
     * @param ezcMvcRequestAuthentication $authentication
     * @param ezcMvcRawRequest $raw
     * @param array(ezcMvcRequestCookie) $cookies
     * @param bool $isFatal
     */
    public function __construct( $date = null, $protocol = '',
        $host = '', $uri = '', $requestId = '', $referrer = '',
        $variables = array(), $body = '', $files = null, $accept = null,
        $agent = null, $authentication = null, $raw = null, $cookies = array(), $isFatal = false )
    {
        $this->date = $date;
        $this->protocol = $protocol;
        $this->host = $host;
        $this->uri = $uri;
        $this->requestId = $requestId;
        $this->referrer = $referrer;
        $this->variables = $variables;
        $this->body = $body;
        $this->files = $files;
        $this->accept = $accept;
        $this->agent = $agent;
        $this->authentication = $authentication;
        $this->raw = $raw;
        $this->cookies = $cookies;
    }

    /**
     * Returns a new instance of this class with the data specified by $array.
     *
     * $array contains all the data members of this class in the form:
     * array('member_name'=>value).
     *
     * __set_state makes this class exportable with var_export.
     * var_export() generates code, that calls this method when it
     * is parsed with PHP.
     *
     * @param array(string=>mixed) $array
     * @return ezcMvcRequest
     */
    static public function __set_state( array $array )
    {
        return new ezcMvcRequest( $array['date'], $array['protocol'],
            $array['host'], $array['uri'], $array['requestId'],
            $array['referrer'], $array['variables'], $array['body'],
            $array['files'], $array['accept'], $array['agent'],
            $array['authentication'], $array['raw'], $array['cookies'],
            $array['isFatal'] );
    }
}
?>
