summaryrefslogtreecommitdiff
path: root/trunk/qpid/cpp/src/qpid/broker/Exchange.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/qpid/cpp/src/qpid/broker/Exchange.cpp')
-rw-r--r--trunk/qpid/cpp/src/qpid/broker/Exchange.cpp155
1 files changed, 155 insertions, 0 deletions
diff --git a/trunk/qpid/cpp/src/qpid/broker/Exchange.cpp b/trunk/qpid/cpp/src/qpid/broker/Exchange.cpp
new file mode 100644
index 0000000000..fbfcaede82
--- /dev/null
+++ b/trunk/qpid/cpp/src/qpid/broker/Exchange.cpp
@@ -0,0 +1,155 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include "Exchange.h"
+#include "ExchangeRegistry.h"
+#include "qpid/agent/ManagementAgent.h"
+
+using namespace qpid::broker;
+using qpid::framing::Buffer;
+using qpid::framing::FieldTable;
+using qpid::management::ManagementAgent;
+using qpid::management::ManagementObject;
+using qpid::management::Manageable;
+using qpid::management::Args;
+
+Exchange::Exchange (const string& _name, Manageable* parent) :
+ name(_name), durable(false), persistenceId(0), mgmtExchange(0)
+{
+ if (parent != 0)
+ {
+ ManagementAgent* agent = ManagementAgent::Singleton::getInstance();
+ if (agent != 0)
+ {
+ mgmtExchange = new management::Exchange (agent, this, parent, _name, durable);
+ agent->addObject (mgmtExchange);
+ }
+ }
+}
+
+Exchange::Exchange(const string& _name, bool _durable, const qpid::framing::FieldTable& _args,
+ Manageable* parent)
+ : name(_name), durable(_durable), args(_args), alternateUsers(0), persistenceId(0), mgmtExchange(0)
+{
+ if (parent != 0)
+ {
+ ManagementAgent* agent = ManagementAgent::Singleton::getInstance();
+ if (agent != 0)
+ {
+ mgmtExchange = new management::Exchange (agent, this, parent, _name, durable);
+ if (!durable) {
+ if (name == "")
+ agent->addObject (mgmtExchange, 4, 1); // Special default exchange ID
+ else if (name == "qpid.management")
+ agent->addObject (mgmtExchange, 5, 1); // Special management exchange ID
+ else
+ agent->addObject (mgmtExchange);
+ }
+ }
+ }
+}
+
+Exchange::~Exchange ()
+{
+ if (mgmtExchange != 0)
+ mgmtExchange->resourceDestroy ();
+}
+
+void Exchange::setPersistenceId(uint64_t id) const
+{
+ if (mgmtExchange != 0 && persistenceId == 0)
+ {
+ ManagementAgent* agent = ManagementAgent::Singleton::getInstance();
+ agent->addObject (mgmtExchange, id, 2);
+ }
+ persistenceId = id;
+}
+
+Exchange::shared_ptr Exchange::decode(ExchangeRegistry& exchanges, Buffer& buffer)
+{
+ string name;
+ string type;
+ FieldTable args;
+
+ buffer.getShortString(name);
+ bool durable(buffer.getOctet());
+ buffer.getShortString(type);
+ buffer.get(args);
+
+ return exchanges.declare(name, type, durable, args).first;
+}
+
+void Exchange::encode(Buffer& buffer) const
+{
+ buffer.putShortString(name);
+ buffer.putOctet(durable);
+ buffer.putShortString(getType());
+ buffer.put(args);
+}
+
+uint32_t Exchange::encodedSize() const
+{
+ return name.size() + 1/*short string size*/
+ + 1 /*durable*/
+ + getType().size() + 1/*short string size*/
+ + args.size();
+}
+
+ManagementObject* Exchange::GetManagementObject (void) const
+{
+ return (ManagementObject*) mgmtExchange;
+}
+
+Exchange::Binding::Binding(const string& _key, Queue::shared_ptr _queue, Exchange* parent,
+ FieldTable _args)
+ : queue(_queue), key(_key), args(_args), mgmtBinding(0)
+{
+ if (parent != 0)
+ {
+ ManagementAgent* agent = ManagementAgent::Singleton::getInstance();
+ if (agent != 0)
+ {
+ ManagementObject* mo = queue->GetManagementObject();
+ if (mo != 0)
+ {
+ uint64_t queueId = mo->getObjectId();
+ mgmtBinding = new management::Binding (agent, this, (Manageable*) parent, queueId, key, args);
+ agent->addObject (mgmtBinding);
+ }
+ }
+ }
+}
+
+Exchange::Binding::~Binding ()
+{
+ if (mgmtBinding != 0)
+ mgmtBinding->resourceDestroy ();
+}
+
+ManagementObject* Exchange::Binding::GetManagementObject () const
+{
+ return (ManagementObject*) mgmtBinding;
+}
+
+Manageable::status_t Exchange::Binding::ManagementMethod (uint32_t, Args&)
+{
+ return Manageable::STATUS_UNKNOWN_METHOD;
+}