windows-nt/Source/XPSP1/NT/printscan/fax/print/faxmon/faxmon.h
2020-09-26 16:20:57 +08:00

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_