579 lines
13 KiB
C++
579 lines
13 KiB
C++
//
|
|
// Copyright 1997 - Microsoft
|
|
|
|
//
|
|
// IMOS.CPP - Handles the "IntelliMirror OS" IDD_PROP_INTELLIMIRROR_OS tab
|
|
//
|
|
|
|
|
|
#include "pch.h"
|
|
|
|
#include "utils.h"
|
|
#include "cservice.h"
|
|
#include "cenumsif.h"
|
|
#include "imos.h"
|
|
#include "ccomputr.h"
|
|
#include "addwiz.h"
|
|
#include "sifprop.h"
|
|
|
|
DEFINE_MODULE("IMADMUI")
|
|
DEFINE_THISCLASS("CIntelliMirrorOSTab")
|
|
#define THISCLASS CIntelliMirrorOSTab
|
|
#define LPTHISCLASS LPCIntelliMirrorOSTab
|
|
|
|
#define NUM_COLUMNS 4
|
|
|
|
DWORD aImosHelpMap[] = {
|
|
IDC_L_OS, HIDC_L_OS,
|
|
IDC_B_ADD, HIDC_B_ADD,
|
|
IDC_B_REMOVE, HIDC_B_REMOVE,
|
|
IDC_B_PROPERTIES, HIDC_B_PROPERTIES,
|
|
IDC_B_REFRESH, HIDC_B_REFRESH,
|
|
NULL, NULL
|
|
};
|
|
|
|
//
|
|
// CreateInstance()
|
|
//
|
|
LPVOID
|
|
CIntelliMirrorOSTab_CreateInstance( void )
|
|
{
|
|
TraceFunc( "CIntelliMirrorOSTab_CreateInstance()\n" );
|
|
|
|
LPTHISCLASS lpcc = new THISCLASS( );
|
|
HRESULT hr = THR( lpcc->Init( ) );
|
|
|
|
if ( hr )
|
|
{
|
|
delete lpcc;
|
|
RETURN(NULL);
|
|
}
|
|
|
|
RETURN((LPVOID) lpcc);
|
|
}
|
|
|
|
//
|
|
// Constructor
|
|
//
|
|
THISCLASS::THISCLASS( )
|
|
{
|
|
TraceClsFunc( "CIntelliMirrorOSTab()\n" );
|
|
|
|
InterlockIncrement( g_cObjects );
|
|
|
|
TraceFuncExit();
|
|
}
|
|
|
|
//
|
|
// Init()
|
|
//
|
|
STDMETHODIMP
|
|
THISCLASS::Init( )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
TraceClsFunc( "Init()\n" );
|
|
|
|
HRETURN(hr);
|
|
}
|
|
|
|
//
|
|
// Destructor
|
|
//
|
|
THISCLASS::~THISCLASS( )
|
|
{
|
|
TraceClsFunc( "~CIntelliMirrorOSTab()\n" );
|
|
|
|
if ( _punkService )
|
|
_punkService->Release( );
|
|
|
|
// tell ADS to destroy the notify object
|
|
// NOTE: Another property page may do this before us. Ignore errors.
|
|
SendMessage( _hNotify, WM_ADSPROP_NOTIFY_EXIT, 0, 0 );
|
|
|
|
InterlockDecrement( g_cObjects );
|
|
|
|
TraceFuncExit();
|
|
};
|
|
|
|
// *************************************************************************
|
|
//
|
|
// ITab
|
|
//
|
|
// *************************************************************************
|
|
|
|
STDMETHODIMP
|
|
THISCLASS::AddPages(
|
|
LPFNADDPROPSHEETPAGE lpfnAddPage,
|
|
LPARAM lParam,
|
|
LPUNKNOWN punk )
|
|
{
|
|
TraceClsFunc( "AddPages( )\n" );
|
|
|
|
HRESULT hr = S_OK;
|
|
PROPSHEETPAGE psp;
|
|
HPROPSHEETPAGE hpage;
|
|
|
|
psp.dwSize = sizeof(psp);
|
|
psp.dwFlags = PSP_USEREFPARENT | PSP_USECALLBACK;
|
|
psp.hInstance = (HINSTANCE) g_hInstance;
|
|
psp.pszTemplate = MAKEINTRESOURCE(IDD_PROP_INTELLIMIRROR_OS);
|
|
psp.pcRefParent = (UINT *) &g_cObjects;
|
|
psp.pfnCallback = (LPFNPSPCALLBACK) PropSheetPageProc;
|
|
psp.pfnDlgProc = PropSheetDlgProc;
|
|
psp.lParam = (LPARAM) this;
|
|
|
|
hpage = CreatePropertySheetPage( &psp );
|
|
if ( hpage )
|
|
{
|
|
if ( !lpfnAddPage( hpage, lParam ) )
|
|
{
|
|
DestroyPropertySheetPage( hpage );
|
|
hr = THR(E_FAIL);
|
|
goto Error;
|
|
}
|
|
}
|
|
|
|
punk->AddRef( ); // matching Release in the destructor
|
|
_punkService = punk;
|
|
|
|
Error:
|
|
HRETURN(hr);
|
|
}
|
|
|
|
//
|
|
// ReplacePage()
|
|
//
|
|
STDMETHODIMP
|
|
THISCLASS::ReplacePage(
|
|
UINT uPageID,
|
|
LPFNADDPROPSHEETPAGE lpfnReplaceWith,
|
|
LPARAM lParam,
|
|
LPUNKNOWN punk )
|
|
{
|
|
|
|
TraceClsFunc( "ReplacePage( ) *** NOT_IMPLEMENTED ***\n" );
|
|
|
|
HRETURN(E_NOTIMPL);
|
|
}
|
|
|
|
//
|
|
// QueryInformation( )
|
|
//
|
|
STDMETHODIMP
|
|
THISCLASS::QueryInformation(
|
|
LPWSTR pszAttribute,
|
|
LPWSTR * pszResult )
|
|
{
|
|
TraceClsFunc( "QueryInformation( )\n" );
|
|
|
|
HRETURN(E_NOTIMPL);
|
|
}
|
|
|
|
//
|
|
// AllowActivation( )
|
|
//
|
|
STDMETHODIMP
|
|
THISCLASS::AllowActivation(
|
|
BOOL * pfAllow )
|
|
{
|
|
TraceClsFunc( "AllowActivation( )\n" );
|
|
|
|
HRETURN(E_NOTIMPL);
|
|
}
|
|
|
|
// ************************************************************************
|
|
//
|
|
// Property Sheet Functions
|
|
//
|
|
// ************************************************************************
|
|
|
|
|
|
//
|
|
// _InitDialog( )
|
|
//
|
|
BOOL
|
|
THISCLASS::_InitDialog(
|
|
HWND hDlg,
|
|
LPARAM lParam )
|
|
{
|
|
TraceClsFunc( "_InitDialog( )\n" );
|
|
|
|
CWaitCursor Wait;
|
|
|
|
HRESULT hr = S_OK;
|
|
HWND hwndList = GetDlgItem( hDlg, IDC_L_OS );
|
|
|
|
LPUNKNOWN punk = NULL;
|
|
IIntelliMirrorSAP * pimsap = NULL;
|
|
IEnumIMSIFs * penum = NULL;
|
|
LV_COLUMN lvC;
|
|
INT iCount;
|
|
WCHAR szText[ 64 ];
|
|
UINT uColumnWidths[NUM_COLUMNS] = { 225, 75, 75, 75 };
|
|
|
|
if ( hDlg )
|
|
{
|
|
_hDlg = hDlg;
|
|
}
|
|
|
|
Assert( _punkService );
|
|
hr = THR( _punkService->QueryInterface( IID_IIntelliMirrorSAP, (void**) &pimsap ) );
|
|
if (hr) {
|
|
Assert( _fAdmin == FALSE );
|
|
goto Error;
|
|
}
|
|
|
|
hr = THR( pimsap->GetNotifyWindow( &_hNotify ) );
|
|
if (FAILED( hr ))
|
|
goto Error;
|
|
|
|
ADsPropSetHwnd( _hNotify, _hDlg );
|
|
|
|
hr = THR( pimsap->EnumIntelliMirrorOSes( ENUM_READ, &punk ) );
|
|
if (hr)
|
|
{
|
|
Assert( _fAdmin == FALSE );
|
|
goto Error;
|
|
}
|
|
|
|
hr = THR( punk->QueryInterface( IID_IEnumIMSIFs, (void**)&penum ) );
|
|
if (hr)
|
|
{
|
|
Assert( _fAdmin == FALSE );
|
|
goto Error;
|
|
}
|
|
|
|
punk->Release( );
|
|
punk = NULL;
|
|
|
|
ListView_DeleteAllItems( hwndList );
|
|
|
|
// 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;
|
|
|
|
lvC.iSubItem = iCount;
|
|
lvC.cx = uColumnWidths[iCount];
|
|
|
|
i = LoadString( g_hInstance, IDS_OS_COLUMN1 + iCount, szText, ARRAYSIZE (szText) );
|
|
Assert( i );
|
|
|
|
i = ListView_InsertColumn ( hwndList, iCount, &lvC );
|
|
Assert( i != -1 );
|
|
}
|
|
|
|
hr = PopulateListView( hwndList, penum );
|
|
if(FAILED(hr))
|
|
{
|
|
MessageBoxFromStrings( _hDlg,
|
|
IDS_COULDNOTCONTACTSERVER_CAPTION,
|
|
IDS_COULDNOTCONTACTSERVER_TEXT,
|
|
MB_OK | MB_ICONERROR );
|
|
}
|
|
|
|
hr = THR( pimsap->IsAdmin( &_fAdmin ) );
|
|
if (hr) {
|
|
Assert( _fAdmin == FALSE );
|
|
}
|
|
|
|
Cleanup:
|
|
if ( penum )
|
|
penum->Release( );
|
|
if ( pimsap )
|
|
pimsap->Release( );
|
|
if ( punk )
|
|
punk->Release( );
|
|
|
|
EnableWindow( hwndList, _fAdmin );
|
|
|
|
HRETURN(hr);
|
|
|
|
Error:
|
|
switch (hr) {
|
|
case S_OK:
|
|
break;
|
|
default:
|
|
MessageBoxFromHResult( NULL, IDS_ERROR_OPENNINGGROUPOBJECT, hr );
|
|
break;
|
|
}
|
|
goto Cleanup;
|
|
}
|
|
|
|
//
|
|
// _OnSelectionChanged( )
|
|
//
|
|
HRESULT
|
|
THISCLASS::_OnSelectionChanged( )
|
|
{
|
|
TraceClsFunc( "_OnSelectionChanged( )\n" );
|
|
|
|
HRESULT hr = S_OK;
|
|
UINT iItems = ListView_GetSelectedCount( GetDlgItem( _hDlg, IDC_L_OS ) );
|
|
EnableWindow( GetDlgItem( _hDlg, IDC_B_REMOVE ), !!iItems );
|
|
EnableWindow( GetDlgItem( _hDlg, IDC_B_PROPERTIES ), !!iItems );
|
|
//EnableWindow( GetDlgItem( _hDlg, IDC_B_ADD ), !!iItems );
|
|
|
|
HRETURN( hr );
|
|
}
|
|
|
|
//
|
|
// _OnCommand( )
|
|
//
|
|
BOOL
|
|
THISCLASS::_OnCommand( WPARAM wParam, LPARAM lParam )
|
|
{
|
|
TraceClsFunc( "_OnCommand( " );
|
|
TraceMsg( TF_FUNC, "wParam = 0x%08x, lParam = 0x%08x )\n", wParam, lParam );
|
|
|
|
HRESULT hr = S_FALSE;
|
|
HWND hwndCtl = (HWND) lParam;
|
|
|
|
switch( LOWORD(wParam) )
|
|
{
|
|
case IDC_B_PROPERTIES:
|
|
if ( HIWORD( wParam ) == BN_CLICKED ) {
|
|
LVITEM lvi;
|
|
HWND hwndList = GetDlgItem( _hDlg, IDC_L_OS );
|
|
lvi.iItem = ListView_GetNextItem( hwndList, -1, LVNI_SELECTED );
|
|
|
|
if ( lvi.iItem != -1 )
|
|
{
|
|
lvi.iSubItem = 0;
|
|
lvi.mask = LVIF_PARAM;
|
|
ListView_GetItem( hwndList, &lvi );
|
|
|
|
Assert(lvi.lParam);
|
|
hr = CSifProperties_CreateInstance( _hDlg, MAKEINTRESOURCE(IDD_SIF_PROP_IMAGES), (LPSIFINFO) lvi.lParam );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_B_REFRESH:
|
|
hr = S_OK;
|
|
break;
|
|
|
|
case IDC_B_REMOVE:
|
|
if ( HIWORD( wParam ) == BN_CLICKED ) {
|
|
LVITEM lvi;
|
|
UINT iResult;
|
|
HWND hwndList = GetDlgItem( _hDlg, IDC_L_OS );
|
|
lvi.iItem = ListView_GetNextItem( hwndList, -1, LVNI_SELECTED );
|
|
|
|
iResult = MessageBoxFromStrings( _hDlg, IDS_AREYOUSURE_CAPTION, IDS_DELETESIF_TEXT, MB_YESNO );
|
|
if ( iResult == IDYES )
|
|
{
|
|
if ( lvi.iItem != -1 )
|
|
{
|
|
HRESULT hr;
|
|
LPSIFINFO psif;
|
|
|
|
lvi.iSubItem = 0;
|
|
lvi.mask = LVIF_PARAM;
|
|
ListView_GetItem( hwndList, &lvi );
|
|
|
|
psif = (LPSIFINFO)lvi.lParam;
|
|
|
|
if ( !DeleteFile( psif->pszFilePath ) )
|
|
{
|
|
::MessageBoxFromError( _hDlg, 0, GetLastError() );
|
|
hr = E_FAIL;
|
|
} else {
|
|
ListView_DeleteItem( hwndList, lvi.iItem );
|
|
hr = S_FALSE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_B_ADD:
|
|
if ( HIWORD( wParam ) == BN_CLICKED ) {
|
|
hr = CAddWiz_CreateInstance( _hDlg, _punkService );
|
|
}
|
|
break;
|
|
}
|
|
|
|
if ( hr == S_OK )
|
|
{
|
|
HWND hwndList = GetDlgItem(_hDlg, IDC_L_OS);
|
|
IIntelliMirrorSAP * pimsap = NULL;
|
|
hr = THR( _punkService->QueryInterface( IID_IIntelliMirrorSAP, (void**) &pimsap ) );
|
|
if (hr == S_OK)
|
|
{
|
|
IEnumIMSIFs * penum = NULL;
|
|
hr = THR( pimsap->EnumIntelliMirrorOSes( ENUM_READ, (LPUNKNOWN*)&penum ) );
|
|
if ( hr == S_OK )
|
|
{
|
|
hr = PopulateListView( hwndList, penum);
|
|
penum->Release();
|
|
}
|
|
pimsap->Release();
|
|
}
|
|
|
|
// See if we still have a selection
|
|
_OnSelectionChanged( );
|
|
}
|
|
|
|
HRETURN(hr);
|
|
}
|
|
|
|
//
|
|
// _OnNotify( )
|
|
//
|
|
INT
|
|
THISCLASS::_OnNotify(
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
TraceClsFunc( "_OnNotify( " );
|
|
TraceMsg( TF_FUNC, "wParam = 0x%08x, lParam = 0x%08x )\n", wParam, lParam );
|
|
|
|
LPNMHDR lpnmhdr = (LPNMHDR) lParam;
|
|
|
|
switch( lpnmhdr->code )
|
|
{
|
|
case PSN_APPLY:
|
|
TraceMsg( TF_WM, TEXT("WM_NOTIFY: PSN_APPLY\n"));
|
|
// Tell DSA that someone hit Apply
|
|
SendMessage( _hNotify, WM_ADSPROP_NOTIFY_APPLY, 0, 0 );
|
|
SetWindowLongPtr( _hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
|
|
RETURN(TRUE);
|
|
|
|
case LVN_ITEMCHANGED:
|
|
{
|
|
_OnSelectionChanged( );
|
|
}
|
|
break;
|
|
|
|
case LVN_DELETEALLITEMS:
|
|
DebugMsg( "LVN_DELETEALLITEMS - Deleting all items.\n" );
|
|
RETURN(FALSE);
|
|
|
|
case LVN_DELETEITEM:
|
|
{
|
|
LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam;
|
|
LPSIFINFO psif = (LPSIFINFO) pnmv->lParam;
|
|
Assert( psif );
|
|
|
|
if ( psif )
|
|
{
|
|
TraceFree( psif->pszArchitecture );
|
|
TraceFree( psif->pszDescription );
|
|
TraceFree( psif->pszDirectory );
|
|
TraceFree( psif->pszFilePath );
|
|
TraceFree( psif->pszHelpText );
|
|
TraceFree( psif->pszImageType );
|
|
TraceFree( psif->pszLanguage );
|
|
TraceFree( psif->pszVersion );
|
|
TraceFree( psif->pszImageFile );
|
|
TraceFree( psif );
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
RETURN(FALSE);
|
|
}
|
|
|
|
//
|
|
// PropSheetDlgProc()
|
|
//
|
|
INT_PTR CALLBACK
|
|
THISCLASS::PropSheetDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
//TraceMsg( TEXT("PropSheetDlgProc(") );
|
|
//TraceMsg( TF_FUNC, TEXT(" hDlg = 0x%08x, uMsg = 0x%08x, wParam = 0x%08x, lParam = 0x%08x )\n"),
|
|
// hDlg, uMsg, wParam, lParam );
|
|
|
|
LPTHISCLASS pcc = (LPTHISCLASS) GetWindowLongPtr( hDlg, GWLP_USERDATA );
|
|
|
|
if ( uMsg == WM_INITDIALOG )
|
|
{
|
|
TraceMsg( TF_WM, "WM_INITDIALOG\n" );
|
|
|
|
LPPROPSHEETPAGE psp = (LPPROPSHEETPAGE) lParam;
|
|
SetWindowLongPtr( hDlg, GWLP_USERDATA, psp->lParam );
|
|
pcc = (LPTHISCLASS) psp->lParam;
|
|
pcc->_InitDialog( hDlg, lParam );
|
|
}
|
|
|
|
if (pcc)
|
|
{
|
|
Assert( hDlg == pcc->_hDlg );
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_NOTIFY:
|
|
return pcc->_OnNotify( wParam, lParam );
|
|
|
|
case WM_COMMAND:
|
|
TraceMsg( TF_WM, "WM_COMMAND\n" );
|
|
return pcc->_OnCommand( wParam, lParam );
|
|
break;
|
|
|
|
case WM_HELP:// F1
|
|
{
|
|
LPHELPINFO phelp = (LPHELPINFO) lParam;
|
|
WinHelp( (HWND) phelp->hItemHandle, g_cszHelpFile, HELP_WM_HELP, (DWORD_PTR) &aImosHelpMap );
|
|
}
|
|
break;
|
|
|
|
case WM_CONTEXTMENU: // right mouse click
|
|
WinHelp((HWND) wParam, g_cszHelpFile, HELP_CONTEXTMENU, (DWORD_PTR) &aImosHelpMap );
|
|
break;
|
|
|
|
case WM_ADSPROP_PAGE_GET_NOTIFY:
|
|
{
|
|
HWND *phwnd = (HWND *) wParam;
|
|
*phwnd = pcc->_hNotify;
|
|
}
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// PropSheetPageProc()
|
|
//
|
|
UINT CALLBACK
|
|
THISCLASS::PropSheetPageProc(
|
|
HWND hwnd,
|
|
UINT uMsg,
|
|
LPPROPSHEETPAGE ppsp )
|
|
{
|
|
TraceClsFunc( "PropSheetPageProc( " );
|
|
TraceMsg( TF_FUNC, TEXT("hwnd = 0x%08x, uMsg = 0x%08x, ppsp= 0x%08x )\n"),
|
|
hwnd, uMsg, ppsp );
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case PSPCB_CREATE:
|
|
RETURN(TRUE); // create it
|
|
break;
|
|
|
|
case PSPCB_RELEASE:
|
|
LPTHISCLASS pcc = (LPTHISCLASS) ppsp->lParam;
|
|
delete pcc;
|
|
break;
|
|
}
|
|
|
|
RETURN(FALSE);
|
|
}
|
|
|