<?php
/**
 * -----------------------------------------------------------------------------
 *
 * SyL - Web Application Framework for PHP
 *
 * PHP version 4 (>= 4.3.x) or 5
 *
 * Copyright (C) 2006 k.watanabe
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * -----------------------------------------------------------------------------
 * @package   SyL
 * @author    k.watanabe <k.watanabe@syl.jp>
 * @copyright 2006 k.watanabe
 * @license   http://www.opensource.org/licenses/lgpl-license.php
 * @version   CVS: $Id: SyL_Request.php,v 1.8 2006/12/25 17:30:18 seasonstream Exp $
 * @link      http://www.syl.jp/
 * -----------------------------------------------------------------------------
 */

/**
 * リスエストクラス
 *
 * @package   SyL
 * @author    k.watanabe <k.watanabe@syl.jp>
 * @copyright 2006 k.watanabe
 * @license   http://www.opensource.org/licenses/lgpl-license.php
 * @version   CVS: $Id: SyL_Request.php,v 1.8 2006/12/25 17:30:18 seasonstream Exp $
 * @link      http://www.syl.jp/
 */
class SyL_Request
{
    /**
     * リクエストパラメータオブジェクト
     * 
     * @access private
     * @var object
     */
    var $parameter = null;
    /**
     * セッションオブジェクト
     * 
     * @access private
     * @var object
     */
    var $session = null;
    /**
     * クッキーオブジェクト
     * 
     * @access private
     * @var object
     */
    var $cookie = null;
    /**
     * ファイルオブジェクト
     * 
     * @access private
     * @var object
     */
    var $files = null;

    /**
     * コンストラクタ
     *
     * @access public
     */
    function SyL_Request()
    {
        // リクエストパラメータオブジェクト作成
        $this->createParameter();
        // ファイルアップロード時は、ファイルアップロードオブジェクトも作成
        if (isset($_SERVER['CONTENT_TYPE']) && preg_match('/multipart\/form\-data/', $_SERVER['CONTENT_TYPE'])) {
            $this->createFile();
        }
    }

    /**
     * SyL_Requestクラスのインスタンス取得
     *
     * singletonモデルを採用しているので、
     * 常に1つのインスタンスの参照が取得される。
     *
     * ※取得方法
     *   $SyL_Request =& SyL_Request::getInstance();
     *
     * @access public
     */
    function &getInstance()
    {
        static $singleton;
        if (!is_object($singleton)) {
            $classname = __CLASS__;
            $singleton = new $classname();
        }
        return $singleton;
    }

    /**
     * リクエストパラメータオブジェクトを作成
     *
     * @access private
     */
     function createParameter()
     {
         if ($this->parameter == null) {
             include_once SYL_INCLUDE_DIR . '/framework/RequestParameter/SyL_RequestParameterDefault.php';
             $this->parameter =& new SyL_RequestParameterDefault();
         }
     }

    /**
     * セッションオブジェクトを作成
     *
     * @access private
     */
     function createSession()
     {
         if ($this->session == null) {
             include_once SYL_INCLUDE_DIR . '/framework/RequestParameter/SyL_RequestParameterSession.php';
             $this->session =& new SyL_RequestParameterSession();
         }
     }

    /**
     * クッキーオブジェクトを作成
     *
     * @access private
     */
     function createCookie()
     {
         if ($this->cookie == null) {
             include_once SYL_INCLUDE_DIR . '/framework/RequestParameter/SyL_RequestParameterCookie.php';
             $this->cookie =& new SyL_RequestParameterCookie();
         }
     }

    /**
     * アップロードファイルオブジェクトを作成
     *
     * @access private
     */
     function createFile()
     {
         if ($this->files == null) {
             include_once SYL_INCLUDE_DIR . '/framework/RequestParameter/SyL_RequestParameterFile.php';
             $this->files =& new SyL_RequestParameterFile();
         }
     }

    /**
     * パラメータをセット
     * 
     * @access public
     * @param string パラメータ名
     * @param string パラメータ値
     */
    function setParameter($name, $value)
    {
        $this->parameter->setParameter($name, $value);
    }

    /**
     * リクエスト値を取得
     *
     * @access public
     * @param string パラメータ名
     * @return mixed パラメータ値
     */
    function getParameter($name)
    {
        return $this->parameter->getParameter($name);
    }

    /**
     * リクエストオブジェクトを取得
     *
     * @access public
     * @return array パラメータ値
     */
    function &getParameterObject()
    {
        return $this->parameter;
    }

    /**
     * セッション値をセット
     * 
     * @access public
     * @param string パラメータ名
     * @param string パラメータ値
     */
    function setSession($name, $value)
    {
        if ($this->session == null) {
            $this->createSession();
        }
        $this->session->setParameter($name, $value);
    }

    /**
     * セッション値を取得
     *
     * @access public
     * @param string パラメータ名
     * @return mixed パラメータ値
     */
    function getSession($name)
    {
        if ($this->session == null) {
            $this->createSession();
        }
        return (($this->session != null) ? $this->session->getParameter($name) : null);
    }

    /**
     * セッションオブジェクトを取得
     *
     * @access public
     * @return array パラメータ値
     */
    function &getSessionObject()
    {
        if ($this->session == null) {
            $this->createSession();
        }
        return $this->session;
    }

    /**
     * クッキー値をセット
     * 
     * @access public
     * @param string パラメータ名
     * @param string パラメータ値
     */
    function setCookie($name, $value)
    {
        if ($this->cookie == null) {
            $this->createCookie();
        }
        $this->cookie->setParameter($name, $value);
    }

    /**
     * クッキー値を取得
     *
     * @access public
     * @param string パラメータ名
     * @return mixed パラメータ値
     */
    function getCookie($name)
    {
        if ($this->cookie == null) {
            $this->createCookie();
        }
        return $this->cookie->getParameter($name);
    }

    /**
     * クッキーオブジェクトを取得
     *
     * @access public
     * @return array パラメータ値
     */
    function &getCookieObject()
    {
        if ($this->cookie == null) {
            $this->createCookie();
        }
        return $this->cookie;
    }

    /**
     * アップロードファイル値を取得
     *
     * @access public
     * @param string パラメータ名
     * @return mixed パラメータ値
     */
    function getFile($name)
    {
        if ($this->files == null) {
            trigger_error("[SyL error] Upload File Object Not Found", E_USER_ERROR);
        }
        return $this->files->getParameter($name);
    }

    /**
     * アップロードファイルオブジェクトを取得
     *
     * @access public
     * @return array パラメータ値
     */
    function &getFileObject()
    {
        if ($this->files == null) {
            trigger_error("[SyL error] Upload File Object Not Found", E_USER_ERROR);
        }
        return $this->files;
    }

}

?>
