|
IBR-DTNSuite 0.6
|
00001 /* 00002 * ApiServer.h 00003 * 00004 * Created on: 24.06.2009 00005 * Author: morgenro 00006 */ 00007 00008 #ifndef APISERVER_H_ 00009 #define APISERVER_H_ 00010 00011 #include "Component.h" 00012 #include "api/ClientHandler.h" 00013 #include "ibrcommon/net/tcpserver.h" 00014 #include <ibrcommon/net/vinterface.h> 00015 #include <ibrdtn/data/MetaBundle.h> 00016 #include <ibrcommon/thread/Queue.h> 00017 00018 #include <queue> 00019 #include <list> 00020 00021 namespace dtn 00022 { 00023 namespace api 00024 { 00025 class ApiServer : public dtn::daemon::IndependentComponent, public ApiServerInterface 00026 { 00027 public: 00028 ApiServer(const ibrcommon::File &socket); 00029 ApiServer(const ibrcommon::vinterface &net, int port = 4550); 00030 virtual ~ApiServer(); 00031 00035 virtual const std::string getName() const; 00036 00037 protected: 00038 bool __cancellation(); 00039 void shutdown(); 00040 00041 virtual void connectionUp(ClientHandler *conn); 00042 virtual void connectionDown(ClientHandler *conn); 00043 00044 void componentUp(); 00045 void componentRun(); 00046 void componentDown(); 00047 00048 private: 00049 class Task 00050 { 00051 public: 00052 virtual ~Task() {}; 00053 }; 00054 00055 class ProcessBundleTask : public Task 00056 { 00057 public: 00058 ProcessBundleTask(const dtn::data::MetaBundle&); 00059 virtual ~ProcessBundleTask(); 00060 const dtn::data::MetaBundle bundle; 00061 }; 00062 00063 class TransferBundleTask : public Task 00064 { 00065 public: 00066 TransferBundleTask(const dtn::data::BundleID&, const size_t id); 00067 virtual ~TransferBundleTask(); 00068 const dtn::data::BundleID bundle; 00069 const size_t id; 00070 }; 00071 00072 class QueryBundleTask : public Task 00073 { 00074 public: 00075 QueryBundleTask(const size_t id); 00076 virtual ~QueryBundleTask(); 00077 const size_t id; 00078 }; 00079 00080 class RemoveBundleTask : public Task 00081 { 00082 public: 00083 RemoveBundleTask(const dtn::data::BundleID&); 00084 virtual ~RemoveBundleTask(); 00085 const dtn::data::BundleID bundle; 00086 }; 00087 00088 class Distributor : public ibrcommon::JoinableThread, public dtn::core::EventReceiver 00089 { 00090 public: 00091 Distributor(); 00092 virtual ~Distributor(); 00093 00094 void add(ClientHandler *obj); 00095 void remove(ClientHandler *obj); 00096 void shutdown(); 00097 00101 void raiseEvent(const dtn::core::Event *evt); 00102 00103 ibrcommon::Conditional _connections_cond; 00104 std::list<ClientHandler*> _connections; 00105 00106 protected: 00110 void run(); 00111 00112 bool __cancellation(); 00113 00114 ibrcommon::Queue<ApiServer::Task*> _tasks; 00115 00116 private: 00117 void closeAll(); 00118 }; 00119 00120 ibrcommon::tcpserver _tcpsrv; 00121 Distributor _dist; 00122 00123 size_t _next_connection_id; 00124 }; 00125 } 00126 } 00127 00128 #endif /* APISERVER_H_ */