diff options
author | msweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be> | 2008-10-08 22:50:16 +0000 |
---|---|---|
committer | msweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be> | 2008-10-08 22:50:16 +0000 |
commit | 58dc193312e27d25c0394e4fcb7a6eed7301b1ec (patch) | |
tree | f36e45a693b16fbf643e8c168180f02343b38431 /cgi-bin/printers.c | |
parent | f2245c695c43045dbdc825289307099c9c4559a2 (diff) | |
download | cups-58dc193312e27d25c0394e4fcb7a6eed7301b1ec.tar.gz |
Merge changes from CUPS 1.4svn-r8033.
git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@1003 a1ca3aef-8c08-0410-bb20-df032aa958be
Diffstat (limited to 'cgi-bin/printers.c')
-rw-r--r-- | cgi-bin/printers.c | 232 |
1 files changed, 88 insertions, 144 deletions
diff --git a/cgi-bin/printers.c b/cgi-bin/printers.c index 131174263..d3e0224fd 100644 --- a/cgi-bin/printers.c +++ b/cgi-bin/printers.c @@ -14,10 +14,6 @@ * * Contents: * - * main() - Main entry for CGI. - * print_command() - Send a print command to the printer. - * show_all_printers() - Show all printers... - * show_printer() - Show a single printer. */ /* @@ -32,9 +28,10 @@ * Local functions... */ -void print_command(http_t *http, const char *printer, const char *command); -void show_all_printers(http_t *http, const char *username); -void show_printer(http_t *http, const char *printer); +static void do_printer_op(http_t *http, const char *printer, ipp_op_t op, + const char *title); +static void show_all_printers(http_t *http, const char *username); +static void show_printer(http_t *http, const char *printer); /* @@ -83,6 +80,9 @@ main(int argc, /* I - Number of command-line arguments */ if (!*printer) printer = NULL; + + if (printer) + cgiSetVariable("PRINTER_NAME", printer); } /* @@ -141,25 +141,48 @@ main(int argc, /* I - Number of command-line arguments */ else show_printer(http, printer); } - else if (!strcasecmp(op, "print-self-test-page") && printer) - print_command(http, printer, "PrintSelfTestPage"); - else if (!strcasecmp(op, "clean-print-heads") && printer) - print_command(http, printer, "Clean all"); - else if (!strcasecmp(op, "print-test-page") && printer) - cgiPrintTestPage(http, printer); - else if (!strcasecmp(op, "move-jobs") && printer) - cgiMoveJobs(http, printer, 0); + else if (printer) + { + if (!strcmp(op, "start-printer")) + do_printer_op(http, printer, IPP_RESUME_PRINTER, + cgiText(_("Resume Printer"))); + else if (!strcmp(op, "stop-printer")) + do_printer_op(http, printer, IPP_PAUSE_PRINTER, + cgiText(_("Pause Printer"))); + else if (!strcmp(op, "accept-jobs")) + do_printer_op(http, printer, CUPS_ACCEPT_JOBS, cgiText(_("Accept Jobs"))); + else if (!strcmp(op, "reject-jobs")) + do_printer_op(http, printer, CUPS_REJECT_JOBS, cgiText(_("Reject Jobs"))); + else if (!strcmp(op, "purge-jobs")) + do_printer_op(http, printer, IPP_PURGE_JOBS, cgiText(_("Purge Jobs"))); + else if (!strcasecmp(op, "print-self-test-page")) + cgiPrintCommand(http, printer, "PrintSelfTestPage", + cgiText(_("Print Self-Test Page"))); + else if (!strcasecmp(op, "clean-print-heads")) + cgiPrintCommand(http, printer, "Clean all", + cgiText(_("Clean Print Heads"))); + else if (!strcasecmp(op, "print-test-page")) + cgiPrintTestPage(http, printer); + else if (!strcasecmp(op, "move-jobs")) + cgiMoveJobs(http, printer, 0); + else + { + /* + * Unknown/bad operation... + */ + + cgiStartHTML(printer); + cgiCopyTemplateLang("error-op.tmpl"); + cgiEndHTML(); + } + } else { /* * Unknown/bad operation... */ - if (printer) - cgiStartHTML(printer); - else - cgiStartHTML(cgiText(_("Printers"))); - + cgiStartHTML(cgiText(_("Printers"))); cgiCopyTemplateLang("error-op.tmpl"); cgiEndHTML(); } @@ -179,122 +202,80 @@ main(int argc, /* I - Number of command-line arguments */ /* - * 'print_command()' - Send a print command to the printer. + * 'do_printer_op()' - Do a printer operation. */ -void -print_command(http_t *http, /* I - Connection to server */ - const char *printer, /* I - Printer */ - const char *command) /* I - Command to send */ +static void +do_printer_op(http_t *http, /* I - HTTP connection */ + const char *printer, /* I - Printer name */ + ipp_op_t op, /* I - Operation to perform */ + const char *title) /* I - Title of page */ { - cups_file_t *fp; /* File pointer */ - char filename[1024]; /* Temporary file */ - ipp_t *request, /* IPP request */ - *response; /* IPP response */ + ipp_t *request; /* IPP request */ char uri[HTTP_MAX_URI], /* Printer URI */ - resource[1024], /* POST resource path */ - refresh[1024]; /* Refresh URL */ - const char *user; /* Username */ - - - /* - * See who is logged in... - */ - - if ((user = getenv("REMOTE_USER")) == NULL) - user = "guest"; - - /* - * Create the CUPS command file to print... - */ - - if ((fp = cupsTempFile2(filename, sizeof(filename))) == NULL) - { - cgiStartHTML(cgiText(_("Printer Maintenance"))); - cgiSetVariable("MESSAGE", _("Unable to create temporary file:")); - cgiSetVariable("ERROR", strerror(errno)); - cgiCopyTemplateLang("error.tmpl"); - cgiEndHTML(); - return; - } - - cupsFilePuts(fp, "#CUPS-COMMAND\n"); - cupsFilePrintf(fp, "%s\n", command); - cupsFileClose(fp); - - /* - * Point to the printer... - */ - - snprintf(resource, sizeof(resource), "/printers/%s", printer); + resource[HTTP_MAX_URI]; /* Path for request */ - httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, - "localhost", ippPort(), "/printers/%s", printer); /* - * Build an IPP_PRINT_JOB request, which requires the following + * Build a printer request, which requires the following * attributes: * * attributes-charset * attributes-natural-language * printer-uri - * requesting-user-name - * document-format */ - request = ippNewRequest(IPP_PRINT_JOB); + request = ippNewRequest(op); + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", printer); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); - ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, - "requesting-user-name", NULL, user); - - ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", - NULL, "Printer Maintenance"); - - ippAddString(request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format", - NULL, "application/postscript"); - /* * Do the request and get back a response... */ - if ((response = cupsDoFileRequest(http, request, resource, - filename)) != NULL) - { - cgiSetIPPVars(response, NULL, NULL, NULL, 0); + snprintf(resource, sizeof(resource), "/printers/%s", printer); + ippDelete(cupsDoRequest(http, request, resource)); - ippDelete(response); + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); } - - unlink(filename); - - if (cupsLastError() <= IPP_OK_CONFLICT) + else if (cupsLastError() > IPP_OK_CONFLICT) + { + cgiStartHTML(title); + cgiShowIPPError(_("Unable to do maintenance command:")); + } + else { /* - * Automatically reload the printer status page... + * Redirect successful updates back to the printer page... */ - cgiFormEncode(uri, resource, sizeof(uri)); - snprintf(refresh, sizeof(refresh), "2;URL=%s", uri); - cgiSetVariable("refresh_page", refresh); - } - else if (cupsLastError() == IPP_NOT_AUTHORIZED) - { - puts("Status: 401\n"); - exit(0); - } + char url[1024], /* Printer/class URL */ + refresh[1024]; /* Refresh URL */ - cgiStartHTML(cgiText(_("Printer Maintenance"))); - if (cupsLastError() > IPP_OK_CONFLICT) - cgiShowIPPError(_("Unable to send maintenance job:")); - else - { - cgiSetVariable("PRINTER_NAME", printer); + cgiRewriteURL(uri, url, sizeof(url), NULL); + cgiFormEncode(uri, url, sizeof(uri)); + snprintf(refresh, sizeof(refresh), "5;URL=q%s", uri); + cgiSetVariable("refresh_page", refresh); - cgiCopyTemplateLang("maintenance.tmpl"); + cgiStartHTML(title); + + if (op == IPP_PAUSE_PRINTER) + cgiCopyTemplateLang("printer-stop.tmpl"); + else if (op == IPP_RESUME_PRINTER) + cgiCopyTemplateLang("printer-start.tmpl"); + else if (op == CUPS_ACCEPT_JOBS) + cgiCopyTemplateLang("printer-accept.tmpl"); + else if (op == CUPS_REJECT_JOBS) + cgiCopyTemplateLang("printer-reject.tmpl"); + else if (op == IPP_PURGE_JOBS) + cgiCopyTemplateLang("printer-purge.tmpl"); } cgiEndHTML(); @@ -305,7 +286,7 @@ print_command(http_t *http, /* I - Connection to server */ * 'show_all_printers()' - Show all printers... */ -void +static void show_all_printers(http_t *http, /* I - Connection to server */ const char *user) /* I - Username */ { @@ -408,42 +389,14 @@ show_all_printers(http_t *http, /* I - Connection to server */ for (i = 0, printer = (ipp_attribute_t *)cupsArrayIndex(printers, first); i < CUPS_PAGE_MAX && printer; i ++, printer = (ipp_attribute_t *)cupsArrayNext(printers)) - { cgiSetIPPObjectVars(printer, NULL, i); - - cgiSetArray("cupscommand", i, "0"); - - for (attr = printer; attr; attr = attr->next) - if (attr->group_tag != IPP_TAG_PRINTER || !attr->name) - break; - else if (!strcmp(attr->name, "printer-type")) - { - if (attr->values[0].integer & CUPS_PRINTER_COMMANDS) - cgiSetArray("cupscommand", i, "1"); - break; - } - } } else { for (i = 0, printer = (ipp_attribute_t *)cupsArrayIndex(printers, count - first - 1); i < CUPS_PAGE_MAX && printer; i ++, printer = (ipp_attribute_t *)cupsArrayPrev(printers)) - { cgiSetIPPObjectVars(printer, NULL, i); - - cgiSetArray("cupscommand", i, "0"); - - for (attr = printer; attr; attr = attr->next) - if (attr->group_tag == IPP_TAG_ZERO || !attr->name) - break; - else if (!strcmp(attr->name, "printer-type")) - { - if (attr->values[0].integer & CUPS_PRINTER_COMMANDS) - cgiSetArray("cupscommand", i, "1"); - break; - } - } } /* @@ -504,7 +457,7 @@ show_all_printers(http_t *http, /* I - Connection to server */ * 'show_printer()' - Show a single printer. */ -void +static void show_printer(http_t *http, /* I - Connection to server */ const char *printer) /* I - Name of printer */ { @@ -549,14 +502,6 @@ show_printer(http_t *http, /* I - Connection to server */ cgiSetIPPVars(response, NULL, NULL, NULL, 0); - if ((attr = ippFindAttribute(response, "printer-type", - IPP_TAG_ENUM)) != NULL) - { - cgiSetVariable("cupscommand", - (attr->values[0].integer & CUPS_PRINTER_COMMANDS) ? - "1" : "0"); - } - if (printer && (attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL && attr->values[0].integer == IPP_PRINTER_PROCESSING) @@ -587,7 +532,6 @@ show_printer(http_t *http, /* I - Connection to server */ * Show the printer status... */ - cgiSetVariable("_SINGLE_DEST", "1"); cgiCopyTemplateLang("printer.tmpl"); /* |