summaryrefslogtreecommitdiff
path: root/utils/xbox/vxconsole/sync_files.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/xbox/vxconsole/sync_files.cpp
downloadarchived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz
archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip
Diffstat (limited to 'utils/xbox/vxconsole/sync_files.cpp')
-rw-r--r--utils/xbox/vxconsole/sync_files.cpp942
1 files changed, 942 insertions, 0 deletions
diff --git a/utils/xbox/vxconsole/sync_files.cpp b/utils/xbox/vxconsole/sync_files.cpp
new file mode 100644
index 0000000..facb395
--- /dev/null
+++ b/utils/xbox/vxconsole/sync_files.cpp
@@ -0,0 +1,942 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// SYNC_FILES.CPP
+//
+// Sync Files Routines.
+//=====================================================================================//
+#include "vxconsole.h"
+
+char g_syncfiles_localPath[MAX_PATH];
+char g_syncfiles_targetPath[MAX_PATH];
+fileNode_t *g_syncfiles_targetFiles;
+int g_syncfiles_numTargetFiles;
+CProgress *g_syncFiles_progress;
+BOOL g_syncFiles_noWrite;
+BOOL g_syncFiles_force;
+BOOL g_syncFiles_verbose;
+
+struct dvdimage_t
+{
+ char szString[MAX_PATH];
+ CUtlString installPath;
+ CUtlString versionDetailString;
+};
+CUtlVector< dvdimage_t> g_install_dvdImages;
+int g_install_Selection;
+bool g_install_bForceSync;
+bool g_install_bCleanTarget;
+
+//-----------------------------------------------------------------------------
+// SyncFilesDlg_Validate
+//
+//-----------------------------------------------------------------------------
+bool SyncFilesDlg_Validate()
+{
+ if ( !g_connectedToXBox )
+ {
+ Sys_MessageBox( "Sync Error", "Cannot sync until connected to XBox." );
+ return false;
+ }
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// SyncFilesDlg_Setup
+//
+//-----------------------------------------------------------------------------
+void SyncFilesDlg_Setup( HWND hWnd )
+{
+ SetDlgItemText( hWnd, IDC_SYNCFILES_LOCALPATH, g_syncfiles_localPath );
+ SetDlgItemText( hWnd, IDC_SYNCFILES_TARGETPATH, g_syncfiles_targetPath );
+
+ CheckDlgButton( hWnd, IDC_SYNCFILES_FORCESYNC, g_syncFiles_force ? BST_CHECKED : BST_UNCHECKED );
+ CheckDlgButton( hWnd, IDC_SYNCFILES_NOWRITE, g_syncFiles_noWrite ? BST_CHECKED : BST_UNCHECKED );
+ CheckDlgButton( hWnd, IDC_SYNCFILES_VERBOSE, g_syncFiles_verbose ? BST_CHECKED : BST_UNCHECKED );
+}
+
+//-----------------------------------------------------------------------------
+// SyncFilesDlg_GetChanges
+//
+//-----------------------------------------------------------------------------
+bool SyncFilesDlg_GetChanges( HWND hwnd )
+{
+ char localPath[MAX_PATH];
+ char targetPath[MAX_PATH];
+
+ localPath[0] = '\0';
+ targetPath[0] = '\0';
+
+ GetDlgItemText( hwnd, IDC_SYNCFILES_LOCALPATH, localPath, MAX_PATH );
+ GetDlgItemText( hwnd, IDC_SYNCFILES_TARGETPATH, targetPath, MAX_PATH );
+
+ strcpy( g_syncfiles_localPath, localPath );
+ Sys_NormalizePath( g_syncfiles_localPath, true );
+
+ strcpy( g_syncfiles_targetPath, targetPath );
+ Sys_NormalizePath( g_syncfiles_targetPath, true );
+
+ g_syncFiles_force = IsDlgButtonChecked( hwnd, IDC_SYNCFILES_FORCESYNC ) != 0;
+ g_syncFiles_noWrite = IsDlgButtonChecked( hwnd, IDC_SYNCFILES_NOWRITE ) != 0;
+ g_syncFiles_verbose = IsDlgButtonChecked( hwnd, IDC_SYNCFILES_VERBOSE ) != 0;
+
+ // success
+ return ( true );
+}
+
+//-----------------------------------------------------------------------------
+// SyncFilesDlg_Proc
+//
+//-----------------------------------------------------------------------------
+BOOL CALLBACK SyncFilesDlg_Proc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
+{
+ switch ( message )
+ {
+ case WM_INITDIALOG:
+ SyncFilesDlg_Setup( hwnd );
+ return ( TRUE );
+
+ case WM_COMMAND:
+ switch ( LOWORD( wParam ) )
+ {
+ case IDC_OK:
+ if ( !SyncFilesDlg_GetChanges( hwnd ) )
+ break;
+ EndDialog( hwnd, wParam );
+ return ( TRUE );
+
+ case IDCANCEL:
+ case IDC_CANCEL:
+ EndDialog( hwnd, wParam );
+ return ( TRUE );
+ }
+ break;
+ }
+ return ( FALSE );
+}
+
+//-----------------------------------------------------------------------------
+// SyncFiles_FreeTargetList
+//
+//-----------------------------------------------------------------------------
+void SyncFiles_FreeTargetList()
+{
+ g_syncfiles_numTargetFiles = 0;
+
+ FreeTargetFileList( g_syncfiles_targetFiles );
+ g_syncfiles_targetFiles = NULL;
+}
+
+//-----------------------------------------------------------------------------
+// SyncFiles_DoUpdates
+//
+//-----------------------------------------------------------------------------
+bool SyncFiles_DoUpdates()
+{
+ WIN32_FILE_ATTRIBUTE_DATA localAttributes;
+ fileNode_t *nodePtr;
+ char sourceFilename[MAX_PATH];
+ char statusBuff1[MAX_PATH];
+ char statusBuff2[MAX_PATH];
+ int targetPathLen;
+ char *ptr;
+ int progress;
+ int fileSyncMode;
+ int numSynced;
+ int retVal;
+
+ g_syncFiles_progress->SetStatus( "Syncing Target Files...", "", "" );
+ g_syncFiles_progress->SetMeter( 0, g_syncfiles_numTargetFiles );
+
+ fileSyncMode = FSYNC_ANDEXISTSONTARGET;
+ if ( g_syncFiles_force )
+ fileSyncMode |= FSYNC_ALWAYS;
+ else
+ fileSyncMode |= FSYNC_IFNEWER;
+
+ targetPathLen = strlen( g_syncfiles_targetPath );
+
+ numSynced = 0;
+ progress = 0;
+ nodePtr = g_syncfiles_targetFiles;
+ while ( nodePtr )
+ {
+ ptr = nodePtr->filename+targetPathLen;
+ if ( *ptr == '\\' )
+ ptr++;
+
+ // replace with source path head
+ strcpy( sourceFilename, g_syncfiles_localPath );
+ Sys_AddFileSeperator( sourceFilename, sizeof( sourceFilename ) );
+ strcat( sourceFilename, ptr );
+
+ float sourceFileSize = 0;
+ if ( GetFileAttributesEx( sourceFilename, GetFileExInfoStandard, &localAttributes ) )
+ {
+ sourceFileSize = (float)localAttributes.nFileSizeLow / (1024.0f * 1024.0f);
+ }
+
+ _snprintf( statusBuff1, sizeof( statusBuff1 ), "Local File: %s (%.2f MB)", sourceFilename, sourceFileSize );
+ statusBuff1[sizeof( statusBuff1 ) - 1] = '\0';
+ _snprintf( statusBuff2, sizeof( statusBuff2 ), "Target File: %s", nodePtr->filename );
+ statusBuff1[sizeof( statusBuff2 ) - 1] = '\0';
+ g_syncFiles_progress->SetStatus( NULL, statusBuff1, statusBuff2 );
+
+ retVal = FileSyncEx( sourceFilename, nodePtr->filename, fileSyncMode, g_syncFiles_verbose != FALSE, g_syncFiles_noWrite != FALSE);
+ if ( retVal == 1 )
+ {
+ ConsoleWindowPrintf( XBX_CLR_DEFAULT, "Sync: %s -> %s\n", sourceFilename, nodePtr->filename );
+ numSynced++;
+ }
+
+ progress++;
+ g_syncFiles_progress->SetMeter( progress, -1 );
+ if ( g_syncFiles_progress->IsCancel() )
+ {
+ return false;
+ }
+
+ nodePtr = nodePtr->nextPtr;
+ }
+
+ ConsoleWindowPrintf( XBX_CLR_DEFAULT, "Synced %d/%d Files.\n", numSynced, g_syncfiles_numTargetFiles );
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// SyncFiles_GetTargetList
+//
+//-----------------------------------------------------------------------------
+bool SyncFiles_GetTargetList( char* pTargetPath )
+{
+ g_syncFiles_progress->SetStatus( "Getting Target Files...", "", "" );
+ g_syncFiles_progress->SetMeter( 0, 100 );
+
+ if ( !GetTargetFileList_r( pTargetPath, true, FA_NORMAL|FA_READONLY, 0, &g_syncfiles_targetFiles ) )
+ {
+ ConsoleWindowPrintf( RGB( 255,0,0 ), "Bad Target Path '%s'\n", pTargetPath );
+ return false;
+ }
+
+ fileNode_t* pFileNode;
+ for ( pFileNode = g_syncfiles_targetFiles; pFileNode; pFileNode = pFileNode->nextPtr )
+ {
+ g_syncfiles_numTargetFiles++;
+ }
+
+ // success
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// SyncFilesDlg_SaveConfig
+//
+//-----------------------------------------------------------------------------
+void SyncFilesDlg_SaveConfig()
+{
+ Sys_SetRegistryString( "syncfiles_localPath", g_syncfiles_localPath );
+ Sys_SetRegistryString( "syncfiles_targetPath", g_syncfiles_targetPath );
+ Sys_SetRegistryInteger( "syncfiles_force", g_syncFiles_force );
+ Sys_SetRegistryInteger( "syncfiles_noWrite", g_syncFiles_noWrite );
+ Sys_SetRegistryInteger( "syncfiles_verbose", g_syncFiles_verbose );
+}
+
+//-----------------------------------------------------------------------------
+// SyncFilesDlg_Open
+//
+//-----------------------------------------------------------------------------
+void SyncFilesDlg_Open( void )
+{
+ int result;
+ bool bError;
+ bool bValid;
+
+ result = DialogBox( g_hInstance, MAKEINTRESOURCE( IDD_SYNCFILES ), g_hDlgMain, ( DLGPROC )SyncFilesDlg_Proc );
+ if ( LOWORD( result ) != IDC_OK )
+ return;
+
+ SyncFilesDlg_SaveConfig();
+
+ if ( !SyncFilesDlg_Validate() )
+ return;
+
+ g_syncFiles_progress = new CProgress;
+ g_syncFiles_progress->Open( "Sync Files...", true, true );
+
+ ConsoleWindowPrintf( XBX_CLR_DEFAULT, "\nSyncing Files From '%s' to '%s'\n", g_syncfiles_localPath, g_syncfiles_targetPath );
+
+ bError = true;
+
+ // get a file listing from target
+ bValid = SyncFiles_GetTargetList( g_syncfiles_targetPath );
+ if ( !bValid )
+ goto cleanUp;
+
+ // mark all files needing update
+ bValid = SyncFiles_DoUpdates();
+ if ( !bValid )
+ goto cleanUp;
+
+ bError = false;
+
+cleanUp:
+ delete g_syncFiles_progress;
+ g_syncFiles_progress = NULL;
+
+ if ( bError )
+ ConsoleWindowPrintf( XBX_CLR_RED, "Aborted.\n" );
+ else
+ ConsoleWindowPrintf( XBX_CLR_DEFAULT, "Finished.\n" );
+
+ SyncFiles_FreeTargetList();
+}
+
+//-----------------------------------------------------------------------------
+// SyncFilesDlg_LoadConfig
+//
+//-----------------------------------------------------------------------------
+void SyncFilesDlg_LoadConfig()
+{
+ // get our config
+ Sys_GetRegistryString( "syncfiles_localPath", g_syncfiles_localPath, g_localPath, sizeof( g_syncfiles_localPath ) );
+ Sys_GetRegistryString( "syncfiles_targetPath", g_syncfiles_targetPath, g_targetPath, sizeof( g_syncfiles_targetPath ) );
+ Sys_GetRegistryInteger( "syncfiles_force", false, g_syncFiles_force );
+ Sys_GetRegistryInteger( "syncfiles_noWrite", false, g_syncFiles_noWrite );
+ Sys_GetRegistryInteger( "syncfiles_verbose", false, g_syncFiles_verbose );
+}
+
+//-----------------------------------------------------------------------------
+// SyncFilesDlg_Init
+//
+//-----------------------------------------------------------------------------
+bool SyncFilesDlg_Init()
+{
+ SyncFilesDlg_LoadConfig();
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// InstallDlg_InstallImage
+//
+//-----------------------------------------------------------------------------
+void InstallDlg_InstallImage( const char *pInstallPath, bool bForce, bool bCleanTarget )
+{
+ int errCode;
+ char *pToken;
+ char arg1[MAXTOKEN];
+ char arg2[MAXTOKEN];
+ char sourceFilename[MAX_PATH];
+ char sourcePath[MAX_PATH];
+ char targetFilename[MAX_PATH];
+ char filename[MAX_PATH];
+ WIN32_FIND_DATA findData;
+ HANDLE h;
+
+ if ( !pInstallPath[0] )
+ {
+ return;
+ }
+
+ ConsoleWindowPrintf( XBX_CLR_DEFAULT, "\nSyncing From Install Depot: %s\n", pInstallPath );
+
+ // get the install script
+ char szScriptPath[MAX_PATH];
+ V_ComposeFileName( pInstallPath, "../dvd_install.txt", szScriptPath, sizeof( szScriptPath ) );
+ if ( !Sys_Exists( szScriptPath ) )
+ {
+ ConsoleWindowPrintf( XBX_CLR_RED, "Failed to open: %s\n", szScriptPath );
+ return;
+ }
+
+ // sanity check
+ // DVD image auto-build failure prevents the presence of the default.xex
+ char szTempFilename[MAX_PATH];
+ V_ComposeFileName( pInstallPath, "default.xex", szTempFilename, sizeof( szTempFilename ) );
+ if ( !Sys_Exists( szTempFilename ) )
+ {
+ ConsoleWindowPrintf( XBX_CLR_RED, "Cancelled Installation! DVD Image Auto-Build Process Failed - Missing default.xex!\n" );
+ return;
+ }
+
+ // get the version detail
+ char szVersionPath[MAX_PATH];
+ char *pVersionDetailString = NULL;
+ V_ComposeFileName( pInstallPath, "version.txt", szVersionPath, sizeof( szVersionPath ) );
+ if ( Sys_LoadFile( szVersionPath, (void**)&pVersionDetailString ) <= 0 )
+ {
+ ConsoleWindowPrintf( XBX_CLR_RED, "Cancelled Installation! DVD Image Auto-Build Process Failed! - Missing version.txt\n" );
+ return;
+ }
+
+ Sys_LoadScriptFile( szScriptPath );
+
+ CProgress* pProgress = new CProgress;
+ pProgress->Open( "Installing DVD Image...", true, false );
+
+ int numFailed = 0;
+ int numSkipped = 0;
+ int numUpdated = 0;
+ int version = 0;
+
+ bool bFailed = true;
+ bool bSyntaxError = false;
+ bool bCancelled = false;
+ while ( 1 )
+ {
+ pToken = Sys_GetToken( true );
+ if ( !pToken || !pToken[0] )
+ break;
+
+ if ( pProgress->IsCancel() )
+ {
+ bCancelled = true;
+ break;
+ }
+
+ if ( !stricmp( pToken, "$version" ) )
+ {
+ // version <num> <targetroot>
+ pToken = Sys_GetToken( false );
+ if ( !pToken || !pToken[0] )
+ {
+ bSyntaxError = true;
+ break;
+ }
+ version = atoi( pToken );
+ if ( version < 0 )
+ {
+ version = 0;
+ }
+
+ pToken = Sys_GetToken( false );
+ if ( !pToken || !pToken[0] )
+ {
+ bSyntaxError = true;
+ break;
+ }
+ Sys_StripQuotesFromToken( pToken );
+ V_FixSlashes( pToken );
+ if ( pToken[0] == CORRECT_PATH_SEPARATOR )
+ {
+ // remove initial slash
+ memcpy( pToken, pToken+1, strlen( pToken ) );
+ }
+
+ char szRootPath[MAX_PATH];
+ V_ComposeFileName( g_targetPath, pToken, szRootPath, sizeof( szRootPath ) );
+
+ if ( bCleanTarget )
+ {
+ // delete any exisiting files at target
+ DM_FILE_ATTRIBUTES fileAttributes;
+ HRESULT hr = DmGetFileAttributes( szRootPath, &fileAttributes );
+ if ( hr == XBDM_NOERR )
+ {
+ // delete all files at valid target
+ V_ComposeFileName( szRootPath, "*.*", szTempFilename, sizeof( szTempFilename ) );
+ char *pArgs[3];
+ pArgs[0] = "*del";
+ pArgs[1] = szTempFilename;
+ pArgs[2] = "/s";
+ if ( !lc_del( 3, pArgs ) )
+ {
+ ConsoleWindowPrintf( XBX_CLR_RED, "Failed To Delete Files At '%s'.\n", szRootPath );
+ break;
+ }
+ }
+ }
+
+ char szTargetVersionPath[MAX_PATH];
+ V_ComposeFileName( szRootPath, "version.txt", szTargetVersionPath, sizeof( szTargetVersionPath ) );
+
+ if ( !bForce )
+ {
+ int fileSize;
+ char *pTargetVersionDetailString;
+ if ( !LoadTargetFile( szTargetVersionPath, &fileSize, (void**)&pTargetVersionDetailString ) )
+ {
+ // expected version does not exist
+ // force full install
+ bForce = true;
+ }
+ else if ( strcmp( pVersionDetailString, pTargetVersionDetailString ) != 0 )
+ {
+ // different versions
+ bForce = true;
+ }
+ Sys_Free( pTargetVersionDetailString );
+ }
+
+ if ( bForce && !FileSyncEx( szVersionPath, szTargetVersionPath, FSYNC_ALWAYS, true, false ) )
+ {
+ numFailed++;
+ break;
+ }
+ }
+ else if ( !stricmp( pToken, "$print" ) )
+ {
+ // print <string>
+ pToken = Sys_GetToken( false );
+ if ( !pToken || !pToken[0] )
+ {
+ bSyntaxError = true;
+ break;
+ }
+ Sys_StripQuotesFromToken( pToken );
+ ConsoleWindowPrintf( XBX_CLR_DEFAULT, "%s\n", pToken );
+ }
+ else if ( !stricmp( pToken, "$copy" ) )
+ {
+ // copy <source> <target>
+ pToken = Sys_GetToken( false );
+ if ( !pToken || !pToken[0] )
+ {
+ bSyntaxError = true;
+ break;
+ }
+ Sys_StripQuotesFromToken( pToken );
+ V_FixSlashes( pToken );
+ if ( !V_strnicmp( pToken, "DVD\\", 4 ) )
+ {
+ // skip past DVD, used as a placeholder
+ pToken += 4;
+ }
+ V_ComposeFileName( pInstallPath, pToken, arg1, sizeof( arg1 ) );
+
+ pToken = Sys_GetToken( false );
+ if ( !pToken || !pToken[0] )
+ {
+ bSyntaxError = true;
+ break;
+ }
+ Sys_StripQuotesFromToken( pToken );
+ V_FixSlashes( pToken );
+ if ( pToken[0] == CORRECT_PATH_SEPARATOR )
+ {
+ // remove initial slash
+ memcpy( pToken, pToken+1, strlen( pToken ) );
+ }
+ V_ComposeFileName( g_targetPath, pToken, arg2, sizeof( arg2 ) );
+
+ Sys_StripFilename( arg1, sourcePath, sizeof( sourcePath ) );
+
+ h = FindFirstFile( arg1, &findData );
+ if ( h != INVALID_HANDLE_VALUE )
+ {
+ do
+ {
+ if ( pProgress->IsCancel() )
+ {
+ bCancelled = true;
+ break;
+ }
+
+ if ( !stricmp( findData.cFileName, "." ) || !stricmp( findData.cFileName, ".." ) )
+ {
+ continue;
+ }
+ if ( findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
+ {
+ continue;
+ }
+
+ strcpy( sourceFilename, sourcePath );
+ Sys_AddFileSeperator( sourceFilename, sizeof( sourceFilename ) );
+ strcat( sourceFilename, findData.cFileName );
+ Sys_NormalizePath( sourceFilename, false );
+
+ Sys_StripPath( arg2, filename, sizeof( filename ) );
+ if ( filename[0] )
+ {
+ // target filename is specified
+ strcpy( targetFilename, arg2 );
+ }
+ else
+ {
+ // target filename is path
+ strcpy( targetFilename, arg2 );
+ Sys_AddFileSeperator( targetFilename, sizeof( targetFilename ) );
+ strcat( targetFilename, findData.cFileName );
+ Sys_NormalizePath( targetFilename, false );
+ }
+
+ ConsoleWindowPrintf( XBX_CLR_DEFAULT, "\nCopying: %s -> %s\n", sourceFilename, targetFilename );
+
+ WIN32_FILE_ATTRIBUTE_DATA localAttributes;
+ float sourceFileSize = 0;
+ if ( GetFileAttributesEx( sourceFilename, GetFileExInfoStandard, &localAttributes ) )
+ {
+ sourceFileSize = (float)localAttributes.nFileSizeLow / (1024.0f * 1024.0f);
+ }
+
+ char statusBuff1[MAX_PATH];
+ V_snprintf( statusBuff1, sizeof( statusBuff1 ), "Copying (%.2f MB) ... Please Wait", sourceFileSize );
+ pProgress->SetStatus( statusBuff1, sourceFilename, targetFilename );
+
+ int fileSyncMode = bForce ? FSYNC_ALWAYS : FSYNC_IFNEWER;
+ errCode = FileSyncEx( sourceFilename, targetFilename, fileSyncMode, true, false );
+ if ( errCode < 0 )
+ {
+ ConsoleWindowPrintf( XBX_CLR_RED, "Sync Failure!\n" );
+ numFailed++;
+ }
+ else if ( errCode == 0 )
+ {
+ ConsoleWindowPrintf( XBX_CLR_BLUE, "Sync Skipped!\n" );
+ numSkipped++;
+ }
+ else if ( errCode == 1 )
+ {
+ ConsoleWindowPrintf( XBX_CLR_GREEN, "Sync Completed!\n" );
+ numUpdated++;
+ }
+ }
+ while ( FindNextFile( h, &findData ) );
+
+ FindClose( h );
+ }
+ }
+ else if ( !stricmp( pToken, "$end" ) )
+ {
+ bFailed = false;
+ break;
+ }
+ else
+ {
+ ConsoleWindowPrintf( XBX_CLR_RED, "Unknown token: '%s' in '%s'\n", pToken, szScriptPath );
+ bSyntaxError = true;
+ break;
+ }
+ }
+
+ if ( bSyntaxError )
+ {
+ ConsoleWindowPrintf( XBX_CLR_RED, "Syntax Error in '%s'.\n", szScriptPath );
+ }
+
+ if ( bCancelled )
+ {
+ ConsoleWindowPrintf( XBX_CLR_RED, "Cancelled Installation!\n" );
+ }
+ else if ( bFailed )
+ {
+ ConsoleWindowPrintf( XBX_CLR_RED, "Failed Installation!\n" );
+ }
+ else
+ {
+ char *pCRLF = V_stristr( pVersionDetailString, "\r\n" );
+ if ( pCRLF )
+ {
+ *pCRLF = '\0';
+ }
+
+ // spew stats
+ ConsoleWindowPrintf( XBX_CLR_BLACK, "\n" );
+ ConsoleWindowPrintf( XBX_CLR_BLACK, "Installation Completed.\n" );
+ ConsoleWindowPrintf( XBX_CLR_BLACK, "-----------------------\n" );
+ ConsoleWindowPrintf( XBX_CLR_BLACK, "Version: %s\n", pVersionDetailString ? pVersionDetailString : "???" );
+
+ if ( numFailed )
+ {
+ ConsoleWindowPrintf( XBX_CLR_RED, "%d Failures.\n", numFailed );
+ }
+ ConsoleWindowPrintf( XBX_CLR_BLACK, "%d Files In Sync.\n", numSkipped );
+ ConsoleWindowPrintf( XBX_CLR_BLACK, "%d Files Updated.\n", numUpdated );
+ }
+
+ delete pProgress;
+ Sys_Free( pVersionDetailString );
+ Sys_FreeScriptFile();
+}
+
+//-----------------------------------------------------------------------------
+// InstallDlg_GetChanges
+//
+//-----------------------------------------------------------------------------
+bool InstallDlg_GetChanges( HWND hWnd )
+{
+ g_install_bForceSync = IsDlgButtonChecked( hWnd, IDC_INSTALL_FORCESYNC ) != 0;
+ g_install_bCleanTarget = IsDlgButtonChecked( hWnd, IDC_INSTALL_CLEANTARGET ) != 0;
+
+ g_install_Selection = -1;
+ for ( int i = 0; i < g_install_dvdImages.Count(); i++ )
+ {
+ int state = ListView_GetItemState( GetDlgItem( hWnd, IDC_INSTALL_LIST ), i, LVIS_FOCUSED|LVIS_SELECTED );
+ if ( state == ( LVIS_FOCUSED|LVIS_SELECTED ) )
+ {
+ g_install_Selection = i;
+ break;
+ }
+ }
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// SortDVDImages
+//
+//-----------------------------------------------------------------------------
+int SortDVDImages( const dvdimage_t *pA, const dvdimage_t *pB )
+{
+ char szStringA[256];
+ char szStringB[256];
+
+ V_strncpy( szStringA, pA->szString, sizeof( szStringA ) );
+ V_strncpy( szStringB, pB->szString, sizeof( szStringB ) );
+
+ // sort staging first
+ char *pCommentA = V_stristr( szStringA, " (" );
+ char *pCommentB = V_stristr( szStringB, " (" );
+ if ( pCommentA )
+ {
+ *pCommentA = '\0';
+ }
+ if ( pCommentB )
+ {
+ *pCommentB = '\0';
+ }
+
+ return stricmp( szStringB, szStringA );
+}
+
+//-----------------------------------------------------------------------------
+// InstallDlg_Populate
+//
+//-----------------------------------------------------------------------------
+void InstallDlg_Populate( HWND hWnd )
+{
+ HWND hWndListView = GetDlgItem( hWnd, IDC_INSTALL_LIST );
+
+ ListView_DeleteAllItems( hWndListView );
+ g_install_dvdImages.Purge();
+
+ // get list of DVD images
+ char szPath[MAX_PATH];
+ V_ComposeFileName( g_installPath, "DVD_*", szPath, sizeof( szPath ) );
+ WIN32_FIND_DATA findData;
+ HANDLE h = FindFirstFile( szPath, &findData );
+ if ( h != INVALID_HANDLE_VALUE )
+ {
+ do
+ {
+ if ( !stricmp( findData.cFileName, "." ) || !stricmp( findData.cFileName, ".." ) )
+ {
+ continue;
+ }
+ if ( !( findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) )
+ {
+ // skip files
+ continue;
+ }
+
+ char szInstallPath[MAX_PATH];
+ V_strncpy( szInstallPath, g_installPath, sizeof( szInstallPath ) );
+ V_AppendSlash( szInstallPath, sizeof( szInstallPath ) );
+ V_strncat( szInstallPath, findData.cFileName, sizeof( szInstallPath ) );
+
+ // qualify dvd dirs that are images
+ char szBooterPath[MAX_PATH];
+ V_ComposeFileName( szInstallPath, "default.xex", szBooterPath, sizeof( szBooterPath ) );
+ if ( !Sys_Exists( szBooterPath ) )
+ {
+ continue;
+ }
+ char szVersionPath[MAX_PATH];
+ V_ComposeFileName( szInstallPath, "version.txt", szVersionPath, sizeof( szVersionPath ) );
+ char *pVersionDetailString = NULL;
+ if ( Sys_LoadFile( szVersionPath, (void**)&pVersionDetailString ) == -1 )
+ {
+ continue;
+ }
+
+ char *pCRLF = V_stristr( pVersionDetailString, "\r\n" );
+ if ( pCRLF )
+ {
+ *pCRLF = '\0';
+ }
+
+ dvdimage_t image;
+
+ int year = 0;
+ int month = 0;
+ int day = 0;
+ int hour = 0;
+ int minute = 0;
+ char timeOfDay[256];
+ sscanf( findData.cFileName, "DVD_%d_%d_%d_%d_%d_%s", &year, &month, &day, &hour, &minute, timeOfDay );
+
+ const char *pInfoString = timeOfDay;
+ if ( !V_strnicmp( timeOfDay, "PM", 2 ) )
+ {
+ if ( hour != 12 )
+ {
+ // 24 hour time for correct sorting
+ hour += 12;
+ }
+ pInfoString += 2;
+ }
+ else if ( !V_strnicmp( timeOfDay, "AM", 2 ) )
+ {
+ if ( hour == 12 )
+ {
+ // 24 hour time for correct sorting
+ hour = 0;
+ }
+ pInfoString += 2;
+ }
+
+ char szCommentBuff[128];
+ if ( pInfoString[0] == '_' )
+ {
+ // optional info after AM/PM
+ pInfoString++;
+ V_snprintf( szCommentBuff, sizeof( szCommentBuff ), " (%s)", pInfoString );
+ }
+ else
+ {
+ szCommentBuff[0] = '\0';
+ }
+
+ V_snprintf( image.szString, sizeof( image.szString ), "%2.2d/%2.2d/%4.4d %2.2d:%2.2d%s", month, day, year, hour, minute, szCommentBuff );
+
+ image.installPath = szInstallPath;
+ image.versionDetailString = pVersionDetailString;
+ g_install_dvdImages.AddToTail( image );
+ Sys_Free( pVersionDetailString );
+ }
+ while ( FindNextFile( h, &findData ) );
+ FindClose( h );
+ }
+
+ // current image will be at head
+ g_install_dvdImages.Sort( SortDVDImages );
+
+ for ( int i = 0; i < g_install_dvdImages.Count(); i++ )
+ {
+ // setup and insert at end of list
+ LVITEM lvi;
+ memset( &lvi, 0, sizeof( lvi ) );
+ lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
+ lvi.iItem = i;
+ lvi.iSubItem = 0;
+ lvi.state = 0;
+ lvi.stateMask = 0;
+ lvi.pszText = LPSTR_TEXTCALLBACK;
+ lvi.lParam = (LPARAM)i;
+
+ ListView_InsertItem( hWndListView, &lvi );
+ }
+
+ if ( g_install_dvdImages.Count() )
+ {
+ ListView_SetItemState( hWndListView, 0, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// InstallDlg_Setup
+//
+//-----------------------------------------------------------------------------
+void InstallDlg_Setup( HWND hWnd )
+{
+ g_install_Selection = -1;
+ g_install_bForceSync = false;
+ g_install_bCleanTarget = false;
+
+ HWND hWndListView = GetDlgItem( hWnd, IDC_INSTALL_LIST );
+
+ // initialize columns
+ LVCOLUMN lvc;
+ memset( &lvc, 0, sizeof( lvc ) );
+ lvc.mask = LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;
+ lvc.iSubItem = 0;
+ lvc.fmt = LVCFMT_LEFT;
+ lvc.cx = 200;
+ lvc.pszText = ( LPSTR )"Date Built:";
+ ListView_InsertColumn( hWndListView, 0, &lvc );
+ lvc.iSubItem = 0;
+ lvc.fmt = LVCFMT_LEFT;
+ lvc.cx = 500;
+ lvc.pszText = ( LPSTR )"Perforce Changelist:";
+ ListView_InsertColumn( hWndListView, 1, &lvc );
+
+ ListView_SetBkColor( hWndListView, g_backgroundColor );
+ ListView_SetTextBkColor( hWndListView, g_backgroundColor );
+
+ DWORD style = LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES;
+ ListView_SetExtendedListViewStyleEx( hWndListView, style, style );
+
+ InstallDlg_Populate( hWnd );
+}
+
+//-----------------------------------------------------------------------------
+// InstallDlg_Proc
+//
+//-----------------------------------------------------------------------------
+BOOL CALLBACK InstallDlg_Proc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
+{
+ switch ( message )
+ {
+ case WM_INITDIALOG:
+ InstallDlg_Setup( hWnd );
+ return ( TRUE );
+
+ case WM_NOTIFY:
+ switch ( ( ( LPNMHDR )lParam )->code )
+ {
+ case LVN_GETDISPINFO:
+ NMLVDISPINFO* plvdi;
+ plvdi = (NMLVDISPINFO*)lParam;
+ int item = (int)plvdi->item.lParam;
+ switch ( plvdi->item.iSubItem )
+ {
+ case 0:
+ plvdi->item.pszText = g_install_dvdImages[item].szString;
+ return TRUE;
+ case 1:
+ plvdi->item.pszText = (LPSTR)g_install_dvdImages[item].versionDetailString.String();
+ return TRUE;
+ }
+ }
+ break;
+
+ case WM_COMMAND:
+ switch ( LOWORD( wParam ) )
+ {
+ case IDC_OK:
+ InstallDlg_GetChanges( hWnd );
+ EndDialog( hWnd, wParam );
+ return ( TRUE );
+
+ case IDC_INSTALL_REFRESH:
+ InstallDlg_Populate( hWnd );
+ return TRUE;
+
+ case IDCANCEL:
+ case IDC_CANCEL:
+ EndDialog( hWnd, wParam );
+ return ( TRUE );
+ }
+ break;
+ }
+ return ( FALSE );
+}
+
+//-----------------------------------------------------------------------------
+// InstallDlg_Open
+//
+//-----------------------------------------------------------------------------
+void InstallDlg_Open( void )
+{
+ int result = DialogBox( g_hInstance, MAKEINTRESOURCE( IDD_INSTALL ), g_hDlgMain, ( DLGPROC )InstallDlg_Proc );
+ if ( LOWORD( result ) == IDC_OK && g_install_Selection != -1 )
+ {
+ InstallDlg_InstallImage(
+ g_install_dvdImages[g_install_Selection].installPath.String(),
+ g_install_bForceSync,
+ g_install_bCleanTarget );
+ }
+
+ g_install_dvdImages.Purge();
+}