iw4x-client/src/Components/Modules/Download.hpp

98 lines
2.1 KiB
C++
Raw Normal View History

2016-01-08 21:21:59 -05:00
namespace Components
{
class Download : public Component
{
public:
2016-01-09 09:30:13 -05:00
Download();
2016-08-15 10:40:30 -04:00
~Download();
2016-09-16 05:04:28 -04:00
#if defined(DEBUG) || defined(FORCE_UNIT_TESTS)
const char* getName() { return "Download"; };
2016-08-15 10:40:30 -04:00
#endif
2016-01-09 09:30:13 -05:00
2016-08-31 11:54:08 -04:00
static void InitiateClientDownload(std::string mod);
2016-01-09 09:30:13 -05:00
private:
2016-08-31 11:54:08 -04:00
class ClientDownload
{
public:
ClientDownload() : valid(false), running(false), terminateThread(false), totalBytes(0), downBytes(0), lastTimeStamp(0), timeStampBytes(0) {}
~ClientDownload() { this->clear(); }
2016-08-31 11:54:08 -04:00
bool running;
bool valid;
bool terminateThread;
mg_mgr mgr;
Network::Address target;
std::string mod;
std::thread thread;
2016-08-31 11:54:08 -04:00
size_t totalBytes;
size_t downBytes;
2016-09-08 15:41:01 -04:00
int lastTimeStamp;
size_t timeStampBytes;
2016-08-31 12:12:31 -04:00
2016-08-31 11:54:08 -04:00
class File
{
public:
std::string name;
std::string hash;
size_t size;
2016-08-31 11:54:08 -04:00
};
std::vector<File> files;
2016-08-31 11:54:08 -04:00
void clear()
2016-08-31 11:54:08 -04:00
{
this->terminateThread = true;
2016-08-31 12:12:31 -04:00
if (this->thread.joinable())
2016-08-31 12:12:31 -04:00
{
this->thread.join();
2016-08-31 12:12:31 -04:00
}
this->running = false;
this->mod.clear();
this->files.clear();
2016-08-31 11:54:08 -04:00
if (this->valid)
2016-08-31 11:54:08 -04:00
{
this->valid = false;
mg_mgr_free(&(this->mgr));
2016-08-31 11:54:08 -04:00
}
}
};
class FileDownload
{
public:
ClientDownload* download;
ClientDownload::File file;
2016-09-08 15:41:01 -04:00
int timestamp;
2016-08-31 11:54:08 -04:00
bool downloading;
unsigned int index;
std::string buffer;
size_t receivedBytes;
};
2016-06-04 11:06:49 -04:00
static mg_mgr Mgr;
2016-08-31 11:54:08 -04:00
static ClientDownload CLDownload;
2016-01-08 21:21:59 -05:00
2016-06-04 11:06:49 -04:00
static void EventHandler(mg_connection *nc, int ev, void *ev_data);
2016-06-04 15:24:03 -04:00
static void ListHandler(mg_connection *nc, int ev, void *ev_data);
static void FileHandler(mg_connection *nc, int ev, void *ev_data);
2016-06-05 11:34:55 -04:00
static void InfoHandler(mg_connection *nc, int ev, void *ev_data);
2016-08-31 11:54:08 -04:00
static void DownloadHandler(mg_connection *nc, int ev, void *ev_data);
2016-06-04 15:24:03 -04:00
static bool IsClient(mg_connection *nc);
static Game::client_t* GetClient(mg_connection *nc);
static void Forbid(mg_connection *nc);
2016-08-31 11:54:08 -04:00
static void ModDownloader(ClientDownload* download);
static bool ParseModList(ClientDownload* download, std::string list);
static bool DownloadFile(ClientDownload* download, unsigned int index);
2016-01-08 21:21:59 -05:00
};
}