00001 #ifndef QPID_CLUSTER_CONNECTION_H
00002 #define QPID_CLUSTER_CONNECTION_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "types.h"
00026 #include "Cluster.h"
00027 #include "WriteEstimate.h"
00028 #include "OutputInterceptor.h"
00029
00030 #include "qpid/broker/Connection.h"
00031 #include "qpid/amqp_0_10/Connection.h"
00032 #include "qpid/sys/ConnectionInputHandler.h"
00033 #include "qpid/sys/ConnectionOutputHandler.h"
00034
00035 namespace qpid {
00036
00037 namespace framing { class AMQFrame; }
00038
00039 namespace cluster {
00040
00044 class Connection :
00045 public RefCounted,
00046 public sys::ConnectionInputHandler,
00047 public sys::ConnectionOutputHandler,
00048 public framing::AMQP_AllOperations::ClusterConnectionHandler
00049
00050 {
00051 public:
00053 Connection(Cluster&, sys::ConnectionOutputHandler& out, const std::string& id, MemberId);
00055 Connection(Cluster&, sys::ConnectionOutputHandler& out, const std::string& id, ConnectionId);
00056 ~Connection();
00057
00058 ConnectionId getId() const { return self; }
00059 bool isLocal() const { return self.second == this; }
00060
00061
00062 void deliver(framing::AMQFrame& f);
00063 void deliverClose();
00064 void deliverDoOutput(size_t requested);
00065
00066 void codecDeleted();
00067
00068 Cluster& getCluster() { return cluster; }
00069
00070
00071 void close() {}
00072 void send(framing::AMQFrame&) {}
00073 void activateOutput() {}
00074 virtual size_t getBuffered() const { assert(0); return 0; }
00075
00076
00077 void received(framing::AMQFrame&);
00078 void closed();
00079 bool doOutput();
00080 bool hasOutput() { return connection.hasOutput(); }
00081 void idleOut() { idleOut(); }
00082 void idleIn() { idleIn(); }
00083
00084
00085 sys::ConnectionInputHandler* create(sys::ConnectionOutputHandler* out, const std::string& id, bool isClient);
00086
00087 broker::Connection& getBrokerConnection() { return connection; }
00088 private:
00089 void sendDoOutput();
00090
00091 Cluster& cluster;
00092 ConnectionId self;
00093 NoOpConnectionOutputHandler discardHandler;
00094 WriteEstimate writeEstimate;
00095 OutputInterceptor output;
00096 broker::Connection connection;
00097 };
00098
00099 }}
00100
00101 #endif