218 lines
6.2 KiB
C
218 lines
6.2 KiB
C
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||
|
//
|
||
|
// This program is free software: you can redistribute it and/or modify
|
||
|
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
|
||
|
//
|
||
|
// You should have received a copy of the GNU Affero General Public License
|
||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
#ifndef CL_PATCH_H
|
||
|
#define CL_PATCH_H
|
||
|
|
||
|
#include <string>
|
||
|
|
||
|
#include "nel/misc/types_nl.h"
|
||
|
#include "nel/misc/config_file.h"
|
||
|
#include "nel/misc/thread.h"
|
||
|
#include "../game_share/bnp_patch.h"
|
||
|
#include <vector>
|
||
|
|
||
|
class CScanDataThread;
|
||
|
|
||
|
/**
|
||
|
* class managing the patch system
|
||
|
* \author Matthieu 'TrapII' Besson
|
||
|
* \author Vianney 'Ace' Lecroart
|
||
|
* \author Nevrax France
|
||
|
* \date July 2004
|
||
|
*/
|
||
|
class CPatchManager
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
struct SFileToPatch
|
||
|
{
|
||
|
std::string FileName;
|
||
|
std::vector<uint32> Patches;
|
||
|
std::vector<uint32> PatcheSizes;
|
||
|
uint32 LastFileDate; // Used during patching to set the date of the file to the Date of the last patch
|
||
|
bool LocalFileToDelete; // Used during patching to know if we have to delete local file prior to apply patches
|
||
|
bool LocalFileExists;
|
||
|
bool Incremental; // Used during patching to know if we have to xdelta against a ref file
|
||
|
std::string ExtractPath; // Used during patching to extract a bnp file to a specific directory
|
||
|
uint32 FinalFileSize; // just for info, the final size after patch
|
||
|
};
|
||
|
|
||
|
public:
|
||
|
|
||
|
/// Singleton method : Get the unique patch manager instance
|
||
|
static CPatchManager* getInstance()
|
||
|
{
|
||
|
if (_Instance == NULL)
|
||
|
_Instance = new CPatchManager();
|
||
|
return _Instance;
|
||
|
}
|
||
|
|
||
|
// init
|
||
|
void init();
|
||
|
|
||
|
/// Get the version with the Description file (must be done after init)
|
||
|
std::string getClientVersion ();
|
||
|
|
||
|
bool isVerboseLog() { return VerboseLog; }
|
||
|
|
||
|
void setVerboseLog(bool b) { VerboseLog = b; }
|
||
|
|
||
|
// Get the string information about what the threads are doing
|
||
|
// Return true if the state has changed
|
||
|
bool getThreadState (ucstring &state, std::vector<ucstring> &stateLog);
|
||
|
|
||
|
// TODO : Revoir ca pour la seconde partie ...
|
||
|
// On a peut etre pas les informations de taille des patches ... voir avec daniel
|
||
|
// pour l'instant c'est un fake qui retourne 1 !
|
||
|
|
||
|
int getTotalFilesToGet();
|
||
|
int getCurrentFilesToGet();
|
||
|
|
||
|
// ----------------------------------------------
|
||
|
// ScanData Part : optional task wich verify all data
|
||
|
// ----------------------------------------------
|
||
|
|
||
|
// start the full check of BNP
|
||
|
void startScanDataThread();
|
||
|
|
||
|
// if the scan data thread has ended
|
||
|
bool isScanDataThreadEnded(bool &ok);
|
||
|
|
||
|
// ask to stop the Scan Data thread. NB: for security, the thread will continue to the current scanned file,
|
||
|
// then stop. Hence, you must still wait isScanDataThreadEnded() return true
|
||
|
void askForStopScanDataThread();
|
||
|
|
||
|
// get the current info Log for data Scan (true if some change from last get, else text is not filled)
|
||
|
bool getDataScanLog(ucstring &text);
|
||
|
|
||
|
private:
|
||
|
|
||
|
// Methods used by patch & check threads
|
||
|
// -------------------------------------
|
||
|
|
||
|
friend class CScanDataThread;
|
||
|
|
||
|
// Set the thread state (called by threads to let us know what they are doing)
|
||
|
void setState (bool bOutputToLog, const ucstring &ucsState);
|
||
|
|
||
|
/// Read the description file (throw exception if it doesn't exists)
|
||
|
void readDescFile(sint32 nVersion);
|
||
|
|
||
|
/// Read the description of the highest client version file found
|
||
|
void readClientVersionAndDescFile();
|
||
|
|
||
|
/// get all the patchs toapply from the desc and current files present
|
||
|
void getPatchFromDesc(SFileToPatch &ftpOut, const CBNPFile &fIn, bool forceCheckSumTest);
|
||
|
|
||
|
// stop the threads (called when knowing the thread ended)
|
||
|
void stopScanDataThread();
|
||
|
|
||
|
// add a file to the scan data log
|
||
|
void addDataScanLogCorruptedFile(const SFileToPatch &ftp);
|
||
|
void clearDataScanLog();
|
||
|
static void getCorruptedFileInfo(const SFileToPatch &ftp, ucstring &sTranslate);
|
||
|
|
||
|
private:
|
||
|
|
||
|
/// Constructor
|
||
|
CPatchManager();
|
||
|
|
||
|
/// The singleton's instance
|
||
|
static CPatchManager* _Instance;
|
||
|
|
||
|
/// Description file
|
||
|
std::string DescFilename;
|
||
|
bool ValidDescFile;
|
||
|
CProductDescriptionForClient DescFile;
|
||
|
std::vector<SFileToPatch> FilesToPatch;
|
||
|
|
||
|
// Threads
|
||
|
CScanDataThread *ScanDataThread;
|
||
|
NLMISC::IThread *thread;
|
||
|
|
||
|
// State
|
||
|
struct CState
|
||
|
{
|
||
|
ucstring State;
|
||
|
std::vector<ucstring> StateLog;
|
||
|
bool StateChanged;
|
||
|
CState()
|
||
|
{
|
||
|
StateChanged= false;
|
||
|
}
|
||
|
};
|
||
|
NLMISC::CSynchronized<CState> State;
|
||
|
|
||
|
// Where the client get all delta and desc file
|
||
|
std::string ClientPatchPath;
|
||
|
std::string ClientDataPath;
|
||
|
|
||
|
/// Output usefull information for debugging in the log file
|
||
|
bool VerboseLog;
|
||
|
|
||
|
// For Data Scan, list of files with checksum error => should delete them
|
||
|
struct CDataScanState
|
||
|
{
|
||
|
std::vector<SFileToPatch> FilesWithScanDataError;
|
||
|
bool Changed;
|
||
|
CDataScanState()
|
||
|
{
|
||
|
Changed= false;
|
||
|
}
|
||
|
};
|
||
|
typedef NLMISC::CSynchronized<CDataScanState> TSyncDataScanState;
|
||
|
TSyncDataScanState DataScanState;
|
||
|
// The file size of a an empty BNP
|
||
|
enum {EmptyBnpFileSize= 8};
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* This thread perform a checksum check on all existing files registered in the local .idx
|
||
|
* \author Lionel Berenguier
|
||
|
* \author Nevrax France
|
||
|
* \date July 2004
|
||
|
*/
|
||
|
class CScanDataThread : public NLMISC::IRunnable
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
CScanDataThread();
|
||
|
|
||
|
public:
|
||
|
|
||
|
// Written by MainThread, read by thread
|
||
|
bool AskForCancel; // true if the main thread ask to cancel the task
|
||
|
|
||
|
// Written by thread, read by Main Thread
|
||
|
bool Ended; // true if the thread have ended
|
||
|
bool CheckOk; // true if the check is good
|
||
|
int TotalFileToScan;
|
||
|
int CurrentFileScanned;
|
||
|
|
||
|
private:
|
||
|
|
||
|
void run();
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif // CL_PATCH_H
|
||
|
|
||
|
/* End of login_patch.h */
|