You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2678 lines
89 KiB
2678 lines
89 KiB
//
|
|
// 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);
|
|
}
|
|
|