summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2009-06-11 15:54:37 +0000
committerTed Ross <tross@apache.org>2009-06-11 15:54:37 +0000
commit52be8c6219f98781d83711b32d4c5971b1fa6d1c (patch)
tree812f608b9472a76d757e92be8dc3a184a2e2ae13 /cpp
parent2a61047873520b644cbc368ebd59fb2d5a0c217d (diff)
downloadqpid-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.am2
-rw-r--r--cpp/examples/qmf-agent/Makefile2
-rw-r--r--cpp/managementgen/qmfgen/management-types.xml2
-rw-r--r--cpp/managementgen/qmfgen/templates/Class.cpp1
-rw-r--r--cpp/managementgen/qmfgen/templates/Event.cpp1
-rw-r--r--cpp/src/qmf/Agent.cpp4
-rw-r--r--cpp/src/qmf/SchemaImpl.cpp1
-rw-r--r--cpp/src/qpid/agent/ManagementAgentImpl.cpp4
-rw-r--r--cpp/src/qpid/console/Broker.cpp4
-rw-r--r--cpp/src/qpid/console/Schema.cpp15
-rw-r--r--cpp/src/qpid/console/Value.cpp2
-rw-r--r--cpp/src/qpid/console/Value.h6
-rw-r--r--cpp/src/qpid/framing/FieldTable.cpp135
-rw-r--r--cpp/src/qpid/framing/FieldTable.h4
-rw-r--r--cpp/src/qpid/management/ManagementAgent.cpp19
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);