Files
2019-01-31 02:40:31 +01:00

175 lines
5.8 KiB
C++

// This file is part of Glest <https://github.com/Glest>
//
// Copyright (C) 2018 The Glest team
//
// Glest is a fork of MegaGlest <https://megaglest.org/>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>
#ifndef _SHARED_PLATFORMCOMMON_MINIFTPCLIENTTHREAD_H_
#define _SHARED_PLATFORMCOMMON_MINIFTPCLIENTTHREAD_H_
#include "base_thread.h"
#include <vector>
#include <string>
#include "platform_common.h"
#include "leak_dumper.h"
using namespace std;
namespace Shared {
namespace PlatformCommon {
// =====================================================
// class FTPClientThread
// =====================================================
enum FTP_Client_ResultType {
ftp_crt_SUCCESS = 0,
ftp_crt_PARTIALFAIL = 1,
ftp_crt_FAIL = 2,
ftp_crt_ABORTED = 3,
ftp_crt_HOST_NOT_ACCEPTING = 4
};
enum FTP_Client_CallbackType {
ftp_cct_Map = 0,
ftp_cct_Tileset = 1,
ftp_cct_Techtree = 2,
ftp_cct_Scenario = 3,
ftp_cct_File = 4,
ftp_cct_TempFile = 5,
ftp_cct_DownloadProgress = 6,
ftp_cct_ExtractProgress = 7
};
class FTPClientCallbackInterface {
public:
virtual ~FTPClientCallbackInterface() {
}
struct FtpProgressStats {
double download_total;
double download_now;
double upload_total;
double upload_now;
string currentFilename;
FTP_Client_CallbackType downloadType;
};
virtual void FTPClient_CallbackEvent(string itemName,
FTP_Client_CallbackType type,
pair<FTP_Client_ResultType, string> result,
void *userdata) = 0;
};
class FTPClientThread : public BaseThread, public ShellCommandOutputCallbackInterface {
protected:
int portNumber;
string serverUrl;
FTPClientCallbackInterface *pCBObject;
std::pair<string, string> mapsPath;
std::pair<string, string> tilesetsPath;
std::pair<string, string> techtreesPath;
std::pair<string, string> scenariosPath;
string tempFilesPath;
Mutex mutexMapFileList;
vector<pair<string, string> > mapFileList;
Mutex mutexTilesetList;
vector<pair<string, string> > tilesetList;
Mutex mutexTechtreeList;
vector<pair<string, string> > techtreeList;
Mutex mutexScenarioList;
vector<pair<string, string> > scenarioList;
Mutex mutexFileList;
vector<pair<string, string> > fileList;
Mutex mutexTempFileList;
vector<pair<string, string> > tempFileList;
void getMapFromServer(pair<string, string> mapFilename);
pair<FTP_Client_ResultType, string> getMapFromServer(pair<string, string> mapFileName, string ftpUser, string ftpUserPassword);
void getTilesetFromServer(pair<string, string> tileSetName);
pair<FTP_Client_ResultType, string> getTilesetFromServer(pair<string, string> tileSetName, string tileSetNameSubfolder, string ftpUser, string ftpUserPassword, bool findArchive);
void getTechtreeFromServer(pair<string, string> techtreeName);
pair<FTP_Client_ResultType, string> getTechtreeFromServer(pair<string, string> techtreeName, string ftpUser, string ftpUserPassword);
void getScenarioFromServer(pair<string, string> fileName);
pair<FTP_Client_ResultType, string> getScenarioInternalFromServer(pair<string, string> fileName);
void getFileFromServer(pair<string, string> fileName);
pair<FTP_Client_ResultType, string> getFileInternalFromServer(pair<string, string> fileName);
void getTempFileFromServer(pair<string, string> fileName);
pair<FTP_Client_ResultType, string> getTempFileInternalFromServer(pair<string, string> fileName);
Mutex mutexProgressMutex;
string fileArchiveExtension;
string fileArchiveExtractCommand;
string fileArchiveExtractCommandParameters;
int fileArchiveExtractCommandSuccessResult;
pair<FTP_Client_ResultType, string> getFileFromServer(FTP_Client_CallbackType downloadType,
pair<string, string> fileNameTitle,
string remotePath, string destFileSaveAs, string ftpUser,
string ftpUserPassword, vector <string> *wantDirListOnly = NULL);
string shellCommandCallbackUserData;
virtual void * getShellCommandOutput_UserData(string cmd);
virtual void ShellCommandOutput_CallbackEvent(string cmd, char *output, void *userdata);
public:
FTPClientThread(int portNumber, string serverUrl,
std::pair<string, string> mapsPath,
std::pair<string, string> tilesetsPath,
std::pair<string, string> techtreesPath,
std::pair<string, string> scenariosPath,
FTPClientCallbackInterface *pCBObject,
string fileArchiveExtension,
string fileArchiveExtractCommand,
string fileArchiveExtractCommandParameters,
int fileArchiveExtractCommandSuccessResult,
string tempFilesPath);
virtual void execute();
virtual void signalQuit();
virtual bool shutdownAndWait();
void addMapToRequests(string mapFilename, string URL = "");
void addTilesetToRequests(string tileSetName, string URL = "");
void addTechtreeToRequests(string techtreeName, string URL = "");
void addScenarioToRequests(string fileName, string URL = "");
void addFileToRequests(string fileName, string URL = "");
void addTempFileToRequests(string fileName, string URL = "");
FTPClientCallbackInterface * getCallBackObject();
void setCallBackObject(FTPClientCallbackInterface *value);
Mutex * getProgressMutex() {
return &mutexProgressMutex;
}
};
}
} //end namespace
#endif