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

Reply via email to