summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/qpid/agent/ManagementAgentImpl.cpp29
-rw-r--r--cpp/src/qpid/management/ManagementBroker.cpp39
-rw-r--r--cpp/src/qpid/management/ManagementObject.cpp18
-rw-r--r--cpp/src/qpid/management/ManagementObject.h2
-rw-r--r--cpp/src/tests/ManagementTest.cpp13
5 files changed, 78 insertions, 23 deletions
diff --git a/cpp/src/qpid/agent/ManagementAgentImpl.cpp b/cpp/src/qpid/agent/ManagementAgentImpl.cpp
index f449d8e214..2f7a524a65 100644
--- a/cpp/src/qpid/agent/ManagementAgentImpl.cpp
+++ b/cpp/src/qpid/agent/ManagementAgentImpl.cpp
@@ -403,9 +403,26 @@ void ManagementAgentImpl::handleGetQuery(Buffer& inBuffer, uint32_t sequence, st
ft.decode(inBuffer);
value = ft.get("_class");
- if (value.get() == 0 || !value->convertsTo<string>())
- {
- // TODO: Send completion with an error code
+ if (value.get() == 0 || !value->convertsTo<string>()) {
+ value = ft.get("_objectid");
+ if (value.get() == 0 || !value->convertsTo<string>())
+ return;
+
+ ObjectId selector(value->get<string>());
+ ManagementObjectMap::iterator iter = managementObjects.find(selector);
+ if (iter != managementObjects.end()) {
+ ManagementObject* object = iter->second;
+ Buffer outBuffer (outputBuffer, MA_BUFFER_SIZE);
+ uint32_t outLen;
+
+ encodeHeader(outBuffer, 'g', sequence);
+ object->writeProperties(outBuffer);
+ object->writeStatistics(outBuffer, true);
+ outLen = MA_BUFFER_SIZE - outBuffer.available ();
+ outBuffer.reset ();
+ connThreadBody.sendBuffer(outBuffer, outLen, "amq.direct", replyTo);
+ }
+ sendCommandComplete(replyTo, sequence);
return;
}
@@ -413,11 +430,9 @@ void ManagementAgentImpl::handleGetQuery(Buffer& inBuffer, uint32_t sequence, st
for (ManagementObjectMap::iterator iter = managementObjects.begin();
iter != managementObjects.end();
- iter++)
- {
+ iter++) {
ManagementObject* object = iter->second;
- if (object->getClassName() == className)
- {
+ if (object->getClassName() == className) {
Buffer outBuffer(outputBuffer, MA_BUFFER_SIZE);
uint32_t outLen;
diff --git a/cpp/src/qpid/management/ManagementBroker.cpp b/cpp/src/qpid/management/ManagementBroker.cpp
index e07f451a1b..03a9dee94a 100644
--- a/cpp/src/qpid/management/ManagementBroker.cpp
+++ b/cpp/src/qpid/management/ManagementBroker.cpp
@@ -828,34 +828,49 @@ void ManagementBroker::handleGetQueryLH (Buffer& inBuffer, string replyToKey, ui
ft.decode(inBuffer);
value = ft.get("_class");
- if (value.get() == 0 || !value->convertsTo<string>())
- {
- // TODO: Send completion with an error code
+ if (value.get() == 0 || !value->convertsTo<string>()) {
+ value = ft.get("_objectid");
+ if (value.get() == 0 || !value->convertsTo<string>())
+ return;
+
+ ObjectId selector(value->get<string>());
+ ManagementObjectMap::iterator iter = managementObjects.find(selector);
+ if (iter != managementObjects.end()) {
+ ManagementObject* object = iter->second;
+ Buffer outBuffer (outputBuffer, MA_BUFFER_SIZE);
+ uint32_t outLen;
+
+ encodeHeader(outBuffer, 'g', sequence);
+ object->writeProperties(outBuffer);
+ object->writeStatistics(outBuffer, true);
+ outLen = MA_BUFFER_SIZE - outBuffer.available ();
+ outBuffer.reset ();
+ sendBuffer(outBuffer, outLen, dExchange, replyToKey);
+ }
+ sendCommandComplete(replyToKey, sequence);
return;
}
string className (value->get<string>());
- for (ManagementObjectMap::iterator iter = managementObjects.begin ();
- iter != managementObjects.end ();
- iter++)
- {
+ for (ManagementObjectMap::iterator iter = managementObjects.begin();
+ iter != managementObjects.end();
+ iter++) {
ManagementObject* object = iter->second;
- if (object->getClassName () == className)
- {
+ if (object->getClassName () == className) {
Buffer outBuffer (outputBuffer, MA_BUFFER_SIZE);
uint32_t outLen;
- encodeHeader (outBuffer, 'g', sequence);
+ encodeHeader(outBuffer, 'g', sequence);
object->writeProperties(outBuffer);
object->writeStatistics(outBuffer, true);
outLen = MA_BUFFER_SIZE - outBuffer.available ();
outBuffer.reset ();
- sendBuffer (outBuffer, outLen, dExchange, replyToKey);
+ sendBuffer(outBuffer, outLen, dExchange, replyToKey);
}
}
- sendCommandComplete (replyToKey, sequence);
+ sendCommandComplete(replyToKey, sequence);
}
bool ManagementBroker::authorizeAgentMessageLH(Message& msg)
diff --git a/cpp/src/qpid/management/ManagementObject.cpp b/cpp/src/qpid/management/ManagementObject.cpp
index b31fff83ae..09abbeb0ca 100644
--- a/cpp/src/qpid/management/ManagementObject.cpp
+++ b/cpp/src/qpid/management/ManagementObject.cpp
@@ -57,15 +57,26 @@ ObjectId::ObjectId(AgentAttachment* _agent, uint8_t flags, uint16_t seq, uint64_
ObjectId::ObjectId(std::istream& in) : agent(0)
{
-#define FIELDS 5
string text;
+ in >> text;
+ fromString(text);
+}
+
+ObjectId::ObjectId(const string& text) : agent(0)
+{
+ fromString(text);
+}
+
+void ObjectId::fromString(const string& text)
+{
+#define FIELDS 5
+ string copy(text.c_str());
char* cText;
char* field[FIELDS];
bool atFieldStart = true;
int idx = 0;
- in >> text;
- cText = const_cast<char*>(text.c_str());
+ cText = const_cast<char*>(copy.c_str());
for (char* cursor = cText; *cursor; cursor++) {
if (atFieldStart) {
if (idx >= FIELDS)
@@ -90,6 +101,7 @@ ObjectId::ObjectId(std::istream& in) : agent(0)
second = atoll(field[4]);
}
+
bool ObjectId::operator==(const ObjectId &other) const
{
uint64_t otherFirst = agent == 0 ? other.first : other.first & 0xffff000000000000LL;
diff --git a/cpp/src/qpid/management/ManagementObject.h b/cpp/src/qpid/management/ManagementObject.h
index df05ca15d3..fa2025112f 100644
--- a/cpp/src/qpid/management/ManagementObject.h
+++ b/cpp/src/qpid/management/ManagementObject.h
@@ -51,12 +51,14 @@ protected:
const AgentAttachment* agent;
uint64_t first;
uint64_t second;
+ void fromString(const std::string&);
public:
ObjectId() : agent(0), first(0), second(0) {}
ObjectId(framing::Buffer& buf) : agent(0) { decode(buf); }
ObjectId(uint8_t flags, uint16_t seq, uint32_t broker, uint32_t bank, uint64_t object);
ObjectId(AgentAttachment* _agent, uint8_t flags, uint16_t seq, uint64_t object);
ObjectId(std::istream&);
+ ObjectId(const std::string&);
bool operator==(const ObjectId &other) const;
bool operator<(const ObjectId &other) const;
void encode(framing::Buffer& buffer);
diff --git a/cpp/src/tests/ManagementTest.cpp b/cpp/src/tests/ManagementTest.cpp
index 5ec3453b7c..a3d29ec22c 100644
--- a/cpp/src/tests/ManagementTest.cpp
+++ b/cpp/src/tests/ManagementTest.cpp
@@ -28,7 +28,7 @@ QPID_AUTO_TEST_SUITE(ManagementTestSuite)
using namespace qpid::framing;
using namespace qpid::management;
-QPID_AUTO_TEST_CASE(testObjectIdSerialize) {
+QPID_AUTO_TEST_CASE(testObjectIdSerializeStream) {
std::string text("0-10-4-2500-80000000000");
std::stringstream input(text);
@@ -40,6 +40,17 @@ QPID_AUTO_TEST_CASE(testObjectIdSerialize) {
BOOST_CHECK_EQUAL(text, output.str());
}
+QPID_AUTO_TEST_CASE(testObjectIdSerializeString) {
+ std::string text("0-10-4-2500-80000000000");
+
+ ObjectId oid(text);
+
+ std::stringstream output;
+ output << oid;
+
+ BOOST_CHECK_EQUAL(text, output.str());
+}
+
QPID_AUTO_TEST_CASE(testObjectIdEncode) {
char buffer[100];
Buffer msgBuf(buffer, 100);