Original Author * @author Shane Caraveo Port to PEAR and more * @author Chuck Hagenbuch Maintenance * @author Jan Schneider Maintenance * @copyright 2003-2007 The PHP Group * @license http://www.php.net/license/2_02.txt PHP License 2.02 * @link http://pear.php.net/package/SOAP */ require_once 'SOAP/Base.php'; /** * SOAP::Value * * This class converts values between PHP and SOAP. * * Originally based on SOAPx4 by Dietrich Ayala * http://dietrich.ganx4.com/soapx4 * * @access public * @package SOAP * @author Shane Caraveo Conversion to PEAR and updates * @author Dietrich Ayala Original Author */ class SOAP_Value { /** * The actual value. * * @var mixed */ var $value = null; /** * QName instance representing the value name. * * @var QName */ var $nqn; /** * The value name, without namespace information. * * @var string */ var $name = ''; /** * The namespace of the value name. * * @var string */ var $namespace = ''; /** * QName instance representing the value type. * * @var QName */ var $tqn; /** * The value type, without namespace information. * * @var string */ var $type = ''; /** * The namespace of the value type. * * @var string */ var $type_namespace = ''; /** * The type of the array elements, if this value is an array. * * @var string */ var $arrayType = ''; /** * A hash of additional attributes. * * @see SOAP_Value() * @var array */ var $attributes = array(); /** * List of encoding and serialization options. * * @see SOAP_Value() * @var array */ var $options = array(); /** * Constructor. * * @param string $name Name of the SOAP value {namespace}name. * @param mixed $type SOAP value {namespace}type. Determined * automatically if not set. * @param mixed $value Value to set. * @param array $attributes A has of additional XML attributes to be * added to the serialized value. * @param array $options A list of encoding and serialization options: * - 'attachment': array with information about * the attachment * - 'soap_encoding': defines encoding for SOAP * message part of a MIME encoded SOAP request * (default: base64) * - 'keep_arrays_flat': use the tag name * multiple times for each element when * passing in an array in literal mode * - 'no_type_prefix': supress adding of the * namespace prefix */ function SOAP_Value($name = '', $type = false, $value = null, $attributes = array(), $options = array()) { $this->nqn = new QName($name); $this->name = $this->nqn->name; $this->namespace = $this->nqn->namespace; if ($type) { $this->tqn = new QName($type); $this->type = $this->tqn->name; $this->type_namespace = $this->tqn->namespace; } $this->value = $value; $this->attributes = $attributes; $this->options = $options; } /** * Serializes this value. * * @param SOAP_Base $serializer A SOAP_Base instance or subclass to * serialize with. * * @return string XML representation of $this. */ function serialize(&$serializer) { return $serializer->_serializeValue($this->value, $this->nqn, $this->tqn, $this->options, $this->attributes, $this->arrayType); } } /** * This class converts values between PHP and SOAP. It is a simple wrapper * around SOAP_Value, adding support for SOAP actor and mustunderstand * parameters. * * Originally based on SOAPx4 by Dietrich Ayala * http://dietrich.ganx4.com/soapx4 * * @access public * @package SOAP * @author Shane Caraveo Conversion to PEAR and updates * @author Dietrich Ayala Original Author */ class SOAP_Header extends SOAP_Value { /** * Constructor * * @param string $name Name of the SOAP value {namespace}name. * @param mixed $type SOAP value {namespace}type. Determined * automatically if not set. * @param mixed $value Value to set * @param integer $mustunderstand Zero or one. * @param mixed $attributes Attributes. */ function SOAP_Header($name = '', $type, $value, $mustunderstand = 0, $attributes = array()) { if (!is_array($attributes)) { $actor = $attributes; $attributes = array(); } parent::SOAP_Value($name, $type, $value, $attributes); if (isset($actor)) { $this->attributes[SOAP_BASE::SOAPENVPrefix().':actor'] = $actor; } elseif (!isset($this->attributes[SOAP_BASE::SOAPENVPrefix().':actor'])) { $this->attributes[SOAP_BASE::SOAPENVPrefix().':actor'] = 'http://schemas.xmlsoap.org/soap/actor/next'; } $this->attributes[SOAP_BASE::SOAPENVPrefix().':mustUnderstand'] = (int)$mustunderstand; } } /** * This class handles MIME attachements per W3C's Note on Soap Attachements at * http://www.w3.org/TR/SOAP-attachments * * @access public * @package SOAP * @author Shane Caraveo Conversion to PEAR and updates */ class SOAP_Attachment extends SOAP_Value { /** * Constructor. * * @param string $name Name of the SOAP value * @param string $type The attachment's MIME type. * @param string $filename The attachment's file name. Ignored if $file * is provide. * @param string $file The attachment data. * @param array $attributes Attributes. */ function SOAP_Attachment($name = '', $type = 'application/octet-stream', $filename, $file = null, $attributes = null) { parent::SOAP_Value($name, null, null); $filedata = $file === null ? $this->_file2str($filename) : $file; $filename = basename($filename); if (PEAR::isError($filedata)) { $this->options['attachment'] = $filedata; return; } $cid = md5(uniqid(time())); $this->attributes = $attributes; $this->attributes['href'] = 'cid:' . $cid; $this->options['attachment'] = array('body' => $filedata, 'disposition' => $filename, 'content_type' => $type, 'encoding' => 'base64', 'cid' => $cid); } /** * Returns the contents of the given file name as string. * * @access private * * @param string $file_name The file location. * * @return string The file data or a PEAR_Error. */ function _file2str($file_name) { if (!is_readable($file_name)) { return PEAR::raiseError('File is not readable: ' . $file_name); } if (function_exists('file_get_contents')) { return file_get_contents($file_name); } if (!$fd = fopen($file_name, 'rb')) { return PEAR::raiseError('Could not open ' . $file_name); } $cont = fread($fd, filesize($file_name)); fclose($fd); return $cont; } }