Windows-Server-2003/inetsrv/query/admin/propsht.cxx

2013 lines
69 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 2000.
//
// File: Propsht.cxx
//
// Contents: Property sheets for for CI snapin.
//
// History: 26-Nov-1996 KyleP Created
//
//--------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <cimbmgr.hxx>
#include <strres.hxx>
#include <ciares.h>
#include <propsht.hxx>
#include <catalog.hxx>
#include <prop.hxx>
#include <strings.hxx>
//
// Local prototypes
//
void InitVTList( HWND hwndCombo );
void InitVSList( HWND hwndComboVS, HWND hwndComboNNTP, CCatalog const & cat,
ULONG & cVServers, ULONG & cNNTPServers );
void InitStorageLevelList( HWND hwndCombo );
void DisplayError( HWND hwnd, CException & e );
BOOL GetDlgItemXArrayText( HWND hwndDlg, USHORT idCtrl, XArray<WCHAR> & xawcText );
DWORD VSToIndex( HWND hwndDlg, DWORD dwItem, ULONG ulVS, BOOL fTrack );
UINT DBTypeToVT(UINT uidbt);
CIndexSrvPropertySheet0::CIndexSrvPropertySheet0( HINSTANCE hInstance,
LONG_PTR hMmcNotify,
CCatalogs * pCats )
: _pCats( pCats ),
_fFirstActive( TRUE ),
_hMmcNotify( hMmcNotify )
{
_PropSheet.dwSize = sizeof( *this );
_PropSheet.dwFlags = PSP_USETITLE;
_PropSheet.hInstance = hInstance;
_PropSheet.pszTemplate = MAKEINTRESOURCE(IDP_IS_PAGE0);
_PropSheet.pszTitle = MAKEINTRESOURCE(IDP_IS_PAGE0_TITLE);
_PropSheet.pfnDlgProc = CIndexSrvPropertySheet0::DlgProc;
_PropSheet.lParam = (LPARAM)this;
_hPropSheet = CreatePropertySheetPage( &_PropSheet );
}
CIndexSrvPropertySheet0::~CIndexSrvPropertySheet0()
{
}
INT_PTR APIENTRY CIndexSrvPropertySheet0::DlgProc( HWND hwndDlg,
UINT message,
WPARAM wParam,
LPARAM lParam )
{
BOOL fRet = FALSE;
TRY
{
switch ( message )
{
case WM_INITDIALOG:
{
ciaDebugOut(( DEB_ITRACE, "CIndexSrvPropertySheet0::DlgProc -- WM_INITDIALOG\n" ));
LONG_PTR lthis = ((CIndexSrvPropertySheet0 *)lParam)->_PropSheet.lParam;
CIndexSrvPropertySheet0 * pthis = (CIndexSrvPropertySheet0 *)lthis;
SetWindowLongPtr( hwndDlg, DWLP_USER, lthis );
//
// Default to local machine.
//
CheckRadioButton( hwndDlg,
IDDI_LOCAL_COMPUTER,
IDDI_REMOTE_COMPUTER,
IDDI_LOCAL_COMPUTER );
EnableWindow( GetDlgItem( hwndDlg, IDDI_COMPNAME ), FALSE );
fRet = TRUE;
break;
}
case WM_COMMAND:
{
switch ( LOWORD( wParam ) )
{
case IDDI_LOCAL_COMPUTER:
{
if ( BN_CLICKED == HIWORD(wParam) )
{
EnableWindow( GetDlgItem( hwndDlg, IDDI_COMPNAME ), FALSE );
PropSheet_SetWizButtons( GetParent(hwndDlg), PSWIZB_FINISH );
fRet = TRUE;
}
break;
}
case IDDI_REMOTE_COMPUTER:
{
if ( BN_CLICKED == HIWORD(wParam) )
{
EnableWindow( GetDlgItem( hwndDlg, IDDI_COMPNAME ), TRUE );
//
// If we have a string, then enable finish button.
//
XArray<WCHAR> xawcTemp;
if ( GetDlgItemXArrayText( hwndDlg, IDDI_COMPNAME, xawcTemp ) &&
xawcTemp.Count() > 0 )
{
PropSheet_SetWizButtons( GetParent(hwndDlg), PSWIZB_FINISH );
}
else
{
PropSheet_SetWizButtons( GetParent(hwndDlg), PSWIZB_DISABLEDFINISH );
}
fRet = TRUE;
}
break;
}
case IDDI_COMPNAME:
{
if ( EN_CHANGE == HIWORD(wParam) )
{
//
// If we have a string, then enable finish button.
//
XArray<WCHAR> xawcTemp;
if ( GetDlgItemXArrayText( hwndDlg, IDDI_COMPNAME, xawcTemp ) &&
xawcTemp.Count() > 0 )
{
PropSheet_SetWizButtons( GetParent(hwndDlg), PSWIZB_FINISH );
}
else
{
PropSheet_SetWizButtons( GetParent(hwndDlg), PSWIZB_DISABLEDFINISH );
}
fRet = TRUE;
}
break;
}
/* Help is not being used...
case IDHELP:
{
DisplayHelp( hwndDlg, HIDD_CONNECT_TO_COMPUTER );
break;
}
*/
} // switch
break;
}
case WM_HELP:
{
HELPINFO *phi = (HELPINFO *) lParam;
ciaDebugOut(( DEB_ITRACE, "CIndexSrvPropertySheet0 WM_HELP contexttype: '%s', ctlid: %d, contextid: %d\n",
phi->iContextType == HELPINFO_MENUITEM ? "menu" : "window",
phi->iCtrlId, phi->dwContextId ));
if ( HELPINFO_WINDOW == phi->iContextType )
{
switch ( phi->iCtrlId )
{
case IDDI_STATIC:
break;
default :
DisplayPopupHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_WM_HELP);
break;
}
}
break;
}
case WM_CONTEXTMENU:
{
DisplayPopupHelp((HWND)wParam, HELP_CONTEXTMENU);
break;
}
case WM_NOTIFY:
{
CIndexSrvPropertySheet0 * pthis = (CIndexSrvPropertySheet0 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
switch ( ((LPNMHDR) lParam)->code )
{
case PSN_KILLACTIVE:
{
// Allow loss of activation
SetWindowLongPtr( hwndDlg, DWLP_MSGRESULT, FALSE );
fRet = TRUE;
break;
}
case PSN_SETACTIVE:
{
if ( pthis->_fFirstActive )
{
PropSheet_SetWizButtons( GetParent(hwndDlg), PSWIZB_FINISH );
pthis->_fFirstActive = FALSE;
}
else
{
// Go to next page
SetWindowLongPtr( hwndDlg, DWLP_MSGRESULT, -1 );
}
fRet = TRUE;
break;
}
case PSN_WIZBACK:
{
// Allow previous page
SetWindowLongPtr( hwndDlg, DWLP_MSGRESULT, PSNRET_NOERROR );
fRet = TRUE;
break;
}
case PSN_WIZNEXT:
{
// Allow next page
SetWindowLongPtr( hwndDlg, DWLP_MSGRESULT, PSNRET_NOERROR );
fRet = TRUE;
break;
}
case PSN_WIZFINISH:
{
TRY
{
XArray<WCHAR> xawcCompName;
if ( IsDlgButtonChecked( hwndDlg, IDDI_LOCAL_COMPUTER ) )
pthis->_pCats->SetMachine( L"." );
else
{
if ( GetDlgItemXArrayText( hwndDlg, IDDI_COMPNAME, xawcCompName ) )
{
pthis->_pCats->SetMachine( xawcCompName.GetPointer() );
}
}
MMCPropertyChangeNotify( pthis->_hMmcNotify, 0 );
fRet = TRUE;
}
CATCH( CException, e )
{
// The only error caught here is a result of an invalid
// machine name.
Win4Assert(e.GetErrorCode() == E_INVALIDARG);
MessageBox( hwndDlg,
STRINGRESOURCE( srInvalidComputerName ),
STRINGRESOURCE( srIndexServerCmpManage ),
MB_OK | MB_ICONINFORMATION );
}
END_CATCH
break;
}
} // switch
break;
}
case WM_DESTROY:
{
CIndexSrvPropertySheet0 * pthis = (CIndexSrvPropertySheet0 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
MMCFreeNotifyHandle( pthis->_hMmcNotify );
delete pthis;
fRet = TRUE;
break;
}
} // switch
}
CATCH( CException, e )
{
ciaDebugOut(( DEB_ERROR, "CIndexSrvPropertySheet0: Caught 0x%x\n", e.GetErrorCode() ));
fRet = FALSE;
}
END_CATCH
return fRet;
}
CIndexSrvPropertySheet1::CIndexSrvPropertySheet1( HINSTANCE hInstance,
LONG_PTR hMmcNotify,
CCatalog * pCat )
: _pCat( pCat ),
_pCats( 0 ),
_hMmcNotify( hMmcNotify )
{
_PropSheet.dwSize = sizeof( *this );
_PropSheet.dwFlags = PSP_USETITLE;
_PropSheet.hInstance = hInstance;
_PropSheet.pszTemplate = MAKEINTRESOURCE(IDP_IS_PAGE1);
_PropSheet.pszTitle = MAKEINTRESOURCE(IDP_IS_PAGE1_TITLE);
_PropSheet.pfnDlgProc = CIndexSrvPropertySheet1::DlgProc;
_PropSheet.lParam = (LPARAM)this;
_hPropSheet = CreatePropertySheetPage( &_PropSheet );
}
CIndexSrvPropertySheet1::CIndexSrvPropertySheet1( HINSTANCE hInstance,
LONG_PTR hMmcNotify,
CCatalogs * pCats )
: _pCat( 0 ),
_pCats( pCats ),
_hMmcNotify( hMmcNotify )
{
_PropSheet.dwSize = sizeof( *this );
_PropSheet.dwFlags = PSP_USETITLE;
_PropSheet.hInstance = hInstance;
_PropSheet.pszTemplate = MAKEINTRESOURCE(IDP_IS_PAGE1);
_PropSheet.pszTitle = MAKEINTRESOURCE(IDP_IS_PAGE1_TITLE);
_PropSheet.pfnDlgProc = CIndexSrvPropertySheet1::DlgProc;
_PropSheet.lParam = (LPARAM)this;
_hPropSheet = CreatePropertySheetPage( &_PropSheet );
}
CIndexSrvPropertySheet1::~CIndexSrvPropertySheet1()
{
}
INT_PTR APIENTRY CIndexSrvPropertySheet1::DlgProc( HWND hwndDlg,
UINT message,
WPARAM wParam,
LPARAM lParam )
{
BOOL fRet = FALSE;
TRY
{
switch ( message )
{
case WM_HELP:
{
HELPINFO *phi = (HELPINFO *) lParam;
ciaDebugOut(( DEB_ITRACE, "CIndexSrvPropertySheet1 WM_HELP contexttype: '%s', ctlid: %d, contextid: %d\n",
phi->iContextType == HELPINFO_MENUITEM ? "menu" : "window",
phi->iCtrlId, phi->dwContextId ));
if ( HELPINFO_WINDOW == phi->iContextType )
{
switch ( phi->iCtrlId )
{
case IDDI_STATIC:
break;
default :
DisplayPopupHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_WM_HELP);
break;
}
}
break;
}
case WM_CONTEXTMENU:
{
DisplayPopupHelp((HWND)wParam, HELP_CONTEXTMENU);
break;
}
case WM_INITDIALOG:
{
ciaDebugOut(( DEB_ITRACE, "CIndexSrvPropertySheet1::DlgProc -- WM_INITDIALOG\n" ));
LONG_PTR lthis = ((CIndexSrvPropertySheet1 *)lParam)->_PropSheet.lParam;
CIndexSrvPropertySheet1 * pthis = (CIndexSrvPropertySheet1 *)lthis;
SetWindowLongPtr( hwndDlg, DWLP_USER, lthis );
BOOL fUnknown;
BOOL fGenerateCharacterization;
ULONG ccCharacterization;
if ( pthis->IsTrackingCatalog() )
{
pthis->_pCat->GetGeneration( fUnknown, fGenerateCharacterization, ccCharacterization );
// Look in the registry for Group1 params. If at least one of them is listed
// we should uncheck the "Inherit" checkbox. Otherwise
// (if none of them is listed), we should check the box.
SendDlgItemMessage( hwndDlg,
IDDI_INHERIT1,
BM_SETCHECK,
pthis->_pCat->DoGroup1SettingsExist() ? BST_UNCHECKED : BST_CHECKED,
0 );
// If at least one setting exists, add the others in the group.
// We don't want to have an incomplete set.
if (pthis->_pCat->DoGroup1SettingsExist())
pthis->_pCat->FillGroup1Settings();
}
else
{
// Hide the "Inherit" checkbox because it is not applicable here
ShowWindow(GetDlgItem(hwndDlg, IDDI_INHERIT1), SW_HIDE);
pthis->_pCats->GetGeneration( fUnknown, fGenerateCharacterization, ccCharacterization );
}
SendDlgItemMessage( hwndDlg,
IDDI_FILTER_UNKNOWN,
BM_SETCHECK,
fUnknown ? BST_CHECKED : BST_UNCHECKED,
0 );
SendDlgItemMessage( hwndDlg,
IDDI_CHARACTERIZATION,
BM_SETCHECK,
fGenerateCharacterization ? BST_CHECKED : BST_UNCHECKED,
0 );
WCHAR wcsSize[120];
_ultow( ccCharacterization, wcsSize, 10 );
SetDlgItemText( hwndDlg, IDDI_CHARACTERIZATION_SIZE, wcsSize );
SendDlgItemMessage( hwndDlg,
IDDI_SPIN_CHARACTERIZATION,
UDM_SETRANGE,
0,
(LPARAM) MAKELONG( 10000, 10) );
// If the generate characterization checkbox is unchecked, we should disable the
// characterization size controls
if (!fGenerateCharacterization)
{
EnableWindow(GetDlgItem(hwndDlg, IDDI_CHARACTERIZATION_SIZE), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDDI_SPIN_CHARACTERIZATION), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDDI_STATIC2), FALSE);
}
// If we are inheriting, we should disable the local setting.
if ( pthis->IsTrackingCatalog() && !pthis->_pCat->DoGroup1SettingsExist())
{
EnableWindow(GetDlgItem(hwndDlg, IDDI_FILTER_UNKNOWN), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDDI_CHARACTERIZATION), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDDI_CHARACTERIZATION_SIZE), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDDI_SPIN_CHARACTERIZATION), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDDI_STATIC2), FALSE);
}
fRet = TRUE;
break;
}
case WM_COMMAND:
{
BOOL fChanged = FALSE;
BOOL fCorrected = TRUE;
switch ( LOWORD( wParam ) )
{
case IDDI_CHARACTERIZATION:
if (BN_CLICKED == HIWORD(wParam))
{
BOOL fGenChar = ( BST_CHECKED == SendDlgItemMessage( hwndDlg,
IDDI_CHARACTERIZATION,
BM_GETCHECK, 0, 0 ) );
EnableWindow(GetDlgItem(hwndDlg, IDDI_CHARACTERIZATION_SIZE), fGenChar);
EnableWindow(GetDlgItem(hwndDlg, IDDI_SPIN_CHARACTERIZATION), fGenChar);
EnableWindow(GetDlgItem(hwndDlg, IDDI_STATIC2), fGenChar);
if( 0 != GetWindowLongPtr( hwndDlg, DWLP_USER ) )
{
fChanged = TRUE;
fRet = TRUE;
}
}
break;
case IDDI_FILTER_UNKNOWN:
{
if ( BN_CLICKED == HIWORD(wParam) )
fChanged = TRUE;
// Fall through
}
case IDDI_CHARACTERIZATION_SIZE:
{
if ( EN_KILLFOCUS == HIWORD(wParam) && LOWORD( wParam ) == IDDI_CHARACTERIZATION_SIZE )
{
fRet = TRUE;
ULONG ulVal = 10;
// Validate the number
XArray<WCHAR> xawcTemp;
if ( (LOWORD(wParam) == IDDI_CHARACTERIZATION_SIZE) &&
GetDlgItemXArrayText( hwndDlg, IDDI_CHARACTERIZATION_SIZE, xawcTemp ) &&
xawcTemp.Count() > 0 )
{
// verify that all characters are digits
ULONG ulLen = wcslen(xawcTemp.GetPointer());
// When correcting, let's do our best
ulVal = _wtoi(xawcTemp.GetPointer());
for (ULONG i = 0; i < ulLen; i++)
{
if (!iswdigit(xawcTemp[i]))
break;
}
if (i == ulLen)
{
// verify that the number is within range
ulVal = _wtoi(xawcTemp.GetPointer());
if (ulVal <= 10000 && ulVal >= 10)
{
fCorrected = FALSE;
}
else
ulVal = (ulVal < 10) ? 10 : 10000;
}
}
if (fCorrected)
{
WCHAR wszBuff[20]; // use this instead of a potentially empty xawcTemp
ciaDebugOut((DEB_ITRACE, "%ws is NOT a valid number\n", xawcTemp.GetPointer()));
MessageBeep(MB_ICONHAND);
SetWindowText((HWND)lParam, _itow(ulVal, wszBuff, 10));
SendMessage((HWND)lParam, EM_SETSEL, 0, -1);
}
}
else if ( EN_CHANGE == HIWORD(wParam) && ( 0 != GetWindowLongPtr( hwndDlg, DWLP_USER )) )
{
fChanged = TRUE;
fRet = TRUE;
}
break;
}
case IDDI_INHERIT1:
{
if ( EN_CHANGE == HIWORD(wParam) || BN_CLICKED == HIWORD(wParam) )
{
if ( 0 != GetWindowLongPtr( hwndDlg, DWLP_USER ) )
{
fChanged = TRUE;
fRet = TRUE;
// If the Inherit Settings button is checked, we should remove the registry entries from the catalog's
// settings so the values will be inherited from the service.
BOOL fInherit = ( BST_CHECKED == SendDlgItemMessage( hwndDlg, IDDI_INHERIT1, BM_GETCHECK, 0, 0 ) );
BOOL fUnknown = FALSE, fGenerateCharacterization = FALSE;
DWORD ccCharacterization = 0;
CIndexSrvPropertySheet1 * pthis = (CIndexSrvPropertySheet1 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
if ( !pthis->IsTrackingCatalog() )
break;
if (fInherit)
{
Win4Assert(pthis->IsTrackingCatalog());
pthis->_pCat->GetParent().GetGeneration( fUnknown, fGenerateCharacterization, ccCharacterization );
}
else
{
pthis->_pCat->GetGeneration( fUnknown, fGenerateCharacterization, ccCharacterization );
// Enable so we can set controls
EnableWindow(GetDlgItem(hwndDlg, IDDI_FILTER_UNKNOWN), TRUE);
EnableWindow(GetDlgItem(hwndDlg, IDDI_CHARACTERIZATION), TRUE);
EnableWindow(GetDlgItem(hwndDlg, IDDI_CHARACTERIZATION_SIZE), TRUE);
EnableWindow(GetDlgItem(hwndDlg, IDDI_SPIN_CHARACTERIZATION), TRUE);
EnableWindow(GetDlgItem(hwndDlg, IDDI_STATIC2), TRUE);
}
SendDlgItemMessage( hwndDlg,
IDDI_FILTER_UNKNOWN,
BM_SETCHECK,
fUnknown ? BST_CHECKED : BST_UNCHECKED,
0 );
SendDlgItemMessage( hwndDlg,
IDDI_CHARACTERIZATION,
BM_SETCHECK,
fGenerateCharacterization ? BST_CHECKED : BST_UNCHECKED,
0 );
WCHAR wcsSize[12];
_ultow( ccCharacterization, wcsSize, 10 );
SetDlgItemText( hwndDlg, IDDI_CHARACTERIZATION_SIZE, wcsSize );
// Enable/Disable controls if we need to
EnableWindow(GetDlgItem(hwndDlg, IDDI_FILTER_UNKNOWN), !fInherit);
EnableWindow(GetDlgItem(hwndDlg, IDDI_CHARACTERIZATION), !fInherit);
EnableWindow(GetDlgItem(hwndDlg, IDDI_CHARACTERIZATION_SIZE), !fInherit);
EnableWindow(GetDlgItem(hwndDlg, IDDI_SPIN_CHARACTERIZATION), !fInherit);
EnableWindow(GetDlgItem(hwndDlg, IDDI_STATIC2), !fInherit);
}
}
}
} // switch
if ( fChanged )
PropSheet_Changed( GetParent(hwndDlg), hwndDlg );
break;
} // case
case WM_NOTIFY:
{
switch ( ((LPNMHDR) lParam)->code )
{
case PSN_APPLY:
{
TRY
{
CIndexSrvPropertySheet1 * pthis = (CIndexSrvPropertySheet1 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
BOOL fUnknown = ( BST_CHECKED == SendDlgItemMessage( hwndDlg, IDDI_FILTER_UNKNOWN, BM_GETSTATE, 0, 0 ) );
BOOL fGenerateCharacterization = ( BST_CHECKED == SendDlgItemMessage( hwndDlg, IDDI_CHARACTERIZATION, BM_GETSTATE, 0, 0 ) );
WCHAR wcsSize[12];
GetDlgItemText( hwndDlg, IDDI_CHARACTERIZATION_SIZE, wcsSize, sizeof(wcsSize)/sizeof(WCHAR) );
ULONG ccCharacterization = wcstoul( wcsSize, 0, 10 );
if ( pthis->IsTrackingCatalog() )
{
// If the Inherit Settings button is checked, we should remove the registry entries from the catalog's
// settings so the values will be inherited from the service.
BOOL fInherit = ( BST_CHECKED == SendDlgItemMessage( hwndDlg, IDDI_INHERIT1, BM_GETSTATE, 0, 0 ) );
if (fInherit)
pthis->_pCat->DeleteGroup1Settings();
else
pthis->_pCat->SetGeneration( fUnknown, fGenerateCharacterization, ccCharacterization );
// Set the values and enable or disable the local controls as appropriate
pthis->_pCat->GetGeneration( fUnknown, fGenerateCharacterization, ccCharacterization );
SendDlgItemMessage( hwndDlg,
IDDI_FILTER_UNKNOWN,
BM_SETCHECK,
fUnknown ? BST_CHECKED : BST_UNCHECKED,
0 );
SendDlgItemMessage( hwndDlg,
IDDI_CHARACTERIZATION,
BM_SETCHECK,
fGenerateCharacterization ? BST_CHECKED : BST_UNCHECKED,
0 );
WCHAR wcsSize[12];
_ultow( ccCharacterization, wcsSize, 10 );
SetDlgItemText( hwndDlg, IDDI_CHARACTERIZATION_SIZE, wcsSize);
EnableWindow(GetDlgItem(hwndDlg, IDDI_FILTER_UNKNOWN), !fInherit);
EnableWindow(GetDlgItem(hwndDlg, IDDI_CHARACTERIZATION), !fInherit);
EnableWindow(GetDlgItem(hwndDlg, IDDI_CHARACTERIZATION_SIZE), !fInherit);
EnableWindow(GetDlgItem(hwndDlg, IDDI_SPIN_CHARACTERIZATION), !fInherit);
EnableWindow(GetDlgItem(hwndDlg, IDDI_STATIC2), !fInherit);
}
else
pthis->_pCats->SetGeneration( fUnknown, fGenerateCharacterization, ccCharacterization );
MMCPropertyChangeNotify( pthis->_hMmcNotify, 0 );
fRet = TRUE;
}
CATCH( CException, e )
{
DisplayError( hwndDlg, e );
}
END_CATCH
break;
}
} // switch
break;
}
case WM_DESTROY:
{
CIndexSrvPropertySheet1 * pthis = (CIndexSrvPropertySheet1 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
//
// Only gets called on *one* property page!
//
// MMCFreeNotifyHandle( pthis->_hMmcNotify );
delete pthis;
fRet = TRUE;
break;
}
} // switch
}
CATCH( CException, e )
{
ciaDebugOut(( DEB_ERROR, "CIndexSrvPropertySheet1: Caught 0x%x\n", e.GetErrorCode() ));
fRet = FALSE;
}
END_CATCH
return fRet;
}
CCatalogBasicPropertySheet::CCatalogBasicPropertySheet( HINSTANCE hInstance,
LONG_PTR hMmcNotify,
CCatalog const * pCat )
: _pCat( pCat ),
_hMmcNotify( hMmcNotify )
{
_PropSheet.dwSize = sizeof( *this );
_PropSheet.dwFlags = PSP_USETITLE;
_PropSheet.hInstance = hInstance;
_PropSheet.pszTemplate = MAKEINTRESOURCE(IDP_CATALOG_PAGE1);
_PropSheet.pszTitle = MAKEINTRESOURCE(IDP_CATALOG_PAGE1_TITLE);
_PropSheet.pfnDlgProc = CCatalogBasicPropertySheet::DlgProc;
_PropSheet.lParam = (LPARAM)this;
_hPropSheet = CreatePropertySheetPage( &_PropSheet );
}
CCatalogBasicPropertySheet::~CCatalogBasicPropertySheet()
{
}
INT_PTR APIENTRY CCatalogBasicPropertySheet::DlgProc( HWND hwndDlg,
UINT message,
WPARAM wParam,
LPARAM lParam )
{
BOOL fRet = FALSE;
TRY
{
switch ( message )
{
case WM_HELP:
{
HELPINFO *phi = (HELPINFO *) lParam;
ciaDebugOut(( DEB_ITRACE,
"CCatalogBasicPropertySheet::DlgProc -- WM_HELP: wp 0x%x, lp 0x%x\n",
wParam, lParam ));
if ( HELPINFO_WINDOW == phi->iContextType )
{
switch ( phi->iCtrlId )
{
case IDDI_STATIC:
break;
default :
DisplayPopupHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_WM_HELP);
break;
}
}
break;
}
case WM_CONTEXTMENU:
{
DisplayPopupHelp((HWND)wParam, HELP_CONTEXTMENU);
break;
}
case WM_INITDIALOG:
{
ciaDebugOut(( DEB_ITRACE, "CCatalogBasicPropertySheet::DlgProc -- WM_INITDIALOG\n" ));
LONG_PTR lthis = ((CCatalogBasicPropertySheet *)lParam)->_PropSheet.lParam;
SetWindowLongPtr( hwndDlg, DWLP_USER, lthis );
CCatalog const * pCat = ((CCatalogBasicPropertySheet *)lParam)->_pCat;
SetDlgItemText( hwndDlg, IDDI_CATNAME, pCat->GetCat( TRUE ) );
SetDlgItemText( hwndDlg, IDDI_SIZE, pCat->GetSize( TRUE ) );
SetDlgItemText( hwndDlg, IDDI_PATH, pCat->GetDrive( TRUE ) );
SetDlgItemText( hwndDlg, IDDI_PROPCACHE_SIZE, pCat->GetPropCacheSize( TRUE ) );
fRet = TRUE;
break;
}
case WM_DESTROY:
{
CCatalogBasicPropertySheet * pthis = (CCatalogBasicPropertySheet *)GetWindowLongPtr( hwndDlg, DWLP_USER );
//
// Only gets called on *one* property page!
//
// MMCFreeNotifyHandle( pthis->_hMmcNotify );
delete pthis;
fRet = TRUE;
break;
}
} // switch
}
CATCH( CException, e )
{
ciaDebugOut(( DEB_ERROR, "CCatalogBasicPropertySheet: Caught 0x%x\n", e.GetErrorCode() ));
fRet = FALSE;
}
END_CATCH
return fRet;
}
CIndexSrvPropertySheet2::CIndexSrvPropertySheet2( HINSTANCE hInstance,
LONG_PTR hMmcNotify,
CCatalog * pCat )
: _pCat( pCat ),
_pCats( 0 ),
_hMmcNotify( hMmcNotify ),
_fNNTPServer( FALSE ),
_fWebServer( FALSE )
{
_PropSheet.dwSize = sizeof( *this );
_PropSheet.dwFlags = PSP_USETITLE;
_PropSheet.hInstance = hInstance;
_PropSheet.pszTemplate = MAKEINTRESOURCE(IDP_CATALOG_PAGE2);
_PropSheet.pszTitle = MAKEINTRESOURCE(IDP_CATALOG_PAGE2_TITLE);
_PropSheet.pfnDlgProc = CIndexSrvPropertySheet2::DlgProc;
_PropSheet.lParam = (LPARAM)this;
_hPropSheet = CreatePropertySheetPage( &_PropSheet );
}
CIndexSrvPropertySheet2::CIndexSrvPropertySheet2( HINSTANCE hInstance,
LONG_PTR hMmcNotify,
CCatalogs * pCats )
: _pCat( 0 ),
_pCats( pCats ),
_hMmcNotify( hMmcNotify )
{
_PropSheet.dwSize = sizeof( *this );
_PropSheet.dwFlags = PSP_USETITLE;
_PropSheet.hInstance = hInstance;
_PropSheet.pszTemplate = MAKEINTRESOURCE(IDP_CATALOG_PAGE2);
_PropSheet.pszTitle = MAKEINTRESOURCE(IDP_CATALOG_PAGE2_TITLE);
_PropSheet.pfnDlgProc = CIndexSrvPropertySheet2::DlgProc;
_PropSheet.lParam = (LPARAM)this;
_hPropSheet = CreatePropertySheetPage( &_PropSheet );
}
CIndexSrvPropertySheet2::~CIndexSrvPropertySheet2()
{
}
INT_PTR APIENTRY CIndexSrvPropertySheet2::DlgProc( HWND hwndDlg,
UINT message,
WPARAM wParam,
LPARAM lParam )
{
BOOL fRet = FALSE;
TRY
{
switch ( message )
{
case WM_HELP:
{
HELPINFO *phi = (HELPINFO *) lParam;
ciaDebugOut(( DEB_ITRACE, "CIndexSrvPropertySheet2 WM_HELP contexttype: '%s', ctlid: %d, contextid: %d\n",
phi->iContextType == HELPINFO_MENUITEM ? "menu" : "window",
phi->iCtrlId, phi->dwContextId ));
if ( HELPINFO_WINDOW == phi->iContextType )
{
switch ( phi->iCtrlId )
{
case IDDI_STATIC:
break;
default :
DisplayPopupHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_WM_HELP);
break;
}
}
break;
}
case WM_CONTEXTMENU:
{
DisplayPopupHelp((HWND)wParam, HELP_CONTEXTMENU);
break;
}
case WM_INITDIALOG:
{
ciaDebugOut(( DEB_ITRACE, "CIndexSrvPropertySheet2::DlgProc -- WM_INITDIALOG\n" ));
LONG_PTR lthis = ((CIndexSrvPropertySheet2 *)lParam)->_PropSheet.lParam;
CIndexSrvPropertySheet2 * pthis = (CIndexSrvPropertySheet2 *)lthis;
SetWindowLongPtr( hwndDlg, DWLP_USER, lthis );
BOOL fAutoAlias;
BOOL fVirtualRoots;
BOOL fNNTPRoots;
ULONG iVirtualServer;
ULONG iNNTPServer;
// It is important to initialize the counters here to guarantee that
// they will remain 0 if we don't get to invoke the enumerators that
// count the number of servers.
ULONG cVServers = 0, cNNTPServers = 0;
ShowWindow(GetDlgItem(hwndDlg, IDDI_VIRTUAL_SERVER), FALSE);
ShowWindow(GetDlgItem(hwndDlg, IDDI_NNTP_SERVER), FALSE);
ShowWindow(GetDlgItem(hwndDlg, IDDI_VSERVER_STATIC), FALSE);
ShowWindow(GetDlgItem(hwndDlg, IDDI_NNTP_STATIC), FALSE);
if ( 0 != pthis->_pCat )
{
if ( AreServersAvailable( *(pthis->_pCat) ) )
{
pthis->_pCat->GetWeb( fVirtualRoots,
fNNTPRoots,
iVirtualServer,
iNNTPServer );
InitVSList( GetDlgItem(hwndDlg, IDDI_VIRTUAL_SERVER),
GetDlgItem(hwndDlg, IDDI_NNTP_SERVER),
*(pthis->_pCat),
cVServers,
cNNTPServers );
}
pthis->_pCat->GetTracking( fAutoAlias );
// Look in the registry for Group2 params. If at least one of them is listed
// we should uncheck the "Inherit" checkbox. Otherwise
// (if none of them is listed), we should check the box.
SendDlgItemMessage( hwndDlg,
IDDI_INHERIT2,
BM_SETCHECK,
pthis->_pCat->DoGroup2SettingsExist() ? BST_UNCHECKED : BST_CHECKED,
0 );
// If all the settings don't exist, then delete the others in the group.
// We don't want to have part of the group inherited and part local.
if (pthis->_pCat->DoGroup2SettingsExist())
pthis->_pCat->FillGroup2Settings();
}
else
{
// Hide the "Inherit" checkbox because it is not applicable here
ShowWindow(GetDlgItem(hwndDlg, IDDI_INHERIT2), SW_HIDE);
pthis->_pCats->GetTracking( fAutoAlias );
}
if (cVServers)
{
ShowWindow(GetDlgItem(hwndDlg, IDDI_VIRTUAL_SERVER), TRUE);
ShowWindow(GetDlgItem(hwndDlg, IDDI_VSERVER_STATIC), TRUE);
pthis->_fWebServer = TRUE;
SendDlgItemMessage( hwndDlg,
IDDI_VIRTUAL_SERVER,
CB_SETCURSEL,
VSToIndex( hwndDlg, IDDI_VIRTUAL_SERVER,
iVirtualServer, fVirtualRoots ), 0 );
}
if (cNNTPServers)
{
ShowWindow(GetDlgItem(hwndDlg, IDDI_NNTP_SERVER), TRUE);
ShowWindow(GetDlgItem(hwndDlg, IDDI_NNTP_STATIC), TRUE);
pthis->_fNNTPServer = TRUE;
SendDlgItemMessage( hwndDlg,
IDDI_NNTP_SERVER,
CB_SETCURSEL,
VSToIndex( hwndDlg, IDDI_NNTP_SERVER,
iNNTPServer, fNNTPRoots ), 0 );
}
SendDlgItemMessage( hwndDlg,
IDDI_AUTO_ALIAS,
BM_SETCHECK,
fAutoAlias ? BST_CHECKED : BST_UNCHECKED,
0 );
// If we are inheriting, we should disable the local setting.
if ( 0 != pthis->_pCat && !pthis->_pCat->DoGroup2SettingsExist())
EnableWindow(GetDlgItem(hwndDlg, IDDI_AUTO_ALIAS), FALSE);
fRet = TRUE;
break;
}
case WM_COMMAND:
{
BOOL fChanged = FALSE;
switch ( LOWORD( wParam ) )
{
case IDDI_VIRTUAL_SERVER:
case IDDI_NNTP_SERVER:
{
if ( CBN_SELCHANGE == HIWORD(wParam) )
{
if ( 0 != GetWindowLongPtr( hwndDlg, DWLP_USER ) )
{
fChanged = TRUE;
fRet = TRUE;
}
}
break;
}
case IDDI_AUTO_ALIAS:
{
if ( EN_CHANGE == HIWORD(wParam) || BN_CLICKED == HIWORD(wParam) )
{
if ( 0 != GetWindowLongPtr( hwndDlg, DWLP_USER ) )
{
fChanged = TRUE;
fRet = TRUE;
}
}
break;
}
case IDDI_INHERIT2:
{
if ( EN_CHANGE == HIWORD(wParam) || BN_CLICKED == HIWORD(wParam) )
{
if ( 0 != GetWindowLongPtr( hwndDlg, DWLP_USER ) )
{
fChanged = TRUE;
fRet = TRUE;
BOOL fInherit = ( BST_CHECKED == SendDlgItemMessage( hwndDlg, IDDI_INHERIT2, BM_GETCHECK, 0, 0 ) );
BOOL fAutoAlias = FALSE;
CIndexSrvPropertySheet2 * pthis = (CIndexSrvPropertySheet2 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
if (fInherit)
{
Win4Assert(pthis->IsTrackingCatalog());
pthis->_pCat->GetParent().GetTracking(fAutoAlias);
}
else
{
pthis->_pCat->GetTracking(fAutoAlias);
// Enable so we can set controls
EnableWindow(GetDlgItem(hwndDlg, IDDI_AUTO_ALIAS), TRUE);
}
SendDlgItemMessage( hwndDlg,
IDDI_AUTO_ALIAS,
BM_SETCHECK,
fAutoAlias ? BST_CHECKED : BST_UNCHECKED,
0 );
// Disable controls if we need to
if (fInherit)
EnableWindow(GetDlgItem(hwndDlg, IDDI_AUTO_ALIAS), FALSE);
}
}
}
} // switch
if ( fChanged )
PropSheet_Changed( GetParent(hwndDlg), hwndDlg );
break;
}
case WM_NOTIFY:
{
switch ( ((LPNMHDR) lParam)->code )
{
case PSN_APPLY:
{
TRY
{
CIndexSrvPropertySheet2 * pthis = (CIndexSrvPropertySheet2 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
BOOL fAutoAlias = ( BST_CHECKED == SendDlgItemMessage( hwndDlg, IDDI_AUTO_ALIAS, BM_GETSTATE, 0, 0 ) );
if ( 0 != pthis->_pCat )
{
BOOL fVirtualRoots = FALSE;
ULONG iVirtualServer = 0;
if ( pthis->_fWebServer )
{
iVirtualServer = (ULONG)SendDlgItemMessage( hwndDlg, IDDI_VIRTUAL_SERVER, CB_GETCURSEL, 0, 0 );
fVirtualRoots = ( 0 != iVirtualServer );
iVirtualServer = (ULONG)SendDlgItemMessage( hwndDlg, IDDI_VIRTUAL_SERVER, CB_GETITEMDATA, iVirtualServer, 0 );
}
BOOL fNNTPRoots = FALSE;
ULONG iNNTPServer = 0;
if ( pthis->_fNNTPServer )
{
iNNTPServer = (ULONG)SendDlgItemMessage( hwndDlg, IDDI_NNTP_SERVER, CB_GETCURSEL, 0, 0 );
fNNTPRoots = ( 0 != iNNTPServer );
iNNTPServer = (ULONG)SendDlgItemMessage( hwndDlg, IDDI_NNTP_SERVER, CB_GETITEMDATA, iNNTPServer, 0 );
}
pthis->_pCat->SetWeb( fVirtualRoots, fNNTPRoots, iVirtualServer, iNNTPServer );
// If the Inherit Settings button is checked, we should remove the registry entries from the catalog's
// settings so the values will be inherited from the service.
BOOL fInherit = ( BST_CHECKED == SendDlgItemMessage( hwndDlg, IDDI_INHERIT2, BM_GETSTATE, 0, 0 ) );
if (fInherit)
pthis->_pCat->DeleteGroup2Settings();
else
pthis->_pCat->SetTracking( fAutoAlias );
// Set the current values and set state of the local controls
BOOL fAutoAlias;
pthis->_pCat->GetTracking( fAutoAlias );
SendDlgItemMessage( hwndDlg,
IDDI_AUTO_ALIAS,
BM_SETCHECK,
fAutoAlias ? BST_CHECKED : BST_UNCHECKED,
0 );
EnableWindow(GetDlgItem(hwndDlg, IDDI_AUTO_ALIAS), !fInherit);
}
else
pthis->_pCats->SetTracking( fAutoAlias );
MMCPropertyChangeNotify( pthis->_hMmcNotify, 0 );
fRet = TRUE;
}
CATCH( CException, e )
{
DisplayError( hwndDlg, e );
}
END_CATCH
break;
}
} // switch
break;
}
case WM_DESTROY:
{
CIndexSrvPropertySheet2 * pthis = (CIndexSrvPropertySheet2 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
//
// Only gets called on *one* property page!
//
// MMCFreeNotifyHandle( pthis->_hMmcNotify );
delete pthis;
fRet = TRUE;
break;
}
} // switch
}
CATCH( CException, e )
{
ciaDebugOut(( DEB_ERROR, "CIndexSrvPropertySheet2: Caught 0x%x\n", e.GetErrorCode() ));
fRet = FALSE;
}
END_CATCH
return fRet;
}
CPropertyPropertySheet1::CPropertyPropertySheet1( HINSTANCE hInstance,
LONG_PTR hMmcNotify,
CCachedProperty * pProperty,
CCatalog * pCat )
: _pProperty( pProperty ),
_propNew( *pProperty ),
_hMmcNotify( hMmcNotify ),
_pCat( pCat )
{
_PropSheet.dwSize = sizeof( _PropSheet ) + sizeof( this );
_PropSheet.dwFlags = PSP_USETITLE;
_PropSheet.hInstance = hInstance;
_PropSheet.pszTemplate = MAKEINTRESOURCE(IDP_PROPERTY_PAGE1);
_PropSheet.pszTitle = MAKEINTRESOURCE(IDP_PROPERTY_PAGE1_TITLE);
_PropSheet.pfnDlgProc = CPropertyPropertySheet1::DlgProc;
_PropSheet.lParam = (LPARAM)this;
_hPropSheet = CreatePropertySheetPage( &_PropSheet );
}
CPropertyPropertySheet1::~CPropertyPropertySheet1()
{
}
INT_PTR APIENTRY CPropertyPropertySheet1::DlgProc( HWND hwndDlg,
UINT message,
WPARAM wParam,
LPARAM lParam )
{
BOOL fRet = FALSE;
TRY
{
switch ( message )
{
case WM_HELP:
{
HELPINFO *phi = (HELPINFO *) lParam;
ciaDebugOut(( DEB_ITRACE,
"CPropertyPropertySheet1 WM_HELP contexttype: '%s', ctlid: %d, contextid: %d\n",
phi->iContextType == HELPINFO_MENUITEM ? "menu" : "window",
phi->iCtrlId, phi->dwContextId ));
if ( HELPINFO_WINDOW == phi->iContextType )
{
switch ( phi->iCtrlId )
{
case IDDI_STATIC:
break;
default :
DisplayPopupHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_WM_HELP);
break;
}
}
break;
}
case WM_CONTEXTMENU:
{
DisplayPopupHelp((HWND)wParam, HELP_CONTEXTMENU);
break;
}
case WM_INITDIALOG:
{
ciaDebugOut(( DEB_ITRACE, "CPropertyPropertySheet1::DlgProc -- WM_INITDIALOG\n" ));
LONG_PTR lthis = ((CPropertyPropertySheet1 *)lParam)->_PropSheet.lParam;
SetWindowLongPtr( hwndDlg, DWLP_USER, lthis );
CCachedProperty const & prop = ((CPropertyPropertySheet1 *)lthis)->_propNew;
SetDlgItemText( hwndDlg, IDDI_PROPSET, prop.GetPropSet() );
SetDlgItemText( hwndDlg, IDDI_PROPERTY, prop.GetProperty() );
SendDlgItemMessage( hwndDlg,
IDDI_SPIN_CACHEDSIZE,
UDM_SETRANGE,
0,
(LPARAM) MAKELONG( 500, 4) );
InitVTList( GetDlgItem(hwndDlg, IDDI_DATATYPE) );
InitStorageLevelList( GetDlgItem(hwndDlg, IDDI_STORAGELEVEL) );
if ( prop.IsCached() )
{
SendDlgItemMessage( hwndDlg, IDDI_CACHED, BM_SETCHECK, BST_CHECKED, 0 );
SendDlgItemMessage( hwndDlg, IDDI_DATATYPE, CB_SETCURSEL, aulTypeIndex[ prop.GetVT() & ~VT_VECTOR ], 0 );
// StoreLevel() is 0 for primary, 1 for secondary, which is the sequence in which we added them.
// So using StoreLevel() as in index will work fine!
SendDlgItemMessage( hwndDlg, IDDI_STORAGELEVEL, CB_SETCURSEL, prop.StoreLevel(), 0 );
SetDlgItemText( hwndDlg, IDDI_CACHEDSIZE, prop.GetAllocation() );
// Currently we do not allow the storage level to be changed after initial setting
EnableWindow( GetDlgItem( hwndDlg, IDDI_STORAGELEVEL), FALSE );
}
else
{
SendDlgItemMessage( hwndDlg, IDDI_CACHED, BM_SETCHECK, BST_UNCHECKED, 0 );
EnableWindow( GetDlgItem( hwndDlg, IDDI_DATATYPE ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDDI_STORAGELEVEL), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDDI_CACHEDSIZE ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDDI_SPIN_CACHEDSIZE ), FALSE );
EnableWindow( GetDlgItem( GetParent(hwndDlg), IDOK), FALSE );
}
// If properties cannot be modified, disable all controls
// Only cached properties can be resitant to modifications!
if (!prop.IsModifiable() && prop.IsCached())
{
EnableWindow( GetDlgItem( hwndDlg, IDDI_CACHED), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDDI_DATATYPE ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDDI_STORAGELEVEL), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDDI_CACHEDSIZE ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDDI_SPIN_CACHEDSIZE ), FALSE );
EnableWindow( GetDlgItem( GetParent(hwndDlg), IDOK), FALSE );
}
fRet = TRUE;
break;
}
case WM_COMMAND:
{
BOOL fChanged = FALSE;
BOOL fCorrected = TRUE;
switch ( LOWORD( wParam ) )
{
case IDDI_DATATYPE:
{
if ( CBN_CLOSEUP == HIWORD(wParam) )
{
CPropertyPropertySheet1 * pthis = (CPropertyPropertySheet1 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
fChanged = pthis->Refresh( hwndDlg, TRUE );
if ( pthis->_propNew.IsFixed() )
{
SetDlgItemText( hwndDlg, IDDI_CACHEDSIZE, pthis->_propNew.GetAllocation() );
// Disable the size control
EnableWindow( GetDlgItem( hwndDlg, IDDI_CACHEDSIZE ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDDI_SPIN_CACHEDSIZE ), FALSE );
}
else
{
SetDlgItemText( hwndDlg, IDDI_CACHEDSIZE, L"4" );
// Enable the size control. Variable props can be resized.
EnableWindow( GetDlgItem( hwndDlg, IDDI_CACHEDSIZE ), TRUE );
EnableWindow( GetDlgItem( hwndDlg, IDDI_SPIN_CACHEDSIZE ), TRUE );
}
fRet = TRUE;
}
break;
}
case IDDI_STORAGELEVEL:
{
CPropertyPropertySheet1 * pthis = (CPropertyPropertySheet1 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
if ( CBN_CLOSEUP == HIWORD(wParam) )
{
fChanged = pthis->Refresh( hwndDlg, TRUE );
fRet = TRUE;
}
break;
}
case IDDI_CACHEDSIZE:
{
if ( EN_KILLFOCUS == HIWORD(wParam) )
{
fRet = TRUE;
ULONG ulVal = 4;
// Validate the number
XArray<WCHAR> xawcTemp;
if ( GetDlgItemXArrayText( hwndDlg, IDDI_CACHEDSIZE, xawcTemp ) &&
xawcTemp.Count() > 0 )
{
// verify that all characters are digits
ULONG ulLen = wcslen(xawcTemp.GetPointer());
// When correcting, let's do our best.
ulVal = _wtoi(xawcTemp.GetPointer());
for (ULONG i = 0; i < ulLen; i++)
{
if (!iswdigit(xawcTemp[i]))
break;
}
if (i == ulLen)
{
// verify that the number is within range
ulVal = _wtoi(xawcTemp.GetPointer());
ciaDebugOut((DEB_ERROR, "number is %d, string is %ws\n",
ulVal, xawcTemp.GetPointer()));
if (ulVal <= 500)
fCorrected = FALSE;
else if (ulVal > 500)
ulVal = 500;
}
}
// if we are dealing with a vble property, we should ensure that the
// size is at least 4 bytes
if (ulVal < 4)
{
CPropertyPropertySheet1 * pthis = (CPropertyPropertySheet1 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
if ( 0 != pthis )
{
if (pthis->_propNew.IsCached() && !pthis->_propNew.IsFixed())
{
ulVal = 4;
fCorrected = TRUE;
}
}
}
if (fCorrected)
{
MessageBeep(MB_ICONHAND);
// xawcTemp may not have a buffer, so don't use it for _itow. Use a temp vble
WCHAR wszBuff[20];
SetWindowText((HWND)lParam, _itow(ulVal, wszBuff, 10));
SendMessage((HWND)lParam, EM_SETSEL, 0, -1);
}
}
else if ( EN_CHANGE == HIWORD(wParam) && ( 0 != GetWindowLongPtr( hwndDlg, DWLP_USER )) )
{
CPropertyPropertySheet1 * pthis = (CPropertyPropertySheet1 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
if ( 0 != pthis )
{
fChanged = pthis->Refresh( hwndDlg, FALSE );
fRet = TRUE;
}
}
break;
}
case IDDI_CACHED:
{
if ( BN_CLICKED == HIWORD(wParam) )
{
CPropertyPropertySheet1 * pthis = (CPropertyPropertySheet1 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
ULONG fChecked = (ULONG)SendDlgItemMessage( hwndDlg, IDDI_CACHED, BM_GETSTATE, 0, 0 );
if ( fChecked & BST_CHECKED )
{
pthis->Refresh( hwndDlg, FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDDI_DATATYPE ), TRUE );
EnableWindow( GetDlgItem( hwndDlg, IDDI_CACHEDSIZE ), TRUE );
EnableWindow( GetDlgItem( hwndDlg, IDDI_SPIN_CACHEDSIZE ), TRUE );
// If this property is currently being cached in the property store (as indicated
// by CCachedProperty), we do not let it's store level be changed. This ensures
// that a user cannot change a property between store levels.
if (pthis->_propNew.IsCached() && INVALID_STORE_LEVEL != pthis->_propNew.StoreLevel())
{
SendDlgItemMessage( hwndDlg, IDDI_STORAGELEVEL, CB_SETCURSEL,
pthis->_propNew.StoreLevel(), 0 );
EnableWindow( GetDlgItem( hwndDlg, IDDI_STORAGELEVEL), FALSE );
}
else
{
// enable and display the storage level. Default to secondary,
// if none is available
if (PRIMARY_STORE != pthis->_propNew.StoreLevel())
pthis->_propNew.SetStoreLevel(SECONDARY_STORE);
SendDlgItemMessage( hwndDlg, IDDI_STORAGELEVEL, CB_SETCURSEL,
pthis->_propNew.StoreLevel(), 0 );
EnableWindow( GetDlgItem( hwndDlg, IDDI_STORAGELEVEL), TRUE );
}
// if no item is currently selected, set lpwstr by default
if (VT_EMPTY == pthis->_propNew.GetVT() || 0 == pthis->_propNew.Allocation())
{
UINT uiType = DBTypeToVT(pthis->_propNew.GetDefaultType());
if (uiType != VT_EMPTY)
{
ciaDebugOut((DEB_ITRACE, "DIALOG: %ws has type %d (==> %d)\n",
pthis->_propNew.GetFName(), pthis->_propNew.GetDefaultType(),
DBTypeToVT(pthis->_propNew.GetDefaultType())));
pthis->_propNew.SetVT( uiType );
pthis->_propNew.SetAllocation( pthis->_propNew.GetDefaultSize() );
}
else
{
// default datatype should be LPWSTR
pthis->_propNew.SetVT( VT_LPWSTR );
pthis->_propNew.SetAllocation( 4 );
}
}
// Assert that the property is now marked cached
Win4Assert( pthis->_propNew.IsCached() );
// now display it
SendDlgItemMessage( hwndDlg, IDDI_DATATYPE, CB_SETCURSEL,
aulTypeIndex[ pthis->_propNew.GetVT() & ~VT_VECTOR ], 0 );
SetDlgItemText( hwndDlg, IDDI_CACHEDSIZE, pthis->_propNew.GetAllocation() );
// in case OK was disabled, enable it
EnableWindow( GetDlgItem( GetParent(hwndDlg), IDOK), TRUE );
}
else
{
pthis->_propNew.SetVT( VT_EMPTY );
pthis->_propNew.SetAllocation( 0 );
// IMPORTANT: Don't set storage level to invalid. We need to
// know where to delete this from!
//pthis->_propNew.SetStoreLevel(INVALID_STORE_LEVEL);
EnableWindow( GetDlgItem( hwndDlg, IDDI_DATATYPE ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDDI_STORAGELEVEL), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDDI_CACHEDSIZE ), FALSE );
EnableWindow( GetDlgItem( hwndDlg, IDDI_SPIN_CACHEDSIZE ), FALSE );
}
fChanged = TRUE;
fRet = TRUE;
}
break;
}
} // switch
if ( fChanged )
{
CPropertyPropertySheet1 * pthis = (CPropertyPropertySheet1 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
PropSheet_Changed( GetParent(hwndDlg), hwndDlg );
}
break;
}
case WM_NOTIFY:
{
switch ( ((LPNMHDR) lParam)->code )
{
case PSN_APPLY:
{
TRY
{
CPropertyPropertySheet1 * pthis = (CPropertyPropertySheet1 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
*pthis->_pProperty = pthis->_propNew;
pthis->_pProperty->MakeUnappliedChange();
pthis->_pCat->UpdateCachedProperty(pthis->_pProperty);
MMCPropertyChangeNotify( pthis->_hMmcNotify, (LONG_PTR)pthis->_pProperty );
MessageBox( hwndDlg,
STRINGRESOURCE( srPendingProps ),
STRINGRESOURCE( srPendingPropsTitle ),
MB_OK | MB_ICONINFORMATION );
fRet = TRUE;
ciaDebugOut((DEB_ITRACE, "VarType is %d, Allocation size is %d, Store level is %d\n",
pthis->_pProperty->GetVT(), pthis->_pProperty->Allocation(),
pthis->_pProperty->StoreLevel() ));
}
CATCH( CException, e )
{
DisplayError( hwndDlg, e );
}
END_CATCH
break;
}
} // switch
break;
}
case WM_DESTROY:
{
CPropertyPropertySheet1 * pthis = (CPropertyPropertySheet1 *)GetWindowLongPtr( hwndDlg, DWLP_USER );
// Freeing this will cause a double-delete since it's shared across instances of this page
#if 0
DbgPrint( "WM_DESTROY CPropertyPropertySheet1 this %#x, _hMmcNotify: %#x\n", pthis, pthis->_hMmcNotify );
MMCFreeNotifyHandle( pthis->_hMmcNotify );
pthis->_hMmcNotify = 0;
#endif
delete pthis;
fRet = TRUE;
break;
}
default:
fRet = FALSE;
break;
}
}
CATCH( CException, e )
{
ciaDebugOut(( DEB_ERROR, "CPropertyPropertySheet1: Caught 0x%x\n", e.GetErrorCode() ));
fRet = FALSE;
}
END_CATCH
return fRet;
}
BOOL CPropertyPropertySheet1::Refresh( HWND hwndDlg, BOOL fVTOnly )
{
BOOL fChanged = FALSE;
DWORD dwIndex = (DWORD)SendDlgItemMessage( hwndDlg, IDDI_DATATYPE, CB_GETCURSEL, 0, 0 );
ULONG vt = (ULONG)SendDlgItemMessage( hwndDlg, IDDI_DATATYPE, CB_GETITEMDATA, dwIndex, 0 );
if ( vt != _propNew.GetVT() )
fChanged = TRUE;
_propNew.SetVT( vt );
dwIndex = (DWORD)SendDlgItemMessage( hwndDlg, IDDI_STORAGELEVEL, CB_GETCURSEL, 0, 0 );
DWORD dwStoreLevel = (DWORD)SendDlgItemMessage( hwndDlg, IDDI_STORAGELEVEL, CB_GETITEMDATA, dwIndex, 0 );
if ( dwStoreLevel != _propNew.StoreLevel() )
fChanged = TRUE;
_propNew.SetStoreLevel( dwStoreLevel );
if ( !fVTOnly )
{
XArray<WCHAR> xawcSize;
if ( GetDlgItemXArrayText( hwndDlg, IDDI_CACHEDSIZE, xawcSize ) && xawcSize.Count() > 0)
{
ULONG cb = wcstoul( xawcSize.Get(), 0, 10 );
if ( cb != _propNew.Allocation() )
fChanged = TRUE;
_propNew.SetAllocation( cb );
}
}
return fChanged;
}
void InitVTList( HWND hwndCombo )
{
DWORD dwIndex;
//
// Add an item for each type group.
//
int j = 0;
for ( int i = 0; i < cType; i++ )
{
if ( 0 != awcsType[i] )
{
dwIndex = (DWORD)SendMessage( hwndCombo, CB_ADDSTRING, 0, (LPARAM)awcsType[i] );
SendMessage(hwndCombo, CB_SETITEMDATA, dwIndex, i );
j++;
}
}
//
// NOTE: After the first property box, this just sets identical values.
//
for ( j--; j >= 0; j-- )
{
dwIndex = (DWORD)SendMessage( hwndCombo, CB_GETITEMDATA, j, 0 );
aulTypeIndex[dwIndex] = j;
}
}
void InitStorageLevelList( HWND hwndCombo )
{
DWORD dwIndex;
//
// Add an item for each of the two levels.
//
dwIndex = (DWORD)SendMessage( hwndCombo, CB_ADDSTRING, 0, (LPARAM)STRINGRESOURCE(srPrimaryStore) );
SendMessage(hwndCombo, CB_SETITEMDATA, dwIndex, PRIMARY_STORE );
dwIndex = (DWORD)SendMessage( hwndCombo, CB_ADDSTRING, 0, (LPARAM)STRINGRESOURCE(srSecondaryStore) );
SendMessage(hwndCombo, CB_SETITEMDATA, dwIndex, SECONDARY_STORE );
}
//
// Helper class for virtual server callback.
//
//+---------------------------------------------------------------------------
//
// Class: CMetaDataVirtualServerCallBack
//
// Purpose: Pure virtual for vroot enumeration
//
// History: 07-Feb-1997 dlee Created
//
//----------------------------------------------------------------------------
class CVSComboBox : public CMetaDataVirtualServerCallBack
{
public:
CVSComboBox( HWND hwndCombo ) :
_hwndCombo( hwndCombo ),
cEntries( 0 )
{
}
virtual SCODE CallBack( DWORD iInstance, WCHAR const * pwcInstance );
virtual ~CVSComboBox() {}
ULONG EntryCount() { return cEntries; }
private:
HWND _hwndCombo;
ULONG cEntries;
};
SCODE CVSComboBox::CallBack( DWORD iInstance, WCHAR const * pwcInstance )
{
// We pass NULL for _hwndCombo when we only need a count of entries.
if (NULL != _hwndCombo)
{
DWORD dwIndex = (DWORD)SendMessage( _hwndCombo, CB_ADDSTRING, 0, (LPARAM)pwcInstance );
SendMessage( _hwndCombo, CB_SETITEMDATA, dwIndex, (LPARAM)iInstance );
}
cEntries++;
return S_OK;
}
BOOL AreServersAvailable( CCatalog const & cat )
{
BOOL fEntriesInList = FALSE;
//
// Virtual Server(s)
//
TRY
{
//
// Add an item for each type group.
//
CMetaDataMgr mgr( TRUE, W3VRoot, 0xffffffff, cat.GetMachine() );
CVSComboBox vsc( NULL );
mgr.EnumVServers( vsc );
fEntriesInList = (0 == vsc.EntryCount()) ? FALSE : TRUE;
}
CATCH( CException, e )
{
ciaDebugOut(( DEB_ERROR, "Couldn't enumerate virtual servers.\n" ));
}
END_CATCH
//
// Virtual NNTP Server(s)
//
TRY
{
//
// Add an item for each type group.
//
CMetaDataMgr mgr( TRUE, NNTPVRoot, 0xffffffff, cat.GetMachine() );
CVSComboBox vsc( NULL );
mgr.EnumVServers( vsc );
fEntriesInList = fEntriesInList || ( (0 == vsc.EntryCount()) ? FALSE : TRUE );
}
CATCH( CException, e )
{
ciaDebugOut(( DEB_ERROR, "Couldn't enumerate virtual servers.\n" ));
}
END_CATCH
return fEntriesInList;
}
void InitVSList( HWND hwndComboVS, HWND hwndComboNNTP, CCatalog const & cat,
ULONG & cVServers, ULONG & cNNTPServers )
{
//
// Virtual Server(s)
//
TRY
{
SendMessage( hwndComboVS, CB_ADDSTRING, 0,
(LPARAM) STRINGRESOURCE( srNoneSelected.wsz ) );
//
// Add an item for each type group.
//
CMetaDataMgr mgr( TRUE, W3VRoot, 0xffffffff, cat.GetMachine() );
CVSComboBox vsc( hwndComboVS );
Win4Assert(0 == vsc.EntryCount());
mgr.EnumVServers( vsc );
cVServers = vsc.EntryCount();
}
CATCH( CException, e )
{
ciaDebugOut(( DEB_ERROR, "Couldn't enumerate virtual servers.\n" ));
}
END_CATCH
//
// Virtual NNTP Server(s)
//
TRY
{
SendMessage( hwndComboNNTP, CB_ADDSTRING, 0,
(LPARAM) STRINGRESOURCE( srNoneSelected.wsz ) );
//
// Add an item for each type group.
//
CMetaDataMgr mgr( TRUE, NNTPVRoot, 0xffffffff, cat.GetMachine() );
CVSComboBox vsc( hwndComboNNTP );
Win4Assert(0 == vsc.EntryCount());
mgr.EnumVServers( vsc );
cNNTPServers = vsc.EntryCount();
}
CATCH( CException, e )
{
ciaDebugOut(( DEB_ERROR, "Couldn't enumerate virtual servers.\n" ));
}
END_CATCH
#if 0
//
// Virtual IMAP Server(s)
//
TRY
{
//
// Add an item for each type group.
//
CMetaDataMgr mgr( TRUE, IMAPVRoot, 0xffffffff, cat.GetMachine() );
DWORD dwIndex = SendMessage( hwndComboIMAP, CB_ADDSTRING, 0,
(LPARAM) STRINGRESOURCE( srNoneSelected.wsz ) );
CVSComboBox vsc( hwndComboIMAP );
mgr.EnumVServers( vsc );
}
CATCH( CException, e )
{
ciaDebugOut(( DEB_ERROR, "Couldn't enumerate virtual servers.\n" ));
}
END_CATCH
#endif
}
void DisplayError( HWND hwnd, CException & e )
{
WCHAR wcsError[MAX_PATH];
if ( !FormatMessage( FORMAT_MESSAGE_FROM_HMODULE,
GetModuleHandle(L"query.dll"),
GetOleError( e ),
GetSystemDefaultLCID(),
wcsError,
sizeof(wcsError) / sizeof(WCHAR),
0 ) )
{
wsprintf( wcsError,
STRINGRESOURCE(srGenericError),
GetOleError( e ) );
}
MessageBox( hwnd,
wcsError,
STRINGRESOURCE( srIndexServerCmpManage ),
MB_OK | MB_ICONERROR );
}
DWORD VSToIndex( HWND hwndDlg, DWORD dwItem, ULONG ulVS, BOOL fTrack )
{
if ( !fTrack )
return 0;
unsigned cItem = (unsigned)SendDlgItemMessage( hwndDlg,
dwItem,
CB_GETCOUNT, 0, 0 );
for ( unsigned i = 1; i < cItem; i++ )
{
ULONG ulItem = (ULONG)SendDlgItemMessage( hwndDlg,
dwItem,
CB_GETITEMDATA, i, 0 );
if ( ulVS == ulItem )
break;
}
return i;
} //VSToIndex
// Return of VT_EMPTY could imply an unknown conversion.
UINT DBTypeToVT(UINT uidbt)
{
if (uidbt <= DBTYPE_GUID)
return uidbt;
// Some conversions
DBTYPE dbtSimpler = uidbt &~ DBTYPE_VECTOR &~ DBTYPE_ARRAY &~ DBTYPE_BYREF;
switch (dbtSimpler)
{
case DBTYPE_WSTR:
return VT_LPWSTR;
case DBTYPE_STR:
return VT_LPSTR;
case DBTYPE_FILETIME:
return VT_FILETIME;
default:
return VT_EMPTY;
}
}