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 */
683 char *clientname; /* hostname of client for job-originating-host attribute */
686 DEBUG(5,("cups_job_submit(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
689 * Make sure we don't ask for passwords...
692 cupsSetPasswordCB(cups_passwd_cb);
695 * Try to connect to the server...
698 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
700 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
701 cupsServer(), strerror(errno)));
706 * Build an IPP_PRINT_JOB request, which requires the following
710 * attributes-natural-language
712 * requesting-user-name
718 request->request.op.operation_id = IPP_PRINT_JOB;
719 request->request.op.request_id = 1;
721 language = cupsLangDefault();
723 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
724 "attributes-charset", NULL, cupsLangEncoding(language));
726 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
727 "attributes-natural-language", NULL, language->language);
729 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
732 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
733 "printer-uri", NULL, uri);
735 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
738 clientname = client_name();
739 if (strcmp(clientname, "UNKNOWN") == 0) {
740 clientname = client_addr();
743 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
744 "job-originating-host-name", NULL,
747 pstr_sprintf(new_jobname,"%s%.8u %s", PRINT_SPOOL_PREFIX,
748 (unsigned int)pjob->smbjob, pjob->jobname);
750 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL,
754 * Do the request and get back a response...
757 slprintf(uri, sizeof(uri) - 1, "/printers/%s", PRINTERNAME(snum));
760 if ((response = cupsDoFileRequest(http, request, uri,
761 pjob->filename)) != NULL)
763 if (response->request.status.status_code >= IPP_OK_CONFLICT)
764 DEBUG(0,("Unable to print file to %s - %s\n", PRINTERNAME(snum),
765 ippErrorString(cupsLastError())));
772 DEBUG(0,("Unable to print file to `%s' - %s\n", PRINTERNAME(snum),
773 ippErrorString(cupsLastError())));
778 unlink(pjob->filename);
779 /* else print_job_end will do it for us */
786 * 'cups_queue_get()' - Get all the jobs in the print queue.
790 cups_queue_get(int snum, print_queue_struct **q, print_status_struct *status)
792 http_t *http; /* HTTP connection to server */
793 ipp_t *request, /* IPP Request */
794 *response; /* IPP Response */
795 ipp_attribute_t *attr; /* Current attribute */
796 cups_lang_t *language; /* Default language */
797 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
798 int qcount, /* Number of active queue entries */
799 qalloc; /* Number of queue entries allocated */
800 print_queue_struct *queue, /* Queue entries */
801 *temp; /* Temporary pointer for queue */
802 const char *user_name, /* job-originating-user-name attribute */
803 *job_name; /* job-name attribute */
804 int job_id; /* job-id attribute */
805 int job_k_octets; /* job-k-octets attribute */
806 time_t job_time; /* time-at-creation attribute */
807 ipp_jstate_t job_status; /* job-status attribute */
808 int job_priority; /* job-priority attribute */
809 static const char *jattrs[] = /* Requested job attributes */
814 "job-originating-user-name",
819 static const char *pattrs[] = /* Requested printer attributes */
822 "printer-state-message"
826 DEBUG(5,("cups_queue_get(%d, %p, %p)\n", snum, q, status));
829 * Make sure we don't ask for passwords...
832 cupsSetPasswordCB(cups_passwd_cb);
835 * Try to connect to the server...
838 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
840 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
841 cupsServer(), strerror(errno)));
846 * Generate the printer URI...
849 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
853 * Build an IPP_GET_JOBS request, which requires the following
857 * attributes-natural-language
858 * requested-attributes
864 request->request.op.operation_id = IPP_GET_JOBS;
865 request->request.op.request_id = 1;
867 language = cupsLangDefault();
869 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
870 "attributes-charset", NULL, cupsLangEncoding(language));
872 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
873 "attributes-natural-language", NULL, language->language);
875 ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
876 "requested-attributes",
877 (sizeof(jattrs) / sizeof(jattrs[0])),
880 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
881 "printer-uri", NULL, uri);
884 * Do the request and get back a response...
887 if ((response = cupsDoRequest(http, request, "/")) == NULL)
889 DEBUG(0,("Unable to get jobs for %s - %s\n", uri,
890 ippErrorString(cupsLastError())));
895 if (response->request.status.status_code >= IPP_OK_CONFLICT)
897 DEBUG(0,("Unable to get jobs for %s - %s\n", uri,
898 ippErrorString(response->request.status.status_code)));
906 * Process the jobs...
913 for (attr = response->attrs; attr != NULL; attr = attr->next)
916 * Skip leading attributes until we hit a job...
919 while (attr != NULL && attr->group_tag != IPP_TAG_JOB)
926 * Allocate memory as needed...
928 if (qcount >= qalloc)
932 temp = Realloc(queue, sizeof(print_queue_struct) * qalloc);
936 DEBUG(0,("cups_queue_get: Not enough memory!"));
947 temp = queue + qcount;
948 memset(temp, 0, sizeof(print_queue_struct));
951 * Pull the needed attributes from this job...
956 job_status = IPP_JOB_PENDING;
962 while (attr != NULL && attr->group_tag == IPP_TAG_JOB)
964 if (attr->name == NULL)
970 if (strcmp(attr->name, "job-id") == 0 &&
971 attr->value_tag == IPP_TAG_INTEGER)
972 job_id = attr->values[0].integer;
974 if (strcmp(attr->name, "job-k-octets") == 0 &&
975 attr->value_tag == IPP_TAG_INTEGER)
976 job_k_octets = attr->values[0].integer;
978 if (strcmp(attr->name, "job-priority") == 0 &&
979 attr->value_tag == IPP_TAG_INTEGER)
980 job_priority = attr->values[0].integer;
982 if (strcmp(attr->name, "job-state") == 0 &&
983 attr->value_tag == IPP_TAG_ENUM)
984 job_status = (ipp_jstate_t)(attr->values[0].integer);
986 if (strcmp(attr->name, "time-at-creation") == 0 &&
987 attr->value_tag == IPP_TAG_INTEGER)
988 job_time = attr->values[0].integer;
990 if (strcmp(attr->name, "job-name") == 0 &&
991 attr->value_tag == IPP_TAG_NAME)
992 job_name = attr->values[0].string.text;
994 if (strcmp(attr->name, "job-originating-user-name") == 0 &&
995 attr->value_tag == IPP_TAG_NAME)
996 user_name = attr->values[0].string.text;
1002 * See if we have everything needed...
1005 if (user_name == NULL || job_name == NULL || job_id == 0)
1014 temp->size = job_k_octets * 1024;
1015 temp->status = job_status == IPP_JOB_PENDING ? LPQ_QUEUED :
1016 job_status == IPP_JOB_STOPPED ? LPQ_PAUSED :
1017 job_status == IPP_JOB_HELD ? LPQ_PAUSED :
1019 temp->priority = job_priority;
1020 temp->time = job_time;
1021 strncpy(temp->fs_user, user_name, sizeof(temp->fs_user) - 1);
1022 strncpy(temp->fs_file, job_name, sizeof(temp->fs_file) - 1);
1030 ippDelete(response);
1033 * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the
1034 * following attributes:
1036 * attributes-charset
1037 * attributes-natural-language
1038 * requested-attributes
1044 request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
1045 request->request.op.request_id = 1;
1047 language = cupsLangDefault();
1049 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
1050 "attributes-charset", NULL, cupsLangEncoding(language));
1052 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
1053 "attributes-natural-language", NULL, language->language);
1055 ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
1056 "requested-attributes",
1057 (sizeof(pattrs) / sizeof(pattrs[0])),
1060 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
1061 "printer-uri", NULL, uri);
1064 * Do the request and get back a response...
1067 if ((response = cupsDoRequest(http, request, "/")) == NULL)
1069 DEBUG(0,("Unable to get printer status for %s - %s\n", PRINTERNAME(snum),
1070 ippErrorString(cupsLastError())));
1076 if (response->request.status.status_code >= IPP_OK_CONFLICT)
1078 DEBUG(0,("Unable to get printer status for %s - %s\n", PRINTERNAME(snum),
1079 ippErrorString(response->request.status.status_code)));
1080 ippDelete(response);
1087 * Get the current printer status and convert it to the SAMBA values.
1090 if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL)
1092 if (attr->values[0].integer == IPP_PRINTER_STOPPED)
1093 status->status = LPSTAT_STOPPED;
1095 status->status = LPSTAT_OK;
1098 if ((attr = ippFindAttribute(response, "printer-state-message",
1099 IPP_TAG_TEXT)) != NULL)
1100 fstrcpy(status->message, attr->values[0].string.text);
1102 ippDelete(response);
1105 * Return the job queue...
1116 * 'cups_queue_pause()' - Pause a print queue.
1120 cups_queue_pause(int snum)
1122 extern userdom_struct current_user_info;
1123 int ret; /* Return value */
1124 http_t *http; /* HTTP connection to server */
1125 ipp_t *request, /* IPP Request */
1126 *response; /* IPP Response */
1127 cups_lang_t *language; /* Default language */
1128 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
1131 DEBUG(5,("cups_queue_pause(%d)\n", snum));
1134 * Make sure we don't ask for passwords...
1137 cupsSetPasswordCB(cups_passwd_cb);
1140 * Try to connect to the server...
1143 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
1145 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
1146 cupsServer(), strerror(errno)));
1151 * Build an IPP_PAUSE_PRINTER request, which requires the following
1154 * attributes-charset
1155 * attributes-natural-language
1157 * requesting-user-name
1162 request->request.op.operation_id = IPP_PAUSE_PRINTER;
1163 request->request.op.request_id = 1;
1165 language = cupsLangDefault();
1167 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
1168 "attributes-charset", NULL, cupsLangEncoding(language));
1170 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
1171 "attributes-natural-language", NULL, language->language);
1173 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
1176 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
1178 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
1179 NULL, current_user_info.unix_name);
1182 * Do the request and get back a response...
1187 if ((response = cupsDoRequest(http, request, "/admin/")) != NULL)
1189 if (response->request.status.status_code >= IPP_OK_CONFLICT)
1190 DEBUG(0,("Unable to pause printer %s - %s\n", PRINTERNAME(snum),
1191 ippErrorString(cupsLastError())));
1195 ippDelete(response);
1198 DEBUG(0,("Unable to pause printer %s - %s\n", PRINTERNAME(snum),
1199 ippErrorString(cupsLastError())));
1208 * 'cups_queue_resume()' - Restart a print queue.
1212 cups_queue_resume(int snum)
1214 extern userdom_struct current_user_info;
1215 int ret; /* Return value */
1216 http_t *http; /* HTTP connection to server */
1217 ipp_t *request, /* IPP Request */
1218 *response; /* IPP Response */
1219 cups_lang_t *language; /* Default language */
1220 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
1223 DEBUG(5,("cups_queue_resume(%d)\n", snum));
1226 * Make sure we don't ask for passwords...
1229 cupsSetPasswordCB(cups_passwd_cb);
1232 * Try to connect to the server...
1235 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
1237 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
1238 cupsServer(), strerror(errno)));
1243 * Build an IPP_RESUME_PRINTER request, which requires the following
1246 * attributes-charset
1247 * attributes-natural-language
1249 * requesting-user-name
1254 request->request.op.operation_id = IPP_RESUME_PRINTER;
1255 request->request.op.request_id = 1;
1257 language = cupsLangDefault();
1259 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
1260 "attributes-charset", NULL, cupsLangEncoding(language));
1262 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
1263 "attributes-natural-language", NULL, language->language);
1265 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
1268 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
1270 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
1271 NULL, current_user_info.unix_name);
1274 * Do the request and get back a response...
1279 if ((response = cupsDoRequest(http, request, "/admin/")) != NULL)
1281 if (response->request.status.status_code >= IPP_OK_CONFLICT)
1282 DEBUG(0,("Unable to resume printer %s - %s\n", PRINTERNAME(snum),
1283 ippErrorString(cupsLastError())));
1287 ippDelete(response);
1290 DEBUG(0,("Unable to resume printer %s - %s\n", PRINTERNAME(snum),
1291 ippErrorString(cupsLastError())));
1300 /* this keeps fussy compilers happy */
1301 void print_cups_dummy(void) {}
1302 #endif /* HAVE_CUPS */