|
IBR-DTNSuite 0.6
|
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 api 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 bool __cancellation(); 00065 bool good() const; 00066 00067 private: 00068 class Sender : public ibrcommon::JoinableThread, public ibrcommon::Queue<dtn::data::Bundle> 00069 { 00070 public: 00071 Sender(ClientHandler &client); 00072 virtual ~Sender(); 00073 00074 protected: 00075 void run(); 00076 bool __cancellation(); 00077 00078 private: 00079 ClientHandler &_client; 00080 }; 00081 00082 ApiServerInterface &_srv; 00083 ClientHandler::Sender _sender; 00084 00085 dtn::data::EID _eid; 00086 00087 auto_ptr<ibrcommon::tcpstream> _stream; 00088 dtn::streams::StreamConnection _connection; 00089 StreamContactHeader _contact; 00090 00091 ibrcommon::Queue<dtn::data::Bundle> _sentqueue; 00092 size_t _lastack; 00093 }; 00094 } 00095 } 00096 #endif /* CLIENTHANDLER_H_ */