277 lines
9.6 KiB
C
277 lines
9.6 KiB
C
|
/*
|
||
|
** Command & Conquer Renegade(tm)
|
||
|
** Copyright 2025 Electronic Arts Inc.
|
||
|
**
|
||
|
** 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 <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
*** Confidential - Westwood Studios ***
|
||
|
***********************************************************************************************
|
||
|
* *
|
||
|
* Project Name : Installer *
|
||
|
* *
|
||
|
* $Archive:: /Commando/Code/Installer/Installer.h $*
|
||
|
* *
|
||
|
* $Author:: Ian_l $*
|
||
|
* *
|
||
|
* $Modtime:: 1/17/02 5:01p $*
|
||
|
* *
|
||
|
* $Revision:: 13 $*
|
||
|
* *
|
||
|
*---------------------------------------------------------------------------------------------*
|
||
|
* Functions: *
|
||
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||
|
#ifndef _INSTALLER_H
|
||
|
#define _INSTALLER_H
|
||
|
|
||
|
// Includes.
|
||
|
#include "RegistryManager.h"
|
||
|
#include "Utilities.h"
|
||
|
#include "Wwuiinput.h"
|
||
|
|
||
|
|
||
|
// Forward declarations.
|
||
|
class AudibleSoundClass;
|
||
|
class CardSelectionDialogClass;
|
||
|
class CopyDialogClass;
|
||
|
class DialogBaseClass;
|
||
|
class FinalDialogClass;
|
||
|
class GameDirectoryDialogClass;
|
||
|
class GameFolderDialogClass;
|
||
|
class INIClass;
|
||
|
class NDADialogClass;
|
||
|
class LicenseDialogClass;
|
||
|
class MixFileFactoryClass;
|
||
|
class ReviewDialogClass;
|
||
|
class SerialDialogClass;
|
||
|
class WelcomeDialogClass;
|
||
|
class WhatToInstallDialogClass;
|
||
|
class WOL1DialogClass;
|
||
|
class WOL2DialogClass;
|
||
|
class WOLDirectoryDialogClass;
|
||
|
class WOLFolderDialogClass;
|
||
|
class WWAudioClass;
|
||
|
class WW3DAssetManager;
|
||
|
|
||
|
|
||
|
// Class definitions.
|
||
|
class InstallerUIInputClass : public WWUIInputClass
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
InstallerUIInputClass() : WWUIInputClass(), MousePosition (Vector3 (0.0f, 0.0f, 0.0f)) {}
|
||
|
|
||
|
void Add_Mouse_Wheel (short delta)
|
||
|
{
|
||
|
MousePosition.Z += delta;
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
|
||
|
const Vector3 &Get_Mouse_Pos (void) const
|
||
|
{
|
||
|
POINT cursorposition;
|
||
|
|
||
|
GetCursorPos (&cursorposition);
|
||
|
ScreenToClient (MainWindow, &cursorposition);
|
||
|
MousePosition.X = cursorposition.x;
|
||
|
MousePosition.Y = cursorposition.y;
|
||
|
return (MousePosition);
|
||
|
}
|
||
|
|
||
|
void Set_Mouse_Pos (const Vector3 &position)
|
||
|
{
|
||
|
POINT p;
|
||
|
|
||
|
if (GameInFocus) {
|
||
|
p.x = position.X;
|
||
|
p.y = position.Y;
|
||
|
ClientToScreen (MainWindow, &p);
|
||
|
SetCursorPos (p.x, p.y);
|
||
|
MousePosition.X = p.x;
|
||
|
MousePosition.Y = p.y;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool Is_Button_Down (int vk_mouse_button_id)
|
||
|
{
|
||
|
bool retval = false;
|
||
|
switch (vk_mouse_button_id)
|
||
|
{
|
||
|
case VK_LBUTTON:
|
||
|
case VK_MBUTTON:
|
||
|
case VK_RBUTTON:
|
||
|
retval = (GetKeyState (vk_mouse_button_id) & 0x80000000) != 0x0;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return retval;
|
||
|
}
|
||
|
|
||
|
mutable Vector3 MousePosition;
|
||
|
};
|
||
|
|
||
|
|
||
|
class FileLogClass {
|
||
|
|
||
|
public:
|
||
|
|
||
|
// Equality operator.
|
||
|
bool operator == (const FileLogClass &f) {
|
||
|
return ((RelativePathname == f.RelativePathname) && (Size == f.Size));
|
||
|
}
|
||
|
|
||
|
// Inequality operator.
|
||
|
bool operator != (const FileLogClass &f) {
|
||
|
return (!(*this == f));
|
||
|
}
|
||
|
|
||
|
WideStringClass RelativePathname; // Relative pathname of file.
|
||
|
__int64 Size; // Size of file (in bytes).
|
||
|
};
|
||
|
|
||
|
|
||
|
class InstallerClass
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
InstallerClass();
|
||
|
~InstallerClass();
|
||
|
|
||
|
InstallerUIInputClass *Get_Input() {return (UIInput);}
|
||
|
|
||
|
void Cancel_Introduction() {CancelIntroduction = true;}
|
||
|
|
||
|
void Install (MixFileFactoryClass *mixfilefactory);
|
||
|
void Dialog_Callback (DialogBaseClass *dialog, int ctrl_id, int message_id, DWORD param);
|
||
|
void On_Prog_End();
|
||
|
|
||
|
// Main interface.
|
||
|
const WCHAR *Get_Source_Game_Path (WideStringClass &path) {path = SourceGamePath; return (path);}
|
||
|
const WCHAR *Get_Source_WOL_Path (WideStringClass &path) {path = SourceWOLPath; return (path);}
|
||
|
bool Install_Game();
|
||
|
bool Install_WOL();
|
||
|
bool Install_Game_Shortcut();
|
||
|
__int64 Get_Game_Size (bool ondisk);
|
||
|
__int64 Get_WOL_Size (bool ondisk);
|
||
|
__int64 Get_Total_Size (bool ondisk);
|
||
|
bool Get_Game_Space_Available (const WideStringClass &path, __int64 &diskspace) {return (Get_Disk_Space_Available (path, diskspace));}
|
||
|
bool Get_WOL_Space_Available (const WideStringClass &path, __int64 &diskspace);
|
||
|
const char *Get_Serial_Number (StringClass &serialnumber);
|
||
|
const WCHAR *Get_Target_Game_Path (WideStringClass &path);
|
||
|
bool Get_Target_Sub_Path (unsigned index, WideStringClass &subdirectoryname);
|
||
|
const WCHAR *Get_Target_WOL_Path (WideStringClass &path);
|
||
|
const WCHAR *Get_Target_Game_Folder (WideStringClass &folder);
|
||
|
const WCHAR *Get_Target_WOL_Folder (WideStringClass &folder);
|
||
|
bool Is_Fresh_Game_Install() {return (FreshGameInstall);}
|
||
|
bool Is_Fresh_WOL_Install() {return (FreshWOLInstall);}
|
||
|
bool Is_Target_WOL_Older_Than_Source() {return (TargetWOLOlder);}
|
||
|
WW3DAssetManager *Get_Asset_Manager() {return (AssetManager);}
|
||
|
bool Can_Use_IGR_Settings();
|
||
|
bool Use_IGR_Settings();
|
||
|
bool Beta_Test();
|
||
|
|
||
|
// Registry interface.
|
||
|
void Update_Registry();
|
||
|
void Create_Links();
|
||
|
bool Get_WOL_Account (unsigned index, WideStringClass &name, WideStringClass &password);
|
||
|
void Set_Preferred_WOL_Account (const WideStringClass &accountname) {_RegistryManager.Set_Preferred_WOL_Account (accountname);}
|
||
|
|
||
|
// File/subdirectory logging interface.
|
||
|
void Log (const WideStringClass &pathname, __int64 size = -1);
|
||
|
void Create_Uninstall_Logs();
|
||
|
|
||
|
protected:
|
||
|
|
||
|
enum ProgEndActionEnum {
|
||
|
ACTION_NONE,
|
||
|
ACTION_RUN_GAME,
|
||
|
ACTION_DISPLAY_README
|
||
|
};
|
||
|
|
||
|
// Internal initialization/shutdown.
|
||
|
void Initialize();
|
||
|
void Shutdown();
|
||
|
bool WW3D_Initialize (int cardselection = -1);
|
||
|
void WW3D_Shutdown();
|
||
|
|
||
|
// Support functions.
|
||
|
bool Check_Source();
|
||
|
void Count_Source_Files (const WideStringClass &sourcepath, unsigned &filecount, __int64 &filesize);
|
||
|
void Check_Existing_Install();
|
||
|
void Auto_Configure();
|
||
|
bool Register_COM_Server (const WideStringClass &comdll);
|
||
|
void Create_Encryption_File (const WideStringClass &pathname);
|
||
|
void Encrypt (const char *number, const WideStringClass &pathname, StringClass &encryptednumber);
|
||
|
bool Create_File_Link (const WideStringClass &linkpath, const WideStringClass &title, const WideStringClass &targetpathname, const WideStringClass &iconpathname, const WideStringClass *arguments = NULL);
|
||
|
bool Create_URL_Link (const WideStringClass &linkpath, const WideStringClass &title, const WideStringClass &url);
|
||
|
bool Has_WOL_Account();
|
||
|
void Create_Game_Uninstall_Log();
|
||
|
void Create_WOL_Uninstall_Log();
|
||
|
void Run_Game();
|
||
|
void Display_Readme();
|
||
|
|
||
|
// Data.
|
||
|
INIClass *SetupIni;
|
||
|
INIClass *GameIni;
|
||
|
INIClass *WOLIni;
|
||
|
WideStringClass SourceGamePath;
|
||
|
WideStringClass SourceWOLPath;
|
||
|
MixFileFactoryClass *MixFileFactory;
|
||
|
DynamicVectorClass <WideStringClass> FontNames;
|
||
|
WideStringClass TargetGamePath;
|
||
|
bool FreshGameInstall;
|
||
|
bool FreshWOLInstall;
|
||
|
bool TargetWOLOlder;
|
||
|
unsigned GameFileCount;
|
||
|
__int64 GameSize;
|
||
|
unsigned WOLFileCount;
|
||
|
__int64 WOLSize;
|
||
|
WW3DAssetManager *AssetManager;
|
||
|
bool WwmathInitialized;
|
||
|
bool DialogMgrInitialized;
|
||
|
WWAudioClass *AudioSystem;
|
||
|
AudibleSoundClass *TransitionMusic;
|
||
|
AudibleSoundClass *InstallMusic;
|
||
|
InstallerUIInputClass *UIInput;
|
||
|
bool CancelIntroduction;
|
||
|
bool CancelApplication;
|
||
|
WelcomeDialogClass *WelcomeDialog;
|
||
|
NDADialogClass *NDADialog;
|
||
|
LicenseDialogClass *LicenseDialog;
|
||
|
SerialDialogClass *SerialDialog;
|
||
|
WhatToInstallDialogClass *WhatToInstallDialog;
|
||
|
GameDirectoryDialogClass *GameDirectoryDialog;
|
||
|
GameFolderDialogClass *GameFolderDialog;
|
||
|
WOLDirectoryDialogClass *WOLDirectoryDialog;
|
||
|
WOLFolderDialogClass *WOLFolderDialog;
|
||
|
ReviewDialogClass *ReviewDialog;
|
||
|
CopyDialogClass *CopyDialog;
|
||
|
WOL1DialogClass *WOL1Dialog;
|
||
|
WOL2DialogClass *WOL2Dialog;
|
||
|
FinalDialogClass *FinalDialog;
|
||
|
CardSelectionDialogClass *CardSelectionDialog;
|
||
|
DynamicVectorClass <WideStringClass> GameSubdirectories;
|
||
|
DynamicVectorClass <FileLogClass> GameFiles;
|
||
|
DynamicVectorClass <FileLogClass> WOLFiles;
|
||
|
ProgEndActionEnum ProgEndAction;
|
||
|
};
|
||
|
|
||
|
|
||
|
// Singleton.
|
||
|
extern InstallerClass _Installer;
|
||
|
|
||
|
|
||
|
#endif // INSTALLER_H
|