<?php /** * Actions modify the AMF message PER BODY * This allows batching of calls * * @license http://opensource.org/licenses/gpl-license.php GNU Public License * @copyright (c) 2003 amfphp.org * @package flashservices * @subpackage filters * @version $Id$ */ /** * Catches any special request types and classifies as required */ function adapterAction (&$amfbody) { $baseClassPath = $GLOBALS['amfphp']['classPath']; $uriclasspath = ""; $classname = ""; $classpath = ""; $methodname = ""; $isWebServiceURI = false; $target = $amfbody->targetURI; if (strpos($target, "http://") === false && strpos($target, "https://") === false) { // check for a http link which means web service $lpos = strrpos($target, "."); if ($lpos === false) { //Check to see if this is in fact a RemotingMessage $body = $amfbody->getValue(); $handled = false; $messageType = $body[0]->_explicitType; if($messageType == 'flex.messaging.messages.RemotingMessage') { $handled = true; //Fix for AMF0 mixed array bug in Flex 2 if(isset($body[0]->body['length'])) { unset($body[0]->body['length']); } $amfbody->setValue($body[0]->body); $amfbody->setSpecialHandling("RemotingMessage"); $amfbody->setMetadata("clientId", $body[0]->clientId); $amfbody->setMetadata("messageId", $body[0]->messageId); $GLOBALS['amfphp']['lastMessageId'] = $body[0]->messageId; $methodname = $body[0]->operation; $classAndPackage = $body[0]->source; $lpos = strrpos($classAndPackage, "."); if($lpos !== FALSE) { $classname = substr($classAndPackage, $lpos + 1); } else { $classname = $classAndPackage; } $uriclasspath = str_replace('.','/',$classAndPackage) . '.php'; $classpath = $baseClassPath . $uriclasspath; } elseif($messageType == "flex.messaging.messages.CommandMessage") { if($body[0]->operation == 5) { $handled = true; $amfbody->setSpecialHandling("Ping"); $amfbody->setMetadata("clientId", $body[0]->clientId); $amfbody->setMetadata("messageId", $body[0]->messageId); $amfbody->noExec = true; } } if(!$handled) { $uriclasspath = "amfphp/Amf3Broker.php"; $classpath = $baseClassPath . "amfphp/Amf3Broker.php"; $classname = "Amf3Broker"; $methodname = "handleMessage"; } } else { $methodname = substr($target, $lpos + 1); $trunced = substr($target, 0, $lpos); $lpos = strrpos($trunced, "."); if ($lpos === false) { $classname = $trunced; if ($classname == "PageAbleResult" && $methodname == 'getRecords') { $val = $amfbody->getValue(); $id = $val[0]; $keys = explode("=", $id); $currset = intval($keys[1]); $set = $_SESSION['amfphp_recordsets'][$currset]; $uriclasspath = $set['class']; $classpath = $baseClassPath . $set['class']; $methodname = $set['method']; $classname = substr(strrchr('/' . $set['class'], '/'), 1, -4); //Now set args for body $amfbody->setValue(array_merge($set['args'], array($val[1], $val[2]))); //Tell amfbody that this is a dynamic paged resultset $amfbody->setSpecialHandling('pageFetch'); } else if($classname == "PageAbleResult" && $methodname == 'release') { $amfbody->setSpecialHandling('pageRelease'); $amfbody->noExec = true; } else { $uriclasspath = $trunced . ".php"; $classpath = $baseClassPath . $trunced . ".php"; } } else { $classname = substr($trunced, $lpos + 1); $classpath = $baseClassPath . str_replace(".", "/", $trunced) . ".php"; // removed to strip the basecp out of the equation here $uriclasspath = str_replace(".", "/", $trunced) . ".php"; // removed to strip the basecp out of the equation here } } } else { // This is a web service and is unsupported trigger_error("Web services are not supported in this release", E_USER_ERROR); } $amfbody->classPath = $classpath; $amfbody->uriClassPath = $uriclasspath; $amfbody->className = $classname; $amfbody->methodName = $methodname; return true; } /** * ExecutionAction executes the required methods */ function executionAction (&$amfbody) { $specialHandling = $amfbody->getSpecialHandling(); if (!$amfbody->isSpecialHandling() || $amfbody->isSpecialHandling(array('describeService', 'pageFetch', 'RemotingMessage'))) { $construct = &$amfbody->getClassConstruct(); $method = $amfbody->methodName; $args = $amfbody->getValue(); if($specialHandling == 'describeService') { include_once(AMFPHP_BASE . "util/DescribeService.php"); $ds = new DescribeService(); $results = $ds->describe($construct, $amfbody->className); } else if($specialHandling == 'pageFetch') { $args[count($args) - 2] = $args[count($args) - 2] - 1; $dataset = Executive::doMethodCall($amfbody, $construct, $method, $args); $results = array("cursor" => $args[count($args) - 2] + 1, "data" => $dataset); $amfbody->setMetadata('type', '__DYNAMIC_PAGE__'); } else { /* if(isset($construct->methodTable[$method]['pagesize'])) { //Check if counting method was overriden if(isset($construct->methodTable[$method]['countMethod'])) { $counter = $construct->methodTable[$method]['countMethod']; } else { $counter = $method . '_count'; } $dataset = Executive::doMethodCall($amfbody, $construct, $method, $args); // do the magic $count = Executive::doMethodCall($amfbody, $construct, $counter, $args); //Include the wrapper $results = array('class' => $amfbody->uriClassPath, 'method' => $amfbody->methodName, 'count' => $count, "args" => $args, "data" => $dataset); $amfbody->setMetadata('type', '__DYNAMIC_PAGEABLE_RESULTSET__'); $amfbody->setMetadata('pagesize', $construct->methodTable[$method]['pagesize']); */ //} //else //{ //The usual $time = microtime_float(); $results = Executive::doMethodCall($amfbody, $construct, $method, $args); // do the magic global $amfphp; $amfphp['callTime'] += microtime_float() - $time; //} } if($results !== '__amfphp_error') { if($specialHandling == 'RemotingMessage') { $wrapper = new AcknowledgeMessage($amfbody->getMetadata("messageId"), $amfbody->getMetadata("clientId")); $wrapper->body = $results; $amfbody->setResults($wrapper); } else { $amfbody->setResults($results); } $amfbody->responseURI = $amfbody->responseIndex . "/onResult"; } return false; } elseif($specialHandling == 'Ping') { $wrapper = new AcknowledgeMessage($amfbody->getMetadata("messageId"), $amfbody->getMetadata("clientId")); $amfbody->setResults($wrapper); $amfbody->responseURI = $amfbody->responseIndex . "/onResult"; } else if($specialHandling == 'pageRelease') { //Ignore PageAbleResult.release $amfbody->setResults(true); $amfbody->setMetaData('type', 'boolean'); $amfbody->responseURI = $amfbody->responseIndex . "/onResult"; return false; } return true; } ?>