/** * 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 * */ public static function dispatch() { if (empty($GLOBALS['_XOAD_SERVER_REQUEST_BODY'])) { return false; } $requestBody =& $GLOBALS['_XOAD_SERVER_REQUEST_BODY']; if (!XOAD_Server::notifyObservers('dispatchEnter', array('request' => &$requestBody))) { return false; } if (isset($requestBody['eventPost'])) { $callbackResponse = array(); $storage =& XOAD_Events_Storage::getStorage(); $callbackResponse['status'] = $storage->postEvent($requestBody['event'], $requestBody['className'], $requestBody['sender'], $requestBody['data'], $requestBody['filter']); if (XOAD_Server::notifyObservers('dispatchLeave', array('request' => &$requestBody, 'response' => &$callbackResponse))) { if (!empty($callbackResponse['status'])) { print XOAD_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 =& XOAD_Events_Storage::getStorage(); $storage->cleanEvents(); $callbackResponse['result'] = $storage->filterMultipleEvents($eventsQuery); if (XOAD_Server::notifyObservers('dispatchLeave', array('request' => &$requestBody, 'response' => &$callbackResponse))) { if (!empty($callbackResponse['result'])) { print XOAD_Client::register($callbackResponse); } } } else { $callbackResponse = array(); $outputBuffering = @ob_start(); set_error_handler(array('XOAD_Server', 'handleError')); $callbackResponse['returnValue'] = call_user_func_array(array(&$requestBody['source'], $requestBody['method']), $requestBody['arguments']); if (defined('XOAD_SERVER_EXCEPTION')) { if (XOAD_Server::notifyObservers('dispatchFailed', array('request' => &$requestBody, 'message' => XOAD_SERVER_EXCEPTION))) { XOAD_Server::throwException(XOAD_SERVER_EXCEPTION); return false; } } $callbackResponse['returnObject'] =& $requestBody['source']; if ($outputBuffering) { $output = @ob_get_contents(); if (!empty($output)) { $callbackResponse['output'] = $output; } @ob_end_clean(); } restore_error_handler(); if (XOAD_Server::notifyObservers('dispatchLeave', array('request' => &$requestBody, 'response' => &$callbackResponse))) { print XOAD_Client::register($callbackResponse); } } } return true; }