summaryrefslogtreecommitdiff
path: root/cpp/examples/qmf-agent/example.cpp
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2008-07-31 13:15:16 +0000
committerTed Ross <tross@apache.org>2008-07-31 13:15:16 +0000
commit9fb5fd7a0a800591c334bde2b9556e984217d7de (patch)
treec632c481f9cbf647d4ce453ff1076895866fc5e7 /cpp/examples/qmf-agent/example.cpp
parent033f088884f2e6bbc08d6027e1507b6d67eaad53 (diff)
downloadqpid-python-9fb5fd7a0a800591c334bde2b9556e984217d7de.tar.gz
QPID-1174 - Management updates for remote agents
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@681362 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/examples/qmf-agent/example.cpp')
-rw-r--r--cpp/examples/qmf-agent/example.cpp96
1 files changed, 85 insertions, 11 deletions
diff --git a/cpp/examples/qmf-agent/example.cpp b/cpp/examples/qmf-agent/example.cpp
index 62d2909410..35ea97d4c0 100644
--- a/cpp/examples/qmf-agent/example.cpp
+++ b/cpp/examples/qmf-agent/example.cpp
@@ -22,7 +22,10 @@
#include <qpid/management/Manageable.h>
#include <qpid/management/ManagementObject.h>
#include <qpid/agent/ManagementAgent.h>
+#include <qpid/sys/Mutex.h>
#include "Parent.h"
+#include "Child.h"
+#include "ArgsParentCreate_child.h"
#include "PackageQmf_example.h"
#include <unistd.h>
@@ -32,7 +35,14 @@
#include <sstream>
using namespace qpid::management;
+using namespace qpid::sys;
using namespace std;
+using qpid::management::ManagementObject;
+using qpid::management::Manageable;
+using qpid::management::Args;
+using qpid::sys::Mutex;
+
+class ChildClass;
//==============================================================
// CoreClass is the operational class that corresponds to the
@@ -40,21 +50,44 @@ using namespace std;
//==============================================================
class CoreClass : public Manageable
{
- string name;
+ string name;
+ ManagementAgent* agent;
Parent* mgmtObject;
+ std::vector<ChildClass*> children;
+ Mutex vectorLock;
public:
CoreClass(ManagementAgent* agent, string _name);
- ~CoreClass() {}
+ ~CoreClass() { mgmtObject->resourceDestroy(); }
+
+ ManagementObject* GetManagementObject(void) const
+ { return mgmtObject; }
+
+ void doLoop();
+ status_t ManagementMethod (uint32_t methodId, Args& args);
+};
+
+class ChildClass : public Manageable
+{
+ string name;
+ Child* mgmtObject;
+
+public:
- void bumpCounter() { mgmtObject->inc_count(); }
+ ChildClass(ManagementAgent* agent, CoreClass* parent, string name);
+ ~ChildClass() { mgmtObject->resourceDestroy(); }
ManagementObject* GetManagementObject(void) const
{ return mgmtObject; }
+
+ void doWork()
+ {
+ mgmtObject->inc_count(2);
+ }
};
-CoreClass::CoreClass(ManagementAgent* agent, string _name) : name(_name)
+CoreClass::CoreClass(ManagementAgent* _agent, string _name) : name(_name), agent(_agent)
{
mgmtObject = new Parent(agent, this, name);
@@ -62,6 +95,52 @@ CoreClass::CoreClass(ManagementAgent* agent, string _name) : name(_name)
mgmtObject->set_state("IDLE");
}
+void CoreClass::doLoop()
+{
+ // Periodically bump a counter to provide a changing statistical value
+ while (1) {
+ sleep(1);
+ mgmtObject->inc_count();
+ mgmtObject->set_state("IN LOOP");
+
+ {
+ Mutex::ScopedLock _lock(vectorLock);
+
+ for (std::vector<ChildClass*>::iterator iter = children.begin();
+ iter != children.end();
+ iter++) {
+ (*iter)->doWork();
+ }
+ }
+ }
+}
+
+Manageable::status_t CoreClass::ManagementMethod(uint32_t methodId, Args& args)
+{
+ Mutex::ScopedLock _lock(vectorLock);
+
+ switch (methodId) {
+ case Parent::METHOD_CREATE_CHILD:
+ ArgsParentCreate_child& ioArgs = (ArgsParentCreate_child&) args;
+
+ ChildClass *child = new ChildClass(agent, this, ioArgs.i_name);
+ ioArgs.o_childRef = child->GetManagementObject()->getObjectId();
+
+ children.push_back(child);
+
+ return STATUS_OK;
+ }
+
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+ChildClass::ChildClass(ManagementAgent* agent, CoreClass* parent, string name)
+{
+ mgmtObject = new Child(agent, this, parent, name);
+
+ agent->addObject(mgmtObject);
+}
+
//==============================================================
// Main program
@@ -79,19 +158,14 @@ int main(int argc, char** argv) {
// Start the agent. It will attempt to make a connection to the
// management broker
- agent->init (string(host), port);
+ agent->init(string(host), port);
// Allocate some core objects
CoreClass core1(agent, "Example Core Object #1");
CoreClass core2(agent, "Example Core Object #2");
CoreClass core3(agent, "Example Core Object #3");
- // Periodically bump a counter in core1 to provide a changing statistical value
- while (1)
- {
- sleep(1);
- core1.bumpCounter();
- }
+ core1.doLoop();
}