Rev 1 | Blame | Compare with Previous | Last modification | View Log | RSS feed
#ifndef __PACKAGES_H__#define __PACKAGES_H__#include "SpkFile.h"#include "GameExe.h"#include "XspFile.h"#include "archive/unzip.h"#include "MultiSpkFile.h"#include "VirtualFileSystem.h"enum {INSTALLERR_NONE, INSTALLERR_VERSION, INSTALLERR_INVALID, INSTALLERR_NOMULTI, INSTALLERR_NOSHIP, INSTALLERR_UNKNOWN, INSTALLERR_NOEXIST, INSTALLERR_OLD};enum {INSTALLCHECK_OK, INSTALLCHECK_OLDVERSION, INSTALLCHECK_NOOTHERMOD, INSTALLCHECK_ALREADYQUEUED, INSTALLCHECK_WRONGGAME, INSTALLCHECK_WRONGVERSION, INSTALLCHECK_MODIFIED, INSTALLCHECK_NOSHIP};enum {PROGRESS_ENABLEFILE, PROGRESS_SHUFFLEFAKE, PROGRESS_DISABLEFILE};enum {PKERR_NONE, PKERR_NOPARENT, PKERR_MODIFIED, PKERR_MISSINGDEP, PKERR_NOOUTPUT, PKERR_DONTEXIST, PKERR_UNABLETOOPEN};enum {WARETYPE_NONE, WARETYPE_DELETED, WARETYPE_ADDED, WARETYPE_DISABLED};enum {WARES_BIO, WARES_ENERGY, WARES_FOOD, WARES_MINERAL, WARES_TECH, WARES_NATURAL, WAREBUFFERS};#define IC_WRONGGAME 1#define IC_WRONGVERSION 2#define IC_OLDVERSION 4#define IC_MODIFIED 8#define IC_ALL 15#define PMTEXTFILE 901#define SHIPSTARTTEXT 500000#define WARETEXTSTART 400000class CFileIO;tstruct SGameWare {char cType;int iType;int iText;CyString sWareName;int iPos;SWares *pWare;} SGameWare;tstruct SGameShip {int iType;int iText;int iPos;CyString sShipID;CyString sShipClass;CXspFile *pPackage;} SGameShip;tstruct SBodies {CyString sNumbers;CyString sSection;CyStringList lEntries;} SBodes;tstruct SAvailablePackage {CLinkList<SGameCompat> lGames;int iType;int iPluginType;CyString sName;CyString sAuthor;CyString sVersion;CyString sDesc;CyString sUpdated;int iEase;int iChanging;int iRec;CyString sFilename;int iScriptType;bool bSigned;} SAvailablePackage;class SPKEXPORT CPackages{public:static CyString ConvertLanguage(int lang);static SAvailablePackage *CreateAvailablePackageData(CBaseFile *package);static CyString FormatAvailablePackageData(CBaseFile *package);static CyString FormatAvailablePackageData(SAvailablePackage *package);static CyString CreateFromPackagerScript(CyString filename);static int GeneratePackageUpdateData(CyString dir, bool includeSingle = true);CPackages ();~CPackages ();bool IsOldDir(CyString dir);bool Read ( CyString dir, CProgressInfo *progress = NULL );void Startup(CyString dir, CyString tempDir, CyString myDoc, CyString mod = NullString);CBaseFile *LoadPackagerScript(CyString filename, int compression, CyString (*askFunc)(CyString), CyStringList *malformedLines = NULL, CyStringList *unknownCommands = NULL, CyStringList *variables = NULL);CyStringList *GetGlobals() { return &m_lGlobals; }CyStringList *GetFakePatchOrder() { return &m_lFakePatchOrder; }CyString GetCurrentDirectory() { return m_sCurrentDir; }CyString GetTempDirectory() { return m_sTempDir; }CyString GetMyDocuments() { return m_sMyDoc; }CGameExe *GetGameExe() { return &m_gameExe; }CLinkList<CBaseFile> *GetInstallPackageList() { return &m_lInstallList; }// installing/uninstallingbool InstallPackage ( CBaseFile *package, CyStringList *errors, CProgressInfo *progress = NULL, bool disabled = false );CBaseFile *OpenPackage ( CyString file, int *error, CProgressInfo *progress = NULL, int readtype = SPKREAD_ALL, int flags = READFLAG_NONE );CMultiSpkFile *OpenMultiPackage(CyString file, int *error, CProgressInfo *progress = NULL);bool OpenMultiPackage ( CyString file, CLinkList<CBaseFile> *packageList, int *error, CProgressInfo *progress = NULL );int CheckInstallPackage(CBaseFile *package, int check = IC_ALL);bool RemoveFile(C_File *file, CyStringList *errors = NULL);void PrepareUninstallPackage(CBaseFile *package);bool UninstallPreparedPackages(CyStringList *errors, CProgressInfo *progress, CLinkList<CBaseFile> *uninstalledPackages = NULL, CLinkList<CBaseFile> *disabledPackages = NULL);void ConvertOldPackage(CBaseFile *p);void PurgeUninstallScripts(CBaseFile *package, CyStringList *errors);int PrepareInstallPackage(CBaseFile *package, bool disabled = false, bool force = false, int check = IC_ALL);int InstallPreparedPackages(CyStringList *errors, CProgressInfo *progress, CLinkList<CBaseFile> *errored, CLinkList<CBaseFile> *installedList = NULL);void RemovePreparedInstall(CBaseFile *package);int GetNumPackagesInQueue() { return m_lInstallList.size(); }int CheckOpenPackage(CyString file, int *error);int GetMissingDependacies(CBaseFile *p, CyStringList *list, bool onlyEnabled = false, bool includePrepared = false);bool CheckInstalledDependacy(CyString name, CyString author, CyString version, bool onlyEnabled = false, bool includePerpered = false);bool CheckEnabledDependacy(CBaseFile *p);int GetDependacyList(CBaseFile *package, CLinkList<CBaseFile> *list);int PrepareMultiPackage ( CyString file, CLinkList<CBaseFile> *errorPackageList, int *error, CProgressInfo *progress = 0);bool IsOldPluginManager() { return m_bOldPlugin; }// enable/disablebool EnablePackage ( CBaseFile *package, CyStringList *errors, CProgressInfo *progress = NULL );bool DisablePackage ( CBaseFile *package, CyStringList *errors, CProgressInfo *progress = NULL );bool DisablePreparedPackages ( CyStringList *errors, CProgressInfo *progress, CLinkList<CBaseFile> *disabledPackages = NULL );bool PrepareEnablePackage(CBaseFile *package);bool PrepareDisablePackage(CBaseFile *package);bool EnablePreparedPackages ( CyStringList *errors, CProgressInfo *progress, CLinkList<CBaseFile> *enabledPackages = NULL );int GetNumPackagesInEnabledQueue() { return m_lEnableList.size(); }int GetNumPackagesInDisabledQueue() { return m_lDisableList.size(); }bool PrepareDisableForVanilla();bool PrepareEnableLibrarys();bool PrepareEnableFromVanilla();void WriteData();bool CloseDir ( CyStringList *errors = 0, CProgressInfo *progress = NULL, bool removedir = false );bool RestoreFakePatch();bool ReadyFakePatch();bool CheckValidPluginManagerFile(CyString filename);bool CheckIfPluginManagerFile(CyString filename);// package controlvoid UpdateUsedFiles(CLinkList<CBaseFile> *ignoreList = NULL, bool = true);void UpdateSigned();bool UpdatePackages(int doStatus = -1, bool individual = false);CBaseFile *FindXspPackage(CyString id);CBaseFile *FindSpkPackage(CyString name, CyString author);CArchiveFile *FindArchivePackage(CyString name);CBaseFile *FindPackage(CyString name, CyString author);CBaseFile *FindFirstPackageWithFile(C_File *f);CBaseFile *FindNextPackageWithFile(CBaseFile *p, C_File *f);CBaseFile *FindPackage(CBaseFile *package);C_File *FindFile(int filetype, CyString filename, CyString dir = NullString);CBaseFile *FirstPackage() { return m_lPackages.First(); }CBaseFile *NextPackage() { return m_lPackages.Next(); }CBaseFile *GetFirstPackage() { if ( m_lPackages.Front() ) return m_lPackages.Front()->Data(); return NULL; }CBaseFile *GetNextPackage(CBaseFile *from){bool found = false;for ( CListNode<CBaseFile> *node = m_lPackages.Front(); node; node = node->next() ){if ( !node->Data() ) continue;if ( node->Data() == from )found = true;else if ( found )return node->Data();}return NULL;}void Reset();CBaseFile *GetPackageAt(int i) { return m_lPackages[i]; }CyString GetSelectedModName();CyString GetModKey();void SetupWares();void SetupShips();void PurgeGameObjects();void PurgeWares();void PurgeShips();void StartPackage() { m_pPackageNode = m_lPackages.Front(); }void UpdatePackage(CBaseFile *p);CBaseFile *GetCurrentPackage() { return (m_pPackageNode) ? m_pPackageNode->Data() : NULL; }bool RemoveCurrentDirectory();void RemoveCreatedFiles();bool AnyUnusedShared();// util functionsvoid RemoveUnusedDirectories(CyStringList &dirs, CyStringList *errors = NULL);int RemoveUninstallScripts(CyStringList *errors = 0, CProgressInfo *progress = NULL);bool RemoveUninstallFile(C_File *file, CyStringList *errors = 0);int RemoveUnusedSharedFiles(CyStringList *errors = 0, CProgressInfo *progress = NULL);bool RemoveSharedFile(C_File *file, CyStringList *errors = NULL);void ShufflePatchTo(C_File *file, int to, CyStringList *errors);void ShuffleFakePatches(CyStringList *errors);void ShuffleTextFiles(CyStringList *errors);int FindNextFakePatch(int start = 0, CyString dir = NullString);int FindNextTextFile(int start = 2, CyString dir = NullString);int FindLastFakePatch(int start = 99, CyString dir = NullString);int FindLastTextFile(int start = 9999, CyString dir = NullString);int FindLowestFakePatchInstalled();void ReadGameLanguage(bool force = true);int RemoveAllPackages(CyStringList *errors = NULL, CProgressInfo *progress = NULL);void AssignPackageNumbers();int GetChildPackages(CBaseFile *package, CLinkList<CBaseFile> *children, bool recursive = false);int GetAllPackageFiles(CBaseFile *package, CLinkList<C_File> *fileList, bool includeChild);int GetAllPackageFiles(CLinkList<CBaseFile> *list, CLinkList<C_File> *fileList, bool includeChild);void AddLogEntry(int type, CyString args, CyStringList *errors);CyString FindDataDir(CyString dir, CyString file);int CountPackages(int type, bool onlyEnabled);int CountBuiltInPackages(bool onlyEnabled);bool IsCurrentDir(CyString dir);bool CheckOtherPackage(CBaseFile *package);int CheckPreparedInstallRequired(CLinkList<CBaseFile> *list);static int ConvertWareType(char w);static char ConvertWareTypeBack(int w);CyString GetLogDirectory();CyString GetLogDirectory(CyString gameExe);CyString GetSaveDirectory();void BackupSaves() { BackupSaves(m_bVanilla); }void BackupSaves(bool vanilla);void RestoreSaves() { RestoreSaves(m_bVanilla); }void RestoreSaves(bool vanilla);bool UnPackFile(CyString filename, bool checkxml = true);bool PackFile(CyString filename);bool PackFile(CFileIO *File, CyString filename);CyString ConvertTextString(CyString text);void LoadVirtualFileSystem();bool CheckAccessRights(CyString dir);bool LoadShipData(CyString file, CyStringList *list);bool ReadTextPage(CyString file, CyStringList *list, bool search, int page);CyStringList *LoadShipData(CyString file);CyStringList *ReadTextPage(CyString file, bool search, int page);int AdjustFileType(CyString name, int filetype);CXspFile *ExtractShip(CyString catfile, CyString id, CProgressInfo *progress = NULL);CyString ReadShipData(CyString file, CyString entry);bool IsSamePackage(CBaseFile *p1, CBaseFile *p2);void ApplyFakePatchOrder(CyStringList *list);CBaseFile *CreateFromArchive(CyString filename, bool toInstall = false );void ReadArchiveData(const char *buf, size_t len, CBaseFile *archive);void ReadArchiveData(CyString filename, CBaseFile *archive);int VerifyInstalledFiles(CyStringList *missingFiles = NULL, bool getPackages = true);int GetCurrentGameFlags() { return m_iGameFlags; }void SetCurrentDir(CyString dir) { m_sCurrentDir = dir; }// merge modsCyStringList *GetMergedFiles(CCatFile *cat1, CCatFile *cat2);bool CanWeMerge(CyString file);bool MergeMods(CCatFile *mod1, CCatFile *mod2, CyString outFile, CyStringList *cantMerge);bool NeedToMerge(CyString file);CyStringList MergeTextFiles(CyStringList *files, CCatFile *mod1, CCatFile *mod2);bool GetModCompatabilityList(C_File *file, CyStringList *list = NULL);bool CheckCompatabilityBetweenModFiles(C_File *from, C_File *to, CyStringList *list = NULL);bool CheckCompatabilityBetweenMods(CBaseFile *from, CBaseFile *to, CyStringList *list = NULL);int CheckCompatabilityAgainstPackages(CBaseFile *newFile, CyStringList *list = NULL, CLinkList<CBaseFile> *packages = NULL);CyString GetLanguageName();int GetGameLanguage(CyString dir = NullString);int GetGameAddons(CyStringList &exes, CyString dir = NullString);CyString GetGameName(CyString dir = NullString);CyString GetGameVersionFromType(int game, int version, CyString sVersion);CyString GetGameNameFromType(int game);CyString GetGameTypesString(CBaseFile *package, bool includeVersion);CyString GetGameVersionString(CBaseFile *package);CyString GetGameRunExe(CyString dir = NullString);CyString GetProperDir(CyString dir = NullString);CyString GetAddonDir(CyString dir = NullString);// text filesvoid CreateLanguageTextFiles(CyStringList *errors = 0);bool RenameTextFile(CyString textid, int languageid, CyStringList *errors);void AddTextFileToScripts(C_File *file, CyString textid);void CreatePluginManagerText();// game controlvoid CreateEMPFile(CyString progDir = CyString::NullString);void CreateWareFiles();int ExtractGameFile(CyString aFilename, CyString aTo, CyString dir = NullString, CyString addon = NullString);void CreateDummies();void CreateComponants();void CreateCutData();void CreateBodies();void CreateGlobals();void CreateAnimations();void CreateTShips();CyStringList *CreateCockpits();void CreateCustomStarts();void AddCreatedFile(CyString file);bool ReadGlobals(CyStringList &globals);// install textCyString GetInstallBeforeText(CBaseFile *package);CyString GetInstallAfterText(CBaseFile *package);CyString GetUninstallBeforeText(CBaseFile *package);CyString GetUninstallAfterText(CBaseFile *package);// original filesvoid StoreOriginalFiles(int filetype, CyString searchPath);void AddOriginalFile(int filetype, CyString filename, CyString searchPath);C_File *GetOriginalFile(C_File *file);bool IsOriginalFile(C_File *file);bool BackupOriginalFile(C_File *f, CyStringList *errors);//setting functionsvoid SetRenameText(bool b) { m_bRenameText = b; }void SetLanguage(int i) { m_iLanguage = i; }void SetAutoEnable(bool b) { m_bAutoEnableChild = b; }void SetForceModInstall(bool b) { m_bForceModInstall = b; }void SetTempDirectory(CyString s) { m_sTempDir = s; }void SetMyDocuments(CyString s) { m_sMyDoc = s; }void SetForceEMP(bool b) { m_bForceEMP = b; }void SetSurpressProtectedWarning(bool b) { m_bSurpressProtectedWarning = b; }void SurpressProtectedWarning() { m_bSurpressProtectedWarning = true; }bool IsSupressProtectedWarning() { return m_bSurpressProtectedWarning; }int GetLanguage() { return m_iLanguage; }int GetGame() { return m_iGame; }bool IsLoaded() { return m_bLoaded; }bool IsVanilla() { return m_bVanilla; }void SetVanilla(bool b);CyString GetSetMod() { return m_sSetMod; }void SetMod(CyString mod) {if ( mod != "PluginManager" )m_sSetMod = mod;}CBaseFile *GetEnabledMod() { return m_pEnabledMod; }//errorsvoid ClearError() { m_iError = PKERR_NONE; }int GetError() { return m_iError; }CLinkList<CBaseFile> *PackageList() { return &m_lPackages; }CLinkList<SAvailablePackage> *GetAvailablePackageList() { return &m_lAvailablePackages; }bool AnyAvailablePackages(int type = -1);bool AddAvailablePackage(SAvailablePackage *package);void ParseAvailablePackage(CyString str, CyString webaddress = NullString);SAvailablePackage *FindAvailablePackage(CyString &filename);int FindAllServers(CyStringList *list);CBaseFile *FindScriptByAuthor(CyString author, CBaseFile *prev = NULL);void RemoveFailedFiles();private:CyString m_sCurrentDir;CyString m_sTempDir;CyString m_sMyDoc;CyString m_sSetMod;CyString m_sActiveDir;// global files listCLinkList<C_File> m_lFiles;CLinkList<CBaseFile> m_lPackages;CLinkList<C_File> m_lUninstallFiles;CLinkList<C_File> m_lOriginalFiles;CLinkList<SGameWare> m_lGameWares[WAREBUFFERS];CLinkList<SGameShip> m_lGameShips;// prepared listsCLinkList<CBaseFile> m_lInstallList; // install/uninstalling packagesCLinkList<CBaseFile> m_lEnableList; // enable packagesCLinkList<CBaseFile> m_lDisableList; // disable packagesCyStringList m_lCreatedFiles; // list of files we've createdCyStringList m_lNonRemovedFiles; // list of fiels that couldn't be removed for some reasonCyStringList m_lGlobals; // global settigns that we want changedCyStringList m_lFakePatchOrder; // ordered fake patchesCLinkList<SAvailablePackage> m_lAvailablePackages; // list of available packages onlineCVirtualFileSystem m_pGameVFS; // Games Virtual File SystemCGameExe m_gameExe;CBaseFile *m_pEnabledMod;// settingsbool m_bRenameText; // rename text filesbool m_bAutoEnableChild; // auto enable all childrenbool m_bForceModInstall; // allowsm ultiple mods to be installedbool m_bOldPlugin; // if its loading data from the old plugin managerbool m_bLoadVFS; // if we should load the virtual filesystemint m_iLanguage; // Language id to useint m_iSaveGameManager; // Save game managerbool m_bSurpressProtectedWarning; // prevent checking for protected directoryint m_iGame; // the game the directory isint m_iGameVersion; // the version of the game (version position)CyString m_sGameVersion; // the version of the game (full version)int m_iGameFlags; // the flags for the game from SGameExeint m_iMaxPatch; // the maximum patch for the gameint m_iSaveGame;int m_iError;int m_iLastUpdated;int m_iFakePatch; // The current fake patchbool m_bVanilla; // currently in vanilla mode, dont allow unsigned packages to be installedbool m_bLoaded;bool m_bRedo;bool m_bUsedWare; // if we have used the ware files in the directory, not in a patchbool m_bRemoveDir; // shall we remove direcotires;int m_iWareBuffer[WAREBUFFERS]; //Ware Buffersint m_iShipBuffer; //Ship Buffersbool m_bDisableVanilla;bool m_bForceEMP;CListNode<CBaseFile> *m_pPackageNode;};#endif // __PACKAGES_H__