diff options
| author | Ted Ross <tross@apache.org> | 2009-06-11 15:54:37 +0000 |
|---|---|---|
| committer | Ted Ross <tross@apache.org> | 2009-06-11 15:54:37 +0000 |
| commit | 52be8c6219f98781d83711b32d4c5971b1fa6d1c (patch) | |
| tree | 812f608b9472a76d757e92be8dc3a184a2e2ae13 /cpp | |
| parent | 2a61047873520b644cbc368ebd59fb2d5a0c217d (diff) | |
| download | qpid-python-52be8c6219f98781d83711b32d4c5971b1fa6d1c.tar.gz | |
QPID-1786 - Committed qmf patches from Bryan Kearney
Additionally updated existing qmf and Qman to be compatible.
The magic number for qmf messages has been incremented.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@783818 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
| -rw-r--r-- | cpp/bindings/qmf/ruby/Makefile.am | 2 | ||||
| -rw-r--r-- | cpp/examples/qmf-agent/Makefile | 2 | ||||
| -rw-r--r-- | cpp/managementgen/qmfgen/management-types.xml | 2 | ||||
| -rw-r--r-- | cpp/managementgen/qmfgen/templates/Class.cpp | 1 | ||||
| -rw-r--r-- | cpp/managementgen/qmfgen/templates/Event.cpp | 1 | ||||
| -rw-r--r-- | cpp/src/qmf/Agent.cpp | 4 | ||||
| -rw-r--r-- | cpp/src/qmf/SchemaImpl.cpp | 1 | ||||
| -rw-r--r-- | cpp/src/qpid/agent/ManagementAgentImpl.cpp | 4 | ||||
| -rw-r--r-- | cpp/src/qpid/console/Broker.cpp | 4 | ||||
| -rw-r--r-- | cpp/src/qpid/console/Schema.cpp | 15 | ||||
| -rw-r--r-- | cpp/src/qpid/console/Value.cpp | 2 | ||||
| -rw-r--r-- | cpp/src/qpid/console/Value.h | 6 | ||||
| -rw-r--r-- | cpp/src/qpid/framing/FieldTable.cpp | 135 | ||||
| -rw-r--r-- | cpp/src/qpid/framing/FieldTable.h | 4 | ||||
| -rw-r--r-- | cpp/src/qpid/management/ManagementAgent.cpp | 19 |
15 files changed, 186 insertions, 16 deletions
diff --git a/cpp/bindings/qmf/ruby/Makefile.am b/cpp/bindings/qmf/ruby/Makefile.am index 8e10b418dc..4b5f42bae0 100644 --- a/cpp/bindings/qmf/ruby/Makefile.am +++ b/cpp/bindings/qmf/ruby/Makefile.am @@ -13,7 +13,7 @@ rubylibdir = $(RUBY_LIB) dist_rubylib_DATA = qmf.rb $(generated_file_list): $(srcdir)/ruby.i $(srcdir)/../qmfengine.i - swig -ruby -c++ -Wall -I/usr/include $(INCLUDES) $(QPID_CXXFLAGS) -I$(top_srcdir)/src/qmf -o qmfengine.cpp $(srcdir)/ruby.i + swig -ruby -c++ -Wall -I/usr/include $(INCLUDES) $(QPID_CXXFLAGS) -o qmfengine.cpp $(srcdir)/ruby.i AM_CPPFLAGS = $(QPID_CXXFLAGS) $(INCLUDES) -I$(srcdir) -I$(RUBY_INC) -I$(RUBY_INC_ARCH) AM_CXXFLAGS = $(QPID_CXXFLAGS) diff --git a/cpp/examples/qmf-agent/Makefile b/cpp/examples/qmf-agent/Makefile index 4c5daa6888..7e460bcd16 100644 --- a/cpp/examples/qmf-agent/Makefile +++ b/cpp/examples/qmf-agent/Makefile @@ -27,7 +27,7 @@ CC = gcc LIB_DIR = $(QPID_DIR)/cpp/src/.libs CC_INCLUDES = -I$(SRC_DIR) -I$(QPID_DIR)/cpp/src -I$(QPID_DIR)/cpp/src/gen -I$(GEN_DIR) CC_FLAGS = -g -O3 -LD_FLAGS = -lqmfagent -L$(LIB_DIR) +LD_FLAGS = -lqmfagent -lqmfcommon -L$(LIB_DIR) SPEC_DIR = $(QPID_DIR)/specs MGEN_DIR = $(QPID_DIR)/cpp/managementgen MGEN = $(MGEN_DIR)/qmf-gen diff --git a/cpp/managementgen/qmfgen/management-types.xml b/cpp/managementgen/qmfgen/management-types.xml index 626880afb3..e235920447 100644 --- a/cpp/managementgen/qmfgen/management-types.xml +++ b/cpp/managementgen/qmfgen/management-types.xml @@ -36,7 +36,7 @@ <type name="float" base="FLOAT" cpp="float" encode="@.putFloat(#)" decode="# = @.getFloat()" accessor="direct" init="0."/> <type name="double" base="DOUBLE" cpp="double" encode="@.putDouble(#)" decode="# = @.getDouble()" accessor="direct" init="0."/> <type name="uuid" base="UUID" cpp="::qpid::framing::Uuid" encode="#.encode(@)" decode="#.decode(@)" accessor="direct" init="::qpid::framing::Uuid()" byRef="y"/> -<type name="map" base="FTABLE" cpp="::qpid::framing::FieldTable" encode="#.encode(@)" decode="#.decode(@)" accessor="direct" init="::qpid::framing::FieldTable()" byRef="y"/> +<type name="map" base="FTABLE" cpp="::qpid::framing::FieldTable" encode="#.qmfEncode(@)" decode="#.decode(@)" accessor="direct" init="::qpid::framing::FieldTable()" byRef="y"/> <type name="hilo8" base="U8" cpp="uint8_t" encode="@.putOctet(#)" decode="# = @.getOctet()" style="wm" accessor="counter" init="0"/> <type name="hilo16" base="U16" cpp="uint16_t" encode="@.putShort(#)" decode="# = @.getShort()" style="wm" accessor="counter" init="0"/> diff --git a/cpp/managementgen/qmfgen/templates/Class.cpp b/cpp/managementgen/qmfgen/templates/Class.cpp index 973d92586a..52ffce0eb4 100644 --- a/cpp/managementgen/qmfgen/templates/Class.cpp +++ b/cpp/managementgen/qmfgen/templates/Class.cpp @@ -98,6 +98,7 @@ void /*MGEN:Class.NameCap*/::writeSchema (Buffer& buf) buf.putShortString (packageName); // Package Name buf.putShortString (className); // Class Name buf.putBin128 (md5Sum); // Schema Hash + buf.putOctet (0); // No Superclass buf.putShort (/*MGEN:Class.ConfigCount*/); // Config Element Count buf.putShort (/*MGEN:Class.InstCount*/); // Inst Element Count buf.putShort (/*MGEN:Class.MethodCount*/); // Method Count diff --git a/cpp/managementgen/qmfgen/templates/Event.cpp b/cpp/managementgen/qmfgen/templates/Event.cpp index 2ffec8bcdf..a4fc28990d 100644 --- a/cpp/managementgen/qmfgen/templates/Event.cpp +++ b/cpp/managementgen/qmfgen/templates/Event.cpp @@ -65,6 +65,7 @@ void Event/*MGEN:Event.NameCap*/::writeSchema (Buffer& buf) buf.putShortString (packageName); // Package Name buf.putShortString (eventName); // Event Name buf.putBin128 (md5Sum); // Schema Hash + buf.putOctet (0); // No Superclass buf.putShort (/*MGEN:Event.ArgCount*/); // Argument Count // Arguments diff --git a/cpp/src/qmf/Agent.cpp b/cpp/src/qmf/Agent.cpp index 1071e445c8..84f37c5bb4 100644 --- a/cpp/src/qmf/Agent.cpp +++ b/cpp/src/qmf/Agent.cpp @@ -484,7 +484,7 @@ void AgentImpl::encodeHeader(Buffer& buf, uint8_t opcode, uint32_t seq) { buf.putOctet('A'); buf.putOctet('M'); - buf.putOctet('2'); + buf.putOctet('3'); buf.putOctet(opcode); buf.putLong (seq); } @@ -501,7 +501,7 @@ bool AgentImpl::checkHeader(Buffer& buf, uint8_t *opcode, uint32_t *seq) *opcode = buf.getOctet(); *seq = buf.getLong(); - return h1 == 'A' && h2 == 'M' && h3 == '2'; + return h1 == 'A' && h2 == 'M' && h3 == '3'; } AgentEventImpl::Ptr AgentImpl::eventDeclareQueue(const string& name) diff --git a/cpp/src/qmf/SchemaImpl.cpp b/cpp/src/qmf/SchemaImpl.cpp index 57d6148cac..716c4db4f0 100644 --- a/cpp/src/qmf/SchemaImpl.cpp +++ b/cpp/src/qmf/SchemaImpl.cpp @@ -272,6 +272,7 @@ void SchemaObjectClassImpl::encode(Buffer& buffer) const buffer.putShortString(package); buffer.putShortString(name); hash.encode(buffer); + buffer.putOctet(0); // No parent class buffer.putShort((uint16_t) properties.size()); buffer.putShort((uint16_t) statistics.size()); buffer.putShort((uint16_t) methods.size()); diff --git a/cpp/src/qpid/agent/ManagementAgentImpl.cpp b/cpp/src/qpid/agent/ManagementAgentImpl.cpp index 6c6fbdfe3c..c5e2682cba 100644 --- a/cpp/src/qpid/agent/ManagementAgentImpl.cpp +++ b/cpp/src/qpid/agent/ManagementAgentImpl.cpp @@ -565,7 +565,7 @@ void ManagementAgentImpl::encodeHeader(Buffer& buf, uint8_t opcode, uint32_t seq { buf.putOctet('A'); buf.putOctet('M'); - buf.putOctet('2'); + buf.putOctet('3'); buf.putOctet(opcode); buf.putLong (seq); } @@ -582,7 +582,7 @@ bool ManagementAgentImpl::checkHeader(Buffer& buf, uint8_t *opcode, uint32_t *se *opcode = buf.getOctet(); *seq = buf.getLong(); - return h1 == 'A' && h2 == 'M' && h3 == '2'; + return h1 == 'A' && h2 == 'M' && h3 == '3'; } ManagementAgentImpl::PackageMap::iterator ManagementAgentImpl::findOrAddPackage(const string& name) diff --git a/cpp/src/qpid/console/Broker.cpp b/cpp/src/qpid/console/Broker.cpp index 4f90afd39a..68279a4f8e 100644 --- a/cpp/src/qpid/console/Broker.cpp +++ b/cpp/src/qpid/console/Broker.cpp @@ -72,7 +72,7 @@ void Broker::encodeHeader(Buffer& buf, uint8_t opcode, uint32_t seq) const { buf.putOctet('A'); buf.putOctet('M'); - buf.putOctet('2'); + buf.putOctet('3'); buf.putOctet(opcode); buf.putLong (seq); } @@ -89,7 +89,7 @@ bool Broker::checkHeader(Buffer& buf, uint8_t *opcode, uint32_t *seq) const *opcode = buf.getOctet(); *seq = buf.getLong(); - return h1 == 'A' && h2 == 'M' && h3 == '2'; + return h1 == 'A' && h2 == 'M' && h3 == '3'; } void Broker::received(qpid::client::Message& msg) diff --git a/cpp/src/qpid/console/Schema.cpp b/cpp/src/qpid/console/Schema.cpp index 9b4312d11f..a248b2d09a 100644 --- a/cpp/src/qpid/console/Schema.cpp +++ b/cpp/src/qpid/console/Schema.cpp @@ -119,9 +119,18 @@ SchemaClass::SchemaClass(const uint8_t _kind, const ClassKey& _key, framing::Buf kind(_kind), key(_key) { if (kind == KIND_TABLE) { - uint16_t propCount = buffer.getShort(); - uint16_t statCount = buffer.getShort(); - uint16_t methodCount = buffer.getShort(); + uint8_t hasSupertype = buffer.getOctet(); + uint16_t propCount = buffer.getShort(); + uint16_t statCount = buffer.getShort(); + uint16_t methodCount = buffer.getShort(); + + if (hasSupertype) { + string unused; + buffer.getShortString(unused); + buffer.getShortString(unused); + buffer.getLongLong(); + buffer.getLongLong(); + } for (uint16_t idx = 0; idx < propCount; idx++) properties.push_back(new SchemaProperty(buffer)); diff --git a/cpp/src/qpid/console/Value.cpp b/cpp/src/qpid/console/Value.cpp index 1a7f690baf..c557699f33 100644 --- a/cpp/src/qpid/console/Value.cpp +++ b/cpp/src/qpid/console/Value.cpp @@ -114,7 +114,7 @@ string MapValue::str() const MapValue::MapValue(framing::Buffer& buffer) { - value.decode(buffer); + value.qmfDecode(buffer); } diff --git a/cpp/src/qpid/console/Value.h b/cpp/src/qpid/console/Value.h index 5a0915c69b..fbbe0b6a58 100644 --- a/cpp/src/qpid/console/Value.h +++ b/cpp/src/qpid/console/Value.h @@ -98,6 +98,8 @@ namespace console { std::string str() const; bool isUint() const { return true; } uint32_t asUint() const { return value; } + bool isUint64() const { return true; } + uint64_t asUint64() const { return (uint64_t) value; } private: uint32_t value; }; @@ -108,6 +110,8 @@ namespace console { std::string str() const; bool isInt() const { return true; } int32_t asInt() const { return value; } + bool isInt64() const { return true; } + int64_t asInt64() const { return (int64_t) value; } private: int32_t value; }; @@ -160,6 +164,8 @@ namespace console { std::string str() const; bool isFloat() const { return true; } float asFloat() const { return value; } + bool isDouble() const { return true; } + double asDouble() const { return (double) value; } private: float value; }; diff --git a/cpp/src/qpid/framing/FieldTable.cpp b/cpp/src/qpid/framing/FieldTable.cpp index 559aa8b013..3e0921fe8d 100644 --- a/cpp/src/qpid/framing/FieldTable.cpp +++ b/cpp/src/qpid/framing/FieldTable.cpp @@ -53,6 +53,23 @@ uint32_t FieldTable::encodedSize() const { return len; } +uint32_t FieldTable::qmfEncodedSize() const { + uint32_t len(4/*size field*/ + 4/*count field*/); + for(ValueMap::const_iterator i = values.begin(); i != values.end(); ++i) { + // shortstr_len_byte + key size + typecode + len += 1 + (i->first).size() + 1; + ValuePtr value(i->second); + if (value->convertsTo<int>()) { + len += 4; + } else if (value->convertsTo<uint64_t>()) { + len += 8; + } else if (value->convertsTo<string>()) { + len += 2 + value->get<string>().size(); + } + } + return len; +} + int FieldTable::count() const { return values.size(); } @@ -191,7 +208,7 @@ bool FieldTable::getDouble(const std::string& name, double& value) const { // return getValue<uint64_t>(name); //} -void FieldTable::encode(Buffer& buffer) const{ +void FieldTable::encode(Buffer& buffer) const { buffer.putLong(encodedSize() - 4); buffer.putLong(values.size()); for (ValueMap::const_iterator i = values.begin(); i!=values.end(); ++i) { @@ -220,6 +237,122 @@ void FieldTable::decode(Buffer& buffer){ } } +#define QMF_TYPE_U8 1 +#define QMF_TYPE_U16 2 +#define QMF_TYPE_U32 3 +#define QMF_TYPE_U64 4 +#define QMF_TYPE_SSTR 6 +#define QMF_TYPE_LSTR 7 +#define QMF_TYPE_ABSTIME 8 +#define QMF_TYPE_DELTATIME 9 +#define QMF_TYPE_REF 10 +#define QMF_TYPE_BOOL 11 +#define QMF_TYPE_FLOAT 12 +#define QMF_TYPE_DOUBLE 13 +#define QMF_TYPE_UUID 14 +#define QMF_TYPE_S8 16 +#define QMF_TYPE_S16 17 +#define QMF_TYPE_S32 18 +#define QMF_TYPE_S64 19 +#define QMF_TYPE_OBJECT 20 +#define QMF_TYPE_MAP 15 +#define QMF_TYPE_LIST 21 +#define QMF_TYPE_ARRAY 22 + +void FieldTable::qmfEncode(Buffer& buffer) const { + buffer.putLong(qmfEncodedSize() - 4); + buffer.putLong(values.size()); + for (ValueMap::const_iterator i = values.begin(); i!=values.end(); ++i) { + ValuePtr value(i->second); + buffer.putShortString(i->first); + if (value->convertsTo<int>()) { + buffer.putOctet(QMF_TYPE_S32); + buffer.putLong(value->get<int>()); + } else if (value->convertsTo<uint64_t>()) { + buffer.putOctet(QMF_TYPE_U64); + buffer.putLongLong(value->get<uint64_t>()); + } else if (value->convertsTo<string>()) { + buffer.putOctet(QMF_TYPE_LSTR); + buffer.putMediumString(value->get<string>()); + } + } +} + +void FieldTable::qmfDecode(Buffer& buffer) { + clear(); + uint32_t len = buffer.getLong(); + if (len) { + uint32_t available = buffer.available(); + if (available < len) + throw IllegalArgumentException(QPID_MSG("Not enough data for field table.")); + uint32_t count = buffer.getLong(); + uint32_t leftover = available - len; + while(buffer.available() > leftover && count--) { + std::string name; + std::string sstr; + std::string lstr; + buffer.getShortString(name); + uint8_t typecode = buffer.getOctet(); + switch (typecode) { + case QMF_TYPE_U8: + values[name] = ValuePtr(new IntegerValue(buffer.getOctet())); + break; + case QMF_TYPE_U16: + values[name] = ValuePtr(new IntegerValue(buffer.getShort())); + break; + case QMF_TYPE_U32: + values[name] = ValuePtr(new IntegerValue(buffer.getLong())); + break; + case QMF_TYPE_U64: + values[name] = ValuePtr(new Unsigned64Value(buffer.getLongLong())); + break; + case QMF_TYPE_SSTR: + buffer.getShortString(sstr); + values[name] = ValuePtr(new Str16Value(sstr)); + break; + case QMF_TYPE_LSTR: + buffer.getMediumString(lstr); + values[name] = ValuePtr(new Str16Value(lstr)); + break; + case QMF_TYPE_ABSTIME: + values[name] = ValuePtr(new Unsigned64Value(buffer.getLongLong())); + break; + case QMF_TYPE_DELTATIME: + values[name] = ValuePtr(new Unsigned64Value(buffer.getLongLong())); + break; + case QMF_TYPE_BOOL: + values[name] = ValuePtr(new IntegerValue(buffer.getOctet())); + break; + case QMF_TYPE_FLOAT: + values[name] = ValuePtr(new FloatValue(buffer.getFloat())); + break; + case QMF_TYPE_DOUBLE: + values[name] = ValuePtr(new DoubleValue(buffer.getDouble())); + break; + case QMF_TYPE_S8: + values[name] = ValuePtr(new IntegerValue(buffer.getOctet())); + break; + case QMF_TYPE_S16: + values[name] = ValuePtr(new IntegerValue(buffer.getShort())); + break; + case QMF_TYPE_S32: + values[name] = ValuePtr(new IntegerValue(buffer.getLong())); + break; + case QMF_TYPE_S64: + values[name] = ValuePtr(new Unsigned64Value(buffer.getLongLong())); + break; + case QMF_TYPE_REF: + case QMF_TYPE_UUID: + case QMF_TYPE_OBJECT: + case QMF_TYPE_MAP: + case QMF_TYPE_LIST: + case QMF_TYPE_ARRAY: + break; + } + } + } +} + bool FieldTable::operator==(const FieldTable& x) const { if (values.size() != x.values.size()) return false; diff --git a/cpp/src/qpid/framing/FieldTable.h b/cpp/src/qpid/framing/FieldTable.h index a07568559f..dfadfebdcb 100644 --- a/cpp/src/qpid/framing/FieldTable.h +++ b/cpp/src/qpid/framing/FieldTable.h @@ -60,6 +60,10 @@ class FieldTable QPID_COMMON_EXTERN void encode(Buffer& buffer) const; QPID_COMMON_EXTERN void decode(Buffer& buffer); + QPID_COMMON_EXTERN uint32_t qmfEncodedSize() const; + QPID_COMMON_EXTERN void qmfEncode(Buffer& buffer) const; + QPID_COMMON_EXTERN void qmfDecode(Buffer& buffer); + QPID_COMMON_EXTERN int count() const; QPID_COMMON_EXTERN void set(const std::string& name, const ValuePtr& value); QPID_COMMON_EXTERN ValuePtr get(const std::string& name) const; diff --git a/cpp/src/qpid/management/ManagementAgent.cpp b/cpp/src/qpid/management/ManagementAgent.cpp index 8fcc5264e4..d0ad80902b 100644 --- a/cpp/src/qpid/management/ManagementAgent.cpp +++ b/cpp/src/qpid/management/ManagementAgent.cpp @@ -246,7 +246,7 @@ void ManagementAgent::encodeHeader (Buffer& buf, uint8_t opcode, uint32_t seq) { buf.putOctet ('A'); buf.putOctet ('M'); - buf.putOctet ('2'); + buf.putOctet ('3'); buf.putOctet (opcode); buf.putLong (seq); } @@ -260,7 +260,7 @@ bool ManagementAgent::checkHeader (Buffer& buf, uint8_t *opcode, uint32_t *seq) *opcode = buf.getOctet(); *seq = buf.getLong(); - return h1 == 'A' && h2 == 'M' && h3 == '2'; + return h1 == 'A' && h2 == 'M' && h3 == '3'; } void ManagementAgent::sendBuffer(Buffer& buf, @@ -1097,10 +1097,18 @@ size_t ManagementAgent::validateTableSchema(Buffer& inBuffer) inBuffer.getShortString(text); inBuffer.getBin128(hash); + uint8_t superType = inBuffer.getOctet(); + uint16_t propCount = inBuffer.getShort(); uint16_t statCount = inBuffer.getShort(); uint16_t methCount = inBuffer.getShort(); + if (superType == 1) { + inBuffer.getShortString(text); + inBuffer.getShortString(text); + inBuffer.getBin128(hash); + } + for (uint16_t idx = 0; idx < propCount + statCount; idx++) { FieldTable ft; ft.decode(inBuffer); @@ -1142,9 +1150,16 @@ size_t ManagementAgent::validateEventSchema(Buffer& inBuffer) inBuffer.getShortString(text); inBuffer.getShortString(text); inBuffer.getBin128(hash); + + uint8_t superType = inBuffer.getOctet(); uint16_t argCount = inBuffer.getShort(); + if (superType == 1) { + inBuffer.getShortString(text); + inBuffer.getShortString(text); + inBuffer.getBin128(hash); + } for (uint16_t idx = 0; idx < argCount; idx++) { FieldTable ft; ft.decode(inBuffer); |
