|
|
#include "pch.h"
#pragma hdrstop
#include <ncxbase.h>
#include "advanced.h"
#include "advstrs.h"
#include "kkcwinf.h"
#include "ncatlui.h"
#include "ncreg.h"
#include "ncsetup.h"
#include "ncui.h"
#include "resource.h"
//+---------------------------------------------------------------------------
//
// Member: CAdvancedParams::CAdvancedParams (constructor)
//
// Purpose: Init some variables.
//
// Author: t-nabilr 06 Apr 1997
//
// Notes: The bulk of the setting up occurs in FInit().
//
CAdvancedParams::CAdvancedParams() : m_hkRoot(NULL), m_pparam(NULL), m_nCurSel(0), m_fInit(FALSE), m_hdi(NULL), m_pdeid(NULL) { }
//+---------------------------------------------------------------------------
//
// Member: CAdvancedParams::HrInit
//
// Purpose: Initializes the class.
//
// Arguments:
// pnccItem [in] ptr to my INetCfgComponent interface.
//
// Returns: TRUE if initialization was okay, FALSE if couldn't init.
//
// Author: t-nabilr 06 Apr 1997
//
// Notes: We needed to separate this from the constructor since the
// initialization can fail.
//
HRESULT CAdvancedParams::HrInit(HDEVINFO hdi, PSP_DEVINFO_DATA pdeid) { HKEY hkNdiParamKey;
Assert(IsValidHandle(hdi)); Assert(pdeid);
// Open the device's instance key
HRESULT hr = HrSetupDiOpenDevRegKey(hdi, pdeid, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_ALL_ACCESS, &m_hkRoot);
if (SUCCEEDED(hr)) { hr = HrRegOpenKeyEx(m_hkRoot, c_szRegKeyParamsFromInstance, KEY_READ | KEY_SET_VALUE, &hkNdiParamKey); // populate the parameter list
if (SUCCEEDED(hr)) { FillParamList(m_hkRoot, hkNdiParamKey); RegSafeCloseKey(hkNdiParamKey); m_fInit = TRUE; m_hdi = hdi; m_pdeid = pdeid; hr = S_OK; } }
TraceErrorOptional("CAdvancedParams::HrInit", hr, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr); return hr; }
CAdvancedParams::~CAdvancedParams() { vector<CParam *>::iterator ppParam;
// delete everything from the list
for (ppParam = m_listpParam.begin(); ppParam != m_listpParam.end(); ppParam++) { delete *ppParam; }
RegSafeCloseKey(m_hkRoot); }
//+---------------------------------------------------------------------------
//
// Member: CAdvancedParams::FSave
//
// Purpose: Saves values from InMemory storage to the registry.
//
// Returns: TRUE if something was changed; FALSE if nothig changed
// registry.
//
// Author: t-nabilr 06 Apr 1997
//
// Notes:
//
BOOL CAdvancedParams::FSave() { vector<CParam *>::iterator ppParam; BOOL fErrorOccurred = FALSE;
// Save any changed params
BOOL fDirty = FALSE; for (ppParam = m_listpParam.begin(); ppParam != m_listpParam.end(); ppParam++) { Assert(ppParam); Assert(*ppParam); if ((*ppParam)->FIsModified()) { fDirty = TRUE; TraceTag(ttidNetComm, "Parameter %S has changed", (*ppParam)->SzGetKeyName()); if (!(*ppParam)->Apply()) { fErrorOccurred = TRUE; } } }
if (fErrorOccurred) { TraceTag(ttidError, "An error occurred saving adapter's %S " "parameter.", (*ppParam)->GetDesc()); }
return fDirty; }
//+---------------------------------------------------------------------------
//
// Member: CAdvancedParams::FillParamList
//
// Purpose: Populates the internal parameter list (m_listpParam) with
// values from the registry.
//
// Arguments:
// hk [in] The key from which to enumerate the parameters.
// Normally obtained from a call to INCC->OpenNdiParamKey().
//
// Author: t-nabilr 06 Apr 1997
//
// Notes:
//
VOID CAdvancedParams::FillParamList(HKEY hkRoot, HKEY hk) { DWORD iValue; CParam *pParam; WCHAR szRegValue[_MAX_PATH]; DWORD cchRegValue; HRESULT hr = S_OK; FILETIME ft;
// Initialize the list.
m_listpParam.erase(m_listpParam.begin(), m_listpParam.end());
iValue = 0;
for (iValue = 0; SUCCEEDED(hr); iValue++) { cchRegValue = celems(szRegValue);
hr = HrRegEnumKeyEx(hk, iValue, szRegValue, &cchRegValue, NULL,NULL,&ft);
if (SUCCEEDED(hr)) { // Create the param structure
pParam = new CParam;
if (pParam == NULL) { return; }
if (pParam->FInit(hkRoot, hk,szRegValue)) { // Add parameter to list.
m_listpParam.push_back(pParam); } else { // couldn't Create() it...
delete pParam; } } } }
//+---------------------------------------------------------------------------
//
// Member: CAdvancedParams::FValidateAllParams
//
// Purpose: Validates values of all parameters. Displays optional
// error UI.
//
// Arguments:
// fDisplayUI [in] TRUE - on error, focus is set to offending
// parameter and the error message box is displayed.
// FALSE - don't do any UI thing on error. Useful
// when the dialog has not been initialized.
// Returns: TRUE - everything validated okay.
// FALSE - error with one of the parameters. If (fDisplayUI),
// then the currently displayed parameter is the offending one.
//
// Author: t-nabilr 06 Apr 1997
//
// Notes: Calls FValidateSingleParam() for each parameter.
//
BOOL CAdvancedParams::FValidateAllParams(BOOL fDisplayUI, HWND hwndParent) { BOOL fRetval = TRUE; for (size_t i = 0; i < m_listpParam.size(); i++) { if (!FValidateSingleParam(m_listpParam[i], fDisplayUI, hwndParent)) { TraceTag(ttidError, "NetComm : %S parameter failed validation", m_listpParam[i]->GetDesc()); fRetval = FALSE; break; } } return fRetval; }
//+---------------------------------------------------------------------------
//
// Member: CAdvancedParams::FValidateSingleParam
//
// Purpose: Validates a single parameter. Displaying an optional
// error UI.
//
// Arguments:
// pparam [in] ptr to the param to be validated. If
// (fDisplayUI), then this must be the currently
// displayed parameter.
// fDisplayUI [in] TRUE - error UI is to be displayed.
// FALSE - no error UI is to be displayed.
//
// Returns: TRUE - parameter validated okay; FALSE - error in parameter.
//
// Author: t-nabilr 06 Apr 1997
//
// Notes: If fDisplayUI, then pparam must be the currently displayed
// param, since the error box will pop up indicating the error.
//
BOOL CAdvancedParams::FValidateSingleParam(CParam * pparam, BOOL fDisplayUI, HWND hwndParent) { BOOL fRetval = FALSE; WCHAR szMin[c_cchMaxNumberSize]; WCHAR szMax[c_cchMaxNumberSize]; WCHAR szStep[c_cchMaxNumberSize];
// ensure we're the currently displayed param if fDisplayUI
AssertSz(FImplies(fDisplayUI, m_pparam == pparam), "Not the currently displayed param.");
switch (pparam->Validate()) { case VALUE_OK: fRetval = TRUE; break;
case VALUE_BAD_CHARS: if (fDisplayUI) { NcMsgBox(hwndParent, IDS_ERROR_CAPTION, IDS_ERR_VALUE_BAD_CHARS, MB_ICONWARNING); } break;
case VALUE_EMPTY: if (fDisplayUI) { NcMsgBox(hwndParent, IDS_ERROR_CAPTION, IDS_ERR_VALUE_EMPTY, MB_ICONWARNING); } break;
case VALUE_OUTOFRANGE: Assert(pparam->GetValue()->IsNumeric()); pparam->GetMin()->ToString(szMin, celems(szMin)); pparam->GetMax()->ToString(szMax, celems(szMax)); if (fDisplayUI) { // need to select between two dialogs depending on the step size.
if (pparam->GetStep()->GetNumericValueAsDword() == 1) { // no step
NcMsgBox(hwndParent, IDS_ERROR_CAPTION, IDS_PARAM_RANGE, MB_ICONWARNING, szMin, szMax); } else { pparam->GetStep()->ToString(szStep, celems(szStep)); NcMsgBox(hwndParent, IDS_ERROR_CAPTION, IDS_PARAM_RANGE_STEP, MB_ICONWARNING, szMin, szMax, szStep); } } else { TraceTag(ttidNetComm, "The parameter %S was out of range. " "Attempting to correct.", pparam->SzGetKeyName()); // Since we can't bring up UI, we will try to correct the
// error for the user
//
if (pparam->GetMin() > pparam->GetValue()) { // Try to set to the minimum value. If it fails, we must still
// continue
(void) FSetParamValue(pparam->SzGetKeyName(), szMin); }
if (pparam->GetMax() < pparam->GetValue()) { // Try to set to the maximum value. If it fails, we must still
// continue
(void) FSetParamValue(pparam->SzGetKeyName(), szMax); } } break; default: AssertSz(FALSE,"Hit the default on a switch"); }
return fRetval; }
//+---------------------------------------------------------------------------
//
// Member: CAdvancedParams::UseAnswerFile
//
// Purpose: Get adapter specific params from the answerfile
//
// Arguments:
// szAnswerFile [in] path of answerfile
// szSection [in] section within answerfile
//
// Author: t-nabilr 06 Apr 1997
//
// Notes:
//
VOID CAdvancedParams::UseAnswerFile(const WCHAR * szAnswerFile, const WCHAR * szSection) { CWInfFile AnswerFile; CWInfSection* pSection; const WCHAR* szAFKeyName; const WCHAR* szAFKeyValue; const WCHAR* szAdditionalParamsSection;
// initialize answer file class
if (AnswerFile.Init() == FALSE) { AssertSz(FALSE,"CAdvancedParams::UseAnswerFile - Failed to initialize CWInfFile"); return; } // Open the answerfile and find the desired section.
AnswerFile.Open(szAnswerFile); pSection = AnswerFile.FindSection(szSection);
if (pSection) {
// go through all the keys in this section.
CWInfKey * pInfKey;
// Now, go to AdditionalParams section and read key values from there
szAdditionalParamsSection = pSection->GetStringValue(L"AdditionalParams", L""); Assert(szAdditionalParamsSection); if (lstrlenW(szAdditionalParamsSection) < 1) { TraceTag(ttidNetComm, "No additional params section"); } else { pSection = AnswerFile.FindSection(szAdditionalParamsSection); if (!pSection) { TraceTag(ttidNetComm, "Specified AdditionalParams section not " "found."); } else { for (pInfKey = pSection->FirstKey(); pInfKey; pInfKey = pSection->NextKey()) { // get key name
szAFKeyName = pInfKey->Name(); szAFKeyValue = pInfKey->GetStringValue(L""); Assert(szAFKeyName && szAFKeyValue); if (!FSetParamValue(szAFKeyName, szAFKeyValue)) { TraceTag(ttidNetComm, "Key %S not in ndi\\params. " "Assuming it is a static parameter.", szAFKeyName); } } // for
} // if
} // if
} }
//+---------------------------------------------------------------------------
//
// Member: CAdvancedParams::SetParamValue
//
// Purpose: Sets a parameter's value
//
// Arguments:
// szName [in] Name of parameter.
// szValue [in] value (in text) to give param (from Answerfile)
//
// Returns: TRUE if szName was found.
//
// Author: t-nabilr 06 Apr 1997
//
// Notes:
//
BOOL CAdvancedParams::FSetParamValue ( const WCHAR* pszName, const WCHAR* const pszValue) { for (size_t i = 0; i < m_listpParam.size(); i++) { if (0 == lstrcmpiW (pszName, m_listpParam[i]->SzGetKeyName())) { // found the param
// set it's current value
m_listpParam[i]->GetValue()->FromString (pszValue); m_listpParam[i]->SetModified (TRUE); return TRUE; // found
} } return FALSE; // not found
}
|