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/src | |
| 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/src')
| -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 |
10 files changed, 181 insertions, 13 deletions
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); |
