#include #include #include #include #include #include #include "errdlg.h" #include "rawerror.h" #include "resource.h" extern HINSTANCE g_hInstance; // // String constants // #define INI_FILE_NAME TEXT("forceerr.ini") #define GENERAL_SECTION TEXT("ForceError") #define PROGRAMS_SECTION TEXT("Programs") #define LAST_PROGRAM TEXT("LastProgram") CErrorMessageDialog::CErrorMessageDialog( HWND hWnd ) : m_hWnd(hWnd), m_strIniFileName(INI_FILE_NAME) { // // Create an absolute pathname for the default INI file, // so it points to the same directory as the EXE // TCHAR szCurrFile[MAX_PATH]; if (GetModuleFileName( NULL, szCurrFile, ARRAYSIZE(szCurrFile))) { if (PathRemoveFileSpec( szCurrFile )) { m_strIniFileName = CSimpleString(szCurrFile); if (!m_strIniFileName.MatchLastCharacter(TEXT('\\'))) { m_strIniFileName += TEXT("\\"); } m_strIniFileName += CSimpleString(INI_FILE_NAME); } } // // If the default INI file location has been overridden in the registry, use it instead // CSimpleString strIniFile = CSimpleReg( HKEY_FORCEERROR, REGSTR_FORCEERR_KEY ).Query( INI_FILE_NAME, TEXT("") ); if (strIniFile.Length()) { m_strIniFileName = strIniFile; } } CErrorMessageDialog::~CErrorMessageDialog() { } void CErrorMessageDialog::SelectError( HRESULT hrSelect ) { LRESULT nSel = 0; for (LRESULT i=0;i(SendDlgItemMessage( m_hWnd, IDC_ERROR_VALUE, CB_GETITEMDATA, i, 0 )); if (hrSelect == hr) { nSel = i; break; } } SendDlgItemMessage( m_hWnd, IDC_ERROR_VALUE, CB_SETCURSEL, nSel, 0 ); } void CErrorMessageDialog::SelectErrorPoint( int nErrorPoint ) { for (LRESULT i=0;i(pszText))) { strResult = pszText; } delete[] pszText; } } return strResult; } CSimpleString CErrorMessageDialog::GetCurrentlySelectedComboBoxString( HWND hWnd ) { CSimpleString strResult; LRESULT nIndex = SendMessage( hWnd, CB_GETCURSEL, 0, 0 ); if (CB_ERR != nIndex) { strResult = GetComboBoxString( hWnd, nIndex ); } return strResult; } LRESULT CErrorMessageDialog::GetCurrentComboBoxSelection( HWND hWnd ) { return SendMessage( hWnd, CB_GETCURSEL, 0, 0 ); } LRESULT CErrorMessageDialog::GetCurrentComboBoxSelectionData( HWND hWnd, LRESULT nDefault ) { LRESULT lResult = nDefault; LRESULT nCurIndex = GetCurrentComboBoxSelection( hWnd ); if (CB_ERR != nCurIndex) { lResult = GetComboBoxItemData( hWnd, nCurIndex, nDefault ); } return lResult; } CSimpleString CErrorMessageDialog::GetIniString( LPCTSTR pszSection, LPCTSTR pszKey, LPCTSTR pszDefault ) { CSimpleString strResult(pszDefault); TCHAR szString[1024]; if (GetPrivateProfileString( pszSection, pszKey, pszDefault, szString, ARRAYSIZE(szString), m_strIniFileName )) { strResult = szString; } return strResult; } UINT CErrorMessageDialog::GetIniInt( LPCTSTR pszSection, LPCTSTR pszKey, UINT nDefault ) { return GetPrivateProfileInt( pszSection, pszKey, nDefault, m_strIniFileName ); } void CErrorMessageDialog::PopulateProgramComboBox() { WIA_PUSH_FUNCTION((TEXT("PopulateProgramComboBox"))); SendDlgItemMessage( m_hWnd, IDC_ERROR_PROGRAMS, CB_RESETCONTENT, 0, 0 ); const int c_nSize = 24000; LPTSTR pszSections = new TCHAR[c_nSize]; if (pszSections) { if (GetPrivateProfileString( PROGRAMS_SECTION, NULL, TEXT(""), pszSections, c_nSize, m_strIniFileName )) { for (LPTSTR pszCurr=pszSections;pszCurr && *pszCurr;pszCurr += lstrlen(pszCurr)+1 ) { TCHAR szAppName[MAX_PATH] = {0}; if (GetPrivateProfileString( PROGRAMS_SECTION, pszCurr, TEXT(""), szAppName, ARRAYSIZE(szAppName), m_strIniFileName )) { if (lstrlen(szAppName)) { SendDlgItemMessage( m_hWnd, IDC_ERROR_PROGRAMS, CB_ADDSTRING, 0, reinterpret_cast(szAppName) ); } } } } delete[] pszSections; } LRESULT nSelectedItem = 0; CSimpleString strLastSelectedProgram = GetIniString( GENERAL_SECTION, LAST_PROGRAM ); if (strLastSelectedProgram.Length()) { nSelectedItem = SendDlgItemMessage( m_hWnd, IDC_ERROR_PROGRAMS, CB_FINDSTRINGEXACT, -1, reinterpret_cast(strLastSelectedProgram.String())); if (nSelectedItem < 0) { nSelectedItem = 0; } } WiaUiUtil::ModifyComboBoxDropWidth( GetDlgItem( m_hWnd, IDC_ERROR_PROGRAMS ) ); SendDlgItemMessage( m_hWnd, IDC_ERROR_PROGRAMS, CB_SETCURSEL, nSelectedItem, 0 ); } CSimpleString CErrorMessageDialog::GetCurrentlySelectedProgram() { return GetCurrentlySelectedComboBoxString( GetDlgItem( m_hWnd, IDC_ERROR_PROGRAMS ) ); } void CErrorMessageDialog::PopulateErrorPointComboBox() { WIA_PUSH_FUNCTION((TEXT("PopulateProgramComboBox"))); SendDlgItemMessage( m_hWnd, IDC_ERROR_POINT, CB_RESETCONTENT, 0, 0 ); if (CB_ERR != SendDlgItemMessage( m_hWnd, IDC_ERROR_POINT, CB_ADDSTRING, 0, reinterpret_cast(CSimpleString( IDS_NO_ERROR, g_hInstance ).String() ) ) ) { CSimpleString strCurrentProgram = GetCurrentlySelectedProgram(); if (strCurrentProgram.Length()) { const int c_nSize = 24000; LPTSTR pszErrors = new TCHAR[c_nSize]; if (pszErrors) { if (GetPrivateProfileString( strCurrentProgram, NULL, TEXT(""), pszErrors, c_nSize, m_strIniFileName )) { for (LPTSTR pszCurr=pszErrors;pszCurr && *pszCurr;pszCurr += lstrlen(pszCurr)+1 ) { if (lstrlen(pszCurr)) { UINT nFlag = GetIniInt( strCurrentProgram, pszCurr); if (nFlag) { LRESULT nIndex = SendDlgItemMessage( m_hWnd, IDC_ERROR_POINT, CB_ADDSTRING, 0, reinterpret_cast(pszCurr) ); if (CB_ERR != nIndex) { SendDlgItemMessage( m_hWnd, IDC_ERROR_POINT, CB_SETITEMDATA, nIndex, nFlag ); } } } } } delete[] pszErrors; } } SelectErrorPoint( CWiaDebugClient::GetForceFailurePoint(strCurrentProgram) ); } WiaUiUtil::ModifyComboBoxDropWidth( GetDlgItem( m_hWnd, IDC_ERROR_POINT ) ); } void CErrorMessageDialog::PopulateErrorsComboBox() { SendDlgItemMessage( m_hWnd, IDC_ERROR_VALUE, CB_RESETCONTENT, 0, 0 ); for (int i=0;i(g_ErrorMessages[i].pszName)); if (nIndex != CB_ERR) { SendMessage( GetDlgItem( m_hWnd, IDC_ERROR_VALUE ), CB_SETITEMDATA, nIndex, g_ErrorMessages[i].hr ); } } WiaUiUtil::ModifyComboBoxDropWidth( GetDlgItem( m_hWnd, IDC_ERROR_VALUE ) ); } void CErrorMessageDialog::InitializeAllFields() { PopulateErrorsComboBox(); HandleErrorSelectionChange(); PopulateProgramComboBox(); HandleProgramsSelectionChange(); } void CErrorMessageDialog::HandleErrorSelectionChange() { CSimpleString strErrorDescription; LRESULT nCurIndex = SendDlgItemMessage( m_hWnd, IDC_ERROR_VALUE, CB_GETCURSEL, 0, 0 ); if (CB_ERR != nCurIndex) { HRESULT hr = static_cast(SendDlgItemMessage( m_hWnd, IDC_ERROR_VALUE, CB_GETITEMDATA, nCurIndex, 0 )); strErrorDescription = WiaUiUtil::GetErrorTextFromHResult( hr ); } if (!strErrorDescription.Length()) { m_bErrorStringProvided = false; strErrorDescription.LoadString( IDS_NO_SYSTEM_ERROR_MESSAGE, g_hInstance ); } else { m_bErrorStringProvided = true; } strErrorDescription.SetWindowText( GetDlgItem( m_hWnd, IDC_ERROR_DESCRIPTION ) ); } void CErrorMessageDialog::HandleProgramsSelectionChange() { PopulateErrorPointComboBox(); HandlePointSelectionChange(); SelectError( CWiaDebugClient::GetForceFailureValue(GetCurrentlySelectedProgram() ) ); HandleErrorSelectionChange(); } void CErrorMessageDialog::HandlePointSelectionChange() { BOOL bEnable = (0 != GetCurrentComboBoxSelectionData( GetDlgItem( m_hWnd, IDC_ERROR_POINT ) ) ); EnableWindow( GetDlgItem( m_hWnd, IDC_ERROR_VALUE ), bEnable ); EnableWindow( GetDlgItem( m_hWnd, IDC_ERROR_VALUE_PROMPT ), bEnable ); } void CErrorMessageDialog::OnSetError( WPARAM, LPARAM ) { CSimpleString strCurrentProgram = GetCurrentlySelectedProgram(); if (strCurrentProgram.Length()) { LRESULT nErrorPoint = GetCurrentComboBoxSelectionData( GetDlgItem( m_hWnd, IDC_ERROR_POINT ) ); CWiaDebugClient::SetForceFailurePoint(strCurrentProgram,nErrorPoint); if (nErrorPoint) { LRESULT nErrorValue = GetCurrentComboBoxSelectionData( GetDlgItem( m_hWnd, IDC_ERROR_VALUE ) ); CWiaDebugClient::SetForceFailureValue(strCurrentProgram,nErrorValue); } } } void CErrorMessageDialog::OnCancel( WPARAM, LPARAM ) { CSimpleString strCurrentProgram = GetCurrentlySelectedProgram(); WritePrivateProfileString( GENERAL_SECTION, LAST_PROGRAM, strCurrentProgram, m_strIniFileName ); EndDialog( m_hWnd, IDCANCEL ); } void CErrorMessageDialog::OnErrorsSelChange( WPARAM, LPARAM ) { HandleErrorSelectionChange(); } void CErrorMessageDialog::OnPointSelChange( WPARAM, LPARAM ) { HandlePointSelectionChange(); } void CErrorMessageDialog::OnProgramsSelChange( WPARAM, LPARAM ) { HandleProgramsSelectionChange(); } void CErrorMessageDialog::OnClearAll( WPARAM, LPARAM ) { for (LRESULT i=0;i(LoadImage(g_hInstance,MAKEINTRESOURCE(IDI_FORCEERR), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR) )); SendMessage( m_hWnd, WM_SETICON, ICON_BIG, reinterpret_cast(LoadImage(g_hInstance,MAKEINTRESOURCE(IDI_FORCEERR), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR) )); InitializeAllFields(); return TRUE; } LRESULT CErrorMessageDialog::OnDestroy( WPARAM, LPARAM ) { return 0; } LRESULT CErrorMessageDialog::OnCtlColorStatic( WPARAM wParam, LPARAM lParam ) { LRESULT lRes = DefWindowProc( m_hWnd, WM_CTLCOLORSTATIC, wParam, lParam ); if (reinterpret_cast(lParam) == GetDlgItem( m_hWnd, IDC_ERROR_DESCRIPTION )) { if (!m_bErrorStringProvided) { SetTextColor( reinterpret_cast(wParam), RGB(255,0,0) ); } } return lRes; } LRESULT CErrorMessageDialog::OnCommand( WPARAM wParam, LPARAM lParam ) { SC_BEGIN_COMMAND_HANDLERS() { SC_HANDLE_COMMAND(IDCANCEL,OnCancel); SC_HANDLE_COMMAND(IDC_SET_ERROR,OnSetError); SC_HANDLE_COMMAND(IDC_REFRESH,OnRefresh); SC_HANDLE_COMMAND(IDC_CLEAR_ALL,OnClearAll); SC_HANDLE_COMMAND_NOTIFY(CBN_SELCHANGE,IDC_ERROR_POINT,OnPointSelChange); SC_HANDLE_COMMAND_NOTIFY(CBN_SELCHANGE,IDC_ERROR_VALUE,OnErrorsSelChange); SC_HANDLE_COMMAND_NOTIFY(CBN_SELCHANGE,IDC_ERROR_PROGRAMS,OnProgramsSelChange); } SC_END_COMMAND_HANDLERS(); } INT_PTR __stdcall CErrorMessageDialog::DialogProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { SC_BEGIN_DIALOG_MESSAGE_HANDLERS(CErrorMessageDialog) { SC_HANDLE_DIALOG_MESSAGE( WM_INITDIALOG, OnInitDialog ); SC_HANDLE_DIALOG_MESSAGE( WM_CTLCOLORSTATIC, OnCtlColorStatic ); SC_HANDLE_DIALOG_MESSAGE( WM_DESTROY, OnDestroy ); SC_HANDLE_DIALOG_MESSAGE( WM_COMMAND, OnCommand ); } SC_END_DIALOG_MESSAGE_HANDLERS(); }