http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c9bb9ff/proton-c/bindings/php/get_include_dir.php ---------------------------------------------------------------------- diff --git a/proton-c/bindings/php/get_include_dir.php b/proton-c/bindings/php/get_include_dir.php deleted file mode 100644 index 6103e41..0000000 --- a/proton-c/bindings/php/get_include_dir.php +++ /dev/null @@ -1,55 +0,0 @@ -<?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. - * -*/ - - -$prefix = $argv[1]; -$include_path = ini_get("include_path"); - -$php_dir = null; -$pear_dir = null; -$abs_dir = null; - -foreach (explode(PATH_SEPARATOR, $include_path) as $include_dir) { - if (strpos($include_dir, ".") === false && - strpos($include_dir, $prefix) === 0) { - $abs_dir = $include_dir; - $suffix = substr($abs_dir, strlen($prefix)); - if (strpos($suffix, "php") !== false) { - $php_dir = $abs_dir; - } - if (strpos($suffix, "pear") !== false) { - $pear_dir = $abs_dir; - } - } -} - -if ($php_dir) { - print $php_dir; -} else if ($pear_dir) { - print $pear_dir; -} else if ($abs_dir) { - print $abs_dir; -} - -print "\n"; - -?>
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c9bb9ff/proton-c/bindings/php/php.i ---------------------------------------------------------------------- diff --git a/proton-c/bindings/php/php.i b/proton-c/bindings/php/php.i deleted file mode 100644 index 6e927f7..0000000 --- a/proton-c/bindings/php/php.i +++ /dev/null @@ -1,229 +0,0 @@ -/* - * 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. - */ - -%module cproton - -// provided by SWIG development libraries -%include php.swg - -#if SWIG_VERSION < 0x020000 -%include compat.swg -#endif - -%header %{ -/* Include the headers needed by the code in this wrapper file */ -#include <proton/types.h> -#include <proton/connection.h> -#include <proton/condition.h> -#include <proton/delivery.h> -#include <proton/event.h> -#include <proton/message.h> -#include <proton/messenger.h> -#include <proton/session.h> -#include <proton/url.h> -#include <proton/reactor.h> -#include <proton/handlers.h> -#include <proton/sasl.h> - -#define zend_error_noreturn zend_error -%} - -%apply (char *STRING, int LENGTH) { (char *STRING, size_t LENGTH) }; - -// ssize_t return value -// -%typemap(out) ssize_t { - ZVAL_LONG($result, (long)$1); -} - -// (char **OUTPUT_BUFFER, ssize_t *OUTPUT_LEN) -// -// typemap for binary buffer output arguments. Given an uninitialized pointer for a -// buffer (OUTPUT_BUFFER) and a pointer to an un-initialized size/error (OUTPUT_LEN), a buffer -// will be allocated and filled with binary data. *OUTPUT_BUFFER will be set to the address -// of the allocated buffer. *OUTPUT_LEN will be set to the size of the data. The maximum -// length of the buffer must be provided by a separate argument. -// -// The return value is an array, with [0] set to the length of the output buffer OR an -// error code and [1] set to the returned string object. This value is appended to the -// function's return value (also an array). -// -%typemap(in,numinputs=0) (char **OUTPUT_BUFFER, ssize_t *OUTPUT_LEN) (char *Buff = 0, ssize_t outLen = 0) { - // setup locals for output. - $1 = &Buff; - $2 = &outLen; -} -%typemap(argout,fragment="t_output_helper") (char **OUTPUT_BUFFER, ssize_t *OUTPUT_LEN) { - // convert to array: [0]=len||error, [1]=binary string - zval *tmp; - ALLOC_INIT_ZVAL(tmp); - array_init(tmp); - ssize_t len = *($2); - add_next_index_long(tmp, len); // write the len|error code - if (len >= 0) { - add_next_index_stringl(tmp, *($1), len, 0); // 0 == take ownership of $1 memory - } else { - add_next_index_string(tmp, "", 1); // 1 = strdup the "" - } - 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); -} - -%typemap(in) pn_uuid_t { - memmove($1.bytes, Z_STRVAL_PP($input), 16); -} - -%typemap(out) pn_uuid_t { - ZVAL_STRINGL($result, $1.bytes, 16, 1); -} - -%typemap(in) pn_decimal128_t { - memmove($1.bytes, Z_STRVAL_PP($input), 16); -} - -%typemap(out) pn_decimal128_t { - ZVAL_STRINGL($result, $1.bytes, 16, 1); -} - -// The PHP SWIG typedefs define the typemap STRING, LENGTH to be binary safe (allow -// embedded \0's). -// - -// allow pn_link_send/pn_input's input buffer to be binary safe -ssize_t pn_link_send(pn_link_t *transport, char *STRING, size_t LENGTH); -%ignore pn_link_send; -ssize_t pn_transport_input(pn_transport_t *transport, char *STRING, size_t LENGTH); -%ignore pn_transport_input; - - -// Use the OUTPUT_BUFFER,OUTPUT_LEN typemap to allow these functions to return -// variable length binary data. - -%rename(pn_link_recv) wrap_pn_link_recv; -// in PHP: array = pn_link_recv(link, MAXLEN); -// array[0] = size || error code -// array[1] = native string containing binary data -%inline %{ - void wrap_pn_link_recv(pn_link_t *link, size_t maxCount, char **OUTPUT_BUFFER, ssize_t *OUTPUT_LEN) { - *OUTPUT_BUFFER = emalloc(sizeof(char) * maxCount); - *OUTPUT_LEN = pn_link_recv(link, *OUTPUT_BUFFER, maxCount ); - } -%} -%ignore pn_link_recv; - -%rename(pn_transport_output) wrap_pn_transport_output; -// 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_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; - - - -// -// allow pn_delivery/pn_delivery_tag to accept a binary safe string: -// - -%rename(pn_delivery) wrap_pn_delivery; -// in PHP: delivery = pn_delivery(link, "binary safe string"); -// -%inline %{ - pn_delivery_t *wrap_pn_delivery(pn_link_t *link, char *STRING, size_t LENGTH) { - return pn_delivery(link, pn_dtag(STRING, LENGTH)); - } -%} -%ignore pn_delivery; - -// pn_delivery_tag: output a copy of the pn_delivery_tag buffer -// -%typemap(in,numinputs=0) (const char **RETURN_STRING, size_t *RETURN_LEN) (char *Buff = 0, size_t outLen = 0) { - $1 = &Buff; // setup locals for holding output values. - $2 = &outLen; -} -%typemap(argout) (const char **RETURN_STRING, size_t *RETURN_LEN) { - // This allocates a copy of the binary buffer for return to the caller - ZVAL_STRINGL($result, *($1), *($2), 1); // 1 = duplicate the input buffer -} - -// Suppress "Warning(451): Setting a const char * variable may leak memory." on pn_delivery_tag_t -%warnfilter(451) pn_delivery_tag_t; -%rename(pn_delivery_tag) wrap_pn_delivery_tag; -// in PHP: str = pn_delivery_tag(delivery); -// -%inline %{ - void wrap_pn_delivery_tag(pn_delivery_t *d, const char **RETURN_STRING, size_t *RETURN_LEN) { - pn_delivery_tag_t tag = pn_delivery_tag(d); - *RETURN_STRING = tag.start; - *RETURN_LEN = tag.size; - } -%} -%ignore pn_delivery_tag; - - - -// -// reference counter management for passing a context to/from the listener/connector -// - -%typemap(in) void *PHP_CONTEXT { - // since we hold a pointer to the context we must increment the reference count - Z_ADDREF_PP($input); - $1 = *$input; -} - -// return the context. Apparently, PHP won't let us return a pointer to a reference -// counted zval, so we must return a copy of the data -%typemap(out) void * { - *$result = *(zval *)($1); - zval_copy_ctor($result); -} - -%include "proton/cproton.i" http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c9bb9ff/proton-c/bindings/php/proton.ini.in ---------------------------------------------------------------------- diff --git a/proton-c/bindings/php/proton.ini.in b/proton-c/bindings/php/proton.ini.in deleted file mode 100644 index 51a774e..0000000 --- a/proton-c/bindings/php/proton.ini.in +++ /dev/null @@ -1,21 +0,0 @@ -;; -; 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. -;; - -; Enable cproton extension module -@PROTON_INI@ http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c9bb9ff/proton-c/bindings/php/proton.php ---------------------------------------------------------------------- diff --git a/proton-c/bindings/php/proton.php b/proton-c/bindings/php/proton.php deleted file mode 100644 index 8cad1b2..0000000 --- a/proton-c/bindings/php/proton.php +++ /dev/null @@ -1,1119 +0,0 @@ -<?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 {} - -function code2exc($err) { - switch ($err) { - case PN_TIMEOUT: - return "Timeout"; - default: - return null; - } -} - -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 = code2exc($value); - if ($exc == null) $exc = "MessengerException"; - throw new $exc("[$value]: " . pn_error_text(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); - case "incoming": - return $this->incoming(); - case "outgoing": - return $this->outgoing(); - 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; - case "outgoing_window": - $this->_check(pn_messenger_set_outgoing_window($this->impl, $value)); - break; - case "incoming_window": - $this->_check(pn_messenger_set_incoming_window($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) { - if ($source == null) { - throw new MessengerException("null source passed to subscribe"); - } - $this->_check(pn_messenger_subscribe($this->impl, $source)); - } - - public function outgoing_tracker() { - return pn_messenger_outgoing_tracker($this->impl); - } - - public function put($message) { - $message->_pre_encode(); - $this->_check(pn_messenger_put($this->impl, $message->impl)); - return $this->outgoing_tracker(); - } - - public function send($n = -1) { - $this->_check(pn_messenger_send($this->impl, $n)); - } - - public function recv($n = -1) { - $this->_check(pn_messenger_recv($this->impl, $n)); - } - - public function incoming_tracker() { - return pn_messenger_incoming_tracker($this->impl); - } - - public function get($message) { - $this->_check(pn_messenger_get($this->impl, $message->impl)); - $message->_post_decode(); - return $this->incoming_tracker(); - } - - public function accept($tracker = null) { - if ($tracker == null) { - $tracker = $this->incoming_tracker(); - $flag = PN_CUMULATIVE; - } else { - $flag = 0; - } - $this->_check(pn_messenger_accept($this->impl, $tracker, $flag)); - } - - public function reject($tracker = null) { - if ($tracker == null) { - $tracker = $this->incoming_tracker(); - $flag = PN_CUMULATIVE; - } else { - $flag = 0; - } - $this->_check(pn_messenger_reject($this->impl, $tracker, $flag)); - } - - public function route($pattern, $address) { - $this->_check(pn_messenger_route($this->impl, $pattern, $address)); - } - - public function outgoing() { - return pn_messenger_outgoing($this->impl); - } - - public function incoming() { - return pn_messenger_incoming($this->impl); - } - - public function status($tracker) { - return pn_messenger_status($this->impl, $tracker); - } - -} - -class Message { - - const DEFAULT_PRIORITY = PN_DEFAULT_PRIORITY; - - var $impl; - var $_id; - var $_correlation_id; - public $instructions = null; - public $annotations = null; - public $properties = null; - public $body = null; - - public function __construct() { - $this->impl = pn_message(); - $this->_id = new Data(pn_message_id($this->impl)); - $this->_correlation_id = new Data(pn_message_correlation_id($this->impl)); - } - - public function __destruct() { - pn_message_free($this->impl); - } - - public function __tostring() { - $tmp = pn_string(""); - pn_inspect($this->impl, $tmp); - $result = pn_string_get($tmp); - pn_free($tmp); - return $result; - } - - private function _check($value) { - if ($value < 0) { - $exc = code2exc($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 = new 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); - - $body->clear(); - if ($this->body != null) { - $body->put_object($this->body); - } - } - - 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 = new 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 - $this->annotations = null; - if ($props->next()) - $this->properties = $props->get_object(); - else - $this->properties = null; - if ($body->next()) - $this->body = $body->get_object(); - else - $this->body = null; - } - - public function clear() { - pn_message_clear($this->impl); - $this->instructions = null; - $this->annotations = null; - $this->properties = null; - $this->body = null; - } - - private function _get_inferred() { - return pn_message_is_inferred($this->impl); - } - - private function _set_inferred($value) { - $this->_check(pn_message_set_inferred($this->impl, $value)); - } - - private function _get_durable() { - return pn_message_is_durable($this->impl); - } - - private function _set_durable($value) { - $this->_check(pn_message_set_durable($this->impl, $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 _get_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, $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)); - } - - private function _get_id() { - return $this->_id->get_object(); - } - - private function _set_id($value) { - $this->_id->rewind(); - $this->_id->put_object($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)); - } - - private function _get_correlation_id() { - return $this->_correlation_id->get_object(); - } - - private function _set_correlation_id($value) { - $this->_correlation_id->rewind(); - $this->_correlation_id->put_object($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)); - } - - 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(); - } -} - -class Binary { - - public $bytes; - - public function __construct($bytes) { - $this->bytes = $bytes; - } - - public function __tostring() { - return "Binary($this->bytes)"; - } - -} - -class Symbol { - - public $name; - - public function __construct($name) { - $this->name = $name; - } - - public function __tostring() { - return "Symbol($this->name)"; - } - -} - -class UUID { - - public $bytes; - - public function __construct($bytes) { - if (strlen($bytes) != 16) { - throw new Exception("invalid argument: exactly 16 bytes required"); - } - $this->bytes = $bytes; - } - - public function __tostring() { - $b = $this->bytes; - return sprintf("UUID(%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x)", - ord($b[0]), ord($b[1]), ord($b[2]), ord($b[3]), - ord($b[4]), ord($b[5]), ord($b[6]), ord($b[7]), ord($b[8]), ord($b[9]), - ord($b[10]), ord($b[11]), ord($b[12]), ord($b[13]), ord($b[14]), ord($b[15])); - } - -} - -class PList { - - public $elements; - - public function __construct() { - $this->elements = func_get_args(); - } - - public function __tostring() { - return "PList(" . implode(", ", $this->elements) . ")"; - } - -} - -class Char { - - public $codepoint; - - public function __construct($codepoint) { - $this->codepoint = $codepoint; - } - - public function __tostring() { - return "Char($this->codepoint)"; - } - -} - -class Described { - - public $descriptor; - public $value; - - public function __construct($descriptor, $value) { - $this->descriptor = $descriptor; - $this->value = $value; - } - - public function __tostring() { - return "Described($this->descriptor, $this->value)"; - } - -} - -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_DESCRIBED; - const PARRAY = PN_ARRAY; - const PLIST = 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 = code2exc($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) { - if ($c instanceof Char) { - $c = $c->codepoint; - } else { - $c = ord($c); - } - $this->_check(pn_data_put_char($this->impl, $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) { - if ($u instanceof UUID) { - $u = $u->bytes; - } - $this->_check(pn_data_put_uuid($this->impl, $u)); - } - - public function put_binary($b) { - if ($b instanceof Binary) { - $b = $b->bytes; - } - $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) { - if ($s instanceof Symbol) { - $s = $s->name; - } - $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 new Char(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 new UUID(pn_data_get_uuid($this->impl)); - else - return null; - } - - public function get_binary() { - return new Binary(pn_data_get_binary($this->impl)); - } - - public function get_string() { - return pn_data_get_string($this->impl); - } - - public function get_symbol() { - return new Symbol(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 get_null() { - return null; - } - - public function get_php_described() { - if ($this->enter()) { - try { - $this->next(); - $descriptor = $this->get_object(); - $this->next(); - $value = $this->get_object(); - $this->exit_(); - } catch (Exception $e) { - $this->exit_(); - throw $e; - } - return new Described($descriptor, $value); - } - } - - public function get_php_array() { - if ($this->enter()) { - try { - $result = array(); - while ($this->next()) { - $result[] = $this->get_object(); - } - $this->exit_(); - } catch (Exception $e) { - $this->exit_(); - throw $e; - } - return $result; - } - } - - public function put_php_list($lst) { - $this->put_list(); - $this->enter(); - try { - foreach ($lst->elements as $e) { - $this->put_object($e); - } - $this->exit_(); - } catch (Exception $e) { - $this->exit_(); - throw $e; - } - } - - public function get_php_list() { - if ($this->enter()) { - try { - $result = new PList(); - while ($this->next()) { - $result->elements[] = $this->get_object(); - } - $this->exit_(); - } catch (Exception $e) { - $this->exit_(); - throw $e; - } - - return $result; - } - } - - public function put_php_map($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_map() { - if ($this->enter()) { - try { - $result = array(); - while ($this->next()) { - $k = $this->get_object(); - switch ($this->type()) { - case Data::BINARY: - $k = $k->bytes; - break; - case Data::SYMBOL: - $k = $k->name; - break; - case Data::STRING: - case Data::UBYTE: - case Data::BYTE: - case Data::USHORT: - case Data::SHORT: - case Data::UINT: - case Data::INT: - case Data::ULONG: - case Data::LONG: - break; - default: - $k = "$k"; - break; - } - 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", - "boolean" => "put_bool", - "UUID" => "put_uuid", - "string" => "put_string", - "Binary" => "put_binary", - "Symbol" => "put_symbol", - "integer" => "put_long", - "Char" => "put_char", - "double" => "put_double", - "Described" => "put_php_described", - "PList" => "put_php_list", - "array" => "put_php_map" - ); - private $get_mappings = array - (Data::NULL => "get_null", - Data::BOOL => "get_bool", - Data::UBYTE => "get_ubyte", - Data::BYTE => "get_byte", - Data::USHORT => "get_ushort", - Data::SHORT => "get_short", - Data::UINT => "get_uint", - Data::INT => "get_int", - Data::CHAR => "get_char", - Data::ULONG => "get_ulong", - Data::LONG => "get_long", - Data::TIMESTAMP => "get_timestamp", - Data::FLOAT => "get_float", - Data::DOUBLE => "get_double", - Data::DECIMAL32 => "get_decimal32", - Data::DECIMAL64 => "get_decimal64", - Data::DECIMAL128 => "get_decimal128", - Data::UUID => "get_uuid", - Data::BINARY => "get_binary", - Data::STRING => "get_string", - Data::SYMBOL => "get_symbol", - Data::DESCRIBED => "get_php_described", - Data::PARRAY => "get_php_array", - Data::PLIST => "get_php_list", - Data::MAP => "get_php_map" - ); - - public function put_object($obj) { - $type = gettype($obj); - if ($type == "object") { - $type = get_class($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]; - return $this->$getter(); - } - -} - -?> http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c9bb9ff/proton-c/bindings/php/tests.php ---------------------------------------------------------------------- diff --git a/proton-c/bindings/php/tests.php b/proton-c/bindings/php/tests.php deleted file mode 100644 index 8ae45cf..0000000 --- a/proton-c/bindings/php/tests.php +++ /dev/null @@ -1,64 +0,0 @@ -<?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("proton.php"); - -function round_trip($body) { - $msg = new Message(); - $msg->inferred = true; - $msg->durable = true; - $msg->id = 10; - $msg->correlation_id = "asdf"; - $msg->properties = array(); - $msg->properties["null"] = null; - $msg->properties["boolean"] = true; - $msg->properties["integer"] = 123; - $msg->properties["double"] = 3.14159; - $msg->properties["binary"] = new Binary("binary"); - $msg->properties["symbol"] = new Symbol("symbol"); - $msg->properties["uuid"] = new UUID("1234123412341234"); - $msg->properties["list"] = new PList(1, 2, 3, 4); - $msg->properties["char"] = new Char(321); - $msg->body = $body; - assert($msg->id == 10); - assert($msg->correlation_id == "asdf"); - - $copy = new Message(); - $copy->decode($msg->encode()); - assert($copy->id == $msg->id); - assert($copy->correlation_id == $msg->correlation_id); - $diff = array_diff($msg->properties, $copy->properties); - assert($copy->durable == $msg->durable); - assert(count($diff) == 0); - assert($copy->body == $msg->body); -} - -round_trip("this is a string body"); -round_trip(new Binary("this is a binary body")); -round_trip(new Symbol("this is a symbol body")); -round_trip(true); -round_trip(1234); -round_trip(3.14159); -round_trip(array("pi" => 3.14159, "blueberry-pi" => "yummy")); - -?> http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c9bb9ff/proton-c/bindings/python/proton/__init__.py ---------------------------------------------------------------------- diff --git a/proton-c/bindings/python/proton/__init__.py b/proton-c/bindings/python/proton/__init__.py index 1878d57..60f7323 100644 --- a/proton-c/bindings/python/proton/__init__.py +++ b/proton-c/bindings/python/proton/__init__.py @@ -23,7 +23,6 @@ protocol. The proton APIs consist of the following classes: - - L{Messenger} -- A messaging endpoint. - L{Message} -- A class for creating and/or accessing AMQP message content. - L{Data} -- A class for creating and/or accessing arbitrary AMQP encoded data. @@ -166,13 +165,6 @@ class Interrupt(ProtonException): """ pass -class MessengerException(ProtonException): - """ - The root of the messenger exception hierarchy. All exceptions - generated by the messenger class derive from this exception. - """ - pass - class MessageException(ProtonException): """ The MessageException class is the root of the message exception @@ -205,600 +197,6 @@ STATUSES = { PN_STATUS_UNKNOWN: None } -AUTOMATIC = Constant("AUTOMATIC") -MANUAL = Constant("MANUAL") - -class Messenger(object): - """ - The L{Messenger} class defines a high level interface for sending - and receiving L{Messages<Message>}. Every L{Messenger} contains a - single logical queue of incoming messages and a single logical queue - of outgoing messages. These messages in these queues may be destined - for, or originate from, a variety of addresses. - - The messenger interface is single-threaded. All methods - except one (L{interrupt}) are intended to be used from within - the messenger thread. - - - Address Syntax - ============== - - An address has the following form:: - - [ amqp[s]:// ] [user[:password]@] domain [/[name]] - - Where domain can be one of:: - - host | host:port | ip | ip:port | name - - The following are valid examples of addresses: - - - example.org - - example.org:1234 - - amqp://example.org - - amqps://example.org - - example.org/incoming - - amqps://example.org/outgoing - - amqps://fred:[email protected] - - 127.0.0.1:1234 - - amqps://127.0.0.1:1234 - - Sending & Receiving Messages - ============================ - - The L{Messenger} class works in conjunction with the L{Message} class. The - L{Message} class is a mutable holder of message content. - - The L{put} method copies its L{Message} to the outgoing queue, and may - send queued messages if it can do so without blocking. The L{send} - method blocks until it has sent the requested number of messages, - or until a timeout interrupts the attempt. - - - >>> message = Message() - >>> for i in range(3): - ... message.address = "amqp://host/queue" - ... message.subject = "Hello World %i" % i - ... messenger.put(message) - >>> messenger.send() - - Similarly, the L{recv} method receives messages into the incoming - queue, and may block as it attempts to receive the requested number - of messages, or until timeout is reached. It may receive fewer - than the requested number. The L{get} method pops the - eldest L{Message} off the incoming queue and copies it into the L{Message} - object that you supply. It will not block. - - - >>> message = Message() - >>> messenger.recv(10): - >>> while messenger.incoming > 0: - ... messenger.get(message) - ... print message.subject - Hello World 0 - Hello World 1 - Hello World 2 - - The blocking flag allows you to turn off blocking behavior entirely, - in which case L{send} and L{recv} will do whatever they can without - blocking, and then return. You can then look at the number - of incoming and outgoing messages to see how much outstanding work - still remains. - """ - - def __init__(self, name=None): - """ - Construct a new L{Messenger} with the given name. The name has - global scope. If a NULL name is supplied, a UUID based name will - be chosen. - - @type name: string - @param name: the name of the messenger or None - - """ - self._mng = pn_messenger(name) - self._selectables = {} - - def __del__(self): - """ - Destroy the L{Messenger}. This will close all connections that - are managed by the L{Messenger}. Call the L{stop} method before - destroying the L{Messenger}. - """ - if hasattr(self, "_mng"): - pn_messenger_free(self._mng) - del self._mng - - def _check(self, err): - if err < 0: - if (err == PN_INPROGRESS): - return - exc = EXCEPTIONS.get(err, MessengerException) - raise exc("[%s]: %s" % (err, pn_error_text(pn_messenger_error(self._mng)))) - else: - return err - - @property - def name(self): - """ - The name of the L{Messenger}. - """ - return pn_messenger_name(self._mng) - - def _get_certificate(self): - return pn_messenger_get_certificate(self._mng) - - def _set_certificate(self, value): - self._check(pn_messenger_set_certificate(self._mng, value)) - - certificate = property(_get_certificate, _set_certificate, - doc=""" -Path to a certificate file for the L{Messenger}. This certificate is -used when the L{Messenger} accepts or establishes SSL/TLS connections. -This property must be specified for the L{Messenger} to accept -incoming SSL/TLS connections and to establish client authenticated -outgoing SSL/TLS connection. Non client authenticated outgoing SSL/TLS -connections do not require this property. -""") - - def _get_private_key(self): - return pn_messenger_get_private_key(self._mng) - - def _set_private_key(self, value): - self._check(pn_messenger_set_private_key(self._mng, value)) - - private_key = property(_get_private_key, _set_private_key, - doc=""" -Path to a private key file for the L{Messenger's<Messenger>} -certificate. This property must be specified for the L{Messenger} to -accept incoming SSL/TLS connections and to establish client -authenticated outgoing SSL/TLS connection. Non client authenticated -SSL/TLS connections do not require this property. -""") - - def _get_password(self): - return pn_messenger_get_password(self._mng) - - def _set_password(self, value): - self._check(pn_messenger_set_password(self._mng, value)) - - password = property(_get_password, _set_password, - doc=""" -This property contains the password for the L{Messenger.private_key} -file, or None if the file is not encrypted. -""") - - def _get_trusted_certificates(self): - return pn_messenger_get_trusted_certificates(self._mng) - - def _set_trusted_certificates(self, value): - self._check(pn_messenger_set_trusted_certificates(self._mng, value)) - - trusted_certificates = property(_get_trusted_certificates, - _set_trusted_certificates, - doc=""" -A path to a database of trusted certificates for use in verifying the -peer on an SSL/TLS connection. If this property is None, then the peer -will not be verified. -""") - - def _get_timeout(self): - t = pn_messenger_get_timeout(self._mng) - if t == -1: - return None - else: - return millis2secs(t) - - def _set_timeout(self, value): - if value is None: - t = -1 - else: - t = secs2millis(value) - self._check(pn_messenger_set_timeout(self._mng, t)) - - timeout = property(_get_timeout, _set_timeout, - doc=""" -The timeout property contains the default timeout for blocking -operations performed by the L{Messenger}. -""") - - def _is_blocking(self): - return pn_messenger_is_blocking(self._mng) - - def _set_blocking(self, b): - self._check(pn_messenger_set_blocking(self._mng, b)) - - blocking = property(_is_blocking, _set_blocking, - doc=""" -Enable or disable blocking behavior during L{Message} sending -and receiving. This affects every blocking call, with the -exception of L{work}. Currently, the affected calls are -L{send}, L{recv}, and L{stop}. -""") - - def _is_passive(self): - return pn_messenger_is_passive(self._mng) - - def _set_passive(self, b): - self._check(pn_messenger_set_passive(self._mng, b)) - - passive = property(_is_passive, _set_passive, - doc=""" -When passive is set to true, Messenger will not attempt to perform I/O -internally. In this mode it is necessary to use the selectables API to -drive any I/O needed to perform requested actions. In this mode -Messenger will never block. -""") - - def _get_incoming_window(self): - return pn_messenger_get_incoming_window(self._mng) - - def _set_incoming_window(self, window): - self._check(pn_messenger_set_incoming_window(self._mng, window)) - - incoming_window = property(_get_incoming_window, _set_incoming_window, - doc=""" -The incoming tracking window for the messenger. The messenger will -track the remote status of this many incoming deliveries after they -have been accepted or rejected. Defaults to zero. - -L{Messages<Message>} enter this window only when you take them into your application -using L{get}. If your incoming window size is I{n}, and you get I{n}+1 L{messages<Message>} -without explicitly accepting or rejecting the oldest message, then the -message that passes beyond the edge of the incoming window will be assigned -the default disposition of its link. -""") - - def _get_outgoing_window(self): - return pn_messenger_get_outgoing_window(self._mng) - - def _set_outgoing_window(self, window): - self._check(pn_messenger_set_outgoing_window(self._mng, window)) - - outgoing_window = property(_get_outgoing_window, _set_outgoing_window, - doc=""" -The outgoing tracking window for the messenger. The messenger will -track the remote status of this many outgoing deliveries after calling -send. Defaults to zero. - -A L{Message} enters this window when you call the put() method with the -message. If your outgoing window size is I{n}, and you call L{put} I{n}+1 -times, status information will no longer be available for the -first message. -""") - - def start(self): - """ - Currently a no-op placeholder. - For future compatibility, do not L{send} or L{recv} messages - before starting the L{Messenger}. - """ - self._check(pn_messenger_start(self._mng)) - - def stop(self): - """ - Transitions the L{Messenger} to an inactive state. An inactive - L{Messenger} will not send or receive messages from its internal - queues. A L{Messenger} should be stopped before being discarded to - ensure a clean shutdown handshake occurs on any internally managed - connections. - """ - self._check(pn_messenger_stop(self._mng)) - - @property - def stopped(self): - """ - Returns true iff a L{Messenger} is in the stopped state. - This function does not block. - """ - return pn_messenger_stopped(self._mng) - - def subscribe(self, source): - """ - Subscribes the L{Messenger} to messages originating from the - specified source. The source is an address as specified in the - L{Messenger} introduction with the following addition. If the - domain portion of the address begins with the '~' character, the - L{Messenger} will interpret the domain as host/port, bind to it, - and listen for incoming messages. For example "~0.0.0.0", - "amqp://~0.0.0.0", and "amqps://~0.0.0.0" will all bind to any - local interface and listen for incoming messages with the last - variant only permitting incoming SSL connections. - - @type source: string - @param source: the source of messages to subscribe to - """ - sub_impl = pn_messenger_subscribe(self._mng, source) - if not sub_impl: - self._check(pn_error_code(pn_messenger_error(self._mng))) - raise MessengerException("Cannot subscribe to %s"%source) - return Subscription(sub_impl) - - def put(self, message): - """ - Places the content contained in the message onto the outgoing - queue of the L{Messenger}. This method will never block, however - it will send any unblocked L{Messages<Message>} in the outgoing - queue immediately and leave any blocked L{Messages<Message>} - remaining in the outgoing queue. The L{send} call may be used to - block until the outgoing queue is empty. The L{outgoing} property - may be used to check the depth of the outgoing queue. - - When the content in a given L{Message} object is copied to the outgoing - message queue, you may then modify or discard the L{Message} object - without having any impact on the content in the outgoing queue. - - This method returns an outgoing tracker for the L{Message}. The tracker - can be used to determine the delivery status of the L{Message}. - - @type message: Message - @param message: the message to place in the outgoing queue - @return: a tracker - """ - message._pre_encode() - self._check(pn_messenger_put(self._mng, message._msg)) - return pn_messenger_outgoing_tracker(self._mng) - - def status(self, tracker): - """ - Gets the last known remote state of the delivery associated with - the given tracker. - - @type tracker: tracker - @param tracker: the tracker whose status is to be retrieved - - @return: one of None, PENDING, REJECTED, MODIFIED, or ACCEPTED - """ - disp = pn_messenger_status(self._mng, tracker); - return STATUSES.get(disp, disp) - - def buffered(self, tracker): - """ - Checks if the delivery associated with the given tracker is still - waiting to be sent. - - @type tracker: tracker - @param tracker: the tracker whose status is to be retrieved - - @return: true if delivery is still buffered - """ - return pn_messenger_buffered(self._mng, tracker); - - def settle(self, tracker=None): - """ - Frees a L{Messenger} from tracking the status associated with a given - tracker. If you don't supply a tracker, all outgoing L{messages<Message>} up - to the most recent will be settled. - """ - if tracker is None: - tracker = pn_messenger_outgoing_tracker(self._mng) - flags = PN_CUMULATIVE - else: - flags = 0 - self._check(pn_messenger_settle(self._mng, tracker, flags)) - - def send(self, n=-1): - """ - This call will block until the indicated number of L{messages<Message>} - have been sent, or until the operation times out. If n is -1 this call will - block until all outgoing L{messages<Message>} have been sent. If n is 0 then - this call will send whatever it can without blocking. - """ - self._check(pn_messenger_send(self._mng, n)) - - def recv(self, n=None): - """ - Receives up to I{n} L{messages<Message>} into the incoming queue. If no value - for I{n} is supplied, this call will receive as many L{messages<Message>} as it - can buffer internally. If the L{Messenger} is in blocking mode, this - call will block until at least one L{Message} is available in the - incoming queue. - """ - if n is None: - n = -1 - self._check(pn_messenger_recv(self._mng, n)) - - def work(self, timeout=None): - """ - Sends or receives any outstanding L{messages<Message>} queued for a L{Messenger}. - This will block for the indicated timeout. - This method may also do I/O work other than sending and receiving - L{messages<Message>}. For example, closing connections after messenger.L{stop}() - has been called. - """ - if timeout is None: - t = -1 - else: - t = secs2millis(timeout) - err = pn_messenger_work(self._mng, t) - if (err == PN_TIMEOUT): - return False - else: - self._check(err) - return True - - @property - def receiving(self): - return pn_messenger_receiving(self._mng) - - def interrupt(self): - """ - The L{Messenger} interface is single-threaded. - This is the only L{Messenger} function intended to be called - from outside of the L{Messenger} thread. - Call this from a non-messenger thread to interrupt - a L{Messenger} that is blocking. - This will cause any in-progress blocking call to throw - the L{Interrupt} exception. If there is no currently blocking - call, then the next blocking call will be affected, even if it - is within the same thread that interrupt was called from. - """ - self._check(pn_messenger_interrupt(self._mng)) - - def get(self, message=None): - """ - Moves the message from the head of the incoming message queue into - the supplied message object. Any content in the message will be - overwritten. - - A tracker for the incoming L{Message} is returned. The tracker can - later be used to communicate your acceptance or rejection of the - L{Message}. - - If None is passed in for the L{Message} object, the L{Message} - popped from the head of the queue is discarded. - - @type message: Message - @param message: the destination message object - @return: a tracker - """ - if message is None: - impl = None - else: - impl = message._msg - self._check(pn_messenger_get(self._mng, impl)) - if message is not None: - message._post_decode() - return pn_messenger_incoming_tracker(self._mng) - - def accept(self, tracker=None): - """ - Signal the sender that you have acted on the L{Message} - pointed to by the tracker. If no tracker is supplied, - then all messages that have been returned by the L{get} - method are accepted, except those that have already been - auto-settled by passing beyond your incoming window size. - - @type tracker: tracker - @param tracker: a tracker as returned by get - """ - if tracker is None: - tracker = pn_messenger_incoming_tracker(self._mng) - flags = PN_CUMULATIVE - else: - flags = 0 - self._check(pn_messenger_accept(self._mng, tracker, flags)) - - def reject(self, tracker=None): - """ - Rejects the L{Message} indicated by the tracker. If no tracker - is supplied, all messages that have been returned by the L{get} - method are rejected, except those that have already been auto-settled - by passing beyond your outgoing window size. - - @type tracker: tracker - @param tracker: a tracker as returned by get - """ - if tracker is None: - tracker = pn_messenger_incoming_tracker(self._mng) - flags = PN_CUMULATIVE - else: - flags = 0 - self._check(pn_messenger_reject(self._mng, tracker, flags)) - - @property - def outgoing(self): - """ - The outgoing queue depth. - """ - return pn_messenger_outgoing(self._mng) - - @property - def incoming(self): - """ - The incoming queue depth. - """ - return pn_messenger_incoming(self._mng) - - def route(self, pattern, address): - """ - Adds a routing rule to a L{Messenger's<Messenger>} internal routing table. - - The route procedure may be used to influence how a L{Messenger} will - internally treat a given address or class of addresses. Every call - to the route procedure will result in L{Messenger} appending a routing - rule to its internal routing table. - - Whenever a L{Message} is presented to a L{Messenger} for delivery, it - will match the address of this message against the set of routing - rules in order. The first rule to match will be triggered, and - instead of routing based on the address presented in the message, - the L{Messenger} will route based on the address supplied in the rule. - - The pattern matching syntax supports two types of matches, a '%' - will match any character except a '/', and a '*' will match any - character including a '/'. - - A routing address is specified as a normal AMQP address, however it - may additionally use substitution variables from the pattern match - that triggered the rule. - - Any message sent to "foo" will be routed to "amqp://foo.com": - - >>> messenger.route("foo", "amqp://foo.com"); - - Any message sent to "foobar" will be routed to - "amqp://foo.com/bar": - - >>> messenger.route("foobar", "amqp://foo.com/bar"); - - Any message sent to bar/<path> will be routed to the corresponding - path within the amqp://bar.com domain: - - >>> messenger.route("bar/*", "amqp://bar.com/$1"); - - Route all L{messages<Message>} over TLS: - - >>> messenger.route("amqp:*", "amqps:$1") - - Supply credentials for foo.com: - - >>> messenger.route("amqp://foo.com/*", "amqp://user:[email protected]/$1"); - - Supply credentials for all domains: - - >>> messenger.route("amqp://*", "amqp://user:password@$1"); - - Route all addresses through a single proxy while preserving the - original destination: - - >>> messenger.route("amqp://%/*", "amqp://user:password@proxy/$1/$2"); - - Route any address through a single broker: - - >>> messenger.route("*", "amqp://user:password@broker/$1"); - """ - self._check(pn_messenger_route(self._mng, unicode2utf8(pattern), unicode2utf8(address))) - - def rewrite(self, pattern, address): - """ - Similar to route(), except that the destination of - the L{Message} is determined before the message address is rewritten. - - The outgoing address is only rewritten after routing has been - finalized. If a message has an outgoing address of - "amqp://0.0.0.0:5678", and a rewriting rule that changes its - outgoing address to "foo", it will still arrive at the peer that - is listening on "amqp://0.0.0.0:5678", but when it arrives there, - the receiver will see its outgoing address as "foo". - - The default rewrite rule removes username and password from addresses - before they are transmitted. - """ - self._check(pn_messenger_rewrite(self._mng, unicode2utf8(pattern), unicode2utf8(address))) - - def selectable(self): - return Selectable.wrap(pn_messenger_selectable(self._mng)) - - @property - def deadline(self): - tstamp = pn_messenger_deadline(self._mng) - if tstamp: - return millis2secs(tstamp) - else: - return None - class Message(object): """The L{Message} class is a mutable holder of message content. @@ -1190,15 +588,6 @@ The group-id for any replies. self._check(err) return result -class Subscription(object): - - def __init__(self, impl): - self._impl = impl - - @property - def address(self): - return pn_subscription_address(self._impl) - _DEFAULT = object() class Selectable(Wrapper): @@ -4291,9 +3680,7 @@ __all__ = [ "IMPLEMENTATION_LANGUAGE", "ABORTED", "ACCEPTED", - "AUTOMATIC", "PENDING", - "MANUAL", "REJECTED", "RELEASED", "MODIFIED", @@ -4314,8 +3701,6 @@ __all__ = [ "Link", "Message", "MessageException", - "Messenger", - "MessengerException", "ProtonException", "VERSION_MAJOR", "VERSION_MINOR", http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c9bb9ff/proton-c/bindings/ruby/lib/messenger/messenger.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/messenger/messenger.rb b/proton-c/bindings/ruby/lib/messenger/messenger.rb deleted file mode 100644 index 912d159..0000000 --- a/proton-c/bindings/ruby/lib/messenger/messenger.rb +++ /dev/null @@ -1,703 +0,0 @@ -# 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. - - -module Qpid::Proton::Messenger - # @deprecated use {Qpid::Proton::Container} - # - # The +Messenger+ class defines a high level interface for - # sending and receiving Messages. Every Messenger contains - # a single logical queue of incoming messages and a single - # logical queue of outgoing messages. These messages in these - # queues may be destined for, or originate from, a variety of - # addresses. - # - # The messenger interface is single-threaded. All methods - # except one ( #interrupt ) are intended to be used from within - # the messenger thread. - # - # === Sending & Receiving Messages - # - # The Messenger class works in conjuction with the Message class. The - # Message class is a mutable holder of message content. - # - # The put method copies its Message to the outgoing queue, and may - # send queued messages if it can do so without blocking. The send - # method blocks until it has sent the requested number of - # or until a timeout interrupts the attempt. - # - # Similarly, the recv method receives messages into the incoming - # queue, and may block as it attempts to receive the requested number - # of messages, or until timeout is reached. It may receive fewer - # than the requested number. The get method pops the - # eldest Message off the incoming queue and copies it into the Message - # object that you supply. It will not block. - # - # The blocking attribute allows you to turn off blocking behavior entirely, - # in which case send and recv will do whatever they can without - # blocking, and then return. You can then look at the number - # of incoming and outgoing messages to see how much outstanding work - # still remains. - # - class Messenger - - include Qpid::Proton::Util::ErrorHandler - include Qpid::Proton::Util::Deprecation - - # Creates a new +Messenger+. - # - # The +name+ parameter is optional. If one is not provided then - # a unique name is generated. - # - # ==== Options - # - # * name - the name (def. nil) - # - def initialize(name = nil) - deprecated Qpid::Proton::Messenger, Qpid::Proton::Container - @impl = Cproton.pn_messenger(name) - @selectables = {} - ObjectSpace.define_finalizer(self, self.class.finalize!(@impl)) - end - - def self.finalize!(impl) # :nodoc: - proc { - Cproton.pn_messenger_free(impl) - } - end - - # Returns the name. - # - def name - Cproton.pn_messenger_name(@impl) - end - - # This property contains the password for the Messenger.private_key - # file, or +nil+ if the file is not encrypted. - # - # ==== Arguments - # - # * password - the password - # - def password=(password) - Cproton.pn_messenger_set_password(@impl, password) - end - - # Returns the password property for the Messenger.private_key file. - # - def password - Cproton.pn_messenger_get_password(@impl) - end - - # Sets the timeout period, in milliseconds. - # - # A negative timeout period implies an infinite timeout. - # - # ==== Options - # - # * timeout - the timeout period - # - def timeout=(timeout) - raise TypeError.new("invalid timeout: #{timeout}") if timeout.nil? - Cproton.pn_messenger_set_timeout(@impl, timeout) - end - - # Returns the timeout period - # - def timeout - Cproton.pn_messenger_get_timeout(@impl) - end - - # Returns true if blocking mode is enabled. - # - # Enable or disable blocking behavior during message sending - # and receiving. This affects every blocking call, with the - # exception of work(). Currently, the affected calls are - # send, recv, and stop. - def blocking? - Cproton.pn_messenger_is_blocking(@impl) - end - - # Sets the blocking mode. - def blocking=(blocking) - Cproton.pn_messenger_set_blocking(@impl, blocking) - end - - # Returns true if passive mode is enabled. - # - def passive? - Cproton.pn_messenger_is_passive(@impl) - end - - # Turns passive mode on or off. - # - # When set to passive mode, Messenger will not attempt to perform I/O - # operations internally. In this mode it is necesssary to use the - # Selectable type to drive any I/O needed to perform requestioned - # actions. - # - # In this mode Messenger will never block. - # - def passive=(mode) - Cproton.pn_messenger_set_passive(@impl, mode) - end - - def deadline - tstamp = Cproton.pn_messenger_deadline(@impl) - return tstamp / 1000.0 unless tstamp.nil? - end - - # Reports whether an error occurred. - # - def error? - !Cproton.pn_messenger_errno(@impl).zero? - end - - # Returns the most recent error number. - # - def errno - Cproton.pn_messenger_errno(@impl) - end - - # Returns the most recent error message. - # - def error - Cproton.pn_error_text(Cproton.pn_messenger_error(@impl)) - end - - # Clears the current error state. - # - def clear_error - error = Cproton.pn_messenger_error(@impl) - unless error.nil? - Cproton.pn_error_clear(error) - end - end - - # For future compatibility, do not send or recv messages - # before starting the +Messenger+. - # - def start - at_exit { stop } - Cproton.pn_messenger_start(@impl) - end - - # Stops the +Messenger+, preventing it from sending or receiving - # any more messages. - # - def stop - Cproton.pn_messenger_stop(@impl) - end - - # Returns true if a Messenger is in the stopped state. - # This function does not block. - # - def stopped? - Cproton.pn_messenger_stopped(@impl) - end - - # Subscribes the Messenger to messages originating from the - # specified source. The source is an address as specified in the - # Messenger introduction with the following addition. If the - # domain portion of the address begins with the '~' character, the - # Messenger will interpret the domain as host/port, bind to it, - # and listen for incoming messages. For example "~0.0.0.0", - # "amqp://~0.0.0.0" will all bind to any local interface and - # listen for incoming messages. An address of "amqps://~0.0.0.0" - # will only permit incoming SSL connections. - # - # ==== Options - # - # * address - the source address to be subscribe - # * timeout - an optional time-to-live value, in seconds, for the - # subscription - # - def subscribe(address, timeout=0) - raise TypeError.new("invalid address: #{address}") if address.nil? - subscription = Cproton.pn_messenger_subscribe_ttl(@impl, address, timeout) - raise Qpid::Proton::ProtonError.new("Subscribe failed") if subscription.nil? - Subscription.new(subscription) - end - - # Path to a certificate file for the +Messenger+. - # - # This certificate is used when the +Messenger+ accepts or establishes - # SSL/TLS connections. This property must be specified for the - # Messenger to accept incoming SSL/TLS connections and to establish - # client authenticated outgoing SSL/TLS connection. Non client authenticated - # outgoing SSL/TLS connections do not require this property. - # - # ==== Options - # - # * certificate - the certificate - # - def certificate=(certificate) - Cproton.pn_messenger_set_certificate(@impl, certificate) - end - - # Returns the path to a certificate file. - # - def certificate - Cproton.pn_messenger_get_certificate(@impl) - end - - # Path to a private key file for the +Messenger+. - # - # The property must be specified for the +Messenger+ to accept incoming - # SSL/TLS connections and to establish client authenticated outgoing - # SSL/TLS connections. Non client authenticated SSL/TLS connections - # do not require this property. - # - # ==== Options - # - # * key - the key file - # - def private_key=(key) - Cproton.pn_messenger_set_private_key(@impl, key) - end - - # Returns the path to a private key file. - # - def private_key - Cproton.pn_messenger_get_private_key(@impl) - end - - # A path to a database of trusted certificates for use in verifying the - # peer on an SSL/TLS connection. If this property is +nil+, then the - # peer will not be verified. - # - # ==== Options - # - # * certificates - the certificates path - # - def trusted_certificates=(certificates) - Cproton.pn_messenger_set_trusted_certificates(@impl,certificates) - end - - # The path to the databse of trusted certificates. - # - def trusted_certificates - Cproton.pn_messenger_get_trusted_certificates(@impl) - end - - # Places the content contained in the message onto the outgoing - # queue of the Messenger. - # - # This method will never block, however it will send any unblocked - # Messages in the outgoing queue immediately and leave any blocked - # Messages remaining in the outgoing queue. - # The send call may then be used to block until the outgoing queue - # is empty. The outgoing attribute may be used to check the depth - # of the outgoing queue. - # - # ==== Options - # - # * message - the message - # - def put(message) - if message.nil? - raise TypeError.new("invalid message: #{message}") - end - unless message.kind_of?(Qpid::Proton::Message) - raise ::ArgumentError.new("invalid message type: #{message.class}") - end - # encode the message first - message.pre_encode - perform_put(message) - return outgoing_tracker - end - - private - - def perform_put(message) # :nodoc: - Cproton.pn_messenger_put(@impl, message.impl) - end - - public - - - # This call will block until the indicated number of messages - # have been sent, or until the operation times out. - # If n is -1 this call will block until all outgoing messages - # have been sent. If n is 0 then this call will send whatever - # it can without blocking. - # - def send(n = -1) - Cproton.pn_messenger_send(@impl, n) - end - - # Moves the message from the head of the incoming message queue into - # the supplied message object. Any content in the supplied message - # will be overwritten. - # A tracker for the incoming Message is returned. The tracker can - # later be used to communicate your acceptance or rejection of the - # Message. - # - # If no message is provided in the argument, then one is created. In - # either case, the one returned will be the fetched message. - # - # ==== Options - # - # * msg - the (optional) +Message+ instance to be used - # - def get(msg = nil) - msg_impl = nil - if msg.nil? then - msg_impl = nil - else - msg_impl = msg.impl - end - perform_get(msg_impl) - msg.post_decode unless msg.nil? - return incoming_tracker - end - - private - - def perform_get(msg) # :nodoc: - Cproton.pn_messenger_get(@impl, msg) - end - - public - - # Receives up to limit messages into the incoming queue. If no value - # for limit is supplied, this call will receive as many messages as it - # can buffer internally. If the Messenger is in blocking mode, this - # call will block until at least one Message is available in the - # incoming queue. - # - # Options ==== - # - # * limit - the maximum number of messages to receive - # - def receive(limit = -1) - Cproton.pn_messenger_recv(@impl, limit) - end - - # Returns true if the messenger is currently receiving data. - def receiving? - Cproton.pn_messenger_receiving(@impl) - end - - # Attempts interrupting of the messenger thread. - # - # The Messenger interface is single-threaded, and this is the only - # function intended to be called from outside of is thread. - # - # Call this from a non-Messenger thread to interrupt it while it - # is blocking. This will cause a ::InterruptError to be raised. - # - # If there is no currently blocking call, then the next blocking - # call will be affected, even if it is within the same thread that - # originated the interrupt. - # - def interrupt - Cproton.pn_messenger_interrupt(@impl) - end - - # Sends or receives any outstanding messages queued for a Messenger. - # - # This will block for the indicated timeout. This method may also do I/O - # other than sending and receiving messages. For example, closing - # connections after stop() has been called. - # - def work(timeout=-1) - err = Cproton.pn_messenger_work(@impl, timeout) - if (err == Cproton::PN_TIMEOUT) then - return false - else - check_for_error(err) - return true - end - end - - # Returns the number messages in the outgoing queue that have not been - # transmitted. - # - def outgoing - Cproton.pn_messenger_outgoing(@impl) - end - - # Returns the number of messages in the incoming queue that have not - # been retrieved. - # - def incoming - Cproton.pn_messenger_incoming(@impl) - end - - # Adds a routing rule to the Messenger's internal routing table. - # - # The route procedure may be used to influence how a Messenger will - # internally treat a given address or class of addresses. Every call - # to the route procedure will result in Messenger appending a routing - # rule to its internal routing table. - # - # Whenever a Message is presented to a Messenger for delivery, it - # will match the address of this message against the set of routing - # rules in order. The first rule to match will be triggered, and - # instead of routing based on the address presented in the message, - # the Messenger will route based on the address supplied in the rule. - # - # The pattern matching syntax supports two types of matches, a '%' - # will match any character except a '/', and a '*' will match any - # character including a '/'. - # - # A routing address is specified as a normal AMQP address, however it - # may additionally use substitution variables from the pattern match - # that triggered the rule. - # - # ==== Arguments - # - # * pattern - the address pattern - # * address - the target address - # - # ==== Examples - # - # # route messages sent to foo to the destionaty amqp://foo.com - # messenger.route("foo", "amqp://foo.com") - # - # # any message to foobar will be routed to amqp://foo.com/bar - # messenger.route("foobar", "amqp://foo.com/bar") - # - # # any message to bar/<path> will be routed to the same path within - # # the amqp://bar.com domain - # messenger.route("bar/*", "amqp://bar.com/$1") - # - # # route all Message objects over TLS - # messenger.route("amqp:*", "amqps:$1") - # - # # supply credentials for foo - # messenger.route("amqp://foo.com/*", "amqp://user:[email protected]/$1") - # - # # supply credentials for all domains - # messenger.route("amqp://*", "amqp://user:password@$1") - # - # # route all addresses through a single proxy while preserving the - # # original destination - # messenger.route("amqp://%$/*", "amqp://user:password@proxy/$1/$2") - # - # # route any address through a single broker - # messenger.route("*", "amqp://user:password@broker/$1") - # - def route(pattern, address) - Cproton.pn_messenger_route(@impl, pattern, address) - end - - # Similar to #route, except that the destination of - # the Message is determined before the message address is rewritten. - # - # The outgoing address is only rewritten after routing has been - # finalized. If a message has an outgoing address of - # "amqp://0.0.0.0:5678", and a rewriting rule that changes its - # outgoing address to "foo", it will still arrive at the peer that - # is listening on "amqp://0.0.0.0:5678", but when it arrives there, - # the receiver will see its outgoing address as "foo". - # - # The default rewrite rule removes username and password from addresses - # before they are transmitted. - # - # ==== Arguments - # - # * pattern - the outgoing address - # * address - the target address - # - def rewrite(pattern, address) - Cproton.pn_messenger_rewrite(@impl, pattern, address) - end - - def selectable - impl = Cproton.pn_messenger_selectable(@impl) - - # if we don't have any selectables, then return - return nil if impl.nil? - - fd = Cproton.pn_selectable_get_fd(impl) - - selectable = @selectables[fd] - if selectable.nil? - selectable = Selectable.new(self, impl) - @selectables[fd] = selectable - end - return selectable - end - - # Returns a +Tracker+ for the message most recently sent via the put - # method. - # - def outgoing_tracker - impl = Cproton.pn_messenger_outgoing_tracker(@impl) - return nil if impl == -1 - Tracker.new(impl) - end - - # Returns a +Tracker+ for the most recently received message. - # - def incoming_tracker - impl = Cproton.pn_messenger_incoming_tracker(@impl) - return nil if impl == -1 - Tracker.new(impl) - end - - # Signal the sender that you have acted on the Message - # pointed to by the tracker. If no tracker is supplied, - # then all messages that have been returned by the get - # method are accepted, except those that have already been - # auto-settled by passing beyond your incoming window size. - # - # ==== Options - # - # * tracker - the tracker - # - def accept(tracker = nil) - raise TypeError.new("invalid tracker: #{tracker}") unless tracker.nil? or valid_tracker?(tracker) - if tracker.nil? then - tracker = self.incoming_tracker - flag = Cproton::PN_CUMULATIVE - else - flag = 0 - end - Cproton.pn_messenger_accept(@impl, tracker.impl, flag) - end - - # Rejects the incoming message identified by the tracker. - # If no tracker is supplied, all messages that have been returned - # by the get method are rejected, except those that have already - # been auto-settled by passing beyond your outgoing window size. - # - # ==== Options - # - # * tracker - the tracker - # - def reject(tracker) - raise TypeError.new("invalid tracker: #{tracker}") unless tracker.nil? or valid_tracker?(tracker) - if tracker.nil? then - tracker = self.incoming_tracker - flag = Cproton::PN_CUMULATIVE - else - flag = 0 - end - Cproton.pn_messenger_reject(@impl, tracker.impl, flag) - end - - # Gets the last known remote state of the delivery associated with - # the given tracker, as long as the Message is still within your - # outgoing window. (Also works on incoming messages that are still - # within your incoming queue. See TrackerStatus for details on the - # values returned. - # - # ==== Options - # - # * tracker - the tracker - # - def status(tracker) - raise TypeError.new("invalid tracker: #{tracker}") unless valid_tracker?(tracker) - TrackerStatus.by_value(Cproton.pn_messenger_status(@impl, tracker.impl)) - end - - # Frees a Messenger from tracking the status associated - # with a given tracker. If you don't supply a tracker, all - # outgoing messages up to the most recent will be settled. - # - # ==== Options - # - # * tracker - the tracker - # - # ==== Examples - # - def settle(tracker) - raise TypeError.new("invalid tracker: #{tracker}") unless valid_tracker?(tracker) - if tracker.nil? then - tracker = self.incoming_tracker - flag = Cproton::PN_CUMULATIVE - else - flag = 0 - end - Cproton.pn_messenger_settle(@impl, tracker.impl, flag) - end - - # Sets the incoming window. - # - # The Messenger will track the remote status of this many incoming - # deliveries after they have been accepted or rejected. - # - # Messages enter this window only when you take them into your application - # using get(). If your incoming window size is n, and you get n+1 messages - # without explicitly accepting or rejecting the oldest message, then the - # message that passes beyond the edge of the incoming window will be - # assigned the default disposition of its link. - # - # ==== Options - # - # * window - the window size - # - def incoming_window=(window) - raise TypeError.new("invalid window: #{window}") unless valid_window?(window) - Cproton.pn_messenger_set_incoming_window(@impl, window) - end - - # Returns the incoming window. - # - def incoming_window - Cproton.pn_messenger_get_incoming_window(@impl) - end - - # Sets the outgoing window. - # - # The Messenger will track the remote status of this many outgoing - # deliveries after calling send. - # A Message enters this window when you call the put() method with the - # message. If your outgoing window size is n, and you call put n+1 - # times, status information will no longer be available for the - # first message. - # - # ==== Options - # - # * window - the window size - # - def outgoing_window=(window) - raise TypeError.new("invalid window: #{window}") unless valid_window?(window) - Cproton.pn_messenger_set_outgoing_window(@impl, window) - end - - # Returns the outgoing window. - # - def outgoing_window - Cproton.pn_messenger_get_outgoing_window(@impl) - end - - # Unregisters a selectable object. - def unregister_selectable(fileno) # :nodoc: - @selectables.delete(fileno) - end - - private - - def valid_tracker?(tracker) - !tracker.nil? && tracker.is_a?(Tracker) - end - - def valid_window?(window) - !window.nil? && window.is_a?(Numeric) - end - - can_raise_error [:send, :receive, :password=, :start, :stop, - :perform_put, :perform_get, :interrupt, - :route, :rewrite, :accept, :reject, - :incoming_window=, :outgoing_window=] - - end -end --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
