/* */ #ifndef _D_DOWNLOAD_ENGINE_H_ #define _D_DOWNLOAD_ENGINE_H_ #include "Command.h" #include "Socket.h" #include "SegmentMan.h" #include "common.h" #include "Logger.h" #include "Option.h" typedef deque Sockets; typedef deque Commands; typedef deque CommandUuids; typedef multimap SockCmdMap; class DownloadEngine { private: void waitData(CommandUuids& activeCommandUuids); SockCmdMap rsockmap; SockCmdMap wsockmap; fd_set rfdset; fd_set wfdset; int fdmax; void shortSleep() const; bool addSocket(SockCmdMap& sockmap, const SocketHandle& socket, const CommandUuid& commandUuid); bool deleteSocket(SockCmdMap& sockmap, const SocketHandle& socket, const CommandUuid& commandUuid); protected: const Logger* logger; virtual void initStatistics() = 0; virtual void calculateStatistics() = 0; virtual void onEndOfRun() = 0; virtual void afterEachIteration() {} public: bool noWait; Commands commands; SegmentMan* segmentMan; const Option* option; DownloadEngine(); virtual ~DownloadEngine(); void run(); void cleanQueue(); void updateFdSet(); bool addSocketForReadCheck(const SocketHandle& socket, const CommandUuid& commandUuid); bool deleteSocketForReadCheck(const SocketHandle& socket, const CommandUuid& commandUuid); bool addSocketForWriteCheck(const SocketHandle& socket, const CommandUuid& commandUuid); bool deleteSocketForWriteCheck(const SocketHandle& socket, const CommandUuid& command); }; template class PairFind { private: T1 first; T2 second; public: PairFind(T1 t1, T2 t2):first(t1), second(t2) {} bool operator()(const pair& pa) { if(pa.first == first && pa.second == second) { return true; } else { return false; } } }; #endif // _D_DOWNLOAD_ENGINE_H_