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.
25 #include <cups/cups.h>
26 #include <cups/language.h>
30 * CUPS printing interface definitions...
33 static int cups_job_delete(int snum, struct printjob *pjob);
34 static int cups_job_pause(int snum, struct printjob *pjob);
35 static int cups_job_resume(int snum, struct printjob *pjob);
36 static int cups_job_submit(int snum, struct printjob *pjob);
37 static int cups_queue_get(int snum, print_queue_struct **q,
38 print_status_struct *status);
39 static int cups_queue_pause(int snum);
40 static int cups_queue_resume(int snum);
43 struct printif cups_printif =
55 * 'cups_passwd_cb()' - The CUPS password callback...
58 static const char * /* O - Password or NULL */
59 cups_passwd_cb(const char *prompt) /* I - Prompt */
62 * Always return NULL to indicate that no password is available...
70 * 'cups_printer_fn()' - Call a function for every printer known to the
74 void cups_printer_fn(void (*fn)(char *, char *))
76 /* I - Function to call */
77 http_t *http; /* HTTP connection to server */
78 ipp_t *request, /* IPP Request */
79 *response; /* IPP Response */
80 ipp_attribute_t *attr; /* Current attribute */
81 cups_lang_t *language; /* Default language */
82 char *name, /* printer-name attribute */
83 *make_model, /* printer-make-and-model attribute */
84 *info; /* printer-info attribute */
85 static const char *requested[] =/* Requested attributes */
88 "printer-make-and-model",
93 DEBUG(5,("cups_printer_fn(%p)\n", fn));
96 * Make sure we don't ask for passwords...
99 cupsSetPasswordCB(cups_passwd_cb);
102 * Try to connect to the server...
105 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
107 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
108 cupsServer(), strerror(errno)));
113 * Build a CUPS_GET_PRINTERS request, which requires the following
117 * attributes-natural-language
118 * requested-attributes
123 request->request.op.operation_id = CUPS_GET_PRINTERS;
124 request->request.op.request_id = 1;
126 language = cupsLangDefault();
128 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
129 "attributes-charset", NULL, cupsLangEncoding(language));
131 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
132 "attributes-natural-language", NULL, language->language);
134 ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
135 "requested-attributes",
136 (sizeof(requested) / sizeof(requested[0])),
140 * Do the request and get back a response...
143 if ((response = cupsDoRequest(http, request, "/")) == NULL)
145 DEBUG(0,("Unable to get printer list - %s\n",
146 ippErrorString(cupsLastError())));
151 for (attr = response->attrs; attr != NULL;)
154 * Skip leading attributes until we hit a printer...
157 while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
164 * Pull the needed attributes from this printer...
171 while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
173 if (strcmp(attr->name, "printer-name") == 0 &&
174 attr->value_tag == IPP_TAG_NAME)
175 name = attr->values[0].string.text;
177 if (strcmp(attr->name, "printer-make-and-model") == 0 &&
178 attr->value_tag == IPP_TAG_TEXT)
179 make_model = attr->values[0].string.text;
181 if (strcmp(attr->name, "printer-info") == 0 &&
182 attr->value_tag == IPP_TAG_TEXT)
183 info = attr->values[0].string.text;
189 * See if we have everything needed...
195 if (info == NULL || !info[0])
196 (*fn)(name, make_model);
207 * Build a CUPS_GET_CLASSES request, which requires the following
211 * attributes-natural-language
212 * requested-attributes
217 request->request.op.operation_id = CUPS_GET_CLASSES;
218 request->request.op.request_id = 1;
220 language = cupsLangDefault();
222 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
223 "attributes-charset", NULL, cupsLangEncoding(language));
225 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
226 "attributes-natural-language", NULL, language->language);
228 ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
229 "requested-attributes",
230 (sizeof(requested) / sizeof(requested[0])),
234 * Do the request and get back a response...
237 if ((response = cupsDoRequest(http, request, "/")) == NULL)
239 DEBUG(0,("Unable to get printer list - %s\n",
240 ippErrorString(cupsLastError())));
245 for (attr = response->attrs; attr != NULL;)
248 * Skip leading attributes until we hit a printer...
251 while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
258 * Pull the needed attributes from this printer...
265 while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
267 if (strcmp(attr->name, "printer-name") == 0 &&
268 attr->value_tag == IPP_TAG_NAME)
269 name = attr->values[0].string.text;
271 if (strcmp(attr->name, "printer-make-and-model") == 0 &&
272 attr->value_tag == IPP_TAG_TEXT)
273 make_model = attr->values[0].string.text;
275 if (strcmp(attr->name, "printer-info") == 0 &&
276 attr->value_tag == IPP_TAG_TEXT)
277 info = attr->values[0].string.text;
283 * See if we have everything needed...
289 if (info == NULL || !info[0])
290 (*fn)(name, make_model);
300 * Close the connection to the server...
308 * 'cups_printername_ok()' - Provide the equivalent of pcap_printername_ok()
310 * O - 1 if printer name OK
311 * I - Name of printer
313 int cups_printername_ok(const char *name)
315 http_t *http; /* HTTP connection to server */
316 ipp_t *request, /* IPP Request */
317 *response; /* IPP Response */
318 cups_lang_t *language; /* Default language */
319 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
322 DEBUG(5,("cups_printername_ok(\"%s\")\n", name));
325 * Make sure we don't ask for passwords...
328 cupsSetPasswordCB(cups_passwd_cb);
331 * Try to connect to the server...
334 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
336 DEBUG(3,("Unable to connect to CUPS server %s - %s\n",
337 cupsServer(), strerror(errno)));
342 * Build an IPP_GET_PRINTER_ATTRS request, which requires the following
346 * attributes-natural-language
347 * requested-attributes
353 request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
354 request->request.op.request_id = 1;
356 language = cupsLangDefault();
358 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
359 "attributes-charset", NULL, cupsLangEncoding(language));
361 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
362 "attributes-natural-language", NULL, language->language);
364 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
365 "requested-attributes", NULL, "printer-uri");
367 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s", name);
369 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
370 "printer-uri", NULL, uri);
373 * Do the request and get back a response...
376 if ((response = cupsDoRequest(http, request, "/")) == NULL)
378 DEBUG(3,("Unable to get printer status for %s - %s\n", name,
379 ippErrorString(cupsLastError())));
386 if (response->request.status.status_code >= IPP_OK_CONFLICT)
388 DEBUG(3,("Unable to get printer status for %s - %s\n", name,
389 ippErrorString(response->request.status.status_code)));
402 * 'cups_job_delete()' - Delete a job.
406 cups_job_delete(int snum, struct printjob *pjob)
408 int ret; /* Return value */
409 http_t *http; /* HTTP connection to server */
410 ipp_t *request, /* IPP Request */
411 *response; /* IPP Response */
412 cups_lang_t *language; /* Default language */
413 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
416 DEBUG(5,("cups_job_delete(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
419 * Make sure we don't ask for passwords...
422 cupsSetPasswordCB(cups_passwd_cb);
425 * Try to connect to the server...
428 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
430 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
431 cupsServer(), strerror(errno)));
436 * Build an IPP_CANCEL_JOB request, which requires the following
440 * attributes-natural-language
442 * requesting-user-name
447 request->request.op.operation_id = IPP_CANCEL_JOB;
448 request->request.op.request_id = 1;
450 language = cupsLangDefault();
452 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
453 "attributes-charset", NULL, cupsLangEncoding(language));
455 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
456 "attributes-natural-language", NULL, language->language);
458 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/jobs/%d", pjob->sysjob);
460 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri);
462 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
466 * Do the request and get back a response...
471 if ((response = cupsDoRequest(http, request, "/jobs")) != NULL)
473 if (response->request.status.status_code >= IPP_OK_CONFLICT)
474 DEBUG(0,("Unable to cancel job %d - %s\n", pjob->sysjob,
475 ippErrorString(cupsLastError())));
482 DEBUG(0,("Unable to cancel job %d - %s\n", pjob->sysjob,
483 ippErrorString(cupsLastError())));
492 * 'cups_job_pause()' - Pause a job.
496 cups_job_pause(int snum, struct printjob *pjob)
498 int ret; /* Return value */
499 http_t *http; /* HTTP connection to server */
500 ipp_t *request, /* IPP Request */
501 *response; /* IPP Response */
502 cups_lang_t *language; /* Default language */
503 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
506 DEBUG(5,("cups_job_pause(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
509 * Make sure we don't ask for passwords...
512 cupsSetPasswordCB(cups_passwd_cb);
515 * Try to connect to the server...
518 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
520 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
521 cupsServer(), strerror(errno)));
526 * Build an IPP_HOLD_JOB request, which requires the following
530 * attributes-natural-language
532 * requesting-user-name
537 request->request.op.operation_id = IPP_HOLD_JOB;
538 request->request.op.request_id = 1;
540 language = cupsLangDefault();
542 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
543 "attributes-charset", NULL, cupsLangEncoding(language));
545 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
546 "attributes-natural-language", NULL, language->language);
548 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/jobs/%d", pjob->sysjob);
550 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri);
552 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
556 * Do the request and get back a response...
561 if ((response = cupsDoRequest(http, request, "/jobs")) != NULL)
563 if (response->request.status.status_code >= IPP_OK_CONFLICT)
564 DEBUG(0,("Unable to hold job %d - %s\n", pjob->sysjob,
565 ippErrorString(cupsLastError())));
572 DEBUG(0,("Unable to hold job %d - %s\n", pjob->sysjob,
573 ippErrorString(cupsLastError())));
582 * 'cups_job_resume()' - Resume a paused job.
586 cups_job_resume(int snum, struct printjob *pjob)
588 int ret; /* Return value */
589 http_t *http; /* HTTP connection to server */
590 ipp_t *request, /* IPP Request */
591 *response; /* IPP Response */
592 cups_lang_t *language; /* Default language */
593 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
596 DEBUG(5,("cups_job_resume(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
599 * Make sure we don't ask for passwords...
602 cupsSetPasswordCB(cups_passwd_cb);
605 * Try to connect to the server...
608 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
610 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
611 cupsServer(), strerror(errno)));
616 * Build an IPP_RELEASE_JOB request, which requires the following
620 * attributes-natural-language
622 * requesting-user-name
627 request->request.op.operation_id = IPP_RELEASE_JOB;
628 request->request.op.request_id = 1;
630 language = cupsLangDefault();
632 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
633 "attributes-charset", NULL, cupsLangEncoding(language));
635 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
636 "attributes-natural-language", NULL, language->language);
638 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/jobs/%d", pjob->sysjob);
640 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri);
642 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
646 * Do the request and get back a response...
651 if ((response = cupsDoRequest(http, request, "/jobs")) != NULL)
653 if (response->request.status.status_code >= IPP_OK_CONFLICT)
654 DEBUG(0,("Unable to release job %d - %s\n", pjob->sysjob,
655 ippErrorString(cupsLastError())));
662 DEBUG(0,("Unable to release job %d - %s\n", pjob->sysjob,
663 ippErrorString(cupsLastError())));
672 * 'cups_job_submit()' - Submit a job for printing.
676 cups_job_submit(int snum, struct printjob *pjob)
678 int ret; /* Return value */
679 http_t *http; /* HTTP connection to server */
680 ipp_t *request, /* IPP Request */
681 *response; /* IPP Response */
682 cups_lang_t *language; /* Default language */
683 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
684 char *clientname; /* hostname of client for job-originating-host attribute */
687 DEBUG(5,("cups_job_submit(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
690 * Make sure we don't ask for passwords...
693 cupsSetPasswordCB(cups_passwd_cb);
696 * Try to connect to the server...
699 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
701 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
702 cupsServer(), strerror(errno)));
707 * Build an IPP_PRINT_JOB request, which requires the following
711 * attributes-natural-language
713 * requesting-user-name
719 request->request.op.operation_id = IPP_PRINT_JOB;
720 request->request.op.request_id = 1;
722 language = cupsLangDefault();
724 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
725 "attributes-charset", NULL, cupsLangEncoding(language));
727 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
728 "attributes-natural-language", NULL, language->language);
730 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
733 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
734 "printer-uri", NULL, uri);
736 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
739 clientname = client_name();
740 if (strcmp(clientname, "UNKNOWN") == 0) {
741 clientname = client_addr();
744 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
745 "job-originating-host-name", NULL,
748 pstr_sprintf(new_jobname,"%s%.8u %s", PRINT_SPOOL_PREFIX,
749 (unsigned int)pjob->smbjob, pjob->jobname);
751 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL,
755 * Do the request and get back a response...
758 slprintf(uri, sizeof(uri) - 1, "/printers/%s", PRINTERNAME(snum));
761 if ((response = cupsDoFileRequest(http, request, uri,
762 pjob->filename)) != NULL)
764 if (response->request.status.status_code >= IPP_OK_CONFLICT)
765 DEBUG(0,("Unable to print file to %s - %s\n", PRINTERNAME(snum),
766 ippErrorString(cupsLastError())));
773 DEBUG(0,("Unable to print file to `%s' - %s\n", PRINTERNAME(snum),
774 ippErrorString(cupsLastError())));
779 unlink(pjob->filename);
780 /* else print_job_end will do it for us */
787 * 'cups_queue_get()' - Get all the jobs in the print queue.
791 cups_queue_get(int snum, print_queue_struct **q, print_status_struct *status)
793 http_t *http; /* HTTP connection to server */
794 ipp_t *request, /* IPP Request */
795 *response; /* IPP Response */
796 ipp_attribute_t *attr; /* Current attribute */
797 cups_lang_t *language; /* Default language */
798 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
799 int qcount, /* Number of active queue entries */
800 qalloc; /* Number of queue entries allocated */
801 print_queue_struct *queue, /* Queue entries */
802 *temp; /* Temporary pointer for queue */
803 const char *user_name, /* job-originating-user-name attribute */
804 *job_name; /* job-name attribute */
805 int job_id; /* job-id attribute */
806 int job_k_octets; /* job-k-octets attribute */
807 time_t job_time; /* time-at-creation attribute */
808 ipp_jstate_t job_status; /* job-status attribute */
809 int job_priority; /* job-priority attribute */
810 static const char *jattrs[] = /* Requested job attributes */
815 "job-originating-user-name",
820 static const char *pattrs[] = /* Requested printer attributes */
823 "printer-state-message"
827 DEBUG(5,("cups_queue_get(%d, %p, %p)\n", snum, q, status));
830 * Make sure we don't ask for passwords...
833 cupsSetPasswordCB(cups_passwd_cb);
836 * Try to connect to the server...
839 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
841 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
842 cupsServer(), strerror(errno)));
847 * Generate the printer URI...
850 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
854 * Build an IPP_GET_JOBS request, which requires the following
858 * attributes-natural-language
859 * requested-attributes
865 request->request.op.operation_id = IPP_GET_JOBS;
866 request->request.op.request_id = 1;
868 language = cupsLangDefault();
870 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
871 "attributes-charset", NULL, cupsLangEncoding(language));
873 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
874 "attributes-natural-language", NULL, language->language);
876 ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
877 "requested-attributes",
878 (sizeof(jattrs) / sizeof(jattrs[0])),
881 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
882 "printer-uri", NULL, uri);
885 * Do the request and get back a response...
888 if ((response = cupsDoRequest(http, request, "/")) == NULL)
890 DEBUG(0,("Unable to get jobs for %s - %s\n", uri,
891 ippErrorString(cupsLastError())));
896 if (response->request.status.status_code >= IPP_OK_CONFLICT)
898 DEBUG(0,("Unable to get jobs for %s - %s\n", uri,
899 ippErrorString(response->request.status.status_code)));
907 * Process the jobs...
914 for (attr = response->attrs; attr != NULL; attr = attr->next)
917 * Skip leading attributes until we hit a job...
920 while (attr != NULL && attr->group_tag != IPP_TAG_JOB)
927 * Allocate memory as needed...
929 if (qcount >= qalloc)
933 temp = Realloc(queue, sizeof(print_queue_struct) * qalloc);
937 DEBUG(0,("cups_queue_get: Not enough memory!"));
948 temp = queue + qcount;
949 memset(temp, 0, sizeof(print_queue_struct));
952 * Pull the needed attributes from this job...
957 job_status = IPP_JOB_PENDING;
963 while (attr != NULL && attr->group_tag == IPP_TAG_JOB)
965 if (attr->name == NULL)
971 if (strcmp(attr->name, "job-id") == 0 &&
972 attr->value_tag == IPP_TAG_INTEGER)
973 job_id = attr->values[0].integer;
975 if (strcmp(attr->name, "job-k-octets") == 0 &&
976 attr->value_tag == IPP_TAG_INTEGER)
977 job_k_octets = attr->values[0].integer;
979 if (strcmp(attr->name, "job-priority") == 0 &&
980 attr->value_tag == IPP_TAG_INTEGER)
981 job_priority = attr->values[0].integer;
983 if (strcmp(attr->name, "job-state") == 0 &&
984 attr->value_tag == IPP_TAG_ENUM)
985 job_status = (ipp_jstate_t)(attr->values[0].integer);
987 if (strcmp(attr->name, "time-at-creation") == 0 &&
988 attr->value_tag == IPP_TAG_INTEGER)
989 job_time = attr->values[0].integer;
991 if (strcmp(attr->name, "job-name") == 0 &&
992 attr->value_tag == IPP_TAG_NAME)
993 job_name = attr->values[0].string.text;
995 if (strcmp(attr->name, "job-originating-user-name") == 0 &&
996 attr->value_tag == IPP_TAG_NAME)
997 user_name = attr->values[0].string.text;
1003 * See if we have everything needed...
1006 if (user_name == NULL || job_name == NULL || job_id == 0)
1015 temp->size = job_k_octets * 1024;
1016 temp->status = job_status == IPP_JOB_PENDING ? LPQ_QUEUED :
1017 job_status == IPP_JOB_STOPPED ? LPQ_PAUSED :
1018 job_status == IPP_JOB_HELD ? LPQ_PAUSED :
1020 temp->priority = job_priority;
1021 temp->time = job_time;
1022 strncpy(temp->fs_user, user_name, sizeof(temp->fs_user) - 1);
1023 strncpy(temp->fs_file, job_name, sizeof(temp->fs_file) - 1);
1031 ippDelete(response);
1034 * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the
1035 * following attributes:
1037 * attributes-charset
1038 * attributes-natural-language
1039 * requested-attributes
1045 request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
1046 request->request.op.request_id = 1;
1048 language = cupsLangDefault();
1050 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
1051 "attributes-charset", NULL, cupsLangEncoding(language));
1053 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
1054 "attributes-natural-language", NULL, language->language);
1056 ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
1057 "requested-attributes",
1058 (sizeof(pattrs) / sizeof(pattrs[0])),
1061 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
1062 "printer-uri", NULL, uri);
1065 * Do the request and get back a response...
1068 if ((response = cupsDoRequest(http, request, "/")) == NULL)
1070 DEBUG(0,("Unable to get printer status for %s - %s\n", PRINTERNAME(snum),
1071 ippErrorString(cupsLastError())));
1077 if (response->request.status.status_code >= IPP_OK_CONFLICT)
1079 DEBUG(0,("Unable to get printer status for %s - %s\n", PRINTERNAME(snum),
1080 ippErrorString(response->request.status.status_code)));
1081 ippDelete(response);
1088 * Get the current printer status and convert it to the SAMBA values.
1091 if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL)
1093 if (attr->values[0].integer == IPP_PRINTER_STOPPED)
1094 status->status = LPSTAT_STOPPED;
1096 status->status = LPSTAT_OK;
1099 if ((attr = ippFindAttribute(response, "printer-state-message",
1100 IPP_TAG_TEXT)) != NULL)
1101 fstrcpy(status->message, attr->values[0].string.text);
1103 ippDelete(response);
1106 * Return the job queue...
1117 * 'cups_queue_pause()' - Pause a print queue.
1121 cups_queue_pause(int snum)
1123 extern userdom_struct current_user_info;
1124 int ret; /* Return value */
1125 http_t *http; /* HTTP connection to server */
1126 ipp_t *request, /* IPP Request */
1127 *response; /* IPP Response */
1128 cups_lang_t *language; /* Default language */
1129 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
1132 DEBUG(5,("cups_queue_pause(%d)\n", snum));
1135 * Make sure we don't ask for passwords...
1138 cupsSetPasswordCB(cups_passwd_cb);
1141 * Try to connect to the server...
1144 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
1146 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
1147 cupsServer(), strerror(errno)));
1152 * Build an IPP_PAUSE_PRINTER request, which requires the following
1155 * attributes-charset
1156 * attributes-natural-language
1158 * requesting-user-name
1163 request->request.op.operation_id = IPP_PAUSE_PRINTER;
1164 request->request.op.request_id = 1;
1166 language = cupsLangDefault();
1168 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
1169 "attributes-charset", NULL, cupsLangEncoding(language));
1171 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
1172 "attributes-natural-language", NULL, language->language);
1174 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
1177 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
1179 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
1180 NULL, current_user_info.unix_name);
1183 * Do the request and get back a response...
1188 if ((response = cupsDoRequest(http, request, "/admin/")) != NULL)
1190 if (response->request.status.status_code >= IPP_OK_CONFLICT)
1191 DEBUG(0,("Unable to pause printer %s - %s\n", PRINTERNAME(snum),
1192 ippErrorString(cupsLastError())));
1196 ippDelete(response);
1199 DEBUG(0,("Unable to pause printer %s - %s\n", PRINTERNAME(snum),
1200 ippErrorString(cupsLastError())));
1209 * 'cups_queue_resume()' - Restart a print queue.
1213 cups_queue_resume(int snum)
1215 extern userdom_struct current_user_info;
1216 int ret; /* Return value */
1217 http_t *http; /* HTTP connection to server */
1218 ipp_t *request, /* IPP Request */
1219 *response; /* IPP Response */
1220 cups_lang_t *language; /* Default language */
1221 char uri[HTTP_MAX_URI]; /* printer-uri attribute */
1224 DEBUG(5,("cups_queue_resume(%d)\n", snum));
1227 * Make sure we don't ask for passwords...
1230 cupsSetPasswordCB(cups_passwd_cb);
1233 * Try to connect to the server...
1236 if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
1238 DEBUG(0,("Unable to connect to CUPS server %s - %s\n",
1239 cupsServer(), strerror(errno)));
1244 * Build an IPP_RESUME_PRINTER request, which requires the following
1247 * attributes-charset
1248 * attributes-natural-language
1250 * requesting-user-name
1255 request->request.op.operation_id = IPP_RESUME_PRINTER;
1256 request->request.op.request_id = 1;
1258 language = cupsLangDefault();
1260 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
1261 "attributes-charset", NULL, cupsLangEncoding(language));
1263 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
1264 "attributes-natural-language", NULL, language->language);
1266 slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s",
1269 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
1271 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
1272 NULL, current_user_info.unix_name);
1275 * Do the request and get back a response...
1280 if ((response = cupsDoRequest(http, request, "/admin/")) != NULL)
1282 if (response->request.status.status_code >= IPP_OK_CONFLICT)
1283 DEBUG(0,("Unable to resume printer %s - %s\n", PRINTERNAME(snum),
1284 ippErrorString(cupsLastError())));
1288 ippDelete(response);
1291 DEBUG(0,("Unable to resume printer %s - %s\n", PRINTERNAME(snum),
1292 ippErrorString(cupsLastError())));
1301 /* this keeps fussy compilers happy */
1302 void print_cups_dummy(void) {}
1303 #endif /* HAVE_CUPS */