summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/cluster/SessionManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/qpid/cluster/SessionManager.h')
-rw-r--r--cpp/src/qpid/cluster/SessionManager.h40
1 files changed, 29 insertions, 11 deletions
diff --git a/cpp/src/qpid/cluster/SessionManager.h b/cpp/src/qpid/cluster/SessionManager.h
index fc43d6e653..56cd1d9d28 100644
--- a/cpp/src/qpid/cluster/SessionManager.h
+++ b/cpp/src/qpid/cluster/SessionManager.h
@@ -19,12 +19,15 @@
*
*/
+#include "ClassifierHandler.h"
+
#include "qpid/framing/HandlerUpdater.h"
#include "qpid/framing/FrameHandler.h"
-#include "qpid/framing/Uuid.h"
#include "qpid/sys/Mutex.h"
#include <boost/noncopyable.hpp>
+#include <boost/scoped_ptr.hpp>
+#include <boost/optional.hpp>
#include <map>
@@ -34,25 +37,31 @@ namespace broker {
class Broker;
}
+namespace framing {
+class Uuid;
+}
+
namespace cluster {
/**
- * Manage sessions and handler chains for the cluster.
+ * Manage the clusters session map.
*
*/
class SessionManager : public framing::HandlerUpdater, public framing::FrameHandler,
private boost::noncopyable
{
public:
- SessionManager(broker::Broker& broker);
+ SessionManager(broker::Broker& broker, framing::FrameHandler& cluster);
+ ~SessionManager();
- /** Set the handler to send to the cluster */
- void setClusterSend(const framing::FrameHandler::Chain& send);
-
- /** As ChannelUpdater update the handler chains. */
+ /** ChannelUpdater: add cluster handlers to session. */
void update(framing::ChannelId, framing::FrameHandler::Chains&);
- /** As FrameHandler frames received from the cluster */
+ // FIXME aconway 2007-08-30: Need setUp and tearDown instead of just
+ // update, so we can tear down closed sesions.
+ // Or add FrameHandler::destroy(Session) to notify all handlers?
+
+ /** FrameHandler: map frames from the cluster to sessions. */
void handle(framing::AMQFrame&);
/** Get ChannelID for UUID. Return 0 if no mapping */
@@ -60,11 +69,20 @@ class SessionManager : public framing::HandlerUpdater, public framing::FrameHand
private:
class SessionOperations;
- typedef std::map<framing::ChannelId,framing::FrameHandler::Chains> SessionMap;
+ class BrokerHandler;
+
+ struct Session {
+ Session(framing::FrameHandler& cluster, framing::FrameHandler& cont_)
+ : cont(cont_), classifier(cluster,cont_) {}
+ framing::FrameHandler& cont; // Continue local dispatch
+ ClassifierHandler classifier;
+ };
+
+ typedef std::map<framing::ChannelId,boost::optional<Session> > SessionMap;
sys::Mutex lock;
- framing::FrameHandler::Chain clusterSend;
- framing::FrameHandler::Chain localBroker;
+ framing::FrameHandler& cluster;
+ boost::scoped_ptr<BrokerHandler> localBroker;
SessionMap sessions;
};