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(3,("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(3,("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(3,("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,
738 "job-originating-host-name", NULL,
739 get_remote_machine_name());
741 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL,
745 * Do the request and get back a response...
748 slprintf(uri, sizeof(uri) - 1, "/printers/%s", PRINTERNAME(snum));
751 if ((response = cupsDoFileRequest(http, request, uri,
752 pjob->filename)) != NULL)
754 if (response->request.status.status_code >= IPP_OK_CONFLICT)
755 DEBUG(0,("Unable to print file to %s - %s\n", PRINTERNAME(snum),
756 ippErrorString(cupsLastError())));
763 DEBUG(0,("Unable to print file to `%s' - %s\n", PRINTERNAME(snum),
764 ippErrorString(cupsLastError())));
769 unlink(pjob->filename);
770 /* else print_job_end will do it for us */
777 * 'cups_queue_get()' - Get all the jobs in the print queue.
781 cups_queue_get(int snum, print_queue_struct **q, print_status_struct *status)
783 http_t *http; /* HTTP connection to server */
784 ipp_t *request, /* IPP Request */
785 *response; /* IPP Response */
786 ipp_attribute_t *attr; /* Current attribute */
787 cups_lang_t *language; /* Default language */
788 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
789 int qcount, /* Number of active queue entries */
790 qalloc; /* Number of queue entries allocated */
791 print_queue_struct *queue, /* Queue entries */
792 *temp; /* Temporary pointer for queue */
793 const char *user_name, /* job-originating-user-name attribute */
794 *job_name; /* job-name attribute */
795 int job_id; /* job-id attribute */
796 int job_k_octets; /* job-k-octets attribute */
797 time_t job_time; /* time-at-creation attribute */
798 ipp_jstate_t job_status; /* job-status attribute */
799 int job_priority; /* job-priority attribute */
800 static const char *jattrs[] = /* Requested job attributes */
805 "job-originating-user-name",
810 static const char *pattrs[] = /* Requested printer attributes */
813 "printer-state-message"
817 DEBUG(5,("cups_queue_get(%d, %p, %p)\n", snum, q, status));
820 * Make sure we don't ask for passwords...
823 cupsSetPasswordCB(cups_passwd_cb);
826 * Try to connect to the server...
829 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
831 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
832 cupsServer(), strerror(errno)));
837 * Generate the printer URI...
840 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
844 * Build an IPP_GET_JOBS request, which requires the following
848 * attributes-natural-language
849 * requested-attributes
855 request->request.op.operation_id = IPP_GET_JOBS;
856 request->request.op.request_id = 1;
858 language = cupsLangDefault();
860 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
861 "attributes-charset", NULL, cupsLangEncoding(language));
863 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
864 "attributes-natural-language", NULL, language->language);
866 ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
867 "requested-attributes",
868 (sizeof(jattrs) / sizeof(jattrs[0])),
871 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
872 "printer-uri", NULL, uri);
875 * Do the request and get back a response...
878 if ((response = cupsDoRequest(http, request, "/")) == NULL)
880 DEBUG(0,("Unable to get jobs for %s - %s\n", uri,
881 ippErrorString(cupsLastError())));
886 if (response->request.status.status_code >= IPP_OK_CONFLICT)
888 DEBUG(0,("Unable to get jobs for %s - %s\n", uri,
889 ippErrorString(response->request.status.status_code)));
897 * Process the jobs...
904 for (attr = response->attrs; attr != NULL; attr = attr->next)
907 * Skip leading attributes until we hit a job...
910 while (attr != NULL && attr->group_tag != IPP_TAG_JOB)
917 * Allocate memory as needed...
919 if (qcount >= qalloc)
923 temp = Realloc(queue, sizeof(print_queue_struct) * qalloc);
927 DEBUG(0,("cups_queue_get: Not enough memory!"));
938 temp = queue + qcount;
939 memset(temp, 0, sizeof(print_queue_struct));
942 * Pull the needed attributes from this job...
947 job_status = IPP_JOB_PENDING;
953 while (attr != NULL && attr->group_tag == IPP_TAG_JOB)
955 if (attr->name == NULL)
961 if (strcmp(attr->name, "job-id") == 0 &&
962 attr->value_tag == IPP_TAG_INTEGER)
963 job_id = attr->values[0].integer;
965 if (strcmp(attr->name, "job-k-octets") == 0 &&
966 attr->value_tag == IPP_TAG_INTEGER)
967 job_k_octets = attr->values[0].integer;
969 if (strcmp(attr->name, "job-priority") == 0 &&
970 attr->value_tag == IPP_TAG_INTEGER)
971 job_priority = attr->values[0].integer;
973 if (strcmp(attr->name, "job-state") == 0 &&
974 attr->value_tag == IPP_TAG_ENUM)
975 job_status = (ipp_jstate_t)(attr->values[0].integer);
977 if (strcmp(attr->name, "time-at-creation") == 0 &&
978 attr->value_tag == IPP_TAG_INTEGER)
979 job_time = attr->values[0].integer;
981 if (strcmp(attr->name, "job-name") == 0 &&
982 attr->value_tag == IPP_TAG_NAME)
983 job_name = attr->values[0].string.text;
985 if (strcmp(attr->name, "job-originating-user-name") == 0 &&
986 attr->value_tag == IPP_TAG_NAME)
987 user_name = attr->values[0].string.text;
993 * See if we have everything needed...
996 if (user_name == NULL || job_name == NULL || job_id == 0)
1005 temp->size = job_k_octets * 1024;
1006 temp->status = job_status == IPP_JOB_PENDING ? LPQ_QUEUED :
1007 job_status == IPP_JOB_STOPPED ? LPQ_PAUSED :
1008 job_status == IPP_JOB_HELD ? LPQ_PAUSED :
1010 temp->priority = job_priority;
1011 temp->time = job_time;
1012 strncpy(temp->fs_user, user_name, sizeof(temp->fs_user) - 1);
1013 strncpy(temp->fs_file, job_name, sizeof(temp->fs_file) - 1);
1021 ippDelete(response);
1024 * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the
1025 * following attributes:
1027 * attributes-charset
1028 * attributes-natural-language
1029 * requested-attributes
1035 request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
1036 request->request.op.request_id = 1;
1038 language = cupsLangDefault();
1040 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
1041 "attributes-charset", NULL, cupsLangEncoding(language));
1043 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
1044 "attributes-natural-language", NULL, language->language);
1046 ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
1047 "requested-attributes",
1048 (sizeof(pattrs) / sizeof(pattrs[0])),
1051 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
1052 "printer-uri", NULL, uri);
1055 * Do the request and get back a response...
1058 if ((response = cupsDoRequest(http, request, "/")) == NULL)
1060 DEBUG(0,("Unable to get printer status for %s - %s\n", PRINTERNAME(snum),
1061 ippErrorString(cupsLastError())));
1067 if (response->request.status.status_code >= IPP_OK_CONFLICT)
1069 DEBUG(0,("Unable to get printer status for %s - %s\n", PRINTERNAME(snum),
1070 ippErrorString(response->request.status.status_code)));
1071 ippDelete(response);
1078 * Get the current printer status and convert it to the SAMBA values.
1081 if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL)
1083 if (attr->values[0].integer == IPP_PRINTER_STOPPED)
1084 status->status = LPSTAT_STOPPED;
1086 status->status = LPSTAT_OK;
1089 if ((attr = ippFindAttribute(response, "printer-state-message",
1090 IPP_TAG_TEXT)) != NULL)
1091 fstrcpy(status->message, attr->values[0].string.text);
1093 ippDelete(response);
1096 * Return the job queue...
1107 * 'cups_queue_pause()' - Pause a print queue.
1111 cups_queue_pause(int snum)
1113 extern userdom_struct current_user_info;
1114 int ret; /* Return value */
1115 http_t *http; /* HTTP connection to server */
1116 ipp_t *request, /* IPP Request */
1117 *response; /* IPP Response */
1118 cups_lang_t *language; /* Default language */
1119 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
1122 DEBUG(5,("cups_queue_pause(%d)\n", snum));
1125 * Make sure we don't ask for passwords...
1128 cupsSetPasswordCB(cups_passwd_cb);
1131 * Try to connect to the server...
1134 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
1136 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
1137 cupsServer(), strerror(errno)));
1142 * Build an IPP_PAUSE_PRINTER request, which requires the following
1145 * attributes-charset
1146 * attributes-natural-language
1148 * requesting-user-name
1153 request->request.op.operation_id = IPP_PAUSE_PRINTER;
1154 request->request.op.request_id = 1;
1156 language = cupsLangDefault();
1158 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
1159 "attributes-charset", NULL, cupsLangEncoding(language));
1161 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
1162 "attributes-natural-language", NULL, language->language);
1164 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
1167 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
1169 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
1170 NULL, current_user_info.unix_name);
1173 * Do the request and get back a response...
1178 if ((response = cupsDoRequest(http, request, "/admin/")) != NULL)
1180 if (response->request.status.status_code >= IPP_OK_CONFLICT)
1181 DEBUG(0,("Unable to pause printer %s - %s\n", PRINTERNAME(snum),
1182 ippErrorString(cupsLastError())));
1186 ippDelete(response);
1189 DEBUG(0,("Unable to pause printer %s - %s\n", PRINTERNAME(snum),
1190 ippErrorString(cupsLastError())));
1199 * 'cups_queue_resume()' - Restart a print queue.
1203 cups_queue_resume(int snum)
1205 extern userdom_struct current_user_info;
1206 int ret; /* Return value */
1207 http_t *http; /* HTTP connection to server */
1208 ipp_t *request, /* IPP Request */
1209 *response; /* IPP Response */
1210 cups_lang_t *language; /* Default language */
1211 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
1214 DEBUG(5,("cups_queue_resume(%d)\n", snum));
1217 * Make sure we don't ask for passwords...
1220 cupsSetPasswordCB(cups_passwd_cb);
1223 * Try to connect to the server...
1226 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
1228 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
1229 cupsServer(), strerror(errno)));
1234 * Build an IPP_RESUME_PRINTER request, which requires the following
1237 * attributes-charset
1238 * attributes-natural-language
1240 * requesting-user-name
1245 request->request.op.operation_id = IPP_RESUME_PRINTER;
1246 request->request.op.request_id = 1;
1248 language = cupsLangDefault();
1250 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
1251 "attributes-charset", NULL, cupsLangEncoding(language));
1253 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
1254 "attributes-natural-language", NULL, language->language);
1256 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
1259 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
1261 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
1262 NULL, current_user_info.unix_name);
1265 * Do the request and get back a response...
1270 if ((response = cupsDoRequest(http, request, "/admin/")) != NULL)
1272 if (response->request.status.status_code >= IPP_OK_CONFLICT)
1273 DEBUG(0,("Unable to resume printer %s - %s\n", PRINTERNAME(snum),
1274 ippErrorString(cupsLastError())));
1278 ippDelete(response);
1281 DEBUG(0,("Unable to resume printer %s - %s\n", PRINTERNAME(snum),
1282 ippErrorString(cupsLastError())));
1291 /* this keeps fussy compilers happy */
1292 void print_cups_dummy(void) {}
1293 #endif /* HAVE_CUPS */