00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _Connector_
00022 #define _Connector_
00023
00024
00025 #include "qpid/framing/InputHandler.h"
00026 #include "qpid/framing/OutputHandler.h"
00027 #include "qpid/framing/InitiationHandler.h"
00028 #include "qpid/framing/ProtocolInitiation.h"
00029 #include "qpid/framing/ProtocolVersion.h"
00030 #include "qpid/sys/ShutdownHandler.h"
00031 #include "qpid/sys/TimeoutHandler.h"
00032 #include "qpid/sys/Thread.h"
00033 #include "qpid/sys/Runnable.h"
00034 #include "qpid/sys/Mutex.h"
00035 #include "qpid/sys/Socket.h"
00036 #include "qpid/sys/Time.h"
00037
00038 #include <queue>
00039 #include <boost/weak_ptr.hpp>
00040 #include <boost/shared_ptr.hpp>
00041
00042 namespace qpid {
00043
00044 namespace sys {
00045 class Poller;
00046 class AsynchIO;
00047 class AsynchIOBufferBase;
00048 }
00049
00050 namespace client {
00051
00052 class Bounds;
00053 class ConnectionSettings;
00054 class ConnectionImpl;
00055
00057 class Connector : public framing::OutputHandler,
00058 private sys::Runnable
00059 {
00060 struct Buff;
00061
00063 class Writer : public framing::FrameHandler {
00064 typedef sys::AsynchIOBufferBase BufferBase;
00065 typedef std::vector<framing::AMQFrame> Frames;
00066
00067 const uint16_t maxFrameSize;
00068 sys::Mutex lock;
00069 sys::AsynchIO* aio;
00070 BufferBase* buffer;
00071 Frames frames;
00072 size_t lastEof;
00073 framing::Buffer encode;
00074 size_t framesEncoded;
00075 std::string identifier;
00076 Bounds* bounds;
00077
00078 void writeOne(const sys::Mutex::ScopedLock&);
00079 void newBuffer(const sys::Mutex::ScopedLock&);
00080
00081 public:
00082
00083 Writer(uint16_t maxFrameSize, Bounds*);
00084 ~Writer();
00085 void init(std::string id, sys::AsynchIO*);
00086 void handle(framing::AMQFrame&);
00087 void write(sys::AsynchIO&);
00088 };
00089
00090 const uint16_t maxFrameSize;
00091 framing::ProtocolVersion version;
00092 bool initiated;
00093
00094 sys::Mutex closedLock;
00095 bool closed;
00096 bool joined;
00097
00098 sys::AbsTime lastIn;
00099 sys::AbsTime lastOut;
00100 sys::Duration timeout;
00101 sys::Duration idleIn;
00102 sys::Duration idleOut;
00103
00104 sys::TimeoutHandler* timeoutHandler;
00105 sys::ShutdownHandler* shutdownHandler;
00106 framing::InputHandler* input;
00107 framing::InitiationHandler* initialiser;
00108 framing::OutputHandler* output;
00109
00110 Writer writer;
00111
00112 sys::Thread receiver;
00113
00114 sys::Socket socket;
00115
00116 sys::AsynchIO* aio;
00117 boost::shared_ptr<sys::Poller> poller;
00118
00119 void run();
00120 void handleClosed();
00121 bool closeInternal();
00122
00123 void readbuff(qpid::sys::AsynchIO&, qpid::sys::AsynchIOBufferBase*);
00124 void writebuff(qpid::sys::AsynchIO&);
00125 void writeDataBlock(const framing::AMQDataBlock& data);
00126 void eof(qpid::sys::AsynchIO&);
00127
00128 std::string identifier;
00129
00130 ConnectionImpl* impl;
00131
00132 public:
00133 Connector(framing::ProtocolVersion pVersion,
00134 const ConnectionSettings&,
00135 ConnectionImpl*);
00136 virtual ~Connector();
00137 virtual void connect(const std::string& host, int port);
00138 virtual void init();
00139 virtual void close();
00140 virtual void setInputHandler(framing::InputHandler* handler);
00141 virtual void setShutdownHandler(sys::ShutdownHandler* handler);
00142 virtual sys::ShutdownHandler* getShutdownHandler() { return shutdownHandler; }
00143 virtual framing::OutputHandler* getOutputHandler();
00144 virtual void send(framing::AMQFrame& frame);
00145 const std::string& getIdentifier() const { return identifier; }
00146 };
00147
00148 }}
00149
00150
00151 #endif