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

188 lines
4.6 KiB
C

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
util.c
Abstract:
This module implements utility functions for the fax service provider
--*/
#include "newfsp.h"
BOOL
OpenLogFile(
BOOL bLoggingEnabled,
LPWSTR lpszLoggingDirectory
)
/*++
Routine Description:
Open the log file
Arguments:
bLoggingEnabled - indicates if logging is enabled
lpszLoggingDirectory - indicates the logging directory
pDeviceInfo - pointer to the virtual fax devices
Return Value:
TRUE on success
--*/
{
// szLoggingFilename is the logging file name
WCHAR szLoggingFilename[MAX_PATH];
// cUnicodeBOM is the Unicode BOM
WCHAR cUnicodeBOM = 0xFEFF;
DWORD dwSize;
if (bLoggingEnabled == TRUE) {
// Set the logging file name
lstrcpy(szLoggingFilename, lpszLoggingDirectory);
lstrcat(szLoggingFilename, L"\\");
lstrcat(szLoggingFilename, NEWFSP_LOG_FILE);
// Create the new log file
g_hLogFile = CreateFile(szLoggingFilename, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (g_hLogFile == INVALID_HANDLE_VALUE) {
return FALSE;
}
// Write the Unicode BOM to the log file
WriteFile(g_hLogFile, &cUnicodeBOM, sizeof(WCHAR), &dwSize, NULL);
}
else {
g_hLogFile = INVALID_HANDLE_VALUE;
}
return TRUE;
}
VOID
CloseLogFile(
)
/*++
Routine Description:
Close the log file
Return Value:
None
--*/
{
if (g_hLogFile != INVALID_HANDLE_VALUE) {
CloseHandle(g_hLogFile);
g_hLogFile = INVALID_HANDLE_VALUE;
}
}
VOID
WriteDebugString(
LPWSTR lpszFormatString,
...
)
/*++
Routine Description:
Write a debug string to the debugger and log file
Arguments:
lpszFormatString - pointer to the string
Return Value:
None
--*/
{
va_list varg_ptr;
SYSTEMTIME SystemTime;
// szOutputString is the output string
WCHAR szOutputString[1024];
DWORD cb;
// Initialize the buffer
ZeroMemory(szOutputString, sizeof(szOutputString));
// Get the current time
GetLocalTime(&SystemTime);
wsprintf(szOutputString, L"%02d.%02d.%04d@%02d:%02d:%02d.%03d:\n", SystemTime.wMonth, SystemTime.wDay, SystemTime.wYear, SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond, SystemTime.wMilliseconds);
cb = lstrlen(szOutputString);
va_start(varg_ptr, lpszFormatString);
_vsnwprintf(&szOutputString[cb], sizeof(szOutputString) - cb, lpszFormatString, varg_ptr);
// Write the string to the debugger
OutputDebugString(szOutputString);
if (g_hLogFile != INVALID_HANDLE_VALUE) {
// Write the string to the log file
WriteFile(g_hLogFile, szOutputString, lstrlen(szOutputString) * sizeof(WCHAR), &cb, NULL);
}
}
VOID
PostJobStatus(
HANDLE CompletionPort,
ULONG_PTR CompletionKey,
DWORD StatusId,
DWORD ErrorCode
)
/*++
Routine Description:
Post a completion packet for a fax service provider fax job status change
Arguments:
CompletionPort - specifies a handle to an I/O completion port
CompletionKey - specifies a completion port key value
StatusId - specifies a fax status code
ErrorCode - specifies one of the Win32 error codes that the fax service provider should use to report an error that occurs
Return Value:
TRUE on success
--*/
{
// pFaxDevStatus is a pointer to the completion packet
PFAX_DEV_STATUS pFaxDevStatus;
// Allocate a block of memory for the completion packet
pFaxDevStatus = MemAllocMacro(sizeof(FAX_DEV_STATUS));
if (pFaxDevStatus != NULL) {
// Set the completion packet's structure size
pFaxDevStatus->SizeOfStruct = sizeof(FAX_DEV_STATUS);
// Copy the completion packet's fax status identifier
pFaxDevStatus->StatusId = StatusId;
// Set the completion packet's string resource identifier to 0
pFaxDevStatus->StringId = 0;
// Set the completion packet's current page number to 0
pFaxDevStatus->PageCount = 0;
// Set the completion packet's remote fax device identifier to NULL
pFaxDevStatus->CSI = NULL;
// Set the completion packet's calling fax device identifier to NULL
pFaxDevStatus->CallerId = NULL;
// Set the completion packet's routing string to NULL
pFaxDevStatus->RoutingInfo = NULL;
// Copy the completion packet's Win32 error code
pFaxDevStatus->ErrorCode = ErrorCode;
// Post the completion packet
PostQueuedCompletionStatus(CompletionPort, sizeof(FAX_DEV_STATUS), CompletionKey, (LPOVERLAPPED) pFaxDevStatus);
}
}