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