{ ***************************************************************************** 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.