|
|
/*******************************************************************************
* * Copyright 1999 American Power Conversion, All Rights Reserved * * TITLE: UPSSELECT.C * * VERSION: 1.0 * * AUTHOR: SteveT * * DATE: 07 June, 1999 * * DESCRIPTION: This file contains all of the functions that support the * UPS Type Selection dialog. *******************************************************************************/ #include "upstab.h"
//#include "..\powercfg.h"
#include "..\pwrresid.h"
#include "..\PwrMn_cs.h"
/*
* forward declarations */ void initUPSSelectDlg(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void updateVendorList(HWND hDlg) ; void updateModelList(HWND hDlg) ; void updatePortList(HWND hDlg) ;
void handleVendorList(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) ; void handleModelList(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void handlePortList(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
void setServiceData(HWND hDlg);
void configPortList(HWND hDlg); void configModelList(HWND hDlg); void configFinishButton(HWND hDlg);
BOOL processUPSSelectCtrls(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
/*
* local allocations */ static TCHAR g_szCurrentVendor[MAX_PATH] = _T(""); static TCHAR g_szCurrentModel[MAX_PATH] = _T(""); static TCHAR g_szCurrentPort[MAX_PATH] = _T(""); static TCHAR g_szCurrentServiceDLL[MAX_PATH]= _T("");
static DWORD g_dwCurrentOptions = UPS_DEFAULT_SIGMASK; static DWORD g_dwCurrentCustomOptions = UPS_DEFAULT_SIGMASK;
static struct _customData g_CustomData = { g_szCurrentPort, &g_dwCurrentCustomOptions};
static TCHAR g_szNoUPSVendor[MAX_PATH] = _T(""); static TCHAR g_szOtherUPSVendor[MAX_PATH] = _T(""); static TCHAR g_szCustomUPSModel[MAX_PATH] = _T(""); static TCHAR g_szCOMPortPrefix[MAX_PATH] = _T("");
static const DWORD g_UPSSelectHelpIDs[] = { IDC_VENDOR_TEXT,idh_select_manufacturer, IDC_VENDOR_LIST,idh_select_manufacturer, IDC_MODEL_TEXT,idh_select_model, IDC_MODEL_LIST,idh_select_model, IDC_PORT_TEXT,idh_on_port, IDC_PORT_LIST,idh_on_port, IDB_SELECT_FINISH,idh_finish, IDB_SELECT_NEXT,idh_next, 0,0 };
/*
* define the possible "states" of the controls. * these states are set whenever a control is altered, * and are generally used to speed up processing by * basing decisions on states rather than having to * continually query controls to find out what they're * displaying. */ static enum _vendorStates {eVendorUnknown, eVendorSelected, eVendorGeneric, eVendorNone} g_vendorState; static enum _modelStates {eModelUnknown, eModelSelected, eModelCustom} g_modelState; static enum _portStates {ePortUnknown, ePortSelected} g_portState; static enum _finishStates {eFinish, eNext} g_finishButtonState;
/*
* Load all used values here */ void getUPSConfigValues() { GetUPSConfigVendor(g_szCurrentVendor, MAX_PATH); GetUPSConfigModel(g_szCurrentModel, MAX_PATH); GetUPSConfigPort(g_szCurrentPort, MAX_PATH); GetUPSConfigOptions( &g_dwCurrentOptions); GetUPSConfigCustomOptions( &g_dwCurrentCustomOptions); GetUPSConfigServiceDLL(g_szCurrentServiceDLL, MAX_PATH); }
/*
* Save all used values here */ void setUPSConfigValues() { SetUPSConfigVendor( g_szCurrentVendor); SetUPSConfigModel( g_szCurrentModel); SetUPSConfigPort( g_szCurrentPort); SetUPSConfigOptions( g_dwCurrentOptions); SetUPSConfigCustomOptions( g_dwCurrentCustomOptions); SetUPSConfigServiceDLL( g_szCurrentServiceDLL);
AddActiveDataState(SERVICE_DATA_CHANGE);
EnableApplyButton(); }
/*
* BOOL CALLBACK UPSSelectDlgProc (HWND hDlg, * UINT uMsg, * WPARAM wParam, * LPARAM lParam); * * Description: This is a standard DialogProc associated with the UPS select dialog * * Additional Information: See help on DialogProc * * Parameters: * * HWND hDlg :- Handle to dialog box * * UINT uMsg :- message ID * * WPARAM wParam :- Specifies additional message-specific information. * * LPARAM lParam :- Specifies additional message-specific information. * * Return Value: Except in response to the WM_INITDIALOG message, the dialog * box procedure should return nonzero if it processes the * message, and zero if it does not. */ INT_PTR CALLBACK UPSSelectDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL bRes = TRUE;
switch (uMsg) { case WM_INITDIALOG: { initUPSSelectDlg(hDlg,uMsg,wParam,lParam); break; } case WM_CLOSE: {
EndDialog( hDlg, IDCANCEL); break; } case WM_COMMAND: { bRes = processUPSSelectCtrls( hDlg, uMsg, wParam, lParam); break; } case WM_HELP: //F1 or question box
{ WinHelp(((LPHELPINFO)lParam)->hItemHandle, PWRMANHLP, HELP_WM_HELP, (ULONG_PTR)(LPTSTR)g_UPSSelectHelpIDs); break; } case WM_CONTEXTMENU: // right mouse click help
{ WinHelp((HWND)wParam, PWRMANHLP, HELP_CONTEXTMENU, (ULONG_PTR)(LPTSTR)g_UPSSelectHelpIDs); break; } default: { bRes = FALSE; break; } }
return bRes; }
/*
* BOOL processUPSSelectCtrls (HWND hDlg, * UINT uMsg, * WPARAM wParam, * LPARAM lParam); * * Description: processes WM_COMMAND messages for the UPS select dialog * * Additional Information: * * Parameters: * * HWND hDlg :- Handle to dialog box * * UINT uMsg :- message ID * * WPARAM wParam :- Specifies additional message-specific information. * * LPARAM lParam :- Specifies additional message-specific information. * * Return Value: returns TRUE unless the control specified is unknown */ BOOL processUPSSelectCtrls(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL bRes = TRUE;
switch (LOWORD(wParam)) { case IDB_SELECT_FINISH: { setServiceData(hDlg); setUPSConfigValues(); EndDialog(hDlg,wParam); break; } case IDB_SELECT_NEXT: { /*
* the user has selected Custom... */ INT_PTR iCustomRes;
/*
* bring up the custom config dialog */ // ShowWindow(hDlg,SW_HIDE);
iCustomRes = DialogBoxParam( GetUPSModuleHandle(), MAKEINTRESOURCE(IDD_UPSCUSTOM), hDlg, UPSCustomDlgProc, (LPARAM)&g_CustomData);
switch (iCustomRes) { case IDB_CUSTOM_FINISH: { /*
* Save Custom signal values */ setServiceData(hDlg); setUPSConfigValues(); EndDialog(hDlg,wParam); break; } case IDCANCEL: // the escape key
{ EndDialog(hDlg,wParam); break; } case IDB_CUSTOM_BACK: { ShowWindow(hDlg,SW_SHOW); break; } } break; } case IDCANCEL: // the escape key
{ EndDialog(hDlg,wParam); break; } case IDC_VENDOR_LIST: { handleVendorList(hDlg,uMsg,wParam,lParam); break; } case IDC_MODEL_LIST: { handleModelList(hDlg,uMsg,wParam,lParam); break; } case IDC_PORT_LIST: { handlePortList(hDlg,uMsg,wParam,lParam); break; } default: { bRes = FALSE; break; } } return bRes; }
/*
* void initUPSSelectDlg (HWND hDlg, * UINT uMsg, * WPARAM wParam, * LPARAM lParam); * * Description: initializes global data and controls for UPS select dialog * * Additional Information: * * Parameters: * * HWND hDlg :- Handle to dialog box * * UINT uMsg :- message ID * * WPARAM wParam :- Specifies additional message-specific information. * * LPARAM lParam :- Specifies additional message-specific information. * * Return Value: none */ void initUPSSelectDlg(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { /*
* load registry settings */ getUPSConfigValues();
/*
* load string resources */ LoadString( GetUPSModuleHandle(), IDS_NO_UPS_VENDOR, g_szNoUPSVendor, sizeof(g_szNoUPSVendor)/sizeof(TCHAR));
LoadString( GetUPSModuleHandle(), IDS_OTHER_UPS_VENDOR, g_szOtherUPSVendor, sizeof(g_szOtherUPSVendor)/sizeof(TCHAR));
LoadString( GetUPSModuleHandle(), IDS_CUSTOM_UPS_MODEL, g_szCustomUPSModel, sizeof(g_szCustomUPSModel)/sizeof(TCHAR));
LoadString( GetUPSModuleHandle(), IDS_COM_PORT_PREFIX, g_szCOMPortPrefix, sizeof(g_szCOMPortPrefix)/sizeof(TCHAR));
/*
* disable the Finish button, just in case its not disabled by default */ //EnableWindow( GetDlgItem( hDlg, IDB_SELECT_FINISH), FALSE);
/*
* init the list controls */ updateVendorList( hDlg); updateModelList( hDlg); updatePortList( hDlg); configFinishButton(hDlg);
}
/*
* void updateVendorList (HWND hDlg); * * Description: updates the vendor list control in UPS select dialog * * Additional Information: * * Parameters: * * HWND hDlg :- Handle to dialog box * * Return Value: none */ void updateVendorList(HWND hDlg) { HKEY hkResult; LRESULT lListRes;
g_vendorState = eVendorUnknown;
/*
* clear and disable the list */ lListRes = SendDlgItemMessage( hDlg, IDC_VENDOR_LIST, CB_RESETCONTENT,0,0); EnableWindow( GetDlgItem( hDlg, IDC_VENDOR_LIST), FALSE); EnableWindow( GetDlgItem( hDlg, IDC_VENDOR_TEXT), FALSE);
// Add "None" as the first item in the list
lListRes = SendDlgItemMessage( hDlg, IDC_VENDOR_LIST, CB_ADDSTRING, 0, (LPARAM)g_szNoUPSVendor);
/*
* Build the rest of the Vendor list from the registry */ if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, UPS_SERVICE_ROOT, 0, KEY_ENUMERATE_SUB_KEYS, &hkResult)) { DWORD dwIndex = 0; LONG lRes = ERROR_SUCCESS; TCHAR szKeyName[MAX_PATH] = _T(""); DWORD dwKeyLen; FILETIME ftLast;
while (ERROR_SUCCESS == lRes) { dwKeyLen = sizeof(szKeyName)/sizeof(TCHAR);
lRes = RegEnumKeyEx(hkResult, dwIndex, szKeyName, // address of buffer for subkey name
&dwKeyLen, // address for size of subkey buffer
NULL, // reserved
NULL, // address of buffer for class string
NULL, // address for size of class buffer
&ftLast); // address for time key last written to
// The "NoUPS" and "OtherUPS" options are added manually
// before and after spinning through the registry
// (unlike mfg names, these string require localization).
// In RC2 registry keys were created with these values (English only).
// To avoid duplicate entries in the combo, if the registry key name
// matches the "NoUPS" or "OtherUPS" strings then skip over it.
if( (ERROR_SUCCESS == lRes) && (0 != _tcsicmp( szKeyName, g_szNoUPSVendor)) && (0 != _tcsicmp( szKeyName, g_szOtherUPSVendor)) ) { lListRes = SendDlgItemMessage( hDlg, IDC_VENDOR_LIST, CB_ADDSTRING, 0, (LPARAM)szKeyName); }
dwIndex++; }
RegCloseKey(hkResult);
}
// Add the "Generic" vendor at the end of the list
lListRes = SendDlgItemMessage( hDlg, IDC_VENDOR_LIST, CB_ADDSTRING, 0, (LPARAM)g_szOtherUPSVendor);
EnableWindow( GetDlgItem( hDlg, IDC_VENDOR_LIST), TRUE); EnableWindow( GetDlgItem( hDlg, IDC_VENDOR_TEXT), TRUE);
// Now find the current vendor in the combo box...
//
lListRes = SendDlgItemMessage(hDlg, IDC_VENDOR_LIST, CB_FINDSTRINGEXACT, -1, (LPARAM)g_szCurrentVendor);
// ... and select it.
if( CB_ERR != lListRes ) { lListRes = SendDlgItemMessage( hDlg, IDC_VENDOR_LIST, CB_SETCURSEL, lListRes, 0); }
// Set the vendor state
//
if (0 == _tcsicmp( g_szCurrentVendor, g_szNoUPSVendor)) { g_vendorState = eVendorNone; } else { if (0 == _tcsicmp( g_szCurrentVendor, g_szOtherUPSVendor)) { g_vendorState = eVendorGeneric; } else { g_vendorState = eVendorSelected; } } }
/*
* void updateModelList (HWND hDlg); * * Description: updates the UPS model list control in UPS select dialog * * Additional Information: * * Parameters: * * HWND hDlg :- Handle to dialog box * * Return Value: none */ void updateModelList(HWND hDlg) { LRESULT lListRes;
g_modelState = eModelUnknown;
/*
* clear and disable the list */ lListRes = SendDlgItemMessage( hDlg, IDC_MODEL_LIST, LB_RESETCONTENT,0,0); configModelList( hDlg);
/*
* load the list, but only if: * 1) the current vendor is valid and not NONE */ if (eVendorGeneric == g_vendorState) { lListRes = SendDlgItemMessage( hDlg, IDC_MODEL_LIST, LB_ADDSTRING, 0, (LPARAM)g_szCustomUPSModel); }
if (eVendorSelected == g_vendorState) { HKEY hkResult; TCHAR szVendorKey[MAX_PATH] = _T("");
wsprintf(szVendorKey,_T("%s\\%s"),UPS_SERVICE_ROOT,g_szCurrentVendor); if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, szVendorKey, 0, KEY_QUERY_VALUE, &hkResult)) { DWORD dwIndex = 0; LONG lRes = ERROR_SUCCESS; TCHAR szValueName[MAX_PATH] = _T(""); DWORD dwValueLen; while (ERROR_SUCCESS == lRes) { dwValueLen = sizeof(szValueName)/sizeof(TCHAR);
lRes = RegEnumValue(hkResult, dwIndex, szValueName, // address of buffer for subkey name
&dwValueLen, // address for size of subkey buffer
NULL, // reserved
NULL, // address of buffer for type code
NULL, // address of buffer for value data
NULL); // address for size of data buffer
if (ERROR_SUCCESS == lRes) { lListRes = SendDlgItemMessage( hDlg, IDC_MODEL_LIST, LB_ADDSTRING, 0, (LPARAM)szValueName); }
dwIndex++; }
RegCloseKey(hkResult);
}
// Now find the current model in the list box...
//
lListRes = SendDlgItemMessage(hDlg, IDC_VENDOR_LIST, LB_FINDSTRINGEXACT, -1, (LPARAM)g_szCurrentModel);
// ... and select it.
if( CB_ERR != lListRes ) { lListRes = SendDlgItemMessage( hDlg, IDC_VENDOR_LIST, LB_SETCURSEL, lListRes, 0); } }
/*
* set the model state */ if (0 == _tcsicmp( g_szCurrentModel, g_szCustomUPSModel)) { g_modelState = eModelCustom; } else { g_modelState = eModelSelected; }
configModelList( hDlg); }
/*
* void updatePortList (HWND hDlg); * * Description: updates the UPS port list control in UPS select dialog * * Additional Information: * * Parameters: * * HWND hDlg :- Handle to dialog box * * Return Value: none */ void updatePortList(HWND hDlg) { HKEY hkResult; LPTSTR lpColon;
g_portState = ePortUnknown;
/*
* disable the list */ configPortList( hDlg);
/*
* remove possible trailing colon from COM port setting */ if (NULL != (lpColon = _tcschr( g_szCurrentPort, (TCHAR)':'))) { *lpColon = (TCHAR)'\0'; }
/*
* (re)building the port list, its ok to wipe it out */ SendDlgItemMessage( hDlg, IDC_PORT_LIST, CB_RESETCONTENT,0,0);
if (ERROR_SUCCESS == RegOpenKeyEx( HKEY_LOCAL_MACHINE, UPS_PORT_ROOT, 0, KEY_QUERY_VALUE, &hkResult)) { DWORD dwIndex = 0; LONG lRes = ERROR_SUCCESS; TCHAR szPortValue[MAX_PATH] = _T(""); TCHAR szPortData[MAX_PATH] = _T(""); DWORD dwPortLen; while (ERROR_SUCCESS == lRes) { dwPortLen = sizeof(szPortValue)/sizeof(TCHAR);
lRes = RegEnumValue(hkResult, dwIndex, szPortValue,// address of buffer for subkey name
&dwPortLen, // address for size of subkey buffer
NULL, // reserved
NULL, // address of buffer for type code
NULL, // address of buffer for value data
NULL); // address for size of data buffer
if (ERROR_SUCCESS == lRes) { DWORD dwValueLen; DWORD dwValueType;
// Once we have the szPortValue we need to get its data.
// This is what we'll put in the combobox.
dwValueLen = sizeof(szPortData)/sizeof(TCHAR);
lRes = RegQueryValueEx( hkResult, // handle to key to query
szPortValue, // address of name of value to query
NULL, // reserved
&dwValueType, // address of buffer for value type
(LPBYTE)szPortData, // address of data buffer
&dwValueLen // address of data buffer size
); if (ERROR_SUCCESS == lRes) { LONG_PTR listRes; // Add szPortData to the combobox
listRes = SendDlgItemMessage( hDlg, IDC_PORT_LIST, CB_ADDSTRING, 0, (LPARAM)szPortData);
/*
* this item matches the currentPort, so select it. */ if (0 ==_tcsicmp( szPortData, g_szCurrentPort) && CB_ERR != listRes && CB_ERRSPACE != listRes) { if( CB_ERR != SendDlgItemMessage( hDlg, IDC_PORT_LIST, CB_SETCURSEL, listRes,0) ) { // the combobox is enabled based on whether or not
// a port is selected so if the CB_SETCURSEL call
// is successful, we should set the port state accordingly
g_portState = ePortSelected; }
} } // RegQueryValueEx
} // RegEnumValue
dwIndex++;
} // while loop
// If I haven't already set the current selection then
// default to the 0th item in the combobox and set the
// g_portState to indicate that we have a selection
if( g_portState != ePortSelected ) { if( CB_ERR != SendDlgItemMessage( hDlg, IDC_PORT_LIST, CB_SETCURSEL, 0,0) ) { // the combobox is enabled based on whether or not
// a port is selected so if the CB_SETCURSEL call
// is successful, we should set the port state accordingly
g_portState = ePortSelected; } }
RegCloseKey(hkResult); }
configPortList( hDlg); }
/*
* void handleVendorList (HWND hDlg, * UINT uMsg, * WPARAM wParam, * LPARAM lParam); * * Description: handles messages specific to the Vendor List control * * Additional Information: * * Parameters: * * HWND hDlg :- Handle to dialog box * * UINT uMsg :- message ID * * WPARAM wParam :- Specifies additional message-specific information. * * LPARAM lParam :- Specifies additional message-specific information. * * Return Value: none */ void handleVendorList(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (HIWORD(wParam)) { case CBN_SELCHANGE://CBN_CLOSEUP:
{ LONG_PTR lVendorRes; TCHAR szVendorName[MAX_PATH] = _T("");
/*
* Get the user's selection */ lVendorRes = SendDlgItemMessage( hDlg, IDC_VENDOR_LIST, CB_GETCURSEL, 0,0); if (CB_ERR != lVendorRes) { lVendorRes = SendDlgItemMessage( hDlg, IDC_VENDOR_LIST, CB_GETLBTEXT, lVendorRes, (LPARAM)szVendorName); if (CB_ERR != lVendorRes) { /*
* if its different from the current value, affect a change */ _tcscpy(g_szCurrentVendor, szVendorName);
/*
* set new vendor state */ if (0 == _tcsicmp(szVendorName,g_szNoUPSVendor)) { g_vendorState = eVendorNone; } else { if (0 == _tcsicmp(szVendorName,g_szOtherUPSVendor)) { g_vendorState = eVendorGeneric; } else { g_vendorState = eVendorSelected; }
}
/*
* force user to select a new model */ _tcscpy(g_szCurrentModel, _T(""));
/*
* disable the model and port lists * forcing the user to reselect them */ updateModelList(hDlg); configPortList( hDlg); } }
configFinishButton( hDlg); break; } } }
/*
* void handleModelList (HWND hDlg, * UINT uMsg, * WPARAM wParam, * LPARAM lParam); * * Description: handles messages specific to the Model list control * * Additional Information: * * Parameters: * * HWND hDlg :- Handle to dialog box * * UINT uMsg :- message ID * * WPARAM wParam :- Specifies additional message-specific information. * * LPARAM lParam :- Specifies additional message-specific information. * * Return Value: none */ void handleModelList(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { LONG_PTR lModelRes;
switch (HIWORD(wParam)) { case LBN_SETFOCUS: { /*
* focus has come into the list, make sure * selected item is visible */ lModelRes = SendDlgItemMessage( hDlg, IDC_MODEL_LIST, LB_GETCURSEL, 0,0); if (LB_ERR != lModelRes) { lModelRes = SendDlgItemMessage( hDlg, IDC_MODEL_LIST, LB_SETTOPINDEX, lModelRes, 0); } break; }
case LBN_DBLCLK: case LBN_SELCHANGE: { TCHAR szModelName[MAX_PATH] = _T("");
/*
* get the user selection */ lModelRes = SendDlgItemMessage( hDlg, IDC_MODEL_LIST, LB_GETCURSEL, 0,0); if (LB_ERR != lModelRes) { lModelRes = SendDlgItemMessage( hDlg, IDC_MODEL_LIST, LB_GETTEXT, lModelRes, (LPARAM)szModelName); if (LB_ERR != lModelRes) { _tcscpy( g_szCurrentModel, szModelName);
/*
* set new model state */ if (0==_tcsicmp( szModelName,g_szCustomUPSModel)) { g_modelState = eModelCustom; } else { g_modelState = eModelSelected; }
/*
* enable port selection in the event that * changing Vendors disabled the port selector */ configPortList( hDlg); } }
configFinishButton( hDlg); break; } } }
/*
* void handlePortList (HWND hDlg, * UINT uMsg, * WPARAM wParam, * LPARAM lParam); * * Description: handles messages specific to the Port list control * * Additional Information: * * Parameters: * * HWND hDlg :- Handle to dialog box * * UINT uMsg :- message ID * * WPARAM wParam :- Specifies additional message-specific information. * * LPARAM lParam :- Specifies additional message-specific information. * * Return Value: none */ void handlePortList(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (HIWORD(wParam)) { case CBN_SELCHANGE: //CBN_CLOSEUP:
{ LONG_PTR lPortRes; TCHAR szPortName[MAX_PATH] = _T("");
/*
* get the user selection */ lPortRes = SendDlgItemMessage( hDlg, IDC_PORT_LIST, CB_GETCURSEL, 0,0); if (CB_ERR != lPortRes) { lPortRes = SendDlgItemMessage( hDlg, IDC_PORT_LIST, CB_GETLBTEXT, lPortRes, (LPARAM)szPortName); if (CB_ERR != lPortRes) { _tcscpy( g_szCurrentPort, szPortName);
/*
* set port state */ g_portState = ePortSelected; } }
configFinishButton( hDlg); break; } } }
/*
* void setServiceData (HWND hDlg); * * Description: utility to configure the registry entries that * contain info used by the UPS service * * Additional Information: * * Parameters: * * HWND hDlg :- Handle to dialog box * * Return Value: none */ void setServiceData(HWND hDlg) { TCHAR szModelEntry[MAX_PATH] = _T("");
DWORD dwTmpOpts = 0; LPTSTR lpTmpDLL = _T("");
/*
* check that a vendor and model have been selected. If None * were selected, that is considered a bad model.. and this * check will fail, however, Custom/Generic is a valid selection */ if ((eModelSelected == g_modelState && eVendorSelected == g_vendorState)|| (eModelCustom == g_modelState && eVendorGeneric == g_vendorState)) { /*
* If the custom UPS model is selected, don't bother * reading the registry entry. Custom can only be simple * signalling and the options come from the custom dialog */ if (eModelCustom == g_modelState) { dwTmpOpts = g_dwCurrentCustomOptions; } else { HKEY hkResult; TCHAR szVendorKey[MAX_PATH] = _T("");
wsprintf( szVendorKey, _T("%s\\%s"), UPS_SERVICE_ROOT, g_szCurrentVendor); if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, szVendorKey, 0, KEY_QUERY_VALUE, &hkResult)) { LONG lRes; DWORD dwValueLen; DWORD dwValueType;
dwValueLen = sizeof(szModelEntry); //BYTES HERE, NOT CHARS
lRes = RegQueryValueEx( hkResult, // handle to key to query
g_szCurrentModel, // address of name of value to query
NULL, // reserved
&dwValueType, // address of buffer for value type
(LPBYTE)szModelEntry, // address of data buffer
&dwValueLen // address of data buffer size
);
if ((ERROR_SUCCESS == lRes) && (0 != dwValueLen)) { LPTSTR lpColon = NULL; /*
* seperate the DLL from the options data */ if (NULL != (lpColon = _tcschr( szModelEntry, (TCHAR)';'))) { *lpColon = (TCHAR)'\0'; lpColon++;
lpTmpDLL = lpColon; }
/*
* convert options data from string to int * WARNING: * wscanf doesn't work * _tscanf doesn't work * swscanf does * _stscanf does */ if (swscanf( szModelEntry, _T("%x"), &dwTmpOpts) == 0) { // options could not be converted properly, set back to previous value
dwTmpOpts = g_dwCurrentCustomOptions; } }
RegCloseKey( hkResult); } } }
/*
* Move values into the registry */ g_dwCurrentOptions = dwTmpOpts; _tcscpy(g_szCurrentServiceDLL, lpTmpDLL); }
/*
* void configPortList (HWND hDlg); * * Description: utility to configure port selection list ctrl * * Additional Information: * * Parameters: * * HWND hDlg :- Handle to dialog box * * Return Value: none */ void configPortList(HWND hDlg) { /*
* enable the Port selection list, if * 1) there is a valid vendor/model selection * this includes Custom/Generic but NOT (none) * 2) there is a port or some type specified */ if (((eModelSelected == g_modelState && eVendorSelected == g_vendorState)|| (eModelCustom == g_modelState && eVendorGeneric == g_vendorState)) && ePortUnknown != g_portState) { EnableWindow( GetDlgItem( hDlg, IDC_PORT_LIST), TRUE); EnableWindow( GetDlgItem( hDlg, IDC_PORT_TEXT), TRUE); } else { EnableWindow( GetDlgItem( hDlg, IDC_PORT_LIST), FALSE); EnableWindow( GetDlgItem( hDlg, IDC_PORT_TEXT), FALSE); } }
/*
* void configModelList (HWND hDlg); * * Description: utility to configure model selection list ctrl * * Additional Information: * * Parameters: * * HWND hDlg :- Handle to dialog box * * Return Value: none */ void configModelList(HWND hDlg) { LRESULT lModelRes;
/*
* to enable the model list, there has to * be a valid or generic vendor selection (NOT none) */ if ((eVendorGeneric == g_vendorState || eVendorSelected == g_vendorState)) { EnableWindow( GetDlgItem( hDlg, IDC_MODEL_LIST), TRUE); EnableWindow( GetDlgItem( hDlg, IDC_MODEL_TEXT), TRUE);
/*
* make sure the selected item is visible */ lModelRes = SendDlgItemMessage( hDlg, IDC_MODEL_LIST, LB_GETCURSEL, 0,0); if (LB_ERR != lModelRes) { SendDlgItemMessage( hDlg, IDC_MODEL_LIST, LB_SETTOPINDEX, lModelRes,0); } } else { EnableWindow( GetDlgItem( hDlg, IDC_MODEL_LIST), FALSE); EnableWindow( GetDlgItem( hDlg, IDC_MODEL_TEXT), FALSE); } }
/*
* void configFinishButton (HWND hDlg); * * Description: utility to configure the Finish button ctrl * * Additional Information: * * Parameters: * * HWND hDlg :- Handle to dialog box * * Return Value: none */ void configFinishButton(HWND hDlg) { BOOL bFinState = FALSE;
g_finishButtonState = eFinish; // default
/*
* enable Finish if vendor is NONE */ if (eVendorNone == g_vendorState) { bFinState = TRUE; } else { /*
* If all other fields are valid, enable the button */ if (eVendorUnknown != g_vendorState && eModelUnknown != g_modelState && ePortUnknown != g_portState) { bFinState = TRUE;
/*
* if the vendor/model is other/custom, the text of * the button is Next */ if (eVendorGeneric == g_vendorState && eModelCustom == g_modelState) { g_finishButtonState = eNext; } } }
/*
* toggle between the finish and next buttons */ SendDlgItemMessage( hDlg, IDB_SELECT_FINISH, BM_SETSTYLE, eFinish == g_finishButtonState ? BS_DEFPUSHBUTTON:BS_PUSHBUTTON, (LPARAM) TRUE);
//
// Set the NExt Button's style
//
SendDlgItemMessage( hDlg, IDB_SELECT_NEXT, BM_SETSTYLE, eNext == g_finishButtonState ? BS_DEFPUSHBUTTON:BS_PUSHBUTTON, (LPARAM) TRUE);
//
// Set the default push button's control ID.
//
SendMessage ( hDlg, DM_SETDEFID, eFinish == g_finishButtonState ? IDB_SELECT_FINISH: IDB_SELECT_NEXT, 0L);
ShowWindow( GetDlgItem( hDlg, IDB_SELECT_FINISH), (eFinish == g_finishButtonState ? SW_SHOW : SW_HIDE));
ShowWindow( GetDlgItem( hDlg, IDB_SELECT_NEXT), (eFinish == g_finishButtonState ? SW_HIDE : SW_SHOW));
EnableWindow( GetDlgItem( hDlg, eFinish == g_finishButtonState ? IDB_SELECT_FINISH : IDB_SELECT_NEXT), bFinState);
}
|