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 <framing/InputHandler.h>
00026 #include <framing/OutputHandler.h>
00027 #include <framing/InitiationHandler.h>
00028 #include <framing/ProtocolInitiation.h>
00029 #include <ProtocolVersion.h>
00030 #include <sys/ShutdownHandler.h>
00031 #include <sys/TimeoutHandler.h>
00032 #include <sys/Thread.h>
00033 #include <sys/Monitor.h>
00034 #include <sys/Socket.h>
00035
00036 namespace qpid {
00037 namespace client {
00038
00039 class Connector : public qpid::framing::OutputHandler,
00040 private qpid::sys::Runnable
00041 {
00042 const bool debug;
00043 const int receive_buffer_size;
00044 const int send_buffer_size;
00045 qpid::framing::ProtocolVersion version;
00046
00047 bool closed;
00048
00049 int64_t lastIn;
00050 int64_t lastOut;
00051 int64_t timeout;
00052 u_int32_t idleIn;
00053 u_int32_t idleOut;
00054
00055 qpid::sys::TimeoutHandler* timeoutHandler;
00056 qpid::sys::ShutdownHandler* shutdownHandler;
00057 qpid::framing::InputHandler* input;
00058 qpid::framing::InitiationHandler* initialiser;
00059 qpid::framing::OutputHandler* output;
00060
00061 qpid::framing::Buffer inbuf;
00062 qpid::framing::Buffer outbuf;
00063
00064 qpid::sys::Mutex writeLock;
00065 qpid::sys::Thread receiver;
00066
00067 qpid::sys::Socket socket;
00068
00069 void checkIdle(ssize_t status);
00070 void writeBlock(qpid::framing::AMQDataBlock* data);
00071 void writeToSocket(char* data, size_t available);
00072 void setSocketTimeout();
00073
00074 void run();
00075 void handleClosed();
00076
00077 public:
00078 Connector(const qpid::framing::ProtocolVersion& pVersion, bool debug = false, u_int32_t buffer_size = 1024);
00079 virtual ~Connector();
00080 virtual void connect(const std::string& host, int port);
00081 virtual void init(qpid::framing::ProtocolInitiation* header);
00082 virtual void close();
00083 virtual void setInputHandler(qpid::framing::InputHandler* handler);
00084 virtual void setTimeoutHandler(qpid::sys::TimeoutHandler* handler);
00085 virtual void setShutdownHandler(qpid::sys::ShutdownHandler* handler);
00086 virtual qpid::framing::OutputHandler* getOutputHandler();
00087 virtual void send(qpid::framing::AMQFrame* frame);
00088 virtual void setReadTimeout(u_int16_t timeout);
00089 virtual void setWriteTimeout(u_int16_t timeout);
00090 };
00091
00092 }
00093 }
00094
00095
00096 #endif