/* */ #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" #include "NameResolver.h" #include "RequestGroupMan.h" #include "FileAllocationMan.h" #ifdef ENABLE_MESSAGE_DIGEST # include "CheckIntegrityMan.h" #endif // ENABLE_MESSAGE_DIGEST typedef deque Sockets; class SocketEntry { public: enum TYPE { TYPE_RD, TYPE_WR, }; SocketHandle socket; Command* command; TYPE type; public: SocketEntry(const SocketHandle& socket, Command* command, TYPE type): socket(socket), command(command), type(type) {} ~SocketEntry() {} bool operator==(const SocketEntry& entry) { return socket == entry.socket && command == entry.command && type == entry.type; } }; typedef deque SocketEntries; #ifdef ENABLE_ASYNC_DNS class NameResolverEntry { public: NameResolverHandle nameResolver; Command* command; public: NameResolverEntry(const NameResolverHandle& nameResolver, Command* command): nameResolver(nameResolver), command(command) {} ~NameResolverEntry() {} bool operator==(const NameResolverEntry& entry) { return nameResolver == entry.nameResolver && command == entry.command; } }; typedef deque NameResolverEntries; #endif // ENABLE_ASYNC_DNS class DownloadEngine { private: void waitData(); SocketEntries socketEntries; #ifdef ENABLE_ASYNC_DNS NameResolverEntries nameResolverEntries; #endif // ENABLE_ASYNC_DNS fd_set rfdset; fd_set wfdset; int fdmax; void shortSleep() const; bool addSocket(const SocketEntry& socketEntry); bool deleteSocket(const SocketEntry& socketEntry); void executeCommand(Command::STATUS statusFilter); protected: const Logger* logger; virtual void initStatistics() = 0; virtual void calculateStatistics() = 0; virtual void onEndOfRun() = 0; virtual void afterEachIteration() {} public: bool noWait; Commands commands; RequestGroupManHandle _requestGroupMan; FileAllocationManHandle _fileAllocationMan; #ifdef ENABLE_MESSAGE_DIGEST CheckIntegrityManHandle _checkIntegrityMan; #endif // ENABLE_MESSAGE_DIGEST const Option* option; DownloadEngine(); virtual ~DownloadEngine(); void run(); void cleanQueue(); void updateFdSet(); bool addSocketForReadCheck(const SocketHandle& socket, Command* command); bool deleteSocketForReadCheck(const SocketHandle& socket, Command* command); bool addSocketForWriteCheck(const SocketHandle& socket, Command* command); bool deleteSocketForWriteCheck(const SocketHandle& socket, Command* command); #ifdef ENABLE_ASYNC_DNS bool addNameResolverCheck(const NameResolverHandle& resolver, Command* command); bool deleteNameResolverCheck(const NameResolverHandle& resolver, Command* command); #endif // ENABLE_ASYNC_DNS void addCommand(const Commands& commands) { this->commands.insert(this->commands.end(), commands.begin(), commands.end()); } }; #endif // _D_DOWNLOAD_ENGINE_H_