/*++ Copyright (c) 1997 Microsoft Corporation Module Name: faxvrfy.c Abstract: This module verifies the minimal functionality of the Windows NT Fax Service. Author: Steven Kehrli (steveke) 11/15/1997 --*/ #include #include #include #include #include #include "faxrcv.h" #include "faxvrfy.h" #include "macros.h" #include "macros.c" #include "resource.h" #include "startup.c" #include "util.c" #include "events.c" #include "sndthrd.c" // fnDialogProcSetup is the Setup Dialog Procedure LRESULT CALLBACK fnDialogProcSetup (HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam); VOID fnUsageInfo( HWND hWnd ) /*++ Routine Description: Displays the usage info Return Value: None --*/ { // szHelpFile is the name of the help file WCHAR szHelpFile[MAX_PATH]; DWORD cb; GetCurrentDirectory(sizeof(szHelpFile) / sizeof(WCHAR), szHelpFile); lstrcat(szHelpFile, L"\\"); lstrcat(szHelpFile, FAXVRFY_HLP); WinHelp(hWnd, szHelpFile, HELP_FINDER, 0); } int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { WNDCLASSEX wndclass; MSG msg; // hMutex is the handle to the mutex HANDLE hMutex; // argvW are the command line parameters LPWSTR *argvW; // argc is the count of command line parameters INT argc; INT iIndex; // pFaxPortsConfigLocal is a pointer to the Fax Ports Configuration PFAX_PORT_INFO pFaxPortsConfigLocal; // pFaxSvcConfigLocal is a pointer to the fax service configuration PFAX_CONFIGURATION pFaxSvcConfigLocal; // hFaxPortHandle is the handle to a port HANDLE hFaxPortHandle; DWORD dwIndex; UINT uRslt; // hFaxDevicesKey is the handle to the fax devices registry key HKEY hFaxDevicesKey; // hFaxPortKey is the handle to the fax port registry key HKEY hFaxPortKey; // szFaxPortKey is the name of the fax port registry key TCHAR szFaxPortKey[15]; // szFixModemClass is the modem class of the fax port LPWSTR szFixModemClass; DWORD cb; // szText is a text string WCHAR szText[MAX_STRINGLEN + 2]; // Set g_hInstance g_hInstance = hInstance; // Initialize the wndclass wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = fnDialogProcSetup; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = DLGWINDOWEXTRA; wndclass.hInstance = g_hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_WINLOGO); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) (COLOR_INACTIVEBORDER + 1); wndclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); wndclass.lpszClassName = FAXVRFY_NAME; wndclass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // See if FaxVrfy is already running hMutex = CreateMutex(NULL, FALSE, FAXVRFY_NAME); if (GetLastError() == ERROR_ALREADY_EXISTS) { while (TRUE) { // Wait for access to the mutex WaitForSingleObject(hMutex, INFINITE); // Find the window g_hWndDlg = FindWindow(FAXVRFY_NAME, NULL); if (g_hWndDlg) { // Switch to that window ShowWindow(g_hWndDlg, SW_RESTORE); SetForegroundWindow(g_hWndDlg); // Release access to the mutex ReleaseMutex(hMutex); return 0; } // Release access to the mutex ReleaseMutex(hMutex); // See if FaxVrfy is still running CloseHandle(hMutex); hMutex = CreateMutex(NULL, FALSE, FAXVRFY_NAME); if (GetLastError() == ERROR_SUCCESS) { break; } } } // Initialize the local mem MemInitializeMacro(); // Set the default caption SetDefaultCaptionMacro(FAXVRFY_NAME); // Initialize the common controls InitCommonControls(); argvW = CommandLineToArgvW(GetCommandLine(), &argc); for (iIndex = 0; iIndex < argc; iIndex++) { if ((!lstrcmpi(FAXVRFY_CMD_HELP_1, argvW[iIndex])) || (!lstrcmpi(FAXVRFY_CMD_HELP_2, argvW[iIndex])) || (!lstrcmpi(FAXVRFY_CMD_HELP_3, argvW[iIndex])) || (!lstrcmpi(FAXVRFY_CMD_HELP_4, argvW[iIndex]))) { fnUsageInfo(NULL); return 0; } else if ((!lstrcmpi(FAXVRFY_CMD_BVT_1, argvW[iIndex])) || (!lstrcmpi(FAXVRFY_CMD_BVT_2, argvW[iIndex]))) { g_bBVT = TRUE; g_bGo = FALSE; g_bNoCheck = FALSE; g_bRasAvailable = FALSE; } else if ((!lstrcmpi(FAXVRFY_CMD_SEND_1, argvW[iIndex])) || (!lstrcmpi(FAXVRFY_CMD_SEND_2, argvW[iIndex]))) { g_bSend = TRUE; } else if ((!lstrcmpi(FAXVRFY_CMD_RECEIVE_1, argvW[iIndex])) || (!lstrcmpi(FAXVRFY_CMD_RECEIVE_2, argvW[iIndex]))) { g_bSend = FALSE; } else if ((!g_bBVT) && ((!lstrcmpi(FAXVRFY_CMD_GO_1, argvW[iIndex])) || (!lstrcmpi(FAXVRFY_CMD_GO_2, argvW[iIndex])))) { g_bGo = TRUE; } else if ((!g_bBVT) && ((!lstrcmpi(FAXVRFY_CMD_NO_CHECK_1, argvW[iIndex])) || (!lstrcmpi(FAXVRFY_CMD_NO_CHECK_2, argvW[iIndex])))) { g_bNoCheck = TRUE; } } MemFreeMacro(argvW); // Initialize NTLog g_bNTLogAvailable = fnInitializeNTLog(); // Start the log file fnStartLogFile(); // Verify fax is installed uRslt = fnIsFaxInstalled(); if (uRslt) { if (!g_bBVT) { MessageBoxMacro(NULL, uRslt, MB_ICONERROR); } g_bTestFailed = TRUE; LoadString(g_hInstance, uRslt, szText, MAX_STRINGLEN); fnWriteLogFile(TRUE, L"%s\r\n", szText); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, L"%s\r\n", szText); } goto ExitLevel0; } // Verify com objects are installed uRslt = fnIsComInstalled(); if (uRslt) { if (!g_bBVT) { MessageBoxMacro(NULL, uRslt, MB_ICONERROR); } g_bTestFailed = TRUE; LoadString(g_hInstance, uRslt, szText, MAX_STRINGLEN); fnWriteLogFile(TRUE, L"%s\r\n", szText); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, L"%s\r\n", szText); } goto ExitLevel0; } // Initialize FaxRcv uRslt = fnInitializeFaxRcv(); if (uRslt) { if (!g_bBVT) { MessageBoxMacro(NULL, uRslt, MB_ICONERROR); } g_bTestFailed = TRUE; LoadString(g_hInstance, uRslt, szText, MAX_STRINGLEN); fnWriteLogFile(TRUE, L"%s\r\n", szText); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, L"%s\r\n", szText); } goto ExitLevel0; } if (!g_bBVT) { g_bRasAvailable = fnInitializeRas(); } // Create the Start event g_hStartEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // Create the Stop event g_hStopEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // Create the Exit event g_hExitEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // Create the Fax event g_hFaxEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // Create the RAS Passed event g_hRasPassedEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // Create the RAS Failed event g_hRasFailedEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // Create the Send Passed event g_hSendPassedEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // Create the Send Failed event g_hSendFailedEvent = CreateEvent(NULL, FALSE, FALSE, NULL); // Connect to the Fax Service if (!FaxConnectFaxServer(NULL, &g_hFaxSvcHandle)) { if (!g_bBVT) { MessageBoxMacro(NULL, IDS_FAX_CONNECT_FAILED, MB_ICONERROR); } g_bTestFailed = TRUE; LoadString(g_hInstance, IDS_FAX_CONNECT_FAILED, szText, MAX_STRINGLEN); fnWriteLogFile(TRUE, L"%s\r\n", szText); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, L"%s\r\n", szText); } goto ExitLevel1; } // Get the Fax Ports Configuration if (!FaxEnumPorts(g_hFaxSvcHandle, &g_pFaxPortsConfig, &g_dwNumPorts)) { if (!g_bBVT) { MessageBoxMacro(NULL, IDS_FAX_ENUM_PORTS_FAILED, MB_ICONERROR); } g_bTestFailed = TRUE; LoadString(g_hInstance, IDS_FAX_ENUM_PORTS_FAILED, szText, MAX_STRINGLEN); fnWriteLogFile(TRUE, L"%s\r\n", szText); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, L"%s\r\n", szText); } goto ExitLevel2; } if (!g_dwNumPorts) { if (!g_bBVT) { MessageBoxMacro(NULL, IDS_FAX_PORTS_NOT_INSTALLED, MB_ICONERROR); } g_bTestFailed = TRUE; LoadString(g_hInstance, IDS_FAX_PORTS_NOT_INSTALLED, szText, MAX_STRINGLEN); fnWriteLogFile(TRUE, L"%s\r\n", szText); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, L"%s\r\n", szText); } goto ExitLevel3; } g_dwNumAvailPorts = g_dwNumPorts; // Get the Fax Ports Configuration if (!FaxEnumPorts(g_hFaxSvcHandle, &pFaxPortsConfigLocal, &g_dwNumPorts)) { if (!g_bBVT) { MessageBoxMacro(NULL, IDS_FAX_ENUM_PORTS_FAILED, MB_ICONERROR); } g_bTestFailed = TRUE; LoadString(g_hInstance, IDS_FAX_ENUM_PORTS_FAILED, szText, MAX_STRINGLEN); fnWriteLogFile(TRUE, L"%s\r\n", szText); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, L"%s\r\n", szText); } goto ExitLevel3; } // Set the Fax Ports Configuration for (dwIndex = 0; dwIndex < g_dwNumPorts; dwIndex++) { pFaxPortsConfigLocal[dwIndex].Flags = FPF_RECEIVE | FPF_SEND; if (!FaxOpenPort(g_hFaxSvcHandle, pFaxPortsConfigLocal[dwIndex].DeviceId, PORT_OPEN_MODIFY, &hFaxPortHandle)) { if (!g_bBVT) { MessageBoxMacro(NULL, IDS_FAX_SET_PORT_FAILED, MB_ICONERROR, pFaxPortsConfigLocal[dwIndex].DeviceName); } g_bTestFailed = TRUE; LoadString(g_hInstance, IDS_FAX_SET_PORT_FAILED, szText, MAX_STRINGLEN); lstrcat(szText, L"\r\n"); fnWriteLogFile(TRUE, szText, g_pFaxPortsConfig[dwIndex].DeviceName); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, szText, g_pFaxPortsConfig[dwIndex].DeviceName); } // Free the Fax Ports Configuration FaxFreeBuffer(pFaxPortsConfigLocal); goto ExitLevel4; } if (!FaxSetPort(hFaxPortHandle, (PFAX_PORT_INFO) &pFaxPortsConfigLocal[dwIndex])) { FaxClose(hFaxPortHandle); if (!g_bBVT) { MessageBoxMacro(NULL, IDS_FAX_SET_PORT_FAILED, MB_ICONERROR, pFaxPortsConfigLocal[dwIndex].DeviceName); } g_bTestFailed = TRUE; LoadString(g_hInstance, IDS_FAX_SET_PORT_FAILED, szText, MAX_STRINGLEN); lstrcat(szText, L"\r\n"); fnWriteLogFile(TRUE, szText, g_pFaxPortsConfig[dwIndex].DeviceName); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, szText, g_pFaxPortsConfig[dwIndex].DeviceName); } // Free the Fax Ports Configuration FaxFreeBuffer(pFaxPortsConfigLocal); goto ExitLevel4; } FaxClose(hFaxPortHandle); } // Free the Fax Ports Configuration FaxFreeBuffer(pFaxPortsConfigLocal); // Get the modem fax class if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, FAXDEVICES_REGKEY, 0, KEY_ALL_ACCESS, &hFaxDevicesKey)) { if (!g_bBVT) { MessageBoxMacro(NULL, IDS_OPEN_FAXDEVICES_REGKEY_FAILED, MB_ICONERROR); } g_bTestFailed = TRUE; LoadString(g_hInstance, IDS_OPEN_FAXDEVICES_REGKEY_FAILED, szText, MAX_STRINGLEN); fnWriteLogFile(TRUE, L"%s\r\n", szText); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, L"%s\r\n", szText); } goto ExitLevel4; } for (dwIndex = 0; dwIndex < g_dwNumPorts; dwIndex++) { // Initialize the string representation of the DeviceId ZeroMemory(szFaxPortKey, sizeof(szFaxPortKey)); // Set the string representation of the DeviceId wsprintf(szFaxPortKey, L"%08u", g_pFaxPortsConfig[dwIndex].DeviceId); lstrcat(szFaxPortKey, MODEM_REGKEY); szFixModemClass = NULL; if (!RegOpenKeyEx(hFaxDevicesKey, szFaxPortKey, 0, KEY_ALL_ACCESS, &hFaxPortKey)) { if (!RegQueryValueEx(hFaxPortKey, FIXMODEMCLASS_REGVALUE, NULL, NULL, NULL, &cb)) { if (cb) { szFixModemClass = MemAllocMacro(cb); if (RegQueryValueEx(hFaxPortKey, FIXMODEMCLASS_REGVALUE, NULL, NULL, (PBYTE) szFixModemClass, &cb)) { MemFreeMacro(szFixModemClass); szFixModemClass = NULL; } else if (!lstrcmp(L"", szFixModemClass)) { MemFreeMacro(szFixModemClass); szFixModemClass = NULL; } } } RegCloseKey(hFaxPortKey); } if (!szFixModemClass) { szFixModemClass = MemAllocMacro(2 * sizeof(WCHAR)); lstrcpy(szFixModemClass, L"1"); } LoadString(g_hInstance, IDS_FIXMODEMCLASS_DATA, szText, MAX_STRINGLEN); lstrcat(szText, L"\r\n"); fnWriteLogFile(TRUE, szText, g_pFaxPortsConfig[dwIndex].DeviceName, szFixModemClass); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_INFO | TL_TEST, szText, g_pFaxPortsConfig[dwIndex].DeviceName, szFixModemClass); } MemFreeMacro(szFixModemClass); } RegCloseKey(hFaxDevicesKey); fnWriteLogFile(FALSE, L"\r\n"); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_INFO | TL_TEST, L"\r\n"); } // Get the Fax Service Configuration if (!FaxGetConfiguration(g_hFaxSvcHandle, &g_pFaxSvcConfig)) { if (!g_bBVT) { MessageBoxMacro(NULL, IDS_FAX_GET_CONFIG_FAILED, MB_ICONERROR); } g_bTestFailed = TRUE; LoadString(g_hInstance, IDS_FAX_GET_CONFIG_FAILED, szText, MAX_STRINGLEN); fnWriteLogFile(TRUE, L"%s\r\n", szText); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, L"%s\r\n", szText); } goto ExitLevel4; } // Get the Fax Service Configuration if (!FaxGetConfiguration(g_hFaxSvcHandle, &pFaxSvcConfigLocal)) { if (!g_bBVT) { MessageBoxMacro(NULL, IDS_FAX_GET_CONFIG_FAILED, MB_ICONERROR); } g_bTestFailed = TRUE; LoadString(g_hInstance, IDS_FAX_GET_CONFIG_FAILED, szText, MAX_STRINGLEN); fnWriteLogFile(TRUE, L"%s\r\n", szText); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, L"%s\r\n", szText); } goto ExitLevel5; } // Set the Fax Service Configuration pFaxSvcConfigLocal->Retries = FAXSVC_RETRIES; pFaxSvcConfigLocal->RetryDelay = FAXSVC_RETRYDELAY; pFaxSvcConfigLocal->UseDeviceTsid = FALSE; if (!FaxSetConfiguration(g_hFaxSvcHandle, pFaxSvcConfigLocal)) { if (!g_bBVT) { MessageBoxMacro(NULL, IDS_FAX_SET_CONFIG_FAILED, MB_ICONERROR); } g_bTestFailed = TRUE; LoadString(g_hInstance, IDS_FAX_SET_CONFIG_FAILED, szText, MAX_STRINGLEN); fnWriteLogFile(TRUE, L"%s\r\n", szText); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, L"%s\r\n", szText); } // Free the Fax Service Configuration FaxFreeBuffer(pFaxSvcConfigLocal); goto ExitLevel5; } // Free the Fax Service Configuration FaxFreeBuffer(pFaxSvcConfigLocal); // Create the completion port g_hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 1); // Initialize the Fax Event Queue if (!FaxInitializeEventQueue(g_hFaxSvcHandle, g_hCompletionPort, 0, NULL, 0)) { if (!g_bBVT) { MessageBoxMacro(NULL, IDS_FAX_EVENT_QUEUE_FAILED, MB_ICONERROR); } g_bTestFailed = TRUE; LoadString(g_hInstance, IDS_FAX_EVENT_QUEUE_FAILED, szText, MAX_STRINGLEN); fnWriteLogFile(TRUE, L"%s\r\n", szText); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, L"%s\r\n", szText); } goto ExitLevel6; } // Create the Fax Event Queue thread CreateThread(NULL, 0, fnFaxEventQueueProc, NULL, 0, NULL); // Create the Send thread CreateThread(NULL, 0, fnSendProc, NULL, 0, NULL); if (g_bBVT) { wndclass.lpszMenuName = NULL; } RegisterClassEx(&wndclass); // Create the Setup Dialog g_hWndDlg = CreateDialog(g_hInstance, MAKEINTRESOURCE(IDD_SETUP), NULL, NULL); SendMessage(g_hWndDlg, UM_FAXVRFY_INITIALIZE, 0, 0); ShowWindow(g_hWndDlg, iCmdShow); UpdateWindow(g_hWndDlg); if ((g_bBVT) || (g_bGo)) { PostMessage(GetDlgItem(g_hWndDlg, IDC_START_BUTTON), BM_CLICK, 0, 0); } while (GetMessage(&msg, NULL, 0, 0)) { if (!IsDialogMessage(g_hWndDlg, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } ExitLevel6: if (g_hCompletionPort) { CloseHandle(g_hCompletionPort); } // Restore the Fax Service Configuration if (!FaxSetConfiguration(g_hFaxSvcHandle, g_pFaxSvcConfig)) { if (!g_bBVT) { MessageBoxMacro(NULL, IDS_FAX_RESTORE_CONFIG_FAILED, MB_ICONERROR); } g_bTestFailed = TRUE; LoadString(g_hInstance, IDS_FAX_RESTORE_CONFIG_FAILED, szText, MAX_STRINGLEN); fnWriteLogFile(TRUE, L"%s\r\n", szText); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, L"%s\r\n", szText); } } ExitLevel5: // Free the Fax Service Configuration FaxFreeBuffer(g_pFaxSvcConfig); ExitLevel4: // Restore the Fax Ports Configuration for (dwIndex = 0; dwIndex < g_dwNumPorts; dwIndex++) { if (!FaxOpenPort(g_hFaxSvcHandle, g_pFaxPortsConfig[dwIndex].DeviceId, PORT_OPEN_MODIFY, &hFaxPortHandle)) { if (!g_bBVT) { MessageBoxMacro(NULL, IDS_FAX_RESTORE_PORT_FAILED, MB_ICONERROR, g_pFaxPortsConfig[dwIndex].DeviceName); } g_bTestFailed = TRUE; LoadString(g_hInstance, IDS_FAX_RESTORE_PORT_FAILED, szText, MAX_STRINGLEN); lstrcat(szText, L"\r\n"); fnWriteLogFile(TRUE, szText, g_pFaxPortsConfig[dwIndex].DeviceName); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, szText, g_pFaxPortsConfig[dwIndex].DeviceName); } continue; } if (!FaxSetPort(hFaxPortHandle, &g_pFaxPortsConfig[dwIndex])) { if (!g_bBVT) { MessageBoxMacro(NULL, IDS_FAX_RESTORE_PORT_FAILED, MB_ICONERROR, g_pFaxPortsConfig[dwIndex].DeviceName); } g_bTestFailed = TRUE; LoadString(g_hInstance, IDS_FAX_RESTORE_PORT_FAILED, szText, MAX_STRINGLEN); lstrcat(szText, L"\r\n"); fnWriteLogFile(TRUE, szText, g_pFaxPortsConfig[dwIndex].DeviceName); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_SEV2 | TL_TEST, szText, g_pFaxPortsConfig[dwIndex].DeviceName); } } FaxClose(hFaxPortHandle); } ExitLevel3: // Free the Fax Ports Configuration FaxFreeBuffer(g_pFaxPortsConfig); ExitLevel2: // Disconnect from the Fax Service FaxClose(g_hFaxSvcHandle); ExitLevel1: CloseHandle(g_hSendFailedEvent); CloseHandle(g_hSendPassedEvent); CloseHandle(g_hRasFailedEvent); CloseHandle(g_hRasPassedEvent); CloseHandle(g_hFaxEvent); CloseHandle(g_hExitEvent); CloseHandle(g_hStopEvent); CloseHandle(g_hStartEvent); if (g_bRasAvailable) { FreeLibrary(g_RasApi.hInstance); } ExitLevel0: fnWriteLogFile(FALSE, L"\r\n"); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_INFO | TL_TEST, L"\r\n"); } if ((g_bTestFailed) || (g_dwNumTotal)) { if (g_dwNumTotal) { // Log the results LoadString(g_hInstance, IDS_NUM_PASSED, szText, MAX_STRINGLEN); fnWriteLogFile(FALSE, szText, g_dwNumPassed); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_INFO | TL_TEST, szText, g_dwNumPassed); } LoadString(g_hInstance, IDS_NUM_FAILED, szText, MAX_STRINGLEN); fnWriteLogFile(FALSE, szText, g_dwNumFailed); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_INFO | TL_TEST, szText, g_dwNumFailed); } LoadString(g_hInstance, IDS_NUM_TOTAL, szText, MAX_STRINGLEN); fnWriteLogFile(FALSE, szText, g_dwNumTotal); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_INFO | TL_TEST, szText, g_dwNumTotal); } } if ((g_bTestFailed) || (g_dwNumFailed)) { fnWriteLogFile(FALSE, L"\r\n"); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_INFO | TL_TEST, L"\r\n"); } LoadString(g_hInstance, IDS_STATUS_TEST_FAILED, szText, MAX_STRINGLEN); fnWriteLogFile(FALSE, L"%s\r\n", szText); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_INFO | TL_TEST, L"%s\r\n", szText); } } else { fnWriteLogFile(FALSE, L"\r\n"); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_INFO | TL_TEST, L"\r\n"); } LoadString(g_hInstance, IDS_STATUS_TEST_PASSED, szText, MAX_STRINGLEN); fnWriteLogFile(FALSE, L"%s\r\n", szText); if (g_bNTLogAvailable) { g_NTLogApi.ptlLog(g_hLogFile, TLS_INFO | TL_TEST, L"%s\r\n", szText); } } } // Close the log file fnCloseLogFile(); CloseHandle(hMutex); return 0; } LRESULT CALLBACK fnDialogProcSetup (HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { // hWndStatusList is the handle to the Status List static HWND hWndStatusList; // rcClient is the WindowRect of the Status List RECT rcClient; // lvc specifies the attributes of a particular column of the Status List LV_COLUMN lvc; // lvi specifies the attributes of a particular item of the Status List LV_ITEM lvi; // szText is a text string WCHAR szText[MAX_STRINGLEN + 1]; // szFormatString is the format of the text string WCHAR szFormatString[MAX_STRINGLEN + 1]; // szRasError is the Ras error string WCHAR szRasError[MAX_STRINGLEN + 1]; // dwResourceId is the resource id DWORD dwResourceId; // szDeviceName is the device name LPWSTR szDeviceName; // szIniFile is the ini file name static WCHAR szIniFile[_MAX_PATH + 1]; // szMissingInfo is the missing info WCHAR szMissingInfo[MAX_STRINGLEN + 1]; // szMissingInfoError is the missing info error message WCHAR szMissingInfoError[(MAX_STRINGLEN * 5) + 1]; DWORD dwStyle; DWORD dwLevel; switch (iMsg) { case WM_CREATE: // Get the Rect of the Setup Dialog GetWindowRect(hWnd, &rcClient); if (!g_bBVT) { // Increase the bottom of the Setup Dialog Rect by the height of the menu rcClient.bottom += GetSystemMetrics(SM_CYMENU); } // Resize the Setup Dialog SetWindowPos(hWnd, NULL, 0, 0, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, SWP_NOMOVE | SWP_NOZORDER); break; case UM_FAXVRFY_INITIALIZE: CheckMenuItem(GetMenu(hWnd), IDM_SEND, MF_BYCOMMAND | g_bSend ? MF_CHECKED : MF_UNCHECKED); CheckMenuItem(GetMenu(hWnd), IDM_RECEIVE, MF_BYCOMMAND | g_bSend ? MF_UNCHECKED : MF_CHECKED); // Limit the text length of edit controls SendMessage(GetDlgItem(hWnd, IDC_SEND_NUMBER), EM_SETLIMITTEXT, PHONE_NUM_LEN, 0); SendMessage(GetDlgItem(hWnd, IDC_RECEIVE_NUMBER), EM_SETLIMITTEXT, PHONE_NUM_LEN, 0); SendMessage(GetDlgItem(hWnd, IDC_RAS_USER_NAME), EM_SETLIMITTEXT, UNLEN, 0); SendMessage(GetDlgItem(hWnd, IDC_RAS_PASSWORD), EM_SETLIMITTEXT, PWLEN, 0); SendMessage(GetDlgItem(hWnd, IDC_RAS_DOMAIN), EM_SETLIMITTEXT, DNLEN, 0); // Get the handle to the Status List hWndStatusList = GetDlgItem(hWnd, IDC_STATUS_LIST); // Get the Rect of the Status List GetWindowRect(hWndStatusList, &rcClient); // Set common attributes for each column lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.fmt = LVCFMT_LEFT; // Event Column // Load the Event Column text LoadString(g_hInstance, IDS_EVENT_LABEL, szText, MAX_STRINGLEN); // Set the column text lvc.pszText = szText; // Set the width of the column to be about 2 / 5 of the width of the Status List, allowing for the width of the borders and scroll bar lvc.cx = ((rcClient.right - rcClient.left - 4 * GetSystemMetrics(SM_CXBORDER) - GetSystemMetrics(SM_CXVSCROLL)) * 2) / 5; // Indicate this is the first column lvc.iSubItem = 0; // Insert column into Status List ListView_InsertColumn(hWndStatusList, 0, &lvc); // Port Column // Load the Port Column text LoadString(g_hInstance, IDS_PORT_LABEL, szText, MAX_STRINGLEN); // Set the column text lvc.pszText = szText; // Set the width of the column to be about 3 / 5 of the width of the Status List, allowing for the width of the borders and scroll bar lvc.cx = (lvc.cx * 3) / 2; // Indicate this is the second column lvc.iSubItem = 1; // Insert column into Status List ListView_InsertColumn(hWndStatusList, 1, &lvc); // Disable the Stop Button EnableWindow(GetDlgItem(hWnd, IDC_STOP_BUTTON), FALSE); // Get the current directory GetCurrentDirectory(sizeof(szIniFile) / sizeof(WCHAR), szIniFile); // Set the ini file name lstrcat(szIniFile, L"\\"); lstrcat(szIniFile, FAXVRFY_INI); // Get the strings from the ini file GetPrivateProfileString(L"Fax", L"SendNumber", L"", g_szSndNumber, sizeof(g_szSndNumber), szIniFile); if (fnIsStringASCII(g_szSndNumber)) { SetDlgItemText(hWnd, IDC_SEND_NUMBER, g_szSndNumber); } else { ZeroMemory(g_szSndNumber, sizeof(g_szSndNumber)); } GetPrivateProfileString(L"Fax", L"ReceiveNumber", L"", g_szRcvNumber, sizeof(g_szRcvNumber), szIniFile); if (fnIsStringASCII(g_szRcvNumber)) { SetDlgItemText(hWnd, IDC_RECEIVE_NUMBER, g_szRcvNumber); } else { ZeroMemory(g_szRcvNumber, sizeof(g_szRcvNumber)); } if (g_bRasAvailable) { if (GetPrivateProfileInt(L"RAS", L"Enabled", 0, szIniFile)) { // Click the Fax Send check button SendMessage(GetDlgItem(hWnd, IDC_RAS_ENABLED_BUTTON), BM_CLICK, 0, 0); } } GetPrivateProfileString(L"RAS", L"UserName", L"", g_szRasUserName, sizeof(g_szRasUserName), szIniFile); SetDlgItemText(hWnd, IDC_RAS_USER_NAME, g_szRasUserName); ZeroMemory(g_szRasPassword, sizeof(g_szRasPassword)); GetPrivateProfileString(L"RAS", L"Domain", L"", g_szRasDomain, sizeof(g_szRasDomain), szIniFile); SetDlgItemText(hWnd, IDC_RAS_DOMAIN, g_szRasDomain); SendMessage(hWnd, UM_FAXVRFY_RESET, 0, 0); return 0; case UM_FAXVRFY_RESET: // Enable or disable the Fax specific controls EnableWindow(GetDlgItem(hWnd, IDC_SEND_NUMBER_STATIC), (!wParam && g_bSend) ? TRUE : FALSE); EnableWindow(GetDlgItem(hWnd, IDC_SEND_NUMBER), (!wParam && g_bSend) ? TRUE : FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RECEIVE_NUMBER_STATIC), (!wParam && g_bSend) ? TRUE : FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RECEIVE_NUMBER), (!wParam && g_bSend) ? TRUE : FALSE); // Enable the RAS specific controls EnableWindow(GetDlgItem(hWnd, IDC_RAS_ENABLED_BUTTON), (!wParam && g_bSend && g_bRasAvailable) ? TRUE : FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_USER_NAME_STATIC), (!wParam && g_bSend && g_bRasEnabled && g_bRasAvailable) ? TRUE : FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_USER_NAME), (!wParam && g_bSend && g_bRasEnabled && g_bRasAvailable) ? TRUE : FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_PASSWORD_STATIC), (!wParam && g_bSend && g_bRasEnabled && g_bRasAvailable) ? TRUE : FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_PASSWORD), (!wParam && g_bSend && g_bRasEnabled && g_bRasAvailable) ? TRUE : FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_DOMAIN_STATIC), (!wParam && g_bSend && g_bRasEnabled && g_bRasAvailable) ? TRUE : FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_DOMAIN), (!wParam && g_bSend && g_bRasEnabled && g_bRasAvailable) ? TRUE : FALSE); if (wParam) { // Disable the Start Button EnableWindow(GetDlgItem(hWnd, IDC_START_BUTTON), FALSE); // Disable the Stop Button EnableWindow(GetDlgItem(hWnd, IDC_STOP_BUTTON), FALSE); // Enable the Exit Button EnableWindow(GetDlgItem(hWnd, IDC_EXIT_BUTTON), TRUE); // Disable the Option Menu EnableMenuItem(GetMenu(hWnd), IDM_SEND, MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(GetMenu(hWnd), IDM_RECEIVE, MF_BYCOMMAND | MF_GRAYED); // Set the focus to the Exit button SendMessage(hWnd, WM_NEXTDLGCTL, (WPARAM) GetDlgItem(hWnd, IDC_EXIT_BUTTON), MAKELONG(TRUE, 0)); } else { // Enable the Start Button EnableWindow(GetDlgItem(hWnd, IDC_START_BUTTON), TRUE); // Disable the Stop Button EnableWindow(GetDlgItem(hWnd, IDC_STOP_BUTTON), FALSE); // Enable the Exit Button EnableWindow(GetDlgItem(hWnd, IDC_EXIT_BUTTON), TRUE); // Enable the Option Menu EnableMenuItem(GetMenu(hWnd), IDM_SEND, MF_BYCOMMAND | MF_ENABLED); EnableMenuItem(GetMenu(hWnd), IDM_RECEIVE, MF_BYCOMMAND | MF_ENABLED); // Set the focus to the Start button SendMessage(hWnd, WM_NEXTDLGCTL, (WPARAM) GetDlgItem(hWnd, IDC_START_BUTTON), MAKELONG(TRUE, 0)); } return 0; case UM_TIMEOUT_ENDED: case UM_FAXSVC_ENDED: g_bTestFailed = TRUE; if (iMsg == UM_TIMEOUT_ENDED) { // Update the status SendMessage(hWnd, UM_UPDATE_STATUS, IDS_STATUS_TIMEOUT_ENDED, 0); } else if (iMsg == UM_FAXSVC_ENDED) { // Post a completion packet to a completion port to exit the Fax Event Queue thread fnPostExitToCompletionPort(g_hCompletionPort); // Update the status SendMessage(hWnd, UM_UPDATE_STATUS, IDS_STATUS_FAXSVC_ENDED, 0); } if ((!IsWindowEnabled(GetDlgItem(hWnd, IDC_START_BUTTON))) && (g_bSend)) { // Update the status SendMessage(hWnd, UM_ITERATION_FAILED, 0, 0); } SendMessage(hWnd, UM_FAXVRFY_RESET, 1, 0); if (g_bBVT) { SendMessage(GetDlgItem(g_hWndDlg, IDC_EXIT_BUTTON), BM_CLICK, 0, 0); } return 0; case UM_ITERATION_STOPPED: // Update the status SendMessage(hWnd, UM_UPDATE_STATUS, IDS_STATUS_ITERATION_STOPPED, 0); SendMessage(hWnd, UM_FAXVRFY_RESET, 0, 0); return 0; case UM_ITERATION_PASSED: // Update the status SendMessage(hWnd, UM_UPDATE_STATUS, IDS_STATUS_ITERATION_PASSED, 0); SendMessage(hWnd, UM_FAXVRFY_RESET, 0, 0); // Update the iterations g_dwNumPassed++; g_dwNumTotal++; SetDlgItemInt(hWnd, IDC_NUM_PASSED, g_dwNumPassed, FALSE); SetDlgItemInt(hWnd, IDC_NUM_TOTAL, g_dwNumTotal, FALSE); if (g_bBVT) { SendMessage(GetDlgItem(g_hWndDlg, IDC_EXIT_BUTTON), BM_CLICK, 0, 0); } return 0; case UM_ITERATION_FAILED: // Update the status SendMessage(hWnd, UM_UPDATE_STATUS, IDS_STATUS_ITERATION_FAILED, 0); SendMessage(hWnd, UM_FAXVRFY_RESET, 0, 0); // Update the iterations g_dwNumFailed++; g_dwNumTotal++; SetDlgItemInt(hWnd, IDC_NUM_FAILED, g_dwNumFailed, FALSE); SetDlgItemInt(hWnd, IDC_NUM_TOTAL, g_dwNumTotal, FALSE); if (g_bBVT) { SendMessage(GetDlgItem(g_hWndDlg, IDC_EXIT_BUTTON), BM_CLICK, 0, 0); } return 0; case UM_UPDATE_STATUS: dwStyle = TLS_INFO; dwLevel = TLS_VARIATION; // Get the resource id dwResourceId = (DWORD) wParam; // Load the event text LoadString(g_hInstance, dwResourceId, szFormatString, MAX_STRINGLEN); // Set the event text lstrcpy(szText, szFormatString); szDeviceName = NULL; switch (wParam) { case IDS_STATUS_ITERATION_PASSED: dwStyle = TLS_PASS; break; case IDS_STATUS_ITERATION_FAILED: dwStyle = TLS_SEV2; break; case IDS_STATUS_TEST_PASSED: dwStyle = TLS_PASS; dwLevel = TL_TEST; break; case IDS_STATUS_RAS_FAILED: case IDS_STATUS_TIMEOUT_ENDED: case IDS_STATUS_FAX_SEND_FAILED: case IDS_STATUS_FAX_INVALID: case IDS_TIFF_INVALID_TIFF: case IDS_TIFF_INVALID_IMAGEWIDTH: case IDS_TIFF_INVALID_IMAGELENGTH: case IDS_TIFF_INVALID_COMPRESSION: case IDS_TIFF_INVALID_PHOTOMETRIC: case IDS_TIFF_INVALID_XRESOLUTION: case IDS_TIFF_INVALID_YRESOLUTION: case IDS_TIFF_INVALID_SOFTWARE: case IDS_TIFF_INVALID_PAGES: case IDS_STATUS_FAX_NO_DIAL_TONE_ABORT: case IDS_STATUS_FAX_BUSY_ABORT: case IDS_STATUS_FAX_NO_ANSWER_ABORT: case IDS_STATUS_FAX_FATAL_ERROR_ABORT: dwStyle = TLS_SEV2; break; case IDS_STATUS_FAXSVC_ENDED: dwStyle = TLS_SEV2; dwLevel = TL_TEST; break; case IDS_STATUS_RAS_SPEED_SUSPECT: case IDS_STATUS_FAX_NO_DIAL_TONE_RETRY: case IDS_STATUS_FAX_BUSY_RETRY: case IDS_STATUS_FAX_NO_ANSWER_RETRY: case IDS_STATUS_FAX_FATAL_ERROR_RETRY: case IDS_STATUS_FAX_FATAL_ERROR: case IDS_STATUS_FAX_ABORTING: dwStyle = TLS_WARN; break; case IDS_STATUS_DEVICE_POWERED_OFF: case IDS_STATUS_DEVICE_POWERED_ON: case IDS_STATUS_PORTS_NOT_AVAILABLE: case IDS_STATUS_UNEXPECTED_STATE: dwStyle = TLS_WARN; dwLevel = TL_TEST; break; } switch (wParam) { case IDS_TIFF_INVALID_PAGES: // Set the event text wsprintf(szText, szFormatString, (DWORD) lParam, g_bBVT ? FAXBVT_PAGES : FAXWHQL_PAGES); break; case IDS_STATUS_RAS_STARTING: case IDS_STATUS_FAX_STARTING: // Set the event text wsprintf(szText, szFormatString, (LPWSTR) lParam); break; case IDS_STATUS_RAS_LINESPEED: // Set the event text wsprintf(szText, szFormatString, ((PRAS_INFO) lParam)->dwBps); // Find the device name szDeviceName = ((PRAS_INFO) lParam)->szDeviceName; break; case IDS_STATUS_RAS_SPEED_SUSPECT: // Set the exent text wsprintf(szText, szFormatString, (DWORD) lParam); break; case IDS_STATUS_RAS_FAILED: // Initialize szRasError ZeroMemory(szRasError, sizeof(szRasError)); if (lParam) { g_RasApi.RasGetErrorString((DWORD) lParam, szRasError, sizeof(szRasError) / sizeof(WCHAR)); } // Set the event text wsprintf(szText, szFormatString, szRasError); break; case IDS_STATUS_FAX_DIALING: // Set the event text wsprintf(szText, szFormatString, ((PFAX_DIALING_INFO) lParam)->dwAttempt); // Find the device name fnFindDeviceName(g_pFaxPortsConfig, g_dwNumPorts, ((PFAX_DIALING_INFO) lParam)->dwDeviceId, &szDeviceName); break; case IDS_STATUS_FAX_RECEIVED: // Set the event text wsprintf(szText, szFormatString, ((PFAX_RECEIVE_INFO) lParam)->szCopyTiffName); // Find the device name fnFindDeviceName(g_pFaxPortsConfig, g_dwNumPorts, ((PFAX_RECEIVE_INFO) lParam)->dwDeviceId, &szDeviceName); break; case IDS_STATUS_FAX_ID: // Set the event text wsprintf(szText, szFormatString, (LPWSTR) lParam); break; case IDS_STATUS_FAX_VERIFYING: // Set the event text wsprintf(szText, szFormatString, (LPWSTR) lParam); break; default: // Find the device name fnFindDeviceName(g_pFaxPortsConfig, g_dwNumPorts, (DWORD) lParam, &szDeviceName); break; } // Indicate only pszText is valid lvi.mask = LVIF_TEXT; // Set the Event text lvi.pszText = szText; // Set the item number lvi.iItem = ListView_GetItemCount(hWndStatusList); // Indicate this is the first column lvi.iSubItem = 0; // Insert item into Status List ListView_InsertItem(hWndStatusList, &lvi); // Set the Port text lvi.pszText = szDeviceName; // Indicate this is the second column lvi.iSubItem = 1; // Set item in Status List ListView_SetItem(hWndStatusList, &lvi); if (szDeviceName) { DebugMacro(L"%s: %s\n", szDeviceName, szText); } else { DebugMacro(L"%s\n", szText); } if (szDeviceName) { fnWriteLogFile(TRUE, L"%s: %s\r\n", szDeviceName, szText); } else { fnWriteLogFile(TRUE, L"%s\r\n", szText); } if (g_bNTLogAvailable) { if (szDeviceName) { switch (dwLevel) { case TLS_TEST: g_NTLogApi.ptlLog(g_hLogFile, dwStyle | TL_TEST, L"%s: %s\r\n", szDeviceName, szText); break; case TLS_VARIATION: g_NTLogApi.ptlLog(g_hLogFile, dwStyle | TL_VARIATION, L"%s: %s\r\n", szDeviceName, szText); break; } } else { switch (dwLevel) { case TLS_TEST: g_NTLogApi.ptlLog(g_hLogFile, dwStyle | TL_TEST, L"%s\r\n", szText); break; case TLS_VARIATION: g_NTLogApi.ptlLog(g_hLogFile, dwStyle | TL_VARIATION, L"%s\r\n", szText); break; } } } // Scroll the Status List ListView_EnsureVisible(hWndStatusList, lvi.iItem, FALSE); return 0; case WM_SETFOCUS: // Verify correct control has the focus if ((!IsWindowEnabled(GetDlgItem(hWnd, IDC_STOP_BUTTON))) && (SendMessage(GetDlgItem(hWnd, IDC_STOP_BUTTON), WM_GETDLGCODE, 0, 0) & DLGC_DEFPUSHBUTTON)) { // Set the focus to the start button SendMessage(hWnd, WM_NEXTDLGCTL, (WPARAM) GetDlgItem(hWnd, IDC_START_BUTTON), MAKELONG(TRUE, 0)); } break; case WM_CLOSE: if (IsWindowEnabled(GetDlgItem(hWnd, IDC_EXIT_BUTTON))) { // Signal the Exit event SetEvent(g_hExitEvent); // Post a completion packet to a completion port to exit the Fax Event Queue thread fnPostExitToCompletionPort(g_hCompletionPort); // Close the application DestroyWindow(hWnd); PostQuitMessage(0); } return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_SEND: if (!g_bSend) { g_bSend = TRUE; CheckMenuItem(GetMenu(hWnd), IDM_SEND, MF_BYCOMMAND | MF_CHECKED); CheckMenuItem(GetMenu(hWnd), IDM_RECEIVE, MF_BYCOMMAND | MF_UNCHECKED); SendMessage(hWnd, UM_FAXVRFY_RESET, 0, 0); } return 0; case IDM_RECEIVE: if (g_bSend) { g_bSend = FALSE; CheckMenuItem(GetMenu(hWnd), IDM_SEND, MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(GetMenu(hWnd), IDM_RECEIVE, MF_BYCOMMAND | MF_CHECKED); SendMessage(hWnd, UM_FAXVRFY_RESET, 0, 0); } return 0; case IDM_HELP: fnUsageInfo(hWnd); return 0; case IDC_SEND_NUMBER: if (HIWORD(wParam) == EN_CHANGE) { if (!fnIsEditControlASCII(hWnd, IDC_SEND_NUMBER, PHONE_NUM_LEN + 1)) { // Load the error text LoadString(g_hInstance, IDS_ASCII_SEND_NUMBER, szText, MAX_STRINGLEN); // Display the pop-up MessageBox(hWnd, szText, FAXVRFY_NAME, MB_OK | MB_ICONERROR); SetDlgItemText(hWnd, IDC_SEND_NUMBER, g_szSndNumber); } GetDlgItemText(hWnd, IDC_SEND_NUMBER, g_szSndNumber, PHONE_NUM_LEN + 1); } return 0; case IDC_RECEIVE_NUMBER: if (HIWORD(wParam) == EN_CHANGE) { if (!fnIsEditControlASCII(hWnd, IDC_RECEIVE_NUMBER, PHONE_NUM_LEN + 1)) { // Load the error text LoadString(g_hInstance, IDS_ASCII_RECEIVE_NUMBER, szText, MAX_STRINGLEN); // Display the pop-up MessageBox(hWnd, szText, FAXVRFY_NAME, MB_OK | MB_ICONERROR); SetDlgItemText(hWnd, IDC_RECEIVE_NUMBER, g_szRcvNumber); } GetDlgItemText(hWnd, IDC_RECEIVE_NUMBER, g_szRcvNumber, PHONE_NUM_LEN + 1); } return 0; case IDC_RAS_ENABLED_BUTTON: // RAS Enabled Check Box was clicked g_bRasEnabled = IsDlgButtonChecked(hWnd, IDC_RAS_ENABLED_BUTTON); // Enable or disable the RAS specific controls EnableWindow(GetDlgItem(hWnd, IDC_RAS_USER_NAME_STATIC), g_bRasEnabled ? TRUE : FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_USER_NAME), g_bRasEnabled ? TRUE : FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_PASSWORD_STATIC), g_bRasEnabled ? TRUE : FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_PASSWORD), g_bRasEnabled ? TRUE : FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_DOMAIN_STATIC), g_bRasEnabled ? TRUE : FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_DOMAIN), g_bRasEnabled ? TRUE : FALSE); return 0; case IDC_START_BUTTON: if (g_bSend) { // Initialize szMissingInfoError ZeroMemory(szMissingInfoError, sizeof(szMissingInfoError)); // Get send phone number GetDlgItemText(hWnd, IDC_SEND_NUMBER, g_szSndNumber, PHONE_NUM_LEN + 1); // Get receive phone number GetDlgItemText(hWnd, IDC_RECEIVE_NUMBER, g_szRcvNumber, PHONE_NUM_LEN + 1); // See if RAS is enabled g_bRasEnabled = IsDlgButtonChecked(hWnd, IDC_RAS_ENABLED_BUTTON); // Get RAS user name GetDlgItemText(hWnd, IDC_RAS_USER_NAME, g_szRasUserName, UNLEN + 1); // Get RAS password GetDlgItemText(hWnd, IDC_RAS_PASSWORD, g_szRasPassword, PWLEN + 1); // Get RAS domain GetDlgItemText(hWnd, IDC_RAS_DOMAIN, g_szRasDomain, DNLEN + 1); if (!lstrlen(g_szSndNumber)) { // There is no send phone number LoadString(g_hInstance, IDS_MISSING_INFO, szMissingInfoError, MAX_STRINGLEN); LoadString(g_hInstance, IDS_NO_SEND_NUMBER, szMissingInfo, MAX_STRINGLEN); lstrcat(szMissingInfoError, szMissingInfo); } if (!lstrlen(g_szRcvNumber)) { // There is no receive phone number if (lstrlen(szMissingInfoError)) { lstrcat(szMissingInfoError, L"\n"); } else { LoadString(g_hInstance, IDS_MISSING_INFO, szMissingInfoError, MAX_STRINGLEN); } LoadString(g_hInstance, IDS_NO_RECEIVE_NUMBER, szMissingInfo, MAX_STRINGLEN); lstrcat(szMissingInfoError, szMissingInfo); } if (g_bRasEnabled) { if (!lstrlen(g_szRasUserName)) { // There is no RAS user name if (lstrlen(szMissingInfoError)) { lstrcat(szMissingInfoError, L"\n"); } else { LoadString(g_hInstance, IDS_MISSING_INFO, szMissingInfoError, MAX_STRINGLEN); } LoadString(g_hInstance, IDS_NO_RAS_USER_NAME, szMissingInfo, MAX_STRINGLEN); lstrcat(szMissingInfoError, szMissingInfo); } if (!lstrlen(g_szRasDomain)) { // There is no RAS domain if (lstrlen(szMissingInfoError)) { lstrcat(szMissingInfoError, L"\n"); } else { LoadString(g_hInstance, IDS_MISSING_INFO, szMissingInfoError, MAX_STRINGLEN); } LoadString(g_hInstance, IDS_NO_RAS_DOMAIN, szMissingInfo, MAX_STRINGLEN); lstrcat(szMissingInfoError, szMissingInfo); } } if (lstrlen(szMissingInfoError)) { // Display the missing info error pop-up MessageBox(hWnd, szMissingInfoError, FAXVRFY_NAME, MB_OK | MB_ICONERROR); return 0; } // Disable the Fax specific controls EnableWindow(GetDlgItem(hWnd, IDC_SEND_NUMBER_STATIC), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_SEND_NUMBER), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RECEIVE_NUMBER), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RECEIVE_NUMBER_STATIC), FALSE); // Disable the RAS specific controls EnableWindow(GetDlgItem(hWnd, IDC_RAS_ENABLED_BUTTON), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_USER_NAME_STATIC), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_USER_NAME), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_PASSWORD_STATIC), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_PASSWORD), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_DOMAIN_STATIC), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAS_DOMAIN), FALSE); // Set the strings to the ini file WritePrivateProfileString(L"Fax", L"SendNumber", g_szSndNumber, szIniFile); WritePrivateProfileString(L"Fax", L"ReceiveNumber", g_szRcvNumber, szIniFile); WritePrivateProfileString(L"RAS", L"Enabled", g_bRasEnabled ? L"1" : L"0", szIniFile); WritePrivateProfileString(L"RAS", L"UserName", g_szRasUserName, szIniFile); WritePrivateProfileString(L"RAS", L"Domain", g_szRasDomain, szIniFile); } // Disable the Option Menu EnableMenuItem(GetMenu(hWnd), IDM_SEND, MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(GetMenu(hWnd), IDM_RECEIVE, MF_BYCOMMAND | MF_GRAYED); // Disable the Start Button EnableWindow(GetDlgItem(hWnd, IDC_START_BUTTON), FALSE); // Enable the Stop Button EnableWindow(GetDlgItem(hWnd, IDC_STOP_BUTTON), TRUE); // Disable the Exit Button EnableWindow(GetDlgItem(hWnd, IDC_EXIT_BUTTON), FALSE); // Set the focus to the Stop button SendMessage(hWnd, WM_NEXTDLGCTL, (WPARAM) GetDlgItem(hWnd, IDC_STOP_BUTTON), MAKELONG(TRUE, 0)); // Update the status SendMessage(g_hWndDlg, UM_UPDATE_STATUS, IDS_STATUS_ITERATION_STARTED, 0); // Signal the Start event SetEvent(g_hStartEvent); return 0; case IDC_STOP_BUTTON: // Signal the Stop event SetEvent(g_hStopEvent); return 0; case IDC_EXIT_BUTTON: SendMessage(hWnd, WM_CLOSE, 0, 0); return 0; } } return DefDlgProc(hWnd, iMsg, wParam, lParam); }