IBR-DTNSuite 0.6

daemon/src/api/ClientHandler.h

Go to the documentation of this file.
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_ */