📄 setup.cpp
字号:
// Constructor.
WFilerPageWelcome( WFilerWizard* InOwner )
: WWizardPage ( TEXT("FilerPageWelcome"), IDDIALOG_FilerPageWelcome, InOwner )
, Owner ( InOwner )
, Manager ( InOwner->Manager )
, WelcomePrompt ( this, IDC_WelcomePrompt )
, LanguagePrompt( this, IDC_LanguagePrompt )
, ProductInfo ( this, InOwner->Manager, InOwner->Manager )
, LanguageList ( this, IDC_LanguageList )
{
guard(WFilerPageWelcome::WFilerPageWelcome);
LanguageList.SelectionChangeDelegate = FDelegate(this,(TDelegate)OnUserChangeLanguage);
unguard;
}
// WDialog interface.
void OnCurrent()
{
guard(WFilerPageWelcome::OnSetFocus);
Owner->SetText( *Manager->SetupWindowTitle );
unguard;
}
void OnInitDialog()
{
guard(WFilerPageWelcome::OnInitDialog);
WWizardPage::OnInitDialog();
// Open product info window.
ProductInfo.OpenChildWindow( IDC_ProductInfoHolder, 1 );
// Get keyboard layout info.
INT UserLangId = GetUserDefaultLangID() & ((1<<10)-1);
INT UserSubLangId = GetUserDefaultLangID() >> 10;
debugf( NAME_Init, TEXT("Language %i, Sublanguage %i"), UserLangId, UserSubLangId );
// Get language list.
INT Ideal=-1, Best=-1, Current=0;
UObject::GetRegistryObjects( Results, UClass::StaticClass(), ULanguage::StaticClass(), 0 );
if( Results.Num()==0 )
appErrorf( TEXT("No Languages Found") );
// Pick language matching keyboard layout if one exists, otherwise .int.
for( INT i=0; i<Results.Num(); i++ )
{
TCHAR Name[256];
INT LangId, SubLangId;
FString Path = US + TEXT("Core.") + Results(i).Object;
GConfig->GetString( TEXT("Language"), TEXT("Language"), Name, ARRAY_COUNT(Name), *Path );
GConfig->GetInt( TEXT("Language"), TEXT("LangId"), LangId, *Path );
GConfig->GetInt( TEXT("Language"), TEXT("SubLangId"), SubLangId, *Path );
new(LanguageNames)FString( Name );
LanguageList.AddString( Name );
if( appStricmp(*Results(i).Object,TEXT("int"))==0 )
Current = i;
if( LangId==UserLangId )
Best = i;
if( LangId==UserLangId && SubLangId==UserSubLangId )
Ideal = i;
}
if( Best>=0 )
Current = Best;
if( Ideal>=0 )
Current = Ideal;
LanguageList.SetCurrent( LanguageList.FindString(*LanguageNames(Current)), 1 );
OnUserChangeLanguage();
unguard;
}
// WWizardPage interface.
WWizardPage* GetNext()
{
guard(WFilerPageWelcome::GetNext);
return new WFilerPageLicense(Owner);
unguard;
}
const TCHAR* GetBackText()
{
return NULL;
}
// WFilerPageWelcome interface.
void OnUserChangeLanguage()
{
guard(WFilerPageWelcome::OnUserChangeLanguage);
INT Index;
if( LanguageNames.FindItem(*LanguageList.GetString(LanguageList.GetCurrent()),Index) )
{
FString Language = *Results(Index).Object;
UObject::SetLanguage( *Language );
GConfig->SetString( TEXT("Setup"), TEXT("Language"), *Language, *Manager->ConfigFile );
}
LanguageChange();//!!
unguard;
}
virtual void LanguageChange()
{
guard(WFilerPageWelcome::LanguageChange);
// Welcome text.
WelcomePrompt.SetText( *FString::Printf( LineFormat(Localize("IDDIALOG_FilerPageWelcome",Manager->Patch ? "IDC_WelcomePromptUpdate" : "IDC_WelcomePrompt" )), *Manager->LocalProduct, *Manager->Version ) );
// Other text.
Owner->SetText(LineFormat(Localize("IDDIALOG_WizardDialog", "IDC_WizardDialog" )));
LanguagePrompt.SetText(LineFormat(Localize("IDDIALOG_FilerPageWelcome","IDC_LanguagePrompt")));
ProductInfo.LanguageChange();//!!
Owner->RefreshPage();//!!
unguard;
}
};
// Components.
class WFilerPageUninstallComponents : public WFilerPageComponentsBase
{
DECLARE_WINDOWCLASS(WFilerPageUninstallComponents,WFilerPageComponentsBase,Setup)
// Variables.
USetupDefinition* Manager;
TArray<USetupGroup*>& Dependencies;
WComponentProperties Components;
// Constructor.
WFilerPageUninstallComponents( WFilerWizard* InOwner )
: WFilerPageComponentsBase( TEXT("FilerPageUninstallComponents"), IDDIALOG_FilerPageUninstallComponents, InOwner )
, Manager ( InOwner->Manager )
, Components ( this )
, Dependencies ( InOwner->Manager->UninstallComponents )
{}
// Functions.
void OnGroupChange( class FComponentItem* Group )
{
guard(WFilerPageComponents::OnSelectionChange);
INT i, Added;
// Unforce all.
for( i=0; i<Components.Root.Children.Num(); i++ )
{
FComponentItem* Item = (FComponentItem*)Components.Root.Children(i);
Item->Forced = 0;
}
// Build list of dependent components that must be uninstalled due to selected products.
Dependencies.Empty();
for( i=0; i<Components.Root.Children.Num(); i++ )
{
FComponentItem* Item = (FComponentItem*)Components.Root.Children(i);
if( Item->SetupGroup->Selected )
Dependencies.AddItem( Item->SetupGroup );
}
// All items that are dependent but not selected must be forced.
do
{
Added = 0;
for( i=0; i<Components.Root.Children.Num(); i++ )
{
FComponentItem* Item = (FComponentItem*)Components.Root.Children(i);
if( !Item->Forced )
{
for( INT j=0; j<Item->SetupGroup->Requires.Num(); j++ )
{
for( INT k=0; k<Components.Root.Children.Num(); k++ )
{
FComponentItem* Other = (FComponentItem*)Components.Root.Children(k);
if( Item->SetupGroup->Requires(j)==Other->SetupGroup->GetName() && (Other->SetupGroup->Selected || Other->Forced) )
{
Dependencies.AddUniqueItem( Item->SetupGroup );
Item->Forced = 1;
Added = 1;
}
}
}
}
}
} while( Added );
// Refresh.
Owner->RefreshPage();
unguard;
}
// WWizardPage interface.
const TCHAR* GetNextText()
{
guard(WFilerPageComponents::GetNextText);
return Dependencies.Num() ? WWizardPage::GetNextText() : NULL;
unguard;
}
WWizardPage* GetNext()
{
guard(WFilerPageComponents::GetNext);
return Dependencies.Num() ? new WFilerPageUninstall(Owner) : NULL;
unguard;
}
void OnInitDialog()
{
guard(WFilerPageComponents::OnInitDialog);
WWizardPage::OnInitDialog();
Components.OpenChildWindow( IDC_ComponentsHolder );
OnGroupChange( NULL );
Components.GetRoot()->Expand();
Components.ResizeList();
Components.List.SetCurrent( 0, 1 );
Components.SetItemFocus( 1 );
unguard;
}
UBOOL GetShow()
{
guard(WFilerPageComponents::GetShow);
if( Components.Root.Children.Num()==1 )
{
FComponentItem* Item = (FComponentItem*)Components.Root.Children(0);
if( Item->Children.Num()==0 )
{
Dependencies.AddItem( Item->SetupGroup );
return 0;
}
}
return 1;
unguard;
}
};
// WFilerPageAutoplay.
class WFilerPageAutoPlay : public WWizardPage
{
DECLARE_WINDOWCLASS(WFilerPageAutoPlay,WWizardPage,Setup)
// Variables.
WFilerWizard* Owner;
USetupDefinition* Manager;
WLabel Options;
WLabel CompleteLabel;
WButton CompleteFrame;
WCoolButton PlayButton;
WCoolButton ReleaseNotesButton;
WCoolButton ReinstallButton;
WCoolButton UninstallButton;
WCoolButton WebButton;
UBOOL ShowInstallOptions;
// Constructor.
WFilerPageAutoPlay( WFilerWizard* InOwner, UBOOL InShowInstallOptions )
: WWizardPage( TEXT("FilerPageAutoPlay"), IDDIALOG_FilerPageAutoPlay, InOwner )
, Owner ( InOwner )
, Manager ( InOwner->Manager )
, Options ( this, IDC_Options )
, PlayButton ( this, IDC_Play, FDelegate(this,(TDelegate)OnPlay), CBFF_ShowOver|CBFF_UrlStyle )
, ReleaseNotesButton( this, IDC_ReleaseNotes, FDelegate(this,(TDelegate)OnReleaseNotes), CBFF_ShowOver|CBFF_UrlStyle )
, WebButton ( this, IDC_Web, FDelegate(this,(TDelegate)OnWeb), CBFF_ShowOver|CBFF_UrlStyle )
, ReinstallButton ( this, IDC_Reinstall, FDelegate(this,(TDelegate)OnInstall), CBFF_ShowOver|CBFF_UrlStyle )
, UninstallButton ( this, IDC_Uninstall, FDelegate(this,(TDelegate)OnUninstall), CBFF_ShowOver|CBFF_UrlStyle )
, CompleteLabel ( this, IDC_Complete )
, CompleteFrame ( this, IDC_Divider )
, ShowInstallOptions( InShowInstallOptions )
{}
// Buttons.
void OnPlay()
{
guard(WFilerPageAutoPlay::OnPlay);
FString Exe = Manager->RegistryFolder * Manager->Exe;
FString Folder = Exe;
while( Folder.Len() && Folder.Right(1)!=PATH_SEPARATOR )
Folder = Folder.LeftChop( 1 );
if( Folder.Right(1)==PATH_SEPARATOR )
Folder = Folder.LeftChop( 1 );
ShellExecuteX( *this, TEXT("open"), *Exe, TEXT(""), *Folder, SW_SHOWNORMAL );
Owner->OnFinish();
unguard;
}
void OnInstall()
{
guard(WFilerPageAutoPlay::OnInstall);
Owner->Advance( new WFilerPageWelcome(Owner) );
unguard;
}
void OnUninstall()
{
guard(WFilerPageAutoPlay::OnUninstall);
FString Path = Manager->RegistryFolder*TEXT("System");
ShellExecuteX( NULL, TEXT("open"), *(Path*TEXT("Setup.exe")), *(US+TEXT("uninstall \"") + Manager->Product + TEXT("\"")), *Path, SW_SHOWNORMAL );
Owner->OnFinish();
unguard;
}
void OnReleaseNotes()
{
guard(WFilerPageAutoPlay::OnReleaseNotes);
ShellExecuteX( *this, TEXT("open"), *(Manager->RegistryFolder * Manager->ReadMe), TEXT(""), NULL, SW_SHOWNORMAL );
unguard;
}
void OnWeb()
{
guard(WFilerPageAutoPlay::OnWeb);
ShellExecuteX( *this, TEXT("open"), *Manager->ProductURL, TEXT(""), appBaseDir(), SW_SHOWNORMAL );
unguard;
}
// WWizardPage interface.
void OnCurrent()
{
guard(WFilerPageAutoplay::OnCurrent);
Owner->SetText( *Manager->AutoplayWindowTitle );
unguard;
}
void OnInitDialog()
{
guard(WFilerPageAutoPlay::OnInitDialog);
WWizardPage::OnInitDialog();
Options.SetFont( hFontHeadline );
if( ShowInstallOptions )
{
CompleteLabel.Show(0);
CompleteFrame.Show(0);
}
else
{
ReinstallButton.Show(0);
UninstallButton.Show(0);
}
if( !Manager->Exists || Manager->Exe==TEXT("") || Manager->MustReboot )
PlayButton.Show(0);
if( Manager->MustReboot )
CompleteLabel.SetText( LineFormat(Localize("IDDIALOG_FilerPageAutoPlay","IDC_CompleteReboot")) );
Options.SetText( *Manager->AutoplayWindowTitle );
unguard;
}
WWizardPage* GetNext()
{
guard(WFilerPageAutoPlay::GetNext);
Manager->MustReboot = 0;
Owner->OnFinish();
return NULL;
unguard;
}
const TCHAR* GetBackText()
{
return NULL;
}
const TCHAR* GetFinishText()
{
return ShowInstallOptions ? NULL : Manager->MustReboot ? LocalizeGeneral("RebootButton") : LocalizeGeneral("FinishButton",TEXT("Window"));
}
const TCHAR* GetNextText()
{
return (Manager->MustReboot && !ShowInstallOptions) ? LocalizeGeneral("ExitButton") : NULL;
}
virtual const TCHAR* GetCancelText()
{
return ShowInstallOptions ? WWizardPage::GetCancelText() : NULL;
}
};
WWizardPage* NewAutoPlayPage( WFilerWizard* InOwner, UBOOL ShowInstallOptions )
{
return new WFilerPageAutoPlay( InOwner, ShowInstallOptions );
}
/*-----------------------------------------------------------------------------
WinMain.
-----------------------------------------------------------------------------*/
//
// Main window entry point.
//
INT WINAPI WinMain( HINSTANCE hInInstance, HINSTANCE hPrevInstance, char* InCmdLine, INT nCmdShow )
{
// Remember instance info.
GIsStarted = 1;
hInstance = hInInstance;
appStrcpy( GPackage, appPackage() );
// Begin.
#ifndef _DEBUG
try
{
#endif
{
// Init.
HANDLE hMutex = NULL;
GIsEditor = 0;
GIsScriptable = GIsClient = GIsServer = GIsGuarded = 1;
appInit( GPackage, GetCommandLine(), &Malloc, GNull, &Error, &Warn, &FileManager, FConfigCacheIni::Factory, 0 );
GConfig->Detach( *(FString(GPackage)+TEXT(".ini")) );
// Init windowing.
InitWindowing();
IMPLEMENT_WINDOWCLASS(WFilerPageWelcome,0);
IMPLEMENT_WINDOWCLASS(WFilerPageLicense,0);
IMPLEMENT_WINDOWCLASS(WFilerPageComponentsBase,0);
IMPLEMENT_WINDOWCLASS(WFilerPageComponents,0);
IMPLEMENT_WINDOWCLASS(WFilerPageFolder,0);
IMPLEMENT_WINDOWCLASS(WFilerPageCdFolder,0);
IMPLEMENT_WINDOWCLASS(WFilerPageProgress,0);
IMPLEMENT_WINDOWCLASS(WFilerPageInstallProgress,0);
IMPLEMENT_WINDOWCLASS(WFilerPageUninstallProgress,0);
IMPLEMENT_WINDOWCLASS(WFilerPageUninstall,0);
IMPLEMENT_WINDOWCLASS(WFilerWizard,0);
IMPLEMENT_WINDOWCLASS(WFilerPageAutoPlay,0);
IMPLEMENT_WINDOWCLASS(WFailedRequirement,0);
IMPLEMENT_WINDOWCLASS(WProductInfo,0);
IMPLEMENT_WINDOWCLASS(WComponentProperties,0);
IMPLEMENT_WINDOWCLASS(WFilerPageUninstallComponents,0);
//oldver: Detect Unreal version 200 installation and write new format manifest.
guard(DetectOldUnrealVersion);
FString Str, Path;
if
( !regGet( HKEY_LOCAL_MACHINE, TEXT("Software\\Unreal Technology\\Installed Apps\\Unreal"), TEXT("Folder"), Str )
&& regGet( HKEY_CLASSES_ROOT, TEXT("Unreal.Map\\Shell\\Open\\Command"), TEXT(""), Path ) )
{
FString OriginalPath=Path;
FString Check1=TEXT("\\System\\Unreal.exe \"%1\"");
if( Path.Right(Check1.Len())==Check1 )
Path = Path.LeftChop(Check1.Len());
FString Check2=TEXT("\\Unreal.exe \"%1\"");
if( Path.Right(Check2.Len())==Check2 )
Path = Path.LeftChop(Check2.Len());
if( Path.Right(1)==PATH_SEPARATOR )
Path = Path.LeftChop(1);
if( Path!=OriginalPath )
{
regSet( HKEY_LOCAL_MACHINE, TEXT("Software\\Unreal Technology\\Installed Apps\\Unreal"), TEXT("Folder"), *Path );
GConfig->SetString( TEXT("Setup"), TEXT("Group"), TEXT("Unreal"), *(Path * TEXT("System") * SETUP_INI) );
GConfig->SetString( TEXT("Unreal"), TEXT("Version"), TEXT("200"), *(Path * TEXT("System") * SETUP_INI) );
GConfig->Flush( 0 );
}
}
unguard;
// See if Unreal or Filer is running.
INT Count=0;
RetryMutex:
hMutex = CreateMutexX( NULL, 0, TEXT("UnrealIsRunning") );
if( GetLastError()==ERROR_ALREADY_EXISTS )
{
CloseHandle( hMutex );
Sleep(100);
if( ++Count<20 )
if( appStrfind(appCmdLine(),TEXT("reallyuninstall")) || appStrfind(appCmdLine(),TEXT("uninstall")) )
goto RetryMutex;
if( MessageBox(NULL,LocalizeError(TEXT("AlreadyRunning")),LocalizeError(TEXT("AlreadyRunningTitle")),MB_OKCANCEL)==IDOK )
goto RetryMutex;
goto Finished;
}
// Filer interface.
guard(Setup);
WFilerWizard D;
if( !D.Manager->NoRun )
{
WWizardPage* Page;
if( D.Manager->Uninstalling )
Page = new WFilerPageUninstallComponents(&D);
else if( D.Manager->Exists && D.Manager->CdAutoPlay )
Page = new WFilerPageAutoPlay(&D,1);
else
Page = new WFilerPageWelcome(&D);
D.Advance( Page );
D.DoModal();
}
unguard;
// Exit.
Finished:
appPreExit();
GIsGuarded = 0;
}
#ifndef _DEBUG
}
catch( ... )
{
// Crashed.
try
{
Error.HandleError();
}
catch( ... )
{}
}
#endif
// Shut down.
appExit();
GIsStarted = 0;
return 0;
}
/*-----------------------------------------------------------------------------
The End.
-----------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -