Index: cpp/src/qmf/engine/ObjectImpl.h =================================================================== --- cpp/src/qmf/engine/ObjectImpl.h (revision 831913) +++ cpp/src/qmf/engine/ObjectImpl.h (working copy) @@ -56,7 +56,7 @@ void destroy(); const ObjectId* getObjectId() const { return objectId.get(); } - void setObjectId(ObjectId* oid) { objectId.reset(oid); } + void setObjectId(ObjectId* oid) { objectId.reset(new ObjectId(*oid)); } const SchemaObjectClass* getClass() const { return objectClass; } Value* getValue(const std::string& key) const; void invokeMethod(const std::string& methodName, const Value* inArgs, void* context) const; Index: cpp/src/qpid/management/ManagementAgent.h =================================================================== --- cpp/src/qpid/management/ManagementAgent.h (revision 831913) +++ cpp/src/qpid/management/ManagementAgent.h (working copy) @@ -113,11 +113,13 @@ // struct RemoteAgent : public Manageable { + ManagementAgent& agent; uint32_t brokerBank; uint32_t agentBank; std::string routingKey; ObjectId connectionRef; qmf::org::apache::qpid::broker::Agent* mgmtObject; + RemoteAgent(ManagementAgent& _agent) : agent(_agent) {} ManagementObject* GetManagementObject (void) const { return mgmtObject; } virtual ~RemoteAgent (); }; @@ -212,6 +214,7 @@ void writeData (); void periodicProcessing (void); + void deleteObjectNowLH(const ObjectId& oid); void encodeHeader (framing::Buffer& buf, uint8_t opcode, uint32_t seq = 0); bool checkHeader (framing::Buffer& buf, uint8_t *opcode, uint32_t *seq); void sendBuffer (framing::Buffer& buf, Index: cpp/src/qpid/management/ManagementAgent.cpp =================================================================== --- cpp/src/qpid/management/ManagementAgent.cpp (revision 831913) +++ cpp/src/qpid/management/ManagementAgent.cpp (working copy) @@ -44,9 +44,11 @@ ManagementAgent::RemoteAgent::~RemoteAgent () { - if (mgmtObject != 0) + QPID_LOG(trace, "Remote Agent removed bank=[" << brokerBank << "." << agentBank << "]"); + if (mgmtObject != 0) { mgmtObject->resourceDestroy(); - QPID_LOG(trace, "Remote Agent removed bank=[" << brokerBank << "." << agentBank << "]"); + agent.deleteObjectNowLH(mgmtObject->getObjectId()); + } } ManagementAgent::ManagementAgent () : @@ -443,6 +445,32 @@ } } +void ManagementAgent::deleteObjectNowLH(const ObjectId& oid) +{ + ManagementObjectMap::iterator iter = managementObjects.find(oid); + if (iter == managementObjects.end()) + return; + ManagementObject* object = iter->second; + if (!object->isDeleted()) + return; + +#define DNOW_BUFSIZE 2048 + char msgChars[DNOW_BUFSIZE]; + uint32_t contentSize; + Buffer msgBuffer(msgChars, DNOW_BUFSIZE); + + encodeHeader(msgBuffer, 'c'); + object->writeProperties(msgBuffer); + contentSize = msgBuffer.getPosition(); + msgBuffer.reset(); + stringstream key; + key << "console.obj.1.0." << object->getPackageName() << "." << object->getClassName(); + sendBuffer(msgBuffer, contentSize, mExchange, key.str()); + QPID_LOG(trace, "SEND Immediate(delete) ContentInd to=" << key.str()); + + managementObjects.erase(oid); +} + void ManagementAgent::sendCommandComplete (string replyToKey, uint32_t sequence, uint32_t code, string text) { @@ -871,7 +899,7 @@ assignedBank = assignBankLH(requestedAgentBank); - RemoteAgent* agent = new RemoteAgent; + RemoteAgent* agent = new RemoteAgent(*this); agent->brokerBank = brokerBank; agent->agentBank = assignedBank; agent->routingKey = replyToKey; Index: cpp/bindings/qmf/ruby/qmf.rb =================================================================== --- cpp/bindings/qmf/ruby/qmf.rb (revision 831913) +++ cpp/bindings/qmf/ruby/qmf.rb (working copy) @@ -456,7 +456,7 @@ attr_reader :impl, :agent_key def initialize(impl=nil) if impl - @impl = impl + @impl = Qmfengine::ObjectId.new(impl) else @impl = Qmfengine::ObjectId.new end @@ -594,7 +594,7 @@ attr_reader :impl def initialize(kwargs = {}) if kwargs.include?(:impl) - @impl = kwargs[:impl] + @impl = Qmfengine::Query.new(kwargs[:impl]) else package = '' if kwargs.include?(:key)