windows-nt/Source/XPSP1/NT/printscan/fax/test/faxvrfy/faxvrfy.c
2020-09-26 16:20:57 +08:00

1350 lines
52 KiB
C

/*++
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 <windows.h>
#include <stdlib.h>
#include <commctrl.h>
#include <shellapi.h>
#include <winfax.h>
#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);
}