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:
jerome
2009-01-29 08:24:40 +00:00
parent 51a53f4121
commit 58e6c593f4
66 changed files with 15100 additions and 12 deletions
+79
View File
@@ -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';
}
+33
View File
@@ -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;
}
}
+289
View File
@@ -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);
}
}
+317
View File
@@ -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;
}
}
+64
View File
@@ -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);
}
+38
View File
@@ -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
{
}
+48
View File
@@ -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('');
}
}
+58
View File
@@ -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);
}
+133
View File
@@ -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;
}
}
+249
View File
@@ -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;
}
}
+79
View File
@@ -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;
}
}
+193
View File
@@ -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;
}
}
+47
View File
@@ -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();
}
}
+627
View File
@@ -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);
}
}
+35
View File
@@ -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
{
}
+278
View File
@@ -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;
}
}
+57
View File
@@ -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;
}
}
+181
View File
@@ -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;
}
}
+80
View File
@@ -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;
}
}
+153
View File
@@ -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
+322
View File
@@ -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
+49
View File
@@ -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;
}
}
+5
View File
@@ -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
*/
+253
View File
@@ -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;
}
}
}
+39
View File
@@ -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
{
}
+224
View File
@@ -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{}
+36
View File
@@ -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
{}
+610
View File
@@ -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;
}
}
+39
View File
@@ -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
{
}
+242
View File
@@ -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);
}
+147
View File
@@ -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;
}
}
+267
View File
@@ -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();
}
}
+35
View File
@@ -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
{
}
+118
View File
@@ -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);
}
+205
View File
@@ -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;
}
}
+293
View File
@@ -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(),
);
}
}
+214
View File
@@ -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(),
);
}
}
+208
View File
@@ -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(),
);
}
}
+112
View File
@@ -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);
}
}
+201
View File
@@ -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());
}
}
}
+110
View File
@@ -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());
}
}
+201
View File
@@ -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;
}
}
+71
View File
@@ -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;
}
}
+1 -1
View File
@@ -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
View File
@@ -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');
}
}
+5 -3
View File
@@ -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>";
}
?>
+75
View File
@@ -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');
}
}
}
?>
-3
View File
@@ -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();