4 * Printing utilities for the Common UNIX Printing System (CUPS).
6 * Copyright 1997-2006 by Easy Software Products.
8 * These coded instructions, statements, and computer programs are the
9 * property of Easy Software Products and are protected by Federal
10 * copyright law. Distribution and use rights are outlined in the file
11 * "LICENSE.txt" which should have been included with this file. If this
12 * file is missing or damaged please contact Easy Software Products
15 * Attn: CUPS Licensing Information
16 * Easy Software Products
17 * 44141 Airport View Drive, Suite 204
18 * Hollywood, Maryland 20636 USA
20 * Voice: (301) 373-9603
21 * EMail: cups-info@cups.org
22 * WWW: http://www.cups.org/
29 * Include necessary headers...
32 #include <cups/string.h>
35 #include "ext/standard/info.h"
40 * PHP function list...
43 function_entry phpcups_functions
[] =
45 PHP_FE(cups_cancel_job
, NULL
)
46 PHP_FE(cups_get_dests
, NULL
)
47 PHP_FE(cups_get_jobs
, NULL
)
48 PHP_FE(cups_last_error
, NULL
)
49 PHP_FE(cups_last_error_string
, NULL
)
50 PHP_FE(cups_print_file
, NULL
)
51 PHP_FE(cups_print_files
, NULL
)
60 zend_module_entry phpcups_module_entry
=
62 STANDARD_MODULE_HEADER
,
71 STANDARD_MODULE_PROPERTIES
75 ZEND_GET_MODULE(phpcups
)
79 * 'cups_convert_options()' - Convert a PHP options array to a CUPS options array.
82 static int /* O - Number of options */
84 zval
*optionsobj
, /* I - Options array object */
85 cups_option_t
**options
) /* O - Options */
87 int num_options
; /* Number of options */
88 HashTable
*ht
; /* Option array hash table */
89 Bucket
*current
; /* Current element in array */
92 ht
= Z_ARRVAL_P(optionsobj
);
95 for (current
= ht
->pListHead
; current
; current
= current
->pListNext
)
96 num_options
= cupsAddOption(current
->arKey
,
97 Z_STRVAL_P(((zval
*)current
->pDataPtr
)),
98 num_options
, options
);
100 return (num_options
);
105 * 'zm_startup_phpcups()' - Initialize the CUPS module.
108 PHP_MINIT_FUNCTION(phpcups
)
110 REGISTER_LONG_CONSTANT("CUPS_PRINTER_LOCAL", CUPS_PRINTER_LOCAL
, CONST_CS
);
111 REGISTER_LONG_CONSTANT("CUPS_PRINTER_CLASS", CUPS_PRINTER_CLASS
, CONST_CS
);
112 REGISTER_LONG_CONSTANT("CUPS_PRINTER_REMOTE", CUPS_PRINTER_REMOTE
, CONST_CS
);
113 REGISTER_LONG_CONSTANT("CUPS_PRINTER_BW", CUPS_PRINTER_BW
, CONST_CS
);
114 REGISTER_LONG_CONSTANT("CUPS_PRINTER_COLOR", CUPS_PRINTER_COLOR
, CONST_CS
);
115 REGISTER_LONG_CONSTANT("CUPS_PRINTER_DUPLEX", CUPS_PRINTER_DUPLEX
, CONST_CS
);
116 REGISTER_LONG_CONSTANT("CUPS_PRINTER_STAPLE", CUPS_PRINTER_STAPLE
, CONST_CS
);
117 REGISTER_LONG_CONSTANT("CUPS_PRINTER_COPIES", CUPS_PRINTER_COPIES
, CONST_CS
);
118 REGISTER_LONG_CONSTANT("CUPS_PRINTER_COLLATE", CUPS_PRINTER_COLLATE
, CONST_CS
);
119 REGISTER_LONG_CONSTANT("CUPS_PRINTER_PUNCH", CUPS_PRINTER_PUNCH
, CONST_CS
);
120 REGISTER_LONG_CONSTANT("CUPS_PRINTER_COVER", CUPS_PRINTER_COVER
, CONST_CS
);
121 REGISTER_LONG_CONSTANT("CUPS_PRINTER_BIND", CUPS_PRINTER_BIND
, CONST_CS
);
122 REGISTER_LONG_CONSTANT("CUPS_PRINTER_SORT", CUPS_PRINTER_SORT
, CONST_CS
);
123 REGISTER_LONG_CONSTANT("CUPS_PRINTER_SMALL", CUPS_PRINTER_SMALL
, CONST_CS
);
124 REGISTER_LONG_CONSTANT("CUPS_PRINTER_MEDIUM", CUPS_PRINTER_MEDIUM
, CONST_CS
);
125 REGISTER_LONG_CONSTANT("CUPS_PRINTER_LARGE", CUPS_PRINTER_LARGE
, CONST_CS
);
126 REGISTER_LONG_CONSTANT("CUPS_PRINTER_VARIABLE", CUPS_PRINTER_VARIABLE
, CONST_CS
);
127 REGISTER_LONG_CONSTANT("CUPS_PRINTER_IMPLICIT", CUPS_PRINTER_IMPLICIT
, CONST_CS
);
128 REGISTER_LONG_CONSTANT("CUPS_PRINTER_DEFAULT", CUPS_PRINTER_DEFAULT
, CONST_CS
);
129 REGISTER_LONG_CONSTANT("CUPS_PRINTER_FAX", CUPS_PRINTER_FAX
, CONST_CS
);
130 REGISTER_LONG_CONSTANT("CUPS_PRINTER_REJECTING", CUPS_PRINTER_REJECTING
, CONST_CS
);
131 REGISTER_LONG_CONSTANT("CUPS_PRINTER_DELETE", CUPS_PRINTER_DELETE
, CONST_CS
);
132 REGISTER_LONG_CONSTANT("CUPS_PRINTER_NOT_SHARED", CUPS_PRINTER_NOT_SHARED
, CONST_CS
);
133 REGISTER_LONG_CONSTANT("CUPS_PRINTER_AUTHENTICATED", CUPS_PRINTER_AUTHENTICATED
, CONST_CS
);
134 REGISTER_LONG_CONSTANT("CUPS_PRINTER_COMMANDS", CUPS_PRINTER_COMMANDS
, CONST_CS
);
135 REGISTER_LONG_CONSTANT("CUPS_PRINTER_OPTIONS", CUPS_PRINTER_OPTIONS
, CONST_CS
);
137 REGISTER_LONG_CONSTANT("IPP_OK", IPP_OK
, CONST_CS
);
138 REGISTER_LONG_CONSTANT("IPP_OK_SUBST", IPP_OK_SUBST
, CONST_CS
);
139 REGISTER_LONG_CONSTANT("IPP_OK_CONFLICT", IPP_OK_CONFLICT
, CONST_CS
);
140 REGISTER_LONG_CONSTANT("IPP_OK_IGNORED_SUBSCRIPTIONS", IPP_OK_IGNORED_SUBSCRIPTIONS
, CONST_CS
);
141 REGISTER_LONG_CONSTANT("IPP_OK_IGNORED_NOTIFICATIONS", IPP_OK_IGNORED_NOTIFICATIONS
, CONST_CS
);
142 REGISTER_LONG_CONSTANT("IPP_OK_TOO_MANY_EVENTS", IPP_OK_TOO_MANY_EVENTS
, CONST_CS
);
143 REGISTER_LONG_CONSTANT("IPP_OK_BUT_CANCEL_SUBSCRIPTION", IPP_OK_BUT_CANCEL_SUBSCRIPTION
, CONST_CS
);
144 REGISTER_LONG_CONSTANT("IPP_OK_EVENTS_COMPLETE", IPP_OK_EVENTS_COMPLETE
, CONST_CS
);
145 REGISTER_LONG_CONSTANT("IPP_REDIRECTION_OTHER_SITE", IPP_REDIRECTION_OTHER_SITE
, CONST_CS
);
146 REGISTER_LONG_CONSTANT("IPP_BAD_REQUEST", IPP_BAD_REQUEST
, CONST_CS
);
147 REGISTER_LONG_CONSTANT("IPP_FORBIDDEN", IPP_FORBIDDEN
, CONST_CS
);
148 REGISTER_LONG_CONSTANT("IPP_NOT_AUTHENTICATED", IPP_NOT_AUTHENTICATED
, CONST_CS
);
149 REGISTER_LONG_CONSTANT("IPP_NOT_AUTHORIZED", IPP_NOT_AUTHORIZED
, CONST_CS
);
150 REGISTER_LONG_CONSTANT("IPP_NOT_POSSIBLE", IPP_NOT_POSSIBLE
, CONST_CS
);
151 REGISTER_LONG_CONSTANT("IPP_TIMEOUT", IPP_TIMEOUT
, CONST_CS
);
152 REGISTER_LONG_CONSTANT("IPP_NOT_FOUND", IPP_NOT_FOUND
, CONST_CS
);
153 REGISTER_LONG_CONSTANT("IPP_GONE", IPP_GONE
, CONST_CS
);
154 REGISTER_LONG_CONSTANT("IPP_REQUEST_ENTITY", IPP_REQUEST_ENTITY
, CONST_CS
);
155 REGISTER_LONG_CONSTANT("IPP_REQUEST_VALUE", IPP_REQUEST_VALUE
, CONST_CS
);
156 REGISTER_LONG_CONSTANT("IPP_DOCUMENT_FORMAT", IPP_DOCUMENT_FORMAT
, CONST_CS
);
157 REGISTER_LONG_CONSTANT("IPP_ATTRIBUTES", IPP_ATTRIBUTES
, CONST_CS
);
158 REGISTER_LONG_CONSTANT("IPP_URI_SCHEME", IPP_URI_SCHEME
, CONST_CS
);
159 REGISTER_LONG_CONSTANT("IPP_CHARSET", IPP_CHARSET
, CONST_CS
);
160 REGISTER_LONG_CONSTANT("IPP_CONFLICT", IPP_CONFLICT
, CONST_CS
);
161 REGISTER_LONG_CONSTANT("IPP_COMPRESSION_NOT_SUPPORTED", IPP_COMPRESSION_NOT_SUPPORTED
, CONST_CS
);
162 REGISTER_LONG_CONSTANT("IPP_COMPRESSION_ERROR", IPP_COMPRESSION_ERROR
, CONST_CS
);
163 REGISTER_LONG_CONSTANT("IPP_DOCUMENT_FORMAT_ERROR", IPP_DOCUMENT_FORMAT_ERROR
, CONST_CS
);
164 REGISTER_LONG_CONSTANT("IPP_DOCUMENT_ACCESS_ERROR", IPP_DOCUMENT_ACCESS_ERROR
, CONST_CS
);
165 REGISTER_LONG_CONSTANT("IPP_ATTRIBUTES_NOT_SETTABLE", IPP_ATTRIBUTES_NOT_SETTABLE
, CONST_CS
);
166 REGISTER_LONG_CONSTANT("IPP_IGNORED_ALL_SUBSCRIPTIONS", IPP_IGNORED_ALL_SUBSCRIPTIONS
, CONST_CS
);
167 REGISTER_LONG_CONSTANT("IPP_TOO_MANY_SUBSCRIPTIONS", IPP_TOO_MANY_SUBSCRIPTIONS
, CONST_CS
);
168 REGISTER_LONG_CONSTANT("IPP_IGNORED_ALL_NOTIFICATIONS", IPP_IGNORED_ALL_NOTIFICATIONS
, CONST_CS
);
169 REGISTER_LONG_CONSTANT("IPP_PRINT_SUPPORT_FILE_NOT_FOUND", IPP_PRINT_SUPPORT_FILE_NOT_FOUND
, CONST_CS
);
170 REGISTER_LONG_CONSTANT("IPP_INTERNAL_ERROR", IPP_INTERNAL_ERROR
, CONST_CS
);
171 REGISTER_LONG_CONSTANT("IPP_OPERATION_NOT_SUPPORTED", IPP_OPERATION_NOT_SUPPORTED
, CONST_CS
);
172 REGISTER_LONG_CONSTANT("IPP_SERVICE_UNAVAILABLE", IPP_SERVICE_UNAVAILABLE
, CONST_CS
);
173 REGISTER_LONG_CONSTANT("IPP_VERSION_NOT_SUPPORTED", IPP_VERSION_NOT_SUPPORTED
, CONST_CS
);
174 REGISTER_LONG_CONSTANT("IPP_DEVICE_ERROR", IPP_DEVICE_ERROR
, CONST_CS
);
175 REGISTER_LONG_CONSTANT("IPP_TEMPORARY_ERROR", IPP_TEMPORARY_ERROR
, CONST_CS
);
176 REGISTER_LONG_CONSTANT("IPP_NOT_ACCEPTING", IPP_NOT_ACCEPTING
, CONST_CS
);
177 REGISTER_LONG_CONSTANT("IPP_PRINTER_BUSY", IPP_PRINTER_BUSY
, CONST_CS
);
178 REGISTER_LONG_CONSTANT("IPP_ERROR_JOB_CANCELLED", IPP_ERROR_JOB_CANCELLED
, CONST_CS
);
179 REGISTER_LONG_CONSTANT("IPP_MULTIPLE_JOBS_NOT_SUPPORTED", IPP_MULTIPLE_JOBS_NOT_SUPPORTED
, CONST_CS
);
180 REGISTER_LONG_CONSTANT("IPP_PRINTER_IS_DEACTIVATED", IPP_PRINTER_IS_DEACTIVATED
, CONST_CS
);
186 * 'zif_cups_cancel_job()' - Cancel a job.
189 PHP_FUNCTION(cups_cancel_job
)
191 char *dest
; /* Destination */
192 int dest_len
, /* Length of destination */
196 if (ZEND_NUM_ARGS() != 2 ||
197 zend_parse_parameters(2, "sl", &dest
, &dest_len
, &id
))
202 RETURN_LONG(cupsCancelJob(dest
, id
));
207 * 'zif_cups_get_dests()' - .
210 PHP_FUNCTION(cups_get_dests
)
212 int i
, j
, /* Looping vars */
213 num_dests
; /* Number of destinations */
214 cups_dest_t
*dests
, /* Destinations */
215 *dest
; /* Current destination */
216 cups_option_t
*option
; /* Current option */
217 zval
*destobj
, /* Destination object */
218 *optionsobj
; /* Options object */
221 if (ZEND_NUM_ARGS() != 0)
226 if ((num_dests
= cupsGetDests(&dests
)) <= 0)
231 if (array_init(return_value
) == SUCCESS
)
233 for (i
= 0, dest
= dests
; i
< num_dests
; i
++, dest
++)
235 MAKE_STD_ZVAL(destobj
);
237 if (object_init(destobj
) == SUCCESS
)
240 * Add properties to the destination for each of the cups_dest_t
244 add_property_string(destobj
, "name", dest
->name
, 1);
245 add_property_string(destobj
, "instance",
246 dest
->instance
? dest
->instance
: "", 1);
247 add_property_long(destobj
, "is_default", dest
->is_default
);
250 * Create an associative array for the options...
253 MAKE_STD_ZVAL(optionsobj
);
255 if (array_init(optionsobj
) == SUCCESS
)
257 for (j
= 0, option
= dest
->options
;
258 j
< dest
->num_options
;
260 add_assoc_string(optionsobj
, option
->name
, option
->value
, 1);
262 add_property_zval(destobj
, "options", optionsobj
);
265 add_index_zval(return_value
, i
, destobj
);
270 cupsFreeDests(num_dests
, dests
);
275 * 'zif_cups_get_jobs()' - Get a list of jobs.
278 PHP_FUNCTION(cups_get_jobs
)
280 char *dest
; /* Destination */
281 int dest_len
, /* Length of destination */
282 myjobs
, /* Only show my jobs? */
283 completed
; /* Show completed jobs? */
284 int i
, /* Looping var */
285 num_jobs
; /* Number of jobs */
286 cups_job_t
*jobs
, /* Jobs */
287 *job
; /* Current job */
288 zval
*jobobj
; /* Job object */
293 if (ZEND_NUM_ARGS() != 3 ||
294 zend_parse_parameters(3, "sll", &dest
, &dest_len
, &myjobs
, &completed
))
302 if ((num_jobs
= cupsGetJobs(&jobs
, dest
, myjobs
, completed
)) <= 0)
307 if (array_init(return_value
) == SUCCESS
)
309 for (i
= 0, job
= jobs
; i
< num_jobs
; i
++, job
++)
311 MAKE_STD_ZVAL(jobobj
);
313 if (object_init(jobobj
) == SUCCESS
)
316 * Add properties to the job for each of the cups_job_t
320 add_property_long(jobobj
, "id", job
->id
);
321 add_property_string(jobobj
, "dest", job
->dest
, 1);
322 add_property_string(jobobj
, "title", job
->title
, 1);
323 add_property_string(jobobj
, "user", job
->user
, 1);
324 add_property_string(jobobj
, "format", job
->format
, 1);
325 add_property_long(jobobj
, "state", job
->state
);
326 add_property_long(jobobj
, "size", job
->size
);
327 add_property_long(jobobj
, "priority", job
->priority
);
328 add_property_long(jobobj
, "completed_time", job
->completed_time
);
329 add_property_long(jobobj
, "creation_time", job
->creation_time
);
330 add_property_long(jobobj
, "processing_time", job
->processing_time
);
332 add_index_zval(return_value
, i
, jobobj
);
337 cupsFreeJobs(num_jobs
, jobs
);
342 * 'zif_cups_last_error()' - Return the last IPP status code.
345 PHP_FUNCTION(cups_last_error
)
347 if (ZEND_NUM_ARGS() != 0)
352 RETURN_LONG(cupsLastError());
357 * 'zif_cups_last_error_string()' - Return the last IPP status-message.
360 PHP_FUNCTION(cups_last_error_string
)
362 if (ZEND_NUM_ARGS() != 0)
367 RETURN_STRING((char *)cupsLastErrorString(), 1);
372 * 'zif_cups_print_file()' - Print a single file.
375 PHP_FUNCTION(cups_print_file
)
377 char *dest
; /* Destination */
378 int dest_len
; /* Length of destination */
379 char *filename
; /* Filename */
380 int filename_len
; /* Length of filename */
381 char *title
; /* Title */
382 int title_len
; /* Length of title */
383 zval
*optionsobj
; /* Array of options */
384 int num_options
; /* Number of options */
385 cups_option_t
*options
; /* Options */
389 if (ZEND_NUM_ARGS() != 4 ||
390 zend_parse_parameters(4, "sssa", &dest
, &dest_len
,
391 &filename
, &filename_len
,
392 &title
, &title_len
, &optionsobj
))
397 num_options
= cups_convert_options(optionsobj
, &options
);
399 id
= cupsPrintFile(dest
, filename
, title
, num_options
, options
);
401 cupsFreeOptions(num_options
, options
);
408 * 'zif_cups_print_files()' - Print multiple files.
411 PHP_FUNCTION(cups_print_files
)
413 char *dest
; /* Destination */
414 int dest_len
; /* Length of destination */
415 zval
*filesobj
; /* Files array */
416 int num_files
; /* Number of files */
417 const char *files
[1000]; /* Files */
418 char *title
; /* Title */
419 int title_len
; /* Length of title */
420 zval
*optionsobj
; /* Array of options */
421 int num_options
; /* Number of options */
422 cups_option_t
*options
; /* Options */
423 HashTable
*ht2
; /* Option array hash table */
424 Bucket
*current
; /* Current element in array */
428 if (ZEND_NUM_ARGS() != 4 ||
429 zend_parse_parameters(4, "sasa", &dest
, &dest_len
, &filesobj
,
430 &title
, &title_len
, &optionsobj
))
435 ht2
= Z_ARRVAL_P(filesobj
);
438 for (current
= ht2
->pListHead
; current
; current
= current
->pListNext
)
440 files
[num_files
++] = Z_STRVAL_P(((zval
*)current
->pDataPtr
));
442 if (num_files
>= (int)(sizeof(files
) / sizeof(files
[0])))
446 num_options
= cups_convert_options(optionsobj
, &options
);
448 id
= cupsPrintFiles(dest
, num_files
, files
, title
, num_options
, options
);
450 cupsFreeOptions(num_options
, options
);