mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-03 23:03:54 +02:00
1394 lines
58 KiB
ObjectPascal
1394 lines
58 KiB
ObjectPascal
{
|
|
*****************************************************************************
|
|
This file is part of the Printer4Lazarus package
|
|
|
|
See the file COPYING.modifiedLGPL.txt, included in this distribution,
|
|
for details about the license.
|
|
*****************************************************************************
|
|
|
|
Author: Olivier GUILBAUD
|
|
|
|
Abstract:
|
|
This code provide an interface with Common UNIX Printing System (CUPS).
|
|
it is based on cups.h version 1.47
|
|
This code is tested with the 1.1.19 of CUPS
|
|
|
|
link:
|
|
http://www.cups.org
|
|
http://localhost:631/spm.html (for documentation)
|
|
|
|
See : /usr/share/doc/cups/licence.txt
|
|
|
|
Required
|
|
CUPS 1.1.19 or more
|
|
libCUPS
|
|
|
|
History
|
|
sept 14 2003 - Create
|
|
nov 04 2003 - First release
|
|
mars 08 2005 - Dynamique link lib by Jesus Reyes (big thanks)
|
|
- Some modifications for work with Mdk 10.1
|
|
nov 26 2017 - Moved to directory packages/libcups/ under FPC 3.1.1 sources.
|
|
Can be removed from Lazarus sources when FPC 3.2.0 is the minimum requirement.
|
|
------------------------------------------------------------------------------}
|
|
unit cupsdyn;
|
|
|
|
{$mode objfpc}{$H+}
|
|
{.$define UseLibC}
|
|
interface
|
|
|
|
|
|
uses
|
|
Classes, SysUtils, dynlibs,
|
|
{$ifdef UseLibC}
|
|
{$IFDEF darwin}
|
|
miniCupsLibc
|
|
{$ELSE}
|
|
Libc
|
|
{$ENDIF}
|
|
{$else}
|
|
baseunix, unix, sockets
|
|
{$endif}
|
|
;
|
|
|
|
{$PACKRECORDS C}
|
|
|
|
{.$LINKLIB ssl}
|
|
{.$LINKLIB crypto}
|
|
{.$LINKLIB nsl}
|
|
|
|
{$ifndef UseLibC}
|
|
type
|
|
sockaddr_in = TSockAddr;
|
|
pfd_set = PFDSet;
|
|
PFILE = pointer;
|
|
{$endif}
|
|
|
|
//
|
|
//
|
|
// CUPS_language types & consts
|
|
//
|
|
//
|
|
type
|
|
//Message Indices
|
|
cups_msg_t=(
|
|
CUPS_MSG_OK,
|
|
CUPS_MSG_CANCEL,
|
|
CUPS_MSG_HELP,
|
|
CUPS_MSG_QUIT,
|
|
CUPS_MSG_CLOSE,
|
|
CUPS_MSG_YES,
|
|
CUPS_MSG_NO,
|
|
CUPS_MSG_ON,
|
|
CUPS_MSG_OFF,
|
|
CUPS_MSG_SAVE,
|
|
CUPS_MSG_DISCARD,
|
|
CUPS_MSG_DEFAULT,
|
|
CUPS_MSG_OPTIONS,
|
|
CUPS_MSG_MORE_INFO,
|
|
CUPS_MSG_BLACK,
|
|
CUPS_MSG_COLOR,
|
|
CUPS_MSG_CYAN,
|
|
CUPS_MSG_MAGENTA,
|
|
CUPS_MSG_YELLOW,
|
|
CUPS_MSG_COPYRIGHT,
|
|
CUPS_MSG_GENERAL,
|
|
CUPS_MSG_PRINTER,
|
|
CUPS_MSG_IMAGE,
|
|
CUPS_MSG_HPGL2,
|
|
CUPS_MSG_EXTRA,
|
|
CUPS_MSG_DOCUMENT,
|
|
CUPS_MSG_OTHER,
|
|
CUPS_MSG_PRINT_PAGES,
|
|
CUPS_MSG_ENTIRE_DOCUMENT,
|
|
CUPS_MSG_PAGE_RANGE,
|
|
CUPS_MSG_REVERSE_ORDER,
|
|
CUPS_MSG_PAGE_FORMAT,
|
|
CUPS_MSG_1_UP,
|
|
CUPS_MSG_2_UP,
|
|
CUPS_MSG_4_UP,
|
|
CUPS_MSG_IMAGE_SCALING,
|
|
CUPS_MSG_USE_NATURAL_IMAGE_SIZE,
|
|
CUPS_MSG_ZOOM_BY_PERCENT,
|
|
CUPS_MSG_ZOOM_BY_PPI,
|
|
CUPS_MSG_MIRROR_IMAGE,
|
|
CUPS_MSG_COLOR_SATURATION,
|
|
CUPS_MSG_COLOR_HUE,
|
|
CUPS_MSG_FIT_TO_PAGE,
|
|
CUPS_MSG_SHADING,
|
|
CUPS_MSG_DEFAULT_PEN_WIDTH,
|
|
CUPS_MSG_GAMMA_CORRECTION,
|
|
CUPS_MSG_BRIGHTNESS,
|
|
CUPS_MSG_ADD,
|
|
CUPS_MSG_DELETE,
|
|
CUPS_MSG_MODIFY,
|
|
CUPS_MSG_PRINTER_URI,
|
|
CUPS_MSG_PRINTER_NAME,
|
|
CUPS_MSG_PRINTER_LOCATION,
|
|
CUPS_MSG_PRINTER_INFO,
|
|
CUPS_MSG_PRINTER_MAKE_AND_MODEL,
|
|
CUPS_MSG_DEVICE_URI,
|
|
CUPS_MSG_FORMATTING_PAGE,
|
|
CUPS_MSG_PRINTING_PAGE,
|
|
CUPS_MSG_INITIALIZING_PRINTER,
|
|
CUPS_MSG_PRINTER_STATE,
|
|
CUPS_MSG_ACCEPTING_JOBS,
|
|
CUPS_MSG_NOT_ACCEPTING_JOBS,
|
|
CUPS_MSG_PRINT_JOBS,
|
|
CUPS_MSG_CLASS,
|
|
CUPS_MSG_LOCAL,
|
|
CUPS_MSG_REMOTE,
|
|
CUPS_MSG_DUPLEXING,
|
|
CUPS_MSG_STAPLING,
|
|
CUPS_MSG_FAST_COPIES,
|
|
CUPS_MSG_COLLATED_COPIES,
|
|
CUPS_MSG_PUNCHING,
|
|
CUPS_MSG_COVERING,
|
|
CUPS_MSG_BINDING,
|
|
CUPS_MSG_SORTING,
|
|
CUPS_MSG_SMALL,
|
|
CUPS_MSG_MEDIUM,
|
|
CUPS_MSG_LARGE,
|
|
CUPS_MSG_VARIABLE,
|
|
CUPS_MSG_IDLE,
|
|
CUPS_MSG_PROCESSING,
|
|
CUPS_MSG_STOPPED,
|
|
CUPS_MSG_ALL,
|
|
CUPS_MSG_ODD,
|
|
CUPS_MSG_EVEN_PAGES,
|
|
CUPS_MSG_DARKER_LIGHTER,
|
|
CUPS_MSG_MEDIA_SIZE,
|
|
CUPS_MSG_MEDIA_TYPE,
|
|
CUPS_MSG_MEDIA_SOURCE,
|
|
CUPS_MSG_ORIENTATION,
|
|
CUPS_MSG_PORTRAIT,
|
|
CUPS_MSG_LANDSCAPE,
|
|
CUPS_MSG_JOB_STATE,
|
|
CUPS_MSG_JOB_NAME,
|
|
CUPS_MSG_USER_NAME,
|
|
CUPS_MSG_PRIORITY,
|
|
CUPS_MSG_COPIES,
|
|
CUPS_MSG_FILE_SIZE,
|
|
CUPS_MSG_PENDING,
|
|
CUPS_MSG_OUTPUT_MODE,
|
|
CUPS_MSG_RESOLUTION,
|
|
CUPS_MSG_TEXT,
|
|
CUPS_MSG_PRETTYPRINT,
|
|
CUPS_MSG_MARGINS,
|
|
CUPS_MSG_LEFT,
|
|
CUPS_MSG_RIGHT,
|
|
CUPS_MSG_BOTTOM,
|
|
CUPS_MSG_TOP,
|
|
CUPS_MSG_FILENAME,
|
|
CUPS_MSG_PRINT,
|
|
CUPS_MSG_OPTIONS_INSTALLED,
|
|
CUPS_MSG_AUTO,
|
|
CUPS_MSG_HTTP_BASE:= 200,
|
|
CUPS_MSG_HTTP_END := 505,
|
|
CUPS_MSG_MAX
|
|
);
|
|
|
|
//Language Encodings
|
|
cups_encoding_t=(
|
|
CUPS_US_ASCII,
|
|
CUPS_ISO8859_1,
|
|
CUPS_ISO8859_2,
|
|
CUPS_ISO8859_3,
|
|
CUPS_ISO8859_4,
|
|
CUPS_ISO8859_5,
|
|
CUPS_ISO8859_6,
|
|
CUPS_ISO8859_7,
|
|
CUPS_ISO8859_8,
|
|
CUPS_ISO8859_9,
|
|
CUPS_ISO8859_10,
|
|
CUPS_UTF8,
|
|
CUPS_ISO8859_13,
|
|
CUPS_ISO8859_14,
|
|
CUPS_ISO8859_15,
|
|
CUPS_WINDOWS_874,
|
|
CUPS_WINDOWS_1250,
|
|
CUPS_WINDOWS_1251,
|
|
CUPS_WINDOWS_1252,
|
|
CUPS_WINDOWS_1253,
|
|
CUPS_WINDOWS_1254,
|
|
CUPS_WINDOWS_1255,
|
|
CUPS_WINDOWS_1256,
|
|
CUPS_WINDOWS_1257,
|
|
CUPS_WINDOWS_1258,
|
|
CUPS_KOI8_R,
|
|
CUPS_KOI8_U
|
|
);
|
|
|
|
Pcups_lang_str=^cups_lang_str;
|
|
cups_lang_str = record
|
|
next : Pcups_lang_str; //Next language in cache
|
|
used : longint; //Number of times this entry has been used
|
|
encoding : cups_encoding_t; //Text encoding
|
|
language : array[0..15] of char; //Language/locale name
|
|
messages : array[0..Ord(CUPS_MSG_MAX)-1] of Pchar; //Message array
|
|
end;
|
|
cups_lang_t = cups_lang_str;
|
|
Pcups_lang_t=^cups_lang_t;
|
|
|
|
|
|
//
|
|
//
|
|
// CUPS_HTTP types & consts
|
|
//
|
|
//
|
|
const
|
|
HTTP_MAX_URI = 1024; //Max length of URI string
|
|
HTTP_MAX_HOST = 256; //Max length of hostname string
|
|
HTTP_MAX_BUFFER = 2048; //Max length of data buffer
|
|
HTTP_MAX_VALUE = 256; //Max header field value length
|
|
|
|
type
|
|
//----------------------------------------------------------------------------
|
|
// md5.h
|
|
//----------------------------------------------------------------------------
|
|
Pmd5_byte_t=^md5_byte_t;
|
|
md5_byte_t = byte; //8-bit byte
|
|
md5_word_t=dword; //32-bit word
|
|
|
|
//Define the state of the MD5 Algorithm.
|
|
md5_state_s = record
|
|
count : array[0..1] of md5_word_t; //message length in bits, lsw first
|
|
abcd : array[0..3] of md5_word_t; //digest buffer
|
|
buf : array[0..63] of md5_byte_t;//accumulate block
|
|
end;
|
|
md5_state_t = md5_state_s;
|
|
{-----------------------------------------------------------------------------}
|
|
|
|
//States are server-oriented
|
|
http_state_t=(
|
|
HTTP_WAITING, //Waiting for command
|
|
HTTP_OPTIONS, //OPTIONS command, waiting for blank line
|
|
HTTP_GET, //GET command, waiting for blank line
|
|
HTTP_GET_SEND, //GET command, sending data
|
|
HTTP_HEAD, //HEAD command, waiting for blank line
|
|
HTTP_POST, //POST command, waiting for blank line
|
|
HTTP_POST_RECV, //POST command, receiving data
|
|
HTTP_POST_SEND, //POST command, sending data
|
|
HTTP_PUT, //PUT command, waiting for blank line
|
|
HTTP_PUT_RECV, //PUT command, receiving data
|
|
HTTP_DELETE, //DELETE command, waiting for blank line
|
|
HTTP_TRACE, //TRACE command, waiting for blank line
|
|
HTTP_CLOSE, //CLOSE command, waiting for blank line
|
|
HTTP_STATUS //Command complete, sending status
|
|
);
|
|
|
|
//HTTP version numbers...
|
|
http_version_t=(
|
|
HTTP_0_9 := 9, //HTTP/0.9
|
|
HTTP_1_0 := 100, //HTTP/1.0
|
|
HTTP_1_1 := 101 //HTTP/1.1
|
|
);
|
|
|
|
//HTTP keep-alive values...
|
|
http_keepalive_t=(
|
|
HTTP_KEEPALIVE_OFF := 0,
|
|
HTTP_KEEPALIVE_ON
|
|
);
|
|
|
|
//HTTP transfer encoding values...
|
|
http_encoding_t=(
|
|
HTTP_ENCODE_LENGTH, //Data is sent with Content-Length
|
|
HTTP_ENCODE_CHUNKED //Data is chunked
|
|
);
|
|
|
|
//HTTP encryption values...
|
|
http_encryption_t=(
|
|
HTTP_ENCRYPT_IF_REQUESTED, //Encrypt if requested (TLS upgrade)
|
|
HTTP_ENCRYPT_NEVER, //Never encrypt
|
|
HTTP_ENCRYPT_REQUIRED, //Encryption is required (TLS upgrade)
|
|
HTTP_ENCRYPT_ALWAYS //Always encrypt (SSL)
|
|
);
|
|
|
|
//HTTP authentication types...
|
|
http_auth_t=(
|
|
HTTP_AUTH_NONE, //No authentication in use
|
|
HTTP_AUTH_BASIC, //Basic authentication in use
|
|
HTTP_AUTH_MD5, //Digest authentication in use
|
|
HTTP_AUTH_MD5_SESS, //MD5-session authentication in use
|
|
HTTP_AUTH_MD5_INT, //Digest authentication in use for body
|
|
HTTP_AUTH_MD5_SESS_INT //MD5-session authentication in use for body
|
|
);
|
|
|
|
//HTTP status codes...
|
|
http_status_t=(
|
|
HTTP_ERROR := -1, //An error response from httpXxxx() */
|
|
|
|
HTTP_CONTINUE := 100, //Everything OK, keep going... */
|
|
HTTP_SWITCHING_PROTOCOLS, //HTTP upgrade to TLS/SSL */
|
|
|
|
HTTP_OK := 200, //OPTIONS/GET/HEAD/POST/TRACE command was successful */
|
|
HTTP_CREATED, //PUT command was successful */
|
|
HTTP_ACCEPTED, //DELETE command was successful */
|
|
HTTP_NOT_AUTHORITATIVE, //Information isn't authoritative */
|
|
HTTP_NO_CONTENT, //Successful command, no new data */
|
|
HTTP_RESET_CONTENT, //Content was reset/recreated */
|
|
HTTP_PARTIAL_CONTENT, //Only a partial file was recieved/sent */
|
|
|
|
HTTP_MULTIPLE_CHOICES:=300, //Multiple files match request */
|
|
HTTP_MOVED_PERMANENTLY, //Document has moved permanently */
|
|
HTTP_MOVED_TEMPORARILY, //Document has moved temporarily */
|
|
HTTP_SEE_OTHER, //See this other link... */
|
|
HTTP_NOT_MODIFIED, //File not modified */
|
|
HTTP_USE_PROXY, //Must use a proxy to access this URI */
|
|
|
|
HTTP_BAD_REQUEST := 400, //Bad request */
|
|
HTTP_UNAUTHORIZED, //Unauthorized to access host */
|
|
HTTP_PAYMENT_REQUIRED, //Payment required */
|
|
HTTP_FORBIDDEN, //Forbidden to access this URI */
|
|
HTTP_NOT_FOUND, //URI was not found */
|
|
HTTP_METHOD_NOT_ALLOWED, //Method is not allowed */
|
|
HTTP_NOT_ACCEPTABLE, //Not Acceptable */
|
|
HTTP_PROXY_AUTHENTICATION, //Proxy Authentication is Required */
|
|
HTTP_REQUEST_TIMEOUT, //Request timed out */
|
|
HTTP_CONFLICT, //Request is self-conflicting */
|
|
HTTP_GONE, //Server has gone away */
|
|
HTTP_LENGTH_REQUIRED, //A content length or encoding is required */
|
|
HTTP_PRECONDITION, //Precondition failed */
|
|
HTTP_REQUEST_TOO_LARGE, //Request entity too large */
|
|
HTTP_URI_TOO_LONG, //URI too long */
|
|
HTTP_UNSUPPORTED_MEDIATYPE, //The requested media type is unsupported */
|
|
HTTP_UPGRADE_REQUIRED:= 426,//Upgrade to SSL/TLS required */
|
|
|
|
HTTP_SERVER_ERROR := 500, //Internal server error */
|
|
HTTP_NOT_IMPLEMENTED, //Feature not implemented */
|
|
HTTP_BAD_GATEWAY, //Bad gateway */
|
|
HTTP_SERVICE_UNAVAILABLE, //Service is unavailable */
|
|
HTTP_GATEWAY_TIMEOUT, //Gateway connection timed out */
|
|
HTTP_NOT_SUPPORTED //HTTP version not supported */
|
|
);
|
|
|
|
//HTTP field names...
|
|
http_field_t=(
|
|
HTTP_FIELD_UNKNOWN := -1,
|
|
HTTP_FIELD_ACCEPT_LANGUAGE,
|
|
HTTP_FIELD_ACCEPT_RANGES,
|
|
HTTP_FIELD_AUTHORIZATION,
|
|
HTTP_FIELD_CONNECTION,
|
|
HTTP_FIELD_CONTENT_ENCODING,
|
|
HTTP_FIELD_CONTENT_LANGUAGE,
|
|
HTTP_FIELD_CONTENT_LENGTH,
|
|
HTTP_FIELD_CONTENT_LOCATION,
|
|
HTTP_FIELD_CONTENT_MD5,
|
|
HTTP_FIELD_CONTENT_RANGE,
|
|
HTTP_FIELD_CONTENT_TYPE,
|
|
HTTP_FIELD_CONTENT_VERSION,
|
|
HTTP_FIELD_DATE,
|
|
HTTP_FIELD_HOST,
|
|
HTTP_FIELD_IF_MODIFIED_SINCE,
|
|
HTTP_FIELD_IF_UNMODIFIED_SINCE,
|
|
HTTP_FIELD_KEEP_ALIVE,
|
|
HTTP_FIELD_LAST_MODIFIED,
|
|
HTTP_FIELD_LINK,
|
|
HTTP_FIELD_LOCATION,
|
|
HTTP_FIELD_RANGE,
|
|
HTTP_FIELD_REFERER,
|
|
HTTP_FIELD_RETRY_AFTER,
|
|
HTTP_FIELD_TRANSFER_ENCODING,
|
|
HTTP_FIELD_UPGRADE,
|
|
HTTP_FIELD_USER_AGENT,
|
|
HTTP_FIELD_WWW_AUTHENTICATE,
|
|
HTTP_FIELD_MAX
|
|
);
|
|
|
|
Phttp_t=^http_t;
|
|
http_t=record
|
|
fd : longint; //File descriptor for this socket
|
|
blocking : longint; //To block or not to block
|
|
error : longint; //Last error on read
|
|
activity : time_t; //Time since last read/write
|
|
state : http_state_t; //State of client
|
|
status : http_status_t; //Status of last request
|
|
version : http_version_t;//Protocol version
|
|
keep_alive : http_keepalive_t; //Keep-alive supported?
|
|
hostaddr : sockaddr_in; //Address of connected host
|
|
hostname : array[0..(HTTP_MAX_HOST)-1] of char; //Name of connected host
|
|
fields : array[0..Ord(HTTP_FIELD_MAX)-1] of array[0..(HTTP_MAX_VALUE)-1] of char; //Field values
|
|
data : ^char; //Pointer to data buffer
|
|
data_encoding : http_encoding_t; //Chunked or not
|
|
data_remaining : longint; //Number of bytes left
|
|
used : longint; //Number of bytes used in buffer
|
|
buffer : array[0..(HTTP_MAX_BUFFER)-1] of char; //Buffer for messages
|
|
auth_type : longint; //Authentication in use
|
|
md5_state : md5_state_t; //MD5 state
|
|
nonce : array[0..(HTTP_MAX_VALUE)-1] of char; //Nonce value
|
|
nonce_count : longint; //Nonce count
|
|
tls : pointer; //TLS state information
|
|
encryption : http_encryption_t; //Encryption requirements
|
|
input_set : Pfd_set; //select() set for httpWait()
|
|
end;
|
|
TArrayChar32=array[0..32] of char;
|
|
|
|
|
|
//
|
|
//
|
|
// cups_ppd types and consts
|
|
//
|
|
//
|
|
const
|
|
//PPD size limits (defined in Adobe spec
|
|
PPD_MAX_NAME = 41; //Maximum size of name + 1 for nul
|
|
PPD_MAX_TEXT = 81; //Maximum size of text + 1 for nul
|
|
PPD_MAX_LINE = 256; //Maximum size of line + 1 for nul
|
|
PPD_VERSION = '4.3'; //Kept in sync with Adobe version number
|
|
|
|
Type
|
|
//UI types ...
|
|
ppd_ui_t=(
|
|
PPD_UI_BOOLEAN, //True or False option
|
|
PPD_UI_PICKONE, //Pick one from a list
|
|
PPD_UI_PICKMANY //Pick zero or more from a list
|
|
);
|
|
|
|
//Order dependency sections
|
|
ppd_section_t=(
|
|
PPD_ORDER_ANY, //Option code can be anywhere in the file
|
|
PPD_ORDER_DOCUMENT, //... must be in the DocumentSetup section
|
|
PPD_ORDER_EXIT, //... must be sent prior to the document
|
|
PPD_ORDER_JCL, //... must be sent as a JCL command
|
|
PPD_ORDER_PAGE, //... must be in the PageSetup section
|
|
PPD_ORDER_PROLOG //... must be in the Prolog section
|
|
);
|
|
|
|
//Colorspaces
|
|
ppd_cs_t=(
|
|
PPD_CS_CMYK := -4, //CMYK colorspace
|
|
PPD_CS_CMY, //CMY colorspace
|
|
PPD_CS_GRAY := 1, //Grayscale colorspace
|
|
PPD_CS_RGB := 3, //RGB colorspace
|
|
PPD_CS_RGBK, //RGBK (K = gray) colorspace
|
|
PPD_CS_N //DeviceN colorspace
|
|
);
|
|
|
|
//Status Codes
|
|
ppd_status_t=(
|
|
PPD_OK := 0, //OK
|
|
PPD_FILE_OPEN_ERROR, //Unable to open PPD file
|
|
PPD_NULL_FILE, //NULL PPD file pointer
|
|
PPD_ALLOC_ERROR, //Memory allocation error
|
|
PPD_MISSING_PPDADOBE4, //Missing PPD-Adobe-4.x header
|
|
PPD_MISSING_VALUE, //Missing value string
|
|
PPD_INTERNAL_ERROR, //Internal error
|
|
PPD_BAD_OPEN_GROUP, //Bad OpenGroup
|
|
PPD_NESTED_OPEN_GROUP, //openGroup without a CloseGroup first
|
|
PPD_BAD_OPEN_UI, //Bad OpenUI/JCLOpenUI
|
|
PPD_NESTED_OPEN_UI, //OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first
|
|
PPD_BAD_ORDER_DEPENDENCY, //Bad OrderDependency
|
|
PPD_BAD_UI_CONSTRAINTS, //Bad UIConstraints
|
|
PPD_MISSING_ASTERISK, //Missing asterisk in column 0
|
|
PPD_LINE_TOO_LONG, //Line longer than 255 chars
|
|
PPD_ILLEGAL_CHARACTER, //Illegal control character
|
|
PPD_ILLEGAL_MAIN_KEYWORD, //Illegal main keyword string
|
|
PPD_ILLEGAL_OPTION_KEYWORD, //Illegal option keyword string
|
|
PPD_ILLEGAL_TRANSLATION //Illegal translation string
|
|
);
|
|
|
|
//PPD Attribute Structure
|
|
Pppd_attr_t =^ppd_attr_t;
|
|
PPppd_attr_t =^Pppd_attr_t;
|
|
ppd_attr_t = record
|
|
name : array[0..(PPD_MAX_NAME)-1] of char; //Name of attribute (cupsXYZ)
|
|
spec : array[0..(PPD_MAX_NAME + PPD_MAX_TEXT)-1] of char; //Specifier string, if any
|
|
value: Pchar; //Value string
|
|
end;
|
|
|
|
//Option choices
|
|
Pppd_choice_t=^ppd_choice_t;
|
|
PPppd_choice_t=^Pppd_choice_t;
|
|
PPPppd_choice_t=^PPppd_choice_t;
|
|
ppd_choice_t = record
|
|
marked : Char; //0 if not selected, 1 otherwise
|
|
choice : Array[0..(PPD_MAX_NAME)-1] of char;//Computer-readable option name
|
|
text : Array[0..(PPD_MAX_TEXT)-1] of char;//Human-readable option name
|
|
code : Pchar; //Code to send for this option
|
|
option : Pointer; //Pointer to parent option structure
|
|
end;
|
|
|
|
//Options
|
|
Pppd_option_t=^ppd_option_t;
|
|
ppd_option_t = record
|
|
conflicted : char; //0 if no conflicts exist, 1 otherwise
|
|
keyword : array[0..(PPD_MAX_NAME)-1] of char;//Option keyword name ("PageSize", etc.)
|
|
defchoice : array[0..(PPD_MAX_NAME)-1] of char;//Default option choice
|
|
text : array[0..(PPD_MAX_TEXT)-1] of char;//Human-readable text
|
|
ui : ppd_ui_t; //Type of UI option
|
|
section : ppd_section_t; //Section for command
|
|
order : integer; //Order number
|
|
num_choices: LongInt; //Number of option choices
|
|
choices : Pppd_choice_t; //Option choices
|
|
end;
|
|
|
|
//Groups
|
|
{Group text strings are limited to 39 chars + nul in order to
|
|
preserve binary compatibility and allow applications to get
|
|
the group's keyword name. }
|
|
Pppd_group_str=^ppd_group_str;
|
|
ppd_group_str = record
|
|
text : array[0..(PPD_MAX_TEXT - PPD_MAX_NAME)-1] of char; //Human-readable group name
|
|
name : array[0..(PPD_MAX_NAME)-1] of char; //Group name
|
|
num_options : longint; //Number of options
|
|
options : Pppd_option_t; //Options
|
|
num_subgroups : longint; //Number of sub-groups
|
|
subgroups : Pppd_group_str; //Sub-groups (max depth = 1)
|
|
end;
|
|
ppd_group_t = ppd_group_str;
|
|
Pppd_group_t= ^ppd_group_t;
|
|
|
|
//Constraints
|
|
Pppd_const_t=^ppd_const_t;
|
|
ppd_const_t = record
|
|
option1 : array[0..(PPD_MAX_NAME)-1] of char; //First keyword
|
|
choice1 : array[0..(PPD_MAX_NAME)-1] of char; //First option/choice (blank for all)
|
|
option2 : array[0..(PPD_MAX_NAME)-1] of char; //Second keyword
|
|
choice2 : array[0..(PPD_MAX_NAME)-1] of char; //Second option/choice (blank for all)
|
|
end;
|
|
|
|
//Page Sizes
|
|
Pppd_size_t=^ppd_size_t;
|
|
ppd_size_t = record
|
|
marked : LongInt; //Page size selected?
|
|
name : array[0..(PPD_MAX_NAME)-1] of char; //Media size option
|
|
width : single; //Width of media in points
|
|
length : single; //Length of media in points
|
|
left : single; //Left printable margin in points
|
|
bottom : single; //Bottom printable margin in points
|
|
right : single; //Right printable margin in points
|
|
top : single; //Top printable margin in points
|
|
end;
|
|
|
|
//Emulators
|
|
Pppd_emul_t=^ppd_emul_t;
|
|
ppd_emul_t = record
|
|
name : array[0..(PPD_MAX_NAME)-1] of char; //Emulator name
|
|
start: Pchar; //Code to switch to this emulation
|
|
stop : Pchar; //Code to stop this emulation
|
|
end;
|
|
|
|
//sRGB Color Profiles
|
|
Pppd_profile_t=^ppd_profile_t;
|
|
ppd_profile_t = record
|
|
resolution : array[0..(PPD_MAX_NAME)-1] of char; //Resolution or "-"
|
|
media_type : array[0..(PPD_MAX_NAME)-1] of char; //Media type of "-"
|
|
density : single; //Ink density to use
|
|
gamma : single; //Gamma correction to use
|
|
matrix : array[0..2] of array[0..2] of single; //Transform matrix
|
|
end;
|
|
|
|
//Files
|
|
Pppd_file_t=^ppd_file_t;
|
|
ppd_file_t = record
|
|
language_level : longint; //Language level of device
|
|
color_device : longint; //1=color device, 0=grayscale
|
|
variable_sizes : longint; //1 = supports variable sizes, 0 = doesn't
|
|
accurate_screens : longint; //1 = supports accurate screens, 0 = not
|
|
contone_only : longint; //1 = continuous tone only, 0 = not
|
|
landscape : longint; //-90 or 90
|
|
model_number : longint; //Device-specific model number
|
|
manual_copies : longint; //1 = Copies done manually, 0 = hardware
|
|
throughput : longint; //Pages per minute
|
|
colorspace : ppd_cs_t; //Default colorspace
|
|
patches : Pchar; //Patch commands to be sent to printer
|
|
num_emulations : longint; //Number of emulations supported
|
|
emulations : Pppd_emul_t; //Emulations and the code to invoke them
|
|
jcl_begin : Pchar; //Start JCL commands
|
|
jcl_ps : Pchar; //Enter PostScript interpreter
|
|
jcl_end : Pchar; //End JCL commands
|
|
lang_encoding : Pchar; //Language encoding
|
|
lang_version : Pchar; //Language version (English, Spanish, etc.)
|
|
modelname : Pchar; //Model name (general)
|
|
ttrasterizer : Pchar; //Truetype rasterizer
|
|
manufacturer : Pchar; //Manufacturer name
|
|
product : Pchar; //Product name (from PS RIP/interpreter)
|
|
nickname : Pchar; //Nickname (specific)
|
|
shortnickname : Pchar; //Short version of nickname
|
|
num_groups : longint; //Number of UI groups
|
|
groups : Pppd_group_t; //UI groups
|
|
num_sizes : longint; //Number of page sizes
|
|
sizes : Pppd_size_t; //Page sizes
|
|
custom_min : array[0..1] of single; //Minimum variable page size
|
|
custom_max : array[0..1] of single; //Maximum variable page size
|
|
custom_margins : array[0..3] of single; //Margins around page
|
|
num_consts : longint; //Number of UI/Non-UI constraints
|
|
consts : Pppd_const_t; //UI/Non-UI constraints
|
|
num_fonts : longint; //Number of pre-loaded fonts
|
|
fonts : PPchar; //Pre-loaded fonts
|
|
num_profiles : longint; //Number of sRGB color profiles
|
|
profiles : Pppd_profile_t; //sRGB color profiles
|
|
num_filters : longint; //Number of filters
|
|
filters : PPchar; //Filter strings...
|
|
flip_duplex : longint; //1 = Flip page for back sides (New in CUPS 1.1)
|
|
protocols : Pchar; //Protocols (BCP, TBCP) string (New in CUPS 1.1.19)
|
|
pcfilename : Pchar; //PCFileName string
|
|
num_attrs : longint; //Number of attributes
|
|
cur_attr : longint; //Current attribute
|
|
attrs : PPppd_attr_t; //Attributes
|
|
end;
|
|
|
|
//
|
|
//
|
|
// cups_ipp types and consts
|
|
//
|
|
//
|
|
const
|
|
IPP_VERSION = #1#1;
|
|
{ IPP registered port number... This is the default value - applications
|
|
should use the ippPort() function so that you can customize things in
|
|
/etc/services if needed!}
|
|
IPP_PORT = 631;
|
|
IPP_MAX_NAME = 256; //Common limits...
|
|
IPP_MAX_VALUES = 10; //Now just an allocation increment
|
|
|
|
Type
|
|
//Job States....
|
|
ipp_jstate_t = (IPP_JOB_PENDING := 3,
|
|
IPP_JOB_HELD,
|
|
IPP_JOB_PROCESSING,
|
|
IPP_JOB_STOPPED,
|
|
IPP_JOB_CANCELLED,
|
|
IPP_JOB_ABORTED,
|
|
IPP_JOB_COMPLETED);
|
|
//Qualities...
|
|
ipp_quality_t= (IPP_QUALITY_DRAFT := 3,
|
|
IPP_QUALITY_NORMAL,
|
|
IPP_QUALITY_HIGH);
|
|
|
|
//Orientation...
|
|
ipp_orient_t = (IPP_PORTRAIT := 3, //No rotation
|
|
IPP_LANDSCAPE, //90 degrees counter-clockwise
|
|
IPP_REVERSE_LANDSCAPE, //90 degrees clockwise
|
|
IPP_REVERSE_PORTRAIT); //180 degrees
|
|
|
|
{Format tags for attribute formats...
|
|
Mask for copied attribute values
|
|
Bitflag for copied attribute values }
|
|
ipp_tag_t = (IPP_TAG_COPY := (-($7fffffff)) - 1,
|
|
IPP_TAG_ZERO := $00,
|
|
IPP_TAG_OPERATION,
|
|
IPP_TAG_JOB,
|
|
IPP_TAG_END,
|
|
IPP_TAG_PRINTER,
|
|
IPP_TAG_UNSUPPORTED_GROUP,
|
|
IPP_TAG_SUBSCRIPTION,
|
|
IPP_TAG_EVENT_NOTIFICATION,
|
|
IPP_TAG_UNSUPPORTED_VALUE := $10,
|
|
IPP_TAG_DEFAULT,
|
|
IPP_TAG_UNKNOWN,
|
|
IPP_TAG_NOVALUE,
|
|
IPP_TAG_NOTSETTABLE := $15,
|
|
IPP_TAG_DELETEATTR,
|
|
IPP_TAG_ADMINDEFINE,
|
|
IPP_TAG_INTEGER := $21,
|
|
IPP_TAG_BOOLEAN,
|
|
IPP_TAG_ENUM,
|
|
IPP_TAG_STRING := $30,
|
|
IPP_TAG_DATE,
|
|
IPP_TAG_RESOLUTION,
|
|
IPP_TAG_RANGE,
|
|
IPP_TAG_BEGIN_COLLECTION,
|
|
IPP_TAG_TEXTLANG,
|
|
IPP_TAG_NAMELANG,
|
|
IPP_TAG_END_COLLECTION,
|
|
IPP_TAG_TEXT := $41,
|
|
IPP_TAG_NAME,
|
|
IPP_TAG_KEYWORD := $44,
|
|
IPP_TAG_URI,
|
|
IPP_TAG_URISCHEME,
|
|
IPP_TAG_CHARSET,
|
|
IPP_TAG_LANGUAGE,
|
|
IPP_TAG_MIMETYPE,
|
|
IPP_TAG_MEMBERNAME,
|
|
IPP_TAG_MASK := $7fffffff
|
|
);
|
|
|
|
//Resolution units...
|
|
ipp_res_t = (IPP_RES_PER_INCH := 3,
|
|
IPP_RES_PER_CM);
|
|
|
|
//Finishings...
|
|
ipp_finish_t = (IPP_FINISHINGS_NONE := 3,
|
|
IPP_FINISHINGS_STAPLE,
|
|
IPP_FINISHINGS_PUNCH,
|
|
IPP_FINISHINGS_COVER,
|
|
IPP_FINISHINGS_BIND,
|
|
IPP_FINISHINGS_SADDLE_STITCH,
|
|
IPP_FINISHINGS_EDGE_STITCH,
|
|
IPP_FINISHINGS_FOLD,
|
|
IPP_FINISHINGS_TRIM,
|
|
IPP_FINISHINGS_BALE,
|
|
IPP_FINISHINGS_BOOKLET_MAKER,
|
|
IPP_FINISHINGS_JOB_OFFSET,
|
|
IPP_FINISHINGS_STAPLE_TOP_LEFT := 20,
|
|
IPP_FINISHINGS_STAPLE_BOTTOM_LEFT,
|
|
IPP_FINISHINGS_STAPLE_TOP_RIGHT,
|
|
IPP_FINISHINGS_STAPLE_BOTTOM_RIGHT,
|
|
IPP_FINISHINGS_EDGE_STITCH_LEFT,
|
|
IPP_FINISHINGS_EDGE_STITCH_TOP,
|
|
IPP_FINISHINGS_EDGE_STITCH_RIGHT,
|
|
IPP_FINISHINGS_EDGE_STITCH_BOTTOM,
|
|
IPP_FINISHINGS_STAPLE_DUAL_LEFT,
|
|
IPP_FINISHINGS_STAPLE_DUAL_TOP,
|
|
IPP_FINISHINGS_STAPLE_DUAL_RIGHT,
|
|
IPP_FINISHINGS_STAPLE_DUAL_BOTTOM,
|
|
IPP_FINISHINGS_BIND_LEFT := 50,
|
|
IPP_FINISHINGS_BIND_TOP,
|
|
IPP_FINISHINGS_BIND_RIGHT,
|
|
IPP_FINISHINGS_BIND_BOTTOM
|
|
);
|
|
|
|
ipp_status_t = (IPP_OK := $0000,
|
|
IPP_OK_SUBST,
|
|
IPP_OK_CONFLICT,
|
|
IPP_OK_IGNORED_SUBSCRIPTIONS,
|
|
IPP_OK_IGNORED_NOTIFICATIONS,
|
|
IPP_OK_TOO_MANY_EVENTS,
|
|
IPP_OK_BUT_CANCEL_SUBSCRIPTION,
|
|
IPP_REDIRECTION_OTHER_SITE := $300,
|
|
IPP_BAD_REQUEST := $0400,
|
|
IPP_FORBIDDEN,
|
|
IPP_NOT_AUTHENTICATED,
|
|
IPP_NOT_AUTHORIZED,
|
|
IPP_NOT_POSSIBLE,
|
|
IPP_TIMEOUT,
|
|
IPP_NOT_FOUND,
|
|
IPP_GONE,
|
|
IPP_REQUEST_ENTITY,
|
|
IPP_REQUEST_VALUE,
|
|
IPP_DOCUMENT_FORMAT,
|
|
IPP_ATTRIBUTES,
|
|
IPP_URI_SCHEME,
|
|
IPP_CHARSET,IPP_CONFLICT,
|
|
IPP_COMPRESSION_NOT_SUPPORTED,
|
|
IPP_COMPRESSION_ERROR,
|
|
IPP_DOCUMENT_FORMAT_ERROR,
|
|
IPP_DOCUMENT_ACCESS_ERROR,
|
|
IPP_ATTRIBUTES_NOT_SETTABLE,
|
|
IPP_IGNORED_ALL_SUBSCRIPTIONS,
|
|
IPP_TOO_MANY_SUBSCRIPTIONS,
|
|
IPP_IGNORED_ALL_NOTIFICATIONS,
|
|
IPP_PRINT_SUPPORT_FILE_NOT_FOUND,
|
|
IPP_INTERNAL_ERROR := $0500,
|
|
IPP_OPERATION_NOT_SUPPORTED,
|
|
IPP_SERVICE_UNAVAILABLE,
|
|
IPP_VERSION_NOT_SUPPORTED,
|
|
IPP_DEVICE_ERROR,
|
|
IPP_TEMPORARY_ERROR,
|
|
IPP_NOT_ACCEPTING,
|
|
IPP_PRINTER_BUSY,
|
|
IPP_ERROR_JOB_CANCELLED,
|
|
IPP_MULTIPLE_JOBS_NOT_SUPPORTED,
|
|
IPP_PRINTER_IS_DEACTIVATED);
|
|
|
|
//Printer States....
|
|
ipp_pstate_t = (IPP_PRINTER_IDLE := 3,
|
|
IPP_PRINTER_PROCESSING,
|
|
IPP_PRINTER_STOPPED);
|
|
|
|
//IPP states...
|
|
ipp_state_t = (IPP_ERROR := -(1), //An error occurred
|
|
IPP_IDLE, //Nothing is happening/request completed
|
|
IPP_HEADER, //The request header needs to be sent/received
|
|
IPP_ATTRIBUTE, //One or more attributes need to be sent/received
|
|
IPP_DATA); //IPP request data needs to be sent/received
|
|
|
|
//IPP operations...
|
|
ipp_op_t = (IPP_PRINT_JOB := $0002,
|
|
IPP_PRINT_URI,
|
|
IPP_VALIDATE_JOB,
|
|
IPP_CREATE_JOB,
|
|
IPP_SEND_DOCUMENT,
|
|
IPP_SEND_URI,
|
|
IPP_CANCEL_JOB,
|
|
IPP_GET_JOB_ATTRIBUTES,
|
|
IPP_GET_JOBS,
|
|
IPP_GET_PRINTER_ATTRIBUTES,
|
|
IPP_HOLD_JOB,
|
|
IPP_RELEASE_JOB,
|
|
IPP_RESTART_JOB,
|
|
IPP_PAUSE_PRINTER := $0010,
|
|
IPP_RESUME_PRINTER,
|
|
IPP_PURGE_JOBS,
|
|
IPP_SET_PRINTER_ATTRIBUTES,
|
|
IPP_SET_JOB_ATTRIBUTES,
|
|
IPP_GET_PRINTER_SUPPORTED_VALUES,
|
|
IPP_CREATE_PRINTER_SUBSCRIPTION,
|
|
IPP_CREATE_JOB_SUBSCRIPTION,
|
|
IPP_GET_SUBSCRIPTION_ATTRIBUTES,
|
|
IPP_GET_SUBSCRIPTIONS,
|
|
IPP_RENEW_SUBSCRIPTION,
|
|
IPP_CANCEL_SUBSCRIPTION,
|
|
IPP_GET_NOTIFICATIONS,
|
|
IPP_SEND_NOTIFICATIONS,
|
|
IPP_GET_PRINT_SUPPORT_FILES := $0021,
|
|
IPP_ENABLE_PRINTER,
|
|
IPP_DISABLE_PRINTER,
|
|
IPP_PAUSE_PRINTER_AFTER_CURRENT_JOB,
|
|
IPP_HOLD_NEW_JOBS,
|
|
IPP_RELEASE_HELD_NEW_JOBS,
|
|
IPP_DEACTIVATE_PRINTER,
|
|
IPP_ACTIVATE_PRINTER,
|
|
IPP_RESTART_PRINTER,
|
|
IPP_SHUTDOWN_PRINTER,
|
|
IPP_STARTUP_PRINTER,
|
|
IPP_REPROCESS_JOB,
|
|
IPP_CANCEL_CURRENT_JOB,
|
|
IPP_SUSPEND_CURRENT_JOB,
|
|
IPP_RESUME_JOB,
|
|
IPP_PROMOTE_JOB,
|
|
IPP_SCHEDULE_JOB_AFTER,
|
|
IPP_PRIVATE := $4000,
|
|
CUPS_GET_DEFAULT,
|
|
CUPS_GET_PRINTERS,
|
|
CUPS_ADD_PRINTER,
|
|
CUPS_DELETE_PRINTER,
|
|
CUPS_GET_CLASSES,
|
|
CUPS_ADD_CLASS,
|
|
CUPS_DELETE_CLASS,
|
|
CUPS_ACCEPT_JOBS,
|
|
CUPS_REJECT_JOBS,
|
|
CUPS_SET_DEFAULT,
|
|
CUPS_GET_DEVICES,
|
|
CUPS_GET_PPDS,
|
|
CUPS_MOVE_JOB,
|
|
CUPS_ADD_DEVICE,
|
|
CUPS_DELETE_DEVICE
|
|
);
|
|
|
|
Pipp_uchar_t=^ipp_uchar_t;
|
|
ipp_uchar_t = byte; //Unsigned 8-bit integer/character
|
|
|
|
//Request Header
|
|
ipp_request_t = record
|
|
case longint of
|
|
0 : (any : record //Any Header
|
|
version : array[0..1] of ipp_uchar_t; //Protocol version number
|
|
op_status : longint; //Operation ID or status code
|
|
request_id : longint; //Request ID
|
|
end);
|
|
1 : (op : record //Operation ID
|
|
version : array[0..1] of ipp_uchar_t; //Protocol version number
|
|
operation_id : ipp_op_t; //Operation ID
|
|
request_id : longint; //Request ID
|
|
end);
|
|
2 : (status : record //Status Header
|
|
version:array[0..1] of ipp_uchar_t;//Protocol version number
|
|
status_code : ipp_status_t; //Status code
|
|
request_id : longint; //Request ID
|
|
end);
|
|
end;
|
|
|
|
|
|
//Attribute Value
|
|
ipp_value_t = record
|
|
case longint of
|
|
0 : ( aInteger : longint ); //Integer/enumerated value
|
|
1 : ( aBoolean : char ); //Boolean value
|
|
2 : ( aDate : array[0..10] of ipp_uchar_t ); //Date/time value
|
|
3 : ( resolution : record //Resolution value
|
|
xres : longint; //Horizontal resolution
|
|
yres : longint; //Vertical resolution
|
|
units : ipp_res_t; //Resolution units
|
|
end );
|
|
4 : ( range : record //Range of integers value
|
|
lower : longint; //Lower value
|
|
upper : longint; //Upper value
|
|
end );
|
|
5 : ( _string : record //String with language value
|
|
charset: Pchar; //Character set
|
|
text : Pchar; //String
|
|
end );
|
|
6 : ( unknown : record //Unknown attribute type
|
|
length : longint; //Length of attribute
|
|
data : pointer; //Data in attribute
|
|
end );
|
|
end;
|
|
Pipp_value_t = ^ipp_value_t;
|
|
|
|
|
|
//Attribute
|
|
Pipp_attribute_s=^ipp_attribute_s;
|
|
ipp_attribute_s = record
|
|
next : Pipp_attribute_s; //Next attribute in list
|
|
group_tag : ipp_tag_t; //Job/Printer/Operation group tag
|
|
value_tag : ipp_tag_t; //What type of value is it?
|
|
name : Pchar; //Name of attribute
|
|
num_values: longint; //Number of values
|
|
values : array[0..0] of ipp_value_t; //Values
|
|
end;
|
|
ipp_attribute_t = ipp_attribute_s;
|
|
Pipp_attribute_t=^ipp_attribute_t;
|
|
|
|
//Request State
|
|
Pipp_t=^ipp_t;
|
|
ipp_t = record
|
|
state : ipp_state_t; //State of request
|
|
request : ipp_request_t; //Request header
|
|
attrs : Pipp_attribute_t; //Attributes
|
|
last : Pipp_attribute_t; //Last attribute in list
|
|
current : Pipp_attribute_t; //Current attribute (for read/write)
|
|
curtag : ipp_tag_t; //Current attribute group tag
|
|
end;
|
|
|
|
//
|
|
//
|
|
//
|
|
//
|
|
const
|
|
MaxcupsLibs=2;
|
|
cupsLibs :Array[0..MaxcupsLibs] of string = ('libcups.so',
|
|
'libcups.so.2',
|
|
'/usr/lib/libcups.dylib');
|
|
|
|
const
|
|
CUPS_VERSION = 1.0119;
|
|
CUPS_VERSION_MAJOR = 1;
|
|
CUPS_VERSION_MINOR = 1;
|
|
CUPS_VERSION_PATCH = 19;
|
|
CUPS_DATE_ANY = -(1);
|
|
|
|
//**** Printer Type/Capability Bits ********
|
|
//not a typedef'd enum so we can OR
|
|
CUPS_PRINTER_LOCAL = $0000; // Local printer or class
|
|
CUPS_PRINTER_CLASS = $0001; // Printer class
|
|
CUPS_PRINTER_REMOTE = $0002; // Remote printer or class
|
|
CUPS_PRINTER_BW = $0004; // Can do B&W printing
|
|
CUPS_PRINTER_COLOR = $0008; // Can do color printing
|
|
CUPS_PRINTER_DUPLEX = $0010; // Can do duplexing
|
|
CUPS_PRINTER_STAPLE = $0020; // Can staple output
|
|
CUPS_PRINTER_COPIES = $0040; // Can do copies
|
|
CUPS_PRINTER_COLLATE = $0080; // Can collage copies
|
|
CUPS_PRINTER_PUNCH = $0100; // Can punch output
|
|
CUPS_PRINTER_COVER = $0200; // Can cover output
|
|
CUPS_PRINTER_BIND = $0400; // Can bind output
|
|
CUPS_PRINTER_SORT = $0800; // Can sort output
|
|
CUPS_PRINTER_SMALL = $1000; // Can do Letter/Legal/A4
|
|
CUPS_PRINTER_MEDIUM = $2000; // Can do Tabloid/B/C/A3/A2
|
|
CUPS_PRINTER_LARGE = $4000; // Can do D/E/A1/A0
|
|
CUPS_PRINTER_VARIABLE = $8000; // Can do variable sizes
|
|
CUPS_PRINTER_IMPLICIT = $10000; // Implicit class
|
|
CUPS_PRINTER_DEFAULT = $20000; // Default printer on network
|
|
CUPS_PRINTER_OPTIONS = $FFFC; // ~(CLASS | REMOTE | IMPLICIT)
|
|
|
|
type
|
|
PPPChar = ^PPChar;
|
|
cups_ptype_t = dword; //See bit flags consts
|
|
TFunctionWithParam1 = function (_para1:Pchar):Pchar;
|
|
|
|
//Printer Options
|
|
Pcups_option_t= ^cups_option_t;
|
|
PPcups_option_t=^Pcups_option_t;
|
|
cups_option_t = record
|
|
name : PChar; //Name of option
|
|
value : PChar; //Value of option
|
|
end;
|
|
|
|
//Destination
|
|
Pcups_dest_t=^cups_dest_t;
|
|
PPcups_dest_t=^Pcups_dest_t;
|
|
cups_dest_t = record
|
|
name : PChar; //Printer or class name
|
|
instance : PChar; //Local instance name or NULL
|
|
is_default : Longint; //Is this printer the default?
|
|
num_options: Longint; //Number of options
|
|
options : Pcups_option_t; //Options
|
|
end;
|
|
//Job
|
|
Pcups_job_t=^cups_job_t;
|
|
PPcups_job_t=^Pcups_job_t;
|
|
cups_job_t = record
|
|
id : longint; //The job ID
|
|
dest : Pchar; //Printer or class name
|
|
title : Pchar; //Title/job name
|
|
user : Pchar; //User the submitted the job
|
|
format : Pchar; //Document format
|
|
state : ipp_jstate_t; //Job state
|
|
size : longint; //Size in kilobytes
|
|
priority : longint; //Priority (1-100)
|
|
completed_time : time_t; //Time the job was completed
|
|
creation_time : time_t; //Time the job was created
|
|
processing_time : time_t; //Time the job was processed
|
|
end;
|
|
|
|
|
|
var
|
|
//
|
|
//cups_language.pp
|
|
//
|
|
cupsLangEncoding: function (lang:Pcups_lang_t):Pchar;cdecl;
|
|
cupsLangFlush: procedure; cdecl;
|
|
cupsLangFree: procedure (lang:Pcups_lang_t);cdecl;
|
|
cupsLangGet: function (language:Pchar):Pcups_lang_t;cdecl;
|
|
//
|
|
//cups_http.pp
|
|
//
|
|
httpCheck: function (http:Phttp_t):longint;cdecl;
|
|
httpClose: procedure (http_t :Phttp_t); cdecl;
|
|
httpConnect: function (host:Pchar; port:longint):Phttp_t;cdecl;
|
|
httpConnectEncrypt: function (host:Pchar; port:longint; encrypt:http_encryption_t):Phttp_t;cdecl;
|
|
httpDelete: function (http:Phttp_t; uri:Pchar):longint;cdecl;
|
|
httpEncryption: function (http:Phttp_t; e:http_encryption_t):longint;cdecl;
|
|
httpError: function (http : longint) : longint; cdecl;
|
|
httpFlush: procedure (http:Phttp_t);cdecl;
|
|
httpGet: function (http:Phttp_t; uri:Pchar):longint;cdecl;
|
|
httpGets: function (line:Pchar; length:longint; http:Phttp_t):Pchar;cdecl;
|
|
httpGetDateString: function (t:time_t):Pchar;cdecl;
|
|
httpGetDateTime: function (s:Pchar):time_t;cdecl;
|
|
httpGetField: function (http,field : longint) : longint; cdecl;
|
|
//httpGetHostByName: function (name:Pchar):^hostent;cdecl;
|
|
httpGetSubField: function (http:Phttp_t; field:http_field_t; name:Pchar; value:Pchar):Pchar;cdecl;
|
|
httpHead: function (http:Phttp_t; uri:Pchar):longint;cdecl;
|
|
httpInitialize: procedure ;cdecl;
|
|
httpOptions: function (http:Phttp_t; uri:Pchar):longint;cdecl;
|
|
httpPost: function (http:Phttp_t; uri:Pchar):longint;cdecl;
|
|
httpPut: function (http:Phttp_t; uri:Pchar):longint;cdecl;
|
|
httpRead: function (http:Phttp_t; buffer:Pchar; length:longint):longint;cdecl;
|
|
httpReconnect: function (http:Phttp_t):longint;cdecl;
|
|
httpSeparate: procedure (uri:Pchar; method:Pchar; username:Pchar; host:Pchar; port:Plongint; resource:Pchar);cdecl;
|
|
httpSetField: procedure (http:Phttp_t; field:http_field_t; value:Pchar);cdecl;
|
|
httpStatus: function (status:http_status_t):Pchar;cdecl;
|
|
httpTrace: function (http:Phttp_t; uri:Pchar):longint;cdecl;
|
|
httpUpdate: function (http:Phttp_t):http_status_t;cdecl;
|
|
httpWait: function (http:Phttp_t; msec:longint):longint;cdecl;
|
|
httpWrite: function (http:Phttp_t; buffer:Pchar; length:longint):longint;cdecl;
|
|
//httpEncode64: function (out:Pchar; in:Pchar):Pchar;cdecl;
|
|
//httpDecode64: function (out:Pchar; in:Pchar):Pchar;cdecl;
|
|
httpGetLength: function (http:Phttp_t):longint;cdecl;
|
|
httpMD5: function (_para1:Pchar; _para2:Pchar; _para3:Pchar; {%H-}_para4:TArrayChar32):Pchar;cdecl;
|
|
httpMD5Final: function (_para1:Pchar; _para2:Pchar; _para3:Pchar; {%H-}_para4:TArrayChar32):Pchar;cdecl;
|
|
httpMD5String: function (_para1:Pmd5_byte_t; {%H-}_para2:TArrayChar32):Pchar;cdecl;
|
|
|
|
//
|
|
// cups_ppd
|
|
//
|
|
ppdClose: procedure (ppd:Pppd_file_t);cdecl;
|
|
ppdCollect: function (ppd:Pppd_file_t; section:ppd_section_t; choices:PPPppd_choice_t):longint;cdecl;
|
|
ppdConflicts: function (ppd:Pppd_file_t):longint;cdecl;
|
|
ppdEmit: function (ppd:Pppd_file_t; fp:PFILE; section:ppd_section_t):longint;cdecl;
|
|
ppdEmitFd: function (ppd:Pppd_file_t; fd:longint; section:ppd_section_t):longint;cdecl;
|
|
ppdEmitJCL: function (ppd:Pppd_file_t; fp:PFILE; job_id:longint; user:Pchar; title:Pchar):longint;cdecl;
|
|
ppdFindChoice: function (o:Pppd_option_t; option:Pchar):Pppd_choice_t;cdecl;
|
|
ppdFindMarkedChoice: function (ppd:Pppd_file_t; keyword:Pchar):Pppd_choice_t;cdecl;
|
|
ppdFindOption: function (ppd:Pppd_file_t; keyword:Pchar):Pppd_option_t;cdecl;
|
|
ppdIsMarked: function (ppd:Pppd_file_t; keyword:Pchar; option:Pchar):longint;cdecl;
|
|
ppdMarkDefaults: procedure (ppd:Pppd_file_t);cdecl;
|
|
ppdMarkOption: function (ppd:Pppd_file_t; keyword:Pchar; option:Pchar):longint;cdecl;
|
|
ppdOpen: function (fp:PFILE):Pppd_file_t;cdecl;
|
|
ppdOpenFd: function (fd:longint):Pppd_file_t;cdecl;
|
|
ppdOpenFile: function (filename:Pchar):Pppd_file_t;cdecl;
|
|
ppdPageLength: function (ppd:Pppd_file_t; name:Pchar):single;cdecl;
|
|
ppdPageSize: function (ppd:Pppd_file_t; name:Pchar):Pppd_size_t;cdecl;
|
|
ppdPageWidth: function (ppd:Pppd_file_t; name:Pchar):single;cdecl;
|
|
{New in CUPS 1.1.19}
|
|
ppdErrorString: function (status:ppd_status_t):Pchar;cdecl;
|
|
ppdFindAttr: function (ppd:Pppd_file_t; name:Pchar; spec:Pchar):Pchar;cdecl;
|
|
ppdFindNextAttr: function (ppd:Pppd_file_t; name:Pchar; spec:Pchar):Pchar;cdecl;
|
|
ppdLastError: function (line:Plongint):ppd_status_t;cdecl;
|
|
|
|
//
|
|
// cups_ipp
|
|
//
|
|
ippAddBoolean: function (ipp:Pipp_t; group:ipp_tag_t; name:Pchar; value:char):Pipp_attribute_t;cdecl;
|
|
ippAddBooleans: function (ipp:Pipp_t; group:ipp_tag_t; name:Pchar; num_values:longint; values:Pchar):Pipp_attribute_t;cdecl;
|
|
ippAddDate: function (ipp:Pipp_t; group:ipp_tag_t; name:Pchar; value:Pipp_uchar_t):Pipp_attribute_t;cdecl;
|
|
ippAddInteger: function (ipp:Pipp_t; group:ipp_tag_t; _type:ipp_tag_t; name:Pchar; value:longint):Pipp_attribute_t;cdecl;
|
|
ippAddIntegers: function (ipp:Pipp_t; group:ipp_tag_t; _type:ipp_tag_t; name:Pchar; num_values:longint;
|
|
values:Plongint):Pipp_attribute_t;cdecl;
|
|
ippAddRange: function (ipp:Pipp_t; group:ipp_tag_t; name:Pchar; lower:longint; upper:longint):Pipp_attribute_t;cdecl;
|
|
ippAddRanges: function (ipp:Pipp_t; group:ipp_tag_t; name:Pchar; num_values:longint; lower:Plongint;
|
|
upper:Plongint):Pipp_attribute_t;cdecl;
|
|
ippAddResolution: function (ipp:Pipp_t; group:ipp_tag_t; name:Pchar; units:ipp_res_t; xres:longint;
|
|
yres:longint):Pipp_attribute_t;cdecl;
|
|
ippAddResolutions: function (ipp:Pipp_t; group:ipp_tag_t; name:Pchar; num_values:longint; units:ipp_res_t;
|
|
xres:Plongint; yres:Plongint):Pipp_attribute_t;cdecl;
|
|
ippAddSeparator: function (ipp:Pipp_t):Pipp_attribute_t;cdecl;
|
|
ippAddString: function (ipp:Pipp_t; group:ipp_tag_t; _type:ipp_tag_t; name:Pchar; charset:Pchar;
|
|
value:Pchar):Pipp_attribute_t;cdecl;
|
|
ippAddStrings: function (ipp:Pipp_t; group:ipp_tag_t; _type:ipp_tag_t; name:Pchar; num_values:longint;
|
|
charset:Pchar; values:PPchar):Pipp_attribute_t;cdecl;
|
|
ippDateToTime: function (date:Pipp_uchar_t):time_t;cdecl;
|
|
ippDelete: procedure (ipp:Pipp_t);cdecl;
|
|
ippErrorString: function (error:ipp_status_t):Pchar;cdecl;
|
|
ippFindAttribute: function (ipp:Pipp_t; name:Pchar; _type:ipp_tag_t):Pipp_attribute_t;cdecl;
|
|
ippFindNextAttribute: function (ipp:Pipp_t; name:Pchar; _type:ipp_tag_t):Pipp_attribute_t;cdecl;
|
|
ippLength: function (ipp:Pipp_t):size_t;cdecl;
|
|
ippNew: function :Pipp_t;cdecl;
|
|
ippRead: function (http:Phttp_t; ipp:Pipp_t):ipp_state_t;cdecl;
|
|
ippTimeToDate: function (t:time_t):Pipp_uchar_t;cdecl;
|
|
ippWrite: function (http:Phttp_t; ipp:Pipp_t):ipp_state_t;cdecl;
|
|
ippPort: function :longint;cdecl;
|
|
ippSetPort: procedure (p:longint);cdecl;
|
|
_ipp_add_attr: function (_para1:Pipp_t; _para2:longint):Pipp_attribute_t;cdecl;
|
|
_ipp_free_attr: procedure (_para1:Pipp_attribute_t);cdecl;
|
|
|
|
//
|
|
//cups.pp
|
|
//
|
|
cupsServer: function :Pchar;cdecl;
|
|
cupsGetDefault:function :PChar; cdecl;
|
|
cupsGetPPD:function (printer :Pchar): PChar;cdecl;
|
|
cupsLastError:function : ipp_status_t; cdecl;
|
|
cupsGetPrinters:function (printers :PPPchar):longint;cdecl;
|
|
cupsDoFileRequest:function (http:Phttp_t; request:Pipp_t; const resource:Pchar; const filename:Pchar):Pipp_t;cdecl;
|
|
cupsCancelJob:function (printer:Pchar; job:longint):longint;cdecl;
|
|
cupsEncryption:function :http_encryption_t;cdecl;
|
|
cupsFreeJobs:procedure (num_jobs:longint; jobs:Pcups_job_t);cdecl;
|
|
cupsGetClasses:function (classes:PPPchar):longint;cdecl;
|
|
cupsGetJobs:function (jobs:PPcups_job_t; dest:Pchar; myjobs:longint; completed:longint):longint;cdecl;
|
|
cupsPrintFile:function (printer:Pchar; filename:Pchar; title:Pchar;
|
|
num_options:longint; options:Pcups_option_t):longint;cdecl;
|
|
cupsPrintFiles:function (printer:Pchar; num_files:longint; files:PPchar;
|
|
title:Pchar; num_options:longint; options:Pcups_option_t):longint;cdecl;
|
|
cupsTempFile:function (filename:Pchar; len:longint):Pchar;cdecl;
|
|
cupsTempFd:function (filename:Pchar; len:longint):longint;cdecl;
|
|
cupsAddDest:function (name:Pchar; instance:Pchar; num_dests:longint;
|
|
dests:PPcups_dest_t):longint;cdecl;
|
|
cupsFreeDests:procedure (num_dests:longint; dests:Pcups_dest_t);cdecl;
|
|
cupsGetDest:function (name:Pchar; instance:Pchar;
|
|
num_dests:longint; dests:Pcups_dest_t):Pcups_dest_t;cdecl;
|
|
cupsGetDests:function (dests:PPcups_dest_t):longint;cdecl;
|
|
cupsSetDests:procedure (num_dests:longint; dests:Pcups_dest_t);cdecl;
|
|
cupsAddOption:function (name:Pchar; value:Pchar; num_options:longint; options:PPcups_option_t):longint;cdecl;
|
|
cupsEncodeOptions:procedure (ipp:Pipp_t; num_options:longint; options:Pcups_option_t);cdecl;
|
|
cupsFreeOptions:procedure (num_options:longint; options:Pcups_option_t);cdecl;
|
|
cupsGetOption:function (name:Pchar; num_options:longint; options:Pcups_option_t):Pchar;cdecl;
|
|
cupsParseOptions:function (arg:Pchar; num_options:longint; options:PPcups_option_t):longint;cdecl;
|
|
cupsMarkOptions:function (ppd:Pppd_file_t; num_options:longint; options:Pcups_option_t):longint;cdecl;
|
|
cupsGetPassword:function (prompt:Pchar):Pchar;cdecl;
|
|
cupsSetEncryption:procedure (e:http_encryption_t);cdecl;
|
|
cupsSetPasswordCB:procedure (cb: TFunctionWithParam1);cdecl;
|
|
cupsSetServer:procedure (server:Pchar);cdecl;
|
|
cupsSetUser:procedure (user:Pchar);cdecl;
|
|
cupsUser:function :Pchar;cdecl;
|
|
|
|
function cupsDoRequest(ahttp :Phttp_t; aRequest :Pipp_t; aResource :PChar) : Pipp_t;
|
|
function cupsLangDefault : Pcups_lang_t;
|
|
|
|
procedure InitializeCups;
|
|
procedure FinalizeCups;
|
|
|
|
function CUPSLibInstalled : Boolean;
|
|
|
|
var
|
|
CupsLibHandle: TLibHandle;
|
|
|
|
implementation
|
|
|
|
var RefCount : integer;
|
|
|
|
procedure InitializeCups;
|
|
var i : integer;
|
|
begin
|
|
inc(RefCount);
|
|
//debugln('InitializeCups RefCount=',dbgs(RefCount));
|
|
if RefCount = 1 then
|
|
begin
|
|
for i:=0 to MaxcupsLibs do
|
|
begin
|
|
CupsLibHandle := loadlibrary(cupslibs[i]);
|
|
if CupsLibHandle <> nilhandle then
|
|
Break;
|
|
end;
|
|
|
|
if CupsLibHandle = nilhandle then
|
|
begin
|
|
//debugln('InitializeCups load cups lib failed');
|
|
RefCount := 0;
|
|
raise EInOutError.Create('Can not load cups library');
|
|
end;
|
|
end;
|
|
|
|
//WriteLn('CupsLibHandle=', CupsLibHandle);
|
|
|
|
//
|
|
//cups_language.pp
|
|
//
|
|
pointer(cupsLangEncoding) := GetProcedureAddress(CupsLibHandle, 'cupsLangEncoding');
|
|
pointer(cupsLangFlush) := GetProcedureAddress(CupsLibHandle, 'cupsLangFlush');
|
|
pointer(cupsLangFree) := GetProcedureAddress(CupsLibHandle, 'cupsLangFree');
|
|
pointer(cupsLangGet) := GetProcedureAddress(CupsLibHandle, 'cupsLangGet');
|
|
|
|
//
|
|
// cups_http.pp
|
|
//
|
|
pointer(httpCheck) := GetProcedureAddress(CupsLibHandle, 'httpCheck');
|
|
pointer(httpClose) := GetProcedureAddress(CupsLibHandle, 'httpClose');
|
|
pointer(httpConnect) := GetProcedureAddress(CupsLibHandle, 'httpConnect');
|
|
pointer(httpConnectEncrypt) := GetProcedureAddress(CupsLibHandle, 'httpConnectEncrypt');
|
|
pointer(httpDelete) := GetProcedureAddress(CupsLibHandle, 'httpDelete');
|
|
pointer(httpEncryption) := GetProcedureAddress(CupsLibHandle, 'httpEncryption');
|
|
pointer(httpError) := GetProcedureAddress(CupsLibHandle, 'httpError');
|
|
pointer(httpFlush) := GetProcedureAddress(CupsLibHandle, 'httpFlush');
|
|
pointer(httpGet) := GetProcedureAddress(CupsLibHandle, 'httpGet');
|
|
pointer(httpGets) := GetProcedureAddress(CupsLibHandle, 'httpGets');
|
|
pointer(httpGetDateString) := GetProcedureAddress(CupsLibHandle, 'httpGetDateString');
|
|
pointer(httpGetDateTime) := GetProcedureAddress(CupsLibHandle, 'httpGetDateTime');
|
|
pointer(httpGetField) := GetProcedureAddress(CupsLibHandle, 'httpGetField');
|
|
//pointer(httpGetHostByName) := GetProcedureAddress(CupsLibHandle, 'httpGetHostByName');
|
|
pointer(httpGetSubField) := GetProcedureAddress(CupsLibHandle, 'httpGetSubField');
|
|
pointer(httpHead) := GetProcedureAddress(CupsLibHandle, 'httpHead');
|
|
pointer(httpInitialize) := GetProcedureAddress(CupsLibHandle, 'httpInitialize');
|
|
pointer(httpOptions) := GetProcedureAddress(CupsLibHandle, 'httpOptions');
|
|
pointer(httpPost) := GetProcedureAddress(CupsLibHandle, 'httpPost');
|
|
pointer(httpPut) := GetProcedureAddress(CupsLibHandle, 'httpPut');
|
|
pointer(httpRead) := GetProcedureAddress(CupsLibHandle, 'httpRead');
|
|
pointer(httpReconnect) := GetProcedureAddress(CupsLibHandle, 'httpReconnect');
|
|
pointer(httpSeparate) := GetProcedureAddress(CupsLibHandle, 'httpSeparate');
|
|
pointer(httpSetField) := GetProcedureAddress(CupsLibHandle, 'httpSetField');
|
|
pointer(httpStatus) := GetProcedureAddress(CupsLibHandle, 'httpStatus');
|
|
pointer(httpTrace) := GetProcedureAddress(CupsLibHandle, 'httpTrace');
|
|
pointer(httpUpdate) := GetProcedureAddress(CupsLibHandle, 'httpUpdate');
|
|
pointer(httpWait) := GetProcedureAddress(CupsLibHandle, 'httpWait');
|
|
pointer(httpWrite) := GetProcedureAddress(CupsLibHandle, 'httpWrite');
|
|
//pointer(httpEncode64) := GetProcedureAddress(CupsLibHandle, 'httpEncode64');
|
|
//pointer(httpDecode64) := GetProcedureAddress(CupsLibHandle, 'httpDecode64');
|
|
pointer(httpGetLength) := GetProcedureAddress(CupsLibHandle, 'httpGetLength');
|
|
pointer(httpMD5) := GetProcedureAddress(CupsLibHandle, 'httpMD5');
|
|
pointer(httpMD5Final) := GetProcedureAddress(CupsLibHandle, 'httpMD5Final');
|
|
pointer(httpMD5String) := GetProcedureAddress(CupsLibHandle, 'httpMD5String');
|
|
|
|
//
|
|
// cups_ppd
|
|
//
|
|
pointer(ppdClose) := GetProcedureAddress(CupsLibHandle, 'ppdClose');
|
|
pointer(ppdCollect) := GetProcedureAddress(CupsLibHandle, 'ppdCollect');
|
|
pointer(ppdConflicts) := GetProcedureAddress(CupsLibHandle, 'ppdConflicts');
|
|
pointer(ppdEmit) := GetProcedureAddress(CupsLibHandle, 'ppdEmit');
|
|
pointer(ppdEmitFd) := GetProcedureAddress(CupsLibHandle, 'ppdEmitFd');
|
|
pointer(ppdEmitJCL) := GetProcedureAddress(CupsLibHandle, 'ppdEmitJCL');
|
|
pointer(ppdFindChoice) := GetProcedureAddress(CupsLibHandle, 'ppdFindChoice');
|
|
pointer(ppdFindMarkedChoice) := GetProcedureAddress(CupsLibHandle, 'ppdFindMarkedChoice');
|
|
pointer(ppdFindOption) := GetProcedureAddress(CupsLibHandle, 'ppdFindOption');
|
|
pointer(ppdIsMarked) := GetProcedureAddress(CupsLibHandle, 'ppdIsMarked');
|
|
pointer(ppdMarkDefaults) := GetProcedureAddress(CupsLibHandle, 'ppdMarkDefaults');
|
|
pointer(ppdMarkOption) := GetProcedureAddress(CupsLibHandle, 'ppdMarkOption');
|
|
pointer(ppdOpen) := GetProcedureAddress(CupsLibHandle, 'ppdOpen');
|
|
pointer(ppdOpenFd) := GetProcedureAddress(CupsLibHandle, 'ppdOpenFd');
|
|
pointer(ppdOpenFile) := GetProcedureAddress(CupsLibHandle, 'ppdOpenFile');
|
|
pointer(ppdPageLength) := GetProcedureAddress(CupsLibHandle, 'ppdPageLength');
|
|
pointer(ppdPageSize) := GetProcedureAddress(CupsLibHandle, 'ppdPageSize');
|
|
pointer(ppdPageWidth) := GetProcedureAddress(CupsLibHandle, 'ppdPageWidth');
|
|
{New in CUPS 1.1.19}
|
|
pointer(ppdErrorString) := GetProcedureAddress(CupsLibHandle, 'ppdErrorString');
|
|
pointer(ppdFindAttr) := GetProcedureAddress(CupsLibHandle, 'ppdFindAttr');
|
|
pointer(ppdFindNextAttr) := GetProcedureAddress(CupsLibHandle, 'ppdFindNextAttr');
|
|
pointer(ppdLastError) := GetProcedureAddress(CupsLibHandle, 'ppdLastError');
|
|
|
|
//
|
|
// cups_ipp
|
|
//
|
|
pointer(ippAddBoolean) := GetProcedureAddress(CupsLibHandle, 'ippAddBoolean');
|
|
pointer(ippAddBooleans) := GetProcedureAddress(CupsLibHandle, 'ippAddBooleans');
|
|
pointer(ippAddDate) := GetProcedureAddress(CupsLibHandle, 'ippAddDate');
|
|
pointer(ippAddInteger) := GetProcedureAddress(CupsLibHandle, 'ippAddInteger');
|
|
pointer(ippAddIntegers) := GetProcedureAddress(CupsLibHandle, 'ippAddIntegers');
|
|
pointer(ippAddRange) := GetProcedureAddress(CupsLibHandle, 'ippAddRange');
|
|
pointer(ippAddRanges) := GetProcedureAddress(CupsLibHandle, 'ippAddRanges');
|
|
pointer(ippAddResolution) := GetProcedureAddress(CupsLibHandle, 'ippAddResolution');
|
|
pointer(ippAddResolutions) := GetProcedureAddress(CupsLibHandle, 'ippAddResolutions');
|
|
pointer(ippAddSeparator) := GetProcedureAddress(CupsLibHandle, 'ippAddSeparator');
|
|
pointer(ippAddString) := GetProcedureAddress(CupsLibHandle, 'ippAddString');
|
|
pointer(ippAddStrings) := GetProcedureAddress(CupsLibHandle, 'ippAddStrings');
|
|
pointer(ippDateToTime) := GetProcedureAddress(CupsLibHandle, 'ippDateToTime');
|
|
pointer(ippDelete) := GetProcedureAddress(CupsLibHandle, 'ippDelete');
|
|
pointer(ippErrorString) := GetProcedureAddress(CupsLibHandle, 'ippErrorString');
|
|
pointer(ippFindAttribute) := GetProcedureAddress(CupsLibHandle, 'ippFindAttribute');
|
|
pointer(ippFindNextAttribute) := GetProcedureAddress(CupsLibHandle, 'ippFindNextAttribute');
|
|
pointer(ippLength) := GetProcedureAddress(CupsLibHandle, 'ippLength');
|
|
pointer(ippNew) := GetProcedureAddress(CupsLibHandle, 'ippNew');
|
|
pointer(ippRead) := GetProcedureAddress(CupsLibHandle, 'ippRead');
|
|
pointer(ippTimeToDate) := GetProcedureAddress(CupsLibHandle, 'ippTimeToDate');
|
|
pointer(ippWrite) := GetProcedureAddress(CupsLibHandle, 'ippWrite');
|
|
pointer(ippPort) := GetProcedureAddress(CupsLibHandle, 'ippPort');
|
|
pointer(ippSetPort) := GetProcedureAddress(CupsLibHandle, 'ippSetPort');
|
|
pointer(_ipp_add_attr) := GetProcedureAddress(CupsLibHandle, '_ipp_add_attr');
|
|
pointer(_ipp_free_attr) := GetProcedureAddress(CupsLibHandle, '_ipp_free_attr');
|
|
|
|
//
|
|
// cups.pp
|
|
//
|
|
pointer(cupsServer) := GetProcedureAddress(CupsLibHandle, 'cupsServer');
|
|
pointer(cupsGetDefault) := GetProcedureAddress(CupsLibHandle, 'cupsGetDefault');
|
|
pointer(cupsGetPPD) := GetProcedureAddress(CupsLibHandle, 'cupsGetPPD');
|
|
pointer(cupsLastError) := GetProcedureAddress(CupsLibHandle, 'cupsLastError');
|
|
pointer(cupsGetPrinters) := GetProcedureAddress(CupsLibHandle, 'cupsGetPrinters');
|
|
pointer(cupsDoFileRequest) := GetProcedureAddress(CupsLibHandle, 'cupsDoFileRequest');
|
|
pointer(cupsCancelJob) := GetProcedureAddress(CupsLibHandle, 'cupsCancelJob');
|
|
pointer(cupsEncryption) := GetProcedureAddress(CupsLibHandle, 'cupsEncryption');
|
|
pointer(cupsFreeJobs) := GetProcedureAddress(CupsLibHandle, 'cupsFreeJobs');
|
|
pointer(cupsGetClasses) := GetProcedureAddress(CupsLibHandle, 'cupsGetClasses');
|
|
pointer(cupsGetJobs) := GetProcedureAddress(CupsLibHandle, 'cupsGetJobs');
|
|
pointer(cupsPrintFile) := GetProcedureAddress(CupsLibHandle, 'cupsPrintFile');
|
|
pointer(cupsPrintFiles) := GetProcedureAddress(CupsLibHandle, 'cupsPrintFiles');
|
|
pointer(cupsTempFile) := GetProcedureAddress(CupsLibHandle, 'cupsTempFile');
|
|
pointer(cupsTempFd) := GetProcedureAddress(CupsLibHandle, 'cupsTempFd');
|
|
pointer(cupsAddDest) := GetProcedureAddress(CupsLibHandle, 'cupsAddDest');
|
|
pointer(cupsFreeDests) := GetProcedureAddress(CupsLibHandle, 'cupsFreeDests');
|
|
pointer(cupsGetDest) := GetProcedureAddress(CupsLibHandle, 'cupsGetDest');
|
|
pointer(cupsGetDests) := GetProcedureAddress(CupsLibHandle, 'cupsGetDests');
|
|
pointer(cupsSetDests) := GetProcedureAddress(CupsLibHandle, 'cupsSetDests');
|
|
pointer(cupsAddOption) := GetProcedureAddress(CupsLibHandle, 'cupsAddOption');
|
|
pointer(cupsEncodeOptions) := GetProcedureAddress(CupsLibHandle, 'cupsEncodeOptions');
|
|
pointer(cupsFreeOptions) := GetProcedureAddress(CupsLibHandle, 'cupsFreeOptions');
|
|
pointer(cupsGetOption) := GetProcedureAddress(CupsLibHandle, 'cupsGetOption');
|
|
pointer(cupsParseOptions) := GetProcedureAddress(CupsLibHandle, 'cupsParseOptions');
|
|
pointer(cupsMarkOptions) := GetProcedureAddress(CupsLibHandle, 'cupsMarkOptions');
|
|
pointer(cupsGetPassword) := GetProcedureAddress(CupsLibHandle, 'cupsGetPassword');
|
|
pointer(cupsSetEncryption) := GetProcedureAddress(CupsLibHandle, 'cupsSetEncryption');
|
|
pointer(cupsSetPasswordCB) := GetProcedureAddress(CupsLibHandle, 'cupsSetPasswordCB');
|
|
pointer(cupsSetServer) := GetProcedureAddress(CupsLibHandle, 'cupsSetServer');
|
|
pointer(cupsSetUser) := GetProcedureAddress(CupsLibHandle, 'cupsSetUser');
|
|
pointer(cupsUser) := GetProcedureAddress(CupsLibHandle, 'cupsUser');
|
|
|
|
end;
|
|
|
|
//Return true if CUPS lib can be loaded and
|
|
//initilized.
|
|
function CUPSLibInstalled : Boolean;
|
|
begin
|
|
Result:=False;
|
|
if RefCount=0 then begin
|
|
Try
|
|
//debugln('CUPSLibInstalled A');
|
|
InitializeCups;
|
|
Except
|
|
exit;
|
|
end;
|
|
end;
|
|
Result:=(RefCount>0);
|
|
end;
|
|
|
|
procedure FinalizeCups;
|
|
begin
|
|
//debugln('* FinalizeCups');
|
|
if RefCount>0 then
|
|
Dec(RefCount);
|
|
|
|
if RefCount=0 then
|
|
begin
|
|
if (CupsLibHandle<>NilHandle) and not UnloadLibrary(CupsLibHandle) then
|
|
Inc(RefCount)
|
|
else
|
|
CupsLibHandle := NilHandle;
|
|
end;
|
|
end;
|
|
|
|
function cupsLangDefault : Pcups_lang_t;
|
|
begin
|
|
Result:=cupsLangGet('');
|
|
end;
|
|
|
|
function cupsDoRequest(ahttp :Phttp_t; aRequest :Pipp_t;
|
|
aResource :PChar):Pipp_t;
|
|
begin
|
|
Result:=cupsDoFileRequest(aHttp,aRequest,aResource,nil);
|
|
end;
|
|
|
|
INITIALIZATION
|
|
CupsLibHandle:= NilHandle;
|
|
|
|
end.
|
|
|