00001 #ifndef _qpid_agent_ManagementAgentImpl_
00002 #define _qpid_agent_ManagementAgentImpl_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "ManagementAgent.h"
00024 #include "qpid/client/Connection.h"
00025 #include "qpid/client/Dispatcher.h"
00026 #include "qpid/client/Session.h"
00027 #include "qpid/client/AsyncSession.h"
00028 #include "qpid/client/Message.h"
00029 #include "qpid/client/MessageListener.h"
00030 #include "qpid/sys/Thread.h"
00031 #include "qpid/sys/Runnable.h"
00032 #include "qpid/sys/Mutex.h"
00033 #include "qpid/sys/Condition.h"
00034 #include "qpid/framing/Uuid.h"
00035 #include <iostream>
00036 #include <sstream>
00037
00038 namespace qpid {
00039 namespace management {
00040
00041 class ManagementAgentImpl : public ManagementAgent, public client::MessageListener
00042 {
00043 public:
00044
00045 ManagementAgentImpl();
00046 virtual ~ManagementAgentImpl();
00047
00048 int getMaxThreads() { return 1; }
00049 void init(std::string brokerHost = "localhost",
00050 uint16_t brokerPort = 5672,
00051 uint16_t intervalSeconds = 10,
00052 bool useExternalThread = false);
00053 void RegisterClass(std::string packageName,
00054 std::string className,
00055 uint8_t* md5Sum,
00056 management::ManagementObject::writeSchemaCall_t schemaCall);
00057 uint64_t addObject (management::ManagementObject* objectPtr,
00058 uint32_t persistId = 0,
00059 uint32_t persistBank = 4);
00060 uint32_t pollCallbacks (uint32_t callLimit = 0);
00061 int getSignalFd (void);
00062
00063 void PeriodicProcessing();
00064
00065 private:
00066
00067 struct SchemaClassKey
00068 {
00069 std::string name;
00070 uint8_t hash[16];
00071 };
00072
00073 struct SchemaClassKeyComp
00074 {
00075 bool operator() (const SchemaClassKey& lhs, const SchemaClassKey& rhs) const
00076 {
00077 if (lhs.name != rhs.name)
00078 return lhs.name < rhs.name;
00079 else
00080 for (int i = 0; i < 16; i++)
00081 if (lhs.hash[i] != rhs.hash[i])
00082 return lhs.hash[i] < rhs.hash[i];
00083 return false;
00084 }
00085 };
00086
00087 struct SchemaClass
00088 {
00089 management::ManagementObject::writeSchemaCall_t writeSchemaCall;
00090
00091 SchemaClass () : writeSchemaCall(0) {}
00092 };
00093
00094 typedef std::map<SchemaClassKey, SchemaClass, SchemaClassKeyComp> ClassMap;
00095 typedef std::map<std::string, ClassMap> PackageMap;
00096
00097 PackageMap packages;
00098 management::ManagementObjectMap managementObjects;
00099 management::ManagementObjectMap newManagementObjects;
00100
00101 void received (client::Message& msg);
00102
00103 uint16_t interval;
00104 bool extThread;
00105 uint64_t nextObjectId;
00106 sys::Mutex agentLock;
00107 sys::Mutex addLock;
00108 framing::Uuid sessionId;
00109 framing::Uuid systemId;
00110
00111 int signalFdIn, signalFdOut;
00112 client::Connection connection;
00113 client::Session session;
00114 client::Dispatcher* dispatcher;
00115 bool clientWasAdded;
00116 uint64_t objIdPrefix;
00117 std::stringstream queueName;
00118 # define MA_BUFFER_SIZE 65536
00119 char outputBuffer[MA_BUFFER_SIZE];
00120
00121 class BackgroundThread : public sys::Runnable
00122 {
00123 ManagementAgentImpl& agent;
00124 void run();
00125 public:
00126 BackgroundThread(ManagementAgentImpl& _agent) : agent(_agent) {}
00127 };
00128
00129 BackgroundThread bgThread;
00130 sys::Thread thread;
00131 sys::Condition startupCond;
00132 bool startupWait;
00133
00134 PackageMap::iterator FindOrAddPackage (std::string name);
00135 void moveNewObjectsLH();
00136 void AddClassLocal (PackageMap::iterator pIter,
00137 std::string className,
00138 uint8_t* md5Sum,
00139 management::ManagementObject::writeSchemaCall_t schemaCall);
00140 void EncodePackageIndication (qpid::framing::Buffer& buf,
00141 PackageMap::iterator pIter);
00142 void EncodeClassIndication (qpid::framing::Buffer& buf,
00143 PackageMap::iterator pIter,
00144 ClassMap::iterator cIter);
00145 void EncodeHeader (qpid::framing::Buffer& buf, uint8_t opcode, uint32_t seq = 0);
00146 bool CheckHeader (qpid::framing::Buffer& buf, uint8_t *opcode, uint32_t *seq);
00147 void SendBuffer (qpid::framing::Buffer& buf,
00148 uint32_t length,
00149 std::string exchange,
00150 std::string routingKey);
00151 void handleAttachResponse (qpid::framing::Buffer& inBuffer);
00152 void handlePackageRequest (qpid::framing::Buffer& inBuffer);
00153 void handleClassQuery (qpid::framing::Buffer& inBuffer);
00154 void handleSchemaRequest (qpid::framing::Buffer& inBuffer, uint32_t sequence);
00155 void handleMethodRequest (qpid::framing::Buffer& inBuffer, uint32_t sequence, std::string replyTo);
00156 void handleConsoleAddedIndication();
00157 };
00158
00159 }}
00160
00161 #endif