2013-03-15 21:46:16 +01:00
|
|
|
/* This program is free software. It comes without any warranty, to
|
|
|
|
* the extent permitted by applicable law. You can redistribute it
|
|
|
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
|
|
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
2013-03-24 22:56:57 +01:00
|
|
|
* http://www.wtfpl.net/ for more details. */
|
2013-03-15 21:46:16 +01:00
|
|
|
|
|
|
|
#ifndef DOWNLOADER_H
|
|
|
|
#define DOWNLOADER_H
|
|
|
|
|
2014-08-01 19:32:29 +02:00
|
|
|
#if __GNUC__
|
|
|
|
# if !(__x86_64__ || __ppc64__ || __LP64__)
|
|
|
|
# ifndef _LARGEFILE_SOURCE
|
|
|
|
# define _LARGEFILE_SOURCE
|
|
|
|
# endif
|
|
|
|
# ifndef _LARGEFILE64_SOURCE
|
|
|
|
# define _LARGEFILE64_SOURCE
|
|
|
|
# endif
|
|
|
|
# if !defined(_FILE_OFFSET_BITS) || (_FILE_OFFSET_BITS == 32)
|
|
|
|
# define _FILE_OFFSET_BITS 64
|
|
|
|
# endif
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2013-03-15 21:46:16 +01:00
|
|
|
#include "config.h"
|
|
|
|
#include "api.h"
|
|
|
|
#include "progressbar.h"
|
2016-04-18 19:33:19 +02:00
|
|
|
#include "website.h"
|
2016-05-20 19:33:07 +02:00
|
|
|
#include "threadsafequeue.h"
|
2013-03-15 21:46:16 +01:00
|
|
|
#include <curl/curl.h>
|
2015-01-22 08:22:48 +01:00
|
|
|
#include <json/json.h>
|
2013-03-15 21:46:16 +01:00
|
|
|
#include <ctime>
|
2014-02-13 10:16:31 +01:00
|
|
|
#include <fstream>
|
2015-04-27 15:51:17 +02:00
|
|
|
#include <deque>
|
2013-03-15 21:46:16 +01:00
|
|
|
|
|
|
|
class Timer
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Timer() { this->reset(); };
|
|
|
|
void reset() { gettimeofday(&(this->last_update), NULL); };
|
|
|
|
double getTimeBetweenUpdates()
|
|
|
|
{ // Returns time elapsed between updates in milliseconds
|
|
|
|
struct timeval time_now;
|
|
|
|
gettimeofday(&time_now, NULL);
|
|
|
|
double time_between = ( (time_now.tv_sec+(time_now.tv_usec/1000000.0))*1000.0 - (this->last_update.tv_sec+(this->last_update.tv_usec/1000000.0))*1000.0 );
|
|
|
|
return time_between;
|
|
|
|
};
|
|
|
|
~Timer() {};
|
|
|
|
private:
|
|
|
|
struct timeval last_update;
|
|
|
|
};
|
|
|
|
|
2016-05-20 19:33:07 +02:00
|
|
|
struct xferInfo
|
|
|
|
{
|
|
|
|
unsigned int tid;
|
|
|
|
CURL* curlhandle;
|
|
|
|
Timer timer;
|
|
|
|
std::deque< std::pair<time_t, uintmax_t> > TimeAndSize;
|
|
|
|
curl_off_t offset;
|
|
|
|
};
|
|
|
|
|
2013-03-15 21:46:16 +01:00
|
|
|
class Downloader
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Downloader(Config &conf);
|
|
|
|
virtual ~Downloader();
|
|
|
|
int init();
|
2014-07-07 14:57:07 +02:00
|
|
|
int login();
|
2016-09-23 23:20:37 +02:00
|
|
|
int listGames();
|
2013-03-15 21:46:16 +01:00
|
|
|
void updateCheck();
|
|
|
|
void repair();
|
|
|
|
void download();
|
2013-10-14 21:31:12 +02:00
|
|
|
void checkOrphans();
|
2013-11-14 14:40:59 +01:00
|
|
|
void checkStatus();
|
2014-10-16 10:05:57 +02:00
|
|
|
void updateCache();
|
2016-09-23 23:16:13 +02:00
|
|
|
int downloadFileWithId(const std::string& fileid_string, const std::string& output_filepath);
|
2015-05-13 16:13:30 +02:00
|
|
|
void showWishlist();
|
2013-03-15 21:46:16 +01:00
|
|
|
CURL* curlhandle;
|
|
|
|
Timer timer;
|
|
|
|
Config config;
|
|
|
|
ProgressBar* progressbar;
|
2015-07-03 22:09:50 +02:00
|
|
|
std::deque< std::pair<time_t, uintmax_t> > TimeAndSize;
|
2013-03-15 21:46:16 +01:00
|
|
|
protected:
|
|
|
|
private:
|
2014-02-26 14:04:16 +01:00
|
|
|
CURLcode downloadFile(const std::string& url, const std::string& filepath, const std::string& xml_data = std::string(), const std::string& gamename = std::string());
|
|
|
|
int repairFile(const std::string& url, const std::string& filepath, const std::string& xml_data = std::string(), const std::string& gamename = std::string());
|
2013-04-08 12:43:11 +02:00
|
|
|
int downloadCovers(const std::string& gamename, const std::string& directory, const std::string& cover_xml_data);
|
2013-03-15 21:46:16 +01:00
|
|
|
int getGameDetails();
|
|
|
|
void getGameList();
|
2015-07-03 22:09:50 +02:00
|
|
|
uintmax_t getResumePosition();
|
2013-03-15 21:46:16 +01:00
|
|
|
CURLcode beginDownload();
|
|
|
|
std::string getResponse(const std::string& url);
|
2014-02-26 14:04:16 +01:00
|
|
|
std::string getLocalFileHash(const std::string& filepath, const std::string& gamename = std::string());
|
2013-11-14 14:40:59 +01:00
|
|
|
std::string getRemoteFileHash(const std::string& gamename, const std::string& id);
|
2014-10-16 10:05:57 +02:00
|
|
|
int loadGameDetailsCache();
|
|
|
|
int saveGameDetailsCache();
|
|
|
|
std::vector<gameDetails> getGameDetailsFromJsonNode(Json::Value root, const int& recursion_level = 0);
|
2015-05-12 01:19:16 +02:00
|
|
|
std::vector<gameFile> getExtrasFromJSON(const Json::Value& json, const std::string& gamename);
|
|
|
|
std::string getSerialsFromJSON(const Json::Value& json);
|
2015-03-19 08:50:50 +01:00
|
|
|
void saveSerials(const std::string& serials, const std::string& filepath);
|
2016-03-06 14:45:22 +01:00
|
|
|
std::string getChangelogFromJSON(const Json::Value& json);
|
|
|
|
void saveChangelog(const std::string& changelog, const std::string& filepath);
|
2016-05-20 19:33:07 +02:00
|
|
|
static void processDownloadQueue(Config conf, const unsigned int& tid);
|
|
|
|
static int progressCallbackForThread(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow);
|
|
|
|
void printProgress();
|
2013-03-15 21:46:16 +01:00
|
|
|
|
2016-04-25 18:26:02 +02:00
|
|
|
static int progressCallback(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow);
|
2015-07-05 15:50:16 +02:00
|
|
|
static size_t writeMemoryCallback(char *ptr, size_t size, size_t nmemb, void *userp);
|
|
|
|
static size_t writeData(void *ptr, size_t size, size_t nmemb, FILE *stream);
|
|
|
|
static size_t readData(void *ptr, size_t size, size_t nmemb, FILE *stream);
|
2013-03-15 21:46:16 +01:00
|
|
|
|
2016-04-18 19:33:19 +02:00
|
|
|
Website *gogWebsite;
|
2013-03-15 21:46:16 +01:00
|
|
|
API *gogAPI;
|
2014-03-29 00:51:39 +01:00
|
|
|
std::vector<gameItem> gameItems;
|
2013-03-15 21:46:16 +01:00
|
|
|
std::vector<gameDetails> games;
|
|
|
|
std::string coverXML;
|
|
|
|
|
2015-07-05 15:50:16 +02:00
|
|
|
off_t resume_position;
|
2014-02-26 13:59:23 +01:00
|
|
|
int retries;
|
2014-02-13 10:16:31 +01:00
|
|
|
std::ofstream report_ofs;
|
2013-03-15 21:46:16 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // DOWNLOADER_H
|