| 1 | cycrow | 1 | #pragma once
 | 
        
           |  |  | 2 |   | 
        
           |  |  | 3 | #include "CyString.h"
 | 
        
           |  |  | 4 | #include "VirtualFileSystem.h"
 | 
        
           |  |  | 5 | #include "lists.h"
 | 
        
           |  |  | 6 | #include "StringList.h"
 | 
        
           |  |  | 7 |   | 
        
           |  |  | 8 | enum {DIFFTYPE_ADDITION, DIFFTYPE_REMOVAL, DIFFTYPE_CHANGE};
 | 
        
           |  |  | 9 |   | 
        
           |  |  | 10 | tstruct SDiffEntry {
 | 
        
           |  |  | 11 | 	int			iType;
 | 
        
           |  |  | 12 | 	int			iID;
 | 
        
           |  |  | 13 | } SDiffEntry;
 | 
        
           |  |  | 14 |   | 
        
           |  |  | 15 | tstruct SDiffEntryAddition : SDiffEntry {
 | 
        
           |  |  | 16 | 	CyString	sEntry;
 | 
        
           |  |  | 17 | 	SDiffEntryAddition() { iType = DIFFTYPE_ADDITION; }
 | 
        
           |  |  | 18 | } SDiffEntryAddition;
 | 
        
           |  |  | 19 |   | 
        
           |  |  | 20 | tstruct SDiffEntryRemoval : SDiffEntry {
 | 
        
           |  |  | 21 | 	SDiffEntryRemoval() { iType = DIFFTYPE_REMOVAL; }
 | 
        
           |  |  | 22 | } SDiffEntryRemoval;
 | 
        
           |  |  | 23 |   | 
        
           |  |  | 24 | tstruct SDiffEntryChange : SDiffEntry {
 | 
        
           |  |  | 25 | 	SDiffEntryChange() { iType = DIFFTYPE_CHANGE; }
 | 
        
           |  |  | 26 | 	int			iPos;
 | 
        
           |  |  | 27 | 	CyString	sFrom;
 | 
        
           |  |  | 28 | 	CyString	sEntry;
 | 
        
           |  |  | 29 | } SDiffEntryChange;
 | 
        
           |  |  | 30 |   | 
        
           |  |  | 31 | tstruct SDiffFile {
 | 
        
           |  |  | 32 | 	CyString sFile;
 | 
        
           |  |  | 33 | 	CLinkList<SDiffEntry> m_lEntries;
 | 
        
           |  |  | 34 | } SDiffFile;
 | 
        
           |  |  | 35 |   | 
        
           |  |  | 36 | enum {MDERR_NONE, MDERR_FILENOTFOUND, MDERR_CANTOPEN, MDERR_CANTOPENMOD};
 | 
        
           |  |  | 37 |   | 
        
           |  |  | 38 | tclass CModDiff
 | 
        
           |  |  | 39 | {
 | 
        
           |  |  | 40 | public:
 | 
        
           |  |  | 41 | 	// static
 | 
        
           |  |  | 42 | 	static bool CanBeDiffed(const CyString &file);
 | 
        
           |  |  | 43 |   | 
        
           |  |  | 44 | 	// constructors
 | 
        
           |  |  | 45 | 	CModDiff(CyString &dir, int maxPatch = 0);
 | 
        
           |  |  | 46 | 	~CModDiff(void);
 | 
        
           |  |  | 47 |   | 
        
           |  |  | 48 | 	// public functions
 | 
        
           |  |  | 49 | 	void SetTempDirectory(CyString &temp) { m_sTempDir = temp; }
 | 
        
           |  |  | 50 | 	bool LoadDirectory(CyString &dir);
 | 
        
           |  |  | 51 | 	bool IsLoaded() { return m_bLoaded; }
 | 
        
           |  |  | 52 | 	const CyString &GetDirectory() { return m_sCurrentDir; }
 | 
        
           |  |  | 53 | 	bool CreateDiff(CyString &mod);
 | 
        
           |  |  | 54 | 	bool DiffFile(CyString &baseFile, CyString &modFile, CyString &fileType);
 | 
        
           |  |  | 55 | 	void Clean();
 | 
        
           |  |  | 56 | 	bool WriteDiff(CyString &file);
 | 
        
           |  |  | 57 | 	bool ReadDiff(CyString &file);
 | 
        
           |  |  | 58 | 	bool ApplyDiff(CyString &mod);
 | 
        
           |  |  | 59 | 	bool ApplyMod(CyString &mod);
 | 
        
           |  |  | 60 | 	void SetMaxPatch(int patch) { m_iMaxPatch = patch; }
 | 
        
           |  |  | 61 |   | 
        
           |  |  | 62 | 	CLinkList<SDiffFile> &GetDiffFiles() { return m_lFiles; }
 | 
        
           |  |  | 63 |   | 
        
           |  |  | 64 | 	void ClearError() { m_iError = MDERR_NONE; }
 | 
        
           |  |  | 65 | 	int Error() { return m_iError; }
 | 
        
           |  |  | 66 |   | 
        
           |  |  | 67 | private:
 | 
        
           |  |  | 68 | 	// private functions
 | 
        
           |  |  | 69 | 	int GetAmountPosition(const CyString &fileType);
 | 
        
           |  |  | 70 | 	bool IsLineComplete(CyString &line, CyString &fileType, bool first);
 | 
        
           |  |  | 71 | 	bool ReadGameFile(CyString &file, CyStringList *lines, int *id);
 | 
        
           |  |  | 72 | 	void CompareLine(CyString &line1, CyString &line2, int type, int id, SDiffFile *diffFile);
 | 
        
           |  |  | 73 | 	bool ValidFile(CyString &file);
 | 
        
           |  |  | 74 |   | 
        
           |  |  | 75 | 	// Variables
 | 
        
           |  |  | 76 | 	CyString m_sCurrentDir;				// the current game directory (that the VFS is opened too)
 | 
        
           |  |  | 77 | 	CyString m_sTempDir;				// temporary dir (used to write temporary files to)
 | 
        
           |  |  | 78 |   | 
        
           |  |  | 79 | 	CVirtualFileSystem m_fileSystem;	// the VFS of the game directory (for finding the files to use)
 | 
        
           |  |  | 80 | 	CLinkList<SDiffFile> m_lFiles;		// list of files that have changed
 | 
        
           |  |  | 81 |   | 
        
           |  |  | 82 | 	bool	m_bLoaded;					// if the directory is loaded and ready to be diffed
 | 
        
           |  |  | 83 | 	int		m_iError;					// error id of process
 | 
        
           |  |  | 84 | 	int		m_iMaxPatch;				// The max fake patch to check to
 | 
        
           |  |  | 85 | };
 |