{******************************************************************************}
{                                                                              }
{ Fax Device Provider API interface unit for Object Pascal                     }
{                                                                              }
{ Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
{ Corporation. All Rights Reserved.                                            }
{                                                                              }
{ The original file is: faxdev.h, released November 2001. The original Pascal  }
{ code is: FaxDev.pas, released April 2002. The initial developer of the       }
{ Pascal code is Marcel van Brakel (brakelm att chello dott nl).               }
{                                                                              }
{ Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
{ Marcel van Brakel. All Rights Reserved.                                      }
{                                                                              }
{ Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
{                                                                              }
{ You may retrieve the latest version of this file at the Project JEDI         }
{ APILIB home page, located at http://jedi-apilib.sourceforge.net              }
{                                                                              }
{ The contents of this file are used with permission, subject to the Mozilla   }
{ Public License Version 1.1 (the "License"); you may not use this file except }
{ in compliance with the License. You may obtain a copy of the License at      }
{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
{                                                                              }
{ Software distributed under the License is distributed on an "AS IS" basis,   }
{ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
{ the specific language governing rights and limitations under the License.    }
{                                                                              }
{ Alternatively, the contents of this file may be used under the terms of the  }
{ GNU Lesser General Public License (the  "LGPL License"), in which case the   }
{ provisions of the LGPL License are applicable instead of those above.        }
{ If you wish to allow use of your version of this file only under the terms   }
{ of the LGPL License and not to allow others to use your version of this file }
{ under the MPL, indicate your decision by deleting  the provisions above and  }
{ replace  them with the notice and other provisions required by the LGPL      }
{ License.  If you do not delete the provisions above, a recipient may use     }
{ your version of this file under either the MPL or the LGPL License.          }
{                                                                              }
{ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
{                                                                              }
{******************************************************************************}

// $Id: JwaFaxDev.pas,v 1.9 2007/09/14 06:48:45 marquardt Exp $
{$IFNDEF JWA_OMIT_SECTIONS}
unit JwaFaxDev;

{$WEAKPACKAGEUNIT}
{$ENDIF JWA_OMIT_SECTIONS}

{$HPPEMIT ''}
{$HPPEMIT '#include "faxdev.h"'}
{$HPPEMIT ''}

{$IFNDEF JWA_OMIT_SECTIONS}
{$I jediapilib.inc}

interface

uses
  JwaWinType, JwaPrSht;

{$ENDIF JWA_OMIT_SECTIONS}

{$IFNDEF JWA_IMPLEMENTATIONSECTION}

//
// FAX status constants
//

const
  FS_INITIALIZING     = $20000000;
  {$EXTERNALSYM FS_INITIALIZING}
  FS_DIALING          = $20000001;
  {$EXTERNALSYM FS_DIALING}
  FS_TRANSMITTING     = $20000002;
  {$EXTERNALSYM FS_TRANSMITTING}
  FS_RECEIVING        = $20000004;
  {$EXTERNALSYM FS_RECEIVING}
  FS_COMPLETED        = $20000008;
  {$EXTERNALSYM FS_COMPLETED}
  FS_HANDLED          = $20000010;
  {$EXTERNALSYM FS_HANDLED}
  FS_LINE_UNAVAILABLE = $20000020;
  {$EXTERNALSYM FS_LINE_UNAVAILABLE}
  FS_BUSY             = $20000040;
  {$EXTERNALSYM FS_BUSY}
  FS_NO_ANSWER        = $20000080;
  {$EXTERNALSYM FS_NO_ANSWER}
  FS_BAD_ADDRESS      = $20000100;
  {$EXTERNALSYM FS_BAD_ADDRESS}
  FS_NO_DIAL_TONE     = $20000200;
  {$EXTERNALSYM FS_NO_DIAL_TONE}
  FS_DISCONNECTED     = $20000400;
  {$EXTERNALSYM FS_DISCONNECTED}
  FS_FATAL_ERROR      = $20000800; 
  {$EXTERNALSYM FS_FATAL_ERROR}
  FS_NOT_FAX_CALL     = $20001000;
  {$EXTERNALSYM FS_NOT_FAX_CALL}
  FS_CALL_DELAYED     = $20002000;
  {$EXTERNALSYM FS_CALL_DELAYED}
  FS_CALL_BLACKLISTED = $20004000;
  {$EXTERNALSYM FS_CALL_BLACKLISTED}
  FS_USER_ABORT       = $20200000;
  {$EXTERNALSYM FS_USER_ABORT}
  FS_ANSWERED         = $20800000;
  {$EXTERNALSYM FS_ANSWERED}

//
// data structures
//

type
  {$IFNDEF JWA_INCLUDEMODE}
  HCALL = HANDLE; // todo from TAPI
  {$ENDIF JWA_INCLUDEMODE}

  PFAX_SEND = ^FAX_SEND;
  {$EXTERNALSYM PFAX_SEND}
  _FAX_SEND = record
    SizeOfStruct: DWORD;
    FileName: LPWSTR;
    CallerName: LPWSTR;
    CallerNumber: LPWSTR;
    ReceiverName: LPWSTR;
    ReceiverNumber: LPWSTR;
    Branding: BOOL;
    CallHandle: HCALL;
    Reserved: array [0..2] of DWORD;
  end;
  {$EXTERNALSYM _FAX_SEND}
  FAX_SEND = _FAX_SEND;
  {$EXTERNALSYM FAX_SEND}
  TFaxSend = FAX_SEND;
  PFaxSend = PFAX_SEND;

  PFAX_RECEIVE = ^FAX_RECEIVE;
  {$EXTERNALSYM PFAX_RECEIVE}
  _FAX_RECEIVE = record
    SizeOfStruct: DWORD;
    FileName: LPWSTR;
    ReceiverName: LPWSTR;
    ReceiverNumber: LPWSTR;
    Reserved: array [0..3] of DWORD;
  end;
  {$EXTERNALSYM _FAX_RECEIVE}
  FAX_RECEIVE = _FAX_RECEIVE;
  {$EXTERNALSYM FAX_RECEIVE}
  TFaxReceive = FAX_RECEIVE;
  PFaxReceive = PFAX_RECEIVE;

  PFAX_DEV_STATUS = ^FAX_DEV_STATUS;
  {$EXTERNALSYM PFAX_DEV_STATUS}
  _FAX_DEV_STATUS = record
    SizeOfStruct: DWORD;
    StatusId: DWORD;
    StringId: DWORD;
    PageCount: DWORD;
    CSI: LPWSTR;
    CallerId: LPWSTR;
    RoutingInfo: LPWSTR;
    ErrorCode: DWORD;
    Reserved: array [0..2] of DWORD;
  end;
  {$EXTERNALSYM _FAX_DEV_STATUS}
  FAX_DEV_STATUS = _FAX_DEV_STATUS;
  {$EXTERNALSYM FAX_DEV_STATUS}
  TFaxDevStatus = FAX_DEV_STATUS;
  PFaxDevStatus = PFAX_DEV_STATUS;

  PFAX_SERVICE_CALLBACK = function(FaxHandle: HANDLE; DeviceId: DWORD; Param1, Param2, Param3: DWORD_PTR): BOOL; stdcall;
  {$EXTERNALSYM PFAX_SERVICE_CALLBACK}

  PFAX_LINECALLBACK = procedure(FaxHandle: HANDLE; hDevice, dwMessage: DWORD; dwInstance, wParam1, dwParam2, dwParam3: DWORD_PTR); stdcall;
  {$EXTERNALSYM PFAX_LINECALLBACK}

type
  PFAX_SEND_CALLBACK = function(FaxHandle: HANDLE; CallHandle: HCALL; Reserved1, Reserved2: DWORD): BOOL; stdcall;
  {$EXTERNALSYM PFAX_SEND_CALLBACK}

const
  FAXDEVRECEIVE_SIZE = 4096;
  {$EXTERNALSYM FAXDEVRECEIVE_SIZE}

const
  FAXDEVREPORTSTATUS_SIZE = 4096;
  {$EXTERNALSYM FAXDEVREPORTSTATUS_SIZE}

type
  HLINEAPP = HANDLE; // todo from TAPI
  HLINE = HANDLE; // todo form TAPI

  PFAXDEVINITIALIZE = function(LineAppHandle: HLINEAPP; HeapHandle: HANDLE; out LineCallbackFunction: PFAX_LINECALLBACK; FaxServiceCallback: PFAX_SERVICE_CALLBACK): BOOL; stdcall;
  {$EXTERNALSYM PFAXDEVINITIALIZE}
  PFAXDEVSHUTDOWN = function : HRESULT; stdcall;
  {$EXTERNALSYM PFAXDEVSHUTDOWN}
  PFAXDEVVIRTUALDEVICECREATION = function(DeviceCount: LPDWORD; DeviceNamePrefix: LPWSTR; DeviceIdPrefix: LPDWORD; CompletionPort: HANDLE; CompletionKey: ULONG_PTR): BOOL; stdcall;
  {$EXTERNALSYM PFAXDEVVIRTUALDEVICECREATION}
  PFAXDEVSTARTJOB = function(LineHandle: HLINE; DeviceId: DWORD; FaxHandle: PHANDLE; CompletionPortHandle: HANDLE; CompletionKey: ULONG_PTR): BOOL; stdcall;
  {$EXTERNALSYM PFAXDEVSTARTJOB}
  PFAXDEVENDJOB = function(FaxHandle: HANDLE): BOOL; stdcall;
  {$EXTERNALSYM PFAXDEVENDJOB}
  PFAXDEVSEND = function(FaxHandle: HANDLE; FaxSend: PFAX_SEND; FaxSendCallback: PFAX_SEND_CALLBACK): BOOL; stdcall;
  {$EXTERNALSYM PFAXDEVSEND}
  PFAXDEVRECEIVE = function(FaxHandle: HANDLE; CallHandle: HCALL; FaxReceive: PFAX_RECEIVE): BOOL; stdcall;
  {$EXTERNALSYM PFAXDEVRECEIVE}
  PFAXDEVREPORTSTATUS = function(FaxHandle: HANDLE; FaxStatus: PFAX_DEV_STATUS; FaxStatusSize: DWORD; FaxStatusSizeRequired: LPDWORD): BOOL; stdcall;
  {$EXTERNALSYM PFAXDEVREPORTSTATUS}
  PFAXDEVABORTOPERATION = function(FaxHandle: HANDLE): BOOL; stdcall;
  {$EXTERNALSYM PFAXDEVABORTOPERATION}
  PFAXDEVCONFIGURE = function(out PropSheetPage: HPROPSHEETPAGE): BOOL; stdcall;
  {$EXTERNALSYM PFAXDEVCONFIGURE}

{$ENDIF JWA_IMPLEMENTATIONSECTION}

{$IFNDEF JWA_OMIT_SECTIONS}
implementation
//uses ...
{$ENDIF JWA_OMIT_SECTIONS}

{$IFNDEF JWA_INTERFACESECTION}
//your implementation here
{$ENDIF JWA_INTERFACESECTION}

{$IFNDEF JWA_OMIT_SECTIONS}
end.
{$ENDIF JWA_OMIT_SECTIONS}
