summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/framing
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2007-06-29 17:59:00 +0000
committerAlan Conway <aconway@apache.org>2007-06-29 17:59:00 +0000
commitfda6dadde945a9c73c97b73dc79e93368b743348 (patch)
treed7755539ae485efdfbc46298cd1ef6632515159e /cpp/src/qpid/framing
parent79cd6c772da003ddc917eff362f9adaa99e28b49 (diff)
downloadqpid-python-fda6dadde945a9c73c97b73dc79e93368b743348.tar.gz
* Summary:
- Improved plugin framework and HandlerUpdater interface. - Cluster handlers for traffic to/from cluster. - Cluster HandlerUpdater configures channel chains for cluster. - Cluster PluginProvider registers cluster objects with broker. * src/qpid/framing/AMQFrame.h: Made data members public. Handlers need to be able to modify frame data, getters/setters are just a nuisance here. * src/tests/Cluster.cpp: Updated for cluster changes, using handlers instead of friendship to hook test into Cluster code. * src/qpid/framing/amqp_types.h: Added CHANNEL_MAX and CHANNEL_HIGH_BIT constants. * src/qpid/framing/HandlerUpdater.h: Renamed ChannelInitializer, broke dependency on broker channel types. * src/qpid/framing/Handler.h: Added constructors and nextHandler() * src/qpid/framing/AMQFrame.h (class AMQFrame): Inlined getChannel() * src/qpid/cluster/ClusterPluginProvider.cpp: Provider for cluster plugins. * src/qpid/cluster/Cluster.cpp: Use ChannelManager. Factor out plugin details to ClusterPluginProvider. * src/qpid/cluster/ChannelManager.h: Insert cluster handlers into channel chains, route frames between cluster and channels. * src/qpid/broker/BrokerAdapter.cpp (startOk): use CHANNEL_MAX constant. * src/qpid/broker/Broker.cpp: - Refactored for new plugin framework. - Added getUrl(). * src/qpid/Url.h: Added constructor from Address. * src/qpid/Plugin.h: Generalized plugin framework, broke dependency on Broker interfaces. We may want to use plug-ins for clients also at some point. * src/tests/run_test: Fix bug when VALGRIND is not set. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@551981 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/framing')
-rw-r--r--cpp/src/qpid/framing/AMQFrame.cpp10
-rw-r--r--cpp/src/qpid/framing/AMQFrame.h13
-rw-r--r--cpp/src/qpid/framing/Handler.h12
-rw-r--r--cpp/src/qpid/framing/HandlerUpdater.h44
-rw-r--r--cpp/src/qpid/framing/amqp_types.h7
5 files changed, 70 insertions, 16 deletions
diff --git a/cpp/src/qpid/framing/AMQFrame.cpp b/cpp/src/qpid/framing/AMQFrame.cpp
index 6541a0e788..a528913fd9 100644
--- a/cpp/src/qpid/framing/AMQFrame.cpp
+++ b/cpp/src/qpid/framing/AMQFrame.cpp
@@ -39,20 +39,14 @@ version(_version)
assert(version != ProtocolVersion(0,0));
}
-AMQFrame::AMQFrame(ProtocolVersion _version, uint16_t _channel, AMQBody* _body) :
-version(_version), channel(_channel), body(_body)
-{}
+AMQFrame::AMQFrame(ProtocolVersion _version, uint16_t _channel, AMQBody* _body) : channel(_channel), body(_body),version(_version) {}
AMQFrame::AMQFrame(ProtocolVersion _version, uint16_t _channel, const AMQBody::shared_ptr& _body) :
-version(_version), channel(_channel), body(_body)
+ channel(_channel), body(_body), version(_version)
{}
AMQFrame::~AMQFrame() {}
-uint16_t AMQFrame::getChannel(){
- return channel;
-}
-
AMQBody::shared_ptr AMQFrame::getBody(){
return body;
}
diff --git a/cpp/src/qpid/framing/AMQFrame.h b/cpp/src/qpid/framing/AMQFrame.h
index bef1b01df4..1a7b203ad7 100644
--- a/cpp/src/qpid/framing/AMQFrame.h
+++ b/cpp/src/qpid/framing/AMQFrame.h
@@ -48,7 +48,7 @@ class AMQFrame : public AMQDataBlock
virtual void encode(Buffer& buffer);
virtual bool decode(Buffer& buffer);
virtual uint32_t size() const;
- uint16_t getChannel();
+ uint16_t getChannel() const { return channel; }
AMQBody::shared_ptr getBody();
/** Convenience template to cast the body to an expected type */
@@ -60,18 +60,17 @@ class AMQFrame : public AMQDataBlock
uint32_t decodeHead(Buffer& buffer);
void decodeBody(Buffer& buffer, uint32_t size);
- private:
- static AMQP_MethodVersionMap versionMap;
- ProtocolVersion version;
-
uint16_t channel;
uint8_t type;
AMQBody::shared_ptr body;
-
+ ProtocolVersion version;
- friend std::ostream& operator<<(std::ostream& out, const AMQFrame& body);
+ private:
+ static AMQP_MethodVersionMap versionMap;
};
+std::ostream& operator<<(std::ostream&, const AMQFrame&);
+
}} // namespace qpid::framing
diff --git a/cpp/src/qpid/framing/Handler.h b/cpp/src/qpid/framing/Handler.h
index 56e150a66d..f6b59393d9 100644
--- a/cpp/src/qpid/framing/Handler.h
+++ b/cpp/src/qpid/framing/Handler.h
@@ -40,11 +40,21 @@ template <class T> struct Handler {
Chain out;
};
+ Handler() {}
+ Handler(Chain next_) : next(next_) {}
virtual ~Handler() {}
+
virtual void handle(T) = 0;
+
+ /** Next handler. Public so chains can be modified by altering next. */
Chain next;
-};
+ protected:
+ /** Derived handle() implementations call nextHandler to invoke the
+ * next handler in the chain. */
+ void nextHandler(T data) { if (next) next->handle(data); }
+
+};
}}
diff --git a/cpp/src/qpid/framing/HandlerUpdater.h b/cpp/src/qpid/framing/HandlerUpdater.h
new file mode 100644
index 0000000000..5cb1e87d6e
--- /dev/null
+++ b/cpp/src/qpid/framing/HandlerUpdater.h
@@ -0,0 +1,44 @@
+#ifndef QPID_FRAMING_HANDLERUPDATER_H
+#define QPID_FRAMING_HANDLERUPDATER_H
+
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed 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 "qpid/Plugin.h"
+#include "qpid/framing/amqp_types.h"
+#include "qpid/framing/FrameHandler.h"
+
+namespace qpid {
+namespace framing {
+
+/** Plugin object that can update handler chains. */
+struct HandlerUpdater : public Plugin {
+ /** Update the handler chains.
+ *@param id Unique identifier for channel or session.
+ *@param chains Handler chains to be updated.
+ */
+ virtual void update(ChannelId id, FrameHandler::Chains& chains) = 0;
+};
+
+}} // namespace qpid::framing
+
+
+
+
+
+#endif /*!QPID_FRAMING_HANDLERUPDATER_H*/
diff --git a/cpp/src/qpid/framing/amqp_types.h b/cpp/src/qpid/framing/amqp_types.h
index f0bd0ce427..efb720f047 100644
--- a/cpp/src/qpid/framing/amqp_types.h
+++ b/cpp/src/qpid/framing/amqp_types.h
@@ -53,5 +53,12 @@ typedef uint16_t ReplyCode;
// Types represented by classes.
class Content;
class FieldTable;
+
+// Useful constants
+
+/** Maximum channel ID used by broker. Reserve high bit for internal use.*/
+const ChannelId CHANNEL_MAX=(ChannelId(~1))>>1;
+const ChannelId CHANNEL_HIGH_BIT= ChannelId(~CHANNEL_MAX);
+
}} // namespace qpid::framing
#endif