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