You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2084 lines
66 KiB
2084 lines
66 KiB
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
faxsvc.h
|
|
|
|
Abstract:
|
|
|
|
This is the main fax service header file. All
|
|
source modules should include this file ONLY.
|
|
|
|
Author:
|
|
|
|
Wesley Witt (wesw) 16-Jan-1996
|
|
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _FAXSVC_
|
|
#define _FAXSVC_
|
|
|
|
#include <windows.h>
|
|
#include <shellapi.h>
|
|
#include <winspool.h>
|
|
#include <imagehlp.h>
|
|
#include <winsock2.h>
|
|
#include <setupapi.h>
|
|
#include <ole2.h>
|
|
#include <tapi.h>
|
|
#include <rpc.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <tchar.h>
|
|
#include <time.h>
|
|
#include <shlobj.h>
|
|
#include <stddef.h>
|
|
#include <fxsapip.h>
|
|
#include <faxroute.h>
|
|
#include <faxdev.h>
|
|
#include <faxdevex.h>
|
|
#include <faxext.h>
|
|
#include <sddl.h>
|
|
#include <objbase.h>
|
|
#include <lmcons.h>
|
|
#include <Wincrui.h>
|
|
#include "fxsapip.h"
|
|
#include "faxrpc.h"
|
|
#include "faxcli.h"
|
|
#include "faxutil.h"
|
|
#include "CritSec.h"
|
|
#include "faxevent_messages.h"
|
|
#include "faxmsg.h"
|
|
#include "tifflib.h"
|
|
#include "faxreg.h"
|
|
#include "faxsvcrg.h"
|
|
#include "faxperf.h"
|
|
#include "resource.h"
|
|
#include "rpcutil.h"
|
|
#include "faxmapi.h"
|
|
#include "faxevent.h"
|
|
|
|
#include "tiff.h"
|
|
#include "archive.h"
|
|
#include "tapiCountry.h"
|
|
#include "RouteGroup.h"
|
|
#include "RouteRule.h"
|
|
#include "Events.h"
|
|
#include "prtcovpg.h"
|
|
#include "faxres.h"
|
|
#include "Dword2Str.h"
|
|
|
|
#define INBOX_TABLE TEXT("Inbox")
|
|
#define OUTBOX_TABLE TEXT("Outbox")
|
|
#define EMPTY_LOG_STRING TEXT(" ")
|
|
#define TAB_LOG_STRING TEXT(" ") // Define '/t' to 4 spaces ,so we can use TAB as a delimeter
|
|
#define NEW_LINE_LOG_CHAR TEXT(' ') // Define '/n' to 1 space ,so we can log strings with '/n'
|
|
|
|
|
|
#define FIELD_TYPE_TEXT TEXT("Char")
|
|
#define FIELD_TYPE_DATE TEXT("Date")
|
|
#define FIELD_TYPE_FLOAT TEXT("Float")
|
|
|
|
typedef struct _LOG_STRING_TABLE {
|
|
DWORD FieldStringResourceId;
|
|
LPTSTR Type;
|
|
DWORD Size;
|
|
LPTSTR String;
|
|
} LOG_STRING_TABLE, *PLOG_STRING_TABLE;
|
|
|
|
extern HANDLE g_hInboxActivityLogFile;
|
|
extern HANDLE g_hOutboxActivityLogFile;
|
|
|
|
//
|
|
// TAPI versions
|
|
//
|
|
#define MAX_TAPI_API_VER 0x00020000
|
|
#define MIN_TAPI_API_VER MAX_TAPI_API_VER
|
|
|
|
#define MIN_TAPI_LINE_API_VER 0x00010003
|
|
#define MAX_TAPI_LINE_API_VER MAX_TAPI_API_VER
|
|
|
|
|
|
#define FSPI_JOB_STATUS_INFO_FSP_PRIVATE_STATUS_CODE 0x10000000
|
|
//
|
|
// JobStatus - Virtual property support
|
|
//
|
|
#define JS_INVALID 0x00000000
|
|
|
|
typedef enum {
|
|
FAX_TIME_TYPE_START = 1,
|
|
FAX_TIME_TYPE_END
|
|
} FAX_ENUM_TIME_TYPES;
|
|
|
|
#define ALL_FAX_USER_ACCESS_RIGHTS (READ_CONTROL | WRITE_DAC | WRITE_OWNER | FAX_GENERIC_ALL)
|
|
|
|
#if DBG
|
|
|
|
|
|
|
|
|
|
BOOL DebugDateTime( IN DWORDLONG DateTime, OUT LPTSTR lptstrDateTime, IN UINT cchstrDateTime);
|
|
VOID DebugPrintDateTime(LPTSTR Heading,DWORDLONG DateTime);
|
|
|
|
void PrintJobQueue(LPCTSTR lptstrStr, const LIST_ENTRY * lpQueueHead);
|
|
|
|
|
|
#else
|
|
#define PrintJobQueue( str, Queue )
|
|
#define DebugPrintDateTime( Heading, DateTime )
|
|
#define DebugDateTime( DateTime, lptstrDateTime, cchstrDateTime)
|
|
#define DumpRecipientJob(lpcRecipJob)
|
|
#define DumpParentJobJob(lpcParentJob)
|
|
#endif
|
|
|
|
|
|
#ifdef DBG
|
|
#define EnterCriticalSection(cs) pEnterCriticalSection(cs,__LINE__,TEXT(__FILE__))
|
|
#define LeaveCriticalSection(cs) pLeaveCriticalSection(cs,__LINE__,TEXT(__FILE__))
|
|
|
|
VOID pEnterCriticalSection(
|
|
LPCRITICAL_SECTION cs,
|
|
DWORD line,
|
|
LPTSTR file
|
|
);
|
|
|
|
VOID pLeaveCriticalSection(
|
|
LPCRITICAL_SECTION cs,
|
|
DWORD line,
|
|
LPTSTR file
|
|
);
|
|
|
|
BOOL
|
|
ThreadOwnsCs(
|
|
VOID
|
|
);
|
|
|
|
typedef struct {
|
|
LIST_ENTRY ListEntry;
|
|
ULONG_PTR CritSecAddr;
|
|
DWORD ThreadId;
|
|
DWORD AquiredTime;
|
|
DWORD ReleasedTime;
|
|
} DBGCRITSEC, * PDBGCRITSEC;
|
|
|
|
#endif
|
|
|
|
#define FAX_IMAGE_NAME FAX_SERVICE_IMAGE_NAME
|
|
#define RAS_MODULE_NAME TEXT("rastapi.dll")
|
|
|
|
#define MAX_CLIENTS 1
|
|
#define MIN_THREADS 1
|
|
#define MAX_STATUS_THREADS 1
|
|
#define SIZEOF_PHONENO 256
|
|
#define EX_STATUS_STRING_LEN 256
|
|
#define MIN_RINGS_ALLOWED 2
|
|
#define MAX_MODEM_POPUPS 2
|
|
#define MAX_HANDLES 1024
|
|
|
|
#define WM_SERVICE_INIT (WM_USER+101)
|
|
#define MilliToNano(_ms) ((LONGLONG)(_ms) * 1000 * 10)
|
|
#define SecToNano(_sec) (DWORDLONG)((_sec) * 1000 * 1000 * 10)
|
|
|
|
#define FILLORDER_MSB2LSB 1
|
|
|
|
#define LINE_SIGNATURE 0x454e494c // 'LINE'
|
|
#define ROUTING_SIGNATURE 'RI01'
|
|
|
|
#define TAPI_COMPLETION_KEY 0x80000001
|
|
#define FAXDEV_EVENT_KEY 0x80000002
|
|
#define FSPI_JOB_STATUS_MSG_KEY 0x80000003 // Used internally to post FSPI_JOB_STATUS_MSG messages to the FaxStatusThread
|
|
#define EFAXDEV_EVENT_KEY 0x80000004
|
|
#define ANSWERNOW_EVENT_KEY 0x80000005
|
|
#define SERVICE_SHUT_DOWN_KEY 0xffffffff
|
|
|
|
#define FixupString(_b, _s) (_s) = ((_s) ? (LPTSTR) ((LPBYTE)(_b) + (ULONG_PTR)_s) : 0)
|
|
|
|
#define FAX_DEVICE_TYPE_NEW 1
|
|
#define FAX_DEVICE_TYPE_CACHED 2
|
|
#define FAX_DEVICE_TYPE_OLD 4
|
|
#define FAX_DEVICE_TYPE_MANUAL_ANSWER 8
|
|
|
|
|
|
//
|
|
// private fax port state masks
|
|
// this bits must not conflict with FPS_?? in winfax.h or FS_??? in faxdev.h
|
|
//
|
|
|
|
#define FPS_SENDRETRY 0x2000f001
|
|
#define FPS_SENDFAILED 0x2000f002
|
|
#define FPS_BLANKSTR 0x2000f003
|
|
#define FPS_ROUTERETRY 0x2000f004
|
|
|
|
#define FPF_USED 0x10000000
|
|
#define FPF_POWERED_OFF 0x20000000
|
|
|
|
#define FPF_CLIENT_BITS (FPF_RECEIVE | FPF_SEND)
|
|
|
|
|
|
typedef struct _DEVICE_PROVIDER {
|
|
LIST_ENTRY ListEntry;
|
|
|
|
FAX_ENUM_PROVIDER_STATUS Status; // Initialization status of the FSP
|
|
DWORD dwLastError; // Last error code during initialization
|
|
FAX_VERSION Version; // FSP's DLL version info.
|
|
|
|
BOOL bShutDownAttempted; // Used to prevent more than one call FaxDevShutdown
|
|
BOOL bInitializationSucceeded; // Set to TRUE if FaxDevInitialized completed successfully.
|
|
|
|
HMODULE hModule;
|
|
TCHAR FriendlyName[MAX_PATH];
|
|
TCHAR ImageName[MAX_PATH];
|
|
TCHAR ProviderName[MAX_PATH];
|
|
TCHAR szGUID[MAX_PATH]; // GUID for extended EFSPs. Empty string for Legacy FSPs.
|
|
DWORD dwAPIVersion; // FSPI Version. (Legacy or Extended)
|
|
HANDLE HeapHandle;
|
|
PFAXDEVINITIALIZE FaxDevInitialize;
|
|
PFAXDEVSTARTJOB FaxDevStartJob;
|
|
PFAXDEVENDJOB FaxDevEndJob;
|
|
PFAXDEVSEND FaxDevSend;
|
|
PFAXDEVRECEIVE FaxDevReceive;
|
|
PFAXDEVREPORTSTATUS FaxDevReportStatus;
|
|
PFAXDEVABORTOPERATION FaxDevAbortOperation;
|
|
PFAX_LINECALLBACK FaxDevCallback;
|
|
PFAXDEVVIRTUALDEVICECREATION FaxDevVirtualDeviceCreation;
|
|
PFAXDEVSHUTDOWN FaxDevShutdown;
|
|
PFAX_EXT_INITIALIZE_CONFIG pFaxExtInitializeConfig;
|
|
BOOL fMicrosoftExtension;
|
|
} DEVICE_PROVIDER, *PDEVICE_PROVIDER;
|
|
|
|
typedef struct _ROUTING_EXTENSION {
|
|
LIST_ENTRY ListEntry;
|
|
HMODULE hModule;
|
|
FAX_ENUM_PROVIDER_STATUS Status; // Initialization status of the routing extension
|
|
DWORD dwLastError; // Last error code during initialization
|
|
FAX_VERSION Version; // routing extension's DLL version info.
|
|
TCHAR FriendlyName[MAX_PATH];
|
|
TCHAR ImageName[MAX_PATH];
|
|
TCHAR InternalName[MAX_PATH];
|
|
HANDLE HeapHandle;
|
|
BOOL MicrosoftExtension;
|
|
PFAXROUTEINITIALIZE FaxRouteInitialize;
|
|
PFAXROUTEGETROUTINGINFO FaxRouteGetRoutingInfo;
|
|
PFAXROUTESETROUTINGINFO FaxRouteSetRoutingInfo;
|
|
PFAXROUTEDEVICEENABLE FaxRouteDeviceEnable;
|
|
PFAXROUTEDEVICECHANGENOTIFICATION FaxRouteDeviceChangeNotification;
|
|
PFAX_EXT_INITIALIZE_CONFIG pFaxExtInitializeConfig;
|
|
LIST_ENTRY RoutingMethods;
|
|
} ROUTING_EXTENSION, *PROUTING_EXTENSION;
|
|
|
|
typedef struct _ROUTING_METHOD {
|
|
LIST_ENTRY ListEntry;
|
|
LIST_ENTRY ListEntryMethod;
|
|
GUID Guid;
|
|
DWORD Priority;
|
|
LPTSTR FunctionName;
|
|
LPTSTR FriendlyName;
|
|
LPTSTR InternalName;
|
|
PFAXROUTEMETHOD FaxRouteMethod;
|
|
PROUTING_EXTENSION RoutingExtension;
|
|
} ROUTING_METHOD, *PROUTING_METHOD;
|
|
|
|
typedef BOOL (CALLBACK *PFAXROUTEMETHODENUM)(PROUTING_METHOD,LPVOID);
|
|
|
|
typedef struct _FAX_ROUTE_FILE {
|
|
LIST_ENTRY ListEntry; // linked list pointers
|
|
LPWSTR FileName; // file name on disk
|
|
GUID Guid; // routing method that created the file
|
|
} FAX_ROUTE_FILE, *PFAX_ROUTE_FILE;
|
|
|
|
typedef struct _LINE_INFO {
|
|
LIST_ENTRY ListEntry; // linked list pointers
|
|
DWORD Signature; // verification signature
|
|
DWORD DeviceId; // tapi device id
|
|
DWORD PermanentLineID; // Fax Service allocation permanent line id.
|
|
DWORD TapiPermanentLineId; // TAPI permanent tapi device id for TAPI devices.
|
|
HLINE hLine; // tapi line handle
|
|
PDEVICE_PROVIDER Provider; // fax service device provider
|
|
struct _JOB_ENTRY *JobEntry; // non-null if there is an outstanding job
|
|
LPTSTR DeviceName; // device name
|
|
LPTSTR lptstrDescription; // Device description
|
|
DWORD State; // device state
|
|
DWORD Flags; // device use flags
|
|
DWORD dwReceivingJobsCount; // Number of receiving jobs using this device
|
|
DWORD dwSendingJobsCount; // Number of sending jobs using this device
|
|
LPTSTR Csid; // calling station's identifier
|
|
LPTSTR Tsid; // transmittion station's identifier
|
|
BOOL UnimodemDevice; // true if this device is a modem
|
|
DWORD RingsForAnswer; //
|
|
DWORD RingCount; //
|
|
LINEMESSAGE LineMsgOffering; //
|
|
BOOL ModemInUse; // TRUE if the modem is in use by another TAPI app
|
|
BOOL OpenInProgress; //
|
|
DWORD LineStates; //
|
|
HCALL RasCallHandle; // used to track call when handed to RAS
|
|
BOOL NewCall; // A new call is coming in
|
|
DWORDLONG LastLineClose; // Time stamp of the last LINE_CLOSE
|
|
DWORD dwDeviceType; // One of FAX_DEVICE_TYPE_XXXX defines
|
|
} LINE_INFO, *PLINE_INFO;
|
|
|
|
|
|
VOID
|
|
UpdateDeviceJobsCounter (
|
|
PLINE_INFO pLine,
|
|
BOOL bSend,
|
|
int iInc,
|
|
BOOL bNotify
|
|
);
|
|
|
|
typedef struct {
|
|
HANDLE hComm;
|
|
CHAR szDeviceName[1];
|
|
} DEVICEID, *PDEVICEID;
|
|
|
|
typedef struct _ROUTING_DATA_OVERRIDE {
|
|
LIST_ENTRY ListEntry; //
|
|
LPBYTE RoutingData; //
|
|
DWORD RoutingDataSize; //
|
|
PROUTING_METHOD RoutingMethod; //
|
|
} ROUTING_DATA_OVERRIDE, *PROUTING_DATA_OVERRIDE;
|
|
|
|
typedef struct _ROUTE_FAILURE_INFO {
|
|
WCHAR GuidString[MAX_GUID_STRING_LEN]; // GUID of the rounting method that failed
|
|
PVOID FailureData; // pointer to the routing method's data
|
|
DWORD FailureSize; // routing method's data size in bytes
|
|
} ROUTE_FAILURE_INFO, *PROUTE_FAILURE_INFO;
|
|
|
|
typedef struct _JOB_QUEUE * PJOB_QUEUE;
|
|
typedef struct _JOB_QUEUE_PTR * PJOB_QUEUE_PTR;
|
|
|
|
typedef struct _JOB_ENTRY {
|
|
LIST_ENTRY ListEntry; //
|
|
PLINE_INFO LineInfo; //
|
|
HCALL CallHandle; //
|
|
HANDLE InstanceData; //
|
|
DWORDLONG StartTime; //
|
|
DWORDLONG EndTime; //
|
|
DWORDLONG ElapsedTime; //
|
|
BOOL Aborting; // is the job being aborted?
|
|
BOOL fSystemAbort; // The job was aborted by the service becuase it is shutting down.
|
|
INT SendIdx; //
|
|
TCHAR DisplayablePhoneNumber[SIZEOF_PHONENO]; // Displayable phone number for current send job
|
|
TCHAR DialablePhoneNumber[SIZEOF_PHONENO]; // Dialable phone number for current send job
|
|
BOOL Released; // Is the line used by this job already released.
|
|
|
|
PJOB_QUEUE lpJobQueueEntry; // link back to the job queue entry for this job
|
|
BOOL bFSPJobInProgress; // TRUE if FaxDevStartJob() was called for the job and FaxDevEndJob()
|
|
// was not called yet.
|
|
FSPI_JOB_STATUS FSPIJobStatus;
|
|
HANDLE hFSPIParentJobHandle; // The EFSP provided job handle for the EFSP parent job
|
|
// of this job.
|
|
WCHAR ExStatusString[EX_STATUS_STRING_LEN]; // Extended status string
|
|
LPWSTR lpwstrJobTsid; // The Tsid associated with the job (Server or device or Fax number)
|
|
BOOL fStopUpdateStatus; // When it is set to TRUE, the FSPIJobStatus of this structure should not be udated any more
|
|
|
|
} JOB_ENTRY, *PJOB_ENTRY;
|
|
|
|
|
|
typedef struct _EFSP_JOB_GROUP {
|
|
LIST_ENTRY ListEntry;
|
|
LPTSTR lptstrPersistFile; // The full path to the file where the group information is persisted.
|
|
LINE_INFO * lpLineInfo;
|
|
FSPI_MESSAGE_ID FSPIParentPermanentId;
|
|
HANDLE hFSPIParent;
|
|
DWORD dwRecipientJobs;
|
|
LIST_ENTRY RecipientJobs; // List of JOB_QUEUE_PTR pointing to the recipient jobs
|
|
// in the group.
|
|
} EFSP_JOB_GROUP;
|
|
|
|
typedef EFSP_JOB_GROUP * LPEFSP_JOB_GROUP;
|
|
typedef const EFSP_JOB_GROUP * LPCEFSP_JOB_GROUP;
|
|
|
|
#define EFSP_JOB_GROUP_SERIALIZATION_SIGNATURE "JOBG"
|
|
|
|
typedef struct _EFSP_JOB_GROUP_SERIALIZED {
|
|
DWORD dwSignature;
|
|
DWORD dwPermanentLineId;
|
|
FSPI_MESSAGE_ID FSPIParentPermanentId;
|
|
DWORD dwRecipientJobsCount;
|
|
DWORDLONG dwlRecipientJobs[1];
|
|
} EFSP_JOB_GROUP_SERIALIZED;
|
|
|
|
|
|
typedef EFSP_JOB_GROUP_SERIALIZED * LPEFSP_JOB_GROUP_SERIALIZED;
|
|
typedef const EFSP_JOB_GROUP_SERIALIZED * LPCEFSP_JOB_GROUP_SERIALIZED;
|
|
|
|
|
|
|
|
typedef struct _JOB_QUEUE {
|
|
//=========================== BEGIN COMMON ===========================
|
|
LIST_ENTRY ListEntry; // linked list pointers
|
|
DWORDLONG UniqueId; //
|
|
DWORDLONG ScheduleTime; // schedule time in 64bit version after converting from
|
|
// SYSTEMTIME and recacluating to fit the discount time
|
|
// if necessary. For parent jobs this is the schedule of
|
|
// the latest recipient that reached a JS_RETRIES_EXCEEDED state.
|
|
// (we use this value to remove old jobs that were left in the queue).
|
|
DWORD JobId; // fax job id
|
|
DWORD JobType; // job type, see JT defines
|
|
PJOB_ENTRY JobEntry; // Pointer to a JOB_ENTRY structure that holds
|
|
// run time information for a job which is currently in progress.
|
|
DWORD RefCount; // Used to prevent the deletion of a job when it is still in use
|
|
// by the receive or send thread.
|
|
DWORD PrevRefCount; // Used to count clients using the job's tif.
|
|
LPTSTR QueueFileName; // The name of the file where the job is persisted (full path)
|
|
|
|
__declspec(property(get=GetStatus, put=PutStatus)) // JobStatus is a virtual property
|
|
DWORD JobStatus; // job status, see JS defines
|
|
|
|
DWORD PageCount; // Th total number of pages in the fax document.
|
|
LPTSTR FileName; // For a parent job this is the full path to the body file.
|
|
// for a recipient job that is aimed at EFSP this is NULL.
|
|
// for a recipient job aimed at legacy FSP this is the full path
|
|
// to the file to provide to the FSP. This can be the body file
|
|
// a rendered coverpage file or a merge or the coverpage file and the
|
|
// body file.
|
|
// for a receive/route job this is the file into which the FSP
|
|
// writes the received FAX.
|
|
//=========================== END COMMON ============================
|
|
|
|
//=========================== BEGIN PARENT ============================
|
|
FAX_JOB_PARAM_EXW JobParamsEx; // Extended job parameters the job
|
|
// was submitted with.
|
|
FAX_COVERPAGE_INFO_EXW CoverPageEx;
|
|
LIST_ENTRY RecipientJobs; // A linked list of JOB_QUEUE_PTR structures
|
|
// pointing to the recipient jobs of the parent.
|
|
DWORD dwRecipientJobsCount;
|
|
FAX_PERSONAL_PROFILE SenderProfile;
|
|
DWORD dwCompletedRecipientJobsCount;
|
|
DWORD dwCanceledRecipientJobsCount;
|
|
DWORD dwFailedRecipientJobsCount;
|
|
DWORD FileSize; // file size in bytes, up to 4Gb
|
|
LPVOID DeliveryReportProfile; // Pointer to the MAPI profile object that is
|
|
// is created in order to deliver the reciept.
|
|
LPTSTR UserName; // The OS name of the user sending the fax.
|
|
// For receive jobs this is set to the service name.
|
|
|
|
PSID UserSid;
|
|
DWORDLONG OriginalScheduleTime;
|
|
DWORDLONG SubmissionTime;
|
|
BOOL fReceiptSent; // TRUE if a receipt was already sent for this broadcast job.
|
|
//=========================== END PARENT ===========================
|
|
|
|
//=========================== BEGIN RECIPIENT ===========================
|
|
FAX_PERSONAL_PROFILE RecipientProfile; // The recipient profile information.
|
|
_JOB_QUEUE * lpParentJob; // A pointer to the parent job queue entry.
|
|
DWORD SendRetries; // number of times send attempt has been made
|
|
LPTSTR PreviewFileName; // The full path to the preview tiff file.
|
|
CFaxCriticalSection CsPreview; // Used to synchronize access to preview file
|
|
|
|
// Used when FAX_SendDocumentEx() receives translated recipient's fax number
|
|
TCHAR tczDialableRecipientFaxNumber[SIZEOF_PHONENO];
|
|
|
|
//=========================== END RECIPIENT ===========================
|
|
|
|
//=========================== BEGIN RECEIPT ===========================
|
|
DWORDLONG StartTime; // Start time as will appear on receipt (copied from JobEntry)
|
|
// Used for routing jobs also
|
|
DWORDLONG EndTime; // End time as will appear on receipt (copied from JobEntry)
|
|
// Used for routing jobs also
|
|
//=========================== END RECEIPT ===========================
|
|
|
|
WCHAR ExStatusString[EX_STATUS_STRING_LEN]; // The last extended status string of this job (when it was active)
|
|
DWORD dwLastJobExtendedStatus; // The last extended status of this job (when it was active)
|
|
|
|
//=========================== BEGIN ROUTE ===========================
|
|
LIST_ENTRY FaxRouteFiles; // list of files to be routed
|
|
DWORD CountFaxRouteFiles; // count of files to be routed
|
|
CFaxCriticalSection CsFileList; // file list lock
|
|
LIST_ENTRY RoutingDataOverride; //
|
|
CFaxCriticalSection CsRoutingDataOverride; //
|
|
PFAX_ROUTE FaxRoute;
|
|
DWORD CountFailureInfo; // number of ROUTE_FAILURE_INFO structs that follow
|
|
PROUTE_FAILURE_INFO pRouteFailureInfo; // Pointer to an array of ROUTE_FAILURE_INFO structs
|
|
//=========================== END ROUTE ===========================
|
|
|
|
//=========================== BEGIN RECIEVE ===========================
|
|
BOOL fDeleteReceivedTiff; // FALSE if the received tiff failed to archive succesfully. It will remain in the queue.
|
|
//=========================== END RECIEVE ===========================
|
|
|
|
_JOB_QUEUE() : m_dwJobStatus(JS_INVALID) {}
|
|
~_JOB_QUEUE();
|
|
|
|
DWORD GetStatus()
|
|
{
|
|
return m_dwJobStatus;
|
|
}
|
|
|
|
void PutStatus(DWORD dwStatus);
|
|
|
|
private:
|
|
DWORD m_dwJobStatus;
|
|
|
|
} JOB_QUEUE, *PJOB_QUEUE;
|
|
|
|
typedef JOB_QUEUE * PJOB_QUEUE;
|
|
typedef const JOB_QUEUE * PCJOB_QUEUE;
|
|
|
|
typedef struct _JOB_QUEUE_PTR {
|
|
LIST_ENTRY ListEntry;
|
|
PJOB_QUEUE lpJob;
|
|
} JOB_QUEUE_PTR, * PJOB_QUEUE_PTR;
|
|
|
|
|
|
|
|
typedef struct _JOB_QUEUE_FILE {
|
|
DWORD SizeOfStruct; // size of this structure
|
|
//=========================== BEGIN COMMON ===========================
|
|
DWORDLONG UniqueId; //
|
|
DWORDLONG ScheduleTime; // schedule time in 64bit version after converting from
|
|
// SYSTEMTIME and recacluating to fit the discount time
|
|
// if necessary.
|
|
DWORD JobType; // job type, see JT defines
|
|
LPTSTR QueueFileName; //
|
|
DWORD JobStatus; // job status, see JS defines
|
|
DWORD PageCount; // total pages
|
|
//=========================== END COMMON ============================
|
|
|
|
//=========================== BEGIN RECIPIENT/PARENT ==================
|
|
LPTSTR FileName; // Body TIFF file name.
|
|
// For each recipient this is set to
|
|
// the parent file name or in the case of
|
|
// a legacy FSP to the cover page or
|
|
// merged cover+body file.
|
|
|
|
//=========================== END RECEIVE/PARENT ======================
|
|
|
|
//=========================== BEGIN PARENT ============================
|
|
FAX_JOB_PARAM_EXW JobParamsEx;
|
|
FAX_COVERPAGE_INFO_EXW CoverPageEx;
|
|
|
|
DWORD dwRecipientJobsCount;
|
|
FAX_PERSONAL_PROFILE SenderProfile;
|
|
DWORD dwCompletedRecipientJobsCount;
|
|
DWORD dwCanceledRecipientJobsCount;
|
|
DWORD FileSize; // file size in bytes, up to 4Gb
|
|
LPTSTR DeliveryReportAddress; //
|
|
DWORD DeliveryReportType; //
|
|
LPTSTR UserName; // The OS name of the user sending the fax.
|
|
// For receive jobs this is set to the service name.
|
|
PSID UserSid; // Pointer to the user SID
|
|
DWORDLONG OriginalScheduleTime;
|
|
DWORDLONG SubmissionTime;
|
|
//=========================== END PARENT ===========================
|
|
|
|
//=========================== BEGIN RECIPIENT ===========================
|
|
FAX_PERSONAL_PROFILE RecipientProfile; // The recipient profile information.
|
|
DWORDLONG dwlParentJobUniqueId; // The unique id of the parent job
|
|
DWORD SendRetries; // number of times send attempt has been made
|
|
TCHAR tczDialableRecipientFaxNumber[SIZEOF_PHONENO]; // see _JOB_QUEUE for description
|
|
//=========================== END RECIPIENT ===========================
|
|
|
|
//=========================== BEGIN RECIEVE ===========================
|
|
DWORD FaxRouteSize;
|
|
PFAX_ROUTE FaxRoute;
|
|
DWORD CountFaxRouteFiles; // count of files to be routed
|
|
DWORD FaxRouteFileGuid; // offset array of GUID's
|
|
DWORD FaxRouteFiles; // offset to a multi-sz of filenames
|
|
DWORD CountFailureInfo; // number of ROUTE_FAILURE_INFO structs that follow
|
|
PROUTE_FAILURE_INFO pRouteFailureInfo; // Pointer to an array of ROUTE_FAILURE_INFO structs
|
|
//=========================== END RECIEVE ===========================
|
|
FSPI_MESSAGE_ID EFSPPermanentMessageId;
|
|
//=========================== BEGIN RECEIPT ===========================
|
|
DWORDLONG StartTime; // Start time as will appear on receipt (copied from JobEntry)
|
|
// Used for routing jobs also
|
|
DWORDLONG EndTime; // End time as will appear on receipt (copied from JobEntry)
|
|
// Used for routing jobs also
|
|
//=========================== END RECEIPT ===========================
|
|
|
|
WCHAR ExStatusString[EX_STATUS_STRING_LEN]; // The last extended status string of this job (when it was active)
|
|
DWORD dwLastJobExtendedStatus; // The last extended status of this job (when it was active)
|
|
|
|
} JOB_QUEUE_FILE, *PJOB_QUEUE_FILE;
|
|
|
|
|
|
typedef struct _BOS_JOB_QUEUE_FILE {
|
|
DWORD SizeOfStruct; // size of this structure
|
|
//=========================== BEGIN COMMON ===========================
|
|
DWORDLONG UniqueId; //
|
|
DWORDLONG ScheduleTime; // schedule time in 64bit version after converting from
|
|
// SYSTEMTIME and recacluating to fit the discount time
|
|
// if necessary.
|
|
DWORD JobType; // job type, see JT defines
|
|
LPTSTR QueueFileName; //
|
|
DWORD JobStatus; // job status, see JS defines
|
|
DWORD PageCount; // total pages
|
|
//=========================== END COMMON ============================
|
|
|
|
//=========================== BEGIN RECIPIENT/PARENT ==================
|
|
LPTSTR FileName; // Body TIFF file name.
|
|
// For each recipient this is set to
|
|
// the parent file name or in the case of
|
|
// a legacy FSP to the cover page or
|
|
// merged cover+body file.
|
|
|
|
//=========================== END RECEIVE/PARENT ======================
|
|
|
|
//=========================== BEGIN PARENT ============================
|
|
FAX_JOB_PARAM_EXW JobParamsEx;
|
|
FAX_COVERPAGE_INFO_EXW CoverPageEx;
|
|
|
|
DWORD dwRecipientJobsCount;
|
|
FAX_PERSONAL_PROFILE SenderProfile;
|
|
DWORD dwCompletedRecipientJobsCount;
|
|
DWORD dwCanceledRecipientJobsCount;
|
|
DWORD FileSize; // BUGBUG - file size in bytes, up to 4Gb
|
|
LPTSTR DeliveryReportAddress; //
|
|
DWORD DeliveryReportType; //
|
|
LPTSTR UserName; // The OS name of the user sending the fax.
|
|
// For receive jobs this is set to the service name.
|
|
PSID UserSid; // Pointer to the user SID
|
|
DWORDLONG OriginalScheduleTime;
|
|
DWORDLONG SubmissionTime;
|
|
//=========================== END PARENT ===========================
|
|
|
|
//=========================== BEGIN RECIPIENT ===========================
|
|
FAX_PERSONAL_PROFILE RecipientProfile; // The recipient profile information.
|
|
DWORDLONG dwlParentJobUniqueId; // The unique id of the parent job
|
|
DWORD SendRetries; // number of times send attempt has been made
|
|
//=========================== END RECIPIENT ===========================
|
|
|
|
//=========================== BEGIN RECIEVE ===========================
|
|
DWORD FaxRouteSize;
|
|
PFAX_ROUTE FaxRoute;
|
|
DWORD CountFaxRouteFiles; // count of files to be routed
|
|
DWORD FaxRouteFileGuid; // offset array of GUID's
|
|
DWORD FaxRouteFiles; // offset to a multi-sz of filenames
|
|
DWORD CountFailureInfo; // number of ROUTE_FAILURE_INFO structs that follow
|
|
PROUTE_FAILURE_INFO pRouteFailureInfo; // Pointer to an array of ROUTE_FAILURE_INFO structs
|
|
//=========================== END RECIEVE ===========================
|
|
FSPI_MESSAGE_ID EFSPPermanentMessageId;
|
|
//=========================== BEGIN RECEIPT ===========================
|
|
DWORDLONG StartTime; // Start time as will appear on receipt (copied from JobEntry)
|
|
// Used for routing jobs also
|
|
DWORDLONG EndTime; // End time as will appear on receipt (copied from JobEntry)
|
|
// Used for routing jobs also
|
|
//=========================== END RECEIPT ===========================
|
|
|
|
WCHAR ExStatusString[EX_STATUS_STRING_LEN]; // The last extended status string of this job (when it was active)
|
|
DWORD dwLastJobExtendedStatus; // The last extended status of this job (when it was active)
|
|
|
|
} BOS_JOB_QUEUE_FILE, *BOS_PJOB_QUEUE_FILE;
|
|
|
|
|
|
typedef struct _FAX_SEND_ITEM {
|
|
PJOB_ENTRY JobEntry; //
|
|
LPTSTR FileName; // The following items are copied from the FAX_JOB_PARAM struct
|
|
LPTSTR PhoneNumber; // RecipientNumber
|
|
LPTSTR Tsid; // TSID
|
|
LPTSTR RecipientName; //
|
|
LPTSTR SenderName; //
|
|
LPTSTR SenderCompany; //
|
|
LPTSTR SenderDept; //
|
|
LPTSTR BillingCode; //
|
|
LPTSTR DocumentName; //
|
|
} FAX_SEND_ITEM, *PFAX_SEND_ITEM;
|
|
|
|
typedef struct _ROUTE_INFO {
|
|
DWORD Signature; // file signature
|
|
DWORD StringSize; // size of strings in bytes
|
|
DWORD FailureSize; // size of failure data in bytes
|
|
LPWSTR TiffFileName; // original tiff file name
|
|
LPWSTR ReceiverName; // receiver's name
|
|
LPWSTR ReceiverNumber; // receiver's fax number
|
|
LPWSTR DeviceName; // device name on which the fax was received
|
|
LPWSTR Csid; // calling station's identifier
|
|
LPWSTR Tsid; // transmitter's station identifier
|
|
LPWSTR CallerId; // caller id information
|
|
LPWSTR RoutingInfo; // routing info: DID, T.30 subaddress, etc.
|
|
DWORDLONG ElapsedTime; // elapsed time for fax receive
|
|
// DWORD RouteFailureCount; // number of failure data blocks
|
|
// ROUTE_FAILURE_INFO RouteFailure[...]; // routing failure data blocks
|
|
} ROUTE_INFO, *PROUTE_INFO;
|
|
|
|
typedef struct _MESSAGEBOX_DATA {
|
|
LPTSTR Text; //
|
|
LPDWORD Response; //
|
|
DWORD Type; //
|
|
} MESSAGEBOX_DATA, *PMESSAGEBOX_DATA;
|
|
|
|
typedef struct _FAX_RECEIVE_ITEM {
|
|
PJOB_ENTRY JobEntry; //
|
|
HCALL hCall; //
|
|
PLINE_INFO LineInfo; //
|
|
LPTSTR FileName; //
|
|
} FAX_RECEIVE_ITEM, *PFAX_RECEIVE_ITEM;
|
|
|
|
typedef struct _FAX_CLIENT_DATA {
|
|
LIST_ENTRY ListEntry; //
|
|
handle_t hBinding; //
|
|
handle_t FaxHandle; //
|
|
WCHAR wstrMachineName[MAX_COMPUTERNAME_LENGTH + 1]; // Machine name
|
|
WCHAR wstrEndPoint[MAX_ENDPOINT_LEN]; // End point used for RPC connection
|
|
ULONG64 Context; //
|
|
HANDLE FaxClientHandle; //
|
|
BOOL bEventEx; // TRUE if the registration is for FAX_EVENT_EX, FALSE for FAX_EVENT
|
|
DWORD EventTypes; // Bit wise combination of FAX_ENUM_EVENT_TYPE
|
|
PSID UserSid; // Pointer to the user SID
|
|
} FAX_CLIENT_DATA, *PFAX_CLIENT_DATA;
|
|
|
|
typedef struct _MDM_DEVSPEC {
|
|
DWORD Contents; // Set to 1 (indicates containing key)
|
|
DWORD KeyOffset; // Offset to key from start of this struct.
|
|
// (not from start of LINEDEVCAPS ).
|
|
// 8 in our case.
|
|
CHAR String[1]; // place containing null-terminated registry key.
|
|
} MDM_DEVSPEC, *PMDM_DEVSPEC;
|
|
|
|
//
|
|
// fax handle defines & structs
|
|
//
|
|
typedef enum
|
|
{
|
|
FHT_SERVICE, // Handle to server (FaxConnectFaxServer)
|
|
FHT_PORT, // Port Handle (FaxOpenPort)
|
|
FHT_MSGENUM, // Message enumeration handle (FaxStartMessagesEnum)
|
|
FHT_COPY // RPC copy context handle
|
|
} FaxHandleType;
|
|
|
|
|
|
typedef struct _HANDLE_ENTRY
|
|
{
|
|
LIST_ENTRY ListEntry; // linked list pointers
|
|
handle_t hBinding; //
|
|
FaxHandleType Type; // handle type, see FHT defines
|
|
PLINE_INFO LineInfo; // pointer to line information
|
|
DWORD Flags; // open flags
|
|
BOOL bReleased; // The connection is not counted in the g_ReferenceCount
|
|
DWORD dwClientAPIVersion; // The API version of the connected client
|
|
//
|
|
// The following fields are used to enumerate files in the archive
|
|
//
|
|
HANDLE hFile; // Handle used in enumeration / copy
|
|
WCHAR wstrFileName[MAX_PATH]; // Name of first file found (enumeration)
|
|
// or file being copied (RPC copy)
|
|
FAX_ENUM_MESSAGE_FOLDER Folder; // Enumeration folder
|
|
//
|
|
// The following field is used for RPC copy
|
|
//
|
|
BOOL bCopyToServer; // Copy direction
|
|
BOOL bError; // Was there an error during the RPC copy?
|
|
PJOB_QUEUE pJobQueue; // Pointer to the job queue of the preview file (copy from server)
|
|
// NULL if it is an archived file
|
|
} HANDLE_ENTRY, *PHANDLE_ENTRY;
|
|
|
|
typedef struct _DEVICE_SORT {
|
|
DWORD Priority;
|
|
PLINE_INFO LineInfo;
|
|
} DEVICE_SORT, *PDEVICE_SORT;
|
|
|
|
typedef struct _METHOD_SORT {
|
|
DWORD Priority;
|
|
PROUTING_METHOD RoutingMethod;
|
|
} METHOD_SORT, *PMETHOD_SORT;
|
|
|
|
typedef struct _QUEUE_SORT {
|
|
FAX_ENUM_PRIORITY_TYPE Priority;
|
|
DWORDLONG ScheduleTime;
|
|
PJOB_QUEUE QueueEntry;
|
|
} QUEUE_SORT, *PQUEUE_SORT;
|
|
|
|
|
|
typedef struct _FSPI_JOB_STATUS_MSG_tag
|
|
{
|
|
PJOB_ENTRY lpJobEntry;
|
|
LPFSPI_JOB_STATUS lpFSPIJobStatus;
|
|
} FSPI_JOB_STATUS_MSG;
|
|
typedef FSPI_JOB_STATUS_MSG * LPFSPI_JOB_STATUS_MSG;
|
|
typedef const FSPI_JOB_STATUS_MSG * LPCFSPI_JOB_STATUS_MSG;
|
|
|
|
|
|
|
|
typedef struct _STRING_TABLE {
|
|
DWORD ResourceId;
|
|
DWORD InternalId;
|
|
LPTSTR String;
|
|
} STRING_TABLE, *PSTRING_TABLE;
|
|
|
|
|
|
|
|
//
|
|
// externs
|
|
//
|
|
extern HLINEAPP g_hLineApp; //
|
|
extern CFaxCriticalSection g_CsJob; // protects the job list
|
|
extern CFaxCriticalSection g_CsConfig; // Protects configuration read / write
|
|
extern CFaxCriticalSection g_CsRouting; //
|
|
extern PFAX_PERF_COUNTERS g_pFaxPerfCounters; //
|
|
extern LIST_ENTRY g_JobListHead; //
|
|
extern CFaxCriticalSection g_CsLine; // critical section for accessing tapi lines
|
|
extern CFaxCriticalSection g_CsPerfCounters; // critical section for performance monitor counters
|
|
extern DWORD g_dwTotalSeconds; // use to compute g_pFaxPerfCounters->TotalMinutes
|
|
extern DWORD g_dwInboundSeconds; //
|
|
extern DWORD g_dwOutboundSeconds; //
|
|
extern LIST_ENTRY g_TapiLinesListHead; // linked list of tapi lines
|
|
extern CFaxCriticalSection g_CsClients; //
|
|
extern HANDLE g_TapiCompletionPort; //
|
|
extern HANDLE g_hTapiWorkerThread; // Tapi worker thread handle
|
|
extern HANDLE g_hJobQueueThread; // JobQueueThread handle
|
|
extern HANDLE g_StatusCompletionPortHandle;
|
|
extern DWORD g_dwCountRoutingMethods; // total number of routing methods for ALL extensions
|
|
extern LIST_ENTRY g_QueueListHead; //
|
|
extern CFaxCriticalSection g_CsQueue; //
|
|
extern HANDLE g_hQueueTimer; //
|
|
extern DWORD g_dwNextJobId; //
|
|
extern const GUID gc_FaxSvcGuid; //
|
|
extern DWORD g_dwFaxSendRetries; //
|
|
extern DWORD g_dwFaxSendRetryDelay; //
|
|
extern DWORD g_dwFaxDirtyDays; //
|
|
extern BOOL g_fFaxUseDeviceTsid; //
|
|
extern BOOL g_fFaxUseBranding; //
|
|
extern BOOL g_fServerCp; //
|
|
extern FAX_TIME g_StartCheapTime; //
|
|
extern FAX_TIME g_StopCheapTime; //
|
|
extern WCHAR g_wszFaxQueueDir[MAX_PATH]; //
|
|
extern HANDLE g_hJobQueueEvent; //
|
|
extern DWORD g_dwLastUniqueLineId; // The last device id handed out by the Fax Service.
|
|
extern DWORD g_dwQueueState; // The state of the queue (paused, blocked, etc.)
|
|
extern FAX_SERVER_RECEIPTS_CONFIGW g_ReceiptsConfig; // Global receipts configuration
|
|
extern FAX_ARCHIVE_CONFIG g_ArchivesConfig[2]; // Global archives configuration
|
|
extern FAX_SERVER_ACTIVITY_LOGGING_CONFIG g_ActivityLoggingConfig; // Global activity logging configuration
|
|
extern BOOL g_bServiceIsDown; // This is set to TRUE by FaxEndSvc()
|
|
extern HANDLE g_hServiceIsDownSemaphore; // Syncronize TapiWorkerThread() , JobQueueThread() and EndFaxSvc() access to g_bServiceIsDown flag.
|
|
extern FAX_SERVER_ACTIVITY g_ServerActivity; // Global Fax Service Activity
|
|
extern CFaxCriticalSection g_CsActivity; // Controls access to g_ServerActivity;
|
|
extern CFaxCriticalSection g_CsInboundActivityLogging; // Controls access to Inbound Activity logging configuration;
|
|
extern CFaxCriticalSection g_CsOutboundActivityLogging; // Controls access to Outbound Activity logging configuration;
|
|
//
|
|
// Important!! - Always lock g_CsInboundActivityLogging and then g_CsOutboundActivityLogging
|
|
//
|
|
extern DWORD g_dwReceiveDevicesCount; // Count of devices that are receive-enabled. Protected by g_CsLine.
|
|
extern BOOL g_ScanQueueAfterTimeout; // The JobQueueThread checks this if waked up after JOB_QUEUE_TIMEOUT. Use g_CsQueue.
|
|
// If it is TRUE - g_hQueueTimer or g_hJobQueueEvent were not set - Scan the queue.
|
|
extern DWORD g_dwMaxLineCloseTime; // Wait interval in sec before trying to resend on a powered off device
|
|
extern CFaxCriticalSection g_CsServiceThreads; // Controls service global threads count
|
|
extern LONG g_lServiceThreadsCount; // Service threads count
|
|
extern HANDLE g_hThreadCountEvent; // This Event is set when the service threads count is 0.
|
|
extern HANDLE g_hSCMServiceShutDownEvent; // This event is set when SCM tells the service to STOP!
|
|
extern HANDLE g_hServiceShutDownEvent; // This event is set after the service got g_hSCMServiceShutDownEvent from SCM and signals the various threads to terminate!
|
|
extern DWORD g_dwConnectionCount; // Number of active RPC connections
|
|
extern DWORD g_dwQueueCount; // Count of jobs (both parent and non-parent) in the queue. Protected by g_CsQueue
|
|
extern BOOL g_bServiceCanSuicide; // See description in queue.c
|
|
extern BOOL g_bDelaySuicideAttempt; // See description in queue.c
|
|
extern LPLINECOUNTRYLIST g_pLineCountryList; // The list of countries returned by TAPI
|
|
extern DWORD g_dwManualAnswerDeviceId; // Id of (one and only) device capable of manual answering (protected by g_CsLine)
|
|
extern DWORDLONG g_dwLastUniqueId; // Used for generating unique job IDs
|
|
extern CFaxCriticalSection g_CsHandleTable; // Protects the handles list
|
|
extern DWORD g_dwDeviceCount; // Total number of devices
|
|
extern DWORD g_dwDeviceEnabledCount; // Current Send/Receive enabled devices count (protected by g_CsLine)
|
|
extern DWORD g_dwDeviceEnabledLimit; // Send/Receive enabled devices limit by SKU
|
|
extern LPBYTE g_pAdaptiveFileBuffer; // list of approved adaptive answer modems
|
|
extern LIST_ENTRY g_DeviceProvidersListHead;
|
|
extern BOOL g_fLogStringTableInit;
|
|
extern LOG_STRING_TABLE g_InboxTable[]; // Inbox activity logging string table
|
|
extern LOG_STRING_TABLE g_OutboxTable[]; // Outbox activity logging string table
|
|
extern CFaxCriticalSection g_CsSecurity;
|
|
extern PSECURITY_DESCRIPTOR g_pFaxSD; // Fax security descriptor
|
|
extern STRING_TABLE g_ServiceStringTable[]; // Service string table
|
|
extern CFaxCriticalSection g_csUniqueQueueFile;
|
|
extern const DWORD gc_dwCountInboxTable;
|
|
extern const DWORD gc_dwCountOutboxTable;
|
|
extern const DWORD gc_dwCountServiceStringTable;
|
|
extern HANDLE g_hFaxPerfCountersMap; // Handle to the performance counters file mapping;
|
|
extern LIST_ENTRY g_HandleTableListHead;
|
|
extern LIST_ENTRY g_lstRoutingMethods;
|
|
extern LIST_ENTRY g_lstRoutingExtensions;
|
|
extern LIST_ENTRY g_RemovedTapiLinesListHead;
|
|
extern HANDLE g_hRPCListeningThread; // Thread that waits for all RPC threads to terminate
|
|
extern HINSTANCE g_hResource; // Handle to fxsres.dll that hold the resources.
|
|
extern DWORD g_dwRecipientsLimit; // Limits the number of recipients in a single broadcast job. '0' means no limit.
|
|
extern DWORD g_dwAllowRemote; // If this is non-zero, the service will allow remote calls even if the local printer is not shared.
|
|
|
|
|
|
|
|
|
|
#if DBG
|
|
extern HANDLE g_hCritSecLogFile;
|
|
extern LIST_ENTRY g_CritSecListHead;
|
|
extern CFaxCriticalSection g_CsCritSecList;
|
|
#endif
|
|
|
|
#define EnterCriticalSectionJobAndQueue \
|
|
EnterCriticalSection(&g_CsJob); \
|
|
EnterCriticalSection(&g_CsQueue);
|
|
|
|
#define LeaveCriticalSectionJobAndQueue \
|
|
LeaveCriticalSection(&g_CsQueue); \
|
|
LeaveCriticalSection(&g_CsJob);
|
|
|
|
|
|
|
|
//
|
|
// prototypes
|
|
//
|
|
RPC_STATUS
|
|
IsLocalRPCConnectionNP(
|
|
PBOOL pbIsLocal
|
|
);
|
|
|
|
VOID
|
|
FreeMessageBuffer (
|
|
PFAX_MESSAGE pFaxMsg,
|
|
BOOL fDestroy
|
|
);
|
|
|
|
typedef enum
|
|
{
|
|
EXCEPTION_SOURCE_UNKNOWN,
|
|
EXCEPTION_SOURCE_FSP,
|
|
EXCEPTION_SOURCE_ROUTING_EXT
|
|
} EXCEPTION_SOURCE_TYPE;
|
|
|
|
LONG
|
|
HandleFaxExtensionFault (
|
|
EXCEPTION_SOURCE_TYPE ExSrc,
|
|
LPCWSTR lpcswstrExtFriendlyName,
|
|
DWORD dwCode
|
|
);
|
|
|
|
BOOL
|
|
CommitQueueEntry(
|
|
PJOB_QUEUE JobQueue,
|
|
BOOL bDeleteFileOnError=TRUE
|
|
);
|
|
|
|
VOID
|
|
FaxServiceMain(
|
|
DWORD argc,
|
|
LPTSTR *argv
|
|
);
|
|
|
|
BOOL
|
|
SetServiceIsDownFlag(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
SetServiceIsDownFlagThread(
|
|
LPVOID pvUnused
|
|
);
|
|
|
|
VOID
|
|
FaxServiceCtrlHandler(
|
|
DWORD Opcode
|
|
);
|
|
|
|
int
|
|
DebugService(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
ServiceStart(
|
|
VOID
|
|
);
|
|
|
|
void EndFaxSvc(
|
|
DWORD Severity
|
|
);
|
|
|
|
BOOL
|
|
StopFaxServiceProviders();
|
|
|
|
BOOL
|
|
WaitAndReportForThreadToTerminate(
|
|
HANDLE hThread,
|
|
LPCTSTR strWaitMessage
|
|
);
|
|
|
|
BOOL
|
|
StopAllInProgressJobs(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
ReportServiceStatus(
|
|
DWORD CurrentState,
|
|
DWORD Win32ExitCode,
|
|
DWORD WaitHint
|
|
);
|
|
|
|
|
|
//
|
|
// Fax Server RPC Client
|
|
//
|
|
|
|
DWORD
|
|
RpcBindToFaxClient(
|
|
IN LPCWSTR servername,
|
|
IN LPCWSTR servicename,
|
|
OUT RPC_BINDING_HANDLE *pBindingHandle
|
|
);
|
|
|
|
|
|
//
|
|
// Fax Server RPC Server
|
|
//
|
|
|
|
RPC_STATUS
|
|
StartFaxRpcServer(
|
|
IN LPWSTR InterfaceName,
|
|
IN RPC_IF_HANDLE InterfaceSpecification
|
|
);
|
|
|
|
DWORD
|
|
StopFaxRpcServer(
|
|
VOID
|
|
);
|
|
|
|
|
|
|
|
//
|
|
// util.c
|
|
//
|
|
|
|
LPTSTR
|
|
MapFSPIJobExtendedStatusToString (
|
|
DWORD dwFSPIExtendedStatus);
|
|
|
|
|
|
DWORD
|
|
LegacyJobStatusToStatus(
|
|
DWORD dwLegacyStatus,
|
|
PDWORD pdwStatus,
|
|
PDWORD pdwExtendedStatus,
|
|
PBOOL pbPrivateStatusCode);
|
|
|
|
|
|
DWORD MyGetFileSize(
|
|
LPCTSTR FileName
|
|
);
|
|
|
|
|
|
BOOL
|
|
DecreaseServiceThreadsCount(
|
|
VOID
|
|
);
|
|
|
|
HANDLE CreateThreadAndRefCount(
|
|
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
|
|
DWORD dwStackSize, // initial stack size
|
|
LPTHREAD_START_ROUTINE lpStartAddress, // thread function
|
|
LPVOID lpParameter, // thread argument
|
|
DWORD dwCreationFlags, // creation option
|
|
LPDWORD lpThreadId // thread identifier
|
|
);
|
|
|
|
DWORD
|
|
IsValidFaxFolder(
|
|
LPCWSTR lpwstrFolder
|
|
);
|
|
|
|
|
|
//
|
|
// tapi.c
|
|
//
|
|
|
|
BOOL
|
|
IsDeviceEnabled(
|
|
PLINE_INFO pLineInfo
|
|
);
|
|
|
|
void
|
|
FreeTapiLines(
|
|
void
|
|
);
|
|
|
|
BOOL
|
|
CreateTapiThread(void);
|
|
|
|
|
|
DWORD
|
|
TapiInitialize(
|
|
PREG_FAX_SERVICE FaxReg
|
|
);
|
|
|
|
DWORD
|
|
UpdateDevicesFlags(
|
|
void
|
|
);
|
|
|
|
VOID
|
|
UpdateManualAnswerDevice(
|
|
void
|
|
);
|
|
|
|
VOID
|
|
FreeTapiLine(
|
|
PLINE_INFO LineInfo
|
|
);
|
|
|
|
PLINE_INFO
|
|
GetTapiLineFromDeviceId(
|
|
DWORD DeviceId,
|
|
BOOL fLegacyId
|
|
);
|
|
|
|
PLINE_INFO
|
|
GetLineForSendOperation(
|
|
PJOB_QUEUE lpJobQueue
|
|
);
|
|
|
|
PLINE_INFO
|
|
GetTapiLineForFaxOperation(
|
|
DWORD DeviceId,
|
|
DWORD JobType,
|
|
LPWSTR FaxNumber
|
|
);
|
|
|
|
LONG
|
|
MyLineTranslateAddress(
|
|
LPCTSTR Address,
|
|
DWORD DeviceId,
|
|
LPLINETRANSLATEOUTPUT *TranslateOutput
|
|
);
|
|
|
|
|
|
BOOL
|
|
ReleaseTapiLine(
|
|
PLINE_INFO LineInfo,
|
|
HCALL hCall
|
|
);
|
|
|
|
DWORD
|
|
QueueTapiCallback(
|
|
PLINE_INFO LineInfo,
|
|
DWORD hDevice,
|
|
DWORD dwMessage,
|
|
DWORD dwInstance,
|
|
DWORD dwParam1,
|
|
DWORD dwParam2,
|
|
DWORD dwParam3
|
|
);
|
|
|
|
VOID
|
|
SpoolerSetAllTapiLinesActive(
|
|
VOID
|
|
);
|
|
|
|
|
|
DWORD
|
|
GetDeviceListByCountryAndAreaCode(
|
|
DWORD dwCountryCode,
|
|
DWORD dwAreaCode,
|
|
LPDWORD* lppdwDevices,
|
|
LPDWORD lpdwNumDevices
|
|
);
|
|
|
|
BOOL
|
|
IsAreaCodeMandatory(
|
|
LPLINECOUNTRYLIST lpCountryList,
|
|
DWORD dwCountryCode
|
|
);
|
|
|
|
|
|
|
|
//
|
|
// tapidbg.c
|
|
//
|
|
#if DBG
|
|
VOID
|
|
ShowLineEvent(
|
|
HLINE htLine,
|
|
HCALL htCall,
|
|
LPTSTR MsgStr,
|
|
DWORD_PTR dwCallbackInstance,
|
|
DWORD dwMsg,
|
|
DWORD_PTR dwParam1,
|
|
DWORD_PTR dwParam2,
|
|
DWORD_PTR dwParam3
|
|
);
|
|
#endif // #if DBG
|
|
|
|
//
|
|
// faxdev.c
|
|
//
|
|
void
|
|
UnloadDeviceProviders(
|
|
void
|
|
);
|
|
|
|
BOOL
|
|
LoadDeviceProviders(
|
|
PREG_FAX_SERVICE FaxReg
|
|
);
|
|
|
|
BOOL
|
|
InitializeDeviceProviders(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
InitializeDeviceProvidersConfiguration(
|
|
VOID
|
|
);
|
|
|
|
PDEVICE_PROVIDER
|
|
FindDeviceProvider(
|
|
LPTSTR lptstrProviderName,
|
|
BOOL bSuccessfullyLoaded = TRUE
|
|
);
|
|
|
|
DWORD GetSuccessfullyLoadedProvidersCount();
|
|
|
|
DWORD ShutdownDeviceProviders(LPVOID lpvUnused);
|
|
|
|
BOOL FreeFSPIJobStatus(LPFSPI_JOB_STATUS lpJobStatus, BOOL bDestroy);
|
|
BOOL CopyFSPIJobStatus(LPFSPI_JOB_STATUS lpDst, LPCFSPI_JOB_STATUS lpcSrc, DWORD dwDstSize);
|
|
LPFSPI_JOB_STATUS DuplicateFSPIJobStatus(LPCFSPI_JOB_STATUS lpcSrc);
|
|
DWORD DeviceStatusToFSPIExtendedStatus(DWORD dwDeviceStatus);
|
|
DWORD FSPIExtendedStatusToDeviceStatus(DWORD dwFSPIExtendedStatus);
|
|
BOOL FreeFSPIJobStatusMsg(LPFSPI_JOB_STATUS_MSG lpMsg, BOOL bDestroy);
|
|
|
|
DWORD
|
|
MapFSPIJobExtendedStatusToJS_EX (DWORD dwFSPIExtendedStatus);
|
|
|
|
//
|
|
// job.c
|
|
//
|
|
|
|
BOOL
|
|
UpdateJobStatus(
|
|
PJOB_ENTRY lpJobEntry,
|
|
LPCFSPI_JOB_STATUS lpcFSPJobStatus
|
|
);
|
|
|
|
BOOL
|
|
CreateCoverpageTiffFileEx(
|
|
IN short Resolution,
|
|
IN DWORD dwPageCount,
|
|
IN LPCFAX_COVERPAGE_INFO_EXW lpcCoverpageEx,
|
|
IN LPCFAX_PERSONAL_PROFILEW lpcRecipient,
|
|
IN LPCFAX_PERSONAL_PROFILEW lpcSender,
|
|
IN LPCWSTR lpcwstrExtension,
|
|
OUT LPWSTR lptstrCovTiffFile,
|
|
IN DWORD dwCovTiffFile);
|
|
|
|
BOOL
|
|
GetBodyTiffResolution(
|
|
IN LPCWSTR lpcwstrBodyFile,
|
|
OUT short* pResolution
|
|
);
|
|
|
|
BOOL
|
|
CreateStatusThreads(void);
|
|
|
|
BOOL
|
|
CreateJobQueueThread(void);
|
|
|
|
|
|
BOOL
|
|
FreePermanentMessageId(
|
|
LPFSPI_MESSAGE_ID lpMessageId,
|
|
BOOL bDestroy
|
|
);
|
|
|
|
|
|
PJOB_ENTRY
|
|
FindJobEntryByRecipientNumber(LPCWSTR lpcwstrNumber);
|
|
|
|
|
|
PJOB_ENTRY
|
|
StartReceiveJob(
|
|
DWORD DeviceId
|
|
);
|
|
|
|
|
|
|
|
BOOL
|
|
StartSendJob(
|
|
PJOB_QUEUE lpJobQueueEntry,
|
|
PLINE_INFO lpLineInfo
|
|
);
|
|
|
|
BOOL
|
|
StartRoutingJob(
|
|
PJOB_QUEUE lpJobQueueEntry
|
|
);
|
|
|
|
|
|
BOOL HanldeFSPIJobStatusChange(PJOB_ENTRY lpJobEntry);
|
|
BOOL HandleFailedSendJob(PJOB_ENTRY lpJobEntry);
|
|
BOOL HandleCompletedSendJob(PJOB_ENTRY lpJobEntry);
|
|
|
|
BOOL
|
|
ArchiveOutboundJob(
|
|
const JOB_QUEUE * lpcJobQueue
|
|
);
|
|
|
|
BOOL
|
|
InitializeJobManager(
|
|
PREG_FAX_SERVICE FaxReg
|
|
);
|
|
|
|
BOOL
|
|
EndJob(
|
|
IN PJOB_ENTRY JobEntry
|
|
);
|
|
|
|
BOOL
|
|
ReleaseJob(
|
|
IN PJOB_ENTRY JobEntry
|
|
);
|
|
|
|
DWORD
|
|
SendDocument(
|
|
PJOB_ENTRY JobEntry,
|
|
LPTSTR FileName);
|
|
|
|
VOID
|
|
SetGlobalsFromRegistry(
|
|
PREG_FAX_SERVICE FaxReg
|
|
);
|
|
|
|
void
|
|
FaxLogSend(
|
|
const JOB_QUEUE * lpcJobQueue, BOOL bRetrying
|
|
);
|
|
|
|
|
|
BOOL
|
|
FillMsTagInfo(
|
|
LPTSTR FaxFileName,
|
|
PJOB_QUEUE lpJobQueue
|
|
);
|
|
|
|
BOOL
|
|
GetJobStatusDataEx(
|
|
LPBYTE JobBuffer,
|
|
PFAX_JOB_STATUSW pFaxStatus,
|
|
DWORD dwClientAPIVersion,
|
|
const PJOB_QUEUE lpcJobQueue,
|
|
PULONG_PTR Offset,
|
|
DWORD dwBufferSize
|
|
);
|
|
|
|
BOOL
|
|
CreateTiffFile (
|
|
PJOB_QUEUE lpRecpJob,
|
|
LPCWSTR lpcwstrFileExt,
|
|
LPWSTR lpwstrFullPath,
|
|
DWORD dwFullPathCount
|
|
);
|
|
|
|
BOOL
|
|
CreateTiffFileForJob (
|
|
PJOB_QUEUE lpRecpJob
|
|
);
|
|
|
|
BOOL
|
|
CreateTiffFileForPreview (
|
|
PJOB_QUEUE lpRecpJob
|
|
);
|
|
|
|
//
|
|
// receive.c
|
|
//
|
|
|
|
DWORD
|
|
StartFaxReceive(
|
|
PJOB_ENTRY JobEntry,
|
|
HCALL hCall,
|
|
PLINE_INFO LineInfo,
|
|
LPTSTR FileName,
|
|
DWORD FileNameSize
|
|
);
|
|
|
|
//
|
|
// route.c
|
|
//
|
|
|
|
void
|
|
FreeRoutingExtensions(
|
|
void
|
|
);
|
|
|
|
BOOL
|
|
InitializeRouting(
|
|
PREG_FAX_SERVICE FaxReg
|
|
);
|
|
|
|
|
|
BOOL
|
|
FaxRoute(
|
|
PJOB_QUEUE JobQueue,
|
|
LPTSTR TiffFileName,
|
|
PFAX_ROUTE FaxRoute,
|
|
PROUTE_FAILURE_INFO *RouteFailureInfo,
|
|
LPDWORD RouteFailureCount
|
|
);
|
|
|
|
|
|
BOOL
|
|
LoadRouteInfo(
|
|
IN LPWSTR RouteFileName,
|
|
OUT PROUTE_INFO *RouteInfo,
|
|
OUT PROUTE_FAILURE_INFO *RouteFailure,
|
|
OUT LPDWORD RouteFailureCount
|
|
);
|
|
|
|
PFAX_ROUTE
|
|
SerializeFaxRoute(
|
|
IN PFAX_ROUTE FaxRoute,
|
|
IN LPDWORD Size,
|
|
IN BOOL bSizeOnly
|
|
);
|
|
|
|
PFAX_ROUTE
|
|
DeSerializeFaxRoute(
|
|
IN PFAX_ROUTE FaxRoute
|
|
);
|
|
|
|
BOOL
|
|
FaxRouteRetry(
|
|
PFAX_ROUTE FaxRoute,
|
|
PROUTE_FAILURE_INFO RouteFailureInfo
|
|
);
|
|
|
|
//
|
|
// modem.c
|
|
//
|
|
|
|
DWORD
|
|
GetModemClass(
|
|
HANDLE hFile
|
|
);
|
|
|
|
//
|
|
// print.c
|
|
//
|
|
|
|
|
|
|
|
LPTSTR
|
|
GetString(
|
|
DWORD InternalId
|
|
);
|
|
|
|
|
|
BOOL CALLBACK
|
|
FaxDeviceProviderCallback(
|
|
IN HANDLE FaxHandle,
|
|
IN DWORD DeviceId,
|
|
IN DWORD_PTR Param1,
|
|
IN DWORD_PTR Param2,
|
|
IN DWORD_PTR Param3
|
|
);
|
|
|
|
BOOL
|
|
InitializePrinting(
|
|
VOID
|
|
);
|
|
|
|
PJOB_ENTRY
|
|
FindJob(
|
|
IN HANDLE FaxHandle
|
|
);
|
|
|
|
PJOB_ENTRY
|
|
FindJobByPrintJob(
|
|
IN DWORD PrintJobId
|
|
);
|
|
|
|
BOOL
|
|
HandoffCallToRas(
|
|
PLINE_INFO LineInfo,
|
|
HCALL hCall
|
|
);
|
|
|
|
|
|
BOOL
|
|
InitializeStringTable(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
InitializeFaxQueue(
|
|
PREG_FAX_SERVICE pFaxReg
|
|
);
|
|
|
|
BOOL
|
|
OpenTapiLine(
|
|
PLINE_INFO LineInfo
|
|
);
|
|
|
|
PVOID
|
|
MyGetJob(
|
|
HANDLE hPrinter,
|
|
DWORD level,
|
|
DWORD jobId
|
|
);
|
|
|
|
LONG
|
|
MyLineGetTransCaps(
|
|
LPLINETRANSLATECAPS *LineTransCaps
|
|
);
|
|
|
|
BOOL
|
|
GenerateUniqueArchiveFileName(
|
|
IN LPTSTR Directory,
|
|
OUT LPTSTR FileName,
|
|
IN UINT cchFileName,
|
|
IN DWORDLONG JobId,
|
|
IN LPTSTR lptstrUserSid
|
|
);
|
|
|
|
VOID
|
|
SetLineState(
|
|
PLINE_INFO LineInfo,
|
|
DWORD State
|
|
);
|
|
|
|
BOOL
|
|
CreateFaxEvent(
|
|
DWORD DeviceId,
|
|
DWORD EventId,
|
|
DWORD JobId
|
|
);
|
|
|
|
BOOL
|
|
GetFaxEvent(
|
|
PLINE_INFO LineInfo,
|
|
PFAX_EVENT Event
|
|
);
|
|
|
|
DWORD
|
|
MapFSPIJobStatusToEventId(
|
|
LPCFSPI_JOB_STATUS lpcFSPIJobStatus
|
|
);
|
|
|
|
void
|
|
FreeServiceContextHandles(
|
|
void
|
|
);
|
|
|
|
|
|
PHANDLE_ENTRY
|
|
CreateNewPortHandle(
|
|
handle_t hBinding,
|
|
PLINE_INFO LineInfo,
|
|
DWORD Flags
|
|
);
|
|
|
|
PHANDLE_ENTRY
|
|
CreateNewMsgEnumHandle(
|
|
handle_t hBinding,
|
|
HANDLE hFileFind,
|
|
LPCWSTR lpcwstrFirstFileName,
|
|
FAX_ENUM_MESSAGE_FOLDER Folder
|
|
);
|
|
|
|
PHANDLE_ENTRY
|
|
CreateNewCopyHandle(
|
|
handle_t hBinding,
|
|
HANDLE hFile,
|
|
BOOL bCopyToServer,
|
|
LPCWSTR lpcwstrFileName,
|
|
PJOB_QUEUE pJobQueue
|
|
);
|
|
|
|
PHANDLE_ENTRY
|
|
CreateNewConnectionHandle(
|
|
handle_t hBinding,
|
|
DWORD dwClientAPIVersion
|
|
);
|
|
|
|
BOOL
|
|
IsPortOpenedForModify(
|
|
PLINE_INFO LineInfo
|
|
);
|
|
|
|
VOID
|
|
CloseFaxHandle(
|
|
PHANDLE_ENTRY HandleEntry
|
|
);
|
|
|
|
LPLINEDEVSTATUS
|
|
MyLineGetLineDevStatus(
|
|
HLINE hLine
|
|
);
|
|
|
|
DWORD
|
|
InitializeServerSecurity(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
FaxSvcAccessCheck(
|
|
IN ACCESS_MASK DesiredAccess,
|
|
OUT BOOL* lpbAccessStatus,
|
|
OUT LPDWORD lpdwGrantedAccess
|
|
);
|
|
|
|
PROUTING_METHOD
|
|
FindRoutingMethodByGuid(
|
|
IN LPCWSTR RoutingGuidString
|
|
);
|
|
|
|
DWORD
|
|
EnumerateRoutingMethods(
|
|
IN PFAXROUTEMETHODENUM Enumerator,
|
|
IN LPVOID Context
|
|
);
|
|
//
|
|
// QUEUE.C
|
|
//
|
|
|
|
void
|
|
FreeServiceQueue(
|
|
void
|
|
);
|
|
|
|
DWORD
|
|
RemoveJobStatusModifiers(DWORD dwJobStatus);
|
|
|
|
VOID
|
|
RescheduleJobQueueEntry(
|
|
IN PJOB_QUEUE JobQueue
|
|
);
|
|
|
|
BOOL
|
|
StartJobQueueTimer(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SetDiscountTime(
|
|
IN OUT LPSYSTEMTIME SystemTime
|
|
);
|
|
|
|
LPWSTR
|
|
GetClientUserName(
|
|
VOID
|
|
);
|
|
|
|
PSID
|
|
GetClientUserSID(
|
|
VOID
|
|
);
|
|
|
|
BOOL UserOwnsJob(
|
|
IN const PJOB_QUEUE lpcJobQueue,
|
|
IN const PSID lpcUserSId
|
|
);
|
|
|
|
BOOL
|
|
RestoreFaxQueue(
|
|
VOID
|
|
);
|
|
|
|
PJOB_QUEUE
|
|
FindJobQueueEntryByJobQueueEntry(
|
|
IN PJOB_QUEUE JobQueueEntry
|
|
);
|
|
|
|
PJOB_QUEUE
|
|
FindJobQueueEntry(
|
|
IN DWORD JobId
|
|
);
|
|
|
|
PJOB_QUEUE
|
|
FindJobQueueEntryByUniqueId(
|
|
IN DWORDLONG UniqueId
|
|
);
|
|
|
|
DWORD
|
|
JobQueueThread(
|
|
LPVOID UnUsed
|
|
);
|
|
|
|
BOOL
|
|
ResumeJobQueueEntry(
|
|
IN PJOB_QUEUE JobQueue
|
|
);
|
|
|
|
BOOL
|
|
PauseJobQueueEntry(
|
|
IN PJOB_QUEUE JobQueue
|
|
);
|
|
|
|
BOOL
|
|
PauseServerQueue(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
ResumeServerQueue(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
SetFaxServiceAutoStart(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
GetFaxDeviceCount(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
CreateVirtualDevices(
|
|
PREG_FAX_SERVICE FaxReg,
|
|
DWORD dwAPIVersion
|
|
);
|
|
|
|
BOOL
|
|
CommitDeviceChanges(
|
|
PLINE_INFO pLineInfo
|
|
);
|
|
|
|
BOOL
|
|
SortMethodPriorities(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
CommitMethodChanges(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
UpdateVirtualDevices(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
UpdateVirtualDeviceSendAndReceiveStatus(
|
|
PLINE_INFO pLineInfo,
|
|
BOOL bSend,
|
|
BOOL bReceive
|
|
);
|
|
|
|
BOOL
|
|
IsVirtualDevice(
|
|
const LINE_INFO *pLineInfo
|
|
);
|
|
|
|
DWORD
|
|
ValidateTiffFile(
|
|
LPCWSTR TiffFile
|
|
);
|
|
|
|
|
|
BOOL PersonalProfileSerialize(
|
|
LPCFAX_PERSONAL_PROFILEW lpProfileSrc,
|
|
PFAX_PERSONAL_PROFILE lpProfileDst,
|
|
LPBYTE lpbBuffer,
|
|
PULONG_PTR pupOffset,
|
|
DWORD dwBufferSize
|
|
);
|
|
|
|
void
|
|
DecreaseJobRefCount (
|
|
PJOB_QUEUE pJobQueue,
|
|
BOOL bNotify,
|
|
BOOL bRemoveRecipientJobs = TRUE,
|
|
BOOL bPreview = FALSE
|
|
);
|
|
|
|
void
|
|
IncreaseJobRefCount (
|
|
PJOB_QUEUE pJobQueue,
|
|
BOOL bPreview = FALSE
|
|
);
|
|
|
|
|
|
PJOB_QUEUE_PTR FindRecipientRefByJobId(PJOB_QUEUE lpParentJob,DWORD dwJobId);
|
|
BOOL RemoveParentRecipientRef(PJOB_QUEUE lpParentJob,const PJOB_QUEUE lpcRecpJob);
|
|
BOOL RemoveParentRecipients(PJOB_QUEUE lpParentJob, BOOL bNotify);
|
|
|
|
BOOL RemoveRecipientJob(PJOB_QUEUE lpJobToRemove,BOOL bNotify, BOOL bRecalcQueueTimer);
|
|
BOOL RemoveParentJob(PJOB_QUEUE lpJobQueue, BOOL bRemoveRecipients, BOOL bNotify);
|
|
BOOL RemoveReceiveJob(PJOB_QUEUE lpJobToRemove,BOOL bNotify);
|
|
|
|
|
|
BOOL CopyJobParamEx(PFAX_JOB_PARAM_EXW lpDst,LPCFAX_JOB_PARAM_EXW lpcSrc);
|
|
void FreeJobParamEx(PFAX_JOB_PARAM_EXW lpJobParamEx,BOOL bDestroy);
|
|
#if DBG
|
|
void DumpJobParamsEx( LPCFAX_JOB_PARAM_EX lpParams);
|
|
#endif
|
|
|
|
|
|
BOOL CopyCoverPageInfoEx(PFAX_COVERPAGE_INFO_EXW lpDst,LPCFAX_COVERPAGE_INFO_EXW lpcSrc);
|
|
void FreeCoverPageInfoEx(PFAX_COVERPAGE_INFO_EXW lpCoverpage, BOOL bDestroy) ;
|
|
#if DBG
|
|
void DumpCoverPageEx(LPCFAX_COVERPAGE_INFO_EX lpcCover);
|
|
#endif
|
|
|
|
|
|
void FreeParentQueueEntry(PJOB_QUEUE lpJobQueueEntry, BOOL bDestroy);
|
|
#if DBG
|
|
void DumpParentJob(const PJOB_QUEUE lpParentJob);
|
|
#endif
|
|
|
|
void FreeRecipientQueueEntry(PJOB_QUEUE lpJobQueue, BOOL bDestroy);
|
|
#if DBG
|
|
void DumpRecipientJob(const PJOB_QUEUE lpRecipJob) ;
|
|
#endif
|
|
|
|
void FreeReceiveQueueEntry(PJOB_QUEUE lpJobQueue, BOOL bDestroy);
|
|
#if DBG
|
|
void DumpReceiveJob(const PJOB_QUEUE lpcJob);
|
|
#endif
|
|
|
|
|
|
BOOL IsSendJobReadyForDeleting(PJOB_QUEUE lpParentJob);
|
|
|
|
BOOL SystemTimeToStr( IN const SYSTEMTIME * lptmTime, OUT LPTSTR lptstrDateTime, IN UINT cchstrDateTime);
|
|
|
|
BOOL UpdatePersistentJobStatus(const PJOB_QUEUE lpJobQueue);
|
|
|
|
|
|
DWORDLONG GenerateUniqueQueueFile(
|
|
IN DWORD dwJobType,
|
|
OUT LPTSTR lptstrFileName,
|
|
IN DWORD dwFileNameSize
|
|
);
|
|
|
|
|
|
PJOB_QUEUE
|
|
AddParentJob(IN const PLIST_ENTRY lpcQueueHead,
|
|
IN LPCWSTR lpcwstrBodyFile,
|
|
IN LPCFAX_PERSONAL_PROFILE lpcSenderProfile,
|
|
IN LPCFAX_JOB_PARAM_EXW lpcJobParams,
|
|
IN LPCFAX_COVERPAGE_INFO_EX lpcCoverPageInfo,
|
|
IN LPCWSTR lpcwstrUserName,
|
|
IN PSID UserSid,
|
|
IN LPCFAX_PERSONAL_PROFILEW lpcRecipientProfile,
|
|
IN BOOL bCreateQueueFile
|
|
);
|
|
|
|
PJOB_QUEUE
|
|
AddRecipientJob(
|
|
IN const PLIST_ENTRY lpcQueueHead,
|
|
IN PJOB_QUEUE lpParentJob,
|
|
IN LPCFAX_PERSONAL_PROFILE lpcRecipientProfile,
|
|
IN BOOL bCreateQueueFile,
|
|
DWORD dwJobStatus = JS_PENDING
|
|
);
|
|
PJOB_QUEUE
|
|
AddReceiveJobQueueEntry(
|
|
IN LPCTSTR FileName,
|
|
IN PJOB_ENTRY JobEntry,
|
|
IN DWORD JobType, // can be JT_RECEIVE or JT_RECEIVE_FAIL
|
|
IN DWORDLONG dwlUniqueJobID
|
|
);
|
|
|
|
BOOL MarkJobAsExpired(PJOB_QUEUE lpJobQueue);
|
|
|
|
DWORD
|
|
GetDevStatus(
|
|
HANDLE hFaxJob,
|
|
PLINE_INFO LineInfo,
|
|
LPFSPI_JOB_STATUS *ppFaxStatus
|
|
);
|
|
|
|
HRESULT
|
|
ReportLineStatusToCrm(
|
|
DWORD dwLineState,
|
|
const LINE_INFO *pLineInfo,
|
|
const JOB_QUEUE *pJobQueue
|
|
);
|
|
|
|
BOOL
|
|
GetRealFaxTimeAsSystemTime (
|
|
const PJOB_ENTRY lpcJobEntry,
|
|
FAX_ENUM_TIME_TYPES TimeType,
|
|
SYSTEMTIME* lpFaxTime
|
|
);
|
|
|
|
BOOL
|
|
GetRealFaxTimeAsFileTime (
|
|
const PJOB_ENTRY lpcJobEntry,
|
|
FAX_ENUM_TIME_TYPES TimeType,
|
|
FILETIME* lpFaxTime
|
|
);
|
|
|
|
BOOL
|
|
ReplaceStringWithCopy (
|
|
LPWSTR *plpwstrDst,
|
|
LPWSTR lpcwstrSrc
|
|
);
|
|
|
|
//
|
|
// Logging
|
|
//
|
|
|
|
BOOL
|
|
LogInboundActivity(
|
|
PJOB_QUEUE JobQueue,
|
|
LPCFSPI_JOB_STATUS pFaxStatus
|
|
);
|
|
|
|
DWORD
|
|
InitializeLogging(
|
|
VOID
|
|
);
|
|
|
|
|
|
DWORD
|
|
InitializeLoggingStringTables(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
LogOutboundActivity(
|
|
PJOB_QUEUE JobQueue
|
|
);
|
|
|
|
DWORD CreateLogDB (
|
|
LPCWSTR lpcwstrDBPath,
|
|
LPHANDLE phInboxFile,
|
|
LPHANDLE phOutboxFile
|
|
);
|
|
|
|
VOID
|
|
FaxExtFreeBuffer(
|
|
LPVOID lpvBuffer
|
|
);
|
|
|
|
PDEVICE_PROVIDER
|
|
FindFSPByGUID (
|
|
LPCWSTR lpcwstrGUID
|
|
);
|
|
|
|
|
|
//
|
|
// Events.cpp
|
|
//
|
|
|
|
DWORD
|
|
InitializeServerEvents (
|
|
void
|
|
);
|
|
|
|
DWORD
|
|
PostFaxEventEx (
|
|
PFAX_EVENT_EX pFaxEvent,
|
|
DWORD dwEventSize,
|
|
PSID pUserSid
|
|
);
|
|
|
|
DWORD
|
|
CreateQueueEvent (
|
|
FAX_ENUM_JOB_EVENT_TYPE JobEventType,
|
|
const PJOB_QUEUE lpcJobQueue
|
|
);
|
|
|
|
DWORD
|
|
CreateConfigEvent (
|
|
FAX_ENUM_CONFIG_TYPE ConfigType
|
|
);
|
|
|
|
DWORD
|
|
CreateQueueStateEvent (
|
|
DWORD dwQueueState
|
|
);
|
|
|
|
DWORD
|
|
CreateDeviceEvent (
|
|
PLINE_INFO pLine,
|
|
BOOL bRinging
|
|
);
|
|
|
|
DWORD
|
|
CreateArchiveEvent (
|
|
DWORDLONG dwlMessageId,
|
|
FAX_ENUM_EVENT_TYPE EventType,
|
|
FAX_ENUM_JOB_EVENT_TYPE MessageEventType,
|
|
PSID pUserSid
|
|
);
|
|
|
|
DWORD
|
|
CreateActivityEvent (
|
|
void
|
|
);
|
|
|
|
BOOL
|
|
SendReceipt(
|
|
BOOL bPositive,
|
|
BOOL bBroadcast,
|
|
const JOB_QUEUE * lpcJobQueue,
|
|
LPCTSTR lpctstrTIFF
|
|
);
|
|
|
|
VOID
|
|
SafeIncIdleCounter (
|
|
LPDWORD lpdwCounter
|
|
);
|
|
|
|
VOID
|
|
SafeDecIdleCounter (
|
|
LPDWORD lpdwCounter
|
|
);
|
|
|
|
VOID UpdateReceiveEnabledDevicesCount();
|
|
|
|
DWORD
|
|
GetServerErrorCode (
|
|
DWORD ec
|
|
);
|
|
|
|
DWORD
|
|
FindClientAPIVersion (handle_t);
|
|
|
|
//
|
|
// This structure is defined because the legacy FAX_COVERPAGE_INFO doesn't have the e-mail field.
|
|
// It is in use only inside functions participating in the rendering proccess.
|
|
// The only difference between FAX_COVERPAGE_INFOW2 and FAX_COVERPAGE_INFO is the e-mail field.
|
|
//
|
|
typedef struct _FAX_COVERPAGE_INFOW2
|
|
{
|
|
DWORD SizeOfStruct; // Size of this structure
|
|
//
|
|
// general
|
|
//
|
|
LPCWSTR CoverPageName; // coverpage document name
|
|
BOOL UseServerCoverPage; // coverpage exists on the fax server
|
|
//
|
|
// Recipient information
|
|
//
|
|
LPCWSTR RecName; //
|
|
LPCWSTR RecFaxNumber; //
|
|
LPCWSTR RecCompany; //
|
|
LPCWSTR RecStreetAddress; //
|
|
LPCWSTR RecCity; //
|
|
LPCWSTR RecState; //
|
|
LPCWSTR RecZip; //
|
|
LPCWSTR RecCountry; //
|
|
LPCWSTR RecTitle; //
|
|
LPCWSTR RecDepartment; //
|
|
LPCWSTR RecOfficeLocation; //
|
|
LPCWSTR RecHomePhone; //
|
|
LPCWSTR RecOfficePhone; //
|
|
//
|
|
// Sender information
|
|
//
|
|
LPCWSTR SdrName; //
|
|
LPCWSTR SdrFaxNumber; //
|
|
LPCWSTR SdrCompany; //
|
|
LPCWSTR SdrAddress; //
|
|
LPCWSTR SdrTitle; //
|
|
LPCWSTR SdrDepartment; //
|
|
LPCWSTR SdrOfficeLocation; //
|
|
LPCWSTR SdrHomePhone; //
|
|
LPCWSTR SdrOfficePhone; //
|
|
LPCWSTR SdrEmail; //
|
|
//
|
|
// Misc information
|
|
//
|
|
LPCWSTR Note; //
|
|
LPCWSTR Subject; //
|
|
SYSTEMTIME TimeSent; // Time the fax was sent
|
|
DWORD PageCount; // Number of pages
|
|
} FAX_COVERPAGE_INFOW2, *PFAX_COVERPAGE_INFOW2;
|
|
|
|
#include "ExtensionData.h"
|
|
|
|
#endif
|
|
|