|
|
//
// Copyright 1997 - Microsoft
//
// IMOS.CPP - Handles the "IntelliMirror OS" IDD_PROP_INTELLIMIRROR_OS tab
//
#include "pch.h"
#include "addwiz.h"
#include "cservice.h"
#include "utils.h"
#include <lm.h>
#include <shlobj.h>
#include <commdlg.h>
DEFINE_MODULE("IMADMUI") DEFINE_THISCLASS("CAddWiz") #define THISCLASS CAddWiz
#define LPTHISCLASS LPCADDWIZ
#define BITMAP_WIDTH 16
#define BITMAP_HEIGHT 16
#define LG_BITMAP_WIDTH 32
#define LG_BITMAP_HEIGHT 32
#define NUM_COLUMNS 5
#define SERVER_START_STRING L"\\\\%s\\" REMINST_SHARE
//
// CreateInstance()
//
HRESULT CAddWiz_CreateInstance( HWND hwndParent, LPUNKNOWN punk ) { TraceFunc( "CAddWiz_CreateInstance()\n" );
LPTHISCLASS lpcc = new THISCLASS( ); HRESULT hr;
if (lpcc == NULL) {
hr = S_FALSE;
} else {
hr = THR( lpcc->Init( hwndParent, punk ) ); delete lpcc;
}
HRETURN(hr); }
//
// Constructor
//
THISCLASS::THISCLASS( ) { TraceClsFunc( "CAddWiz()\n" );
Assert( !_pszServerName ); Assert( !_pszSourcePath ); Assert( !_pszDestPath ); Assert( !_pszSourceImage ); Assert( !_pszDestImage ); Assert( !_pszSourceServerName );
InterlockIncrement( g_cObjects );
TraceFuncExit(); }
//
// Init()
//
STDMETHODIMP THISCLASS::Init( HWND hwndParent, LPUNKNOWN punk ) { TraceClsFunc( "Init()\n" );
if (!LoadString( g_hInstance, IDS_NA, _szNA, ARRAYSIZE(_szNA))) { HRETURN(HRESULT_FROM_WIN32(GetLastError())); }
if (!LoadString( g_hInstance, IDS_USER_LOCATION, _szLocation, ARRAYSIZE(_szLocation))) { HRETURN(HRESULT_FROM_WIN32(GetLastError())); }
if ( !punk ) HRETURN(E_POINTER);
HRESULT hr = S_OK;
HPROPSHEETPAGE rPages[ 10 ]; PROPSHEETHEADER pshead;
_punk = punk; _punk->AddRef( );
ZeroMemory( &pshead, sizeof(pshead) ); pshead.dwSize = sizeof(pshead); pshead.dwFlags = PSH_WIZARD97 | PSH_PROPTITLE | PSH_HEADER; pshead.hInstance = g_hInstance; pshead.pszCaption = MAKEINTRESOURCE( IDS_ADD_DOT_DOT_DOT ); pshead.phpage = rPages; pshead.pszbmHeader = MAKEINTRESOURCE( IDB_HEADER ); pshead.hwndParent = hwndParent;
AddWizardPage( &pshead, IDD_ADD_PAGE1, Page1DlgProc, IDS_PAGE1_TITLE, IDS_PAGE1_SUBTITLE, (LPARAM) this ); AddWizardPage( &pshead, IDD_ADD_PAGE2, Page2DlgProc, IDS_PAGE2_TITLE, IDS_PAGE2_SUBTITLE, (LPARAM) this ); AddWizardPage( &pshead, IDD_ADD_PAGE6, Page6DlgProc, IDS_PAGE6_TITLE, IDS_PAGE6_SUBTITLE, (LPARAM) this ); AddWizardPage( &pshead, IDD_ADD_PAGE3, Page3DlgProc, IDS_PAGE3_TITLE, IDS_PAGE3_SUBTITLE, (LPARAM) this ); AddWizardPage( &pshead, IDD_ADD_PAGE4, Page4DlgProc, IDS_PAGE4_TITLE, IDS_PAGE4_SUBTITLE, (LPARAM) this ); AddWizardPage( &pshead, IDD_ADD_PAGE5, Page5DlgProc, IDS_PAGE5_TITLE, IDS_PAGE5_SUBTITLE, (LPARAM) this ); AddWizardPage( &pshead, IDD_ADD_PAGE7, Page7DlgProc, IDS_PAGE7_TITLE, IDS_PAGE7_SUBTITLE, (LPARAM) this ); AddWizardPage( &pshead, IDD_ADD_PAGE8, Page8DlgProc, IDS_PAGE8_TITLE, IDS_PAGE8_SUBTITLE, (LPARAM) this ); AddWizardPage( &pshead, IDD_ADD_PAGE9, Page9DlgProc, IDS_PAGE9_TITLE, IDS_PAGE9_SUBTITLE, (LPARAM) this ); AddWizardPage( &pshead, IDD_ADD_PAGE10, Page10DlgProc, IDS_PAGE10_TITLE, IDS_PAGE10_SUBTITLE, (LPARAM) this );
PropertySheet( &pshead );
HRETURN(hr); }
//
// Destructor
//
THISCLASS::~THISCLASS( ) { TraceClsFunc( "~CAddWiz()\n" );
Assert( !_pszPathBuffer ); if ( !_pszPathBuffer ) { TraceFree( _pszPathBuffer ); _pszPathBuffer = NULL; }
if ( _punk ) _punk->Release( );
if ( _pszServerName ) TraceFree( _pszServerName );
if ( _pszSourcePath ) TraceFree( _pszSourcePath );
if ( _pszSourceServerName ) TraceFree( _pszSourceServerName );
if ( _pszDestPath ) TraceFree( _pszDestPath );
if ( _pszSourceImage && _pszSourceImage != _szNA && _pszSourceImage != _szLocation ) TraceFree( _pszSourceImage );
if ( _pszDestImage && _pszDestImage != _szNA && _pszDestImage != _szLocation ) TraceFree( _pszDestImage );
InterlockDecrement( g_cObjects );
TraceFuncExit(); };
// ************************************************************************
//
// Wizard Functions
//
// ************************************************************************
//
// _PopulateSamplesListView( )
//
STDMETHODIMP THISCLASS::_PopulateSamplesListView( LPWSTR pszStartPath ) { TraceClsFunc( "_PopulateSamplesListView( " ); TraceMsg( TF_FUNC, "pszStartPath = '%s' )\n", pszStartPath );
if ( !pszStartPath ) HRETURN(E_POINTER);
Assert( _hDlg ); Assert( _hwndList );
CWaitCursor Wait; HRESULT hr; HANDLE hFind = INVALID_HANDLE_VALUE; WIN32_FIND_DATA find;
ListView_DeleteAllItems( _hwndList );
Assert( !_pszPathBuffer ); _dwPathBufferSize = wcslen( pszStartPath ) + MAX_PATH; _pszPathBuffer = (LPWSTR) TraceAllocString( LMEM_FIXED, _dwPathBufferSize ); if ( !_pszPathBuffer ) { hr = E_OUTOFMEMORY; _dwPathBufferSize = 0; goto Error; }
wcscpy( _pszPathBuffer, pszStartPath );
hr = _EnumerateSIFs( );
Error: if ( _pszPathBuffer ) { TraceFree( _pszPathBuffer ); _pszPathBuffer = NULL; _dwPathBufferSize = 0; }
HRETURN(hr); }
//
// _PopulateTemplatesListView( )
//
STDMETHODIMP THISCLASS::_PopulateTemplatesListView( LPWSTR pszStartPath ) { TraceClsFunc( "_PopulateTemplatesListView( " ); TraceMsg( TF_FUNC, "pszStartPath = '%s' )\n", pszStartPath );
if ( !pszStartPath ) HRETURN(E_POINTER);
Assert( _hDlg ); Assert( _hwndList );
CWaitCursor Wait; HRESULT hr; HANDLE hFind = INVALID_HANDLE_VALUE; WIN32_FIND_DATA find;
ListView_DeleteAllItems( _hwndList );
Assert( !_pszPathBuffer ); _dwPathBufferSize = wcslen( pszStartPath ) + MAX_PATH ; _pszPathBuffer = (LPWSTR) TraceAllocString( LMEM_FIXED, _dwPathBufferSize ); if ( !_pszPathBuffer ) { hr = E_OUTOFMEMORY; _dwPathBufferSize = 0; goto Error; }
if (_snwprintf(_pszPathBuffer, _dwPathBufferSize, L"%s%s", pszStartPath, SLASH_SETUP) < 0) { hr = E_OUTOFMEMORY; goto Error; }
_pszPathBuffer[_dwPathBufferSize-1] = L'\0';
hr = _FindLanguageDirectory( _EnumerateTemplates );
Error: if ( _pszPathBuffer ) { TraceFree( _pszPathBuffer ); _pszPathBuffer = NULL; _dwPathBufferSize = 0; }
HRETURN(hr); }
//
// _PopulateImageListView( )
//
STDMETHODIMP THISCLASS::_PopulateImageListView( LPWSTR pszStartPath ) { TraceClsFunc( "_PopulateImageListView( " ); TraceMsg( TF_FUNC, "pszStartPath = '%s' )\n", pszStartPath );
if ( !pszStartPath ) HRETURN(E_POINTER);
Assert( _hDlg ); Assert( _hwndList );
CWaitCursor Wait; HRESULT hr; HANDLE hFind = INVALID_HANDLE_VALUE; WIN32_FIND_DATA find;
ListView_DeleteAllItems( _hwndList );
Assert( !_pszPathBuffer ); _dwPathBufferSize = wcslen( pszStartPath ) + MAX_PATH ; _pszPathBuffer = (LPWSTR) TraceAllocString( LMEM_FIXED, _dwPathBufferSize ); if ( !_pszPathBuffer ) { hr = E_OUTOFMEMORY; _dwPathBufferSize = 0; goto Error; }
if (_snwprintf(_pszPathBuffer, _dwPathBufferSize, L"%s%s", pszStartPath, SLASH_SETUP) < 0) { hr = E_OUTOFMEMORY; goto Error; }
hr = _FindLanguageDirectory( _EnumerateImages );
Error: if ( _pszPathBuffer ) { TraceFree( _pszPathBuffer ); _pszPathBuffer = NULL; _dwPathBufferSize = 0; }
HRETURN(hr); }
//
// _FindLanguageDirectory( )
//
STDMETHODIMP THISCLASS::_FindLanguageDirectory( LPNEXTOP lpNextOperation ) { TraceClsFunc( "_FindLanguageDirectory( ... )\n" );
HRESULT hr = S_OK; HANDLE hFind = INVALID_HANDLE_VALUE; ULONG uLength; ULONG uLength2; WIN32_FIND_DATA find;
Assert( _pszPathBuffer ); Assert( lpNextOperation );
uLength = wcslen( _pszPathBuffer ); if (uLength + sizeof(L"\\*") > _dwPathBufferSize) { hr = E_INVALIDARG; goto Error; }
wcscat( _pszPathBuffer, L"\\*" ); uLength2 = wcslen( _pszPathBuffer ) - 1;
hFind = FindFirstFile( _pszPathBuffer, &find ); if ( hFind != INVALID_HANDLE_VALUE ) { do { if ( find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && StrCmp( find.cFileName, L"." ) != 0 && StrCmp( find.cFileName, L".." ) != 0 ) { _pszPathBuffer[uLength2] = L'\0'; if ( (wcslen(_pszPathBuffer) + wcslen( find.cFileName ) + 1) > _dwPathBufferSize) { hr = E_INVALIDARG; goto Error; } wcscat( _pszPathBuffer, find.cFileName ); hr = _FindOSDirectory( lpNextOperation ); if (FAILED(hr)) { goto Error; } } } while ( FindNextFile( hFind, &find ) ); } else { hr = HRESULT_FROM_WIN32(GetLastError()); }
Error: if ( hFind != INVALID_HANDLE_VALUE ) { FindClose( hFind ); }
// restore the trailing NULL
_pszPathBuffer[uLength] = L'\0';
HRETURN(hr); }
//
// _FindOSDirectory( )
//
STDMETHODIMP THISCLASS::_FindOSDirectory( LPNEXTOP lpNextOperation ) { TraceClsFunc( "_FindOSDirectory( ... )\n" );
HRESULT hr = S_OK; HANDLE hFind = INVALID_HANDLE_VALUE; ULONG uLength; ULONG uLength2; WIN32_FIND_DATA find;
Assert( _pszPathBuffer ); Assert( lpNextOperation );
uLength = wcslen( _pszPathBuffer ); if (uLength + sizeof(SLASH_IMAGES L"\\*") > _dwPathBufferSize) { hr = E_INVALIDARG; goto Error; } wcscat( _pszPathBuffer, SLASH_IMAGES L"\\*"); uLength2 = wcslen( _pszPathBuffer ) -1;
hFind = FindFirstFile( _pszPathBuffer, &find ); if ( hFind != INVALID_HANDLE_VALUE ) { do { if ( find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && StrCmp( find.cFileName, L"." ) != 0 && StrCmp( find.cFileName, L".." ) != 0 ) { _pszPathBuffer[uLength2] = L'\0'; if ( (wcslen(_pszPathBuffer) + wcslen( find.cFileName ) + 1) > _dwPathBufferSize) { hr = E_INVALIDARG; goto Error; } wcscat( _pszPathBuffer, find.cFileName ); hr = _EnumeratePlatforms( lpNextOperation ); if (FAILED(hr)) { goto Error; } } } while ( FindNextFile( hFind, &find ) ); } else { hr = HRESULT_FROM_WIN32(GetLastError()); }
Error: if ( hFind != INVALID_HANDLE_VALUE ) FindClose( hFind );
_pszPathBuffer[uLength] = L'\0';
HRETURN(hr); }
//
// _EnumeratePlatforms( )
//
STDMETHODIMP THISCLASS::_EnumeratePlatforms( LPNEXTOP lpNextOperation ) { TraceClsFunc( "_EnumeratePlatforms( ... )\n" );
HRESULT hr = S_OK; HANDLE hFind = INVALID_HANDLE_VALUE; ULONG uLength; ULONG uLength2; WIN32_FIND_DATA find;
Assert( lpNextOperation ); Assert( _pszPathBuffer );
uLength = wcslen( _pszPathBuffer ); if (uLength + sizeof(L"\\*") > _dwPathBufferSize) { hr = E_INVALIDARG; goto Error; } wcscat( _pszPathBuffer, L"\\*" ); uLength2 = wcslen( _pszPathBuffer ) - 1;
hFind = FindFirstFile( _pszPathBuffer, &find ); if ( hFind != INVALID_HANDLE_VALUE ) { do { if ( find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && StrCmp( find.cFileName, L"." ) != 0 && StrCmp( find.cFileName, L".." ) != 0 ) { _pszPathBuffer[uLength2] = L'\0'; if ( (wcslen(_pszPathBuffer) + wcslen( find.cFileName ) + 1) > _dwPathBufferSize) { hr = E_INVALIDARG; goto Error; } wcscat( _pszPathBuffer, find.cFileName ); hr = lpNextOperation( this ); //
// we can get ERROR_PATH_NOT_FOUND in several cases
// like oem preinstall, etc. just eat the error and
// continue
//
if (hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)) { hr = S_OK; } if (FAILED(hr)) { goto Error; } } } while ( FindNextFile( hFind, &find ) ); } else { hr = HRESULT_FROM_WIN32(GetLastError()); }
Error: if ( hFind != INVALID_HANDLE_VALUE ) { FindClose( hFind ); }
// restore the path.
_pszPathBuffer[uLength] = L'\0';
HRETURN(hr); }
//
// _EnumerateTemplates( )
//
HRESULT THISCLASS::_EnumerateTemplates( LPTHISCLASS lpc ) { TraceClsFunc( "_EnumerateTemplates( )\n" );
HRESULT hr; ULONG uLength;
Assert( lpc ); Assert( lpc->_pszPathBuffer ); uLength = wcslen( lpc->_pszPathBuffer ); if (uLength + sizeof(SLASH_TEMPLATES) > lpc->_dwPathBufferSize) { hr = E_INVALIDARG; goto Error; } wcscat( lpc->_pszPathBuffer, SLASH_TEMPLATES );
hr = lpc->_EnumerateSIFs( );
Error: lpc->_pszPathBuffer[uLength] = L'\0';
HRETURN(hr); }
//
// _EnumerateImages( )
//
HRESULT THISCLASS::_EnumerateImages( LPTHISCLASS lpc ) { TraceClsFunc( "_EnumerateImages( )\n" );
HRESULT hr;
Assert( lpc );
hr = lpc->_CheckImageType( ); if ( hr == S_OK ) { hr = lpc->_AddItemToListView( ); }
HRETURN(hr); }
//
// _CheckImageType( )
//
// This won't add an item to the listview. It only checks to make
// sure the image path points to a "Flat" image.
//
// Returns: S_OK - Flat image found
// S_FALSE - not a flat image
//
HRESULT THISCLASS::_CheckImageType( ) { TraceClsFunc( "_CheckImageType( )\n" );
HRESULT hr = S_FALSE; HANDLE hFind = INVALID_HANDLE_VALUE; WIN32_FIND_DATA find; ULONG uLength; ULONG uLength2;
Assert( _pszPathBuffer ); uLength = wcslen( _pszPathBuffer ); if (uLength + sizeof(L"\\ntoskrnl.exe") > _dwPathBufferSize) { hr = E_INVALIDARG; goto Error; }
//
// Check for <architecture>\ntoskrnl.exe to see
// if this is a "flag" image. If we find this file
// then we're done.
//
wcscat( _pszPathBuffer, L"\\ntoskrnl.exe" );
hFind = FindFirstFile( _pszPathBuffer, &find ); if ( hFind != INVALID_HANDLE_VALUE ) { do { if ( !(find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) { Assert( _wcsicmp( find.cFileName, L"ntoskrnl.exe" ) == 0 ); hr = S_OK; goto Error; } } while ( FindNextFile( hFind, &find ) );
FindClose( hFind ); hFind = INVALID_HANDLE_VALUE; }
//
// Didn't find the kernel. Now check every sif
// file in the TEMPLATES subdirectory and see if
// he's got an OSCHOOSER_IMAGETYPE_ENTRY. If he
// does, see if it's a "flat" image.
//
_pszPathBuffer[uLength] = L'\0'; if (uLength + sizeof(SLASH_TEMPLATES L"\\*.sif") > _dwPathBufferSize) { hr = E_INVALIDARG; goto Error; }
wcscat( _pszPathBuffer, SLASH_TEMPLATES L"\\*.sif"); uLength2 = wcslen( _pszPathBuffer ) - 5;
hFind = FindFirstFile( _pszPathBuffer, &find ); if ( hFind != INVALID_HANDLE_VALUE ) { do { if ( !(find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) { WCHAR szImageType[ 40 ]; _pszPathBuffer[uLength2] = L'\0'; if ( (wcslen(_pszPathBuffer) + wcslen( find.cFileName ) + 1) > _dwPathBufferSize) { hr = E_INVALIDARG; goto Error; } wcscat( _pszPathBuffer, find.cFileName );
GetPrivateProfileString( OSCHOOSER_SIF_SECTION, OSCHOOSER_IMAGETYPE_ENTRY, L"", szImageType, ARRAYSIZE(szImageType), _pszPathBuffer );
if ( _wcsicmp( szImageType, OSCHOOSER_IMAGETYPE_FLAT ) == 0 ) { hr = S_OK; goto Error; } } } while ( FindNextFile( hFind, &find ) );
FindClose( hFind ); hFind = INVALID_HANDLE_VALUE; }
Error: if ( hFind != INVALID_HANDLE_VALUE ) { FindClose( hFind ); }
_pszPathBuffer[uLength] = L'\0';
HRETURN(hr); }
//
// _EnumerateSIFs( )
//
STDMETHODIMP THISCLASS::_EnumerateSIFs( ) { TraceClsFunc( "_EnumerateSIFs( ... )\n" );
HRESULT hr = S_OK; HANDLE hFind = INVALID_HANDLE_VALUE; ULONG uLength; WIN32_FIND_DATA find;
Assert( _pszPathBuffer ); if (wcslen(_pszPathBuffer) + ARRAYSIZE(L"\\*.sif") >_dwPathBufferSize) { return(E_INVALIDARG); }
wcscat( _pszPathBuffer, L"\\*.sif" ); uLength = wcslen( _pszPathBuffer ) - ARRAYSIZE(L"*.sif") + 1; Assert( uLength <= _dwPathBufferSize );
hFind = FindFirstFile( _pszPathBuffer, &find ); if ( hFind != INVALID_HANDLE_VALUE ) { do { if ( !(find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) ) { _pszPathBuffer[uLength] = L'\0'; if (wcslen(_pszPathBuffer) + wcslen(find.cFileName) + 1 > _dwPathBufferSize) { hr = E_INVALIDARG; goto Error; }
wcscat( _pszPathBuffer, find.cFileName );
hr = _AddItemToListView( ); if (FAILED(hr)) goto Error; } } while ( FindNextFile( hFind, &find ) ); } else { hr = HRESULT_FROM_WIN32(GetLastError()); }
Error: if ( hFind != INVALID_HANDLE_VALUE ) { FindClose( hFind ); }
_pszPathBuffer[uLength] = L'\0';
HRETURN(hr); }
//
// _AddItemToListView( )
//
// Returns: S_OK - Item add successfully
// S_FALSE - Item is not valid
// E_OUTOFMEMORY - obvious
//
// Note: this code is nearly identical to PopulateListView() in utils.cpp
//
//
HRESULT THISCLASS::_AddItemToListView( ) { TraceClsFunc( "_AddItemToListView( )\n" );
Assert( _pszPathBuffer );
HRESULT hr = S_OK; LPSIFINFO pSIF = NULL; LV_ITEM lvI; INT iCount = 0; LPWSTR psz; LPWSTR pszLanguage; LPWSTR pszImage; LPWSTR pszArchitecture;
pSIF = (LPSIFINFO) TraceAlloc( LPTR, sizeof(SIFINFO) ); if ( !pSIF ) { hr = E_OUTOFMEMORY; goto Error; }
ZeroMemory( pSIF, sizeof(SIFINFO));
pSIF->pszFilePath = (LPWSTR) TraceStrDup( _pszPathBuffer ); if ( !pSIF->pszFilePath ) { hr = E_OUTOFMEMORY; goto Error; }
psz = &_pszPathBuffer[ wcslen( _pszPathBuffer ) - 4 ]; if ( _wcsicmp( psz, L".SIF" ) == 0 ) { WCHAR szImageType[ 40 ];
GetPrivateProfileString( OSCHOOSER_SIF_SECTION, OSCHOOSER_IMAGETYPE_ENTRY, L"", szImageType, ARRAYSIZE(szImageType), _pszPathBuffer ); // only show "Flat" SIFs
if ( szImageType[0] && _wcsicmp( szImageType, OSCHOOSER_IMAGETYPE_FLAT ) ) { hr = S_FALSE; // skipping
goto Error; }
pSIF->pszDescription = (LPWSTR) TraceAllocString( LMEM_FIXED, REMOTE_INSTALL_MAX_DESCRIPTION_CHAR_COUNT ); if ( !pSIF->pszDescription ) { hr = E_OUTOFMEMORY; goto Error; }
GetPrivateProfileString( OSCHOOSER_SIF_SECTION, OSCHOOSER_DESCRIPTION_ENTRY, L"", pSIF->pszDescription, REMOTE_INSTALL_MAX_DESCRIPTION_CHAR_COUNT, // doesn't need -1
_pszPathBuffer );
if ( pSIF->pszDescription[0] == L'\0' ) { hr = S_FALSE; goto Error; // not a valid OSChooser SIF
}
pSIF->pszHelpText = (LPWSTR) TraceAllocString( LMEM_FIXED, REMOTE_INSTALL_MAX_HELPTEXT_CHAR_COUNT );
if ( !pSIF->pszHelpText ) { hr = E_OUTOFMEMORY; goto Error; } GetPrivateProfileString( OSCHOOSER_SIF_SECTION, OSCHOOSER_HELPTEXT_ENTRY, L"", pSIF->pszHelpText, REMOTE_INSTALL_MAX_HELPTEXT_CHAR_COUNT, // doesn't need -1
_pszPathBuffer ); }
// This path will be in one of these forms:
// \\server\reminst\setup\english\images\nt50.wks\i386 ( Samples )
// \\server\reminst\setup\english\images\nt50.wks\i386\templates ( template SIFs )
// \\server\reminst\setup\english\images ( Images )
// Find the language from the path
psz = StrStr( _pszPathBuffer, SLASH_SETUP L"\\" ); if (!psz) { goto Language_NA; } psz++; if ( !*psz ) { goto Language_NA; } psz = StrChr( psz, L'\\' ); if (!psz) { goto Language_NA; } psz++; if ( !*psz ) { goto Language_NA; } pszLanguage = psz; psz = StrChr( psz, L'\\' ); if ( psz ) { *psz = L'\0'; // terminate
} pSIF->pszLanguage = (LPWSTR) TraceStrDup( pszLanguage ); if ( psz ) { *psz = L'\\'; // restore
} if ( !pSIF->pszLanguage ) { hr = E_OUTOFMEMORY; goto Language_NA; }
// Find the image directory name from the path
psz = StrStr( _pszPathBuffer, SLASH_IMAGES L"\\" ); if ( !psz ) { goto Image_NA; } psz++; if ( !*psz ) { goto Image_NA; } psz = StrChr( psz, L'\\' ); if (!psz) { goto Image_NA; } psz++; if ( !*psz ) { goto Image_NA; } pszImage = psz; psz = StrChr( psz, L'\\' ); if ( psz ) { *psz = L'\0'; // terminate
} pSIF->pszImageFile = (LPWSTR) TraceStrDup( pszImage ); if ( psz ) { *psz = L'\\'; // restore
} if ( !pSIF->pszImageFile ) { hr = E_OUTOFMEMORY; goto Image_NA; }
// Find the architecture from the path
if ( !*psz ) { goto Architecture_NA; } psz++; if ( !*psz ) { goto Architecture_NA; } pszArchitecture = psz; psz = StrChr( psz, L'\\' ); if ( psz ) { *psz = L'\0'; // terminate
} pSIF->pszArchitecture = (LPWSTR) TraceStrDup( pszArchitecture ); if ( psz ) { *psz = L'\\'; // restore
} if ( !pSIF->pszArchitecture ) { hr = E_OUTOFMEMORY; goto Architecture_NA; }
goto Done;
// Set columns that we couldn't determine to "n/a"
Language_NA: pSIF->pszLanguage = _szNA; Image_NA: pSIF->pszImageFile = _szNA; Architecture_NA: pSIF->pszArchitecture = _szNA;
Done: if ( !pSIF->pszDescription ) { pSIF->pszDescription = (LPWSTR) TraceStrDup( pSIF->pszImageFile ); if ( !pSIF->pszDescription ) { hr = E_OUTOFMEMORY; goto Error; } }
lvI.mask = LVIF_TEXT | LVIF_PARAM; lvI.iSubItem = 0; lvI.cchTextMax = REMOTE_INSTALL_MAX_DESCRIPTION_CHAR_COUNT; lvI.lParam = (LPARAM) pSIF; lvI.iItem = iCount; lvI.pszText = pSIF->pszDescription; iCount = ListView_InsertItem( _hwndList, &lvI ); Assert( iCount != -1 ); if ( iCount == -1 ) { goto Error; }
ListView_SetItemText( _hwndList, iCount, 1, pSIF->pszArchitecture ); ListView_SetItemText( _hwndList, iCount, 2, pSIF->pszLanguage ); // ListView_SetItemText( hwndList, iCount, 3, pSIF->pszVersion );
ListView_SetItemText( _hwndList, iCount, 3, pSIF->pszImageFile );
pSIF = NULL; // don't free
Error: if ( pSIF ) THR( _CleanupSIFInfo( pSIF ) );
HRETURN(hr); }
//
// _CleanUpSifInfo( )
//
HRESULT THISCLASS::_CleanupSIFInfo( LPSIFINFO pSIF ) { TraceClsFunc( "_CleanupSIFInfo( )\n" );
if ( !pSIF ) HRETURN(E_POINTER);
if ( pSIF->pszFilePath ) TraceFree( pSIF->pszFilePath );
if ( pSIF->pszDescription ) TraceFree( pSIF->pszDescription );
if (pSIF->pszHelpText) { TraceFree( pSIF->pszHelpText ); }
//if ( pSIF->pszImageType && pSIF->pszImageType != _szNA )
// TraceFree( pSIF->pszImageType );
if ( pSIF->pszArchitecture && pSIF->pszArchitecture != _szNA ) TraceFree( pSIF->pszArchitecture );
if ( pSIF->pszLanguage && pSIF->pszLanguage != _szNA ) TraceFree( pSIF->pszLanguage );
if ( pSIF->pszImageFile && pSIF->pszImageFile != _szNA ) TraceFree( pSIF->pszImageFile );
//if ( pSIF->pszVersion && pSIF->pszVersion != _szNA )
// TraceFree( pSIF->pszVersion );
TraceFree( pSIF );
HRETURN(S_OK);
}
//
// _InitListView( )
//
HRESULT THISCLASS::_InitListView( HWND hwndList, BOOL fShowDirectoryColumn ) { TraceClsFunc( "_InitListView( )\n" );
CWaitCursor Wait; LV_COLUMN lvC; INT iSubItem; INT iCount; LV_ITEM lvI; WCHAR szText[ 80 ]; DWORD dw;
UINT uColumnWidth[ NUM_COLUMNS ] = { 215, 75, 75, 75, 75};
lvI.mask = LVIF_TEXT | LVIF_PARAM; lvI.iSubItem = 0; lvI.cchTextMax = DNS_MAX_NAME_BUFFER_LENGTH;
// Create the columns
lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvC.fmt = LVCFMT_LEFT; lvC.pszText = szText;
// Add the columns.
for ( iCount = 0; iCount < NUM_COLUMNS; iCount++ ) { INT i;
if ( iCount == 3 ) continue; // skip "Version"
if ( !fShowDirectoryColumn && iCount == 4 ) continue; // skip "Directory"
lvC.iSubItem = iCount; lvC.cx = uColumnWidth[iCount];
szText[0] = L'\0'; dw = LoadString( g_hInstance, IDS_OS_COLUMN1 + iCount, szText, ARRAYSIZE(szText)); Assert( dw );
i = ListView_InsertColumn ( hwndList, iCount, &lvC ); Assert( i != -1 ); }
ListView_DeleteAllItems( hwndList );
HRETURN(S_OK); }
//
// Page1DlgProc( )
//
INT_PTR CALLBACK THISCLASS::Page1DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LPTHISCLASS lpc = (LPTHISCLASS) GetWindowLongPtr( hDlg, GWLP_USERDATA );
switch ( uMsg ) { case WM_INITDIALOG: TraceMsg( TF_WM, "WM_INITDIALOG\n" ); { HRESULT hr; DWORD cbSize = DNS_MAX_NAME_BUFFER_LENGTH; WCHAR szFQDNS[ DNS_MAX_NAME_BUFFER_LENGTH ]; IIntelliMirrorSAP * pimsap = NULL; LPPROPSHEETPAGE ppsp = (LPPROPSHEETPAGE) lParam;
Assert( ppsp ); Assert( ppsp->lParam ); SetWindowLongPtr( hDlg, GWLP_USERDATA, ppsp->lParam ); lpc = (LPTHISCLASS) ppsp->lParam;
Button_SetCheck( GetDlgItem( hDlg, IDC_B_ADDSIF ), BST_CHECKED );
Assert( lpc->_punk ); hr = THR( lpc->_punk->QueryInterface( IID_IIntelliMirrorSAP, (void**) &pimsap ) ); if (FAILED(hr)) { goto InitDialog_Error; }
Assert( !lpc->_pszServerName ); hr = THR( pimsap->GetServerName( &lpc->_pszServerName ) ); if (FAILED(hr)) { goto InitDialog_Error; }
if (GetComputerNameEx( ComputerNameNetBIOS, szFQDNS, &cbSize ) && _wcsicmp( szFQDNS, lpc->_pszServerName ) == 0 ) { EnableWindow( GetDlgItem( hDlg, IDC_B_NEWIMAGE ), TRUE ); }
InitDialog_Error: return TRUE; } break;
case WM_NOTIFY: { LPNMHDR lpnmhdr = (LPNMHDR) lParam; Assert( lpc );
switch ( lpnmhdr->code ) { case PSN_SETACTIVE: PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_NEXT ); break;
case PSN_WIZNEXT: TraceMsg( TF_WM, "PSN_WIZNEXT\n" ); if ( Button_GetCheck( GetDlgItem( hDlg, IDC_B_ADDSIF ) ) == BST_CHECKED ) { lpc->_fAddSif = TRUE; } else if ( Button_GetCheck( GetDlgItem( hDlg, IDC_B_NEWIMAGE ) ) == BST_CHECKED ) { STARTUPINFO startupInfo; PROCESS_INFORMATION pi; BOOL bRet; const WCHAR szCommand[] = L"%systemroot%\\system32\\RISETUP.EXE -add"; WCHAR szRealCommandLine[MAX_PATH + 5 + 1]; // 5 for ' -add' and 1 for null
lpc->_fAddSif = FALSE;
ZeroMemory( &startupInfo, sizeof( startupInfo) ); startupInfo.cb = sizeof( startupInfo );
if (ExpandEnvironmentStrings( szCommand, szRealCommandLine, ARRAYSIZE(szRealCommandLine)) && CreateProcess(NULL, szRealCommandLine, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startupInfo, &pi )) { CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); } else { DWORD dwErr = GetLastError( ); MessageBoxFromError( hDlg, IDS_RISETUP_FAILED_TO_START, dwErr ); }
PropSheet_PressButton( GetParent( hDlg ), PSBTN_FINISH ); } break;
case PSN_QUERYCANCEL: TraceMsg( TF_WM, "PSN_QUERYCANCEL\n" ); return lpc->_VerifyCancel( hDlg ); } } break; }
return FALSE; } //
// Page2DlgProc( )
//
// SIF Selection dialog proc.
//
INT_PTR CALLBACK THISCLASS::Page2DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LPTHISCLASS lpc = (LPTHISCLASS) GetWindowLongPtr( hDlg, GWLP_USERDATA );
switch ( uMsg ) { case WM_INITDIALOG: TraceMsg( TF_WM, "WM_INITDIALOG\n" ); { LPPROPSHEETPAGE ppsp = (LPPROPSHEETPAGE) lParam; Assert( ppsp ); Assert( ppsp->lParam ); SetWindowLongPtr( hDlg, GWLP_USERDATA, ppsp->lParam ); // lpc = (LPTHISCLASS) ppsp->lParam;
return TRUE; } break;
case WM_NOTIFY: { LPNMHDR lpnmhdr = (LPNMHDR) lParam; Assert( lpc );
switch ( lpnmhdr->code ) { case PSN_SETACTIVE: TraceMsg( TF_WM, "PSN_SETACTIVE\n" ); if ( !lpc->_fAddSif ) { SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
return TRUE; } else { LRESULT lResult;
lpc->_fCopyFromSamples = FALSE; lpc->_fCopyFromLocation = FALSE; lpc->_fCopyFromServer = FALSE;
lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_B_FROMSAMPLES ) ); if ( lResult == BST_CHECKED ) { lpc->_fCopyFromSamples = TRUE; }
lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_B_SERVER ) ); if ( lResult == BST_CHECKED ) { lpc->_fCopyFromServer = TRUE; }
lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_B_LOCATION ) ); if ( lResult == BST_CHECKED ) { lpc->_fCopyFromLocation = TRUE; }
if ( !lpc->_fCopyFromLocation && !lpc->_fCopyFromSamples && !lpc->_fCopyFromServer ) { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK ); } else { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT ); } } break;
case PSN_WIZNEXT: TraceMsg( TF_WM, "PSN_WIZNEXT\n" ); { LRESULT lResult;
lpc->_fCopyFromSamples = FALSE; lpc->_fCopyFromLocation = FALSE; lpc->_fCopyFromServer = FALSE;
lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_B_FROMSAMPLES ) ); if ( lResult == BST_CHECKED ) { lpc->_fCopyFromSamples = TRUE; }
lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_B_SERVER ) ); if ( lResult == BST_CHECKED ) { lpc->_fCopyFromServer = TRUE; }
lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_B_LOCATION ) ); if ( lResult == BST_CHECKED ) { lpc->_fCopyFromLocation = TRUE; }
Assert( lpc->_fCopyFromLocation || lpc->_fCopyFromSamples || lpc->_fCopyFromServer ); } break;
case PSN_QUERYCANCEL: TraceMsg( TF_WM, "PSN_QUERYCANCEL\n" ); return lpc->_VerifyCancel( hDlg ); } } break;
case WM_COMMAND: TraceMsg( TF_WM, "WM_COMMAND\n" ); HWND hwnd = (HWND) lParam; switch ( LOWORD( wParam ) ) { case IDC_B_FROMSAMPLES: if ( HIWORD( wParam ) == BN_CLICKED ) { LRESULT lResult = Button_GetCheck( hwnd ); if ( lResult == BST_CHECKED ) { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT ); } return TRUE; } break;
case IDC_B_SERVER: if ( HIWORD( wParam ) == BN_CLICKED ) { LRESULT lResult = Button_GetCheck( hwnd ); if ( lResult == BST_CHECKED ) { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT ); } return TRUE; } break;
case IDC_B_LOCATION: if ( HIWORD( wParam ) == BN_CLICKED ) { LRESULT lResult = Button_GetCheck( hwnd ); if ( lResult == BST_CHECKED ) { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT ); } return TRUE; } break;
} break; }
return FALSE; }
//
// Page3DlgProc( )
//
INT_PTR CALLBACK THISCLASS::Page3DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LPTHISCLASS lpc = (LPTHISCLASS) GetWindowLongPtr( hDlg, GWLP_USERDATA );
switch ( uMsg ) { case WM_INITDIALOG: TraceMsg( TF_WM, "WM_INITDIALOG\n" ); { LPPROPSHEETPAGE ppsp = (LPPROPSHEETPAGE) lParam; Assert( ppsp ); Assert( ppsp->lParam ); SetWindowLongPtr( hDlg, GWLP_USERDATA, ppsp->lParam ); // lpc = (LPTHISCLASS) ppsp->lParam;
return TRUE; } break;
case WM_NOTIFY: { LPNMHDR lpnmhdr = (LPNMHDR) lParam; Assert( lpc );
switch ( lpnmhdr->code ) { case PSN_SETACTIVE: TraceMsg( TF_WM, "PSN_SETACTIVE\n" ); if ( !lpc->_fAddSif || !lpc->_fCopyFromServer ) { SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
return TRUE; } else { ULONG uLength = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_SERVER ) ); if ( !uLength ) { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK ); } else { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT ); } } break;
case PSN_WIZNEXT: TraceMsg( TF_WM, "PSN_WIZNEXT\n" ); { CWaitCursor Wait; LPSHARE_INFO_1 psi; HWND hwndEdit = GetDlgItem( hDlg, IDC_E_SERVER ); ULONG uLength = Edit_GetTextLength( hwndEdit ); Assert( uLength ); uLength++; // add one for the NULL
// if we had a previous buffer allocated,
// see if we can reuse it
if ( lpc->_pszSourceServerName && uLength > wcslen(lpc->_pszSourceServerName) + 1 ) { TraceFree( lpc->_pszSourceServerName ); lpc->_pszSourceServerName = NULL; }
if ( !lpc->_pszSourceServerName ) { lpc->_pszSourceServerName = (LPWSTR) TraceAllocString( LMEM_FIXED, uLength ); if ( !lpc->_pszSourceServerName ) goto PSN_WIZNEXTABORT; }
Edit_GetText( hwndEdit, lpc->_pszSourceServerName, uLength );
if ( NERR_Success != NetShareGetInfo( lpc->_pszSourceServerName, REMINST_SHARE, 1, (LPBYTE *) &psi ) ) { MessageBoxFromStrings( hDlg, IDS_NOTARISERVER_CAPTION, IDS_NOTARISERVER_TEXT, MB_OK ); SetFocus( hwndEdit ); goto PSN_WIZNEXTABORT; } else { NetApiBufferFree( psi ); }
break; PSN_WIZNEXTABORT: SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); return TRUE; } break;
case LVN_DELETEALLITEMS: TraceMsg( TF_WM, "LVN_DELETEALLITEMS - Deleting all items.\n" ); break;
case LVN_DELETEITEM: TraceMsg( TF_WM, "LVN_DELETEITEM - Deleting an item.\n" ); { LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam; LPSIFINFO pSIF = (LPSIFINFO) pnmv->lParam; THR( lpc->_CleanupSIFInfo( pSIF ) ); } break;
case PSN_QUERYCANCEL: TraceMsg( TF_WM, "PSN_QUERYCANCEL\n" ); return lpc->_VerifyCancel( hDlg ); } } break;
case WM_COMMAND: TraceMsg( TF_WM, "WM_COMMAND\n" ); HWND hwnd = (HWND) lParam; switch ( LOWORD( wParam ) ) { case IDC_E_SERVER: if ( HIWORD( wParam ) == EN_CHANGE ) { LONG uLength = Edit_GetTextLength( hwnd ); if ( !uLength ) { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK ); } else { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT ); } return TRUE; } break;
case IDC_B_BROWSE: if ( HIWORD( wParam ) == BN_CLICKED ) { _OnSearch( hDlg ); } break; } break; }
return FALSE; }
HRESULT THISCLASS::_OnSearch( HWND hDlg ) { TraceClsFunc( "_OnSearch( )\n" );
HRESULT hr = E_FAIL; DSQUERYINITPARAMS dqip; OPENQUERYWINDOW oqw; LPDSOBJECTNAMES pDsObjects; VARIANT var; ICommonQuery * pCommonQuery = NULL; IDataObject *pdo;
VariantInit( &var );
hr = THR( CoCreateInstance( CLSID_CommonQuery, NULL, CLSCTX_INPROC_SERVER, IID_ICommonQuery, (PVOID *)&pCommonQuery) ); if (FAILED(hr)) { goto Error; }
ZeroMemory( &dqip, sizeof(dqip) ); dqip.cbStruct = sizeof(dqip); dqip.dwFlags = DSQPF_NOSAVE | DSQPF_SHOWHIDDENOBJECTS | DSQPF_ENABLEADMINFEATURES; dqip.dwFlags |= DSQPF_ENABLEADVANCEDFEATURES;
ZeroMemory( &oqw, sizeof(oqw) ); oqw.cbStruct = sizeof(oqw); oqw.dwFlags = OQWF_SHOWOPTIONAL | OQWF_ISSUEONOPEN | OQWF_REMOVESCOPES | OQWF_REMOVEFORMS | OQWF_DEFAULTFORM | OQWF_OKCANCEL | OQWF_SINGLESELECT; oqw.clsidHandler = CLSID_DsQuery; oqw.pHandlerParameters = &dqip; oqw.clsidDefaultForm = CLSID_RISrvQueryForm;
hr = pCommonQuery->OpenQueryWindow( hDlg, &oqw, &pdo);
if ( SUCCEEDED(hr) && pdo) { FORMATETC fmte = { (CLIPFORMAT)g_cfDsObjectNames, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; STGMEDIUM medium = { TYMED_HGLOBAL, NULL, NULL};
//
// Retrieve the result from the IDataObject,
// in this case CF_DSOBJECTNAMES (dsclient.h)
// is needed because it describes
// the objects which were selected by the user.
//
hr = pdo->GetData(&fmte, &medium); if ( SUCCEEDED(hr) ) { DSOBJECTNAMES *pdon = (DSOBJECTNAMES*)GlobalLock(medium.hGlobal); PWSTR p,FQDN;
//
// we want the name of the computer object that was selected.
// crack the DSOBJECTNAMES structure to get this data,
// convert it into a version that the user can view, and set the
// dialog text to this data.
//
//
// if we can't get this, it's not a problem because this is
// only a display value
//
if ( pdon ) { Assert( pdon->cItems == 1); p = (PWSTR)((ULONG_PTR)pdon + (ULONG_PTR)pdon->aObjects[0].offsetName); if (p && (p = wcsstr(p, L"LDAP://"))) { p += 6; if ((p = wcsstr(p, L"/CN="))) { p += 1; hr = DNtoFQDN( p, &FQDN);
if (SUCCEEDED(hr)) { SetDlgItemText( hDlg, IDC_E_SERVER, FQDN ); TraceFree( FQDN ); } } } GlobalUnlock(medium.hGlobal); } }
ReleaseStgMedium(&medium); pdo->Release(); }
Error:
if ( pCommonQuery ) pCommonQuery->Release();
if (FAILED(hr)) { MessageBoxFromStrings( hDlg, IDS_PROBLEM_SEARCHING_TITLE, IDS_PROBLEM_SEARCHING_TEXT, MB_ICONEXCLAMATION ); }
HRETURN(hr); }
//
// Page4DlgProc( )
//
INT_PTR CALLBACK THISCLASS::Page4DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LPTHISCLASS lpc = (LPTHISCLASS) GetWindowLongPtr( hDlg, GWLP_USERDATA );
switch ( uMsg ) { case WM_INITDIALOG: TraceMsg( TF_WM, "WM_INITDIALOG\n" ); { LPPROPSHEETPAGE ppsp = (LPPROPSHEETPAGE) lParam; Assert( ppsp ); Assert( ppsp->lParam ); SetWindowLongPtr( hDlg, GWLP_USERDATA, ppsp->lParam ); lpc = (LPTHISCLASS) ppsp->lParam; THR( lpc->_InitListView( GetDlgItem( hDlg, IDC_L_SIFS ), TRUE ) ); return TRUE; } break;
case WM_NOTIFY: { LPNMHDR lpnmhdr = (LPNMHDR) lParam; Assert( lpc );
switch ( lpnmhdr->code ) { case PSN_SETACTIVE: TraceMsg( TF_WM, "PSN_SETACTIVE\n" ); if ( !lpc->_fAddSif || !lpc->_fCopyFromServer ) { SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
return TRUE; } Assert( lpc->_pszSourceServerName ); if ( lpc->_pszSourceServerName ) { LPWSTR pszStartPath = (LPWSTR) TraceAllocString( LMEM_FIXED, wcslen( lpc->_pszSourceServerName ) + ARRAYSIZE(SERVER_START_STRING) ); if ( pszStartPath ) { wsprintf( pszStartPath, SERVER_START_STRING, lpc->_pszSourceServerName ); lpc->_hDlg = hDlg; lpc->_hwndList = GetDlgItem( hDlg, IDC_L_SIFS ); lpc->_PopulateTemplatesListView( pszStartPath ); TraceFree( pszStartPath ); } } PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK ); break;
case PSN_WIZNEXT: TraceMsg( TF_WM, "PSN_WIZNEXT\n" ); { LVITEM lvi; HWND hwndList = GetDlgItem( hDlg, IDC_L_SIFS ); lvi.iItem = ListView_GetNextItem( hwndList, -1, LVNI_SELECTED ); Assert( lvi.iItem != -1 );
lvi.iSubItem = 0; lvi.mask = LVIF_PARAM; ListView_GetItem( hwndList, &lvi ); Assert(lvi.lParam);
LPSIFINFO pSIF = (LPSIFINFO) lvi.lParam;
if ( lpc->_pszSourcePath ) { TraceFree( lpc->_pszSourcePath ); lpc->_pszSourcePath = NULL; }
if ( lpc->_pszSourceImage && lpc->_pszSourceImage != lpc->_szNA && lpc->_pszSourceImage != lpc->_szLocation ) { TraceFree( lpc->_pszSourceImage ); lpc->_pszSourceImage = NULL; }
lpc->_pszSourcePath = pSIF->pszFilePath; lpc->_pszSourceImage = pSIF->pszImageFile; pSIF->pszFilePath = NULL; // don't free this, we're using it
pSIF->pszImageFile = NULL; // don't free this, we're using it
ListView_DeleteAllItems( hwndList ); } break;
case PSN_QUERYCANCEL: TraceMsg( TF_WM, "PSN_QUERYCANCEL\n" ); return lpc->_VerifyCancel( hDlg );
case LVN_DELETEALLITEMS: TraceMsg( TF_WM, "LVN_DELETEALLITEMS - Deleting all items.\n" ); break;
case LVN_DELETEITEM: TraceMsg( TF_WM, "LVN_DELETEITEM - Deleting an item.\n" ); { LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam; LPSIFINFO pSIF = (LPSIFINFO) pnmv->lParam; THR( lpc->_CleanupSIFInfo( pSIF ) ); } break;
case LVN_ITEMCHANGED: { HWND hwndList = GetDlgItem( hDlg, IDC_L_SIFS ); UINT iItems = ListView_GetNextItem( hwndList, -1, LVNI_SELECTED ); if ( iItems != -1 ) { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT ); } else { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK ); } } break; } } break; }
return FALSE; }
//
// Page5DlgProc( )
//
INT_PTR CALLBACK THISCLASS::Page5DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LPTHISCLASS lpc = (LPTHISCLASS) GetWindowLongPtr( hDlg, GWLP_USERDATA );
switch ( uMsg ) { case WM_INITDIALOG: TraceMsg( TF_WM, "WM_INITDIALOG\n" ); { LPPROPSHEETPAGE ppsp = (LPPROPSHEETPAGE) lParam; Assert( ppsp ); Assert( ppsp->lParam ); SetWindowLongPtr( hDlg, GWLP_USERDATA, ppsp->lParam ); Edit_LimitText( GetDlgItem( hDlg, IDC_E_FILEPATH ), MAX_PATH ); SHAutoComplete(GetDlgItem( hDlg, IDC_E_FILEPATH ), SHACF_AUTOSUGGEST_FORCE_ON | SHACF_FILESYSTEM); // lpc = (LPTHISCLASS) ppsp->lParam;
return TRUE; } break;
case WM_NOTIFY: { LPNMHDR lpnmhdr = (LPNMHDR) lParam; Assert( lpc );
switch ( lpnmhdr->code ) { case PSN_SETACTIVE: TraceMsg( TF_WM, "PSN_SETACTIVE\n" ); if ( !lpc->_fAddSif || !lpc->_fCopyFromLocation ) { SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
return TRUE; } else { ULONG uLength = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_FILEPATH ) ); if ( !uLength ) { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK ); } else { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT ); } } break;
case PSN_WIZNEXT: TraceMsg( TF_WM, "PSN_WIZNEXT\n" ); { HWND hwndEdit = GetDlgItem( hDlg, IDC_E_FILEPATH ); ULONG uLength = Edit_GetTextLength( hwndEdit ); DWORD dw; Assert( uLength ); uLength++; // add one for the NULL
// if we had a previous buffer allocated,
// see if we can reuse it
if ( lpc->_pszSourcePath && uLength > wcslen(lpc->_pszSourcePath) + 1 ) { TraceFree( lpc->_pszSourcePath ); lpc->_pszSourcePath = NULL; }
if ( lpc->_pszSourceImage && lpc->_pszSourceImage != lpc->_szNA && lpc->_pszSourceImage != lpc->_szLocation ) { TraceFree( lpc->_pszSourceImage ); lpc->_pszSourceImage = NULL; }
lpc->_pszSourceImage = lpc->_szLocation;
if ( !lpc->_pszSourcePath ) { lpc->_pszSourcePath = (LPWSTR) TraceAllocString( LMEM_FIXED, uLength ); if ( !lpc->_pszSourcePath ) { SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't change
return TRUE; } }
Edit_GetText( hwndEdit, lpc->_pszSourcePath, uLength );
DWORD dwAttrs = GetFileAttributes( lpc->_pszSourcePath ); if ( dwAttrs == 0xFFFFffff ) { // file doesn't exist
DWORD dwErr = GetLastError( ); MessageBoxFromError( hDlg, NULL, dwErr ); TraceFree( lpc->_pszSourcePath ); lpc->_pszSourcePath = NULL; SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't continue
return TRUE; } else { // the SIF image must be a "FLAT" image
WCHAR szImageType[ 40 ];
GetPrivateProfileString( OSCHOOSER_SIF_SECTION, OSCHOOSER_IMAGETYPE_ENTRY, L"", szImageType, ARRAYSIZE(szImageType), lpc->_pszSourcePath );
if ( _wcsicmp( szImageType, OSCHOOSER_IMAGETYPE_FLAT ) ) { MessageBoxFromStrings( hDlg, IDS_MUST_BE_FLAT_CAPTION, IDS_MUST_BE_FLAT_TEXT, MB_OK ); SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't continue
return TRUE; }
GetPrivateProfileString( OSCHOOSER_SIF_SECTION, OSCHOOSER_DESCRIPTION_ENTRY, L"", lpc->_szDescription, ARRAYSIZE(lpc->_szDescription), lpc->_pszSourcePath );
GetPrivateProfileString( OSCHOOSER_SIF_SECTION, OSCHOOSER_HELPTEXT_ENTRY, L"", lpc->_szHelpText, ARRAYSIZE(lpc->_szHelpText), lpc->_pszSourcePath ); } } break;
case PSN_QUERYCANCEL: TraceMsg( TF_WM, "PSN_QUERYCANCEL\n" ); return lpc->_VerifyCancel( hDlg ); } } break;
case WM_COMMAND: TraceMsg( TF_WM, "WM_COMMAND\n" ); HWND hwnd = (HWND) lParam; switch ( LOWORD( wParam ) ) { case IDC_E_FILEPATH: if ( HIWORD( wParam ) == EN_CHANGE ) { LONG uLength = Edit_GetTextLength( hwnd ); if ( !uLength ) { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK ); } else { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT ); } return TRUE; } break;
case IDC_B_BROWSE: if ( HIWORD( wParam ) == BN_CLICKED ) { WCHAR szFilter[ 80 ]; // random
WCHAR szFilepath[ MAX_PATH ] = { L'\0'}; // bigger?
WCHAR szSIF[ ] = { L"SIF"}; DWORD dw; OPENFILENAME ofn;
// Build OpenFileName dialogs filter
ZeroMemory( szFilter, sizeof(szFilter) ); dw = LoadString( g_hInstance, IDS_OFN_SIF_FILTER, szFilter, ARRAYSIZE(szFilter) ); Assert( dw ); dw++; // include NULL character
wcscat( &szFilter[dw], L"*.SIF" ); #ifdef DEBUG
// paranoid... make sure it fits!
dw += wcslen( &szFilter[dw] ) + 2; // +2 = one for each NULL character
Assert( dw + 2 <= sizeof(szFilter) ); #endif // DEBUG
// Build OpenFileName structure
ZeroMemory( &ofn, sizeof(ofn) ); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hDlg; ofn.hInstance = g_hInstance; ofn.lpstrFilter = szFilter; ofn.lpstrFile = szFilepath; ofn.nMaxFile = ARRAYSIZE(szFilepath); ofn.Flags = OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; ofn.lpstrDefExt = szSIF; if ( GetOpenFileName( &ofn ) ) { SetDlgItemText( hDlg, IDC_E_FILEPATH, szFilepath ); return TRUE; } } break; } break; }
return FALSE; }
//
// Page6DlgProc( )
//
INT_PTR CALLBACK THISCLASS::Page6DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LPTHISCLASS lpc = (LPTHISCLASS) GetWindowLongPtr( hDlg, GWLP_USERDATA );
switch ( uMsg ) { case WM_INITDIALOG: TraceMsg( TF_WM, "WM_INITDIALOG\n" ); { LPPROPSHEETPAGE ppsp = (LPPROPSHEETPAGE) lParam; Assert( ppsp ); Assert( ppsp->lParam ); SetWindowLongPtr( hDlg, GWLP_USERDATA, ppsp->lParam ); lpc = (LPTHISCLASS) ppsp->lParam; THR( lpc->_InitListView( GetDlgItem( hDlg, IDC_L_OSES ), FALSE ) ); return TRUE; } break;
case WM_NOTIFY: { LPNMHDR lpnmhdr = (LPNMHDR) lParam; Assert( lpc );
switch ( lpnmhdr->code ) { case PSN_SETACTIVE: TraceMsg( TF_WM, "PSN_SETACTIVE\n" ); if ( !lpc->_fAddSif ) { SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
return TRUE; } Assert( lpc->_pszServerName ); if ( lpc->_pszServerName ) { LPWSTR pszStartPath = (LPWSTR) TraceAllocString( LMEM_FIXED, wcslen( lpc->_pszServerName ) + ARRAYSIZE(SERVER_START_STRING) ); if ( pszStartPath ) { wsprintf( pszStartPath, SERVER_START_STRING, lpc->_pszServerName ); lpc->_hDlg = hDlg; lpc->_hwndList = GetDlgItem( hDlg, IDC_L_OSES ); // bugbug what if this fails?
lpc->_PopulateImageListView( pszStartPath ); TraceFree( pszStartPath ); } } PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK ); break;
case PSN_WIZNEXT: TraceMsg( TF_WM, "PSN_WIZNEXT\n" ); { LVITEM lvi; HWND hwndList = GetDlgItem( hDlg, IDC_L_OSES ); lvi.iItem = ListView_GetNextItem( hwndList, -1, LVNI_SELECTED ); Assert( lvi.iItem != -1 );
lvi.iSubItem = 0; lvi.mask = LVIF_PARAM; ListView_GetItem( hwndList, &lvi ); Assert(lvi.lParam);
LPSIFINFO pSIF = (LPSIFINFO) lvi.lParam;
if ( lpc->_pszDestPath) { TraceFree( lpc->_pszDestPath ); lpc->_pszDestPath = NULL; }
lpc->_pszDestPath = (LPWSTR) TraceAllocString( LMEM_FIXED, wcslen( pSIF->pszFilePath ) + ARRAYSIZE(SLASH_TEMPLATES) ); if ( !lpc->_pszDestPath ) { SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't continue;
return TRUE; }
wcscpy( lpc->_pszDestPath, pSIF->pszFilePath ); wcscat( lpc->_pszDestPath, SLASH_TEMPLATES ); lpc->_fDestPathIncludesSIF = FALSE;
if ( lpc->_pszDestImage && lpc->_pszDestImage != lpc->_szNA ) TraceFree( lpc->_pszDestImage ); // no need to NULL - it set again below
lpc->_pszDestImage = pSIF->pszImageFile; pSIF->pszImageFile = NULL; // don't free this
ListView_DeleteAllItems( hwndList ); } break;
case PSN_QUERYCANCEL: TraceMsg( TF_WM, "PSN_QUERYCANCEL\n" ); return lpc->_VerifyCancel( hDlg );
case LVN_DELETEALLITEMS: TraceMsg( TF_WM, "LVN_DELETEALLITEMS - Deleting all items.\n" ); break;
case LVN_DELETEITEM: TraceMsg( TF_WM, "LVN_DELETEITEM - Deleting an item.\n" ); { LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam; LPSIFINFO pSIF = (LPSIFINFO) pnmv->lParam; THR( lpc->_CleanupSIFInfo( pSIF ) ); } break;
case LVN_ITEMCHANGED: { HWND hwndList = GetDlgItem( hDlg, IDC_L_OSES ); UINT iItems = ListView_GetNextItem( hwndList, -1, LVNI_SELECTED ); if ( iItems != -1 ) { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT ); } else { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK ); } } break; } } break; }
return FALSE; }
//
// Page7DlgProc( )
//
INT_PTR CALLBACK THISCLASS::Page7DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LPTHISCLASS lpc = (LPTHISCLASS) GetWindowLongPtr( hDlg, GWLP_USERDATA );
switch ( uMsg ) { case WM_INITDIALOG: TraceMsg( TF_WM, "WM_INITDIALOG\n" ); { LPPROPSHEETPAGE ppsp = (LPPROPSHEETPAGE) lParam; Assert( ppsp ); Assert( ppsp->lParam ); SetWindowLongPtr( hDlg, GWLP_USERDATA, ppsp->lParam ); lpc = (LPTHISCLASS) ppsp->lParam; THR( lpc->_InitListView( GetDlgItem( hDlg, IDC_L_SIFS ), FALSE ) ); return TRUE; } break;
case WM_NOTIFY: { LPNMHDR lpnmhdr = (LPNMHDR) lParam; Assert( lpc );
switch ( lpnmhdr->code ) { case PSN_SETACTIVE: TraceMsg( TF_WM, "PSN_SETACTIVE\n" ); if ( !lpc->_fAddSif || !lpc->_fCopyFromSamples ) { SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
return TRUE; } Assert( lpc->_pszDestPath ); if ( lpc->_pszDestPath ) { LPWSTR pszStartPath = (LPWSTR) TraceStrDup( lpc->_pszDestPath ); if ( pszStartPath ) { // remove the "\templates" from the path
LPWSTR psz = StrRChr( pszStartPath, &pszStartPath[wcslen(pszStartPath)], L'\\' ); Assert( psz ); if ( psz ) { *psz = L'\0'; // terminate
lpc->_hDlg = hDlg; lpc->_hwndList = GetDlgItem( hDlg, IDC_L_SIFS ); //bugbug this could fail.
lpc->_PopulateSamplesListView( pszStartPath ); *psz = L'\\'; // restore
} TraceFree( pszStartPath ); } } PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK ); break;
case PSN_WIZNEXT: TraceMsg( TF_WM, "PSN_WIZNEXT\n" ); { LVITEM lvi; DWORD dw; HWND hwndList = GetDlgItem( hDlg, IDC_L_SIFS ); lvi.iItem = ListView_GetNextItem( hwndList, -1, LVNI_SELECTED ); Assert( lvi.iItem != -1 );
lvi.iSubItem = 0; lvi.mask = LVIF_PARAM; ListView_GetItem( hwndList, &lvi ); Assert(lvi.lParam);
LPSIFINFO pSIF = (LPSIFINFO) lvi.lParam;
if ( lpc->_pszSourcePath ) { TraceFree( lpc->_pszSourcePath ); lpc->_pszSourcePath = NULL; }
if ( lpc->_pszSourceImage && lpc->_pszSourceImage != lpc->_szNA && lpc->_pszSourceImage != lpc->_szLocation ) { TraceFree( lpc->_pszSourceImage ); lpc->_pszSourceImage = NULL; }
lpc->_pszSourcePath = pSIF->pszFilePath; lpc->_pszSourceImage = pSIF->pszImageFile;
if ( pSIF->pszDescription ) { wcsncpy( lpc->_szDescription, pSIF->pszDescription, ARRAYSIZE(lpc->_szDescription) ); lpc->_szDescription[ARRAYSIZE(lpc->_szDescription)-1] = L'\0'; } else { lpc->_szDescription[0] = L'\0'; }
if ( pSIF->pszHelpText ) { wcsncpy( lpc->_szHelpText, pSIF->pszHelpText, ARRAYSIZE(lpc->_szHelpText) ); lpc->_szHelpText[ARRAYSIZE(lpc->_szHelpText)-1] = L'\0'; } else { lpc->_szHelpText[0] = L'\0'; }
pSIF->pszFilePath = NULL; // don't free this, we're using it
pSIF->pszImageFile = NULL; // don't free this, we're using it
ListView_DeleteAllItems( hwndList ); } break;
case PSN_QUERYCANCEL: TraceMsg( TF_WM, "PSN_QUERYCANCEL\n" ); return lpc->_VerifyCancel( hDlg );
case LVN_DELETEALLITEMS: TraceMsg( TF_WM, "LVN_DELETEALLITEMS - Deleting all items.\n" ); break;
case LVN_DELETEITEM: TraceMsg( TF_WM, "LVN_DELETEITEM - Deleting an item.\n" ); { LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam; LPSIFINFO pSIF = (LPSIFINFO) pnmv->lParam; THR( lpc->_CleanupSIFInfo( pSIF ) ); } break;
case LVN_ITEMCHANGED: { HWND hwndList = GetDlgItem( hDlg, IDC_L_SIFS ); UINT iItems = ListView_GetNextItem( hwndList, -1, LVNI_SELECTED ); if ( iItems != -1 ) { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT ); } else { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK ); } } break; } } break; }
return FALSE; }
//
// Page8DlgProc( )
//
INT_PTR CALLBACK THISCLASS::Page8DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LPTHISCLASS lpc = (LPTHISCLASS) GetWindowLongPtr( hDlg, GWLP_USERDATA );
switch ( uMsg ) { case WM_INITDIALOG: TraceMsg( TF_WM, "WM_INITDIALOG\n" ); { LPPROPSHEETPAGE ppsp = (LPPROPSHEETPAGE) lParam; Assert( ppsp ); Assert( ppsp->lParam ); SetWindowLongPtr( hDlg, GWLP_USERDATA, ppsp->lParam ); // lpc = (LPTHISCLASS) ppsp->lParam;
return TRUE; } break;
case WM_NOTIFY: { LPNMHDR lpnmhdr = (LPNMHDR) lParam; Assert( lpc );
switch ( lpnmhdr->code ) { case PSN_SETACTIVE: TraceMsg( TF_WM, "PSN_SETACTIVE\n" ); if ( !lpc->_fAddSif ) { SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
return TRUE; } else { Assert( lpc->_pszSourcePath ); Assert( lpc->_pszDestPath );
LPWSTR pszDestFilePath; ULONG uDestLength = wcslen( lpc->_pszDestPath ); LPWSTR pszFilename;
lpc->_fSIFCanExist = FALSE; // reset
if ( lpc->_fDestPathIncludesSIF ) { // strip the filename
LPWSTR psz = StrRChr( lpc->_pszDestPath, &lpc->_pszDestPath[ uDestLength ], L'\\' ); Assert(psz); *psz = L'\0'; // truncate
lpc->_fDestPathIncludesSIF = FALSE;
if ( !lpc->_fShowedPage8 ) { SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
return TRUE; }
psz++; pszFilename = psz; } else { pszFilename = StrRChr( lpc->_pszSourcePath, &lpc->_pszSourcePath[wcslen(lpc->_pszSourcePath)], L'\\' ); Assert( pszFilename ); pszFilename++; // move past the '\'
pszDestFilePath = (LPWSTR) TraceAllocString( LMEM_FIXED, uDestLength + 1 + wcslen( pszFilename ) + 1 ); if ( pszDestFilePath ) { wcscpy( pszDestFilePath, lpc->_pszDestPath ); wcscat( pszDestFilePath, L"\\" ); wcscat( pszDestFilePath, pszFilename );
DWORD dwAttrs = GetFileAttributes( pszDestFilePath ); if ( dwAttrs == 0xFFFFffff ) { // file does not exist on destination server.
// Use the same SIF as the source.
TraceFree( lpc->_pszDestPath ); lpc->_pszDestPath = pszDestFilePath; lpc->_fDestPathIncludesSIF = TRUE; SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
return TRUE; } TraceFree( pszDestFilePath ); } // else be paranoid and prompt for a name
}
HWND hwnd = GetDlgItem( hDlg, IDC_E_FILENAME ); Assert( uDestLength <= MAX_PATH ); Edit_LimitText( hwnd, MAX_PATH - uDestLength ); Edit_SetText( hwnd, pszFilename ); lpc->_fShowedPage8 = TRUE; } break;
case PSN_WIZBACK: lpc->_fShowedPage8 = FALSE; // reset this
break;
case PSN_WIZNEXT: TraceMsg( TF_WM, "PSN_WIZNEXT\n" ); { Assert( lpc->_pszDestPath ); Assert( !lpc->_fDestPathIncludesSIF );
HWND hwndEdit = GetDlgItem( hDlg, IDC_E_FILENAME ); ULONG uLength = Edit_GetTextLength( hwndEdit ); ULONG uLengthDest = wcslen( lpc->_pszDestPath ); DWORD dwAttrs;
Assert( uLength ); AssertMsg( uLengthDest + uLength <= MAX_PATH, "The Edit_LimitText() should prevent this from happening." );
uLength++; // add one for the NULL
LPWSTR pszNewDestPath = (LPWSTR) TraceAllocString( LMEM_FIXED, uLengthDest + 1 + uLength ); if ( !pszNewDestPath ) goto PSN_WIZNEXT_Abort;
wcscpy( pszNewDestPath, lpc->_pszDestPath ); wcscat( pszNewDestPath, L"\\" );
Edit_GetText( hwndEdit, &pszNewDestPath[uLengthDest + 1], uLength );
if ( !VerifySIFText( pszNewDestPath ) || StrChr( pszNewDestPath, 32 ) != NULL ) { // no spaces!
MessageBoxFromStrings( hDlg, IDS_OSCHOOSER_DIRECTORY_RESTRICTION_TITLE, IDS_OSCHOOSER_DIRECTORY_RESTRICTION_TEXT, MB_OK ); goto PSN_WIZNEXT_Abort; }
// make sure it doesn't exist.
dwAttrs = GetFileAttributes( pszNewDestPath ); if ( dwAttrs != 0xFFFFffff ) { // file exists, verify with user to overwrite
UINT i = MessageBoxFromStrings( hDlg, IDS_OVERWRITE_CAPTION, IDS_OVERWRITE_TEXT, MB_YESNO ); if ( i == IDNO ) { goto PSN_WIZNEXT_Abort; } else { lpc->_fSIFCanExist = TRUE; } }
uLength = wcslen( pszNewDestPath ); if ( _wcsicmp( &pszNewDestPath[ uLength - 4 ], L".SIF" ) != 0 ) { UINT i = MessageBoxFromStrings( hDlg, IDC_IMPROPER_EXTENSION_CAPTION, IDC_IMPROPER_EXTENSION_TEXT, MB_YESNO ); if ( i == IDNO ) goto PSN_WIZNEXT_Abort; }
TraceFree( lpc->_pszDestPath ); lpc->_pszDestPath = pszNewDestPath; lpc->_fDestPathIncludesSIF = TRUE; return FALSE; // do it
PSN_WIZNEXT_Abort: if ( pszNewDestPath ) TraceFree( pszNewDestPath ); // no need to NULL, going out of scope
SetFocus( hwndEdit ); SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't continue
return TRUE; } break;
case PSN_QUERYCANCEL: TraceMsg( TF_WM, "PSN_QUERYCANCEL\n" ); return lpc->_VerifyCancel( hDlg ); } } break;
case WM_COMMAND: TraceMsg( TF_WM, "WM_COMMAND\n" ); HWND hwnd = (HWND) lParam; switch ( LOWORD( wParam ) ) { case IDC_E_FILENAME: if ( HIWORD( wParam ) == EN_CHANGE ) { LONG uLength = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_FILENAME ) ); if ( !uLength ) { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK ); } else { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT ); } return TRUE; } break; } break; }
return FALSE; }
//
// Page9DlgProc( )
//
INT_PTR CALLBACK THISCLASS::Page9DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LPTHISCLASS lpc = (LPTHISCLASS) GetWindowLongPtr( hDlg, GWLP_USERDATA );
switch ( uMsg ) { case WM_INITDIALOG: TraceMsg( TF_WM, "WM_INITDIALOG\n" ); { LPPROPSHEETPAGE ppsp = (LPPROPSHEETPAGE) lParam; Assert( ppsp ); Assert( ppsp->lParam ); SetWindowLongPtr( hDlg, GWLP_USERDATA, ppsp->lParam ); Edit_LimitText( GetDlgItem( hDlg, IDC_E_DESCRIPTION ), ARRAYSIZE(lpc->_szDescription) - 1 ); Edit_LimitText( GetDlgItem( hDlg, IDC_E_HELPTEXT), ARRAYSIZE(lpc->_szHelpText) - 1 ); // lpc = (LPTHISCLASS) ppsp->lParam;
return TRUE; } break;
case WM_NOTIFY: { LPNMHDR lpnmhdr = (LPNMHDR) lParam; Assert( lpc );
switch ( lpnmhdr->code ) { case PSN_SETACTIVE: TraceMsg( TF_WM, "PSN_SETACTIVE\n" ); if ( !lpc->_fAddSif ) { SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
return TRUE; } else { Assert( lpc->_pszSourcePath ); SetDlgItemText( hDlg, IDC_E_DESCRIPTION, lpc->_szDescription); SetDlgItemText( hDlg, IDC_E_HELPTEXT, lpc->_szHelpText ); if ( !Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_DESCRIPTION ) ) || !Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_HELPTEXT ) ) ) { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK ); } else { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT ); } } break;
case PSN_WIZNEXT: TraceMsg( TF_WM, "PSN_WIZNEXT\n" ); { GetDlgItemText( hDlg, IDC_E_DESCRIPTION, lpc->_szDescription, ARRAYSIZE(lpc->_szDescription) ); GetDlgItemText( hDlg, IDC_E_HELPTEXT, lpc->_szHelpText, ARRAYSIZE(lpc->_szHelpText) ); if ( !VerifySIFText( lpc->_szDescription ) ) { MessageBoxFromStrings( hDlg, IDS_OSCHOOSER_RESTRICTION_FIELDS_TITLE, IDS_OSCHOOSER_RESTRICTION_FIELDS_TEXT, MB_OK ); SetFocus( GetDlgItem( hDlg, IDC_E_DESCRIPTION ) ); SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't change
return TRUE; }
if ( !VerifySIFText( lpc->_szHelpText ) ) { MessageBoxFromStrings( hDlg, IDS_OSCHOOSER_RESTRICTION_FIELDS_TITLE, IDS_OSCHOOSER_RESTRICTION_FIELDS_TEXT, MB_OK ); SetFocus( GetDlgItem( hDlg, IDC_E_HELPTEXT ) ); SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't change
return TRUE; } } break;
case PSN_QUERYCANCEL: TraceMsg( TF_WM, "PSN_QUERYCANCEL\n" ); return lpc->_VerifyCancel( hDlg ); } } break;
case WM_COMMAND: TraceMsg( TF_WM, "WM_COMMAND\n" ); switch ( LOWORD( wParam ) ) { case IDC_E_DESCRIPTION: case IDC_E_HELPTEXT: if ( HIWORD( wParam ) == EN_CHANGE ) { if ( !Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_DESCRIPTION ) ) || !Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_HELPTEXT ) ) ) { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK ); } else { PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT ); } return TRUE; } break; } break; }
return FALSE; }
//
// Page10DlgProc( )
//
INT_PTR CALLBACK THISCLASS::Page10DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LPTHISCLASS lpc = (LPTHISCLASS) GetWindowLongPtr( hDlg, GWLP_USERDATA );
switch ( uMsg ) { case WM_INITDIALOG: TraceMsg( TF_WM, "WM_INITDIALOG\n" ); { LPPROPSHEETPAGE ppsp = (LPPROPSHEETPAGE) lParam; Assert( ppsp ); Assert( ppsp->lParam ); SetWindowLongPtr( hDlg, GWLP_USERDATA, ppsp->lParam ); // lpc = (LPTHISCLASS) ppsp->lParam;
return TRUE; } break;
case WM_NOTIFY: { LPNMHDR lpnmhdr = (LPNMHDR) lParam; Assert( lpc );
switch ( lpnmhdr->code ) { case PSN_SETACTIVE: TraceMsg( TF_WM, "PSN_SETACTIVE\n" ); if ( !lpc->_fAddSif ) { SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
return TRUE; } else { WCHAR szTemp[ MAX_PATH ]; RECT rect;
Assert( lpc->_pszSourcePath ); Assert( lpc->_pszDestPath ); Assert( lpc->_pszSourceImage ); Assert( lpc->_pszDestImage );
SetDlgItemText( hDlg, IDC_E_SOURCE, lpc->_pszSourcePath );
wcsncpy( szTemp, lpc->_pszSourceImage,MAX_PATH ); szTemp[MAX_PATH-1] = L'\0'; GetWindowRect( GetDlgItem( hDlg, IDC_S_SOURCEIMAGE ), &rect ); PathCompactPath( NULL, szTemp, rect.right - rect.left ); SetDlgItemText( hDlg, IDC_S_SOURCEIMAGE, szTemp );
SetDlgItemText( hDlg, IDC_E_DESTINATION, lpc->_pszDestPath );
wcsncpy( szTemp, lpc->_pszDestImage, MAX_PATH ); szTemp[MAX_PATH-1] = L'\0'; GetWindowRect( GetDlgItem( hDlg, IDC_S_DESTIMAGE ), &rect ); PathCompactPath( NULL, szTemp, rect.right - rect.left ); SetDlgItemText( hDlg, IDC_S_DESTIMAGE, szTemp );
PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_FINISH ); } break;
case PSN_WIZFINISH: TraceMsg( TF_WM, "PSN_WIZFINISH\n" ); Assert( lpc->_pszSourcePath ); Assert( lpc->_pszDestPath ); Assert( wcslen( lpc->_pszSourcePath ) <= MAX_PATH ); Assert( wcslen( lpc->_pszDestPath ) <= MAX_PATH ); if ( !CopyFile( lpc->_pszSourcePath, lpc->_pszDestPath, !lpc->_fSIFCanExist ) ) { DWORD dwErr = GetLastError( ); MessageBoxFromError( hDlg, IDS_ERROR_COPYING_FILE, dwErr ); SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't continue;
return TRUE; } else { WCHAR szTemp[ REMOTE_INSTALL_MAX_HELPTEXT_CHAR_COUNT + 2 + 1 ]; Assert( REMOTE_INSTALL_MAX_DESCRIPTION_CHAR_COUNT < REMOTE_INSTALL_MAX_HELPTEXT_CHAR_COUNT ); wsprintf( szTemp, L"\"%s\"", lpc->_szDescription ); WritePrivateProfileString( OSCHOOSER_SIF_SECTION, OSCHOOSER_DESCRIPTION_ENTRY, szTemp, lpc->_pszDestPath ); wsprintf( szTemp, L"\"%s\"", lpc->_szHelpText ); WritePrivateProfileString( OSCHOOSER_SIF_SECTION, OSCHOOSER_HELPTEXT_ENTRY, szTemp, lpc->_pszDestPath ); } break;
case PSN_QUERYCANCEL: TraceMsg( TF_WM, "PSN_QUERYCANCEL\n" ); return lpc->_VerifyCancel( hDlg ); } } break; }
return FALSE; }
//
// Verifies that the user wanted to cancel setup.
//
INT THISCLASS::_VerifyCancel( HWND hParent ) { TraceClsFunc( "_VerifyCancel( ... )\n" );
INT iReturn; BOOL fAbort = FALSE;
iReturn = MessageBoxFromStrings( hParent, IDS_CANCELCAPTION, IDS_CANCELTEXT, MB_YESNO | MB_ICONQUESTION ); if ( iReturn == IDYES ) { fAbort = TRUE; }
SetWindowLongPtr( hParent, DWLP_MSGRESULT, ( fAbort ? 0 : -1 ));
RETURN(!fAbort); }
|