Author: rhs
Date: Sun Oct 14 23:52:06 2012
New Revision: 1398154

URL: http://svn.apache.org/viewvc?rev=1398154&view=rev
Log:
added idiomatic API for php binding

Added:
    qpid/proton/trunk/proton-c/bindings/php/proton.php
Modified:
    qpid/proton/trunk/proton-c/bindings/php/php.i

Modified: qpid/proton/trunk/proton-c/bindings/php/php.i
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/bindings/php/php.i?rev=1398154&r1=1398153&r2=1398154&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/bindings/php/php.i (original)
+++ qpid/proton/trunk/proton-c/bindings/php/php.i Sun Oct 14 23:52:06 2012
@@ -55,6 +55,19 @@
     t_output_helper(&$result, tmp);     // append it to output array
 }
 
+%typemap(in) pn_bytes_t {
+  if (ZVAL_IS_NULL(*$input)) {
+    $1.start = NULL;
+    $1.size = 0;
+  } else {
+    $1.start = Z_STRVAL_PP($input);
+    $1.size = Z_STRLEN_PP($input);
+  }
+}
+
+%typemap(out) pn_bytes_t {
+  ZVAL_STRINGL($result, $1.start, $1.size, 1);
+}
 
 // The PHP SWIG typedefs define the typemap STRING, LENGTH to be binary safe 
(allow
 // embedded \0's).
@@ -98,17 +111,31 @@ ssize_t pn_sasl_send(pn_sasl_t *sasl, ch
 %ignore pn_sasl_recv;
 
 %rename(pn_transport_output) wrap_pn_transport_output;
-// in PHP:   array = pn_output(transport, MAXLEN);
+// in PHP:   array = pn_transport_output(transport, MAXLEN);
 //           array[0] = size || error code
 //           array[1] = native string containing binary data
 %inline %{
     void wrap_pn_transport_output(pn_transport_t *transport, size_t maxCount, 
char **OUTPUT_BUFFER, ssize_t *OUTPUT_LEN) {
         *OUTPUT_BUFFER = emalloc(sizeof(char) * maxCount);
-        *OUTPUT_LEN = pn_output(transport, *OUTPUT_BUFFER, maxCount);
+        *OUTPUT_LEN = pn_transport_output(transport, *OUTPUT_BUFFER, maxCount);
     }
 %}
 %ignore pn_transport_output;
 
+%rename(pn_message_encode) wrap_pn_message_encode;
+%inline %{
+    void wrap_pn_message_encode(pn_message_t *message, size_t maxCount, char 
**OUTPUT_BUFFER, ssize_t *OUTPUT_LEN) {
+        *OUTPUT_BUFFER = emalloc(sizeof(char) * maxCount);
+        *OUTPUT_LEN = maxCount;
+        int err = pn_message_encode(message, *OUTPUT_BUFFER, OUTPUT_LEN);
+        if (err) {
+          *OUTPUT_LEN = err;
+          efree(*OUTPUT_BUFFER);
+        }
+    }
+%}
+%ignore pn_message_encode;
+
 %rename(pn_message_data) wrap_pn_message_data;
 // in PHP:  array = pn_message_data("binary message data", MAXLEN);
 //          array[0] = size || error code

Added: qpid/proton/trunk/proton-c/bindings/php/proton.php
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/bindings/php/proton.php?rev=1398154&view=auto
==============================================================================
--- qpid/proton/trunk/proton-c/bindings/php/proton.php (added)
+++ qpid/proton/trunk/proton-c/bindings/php/proton.php Sun Oct 14 23:52:06 2012
@@ -0,0 +1,847 @@
+<?php
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ **/
+
+include("cproton.php");
+
+class ProtonException extends Exception {}
+
+class Timeout extends ProtonException {}
+
+class MessengerException extends ProtonException {}
+
+class MessageException extends ProtonException {}
+
+$EXCEPTIONS = array(PN_TIMEOUT => Timeout);
+
+class Messenger
+{
+  private $impl;
+
+  public function __construct($name=null) {
+    $this->impl = pn_messenger($name);
+  }
+
+  public function __destruct() {
+    pn_messenger_free($this->impl);
+  }
+
+  public function __toString() {
+    return 'Messenger("' . pn_messenger_name($this->impl) . '")';
+  }
+
+  private function _check($value) {
+    if ($value < 0) {
+      $exc = $EXCEPTIONS[$value];
+      if ($exc == null) $exc = MessengerException;
+      throw new $exc("[$value]: " . pn_messenger_error($this->impl));
+    } else {
+      return $value;
+    }
+  }
+
+  public function __get($name) {
+    switch ($name) {
+    case "name":
+      return pn_messenger_name($this->impl);
+    case "certificate":
+      return pn_messenger_get_certificate($this->impl);
+    case "private_key":
+      return pn_messenger_get_private_key($this->impl);
+    case "password":
+      return pn_messenger_get_password($this->impl);
+    case "trusted_certificates":
+      return pn_messenger_get_trusted_certificates($this->impl);
+    default:
+      throw new Exception("unknown property: " . $name);
+    }
+  }
+
+  public function __set($name, $value) {
+    switch ($name) {
+    case "certificate":
+      $this->_check(pn_messenger_set_certificate($this->impl, $value));
+      break;
+    case "private_key":
+      $this->_check(pn_messenger_set_private_key($this->impl, $value));
+      break;
+    case "password":
+      $this->_check(pn_messenger_set_password($this->impl, $value));
+      break;
+    case "trusted_certificates":
+      $this->_check(pn_messenger_set_trusted_certificates($this->impl, 
$value));
+      break;
+    case "timeout":
+      $this->_check(pn_messenger_set_timeout($this->impl, $value));
+      break;
+    default:
+      throw new Exception("unknown property: " . $name);
+    }
+  }
+
+  public function start() {
+    $this->_check(pn_messenger_start($this->impl));
+  }
+
+  public function stop() {
+    $this->_check(pn_messenger_stop($this->impl));
+  }
+
+  public function subscribe($source) {
+    $this->_check(pn_messenger_subscribe($this->impl, $source));
+  }
+
+  public function put($message) {
+    $message->_pre_encode();
+    $this->_check(pn_messenger_put($this->impl, $message->impl));
+  }
+
+  public function send() {
+    $this->_check(pn_messenger_send($this->impl));
+  }
+
+  public function recv($n) {
+    $this->_check(pn_messenger_recv($this->impl, $n));
+  }
+
+  public function get($message) {
+    $this->_check(pn_messenger_get($this->impl, $message->impl));
+    $message->_post_decode();
+  }
+
+  public function outgoing() {
+    return pn_messenger_outgoing($this->impl);
+  }
+
+  public function incoming() {
+    return pn_messenger_incoming($this->impl);
+  }
+
+}
+
+class Message {
+
+  const DATA = PN_DATA;
+  const TEXT = PN_TEXT;
+  const AMQP = PN_AMQP;
+  const JSON = PN_JSON;
+
+  const DEFAULT_PRIORITY = PN_DEFAULT_PRIORITY;
+
+  var $impl;
+  public $instructions = null;
+  public $annotations = null;
+  public $properties = null;
+  public $body = null;
+
+  public function __construct() {
+    $this->impl = pn_message();
+  }
+
+  public function __destruct() {
+    pn_message_free($this->impl);
+  }
+
+  private function _check($value) {
+    if ($value < 0) {
+      $exc = $EXCEPTIONS[$value];
+      if ($exc == null) $exc = MessageException;
+      throw new $exc("[$value]: " . pn_message_error($this->impl));
+    } else {
+      return $value;
+    }
+  }
+
+  public function __get($name) {
+    if ($name == "impl")
+      throw new Exception();
+    $getter = "_get_$name";
+    return $this->$getter();
+  }
+
+  public function __set($name, $value) {
+    $setter = "_set_$name";
+    $this->$setter($value);
+  }
+
+  function _pre_encode() {
+    $inst = new Data(pn_message_instructions($this->impl));
+    $ann = new Data(pn_message_annotations($this->impl));
+    $props = new Data(pn_message_properties($this->impl));
+    //$body = Data(pn_message_body($this->impl));
+
+    $inst->clear();
+    if ($this->instructions != null)
+      $inst->put_object($this->instructions);
+    $ann->clear();
+    if ($this->annotations != null)
+      $ann->put_object($this->annotations);
+    $props->clear();
+    if ($this->properties != null)
+      $props->put_object($this->properties);
+  }
+
+  function _post_decode() {
+    $inst = new Data(pn_message_instructions($this->impl));
+    $ann = new Data(pn_message_annotations($this->impl));
+    $props = new Data(pn_message_properties($this->impl));
+    //$body = Data(pn_message_body($this->impl));
+
+    if ($inst->next())
+      $this->instructions = $inst.get_object();
+    else
+      $this->instructions = null;
+    if ($ann->next())
+      $this->annotations = $ann->get_object();
+    else
+      $self->annotations = null;
+    if ($props->next())
+      $this->properties = $props->get_object();
+    else
+      $this->properties = null;
+  }
+
+  public function clear() {
+    pn_message_clear($this->impl);
+    $this->instructions = null;
+    $this->annotations = null;
+    $this->properties = null;
+    $this->body = null;
+  }
+
+  private function _is_durable() {
+    return pn_message_is_durable($this->impl);
+  }
+
+  private function _set_durable($value) {
+    $this->_check(pn_message_set_durable($this->impl, bool($value)));
+  }
+
+  private function _get_priority() {
+    return pn_message_get_priority($this->impl);
+  }
+
+  private function _set_priority($value) {
+    $this->_check(pn_message_set_priority($this->impl, $value));
+  }
+
+  private function _get_ttl() {
+    return pn_message_get_ttl($this->impl);
+  }
+
+  private function _set_ttl($value) {
+    $this->_check(pn_message_set_ttl($this->impl, $value));
+  }
+
+  private function _is_first_acquirer() {
+    return pn_message_is_first_acquirer($this->impl);
+  }
+
+  private function _set_first_acquirer($value) {
+    $this->_check(pn_message_set_first_acquirer($this->impl, bool($value)));
+  }
+
+  private function _get_delivery_count() {
+    return pn_message_get_delivery_count($this->impl);
+  }
+
+  private function _set_delivery_count($value) {
+    $this->_check(pn_message_set_delivery_count($this->impl, $value));
+  }
+
+  # XXX
+  private function _get_id() {
+    return pn_message_get_id($this->impl);
+  }
+
+  private function _set_id($value) {
+    $this->_check(pn_message_set_id($this->impl, $value));
+  }
+
+  private function _get_user_id() {
+    return pn_message_get_user_id($this->impl);
+  }
+
+  private function _set_user_id($value) {
+    $this->_check(pn_message_set_user_id($this->impl, $value));
+  }
+
+  private function _get_address() {
+    return pn_message_get_address($this->impl);
+  }
+
+  private function _set_address($value) {
+    $this->_check(pn_message_set_address($this->impl, $value));
+  }
+
+  private function _get_subject() {
+    return pn_message_get_subject($this->impl);
+  }
+
+  private function _set_subject($value) {
+    $this->_check(pn_message_set_subject($this->impl, $value));
+  }
+
+  private function _get_reply_to() {
+    return pn_message_get_reply_to($this->impl);
+  }
+
+  private function _set_reply_to($value) {
+    $this->_check(pn_message_set_reply_to($this->impl, $value));
+  }
+
+  # XXX
+  private function _get_correlation_id() {
+    return pn_message_get_correlation_id($this->impl);
+  }
+
+  private function _set_correlation_id($value) {
+    $this->_check(pn_message_set_correlation_id($this->impl, $value));
+  }
+
+  private function _get_content_type() {
+    return pn_message_get_content_type($this->impl);
+  }
+
+  private function _set_content_type($value) {
+    $this->_check(pn_message_set_content_type($this->impl, $value));
+  }
+
+  private function _get_content_encoding() {
+    return pn_message_get_content_encoding($this->impl);
+  }
+
+  private function _set_content_encoding($value) {
+    $this->_check(pn_message_set_content_encoding($this->impl, $value));
+  }
+
+  private function _get_expiry_time() {
+    return pn_message_get_expiry_time($this->impl);
+  }
+
+  private function _set_expiry_time($value) {
+    $this->_check(pn_message_set_expiry_time($this->impl, $value));
+  }
+
+  private function _get_creation_time() {
+    return pn_message_get_creation_time($this->impl);
+  }
+
+  private function _set_creation_time($value) {
+    $this->_check(pn_message_set_creation_time($this->impl, $value));
+  }
+
+  private function _get_group_id() {
+    return pn_message_get_group_id($this->impl);
+  }
+
+  private function _set_group_id($value) {
+    $this->_check(pn_message_set_group_id($this->impl, $value));
+  }
+
+  private function _get_group_sequence() {
+    return pn_message_get_group_sequence($this->impl);
+  }
+
+  private function _set_group_sequence($value) {
+    $this->_check(pn_message_set_group_sequence($this->impl, $value));
+  }
+
+  private function _get_reply_to_group_id() {
+    return pn_message_get_reply_to_group_id($this->impl);
+  }
+
+  private function _set_reply_to_group_id($value) {
+    $this->_check(pn_message_set_reply_to_group_id($this->impl, $value));
+  }
+
+  # XXX
+  private function _get_format() {
+    return pn_message_get_format($this->impl);
+  }
+
+  private function _set_format($value) {
+    $this->_check(pn_message_set_format($this->impl, $value));
+  }
+
+  public function encode() {
+    $this->_pre_encode();
+    $sz = 16;
+    while (true) {
+      list($err, $data) = pn_message_encode($this->impl, $sz);
+      if ($err == PN_OVERFLOW) {
+        $sz *= 2;
+        continue;
+      } else {
+        $this->_check($err);
+        return $data;
+      }
+    }
+  }
+
+  public function decode($data) {
+    $this->_check(pn_message_decode($this->impl, $data, strlen($data)));
+    $this->_post_decode();
+  }
+
+  public function load($data) {
+    $this->_check(pn_message_load($this->impl, $data));
+  }
+
+  public function save() {
+    $sz = 16;
+    while (true) {
+      list($err, $data) = pn_message_save($this->impl, $sz);
+      if ($err == PN_OVERFLOW) {
+        $sz *= 2;
+        continue;
+      } else {
+        $this->_check($err);
+        return $data;
+      }
+    }
+  }
+}
+
+class DataException extends ProtonException {}
+
+class Data {
+
+  const NULL = PN_NULL;
+  const BOOL = PN_BOOL;
+  const UBYTE = PN_UBYTE;
+  const BYTE = PN_BYTE;
+  const USHORT = PN_USHORT;
+  const SHORT = PN_SHORT;
+  const UINT = PN_UINT;
+  const INT = PN_INT;
+  const CHAR = PN_CHAR;
+  const ULONG = PN_ULONG;
+  const LONG = PN_LONG;
+  const TIMESTAMP = PN_TIMESTAMP;
+  const FLOAT = PN_FLOAT;
+  const DOUBLE = PN_DOUBLE;
+  const DECIMAL32 = PN_DECIMAL32;
+  const DECIMAL64 = PN_DECIMAL64;
+  const DECIMAL128 = PN_DECIMAL128;
+  const UUID = PN_UUID;
+  const BINARY = PN_BINARY;
+  const STRING = PN_STRING;
+  const SYMBOL = PN_SYMBOL;
+  const DESCRIBED = PN_DESCRIPTOR;
+  const ARY = PN_ARRAY;
+  const LST = PN_LIST;
+  const MAP = PN_MAP;
+
+  private $impl;
+  private $free;
+
+  public function __construct($capacity=16) {
+    if (is_int($capacity)) {
+      $this->impl = pn_data($capacity);
+      $this->free = true;
+    } else {
+      $this->impl = $capacity;
+      $this->free = false;
+    }
+  }
+
+  public function __destruct() {
+    if ($this->free)
+      pn_data_free($this->impl);
+  }
+
+  public function _check($value) {
+    if ($value < 0) {
+      $exc = $EXCEPTIONS[$value];
+      if ($exc == null) $exc = DataException;
+      throw new $exc("[$value]");
+    } else {
+      return $value;
+    }
+  }
+
+  public function clear() {
+    pn_data_clear($this->impl);
+  }
+
+  public function rewind() {
+    pn_data_rewind($this->impl);
+  }
+
+  public function next() {
+    $found = pn_data_next($this->impl);
+    if ($found)
+      return $this->type();
+    else
+      return null;
+  }
+
+  public function prev() {
+    $found = pn_data_prev($this->impl);
+    if ($found)
+      return $this->type();
+    else
+      return null;
+  }
+
+  public function enter() {
+    return pn_data_enter($this->impl);
+  }
+
+  public function exit_() {
+    return pn_data_exit($this->impl);
+  }
+
+  public function type() {
+    $dtype = pn_data_type($this->impl);
+    if ($dtype == -1)
+      return null;
+    else
+      return $dtype;
+  }
+
+  public function encode() {
+    $size = 1024;
+    while (true) {
+      list($cd, $enc) = pn_data_encode($this->impl, $size);
+      if ($cd == PN_OVERFLOW)
+        $size *= 2;
+      else if ($cd >= 0)
+        return $enc;
+      else
+        $this->_check($cd);
+    }
+  }
+
+  public function decode($encoded) {
+    return $this->_check(pn_data_decode($this->impl, $encoded));
+  }
+
+  public function put_list() {
+    $this->_check(pn_data_put_list($this->impl));
+  }
+
+  public function put_map() {
+    $this->_check(pn_data_put_map($this->impl));
+  }
+
+  public function put_array($described, $element_type) {
+    $this->_check(pn_data_put_array($this->impl, $described, $element_type));
+  }
+
+  public function put_described() {
+    $this->_check(pn_data_put_described($this->impl));
+  }
+
+  public function put_null() {
+    $this->_check(pn_data_put_null($this->impl));
+  }
+
+  public function put_bool($b) {
+    $this->_check(pn_data_put_bool($this->impl, $b));
+  }
+
+  public function put_ubyte($ub) {
+    $this->_check(pn_data_put_ubyte($this->impl, $ub));
+  }
+
+  public function put_byte($b) {
+    $this->_check(pn_data_put_byte($this->impl, $b));
+  }
+
+  public function put_ushort($us) {
+    $this->_check(pn_data_put_ushort($this->impl, $us));
+  }
+
+  public function put_short($s) {
+    $this->_check(pn_data_put_short($this->impl, $s));
+  }
+
+  public function put_uint($ui) {
+    $this->_check(pn_data_put_uint($this->impl, $ui));
+  }
+
+  public function put_int($i) {
+    $this->_check(pn_data_put_int($this->impl, $i));
+  }
+
+  public function put_char($c) {
+    $this->_check(pn_data_put_char($this->impl, ord($c)));
+  }
+
+  public function put_ulong($ul) {
+    $this->_check(pn_data_put_ulong($this->impl, $ul));
+  }
+
+  public function put_long($l) {
+    $this->_check(pn_data_put_long($this->impl, $l));
+  }
+
+  public function put_timestamp($t) {
+    $this->_check(pn_data_put_timestamp($this->impl, $t));
+  }
+
+  public function put_float($f) {
+    $this->_check(pn_data_put_float($this->impl, $f));
+  }
+
+  public function put_double($d) {
+    $this->_check(pn_data_put_double($this->impl, $d));
+  }
+
+  public function put_decimal32($d) {
+    $this->_check(pn_data_put_decimal32($this->impl, $d));
+  }
+
+  public function put_decimal64($d) {
+    $this->_check(pn_data_put_decimal64($this->impl, $d));
+  }
+
+  public function put_decimal128($d) {
+    $this->_check(pn_data_put_decimal128($this->impl, $d));
+  }
+
+  public function put_uuid($u) {
+    $this->_check(pn_data_put_uuid($this->impl, $u->bytes));
+  }
+
+  public function put_binary($b) {
+    $this->_check(pn_data_put_binary($this->impl, $b));
+  }
+
+  public function put_string($s) {
+    $this->_check(pn_data_put_string($this->impl, $s));
+  }
+
+  public function put_symbol($s) {
+    $this->_check(pn_data_put_symbol($this->impl, $s));
+  }
+
+  public function get_list() {
+    return pn_data_get_list($this->impl);
+  }
+
+  public function get_map() {
+    return pn_data_get_map($this->impl);
+  }
+
+  public function get_array() {
+    $count = pn_data_get_array($this->impl);
+    $described = pn_data_is_array_described($this->impl);
+    $type = pn_data_get_array_type($this->impl);
+    if ($type == -1)
+      $type = null;
+    return array($count, $described, $type);
+  }
+
+  public function is_described() {
+    return pn_data_is_described($this->impl);
+  }
+
+  public function is_null() {
+    $this->_check(pn_data_get_null($this->impl));
+  }
+
+  public function get_bool() {
+    return pn_data_get_bool($this->impl);
+  }
+
+  public function get_ubyte() {
+    return pn_data_get_ubyte($this->impl);
+  }
+
+  public function get_byte() {
+    return pn_data_get_byte($this->impl);
+  }
+
+  public function get_ushort() {
+    return pn_data_get_ushort($this->impl);
+  }
+
+  public function get_short() {
+    return pn_data_get_short($this->impl);
+  }
+
+  public function get_uint() {
+    return pn_data_get_uint($this->impl);
+  }
+
+  public function get_int() {
+    return pn_data_get_int($this->impl);
+  }
+
+  public function get_char() {
+    return unichr(pn_data_get_char($this->impl));
+  }
+
+  public function get_ulong() {
+    return pn_data_get_ulong($this->impl);
+  }
+
+  public function get_long() {
+    return pn_data_get_long($this->impl);
+  }
+
+  public function get_timestamp() {
+    return pn_data_get_timestamp($this->impl);
+  }
+
+  public function get_float() {
+    return pn_data_get_float($this->impl);
+  }
+
+  public function get_double() {
+    return pn_data_get_double($this->impl);
+  }
+
+  # XXX: need to convert
+  public function get_decimal32() {
+    return pn_data_get_decimal32($this->impl);
+  }
+
+  # XXX: need to convert
+  public function get_decimal64() {
+    return pn_data_get_decimal64($this->impl);
+  }
+
+  # XXX: need to convert
+  public function get_decimal128() {
+    return pn_data_get_decimal128($this->impl);
+  }
+
+  public function get_uuid() {
+    if (pn_data_type($this->impl) == Data::UUID)
+      return uuid.UUID($bytes=pn_data_get_uuid($this->impl));
+    else
+      return null;
+  }
+
+  public function get_binary() {
+    return pn_data_get_binary($this->impl);
+  }
+
+  public function get_string() {
+    return pn_data_get_string($this->impl);
+  }
+
+  public function get_symbol() {
+    return pn_data_get_symbol($this->impl);
+  }
+
+  public function copy($src) {
+    $this->_check(pn_data_copy($this->impl, $src->impl));
+  }
+
+  public function format() {
+    $sz = 16;
+    while (true) {
+      list($err, $result) = pn_data_format($this->impl, $sz);
+      if ($err == PN_OVERFLOW) {
+        $sz *= 2;
+        continue;
+      } else {
+        $this->_check($err);
+        return $result;
+      }
+    }
+  }
+
+  public function dump() {
+    pn_data_dump($this->impl);
+  }
+
+  public function put_php_array($ary) {
+    $this->put_map();
+    $this->enter();
+    try {
+      foreach ($ary as $k => $v) {
+        $this->put_object($k);
+        $this->put_object($v);
+      }
+      $this->exit_();
+    } catch (Exception $e) {
+      $this->exit_();
+      throw $e;
+    }
+  }
+
+  public function get_php_array() {
+    if ($this->enter()) {
+      try {
+        $result = array();
+        while ($this->next()) {
+          $k = $this->get_object();
+          if ($this->next())
+            $v = $this->get_object();
+          else
+            $v = null;
+          $result[$k] = $v;
+        }
+        $this->exit_();
+      } catch (Exception $e) {
+        $this->exit_();
+        throw $e;
+      }
+      return $result;
+    }
+  }
+
+  private $put_mappings = array
+    ("null" => "put_null",
+     "array" => "put_php_array",
+     "string" => "put_string",
+     "integer" => "put_long",
+     "double" => "put_double");
+  private $get_mappings = array
+    (Data::NULL => "get_null",
+     Data::MAP => "get_php_array",
+     Data::STRING => "get_string",
+     Data::BYTE => "get_byte",
+     Data::UBYTE => "get_ubyte",
+     Data::SHORT => "get_short",
+     Data::USHORT => "get_ushort",
+     Data::INT => "get_int",
+     Data::UINT => "get_uint",
+     Data::LONG => "get_long",
+     Data::ULONG => "get_ulong",
+     Data::FLOAT => "get_float",
+     Data::DOUBLE => "get_double");
+
+  public function put_object($obj) {
+    $type = gettype($obj);
+    $putter = $this->put_mappings[$type];
+    if ($putter == null)
+      throw new DataException("unknown type: $type");
+    $this->$putter($obj);
+  }
+
+  public function get_object() {
+    $type = $this->type();
+    if ($type == null) return null;
+    $getter = $this->get_mappings[$type];
+    if ($getter == null)
+      throw new DataException("unknown type: $type");
+    return $this->$getter();
+  }
+
+}
+
+?>



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to