diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/qpid/agent/ManagementAgentImpl.cpp | 29 | ||||
-rw-r--r-- | cpp/src/qpid/management/ManagementBroker.cpp | 39 | ||||
-rw-r--r-- | cpp/src/qpid/management/ManagementObject.cpp | 18 | ||||
-rw-r--r-- | cpp/src/qpid/management/ManagementObject.h | 2 | ||||
-rw-r--r-- | cpp/src/tests/ManagementTest.cpp | 13 |
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); |