/*++ 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); } }