You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2009/10/05 14:52:10 UTC

svn commit: r821779 [2/11] - in /qpid/branches/java-broker-0-10/qpid: ./ cpp/ cpp/bindings/qmf/ cpp/bindings/qmf/python/ cpp/bindings/qmf/python/qmf/ cpp/bindings/qmf/ruby/ cpp/bindings/qmf/tests/ cpp/examples/messaging/ cpp/include/qmf/ cpp/include/qp...

Modified: qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/ruby/qmf.rb
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/ruby/qmf.rb?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/ruby/qmf.rb (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/ruby/qmf.rb Mon Oct  5 12:51:57 2009
@@ -20,364 +20,565 @@
 require 'qmfengine'
 require 'thread'
 require 'socket'
+require 'monitor'
 
 module Qmf
 
-    # Pull all the TYPE_* constants into Qmf namespace.  Maybe there's an easier way?
-    Qmfengine.constants.each do |c|
-        if c.index('TYPE_') == 0 or c.index('ACCESS_') == 0 or c.index('DIR_') == 0
-            const_set(c, Qmfengine.const_get(c))
-        end
+  # Pull all the TYPE_* constants into Qmf namespace.  Maybe there's an easier way?
+  Qmfengine.constants.each do |c|
+    if c.index('TYPE_') == 0 or c.index('ACCESS_') == 0 or c.index('DIR_') == 0 or c.index('CLASS_') == 0
+      const_set(c, Qmfengine.const_get(c))
     end
+  end
 
-    class ConnectionSettings
-      attr_reader :impl
+  ##==============================================================================
+  ## CONNECTION
+  ##==============================================================================
+
+  class ConnectionSettings
+    attr_reader :impl
+
+    def initialize(url = nil)
+      if url
+        @impl = Qmfengine::ConnectionSettings.new(url)
+      else
+        @impl = Qmfengine::ConnectionSettings.new()
+      end
+    end
 
-      def initialize(url = nil)
-        if url
-          @impl = Qmfengine::ConnectionSettings.new(url)
-        else
-          @impl = Qmfengine::ConnectionSettings.new()
-        end
+    def set_attr(key, val)
+      if val.class == String
+        v = Qmfengine::Value.new(TYPE_LSTR)
+        v.setString(val)
+      elsif val.class == TrueClass or val.class == FalseClass
+        v = Qmfengine::Value.new(TYPE_BOOL)
+        v.setBool(val)
+      elsif val.class == Fixnum
+        v = Qmfengine::Value.new(TYPE_UINT32)
+        v.setUint(val)
+      else
+        raise ArgumentError, "Value for attribute '#{key}' has unsupported type: #{val.class}"
       end
 
-      def set_attr(key, val)
-        if val.class == String
-          v = Qmfengine::Value.new(TYPE_LSTR)
-          v.setString(val)
-        elsif val.class == TrueClass or val.class == FalseClass
-          v = Qmfengine::Value.new(TYPE_BOOL)
-          v.setBool(val)
-        elsif val.class == Fixnum
-          v = Qmfengine::Value.new(TYPE_UINT32)
-          v.setUint(val)
-        else
-          raise ArgumentError, "Value for attribute '#{key}' has unsupported type: #{val.class}"
-        end
+      @impl.setAttr(key, v)
+    end
+  end
 
-        @impl.setAttr(key, v)
+  class ConnectionHandler
+    def conn_event_connected(); end
+    def conn_event_disconnected(error); end
+    def conn_event_visit(); end
+    def sess_event_session_closed(context, error); end
+    def sess_event_recv(context, message); end
+  end
+
+  class Connection
+    include MonitorMixin
+
+    attr_reader :impl
+
+    def initialize(settings)
+      super()
+      @impl = Qmfengine::ResilientConnection.new(settings.impl)
+      @sockEngine, @sock = Socket::socketpair(Socket::PF_UNIX, Socket::SOCK_STREAM, 0)
+      @impl.setNotifyFd(@sockEngine.fileno)
+      @new_conn_handlers = []
+      @conn_handlers_to_delete = []
+      @conn_handlers = []
+
+      @thread = Thread.new do
+        run
       end
     end
 
-    class ConnectionHandler
-        def conn_event_connected(); end
-        def conn_event_disconnected(error); end
-        def sess_event_session_closed(context, error); end
-        def sess_event_recv(context, message); end
+    def kick
+      @sockEngine.write(".")
+      @sockEngine.flush
     end
 
-    class Query
-      attr_reader :impl
-      def initialize(i)
-        @impl = i
+    def add_conn_handler(handler)
+      synchronize do
+        @new_conn_handlers << handler
       end
+      kick
+    end
 
-      def package_name
-        @impl.getPackage
+    def del_conn_handler(handler)
+      synchronize do
+        @conn_handlers_to_delete << handler
       end
+      kick
+    end
 
-      def class_name
-        @impl.getClass
-      end
+    def run()
+      eventImpl = Qmfengine::ResilientConnectionEvent.new
+      connected = nil
+      new_handlers = nil
+      del_handlers = nil
+      bt_count = 0
+
+      while :true
+        @sock.read(1)
+
+        synchronize do
+          new_handlers = @new_conn_handlers
+          del_handlers = @conn_handlers_to_delete
+          @new_conn_handlers = []
+          @conn_handlers_to_delete = []
+        end
+
+        new_handlers.each do |nh|
+          @conn_handlers << nh
+          nh.conn_event_connected() if connected
+        end
+        new_handlers = nil
+
+        del_handlers.each do |dh|
+          d = @conn_handlers.delete(dh)
+        end
+        del_handlers = nil
 
-      def object_id
-        objid = @impl.getObjectId
-        if objid.class == NilClass
-          return nil
+        valid = @impl.getEvent(eventImpl)
+        while valid
+          begin
+            case eventImpl.kind
+            when Qmfengine::ResilientConnectionEvent::CONNECTED
+              connected = :true
+              @conn_handlers.each { |h| h.conn_event_connected() }
+            when Qmfengine::ResilientConnectionEvent::DISCONNECTED
+              connected = nil
+              @conn_handlers.each { |h| h.conn_event_disconnected(eventImpl.errorText) }
+            when Qmfengine::ResilientConnectionEvent::SESSION_CLOSED
+              eventImpl.sessionContext.handler.sess_event_session_closed(eventImpl.sessionContext, eventImpl.errorText)
+            when Qmfengine::ResilientConnectionEvent::RECV
+              eventImpl.sessionContext.handler.sess_event_recv(eventImpl.sessionContext, eventImpl.message)
+            end
+          rescue Exception => ex
+            puts "Event Exception: #{ex}"
+            if bt_count < 2
+              puts ex.backtrace
+              bt_count += 1
+            end
+          end
+          @impl.popEvent
+          valid = @impl.getEvent(eventImpl)
         end
-        return ObjectId.new(objid)
+        @conn_handlers.each { |h| h.conn_event_visit }
       end
     end
+  end
+
+  class Session
+    attr_reader :handle, :handler
+
+    def initialize(conn, label, handler)
+      @conn = conn
+      @label = label
+      @handler = handler
+      @handle = Qmfengine::SessionHandle.new
+      result = @conn.impl.createSession(label, self, @handle)
+    end
 
-    class Connection
-      attr_reader :impl
+    def destroy()
+      @conn.impl.destroySession(@handle)
+    end
+  end
 
-      def initialize(settings)
-        @impl = Qmfengine::ResilientConnection.new(settings.impl)
-        @sockEngine, @sock = Socket::socketpair(Socket::PF_UNIX, Socket::SOCK_STREAM, 0)
-        @impl.setNotifyFd(@sockEngine.fileno)
-        @new_conn_handlers = Array.new
-        @conn_handlers = Array.new
-        @sess_handlers = Array.new
+  ##==============================================================================
+  ## OBJECTS
+  ##==============================================================================
+
+  class QmfObject
+    include MonitorMixin
+    attr_reader :impl, :object_class
+    def initialize(cls, kwargs={})
+      super()
+      @cv = new_cond
+      @sync_count = 0
+      @sync_result = nil
+      @allow_sets = :false
+      @broker = kwargs[:broker] if kwargs.include?(:broker)
 
-        @thread = Thread.new do
-          run
-        end
+      if cls:
+        @object_class = cls
+        @impl = Qmfengine::Object.new(@object_class.impl)
+      elsif kwargs.include?(:impl)
+        @impl = Qmfengine::Object.new(kwargs[:impl])
+        @object_class = SchemaObjectClass.new(nil, nil, :impl => @impl.getClass)
       end
+    end
+
+    def object_id
+      return ObjectId.new(@impl.getObjectId)
+    end
 
-      def add_conn_handler(handler)
-        @new_conn_handlers.push(handler)
-        @sockEngine.write("x")
+    def get_attr(name)
+      val = value(name)
+      case val.getType
+      when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.asUint
+      when TYPE_UINT64 then val.asUint64
+      when TYPE_SSTR, TYPE_LSTR then val.asString
+      when TYPE_ABSTIME then val.asInt64
+      when TYPE_DELTATIME then val.asUint64
+      when TYPE_REF then val.asObjectId
+      when TYPE_BOOL then val.asBool
+      when TYPE_FLOAT then val.asFloat
+      when TYPE_DOUBLE then val.asDouble
+      when TYPE_UUID then val.asUuid
+      when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.asInt
+      when TYPE_INT64 then val.asInt64
+      when TYPE_MAP
+      when TYPE_OBJECT
+      when TYPE_LIST
+      when TYPE_ARRAY
       end
+    end
 
-      def add_sess_handler(handler)
-        @sess_handlers.push(handler)
+    def set_attr(name, v)
+      val = value(name)
+      case val.getType
+      when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.setUint(v)
+      when TYPE_UINT64 then val.setUint64(v)
+      when TYPE_SSTR, TYPE_LSTR then v ? val.setString(v) : val.setString('')
+      when TYPE_ABSTIME then val.setInt64(v)
+      when TYPE_DELTATIME then val.setUint64(v)
+      when TYPE_REF then val.setObjectId(v.impl)
+      when TYPE_BOOL then v ? val.setBool(v) : val.setBool(0)
+      when TYPE_FLOAT then val.setFloat(v)
+      when TYPE_DOUBLE then val.setDouble(v)
+      when TYPE_UUID then val.setUuid(v)
+      when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.setInt(v)
+      when TYPE_INT64 then val.setInt64(v)
+      when TYPE_MAP
+      when TYPE_OBJECT
+      when TYPE_LIST
+      when TYPE_ARRAY
       end
+    end
+
+    def [](name)
+      get_attr(name)
+    end
+
+    def []=(name, value)
+      set_attr(name, value)
+    end
+
+    def inc_attr(name, by=1)
+      set_attr(name, get_attr(name) + by)
+    end
 
-      def run()
-        event = Qmfengine::ResilientConnectionEvent.new
-        connected = nil
-        while :true
-          @sock.read(1)
+    def dec_attr(name, by=1)
+      set_attr(name, get_attr(name) - by)
+    end
 
-          @new_conn_handlers.each do |nh|
-            @conn_handlers.push(nh)
-            nh.conn_event_connected() if connected
+    def method_missing(name_in, *args)
+      #
+      # Convert the name to a string and determine if it represents an
+      # attribute assignment (i.e. "attr=")
+      #
+      name = name_in.to_s
+      attr_set = (name[name.length - 1] == 61)
+      name = name[0..name.length - 2] if attr_set
+      raise "Sets not permitted on this object" if attr_set && !@allow_sets
+
+      #
+      # If the name matches a property name, set or return the value of the property.
+      #
+      @object_class.properties.each do |prop|
+        if prop.name == name
+          if attr_set
+            return set_attr(name, args[0])
+          else
+            return get_attr(name)
           end
-          @new_conn_handlers = Array.new
+        end
+      end
 
-          valid = @impl.getEvent(event)
-          while valid
-            begin
-              case event.kind
-              when Qmfengine::ResilientConnectionEvent::CONNECTED
-                connected = :true
-                @conn_handlers.each { |h| h.conn_event_connected() }
-              when Qmfengine::ResilientConnectionEvent::DISCONNECTED
-                connected = nil
-                @conn_handlers.each { |h| h.conn_event_disconnected(event.errorText) }
-              when Qmfengine::ResilientConnectionEvent::SESSION_CLOSED
-                event.sessionContext.handler.sess_event_session_closed(event.sessionContext, event.errorText)
-              when Qmfengine::ResilientConnectionEvent::RECV
-                event.sessionContext.handler.sess_event_recv(event.sessionContext, event.message)
-              end
-            rescue Exception => ex
-              puts "Event Exception: #{ex}"
-              puts ex.backtrace
+      #
+      # Do the same for statistics
+      #
+      @object_class.statistics.each do |stat|
+        if stat.name == name
+          if attr_set
+            return set_attr(name, args[0])
+          else
+            return get_attr(name)
+          end
+        end
+      end
+
+      #
+      # If we still haven't found a match for the name, check to see if
+      # it matches a method name.  If so, marshall the arguments and invoke
+      # the method.
+      #
+      @object_class.methods.each do |method|
+        if method.name == name
+          raise "Sets not permitted on methods" if attr_set
+          timeout = 30
+          synchronize do
+            @sync_count = 1
+            @impl.invokeMethod(name, _marshall(method, args), self)
+            @broker.conn.kick if @broker
+            unless @cv.wait(timeout) { @sync_count == 0 }
+              raise "Timed out waiting for response"
             end
-            @impl.popEvent
-            valid = @impl.getEvent(event)
           end
+
+          return @sync_result
         end
       end
-    end
 
-    class Session
-      attr_reader :handle, :handler
+      #
+      # This name means nothing to us, pass it up the line to the parent
+      # class's handler.
+      #
+      super.method_missing(name_in, args)
+    end
 
-      def initialize(conn, label, handler)
-        @conn = conn
-        @label = label
-        @handler = handler
-        @handle = Qmfengine::SessionHandle.new
-        @conn.add_sess_handler(@handler)
-        result = @conn.impl.createSession(label, self, @handle)
+    def _method_result(result)
+      synchronize do
+        @sync_result = result
+        @sync_count -= 1
+        @cv.signal
       end
     end
 
-    class ObjectId
-      attr_reader :impl
-      def initialize(impl=nil)
-        if impl
-          @impl = impl
-        else
-          @impl = Qmfengine::ObjectId.new
+    #
+    # Convert a Ruby array of arguments (positional) into a Value object of type "map".
+    #
+    private
+    def _marshall(schema, args)
+      map = Qmfengine::Value.new(TYPE_MAP)
+      schema.arguments.each do |arg|
+        if arg.direction == DIR_IN || arg.direction == DIR_IN_OUT
+          map.insert(arg.name, Qmfengine::Value.new(arg.typecode))
         end
       end
 
-      def object_num_high
-        return @impl.getObjectNumHi
+      marshalled = Arguments.new(map)
+      idx = 0
+      schema.arguments.each do |arg|
+        if arg.direction == DIR_IN || arg.direction == DIR_IN_OUT
+          marshalled[arg.name] = args[idx] unless args[idx] == nil
+          idx += 1
+        end
       end
 
-      def object_num_low
-        return @impl.getObjectNumLo
-      end
+      return marshalled.map
+    end
 
-      def ==(other)
-        return (@impl.getObjectNumHi == other.impl.getObjectNumHi) &&
-           (@impl.getObjectNumLo == other.impl.getObjectNumLo)
+    private
+    def value(name)
+      val = @impl.getValue(name.to_s)
+      if val.nil?
+        raise ArgumentError, "Attribute '#{name}' not defined for class #{@object_class.impl.getClassKey.getPackageName}:#{@object_class.impl.getClassKey.getClassName}"
       end
+      return val
     end
+  end
 
-    class Arguments
-      attr_reader :map
-      def initialize(map)
-        @map = map
-        @by_hash = {}
-        key_count = @map.keyCount
-        a = 0
-        while a < key_count
-          @by_hash[@map.key(a)] = by_key(@map.key(a))
-          a += 1
-        end
-      end
+  class AgentObject < QmfObject
+    def initialize(cls, kwargs={})
+      super(cls, kwargs)
+      @allow_sets = :true
+    end
 
-      def [] (key)
-        return @by_hash[key]
-      end
+    def destroy
+      @impl.destroy
+    end
 
-      def []= (key, value)
-        @by_hash[key] = value
-        set(key, value)
-      end
+    def set_object_id(oid)
+      @impl.setObjectId(oid.impl)
+    end
+  end
 
-      def each
-        @by_hash.each { |k, v| yield(k, v) }
-      end
+  class ConsoleObject < QmfObject
+    attr_reader :current_time, :create_time, :delete_time
 
-      def by_key(key)
-        val = @map.byKey(key)
-        case val.getType
-        when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.asUint
-        when TYPE_UINT64                          then val.asUint64
-        when TYPE_SSTR, TYPE_LSTR                 then val.asString
-        when TYPE_ABSTIME                         then val.asInt64
-        when TYPE_DELTATIME                       then val.asUint64
-        when TYPE_REF                             then val.asObjectId
-        when TYPE_BOOL                            then val.asBool
-        when TYPE_FLOAT                           then val.asFloat
-        when TYPE_DOUBLE                          then val.asDouble
-        when TYPE_UUID                            then val.asUuid
-        when TYPE_INT8, TYPE_INT16, TYPE_INT32    then val.asInt
-        when TYPE_INT64                           then val.asInt64
-        when TYPE_MAP
-        when TYPE_OBJECT
-        when TYPE_LIST
-        when TYPE_ARRAY
-        end
-      end
+    def initialize(cls, kwargs={})
+      super(cls, kwargs)
+    end
 
-      def set(key, value)
-        val = @map.byKey(key)
-        case val.getType
-        when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.setUint(value)
-        when TYPE_UINT64 then val.setUint64(value)
-        when TYPE_SSTR, TYPE_LSTR then value ? val.setString(value) : val.setString('')
-        when TYPE_ABSTIME then val.setInt64(value)
-        when TYPE_DELTATIME then val.setUint64(value)
-        when TYPE_REF then val.setObjectId(value.impl)
-        when TYPE_BOOL then value ? val.setBool(value) : val.setBool(0)
-        when TYPE_FLOAT then val.setFloat(value)
-        when TYPE_DOUBLE then val.setDouble(value)
-        when TYPE_UUID then val.setUuid(value)
-        when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.setInt(value)
-        when TYPE_INT64 then val.setInt64(value)
-        when TYPE_MAP
-        when TYPE_OBJECT
-        when TYPE_LIST
-        when TYPE_ARRAY
-        end
-      end
+    def update()
     end
 
-    class AgentHandler
-      def get_query(context, query, userId); end
-      def method_call(context, name, object_id, args, userId); end
+    def mergeUpdate(newObject)
     end
 
-    class Agent < ConnectionHandler
-      def initialize(handler, label="")
-        if label == ""
-          @agentLabel = "rb-%s.%d" % [Socket.gethostname, Process::pid]
-        else
-          @agentLabel = label
-        end
-        @conn = nil
-        @handler = handler
-        @impl = Qmfengine::AgentEngine.new(@agentLabel)
-        @event = Qmfengine::AgentEvent.new
-        @xmtMessage = Qmfengine::Message.new
-      end
+    def deleted?()
+      @delete_time > 0
+    end
 
-      def set_connection(conn)
-        @conn = conn
-        @conn.add_conn_handler(self)
-      end
+    def index()
+    end
+  end
 
-      def register_class(cls)
-        @impl.registerClass(cls.impl)
+  class ObjectId
+    attr_reader :impl
+    def initialize(impl=nil)
+      if impl
+        @impl = impl
+      else
+        @impl = Qmfengine::ObjectId.new
       end
+    end
 
-      def alloc_object_id(low = 0, high = 0)
-        ObjectId.new(@impl.allocObjectId(low, high))
-      end
+    def object_num_high
+      return @impl.getObjectNumHi
+    end
 
-      def query_response(context, object)
-        @impl.queryResponse(context, object.impl)
-      end
+    def object_num_low
+      return @impl.getObjectNumLo
+    end
 
-      def query_complete(context)
-        @impl.queryComplete(context)
-      end
+    def ==(other)
+      return (@impl.getObjectNumHi == other.impl.getObjectNumHi) &&
+        (@impl.getObjectNumLo == other.impl.getObjectNumLo)
+    end
+  end
 
-      def method_response(context, status, text, arguments)
-        @impl.methodResponse(context, status, text, arguments.map)
+  class Arguments
+    attr_reader :map
+    def initialize(map)
+      @map = map
+      @by_hash = {}
+      key_count = @map.keyCount
+      a = 0
+      while a < key_count
+        @by_hash[@map.key(a)] = by_key(@map.key(a))
+        a += 1
       end
+    end
 
-      def do_agent_events()
-        count = 0
-        valid = @impl.getEvent(@event)
-        while valid
-          count += 1
-          case @event.kind
-          when Qmfengine::AgentEvent::GET_QUERY
-            @handler.get_query(@event.sequence, Query.new(@event.query), @event.authUserId)
-          when Qmfengine::AgentEvent::START_SYNC
-          when Qmfengine::AgentEvent::END_SYNC
-          when Qmfengine::AgentEvent::METHOD_CALL
-            args = Arguments.new(@event.arguments)
-            @handler.method_call(@event.sequence, @event.name, ObjectId.new(@event.objectId),
-                                 args, @event.authUserId)
-          when Qmfengine::AgentEvent::DECLARE_QUEUE
-            @conn.impl.declareQueue(@session.handle, @event.name)
-          when Qmfengine::AgentEvent::DELETE_QUEUE
-            @conn.impl.deleteQueue(@session.handle, @event.name)
-          when Qmfengine::AgentEvent::BIND
-            @conn.impl.bind(@session.handle, @event.exchange, @event.name, @event.bindingKey)
-          when Qmfengine::AgentEvent::UNBIND
-            @conn.impl.unbind(@session.handle, @event.exchange, @event.name, @event.bindingKey)
-          when Qmfengine::AgentEvent::SETUP_COMPLETE
-            @impl.startProtocol()
-          end
-          @impl.popEvent
-          valid = @impl.getEvent(@event)
-        end
-        return count
-      end
+    def [] (key)
+      return @by_hash[key]
+    end
 
-      def do_agent_messages()
-        count = 0
-        valid = @impl.getXmtMessage(@xmtMessage)
-        while valid
-          count += 1
-          @conn.impl.sendMessage(@session.handle, @xmtMessage)
-          @impl.popXmt
-          valid = @impl.getXmtMessage(@xmtMessage)
-        end
-        return count
-      end
+    def []= (key, value)
+      @by_hash[key] = value
+      set(key, value)
+    end
 
-      def do_events()
-        begin
-          ecnt = do_agent_events
-          mcnt = do_agent_messages
-        end until ecnt == 0 and mcnt == 0
-      end
+    def each
+      @by_hash.each { |k, v| yield(k, v) }
+    end
 
-      def conn_event_connected()
-        puts "Agent Connection Established..."
-        @session = Session.new(@conn, "qmfa-%s.%d" % [Socket.gethostname, Process::pid], self)
-        @impl.newSession
-        do_events
+    def by_key(key)
+      val = @map.byKey(key)
+      case val.getType
+      when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.asUint
+      when TYPE_UINT64                          then val.asUint64
+      when TYPE_SSTR, TYPE_LSTR                 then val.asString
+      when TYPE_ABSTIME                         then val.asInt64
+      when TYPE_DELTATIME                       then val.asUint64
+      when TYPE_REF                             then val.asObjectId
+      when TYPE_BOOL                            then val.asBool
+      when TYPE_FLOAT                           then val.asFloat
+      when TYPE_DOUBLE                          then val.asDouble
+      when TYPE_UUID                            then val.asUuid
+      when TYPE_INT8, TYPE_INT16, TYPE_INT32    then val.asInt
+      when TYPE_INT64                           then val.asInt64
+      when TYPE_MAP
+      when TYPE_OBJECT
+      when TYPE_LIST
+      when TYPE_ARRAY
       end
+    end
 
-      def conn_event_disconnected(error)
-        puts "Agent Connection Lost"
+    def set(key, value)
+      val = @map.byKey(key)
+      case val.getType
+      when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.setUint(value)
+      when TYPE_UINT64 then val.setUint64(value)
+      when TYPE_SSTR, TYPE_LSTR then value ? val.setString(value) : val.setString('')
+      when TYPE_ABSTIME then val.setInt64(value)
+      when TYPE_DELTATIME then val.setUint64(value)
+      when TYPE_REF then val.setObjectId(value.impl)
+      when TYPE_BOOL then value ? val.setBool(value) : val.setBool(0)
+      when TYPE_FLOAT then val.setFloat(value)
+      when TYPE_DOUBLE then val.setDouble(value)
+      when TYPE_UUID then val.setUuid(value)
+      when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.setInt(value)
+      when TYPE_INT64 then val.setInt64(value)
+      when TYPE_MAP
+      when TYPE_OBJECT
+      when TYPE_LIST
+      when TYPE_ARRAY
       end
+    end
+  end
+
+  class MethodResponse
+    def initialize(impl)
+      puts "start copying..."
+      @impl = Qmfengine::MethodResponse.new(impl)
+      puts "done copying..."
+    end
+
+    def status
+      @impl.getStatus
+    end
+
+    def exception
+      @impl.getException
+    end
+  end
 
-      def sess_event_session_closed(context, error)
-        puts "Agent Session Lost"
+  ##==============================================================================
+  ## QUERY
+  ##==============================================================================
+
+  class Query
+    attr_reader :impl
+    def initialize(kwargs = {})
+      if kwargs.include?(:impl)
+        @impl = kwargs[:impl]
+      else
+        package = ''
+        if kwargs.include?(:key)
+          @impl = Qmfengine::Query.new(kwargs[:key])
+        elsif kwargs.include?(:object_id)
+          @impl = Qmfengine::Query.new(kwargs[:object_id])
+        else
+          package = kwargs[:package] if kwargs.include?(:package)
+          if kwargs.include?(:class)
+            @impl = Qmfengine::Query.new(kwargs[:class], package)
+          else
+            raise ArgumentError, "Invalid arguments, use :key or :class[,:package]"
+          end
+        end
       end
+    end
+
+    def package_name
+      @impl.getPackage
+    end
 
-      def sess_event_recv(context, message)
-        @impl.handleRcvMessage(message)
-        do_events
+    def class_name
+      @impl.getClass
+    end
+
+    def object_id
+      objid = @impl.getObjectId
+      if objid.class == NilClass
+        return nil
       end
+      return ObjectId.new(objid)
     end
+  end
 
-    class SchemaArgument
-      attr_reader :impl
-      def initialize(name, typecode, kwargs={})
+  ##==============================================================================
+  ## SCHEMA
+  ##==============================================================================
+
+  class SchemaArgument
+    attr_reader :impl
+    def initialize(name, typecode, kwargs={})
+      if kwargs.include?(:impl)
+        @impl = kwargs[:impl]
+      else
         @impl = Qmfengine::SchemaArgument.new(name, typecode)
         @impl.setDirection(kwargs[:dir]) if kwargs.include?(:dir)
         @impl.setUnit(kwargs[:unit])     if kwargs.include?(:unit)
@@ -385,23 +586,51 @@
       end
     end
 
-    class SchemaMethod
-      attr_reader :impl
-      def initialize(name, kwargs={})
+    def name
+      @impl.getName
+    end
+
+    def direction
+      @impl.getDirection
+    end
+
+    def typecode
+      @impl.getType
+    end
+  end
+
+  class SchemaMethod
+    attr_reader :impl, :arguments
+    def initialize(name, kwargs={})
+      @arguments = []
+      if kwargs.include?(:impl)
+        @impl = kwargs[:impl]
+        arg_count = @impl.getArgumentCount
+        for i in 0...arg_count
+          @arguments << SchemaArgument.new(nil, nil, :impl => @impl.getArgument(i))
+        end
+      else
         @impl = Qmfengine::SchemaMethod.new(name)
         @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc)
-        @arguments = []
       end
+    end
 
-      def add_argument(arg)
-        @arguments << arg
-        @impl.addArgument(arg.impl)
-      end
+    def add_argument(arg)
+      @arguments << arg
+      @impl.addArgument(arg.impl)
+    end
+
+    def name
+      @impl.getName
     end
+  end
 
-    class SchemaProperty
-      attr_reader :impl
-      def initialize(name, typecode, kwargs={})
+  class SchemaProperty
+    attr_reader :impl
+    def initialize(name, typecode, kwargs={})
+      if kwargs.include?(:impl)
+        @impl = kwargs[:impl]
+      else
         @impl = Qmfengine::SchemaProperty.new(name, typecode)
         @impl.setAccess(kwargs[:access])     if kwargs.include?(:access)
         @impl.setIndex(kwargs[:index])       if kwargs.include?(:index)
@@ -409,161 +638,547 @@
         @impl.setUnit(kwargs[:unit])         if kwargs.include?(:unit)
         @impl.setDesc(kwargs[:desc])         if kwargs.include?(:desc)
       end
+    end
 
-      def name
-        @impl.getName
-      end
+    def name
+      @impl.getName
     end
+  end
 
-    class SchemaStatistic
-      attr_reader :impl
-      def initialize(name, typecode, kwargs={})
+  class SchemaStatistic
+    attr_reader :impl
+    def initialize(name, typecode, kwargs={})
+      if kwargs.include?(:impl)
+        @impl = kwargs[:impl]
+      else
         @impl = Qmfengine::SchemaStatistic.new(name, typecode)
         @impl.setUnit(kwargs[:unit]) if kwargs.include?(:unit)
         @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc)
       end
     end
 
-    class SchemaObjectClass
-      attr_reader :impl
-      def initialize(package, name, kwargs={})
+    def name
+      @impl.getName
+    end
+  end
+
+  class SchemaClassKey
+    attr_reader :impl
+    def initialize(i)
+      @impl = i
+    end
+
+    def get_package()
+      @impl.getPackageName()
+    end
+
+    def get_class()
+      @impl.getClassName()
+    end
+  end
+
+  class SchemaObjectClass
+    attr_reader :impl, :properties, :statistics, :methods
+    def initialize(package, name, kwargs={})
+      @properties = []
+      @statistics = []
+      @methods = []
+      if kwargs.include?(:impl)
+        @impl = kwargs[:impl]
+
+        @impl.getPropertyCount.times do |i|
+          @properties << SchemaProperty.new(nil, nil, :impl => @impl.getProperty(i))
+        end
+
+        @impl.getStatisticCount.times do |i|
+          @statistics << SchemaStatistic.new(nil, nil, :impl => @impl.getStatistic(i))
+        end
+          
+        @impl.getMethodCount.times do |i|
+          @methods << SchemaMethod.new(nil, :impl => @impl.getMethod(i))
+        end
+      else
         @impl = Qmfengine::SchemaObjectClass.new(package, name)
-        @properties = []
-        @statistics = []
-        @methods = []
       end
+    end
 
-      def add_property(prop)
-        @properties << prop
-        @impl.addProperty(prop.impl)
-      end
+    def add_property(prop)
+      @properties << prop
+      @impl.addProperty(prop.impl)
+    end
 
-      def add_statistic(stat)
-        @statistics << stat
-        @impl.addStatistic(stat.impl)
-      end
+    def add_statistic(stat)
+      @statistics << stat
+      @impl.addStatistic(stat.impl)
+    end
+
+    def add_method(meth)
+      @methods << meth
+      @impl.addMethod(meth.impl)
+    end
+
+    def name
+      @impl.getClassKey.getClassName
+    end
+  end
 
-      def add_method(meth)
-        @methods << meth
-        @impl.addMethod(meth.impl)
+  class SchemaEventClass
+    attr_reader :impl, :arguments
+    def initialize(package, name, kwargs={})
+      @arguments = []
+      if kwargs.include?(:impl)
+        @impl = kwargs[:impl]
+        @impl.getArgumentCount.times do |i|
+          @arguments << SchemaArgument.new(nil, nil, :impl => @impl.getArgument(i))
+        end
+      else
+        @impl = Qmfengine::SchemaEventClass.new(package, name)
+        @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc)
       end
+    end
+
+    def add_argument(arg)
+      @arguments << arg
+      @impl.addArgument(arg.impl)
+    end
+
+    def name
+      @impl.getClassKey.getClassName
+    end
+  end
+
+  ##==============================================================================
+  ## CONSOLE
+  ##==============================================================================
+
+  class ConsoleHandler
+    def agent_added(agent); end
+    def agent_deleted(agent); end
+    def new_package(package); end
+    def new_class(class_key); end
+    def object_update(object, hasProps, hasStats); end
+    def event_received(event); end
+    def agent_heartbeat(agent, timestamp); end
+    def method_response(resp); end
+    def broker_info(broker); end
+  end
+
+  class Console
+    include MonitorMixin
+    attr_reader :impl
+
+    def initialize(handler = nil, kwargs={})
+      super()
+      @handler = handler
+      @impl = Qmfengine::ConsoleEngine.new
+      @event = Qmfengine::ConsoleEvent.new
+      @broker_list = []
+      @cv = new_cond
+      @sync_count = nil
+      @sync_result = nil
+    end
 
-      def name
-        @impl.getName
+    def add_connection(conn)
+      broker = Broker.new(self, conn)
+      @broker_list << broker
+      return broker
+    end
+
+    def del_connection(broker)
+      broker.shutdown
+      @broker_list.delete(broker)
+    end
+
+    def get_packages()
+      plist = []
+      count = @impl.packageCount
+      for i in 0...count
+        plist << @impl.getPackageName(i)
       end
+      return plist
+    end
 
-      def properties
-        unless @properties
-          @properties = []
-          @impl.getPropertyCount.times do |i|
-            @properties << @impl.getProperty(i)
+    def get_classes(package, kind=CLASS_OBJECT)
+      clist = []
+      count = @impl.classCount(package)
+      for i in 0...count
+        key = @impl.getClass(package, i)
+        class_kind = @impl.getClassKind(key)
+        if class_kind == kind
+          if kind == CLASS_OBJECT
+            clist << SchemaObjectClass.new(nil, nil, :impl => @impl.getObjectClass(key))
+          elsif kind == CLASS_EVENT
+            clist << SchemaEventClass.new(nil, nil, :impl => @impl.getEventClass(key))
           end
         end
-        return @properties
       end
+
+      return clist
     end
 
-    class SchemaEventClass
-      attr_reader :impl
-      def initialize(package, name, kwargs={})
-        @impl = Qmfengine::SchemaEventClass.new(package, name)
-        @impl.setDesc(kwargs[:desc]) if kwargs.include?(:desc)
-        @arguments = []
-      end
+    def bind_package(package)
+      @impl.bindPackage(package)
+    end
 
-      def add_argument(arg)
-        @arguments << arg
-        @impl.addArgument(arg.impl)
+    def bind_class(kwargs = {})
+      if kwargs.include?(:key)
+        @impl.bindClass(kwargs[:key])
+      elsif kwargs.include?(:package)
+        package = kwargs[:package]
+        if kwargs.include?(:class)
+          @impl.bindClass(package, kwargs[:class])
+        else
+          @impl.bindClass(package)
+        end
+      else
+        raise ArgumentError, "Invalid arguments, use :key or :package[,:class]"
       end
     end
 
-    class QmfObject
-      attr_reader :impl, :object_class
-      def initialize(cls)
-        @object_class = cls
-        @impl = Qmfengine::Object.new(@object_class.impl)
+    def get_agents(broker = nil)
+      blist = []
+      if broker
+        blist << broker
+      else
+        blist = @broker_list
       end
 
-      def destroy
-        @impl.destroy
+      agents = []
+      blist.each do |b|
+        count = b.impl.agentCount
+        for idx in 0...count
+          agents << AgentProxy.new(b.impl.getAgent(idx), b)
+        end
       end
 
-      def object_id
-        return ObjectId.new(@impl.getObjectId)
-      end
+      return agents
+    end
 
-      def set_object_id(oid)
-        @impl.setObjectId(oid.impl)
+    def get_objects(query, kwargs = {})
+      timeout = 30
+      if kwargs.include?(:timeout)
+        timeout = kwargs[:timeout]
+      end
+      synchronize do
+        @sync_count = 1
+        @sync_result = []
+        broker = @broker_list[0]
+        broker.send_query(query.impl, nil)
+        unless @cv.wait(timeout) { @sync_count == 0 }
+          raise "Timed out waiting for response"
+        end
+
+        return @sync_result
       end
+    end
 
-      def get_attr(name)
-        val = value(name)
-        case val.getType
-        when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.asUint
-        when TYPE_UINT64 then val.asUint64
-        when TYPE_SSTR, TYPE_LSTR then val.asString
-        when TYPE_ABSTIME then val.asInt64
-        when TYPE_DELTATIME then val.asUint64
-        when TYPE_REF then val.asObjectId
-        when TYPE_BOOL then val.asBool
-        when TYPE_FLOAT then val.asFloat
-        when TYPE_DOUBLE then val.asDouble
-        when TYPE_UUID then val.asUuid
-        when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.asInt
-        when TYPE_INT64 then val.asInt64
-        when TYPE_MAP
-        when TYPE_OBJECT
-        when TYPE_LIST
-        when TYPE_ARRAY
+    def _get_result(list, context)
+      synchronize do
+        list.each do |item|
+          @sync_result << item
         end
+        @sync_count -= 1
+        @cv.signal
       end
+    end
+
+    def start_sync(query)
+    end
+
+    def touch_sync(sync)
+    end
 
-      def set_attr(name, v)
-        val = value(name)
-        case val.getType
-        when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.setUint(v)
-        when TYPE_UINT64 then val.setUint64(v)
-        when TYPE_SSTR, TYPE_LSTR then v ? val.setString(v) : val.setString('')
-        when TYPE_ABSTIME then val.setInt64(v)
-        when TYPE_DELTATIME then val.setUint64(v)
-        when TYPE_REF then val.setObjectId(v.impl)
-        when TYPE_BOOL then v ? val.setBool(v) : val.setBool(0)
-        when TYPE_FLOAT then val.setFloat(v)
-        when TYPE_DOUBLE then val.setDouble(v)
-        when TYPE_UUID then val.setUuid(v)
-        when TYPE_INT8, TYPE_INT16, TYPE_INT32 then val.setInt(v)
-        when TYPE_INT64 then val.setInt64(v)
-        when TYPE_MAP
-        when TYPE_OBJECT
-        when TYPE_LIST
-        when TYPE_ARRAY
+    def end_sync(sync)
+    end
+
+    def do_console_events()
+      count = 0
+      valid = @impl.getEvent(@event)
+      while valid
+        count += 1
+        puts "Console Event: #{@event.kind}"
+        case @event.kind
+        when Qmfengine::ConsoleEvent::AGENT_ADDED
+        when Qmfengine::ConsoleEvent::AGENT_DELETED
+        when Qmfengine::ConsoleEvent::NEW_PACKAGE
+        when Qmfengine::ConsoleEvent::NEW_CLASS
+        when Qmfengine::ConsoleEvent::OBJECT_UPDATE
+        when Qmfengine::ConsoleEvent::EVENT_RECEIVED
+        when Qmfengine::ConsoleEvent::AGENT_HEARTBEAT
+        when Qmfengine::ConsoleEvent::METHOD_RESPONSE
         end
+        @impl.popEvent
+        valid = @impl.getEvent(@event)
       end
+      return count
+    end
+  end
+
+  class AgentProxy
+    attr_reader :broker
+
+    def initialize(impl, broker)
+      @impl = impl
+      @broker = broker
+    end
 
-      def [](name)
-          get_attr(name)
+    def label
+      @impl.getLabel
+    end
+  end
+
+  class Broker < ConnectionHandler
+    include MonitorMixin
+    attr_reader :impl, :conn
+
+    def initialize(console, conn)
+      super()
+      @console = console
+      @conn = conn
+      @session = nil
+      @cv = new_cond
+      @stable = nil
+      @event = Qmfengine::BrokerEvent.new
+      @xmtMessage = Qmfengine::Message.new
+      @impl = Qmfengine::BrokerProxy.new(@console.impl)
+      @console.impl.addConnection(@impl, self)
+      @conn.add_conn_handler(self)
+      @operational = :true
+    end
+
+    def shutdown()
+      @console.impl.delConnection(@impl)
+      @conn.del_conn_handler(self)
+      @operational = :false
+    end
+
+    def waitForStable(timeout = nil)
+      synchronize do
+        return if @stable
+        if timeout
+          unless @cv.wait(timeout) { @stable }
+            raise "Timed out waiting for broker connection to become stable"
+          end
+        else
+          while not @stable
+            @cv.wait
+          end
+        end
       end
+    end
+
+    def send_query(query, ctx)
+      @impl.sendQuery(query, ctx)
+      @conn.kick
+    end
 
-      def []=(name, value)
-          set_attr(name, value)
+    def do_broker_events()
+      count = 0
+      valid = @impl.getEvent(@event)
+      while valid
+        count += 1
+        puts "Broker Event: #{@event.kind}"
+        case @event.kind
+        when Qmfengine::BrokerEvent::BROKER_INFO
+        when Qmfengine::BrokerEvent::DECLARE_QUEUE
+          @conn.impl.declareQueue(@session.handle, @event.name)
+        when Qmfengine::BrokerEvent::DELETE_QUEUE
+          @conn.impl.deleteQueue(@session.handle, @event.name)
+        when Qmfengine::BrokerEvent::BIND
+          @conn.impl.bind(@session.handle, @event.exchange, @event.name, @event.bindingKey)
+        when Qmfengine::BrokerEvent::UNBIND
+          @conn.impl.unbind(@session.handle, @event.exchange, @event.name, @event.bindingKey)
+        when Qmfengine::BrokerEvent::SETUP_COMPLETE
+          @impl.startProtocol
+        when Qmfengine::BrokerEvent::STABLE
+          synchronize do
+            @stable = :true
+            @cv.signal
+          end
+        when Qmfengine::BrokerEvent::QUERY_COMPLETE
+          result = []
+          for idx in 0...@event.queryResponse.getObjectCount
+            result << ConsoleObject.new(nil, :impl => @event.queryResponse.getObject(idx), :broker => self)
+          end
+          @console._get_result(result, @event.context)
+        when Qmfengine::BrokerEvent::METHOD_RESPONSE
+          obj = @event.context
+          obj._method_result(MethodResponse.new(@event.methodResponse))
+        end
+        @impl.popEvent
+        valid = @impl.getEvent(@event)
       end
+      return count
+    end
 
-      def inc_attr(name, by=1)
-        set_attr(name, get_attr(name) + by)
+    def do_broker_messages()
+      count = 0
+      valid = @impl.getXmtMessage(@xmtMessage)
+      while valid
+        count += 1
+        @conn.impl.sendMessage(@session.handle, @xmtMessage)
+        @impl.popXmt
+        valid = @impl.getXmtMessage(@xmtMessage)
       end
+      return count
+    end
+
+    def do_events()
+      begin
+        ccnt = @console.do_console_events
+        bcnt = do_broker_events
+        mcnt = do_broker_messages
+      end until ccnt == 0 and bcnt == 0 and mcnt == 0
+    end
+
+    def conn_event_connected()
+      puts "Console Connection Established..."
+      @session = Session.new(@conn, "qmfc-%s.%d" % [Socket.gethostname, Process::pid], self)
+      @impl.sessionOpened(@session.handle)
+      do_events
+    end
+
+    def conn_event_disconnected(error)
+      puts "Console Connection Lost"
+    end
+
+    def conn_event_visit
+      do_events
+    end
+
+    def sess_event_session_closed(context, error)
+      puts "Console Session Lost"
+      @impl.sessionClosed()
+    end
+
+    def sess_event_recv(context, message)
+      puts "Unexpected RECV Event" if not @operational
+      @impl.handleRcvMessage(message)
+      do_events
+    end
+  end
 
-      def dec_attr(name, by=1)
-        set_attr(name, get_attr(name) - by)
+  ##==============================================================================
+  ## AGENT
+  ##==============================================================================
+
+  class AgentHandler
+    def get_query(context, query, userId); end
+    def method_call(context, name, object_id, args, userId); end
+  end
+
+  class Agent < ConnectionHandler
+    def initialize(handler, label="")
+      if label == ""
+        @agentLabel = "rb-%s.%d" % [Socket.gethostname, Process::pid]
+      else
+        @agentLabel = label
+      end
+      @conn = nil
+      @handler = handler
+      @impl = Qmfengine::AgentEngine.new(@agentLabel)
+      @event = Qmfengine::AgentEvent.new
+      @xmtMessage = Qmfengine::Message.new
+    end
+
+    def set_connection(conn)
+      @conn = conn
+      @conn.add_conn_handler(self)
+    end
+
+    def register_class(cls)
+      @impl.registerClass(cls.impl)
+    end
+
+    def alloc_object_id(low = 0, high = 0)
+      ObjectId.new(@impl.allocObjectId(low, high))
+    end
+
+    def query_response(context, object)
+      @impl.queryResponse(context, object.impl)
+    end
+
+    def query_complete(context)
+      @impl.queryComplete(context)
+    end
+
+    def method_response(context, status, text, arguments)
+      @impl.methodResponse(context, status, text, arguments.map)
+    end
+
+    def do_agent_events()
+      count = 0
+      valid = @impl.getEvent(@event)
+      while valid
+        count += 1
+        case @event.kind
+        when Qmfengine::AgentEvent::GET_QUERY
+          @handler.get_query(@event.sequence, Query.new(:impl => @event.query), @event.authUserId)
+        when Qmfengine::AgentEvent::START_SYNC
+        when Qmfengine::AgentEvent::END_SYNC
+        when Qmfengine::AgentEvent::METHOD_CALL
+          args = Arguments.new(@event.arguments)
+          @handler.method_call(@event.sequence, @event.name, ObjectId.new(@event.objectId),
+                               args, @event.authUserId)
+        when Qmfengine::AgentEvent::DECLARE_QUEUE
+          @conn.impl.declareQueue(@session.handle, @event.name)
+        when Qmfengine::AgentEvent::DELETE_QUEUE
+          @conn.impl.deleteQueue(@session.handle, @event.name)
+        when Qmfengine::AgentEvent::BIND
+          @conn.impl.bind(@session.handle, @event.exchange, @event.name, @event.bindingKey)
+        when Qmfengine::AgentEvent::UNBIND
+          @conn.impl.unbind(@session.handle, @event.exchange, @event.name, @event.bindingKey)
+        when Qmfengine::AgentEvent::SETUP_COMPLETE
+          @impl.startProtocol()
+        end
+        @impl.popEvent
+        valid = @impl.getEvent(@event)
       end
+      return count
+    end
 
-      private
-      def value(name)
-          val = @impl.getValue(name.to_s)
-          if val.nil?
-              raise ArgumentError, "Attribute '#{name}' not defined for class #{@object_class.impl.getName}"
-          end
-          return val
+    def do_agent_messages()
+      count = 0
+      valid = @impl.getXmtMessage(@xmtMessage)
+      while valid
+        count += 1
+        @conn.impl.sendMessage(@session.handle, @xmtMessage)
+        @impl.popXmt
+        valid = @impl.getXmtMessage(@xmtMessage)
       end
+      return count
+    end
+
+    def do_events()
+      begin
+        ecnt = do_agent_events
+        mcnt = do_agent_messages
+      end until ecnt == 0 and mcnt == 0
+    end
+
+    def conn_event_connected()
+      puts "Agent Connection Established..."
+      @session = Session.new(@conn, "qmfa-%s.%d" % [Socket.gethostname, Process::pid], self)
+      @impl.newSession
+      do_events
+    end
+
+    def conn_event_disconnected(error)
+      puts "Agent Connection Lost"
+    end
+
+    def conn_event_visit
+      do_events
+    end
+
+    def sess_event_session_closed(context, error)
+      puts "Agent Session Lost"
+    end
+
+    def sess_event_recv(context, message)
+      @impl.handleRcvMessage(message)
+      do_events
     end
+  end
 
 end

Modified: qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/Makefile.am
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/Makefile.am?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/Makefile.am (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/Makefile.am Mon Oct  5 12:51:57 2009
@@ -18,4 +18,10 @@
 #
 
 TESTS = run_interop_tests
-EXTRA_DIST = run_interop_tests
+
+EXTRA_DIST =          \
+  agent_ruby.rb       \
+  python_agent.py     \
+  python_console.py   \
+  ruby_console.rb     \
+  run_interop_tests

Modified: qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/agent_ruby.rb
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/agent_ruby.rb?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/agent_ruby.rb (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/agent_ruby.rb Mon Oct  5 12:51:57 2009
@@ -53,7 +53,10 @@
     method = Qmf::SchemaMethod.new("create_child", :desc => "Create a new child object")
     method.add_argument(Qmf::SchemaArgument.new("child_name", Qmf::TYPE_LSTR, :dir => Qmf::DIR_IN))
     method.add_argument(Qmf::SchemaArgument.new("child_ref", Qmf::TYPE_REF, :dir => Qmf::DIR_OUT))
+    @parent_class.add_method(method)
 
+    method = Qmf::SchemaMethod.new("probe_userid", :desc => "Return the user-id for this method call")
+    method.add_argument(Qmf::SchemaArgument.new("userid", Qmf::TYPE_SSTR, :dir => Qmf::DIR_OUT))
     @parent_class.add_method(method)
 
     @child_class = Qmf::SchemaObjectClass.new("org.apache.qpid.qmf", "child")
@@ -69,8 +72,7 @@
 
 class App < Qmf::AgentHandler
   def get_query(context, query, userId)
-#    puts "Query: user=#{userId} context=#{context} class=#{query.class_name} object_num=#{query.object_id.object_num_low if query.object_id}"
-    #@parent.inc_attr("queryCount")
+#   puts "Query: user=#{userId} context=#{context} class=#{query.class_name} object_num=#{query.object_id.object_num_low if query.object_id}"
     if query.class_name == 'parent'
         @agent.query_response(context, @parent)
     elsif query.object_id == @parent_oid
@@ -90,37 +92,37 @@
       retText = "OK"
 
       if args['test'] == "big"
-        @parent.set_attr("uint64val", 0x9494949449494949)
-        @parent.set_attr("uint32val", 0xa5a55a5a)
-        @parent.set_attr("uint16val", 0xb66b)
-        @parent.set_attr("uint8val",  0xc7)
-
-        @parent.set_attr("int64val", 1000000000000000000)
-        @parent.set_attr("int32val", 1000000000)
-        @parent.set_attr("int16val", 10000)
-        @parent.set_attr("int8val",  100)
+        @parent.uint64val = 0x9494949449494949
+        @parent.uint32val = 0xa5a55a5a
+        @parent.uint16val = 0xb66b
+        @parent.uint8val  =  0xc7
+
+        @parent.int64val = 1000000000000000000
+        @parent.int32val = 1000000000
+        @parent.int16val = 10000
+        @parent.int8val  = 100
 
       elsif args['test'] == "small"
-        @parent.set_attr("uint64val", 4)
-        @parent.set_attr("uint32val", 5)
-        @parent.set_attr("uint16val", 6)
-        @parent.set_attr("uint8val",  7)
-
-        @parent.set_attr("int64val", 8)
-        @parent.set_attr("int32val", 9)
-        @parent.set_attr("int16val", 10)
-        @parent.set_attr("int8val",  11)
+        @parent.uint64val = 4
+        @parent.uint32val = 5
+        @parent.uint16val = 6
+        @parent.uint8val  = 7
+
+        @parent.int64val = 8
+        @parent.int32val = 9
+        @parent.int16val = 10
+        @parent.int8val  = 11
 
       elsif args['test'] == "negative"
-        @parent.set_attr("uint64val", 0)
-        @parent.set_attr("uint32val", 0)
-        @parent.set_attr("uint16val", 0)
-        @parent.set_attr("uint8val",  0)
-
-        @parent.set_attr("int64val", -10000000000)
-        @parent.set_attr("int32val", -100000)
-        @parent.set_attr("int16val", -1000)
-        @parent.set_attr("int8val",  -100)
+        @parent.uint64val = 0
+        @parent.uint32val = 0
+        @parent.uint16val = 0
+        @parent.uint8val  = 0
+
+        @parent.int64val = -10000000000
+        @parent.int32val = -100000
+        @parent.int16val = -1000
+        @parent.int8val  = -100
 
       else
         retCode = 1
@@ -132,10 +134,17 @@
     elsif name == "create_child"
       oid = @agent.alloc_object_id(2)
       args['child_ref'] = oid
-      @child = Qmf::QmfObject.new(@model.child_class)
-      @child.set_attr("name", args.by_key("child_name"))
+      @child = Qmf::AgentObject.new(@model.child_class)
+      @child.name = args.by_key("child_name")
       @child.set_object_id(oid)
       @agent.method_response(context, 0, "OK", args)
+
+    elsif name == "probe_userid"
+      args['userid'] = userId
+      @agent.method_response(context, 0, "OK", args)
+
+    else
+      @agent.method_response(context, 1, "Unimplemented Method: #{name}", args)
     end
   end
 
@@ -151,19 +160,19 @@
 
     @agent.set_connection(@connection)
 
-    @parent = Qmf::QmfObject.new(@model.parent_class)
-    @parent.set_attr("name", "Parent One")
-    @parent.set_attr("state", "OPERATIONAL")
-
-    @parent.set_attr("uint64val", 0)
-    @parent.set_attr("uint32val", 0)
-    @parent.set_attr("uint16val", 0)
-    @parent.set_attr("uint8val",  0)
-
-    @parent.set_attr("int64val", 0)
-    @parent.set_attr("int32val", 0)
-    @parent.set_attr("int16val", 0)
-    @parent.set_attr("int8val",  0)
+    @parent = Qmf::AgentObject.new(@model.parent_class)
+    @parent.name  = "Parent One"
+    @parent.state = "OPERATIONAL"
+
+    @parent.uint64val = 0
+    @parent.uint32val = 0
+    @parent.uint16val = 0
+    @parent.uint8val  = 0
+
+    @parent.int64val = 0
+    @parent.int32val = 0
+    @parent.int16val = 0
+    @parent.int8val  = 0
 
     @parent_oid = @agent.alloc_object_id(1)
     @parent.set_object_id(@parent_oid)

Modified: qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/python_console.py
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/python_console.py?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/python_console.py (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/python_console.py Mon Oct  5 12:51:57 2009
@@ -128,6 +128,18 @@
         self.assertEqual(parent.int16val, -1000)
         self.assertEqual(parent.int8val,  -100)
 
+    def test_D_userid_for_method(self):
+        self.startQmf();
+        qmf = self.qmf
+
+        parents = qmf.getObjects(_class="parent")
+        self.assertEqual(len(parents), 1)
+        parent = parents[0]
+
+        result = parent.probe_userid()
+        self.assertEqual(result.status, 0)
+        self.assertEqual(result.userid, "guest")
+
     def getProperty(self, msg, name):
         for h in msg.headers:
             if hasattr(h, name): return getattr(h, name)

Modified: qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/run_interop_tests
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/run_interop_tests?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/run_interop_tests (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/bindings/qmf/tests/run_interop_tests Mon Oct  5 12:51:57 2009
@@ -28,6 +28,9 @@
 API_DIR=${BUILD_DIR}/bindings/qmf
 SPEC_DIR=${QPID_DIR}/specs
 
+RUBY_LIB_DIR=${API_DIR}/ruby/.libs
+PYTHON_LIB_DIR=${API_DIR}/python/.libs
+
 trap stop_broker INT TERM QUIT
 
 start_broker() {
@@ -41,7 +44,7 @@
 }
 
 start_ruby_agent() {
-    ruby -I${MY_DIR}/../ruby -I${API_DIR}/ruby/.libs ${MY_DIR}/agent_ruby.rb localhost $BROKER_PORT &
+    ruby -I${MY_DIR}/../ruby -I${RUBY_LIB_DIR} ${MY_DIR}/agent_ruby.rb localhost $BROKER_PORT &
     AGENT_PID=$!
 }
 
@@ -49,19 +52,62 @@
     kill $AGENT_PID
 }
 
+start_python_agent() {
+    PYTHONPATH="${MY_DIR}/../python:${API_DIR}/python:${PYTHON_LIB_DIR}" python ${MY_DIR}/python_agent.py localhost $BROKER_PORT &
+    PY_AGENT_PID=$!
+}
+
+stop_python_agent() {
+    kill $PY_AGENT_PID
+}
+
+TESTS_FAILED=0
+
 if test -d ${PYTHON_DIR} ;  then
     start_broker
     echo "Running qmf interop tests using broker on port $BROKER_PORT"
     PYTHONPATH=${PYTHON_DIR}:${MY_DIR}
     export PYTHONPATH
-    echo "    Ruby Agent vs. Pure-Python Console"
-    start_ruby_agent
-    echo "    Ruby agent started at pid $AGENT_PID"
-    ${PYTHON_DIR}/qpid-python-test -m python_console -b localhost:$BROKER_PORT $@
-    RETCODE=$?
-    stop_ruby_agent
+
+    if test -d ${PYTHON_LIB_DIR} ; then
+        echo "    Python Agent (external storage) vs. Pure-Python Console"
+        start_python_agent
+        echo "    Python agent started at pid $PY_AGENT_PID"
+        ${PYTHON_DIR}/qpid-python-test -m python_console -b localhost:$BROKER_PORT $@
+        RETCODE=$?
+        stop_python_agent
+        if test x$RETCODE != x0; then
+            echo "FAIL qmf interop tests (Python Agent)";
+            TESTS_FAILED=1
+        fi
+    fi
+
+    if test -d ${RUBY_LIB_DIR} ; then
+        echo "    Ruby Agent (external storage) vs. Pure-Python Console"
+        start_ruby_agent
+        echo "    Ruby agent started at pid $AGENT_PID"
+        ${PYTHON_DIR}/qpid-python-test -m python_console -b localhost:$BROKER_PORT $@
+        RETCODE=$?
+        stop_ruby_agent
+        if test x$RETCODE != x0; then
+            echo "FAIL qmf interop tests (Ruby Agent)";
+            TESTS_FAILED=1
+        fi
+    fi
+
+    # Also against the Pure-Python console:
+    #   Ruby agent (internal storage)
+    #   Python agent (external and internal)
+    #   C++ agent (external and internal)
+    #
+    # Other consoles against the same set of agents:
+    #   Wrapped Python console
+    #   Ruby console
+    #   C++ console
+
     stop_broker
-    if test x$RETCODE != x0; then 
-        echo "FAIL qmf interop tests"; exit 1;
+    if test x$TESTS_FAILED != x0; then
+        echo "TEST FAILED!"
+        exit 1
     fi
 fi

Modified: qpid/branches/java-broker-0-10/qpid/cpp/configure.ac
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/configure.ac?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/configure.ac (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/configure.ac Mon Oct  5 12:51:57 2009
@@ -515,6 +515,7 @@
   examples/messaging/Makefile
   bindings/qmf/Makefile
   bindings/qmf/ruby/Makefile
+  bindings/qmf/python/Makefile
   bindings/qmf/tests/Makefile
   managementgen/Makefile
   etc/Makefile

Modified: qpid/branches/java-broker-0-10/qpid/cpp/examples/messaging/server.cpp
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/examples/messaging/server.cpp?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/examples/messaging/server.cpp (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/examples/messaging/server.cpp Mon Oct  5 12:51:57 2009
@@ -44,9 +44,7 @@
     try {
         Connection connection = Connection::open(url);
         Session session = connection.newSession();
-        VariantMap options;
-        options["auto_acknowledge"] = 0;
-        Receiver receiver = session.createReceiver("service_queue", options);
+        Receiver receiver = session.createReceiver("service_queue");
 
         while (true) {
             Message request = receiver.fetch();

Modified: qpid/branches/java-broker-0-10/qpid/cpp/include/qmf/QmfImportExport.h
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/include/qmf/QmfImportExport.h?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/include/qmf/QmfImportExport.h (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/include/qmf/QmfImportExport.h Mon Oct  5 12:51:57 2009
@@ -21,7 +21,7 @@
  */
 
 #if defined(WIN32) && !defined(QPID_DECLARE_STATIC)
-#  if defined(QMF_EXPORT) || defined (qmf_EXPORTS)
+#  if defined(QMF_EXPORT) || defined (qmfcommon_EXPORTS)
 #    define QMF_EXTERN __declspec(dllexport)
 #  else
 #    define QMF_EXTERN __declspec(dllimport)

Modified: qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/framing/FieldTable.h
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/framing/FieldTable.h?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/framing/FieldTable.h (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/framing/FieldTable.h Mon Oct  5 12:51:57 2009
@@ -52,6 +52,7 @@
     typedef std::map<std::string, ValuePtr> ValueMap;
     typedef ValueMap::iterator iterator;
     typedef ValueMap::const_reference const_reference;
+    typedef ValueMap::reference reference;
     typedef ValueMap::value_type value_type;
 
     QPID_COMMON_EXTERN FieldTable() {};
@@ -108,7 +109,7 @@
     ValueMap::iterator find(const std::string& s) { return values.find(s); }
 
     std::pair <ValueMap::iterator, bool> insert(const ValueMap::value_type&);
-    ValueMap::iterator insert(ValueMap::iterator, const ValueMap::value_type&);
+    QPID_COMMON_EXTERN ValueMap::iterator insert(ValueMap::iterator, const ValueMap::value_type&);
     void clear() { values.clear(); }
 
     // ### Hack Alert

Modified: qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/framing/List.h
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/framing/List.h?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/framing/List.h (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/framing/List.h Mon Oct  5 12:51:57 2009
@@ -44,6 +44,7 @@
     typedef Values::const_iterator const_iterator;
     typedef Values::iterator iterator;
     typedef Values::const_reference const_reference;
+    typedef Values::reference reference;
 
     QPID_COMMON_EXTERN uint32_t encodedSize() const;
     QPID_COMMON_EXTERN void encode(Buffer& buffer) const;

Modified: qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/framing/Uuid.h
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/framing/Uuid.h?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/framing/Uuid.h (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/framing/Uuid.h Mon Oct  5 12:51:57 2009
@@ -20,7 +20,6 @@
  */
 
 #include "qpid/CommonImportExport.h"
-#include "qpid/sys/uuid.h"
 #include "qpid/sys/IntegerTypes.h"
 
 #include <boost/array.hpp>
@@ -38,33 +37,31 @@
  *
  * Full value semantics, operators ==, < etc.  are provided by
  * boost::array so Uuid can be the key type in a map etc.
+ *
+ * TODO: change this implementation as it leaks boost into the
+ * client API
  */
 struct Uuid : public boost::array<uint8_t, 16> {
     /** If unique is true, generate a unique ID else a null ID. */
-    Uuid(bool unique=false) { if (unique) generate(); else clear(); }
+    QPID_COMMON_EXTERN Uuid(bool unique=false);
 
     /** Copy from 16 bytes of data. */
-    Uuid(const uint8_t* data) { assign(data); }
+    QPID_COMMON_EXTERN Uuid(const uint8_t* data);
+
+    // Default op= and copy ctor are fine.
+    // boost::array gives us ==, < etc.
 
     /** Copy from 16 bytes of data. */
-    void assign(const uint8_t* data) {
-        uuid_copy(c_array(), data);
-    }
+    void assign(const uint8_t* data);
 
     /** Set to a new unique identifier. */
-    void generate() { uuid_generate(c_array()); }
+    QPID_COMMON_EXTERN void generate();
 
     /** Set to all zeros. */
-    void clear() { uuid_clear(c_array()); }
+    void clear();
 
     /** Test for null (all zeros). */
-    // Force int 0/!0 to false/true; avoids compile warnings.
-    bool isNull() {
-        return !!uuid_is_null(data());
-    }
-
-    // Default op= and copy ctor are fine.
-    // boost::array gives us ==, < etc.
+    bool isNull();
 
     QPID_COMMON_EXTERN void encode(framing::Buffer& buf) const;
     QPID_COMMON_EXTERN void decode(framing::Buffer& buf);

Modified: qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/management/Manageable.h
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/management/Manageable.h?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/management/Manageable.h (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/management/Manageable.h Mon Oct  5 12:51:57 2009
@@ -43,7 +43,7 @@
     static const status_t STATUS_UNKNOWN_OBJECT          = 1;
     static const status_t STATUS_UNKNOWN_METHOD          = 2;
     static const status_t STATUS_NOT_IMPLEMENTED         = 3;
-    static const status_t STATUS_INVALID_PARAMETER       = 4;
+    static const status_t STATUS_PARAMETER_INVALID       = 4;
     static const status_t STATUS_FEATURE_NOT_IMPLEMENTED = 5;
     static const status_t STATUS_FORBIDDEN               = 6;
     static const status_t STATUS_EXCEPTION               = 7;

Modified: qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Connection.h
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Connection.h?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Connection.h (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Connection.h Mon Oct  5 12:51:57 2009
@@ -41,7 +41,7 @@
 class Connection : public qpid::client::Handle<ConnectionImpl>
 {
   public:
-    static Connection open(const std::string& url, const Variant::Map& options = Variant::Map());
+    static QPID_CLIENT_EXTERN Connection open(const std::string& url, const Variant::Map& options = Variant::Map());
 
     QPID_CLIENT_EXTERN Connection(ConnectionImpl* impl = 0);
     QPID_CLIENT_EXTERN Connection(const Connection&);

Modified: qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Message.h
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Message.h?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Message.h (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Message.h Mon Oct  5 12:51:57 2009
@@ -33,9 +33,9 @@
 
 namespace messaging {
 
-class Address;
+struct Address;
 class Codec;
-class MessageImpl;
+struct MessageImpl;
 
 /**
  * Representation of a message.
@@ -79,11 +79,9 @@
     QPID_CLIENT_EXTERN void encode(Codec&);
     QPID_CLIENT_EXTERN void decode(Codec&);
 
-    //TODO: move this out of the public API
-    QPID_CLIENT_EXTERN void setInternalId(void*);
-    QPID_CLIENT_EXTERN void* getInternalId();
   private:
     MessageImpl* impl;
+    friend struct MessageImplAccess;
 };
 }} // namespace qpid::messaging
 

Modified: qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Receiver.h
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Receiver.h?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Receiver.h (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Receiver.h Mon Oct  5 12:51:57 2009
@@ -40,7 +40,7 @@
 class ReceiverImpl;
 
 /**
- * A pull style interface for message retrieval.
+ * Interface through which messages are received.
  */
 class Receiver : public qpid::client::Handle<ReceiverImpl>
 {
@@ -75,7 +75,7 @@
     QPID_CLIENT_EXTERN bool fetch(Message& message, qpid::sys::Duration timeout=qpid::sys::TIME_INFINITE);
     /**
      * Retrieves a message for this receivers subscription or waits
-     * for upto the specified timeout for one to become
+     * for up to the specified timeout for one to become
      * available. Unlike get() this method will check with the server
      * that there is no message for the subscription this receiver is
      * serving before throwing an exception.
@@ -87,8 +87,8 @@
      */
     QPID_CLIENT_EXTERN void start();
     /**
-     * Stops the message flow for this receiver (without actually
-     * cancelling the subscription).
+     * Stops the message flow for this receiver (but does not cancel
+     * the subscription).
      */
     QPID_CLIENT_EXTERN void stop();
     /**
@@ -97,14 +97,35 @@
      * requested by a client via fetch() (or pushed to a listener).
      */
     QPID_CLIENT_EXTERN void setCapacity(uint32_t);
+    /**
+     * Returns the capacity of the receiver. The capacity determines
+     * how many incoming messages can be held in the receiver before
+     * being requested by a client via fetch() (or pushed to a
+     * listener).
+     */
+    QPID_CLIENT_EXTERN uint32_t getCapacity();
+    /**
+     * Returns the number of messages received and waiting to be
+     * fetched.
+     */
+    QPID_CLIENT_EXTERN uint32_t available();
+    /**
+     * Returns a count of the number of messages received on this
+     * receiver that have been acknowledged, but for which that
+     * acknowledgement has not yet been confirmed as processed by the
+     * server.
+     */
+    QPID_CLIENT_EXTERN uint32_t pendingAck();
 
     /**
-     * Cancels this receiver
+     * Cancels this receiver.
      */
     QPID_CLIENT_EXTERN void cancel();
 
     /**
-     * Set a message listener for receiving messages asynchronously.
+     * Set a message listener for this receiver.
+     * 
+     * @see Session::dispatch()
      */
     QPID_CLIENT_EXTERN void setListener(MessageListener* listener);
   private:

Modified: qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Sender.h
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Sender.h?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Sender.h (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Sender.h Mon Oct  5 12:51:57 2009
@@ -23,6 +23,7 @@
  */
 #include "qpid/client/ClientImportExport.h"
 #include "qpid/client/Handle.h"
+#include "qpid/sys/IntegerTypes.h"
 
 namespace qpid {
 namespace client {
@@ -47,8 +48,26 @@
     QPID_CLIENT_EXTERN ~Sender();
     QPID_CLIENT_EXTERN Sender& operator=(const Sender&);
 
-    QPID_CLIENT_EXTERN void send(Message& message);
+    QPID_CLIENT_EXTERN void send(const Message& message);
     QPID_CLIENT_EXTERN void cancel();
+
+    /**
+     * Sets the capacity for the sender. The capacity determines how
+     * many outgoing messages can be held pending confirmation of
+     * receipt by the broker.
+     */
+    QPID_CLIENT_EXTERN void setCapacity(uint32_t);
+    /**
+     * Returns the capacity of the sender. 
+     * @see setCapacity
+     */
+    QPID_CLIENT_EXTERN uint32_t getCapacity();
+    /**
+     * Returns the number of sent messages pending confirmation of
+     * receipt by the broker. (These are the 'in-doubt' messages).
+     */
+    QPID_CLIENT_EXTERN uint32_t pending();
+
   private:
   friend class qpid::client::PrivateImplRef<Sender>;
 };

Modified: qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Session.h
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Session.h?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Session.h (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Session.h Mon Oct  5 12:51:57 2009
@@ -35,8 +35,8 @@
 
 namespace messaging {
 
-class Address;
-class Filter;
+struct Address;
+struct Filter;
 class Message;
 class MessageListener;
 class Sender;
@@ -75,6 +75,17 @@
     QPID_CLIENT_EXTERN void sync();
     QPID_CLIENT_EXTERN void flush();
 
+    /**
+     * Returns the number of messages received and waiting to be
+     * fetched.
+     */
+    QPID_CLIENT_EXTERN uint32_t available();
+    /**
+     * Returns a count of the number of messages received this session
+     * that have been acknowledged, but for which that acknowledgement
+     * has not yet been confirmed as processed by the server.
+     */
+    QPID_CLIENT_EXTERN uint32_t pendingAck();
     QPID_CLIENT_EXTERN bool fetch(Message& message, qpid::sys::Duration timeout=qpid::sys::TIME_INFINITE);
     QPID_CLIENT_EXTERN Message fetch(qpid::sys::Duration timeout=qpid::sys::TIME_INFINITE);
     QPID_CLIENT_EXTERN bool dispatch(qpid::sys::Duration timeout=qpid::sys::TIME_INFINITE);
@@ -88,9 +99,6 @@
     QPID_CLIENT_EXTERN Receiver createReceiver(const std::string& address, const Filter& filter, const VariantMap& options = VariantMap());
 
     QPID_CLIENT_EXTERN Address createTempQueue(const std::string& baseName = std::string());
-
-    QPID_CLIENT_EXTERN void* getLastConfirmedSent();
-    QPID_CLIENT_EXTERN void* getLastConfirmedAcknowledged();
   private:
   friend class qpid::client::PrivateImplRef<Session>;
 };

Modified: qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Variant.h
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Variant.h?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Variant.h (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/messaging/Variant.h Mon Oct  5 12:51:57 2009
@@ -44,21 +44,21 @@
 };
 
 enum VariantType {
-    VOID = 0,
-    BOOL,
-    UINT8,
-    UINT16,
-    UINT32,
-    UINT64,
-    INT8,
-    INT16,
-    INT32,
-    INT64,
-    FLOAT,
-    DOUBLE,
-    STRING,
-    MAP,
-    LIST
+    VAR_VOID = 0,
+    VAR_BOOL,
+    VAR_UINT8,
+    VAR_UINT16,
+    VAR_UINT32,
+    VAR_UINT64,
+    VAR_INT8,
+    VAR_INT16,
+    VAR_INT32,
+    VAR_INT64,
+    VAR_FLOAT,
+    VAR_DOUBLE,
+    VAR_STRING,
+    VAR_MAP,
+    VAR_LIST
 };
 
 class VariantImpl;

Modified: qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/sys/windows/Condition.h
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/sys/windows/Condition.h?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/sys/windows/Condition.h (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/sys/windows/Condition.h Mon Oct  5 12:51:57 2009
@@ -30,7 +30,6 @@
 #include <boost/thread/condition.hpp>
 #include <boost/thread/thread_time.hpp>
 #include <windows.h>
-#undef STATUS_INVALID_PARAMETER // Hack for windows.h namespace pollution
 
 namespace qpid {
 namespace sys {

Modified: qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/sys/windows/Mutex.h
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/sys/windows/Mutex.h?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/sys/windows/Mutex.h (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/include/qpid/sys/windows/Mutex.h Mon Oct  5 12:51:57 2009
@@ -31,7 +31,6 @@
 #include <boost/thread/shared_mutex.hpp>
 #include <boost/thread/thread_time.hpp>
 #include <boost/thread/tss.hpp>
-#undef STATUS_INVALID_PARAMETER // Hack for windows.h namespace pollution
 
 namespace qpid {
 namespace sys {

Modified: qpid/branches/java-broker-0-10/qpid/cpp/src/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/src/CMakeLists.txt?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/src/CMakeLists.txt (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/src/CMakeLists.txt Mon Oct  5 12:51:57 2009
@@ -528,6 +528,8 @@
      qpid/messaging/ConnectionImpl.h
      qpid/messaging/Filter.cpp
      qpid/messaging/Message.cpp
+     qpid/messaging/MessageImpl.h
+     qpid/messaging/MessageImpl.cpp
      qpid/messaging/Receiver.cpp
      qpid/messaging/ReceiverImpl.h
      qpid/messaging/Session.cpp
@@ -535,17 +537,20 @@
      qpid/messaging/Sender.cpp
      qpid/messaging/SenderImpl.h
      qpid/messaging/Variant.cpp
+     qpid/client/amqp0_10/AcceptTracker.h
+     qpid/client/amqp0_10/AcceptTracker.cpp
      qpid/client/amqp0_10/AddressResolution.h
      qpid/client/amqp0_10/AddressResolution.cpp
      qpid/client/amqp0_10/Codecs.cpp
-     qpid/client/amqp0_10/CompletionTracker.h
-     qpid/client/amqp0_10/CompletionTracker.cpp
+     qpid/client/amqp0_10/CodecsInternal.h
      qpid/client/amqp0_10/ConnectionImpl.h
      qpid/client/amqp0_10/ConnectionImpl.cpp
      qpid/client/amqp0_10/IncomingMessages.h
      qpid/client/amqp0_10/IncomingMessages.cpp
      qpid/client/amqp0_10/MessageSink.h
      qpid/client/amqp0_10/MessageSource.h
+     qpid/client/amqp0_10/OutgoingMessage.h
+     qpid/client/amqp0_10/OutgoingMessage.cpp
      qpid/client/amqp0_10/ReceiverImpl.h
      qpid/client/amqp0_10/ReceiverImpl.cpp
      qpid/client/amqp0_10/SessionImpl.h

Modified: qpid/branches/java-broker-0-10/qpid/cpp/src/Makefile.am
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/src/Makefile.am?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/src/Makefile.am (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/src/Makefile.am Mon Oct  5 12:51:57 2009
@@ -54,7 +54,7 @@
   qpid/sys/windows/Time.cpp \
   ../include/qpid/sys/windows/Time.h \
   qpid/sys/windows/uuid.cpp \
-  ../include/qpid/sys/windows/uuid.h \
+  qpid/sys/windows/uuid.h \
   windows/QpiddBroker.cpp \
   qpid/broker/windows/BrokerDefaults.cpp \
   qpid/broker/windows/SaslAuthenticator.cpp
@@ -461,7 +461,8 @@
   qpid/sys/Timer.cpp				\
   qpid/sys/Timer.h				\
   qpid/sys/Waitable.h				\
-  qpid/sys/alloca.h
+  qpid/sys/alloca.h				\
+  qpid/sys/uuid.h
 
 if HAVE_SASL
 libqpidcommon_la_SOURCES += qpid/sys/cyrus/CyrusSecurityLayer.h
@@ -686,6 +687,8 @@
   qpid/messaging/Connection.cpp			\
   qpid/messaging/Filter.cpp			\
   qpid/messaging/Message.cpp			\
+  qpid/messaging/MessageImpl.h			\
+  qpid/messaging/MessageImpl.cpp		\
   qpid/messaging/Sender.cpp			\
   qpid/messaging/Receiver.cpp			\
   qpid/messaging/Session.cpp			\
@@ -694,17 +697,20 @@
   qpid/messaging/SenderImpl.h			\
   qpid/messaging/ReceiverImpl.h			\
   qpid/messaging/SessionImpl.h			\
+  qpid/client/amqp0_10/AcceptTracker.h		\
+  qpid/client/amqp0_10/AcceptTracker.cpp	\
   qpid/client/amqp0_10/AddressResolution.h	\
   qpid/client/amqp0_10/AddressResolution.cpp	\
   qpid/client/amqp0_10/Codecs.cpp		\
+  qpid/client/amqp0_10/CodecsInternal.h		\
   qpid/client/amqp0_10/ConnectionImpl.h	        \
   qpid/client/amqp0_10/ConnectionImpl.cpp	\
-  qpid/client/amqp0_10/CompletionTracker.h	\
-  qpid/client/amqp0_10/CompletionTracker.cpp	\
   qpid/client/amqp0_10/IncomingMessages.h	\
   qpid/client/amqp0_10/IncomingMessages.cpp	\
   qpid/client/amqp0_10/MessageSink.h		\
   qpid/client/amqp0_10/MessageSource.h		\
+  qpid/client/amqp0_10/OutgoingMessage.h	\
+  qpid/client/amqp0_10/OutgoingMessage.cpp	\
   qpid/client/amqp0_10/ReceiverImpl.h		\
   qpid/client/amqp0_10/ReceiverImpl.cpp		\
   qpid/client/amqp0_10/SessionImpl.h		\
@@ -780,7 +786,6 @@
   ../include/qpid/sys/SystemInfo.h		\
   ../include/qpid/sys/Thread.h			\
   ../include/qpid/sys/Time.h			\
-  ../include/qpid/sys/uuid.h			\
   ../include/qpid/messaging/Address.h 		\
   ../include/qpid/messaging/Connection.h 	\
   ../include/qpid/messaging/Codec.h 	        \

Modified: qpid/branches/java-broker-0-10/qpid/cpp/src/qmf.mk
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-0-10/qpid/cpp/src/qmf.mk?rev=821779&r1=821778&r2=821779&view=diff
==============================================================================
--- qpid/branches/java-broker-0-10/qpid/cpp/src/qmf.mk (original)
+++ qpid/branches/java-broker-0-10/qpid/cpp/src/qmf.mk Mon Oct  5 12:51:57 2009
@@ -35,8 +35,12 @@
   ../include/qmf/AgentObject.h
 
 libqmfcommon_la_SOURCES =			\
+  qmf/BrokerProxyImpl.cpp			\
+  qmf/BrokerProxyImpl.h				\
   qmf/ConnectionSettingsImpl.cpp		\
   qmf/ConnectionSettingsImpl.h			\
+  qmf/ConsoleEngineImpl.cpp			\
+  qmf/ConsoleEngineImpl.h			\
   qmf/ConsoleEngine.h				\
   qmf/Event.h					\
   qmf/Message.h					\
@@ -48,11 +52,15 @@
   qmf/ObjectIdImpl.h				\
   qmf/ObjectImpl.cpp				\
   qmf/ObjectImpl.h				\
+  qmf/Protocol.cpp				\
+  qmf/Protocol.h				\
   qmf/Query.h					\
   qmf/QueryImpl.cpp				\
   qmf/QueryImpl.h				\
   qmf/ResilientConnection.cpp			\
   qmf/ResilientConnection.h			\
+  qmf/SequenceManager.cpp			\
+  qmf/SequenceManager.h				\
   qmf/Schema.h					\
   qmf/SchemaImpl.cpp				\
   qmf/SchemaImpl.h				\



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org