2 * Support code for the Common UNIX Printing System ("CUPS")
4 * Copyright 1999-2003 by Michael R Sweet.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include <cups/cups.h>
25 #include <cups/language.h>
29 * CUPS printing interface definitions...
32 static int cups_job_delete(int snum, struct printjob *pjob);
33 static int cups_job_pause(int snum, struct printjob *pjob);
34 static int cups_job_resume(int snum, struct printjob *pjob);
35 static int cups_job_submit(int snum, struct printjob *pjob);
36 static int cups_queue_get(int snum, print_queue_struct **q,
37 print_status_struct *status);
38 static int cups_queue_pause(int snum);
39 static int cups_queue_resume(int snum);
42 struct printif cups_printif =
54 * 'cups_passwd_cb()' - The CUPS password callback...
57 static const char * /* O - Password or NULL */
58 cups_passwd_cb(const char *prompt) /* I - Prompt */
61 * Always return NULL to indicate that no password is available...
69 * 'cups_printer_fn()' - Call a function for every printer known to the
73 void cups_printer_fn(void (*fn)(char *, char *))
75 /* I - Function to call */
76 http_t *http; /* HTTP connection to server */
77 ipp_t *request, /* IPP Request */
78 *response; /* IPP Response */
79 ipp_attribute_t *attr; /* Current attribute */
80 cups_lang_t *language; /* Default language */
81 char *name, /* printer-name attribute */
82 *make_model, /* printer-make-and-model attribute */
83 *info; /* printer-info attribute */
84 static const char *requested[] =/* Requested attributes */
87 "printer-make-and-model",
92 DEBUG(5,("cups_printer_fn(%p)\n", fn));
95 * Make sure we don't ask for passwords...
98 cupsSetPasswordCB(cups_passwd_cb);
101 * Try to connect to the server...
104 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
106 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
107 cupsServer(), strerror(errno)));
112 * Build a CUPS_GET_PRINTERS request, which requires the following
116 * attributes-natural-language
117 * requested-attributes
122 request->request.op.operation_id = CUPS_GET_PRINTERS;
123 request->request.op.request_id = 1;
125 language = cupsLangDefault();
127 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
128 "attributes-charset", NULL, cupsLangEncoding(language));
130 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
131 "attributes-natural-language", NULL, language->language);
133 ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
134 "requested-attributes",
135 (sizeof(requested) / sizeof(requested[0])),
139 * Do the request and get back a response...
142 if ((response = cupsDoRequest(http, request, "/")) == NULL)
144 DEBUG(0,("Unable to get printer list - %s\n",
145 ippErrorString(cupsLastError())));
150 for (attr = response->attrs; attr != NULL;)
153 * Skip leading attributes until we hit a printer...
156 while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
163 * Pull the needed attributes from this printer...
170 while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
172 if (strcmp(attr->name, "printer-name") == 0 &&
173 attr->value_tag == IPP_TAG_NAME)
174 name = attr->values[0].string.text;
176 if (strcmp(attr->name, "printer-make-and-model") == 0 &&
177 attr->value_tag == IPP_TAG_TEXT)
178 make_model = attr->values[0].string.text;
180 if (strcmp(attr->name, "printer-info") == 0 &&
181 attr->value_tag == IPP_TAG_TEXT)
182 info = attr->values[0].string.text;
188 * See if we have everything needed...
194 if (info == NULL || !info[0])
195 (*fn)(name, make_model);
206 * Build a CUPS_GET_CLASSES request, which requires the following
210 * attributes-natural-language
211 * requested-attributes
216 request->request.op.operation_id = CUPS_GET_CLASSES;
217 request->request.op.request_id = 1;
219 language = cupsLangDefault();
221 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
222 "attributes-charset", NULL, cupsLangEncoding(language));
224 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
225 "attributes-natural-language", NULL, language->language);
227 ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
228 "requested-attributes",
229 (sizeof(requested) / sizeof(requested[0])),
233 * Do the request and get back a response...
236 if ((response = cupsDoRequest(http, request, "/")) == NULL)
238 DEBUG(0,("Unable to get printer list - %s\n",
239 ippErrorString(cupsLastError())));
244 for (attr = response->attrs; attr != NULL;)
247 * Skip leading attributes until we hit a printer...
250 while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
257 * Pull the needed attributes from this printer...
264 while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
266 if (strcmp(attr->name, "printer-name") == 0 &&
267 attr->value_tag == IPP_TAG_NAME)
268 name = attr->values[0].string.text;
270 if (strcmp(attr->name, "printer-make-and-model") == 0 &&
271 attr->value_tag == IPP_TAG_TEXT)
272 make_model = attr->values[0].string.text;
274 if (strcmp(attr->name, "printer-info") == 0 &&
275 attr->value_tag == IPP_TAG_TEXT)
276 info = attr->values[0].string.text;
282 * See if we have everything needed...
288 if (info == NULL || !info[0])
289 (*fn)(name, make_model);
299 * Close the connection to the server...
307 * 'cups_printername_ok()' - Provide the equivalent of pcap_printername_ok()
309 * O - 1 if printer name OK
310 * I - Name of printer
312 int cups_printername_ok(const char *name)
314 http_t *http; /* HTTP connection to server */
315 ipp_t *request, /* IPP Request */
316 *response; /* IPP Response */
317 cups_lang_t *language; /* Default language */
318 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
321 DEBUG(5,("cups_printername_ok(\"%s\")\n", name));
324 * Make sure we don't ask for passwords...
327 cupsSetPasswordCB(cups_passwd_cb);
330 * Try to connect to the server...
333 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
335 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
336 cupsServer(), strerror(errno)));
341 * Build an IPP_GET_PRINTER_ATTRS request, which requires the following
345 * attributes-natural-language
346 * requested-attributes
352 request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
353 request->request.op.request_id = 1;
355 language = cupsLangDefault();
357 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
358 "attributes-charset", NULL, cupsLangEncoding(language));
360 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
361 "attributes-natural-language", NULL, language->language);
363 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
364 "requested-attributes", NULL, "printer-uri");
366 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s", name);
368 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
369 "printer-uri", NULL, uri);
372 * Do the request and get back a response...
375 if ((response = cupsDoRequest(http, request, "/")) == NULL)
377 DEBUG(0,("Unable to get printer status for %s - %s\n", name,
378 ippErrorString(cupsLastError())));
385 if (response->request.status.status_code >= IPP_OK_CONFLICT)
387 DEBUG(0,("Unable to get printer status for %s - %s\n", name,
388 ippErrorString(response->request.status.status_code)));
401 * 'cups_job_delete()' - Delete a job.
405 cups_job_delete(int snum, struct printjob *pjob)
407 int ret; /* Return value */
408 http_t *http; /* HTTP connection to server */
409 ipp_t *request, /* IPP Request */
410 *response; /* IPP Response */
411 cups_lang_t *language; /* Default language */
412 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
415 DEBUG(5,("cups_job_delete(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
418 * Make sure we don't ask for passwords...
421 cupsSetPasswordCB(cups_passwd_cb);
424 * Try to connect to the server...
427 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
429 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
430 cupsServer(), strerror(errno)));
435 * Build an IPP_CANCEL_JOB request, which requires the following
439 * attributes-natural-language
441 * requesting-user-name
446 request->request.op.operation_id = IPP_CANCEL_JOB;
447 request->request.op.request_id = 1;
449 language = cupsLangDefault();
451 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
452 "attributes-charset", NULL, cupsLangEncoding(language));
454 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
455 "attributes-natural-language", NULL, language->language);
457 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/jobs/%d", pjob->sysjob);
459 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri);
461 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
465 * Do the request and get back a response...
470 if ((response = cupsDoRequest(http, request, "/jobs")) != NULL)
472 if (response->request.status.status_code >= IPP_OK_CONFLICT)
473 DEBUG(0,("Unable to cancel job %d - %s\n", pjob->sysjob,
474 ippErrorString(cupsLastError())));
481 DEBUG(0,("Unable to cancel job %d - %s\n", pjob->sysjob,
482 ippErrorString(cupsLastError())));
491 * 'cups_job_pause()' - Pause a job.
495 cups_job_pause(int snum, struct printjob *pjob)
497 int ret; /* Return value */
498 http_t *http; /* HTTP connection to server */
499 ipp_t *request, /* IPP Request */
500 *response; /* IPP Response */
501 cups_lang_t *language; /* Default language */
502 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
505 DEBUG(5,("cups_job_pause(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
508 * Make sure we don't ask for passwords...
511 cupsSetPasswordCB(cups_passwd_cb);
514 * Try to connect to the server...
517 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
519 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
520 cupsServer(), strerror(errno)));
525 * Build an IPP_HOLD_JOB request, which requires the following
529 * attributes-natural-language
531 * requesting-user-name
536 request->request.op.operation_id = IPP_HOLD_JOB;
537 request->request.op.request_id = 1;
539 language = cupsLangDefault();
541 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
542 "attributes-charset", NULL, cupsLangEncoding(language));
544 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
545 "attributes-natural-language", NULL, language->language);
547 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/jobs/%d", pjob->sysjob);
549 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri);
551 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
555 * Do the request and get back a response...
560 if ((response = cupsDoRequest(http, request, "/jobs")) != NULL)
562 if (response->request.status.status_code >= IPP_OK_CONFLICT)
563 DEBUG(0,("Unable to hold job %d - %s\n", pjob->sysjob,
564 ippErrorString(cupsLastError())));
571 DEBUG(0,("Unable to hold job %d - %s\n", pjob->sysjob,
572 ippErrorString(cupsLastError())));
581 * 'cups_job_resume()' - Resume a paused job.
585 cups_job_resume(int snum, struct printjob *pjob)
587 int ret; /* Return value */
588 http_t *http; /* HTTP connection to server */
589 ipp_t *request, /* IPP Request */
590 *response; /* IPP Response */
591 cups_lang_t *language; /* Default language */
592 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
595 DEBUG(5,("cups_job_resume(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
598 * Make sure we don't ask for passwords...
601 cupsSetPasswordCB(cups_passwd_cb);
604 * Try to connect to the server...
607 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
609 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
610 cupsServer(), strerror(errno)));
615 * Build an IPP_RELEASE_JOB request, which requires the following
619 * attributes-natural-language
621 * requesting-user-name
626 request->request.op.operation_id = IPP_RELEASE_JOB;
627 request->request.op.request_id = 1;
629 language = cupsLangDefault();
631 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
632 "attributes-charset", NULL, cupsLangEncoding(language));
634 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
635 "attributes-natural-language", NULL, language->language);
637 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/jobs/%d", pjob->sysjob);
639 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri);
641 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
645 * Do the request and get back a response...
650 if ((response = cupsDoRequest(http, request, "/jobs")) != NULL)
652 if (response->request.status.status_code >= IPP_OK_CONFLICT)
653 DEBUG(0,("Unable to release job %d - %s\n", pjob->sysjob,
654 ippErrorString(cupsLastError())));
661 DEBUG(0,("Unable to release job %d - %s\n", pjob->sysjob,
662 ippErrorString(cupsLastError())));
671 * 'cups_job_submit()' - Submit a job for printing.
675 cups_job_submit(int snum, struct printjob *pjob)
677 int ret; /* Return value */
678 http_t *http; /* HTTP connection to server */
679 ipp_t *request, /* IPP Request */
680 *response; /* IPP Response */
681 cups_lang_t *language; /* Default language */
682 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
685 DEBUG(5,("cups_job_submit(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
688 * Make sure we don't ask for passwords...
691 cupsSetPasswordCB(cups_passwd_cb);
694 * Try to connect to the server...
697 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
699 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
700 cupsServer(), strerror(errno)));
705 * Build an IPP_PRINT_JOB request, which requires the following
709 * attributes-natural-language
711 * requesting-user-name
717 request->request.op.operation_id = IPP_PRINT_JOB;
718 request->request.op.request_id = 1;
720 language = cupsLangDefault();
722 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
723 "attributes-charset", NULL, cupsLangEncoding(language));
725 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
726 "attributes-natural-language", NULL, language->language);
728 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
731 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
732 "printer-uri", NULL, uri);
734 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
737 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL,
741 * Do the request and get back a response...
744 slprintf(uri, sizeof(uri) - 1, "/printers/%s", PRINTERNAME(snum));
747 if ((response = cupsDoFileRequest(http, request, uri,
748 pjob->filename)) != NULL)
750 if (response->request.status.status_code >= IPP_OK_CONFLICT)
751 DEBUG(0,("Unable to print file to %s - %s\n", PRINTERNAME(snum),
752 ippErrorString(cupsLastError())));
759 DEBUG(0,("Unable to print file to `%s' - %s\n", PRINTERNAME(snum),
760 ippErrorString(cupsLastError())));
765 unlink(pjob->filename);
766 /* else print_job_end will do it for us */
773 * 'cups_queue_get()' - Get all the jobs in the print queue.
777 cups_queue_get(int snum, print_queue_struct **q, print_status_struct *status)
779 http_t *http; /* HTTP connection to server */
780 ipp_t *request, /* IPP Request */
781 *response; /* IPP Response */
782 ipp_attribute_t *attr; /* Current attribute */
783 cups_lang_t *language; /* Default language */
784 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
785 int qcount, /* Number of active queue entries */
786 qalloc; /* Number of queue entries allocated */
787 print_queue_struct *queue, /* Queue entries */
788 *temp; /* Temporary pointer for queue */
789 const char *user_name, /* job-originating-user-name attribute */
790 *job_name; /* job-name attribute */
791 int job_id; /* job-id attribute */
792 int job_k_octets; /* job-k-octets attribute */
793 time_t job_time; /* time-at-creation attribute */
794 ipp_jstate_t job_status; /* job-status attribute */
795 int job_priority; /* job-priority attribute */
796 static const char *jattrs[] = /* Requested job attributes */
801 "job-originating-user-name",
806 static const char *pattrs[] = /* Requested printer attributes */
809 "printer-state-message"
813 DEBUG(5,("cups_queue_get(%d, %p, %p)\n", snum, q, status));
816 * Make sure we don't ask for passwords...
819 cupsSetPasswordCB(cups_passwd_cb);
822 * Try to connect to the server...
825 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
827 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
828 cupsServer(), strerror(errno)));
833 * Generate the printer URI...
836 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
840 * Build an IPP_GET_JOBS request, which requires the following
844 * attributes-natural-language
845 * requested-attributes
851 request->request.op.operation_id = IPP_GET_JOBS;
852 request->request.op.request_id = 1;
854 language = cupsLangDefault();
856 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
857 "attributes-charset", NULL, cupsLangEncoding(language));
859 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
860 "attributes-natural-language", NULL, language->language);
862 ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
863 "requested-attributes",
864 (sizeof(jattrs) / sizeof(jattrs[0])),
867 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
868 "printer-uri", NULL, uri);
871 * Do the request and get back a response...
874 if ((response = cupsDoRequest(http, request, "/")) == NULL)
876 DEBUG(0,("Unable to get jobs for %s - %s\n", uri,
877 ippErrorString(cupsLastError())));
882 if (response->request.status.status_code >= IPP_OK_CONFLICT)
884 DEBUG(0,("Unable to get jobs for %s - %s\n", uri,
885 ippErrorString(response->request.status.status_code)));
893 * Process the jobs...
900 for (attr = response->attrs; attr != NULL; attr = attr->next)
903 * Skip leading attributes until we hit a job...
906 while (attr != NULL && attr->group_tag != IPP_TAG_JOB)
913 * Allocate memory as needed...
915 if (qcount >= qalloc)
919 temp = Realloc(queue, sizeof(print_queue_struct) * qalloc);
923 DEBUG(0,("cups_queue_get: Not enough memory!"));
934 temp = queue + qcount;
935 memset(temp, 0, sizeof(print_queue_struct));
938 * Pull the needed attributes from this job...
943 job_status = IPP_JOB_PENDING;
949 while (attr != NULL && attr->group_tag == IPP_TAG_JOB)
951 if (attr->name == NULL)
957 if (strcmp(attr->name, "job-id") == 0 &&
958 attr->value_tag == IPP_TAG_INTEGER)
959 job_id = attr->values[0].integer;
961 if (strcmp(attr->name, "job-k-octets") == 0 &&
962 attr->value_tag == IPP_TAG_INTEGER)
963 job_k_octets = attr->values[0].integer;
965 if (strcmp(attr->name, "job-priority") == 0 &&
966 attr->value_tag == IPP_TAG_INTEGER)
967 job_priority = attr->values[0].integer;
969 if (strcmp(attr->name, "job-state") == 0 &&
970 attr->value_tag == IPP_TAG_ENUM)
971 job_status = (ipp_jstate_t)(attr->values[0].integer);
973 if (strcmp(attr->name, "time-at-creation") == 0 &&
974 attr->value_tag == IPP_TAG_INTEGER)
975 job_time = attr->values[0].integer;
977 if (strcmp(attr->name, "job-name") == 0 &&
978 attr->value_tag == IPP_TAG_NAME)
979 job_name = attr->values[0].string.text;
981 if (strcmp(attr->name, "job-originating-user-name") == 0 &&
982 attr->value_tag == IPP_TAG_NAME)
983 user_name = attr->values[0].string.text;
989 * See if we have everything needed...
992 if (user_name == NULL || job_name == NULL || job_id == 0)
1001 temp->size = job_k_octets * 1024;
1002 temp->status = job_status == IPP_JOB_PENDING ? LPQ_QUEUED :
1003 job_status == IPP_JOB_STOPPED ? LPQ_PAUSED :
1004 job_status == IPP_JOB_HELD ? LPQ_PAUSED :
1006 temp->priority = job_priority;
1007 temp->time = job_time;
1008 strncpy(temp->fs_user, user_name, sizeof(temp->fs_user) - 1);
1009 strncpy(temp->fs_file, job_name, sizeof(temp->fs_file) - 1);
1017 ippDelete(response);
1020 * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the
1021 * following attributes:
1023 * attributes-charset
1024 * attributes-natural-language
1025 * requested-attributes
1031 request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
1032 request->request.op.request_id = 1;
1034 language = cupsLangDefault();
1036 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
1037 "attributes-charset", NULL, cupsLangEncoding(language));
1039 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
1040 "attributes-natural-language", NULL, language->language);
1042 ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
1043 "requested-attributes",
1044 (sizeof(pattrs) / sizeof(pattrs[0])),
1047 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
1048 "printer-uri", NULL, uri);
1051 * Do the request and get back a response...
1054 if ((response = cupsDoRequest(http, request, "/")) == NULL)
1056 DEBUG(0,("Unable to get printer status for %s - %s\n", PRINTERNAME(snum),
1057 ippErrorString(cupsLastError())));
1063 if (response->request.status.status_code >= IPP_OK_CONFLICT)
1065 DEBUG(0,("Unable to get printer status for %s - %s\n", PRINTERNAME(snum),
1066 ippErrorString(response->request.status.status_code)));
1067 ippDelete(response);
1074 * Get the current printer status and convert it to the SAMBA values.
1077 if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL)
1079 if (attr->values[0].integer == IPP_PRINTER_STOPPED)
1080 status->status = LPSTAT_STOPPED;
1082 status->status = LPSTAT_OK;
1085 if ((attr = ippFindAttribute(response, "printer-state-message",
1086 IPP_TAG_TEXT)) != NULL)
1087 fstrcpy(status->message, attr->values[0].string.text);
1089 ippDelete(response);
1092 * Return the job queue...
1103 * 'cups_queue_pause()' - Pause a print queue.
1107 cups_queue_pause(int snum)
1109 extern userdom_struct current_user_info;
1110 int ret; /* Return value */
1111 http_t *http; /* HTTP connection to server */
1112 ipp_t *request, /* IPP Request */
1113 *response; /* IPP Response */
1114 cups_lang_t *language; /* Default language */
1115 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
1118 DEBUG(5,("cups_queue_pause(%d)\n", snum));
1121 * Make sure we don't ask for passwords...
1124 cupsSetPasswordCB(cups_passwd_cb);
1127 * Try to connect to the server...
1130 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
1132 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
1133 cupsServer(), strerror(errno)));
1138 * Build an IPP_PAUSE_PRINTER request, which requires the following
1141 * attributes-charset
1142 * attributes-natural-language
1144 * requesting-user-name
1149 request->request.op.operation_id = IPP_PAUSE_PRINTER;
1150 request->request.op.request_id = 1;
1152 language = cupsLangDefault();
1154 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
1155 "attributes-charset", NULL, cupsLangEncoding(language));
1157 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
1158 "attributes-natural-language", NULL, language->language);
1160 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
1163 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
1165 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
1166 NULL, current_user_info.unix_name);
1169 * Do the request and get back a response...
1174 if ((response = cupsDoRequest(http, request, "/admin/")) != NULL)
1176 if (response->request.status.status_code >= IPP_OK_CONFLICT)
1177 DEBUG(0,("Unable to pause printer %s - %s\n", PRINTERNAME(snum),
1178 ippErrorString(cupsLastError())));
1182 ippDelete(response);
1185 DEBUG(0,("Unable to pause printer %s - %s\n", PRINTERNAME(snum),
1186 ippErrorString(cupsLastError())));
1195 * 'cups_queue_resume()' - Restart a print queue.
1199 cups_queue_resume(int snum)
1201 extern userdom_struct current_user_info;
1202 int ret; /* Return value */
1203 http_t *http; /* HTTP connection to server */
1204 ipp_t *request, /* IPP Request */
1205 *response; /* IPP Response */
1206 cups_lang_t *language; /* Default language */
1207 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
1210 DEBUG(5,("cups_queue_resume(%d)\n", snum));
1213 * Make sure we don't ask for passwords...
1216 cupsSetPasswordCB(cups_passwd_cb);
1219 * Try to connect to the server...
1222 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
1224 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
1225 cupsServer(), strerror(errno)));
1230 * Build an IPP_RESUME_PRINTER request, which requires the following
1233 * attributes-charset
1234 * attributes-natural-language
1236 * requesting-user-name
1241 request->request.op.operation_id = IPP_RESUME_PRINTER;
1242 request->request.op.request_id = 1;
1244 language = cupsLangDefault();
1246 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
1247 "attributes-charset", NULL, cupsLangEncoding(language));
1249 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
1250 "attributes-natural-language", NULL, language->language);
1252 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
1255 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
1257 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
1258 NULL, current_user_info.unix_name);
1261 * Do the request and get back a response...
1266 if ((response = cupsDoRequest(http, request, "/admin/")) != NULL)
1268 if (response->request.status.status_code >= IPP_OK_CONFLICT)
1269 DEBUG(0,("Unable to resume printer %s - %s\n", PRINTERNAME(snum),
1270 ippErrorString(cupsLastError())));
1274 ippDelete(response);
1277 DEBUG(0,("Unable to resume printer %s - %s\n", PRINTERNAME(snum),
1278 ippErrorString(cupsLastError())));
1287 /* this keeps fussy compilers happy */
1288 void print_cups_dummy(void) {}
1289 #endif /* HAVE_CUPS */