00001 /* 00002 * ClientHandler.h 00003 * 00004 * Created on: 24.06.2009 00005 * Author: morgenro 00006 */ 00007 00008 #ifndef CLIENTHANDLER_H_ 00009 #define CLIENTHANDLER_H_ 00010 00011 #include "core/AbstractWorker.h" 00012 #include "ibrdtn/streams/StreamConnection.h" 00013 #include "ibrdtn/streams/StreamContactHeader.h" 00014 #include "ibrcommon/net/tcpstream.h" 00015 #include "core/EventReceiver.h" 00016 #include <memory> 00017 00018 using namespace dtn::streams; 00019 00020 namespace dtn 00021 { 00022 namespace daemon 00023 { 00024 class ClientHandler; 00025 00026 class ApiServerInterface 00027 { 00028 public: 00029 virtual void connectionUp(ClientHandler *conn) = 0; 00030 virtual void connectionDown(ClientHandler *conn) = 0; 00031 }; 00032 00033 class ClientHandler : public dtn::streams::StreamConnection::Callback, public ibrcommon::DetachedThread 00034 { 00035 public: 00036 ClientHandler(ApiServerInterface &srv, ibrcommon::tcpstream *stream, size_t connectionid); 00037 virtual ~ClientHandler(); 00038 00039 size_t id; 00040 00041 virtual void initialize(); 00042 virtual void shutdown(); 00043 00044 virtual void eventShutdown(StreamConnection::ConnectionShutdownCases csc); 00045 virtual void eventTimeout(); 00046 virtual void eventError(); 00047 virtual void eventConnectionDown(); 00048 virtual void eventConnectionUp(const StreamContactHeader &header); 00049 00050 virtual void eventBundleRefused(); 00051 virtual void eventBundleForwarded(); 00052 virtual void eventBundleAck(size_t ack); 00053 00054 friend ClientHandler& operator>>(ClientHandler &conn, dtn::data::Bundle &bundle); 00055 friend ClientHandler& operator<<(ClientHandler &conn, const dtn::data::Bundle &bundle); 00056 00057 const dtn::data::EID& getPeer() const; 00058 00059 void queue(const dtn::data::Bundle &bundle); 00060 00061 protected: 00062 void received(const dtn::streams::StreamContactHeader &h); 00063 void run(); 00064 void finally(); 00065 00066 private: 00067 class Sender : public ibrcommon::JoinableThread, public ibrcommon::Queue<dtn::data::Bundle> 00068 { 00069 public: 00070 Sender(ClientHandler &client); 00071 virtual ~Sender(); 00072 00073 protected: 00074 void run(); 00075 bool __cancellation(); 00076 00077 private: 00078 ClientHandler &_client; 00079 }; 00080 00081 ApiServerInterface &_srv; 00082 ClientHandler::Sender _sender; 00083 00084 dtn::data::EID _eid; 00085 00086 auto_ptr<ibrcommon::tcpstream> _stream; 00087 dtn::streams::StreamConnection _connection; 00088 StreamContactHeader _contact; 00089 00090 ibrcommon::Queue<dtn::data::Bundle> _sentqueue; 00091 size_t _lastack; 00092 }; 00093 } 00094 } 00095 #endif /* CLIENTHANDLER_H_ */
1.7.1