http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0ee3de18/proton-c/bindings/ruby/lib/qpid_proton/messenger.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/qpid_proton/messenger.rb b/proton-c/bindings/ruby/lib/qpid_proton/messenger.rb deleted file mode 100644 index 5a16c50..0000000 --- a/proton-c/bindings/ruby/lib/qpid_proton/messenger.rb +++ /dev/null @@ -1,702 +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 # :nodoc: - - module Proton # :nodoc: - - # 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 messages, - # 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::ExceptionHandling - - can_raise_exception [:send, :receive, :password=, :start, :stop, - :perform_put, :perform_get, :interrupt, - :route, :rewrite, :accept, :reject, - :incoming_window=, :outgoing_window=] - - # 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) - @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 - - # Currently a no-op placeholder. - # For future compatibility, do not send or recv messages - # before starting the +Messenger+. - # - def start - 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? - Qpid::Proton::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) - raise TypeError.new("invalid message: #{message}") if message.nil? - raise ArgumentError.new("invalid message type: #{message.class}") unless message.kind_of?(Message) - # 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:passw...@foo.com/$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_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 - Qpid::Proton::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 - Qpid::Proton::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) - Qpid::Proton::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?(Qpid::Proton::Tracker) - end - - def valid_window?(window) - !window.nil? && [Float, Fixnum].include?(window.class) - end - - end - - end - -end
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0ee3de18/proton-c/bindings/ruby/lib/qpid_proton/selectable.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/qpid_proton/selectable.rb b/proton-c/bindings/ruby/lib/qpid_proton/selectable.rb deleted file mode 100644 index 33554cd..0000000 --- a/proton-c/bindings/ruby/lib/qpid_proton/selectable.rb +++ /dev/null @@ -1,126 +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 # :nodoc: - - module Proton # :nodoc: - - # Selectable enables accessing the underlying file descriptors - # for Messenger. - class Selectable - - include Qpid::Proton::Filters - - call_before :check_is_initialized, - :fileno, :capacity, :pending, :deadline, - :readable, :writable, :expired, - :registered=, :registered? - - def initialize(messenger, impl) # :nodoc: - @messenger = messenger - @impl = impl - @io = nil - @freed = false - end - - # Returns the underlying file descriptor. - # - # This can be used in conjunction with the IO class. - # - def fileno - Cproton.pn_selectable_fd(@impl) - end - - def to_io - @io ||= IO.new(fileno) - end - - # The number of bytes the selectable is capable of consuming. - # - def capacity - Cproton.pn_selectable_capacity(@impl) - end - - # The number of bytes waiting to be written to the file descriptor. - # - def pending - Cproton.pn_selectable_pending(@impl) - end - - # The future expiry time at which control will be returned to the - # selectable. - # - def deadline - tstamp = Cproton.pn_selectable_deadline(@impl) - tstamp.nil? ? nil : tstamp / 1000 - end - - def readable - Cproton.pn_selectable_readable(@impl) - end - - def writable - Cproton.pn_selectable_writable(@impl) - end - - def expired? - Cproton.pn_selectable_expired(@impl) - end - - def registered=(registered) - Cproton.pn_selectable_set_registered(@impl, registered) - end - - def registered? - Cproton.pn_selectable_is_registered(@impl) - end - - def terminal? - return true if @impl.nil? - Cproton.pn_selectable_is_terminal(@impl) - end - - def to_s - "fileno=#{self.fileno} registered=#{self.registered?} terminal=#{self.terminal?}" - end - - def free - return if @freed - @freed = true - @messenger.unregister_selectable(fileno) - @io.close unless @io.nil? - Cproton.pn_selectable_free(@impl) - @impl = nil - end - - def freed? # :nodoc: - @freed - end - - private - - def check_is_initialized - raise RuntimeError.new("selectable freed") if @impl.nil? - end - - end - - end - -end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0ee3de18/proton-c/bindings/ruby/lib/qpid_proton/strings.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/qpid_proton/strings.rb b/proton-c/bindings/ruby/lib/qpid_proton/strings.rb deleted file mode 100644 index 0b21886..0000000 --- a/proton-c/bindings/ruby/lib/qpid_proton/strings.rb +++ /dev/null @@ -1,65 +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 # :nodoc: - - module Proton # :nodoc: - - def self.is_valid_utf?(value) - # In Ruby 1.9+ we have encoding methods that can check the content of - # the string, so use them to see if what we have is unicode. If so, - # good! If not, then just treat is as binary. - # - # No such thing in Ruby 1.8. So there we need to use Iconv to try and - # convert it to unicode. If it works, good! But if it raises an - # exception then we'll treat it as binary. - if RUBY_VERSION < "1.9" - return true if value.isutf8 - return false - else - return true if (value.encoding == "UTF-8" || - value.encode("UTF-8").valid_encoding?) - - return false - end - end - - # UTFString lets an application explicitly state that a - # string of characters is to be UTF-8 encoded. - # - class UTFString < ::String - - def initialize(value) - if !Qpid::Proton.is_valid_utf?(value) - raise RuntimeError.new("invalid UTF string") - end - - super(value) - end - - end - - # BinaryString lets an application explicitly declare that - # a string value represents arbitrary data. - # - class BinaryString < ::String; end - - end - -end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0ee3de18/proton-c/bindings/ruby/lib/qpid_proton/subscription.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/qpid_proton/subscription.rb b/proton-c/bindings/ruby/lib/qpid_proton/subscription.rb deleted file mode 100644 index 21d9281..0000000 --- a/proton-c/bindings/ruby/lib/qpid_proton/subscription.rb +++ /dev/null @@ -1,41 +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 # :nodoc: - - module Proton # :nodoc: - - # A +Subscription+ is an opaque object for working with a +Messenger+'s - # subscriptions. - # - class Subscription - - def initialize(impl) # :nodoc: - @impl = impl - end - - def impl # :nodoc: - @impl - end - - end - - end - -end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0ee3de18/proton-c/bindings/ruby/lib/qpid_proton/tracker.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/qpid_proton/tracker.rb b/proton-c/bindings/ruby/lib/qpid_proton/tracker.rb deleted file mode 100644 index 7de271a..0000000 --- a/proton-c/bindings/ruby/lib/qpid_proton/tracker.rb +++ /dev/null @@ -1,42 +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 # :nodoc: - - module Proton # :nodoc: - - # A +Tracker+ is used to track the disposition of a +Message+. - # - class Tracker - - CUMULATIVE = Cproton::PN_CUMULATIVE - - def initialize(impl) # :nodoc: - @impl = impl - end - - def impl # :nodoc: - @impl - end - - end - - end - -end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0ee3de18/proton-c/bindings/ruby/lib/qpid_proton/tracker_status.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/qpid_proton/tracker_status.rb b/proton-c/bindings/ruby/lib/qpid_proton/tracker_status.rb deleted file mode 100644 index 81c9ea3..0000000 --- a/proton-c/bindings/ruby/lib/qpid_proton/tracker_status.rb +++ /dev/null @@ -1,73 +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 # :nodoc: - - module Proton # :nodoc: - - # TrackerStatus contains symbols that represent the status value for a - # Tracker. - # - class TrackerStatus - - def initialize value, name # :nodoc: - @value = value - @name = name - end - - def value # :nodoc: - @value - end - - def to_s # :nodoc: - @name.to_s - end - - def self.by_name(name) # :nodoc: - @by_name[name.to_sym] unless name.nil? - end - - def self.by_value(value) # :nodoc: - @by_value[value] unless value.nil? - end - - private - - def self.add_item(key, value) # :nodoc: - @by_name ||= {} - @by_name[key] = TrackerStatus.new value, key - @by_value ||= {} - @by_value[value] = @by_name[key] - end - - def self.const_missing(key) # :nodoc: - @by_name[key] - end - - self.add_item :UNKNOWN, Cproton::PN_STATUS_UNKNOWN - self.add_item :PENDING, Cproton::PN_STATUS_PENDING - self.add_item :ACCEPTED, Cproton::PN_STATUS_ACCEPTED - self.add_item :REJECTED, Cproton::PN_STATUS_REJECTED - self.add_item :SETTLED, Cproton::PN_STATUS_SETTLED - - end - - end - -end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0ee3de18/proton-c/bindings/ruby/lib/qpid_proton/version.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/qpid_proton/version.rb b/proton-c/bindings/ruby/lib/qpid_proton/version.rb deleted file mode 100644 index ebc92c5..0000000 --- a/proton-c/bindings/ruby/lib/qpid_proton/version.rb +++ /dev/null @@ -1,32 +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 # :nodoc: - - module Proton # :nodoc: - - # The major version for the underlying Proton library. - VERSION_MAJOR = Cproton::PN_VERSION_MAJOR - - # The minor version for the underlying Proton library. - VERSION_MINOR = Cproton::PN_VERSION_MINOR - - end - -end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0ee3de18/proton-c/bindings/ruby/lib/types/array.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/types/array.rb b/proton-c/bindings/ruby/lib/types/array.rb new file mode 100644 index 0000000..a4294a3 --- /dev/null +++ b/proton-c/bindings/ruby/lib/types/array.rb @@ -0,0 +1,173 @@ +#-- +# 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. +#++ + +#-- +# Patch the Array class to provide methods for adding its contents +# to a Qpid::Proton::Data instance. +#++ + +module Qpid # :nodoc: + + module Proton # :nodoc: + + # Holds the information for an AMQP Array compound type. + # + # It holds the type for the array and the descriptor if the + # array is described. + # + class ArrayHeader + attr_reader :type + attr_reader :descriptor + + def initialize(type, descriptor = nil) + @type = type + @descriptor = descriptor + end + + # Returns true if the array is described. + def described? + !@descriptor.nil? + end + + def ==(that) + ((@type == that.type) && (@descriptor == that.descriptor)) + end + end + + end + +end + +class Array # :nodoc: + + # Used to declare an array as an AMQP array. + # + # The value, if defined, is an instance of Qpid::Proton::ArrayHeader + attr_accessor :proton_array_header + + # Returns true if the array is the a Proton described type. + def proton_described? + !@proton_array_header.nil? && @proton_array_header.described? + end + + # Puts the elements of the array into the specified Qpid::Proton::Data object. + def proton_put(data) + raise TypeError, "data object cannot be nil" if data.nil? + + if @proton_array_header.nil? + proton_put_list(data) + else + proton_put_array(data) + end + end + + private + + def proton_put_list(data) + # create a list, then enter it and add each element + data.put_list + data.enter + each do |element| + # get the proton type for the element + mapping = Qpid::Proton::Mapping.for_class(element.class) + # add the element + mapping.put(data, element) + end + # exit the list + data.exit + end + + def proton_put_array(data) + data.put_array(@proton_array_header.described?, @proton_array_header.type) + data.enter + if @proton_array_header.described? + data.symbol = @proton_array_header.descriptor + end + + each do |element| + @proton_array_header.type.put(data, element) + end + + data.exit + end + + class << self + + # Gets the elements of an array or list out of the specified + # Qpid::Proton::Data object. + def proton_get(data) + raise TypeError, "can't convert nil into Qpid::Proton::Data" if data.nil? + + type = data.type + + if type == Qpid::Proton::LIST + result = proton_get_list(data) + elsif type == Qpid::Proton::ARRAY + result = proton_get_array(data) + else + raise TypeError, "element is not a list and not an array" + end + end + + private + + def proton_get_list(data) + size = data.list + raise TypeError, "not a list" unless data.enter + elements = [] + (0...size).each do + data.next + type = data.type + raise TypeError, "missing next element in list" unless type + elements << type.get(data) + end + data.exit + return elements + end + + def proton_get_array(data) + count, described, type = data.array + + raise TypeError, "not an array" unless data.enter + elements = [] + + descriptor = nil + + if described + data.next + descriptor = data.symbol + end + + elements.proton_array_header = Qpid::Proton::ArrayHeader.new(type, descriptor) + (0...count).each do |which| + if data.next + etype = data.type + raise TypeError, "missing next element in array" unless etype + raise TypeError, "invalid array element: #{etype}" unless etype == type + elements << type.get(data) + end + end + data.exit + return elements + end + + end + +end + http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0ee3de18/proton-c/bindings/ruby/lib/types/described.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/types/described.rb b/proton-c/bindings/ruby/lib/types/described.rb new file mode 100644 index 0000000..98679c2 --- /dev/null +++ b/proton-c/bindings/ruby/lib/types/described.rb @@ -0,0 +1,66 @@ +#-- +# 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 # :nodoc: + + module Proton # :nodoc: + + class Described + + attr_reader :descriptor + attr_reader :value + + def initialize(descriptor, value) + @descriptor = descriptor + @value = value + end + + # Puts the description into the Data object. + # + # ==== Arguments + # + # * data - the Qpid::Proton::Data instance + # + # ==== Examples + # + # described = Qpid::Proton::Described.new("my-descriptor", "the value") + # data = Qpid::Proton::Data.new + # ... + # described.put(data) + # + def put(data) + data.symbol = @descriptor + data.string = @value + end + + def ==(that) # :nodoc: + (that.is_a?(Qpid::Proton::Described) && + (self.descriptor == that.descriptor) && + (self.value == that.value)) + end + + def to_s # :nodoc: + "descriptor=#{descriptor} value=#{value}" + end + + end + + end + +end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0ee3de18/proton-c/bindings/ruby/lib/types/hash.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/types/hash.rb b/proton-c/bindings/ruby/lib/types/hash.rb new file mode 100644 index 0000000..1e19da1 --- /dev/null +++ b/proton-c/bindings/ruby/lib/types/hash.rb @@ -0,0 +1,86 @@ +#-- +# 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. +#++ + +#-- +# Patch the Hash class to provide methods for adding its contents +# to a Qpid::Proton::Data instance. +#++ + +class Hash # :nodoc: + + # Places the contents of the hash into the specified data object. + # + # ==== Arguments + # + # * data - the Qpid::Proton::Data instance + # + # ==== Examples + # + # data = Qpid::Proton::Data.new + # values = {:foo => :bar} + # values.proton_data_put(data) + # + def proton_data_put(data) + raise TypeError, "data object cannot be nil" if data.nil? + + data.put_map + data.enter + + each_pair do |key, value| + type = Qpid::Proton::Mapping.for_class(key.class) + type.put(data, key) + type = Qpid::Proton::Mapping.for_class(value.class) + type.put(data, value) + end + + data.exit + end + + class << self + + def proton_data_get(data) + raise TypeError, "data object cannot be nil" if data.nil? + + type = data.type + + raise TypeError, "element is not a map" unless type == Qpid::Proton::MAP + + count = data.map + result = {} + + data.enter + + (0...(count/2)).each do + data.next + type = data.type + key = type.get(data) + data.next + type = data.type + value = type.get(data) + result[key] = value + end + + data.exit + + return result + end + + end + +end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0ee3de18/proton-c/bindings/ruby/lib/types/strings.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/types/strings.rb b/proton-c/bindings/ruby/lib/types/strings.rb new file mode 100644 index 0000000..0b21886 --- /dev/null +++ b/proton-c/bindings/ruby/lib/types/strings.rb @@ -0,0 +1,65 @@ +#-- +# 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 # :nodoc: + + module Proton # :nodoc: + + def self.is_valid_utf?(value) + # In Ruby 1.9+ we have encoding methods that can check the content of + # the string, so use them to see if what we have is unicode. If so, + # good! If not, then just treat is as binary. + # + # No such thing in Ruby 1.8. So there we need to use Iconv to try and + # convert it to unicode. If it works, good! But if it raises an + # exception then we'll treat it as binary. + if RUBY_VERSION < "1.9" + return true if value.isutf8 + return false + else + return true if (value.encoding == "UTF-8" || + value.encode("UTF-8").valid_encoding?) + + return false + end + end + + # UTFString lets an application explicitly state that a + # string of characters is to be UTF-8 encoded. + # + class UTFString < ::String + + def initialize(value) + if !Qpid::Proton.is_valid_utf?(value) + raise RuntimeError.new("invalid UTF string") + end + + super(value) + end + + end + + # BinaryString lets an application explicitly declare that + # a string value represents arbitrary data. + # + class BinaryString < ::String; end + + end + +end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0ee3de18/proton-c/bindings/ruby/lib/util/error_handler.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/util/error_handler.rb b/proton-c/bindings/ruby/lib/util/error_handler.rb new file mode 100644 index 0000000..b3707c3 --- /dev/null +++ b/proton-c/bindings/ruby/lib/util/error_handler.rb @@ -0,0 +1,127 @@ +#-- +# 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 # :nodoc: + + module Proton # :nodoc: + + # Provides mixin functionality for dealing with exception conditions. + # + module ExceptionHandling + + def self.included(base) + base.extend(self) + + unless defined? base.to_be_wrapped + class << base + @@to_be_wrapped = [] + end + end + + define_method :method_added do |name| + if (!@@to_be_wrapped.nil?) && (@@to_be_wrapped.include? name) + @@to_be_wrapped.delete name + create_exception_handler_wrapper(name) + end + end + end + + def can_raise_exception(method_names) + # coerce the names to be an array + Array(method_names).each do |method_name| + # if the method doesn't already exist then queue this aliasing + unless self.method_defined? method_name + @@to_be_wrapped ||= [] + @@to_be_wrapped << method_name + else + create_exception_handler_wrapper(method_name) + end + end + end + + def create_exception_handler_wrapper(method_name) + original_method_name = method_name.to_s + wrapped_method_name = "_excwrap_#{original_method_name}" + alias_method wrapped_method_name, original_method_name + define_method original_method_name do |*args, &block| + # need to get a reference to the method object itself since + # calls to Class.send interfere with Messenger.send + method = self.method(wrapped_method_name.to_sym) + rc = method.call(*args, &block) + check_for_error(rc) + end + end + + # Raises an Proton-specific error if a return code is non-zero. + # + # Expects the class to provide an +error+ method. + def check_for_error(code) + + raise ::ArgumentError.new("Invalid error code: #{code}") if code.nil? + + return code if code > 0 + + case(code) + + when Qpid::Proton::Error::NONE + return + + when Qpid::Proton::Error::EOS + raise Qpid::Proton::EOSError.new(self.error) + + when Qpid::Proton::Error::ERROR + raise Qpid::Proton::ProtonError.new(self.error) + + when Qpid::Proton::Error::OVERFLOW + raise Qpid::Proton::OverflowError.new(self.error) + + when Qpid::Proton::Error::UNDERFLOW + raise Qpid::Proton::UnderflowError.new(self.error) + + when Qpid::Proton::Error::ARGUMENT + raise Qpid::Proton::ArgumentError.new(self.error) + + when Qpid::Proton::Error::STATE + raise Qpid::Proton::StateError.new(self.error) + + when Qpid::Proton::Error::TIMEOUT + raise Qpid::Proton::TimeoutError.new(self.error) + + when Qpid::Proton::Error::INPROGRESS + return + + when Qpid::Proton::Error::INTERRUPTED + raise Qpid::Proton::InterruptedError.new(self.error) + + when Qpid::Proton::Error::INPROGRESS + raise Qpid::Proton::InProgressError.new(self.error) + + else + + raise ::ArgumentError.new("Unknown error code: #{code}") + + end + + end + + end + + end + +end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0ee3de18/proton-c/bindings/ruby/lib/util/version.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/util/version.rb b/proton-c/bindings/ruby/lib/util/version.rb new file mode 100644 index 0000000..ebc92c5 --- /dev/null +++ b/proton-c/bindings/ruby/lib/util/version.rb @@ -0,0 +1,32 @@ +#-- +# 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 # :nodoc: + + module Proton # :nodoc: + + # The major version for the underlying Proton library. + VERSION_MAJOR = Cproton::PN_VERSION_MAJOR + + # The minor version for the underlying Proton library. + VERSION_MINOR = Cproton::PN_VERSION_MINOR + + end + +end --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org