web service MDL-12886 Add a new REST server implemented with Zend library + AMF server + cleaning of wsdl generator + return exception into the REST server
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* The following constants are used throughout serialization and
|
||||
* deserialization to detect the AMF marker and encoding types.
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
final class Zend_Amf_Constants
|
||||
{
|
||||
const AMF0_NUMBER = 0x00;
|
||||
const AMF0_BOOLEAN = 0x01;
|
||||
const AMF0_STRING = 0x02;
|
||||
const AMF0_OBJECT = 0x03;
|
||||
const AMF0_MOVIECLIP = 0x04;
|
||||
const AMF0_NULL = 0x05;
|
||||
const AMF0_UNDEFINED = 0x06;
|
||||
const AMF0_REFERENCE = 0x07;
|
||||
const AMF0_MIXEDARRAY = 0x08;
|
||||
const AMF0_OBJECTTERM = 0x09;
|
||||
const AMF0_ARRAY = 0x0a;
|
||||
const AMF0_DATE = 0x0b;
|
||||
const AMF0_LONGSTRING = 0x0c;
|
||||
const AMF0_UNSUPPORTED = 0x0e;
|
||||
const AMF0_XML = 0x0f;
|
||||
const AMF0_TYPEDOBJECT = 0x10;
|
||||
const AMF0_AMF3 = 0x11;
|
||||
const AMF0_OBJECT_ENCODING = 0x00;
|
||||
|
||||
const AMF3_UNDEFINED = 0x00;
|
||||
const AMF3_NULL = 0x01;
|
||||
const AMF3_BOOLEAN_FALSE = 0x02;
|
||||
const AMF3_BOOLEAN_TRUE = 0x03;
|
||||
const AMF3_INTEGER = 0x04;
|
||||
const AMF3_NUMBER = 0x05;
|
||||
const AMF3_STRING = 0x06;
|
||||
const AMF3_XML = 0x07;
|
||||
const AMF3_DATE = 0x08;
|
||||
const AMF3_ARRAY = 0x09;
|
||||
const AMF3_OBJECT = 0x0A;
|
||||
const AMF3_XMLSTRING = 0x0B;
|
||||
const AMF3_BYTEARRAY = 0x0C;
|
||||
const AMF3_OBJECT_ENCODING = 0x03;
|
||||
|
||||
// Object encodings for AMF3 object types
|
||||
const ET_PROPLIST = 0x00;
|
||||
const ET_EXTERNAL = 0x01;
|
||||
const ET_DYNAMIC = 0x02;
|
||||
const ET_PROXY = 0x03;
|
||||
|
||||
/**
|
||||
* Special content length value that indicates "unknown" content length
|
||||
* per AMF Specification
|
||||
*/
|
||||
const UNKNOWN_CONTENT_LENGTH = -1;
|
||||
const URL_APPEND_HEADER = 'AppendToGatewayUrl';
|
||||
const RESULT_METHOD = '/onResult';
|
||||
const STATUS_METHOD = '/onStatus';
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Exception
|
||||
*/
|
||||
require_once 'Zend/Exception.php';
|
||||
|
||||
/**
|
||||
* @package Zend_Amf
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Exception extends Zend_Exception
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,321 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse_Amf0
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Amf_Parse_Deserializer */
|
||||
require_once 'Zend/Amf/Parse/Deserializer.php';
|
||||
|
||||
/**
|
||||
* Read an AMF0 input stream and convert it into PHP data types
|
||||
*
|
||||
* @todo Implement Typed Object Class Mapping
|
||||
* @todo Class could be implmented as Factory Class with each data type it's own class
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse_Amf0
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Parse_Amf0_Deserializer extends Zend_Amf_Parse_Deserializer
|
||||
{
|
||||
/**
|
||||
* An array of objects used for recursivly deserializing an object.
|
||||
* @var array
|
||||
*/
|
||||
protected $_reference = array();
|
||||
|
||||
/**
|
||||
* If AMF3 serialization occurs, update to AMF0 0x03
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $_objectEncoding = Zend_Amf_Constants::AMF0_OBJECT_ENCODING;
|
||||
|
||||
/**
|
||||
* refrence to AMF3 deserializer
|
||||
*
|
||||
* @var Zend_Amf_Parse_Amf3_Deserializer
|
||||
*/
|
||||
protected $_deserializer = null;
|
||||
|
||||
/**
|
||||
* Read AMF markers and dispatch for deserialization
|
||||
*
|
||||
* Checks for AMF marker types and calls the appropriate methods
|
||||
* for deserializing those marker types. Markers are the data type of
|
||||
* the following value.
|
||||
*
|
||||
* @param integer $typeMarker
|
||||
* @return mixed whatever the data type is of the marker in php
|
||||
* @return mixed
|
||||
* @throws Zend_Amf_Exception for invalid type
|
||||
*/
|
||||
public function readTypeMarker($typeMarker = null)
|
||||
{
|
||||
if (is_null($typeMarker)) {
|
||||
$typeMarker = $this->_stream->readByte();
|
||||
}
|
||||
|
||||
switch($typeMarker) {
|
||||
// number
|
||||
case Zend_Amf_Constants::AMF0_NUMBER:
|
||||
return $this->_stream->readDouble();
|
||||
|
||||
// boolean
|
||||
case Zend_Amf_Constants::AMF0_BOOLEAN:
|
||||
return (boolean) $this->_stream->readByte();
|
||||
|
||||
// string
|
||||
case Zend_Amf_Constants::AMF0_STRING:
|
||||
return $this->_stream->readUTF();
|
||||
|
||||
// object
|
||||
case Zend_Amf_Constants::AMF0_OBJECT:
|
||||
return $this->readObject();
|
||||
|
||||
// null
|
||||
case Zend_Amf_Constants::AMF0_NULL:
|
||||
return null;
|
||||
|
||||
// undefined
|
||||
case Zend_Amf_Constants::AMF0_UNDEFINED:
|
||||
return null;
|
||||
|
||||
// Circular references are returned here
|
||||
case Zend_Amf_Constants::AMF0_REFERENCE:
|
||||
return $this->readReference();
|
||||
|
||||
// mixed array with numeric and string keys
|
||||
case Zend_Amf_Constants::AMF0_MIXEDARRAY:
|
||||
return $this->readMixedArray();
|
||||
|
||||
// array
|
||||
case Zend_Amf_Constants::AMF0_ARRAY:
|
||||
return $this->readArray();
|
||||
|
||||
// date
|
||||
case Zend_Amf_Constants::AMF0_DATE:
|
||||
return $this->readDate();
|
||||
|
||||
// longString strlen(string) > 2^16
|
||||
case Zend_Amf_Constants::AMF0_LONGSTRING:
|
||||
return $this->_stream->readLongUTF();
|
||||
|
||||
//internal AS object, not supported
|
||||
case Zend_Amf_Constants::AMF0_UNSUPPORTED:
|
||||
return null;
|
||||
|
||||
// XML
|
||||
case Zend_Amf_Constants::AMF0_XML:
|
||||
return $this->readXmlString();
|
||||
|
||||
// typed object ie Custom Class
|
||||
case Zend_Amf_Constants::AMF0_TYPEDOBJECT:
|
||||
return $this->readTypedObject();
|
||||
|
||||
//AMF3-specific
|
||||
case Zend_Amf_Constants::AMF0_AMF3:
|
||||
return $this->readAmf3TypeMarker();
|
||||
|
||||
default:
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Unsupported marker type: ' . $typeMarker);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read AMF objects and convert to PHP objects
|
||||
*
|
||||
* Read the name value pair objects form the php message and convert them to
|
||||
* a php object class.
|
||||
*
|
||||
* Called when the marker type is 3.
|
||||
*
|
||||
* @param array|null $object
|
||||
* @return object
|
||||
*/
|
||||
public function readObject($object = null)
|
||||
{
|
||||
if (is_null($object)) {
|
||||
$object = array();
|
||||
}
|
||||
|
||||
while (true) {
|
||||
$key = $this->_stream->readUTF();
|
||||
$typeMarker = $this->_stream->readByte();
|
||||
if ($typeMarker != Zend_Amf_Constants::AMF0_OBJECTTERM ){
|
||||
//Recursivly call readTypeMarker to get the types of properties in the object
|
||||
$object[$key] = $this->readTypeMarker($typeMarker);
|
||||
} else {
|
||||
//encountered AMF object terminator
|
||||
break;
|
||||
}
|
||||
}
|
||||
$this->_reference[] = $object;
|
||||
return (object) $object;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read reference objects
|
||||
*
|
||||
* Used to gain access to the private array of refrence objects.
|
||||
* Called when marker type is 7.
|
||||
*
|
||||
* @return object
|
||||
* @throws Zend_Amf_Exception for invalid reference keys
|
||||
*/
|
||||
public function readReference()
|
||||
{
|
||||
$key = $this->_stream->readInt();
|
||||
if (!array_key_exists($key, $this->_reference)) {
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Invalid reference key: '. $key);
|
||||
}
|
||||
return $this->_reference[$key];
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads an array with numeric and string indexes.
|
||||
*
|
||||
* Called when marker type is 8
|
||||
*
|
||||
* @todo As of Flash Player 9 there is not support for mixed typed arrays
|
||||
* so we handle this as an object. With the introduction of vectors
|
||||
* in Flash Player 10 this may need to be reconsidered.
|
||||
* @return array
|
||||
*/
|
||||
public function readMixedArray()
|
||||
{
|
||||
$length = $this->_stream->readLong();
|
||||
return $this->readObject();
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts numberically indexed actiosncript arrays into php arrays.
|
||||
*
|
||||
* Called when marker type is 10
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function readArray()
|
||||
{
|
||||
$length = $this->_stream->readLong();
|
||||
$array = array();
|
||||
while ($length--) {
|
||||
$array[] = $this->readTypeMarker();
|
||||
}
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert AS Date to Zend_Date
|
||||
*
|
||||
* @return Zend_Date
|
||||
*/
|
||||
public function readDate()
|
||||
{
|
||||
// get the unix time stamp. Not sure why ActionScript does not use
|
||||
// milliseconds
|
||||
$timestamp = floor($this->_stream->readDouble() / 1000);
|
||||
|
||||
// The timezone offset is never returned to the server; it is always 0,
|
||||
// so read and ignore.
|
||||
$offset = $this->_stream->readInt();
|
||||
|
||||
require_once 'Zend/Date.php';
|
||||
$date = new Zend_Date($timestamp);
|
||||
return $date;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert XML to SimpleXml
|
||||
* If user wants DomDocument they can use dom_import_simplexml
|
||||
*
|
||||
* @return SimpleXml Object
|
||||
*/
|
||||
public function readXmlString()
|
||||
{
|
||||
$string = $this->_stream->readLongUTF();
|
||||
return simplexml_load_string($string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read Class that is to be mapped to a server class.
|
||||
*
|
||||
* Commonly used for Value Objects on the server
|
||||
*
|
||||
* @todo implement Typed Class mapping
|
||||
* @return object
|
||||
* @throws Zend_Amf_Exception if unable to load type
|
||||
*/
|
||||
public function readTypedObject()
|
||||
{
|
||||
require_once 'Zend/Amf/Parse/TypeLoader.php';
|
||||
// get the remote class name
|
||||
$className = $this->_stream->readUTF();
|
||||
$loader = Zend_Amf_Parse_TypeLoader::loadType($className);
|
||||
$returnObject = new $loader();
|
||||
$properties = get_object_vars($this->readObject());
|
||||
foreach($properties as $key=>$value) {
|
||||
if($key) {
|
||||
$returnObject->$key = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $returnObject;
|
||||
}
|
||||
|
||||
/**
|
||||
* AMF3 data type encountered load AMF3 Deserializer to handle
|
||||
* type markers.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function readAmf3TypeMarker()
|
||||
{
|
||||
$deserializer = $this->getDeserializer();
|
||||
$this->_objectEncoding = Zend_Amf_Constants::AMF3_OBJECT_ENCODING;
|
||||
return $deserializer->readTypeMarker();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the object encoding to check if an AMF3 object
|
||||
* is going to be return.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getObjectEncoding()
|
||||
{
|
||||
return $this->_objectEncoding;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get deserializer
|
||||
*
|
||||
* @return Zend_Amf_Parse_Amf3_Deserializer
|
||||
*/
|
||||
public function getDeserializer()
|
||||
{
|
||||
if (null === $this->_deserializer) {
|
||||
require_once 'Zend/Amf/Parse/Amf3/Deserializer.php';
|
||||
$this->_deserializer = new Zend_Amf_Parse_Amf3_Deserializer($this->_stream);
|
||||
}
|
||||
return $this->_deserializer;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,289 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse_Amf0
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Amf_Parse_Serializer */
|
||||
require_once 'Zend/Amf/Parse/Serializer.php';
|
||||
|
||||
/**
|
||||
* Serializer php misc types back to there corresponding AMF0 Type Marker.
|
||||
*
|
||||
* @uses Zend_Amf_Parse_Serializer
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse_Amf0
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer
|
||||
{
|
||||
/**
|
||||
* @var string Name of the class to be returned
|
||||
*/
|
||||
protected $_className = '';
|
||||
|
||||
/**
|
||||
* Determine type and serialize accordingly
|
||||
*
|
||||
* Checks to see if the type was declared and then either
|
||||
* auto negotiates the type or relies on the user defined markerType to
|
||||
* serialize the data into amf
|
||||
*
|
||||
* @param misc $data
|
||||
* @param misc $markerType
|
||||
* @return Zend_Amf_Parse_Amf0_Serializer
|
||||
* @throws Zend_Amf_Exception for unrecognized types or data
|
||||
*/
|
||||
public function writeTypeMarker($data, $markerType = null)
|
||||
{
|
||||
if (null !== $markerType) {
|
||||
// Write the Type Marker to denote the following action script data type
|
||||
$this->_stream->writeByte($markerType);
|
||||
switch($markerType) {
|
||||
case Zend_Amf_Constants::AMF0_NUMBER:
|
||||
$this->_stream->writeDouble($data);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF0_BOOLEAN:
|
||||
$this->_stream->writeByte($data);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF0_STRING:
|
||||
$this->_stream->writeUTF($data);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF0_OBJECT:
|
||||
$this->writeObject($data);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF0_NULL:
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF0_MIXEDARRAY:
|
||||
// Write length of numeric keys as zero.
|
||||
$this->_stream->writeLong(0);
|
||||
$this->writeObject($data);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF0_ARRAY:
|
||||
$this->writeArray($data);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF0_DATE:
|
||||
$this->writeDate($data);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF0_LONGSTRING:
|
||||
$this->_stream->writeLongUTF($data);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF0_TYPEDOBJECT:
|
||||
$this->writeTypedObject($data);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF0_AMF3:
|
||||
$this->writeAmf3TypeMarker($data);
|
||||
break;
|
||||
default:
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception("Unknown Type Marker: " . $markerType);
|
||||
}
|
||||
} else {
|
||||
switch (true) {
|
||||
case (is_int($data) || is_float($data)):
|
||||
$markerType = Zend_Amf_Constants::AMF0_NUMBER;
|
||||
break;
|
||||
case (is_bool($data)):
|
||||
$markerType = Zend_Amf_Constants::AMF0_BOOLEAN;
|
||||
break;
|
||||
case (is_string($data) && (strlen($data) > 65536)):
|
||||
$markerType = Zend_Amf_Constants::AMF0_LONGSTRING;
|
||||
break;
|
||||
case (is_string($data)):
|
||||
$markerType = Zend_Amf_Constants::AMF0_STRING;
|
||||
break;
|
||||
case (is_object($data)):
|
||||
if (($data instanceof DateTime) || ($data instanceof Zend_Date)) {
|
||||
$markerType = Zend_Amf_Constants::AMF0_DATE;
|
||||
} else {
|
||||
|
||||
if($className = $this->getClassName($data)){
|
||||
//Object is a Typed object set classname
|
||||
$markerType = Zend_Amf_Constants::AMF0_TYPEDOBJECT;
|
||||
$this->_className = $className;
|
||||
} else {
|
||||
// Object is a generic classname
|
||||
$markerType = Zend_Amf_Constants::AMF0_OBJECT;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case (null === $data):
|
||||
$markerType = Zend_Amf_Constants::AMF0_NULL;
|
||||
break;
|
||||
case (is_array($data)):
|
||||
// check if it is a mixed typed array
|
||||
foreach (array_keys($data) as $key) {
|
||||
if (!is_numeric($key)) {
|
||||
$markerType = Zend_Amf_Constants::AMF0_MIXEDARRAY;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Dealing with a standard numeric array
|
||||
if(!$markerType){
|
||||
$markerType = Zend_Amf_Constants::AMF0_ARRAY;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Unsupported data type: ' . gettype($data));
|
||||
}
|
||||
|
||||
$this->writeTypeMarker($data, $markerType);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a php array with string or mixed keys.
|
||||
*
|
||||
* @param object $data
|
||||
* @return Zend_Amf_Parse_Amf0_Serializer
|
||||
*/
|
||||
public function writeObject($object)
|
||||
{
|
||||
// Loop each element and write the name of the property.
|
||||
foreach ($object as $key => $value) {
|
||||
$this->_stream->writeUTF($key);
|
||||
$this->writeTypeMarker($value);
|
||||
}
|
||||
|
||||
// Write the end object flag
|
||||
$this->_stream->writeInt(0);
|
||||
$this->_stream->writeByte(Zend_Amf_Constants::AMF0_OBJECTTERM);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a standard numeric array to the output stream. If a mixed array
|
||||
* is encountered call writeTypeMarker with mixed array.
|
||||
*
|
||||
* @param array $array
|
||||
* @return Zend_Amf_Parse_Amf0_Serializer
|
||||
*/
|
||||
public function writeArray($array)
|
||||
{
|
||||
$length = count($array);
|
||||
if (!$length < 0) {
|
||||
// write the length of the array
|
||||
$this->_stream->writeLong(0);
|
||||
} else {
|
||||
// Write the length of the numberic array
|
||||
$this->_stream->writeLong($length);
|
||||
for ($i=0; $i<$length; $i++) {
|
||||
$value = isset($array[$i]) ? $array[$i] : null;
|
||||
$this->writeTypeMarker($value);
|
||||
}
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the DateTime into an AMF Date
|
||||
*
|
||||
* @param DateTime|Zend_Date $data
|
||||
* @return Zend_Amf_Parse_Amf0_Serializer
|
||||
*/
|
||||
public function writeDate($data)
|
||||
{
|
||||
if ($data instanceof DateTime) {
|
||||
$dateString = $data->format('U');
|
||||
} elseif ($data instanceof Zend_Date) {
|
||||
$dateString = $data->toString('U');
|
||||
} else {
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Invalid date specified; must be a DateTime or Zend_Date object');
|
||||
}
|
||||
$dateString *= 1000;
|
||||
|
||||
// Make the conversion and remove milliseconds.
|
||||
$this->_stream->writeDouble($dateString);
|
||||
|
||||
// Flash does not respect timezone but requires it.
|
||||
$this->_stream->writeInt(0);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a class mapped object to the output stream.
|
||||
*
|
||||
* @param object $data
|
||||
* @return Zend_Amf_Parse_Amf0_Serializer
|
||||
*/
|
||||
public function writeTypedObject($data)
|
||||
{
|
||||
$this->_stream->writeUTF($this->_className);
|
||||
$this->writeObject($data);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Encountered and AMF3 Type Marker use AMF3 serializer. Once AMF3 is
|
||||
* enountered it will not return to AMf0.
|
||||
*
|
||||
* @param string $data
|
||||
* @return Zend_Amf_Parse_Amf0_Serializer
|
||||
*/
|
||||
public function writeAmf3TypeMarker($data)
|
||||
{
|
||||
require_once 'Zend/Amf/Parse/Amf3/Serializer.php';
|
||||
$serializer = new Zend_Amf_Parse_Amf3_Serializer($this->_stream);
|
||||
$serializer->writeTypeMarker($data);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find if the class name is a class mapped name and return the
|
||||
* respective classname if it is.
|
||||
*
|
||||
* @param object $object
|
||||
* @return false|string $className
|
||||
*/
|
||||
protected function getClassName($object)
|
||||
{
|
||||
require_once 'Zend/Amf/Parse/TypeLoader.php';
|
||||
//Check to see if the object is a typed object and we need to change
|
||||
$className = '';
|
||||
switch (true) {
|
||||
// the return class mapped name back to actionscript class name.
|
||||
case Zend_Amf_Parse_TypeLoader::getMappedClassName(get_class($object)):
|
||||
$className = Zend_Amf_Parse_TypeLoader::getMappedClassName(get_class($object));
|
||||
break;
|
||||
// Check to see if the user has defined an explicit Action Script type.
|
||||
case isset($object->_explicitType):
|
||||
$className = $object->_explicitType;
|
||||
unset($object->_explicitType);
|
||||
break;
|
||||
// Check if user has defined a method for accessing the Action Script type
|
||||
case method_exists($object, 'getASClassName'):
|
||||
$className = $object->getASClassName();
|
||||
break;
|
||||
// No return class name is set make it a generic object
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if(!$className == '') {
|
||||
return $className;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,410 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse_Amf3
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Amf_Parse_Deserializer */
|
||||
require_once 'Zend/Amf/Parse/Deserializer.php';
|
||||
|
||||
/** Zend_Amf_Parse_TypeLoader */
|
||||
require_once 'Zend/Amf/Parse/TypeLoader.php';
|
||||
|
||||
/**
|
||||
* Read an AMF3 input stream and convert it into PHP data types.
|
||||
*
|
||||
* @todo readObject to handle Typed Objects
|
||||
* @todo readXMLStrimg to be implemented.
|
||||
* @todo Class could be implmented as Factory Class with each data type it's own class.
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse_Amf3
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Parse_Amf3_Deserializer extends Zend_Amf_Parse_Deserializer
|
||||
{
|
||||
/**
|
||||
* Total number of objects in the referenceObject array
|
||||
* @var int
|
||||
*/
|
||||
protected $_objectCount;
|
||||
|
||||
/**
|
||||
* An array of reference objects per amf body
|
||||
* @var array
|
||||
*/
|
||||
protected $_referenceObjects = array();
|
||||
|
||||
/**
|
||||
* An array of reference strings per amf body
|
||||
* @var array
|
||||
*/
|
||||
protected $_referenceStrings = array();
|
||||
|
||||
/**
|
||||
* An array of reference class definitions per body
|
||||
* @var array
|
||||
*/
|
||||
protected $_referenceDefinitions = array();
|
||||
|
||||
/**
|
||||
* Read AMF markers and dispatch for deserialization
|
||||
*
|
||||
* Checks for AMF marker types and calls the appropriate methods
|
||||
* for deserializing those marker types. markers are the data type of
|
||||
* the following value.
|
||||
*
|
||||
* @param integer $typeMarker
|
||||
* @return mixed Whatever the corresponding PHP data type is
|
||||
* @throws Zend_Amf_Exception for unidentified marker type
|
||||
*/
|
||||
public function readTypeMarker($typeMarker = null)
|
||||
{
|
||||
if(null === $typeMarker) {
|
||||
$typeMarker = $this->_stream->readByte();
|
||||
}
|
||||
|
||||
switch($typeMarker) {
|
||||
case Zend_Amf_Constants::AMF3_UNDEFINED:
|
||||
return null;
|
||||
case Zend_Amf_Constants::AMF3_NULL:
|
||||
return null;
|
||||
case Zend_Amf_Constants::AMF3_BOOLEAN_FALSE:
|
||||
return false;
|
||||
case Zend_Amf_Constants::AMF3_BOOLEAN_TRUE:
|
||||
return true;
|
||||
case Zend_Amf_Constants::AMF3_INTEGER:
|
||||
return $this->readInteger();
|
||||
case Zend_Amf_Constants::AMF3_NUMBER:
|
||||
return $this->_stream->readDouble();
|
||||
case Zend_Amf_Constants::AMF3_STRING:
|
||||
return $this->readString();
|
||||
case Zend_Amf_Constants::AMF3_DATE:
|
||||
return $this->readDate();
|
||||
case Zend_Amf_Constants::AMF3_ARRAY:
|
||||
return $this->readArray();
|
||||
case Zend_Amf_Constants::AMF3_OBJECT:
|
||||
return $this->readObject();
|
||||
case Zend_Amf_Constants::AMF3_XML:
|
||||
case Zend_Amf_Constants::AMF3_XMLSTRING:
|
||||
return $this->readXmlString();
|
||||
case Zend_Amf_Constants::AMF3_BYTEARRAY:
|
||||
return $this->readString();
|
||||
default:
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Unsupported type marker: ' . $typeMarker);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read and deserialize an integer
|
||||
*
|
||||
* AMF 3 represents smaller integers with fewer bytes using the most
|
||||
* significant bit of each byte. The worst case uses 32-bits
|
||||
* to represent a 29-bit number, which is what we would have
|
||||
* done with no compression.
|
||||
* - 0x00000000 - 0x0000007F : 0xxxxxxx
|
||||
* - 0x00000080 - 0x00003FFF : 1xxxxxxx 0xxxxxxx
|
||||
* - 0x00004000 - 0x001FFFFF : 1xxxxxxx 1xxxxxxx 0xxxxxxx
|
||||
* - 0x00200000 - 0x3FFFFFFF : 1xxxxxxx 1xxxxxxx 1xxxxxxx xxxxxxxx
|
||||
* - 0x40000000 - 0xFFFFFFFF : throw range exception
|
||||
*
|
||||
*
|
||||
* 0x04 -> integer type code, followed by up to 4 bytes of data.
|
||||
*
|
||||
* @see: Parsing integers on OSFlash {http://osflash.org/amf3/parsing_integers>} for the AMF3 integer data format.
|
||||
* @return int|float
|
||||
*/
|
||||
public function readInteger()
|
||||
{
|
||||
$count = 1;
|
||||
$intReference = $this->_stream->readByte();
|
||||
$result = 0;
|
||||
while ((($intReference & 0x80) != 0) && $count < 4) {
|
||||
$result <<= 7;
|
||||
$result |= ($intReference & 0x7f);
|
||||
$intReference = $this->_stream->readByte();
|
||||
$count++;
|
||||
}
|
||||
if ($count < 4) {
|
||||
$result <<= 7;
|
||||
$result |= $intReference;
|
||||
} else {
|
||||
// Use all 8 bits from the 4th byte
|
||||
$result <<= 8;
|
||||
$result |= $intReference;
|
||||
|
||||
// Check if the integer should be negative
|
||||
if (($result & 0x10000000) != 0) {
|
||||
//and extend the sign bit
|
||||
$result |= 0xe0000000;
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read and deserialize a string
|
||||
*
|
||||
* Strings can be sent as a reference to a previously
|
||||
* occurring String by using an index to the implicit string reference table.
|
||||
* Strings are encoding using UTF-8 - however the header may either
|
||||
* describe a string literal or a string reference.
|
||||
*
|
||||
* - string = 0x06 string-data
|
||||
* - string-data = integer-data [ modified-utf-8 ]
|
||||
* - modified-utf-8 = *OCTET
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function readString()
|
||||
{
|
||||
$stringReference = $this->readInteger();
|
||||
|
||||
//Check if this is a reference string
|
||||
if (($stringReference & 0x01) == 0) {
|
||||
// reference string
|
||||
$stringReference = $stringReference >> 1;
|
||||
if ($stringReference >= count($this->_referenceStrings)) {
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Undefined string reference: ' . $stringReference);
|
||||
}
|
||||
// reference string found
|
||||
return $this->_referenceStrings[$stringReference];
|
||||
}
|
||||
|
||||
$length = $stringReference >> 1;
|
||||
if ($length) {
|
||||
$string = $this->_stream->readBytes($length);
|
||||
$this->_referenceStrings[] = $string;
|
||||
} else {
|
||||
$string = "";
|
||||
}
|
||||
return $string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read and deserialize a date
|
||||
*
|
||||
* Data is the number of milliseconds elapsed since the epoch
|
||||
* of midnight, 1st Jan 1970 in the UTC time zone.
|
||||
* Local time zone information is not sent to flash.
|
||||
*
|
||||
* - date = 0x08 integer-data [ number-data ]
|
||||
*
|
||||
* @return Zend_Date
|
||||
*/
|
||||
public function readDate()
|
||||
{
|
||||
$dateReference = $this->readInteger();
|
||||
if (($dateReference & 0x01) == 0) {
|
||||
$dateReference = $dateReference >> 1;
|
||||
if ($dateReference>=count($this->_referenceObjects)) {
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Undefined date reference: ' . $dateReference);
|
||||
}
|
||||
return $this->_referenceObjects[$dateReference];
|
||||
}
|
||||
|
||||
$timestamp = floor($this->_stream->readDouble() / 1000);
|
||||
|
||||
require_once 'Zend/Date.php';
|
||||
$dateTime = new Zend_Date((int) $timestamp);
|
||||
$this->_referenceObjects[] = $dateTime;
|
||||
return $dateTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read amf array to PHP array
|
||||
*
|
||||
* - array = 0x09 integer-data ( [ 1OCTET *amf3-data ] | [OCTET *amf3-data 1] | [ OCTET *amf-data ] )
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function readArray()
|
||||
{
|
||||
$arrayReference = $this->readInteger();
|
||||
if (($arrayReference & 0x01)==0){
|
||||
$arrayReference = $arrayReference >> 1;
|
||||
if ($arrayReference>=count($this->_referenceObjects)) {
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Unknow array reference: ' . $arrayReference);
|
||||
}
|
||||
return $this->_referenceObjects[$arrayReference];
|
||||
}
|
||||
|
||||
// Create a holder for the array in the reference list
|
||||
$data = array();
|
||||
$this->_referenceObjects[] &= $data;
|
||||
$key = $this->readString();
|
||||
|
||||
// Iterating for string based keys.
|
||||
while ($key != '') {
|
||||
$data[$key] = $this->readTypeMarker();
|
||||
$key = $this->readString();
|
||||
}
|
||||
|
||||
$arrayReference = $arrayReference >>1;
|
||||
|
||||
//We have a dense array
|
||||
for ($i=0; $i < $arrayReference; $i++) {
|
||||
$data[] = $this->readTypeMarker();
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read an object from the AMF stream and convert it into a PHP object
|
||||
*
|
||||
* @todo Rather than using an array of traitsInfo create Zend_Amf_Value_TraitsInfo
|
||||
* @return object
|
||||
*/
|
||||
public function readObject()
|
||||
{
|
||||
$traitsInfo = $this->readInteger();
|
||||
$storedObject = ($traitsInfo & 0x01)==0;
|
||||
$traitsInfo = $traitsInfo >> 1;
|
||||
|
||||
// Check if the Object is in the stored Objects reference table
|
||||
if ($storedObject) {
|
||||
$ref = $traitsInfo;
|
||||
if (!isset($this->_referenceObjects[$ref])) {
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Unknown Object reference: ' . $ref);
|
||||
}
|
||||
$returnObject = $this->_referenceObjects[$ref];
|
||||
} else {
|
||||
// Check if the Object is in the stored Definistions reference table
|
||||
$storedClass = ($traitsInfo & 0x01) == 0;
|
||||
$traitsInfo = $traitsInfo >> 1;
|
||||
if ($storedClass) {
|
||||
$ref = $traitsInfo;
|
||||
if (!isset($this->_referenceDefinitions[$ref])) {
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Unknows Definition reference: '. $ref);
|
||||
}
|
||||
// Populate the reference attributes
|
||||
$className = $this->_referenceDefinitions[$ref]['className'];
|
||||
$encoding = $this->_referenceDefinitions[$ref]['encoding'];
|
||||
$propertyNames = $this->_referenceDefinitions[$ref]['propertyNames'];
|
||||
} else {
|
||||
// The class was not in the reference tables. Start reading rawdata to build traits.
|
||||
// Create a traits table. Zend_Amf_Value_TraitsInfo would be ideal
|
||||
$className = $this->readString();
|
||||
$encoding = $traitsInfo & 0x03;
|
||||
$propertyNames = array();
|
||||
$traitsInfo = $traitsInfo >> 2;
|
||||
}
|
||||
|
||||
// We now have the object traits defined in variables. Time to go to work:
|
||||
if (!$className) {
|
||||
// No class name generic object
|
||||
$returnObject = new stdClass();
|
||||
} else {
|
||||
// Defined object
|
||||
// Typed object lookup agsinst registered classname maps
|
||||
if ($loader = Zend_Amf_Parse_TypeLoader::loadType($className)) {
|
||||
$returnObject = new $loader();
|
||||
} else {
|
||||
//user defined typed object
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Typed object not found: '. $className . ' ');
|
||||
}
|
||||
}
|
||||
|
||||
// Add the Object ot the reference table
|
||||
$this->_referenceObjects[] = $returnObject;
|
||||
|
||||
// Check encoding types for additional processing.
|
||||
switch ($encoding) {
|
||||
case (Zend_Amf_Constants::ET_EXTERNAL):
|
||||
// Externalizable object such as {ArrayCollection} and {ObjectProxy}
|
||||
if (!$storedClass) {
|
||||
$this->_referenceDefinitions[] = array(
|
||||
'className' => $className,
|
||||
'encoding' => $encoding,
|
||||
'propertyNames' => $propertyNames,
|
||||
);
|
||||
}
|
||||
$returnObject->externalizedData = $this->readTypeMarker();
|
||||
break;
|
||||
case (Zend_Amf_Constants::ET_DYNAMIC):
|
||||
// used for Name-value encoding
|
||||
if (!$storedClass) {
|
||||
$this->_referenceDefinitions[] = array(
|
||||
'className' => $className,
|
||||
'encoding' => $encoding,
|
||||
'propertyNames' => $propertyNames,
|
||||
);
|
||||
}
|
||||
// not a refrence object read name value properties from byte stream
|
||||
$properties = array(); // clear value
|
||||
do {
|
||||
$property = $this->readString();
|
||||
if ($property != "") {
|
||||
$propertyNames[] = $property;
|
||||
$properties[$property] = $this->readTypeMarker();
|
||||
}
|
||||
} while ($property !="");
|
||||
break;
|
||||
default:
|
||||
// basic property list object.
|
||||
if (!$storedClass) {
|
||||
$count = $traitsInfo; // Number of properties in the list
|
||||
for($i=0; $i< $count; $i++) {
|
||||
$propertyNames[] = $this->readString();
|
||||
}
|
||||
// Add a refrence to the class.
|
||||
$this->_referenceDefinitions[] = array(
|
||||
'className' => $className,
|
||||
'encoding' => $encoding,
|
||||
'propertyNames' => $propertyNames,
|
||||
);
|
||||
}
|
||||
$properties = array(); // clear value
|
||||
foreach ($propertyNames as $property) {
|
||||
$properties[$property] = $this->readTypeMarker();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Add properties back to the return object.
|
||||
foreach($properties as $key=>$value) {
|
||||
if($key) {
|
||||
$returnObject->$key = $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $returnObject;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert XML to SimpleXml
|
||||
* If user wants DomDocument they can use dom_import_simplexml
|
||||
*
|
||||
* @return SimpleXml Object
|
||||
*/
|
||||
public function readXmlString()
|
||||
{
|
||||
$xmlReference = $this->readInteger();
|
||||
$length = $xmlReference >> 1;
|
||||
$string = $this->_stream->readBytes($length);
|
||||
return simplexml_load_string($string);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,317 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse_Amf3
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Amf_Parse_Serializer */
|
||||
require_once 'Zend/Amf/Parse/Serializer.php';
|
||||
|
||||
/** Zend_Amf_Parse_TypeLoader */
|
||||
require_once 'Zend/Amf/Parse/TypeLoader.php';
|
||||
|
||||
/**
|
||||
* Detect PHP object type and convert it to a corresponding AMF3 object type
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse_Amf3
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer
|
||||
{
|
||||
/**
|
||||
* Serialize PHP types to AMF3 and write to stream
|
||||
*
|
||||
* Checks to see if the type was declared and then either
|
||||
* auto negotiates the type or use the user defined markerType to
|
||||
* serialize the data from php back to AMF3
|
||||
*
|
||||
* @param mixed $content
|
||||
* @param int $markerType
|
||||
* @return void
|
||||
*/
|
||||
public function writeTypeMarker($data, $markerType=null)
|
||||
{
|
||||
if (null !== $markerType) {
|
||||
// Write the Type Marker to denote the following action script data type
|
||||
$this->_stream->writeByte($markerType);
|
||||
|
||||
switch ($markerType) {
|
||||
case Zend_Amf_Constants::AMF3_NULL:
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF3_BOOLEAN_FALSE:
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF3_BOOLEAN_TRUE:
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF3_INTEGER:
|
||||
$this->writeInteger($data);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF3_NUMBER:
|
||||
$this->_stream->writeDouble($data);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF3_STRING:
|
||||
$this->writeString($data);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF3_DATE:
|
||||
$this->writeDate($data);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF3_ARRAY:
|
||||
$this->writeArray($data);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF3_OBJECT:
|
||||
$this->writeObject($data);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF3_BYTEARRAY:
|
||||
$this->writeString($data);
|
||||
break;
|
||||
default:
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Unknown Type Marker: ' . $markerType);
|
||||
}
|
||||
} else {
|
||||
// Detect Type Marker
|
||||
switch (true) {
|
||||
case (null === $data):
|
||||
$markerType = Zend_Amf_Constants::AMF3_NULL;
|
||||
break;
|
||||
case (is_bool($data)):
|
||||
if ($data){
|
||||
$markerType = Zend_Amf_Constants::AMF3_BOOLEAN_TRUE;
|
||||
} else {
|
||||
$markerType = Zend_Amf_Constants::AMF3_BOOLEAN_FALSE;
|
||||
}
|
||||
break;
|
||||
case (is_int($data)):
|
||||
if (($data > 0xFFFFFFF) || ($data < -268435456)) {
|
||||
$markerType = Zend_Amf_Constants::AMF3_NUMBER;
|
||||
} else {
|
||||
$markerType = Zend_Amf_Constants::AMF3_INTEGER;
|
||||
}
|
||||
break;
|
||||
case (is_float($data)):
|
||||
$markerType = Zend_Amf_Constants::AMF3_NUMBER;
|
||||
break;
|
||||
case (is_string($data)):
|
||||
$markerType = Zend_Amf_Constants::AMF3_STRING;
|
||||
break;
|
||||
case (is_array($data)):
|
||||
$markerType = Zend_Amf_Constants::AMF3_ARRAY;
|
||||
break;
|
||||
case (is_object($data)):
|
||||
// Handle object types.
|
||||
if (($data instanceof DateTime) || ($data instanceof Zend_Date)) {
|
||||
$markerType = Zend_Amf_Constants::AMF3_DATE;
|
||||
} else if ($data instanceof Zend_Amf_Value_ByteArray) {
|
||||
$markerType = Zend_Amf_Constants::AMF3_BYTEARRAY;
|
||||
} else {
|
||||
$markerType = Zend_Amf_Constants::AMF3_OBJECT;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Unsupported data type: ' . gettype($data));
|
||||
}
|
||||
$this->writeTypeMarker($data, $markerType);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Write an AMF3 integer
|
||||
*
|
||||
* @param int|float $data
|
||||
* @return Zend_Amf_Parse_Amf3_Serializer
|
||||
*/
|
||||
public function writeInteger($int)
|
||||
{
|
||||
if (($int & 0xffffff80) == 0) {
|
||||
$this->_stream->writeByte($int & 0x7f);
|
||||
return $this;
|
||||
}
|
||||
|
||||
if (($int & 0xffffc000) == 0 ) {
|
||||
$this->_stream->writeByte(($int >> 7 ) | 0x80);
|
||||
$this->_stream->writeByte($int & 0x7f);
|
||||
return $this;
|
||||
}
|
||||
|
||||
if (($int & 0xffe00000) == 0) {
|
||||
$this->_stream->writeByte(($int >> 14 ) | 0x80);
|
||||
$this->_stream->writeByte(($int >> 7 ) | 0x80);
|
||||
$this->_stream->writeByte($int & 0x7f);
|
||||
return $this;
|
||||
}
|
||||
|
||||
$this->_stream->writeByte(($int >> 22 ) | 0x80);
|
||||
$this->_stream->writeByte(($int >> 15 ) | 0x80);
|
||||
$this->_stream->writeByte(($int >> 8 ) | 0x80);
|
||||
$this->_stream->writeByte($int & 0xff);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send string to output stream
|
||||
*
|
||||
* @param string $string
|
||||
* @return Zend_Amf_Parse_Amf3_Serializer
|
||||
*/
|
||||
public function writeString($string)
|
||||
{
|
||||
$ref = strlen($string) << 1 | 0x01;
|
||||
$this->writeInteger($ref);
|
||||
$this->_stream->writeBytes($string);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert DateTime/Zend_Date to AMF date
|
||||
*
|
||||
* @param DateTime|Zend_Date $date
|
||||
* @return Zend_Amf_Parse_Amf3_Serializer
|
||||
*/
|
||||
public function writeDate($date)
|
||||
{
|
||||
if ($date instanceof DateTime) {
|
||||
$dateString = $date->format('U') * 1000;
|
||||
} elseif ($date instanceof Zend_Date) {
|
||||
$dateString = $date->toString('U') * 1000;
|
||||
} else {
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Invalid date specified; must be a string DateTime or Zend_Date object');
|
||||
}
|
||||
|
||||
$this->writeInteger(0x01);
|
||||
// write time to stream minus milliseconds
|
||||
$this->_stream->writeDouble($dateString);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a PHP array back to the amf output stream
|
||||
*
|
||||
* @param array $array
|
||||
* @return Zend_Amf_Parse_Amf3_Serializer
|
||||
*/
|
||||
public function writeArray(array $array)
|
||||
{
|
||||
// have to seperate mixed from numberic keys.
|
||||
$numeric = array();
|
||||
$string = array();
|
||||
foreach ($array as $key => $value) {
|
||||
if (is_int($key)) {
|
||||
$numeric[] = $value;
|
||||
} else {
|
||||
$string[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
// write the preamble id of the array
|
||||
$length = count($numeric);
|
||||
$id = ($length << 1) | 0x01;
|
||||
$this->writeInteger($id);
|
||||
|
||||
//Write the mixed type array to the output stream
|
||||
foreach($string as $key => $value) {
|
||||
$this->writeString($key)
|
||||
->writeTypeMarker($value);
|
||||
}
|
||||
$this->writeString('');
|
||||
|
||||
// Write the numeric array to ouput stream
|
||||
foreach($numeric as $value) {
|
||||
$this->writeTypeMarker($value);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write object to ouput stream
|
||||
*
|
||||
* @param mixed $data
|
||||
* @return Zend_Amf_Parse_Amf3_Serializer
|
||||
*/
|
||||
public function writeObject($object)
|
||||
{
|
||||
$encoding = Zend_Amf_Constants::ET_PROPLIST;
|
||||
$className = '';
|
||||
|
||||
//Check to see if the object is a typed object and we need to change
|
||||
switch (true) {
|
||||
// the return class mapped name back to actionscript class name.
|
||||
case ($className = Zend_Amf_Parse_TypeLoader::getMappedClassName(get_class($object))):
|
||||
break;
|
||||
|
||||
// Check to see if the user has defined an explicit Action Script type.
|
||||
case isset($object->_explicitType):
|
||||
$className = $object->_explicitType;
|
||||
unset($object->_explicitType);
|
||||
break;
|
||||
|
||||
// Check if user has defined a method for accessing the Action Script type
|
||||
case method_exists($object, 'getASClassName'):
|
||||
$className = $object->getASClassName();
|
||||
break;
|
||||
|
||||
// No return class name is set make it a generic object
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
$traitsInfo = Zend_Amf_Constants::AMF3_OBJECT_ENCODING;
|
||||
$traitsInfo |= $encoding << 2;
|
||||
try {
|
||||
switch($encoding) {
|
||||
case Zend_Amf_Constants::ET_PROPLIST:
|
||||
$count = 0;
|
||||
foreach($object as $key => $value) {
|
||||
$count++;
|
||||
}
|
||||
$traitsInfo |= ($count << 4);
|
||||
|
||||
// Write the object ID
|
||||
$this->writeInteger($traitsInfo);
|
||||
|
||||
// Write the classname
|
||||
$this->writeString($className);
|
||||
|
||||
// Write the object Key's to the output stream
|
||||
foreach ($object as $key => $value) {
|
||||
$this->writeString($key);
|
||||
}
|
||||
|
||||
//Write the object values to the output stream.
|
||||
foreach ($object as $key => $value) {
|
||||
$this->writeTypeMarker($value);
|
||||
}
|
||||
break;
|
||||
case Zend_Amf_Constants::ET_EXTERNAL:
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('External Object Encoding not implemented');
|
||||
break;
|
||||
default:
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Unknown Object Encoding type: ' . $encoding);
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Unable to writeObject output: ' . $e->getMessage());
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Abstract cass that all deserializer must implement.
|
||||
*
|
||||
* Logic for deserialization of the AMF envelop is based on resources supplied
|
||||
* by Adobe Blaze DS. For and example of deserialization please review the BlazeDS
|
||||
* source tree.
|
||||
*
|
||||
* @see http://opensource.adobe.com/svn/opensource/blazeds/trunk/modules/core/src/java/flex/messaging/io/amf/
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
abstract class Zend_Amf_Parse_Deserializer
|
||||
{
|
||||
/**
|
||||
* The raw string that represents the AMF request.
|
||||
*
|
||||
* @var Zend_Amf_Parse_InputStream
|
||||
*/
|
||||
protected $_stream;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param Zend_Amf_Parse_InputStream $stream
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(Zend_Amf_Parse_InputStream $stream)
|
||||
{
|
||||
$this->_stream = $stream;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks for AMF marker types and calls the appropriate methods
|
||||
* for deserializing those marker types. Markers are the data type of
|
||||
* the following value.
|
||||
*
|
||||
* @param int $typeMarker
|
||||
* @return mixed Whatever the data type is of the marker in php
|
||||
*/
|
||||
public abstract function readTypeMarker($markerType = null);
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Amf_Util_BinaryStream */
|
||||
require_once 'Zend/Amf/Util/BinaryStream.php';
|
||||
|
||||
/**
|
||||
* InputStream is used to iterate at a binary level through the AMF request.
|
||||
*
|
||||
* InputStream extends BinaryStream as eventually BinaryStream could be placed
|
||||
* outside of Zend_Amf in order to allow other packages to use the class.
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Parse_InputStream extends Zend_Amf_Util_BinaryStream
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Amf_Util_BinaryStream */
|
||||
require_once 'Zend/Amf/Util/BinaryStream.php';
|
||||
|
||||
/**
|
||||
* Iterate at a binary level through the AMF response
|
||||
*
|
||||
* OutputStream extends BinaryStream as eventually BinaryStream could be placed
|
||||
* outside of Zend_Amf in order to allow other packages to use the class.
|
||||
*
|
||||
* @uses Zend_Amf_Util_BinaryStream
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Parse_OutputStream extends Zend_Amf_Util_BinaryStream
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct('');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Base abstract class for all AMF serializers.
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
abstract class Zend_Amf_Parse_Serializer
|
||||
{
|
||||
/**
|
||||
* Refrence to the current output stream being constructed
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $_stream;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param Zend_Amf_Parse_OutputStream $stream
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(Zend_Amf_Parse_OutputStream $stream)
|
||||
{
|
||||
$this->_stream = $stream;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the PHP object type and convert it into an AMF object type
|
||||
*
|
||||
* @param mixed $content
|
||||
* @param int $markerType
|
||||
* @return void
|
||||
*/
|
||||
public abstract function writeTypeMarker($content, $markerType=null);
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
require_once 'Zend/Amf/Value/Messaging/AcknowledgeMessage.php';
|
||||
require_once 'Zend/Amf/Value/Messaging/AsyncMessage.php';
|
||||
require_once 'Zend/Amf/Value/Messaging/CommandMessage.php';
|
||||
require_once 'Zend/Amf/Value/Messaging/ErrorMessage.php';
|
||||
require_once 'Zend/Amf/Value/Messaging/RemotingMessage.php';
|
||||
|
||||
/**
|
||||
* Loads a local class and executes the instantiation of that class.
|
||||
*
|
||||
* @todo PHP 5.3 can drastically change this class w/ namespace and the new call_user_func w/ namespace
|
||||
* @package Zend_Amf
|
||||
* @subpackage Parse
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
final class Zend_Amf_Parse_TypeLoader
|
||||
{
|
||||
/**
|
||||
* @var string callback class
|
||||
*/
|
||||
public static $callbackClass;
|
||||
|
||||
/**
|
||||
* @var array AMF class map
|
||||
*/
|
||||
public static $classMap = array (
|
||||
'flex.messaging.messages.AcknowledgeMessage' => 'Zend_Amf_Value_Messaging_AcknowledgeMessage',
|
||||
'flex.messaging.messages.ErrorMessage' => 'Zend_Amf_Value_Messaging_AsyncMessage',
|
||||
'flex.messaging.messages.CommandMessage' => 'Zend_Amf_Value_Messaging_CommandMessage',
|
||||
'flex.messaging.messages.ErrorMessage' => 'Zend_Amf_Value_Messaging_ErrorMessage',
|
||||
'flex.messaging.messages.RemotingMessage' => 'Zend_Amf_Value_Messaging_RemotingMessage',
|
||||
);
|
||||
|
||||
/**
|
||||
* @var array Default class map
|
||||
*/
|
||||
protected static $_defaultClassMap = array(
|
||||
'flex.messaging.messages.AcknowledgeMessage' => 'Zend_Amf_Value_Messaging_AcknowledgeMessage',
|
||||
'flex.messaging.messages.ErrorMessage' => 'Zend_Amf_Value_Messaging_AsyncMessage',
|
||||
'flex.messaging.messages.CommandMessage' => 'Zend_Amf_Value_Messaging_CommandMessage',
|
||||
'flex.messaging.messages.ErrorMessage' => 'Zend_Amf_Value_Messaging_ErrorMessage',
|
||||
'flex.messaging.messages.RemotingMessage' => 'Zend_Amf_Value_Messaging_RemotingMessage',
|
||||
);
|
||||
|
||||
/**
|
||||
* Load the mapped class type into a callback.
|
||||
*
|
||||
* @param string $className
|
||||
* @return object|false
|
||||
*/
|
||||
public static function loadType($className)
|
||||
{
|
||||
$class = false;
|
||||
$callBack = false;
|
||||
$class = self::getMappedClassName($className);
|
||||
if (!class_exists($class)) {
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception($className .' mapped class '. $class . ' is not defined');
|
||||
}
|
||||
|
||||
return $class;
|
||||
}
|
||||
|
||||
/**
|
||||
* Looks up the supplied call name to its mapped class name
|
||||
*
|
||||
* @param string $className
|
||||
* @return string
|
||||
*/
|
||||
public static function getMappedClassName($className)
|
||||
{
|
||||
$mappedName = array_search($className, self::$classMap);
|
||||
|
||||
if ($mappedName) {
|
||||
return $mappedName;
|
||||
}
|
||||
|
||||
$mappedName = array_search($className, array_flip(self::$classMap));
|
||||
|
||||
if ($mappedName) {
|
||||
return $mappedName;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Map PHP class names to ActionScript class names
|
||||
*
|
||||
* Allows users to map the class names of there action script classes
|
||||
* to the equivelent php class name. Used in deserialization to load a class
|
||||
* and serialiation to set the class name of the returned object.
|
||||
*
|
||||
* @param string $asClassName
|
||||
* @param string $phpClassName
|
||||
* @return void
|
||||
*/
|
||||
public static function setMapping($asClassName, $phpClassName)
|
||||
{
|
||||
self::$classMap[$asClassName] = $phpClassName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset type map
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function resetMap()
|
||||
{
|
||||
self::$classMap = self::$_defaultClassMap;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,249 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Amf_Parse_InputStream */
|
||||
require_once 'Zend/Amf/Parse/InputStream.php';
|
||||
|
||||
/** Zend_Amf_Parse_Amf0_Deserializer */
|
||||
require_once 'Zend/Amf/Parse/Amf0/Deserializer.php';
|
||||
|
||||
/** Zend_Amf_Constants */
|
||||
require_once 'Zend/Amf/Constants.php';
|
||||
|
||||
/** Zend_Amf_Value_MessageHeader */
|
||||
require_once 'Zend/Amf/Value/MessageHeader.php';
|
||||
|
||||
/** Zend_Amf_Value_MessageBody */
|
||||
require_once 'Zend/Amf/Value/MessageBody.php';
|
||||
|
||||
/**
|
||||
* Handle the incoming AMF request by deserializing the data to php object
|
||||
* types and storing the data for Zend_Amf_Server to handle for processing.
|
||||
*
|
||||
* @todo Currently not checking if the object needs to be Type Mapped to a server object.
|
||||
* @package Zend_Amf
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Request
|
||||
{
|
||||
/**
|
||||
* @var int AMF client type (AMF0, AMF3)
|
||||
*/
|
||||
protected $_clientType = 0; // default AMF0
|
||||
|
||||
/**
|
||||
* @var array Message bodies
|
||||
*/
|
||||
protected $_bodies = array();
|
||||
|
||||
/**
|
||||
* @var array Message headers
|
||||
*/
|
||||
protected $_headers = array();
|
||||
|
||||
/**
|
||||
* @var int Message encoding to use for objects in response
|
||||
*/
|
||||
protected $_objectEncoding = 0;
|
||||
|
||||
/**
|
||||
* @var Zend_Amf_Parse_InputStream
|
||||
*/
|
||||
protected $_inputStream;
|
||||
|
||||
/**
|
||||
* @var Zend_Amf_Parse_AMF0_Deserializer
|
||||
*/
|
||||
protected $_deserializer;
|
||||
|
||||
/**
|
||||
* Time of the request
|
||||
* @var mixed
|
||||
*/
|
||||
protected $_time;
|
||||
|
||||
/**
|
||||
* Prepare the AMF InputStream for parsing.
|
||||
*
|
||||
* @param string $request
|
||||
* @return Zend_Amf_Request
|
||||
*/
|
||||
public function initialize($request)
|
||||
{
|
||||
$this->_inputStream = new Zend_Amf_Parse_InputStream($request);
|
||||
$this->_deserializer = new Zend_Amf_Parse_AMF0_Deserializer($this->_inputStream);
|
||||
$this->readMessage($this->_inputStream);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes the raw AMF input stream and converts it into valid PHP objects
|
||||
*
|
||||
* @param Zend_Amf_Parse_InputStream
|
||||
* @return Zend_Amf_Request
|
||||
*/
|
||||
public function readMessage(Zend_Amf_Parse_InputStream $stream)
|
||||
{
|
||||
$clientVersion = $stream->readUnsignedShort();
|
||||
if (($clientVersion != Zend_Amf_Constants::AMF0_OBJECT_ENCODING)
|
||||
&& ($clientVersion != Zend_Amf_Constants::AMF3_OBJECT_ENCODING)
|
||||
) {
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Unknown Player Version ' . $clientVersion);
|
||||
}
|
||||
|
||||
$this->_bodies = array();
|
||||
$this->_headers = array();
|
||||
$headerCount = $stream->readInt();
|
||||
|
||||
// Iterate through the AMF envelope header
|
||||
while ($headerCount--) {
|
||||
$this->_headers[] = $this->readHeader();
|
||||
}
|
||||
|
||||
// Iterate through the AMF envelope body
|
||||
$bodyCount = $stream->readInt();
|
||||
while ($bodyCount--) {
|
||||
$this->_bodies[] = $this->readBody();
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deserialize a message header from the input stream.
|
||||
*
|
||||
* A message header is structured as:
|
||||
* - NAME String
|
||||
* - MUST UNDERSTAND Boolean
|
||||
* - LENGTH Int
|
||||
* - DATA Object
|
||||
*
|
||||
* @return Zend_Amf_Value_MessageHeader
|
||||
*/
|
||||
public function readHeader()
|
||||
{
|
||||
$name = $this->_inputStream->readUTF();
|
||||
$mustRead = (bool)$this->_inputStream->readByte();
|
||||
$length = $this->_inputStream->readLong();
|
||||
|
||||
try {
|
||||
$data = $this->_deserializer->readTypeMarker();
|
||||
} catch (Exception $e) {
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Unable to parse ' . $name . ' header data: ' . $e->getMessage() . ' '. $e->getLine());
|
||||
}
|
||||
|
||||
$header = new Zend_Amf_Value_MessageHeader($name, $mustRead, $data, $length);
|
||||
return $header;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deserialize a message body from the input stream
|
||||
*
|
||||
* @return Zend_Amf_Value_MessageBody
|
||||
*/
|
||||
public function readBody()
|
||||
{
|
||||
$targetURI = $this->_inputStream->readUTF();
|
||||
$responseURI = $this->_inputStream->readUTF();
|
||||
$length = $this->_inputStream->readLong();
|
||||
|
||||
try {
|
||||
$data = $this->_deserializer->readTypeMarker();
|
||||
} catch (Exception $e) {
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Unable to parse ' . $targetURI . ' body data ' . $e->getMessage());
|
||||
}
|
||||
|
||||
// Check for AMF3 objectEncoding
|
||||
if ($this->_deserializer->getObjectEncoding() == Zend_Amf_Constants::AMF3_OBJECT_ENCODING) {
|
||||
/*
|
||||
* When and AMF3 message is sent to the server it is nested inside
|
||||
* an AMF0 array called Content. The following code gets the object
|
||||
* out of the content array and sets it as the message data.
|
||||
*/
|
||||
if(is_array($data) && is_object($data[0])){
|
||||
$data = $data[0];
|
||||
}
|
||||
|
||||
// set the encoding so we return our message in AMF3
|
||||
$this->_objectEncoding = Zend_Amf_Constants::AMF3_OBJECT_ENCODING;
|
||||
}
|
||||
|
||||
$body = new Zend_Amf_Value_MessageBody($targetURI, $responseURI, $data);
|
||||
return $body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an array of the body objects that were found in the amf request.
|
||||
*
|
||||
* @return array {target, response, length, content}
|
||||
*/
|
||||
public function getAmfBodies()
|
||||
{
|
||||
return $this->_bodies;
|
||||
}
|
||||
|
||||
/**
|
||||
* Accessor to private array of message bodies.
|
||||
*
|
||||
* @param Zend_Amf_Value_MessageBody $message
|
||||
* @return Zend_Amf_Request
|
||||
*/
|
||||
public function addAmfBody(Zend_Amf_Value_MessageBody $message)
|
||||
{
|
||||
$this->_bodies[] = $message;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an array of headers that were found in the amf request.
|
||||
*
|
||||
* @return array {operation, mustUnderstand, length, param}
|
||||
*/
|
||||
public function getAmfHeaders()
|
||||
{
|
||||
return $this->_headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the either 0 or 3 for respect AMF version
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getObjectEncoding()
|
||||
{
|
||||
return $this->_objectEncoding;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the object response encoding
|
||||
*
|
||||
* @param mixed $int
|
||||
* @return Zend_Amf_Request
|
||||
*/
|
||||
public function setObjectEncoding($int)
|
||||
{
|
||||
$this->_objectEncoding = $int;
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Request
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Amf_Request */
|
||||
require_once 'Zend/Amf/Request.php';
|
||||
|
||||
/**
|
||||
* AMF Request object -- Request via HTTP
|
||||
*
|
||||
* Extends {@link Zend_Amf_Request} to accept a request via HTTP. Request is
|
||||
* built at construction time using a raw POST; if no data is available, the
|
||||
* request is declared a fault.
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Request
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Request_Http extends Zend_Amf_Request
|
||||
{
|
||||
/**
|
||||
* Raw AMF request
|
||||
* @var string
|
||||
*/
|
||||
protected $_rawRequest;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* Attempts to read from php://input to get raw POST request; if an error
|
||||
* occurs in doing so, or if the AMF body is invalid, the request is declared a
|
||||
* fault.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
// php://input allows you to read raw POST data. It is a less memory
|
||||
// intensive alternative to $HTTP_RAW_POST_DATA and does not need any
|
||||
// special php.ini directives
|
||||
$amfRequest = file_get_contents('php://input');
|
||||
|
||||
// Check to make sure that we have data on the input stream.
|
||||
if ($amfRequest != '') {
|
||||
$this->_rawRequest = $amfRequest;
|
||||
$this->initialize($amfRequest);
|
||||
} else {
|
||||
echo '<p>Zend Amf Endpoint</p>' ;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve raw AMF Request
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getRawRequest()
|
||||
{
|
||||
return $this->_rawRequest;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,193 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Amf_Constants */
|
||||
require_once 'Zend/Amf/Constants.php';
|
||||
|
||||
/** Zend_Amf_Parse_OutputStream */
|
||||
require_once 'Zend/Amf/Parse/OutputStream.php';
|
||||
|
||||
/** Zend_Amf_Parse_Amf0_Serializer */
|
||||
require_once 'Zend/Amf/Parse/Amf0/Serializer.php';
|
||||
|
||||
/**
|
||||
* Handles converting the PHP object ready for response back into AMF
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Response
|
||||
{
|
||||
/**
|
||||
* @var int Object encoding for response
|
||||
*/
|
||||
protected $_objectEncoding = 0;
|
||||
|
||||
/**
|
||||
* Array of Zend_Amf_Value_MessageBody objects
|
||||
* @var array
|
||||
*/
|
||||
protected $_bodies = array();
|
||||
|
||||
/**
|
||||
* Array of Zend_Amf_Value_MessageHeader objects
|
||||
* @var array
|
||||
*/
|
||||
protected $_headers = array();
|
||||
|
||||
/**
|
||||
* @var Zend_Amf_Parse_OutputStream
|
||||
*/
|
||||
protected $_outputStream;
|
||||
|
||||
/**
|
||||
* Instantiate new output stream and start serialization
|
||||
*
|
||||
* @return Zend_Amf_Response
|
||||
*/
|
||||
public function finalize()
|
||||
{
|
||||
$this->_outputStream = new Zend_Amf_Parse_OutputStream();
|
||||
$this->writeMessage($this->_outputStream);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialize the PHP data types back into Actionscript and
|
||||
* create and AMF stream.
|
||||
*
|
||||
* @param Zend_Amf_Parse_OutputStream $stream
|
||||
* @return Zend_Amf_Response
|
||||
*/
|
||||
public function writeMessage(Zend_Amf_Parse_OutputStream $stream)
|
||||
{
|
||||
$objectEncoding = $this->_objectEncoding;
|
||||
|
||||
//Write encoding to start of stream. Preamble byte is written of two byte Unsigned Short
|
||||
$stream->writeByte(0x00);
|
||||
$stream->writeByte($objectEncoding);
|
||||
|
||||
// Loop through the AMF Headers that need to be returned.
|
||||
$headerCount = count($this->_headers);
|
||||
$stream->writeInt($headerCount);
|
||||
foreach ($this->getAmfHeaders() as $header) {
|
||||
$serializer = new Zend_Amf_Parse_Amf0_Serializer($stream);
|
||||
$stream->writeUTF($header->name);
|
||||
$stream->writeByte($header->mustRead);
|
||||
$stream->writeLong(Zend_Amf_Constants::UNKNOWN_CONTENT_LENGTH);
|
||||
$serializer->writeTypeMarker($header->data);
|
||||
}
|
||||
|
||||
// loop through the AMF bodies that need to be returned.
|
||||
$bodyCount = count($this->_bodies);
|
||||
$stream->writeInt($bodyCount);
|
||||
foreach ($this->_bodies as $body) {
|
||||
$serializer = new Zend_Amf_Parse_Amf0_Serializer($stream);
|
||||
$stream->writeUTF($body->getTargetURI());
|
||||
$stream->writeUTF($body->getResponseURI());
|
||||
$stream->writeLong(Zend_Amf_Constants::UNKNOWN_CONTENT_LENGTH);
|
||||
if($this->_objectEncoding == Zend_Amf_Constants::AMF0_OBJECT_ENCODING) {
|
||||
$serializer->writeTypeMarker($body->getData());
|
||||
} else {
|
||||
// Content is AMF3
|
||||
$serializer->writeTypeMarker($body->getData(),Zend_Amf_Constants::AMF0_AMF3);
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the output stream content
|
||||
*
|
||||
* @return string The contents of the output stream
|
||||
*/
|
||||
public function getResponse()
|
||||
{
|
||||
return $this->_outputStream->getStream();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the output stream content
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return $this->getResponse();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an AMF body to be sent to the Flash Player
|
||||
*
|
||||
* @param Zend_Amf_Value_MessageBody $body
|
||||
* @return Zend_Amf_Response
|
||||
*/
|
||||
public function addAmfBody(Zend_Amf_Value_MessageBody $body)
|
||||
{
|
||||
$this->_bodies[] = $body;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an array of AMF bodies to be serialized
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getAmfBodies()
|
||||
{
|
||||
return $this->_bodies;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an AMF Header to be sent back to the flash player
|
||||
*
|
||||
* @param Zend_Amf_Value_MessageHeader $header
|
||||
* @return Zend_Amf_Response
|
||||
*/
|
||||
public function addAmfHeader(Zend_Amf_Value_MessageHeader $header)
|
||||
{
|
||||
$this->_headers[] = $header;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve attached AMF message headers
|
||||
*
|
||||
* @return array Array of Zend_Amf_Value_MessageHeader objects
|
||||
*/
|
||||
public function getAmfHeaders()
|
||||
{
|
||||
return $this->_headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the AMF encoding that will be used for serialization
|
||||
*
|
||||
* @param int $encoding
|
||||
* @return Zend_Amf_Response
|
||||
*/
|
||||
public function setObjectEncoding($encoding)
|
||||
{
|
||||
$this->_objectEncoding = $encoding;
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Response
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Amf_Response */
|
||||
require_once 'Zend/Amf/Response.php';
|
||||
|
||||
/**
|
||||
* Creates the proper http headers and send the serialized AMF stream to standard out.
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Response
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Response_Http extends Zend_Amf_Response
|
||||
{
|
||||
/**
|
||||
* Create the application response header for AMF and sends the serialized AMF string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getResponse()
|
||||
{
|
||||
if (!headers_sent()) {
|
||||
header('Content-Type: application/x-amf');
|
||||
}
|
||||
return parent::getResponse();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,627 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Server_Interface */
|
||||
require_once 'Zend/Server/Interface.php';
|
||||
|
||||
/** Zend_Server_Reflection */
|
||||
require_once 'Zend/Server/Reflection.php';
|
||||
|
||||
/** Zend_Amf_Constants */
|
||||
require_once 'Zend/Amf/Constants.php';
|
||||
|
||||
/** Zend_Amf_Value_MessageBody */
|
||||
require_once 'Zend/Amf/Value/MessageBody.php';
|
||||
|
||||
/** Zend_Amf_Value_Messaging_CommandMessage */
|
||||
require_once 'Zend/Amf/Value/Messaging/CommandMessage.php';
|
||||
|
||||
/**
|
||||
* An AMF gateway server implementation to allow the connection of the Adobe Flash Player to
|
||||
* the Zend Framework
|
||||
*
|
||||
* @todo Make the relection methods cache and autoload.
|
||||
* @package Zend_Amf
|
||||
* @subpackage Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Server implements Zend_Server_Interface
|
||||
{
|
||||
/**
|
||||
* Array of dispatchables
|
||||
* @var array
|
||||
*/
|
||||
protected $_methods = array();
|
||||
|
||||
/**
|
||||
* Array of directories to search for loading classes dynamically
|
||||
* @var array
|
||||
*/
|
||||
protected $_directories = array();
|
||||
|
||||
/**
|
||||
* @var bool Production flag; whether or not to return exception messages
|
||||
*/
|
||||
protected $_production = true;
|
||||
|
||||
/**
|
||||
* Request processed
|
||||
* @var null|Zend_Amf_Request
|
||||
*/
|
||||
protected $_request = null;
|
||||
|
||||
/**
|
||||
* Class to use for responses
|
||||
* @var null|Zend_Amf_Response
|
||||
*/
|
||||
protected $_response;
|
||||
|
||||
/**
|
||||
* Dispatch table of name => method pairs
|
||||
* @var array
|
||||
*/
|
||||
protected $_table = array();
|
||||
|
||||
/**
|
||||
* Set production flag
|
||||
*
|
||||
* @param bool $flag
|
||||
* @return Zend_Amf_Server
|
||||
*/
|
||||
public function setProduction($flag)
|
||||
{
|
||||
$this->_production = (bool) $flag;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether or not the server is in production
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isProduction()
|
||||
{
|
||||
return $this->_production;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Loads a remote class or method and executes the function and returns
|
||||
* the result
|
||||
*
|
||||
* @param string $method Is the method to execute
|
||||
* @param mixed $param values for the method
|
||||
* @return mixed $response the result of executing the method
|
||||
* @throws Zend_Amf_Server_Exception
|
||||
*/
|
||||
protected function _dispatch($method, $params = null, $source = null)
|
||||
{
|
||||
if (!isset($this->_table[$method])) {
|
||||
// if source is null a method that was not defined was called.
|
||||
if ($source) {
|
||||
$classPath = array();
|
||||
$path = explode('.', $source);
|
||||
$className = array_pop($path);
|
||||
$uriclasspath = implode('/', $path);
|
||||
|
||||
// Take the user supplied directories and add the unique service path to the end.
|
||||
foreach ($this->_directories as $dir) {
|
||||
$classPath[] = $dir . $uriclasspath;
|
||||
}
|
||||
|
||||
require_once('Zend/Loader.php');
|
||||
try {
|
||||
Zend_Loader::loadClass($className, $classPath);
|
||||
} catch (Exception $e) {
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('Class "' . $className . '" does not exist');
|
||||
}
|
||||
// Add the new loaded class to the server.
|
||||
$this->setClass($className);
|
||||
} else {
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('Method "' . $method . '" does not exist');
|
||||
}
|
||||
}
|
||||
|
||||
$info = $this->_table[$method];
|
||||
$argv = $info->getInvokeArguments();
|
||||
if (0 < count($argv)) {
|
||||
$params = array_merge($params, $argv);
|
||||
}
|
||||
|
||||
if ($info instanceof Zend_Server_Reflection_Function) {
|
||||
$func = $info->getName();
|
||||
$return = call_user_func_array($func, $params);
|
||||
} elseif ($info instanceof Zend_Server_Reflection_Method) {
|
||||
// Get class
|
||||
$class = $info->getDeclaringClass()->getName();
|
||||
if ('static' == $info->isStatic()) {
|
||||
// for some reason, invokeArgs() does not work the same as
|
||||
// invoke(), and expects the first argument to be an object.
|
||||
// So, using a callback if the method is static.
|
||||
$return = call_user_func_array(array($class, $info->getName()), $params);
|
||||
} else {
|
||||
// Object methods
|
||||
try {
|
||||
$object = $info->getDeclaringClass()->newInstance();
|
||||
} catch (Exception $e) {
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('Error instantiating class ' . $class . ' to invoke method ' . $info->getName(), 621);
|
||||
}
|
||||
$return = $info->invokeArgs($object, $params);
|
||||
}
|
||||
} else {
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('Method missing implementation ' . get_class($info));
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles each of the 11 different command message types.
|
||||
*
|
||||
* A command message is a flex.messaging.messages.CommandMessage
|
||||
*
|
||||
* @see Zend_Amf_Value_Messaging_CommandMessage
|
||||
* @param Zend_Amf_Value_Messaging_CommandMessage $message
|
||||
* @return Zend_Amf_Value_Messaging_AcknowledgeMessage
|
||||
*/
|
||||
protected function _loadCommandMessage(Zend_Amf_Value_Messaging_CommandMessage $message)
|
||||
{
|
||||
switch($message->operation) {
|
||||
case Zend_Amf_Value_Messaging_CommandMessage::CLIENT_PING_OPERATION :
|
||||
require_once 'Zend/Amf/Value/Messaging/AcknowledgeMessage.php';
|
||||
$return = new Zend_Amf_Value_Messaging_AcknowledgeMessage($message);
|
||||
break;
|
||||
default :
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('CommandMessage::' . $message->operation . ' not implemented');
|
||||
break;
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes the deserialized AMF request and performs any operations.
|
||||
*
|
||||
* @todo should implement and SPL observer pattern for custom AMF headers
|
||||
* @todo implement AMF header authentication
|
||||
* @param Zend_Amf_Request $request
|
||||
* @return Zend_Amf_Response
|
||||
* @throws Zend_Amf_server_Exception|Exception
|
||||
*/
|
||||
protected function _handle(Zend_Amf_Request $request)
|
||||
{
|
||||
// Get the object encoding of the request.
|
||||
$objectEncoding = $request->getObjectEncoding();
|
||||
|
||||
// create a response object to place the output from the services.
|
||||
$response = $this->getResponse();
|
||||
|
||||
// set reponse encoding
|
||||
$response->setObjectEncoding($objectEncoding);
|
||||
|
||||
$responseBody = $request->getAmfBodies();
|
||||
|
||||
// Iterate through each of the service calls in the AMF request
|
||||
foreach($responseBody as $body)
|
||||
{
|
||||
try {
|
||||
if ($objectEncoding == Zend_Amf_Constants::AMF0_OBJECT_ENCODING) {
|
||||
// AMF0 Object Encoding
|
||||
$targetURI = $body->getTargetURI();
|
||||
|
||||
// Split the target string into its values.
|
||||
$source = substr($targetURI, 0, strrpos($targetURI, '.'));
|
||||
|
||||
if ($source) {
|
||||
// Break off method name from namespace into source
|
||||
$method = substr(strrchr($targetURI, '.'), 1);
|
||||
$return = $this->_dispatch($method, $body->getData(), $source);
|
||||
} else {
|
||||
// Just have a method name.
|
||||
$return = $this->_dispatch($targetURI, $body->getData());
|
||||
}
|
||||
} else {
|
||||
// AMF3 read message type
|
||||
$message = $body->getData();
|
||||
if ($message instanceof Zend_Amf_Value_Messaging_CommandMessage) {
|
||||
// async call with command message
|
||||
$return = $this->_loadCommandMessage($message);
|
||||
} elseif ($message instanceof Zend_Amf_Value_Messaging_RemotingMessage) {
|
||||
require_once 'Zend/Amf/Value/Messaging/AcknowledgeMessage.php';
|
||||
$return = new Zend_Amf_Value_Messaging_AcknowledgeMessage($message);
|
||||
$return->body = $this->_dispatch($message->operation, $message->body, $message->source);
|
||||
} else {
|
||||
// Amf3 message sent with netConnection
|
||||
$targetURI = $body->getTargetURI();
|
||||
|
||||
// Split the target string into its values.
|
||||
$source = substr($targetURI, 0, strrpos($targetURI, '.'));
|
||||
|
||||
if ($source) {
|
||||
// Break off method name from namespace into source
|
||||
$method = substr(strrchr($targetURI, '.'), 1);
|
||||
$return = $this->_dispatch($method, array($body->getData()), $source);
|
||||
} else {
|
||||
// Just have a method name.
|
||||
$return = $this->_dispatch($targetURI, $body->getData());
|
||||
}
|
||||
}
|
||||
}
|
||||
$responseType = Zend_AMF_Constants::RESULT_METHOD;
|
||||
} catch (Exception $e) {
|
||||
switch ($objectEncoding) {
|
||||
case Zend_Amf_Constants::AMF0_OBJECT_ENCODING :
|
||||
$return = array(
|
||||
'description' => ($this->isProduction()) ? '' : $e->getMessage(),
|
||||
'detail' => ($this->isProduction()) ? '' : $e->getTraceAsString(),
|
||||
'line' => ($this->isProduction()) ? 0 : $e->getLine(),
|
||||
'code' => $e->getCode(),
|
||||
);
|
||||
break;
|
||||
case Zend_Amf_Constants::AMF3_OBJECT_ENCODING :
|
||||
require_once 'Zend/Amf/Value/Messaging/ErrorMessage.php';
|
||||
$return = new Zend_Amf_Value_Messaging_ErrorMessage($message);
|
||||
$return->faultString = $this->isProduction() ? '' : $e->getMessage();
|
||||
$return->faultCode = $e->getCode();
|
||||
$return->faultDetail = $this->isProduction() ? '' : $e->getTraceAsString();
|
||||
break;
|
||||
}
|
||||
$responseType = Zend_AMF_Constants::STATUS_METHOD;
|
||||
}
|
||||
|
||||
$responseURI = $body->getResponseURI() . $responseType;
|
||||
$newBody = new Zend_Amf_Value_MessageBody($responseURI, null, $return);
|
||||
$response->addAmfBody($newBody);
|
||||
}
|
||||
|
||||
// serialize the response and return serialized body.
|
||||
$response->finalize();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle an AMF call from the gateway.
|
||||
*
|
||||
* @param null|Zend_Amf_Request $request Optional
|
||||
* @return Zend_Amf_Response
|
||||
*/
|
||||
public function handle($request = null)
|
||||
{
|
||||
// Check if request was passed otherwise get it from the server
|
||||
if (is_null($request) || !$request instanceof Zend_Amf_Request) {
|
||||
$request = $this->getRequest();
|
||||
} else {
|
||||
$this->setRequest($request);
|
||||
}
|
||||
|
||||
// Check for errors that may have happend in deserialization of Request.
|
||||
try {
|
||||
// Take converted PHP objects and handle service call.
|
||||
// Serialize to Zend_Amf_response for output stream
|
||||
$this->_handle($request);
|
||||
$response = $this->getResponse();
|
||||
} catch (Exception $e) {
|
||||
// Handle any errors in the serialization and service calls.
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('Handle error: ' . $e->getMessage() . ' ' . $e->getLine());
|
||||
}
|
||||
|
||||
// Return the Amf serialized output string
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set request object
|
||||
*
|
||||
* @param string|Zend_Amf_Request $request
|
||||
* @return Zend_Amf_Server
|
||||
*/
|
||||
public function setRequest($request)
|
||||
{
|
||||
if (is_string($request) && class_exists($request)) {
|
||||
$request = new $request();
|
||||
if (!$request instanceof Zend_Amf_Request) {
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('Invalid request class');
|
||||
}
|
||||
} elseif (!$request instanceof Zend_Amf_Request) {
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('Invalid request object');
|
||||
}
|
||||
$this->_request = $request;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return currently registered request object
|
||||
*
|
||||
* @return null|Zend_Amf_Request
|
||||
*/
|
||||
public function getRequest()
|
||||
{
|
||||
if (null === $this->_request) {
|
||||
require_once 'Zend/Amf/Request/Http.php';
|
||||
$this->setRequest(new Zend_Amf_Request_Http());
|
||||
}
|
||||
|
||||
return $this->_request;
|
||||
}
|
||||
|
||||
/**
|
||||
* Public access method to private Zend_Amf_Server_Response refrence
|
||||
*
|
||||
* @param string|Zend_Amf_Server_Response $response
|
||||
* @return Zend_Amf_Server
|
||||
*/
|
||||
public function setResponse($response)
|
||||
{
|
||||
if (is_string($response) && class_exists($response)) {
|
||||
$response = new $response();
|
||||
if (!$response instanceof Zend_Amf_Response) {
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('Invalid response class');
|
||||
}
|
||||
} elseif (!$response instanceof Zend_Amf_Response) {
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('Invalid response object');
|
||||
}
|
||||
$this->_response = $response;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* get a refrence to the Zend_Amf_response instance
|
||||
*
|
||||
* @return Zend_Amf_Server_Response
|
||||
*/
|
||||
public function getResponse()
|
||||
{
|
||||
if (null === ($response = $this->_response)) {
|
||||
require_once 'Zend/Amf/Response/Http.php';
|
||||
$this->setResponse(new Zend_Amf_Response_Http());
|
||||
}
|
||||
return $this->_response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a file system path to a directory of services.
|
||||
* @param string|array $path
|
||||
*/
|
||||
public function setClassPath($path)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Attach a class or object to the server
|
||||
*
|
||||
* Class may be either a class name or an instantiated object. Reflection
|
||||
* is done on the class or object to determine the available public
|
||||
* methods, and each is attached to the server as and available method. If
|
||||
* a $namespace has been provided, that namespace is used to prefix
|
||||
* AMF service call.
|
||||
*
|
||||
* @param string|object $class
|
||||
* @param string $namespace Optional
|
||||
* @param mixed $arg Optional arguments to pass to a method
|
||||
* @return Zend_Amf_Server
|
||||
* @throws Zend_Amf_Server_Exception on invalid input
|
||||
*/
|
||||
public function setClass($class, $namespace = '', $argv = null)
|
||||
{
|
||||
if (is_string($class) && !class_exists($class)){
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('Invalid method or class');
|
||||
} elseif (!is_string($class) && !is_object($class)) {
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('Invalid method or class; must be a classname or object');
|
||||
}
|
||||
|
||||
$argv = null;
|
||||
if (2 < func_num_args()) {
|
||||
$argv = array_slice(func_get_args(), 2);
|
||||
}
|
||||
|
||||
$this->_methods[] = Zend_Server_Reflection::reflectClass($class, $argv, $namespace);
|
||||
$this->_buildDispatchTable();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attach a function to the server
|
||||
*
|
||||
* Additional arguments to pass to the function at dispatch may be passed;
|
||||
* any arguments following the namespace will be aggregated and passed at
|
||||
* dispatch time.
|
||||
*
|
||||
* @param string|array $function Valid callback
|
||||
* @param string $namespace Optional namespace prefix
|
||||
* @return Zend_Amf_Server
|
||||
* @throws Zend_Amf_Server_Exception
|
||||
*/
|
||||
public function addFunction($function, $namespace = '')
|
||||
{
|
||||
if (!is_string($function) && !is_array($function)) {
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('Unable to attach function');
|
||||
}
|
||||
|
||||
$argv = null;
|
||||
if (2 < func_num_args()) {
|
||||
$argv = array_slice(func_get_args(), 2);
|
||||
}
|
||||
|
||||
$function = (array) $function;
|
||||
foreach ($function as $func) {
|
||||
if (!is_string($func) || !function_exists($func)) {
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('Unable to attach function');
|
||||
}
|
||||
$this->_methods[] = Zend_Server_Reflection::reflectFunction($func, $argv, $namespace);
|
||||
}
|
||||
|
||||
$this->_buildDispatchTable();
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates an array of directories in which services can reside.
|
||||
*
|
||||
* @param string $dir
|
||||
*/
|
||||
public function addDirectory($dir)
|
||||
{
|
||||
$this->_directories[] = $dir;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of directories that can hold services.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getDirectory()
|
||||
{
|
||||
return $_directory;
|
||||
}
|
||||
|
||||
/**
|
||||
* (Re)Build the dispatch table
|
||||
*
|
||||
* The dispatch table consists of a an array of method name =>
|
||||
* Zend_Server_Reflection_Function_Abstract pairs
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function _buildDispatchTable()
|
||||
{
|
||||
$table = array();
|
||||
foreach ($this->_methods as $key => $dispatchable) {
|
||||
if ($dispatchable instanceof Zend_Server_Reflection_Function_Abstract) {
|
||||
$ns = $dispatchable->getNamespace();
|
||||
$name = $dispatchable->getName();
|
||||
$name = empty($ns) ? $name : $ns . '.' . $name;
|
||||
|
||||
if (isset($table[$name])) {
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('Duplicate method registered: ' . $name);
|
||||
}
|
||||
$table[$name] = $dispatchable;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($dispatchable instanceof Zend_Server_Reflection_Class) {
|
||||
foreach ($dispatchable->getMethods() as $method) {
|
||||
$ns = $method->getNamespace();
|
||||
$name = $method->getName();
|
||||
$name = empty($ns) ? $name : $ns . '.' . $name;
|
||||
|
||||
if (isset($table[$name])) {
|
||||
require_once 'Zend/Amf/Server/Exception.php';
|
||||
throw new Zend_Amf_Server_Exception('Duplicate method registered: ' . $name);
|
||||
}
|
||||
$table[$name] = $method;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->_table = $table;
|
||||
}
|
||||
|
||||
/**
|
||||
* Raise a server fault
|
||||
*
|
||||
* Unimplemented
|
||||
*
|
||||
* @param string|Exception $fault
|
||||
* @return void
|
||||
*/
|
||||
public function fault($fault = null, $code = 404)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of registered methods
|
||||
*
|
||||
* Returns an array of dispatchables (Zend_Server_Reflection_Function,
|
||||
* _Method, and _Class items).
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getFunctions()
|
||||
{
|
||||
return $this->_table;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set server persistence
|
||||
*
|
||||
* Unimplemented
|
||||
*
|
||||
* @param mixed $mode
|
||||
* @return void
|
||||
*/
|
||||
public function setPersistence($mode)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Load server definition
|
||||
*
|
||||
* Unimplemented
|
||||
*
|
||||
* @param array $definition
|
||||
* @return void
|
||||
*/
|
||||
public function loadFunctions($definition)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Map ActionScript classes to PHP classes
|
||||
*
|
||||
* @param string $asClass
|
||||
* @param string $phpClass
|
||||
* @return Zend_Amf_Server
|
||||
*/
|
||||
public function setClassMap($asClass, $phpClass)
|
||||
{
|
||||
require_once 'Zend/Amf/Parse/TypeLoader.php';
|
||||
Zend_Amf_Parse_TypeLoader::setMapping($asClass, $phpClass);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* List all available methods
|
||||
*
|
||||
* Returns an array of method names.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function listMethods()
|
||||
{
|
||||
return array_keys($this->_table);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to version 1.0 of the Zend Framework
|
||||
* license, that is bundled with this package in the file LICENSE.txt, and
|
||||
* is available through the world-wide-web at the following URL:
|
||||
* http://framework.zend.com/license/new-bsd. If you did not receive
|
||||
* a copy of the Zend Framework license and are unable to obtain it
|
||||
* through the world-wide-web, please send a note to [email protected]
|
||||
* so we can mail you a copy immediately.
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Amf_Exception */
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
|
||||
/**
|
||||
* Zend_Amf_Server_Exception
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Server_Exception extends Zend_Amf_Exception
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,278 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Util
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Utility class to walk through a data stream byte by byte with conventional names
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Util
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Util_BinaryStream
|
||||
{
|
||||
/**
|
||||
* @var string Byte stream
|
||||
*/
|
||||
protected $_stream;
|
||||
|
||||
/**
|
||||
* @var int Length of stream
|
||||
*/
|
||||
protected $_streamLength;
|
||||
|
||||
/**
|
||||
* @var bool BigEndian encoding?
|
||||
*/
|
||||
protected $_bigEndian;
|
||||
|
||||
/**
|
||||
* @var int Current position in stream
|
||||
*/
|
||||
protected $_needle;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* Create a refrence to a byte stream that is going to be parsed or created
|
||||
* by the methods in the class. Detect if the class should use big or
|
||||
* little Endian encoding.
|
||||
*
|
||||
* @param string $stream use '' if creating a new stream or pass a string if reading.
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($stream)
|
||||
{
|
||||
if (!is_string($stream)) {
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception('Inputdata is not of type String');
|
||||
}
|
||||
|
||||
$this->_stream = $stream;
|
||||
$this->_needle = 0;
|
||||
$this->_streamLength = strlen($stream);
|
||||
$testEndian = unpack("C*", pack("S*", 256));
|
||||
$this->_bigEndian = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current stream
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getStream()
|
||||
{
|
||||
return $this->_stream;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the number of bytes in a row for the length supplied.
|
||||
*
|
||||
* @todo Should check that there are enough bytes left in the stream we are about to read.
|
||||
* @param int $length
|
||||
* @return string
|
||||
* @throws Zend_Amf_Exception for buffer underrun
|
||||
*/
|
||||
public function readBytes($length)
|
||||
{
|
||||
if (($length + $this->_needle) > strlen($this->_stream)) {
|
||||
require_once 'Zend/Amf/Exception.php';
|
||||
throw new Zend_Amf_Exception("Buffer underrun at needle position: " . $this->_needle . " while requesting length: " . $length);
|
||||
}
|
||||
$bytes = substr($this->_stream, $this->_needle, $length);
|
||||
$this->_needle += $length;
|
||||
return $bytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write any length of bytes to the stream
|
||||
*
|
||||
* Usually a string.
|
||||
*
|
||||
* @param string $bytes
|
||||
* @return Zend_Amf_Util_BinaryStream
|
||||
*/
|
||||
public function writeBytes($bytes)
|
||||
{
|
||||
$this->_stream .= $bytes;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a signed byte
|
||||
*
|
||||
* @return int Value is in the range of -128 to 127.
|
||||
*/
|
||||
public function readByte()
|
||||
{
|
||||
$byte = ord($this->_stream[$this->_needle++]);
|
||||
return $byte;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the passed string into a signed byte on the stream.
|
||||
*
|
||||
* @param string $stream
|
||||
* @return Zend_Amf_Util_BinaryStream
|
||||
*/
|
||||
public function writeByte($stream)
|
||||
{
|
||||
$this->_stream .= pack("c",$stream);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a signed 32-bit integer from the data stream.
|
||||
*
|
||||
* @return int Value is in the range of -2147483648 to 2147483647
|
||||
*/
|
||||
public function readInt()
|
||||
{
|
||||
$int = ($this->readByte() << 8) + $this->readByte();
|
||||
return $int;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write an the integer to the output stream as a 32 bit signed integer
|
||||
*
|
||||
* @param int $stream
|
||||
* @return Zend_Amf_Util_BinaryStream
|
||||
*/
|
||||
public function writeInt($stream)
|
||||
{
|
||||
$this->_stream .= pack("n", $stream);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a UTF-8 string from the data stream
|
||||
*
|
||||
* @return string A UTF-8 string produced by the byte representation of characters
|
||||
*/
|
||||
public function readUtf()
|
||||
{
|
||||
$length = $this->readInt();
|
||||
return $this->readBytes($length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wite a UTF-8 string to the outputstream
|
||||
*
|
||||
* @param string $stream
|
||||
* @return Zend_Amf_Util_BinaryStream
|
||||
*/
|
||||
public function writeUtf($stream)
|
||||
{
|
||||
$this->writeInt(strlen($stream));
|
||||
$this->_stream .= $stream;
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Read a long UTF string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function readLongUtf()
|
||||
{
|
||||
$length = $this->readLong();
|
||||
return $this->readBytes($length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a long UTF string to the buffer
|
||||
*
|
||||
* @param string $stream
|
||||
* @return Zend_Amf_Util_BinaryStream
|
||||
*/
|
||||
public function writeLongUtf($stream)
|
||||
{
|
||||
$this->writeLong(strlen($stream));
|
||||
$this->_stream .= $stream;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read a long numeric value
|
||||
*
|
||||
* @return double
|
||||
*/
|
||||
public function readLong()
|
||||
{
|
||||
$long = ($this->readByte() << 24) + ($this->readByte() << 16) + ($this->readByte() << 8) + $this->readByte();
|
||||
return $long;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write long numeric value to output stream
|
||||
*
|
||||
* @param int|string $stream
|
||||
* @return Zend_Amf_Util_BinaryStream
|
||||
*/
|
||||
public function writeLong($stream)
|
||||
{
|
||||
$this->_stream .= pack("N",$stream);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read a 16 bit unsigned short.
|
||||
*
|
||||
* @todo This could use the unpack() w/ S,n, or v
|
||||
* @return double
|
||||
*/
|
||||
public function readUnsignedShort()
|
||||
{
|
||||
$byte1 = $this->readByte();
|
||||
$byte2 = $this->readByte();
|
||||
$short = (($byte1 << 8) | $byte2);
|
||||
return $short;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads an IEEE 754 double-precision floating point number from the data stream.
|
||||
*
|
||||
* @return double Floating point number
|
||||
*/
|
||||
public function readDouble()
|
||||
{
|
||||
$bytes = substr($this->_stream, $this->_needle, 8);
|
||||
$this->_needle += 8;
|
||||
$double = unpack("dflt", strrev($bytes));
|
||||
return $double['flt'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes an IEEE 754 double-precision floating point number from the data stream.
|
||||
*
|
||||
* @param string|double $stream
|
||||
* @return Zend_Amf_Util_BinaryStream
|
||||
*/
|
||||
public function writeDouble($stream)
|
||||
{
|
||||
$stream = pack("d", $stream);
|
||||
if ($this->_bigEndian) {
|
||||
$stream = strrev($stream);
|
||||
}
|
||||
$this->_stream .= $stream;
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Wrapper class to store an AMF3 flash.utils.ByteArray
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Value_ByteArray
|
||||
{
|
||||
/**
|
||||
* @var string ByteString Data
|
||||
*/
|
||||
protected $_data = '';
|
||||
|
||||
/**
|
||||
* Create a ByteArray
|
||||
*
|
||||
* @param string $data
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($data)
|
||||
{
|
||||
$this->_data = $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the byte stream
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getData()
|
||||
{
|
||||
return $this->_data;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,181 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* An AMF Message contains information about the actual individual
|
||||
* transaction that is to be performed. It specifies the remote
|
||||
* operation that is to be performed; a local (client) operation
|
||||
* to be invoked upon success; and, the data to be used in the
|
||||
* operation.
|
||||
* <p/>
|
||||
* This Message structure defines how a local client would
|
||||
* invoke a method/operation on a remote server. Additionally,
|
||||
* the response from the Server is structured identically.
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Value_MessageBody
|
||||
{
|
||||
/**
|
||||
* A string describing which operation, function, or method
|
||||
* is to be remotley invoked.
|
||||
* @var string
|
||||
*/
|
||||
protected $_targetUri = "";
|
||||
|
||||
/**
|
||||
* Universal Resource Identifier that uniquely targets the originator's
|
||||
* Object that should receive the server's response. The server will
|
||||
* use this path specification to target the "OnResult()" or "onStatus()"
|
||||
* handlers within the client. For Flash, it specifies an ActionScript
|
||||
* Object path only. The NetResponse object pointed to by the Response Uri
|
||||
* contains the connection state information. Passing/specifying this
|
||||
* provides a convenient mechanism for the client/server to share access
|
||||
* to an object that is managing the state of the shared connection.
|
||||
*
|
||||
* Since the server will use this field in the event of an error,
|
||||
* this field is required even if a successful server request would
|
||||
* not be expected to return a value to the client.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $_responseUri = "";
|
||||
|
||||
/**
|
||||
* Contains the actual data associated with the operation. It contains
|
||||
* the client's parameter data that is passed to the server's operation/method.
|
||||
* When serializing a root level data type or a parameter list array, no
|
||||
* name field is included. That is, the data is anonomously represented
|
||||
* as "Type Marker"/"Value" pairs. When serializing member data, the data is
|
||||
* represented as a series of "Name"/"Type"/"Value" combinations.
|
||||
*
|
||||
* For server generated responses, it may contain any ActionScript
|
||||
* data/objects that the server was expected to provide.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $_data;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $targetUri
|
||||
* @param string $responseUri
|
||||
* @param string $data
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($targetUri, $responseUri, $data)
|
||||
{
|
||||
$this->setTargetUri($targetUri);
|
||||
$this->setResponseUri($responseUri);
|
||||
$this->setData($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve target Uri
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTargetUri()
|
||||
{
|
||||
return $this->_targetUri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set target Uri
|
||||
*
|
||||
* @param string $targetUri
|
||||
* @return Zend_Amf_Value_MessageBody
|
||||
*/
|
||||
public function setTargetUri($targetUri)
|
||||
{
|
||||
if (null === $targetUri) {
|
||||
$targetUri = '';
|
||||
}
|
||||
$this->_targetUri = (string) $targetUri;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get target Uri
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getResponseUri()
|
||||
{
|
||||
return $this->_responseUri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set response Uri
|
||||
*
|
||||
* @param string $responseUri
|
||||
* @return Zend_Amf_Value_MessageBody
|
||||
*/
|
||||
public function setResponseUri($responseUri)
|
||||
{
|
||||
if (null === $responseUri) {
|
||||
$responseUri = '';
|
||||
}
|
||||
$this->_responseUri = $responseUri;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve response data
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getData()
|
||||
{
|
||||
return $this->_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set response data
|
||||
*
|
||||
* @param mixed $data
|
||||
* @return Zend_Amf_Value_MessageBody
|
||||
*/
|
||||
public function setData($data)
|
||||
{
|
||||
$this->_data = $data;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set reply method
|
||||
*
|
||||
* @param string $methodName
|
||||
* @return Zend_Amf_Value_MessageBody
|
||||
*/
|
||||
public function setReplyMethod($methodName)
|
||||
{
|
||||
if (!preg_match('#^[/?]#', $methodName)) {
|
||||
$this->_targetUri = rtrim($this->_targetUri, '/') . '/';
|
||||
}
|
||||
$this->_targetUri = $this->_targetUri . $methodName;
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Message Headers provide context for the processing of the
|
||||
* the AMF Packet and all subsequent Messages.
|
||||
*
|
||||
* Multiple Message Headers may be included within an AMF Packet.
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Value_MessageHeader
|
||||
{
|
||||
/**
|
||||
* Name of the header
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $name;
|
||||
|
||||
/**
|
||||
* Flag if the data has to be parsed on return
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
public $mustRead;
|
||||
|
||||
/**
|
||||
* Length of the data field
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $length;
|
||||
|
||||
/**
|
||||
* Data sent with the header name
|
||||
*
|
||||
* @var mixed
|
||||
*/
|
||||
public $data;
|
||||
|
||||
/**
|
||||
* Used to create and store AMF Header data.
|
||||
*
|
||||
* @param String $name
|
||||
* @param Boolean $mustRead
|
||||
* @param misc $content
|
||||
* @param integer $length
|
||||
*/
|
||||
public function __construct($name, $mustRead, $data, $length=null)
|
||||
{
|
||||
$this->name = $name;
|
||||
$this->mustRead = (bool) $mustRead;
|
||||
$this->data = $data;
|
||||
if (null !== $length) {
|
||||
$this->length = (int) $length;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* This is the default Implementation of Message, which provides
|
||||
* a convenient base for behavior and association of common endpoints
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Value_Messaging_AbstractMessage
|
||||
{
|
||||
/**
|
||||
* @var string Client identifier
|
||||
*/
|
||||
public $clientId;
|
||||
|
||||
/**
|
||||
* @var string Destination
|
||||
*/
|
||||
public $destination;
|
||||
|
||||
/**
|
||||
* @var string Message identifier
|
||||
*/
|
||||
public $messageId;
|
||||
|
||||
/**
|
||||
* @var int Message timestamp
|
||||
*/
|
||||
public $timestamp;
|
||||
|
||||
/**
|
||||
* @var int Message TTL
|
||||
*/
|
||||
public $timeToLive;
|
||||
|
||||
/**
|
||||
* @var object Message headers
|
||||
*/
|
||||
public $headers;
|
||||
|
||||
/**
|
||||
* @var string Message body
|
||||
*/
|
||||
public $body;
|
||||
|
||||
/**
|
||||
* generate a unique id
|
||||
*
|
||||
* Format is: ########-####-####-####-############
|
||||
* Where # is an uppercase letter or number
|
||||
* example: 6D9DC7EC-A273-83A9-ABE3-00005FD752D6
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function generateId()
|
||||
{
|
||||
return sprintf(
|
||||
'%08X-%04X-%04X-%02X%02X-%012X',
|
||||
mt_rand(),
|
||||
mt_rand(0, 65535),
|
||||
bindec(substr_replace(
|
||||
sprintf('%016b', mt_rand(0, 65535)), '0100', 11, 4)
|
||||
),
|
||||
bindec(substr_replace(sprintf('%08b', mt_rand(0, 255)), '01', 5, 2)),
|
||||
mt_rand(0, 255),
|
||||
mt_rand()
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Amf_Value_Messaging_AsyncMessage */
|
||||
require_once 'Zend/Amf/Value/Messaging/AsyncMessage.php';
|
||||
|
||||
/**
|
||||
* This is the type of message returned by the MessageBroker
|
||||
* to endpoints after the broker has routed an endpoint's message
|
||||
* to a service.
|
||||
*
|
||||
* flex.messaging.messages.AcknowledgeMessage
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Value_Messaging_AcknowledgeMessage extends Zend_Amf_Value_Messaging_AsyncMessage
|
||||
{
|
||||
/**
|
||||
* Create a new Acknowledge Message
|
||||
*
|
||||
* @param unknown_type $message
|
||||
*/
|
||||
public function __construct($message)
|
||||
{
|
||||
$this->clientId = $this->generateId();
|
||||
$this->destination = null;
|
||||
$this->messageId = $this->generateId();
|
||||
$this->timestamp = time().'00';
|
||||
$this->timeToLive = 0;
|
||||
$this->headers = new STDClass();
|
||||
$this->body = null;
|
||||
|
||||
// correleate the two messages
|
||||
if ($message) {
|
||||
$this->correlationId = $message->messageId;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Amf_Value_Messaging_AbstractMessage */
|
||||
require_once 'Zend/Amf/Value/Messaging/AbstractMessage.php';
|
||||
|
||||
/**
|
||||
* This type of message contains information necessary to perform
|
||||
* point-to-point or publish-subscribe messaging.
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Value_Messaging_AsyncMessage extends Zend_Amf_Value_Messaging_AbstractMessage
|
||||
{
|
||||
/**
|
||||
* The message id to be responded to.
|
||||
* @var String
|
||||
*/
|
||||
public $correlationId;
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
require_once 'Zend/Amf/Value/Messaging/AsyncMessage.php';
|
||||
|
||||
/**
|
||||
* A message that represents an infrastructure command passed between
|
||||
* client and server. Subscribe/unsubscribe operations result in
|
||||
* CommandMessage transmissions, as do polling operations.
|
||||
*
|
||||
* Corresponds to flex.messaging.messages.CommandMessage
|
||||
*
|
||||
* Note: THESE VALUES MUST BE THE SAME ON CLIENT AND SERVER
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Value_Messaging_CommandMessage extends Zend_Amf_Value_Messaging_AsyncMessage
|
||||
{
|
||||
/**
|
||||
* This operation is used to subscribe to a remote destination.
|
||||
* @const int
|
||||
*/
|
||||
const SUBSCRIBE_OPERATION = 0;
|
||||
|
||||
/**
|
||||
* This operation is used to unsubscribe from a remote destination.
|
||||
* @const int
|
||||
*/
|
||||
const UNSUSBSCRIBE_OPERATION = 1;
|
||||
|
||||
/**
|
||||
* This operation is used to poll a remote destination for pending,
|
||||
* undelivered messages.
|
||||
* @const int
|
||||
*/
|
||||
const POLL_OPERATION = 2;
|
||||
|
||||
/**
|
||||
* This operation is used by a remote destination to sync missed or cached messages
|
||||
* back to a client as a result of a client issued poll command.
|
||||
* @const int
|
||||
*/
|
||||
const CLIENT_SYNC_OPERATION = 4;
|
||||
|
||||
/**
|
||||
* This operation is used to test connectivity over the current channel to
|
||||
* the remote endpoint.
|
||||
* @const int
|
||||
*/
|
||||
const CLIENT_PING_OPERATION = 5;
|
||||
|
||||
/**
|
||||
* This operation is used to request a list of failover endpoint URIs
|
||||
* for the remote destination based on cluster membership.
|
||||
* @const int
|
||||
*/
|
||||
const CLUSTER_REQUEST_OPERATION = 7;
|
||||
|
||||
/**
|
||||
* This operation is used to send credentials to the endpoint so that
|
||||
* the user can be logged in over the current channel.
|
||||
* The credentials need to be Base64 encoded and stored in the <code>body</code>
|
||||
* of the message.
|
||||
* @const int
|
||||
*/
|
||||
const LOGIN_OPERATION = 8;
|
||||
|
||||
/**
|
||||
* This operation is used to log the user out of the current channel, and
|
||||
* will invalidate the server session if the channel is HTTP based.
|
||||
* @const int
|
||||
*/
|
||||
const LOGOUT_OPERATION = 9;
|
||||
|
||||
/**
|
||||
* This operation is used to indicate that the client's subscription to a
|
||||
* remote destination has been invalidated.
|
||||
* @const int
|
||||
*/
|
||||
const SESSION_INVALIDATE_OPERATION = 10;
|
||||
|
||||
/**
|
||||
* This operation is used by the MultiTopicConsumer to subscribe/unsubscribe
|
||||
* from multiple subtopics/selectors in the same message.
|
||||
* @const int
|
||||
*/
|
||||
const MULTI_SUBSCRIBE_OPERATION = 11;
|
||||
|
||||
/**
|
||||
* This operation is used to indicate that a channel has disconnected
|
||||
* @const int
|
||||
*/
|
||||
const DISCONNECT_OPERATION = 12;
|
||||
|
||||
/**
|
||||
* This is the default operation for new CommandMessage instances.
|
||||
* @const int
|
||||
*/
|
||||
const UNKNOWN_OPERATION = 10000;
|
||||
|
||||
/**
|
||||
* The operation to execute for messages of this type
|
||||
* @var int
|
||||
*/
|
||||
public $operation = self::UNKNOWN_OPERATION;
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Amf_Value_Messaging_AcknowledgeMessage */
|
||||
require_once 'Zend/Amf/Value/Messaging/AcknowledgeMessage.php';
|
||||
|
||||
/**
|
||||
* Creates the error message to report to flex the issue with the call
|
||||
*
|
||||
* Corresponds to flex.messaging.messages.ErrorMessage
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Value_Messaging_ErrorMessage extends Zend_Amf_Value_Messaging_AcknowledgeMessage
|
||||
{
|
||||
/**
|
||||
* Additional data with error
|
||||
* @var object
|
||||
*/
|
||||
public $extendedData = null;
|
||||
|
||||
/**
|
||||
* Error code number
|
||||
* @var string
|
||||
*/
|
||||
public $faultCode;
|
||||
|
||||
/**
|
||||
* Description as to the cause of the error
|
||||
* @var string
|
||||
*/
|
||||
public $faultDetail;
|
||||
|
||||
/**
|
||||
* Short description of error
|
||||
* @var string
|
||||
*/
|
||||
public $faultString = '';
|
||||
|
||||
/**
|
||||
* root cause of error
|
||||
* @var object
|
||||
*/
|
||||
public $rootCause = null;
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Amf_Value_Messaging_AbstractMessage */
|
||||
require_once 'Zend/Amf/Value/Messaging/AbstractMessage.php';
|
||||
|
||||
/**
|
||||
* This type of message contains information needed to perform
|
||||
* a Remoting invocation.
|
||||
*
|
||||
* Corresponds to flex.messaging.messages.RemotingMessage
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Value_Messaging_RemotingMessage extends Zend_Amf_Value_Messaging_AbstractMessage
|
||||
{
|
||||
|
||||
/**
|
||||
* The name of the service to be called including package name
|
||||
* @var String
|
||||
*/
|
||||
public $source;
|
||||
|
||||
/**
|
||||
* The name of the method to be called
|
||||
* @var string
|
||||
*/
|
||||
public $operation;
|
||||
|
||||
/**
|
||||
* The arguments to call the mathod with
|
||||
* @var array
|
||||
*/
|
||||
public $parameters;
|
||||
|
||||
/**
|
||||
* Create a new Remoting Message
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->clientId = $this->generateId();
|
||||
$this->destination = null;
|
||||
$this->messageId = $this->generateId();
|
||||
$this->timestamp = time().'00';
|
||||
$this->timeToLive = 0;
|
||||
$this->headers = new stdClass();
|
||||
$this->body = null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Amf_Value_TraitsInfo
|
||||
*
|
||||
* @package Zend_Amf
|
||||
* @subpackage Value
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Amf_Value_TraitsInfo
|
||||
{
|
||||
/**
|
||||
* @var string Class name
|
||||
*/
|
||||
protected $_className;
|
||||
|
||||
/**
|
||||
* @var bool Whether or not this is a dynamic class
|
||||
*/
|
||||
protected $_dynamic;
|
||||
|
||||
/**
|
||||
* @var bool Whether or not the class is externalizable
|
||||
*/
|
||||
protected $_externalizable;
|
||||
|
||||
/**
|
||||
* @var array Class properties
|
||||
*/
|
||||
protected $_properties;
|
||||
|
||||
/**
|
||||
* Used to keep track of all class traits of an AMF3 object
|
||||
*
|
||||
* @param string $className
|
||||
* @param boolean $dynamic
|
||||
* @param boolean $externalizable
|
||||
* @param boolean $properties
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($className, $dynamic=false, $externalizable=false, $properties=null)
|
||||
{
|
||||
$this->_className = $className;
|
||||
$this->_dynamic = $dynamic;
|
||||
$this->_externalizable = $externalizable;
|
||||
$this->_properties = $properties;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if the class is a dynamic class
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isDynamic()
|
||||
{
|
||||
return $this->_dynamic;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if class is externalizable
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isExternalizable()
|
||||
{
|
||||
return $this->_externalizable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the number of properties in the class
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function length()
|
||||
{
|
||||
return count($this->_properties);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the class name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getClassName()
|
||||
{
|
||||
return $this->_className;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an additional property
|
||||
*
|
||||
* @param string $name
|
||||
* @return Zend_Amf_Value_TraitsInfo
|
||||
*/
|
||||
public function addProperty($name)
|
||||
{
|
||||
$this->_properties[] = $name;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add all properties of the class.
|
||||
*
|
||||
* @param array $props
|
||||
* @return Zend_Amf_Value_TraitsInfo
|
||||
*/
|
||||
public function addAllProperties(array $props)
|
||||
{
|
||||
$this->_properties = $props;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the property at a given index
|
||||
*
|
||||
* @param int $index
|
||||
* @return string
|
||||
*/
|
||||
public function getProperty($index)
|
||||
{
|
||||
return $this->_properties[(int) $index];
|
||||
}
|
||||
|
||||
/**
|
||||
* Return all properties of the class.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getAllProperties()
|
||||
{
|
||||
return $this->_properties;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,322 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Date
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
|
||||
/**
|
||||
* Additional data for sunset/sunrise calculations
|
||||
*
|
||||
* Holds the geographical data for all capital cities and many others worldwide
|
||||
* Original data from http://www.fallingrain.com/world/
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Date
|
||||
* @subpackage Zend_Date_Cities
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Date_Cities
|
||||
{
|
||||
/**
|
||||
* Array Collection of known cities
|
||||
*
|
||||
* The array contains 'latitude' and 'longitude' for every known city
|
||||
*
|
||||
* @var Array
|
||||
*/
|
||||
public static $cities = array(
|
||||
'Abidjan' => array('latitude' => 5.3411111, 'longitude' => -4.0280556),
|
||||
'Abu Dhabi' => array('latitude' => 24.4666667, 'longitude' => 54.3666667),
|
||||
'Abuja' => array('latitude' => 9.1758333, 'longitude' => 7.1808333),
|
||||
'Accra' => array('latitude' => 5.55, 'longitude' => -0.2166667),
|
||||
'Adamstown' => array('latitude' => -25.0666667, 'longitude' => -130.0833333),
|
||||
'Addis Ababa' => array('latitude' => 9.0333333, 'longitude' => 38.7),
|
||||
'Adelaide' => array('latitude' => -34.9333333, 'longitude' => 138.6),
|
||||
'Algiers' => array('latitude' => 36.7630556, 'longitude' => 3.0505556),
|
||||
'Alofi' => array('latitude' => -19.0166667, 'longitude' => -169.9166667),
|
||||
'Amman' => array('latitude' => 31.95, 'longitude' => 35.9333333),
|
||||
'Amsterdam' => array('latitude' => 52.35, 'longitude' => 4.9166667),
|
||||
'Andorra la Vella' => array('latitude' => 42.5, 'longitude' => 1.5166667),
|
||||
'Ankara' => array('latitude' => 39.9272222, 'longitude' => 32.8644444),
|
||||
'Antananarivo' => array('latitude' => -18.9166667, 'longitude' => 47.5166667),
|
||||
'Apia' => array('latitude' => -13.8333333, 'longitude' => -171.7333333),
|
||||
'Ashgabat' => array('latitude' => 37.95, 'longitude' => 58.3833333),
|
||||
'Asmara' => array('latitude' => 15.3333333, 'longitude' => 38.9333333),
|
||||
'Astana' => array('latitude' => 51.1811111, 'longitude' => 71.4277778),
|
||||
'Asunción' => array('latitude' => -25.2666667, 'longitude' => -57.6666667),
|
||||
'Athens' => array('latitude' => 37.9833333, 'longitude' => 23.7333333),
|
||||
'Auckland' => array('latitude' => -36.8666667, 'longitude' => 174.7666667),
|
||||
'Avarua' => array('latitude' => -21.2, 'longitude' => -159.7666667),
|
||||
'Baghdad' => array('latitude' => 33.3386111, 'longitude' => 44.3938889),
|
||||
'Baku' => array('latitude' => 40.3952778, 'longitude' => 49.8822222),
|
||||
'Bamako' => array('latitude' => 12.65, 'longitude' => -8),
|
||||
'Bandar Seri Begawan' => array('latitude' => 4.8833333, 'longitude' => 114.9333333),
|
||||
'Bankok' => array('latitude' => 13.5833333, 'longitude' => 100.2166667),
|
||||
'Bangui' => array('latitude' => 4.3666667, 'longitude' => 18.5833333),
|
||||
'Banjul' => array('latitude' => 13.4530556, 'longitude' => -16.5775),
|
||||
'Basel' => array('latitude' => 47.5666667, 'longitude' => 7.6),
|
||||
'Basseterre' => array('latitude' => 17.3, 'longitude' => -62.7166667),
|
||||
'Beijing' => array('latitude' => 39.9288889, 'longitude' => 116.3883333),
|
||||
'Beirut' => array('latitude' => 33.8719444, 'longitude' => 35.5097222),
|
||||
'Belgrade' => array('latitude' => 44.8186111, 'longitude' => 20.4680556),
|
||||
'Belmopan' => array('latitude' => 17.25, 'longitude' => -88.7666667),
|
||||
'Berlin' => array('latitude' => 52.5166667, 'longitude' => 13.4),
|
||||
'Bern' => array('latitude' => 46.9166667, 'longitude' => 7.4666667),
|
||||
'Bishkek' => array('latitude' => 42.8730556, 'longitude' => 74.6002778),
|
||||
'Bissau' => array('latitude' => 11.85, 'longitude' => -15.5833333),
|
||||
'Bloemfontein' => array('latitude' => -29.1333333, 'longitude' => 26.2),
|
||||
'Bogotá' => array('latitude' => 4.6, 'longitude' => -74.0833333),
|
||||
'Brasilia' => array('latitude' => -15.7833333, 'longitude' => -47.9166667),
|
||||
'Bratislava' => array('latitude' => 48.15, 'longitude' => 17.1166667),
|
||||
'Brazzaville' => array('latitude' => -4.2591667, 'longitude' => 15.2847222),
|
||||
'Bridgetown' => array('latitude' => 13.1, 'longitude' => -59.6166667),
|
||||
'Brisbane' => array('latitude' => -27.5, 'longitude' => 153.0166667),
|
||||
'Brussels' => array('latitude' => 50.8333333, 'longitude' => 4.3333333),
|
||||
'Bucharest' => array('latitude' => 44.4333333, 'longitude' => 26.1),
|
||||
'Budapest' => array('latitude' => 47.5, 'longitude' => 19.0833333),
|
||||
'Buenos Aires' => array('latitude' => -34.5875, 'longitude' => -58.6725),
|
||||
'Bujumbura' => array('latitude' => -3.3761111, 'longitude' => 29.36),
|
||||
'Cairo' => array('latitude' => 30.05, 'longitude' => 31.25),
|
||||
'Calgary' => array('latitude' => 51.0833333, 'longitude' => -114.0833333),
|
||||
'Canberra' => array('latitude' => -35.2833333, 'longitude' => 149.2166667),
|
||||
'Cape Town' => array('latitude' => -33.9166667, 'longitude' => 18.4166667),
|
||||
'Caracas' => array('latitude' => 10.5, 'longitude' => -66.9166667),
|
||||
'Castries' => array('latitude' => 14, 'longitude' => -61),
|
||||
'Charlotte Amalie' => array('latitude' => 18.34389, 'longitude' => -64.93111),
|
||||
'Chicago' => array('latitude' => 41.85, 'longitude' => -87.65),
|
||||
'Chisinau' => array('latitude' => 47.055556, 'longitude' => 28.8575),
|
||||
'Cockburn Town' => array('latitude' => 21.4666667, 'longitude' => -71.1333333),
|
||||
'Colombo' => array('latitude' => 6.9319444, 'longitude' => 79.8477778),
|
||||
'Conakry' => array('latitude' => 9.5091667, 'longitude' => -13.7122222),
|
||||
'Copenhagen' => array('latitude' => 55.6666667, 'longitude' => 12.5833333),
|
||||
'Cotonou' => array('latitude' => 6.35, 'longitude' => 2.4333333),
|
||||
'Dakar' => array('latitude' => 14.6708333, 'longitude' => -17.4380556),
|
||||
'Damascus' => array('latitude' => 33.5, 'longitude' => 36.3),
|
||||
'Dar es Salaam' => array('latitude' => -6.8, 'longitude' => 39.2833333),
|
||||
'Dhaka' => array('latitude' => 23.7230556, 'longitude' => 90.4086111),
|
||||
'Dili' => array('latitude' => -8.5586111, 'longitude' => 125.5736111),
|
||||
'Djibouti' => array('latitude' => 11.595, 'longitude' => 43.1480556),
|
||||
'Dodoma' => array('latitude' => -6.1833333, 'longitude' => 35.75),
|
||||
'Doha' => array('latitude' => 25.2866667, 'longitude' => 51.5333333),
|
||||
'Dubai' => array('latitude' => 25.2522222, 'longitude' => 55.28),
|
||||
'Dublin' => array('latitude' => 53.3330556, 'longitude' => -6.2488889),
|
||||
'Dushanbe' => array('latitude' => 38.56, 'longitude' => 68.7738889 ),
|
||||
'Fagatogo' => array('latitude' => -14.2825, 'longitude' => -170.69),
|
||||
'Fongafale' => array('latitude' => -8.5166667, 'longitude' => 179.2166667),
|
||||
'Freetown' => array('latitude' => 8.49, 'longitude' => -13.2341667),
|
||||
'Gaborone' => array('latitude' => -24.6463889, 'longitude' => 25.9119444),
|
||||
'Geneva' => array('latitude' => 46.2, 'longitude' => 6.1666667),
|
||||
'George Town' => array('latitude' => 19.3, 'longitude' => -81.3833333),
|
||||
'Georgetown' => array('latitude' => 6.8, 'longitude' => -58.1666667),
|
||||
'Gibraltar' => array('latitude' => 36.1333333, 'longitude' => -5.35),
|
||||
'Glasgow' => array('latitude' => 55.8333333, 'longitude' => -4.25),
|
||||
'Guatemala la Nueva' => array('latitude' => 14.6211111, 'longitude' => -90.5269444),
|
||||
'Hagatna' => array('latitude' => 13.47417, 'longitude' => 144.74778),
|
||||
'The Hague' => array('latitude' => 52.0833333, 'longitude' => 4.3),
|
||||
'Hamilton' => array('latitude' => 32.2941667, 'longitude' => -64.7838889),
|
||||
'Hanoi' => array('latitude' => 21.0333333, 'longitude' => 105.85),
|
||||
'Harare' => array('latitude' => -17.8177778, 'longitude' => 31.0447222),
|
||||
'Havana' => array('latitude' => 23.1319444, 'longitude' => -82.3641667),
|
||||
'Helsinki' => array('latitude' => 60.1755556, 'longitude' => 24.9341667),
|
||||
'Honiara' => array('latitude' => -9.4333333, 'longitude' => 159.95),
|
||||
'Islamabad' => array('latitude' => 30.8486111, 'longitude' => 72.4944444),
|
||||
'Istanbul' => array('latitude' => 41.0186111, 'longitude' => 28.9647222),
|
||||
'Jakarta' => array('latitude' => -6.1744444, 'longitude' => 106.8294444),
|
||||
'Jamestown' => array('latitude' => -15.9333333, 'longitude' => -5.7166667),
|
||||
'Jerusalem' => array('latitude' => 31.7666667, 'longitude' => 35.2333333),
|
||||
'Johannesburg' => array('latitude' => -26.2, 'longitude' => 28.0833333),
|
||||
'Kabul' => array('latitude' => 34.5166667, 'longitude' => 69.1833333),
|
||||
'Kampala' => array('latitude' => 0.3155556, 'longitude' => 32.5655556),
|
||||
'Kathmandu' => array('latitude' => 27.7166667, 'longitude' => 85.3166667),
|
||||
'Khartoum' => array('latitude' => 15.5880556, 'longitude' => 32.5341667),
|
||||
'Kigali' => array('latitude' => -1.9536111, 'longitude' => 30.0605556),
|
||||
'Kingston' => array('latitude' => -29.05, 'longitude' => 167.95),
|
||||
'Kingstown' => array('latitude' => 13.1333333, 'longitude' => -61.2166667),
|
||||
'Kinshasa' => array('latitude' => -4.3, 'longitude' => 15.3),
|
||||
'Kolkata' => array('latitude' => 22.5697222, 'longitude' => 88.3697222),
|
||||
'Kuala Lumpur' => array('latitude' => 3.1666667, 'longitude' => 101.7),
|
||||
'Kuwait City' => array('latitude' => 29.3697222, 'longitude' => 47.9783333),
|
||||
'Kiev' => array('latitude' => 50.4333333, 'longitude' => 30.5166667),
|
||||
'La Paz' => array('latitude' => -16.5, 'longitude' => -68.15),
|
||||
'Libreville' => array('latitude' => 0.3833333, 'longitude' => 9.45),
|
||||
'Lilongwe' => array('latitude' => -13.9833333, 'longitude' => 33.7833333),
|
||||
'Lima' => array('latitude' => -12.05, 'longitude' => -77.05),
|
||||
'Lisbon' => array('latitude' => 38.7166667, 'longitude' => -9.1333333),
|
||||
'Ljubljana' => array('latitude' => 46.0552778, 'longitude' => 14.5144444),
|
||||
'Lobamba' => array('latitude' => -26.4666667, 'longitude' => 31.2),
|
||||
'Lomé' => array('latitude' => 9.7166667, 'longitude' => 38.3),
|
||||
'London' => array('latitude' => 51.5, 'longitude' => -0.1166667),
|
||||
'Los Angeles' => array('latitude' => 34.05222, 'longitude' => -118.24278),
|
||||
'Luanda' => array('latitude' => -8.8383333, 'longitude' => 13.2344444),
|
||||
'Lusaka' => array('latitude' => -15.4166667, 'longitude' => 28.2833333),
|
||||
'Luxembourg' => array('latitude' => 49.6116667, 'longitude' => 6.13),
|
||||
'Madrid' => array('latitude' => 40.4, 'longitude' => -3.6833333),
|
||||
'Majuro' => array('latitude' => 7.1, 'longitude' => 171.3833333),
|
||||
'Malabo' => array('latitude' => 3.75, 'longitude' => 8.7833333),
|
||||
'Managua' => array('latitude' => 12.1508333, 'longitude' => -86.2683333),
|
||||
'Manama' => array('latitude' => 26.2361111, 'longitude' => 50.5830556),
|
||||
'Manila' => array('latitude' => 14.6041667, 'longitude' => 120.9822222),
|
||||
'Maputo' => array('latitude' => -25.9652778, 'longitude' => 32.5891667),
|
||||
'Maseru' => array('latitude' => -29.3166667, 'longitude' => 27.4833333),
|
||||
'Mbabane' => array('latitude' => -26.3166667, 'longitude' => 31.1333333),
|
||||
'Melbourne' => array('latitude' => -37.8166667, 'longitude' => 144.9666667),
|
||||
'Melekeok' => array('latitude' => 7.4933333, 'longitude' => 134.6341667),
|
||||
'Mexiko City' => array('latitude' => 19.4341667, 'longitude' => -99.1386111),
|
||||
'Minsk' => array('latitude' => 53.9, 'longitude' => 27.5666667),
|
||||
'Mogadishu' => array('latitude' => 2.0666667, 'longitude' => 45.3666667),
|
||||
'Monaco' => array('latitude' => 43.7333333, 'longitude' => 7.4166667),
|
||||
'Monrovia' => array('latitude' => 6.3105556, 'longitude' => -10.8047222),
|
||||
'Montevideo' => array('latitude' => -34.8580556, 'longitude' => -56.1708333),
|
||||
'Montreal' => array('latitude' => 45.5, 'longitude' => -73.5833333),
|
||||
'Moroni' => array('latitude' => -11.7041667, 'longitude' => 43.2402778),
|
||||
'Moscow' => array('latitude' => 55.7522222, 'longitude' => 37.6155556),
|
||||
'Muscat' => array('latitude' => 23.6133333, 'longitude' => 58.5933333),
|
||||
'Nairobi' => array('latitude' => -1.3166667, 'longitude' => 36.8333333),
|
||||
'Nassau' => array('latitude' => 25.0833333, 'longitude' => -77.35),
|
||||
'N´Djamena' => array('latitude' => 12.1130556, 'longitude' => 15.0491667),
|
||||
'New Dehli' => array('latitude' => 28.6, 'longitude' => 77.2),
|
||||
'New York' => array('latitude' => 40.71417, 'longitude' => -74.00639),
|
||||
'Newcastle' => array('latitude' => -32.9166667, 'longitude' => 151.75),
|
||||
'Niamey' => array('latitude' => 13.6666667, 'longitude' => 1.7833333),
|
||||
'Nicosia' => array('latitude' => 35.1666667, 'longitude' => 33.3666667),
|
||||
'Nouakchott' => array('latitude' => 18.0863889, 'longitude' => -15.9752778),
|
||||
'Noumea' => array('latitude' => -22.2666667, 'longitude' => 166.45),
|
||||
'Nuku´alofa' => array('latitude' => -21.1333333, 'longitude' => -175.2),
|
||||
'Nuuk' => array('latitude' => 64.1833333, 'longitude' => -51.75),
|
||||
'Oranjestad' => array('latitude' => 12.5166667, 'longitude' => -70.0333333),
|
||||
'Oslo' => array('latitude' => 59.9166667, 'longitude' => 10.75),
|
||||
'Ouagadougou' => array('latitude' => 12.3702778, 'longitude' => -1.5247222),
|
||||
'Palikir' => array('latitude' => 6.9166667, 'longitude' => 158.15),
|
||||
'Panama City' => array('latitude' => 8.9666667, 'longitude' => -79.5333333),
|
||||
'Papeete' => array('latitude' => -17.5333333, 'longitude' => -149.5666667),
|
||||
'Paramaribo' => array('latitude' => 5.8333333, 'longitude' => -55.1666667),
|
||||
'Paris' => array('latitude' => 48.8666667, 'longitude' => 2.3333333),
|
||||
'Perth' => array('latitude' => -31.9333333, 'longitude' => 115.8333333),
|
||||
'Phnom Penh' => array('latitude' => 11.55, 'longitude' => 104.9166667),
|
||||
'Podgorica' => array('latitude' => 43.7752778, 'longitude' => 19.6827778),
|
||||
'Port Louis' => array('latitude' => -20.1666667, 'longitude' => 57.5),
|
||||
'Port Moresby' => array('latitude' => -9.4647222, 'longitude' => 147.1925),
|
||||
'Port-au-Prince' => array('latitude' => 18.5391667, 'longitude' => -72.335),
|
||||
'Port of Spain' => array('latitude' => 10.6666667, 'longitude' => -61.5),
|
||||
'Porto-Novo' => array('latitude' => 6.4833333, 'longitude' => 2.6166667),
|
||||
'Prague' => array('latitude' => 50.0833333, 'longitude' => 14.4666667),
|
||||
'Praia' => array('latitude' => 14.9166667, 'longitude' => -23.5166667),
|
||||
'Pretoria' => array('latitude' => -25.7069444, 'longitude' => 28.2294444),
|
||||
'Pyongyang' => array('latitude' => 39.0194444, 'longitude' => 125.7547222),
|
||||
'Quito' => array('latitude' => -0.2166667, 'longitude' => -78.5),
|
||||
'Rabat' => array('latitude' => 34.0252778, 'longitude' => -6.8361111),
|
||||
'Reykjavik' => array('latitude' => 64.15, 'longitude' => -21.95),
|
||||
'Riga' => array('latitude' => 56.95, 'longitude' => 24.1),
|
||||
'Rio de Janero' => array('latitude' => -22.9, 'longitude' => -43.2333333),
|
||||
'Road Town' => array('latitude' => 18.4166667, 'longitude' => -64.6166667),
|
||||
'Rome' => array('latitude' => 41.9, 'longitude' => 12.4833333),
|
||||
'Roseau' => array('latitude' => 15.3, 'longitude' => -61.4),
|
||||
'Rotterdam' => array('latitude' => 51.9166667, 'longitude' => 4.5),
|
||||
'Salvador' => array('latitude' => -12.9833333, 'longitude' => -38.5166667),
|
||||
'San José' => array('latitude' => 9.9333333, 'longitude' => -84.0833333),
|
||||
'San Juan' => array('latitude' => 18.46833, 'longitude' => -66.10611),
|
||||
'San Marino' => array('latitude' => 43.5333333, 'longitude' => 12.9666667),
|
||||
'San Salvador' => array('latitude' => 13.7086111, 'longitude' => -89.2030556),
|
||||
'Sanaá' => array('latitude' => 15.3547222, 'longitude' => 44.2066667),
|
||||
'Santa Cruz' => array('latitude' => -17.8, 'longitude' => -63.1666667),
|
||||
'Santiago' => array('latitude' => -33.45, 'longitude' => -70.6666667),
|
||||
'Santo Domingo' => array('latitude' => 18.4666667, 'longitude' => -69.9),
|
||||
'Sao Paulo' => array('latitude' => -23.5333333, 'longitude' => -46.6166667),
|
||||
'Sarajevo' => array('latitude' => 43.85, 'longitude' => 18.3833333),
|
||||
'Seoul' => array('latitude' => 37.5663889, 'longitude' => 126.9997222),
|
||||
'Shanghai' => array('latitude' => 31.2222222, 'longitude' => 121.4580556),
|
||||
'Sydney' => array('latitude' => -33.8833333, 'longitude' => 151.2166667),
|
||||
'Singapore' => array('latitude' => 1.2930556, 'longitude' => 103.8558333),
|
||||
'Skopje' => array('latitude' => 42, 'longitude' => 21.4333333),
|
||||
'Sofia' => array('latitude' => 42.6833333, 'longitude' => 23.3166667),
|
||||
'St. George´s' => array('latitude' => 12.05, 'longitude' => -61.75),
|
||||
'St. John´s' => array('latitude' => 17.1166667, 'longitude' => -61.85),
|
||||
'Stanley' => array('latitude' => -51.7, 'longitude' => -57.85),
|
||||
'Stockholm' => array('latitude' => 59.3333333, 'longitude' => 18.05),
|
||||
'Suva' => array('latitude' => -18.1333333, 'longitude' => 178.4166667),
|
||||
'Taipei' => array('latitude' => 25.0166667, 'longitude' => 121.45),
|
||||
'Tallinn' => array('latitude' => 59.4338889, 'longitude' => 24.7280556),
|
||||
'Tashkent' => array('latitude' => 41.3166667, 'longitude' => 69.25),
|
||||
'Tbilisi' => array('latitude' => 41.725, 'longitude' => 44.7908333),
|
||||
'Tegucigalpa' => array('latitude' => 14.1, 'longitude' => -87.2166667),
|
||||
'Tehran' => array('latitude' => 35.6719444, 'longitude' => 51.4244444),
|
||||
'The Hague' => array('latitude' => 52.0833333, 'longitude' => 4.3),
|
||||
'Thimphu' => array('latitude' => 27.4833333, 'longitude' => 89.6),
|
||||
'Tirana' => array('latitude' => 41.3275, 'longitude' => 19.8188889),
|
||||
'Tiraspol' => array('latitude' => 46.8402778, 'longitude' => 29.6433333),
|
||||
'Tokyo' => array('latitude' => 35.685, 'longitude' => 139.7513889),
|
||||
'Toronto' => array('latitude' => 43.6666667, 'longitude' => -79.4166667),
|
||||
'Tórshavn' => array('latitude' => 62.0166667, 'longitude' => -6.7666667),
|
||||
'Tripoli' => array('latitude' => 32.8925, 'longitude' => 13.18),
|
||||
'Tunis' => array('latitude' => 36.8027778, 'longitude' => 10.1797222),
|
||||
'Ulaanbaatar' => array('latitude' => 47.9166667, 'longitude' => 106.9166667),
|
||||
'Vaduz' => array('latitude' => 47.1333333, 'longitude' => 9.5166667),
|
||||
'Valletta' => array('latitude' => 35.8997222, 'longitude' => 14.5147222),
|
||||
'Valparaiso' => array('latitude' => -33.0477778, 'longitude' => -71.6011111),
|
||||
'Vancouver' => array('latitude' => 49.25, 'longitude' => -123.1333333),
|
||||
'Vatican City' => array('latitude' => 41.9, 'longitude' => 12.4833333),
|
||||
'Victoria' => array('latitude' => -4.6166667, 'longitude' => 55.45),
|
||||
'Vienna' => array('latitude' => 48.2, 'longitude' => 16.3666667),
|
||||
'Vientaine' => array('latitude' => 17.9666667, 'longitude' => 102.6),
|
||||
'Vilnius' => array('latitude' => 54.6833333, 'longitude' => 25.3166667),
|
||||
'Warsaw' => array('latitude' => 52.25, 'longitude' => 21),
|
||||
'Washington dc' => array('latitude' => 38.895, 'longitude' => -77.03667),
|
||||
'Wellington' => array('latitude' => -41.3, 'longitude' => 174.7833333),
|
||||
'Willemstad' => array('latitude' => 12.1, 'longitude' => -68.9166667),
|
||||
'Windhoek' => array('latitude' => -22.57, 'longitude' => 17.0836111),
|
||||
'Yamoussoukro' => array('latitude' => 6.8166667, 'longitude' => -5.2833333),
|
||||
'Yaoundé' => array('latitude' => 3.8666667, 'longitude' => 11.5166667),
|
||||
'Yerevan' => array('latitude' => 40.1811111, 'longitude' => 44.5136111),
|
||||
'Zürich' => array('latitude' => 47.3666667, 'longitude' => 8.55),
|
||||
'Zagreb' => array('latitude' => 45.8, 'longitude' => 16)
|
||||
);
|
||||
|
||||
/**
|
||||
* Returns the location from the selected city
|
||||
*
|
||||
* @param string $city City to get location for
|
||||
* @param string $horizon Horizon to use :
|
||||
* default: effective
|
||||
* others are civil, nautic, astronomic
|
||||
* @return array
|
||||
* @throws Zend_Date_Exception When city is unknown
|
||||
*/
|
||||
public static function City($city, $horizon = false)
|
||||
{
|
||||
foreach (self::$cities as $key => $value) {
|
||||
if (strtolower($key) === strtolower($city)) {
|
||||
$return = $value;
|
||||
$return['horizon'] = $horizon;
|
||||
return $return;
|
||||
}
|
||||
}
|
||||
require_once 'Zend/Date/Exception.php';
|
||||
throw new Zend_Date_Exception('unknown city');
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a list with all known cities
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getCityList()
|
||||
{
|
||||
return array_keys(self::$cities);
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Date
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @version $Id$
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Zend_Exception
|
||||
*/
|
||||
require_once 'Zend/Exception.php';
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Date
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Date_Exception extends Zend_Exception
|
||||
{
|
||||
protected $operand = null;
|
||||
|
||||
public function __construct($message, $op = null)
|
||||
{
|
||||
$this->operand = $op;
|
||||
parent::__construct($message);
|
||||
}
|
||||
|
||||
public function getOperand()
|
||||
{
|
||||
return $this->operand;
|
||||
}
|
||||
}
|
||||
@@ -152,6 +152,11 @@ class Zend_Loader
|
||||
* This function uses the PHP include_path, where PHP's is_readable()
|
||||
* does not.
|
||||
*
|
||||
* Note from ZF-2900:
|
||||
* If you use custom error handler, please check whether return value
|
||||
* from error_reporting() is zero or not.
|
||||
* At mark of fopen() can not suppress warning if the handler is used.
|
||||
*
|
||||
* @param string $filename
|
||||
* @return boolean
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,253 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Rest
|
||||
* @subpackage Client
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
|
||||
/** Zend_Service_Abstract */
|
||||
require_once 'Zend/Service/Abstract.php';
|
||||
|
||||
/** Zend_Rest_Client_Result */
|
||||
require_once 'Zend/Rest/Client/Result.php';
|
||||
|
||||
/** Zend_Uri */
|
||||
require_once 'Zend/Uri.php';
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Rest
|
||||
* @subpackage Client
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Rest_Client extends Zend_Service_Abstract
|
||||
{
|
||||
/**
|
||||
* Data for the query
|
||||
* @var array
|
||||
*/
|
||||
protected $_data = array();
|
||||
|
||||
/**
|
||||
* Zend_Uri of this web service
|
||||
* @var Zend_Uri_Http
|
||||
*/
|
||||
protected $_uri = null;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string|Zend_Uri_Http $uri URI for the web service
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($uri = null)
|
||||
{
|
||||
if (!empty($uri)) {
|
||||
$this->setUri($uri);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the URI to use in the request
|
||||
*
|
||||
* @param string|Zend_Uri_Http $uri URI for the web service
|
||||
* @return Zend_Rest_Client
|
||||
*/
|
||||
public function setUri($uri)
|
||||
{
|
||||
if ($uri instanceof Zend_Uri_Http) {
|
||||
$this->_uri = $uri;
|
||||
} else {
|
||||
$this->_uri = Zend_Uri::factory($uri);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the current request URI object
|
||||
*
|
||||
* @return Zend_Uri_Http
|
||||
*/
|
||||
public function getUri()
|
||||
{
|
||||
return $this->_uri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Call a remote REST web service URI and return the Zend_Http_Response object
|
||||
*
|
||||
* @param string $path The path to append to the URI
|
||||
* @throws Zend_Rest_Client_Exception
|
||||
* @return void
|
||||
*/
|
||||
final private function _prepareRest($path)
|
||||
{
|
||||
// Get the URI object and configure it
|
||||
if (!$this->_uri instanceof Zend_Uri_Http) {
|
||||
require_once 'Zend/Rest/Client/Exception.php';
|
||||
throw new Zend_Rest_Client_Exception('URI object must be set before performing call');
|
||||
}
|
||||
|
||||
$uri = $this->_uri->getUri();
|
||||
|
||||
if ($path[0] != '/' && $uri[strlen($uri)-1] != '/') {
|
||||
$path = '/' . $path;
|
||||
}
|
||||
|
||||
$this->_uri->setPath($path);
|
||||
|
||||
/**
|
||||
* Get the HTTP client and configure it for the endpoint URI. Do this each time
|
||||
* because the Zend_Http_Client instance is shared among all Zend_Service_Abstract subclasses.
|
||||
*/
|
||||
self::getHttpClient()->resetParameters()->setUri($this->_uri);
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs an HTTP GET request to the $path.
|
||||
*
|
||||
* @param string $path
|
||||
* @param array $query Array of GET parameters
|
||||
* @return Zend_Http_Response
|
||||
*/
|
||||
final public function restGet($path, array $query = null)
|
||||
{
|
||||
$this->_prepareRest($path);
|
||||
$client = self::getHttpClient();
|
||||
$client->setParameterGet($query);
|
||||
return $client->request('GET');
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform a POST or PUT
|
||||
*
|
||||
* Performs a POST or PUT request. Any data provided is set in the HTTP
|
||||
* client. String data is pushed in as raw POST data; array or object data
|
||||
* is pushed in as POST parameters.
|
||||
*
|
||||
* @param mixed $method
|
||||
* @param mixed $data
|
||||
* @return Zend_Http_Response
|
||||
*/
|
||||
protected function _performPost($method, $data = null)
|
||||
{
|
||||
$client = self::getHttpClient();
|
||||
if (is_string($data)) {
|
||||
$client->setRawData($data);
|
||||
} elseif (is_array($data) || is_object($data)) {
|
||||
$client->setParameterPost((array) $data);
|
||||
}
|
||||
return $client->request($method);
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs an HTTP POST request to $path.
|
||||
*
|
||||
* @param string $path
|
||||
* @param mixed $data Raw data to send
|
||||
* @return Zend_Http_Response
|
||||
*/
|
||||
final public function restPost($path, $data = null)
|
||||
{
|
||||
$this->_prepareRest($path);
|
||||
return $this->_performPost('POST', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs an HTTP PUT request to $path.
|
||||
*
|
||||
* @param string $path
|
||||
* @param mixed $data Raw data to send in request
|
||||
* @return Zend_Http_Response
|
||||
*/
|
||||
final public function restPut($path, $data = null)
|
||||
{
|
||||
$this->_prepareRest($path);
|
||||
return $this->_performPost('PUT', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs an HTTP DELETE request to $path.
|
||||
*
|
||||
* @param string $path
|
||||
* @return Zend_Http_Response
|
||||
*/
|
||||
final public function restDelete($path)
|
||||
{
|
||||
$this->_prepareRest($path);
|
||||
return self::getHttpClient()->request('DELETE');
|
||||
}
|
||||
|
||||
/**
|
||||
* Method call overload
|
||||
*
|
||||
* Allows calling REST actions as object methods; however, you must
|
||||
* follow-up by chaining the request with a request to an HTTP request
|
||||
* method (post, get, delete, put):
|
||||
* <code>
|
||||
* $response = $rest->sayHello('Foo', 'Manchu')->get();
|
||||
* </code>
|
||||
*
|
||||
* Or use them together, but in sequential calls:
|
||||
* <code>
|
||||
* $rest->sayHello('Foo', 'Manchu');
|
||||
* $response = $rest->get();
|
||||
* </code>
|
||||
*
|
||||
* @param string $method Method name
|
||||
* @param array $args Method args
|
||||
* @return Zend_Rest_Client_Result|Zend_Rest_Client Zend_Rest_Client if using
|
||||
* a remote method, Zend_Rest_Client_Result if using an HTTP request method
|
||||
*/
|
||||
public function __call($method, $args)
|
||||
{
|
||||
$methods = array('post', 'get', 'delete', 'put');
|
||||
|
||||
if (in_array(strtolower($method), $methods)) {
|
||||
if (!isset($args[0])) {
|
||||
$args[0] = $this->_uri->getPath();
|
||||
}
|
||||
$this->_data['rest'] = 1;
|
||||
$data = array_slice($args, 1) + $this->_data;
|
||||
$response = $this->{'rest' . $method}($args[0], $data);
|
||||
$this->_data = array();//Initializes for next Rest method.
|
||||
return new Zend_Rest_Client_Result($response->getBody());
|
||||
} else {
|
||||
// More than one arg means it's definitely a Zend_Rest_Server
|
||||
if (sizeof($args) == 1) {
|
||||
// Uses first called function name as method name
|
||||
if (!isset($this->_data['method'])) {
|
||||
$this->_data['method'] = $method;
|
||||
$this->_data['arg1'] = $args[0];
|
||||
}
|
||||
$this->_data[$method] = $args[0];
|
||||
} else {
|
||||
$this->_data['method'] = $method;
|
||||
if (sizeof($args) > 0) {
|
||||
foreach ($args as $key => $arg) {
|
||||
$key = 'arg' . $key;
|
||||
$this->_data[$key] = $arg;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Rest
|
||||
* @subpackage Client
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Rest_Exception
|
||||
*/
|
||||
require_once 'Zend/Rest/Exception.php';
|
||||
|
||||
|
||||
/**
|
||||
* Zend_Rest_Server_Exception
|
||||
*
|
||||
* @package Zend_Rest
|
||||
* @subpackage Client
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Rest_Client_Exception extends Zend_Rest_Exception
|
||||
{
|
||||
}
|
||||
|
||||
@@ -0,0 +1,224 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Rest
|
||||
* @subpackage Client
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Rest
|
||||
* @subpackage Client
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Rest_Client_Result implements IteratorAggregate {
|
||||
/**
|
||||
* @var SimpleXMLElement
|
||||
*/
|
||||
protected $_sxml;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $data XML Result
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($data)
|
||||
{
|
||||
set_error_handler(array($this, 'handleXmlErrors'));
|
||||
$this->_sxml = simplexml_load_string($data);
|
||||
if($this->_sxml === false) {
|
||||
$this->handleXmlErrors(0, "An error occured while parsing the REST response with simplexml.");
|
||||
} else {
|
||||
restore_error_handler();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Temporary error handler for parsing REST responses.
|
||||
*
|
||||
* @param int $errno
|
||||
* @param string $errstr
|
||||
* @param string $errfile
|
||||
* @param string $errline
|
||||
* @param array $errcontext
|
||||
* @throws Zend_Result_Client_Result_Exception
|
||||
*/
|
||||
public function handleXmlErrors($errno, $errstr, $errfile = null, $errline = null, array $errcontext = null)
|
||||
{
|
||||
restore_error_handler();
|
||||
require_once "Zend/Rest/Client/Result/Exception.php";
|
||||
throw new Zend_Rest_Client_Result_Exception("REST Response Error: ".$errstr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Casts a SimpleXMLElement to its appropriate PHP value
|
||||
*
|
||||
* @param SimpleXMLElement $value
|
||||
* @return mixed
|
||||
*/
|
||||
public function toValue(SimpleXMLElement $value)
|
||||
{
|
||||
$node = dom_import_simplexml($value);
|
||||
return $node->nodeValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Property Overload
|
||||
*
|
||||
* @param string $name
|
||||
* @return null|SimpleXMLElement|array Null if not found, SimpleXMLElement if only one value found, array of Zend_Rest_Client_Result objects otherwise
|
||||
*/
|
||||
public function __get($name)
|
||||
{
|
||||
if (isset($this->_sxml->{$name})) {
|
||||
return $this->_sxml->{$name};
|
||||
}
|
||||
|
||||
$result = $this->_sxml->xpath("//$name");
|
||||
$count = count($result);
|
||||
|
||||
if ($count == 0) {
|
||||
return null;
|
||||
} elseif ($count == 1) {
|
||||
return $result[0];
|
||||
} else {
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Cast properties to PHP values
|
||||
*
|
||||
* For arrays, loops through each element and casts to a value as well.
|
||||
*
|
||||
* @param string $method
|
||||
* @param array $args
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call($method, $args)
|
||||
{
|
||||
if (null !== ($value = $this->__get($method))) {
|
||||
if (!is_array($value)) {
|
||||
return $this->toValue($value);
|
||||
} else {
|
||||
$return = array();
|
||||
foreach ($value as $element) {
|
||||
$return[] = $this->toValue($element);
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Isset Overload
|
||||
*
|
||||
* @param string $name
|
||||
* @return boolean
|
||||
*/
|
||||
public function __isset($name)
|
||||
{
|
||||
if (isset($this->_sxml->{$name})) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$result = $this->_sxml->xpath("//$name");
|
||||
|
||||
if (sizeof($result) > 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implement IteratorAggregate::getIterator()
|
||||
*
|
||||
* @return SimpleXMLIterator
|
||||
*/
|
||||
public function getIterator()
|
||||
{
|
||||
return $this->_sxml;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Request Status
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function getStatus()
|
||||
{
|
||||
$status = $this->_sxml->xpath('//status/text()');
|
||||
|
||||
$status = strtolower($status[0]);
|
||||
|
||||
if (ctype_alpha($status) && $status == 'success') {
|
||||
return true;
|
||||
} elseif (ctype_alpha($status) && $status != 'success') {
|
||||
return false;
|
||||
} else {
|
||||
return (bool) $status;
|
||||
}
|
||||
}
|
||||
|
||||
public function isError()
|
||||
{
|
||||
$status = $this->getStatus();
|
||||
if ($status) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public function isSuccess()
|
||||
{
|
||||
$status = $this->getStatus();
|
||||
if ($status) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* toString overload
|
||||
*
|
||||
* Be sure to only call this when the result is a single value!
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
if (!$this->getStatus()) {
|
||||
$message = $this->_sxml->xpath('//message');
|
||||
return (string) $message[0];
|
||||
} else {
|
||||
$result = $this->_sxml->xpath('//response');
|
||||
if (sizeof($result) > 1) {
|
||||
return (string) "An error occured.";
|
||||
} else {
|
||||
return (string) $result[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Rest
|
||||
* @subpackage Client
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* @see Zend_Rest_Client_Exception
|
||||
*/
|
||||
require_once "Zend/Rest/Client/Exception.php";
|
||||
|
||||
class Zend_Rest_Client_Result_Exception extends Zend_Rest_Client_Exception{}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Rest
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Zend_Exception
|
||||
*/
|
||||
require_once 'Zend/Exception.php';
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Rest
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Rest_Exception extends Zend_Exception
|
||||
{}
|
||||
|
||||
@@ -0,0 +1,610 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Rest
|
||||
* @subpackage Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Server_Interface
|
||||
*/
|
||||
require_once 'Zend/Server/Interface.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection.php';
|
||||
|
||||
/**
|
||||
* Zend_Rest_Server_Exception
|
||||
*/
|
||||
require_once 'Zend/Rest/Server/Exception.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Abstract
|
||||
*/
|
||||
require_once 'Zend/Server/Abstract.php';
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Rest
|
||||
* @subpackage Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Rest_Server implements Zend_Server_Interface
|
||||
{
|
||||
/**
|
||||
* Class Constructor Args
|
||||
* @var array
|
||||
*/
|
||||
protected $_args = array();
|
||||
|
||||
/**
|
||||
* @var string Encoding
|
||||
*/
|
||||
protected $_encoding = 'UTF-8';
|
||||
|
||||
/**
|
||||
* @var array An array of Zend_Server_Reflect_Method
|
||||
*/
|
||||
protected $_functions = array();
|
||||
|
||||
/**
|
||||
* @var array Array of headers to send
|
||||
*/
|
||||
protected $_headers = array();
|
||||
|
||||
/**
|
||||
* @var array PHP's Magic Methods, these are ignored
|
||||
*/
|
||||
protected static $magicMethods = array(
|
||||
'__construct',
|
||||
'__destruct',
|
||||
'__get',
|
||||
'__set',
|
||||
'__call',
|
||||
'__sleep',
|
||||
'__wakeup',
|
||||
'__isset',
|
||||
'__unset',
|
||||
'__tostring',
|
||||
'__clone',
|
||||
'__set_state',
|
||||
);
|
||||
|
||||
/**
|
||||
* @var string Current Method
|
||||
*/
|
||||
protected $_method;
|
||||
|
||||
/**
|
||||
* @var Zend_Server_Reflection
|
||||
*/
|
||||
protected $_reflection = null;
|
||||
|
||||
/**
|
||||
* Whether or not {@link handle()} should send output or return the response.
|
||||
* @var boolean Defaults to false
|
||||
*/
|
||||
protected $_returnResponse = false;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
set_exception_handler(array($this, "fault"));
|
||||
$this->_reflection = new Zend_Server_Reflection();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set XML encoding
|
||||
*
|
||||
* @param string $encoding
|
||||
* @return Zend_Rest_Server
|
||||
*/
|
||||
public function setEncoding($encoding)
|
||||
{
|
||||
$this->_encoding = (string) $encoding;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get XML encoding
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getEncoding()
|
||||
{
|
||||
return $this->_encoding;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lowercase a string
|
||||
*
|
||||
* Lowercase's a string by reference
|
||||
*
|
||||
* @param string $value
|
||||
* @param string $key
|
||||
* @return string Lower cased string
|
||||
*/
|
||||
public static function lowerCase(&$value, &$key)
|
||||
{
|
||||
return $value = strtolower($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether or not to return a response
|
||||
*
|
||||
* If called without arguments, returns the value of the flag. If called
|
||||
* with an argument, sets the flag.
|
||||
*
|
||||
* When 'return response' is true, {@link handle()} will not send output,
|
||||
* but will instead return the response from the dispatched function/method.
|
||||
*
|
||||
* @param boolean $flag
|
||||
* @return boolean|Zend_Rest_Server Returns Zend_Rest_Server when used to set the flag; returns boolean flag value otherwise.
|
||||
*/
|
||||
public function returnResponse($flag = null)
|
||||
{
|
||||
if (null == $flag) {
|
||||
return $this->_returnResponse;
|
||||
}
|
||||
|
||||
$this->_returnResponse = ($flag) ? true : false;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implement Zend_Server_Interface::handle()
|
||||
*
|
||||
* @param array $request
|
||||
* @throws Zend_Rest_Server_Exception
|
||||
* @return string|void
|
||||
*/
|
||||
public function handle($request = false)
|
||||
{
|
||||
$this->_headers = array('Content-Type: text/xml');
|
||||
if (!$request) {
|
||||
$request = $_REQUEST;
|
||||
}
|
||||
if (isset($request['method'])) {
|
||||
$this->_method = $request['method'];
|
||||
if (isset($this->_functions[$this->_method])) {
|
||||
if ($this->_functions[$this->_method] instanceof Zend_Server_Reflection_Function || $this->_functions[$this->_method] instanceof Zend_Server_Reflection_Method && $this->_functions[$this->_method]->isPublic()) {
|
||||
$request_keys = array_keys($request);
|
||||
array_walk($request_keys, array(__CLASS__, "lowerCase"));
|
||||
$request = array_combine($request_keys, $request);
|
||||
|
||||
$func_args = $this->_functions[$this->_method]->getParameters();
|
||||
|
||||
$calling_args = array();
|
||||
foreach ($func_args as $arg) {
|
||||
if (isset($request[strtolower($arg->getName())])) {
|
||||
$calling_args[] = $request[strtolower($arg->getName())];
|
||||
} elseif ($arg->isOptional()) {
|
||||
$calling_args[] = $arg->getDefaultValue();
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($request as $key => $value) {
|
||||
if (substr($key, 0, 3) == 'arg') {
|
||||
$key = str_replace('arg', '', $key);
|
||||
$calling_args[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
// Sort arguments by key -- @see ZF-2279
|
||||
ksort($calling_args);
|
||||
|
||||
$result = false;
|
||||
if (count($calling_args) < count($func_args)) {
|
||||
$result = $this->fault(new Zend_Rest_Server_Exception('Invalid Method Call to ' . $this->_method . '. Requires ' . count($func_args) . ', ' . count($calling_args) . ' given.'), 400);
|
||||
}
|
||||
|
||||
if (!$result && $this->_functions[$this->_method] instanceof Zend_Server_Reflection_Method) {
|
||||
// Get class
|
||||
$class = $this->_functions[$this->_method]->getDeclaringClass()->getName();
|
||||
|
||||
if ($this->_functions[$this->_method]->isStatic()) {
|
||||
// for some reason, invokeArgs() does not work the same as
|
||||
// invoke(), and expects the first argument to be an object.
|
||||
// So, using a callback if the method is static.
|
||||
$result = $this->_callStaticMethod($class, $calling_args);
|
||||
} else {
|
||||
// Object method
|
||||
$result = $this->_callObjectMethod($class, $calling_args);
|
||||
}
|
||||
} elseif (!$result) {
|
||||
try {
|
||||
$result = call_user_func_array($this->_functions[$this->_method]->getName(), $calling_args); //$this->_functions[$this->_method]->invokeArgs($calling_args);
|
||||
} catch (Exception $e) {
|
||||
$result = $this->fault($e);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
require_once "Zend/Rest/Server/Exception.php";
|
||||
$result = $this->fault(
|
||||
new Zend_Rest_Server_Exception("Unknown Method '$this->_method'."),
|
||||
404
|
||||
);
|
||||
}
|
||||
} else {
|
||||
require_once "Zend/Rest/Server/Exception.php";
|
||||
$result = $this->fault(
|
||||
new Zend_Rest_Server_Exception("Unknown Method '$this->_method'."),
|
||||
404
|
||||
);
|
||||
}
|
||||
} else {
|
||||
require_once "Zend/Rest/Server/Exception.php";
|
||||
$result = $this->fault(
|
||||
new Zend_Rest_Server_Exception("No Method Specified."),
|
||||
404
|
||||
);
|
||||
}
|
||||
|
||||
if ($result instanceof SimpleXMLElement) {
|
||||
$response = $result->asXML();
|
||||
} elseif ($result instanceof DOMDocument) {
|
||||
$response = $result->saveXML();
|
||||
} elseif ($result instanceof DOMNode) {
|
||||
$response = $result->ownerDocument->saveXML($result);
|
||||
} elseif (is_array($result) || is_object($result)) {
|
||||
$response = $this->_handleStruct($result);
|
||||
} else {
|
||||
$response = $this->_handleScalar($result);
|
||||
}
|
||||
|
||||
if (!$this->returnResponse()) {
|
||||
if (!headers_sent()) {
|
||||
foreach ($this->_headers as $header) {
|
||||
header($header);
|
||||
}
|
||||
}
|
||||
|
||||
echo $response;
|
||||
return;
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implement Zend_Server_Interface::setClass()
|
||||
*
|
||||
* @param string $classname Class name
|
||||
* @param string $namespace Class namespace (unused)
|
||||
* @param array $argv An array of Constructor Arguments
|
||||
*/
|
||||
public function setClass($classname, $namespace = '', $argv = array())
|
||||
{
|
||||
$this->_args = $argv;
|
||||
foreach ($this->_reflection->reflectClass($classname, $argv)->getMethods() as $method) {
|
||||
$this->_functions[$method->getName()] = $method;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle an array or object result
|
||||
*
|
||||
* @param array|object $struct Result Value
|
||||
* @return string XML Response
|
||||
*/
|
||||
protected function _handleStruct($struct)
|
||||
{
|
||||
$function = $this->_functions[$this->_method];
|
||||
if ($function instanceof Zend_Server_Reflection_Method) {
|
||||
$class = $function->getDeclaringClass()->getName();
|
||||
} else {
|
||||
$class = false;
|
||||
}
|
||||
|
||||
$method = $function->getName();
|
||||
|
||||
$dom = new DOMDocument('1.0', $this->getEncoding());
|
||||
if ($class) {
|
||||
$root = $dom->createElement($class);
|
||||
$method = $dom->createElement($method);
|
||||
$root->appendChild($method);
|
||||
} else {
|
||||
$root = $dom->createElement($method);
|
||||
$method = $root;
|
||||
}
|
||||
$root->setAttribute('generator', 'zend');
|
||||
$root->setAttribute('version', '1.0');
|
||||
$dom->appendChild($root);
|
||||
|
||||
$this->_structValue($struct, $dom, $method);
|
||||
|
||||
$struct = (array) $struct;
|
||||
if (!isset($struct['status'])) {
|
||||
$status = $dom->createElement('status', 'success');
|
||||
$method->appendChild($status);
|
||||
}
|
||||
|
||||
return $dom->saveXML();
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively iterate through a struct
|
||||
*
|
||||
* Recursively iterates through an associative array or object's properties
|
||||
* to build XML response.
|
||||
*
|
||||
* @param mixed $struct
|
||||
* @param DOMDocument $dom
|
||||
* @param DOMElement $parent
|
||||
* @return void
|
||||
*/
|
||||
protected function _structValue($struct, DOMDocument $dom, DOMElement $parent)
|
||||
{
|
||||
$struct = (array) $struct;
|
||||
|
||||
foreach ($struct as $key => $value) {
|
||||
if ($value === false) {
|
||||
$value = 0;
|
||||
} elseif ($value === true) {
|
||||
$value = 1;
|
||||
}
|
||||
|
||||
if (ctype_digit((string) $key)) {
|
||||
$key = 'key_' . $key;
|
||||
}
|
||||
|
||||
if (is_array($value) || is_object($value)) {
|
||||
$element = $dom->createElement($key);
|
||||
$this->_structValue($value, $dom, $element);
|
||||
} else {
|
||||
$element = $dom->createElement($key);
|
||||
$element->appendChild($dom->createTextNode($value));
|
||||
}
|
||||
|
||||
$parent->appendChild($element);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle a single value
|
||||
*
|
||||
* @param string|int|boolean $value Result value
|
||||
* @return string XML Response
|
||||
*/
|
||||
protected function _handleScalar($value)
|
||||
{
|
||||
$function = $this->_functions[$this->_method];
|
||||
if ($function instanceof Zend_Server_Reflection_Method) {
|
||||
$class = $function->getDeclaringClass()->getName();
|
||||
} else {
|
||||
$class = false;
|
||||
}
|
||||
|
||||
$method = $function->getName();
|
||||
|
||||
$dom = new DOMDocument('1.0', $this->getEncoding());
|
||||
if ($class) {
|
||||
$xml = $dom->createElement($class);
|
||||
$methodNode = $dom->createElement($method);
|
||||
$xml->appendChild($methodNode);
|
||||
} else {
|
||||
$xml = $dom->createElement($method);
|
||||
$methodNode = $xml;
|
||||
}
|
||||
$xml->setAttribute('generator', 'zend');
|
||||
$xml->setAttribute('version', '1.0');
|
||||
$dom->appendChild($xml);
|
||||
|
||||
if ($value === false) {
|
||||
$value = 0;
|
||||
} elseif ($value === true) {
|
||||
$value = 1;
|
||||
}
|
||||
|
||||
if (isset($value)) {
|
||||
$element = $dom->createElement('response');
|
||||
$element->appendChild($dom->createTextNode($value));
|
||||
$methodNode->appendChild($element);
|
||||
} else {
|
||||
$methodNode->appendChild($dom->createElement('response'));
|
||||
}
|
||||
|
||||
$methodNode->appendChild($dom->createElement('status', 'success'));
|
||||
|
||||
return $dom->saveXML();
|
||||
}
|
||||
|
||||
/**
|
||||
* Implement Zend_Server_Interface::fault()
|
||||
*
|
||||
* Creates XML error response, returning DOMDocument with response.
|
||||
*
|
||||
* @param string|Exception $fault Message
|
||||
* @param int $code Error Code
|
||||
* @return DOMDocument
|
||||
*/
|
||||
public function fault($exception = null, $code = null)
|
||||
{
|
||||
if (isset($this->_functions[$this->_method])) {
|
||||
$function = $this->_functions[$this->_method];
|
||||
} elseif (isset($this->_method)) {
|
||||
$function = $this->_method;
|
||||
} else {
|
||||
$function = 'rest';
|
||||
}
|
||||
|
||||
if ($function instanceof Zend_Server_Reflection_Method) {
|
||||
$class = $function->getDeclaringClass()->getName();
|
||||
} else {
|
||||
$class = false;
|
||||
}
|
||||
|
||||
if ($function instanceof Zend_Server_Reflection_Function_Abstract) {
|
||||
$method = $function->getName();
|
||||
} else {
|
||||
$method = $function;
|
||||
}
|
||||
|
||||
$dom = new DOMDocument('1.0', $this->getEncoding());
|
||||
if ($class) {
|
||||
$xml = $dom->createElement($class);
|
||||
$xmlMethod = $dom->createElement($method);
|
||||
$xml->appendChild($xmlMethod);
|
||||
} else {
|
||||
$xml = $dom->createElement($method);
|
||||
$xmlMethod = $xml;
|
||||
}
|
||||
$xml->setAttribute('generator', 'zend');
|
||||
$xml->setAttribute('version', '1.0');
|
||||
$dom->appendChild($xml);
|
||||
|
||||
$xmlResponse = $dom->createElement('response');
|
||||
$xmlMethod->appendChild($xmlResponse);
|
||||
|
||||
if ($exception instanceof Exception) {
|
||||
$element = $dom->createElement('message');
|
||||
$element->appendChild($dom->createTextNode($exception->getMessage()));
|
||||
$xmlResponse->appendChild($element);
|
||||
$code = $exception->getCode();
|
||||
} elseif (!is_null($exception) || 'rest' == $function) {
|
||||
$xmlResponse->appendChild($dom->createElement('message', 'An unknown error occured. Please try again.'));
|
||||
} else {
|
||||
$xmlResponse->appendChild($dom->createElement('message', 'Call to ' . $method . ' failed.'));
|
||||
}
|
||||
|
||||
$xmlMethod->appendChild($xmlResponse);
|
||||
$xmlMethod->appendChild($dom->createElement('status', 'failed'));
|
||||
|
||||
// Headers to send
|
||||
if (is_null($code) || (404 != $code))
|
||||
{
|
||||
$this->_headers[] = 'HTTP/1.0 400 Bad Request';
|
||||
} else {
|
||||
$this->_headers[] = 'HTTP/1.0 404 File Not Found';
|
||||
}
|
||||
|
||||
return $dom;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve any HTTP extra headers set by the server
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getHeaders()
|
||||
{
|
||||
return $this->_headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implement Zend_Server_Interface::addFunction()
|
||||
*
|
||||
* @param string $function Function Name
|
||||
* @param string $namespace Function namespace (unused)
|
||||
*/
|
||||
public function addFunction($function, $namespace = '')
|
||||
{
|
||||
if (!is_array($function)) {
|
||||
$function = (array) $function;
|
||||
}
|
||||
|
||||
foreach ($function as $func) {
|
||||
if (is_callable($func) && !in_array($func, self::$magicMethods)) {
|
||||
$this->_functions[$func] = $this->_reflection->reflectFunction($func);
|
||||
} else {
|
||||
throw new Zend_Rest_Server_Exception("Invalid Method Added to Service.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implement Zend_Server_Interface::getFunctions()
|
||||
*
|
||||
* @return array An array of Zend_Server_Reflection_Method's
|
||||
*/
|
||||
public function getFunctions()
|
||||
{
|
||||
return $this->_functions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implement Zend_Server_Interface::loadFunctions()
|
||||
*
|
||||
* @todo Implement
|
||||
* @param array $functions
|
||||
*/
|
||||
public function loadFunctions($functions)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Implement Zend_Server_Interface::setPersistence()
|
||||
*
|
||||
* @todo Implement
|
||||
* @param int $mode
|
||||
*/
|
||||
public function setPersistence($mode)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Call a static class method and return the result
|
||||
*
|
||||
* @param string $class
|
||||
* @param array $args
|
||||
* @return mixed
|
||||
*/
|
||||
protected function _callStaticMethod($class, array $args)
|
||||
{
|
||||
try {
|
||||
$result = call_user_func_array(array($class, $this->_functions[$this->_method]->getName()), $args);
|
||||
} catch (Exception $e) {
|
||||
$result = $this->fault($e);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Call an instance method of an object
|
||||
*
|
||||
* @param string $class
|
||||
* @param array $args
|
||||
* @return mixed
|
||||
* @throws Zend_Rest_Server_Exception For invalid class name
|
||||
*/
|
||||
protected function _callObjectMethod($class, array $args)
|
||||
{
|
||||
try {
|
||||
if ($this->_functions[$this->_method]->getDeclaringClass()->getConstructor()) {
|
||||
$object = $this->_functions[$this->_method]->getDeclaringClass()->newInstanceArgs($this->_args);
|
||||
} else {
|
||||
$object = $this->_functions[$this->_method]->getDeclaringClass()->newInstance();
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
echo $e->getMessage();
|
||||
throw new Zend_Rest_Server_Exception('Error instantiating class ' . $class . ' to invoke method ' . $this->_functions[$this->_method]->getName(), 500);
|
||||
}
|
||||
|
||||
try {
|
||||
$result = $this->_functions[$this->_method]->invokeArgs($object, $args);
|
||||
} catch (Exception $e) {
|
||||
$result = $this->fault($e);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @package Zend_Rest
|
||||
* @subpackage Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Zend_Rest_Exception
|
||||
*/
|
||||
require_once 'Zend/Rest/Exception.php';
|
||||
|
||||
|
||||
/**
|
||||
* Zend_Rest_Server_Exception
|
||||
*
|
||||
* @package Zend_Rest
|
||||
* @subpackage Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Rest_Server_Exception extends Zend_Rest_Exception
|
||||
{
|
||||
}
|
||||
|
||||
@@ -0,0 +1,242 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/** Zend_Server_Interface */
|
||||
require_once 'Zend/Server/Interface.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Definition
|
||||
*/
|
||||
require_once 'Zend/Server/Definition.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Method_Definition
|
||||
*/
|
||||
require_once 'Zend/Server/Method/Definition.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Method_Callback
|
||||
*/
|
||||
require_once 'Zend/Server/Method/Callback.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Method_Prototype
|
||||
*/
|
||||
require_once 'Zend/Server/Method/Prototype.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Method_Parameter
|
||||
*/
|
||||
require_once 'Zend/Server/Method/Parameter.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Abstract
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
abstract class Zend_Server_Abstract implements Zend_Server_Interface
|
||||
{
|
||||
/**
|
||||
* @deprecated
|
||||
* @var array List of PHP magic methods (lowercased)
|
||||
*/
|
||||
protected static $magic_methods = array(
|
||||
'__call',
|
||||
'__clone',
|
||||
'__construct',
|
||||
'__destruct',
|
||||
'__get',
|
||||
'__isset',
|
||||
'__set',
|
||||
'__set_state',
|
||||
'__sleep',
|
||||
'__tostring',
|
||||
'__unset',
|
||||
'__wakeup',
|
||||
);
|
||||
|
||||
/**
|
||||
* @var bool Flag; whether or not overwriting existing methods is allowed
|
||||
*/
|
||||
protected $_overwriteExistingMethods = false;
|
||||
|
||||
/**
|
||||
* @var Zend_Server_Definition
|
||||
*/
|
||||
protected $_table;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* Setup server description
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->_table = new Zend_Server_Definition();
|
||||
$this->_table->setOverwriteExistingMethods($this->_overwriteExistingMethods);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of registered methods
|
||||
*
|
||||
* Returns an array of method definitions.
|
||||
*
|
||||
* @return Zend_Server_Definition
|
||||
*/
|
||||
public function getFunctions()
|
||||
{
|
||||
return $this->_table;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lowercase a string
|
||||
*
|
||||
* Lowercase's a string by reference
|
||||
*
|
||||
* @deprecated
|
||||
* @param string $string value
|
||||
* @param string $key
|
||||
* @return string Lower cased string
|
||||
*/
|
||||
public static function lowerCase(&$value, &$key)
|
||||
{
|
||||
trigger_error(__CLASS__ . '::' . __METHOD__ . '() is deprecated and will be removed in a future version', E_USER_NOTICE);
|
||||
return $value = strtolower($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build callback for method signature
|
||||
*
|
||||
* @param Zend_Server_Reflection_Function_Abstract $reflection
|
||||
* @return Zend_Server_Method_Callback
|
||||
*/
|
||||
protected function _buildCallback(Zend_Server_Reflection_Function_Abstract $reflection)
|
||||
{
|
||||
$callback = new Zend_Server_Method_Callback();
|
||||
if ($reflection instanceof Zend_Server_Reflection_Method) {
|
||||
$callback->setType($reflection->isStatic() ? 'static' : 'instance')
|
||||
->setClass($reflection->getDeclaringClass()->getName())
|
||||
->setMethod($reflection->getName());
|
||||
} elseif ($reflection instanceof Zend_Server_Reflection_Function) {
|
||||
$callback->setType('function')
|
||||
->setFunction($reflection->getName());
|
||||
}
|
||||
return $callback;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a method signature
|
||||
*
|
||||
* @param Zend_Server_Reflection_Function_Abstract $reflection
|
||||
* @param null|string|object $class
|
||||
* @return Zend_Server_Method_Definition
|
||||
* @throws Zend_Server_Exception on duplicate entry
|
||||
*/
|
||||
protected function _buildSignature(Zend_Server_Reflection_Function_Abstract $reflection, $class = null)
|
||||
{
|
||||
$ns = $reflection->getNamespace();
|
||||
$name = $reflection->getName();
|
||||
$method = empty($ns) ? $name : $ns . '.' . $name;
|
||||
|
||||
if (!$this->_overwriteExistingMethods && $this->_table->hasMethod($method)) {
|
||||
require_once 'Zend/Server/Exception.php';
|
||||
throw new Zend_Server_Exception('Duplicate method registered: ' . $method);
|
||||
}
|
||||
|
||||
$definition = new Zend_Server_Method_Definition();
|
||||
$definition->setName($method)
|
||||
->setCallback($this->_buildCallback($reflection))
|
||||
->setMethodHelp($reflection->getDescription())
|
||||
->setInvokeArguments($reflection->getInvokeArguments());
|
||||
|
||||
foreach ($reflection->getPrototypes() as $proto) {
|
||||
$prototype = new Zend_Server_Method_Prototype();
|
||||
$prototype->setReturnType($this->_fixType($prototype->getReturnType()));
|
||||
foreach ($proto->getParameters() as $parameter) {
|
||||
$param = new Zend_Server_Method_Parameter(array(
|
||||
'type' => $this->_fixType($parameter->getType()),
|
||||
'name' => $parameter->getName(),
|
||||
'optional' => $parameter->isOptional(),
|
||||
));
|
||||
if ($parameter->isDefaultValueAvailable()) {
|
||||
$param->setDefaultValue($parameter->getDefaultValue());
|
||||
}
|
||||
$prototype->addParameter($param);
|
||||
}
|
||||
$definition->addPrototype($prototype);
|
||||
}
|
||||
if (is_object($class)) {
|
||||
$definition->setObject($class);
|
||||
}
|
||||
$this->_table->addMethod($definition);
|
||||
return $definition;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dispatch method
|
||||
*
|
||||
* @param Zend_Server_Method_Definition $invocable
|
||||
* @param array $params
|
||||
* @return mixed
|
||||
*/
|
||||
protected function _dispatch(Zend_Server_Method_Definition $invocable, array $params)
|
||||
{
|
||||
$callback = $invocable->getCallback();
|
||||
$type = $callback->getType();
|
||||
|
||||
if ('function' == $type) {
|
||||
$function = $callback->getFunction();
|
||||
return call_user_func_array($function, $params);
|
||||
}
|
||||
|
||||
$class = $callback->getClass();
|
||||
$method = $callback->getMethod();
|
||||
|
||||
if ('static' == $type) {
|
||||
return call_user_func_array(array($class, $method), $params);
|
||||
}
|
||||
|
||||
$object = $invocable->getObject();
|
||||
if (!is_object($object)) {
|
||||
$invokeArgs = $invocable->getInvokeArguments();
|
||||
if (!empty($invokeArgs)) {
|
||||
$reflection = new ReflectionClass($class);
|
||||
$object = $reflection->newInstanceArgs($invokeArgs);
|
||||
} else {
|
||||
$object = new $class;
|
||||
}
|
||||
}
|
||||
return call_user_func_array(array($object, $method), $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Map PHP type to protocol type
|
||||
*
|
||||
* @param string $type
|
||||
* @return string
|
||||
*/
|
||||
abstract protected function _fixType($type);
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Server_Cache: cache server definitions
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Server_Cache
|
||||
{
|
||||
/**
|
||||
* @var array Methods to skip when caching server
|
||||
*/
|
||||
protected static $_skipMethods = array();
|
||||
|
||||
/**
|
||||
* Cache a file containing the dispatch list.
|
||||
*
|
||||
* Serializes the server definition stores the information
|
||||
* in $filename.
|
||||
*
|
||||
* Returns false on any error (typically, inability to write to file), true
|
||||
* on success.
|
||||
*
|
||||
* @param string $filename
|
||||
* @param Zend_Server_Interface $server
|
||||
* @return bool
|
||||
*/
|
||||
public static function save($filename, Zend_Server_Interface $server)
|
||||
{
|
||||
if (!is_string($filename)
|
||||
|| (!file_exists($filename) && !is_writable(dirname($filename))))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$methods = $server->getFunctions();
|
||||
|
||||
if ($methods instanceof Zend_Server_Definition) {
|
||||
$definition = new Zend_Server_Definition();
|
||||
foreach ($methods as $method) {
|
||||
if (in_array($method->getName(), self::$_skipMethods)) {
|
||||
continue;
|
||||
}
|
||||
$definition->addMethod($method);
|
||||
}
|
||||
$methods = $definition;
|
||||
}
|
||||
|
||||
if (0 === @file_put_contents($filename, serialize($methods))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load server definition from a file
|
||||
*
|
||||
* Unserializes a stored server definition from $filename. Returns false if
|
||||
* it fails in any way, true on success.
|
||||
*
|
||||
* Useful to prevent needing to build the server definition on each
|
||||
* request. Sample usage:
|
||||
*
|
||||
* <code>
|
||||
* if (!Zend_Server_Cache::get($filename, $server)) {
|
||||
* require_once 'Some/Service/Class.php';
|
||||
* require_once 'Another/Service/Class.php';
|
||||
*
|
||||
* // Attach Some_Service_Class with namespace 'some'
|
||||
* $server->attach('Some_Service_Class', 'some');
|
||||
*
|
||||
* // Attach Another_Service_Class with namespace 'another'
|
||||
* $server->attach('Another_Service_Class', 'another');
|
||||
*
|
||||
* Zend_Server_Cache::save($filename, $server);
|
||||
* }
|
||||
*
|
||||
* $response = $server->handle();
|
||||
* echo $response;
|
||||
* </code>
|
||||
*
|
||||
* @param string $filename
|
||||
* @param Zend_Server_Interface $server
|
||||
* @return bool
|
||||
*/
|
||||
public static function get($filename, Zend_Server_Interface $server)
|
||||
{
|
||||
if (!is_string($filename)
|
||||
|| !file_exists($filename)
|
||||
|| !is_readable($filename))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (false === ($dispatch = @file_get_contents($filename))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (false === ($dispatchArray = @unserialize($dispatch))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$server->loadFunctions($dispatchArray);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a cache file
|
||||
*
|
||||
* @param string $filename
|
||||
* @return boolean
|
||||
*/
|
||||
public static function delete($filename)
|
||||
{
|
||||
if (is_string($filename) && file_exists($filename)) {
|
||||
unlink($filename);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,267 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
|
||||
/**
|
||||
* Server methods metadata
|
||||
*
|
||||
* @todo Implement iterator
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Server_Definition implements Countable, Iterator
|
||||
{
|
||||
/**
|
||||
* @var array Array of Zend_Server_Method_Definition objects
|
||||
*/
|
||||
protected $_methods = array();
|
||||
|
||||
/**
|
||||
* @var bool Whether or not overwriting existing methods is allowed
|
||||
*/
|
||||
protected $_overwriteExistingMethods = false;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param null|array $methods
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($methods = null)
|
||||
{
|
||||
if (is_array($methods)) {
|
||||
$this->setMethods($methods);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set flag indicating whether or not overwriting existing methods is allowed
|
||||
*
|
||||
* @param mixed $flag
|
||||
* @return void
|
||||
*/
|
||||
public function setOverwriteExistingMethods($flag)
|
||||
{
|
||||
$this->_overwriteExistingMethods = (bool) $flag;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add method to definition
|
||||
*
|
||||
* @param array|Zend_Server_Method_Definition $method
|
||||
* @param null|string $name
|
||||
* @return Zend_Server_Definition
|
||||
* @throws Zend_Server_Exception if duplicate or invalid method provided
|
||||
*/
|
||||
public function addMethod($method, $name = null)
|
||||
{
|
||||
if (is_array($method)) {
|
||||
require_once 'Zend/Server/Method/Definition.php';
|
||||
$method = new Zend_Server_Method_Definition($method);
|
||||
} elseif (!$method instanceof Zend_Server_Method_Definition) {
|
||||
require_once 'Zend/Server/Exception.php';
|
||||
throw new Zend_Server_Exception('Invalid method provided');
|
||||
}
|
||||
|
||||
if (is_numeric($name)) {
|
||||
$name = null;
|
||||
}
|
||||
if (null !== $name) {
|
||||
$method->setName($name);
|
||||
} else {
|
||||
$name = $method->getName();
|
||||
}
|
||||
if (null === $name) {
|
||||
require_once 'Zend/Server/Exception.php';
|
||||
throw new Zend_Server_Exception('No method name provided');
|
||||
}
|
||||
|
||||
if (!$this->_overwriteExistingMethods && array_key_exists($name, $this->_methods)) {
|
||||
require_once 'Zend/Server/Exception.php';
|
||||
throw new Zend_Server_Exception(sprintf('Method by name of "%s" already exists', $name));
|
||||
}
|
||||
$this->_methods[$name] = $method;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add multiple methods
|
||||
*
|
||||
* @param array $methods Array of Zend_Server_Method_Definition objects or arrays
|
||||
* @return Zend_Server_Definition
|
||||
*/
|
||||
public function addMethods(array $methods)
|
||||
{
|
||||
foreach ($methods as $key => $method) {
|
||||
$this->addMethod($method, $key);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set all methods at once (overwrite)
|
||||
*
|
||||
* @param array $methods Array of Zend_Server_Method_Definition objects or arrays
|
||||
* @return Zend_Server_Definition
|
||||
*/
|
||||
public function setMethods(array $methods)
|
||||
{
|
||||
$this->clearMethods();
|
||||
$this->addMethods($methods);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the definition have the given method?
|
||||
*
|
||||
* @param string $method
|
||||
* @return bool
|
||||
*/
|
||||
public function hasMethod($method)
|
||||
{
|
||||
return array_key_exists($method, $this->_methods);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a given method definition
|
||||
*
|
||||
* @param string $method
|
||||
* @return null|Zend_Server_Method_Definition
|
||||
*/
|
||||
public function getMethod($method)
|
||||
{
|
||||
if ($this->hasMethod($method)) {
|
||||
return $this->_methods[$method];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all method definitions
|
||||
*
|
||||
* @return array Array of Zend_Server_Method_Definition objects
|
||||
*/
|
||||
public function getMethods()
|
||||
{
|
||||
return $this->_methods;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a method definition
|
||||
*
|
||||
* @param string $method
|
||||
* @return Zend_Server_Definition
|
||||
*/
|
||||
public function removeMethod($method)
|
||||
{
|
||||
if ($this->hasMethod($method)) {
|
||||
unset($this->_methods[$method]);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all method definitions
|
||||
*
|
||||
* @return Zend_Server_Definition
|
||||
*/
|
||||
public function clearMethods()
|
||||
{
|
||||
$this->_methods = array();
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cast definition to an array
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toArray()
|
||||
{
|
||||
$methods = array();
|
||||
foreach ($this->getMethods() as $key => $method) {
|
||||
$methods[$key] = $method->toArray();
|
||||
}
|
||||
return $methods;
|
||||
}
|
||||
|
||||
/**
|
||||
* Countable: count of methods
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function count()
|
||||
{
|
||||
return count($this->_methods);
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterator: current item
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function current()
|
||||
{
|
||||
return current($this->_methods);
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterator: current item key
|
||||
*
|
||||
* @return int|string
|
||||
*/
|
||||
public function key()
|
||||
{
|
||||
return key($this->_methods);
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterator: advance to next method
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function next()
|
||||
{
|
||||
return next($this->_methods);
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterator: return to first method
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function rewind()
|
||||
{
|
||||
return reset($this->_methods);
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterator: is the current index valid?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function valid()
|
||||
{
|
||||
return (bool) $this->current();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Exception
|
||||
*/
|
||||
require_once 'Zend/Exception.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection exceptions
|
||||
*
|
||||
* @package Zend_Server
|
||||
* @subpackage Reflection
|
||||
* @version $Id$
|
||||
*/
|
||||
class Zend_Server_Exception extends Zend_Exception
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Server_Interface
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
interface Zend_Server_Interface
|
||||
{
|
||||
/**
|
||||
* Attach a function as a server method
|
||||
*
|
||||
* Namespacing is primarily for xmlrpc, but may be used with other
|
||||
* implementations to prevent naming collisions.
|
||||
*
|
||||
* @param string $function
|
||||
* @param string $namespace
|
||||
* @param null|array Optional array of arguments to pass to callbacks at
|
||||
* dispatch.
|
||||
* @return void
|
||||
*/
|
||||
public function addFunction($function, $namespace = '');
|
||||
|
||||
/**
|
||||
* Attach a class to a server
|
||||
*
|
||||
* The individual implementations should probably allow passing a variable
|
||||
* number of arguments in, so that developers may define custom runtime
|
||||
* arguments to pass to server methods.
|
||||
*
|
||||
* Namespacing is primarily for xmlrpc, but could be used for other
|
||||
* implementations as well.
|
||||
*
|
||||
* @param mixed $class Class name or object instance to examine and attach
|
||||
* to the server.
|
||||
* @param string $namespace Optional namespace with which to prepend method
|
||||
* names in the dispatch table.
|
||||
* methods in the class will be valid callbacks.
|
||||
* @param null|array Optional array of arguments to pass to callbacks at
|
||||
* dispatch.
|
||||
* @return void
|
||||
*/
|
||||
public function setClass($class, $namespace = '', $argv = null);
|
||||
|
||||
/**
|
||||
* Generate a server fault
|
||||
*
|
||||
* @param mixed $fault
|
||||
* @param int $code
|
||||
* @return mixed
|
||||
*/
|
||||
public function fault($fault = null, $code = 404);
|
||||
|
||||
/**
|
||||
* Handle a request
|
||||
*
|
||||
* Requests may be passed in, or the server may automagically determine the
|
||||
* request based on defaults. Dispatches server request to appropriate
|
||||
* method and returns a response
|
||||
*
|
||||
* @param mixed $request
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request = false);
|
||||
|
||||
/**
|
||||
* Return a server definition array
|
||||
*
|
||||
* Returns a server definition array as created using
|
||||
* {@link * Zend_Server_Reflection}. Can be used for server introspection,
|
||||
* documentation, or persistence.
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getFunctions();
|
||||
|
||||
/**
|
||||
* Load server definition
|
||||
*
|
||||
* Used for persistence; loads a construct as returned by {@link getFunctions()}.
|
||||
*
|
||||
* @param array $array
|
||||
* @return void
|
||||
*/
|
||||
public function loadFunctions($definition);
|
||||
|
||||
/**
|
||||
* Set server persistence
|
||||
*
|
||||
* @todo Determine how to implement this
|
||||
* @param int $mode
|
||||
* @return void
|
||||
*/
|
||||
public function setPersistence($mode);
|
||||
}
|
||||
@@ -0,0 +1,205 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Method
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
|
||||
/**
|
||||
* Method callback metadata
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Method
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Server_Method_Callback
|
||||
{
|
||||
/**
|
||||
* @var string Class name for class method callback
|
||||
*/
|
||||
protected $_class;
|
||||
|
||||
/**
|
||||
* @var string Function name for function callback
|
||||
*/
|
||||
protected $_function;
|
||||
|
||||
/**
|
||||
* @var string Method name for class method callback
|
||||
*/
|
||||
protected $_method;
|
||||
|
||||
/**
|
||||
* @var string Callback type
|
||||
*/
|
||||
protected $_type;
|
||||
|
||||
/**
|
||||
* @var array Valid callback types
|
||||
*/
|
||||
protected $_types = array('function', 'static', 'instance');
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param null|array $options
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($options = null)
|
||||
{
|
||||
if ((null !== $options) && is_array($options)) {
|
||||
$this->setOptions($options);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set object state from array of options
|
||||
*
|
||||
* @param array $options
|
||||
* @return Zend_Server_Method_Callback
|
||||
*/
|
||||
public function setOptions(array $options)
|
||||
{
|
||||
foreach ($options as $key => $value) {
|
||||
$method = 'set' . ucfirst($key);
|
||||
if (method_exists($this, $method)) {
|
||||
$this->$method($value);
|
||||
}
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set callback class
|
||||
*
|
||||
* @param string $class
|
||||
* @return Zend_Server_Method_Callback
|
||||
*/
|
||||
public function setClass($class)
|
||||
{
|
||||
if (is_object($class)) {
|
||||
$class = get_class($class);
|
||||
}
|
||||
$this->_class = $class;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get callback class
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getClass()
|
||||
{
|
||||
return $this->_class;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set callback function
|
||||
*
|
||||
* @param string $function
|
||||
* @return Zend_Server_Method_Callback
|
||||
*/
|
||||
public function setFunction($function)
|
||||
{
|
||||
$this->_function = (string) $function;
|
||||
$this->setType('function');
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get callback function
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
public function getFunction()
|
||||
{
|
||||
return $this->_function;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set callback class method
|
||||
*
|
||||
* @param string $method
|
||||
* @return Zend_Server_Method_Callback
|
||||
*/
|
||||
public function setMethod($method)
|
||||
{
|
||||
$this->_method = $method;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get callback class method
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
public function getMethod()
|
||||
{
|
||||
return $this->_method;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set callback type
|
||||
*
|
||||
* @param string $type
|
||||
* @return Zend_Server_Method_Callback
|
||||
* @throws Zend_Server_Exception
|
||||
*/
|
||||
public function setType($type)
|
||||
{
|
||||
if (!in_array($type, $this->_types)) {
|
||||
require_once 'Zend/Server/Exception.php';
|
||||
throw new Zend_Server_Exception('Invalid method callback type passed to ' . __CLASS__ . '::' . __METHOD__);
|
||||
}
|
||||
$this->_type = $type;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get callback type
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return $this->_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cast callback to array
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toArray()
|
||||
{
|
||||
$type = $this->getType();
|
||||
$array = array(
|
||||
'type' => $type,
|
||||
);
|
||||
if ('function' == $type) {
|
||||
$array['function'] = $this->getFunction();
|
||||
} else {
|
||||
$array['class'] = $this->getClass();
|
||||
$array['method'] = $this->getMethod();
|
||||
}
|
||||
return $array;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,293 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Method
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
|
||||
/**
|
||||
* Method definition metadata
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Method
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Server_Method_Definition
|
||||
{
|
||||
/**
|
||||
* @var Zend_Server_Method_Callback
|
||||
*/
|
||||
protected $_callback;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $_invokeArguments = array();
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $_methodHelp = '';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $_name;
|
||||
|
||||
/**
|
||||
* @var null|object
|
||||
*/
|
||||
protected $_object;
|
||||
|
||||
/**
|
||||
* @var array Array of Zend_Server_Method_Prototype objects
|
||||
*/
|
||||
protected $_prototypes = array();
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param null|array $options
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($options = null)
|
||||
{
|
||||
if ((null !== $options) && is_array($options)) {
|
||||
$this->setOptions($options);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set object state from options
|
||||
*
|
||||
* @param array $options
|
||||
* @return Zend_Server_Method_Definition
|
||||
*/
|
||||
public function setOptions(array $options)
|
||||
{
|
||||
foreach ($options as $key => $value) {
|
||||
$method = 'set' . ucfirst($key);
|
||||
if (method_exists($this, $method)) {
|
||||
$this->$method($value);
|
||||
}
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set method name
|
||||
*
|
||||
* @param string $name
|
||||
* @return Zend_Server_Method_Definition
|
||||
*/
|
||||
public function setName($name)
|
||||
{
|
||||
$this->_name = (string) $name;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get method name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return $this->_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set method callback
|
||||
*
|
||||
* @param array|Zend_Server_Method_Callback $callback
|
||||
* @return Zend_Server_Method_Definition
|
||||
*/
|
||||
public function setCallback($callback)
|
||||
{
|
||||
if (is_array($callback)) {
|
||||
require_once 'Zend/Server/Method/Callback.php';
|
||||
$callback = new Zend_Server_Method_Callback($callback);
|
||||
} elseif (!$callback instanceof Zend_Server_Method_Callback) {
|
||||
require_once 'Zend/Server/Exception.php';
|
||||
throw new Zend_Server_Exception('Invalid method callback provided');
|
||||
}
|
||||
$this->_callback = $callback;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get method callback
|
||||
*
|
||||
* @return Zend_Server_Method_Callback
|
||||
*/
|
||||
public function getCallback()
|
||||
{
|
||||
return $this->_callback;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add prototype to method definition
|
||||
*
|
||||
* @param array|Zend_Server_Method_Prototype $prototype
|
||||
* @return Zend_Server_Method_Definition
|
||||
*/
|
||||
public function addPrototype($prototype)
|
||||
{
|
||||
if (is_array($prototype)) {
|
||||
require_once 'Zend/Server/Method/Prototype.php';
|
||||
$prototype = new Zend_Server_Method_Prototype($prototype);
|
||||
} elseif (!$prototype instanceof Zend_Server_Method_Prototype) {
|
||||
require_once 'Zend/Server/Exception.php';
|
||||
throw new Zend_Server_Exception('Invalid method prototype provided');
|
||||
}
|
||||
$this->_prototypes[] = $prototype;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add multiple prototypes at once
|
||||
*
|
||||
* @param array $prototypes Array of Zend_Server_Method_Prototype objects or arrays
|
||||
* @return Zend_Server_Method_Definition
|
||||
*/
|
||||
public function addPrototypes(array $prototypes)
|
||||
{
|
||||
foreach ($prototypes as $prototype) {
|
||||
$this->addPrototype($prototype);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set all prototypes at once (overwrites)
|
||||
*
|
||||
* @param array $prototypes Array of Zend_Server_Method_Prototype objects or arrays
|
||||
* @return Zend_Server_Method_Definition
|
||||
*/
|
||||
public function setPrototypes(array $prototypes)
|
||||
{
|
||||
$this->_prototypes = array();
|
||||
$this->addPrototypes($prototypes);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all prototypes
|
||||
*
|
||||
* @return array $prototypes Array of Zend_Server_Method_Prototype objects or arrays
|
||||
*/
|
||||
public function getPrototypes()
|
||||
{
|
||||
return $this->_prototypes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set method help
|
||||
*
|
||||
* @param string $methodHelp
|
||||
* @return Zend_Server_Method_Definition
|
||||
*/
|
||||
public function setMethodHelp($methodHelp)
|
||||
{
|
||||
$this->_methodHelp = (string) $methodHelp;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get method help
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getMethodHelp()
|
||||
{
|
||||
return $this->_methodHelp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set object to use with method calls
|
||||
*
|
||||
* @param object $object
|
||||
* @return Zend_Server_Method_Definition
|
||||
*/
|
||||
public function setObject($object)
|
||||
{
|
||||
if (!is_object($object) && (null !== $object)) {
|
||||
require_once 'Zend/Server/Exception.php';
|
||||
throw new Zend_Server_Exception('Invalid object passed to ' . __CLASS__ . '::' . __METHOD__);
|
||||
}
|
||||
$this->_object = $object;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get object to use with method calls
|
||||
*
|
||||
* @return null|object
|
||||
*/
|
||||
public function getObject()
|
||||
{
|
||||
return $this->_object;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set invoke arguments
|
||||
*
|
||||
* @param array $invokeArguments
|
||||
* @return Zend_Server_Method_Definition
|
||||
*/
|
||||
public function setInvokeArguments(array $invokeArguments)
|
||||
{
|
||||
$this->_invokeArguments = $invokeArguments;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve invoke arguments
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getInvokeArguments()
|
||||
{
|
||||
return $this->_invokeArguments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialize to array
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toArray()
|
||||
{
|
||||
$prototypes = $this->getPrototypes();
|
||||
$signatures = array();
|
||||
foreach ($prototypes as $prototype) {
|
||||
$signatures[] = $prototype->toArray();
|
||||
}
|
||||
|
||||
return array(
|
||||
'name' => $this->getName(),
|
||||
'callback' => $this->getCallback()->toArray(),
|
||||
'prototypes' => $signatures,
|
||||
'methodHelp' => $this->getMethodHelp(),
|
||||
'invokeArguments' => $this->getInvokeArguments(),
|
||||
'object' => $this->getObject(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,214 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Method
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
|
||||
/**
|
||||
* Method parameter metadata
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Method
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Server_Method_Parameter
|
||||
{
|
||||
/**
|
||||
* @var mixed Default parameter value
|
||||
*/
|
||||
protected $_defaultValue;
|
||||
|
||||
/**
|
||||
* @var string Parameter description
|
||||
*/
|
||||
protected $_description = '';
|
||||
|
||||
/**
|
||||
* @var string Parameter variable name
|
||||
*/
|
||||
protected $_name;
|
||||
|
||||
/**
|
||||
* @var bool Is parameter optional?
|
||||
*/
|
||||
protected $_optional = false;
|
||||
|
||||
/**
|
||||
* @var string Parameter type
|
||||
*/
|
||||
protected $_type = 'mixed';
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param null|array $options
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($options = null)
|
||||
{
|
||||
if (is_array($options)) {
|
||||
$this->setOptions($options);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set object state from array of options
|
||||
*
|
||||
* @param array $options
|
||||
* @return Zend_Server_Method_Parameter
|
||||
*/
|
||||
public function setOptions(array $options)
|
||||
{
|
||||
foreach ($options as $key => $value) {
|
||||
$method = 'set' . ucfirst($key);
|
||||
if (method_exists($this, $method)) {
|
||||
$this->$method($value);
|
||||
}
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set default value
|
||||
*
|
||||
* @param mixed $defaultValue
|
||||
* @return Zend_Server_Method_Parameter
|
||||
*/
|
||||
public function setDefaultValue($defaultValue)
|
||||
{
|
||||
$this->_defaultValue = $defaultValue;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve default value
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getDefaultValue()
|
||||
{
|
||||
return $this->_defaultValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set description
|
||||
*
|
||||
* @param string $description
|
||||
* @return Zend_Server_Method_Parameter
|
||||
*/
|
||||
public function setDescription($description)
|
||||
{
|
||||
$this->_description = (string) $description;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve description
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getDescription()
|
||||
{
|
||||
return $this->_description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set name
|
||||
*
|
||||
* @param string $name
|
||||
* @return Zend_Server_Method_Parameter
|
||||
*/
|
||||
public function setName($name)
|
||||
{
|
||||
$this->_name = (string) $name;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return $this->_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set optional flag
|
||||
*
|
||||
* @param bool $flag
|
||||
* @return Zend_Server_Method_Parameter
|
||||
*/
|
||||
public function setOptional($flag)
|
||||
{
|
||||
$this->_optional = (bool) $flag;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is the parameter optional?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isOptional()
|
||||
{
|
||||
return $this->_optional;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set parameter type
|
||||
*
|
||||
* @param string $type
|
||||
* @return Zend_Server_Method_Parameter
|
||||
*/
|
||||
public function setType($type)
|
||||
{
|
||||
$this->_type = (string) $type;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve parameter type
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return $this->_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cast to array
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toArray()
|
||||
{
|
||||
return array(
|
||||
'type' => $this->getType(),
|
||||
'name' => $this->getName(),
|
||||
'optional' => $this->isOptional(),
|
||||
'defaultValue' => $this->getDefaultValue(),
|
||||
'description' => $this->getDescription(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,208 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Method
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
|
||||
/**
|
||||
* Method prototype metadata
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Method
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Server_Method_Prototype
|
||||
{
|
||||
/**
|
||||
* @var string Return type
|
||||
*/
|
||||
protected $_returnType = 'void';
|
||||
|
||||
/**
|
||||
* @var array Map parameter names to parameter index
|
||||
*/
|
||||
protected $_parameterNameMap = array();
|
||||
|
||||
/**
|
||||
* @var array Method parameters
|
||||
*/
|
||||
protected $_parameters = array();
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param null|array $options
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($options = null)
|
||||
{
|
||||
if ((null !== $options) && is_array($options)) {
|
||||
$this->setOptions($options);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set return value
|
||||
*
|
||||
* @param string $returnType
|
||||
* @return Zend_Server_Method_Prototype
|
||||
*/
|
||||
public function setReturnType($returnType)
|
||||
{
|
||||
$this->_returnType = $returnType;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve return type
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getReturnType()
|
||||
{
|
||||
return $this->_returnType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a parameter
|
||||
*
|
||||
* @param string $parameter
|
||||
* @return Zend_Server_Method_Prototype
|
||||
*/
|
||||
public function addParameter($parameter)
|
||||
{
|
||||
if ($parameter instanceof Zend_Server_Method_Parameter) {
|
||||
$this->_parameters[] = $parameter;
|
||||
if (null !== ($name = $parameter->getName())) {
|
||||
$this->_parameterNameMap[$name] = count($this->_parameters) - 1;
|
||||
}
|
||||
} else {
|
||||
require_once 'Zend/Server/Method/Parameter.php';
|
||||
$parameter = new Zend_Server_Method_Parameter(array(
|
||||
'type' => (string) $parameter,
|
||||
));
|
||||
$this->_parameters[] = $parameter;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add parameters
|
||||
*
|
||||
* @param array $parameter
|
||||
* @return Zend_Server_Method_Prototype
|
||||
*/
|
||||
public function addParameters(array $parameters)
|
||||
{
|
||||
foreach ($parameters as $parameter) {
|
||||
$this->addParameter($parameter);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set parameters
|
||||
*
|
||||
* @param array $parameters
|
||||
* @return Zend_Server_Method_Prototype
|
||||
*/
|
||||
public function setParameters(array $parameters)
|
||||
{
|
||||
$this->_parameters = array();
|
||||
$this->_parameterNameMap = array();
|
||||
$this->addParameters($parameters);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve parameters as list of types
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getParameters()
|
||||
{
|
||||
$types = array();
|
||||
foreach ($this->_parameters as $parameter) {
|
||||
$types[] = $parameter->getType();
|
||||
}
|
||||
return $types;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get parameter objects
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getParameterObjects()
|
||||
{
|
||||
return $this->_parameters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a single parameter by name or index
|
||||
*
|
||||
* @param string|int $index
|
||||
* @return null|Zend_Server_Method_Parameter
|
||||
*/
|
||||
public function getParameter($index)
|
||||
{
|
||||
if (!is_string($index) && !is_numeric($index)) {
|
||||
return null;
|
||||
}
|
||||
if (array_key_exists($index, $this->_parameterNameMap)) {
|
||||
$index = $this->_parameterNameMap[$index];
|
||||
}
|
||||
if (array_key_exists($index, $this->_parameters)) {
|
||||
return $this->_parameters[$index];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set object state from array
|
||||
*
|
||||
* @param array $options
|
||||
* @return Zend_Server_Method_Prototype
|
||||
*/
|
||||
public function setOptions(array $options)
|
||||
{
|
||||
foreach ($options as $key => $value) {
|
||||
$method = 'set' . ucfirst($key);
|
||||
if (method_exists($this, $method)) {
|
||||
$this->$method($value);
|
||||
}
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialize to array
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toArray()
|
||||
{
|
||||
return array(
|
||||
'returnType' => $this->getReturnType(),
|
||||
'parameters' => $this->getParameters(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_Exception
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/Exception.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_Function
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/Function.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_Class
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/Class.php';
|
||||
|
||||
/**
|
||||
* Reflection for determining method signatures to use with server classes
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Reflection
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
class Zend_Server_Reflection
|
||||
{
|
||||
/**
|
||||
* Perform class reflection to create dispatch signatures
|
||||
*
|
||||
* Creates a {@link Zend_Server_Reflection_Class} object for the class or
|
||||
* object provided.
|
||||
*
|
||||
* If extra arguments should be passed to dispatchable methods, these may
|
||||
* be provided as an array to $argv.
|
||||
*
|
||||
* @param string|object $class Class name or object
|
||||
* @param null|array $argv Optional arguments to be used during the method call
|
||||
* @param string $namespace Optional namespace with which to prefix the
|
||||
* method name (used for the signature key). Primarily to avoid collisions,
|
||||
* also for XmlRpc namespacing
|
||||
* @return Zend_Server_Reflection_Class
|
||||
* @throws Zend_Server_Reflection_Exception
|
||||
*/
|
||||
public static function reflectClass($class, $argv = false, $namespace = '')
|
||||
{
|
||||
if (is_object($class)) {
|
||||
$reflection = new ReflectionObject($class);
|
||||
} elseif (class_exists($class)) {
|
||||
$reflection = new ReflectionClass($class);
|
||||
} else {
|
||||
throw new Zend_Server_Reflection_Exception('Invalid class or object passed to attachClass()');
|
||||
}
|
||||
|
||||
if ($argv && !is_array($argv)) {
|
||||
throw new Zend_Server_Reflection_Exception('Invalid argv argument passed to reflectClass');
|
||||
}
|
||||
|
||||
return new Zend_Server_Reflection_Class($reflection, $namespace, $argv);
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform function reflection to create dispatch signatures
|
||||
*
|
||||
* Creates dispatch prototypes for a function. It returns a
|
||||
* {@link Zend_Server_Reflection_Function} object.
|
||||
*
|
||||
* If extra arguments should be passed to the dispatchable function, these
|
||||
* may be provided as an array to $argv.
|
||||
*
|
||||
* @param string $function Function name
|
||||
* @param null|array $argv Optional arguments to be used during the method call
|
||||
* @param string $namespace Optional namespace with which to prefix the
|
||||
* function name (used for the signature key). Primarily to avoid
|
||||
* collisions, also for XmlRpc namespacing
|
||||
* @return Zend_Server_Reflection_Function
|
||||
* @throws Zend_Server_Reflection_Exception
|
||||
*/
|
||||
public static function reflectFunction($function, $argv = false, $namespace = '')
|
||||
{
|
||||
if (!is_string($function) || !function_exists($function)) {
|
||||
throw new Zend_Server_Reflection_Exception('Invalid function "' . $function . '" passed to reflectFunction');
|
||||
}
|
||||
|
||||
|
||||
if ($argv && !is_array($argv)) {
|
||||
throw new Zend_Server_Reflection_Exception('Invalid argv argument passed to reflectClass');
|
||||
}
|
||||
|
||||
return new Zend_Server_Reflection_Function(new ReflectionFunction($function), $namespace, $argv);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,201 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_Method
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/Method.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_Exception
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/Exception.php';
|
||||
|
||||
/**
|
||||
* Class/Object reflection
|
||||
*
|
||||
* Proxies calls to a ReflectionClass object, and decorates getMethods() by
|
||||
* creating its own list of {@link Zend_Server_Reflection_Method}s.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Reflection
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
class Zend_Server_Reflection_Class
|
||||
{
|
||||
/**
|
||||
* Optional configuration parameters; accessible via {@link __get} and
|
||||
* {@link __set()}
|
||||
* @var array
|
||||
*/
|
||||
protected $_config = array();
|
||||
|
||||
/**
|
||||
* Array of {@link Zend_Server_Reflection_Method}s
|
||||
* @var array
|
||||
*/
|
||||
protected $_methods = array();
|
||||
|
||||
/**
|
||||
* Namespace
|
||||
* @var string
|
||||
*/
|
||||
protected $_namespace = null;
|
||||
|
||||
/**
|
||||
* ReflectionClass object
|
||||
* @var ReflectionClass
|
||||
*/
|
||||
protected $_reflection;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* Create array of dispatchable methods, each a
|
||||
* {@link Zend_Server_Reflection_Method}. Sets reflection object property.
|
||||
*
|
||||
* @param ReflectionClass $reflection
|
||||
* @param string $namespace
|
||||
* @param mixed $argv
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(ReflectionClass $reflection, $namespace = null, $argv = false)
|
||||
{
|
||||
$this->_reflection = $reflection;
|
||||
$this->setNamespace($namespace);
|
||||
|
||||
foreach ($reflection->getMethods() as $method) {
|
||||
// Don't aggregate magic methods
|
||||
if ('__' == substr($method->getName(), 0, 2)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($method->isPublic()) {
|
||||
// Get signatures and description
|
||||
$this->_methods[] = new Zend_Server_Reflection_Method($this, $method, $this->getNamespace(), $argv);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy reflection calls
|
||||
*
|
||||
* @param string $method
|
||||
* @param array $args
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call($method, $args)
|
||||
{
|
||||
if (method_exists($this->_reflection, $method)) {
|
||||
return call_user_func_array(array($this->_reflection, $method), $args);
|
||||
}
|
||||
|
||||
throw new Zend_Server_Reflection_Exception('Invalid reflection method');
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve configuration parameters
|
||||
*
|
||||
* Values are retrieved by key from {@link $_config}. Returns null if no
|
||||
* value found.
|
||||
*
|
||||
* @param string $key
|
||||
* @return mixed
|
||||
*/
|
||||
public function __get($key)
|
||||
{
|
||||
if (isset($this->_config[$key])) {
|
||||
return $this->_config[$key];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set configuration parameters
|
||||
*
|
||||
* Values are stored by $key in {@link $_config}.
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed $value
|
||||
* @return void
|
||||
*/
|
||||
public function __set($key, $value)
|
||||
{
|
||||
$this->_config[$key] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return array of dispatchable {@link Zend_Server_Reflection_Method}s.
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getMethods()
|
||||
{
|
||||
return $this->_methods;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get namespace for this class
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getNamespace()
|
||||
{
|
||||
return $this->_namespace;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set namespace for this class
|
||||
*
|
||||
* @param string $namespace
|
||||
* @return void
|
||||
*/
|
||||
public function setNamespace($namespace)
|
||||
{
|
||||
if (empty($namespace)) {
|
||||
$this->_namespace = '';
|
||||
return;
|
||||
}
|
||||
|
||||
if (!is_string($namespace) || !preg_match('/[a-z0-9_\.]+/i', $namespace)) {
|
||||
throw new Zend_Server_Reflection_Exception('Invalid namespace');
|
||||
}
|
||||
|
||||
$this->_namespace = $namespace;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wakeup from serialization
|
||||
*
|
||||
* Reflection needs explicit instantiation to work correctly. Re-instantiate
|
||||
* reflection object on wakeup.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __wakeup()
|
||||
{
|
||||
$this->_reflection = new ReflectionClass($this->getName());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Exception
|
||||
*/
|
||||
require_once 'Zend/Exception.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection exceptions
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Reflection
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
class Zend_Server_Reflection_Exception extends Zend_Exception
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_Function_Abstract
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/Function/Abstract.php';
|
||||
|
||||
/**
|
||||
* Function Reflection
|
||||
*
|
||||
* @uses Zend_Server_Reflection_Function_Abstract
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Reflection
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
class Zend_Server_Reflection_Function extends Zend_Server_Reflection_Function_Abstract
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,502 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_Exception
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/Exception.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_Node
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/Node.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_Parameter
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/Parameter.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_Prototype
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/Prototype.php';
|
||||
|
||||
/**
|
||||
* Function/Method Reflection
|
||||
*
|
||||
* Decorates a ReflectionFunction. Allows setting and retrieving an alternate
|
||||
* 'service' name (i.e., the name to be used when calling via a service),
|
||||
* setting and retrieving the description (originally set using the docblock
|
||||
* contents), retrieving the callback and callback type, retrieving additional
|
||||
* method invocation arguments, and retrieving the
|
||||
* method {@link Zend_Server_Reflection_Prototype prototypes}.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Reflection
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
abstract class Zend_Server_Reflection_Function_Abstract
|
||||
{
|
||||
/**
|
||||
* @var ReflectionFunction
|
||||
*/
|
||||
protected $_reflection;
|
||||
|
||||
/**
|
||||
* Additional arguments to pass to method on invocation
|
||||
* @var array
|
||||
*/
|
||||
protected $_argv = array();
|
||||
|
||||
/**
|
||||
* Used to store extra configuration for the method (typically done by the
|
||||
* server class, e.g., to indicate whether or not to instantiate a class).
|
||||
* Associative array; access is as properties via {@link __get()} and
|
||||
* {@link __set()}
|
||||
* @var array
|
||||
*/
|
||||
protected $_config = array();
|
||||
|
||||
/**
|
||||
* Declaring class (needed for when serialization occurs)
|
||||
* @var string
|
||||
*/
|
||||
protected $_class;
|
||||
|
||||
/**
|
||||
* Function/method description
|
||||
* @var string
|
||||
*/
|
||||
protected $_description = '';
|
||||
|
||||
/**
|
||||
* Namespace with which to prefix function/method name
|
||||
* @var string
|
||||
*/
|
||||
protected $_namespace;
|
||||
|
||||
/**
|
||||
* Prototypes
|
||||
* @var array
|
||||
*/
|
||||
protected $_prototypes = array();
|
||||
|
||||
private $_return;
|
||||
private $_returnDesc;
|
||||
private $_paramDesc;
|
||||
private $_sigParams;
|
||||
private $_sigParamsDepth;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param ReflectionFunction $r
|
||||
*/
|
||||
public function __construct(Reflector $r, $namespace = null, $argv = array())
|
||||
{
|
||||
// In PHP 5.1.x, ReflectionMethod extends ReflectionFunction. In 5.2.x,
|
||||
// both extend ReflectionFunctionAbstract. So, we can't do normal type
|
||||
// hinting in the prototype, but instead need to do some explicit
|
||||
// testing here.
|
||||
if ((!$r instanceof ReflectionFunction)
|
||||
&& (!$r instanceof ReflectionMethod)) {
|
||||
throw new Zend_Server_Reflection_Exception('Invalid reflection class');
|
||||
}
|
||||
$this->_reflection = $r;
|
||||
|
||||
// Determine namespace
|
||||
if (null !== $namespace){
|
||||
$this->setNamespace($namespace);
|
||||
}
|
||||
|
||||
// Determine arguments
|
||||
if (is_array($argv)) {
|
||||
$this->_argv = $argv;
|
||||
}
|
||||
|
||||
// If method call, need to store some info on the class
|
||||
if ($r instanceof ReflectionMethod) {
|
||||
$this->_class = $r->getDeclaringClass()->getName();
|
||||
}
|
||||
|
||||
// Perform some introspection
|
||||
$this->_reflect();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create signature node tree
|
||||
*
|
||||
* Recursive method to build the signature node tree. Increments through
|
||||
* each array in {@link $_sigParams}, adding every value of the next level
|
||||
* to the current value (unless the current value is null).
|
||||
*
|
||||
* @param Zend_Server_Reflection_Node $parent
|
||||
* @param int $level
|
||||
* @return void
|
||||
*/
|
||||
protected function _addTree(Zend_Server_Reflection_Node $parent, $level = 0)
|
||||
{
|
||||
if ($level >= $this->_sigParamsDepth) {
|
||||
return;
|
||||
}
|
||||
|
||||
foreach ($this->_sigParams[$level] as $value) {
|
||||
$node = new Zend_Server_Reflection_Node($value, $parent);
|
||||
if ((null !== $value) && ($this->_sigParamsDepth > $level + 1)) {
|
||||
$this->_addTree($node, $level + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the signature tree
|
||||
*
|
||||
* Builds a signature tree starting at the return values and descending
|
||||
* through each method argument. Returns an array of
|
||||
* {@link Zend_Server_Reflection_Node}s.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function _buildTree()
|
||||
{
|
||||
$returnTree = array();
|
||||
foreach ((array) $this->_return as $value) {
|
||||
$node = new Zend_Server_Reflection_Node($value);
|
||||
$this->_addTree($node);
|
||||
$returnTree[] = $node;
|
||||
}
|
||||
|
||||
return $returnTree;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build method signatures
|
||||
*
|
||||
* Builds method signatures using the array of return types and the array of
|
||||
* parameters types
|
||||
*
|
||||
* @param array $return Array of return types
|
||||
* @param string $returnDesc Return value description
|
||||
* @param array $params Array of arguments (each an array of types)
|
||||
* @param array $paramDesc Array of parameter descriptions
|
||||
* @return array
|
||||
*/
|
||||
protected function _buildSignatures($return, $returnDesc, $paramTypes, $paramDesc)
|
||||
{
|
||||
$this->_return = $return;
|
||||
$this->_returnDesc = $returnDesc;
|
||||
$this->_paramDesc = $paramDesc;
|
||||
$this->_sigParams = $paramTypes;
|
||||
$this->_sigParamsDepth = count($paramTypes);
|
||||
$signatureTrees = $this->_buildTree();
|
||||
$signatures = array();
|
||||
|
||||
$endPoints = array();
|
||||
foreach ($signatureTrees as $root) {
|
||||
$tmp = $root->getEndPoints();
|
||||
if (empty($tmp)) {
|
||||
$endPoints = array_merge($endPoints, array($root));
|
||||
} else {
|
||||
$endPoints = array_merge($endPoints, $tmp);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($endPoints as $node) {
|
||||
if (!$node instanceof Zend_Server_Reflection_Node) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$signature = array();
|
||||
do {
|
||||
array_unshift($signature, $node->getValue());
|
||||
$node = $node->getParent();
|
||||
} while ($node instanceof Zend_Server_Reflection_Node);
|
||||
|
||||
$signatures[] = $signature;
|
||||
}
|
||||
|
||||
// Build prototypes
|
||||
$params = $this->_reflection->getParameters();
|
||||
foreach ($signatures as $signature) {
|
||||
$return = new Zend_Server_Reflection_ReturnValue(array_shift($signature), $this->_returnDesc);
|
||||
$tmp = array();
|
||||
foreach ($signature as $key => $type) {
|
||||
$param = new Zend_Server_Reflection_Parameter($params[$key], $type, $this->_paramDesc[$key]);
|
||||
$param->setPosition($key);
|
||||
$tmp[] = $param;
|
||||
}
|
||||
|
||||
$this->_prototypes[] = new Zend_Server_Reflection_Prototype($return, $tmp);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Use code reflection to create method signatures
|
||||
*
|
||||
* Determines the method help/description text from the function DocBlock
|
||||
* comment. Determines method signatures using a combination of
|
||||
* ReflectionFunction and parsing of DocBlock @param and @return values.
|
||||
*
|
||||
* @param ReflectionFunction $function
|
||||
* @return array
|
||||
*/
|
||||
protected function _reflect()
|
||||
{
|
||||
$function = $this->_reflection;
|
||||
$helpText = '';
|
||||
$signatures = array();
|
||||
$returnDesc = '';
|
||||
$paramCount = $function->getNumberOfParameters();
|
||||
$paramCountRequired = $function->getNumberOfRequiredParameters();
|
||||
$parameters = $function->getParameters();
|
||||
$docBlock = $function->getDocComment();
|
||||
|
||||
if (!empty($docBlock)) {
|
||||
// Get help text
|
||||
if (preg_match(':/\*\*\s*\r?\n\s*\*\s(.*?)\r?\n\s*\*(\s@|/):s', $docBlock, $matches))
|
||||
{
|
||||
$helpText = $matches[1];
|
||||
$helpText = preg_replace('/(^\s*\*\s)/m', '', $helpText);
|
||||
$helpText = preg_replace('/\r?\n\s*\*\s*(\r?\n)*/s', "\n", $helpText);
|
||||
$helpText = trim($helpText);
|
||||
}
|
||||
|
||||
// Get return type(s) and description
|
||||
$return = 'void';
|
||||
if (preg_match('/@return\s+(\S+)/', $docBlock, $matches)) {
|
||||
$return = explode('|', $matches[1]);
|
||||
if (preg_match('/@return\s+\S+\s+(.*?)(@|\*\/)/s', $docBlock, $matches))
|
||||
{
|
||||
$value = $matches[1];
|
||||
$value = preg_replace('/\s?\*\s/m', '', $value);
|
||||
$value = preg_replace('/\s{2,}/', ' ', $value);
|
||||
$returnDesc = trim($value);
|
||||
}
|
||||
}
|
||||
|
||||
// Get param types and description
|
||||
if (preg_match_all('/@param\s+([^\s]+)/m', $docBlock, $matches)) {
|
||||
$paramTypesTmp = $matches[1];
|
||||
if (preg_match_all('/@param\s+\S+\s+(\$^\S+)\s+(.*?)(@|\*\/)/s', $docBlock, $matches))
|
||||
{
|
||||
$paramDesc = $matches[2];
|
||||
foreach ($paramDesc as $key => $value) {
|
||||
$value = preg_replace('/\s?\*\s/m', '', $value);
|
||||
$value = preg_replace('/\s{2,}/', ' ', $value);
|
||||
$paramDesc[$key] = trim($value);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$helpText = $function->getName();
|
||||
$return = 'void';
|
||||
}
|
||||
|
||||
// Set method description
|
||||
$this->setDescription($helpText);
|
||||
|
||||
// Get all param types as arrays
|
||||
if (!isset($paramTypesTmp) && (0 < $paramCount)) {
|
||||
$paramTypesTmp = array_fill(0, $paramCount, 'mixed');
|
||||
} elseif (!isset($paramTypesTmp)) {
|
||||
$paramTypesTmp = array();
|
||||
} elseif (count($paramTypesTmp) < $paramCount) {
|
||||
$start = $paramCount - count($paramTypesTmp);
|
||||
for ($i = $start; $i < $paramCount; ++$i) {
|
||||
$paramTypesTmp[$i] = 'mixed';
|
||||
}
|
||||
}
|
||||
|
||||
// Get all param descriptions as arrays
|
||||
if (!isset($paramDesc) && (0 < $paramCount)) {
|
||||
$paramDesc = array_fill(0, $paramCount, '');
|
||||
} elseif (!isset($paramDesc)) {
|
||||
$paramDesc = array();
|
||||
} elseif (count($paramDesc) < $paramCount) {
|
||||
$start = $paramCount - count($paramDesc);
|
||||
for ($i = $start; $i < $paramCount; ++$i) {
|
||||
$paramDesc[$i] = '';
|
||||
}
|
||||
}
|
||||
|
||||
if (count($paramTypesTmp) != $paramCount) {
|
||||
throw new Zend_Server_Reflection_Exception(
|
||||
'Variable number of arguments is not supported for services (except optional parameters). '
|
||||
. 'Number of function arguments must currespond to actual number of arguments described in a docblock.');
|
||||
}
|
||||
|
||||
$paramTypes = array();
|
||||
foreach ($paramTypesTmp as $i => $param) {
|
||||
$tmp = explode('|', $param);
|
||||
if ($parameters[$i]->isOptional()) {
|
||||
array_unshift($tmp, null);
|
||||
}
|
||||
$paramTypes[] = $tmp;
|
||||
}
|
||||
|
||||
$this->_buildSignatures($return, $returnDesc, $paramTypes, $paramDesc);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Proxy reflection calls
|
||||
*
|
||||
* @param string $method
|
||||
* @param array $args
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call($method, $args)
|
||||
{
|
||||
if (method_exists($this->_reflection, $method)) {
|
||||
return call_user_func_array(array($this->_reflection, $method), $args);
|
||||
}
|
||||
|
||||
throw new Zend_Server_Reflection_Exception('Invalid reflection method ("' .$method. '")');
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve configuration parameters
|
||||
*
|
||||
* Values are retrieved by key from {@link $_config}. Returns null if no
|
||||
* value found.
|
||||
*
|
||||
* @param string $key
|
||||
* @return mixed
|
||||
*/
|
||||
public function __get($key)
|
||||
{
|
||||
if (isset($this->_config[$key])) {
|
||||
return $this->_config[$key];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set configuration parameters
|
||||
*
|
||||
* Values are stored by $key in {@link $_config}.
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed $value
|
||||
* @return void
|
||||
*/
|
||||
public function __set($key, $value)
|
||||
{
|
||||
$this->_config[$key] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set method's namespace
|
||||
*
|
||||
* @param string $namespace
|
||||
* @return void
|
||||
*/
|
||||
public function setNamespace($namespace)
|
||||
{
|
||||
if (empty($namespace)) {
|
||||
$this->_namespace = '';
|
||||
return;
|
||||
}
|
||||
|
||||
if (!is_string($namespace) || !preg_match('/[a-z0-9_\.]+/i', $namespace)) {
|
||||
throw new Zend_Server_Reflection_Exception('Invalid namespace');
|
||||
}
|
||||
|
||||
$this->_namespace = $namespace;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return method's namespace
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getNamespace()
|
||||
{
|
||||
return $this->_namespace;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the description
|
||||
*
|
||||
* @param string $string
|
||||
* @return void
|
||||
*/
|
||||
public function setDescription($string)
|
||||
{
|
||||
if (!is_string($string)) {
|
||||
throw new Zend_Server_Reflection_Exception('Invalid description');
|
||||
}
|
||||
|
||||
$this->_description = $string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the description
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function getDescription()
|
||||
{
|
||||
return $this->_description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve all prototypes as array of
|
||||
* {@link Zend_Server_Reflection_Prototype Zend_Server_Reflection_Prototypes}
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getPrototypes()
|
||||
{
|
||||
return $this->_prototypes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve additional invocation arguments
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getInvokeArguments()
|
||||
{
|
||||
return $this->_argv;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wakeup from serialization
|
||||
*
|
||||
* Reflection needs explicit instantiation to work correctly. Re-instantiate
|
||||
* reflection object on wakeup.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __wakeup()
|
||||
{
|
||||
if ($this->_reflection instanceof ReflectionMethod) {
|
||||
$class = new ReflectionClass($this->_class);
|
||||
$this->_reflection = new ReflectionMethod($class->newInstance(), $this->getName());
|
||||
} else {
|
||||
$this->_reflection = new ReflectionFunction($this->getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_Function_Abstract
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/Function/Abstract.php';
|
||||
|
||||
/**
|
||||
* Method Reflection
|
||||
*
|
||||
* @uses Zend_Server_Reflection_Function_Abstract
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Reflection
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
class Zend_Server_Reflection_Method extends Zend_Server_Reflection_Function_Abstract
|
||||
{
|
||||
/**
|
||||
* Parent class name
|
||||
* @var string
|
||||
*/
|
||||
protected $_class;
|
||||
|
||||
/**
|
||||
* Parent class reflection
|
||||
* @var Zend_Server_Reflection_Class
|
||||
*/
|
||||
protected $_classReflection;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param Zend_Server_Reflection_Class $class
|
||||
* @param ReflectionMethod $r
|
||||
* @param string $namespace
|
||||
* @param array $argv
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(Zend_Server_Reflection_Class $class, ReflectionMethod $r, $namespace = null, $argv = array())
|
||||
{
|
||||
$this->_classReflection = $class;
|
||||
$this->_reflection = $r;
|
||||
|
||||
$classNamespace = $class->getNamespace();
|
||||
|
||||
// Determine namespace
|
||||
if (!empty($namespace)) {
|
||||
$this->setNamespace($namespace);
|
||||
} elseif (!empty($classNamespace)) {
|
||||
$this->setNamespace($classNamespace);
|
||||
}
|
||||
|
||||
// Determine arguments
|
||||
if (is_array($argv)) {
|
||||
$this->_argv = $argv;
|
||||
}
|
||||
|
||||
// If method call, need to store some info on the class
|
||||
$this->_class = $class->getName();
|
||||
|
||||
// Perform some introspection
|
||||
$this->_reflect();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the reflection for the class that defines this method
|
||||
*
|
||||
* @return Zend_Server_Reflection_Class
|
||||
*/
|
||||
public function getDeclaringClass()
|
||||
{
|
||||
return $this->_classReflection;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wakeup from serialization
|
||||
*
|
||||
* Reflection needs explicit instantiation to work correctly. Re-instantiate
|
||||
* reflection object on wakeup.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __wakeup()
|
||||
{
|
||||
$this->_classReflection = new Zend_Server_Reflection_Class(new ReflectionClass($this->_class), $this->getNamespace(), $this->getInvokeArguments());
|
||||
$this->_reflection = new ReflectionMethod($this->_classReflection->getName(), $this->getName());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,201 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Node Tree class for Zend_Server reflection operations
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Reflection
|
||||
* @version $Id$
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
class Zend_Server_Reflection_Node
|
||||
{
|
||||
/**
|
||||
* Node value
|
||||
* @var mixed
|
||||
*/
|
||||
protected $_value = null;
|
||||
|
||||
/**
|
||||
* Array of child nodes (if any)
|
||||
* @var array
|
||||
*/
|
||||
protected $_children = array();
|
||||
|
||||
/**
|
||||
* Parent node (if any)
|
||||
* @var Zend_Server_Reflection_Node
|
||||
*/
|
||||
protected $_parent = null;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param mixed $value
|
||||
* @param Zend_Server_Reflection_Node $parent Optional
|
||||
* @return Zend_Server_Reflection_Node
|
||||
*/
|
||||
public function __construct($value, Zend_Server_Reflection_Node $parent = null)
|
||||
{
|
||||
$this->_value = $value;
|
||||
if (null !== $parent) {
|
||||
$this->setParent($parent, true);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set parent node
|
||||
*
|
||||
* @param Zend_Server_Reflection_Node $node
|
||||
* @param boolean $new Whether or not the child node is newly created
|
||||
* and should always be attached
|
||||
* @return void
|
||||
*/
|
||||
public function setParent(Zend_Server_Reflection_Node $node, $new = false)
|
||||
{
|
||||
$this->_parent = $node;
|
||||
|
||||
if ($new) {
|
||||
$node->attachChild($this);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create and attach a new child node
|
||||
*
|
||||
* @param mixed $value
|
||||
* @access public
|
||||
* @return Zend_Server_Reflection_Node New child node
|
||||
*/
|
||||
public function createChild($value)
|
||||
{
|
||||
$child = new self($value, $this);
|
||||
|
||||
return $child;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attach a child node
|
||||
*
|
||||
* @param Zend_Server_Reflection_Node $node
|
||||
* @return void
|
||||
*/
|
||||
public function attachChild(Zend_Server_Reflection_Node $node)
|
||||
{
|
||||
$this->_children[] = $node;
|
||||
|
||||
if ($node->getParent() !== $this) {
|
||||
$node->setParent($this);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an array of all child nodes
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getChildren()
|
||||
{
|
||||
return $this->_children;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does this node have children?
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function hasChildren()
|
||||
{
|
||||
return count($this->_children) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the parent node
|
||||
*
|
||||
* @return null|Zend_Server_Reflection_Node
|
||||
*/
|
||||
public function getParent()
|
||||
{
|
||||
return $this->_parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the node's current value
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getValue()
|
||||
{
|
||||
return $this->_value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the node value
|
||||
*
|
||||
* @param mixed $value
|
||||
* @return void
|
||||
*/
|
||||
public function setValue($value)
|
||||
{
|
||||
$this->_value = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the bottommost nodes of this node's tree
|
||||
*
|
||||
* Retrieves the bottommost nodes of the tree by recursively calling
|
||||
* getEndPoints() on all children. If a child is null, it returns the parent
|
||||
* as an end point.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getEndPoints()
|
||||
{
|
||||
$endPoints = array();
|
||||
if (!$this->hasChildren()) {
|
||||
return $endPoints;
|
||||
}
|
||||
|
||||
foreach ($this->_children as $child) {
|
||||
$value = $child->getValue();
|
||||
|
||||
if (null === $value) {
|
||||
$endPoints[] = $this;
|
||||
} elseif ((null !== $value)
|
||||
&& $child->hasChildren())
|
||||
{
|
||||
$childEndPoints = $child->getEndPoints();
|
||||
if (!empty($childEndPoints)) {
|
||||
$endPoints = array_merge($endPoints, $childEndPoints);
|
||||
}
|
||||
} elseif ((null !== $value) && !$child->hasChildren()) {
|
||||
$endPoints[] = $child;
|
||||
}
|
||||
}
|
||||
|
||||
return $endPoints;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,163 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_Exception
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/Exception.php';
|
||||
|
||||
/**
|
||||
* Parameter Reflection
|
||||
*
|
||||
* Decorates a ReflectionParameter to allow setting the parameter type
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Reflection
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
class Zend_Server_Reflection_Parameter
|
||||
{
|
||||
/**
|
||||
* @var ReflectionParameter
|
||||
*/
|
||||
protected $_reflection;
|
||||
|
||||
/**
|
||||
* Parameter position
|
||||
* @var int
|
||||
*/
|
||||
protected $_position;
|
||||
|
||||
/**
|
||||
* Parameter type
|
||||
* @var string
|
||||
*/
|
||||
protected $_type;
|
||||
|
||||
/**
|
||||
* Parameter description
|
||||
* @var string
|
||||
*/
|
||||
protected $_description;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param ReflectionParameter $r
|
||||
* @param string $type Parameter type
|
||||
* @param string $description Parameter description
|
||||
*/
|
||||
public function __construct(ReflectionParameter $r, $type = 'mixed', $description = '')
|
||||
{
|
||||
$this->_reflection = $r;
|
||||
$this->setType($type);
|
||||
$this->setDescription($description);
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy reflection calls
|
||||
*
|
||||
* @param string $method
|
||||
* @param array $args
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call($method, $args)
|
||||
{
|
||||
if (method_exists($this->_reflection, $method)) {
|
||||
return call_user_func_array(array($this->_reflection, $method), $args);
|
||||
}
|
||||
|
||||
throw new Zend_Server_Reflection_Exception('Invalid reflection method');
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve parameter type
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return $this->_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set parameter type
|
||||
*
|
||||
* @param string|null $type
|
||||
* @return void
|
||||
*/
|
||||
public function setType($type)
|
||||
{
|
||||
if (!is_string($type) && (null !== $type)) {
|
||||
throw new Zend_Server_Reflection_Exception('Invalid parameter type');
|
||||
}
|
||||
|
||||
$this->_type = $type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve parameter description
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getDescription()
|
||||
{
|
||||
return $this->_description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set parameter description
|
||||
*
|
||||
* @param string|null $description
|
||||
* @return void
|
||||
*/
|
||||
public function setDescription($description)
|
||||
{
|
||||
if (!is_string($description) && (null !== $description)) {
|
||||
throw new Zend_Server_Reflection_Exception('Invalid parameter description');
|
||||
}
|
||||
|
||||
$this->_description = $description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set parameter position
|
||||
*
|
||||
* @param int $index
|
||||
* @return void
|
||||
*/
|
||||
public function setPosition($index)
|
||||
{
|
||||
$this->_position = (int) $index;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return parameter position
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getPosition()
|
||||
{
|
||||
return $this->_position;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_Exception
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/Exception.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_ReturnValue
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/ReturnValue.php';
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_Parameter
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/Parameter.php';
|
||||
|
||||
/**
|
||||
* Method/Function prototypes
|
||||
*
|
||||
* Contains accessors for the return value and all method arguments.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Reflection
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
class Zend_Server_Reflection_Prototype
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param Zend_Server_Reflection_ReturnValue $return
|
||||
* @param array $params
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(Zend_Server_Reflection_ReturnValue $return, $params = null)
|
||||
{
|
||||
$this->_return = $return;
|
||||
|
||||
if (!is_array($params) && (null !== $params)) {
|
||||
throw new Zend_Server_Reflection_Exception('Invalid parameters');
|
||||
}
|
||||
|
||||
if (is_array($params)) {
|
||||
foreach ($params as $param) {
|
||||
if (!$param instanceof Zend_Server_Reflection_Parameter) {
|
||||
throw new Zend_Server_Reflection_Exception('One or more params are invalid');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->_params = $params;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve return type
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getReturnType()
|
||||
{
|
||||
return $this->_return->getType();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the return value object
|
||||
*
|
||||
* @access public
|
||||
* @return Zend_Server_Reflection_ReturnValue
|
||||
*/
|
||||
public function getReturnValue()
|
||||
{
|
||||
return $this->_return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve method parameters
|
||||
*
|
||||
* @return array Array of {@link Zend_Server_Reflection_Parameter}s
|
||||
*/
|
||||
public function getParameters()
|
||||
{
|
||||
return $this->_params;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
|
||||
/**
|
||||
* Zend_Server_Reflection_Exception
|
||||
*/
|
||||
require_once 'Zend/Server/Reflection/Exception.php';
|
||||
|
||||
/**
|
||||
* Return value reflection
|
||||
*
|
||||
* Stores the return value type and description
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Server
|
||||
* @subpackage Reflection
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
class Zend_Server_Reflection_ReturnValue
|
||||
{
|
||||
/**
|
||||
* Return value type
|
||||
* @var string
|
||||
*/
|
||||
protected $_type;
|
||||
|
||||
/**
|
||||
* Return value description
|
||||
* @var string
|
||||
*/
|
||||
protected $_description;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $type Return value type
|
||||
* @param string $description Return value type
|
||||
*/
|
||||
public function __construct($type = 'mixed', $description = '')
|
||||
{
|
||||
$this->setType($type);
|
||||
$this->setDescription($description);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve parameter type
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return $this->_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set parameter type
|
||||
*
|
||||
* @param string|null $type
|
||||
* @return void
|
||||
*/
|
||||
public function setType($type)
|
||||
{
|
||||
if (!is_string($type) && (null !== $type)) {
|
||||
throw new Zend_Server_Reflection_Exception('Invalid parameter type');
|
||||
}
|
||||
|
||||
$this->_type = $type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve parameter description
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getDescription()
|
||||
{
|
||||
return $this->_description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set parameter description
|
||||
*
|
||||
* @param string|null $description
|
||||
* @return void
|
||||
*/
|
||||
public function setDescription($description)
|
||||
{
|
||||
if (!is_string($description) && (null !== $description)) {
|
||||
throw new Zend_Server_Reflection_Exception('Invalid parameter description');
|
||||
}
|
||||
|
||||
$this->_description = $description;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework
|
||||
*
|
||||
* LICENSE
|
||||
*
|
||||
* This source file is subject to the new BSD license that is bundled
|
||||
* with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://framework.zend.com/license/new-bsd
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to [email protected] so we can send you a copy immediately.
|
||||
*
|
||||
* @category Zend
|
||||
* @package Zend_Service
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @version $Id$
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Zend_Http_Client
|
||||
*/
|
||||
require_once 'Zend/Http/Client.php';
|
||||
|
||||
|
||||
/**
|
||||
* @category Zend
|
||||
* @package Zend_Service
|
||||
* @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
abstract class Zend_Service_Abstract
|
||||
{
|
||||
/**
|
||||
* HTTP Client used to query all web services
|
||||
*
|
||||
* @var Zend_Http_Client
|
||||
*/
|
||||
protected static $_httpClient = null;
|
||||
|
||||
|
||||
/**
|
||||
* Sets the HTTP client object to use for retrieving the feeds. If none
|
||||
* is set, the default Zend_Http_Client will be used.
|
||||
*
|
||||
* @param Zend_Http_Client $httpClient
|
||||
*/
|
||||
final public static function setHttpClient(Zend_Http_Client $httpClient)
|
||||
{
|
||||
self::$_httpClient = $httpClient;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the HTTP client object.
|
||||
*
|
||||
* @return Zend_Http_Client
|
||||
*/
|
||||
final public static function getHttpClient()
|
||||
{
|
||||
if (!self::$_httpClient instanceof Zend_Http_Client) {
|
||||
self::$_httpClient = new Zend_Http_Client();
|
||||
}
|
||||
|
||||
return self::$_httpClient;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ final class Zend_Version
|
||||
/**
|
||||
* Zend Framework version identification - see compareVersion()
|
||||
*/
|
||||
const VERSION = '1.6.2';
|
||||
const VERSION = '1.7.3';
|
||||
|
||||
/**
|
||||
* Compare the specified Zend Framework version string $version
|
||||
|
||||
+4
-5
@@ -57,14 +57,13 @@ final class user_external extends moodle_external {
|
||||
|
||||
}
|
||||
else {
|
||||
throw new moodle_exception('couldnotvieweuser');
|
||||
throw new moodle_exception('wscouldnotvieweuser');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a user
|
||||
* @param array $params
|
||||
* @param $username string
|
||||
* ->firstname string
|
||||
* ->lastname string
|
||||
* ->email string
|
||||
@@ -83,7 +82,7 @@ final class user_external extends moodle_external {
|
||||
return user_lib::tmp_create_user($user);
|
||||
}
|
||||
else {
|
||||
throw new moodle_exception('couldnotcreateeuser');
|
||||
throw new moodle_exception('wscouldnotcreateeuser');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,7 +101,7 @@ final class user_external extends moodle_external {
|
||||
return delete_user($user); //this function is in moodlelib.php
|
||||
}
|
||||
else {
|
||||
throw new moodle_exception('couldnotdeleteuser');
|
||||
throw new moodle_exception('wscouldnotdeleteuser');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,7 +130,7 @@ final class user_external extends moodle_external {
|
||||
return user_lib::tmp_update_user($user);
|
||||
}
|
||||
else {
|
||||
throw new moodle_exception('couldnotupdateuser');
|
||||
throw new moodle_exception('wscouldnotupdateuser');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -64,9 +64,11 @@ function call_moodle_function ($rest_arguments) {
|
||||
//return an error message, the REST params doesn't match with the web service description
|
||||
}
|
||||
|
||||
|
||||
|
||||
$res = call_user_func_array ( $classname.'::'.$functionname, array($params));
|
||||
try {
|
||||
$res = call_user_func_array ( $classname.'::'.$functionname, array($params));
|
||||
} catch (moodle_exception $e) {
|
||||
return "<Result>".$e->getMessage()."</Result>";
|
||||
}
|
||||
|
||||
///Transform result into xml in order to send the REST response
|
||||
$return = mdl_conn_rest_object_to_xml ($res,key($description['return']));
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Main script - try a REST connection
|
||||
*
|
||||
* @author Jerome Mouneyrac <[email protected]>
|
||||
* @version 1.0
|
||||
* @package webservices
|
||||
*/
|
||||
|
||||
/*
|
||||
* Zend Rest sclient
|
||||
*/
|
||||
require_once('../../../config.php');
|
||||
include "Zend/Loader.php";
|
||||
Zend_Loader::registerAutoload();
|
||||
|
||||
|
||||
//1. authentication
|
||||
$client = new Zend_Rest_Client($CFG->wwwroot."/webservice/rest/zend_rest_server.php");
|
||||
|
||||
|
||||
$token = $client->tmp_get_token(array('username' => "wsuser", 'password' => "wspassword"))->get();
|
||||
echo $token->response();
|
||||
$token = $token->response();
|
||||
printLastRequestResponse($client);
|
||||
|
||||
|
||||
//2. test functions
|
||||
$client = new Zend_Rest_Client($CFG->wwwroot."/webservice/rest/zend_rest_server.php/?classpath=user&token=".$token);
|
||||
|
||||
var_dump($client->tmp_get_users(array('search' => "admin"))->get());
|
||||
printLastRequestResponse($client);
|
||||
var_dump($client->tmp_create_user(array('username' => "mockuser66",'firstname' => "firstname6",'lastname' => "lastname6",'email' => "[email protected]",'password' => "password6"))->get());
|
||||
printLastRequestResponse($client);
|
||||
var_dump($client->tmp_update_user(array('username' => "mockuser66",'mnethostid' => 1,'newusername' => "mockuser6b",'firstname' => "firstname6b"))->get());
|
||||
printLastRequestResponse($client);
|
||||
var_dump($client->tmp_delete_user(array('username' => "mockuser6b",'mnethostid' => 1))->get());
|
||||
printLastRequestResponse($client);
|
||||
|
||||
|
||||
|
||||
function printLastRequestResponse($client) {
|
||||
print "<pre>\n";
|
||||
// print "Request :\n".htmlspecialchars($client->__getLastRequest()) ."\n";
|
||||
// print "Response:\n".htmlspecialchars($client->__getLastResponse())."\n";
|
||||
print "</pre>";
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
/**
|
||||
* Main script - SOAP server
|
||||
*
|
||||
* @author Jerome Mouneyrac <[email protected]>
|
||||
* @version 1.0
|
||||
* @package webservices
|
||||
*/
|
||||
|
||||
/*
|
||||
* Zend Rest server
|
||||
*/
|
||||
require_once(dirname(__FILE__) . '/../../config.php');
|
||||
include "Zend/Loader.php";
|
||||
Zend_Loader::registerAutoload();
|
||||
if (empty($CFG->enablewebservices)) {
|
||||
die;
|
||||
}
|
||||
|
||||
// retrieve the token from the url
|
||||
// if the token doesn't exist, set a class containing only get_token()
|
||||
$token = optional_param('token',null,PARAM_ALPHANUM);
|
||||
if (empty($token)) {
|
||||
$server = new Zend_Rest_Server();
|
||||
$server->setClass("soap_authentication");
|
||||
$server->handle();
|
||||
} else { // if token exist, do the authentication here
|
||||
/// TODO: following function will need to be modified
|
||||
$user = mock_check_token($token);
|
||||
if (empty($user)) {
|
||||
throw new moodle_exception('wrongidentification');
|
||||
} else {
|
||||
/// TODO: probably change this
|
||||
global $USER;
|
||||
$USER = $user;
|
||||
}
|
||||
|
||||
//retrieve the api name
|
||||
$classpath = optional_param(classpath,null,PARAM_ALPHA);
|
||||
require_once(dirname(__FILE__) . '/../../'.$classpath.'/external.php');
|
||||
|
||||
/// run the server
|
||||
$server = new Zend_Rest_Server(); //TODO: need to call the wsdl generation on the fly
|
||||
$server->setClass($classpath."_external"); //TODO: pass $user as parameter
|
||||
$server->handle();
|
||||
}
|
||||
|
||||
|
||||
function mock_check_token($token) {
|
||||
//fake test
|
||||
if ($token == 465465465468468464) {
|
||||
///retrieve the user
|
||||
global $DB;
|
||||
$user = $DB->get_record('user', array('username'=>'wsuser', 'mnethostid'=>1));
|
||||
|
||||
if (empty($user)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $user;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
class soap_authentication {
|
||||
function tmp_get_token($params) {
|
||||
if ($params['username'] == 'wsuser' && $params['password'] == 'wspassword') {
|
||||
return '465465465468468464';
|
||||
} else {
|
||||
throw new moodle_exception('wrongusernamepassword');
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -82,11 +82,8 @@ EOF;
|
||||
|
||||
///load the class
|
||||
$classpath = substr($fileapipath,strlen($CFG->dirroot)+1); //remove the dir root + / from the file path
|
||||
varlog($classpath);
|
||||
$classpath = substr($classpath,0,strlen($classpath) - 13); //remove /external.php from the classpath
|
||||
varlog($classpath);
|
||||
$classpath = str_replace('/','_',$classpath); //convert all / into _
|
||||
varlog($classpath);
|
||||
$classname = $classpath."_external";
|
||||
$api = new $classname();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user