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_
|
||
|
|