lgogdownloader/include/downloader.h

118 lines
4.3 KiB
C
Raw Normal View History

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
#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"
#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>
#include <fstream>
#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;
};
2014-03-29 00:51:39 +01:00
class gameItem {
public:
std::string name;
std::string id;
std::vector<std::string> dlcnames;
};
2013-03-15 21:46:16 +01:00
class Downloader
{
public:
Downloader(Config &conf);
virtual ~Downloader();
int init();
int login();
2013-03-15 21:46:16 +01:00
void listGames();
void updateCheck();
void repair();
void download();
void checkOrphans();
void checkStatus();
void updateCache();
void downloadFileWithId(const std::string& fileid_string);
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;
std::deque< std::pair<time_t, uintmax_t> > TimeAndSize;
2013-03-15 21:46:16 +01:00
protected:
private:
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());
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();
uintmax_t getResumePosition();
2013-03-15 21:46:16 +01:00
CURLcode beginDownload();
std::string getResponse(const std::string& url);
std::string getLocalFileHash(const std::string& filepath, const std::string& gamename = std::string());
std::string getRemoteFileHash(const std::string& gamename, const std::string& id);
int loadGameDetailsCache();
int saveGameDetailsCache();
std::vector<gameDetails> getGameDetailsFromJsonNode(Json::Value root, const int& recursion_level = 0);
2013-03-15 21:46:16 +01:00
int HTTP_Login(const std::string& email, const std::string& password);
2014-03-29 00:51:39 +01:00
std::vector<gameItem> getGames();
std::vector<gameItem> getFreeGames();
2015-05-12 01:19:16 +02:00
std::vector<gameFile> getExtrasFromJSON(const Json::Value& json, const std::string& gamename);
Json::Value getGameDetailsJSON(const std::string& gameid);
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);
2013-03-15 21:46:16 +01:00
static int progressCallback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);
static uintmax_t writeMemoryCallback(char *ptr, uintmax_t size, uintmax_t nmemb, void *userp);
static uintmax_t writeData(void *ptr, uintmax_t size, uintmax_t nmemb, FILE *stream);
static uintmax_t readData(void *ptr, uintmax_t size, uintmax_t nmemb, FILE *stream);
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;
uintmax_t resume_position;
int retries;
std::ofstream report_ofs;
2013-03-15 21:46:16 +01:00
};
#endif // DOWNLOADER_H