188 lines
4.6 KiB
C
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);
|
|
}
|
|
}
|