1350 lines
52 KiB
C
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);
|
|
}
|