411 lines
8.2 KiB
C
411 lines
8.2 KiB
C
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
faxmon.h
|
|
|
|
Abstract:
|
|
|
|
Header file for fax print monitor
|
|
|
|
Environment:
|
|
|
|
Windows NT fax print monitor
|
|
|
|
Revision History:
|
|
|
|
02/22/96 -davidx-
|
|
Created it.
|
|
|
|
dd-mm-yy -author-
|
|
description
|
|
|
|
--*/
|
|
|
|
|
|
#ifndef _FAXMON_H_
|
|
#define _FAXMON_H_
|
|
|
|
#if defined(UNICODE) && !defined(_UNICODE)
|
|
#define _UNICODE
|
|
#endif
|
|
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <windows.h>
|
|
#include <winspool.h>
|
|
#include <winsplp.h>
|
|
#include <tchar.h>
|
|
|
|
#include "winfax.h"
|
|
#include "winfaxp.h"
|
|
#include "jobtag.h"
|
|
|
|
//
|
|
// String resource IDs
|
|
//
|
|
|
|
#define IDS_FAX_MONITOR_NAME 256
|
|
#define IDS_FAX_PORT_DESC 257
|
|
#define IDS_PORT_ALREADY_EXISTS 258
|
|
#define IDS_FAXERR_RECOVERABLE 259
|
|
#define IDS_FAXERR_FATAL 260
|
|
#define IDS_FAXERR_BAD_TIFF 261
|
|
#define IDS_FAXERR_BAD_DATA16 262
|
|
#define IDS_ADD_PORT 263
|
|
#define IDS_DELETE_PORT 264
|
|
#define IDS_CONFIGURE_PORT 265
|
|
#define IDS_CONFIG_ERROR 266
|
|
#define IDS_ADD_ERROR 267
|
|
#define IDS_DELETE_ERROR 268
|
|
|
|
//
|
|
// Data structure for representing a fax monitor port
|
|
//
|
|
|
|
typedef struct _FAXPORT {
|
|
|
|
PVOID startSig; // signature
|
|
LPTSTR pName; // port name
|
|
HANDLE hFaxSvc; // fax service handle
|
|
DWORD jobId; // main job ID
|
|
DWORD nextJobId; // next job ID in the chain
|
|
HANDLE hFile; // handle to currently open file
|
|
LPTSTR pFilename; // pointer to currently open file name
|
|
LPTSTR pPrinterName; // currently connected printer name
|
|
HANDLE hPrinter; // open handle to currently connected printer
|
|
LPTSTR pParameters; // pointer to job parameter string
|
|
FAX_JOB_PARAM jobParam; // pointer to individual job parameters
|
|
HMODULE hWinFax; // handle for loaded winfax dll
|
|
PFAXCONNECTFAXSERVERW pFaxConnectFaxServerW; // function pointer
|
|
PFAXCLOSE pFaxClose; // function pointer
|
|
PFAXSENDDOCUMENTW pFaxSendDocumentW; // function pointer
|
|
PFAXACCESSCHECK pFaxAccessCheck; // function pointer
|
|
PVOID endSig; // signature
|
|
|
|
} FAXPORT, *PFAXPORT;
|
|
|
|
#define ValidFaxPort(pFaxPort) \
|
|
((pFaxPort) && (pFaxPort) == (pFaxPort)->startSig && (pFaxPort) == (pFaxPort)->endSig)
|
|
|
|
//
|
|
// Different error code when sending fax document
|
|
//
|
|
|
|
#define FAXERR_NONE 0
|
|
#define FAXERR_IGNORE 1
|
|
#define FAXERR_RESTART 2
|
|
#define FAXERR_SPECIAL 3
|
|
|
|
#define FAXERR_FATAL IDS_FAXERR_FATAL
|
|
#define FAXERR_RECOVERABLE IDS_FAXERR_RECOVERABLE
|
|
#define FAXERR_BAD_TIFF IDS_FAXERR_BAD_TIFF
|
|
#define FAXERR_BAD_DATA16 IDS_FAXERR_BAD_DATA16
|
|
|
|
//
|
|
// Memory allocation and deallocation macros
|
|
//
|
|
|
|
#define MemAlloc(size) ((PVOID) LocalAlloc(LMEM_FIXED, (size)))
|
|
#define MemAllocZ(size) ((PVOID) LocalAlloc(LPTR, (size)))
|
|
#define MemFree(ptr) { if (ptr) LocalFree((HLOCAL) (ptr)); }
|
|
|
|
//
|
|
// Number of tags used for passing fax job parameters
|
|
//
|
|
|
|
#define NUM_JOBPARAM_TAGS 11
|
|
|
|
//
|
|
// Nul terminator for a character string
|
|
//
|
|
|
|
#define NUL 0
|
|
|
|
//
|
|
// Result of string comparison
|
|
//
|
|
|
|
#define EQUAL_STRING 0
|
|
|
|
#define IsEmptyString(p) ((p)[0] == NUL)
|
|
#define IsNulChar(c) ((c) == NUL)
|
|
#define SizeOfString(p) ((_tcslen(p) + 1) * sizeof(TCHAR))
|
|
|
|
//
|
|
// Maximum value for signed and unsigned integers
|
|
//
|
|
|
|
#ifndef MAX_LONG
|
|
#define MAX_LONG 0x7fffffff
|
|
#endif
|
|
|
|
#ifndef MAX_DWORD
|
|
#define MAX_DWORD 0xffffffff
|
|
#endif
|
|
|
|
#ifndef MAX_SHORT
|
|
#define MAX_SHORT 0x7fff
|
|
#endif
|
|
|
|
#ifndef MAX_WORD
|
|
#define MAX_WORD 0xffff
|
|
#endif
|
|
|
|
//
|
|
// Path separator character
|
|
//
|
|
|
|
#define PATH_SEPARATOR '\\'
|
|
|
|
//
|
|
// Declaration of print monitor entry points
|
|
//
|
|
|
|
BOOL
|
|
FaxMonOpenPort(
|
|
LPTSTR pPortName,
|
|
PHANDLE pHandle
|
|
);
|
|
|
|
BOOL
|
|
FaxMonClosePort(
|
|
HANDLE hPort
|
|
);
|
|
|
|
BOOL
|
|
FaxMonStartDocPort(
|
|
HANDLE hPort,
|
|
LPTSTR pPrinterName,
|
|
DWORD JobId,
|
|
DWORD Level,
|
|
LPBYTE pDocInfo
|
|
);
|
|
|
|
BOOL
|
|
FaxMonEndDocPort(
|
|
HANDLE hPort
|
|
);
|
|
|
|
BOOL
|
|
FaxMonWritePort(
|
|
HANDLE hPort,
|
|
LPBYTE pBuffer,
|
|
DWORD cbBuf,
|
|
LPDWORD pcbWritten
|
|
);
|
|
|
|
BOOL
|
|
FaxMonReadPort(
|
|
HANDLE hPort,
|
|
LPBYTE pBuffer,
|
|
DWORD cbBuf,
|
|
LPDWORD pcbRead
|
|
);
|
|
|
|
BOOL
|
|
FaxMonEnumPorts(
|
|
LPTSTR pServerName,
|
|
DWORD Level,
|
|
LPBYTE pPorts,
|
|
DWORD cbBuf,
|
|
LPDWORD pcbNeeded,
|
|
LPDWORD pReturned
|
|
);
|
|
|
|
BOOL
|
|
FaxMonAddPort(
|
|
LPTSTR pServerName,
|
|
HWND hwnd,
|
|
LPTSTR pMonitorName
|
|
);
|
|
|
|
BOOL
|
|
FaxMonAddPortEx(
|
|
LPTSTR pServerName,
|
|
DWORD level,
|
|
LPBYTE pBuffer,
|
|
LPTSTR pMonitorName
|
|
);
|
|
|
|
BOOL
|
|
FaxMonDeletePort(
|
|
LPTSTR pServerName,
|
|
HWND hwnd,
|
|
LPTSTR pPortName
|
|
);
|
|
|
|
BOOL
|
|
FaxMonConfigurePort(
|
|
LPWSTR pServerName,
|
|
HWND hwnd,
|
|
LPWSTR pPortName
|
|
);
|
|
|
|
//
|
|
// Get the list of fax devices from the service
|
|
//
|
|
|
|
PFAX_PORT_INFO
|
|
MyFaxEnumPorts(
|
|
LPDWORD pcPorts,
|
|
BOOL useCache
|
|
);
|
|
|
|
//
|
|
// Wrapper function for fax service's FaxGetPort API
|
|
//
|
|
|
|
PFAX_PORT_INFO
|
|
MyFaxGetPort(
|
|
LPTSTR pPortName,
|
|
BOOL useCache
|
|
);
|
|
|
|
//
|
|
// Make a duplicate of the given character string
|
|
//
|
|
|
|
LPTSTR
|
|
DuplicateString(
|
|
LPCTSTR pSrcStr
|
|
);
|
|
|
|
//
|
|
// Update the status information of a print job
|
|
//
|
|
|
|
BOOL
|
|
SetJobStatus(
|
|
HANDLE hPrinter,
|
|
DWORD jobId,
|
|
INT statusStrId
|
|
);
|
|
|
|
//
|
|
// Wrapper function for spooler API GetJob
|
|
//
|
|
|
|
PVOID
|
|
MyGetJob(
|
|
HANDLE hPrinter,
|
|
DWORD level,
|
|
DWORD jobId
|
|
);
|
|
|
|
//
|
|
// Create a temporary file in the system spool directory for storing fax data
|
|
//
|
|
|
|
LPTSTR
|
|
CreateTempFaxFile(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Open a handle to the current fax job file associated with a port
|
|
//
|
|
|
|
BOOL
|
|
OpenTempFaxFile(
|
|
PFAXPORT pFaxPort,
|
|
BOOL doAppend
|
|
);
|
|
|
|
//
|
|
// Process fax jobs sent from win31 and win95 clients
|
|
//
|
|
|
|
INT
|
|
ProcessDownlevelFaxJob(
|
|
PFAXPORT pFaxPort
|
|
);
|
|
|
|
|
|
//
|
|
// Retrieve a DWORD value from the registry
|
|
//
|
|
|
|
DWORD
|
|
GetRegistryDWord(
|
|
HKEY hRegKey,
|
|
LPTSTR pValueName,
|
|
DWORD defaultValue
|
|
);
|
|
|
|
#define REGVAL_CONNECT_RETRY_COUNT TEXT("ConnectRetryCount")
|
|
#define REGVAL_CONNECT_RETRY_INTERVAL TEXT("ConnectRetryInterval")
|
|
|
|
|
|
#if DBG
|
|
|
|
//
|
|
// These macros are used for debugging purposes. They expand
|
|
// to white spaces on a free build. Here is a brief description
|
|
// of what they do and how they are used:
|
|
//
|
|
// _debugLevel
|
|
// A variable which controls the amount of debug messages. To generate
|
|
// lots of debug messages, enter the following line in the debugger:
|
|
//
|
|
// ed _debugLevel 1
|
|
//
|
|
// Verbose
|
|
// Display a debug message if _debugLevel is set to non-zero.
|
|
//
|
|
// Verbose(("Entering XYZ: param = %d\n", param));
|
|
//
|
|
// Error
|
|
// Display an error message along with the filename and the line number
|
|
// to indicate where the error occurred.
|
|
//
|
|
// Error(("XYZ failed"));
|
|
//
|
|
// Assert
|
|
// Verify a condition is true. If not, force a breakpoint.
|
|
//
|
|
// Assert(p != NULL && (p->flags & VALID));
|
|
|
|
extern INT _debugLevel;
|
|
extern VOID DbgPrint(LPCSTR, ...);
|
|
extern LPCSTR StripDirPrefixA(LPCSTR);
|
|
|
|
#define Warning(arg) {\
|
|
DbgPrint("WRN %s (%d): ", StripDirPrefixA(__FILE__), __LINE__);\
|
|
DbgPrint arg;\
|
|
}
|
|
|
|
#define Error(arg) {\
|
|
DbgPrint("ERR %s (%d): ", StripDirPrefixA(__FILE__), __LINE__);\
|
|
DbgPrint arg;\
|
|
}
|
|
|
|
#define Verbose(arg) { if (_debugLevel > 0) DbgPrint arg; }
|
|
#define Assert(cond) {\
|
|
if (! (cond)) {\
|
|
DbgPrint("ASSERT: %s (%d)\n", StripDirPrefixA(__FILE__), __LINE__);\
|
|
__try { \
|
|
DebugBreak(); \
|
|
} __except (UnhandledExceptionFilter(GetExceptionInformation())) { \
|
|
} \
|
|
}\
|
|
}
|
|
|
|
#define Trace(funcName) { if (_debugLevel > 0) DbgPrint("Entering %s ...\n", funcName); }
|
|
|
|
#else // !DBG
|
|
|
|
#define Verbose(arg)
|
|
#define Assert(cond)
|
|
#define Warning(arg)
|
|
#define Error(arg)
|
|
#define Trace(funcName)
|
|
|
|
#endif // DBG
|
|
|
|
#endif // !_FAXMON_H_
|
|
|