windows-nt/Source/XPSP1/NT/printscan/fax/test/faxrcv/faxrcv.c

394 lines
8.8 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
faxrcv.c
Abstract:
Window NT Fax Routing Extension. This routing method signals a named event.
Author:
Steven Kehrli (steveke) 11/15/1997
--*/
#include <windows.h>
#include <stdlib.h>
#include <winfax.h>
#include <faxroute.h>
#include "faxrcv.h"
PFAXROUTEGETFILE g_pFaxRouteGetFile; // g_pFaxRouteGetFile is the pointer to callback to get file from fax file list
DWORD
DllEntry(
HINSTANCE hInstance,
DWORD dwReason,
LPVOID pContext
)
/*++
Routine Description:
DLL entry point
Arguments:
hInstance - handle to the module
dwReason - indicates the reason for being called
pContext - context
Return Value:
TRUE on success
--*/
{
switch (dwReason) {
case DLL_PROCESS_ATTACH:
if (!g_hFaxRcvEvent) {
// Create FaxRcv named event
g_hFaxRcvEvent = CreateEvent(NULL, FALSE, FALSE, FAXRCV_EVENT);
}
if (!g_hFaxRcvMutex) {
// Create FaxRcv named mutex
g_hFaxRcvMutex = CreateMutex(NULL, FALSE, FAXRCV_MUTEX);
}
break;
case DLL_PROCESS_DETACH:
if (g_hFaxRcvMutex) {
// Wait for access to the FaxRcv named mutex
WaitForSingleObject(g_hFaxRcvMutex, INFINITE);
// Reset FaxRcv named event
ResetEvent(g_hFaxRcvEvent);
// Close FaxRcv named event
CloseHandle(g_hFaxRcvEvent);
g_hFaxRcvEvent = NULL;
if (g_pFaxRcvView) {
// Delete szCopyTiffFile
DeleteFile((LPWSTR) g_pFaxRcvView);
// Close FaxRcv memory map view
UnmapViewOfFile(g_pFaxRcvView);
g_pFaxRcvView = NULL;
}
if (g_hFaxRcvMap) {
// Close FaxRcv memory map
CloseHandle(g_hFaxRcvMap);
g_hFaxRcvMap = NULL;
}
// Release access to the FaxRcv named mutex
ReleaseMutex(g_hFaxRcvMutex);
// Close FaxRcv named mutex
CloseHandle(g_hFaxRcvMutex);
g_hFaxRcvMutex = NULL;
}
break;
}
return TRUE;
}
BOOL WINAPI
FaxRouteInitialize(
HANDLE hHeap,
PFAX_ROUTE_CALLBACKROUTINES pFaxRouteCallbackRoutines
)
/*++
Routine Description:
Initializes the routing extension
Arguments:
hHeap - handle to the heap
pFaxRouteCallbackRoutins - pointer to fax routing callback routines
Return Value:
TRUE on success
--*/
{
// Set g_pFaxRouteGetFile
g_pFaxRouteGetFile = pFaxRouteCallbackRoutines->FaxRouteGetFile;
return TRUE;
}
BOOL WINAPI
FaxRouteGetRoutingInfo(
LPCWSTR RoutingGuid,
DWORD dwDeviceId,
LPBYTE RoutingInfo,
LPDWORD pdwRoutingInfoSize
)
/*++
Routine Description:
Gets the routing info for a routing method
Arguments:
RoutingGuid - pointer to the GUID of the routing method
dwDeviceId - port id
RoutingInfo - pointer to the routing info
pdwRoutingInfoSize - pointer to the size of the routing info
Return Value:
TRUE on success
--*/
{
return TRUE;
}
BOOL WINAPI
FaxRouteSetRoutingInfo(
LPCWSTR RoutingGuid,
DWORD dwDeviceId,
BYTE const *RoutingInfo,
DWORD dwRoutingInfoSize
)
/*++
Routine Description:
Sets the routing info for a routing method
Arguments:
RoutingGuid - pointer to the GUID of the routing method
dwDeviceId - port id
RoutingInfo - pointer to the routing info
dwRoutingInfoSize - size of the routing info
Return Value:
TRUE on success
--*/
{
return TRUE;
}
BOOL WINAPI
FaxRouteDeviceEnable(
LPCWSTR RoutingGuid,
DWORD dwDeviceId,
LONG bEnable
)
/*++
Routine Description:
Enables a routing method
Arguments:
RoutingGuid - pointer to the GUID of the routing method
dwDeviceId - port id
bEnable - indicates whether the routing method is enabled or disabled
Return Value:
TRUE on success
--*/
{
return TRUE;
}
BOOL WINAPI
FaxRouteDeviceChangeNotification(
DWORD dwDeviceId,
BOOL bNewDevice
)
/*++
Routine Description:
Handles a device change
Arguments:
dwDeviceId - port id
bNewDevice - indicates whether the device is new
Return Value:
TRUE on success
--*/
{
return TRUE;
}
BOOL WINAPI
FaxRcv(
PFAX_ROUTE pFaxRoute,
PVOID *FailureData,
LPDWORD pdwFailureDataSize
)
/*++
Routine Description:
Routing method. This routing method signals a named event.
Arguments:
pFaxRoute - pointer to the fax routing structure
FailureData - pointer to the failure data
pdwFailureDataSize - size of the failure data
Return Value:
TRUE on success
--*/
{
// hFaxRcvExtKey is the handle to the FaxRcv Extension Registry key
HKEY hFaxRcvExtKey;
// bEnable indicates whether the Routing method is enabled
BOOL bEnable;
// szTiffFile is the name of the received fax
WCHAR szTiffFile[_MAX_PATH];
// szCopyTiffFile is the name of the copy of the received fax
WCHAR szCopyTiffFile[_MAX_PATH];
// szDrive is the drive of the received fax
WCHAR szDrive[_MAX_DRIVE];
// szDir is the dir of the received fax
WCHAR szDir[_MAX_DIR];
// szFile is the name of the received fax
WCHAR szFile[_MAX_FNAME];
// szExt is the extension of the received fax
WCHAR szExt[_MAX_EXT];
UINT_PTR upOffset;
DWORD cb;
// Wait for access to the FaxRcv named mutex
WaitForSingleObject(g_hFaxRcvMutex, INFINITE);
// Open the FaxRcv Extension Registry key
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, FAXRCV_EXT_REGKEY, 0, KEY_ALL_ACCESS, &hFaxRcvExtKey) != ERROR_SUCCESS) {
// Release access to the FaxRcv named mutex
ReleaseMutex(g_hFaxRcvMutex);
return TRUE;
}
// Set cb
cb = sizeof(BOOL);
// Query the FaxRcv Extension bEnable Registry value
if (RegQueryValueEx(hFaxRcvExtKey, BENABLE_EXT_REGVAL, NULL, NULL, (LPBYTE) &bEnable, &cb) != ERROR_SUCCESS) {
// Close the FaxRcv Extension Registry key
RegCloseKey(hFaxRcvExtKey);
// Release access to the FaxRcv named mutex
ReleaseMutex(g_hFaxRcvMutex);
return TRUE;
}
// Close the FaxRcv Extension Registry key
RegCloseKey(hFaxRcvExtKey);
if (!bEnable) {
// Release access to the FaxRcv named mutex
ReleaseMutex(g_hFaxRcvMutex);
return TRUE;
}
// Set cb
cb = sizeof(szTiffFile);
// Initialize szTiffFile
ZeroMemory(szTiffFile, cb);
// Get the file
if (!g_pFaxRouteGetFile(pFaxRoute->JobId, 1, szTiffFile, &cb)) {
// Release access to the FaxRcv named mutex
ReleaseMutex(g_hFaxRcvMutex);
return FALSE;
}
// Initialize szDrive
ZeroMemory(szDrive, sizeof(szDrive));
// Initialize szDir
ZeroMemory(szDir, sizeof(szDir));
// Initialize szFile
ZeroMemory(szFile, sizeof(szFile));
// Initialize szExt
ZeroMemory(szExt, sizeof(szExt));
_wsplitpath(szTiffFile, szDrive, szDir, szFile, szExt);
// Initialize szCopyTiffFile
ZeroMemory(szCopyTiffFile, sizeof(szCopyTiffFile));
// Set szCopyTiffFile
wsprintf(szCopyTiffFile, L"%s%s%s%s%s", szDrive, szDir, L"Copy of ", szFile, szExt);
// Copy szTiffFile to szCopyTiffFile
CopyFile(szTiffFile, szCopyTiffFile, FALSE);
// Determine the memory required by FaxRcv memory map
cb = (lstrlen(szCopyTiffFile) + 1) * sizeof(WCHAR);
cb += (lstrlen(pFaxRoute->Tsid) + 1) * sizeof(WCHAR);
cb += sizeof(DWORD);
if (g_pFaxRcvView) {
// Delete szCopyTiffFile
DeleteFile((LPWSTR) g_pFaxRcvView);
// Close FaxRcv memory map view
UnmapViewOfFile(g_pFaxRcvView);
}
if (g_hFaxRcvMap) {
// Close FaxRcv memory map
CloseHandle(g_hFaxRcvMap);
}
// Create FaxRcv memory map
g_hFaxRcvMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, cb, FAXRCV_MAP);
// Create FaxRcv memory map view
g_pFaxRcvView = (LPBYTE) MapViewOfFile(g_hFaxRcvMap, FILE_MAP_WRITE, 0, 0, 0);
// Set upOffset
upOffset = 0;
// Set szCopyTiffFile
lstrcpy((LPWSTR) ((UINT_PTR) g_pFaxRcvView + upOffset), szCopyTiffFile);
upOffset += (lstrlen(szCopyTiffFile) + 1) * sizeof(WCHAR);
// Set Tsid
lstrcpy((LPWSTR) ((UINT_PTR) g_pFaxRcvView + upOffset), pFaxRoute->Tsid);
upOffset += (lstrlen(pFaxRoute->Tsid) + 1) * sizeof(WCHAR);
// Set DeviceId
CopyMemory((LPDWORD) ((UINT_PTR) g_pFaxRcvView + upOffset), &pFaxRoute->DeviceId, sizeof(DWORD));
// Signal FaxRcv named event
SetEvent(g_hFaxRcvEvent);
// Release access to the FaxRcv named mutex
ReleaseMutex(g_hFaxRcvMutex);
return TRUE;
}