📄 server.class.php
字号:
<?php/** * NAJAX Server Namespace file. * * <p>This file defines the {@link NAJAX_Server} Class.</p> * <p>Example:</p> * <code> * <?php * * require_once('najax.php'); * * class Calculator * { * var $result; * * function Calculator() * { * $this->result = 0; * } * * function Add($arg) * { * $this->result += $arg; * } * } * * NAJAX_Server::runServer(); * * ?> * </code> * * @author Stanimir Angeloff * * @package NAJAX * * @version 0.4.1.0 * *//** * NAJAX Server Class. * * <p>This class is used to handle client callbacks.</p> * <p>Example:</p> * <code> * <?php * * require_once('najax.php'); * * class Calculator * { * var $result; * * function Calculator() * { * $this->result = 0; * } * * function Add($arg) * { * $this->result += $arg; * } * } * * NAJAX_Server::runServer(); * * ?> * </code> * * @author Stanimir Angeloff * * @package NAJAX * * @version 0.4.1.0 * */class NAJAX_Server extends NAJAX_Observable{ /** * Checks if the request is a client callback * to the server and handles it. * * @access public * * @return bool true if the request is a valid client callback, * false otherwise. * * @static * */ function runServer() { if ( ! NAJAX_Server::notifyObservers('runServerEnter')) { return false; } if (NAJAX_Server::initializeCallback()) { NAJAX_Server::dispatch(); /** * Defines whether the request is a client callback. */ define('NAJAX_CALLBACK', true); } if ( ! defined('NAJAX_CALLBACK')) { /** * Defines whether the request is a client callback. */ define('NAJAX_CALLBACK', false); } if (NAJAX_Server::notifyObservers('runServerLeave', array('isCallback' => NAJAX_CALLBACK))) { return NAJAX_CALLBACK; } else { return false; } } /** * Checks if the request is a client callback to the * server and initializes callback parameters. * * @access public * * @return bool true if the request is a valid client callback, * false otherwise. * * @static * */ function initializeCallback() { if ( ! NAJAX_Server::notifyObservers('initializeCallbackEnter')) { return false; } if (isset($_GET['najaxCall'])) { if (strcasecmp($_GET['najaxCall'], 'true') == 0) { if ( ! isset($GLOBALS['HTTP_RAW_POST_DATA'])) { return false; } $requestBody = @unserialize($GLOBALS['HTTP_RAW_POST_DATA']); if ($requestBody == null) { return false; } if ( isset($requestBody['eventPost']) && isset($requestBody['className']) && isset($requestBody['sender']) && isset($requestBody['event']) && array_key_exists('data', $requestBody) && array_key_exists('filter', $requestBody)) { if ( (NAJAX_Utilities::getType($requestBody['eventPost']) != 'bool') || (NAJAX_Utilities::getType($requestBody['className']) != 'string') || (NAJAX_Utilities::getType($requestBody['sender']) != 'string') || (NAJAX_Utilities::getType($requestBody['event']) != 'string')) { return false; } if ( ! empty($requestBody['className'])) { NAJAX_Server::loadClass($requestBody['className']); } else { return false; } if ( ! NAJAX_Server::isClassAllowed($requestBody['className'])) { return false; } $requestBody['sender'] = @unserialize($requestBody['sender']); if ($requestBody['sender'] === null) { return false; } if (strcasecmp(get_class($requestBody['sender']), $requestBody['className']) != 0) { return false; } if ( ! NAJAX_Server::notifyObservers('initializeCallbackSuccess', array('request' => &$requestBody))) { return false; } $GLOBALS['_NAJAX_SERVER_REQUEST_BODY'] =& $requestBody; if (NAJAX_Server::notifyObservers('initializeCallbackLeave', array('request' => &$requestBody))) { return true; } } else if ( isset($requestBody['eventsCallback']) && isset($requestBody['time']) && isset($requestBody['data'])) { if ( (NAJAX_Utilities::getType($requestBody['eventsCallback']) != 'bool') || (NAJAX_Utilities::getType($requestBody['time']) != 'float') || (NAJAX_Utilities::getType($requestBody['data']) != 's_array')) { return false; } foreach ($requestBody['data'] as $eventData) { if ( ! empty($eventData['className'])) { NAJAX_Server::loadClass($eventData['className']); } else { return false; } if ( ! NAJAX_Server::isClassAllowed($eventData['className'])) { return false; } } if ( ! NAJAX_Server::notifyObservers('initializeCallbackSuccess', array('request' => &$requestBody))) { return false; } $GLOBALS['_NAJAX_SERVER_REQUEST_BODY'] =& $requestBody; if (NAJAX_Server::notifyObservers('initializeCallbackLeave', array('request' => &$requestBody))) { return true; } } else { if ( ( ! isset($requestBody['source'])) || ( ! isset($requestBody['className'])) || ( ! isset($requestBody['method'])) || ( ! isset($requestBody['arguments']))) { return false; } if ( ! empty($requestBody['className'])) { NAJAX_Server::loadClass($requestBody['className']); } $requestBody['source'] = @unserialize($requestBody['source']); $requestBody['arguments'] = @unserialize($requestBody['arguments']); if ( ($requestBody['source'] === null) || ($requestBody['className'] === null) || ($requestBody['arguments'] === null)) { return false; } if ( (NAJAX_Utilities::getType($requestBody['source']) != 'object') || (NAJAX_Utilities::getType($requestBody['className']) != 'string') || (NAJAX_Utilities::getType($requestBody['method']) != 'string') || (NAJAX_Utilities::getType($requestBody['arguments']) != 's_array')) { return false; } if (strcasecmp($requestBody['className'], get_class($requestBody['source'])) != 0) { return false; } if ( ! NAJAX_Server::isClassAllowed($requestBody['className'])) { return false; } if (method_exists($requestBody['source'], NAJAX_CLIENT_METADATA_METHOD_NAME)) { call_user_func_array(array(&$requestBody['source'], NAJAX_CLIENT_METADATA_METHOD_NAME), null); if (isset($requestBody['source']->najaxMeta)) { if (NAJAX_Utilities::getType($requestBody['source']->najaxMeta) == 'object') { if (strcasecmp(get_class($requestBody['source']->najaxMeta), 'NAJAX_Meta') == 0) { if ( ! $requestBody['source']->najaxMeta->isPublicMethod($requestBody['method'])) { return false; } } } } } if ( ! NAJAX_Server::notifyObservers('initializeCallbackSuccess', array('request' => &$requestBody))) { return false; } $GLOBALS['_NAJAX_SERVER_REQUEST_BODY'] =& $requestBody; if (NAJAX_Server::notifyObservers('initializeCallbackLeave', array('request' => &$requestBody))) { return true; } } } } NAJAX_Server::notifyObservers('initializeCallbackLeave'); return false; } /** * Dispatches a client callback to the server. * * @access public * * @return string Outputs JavaString code that contains the result * and the output of the callback. * * @static * */ function dispatch() { if (empty($GLOBALS['_NAJAX_SERVER_REQUEST_BODY'])) { return false; } $requestBody =& $GLOBALS['_NAJAX_SERVER_REQUEST_BODY']; if ( ! NAJAX_Server::notifyObservers('dispatchEnter', array('request' => &$requestBody))) { return false; } if (isset($requestBody['eventPost'])) { $callbackResponse = array(); $storage = NAJAX_Events_Storage::getStorage(); $callbackResponse['status'] = $storage->postEvent($requestBody['event'], $requestBody['className'], $requestBody['sender'], $requestBody['data'], $requestBody['filter']); if (NAJAX_Server::notifyObservers('dispatchLeave', array('request' => &$requestBody, 'response' => &$callbackResponse))) { if ( ! empty($callbackResponse['status'])) { print NAJAX_Client::register($callbackResponse); } } } else if (isset($requestBody['eventsCallback'])) { $eventsQuery = array(); foreach ($requestBody['data'] as $event) { $eventsQuery[] = array( 'event' => $event['event'], 'className' => $event['className'], 'filter' => $event['filter'], 'time' => $requestBody['time'] ); } $callbackResponse = array(); $storage = NAJAX_Events_Storage::getStorage(); $storage->cleanEvents(); $callbackResponse['result'] = $storage->filterMultipleEvents($eventsQuery); if (NAJAX_Server::notifyObservers('dispatchLeave', array('request' => &$requestBody, 'response' => &$callbackResponse))) { if ( ! empty($callbackResponse['result'])) { print NAJAX_Client::register($callbackResponse); } } } else { $callbackResponse = array(); $outputBuffering = @ob_start(); set_error_handler(array('NAJAX_Server', 'handleError')); $callbackResponse['returnValue'] = call_user_func_array(array(&$requestBody['source'], $requestBody['method']), $requestBody['arguments']); if (defined('NAJAX_SERVER_EXCEPTION')) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -