1/* 2 * "$Id: jobs.c 11093 2013-07-03 20:48:42Z msweet $" 3 * 4 * Job status CGI for CUPS. 5 * 6 * Copyright 2007-2012 by Apple Inc. 7 * Copyright 1997-2006 by Easy Software Products. 8 * 9 * These coded instructions, statements, and computer programs are the 10 * property of Apple Inc. and are protected by Federal copyright 11 * law. Distribution and use rights are outlined in the file "LICENSE.txt" 12 * which should have been included with this file. If this file is 13 * file is missing or damaged, see the license at "http://www.cups.org/". 14 * 15 * Contents: 16 * 17 * main() - Main entry for CGI. 18 * do_job_op() - Do a job operation. 19 */ 20 21/* 22 * Include necessary headers... 23 */ 24 25#include "cgi-private.h" 26 27 28/* 29 * Local functions... 30 */ 31 32static void do_job_op(http_t *http, int job_id, ipp_op_t op); 33 34 35/* 36 * 'main()' - Main entry for CGI. 37 */ 38 39int /* O - Exit status */ 40main(int argc, /* I - Number of command-line arguments */ 41 char *argv[]) /* I - Command-line arguments */ 42{ 43 http_t *http; /* Connection to the server */ 44 const char *op; /* Operation name */ 45 const char *job_id_var; /* Job ID form variable */ 46 int job_id; /* Job ID */ 47 48 49 /* 50 * Get any form variables... 51 */ 52 53 cgiInitialize(); 54 55 /* 56 * Set the web interface section... 57 */ 58 59 cgiSetVariable("SECTION", "jobs"); 60 cgiSetVariable("REFRESH_PAGE", ""); 61 62 /* 63 * Connect to the HTTP server... 64 */ 65 66 http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); 67 68 /* 69 * Get the job ID, if any... 70 */ 71 72 if ((job_id_var = cgiGetVariable("JOB_ID")) != NULL) 73 job_id = atoi(job_id_var); 74 else 75 job_id = 0; 76 77 /* 78 * Do the operation... 79 */ 80 81 if ((op = cgiGetVariable("OP")) != NULL && job_id > 0 && cgiIsPOST()) 82 { 83 /* 84 * Do the operation... 85 */ 86 87 if (!strcmp(op, "cancel-job")) 88 do_job_op(http, job_id, IPP_CANCEL_JOB); 89 else if (!strcmp(op, "hold-job")) 90 do_job_op(http, job_id, IPP_HOLD_JOB); 91 else if (!strcmp(op, "move-job")) 92 cgiMoveJobs(http, NULL, job_id); 93 else if (!strcmp(op, "release-job")) 94 do_job_op(http, job_id, IPP_RELEASE_JOB); 95 else if (!strcmp(op, "restart-job")) 96 do_job_op(http, job_id, IPP_RESTART_JOB); 97 else 98 { 99 /* 100 * Bad operation code... Display an error... 101 */ 102 103 cgiStartHTML(cgiText(_("Jobs"))); 104 cgiCopyTemplateLang("error-op.tmpl"); 105 cgiEndHTML(); 106 } 107 } 108 else 109 { 110 /* 111 * Show a list of jobs... 112 */ 113 114 cgiStartHTML(cgiText(_("Jobs"))); 115 cgiShowJobs(http, NULL); 116 cgiEndHTML(); 117 } 118 119 /* 120 * Close the HTTP server connection... 121 */ 122 123 httpClose(http); 124 125 /* 126 * Return with no errors... 127 */ 128 129 return (0); 130} 131 132 133/* 134 * 'do_job_op()' - Do a job operation. 135 */ 136 137static void 138do_job_op(http_t *http, /* I - HTTP connection */ 139 int job_id, /* I - Job ID */ 140 ipp_op_t op) /* I - Operation to perform */ 141{ 142 ipp_t *request; /* IPP request */ 143 char uri[HTTP_MAX_URI]; /* Job URI */ 144 const char *user; /* Username */ 145 146 147 /* 148 * Build a job request, which requires the following 149 * attributes: 150 * 151 * attributes-charset 152 * attributes-natural-language 153 * job-uri or printer-uri (purge-jobs) 154 * requesting-user-name 155 */ 156 157 request = ippNewRequest(op); 158 159 snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id); 160 161 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", 162 NULL, uri); 163 164 if ((user = getenv("REMOTE_USER")) == NULL) 165 user = "guest"; 166 167 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, 168 "requesting-user-name", NULL, user); 169 170 /* 171 * Do the request and get back a response... 172 */ 173 174 ippDelete(cupsDoRequest(http, request, "/jobs")); 175 176 if (cupsLastError() <= IPP_OK_CONFLICT && getenv("HTTP_REFERER")) 177 { 178 /* 179 * Redirect successful updates back to the parent page... 180 */ 181 182 char url[1024]; /* Encoded URL */ 183 184 185 strlcpy(url, "5;URL=", sizeof(url)); 186 cgiFormEncode(url + 6, getenv("HTTP_REFERER"), sizeof(url) - 6); 187 cgiSetVariable("refresh_page", url); 188 } 189 else if (cupsLastError() == IPP_NOT_AUTHORIZED) 190 { 191 puts("Status: 401\n"); 192 exit(0); 193 } 194 195 cgiStartHTML(cgiText(_("Jobs"))); 196 197 if (cupsLastError() > IPP_OK_CONFLICT) 198 cgiShowIPPError(_("Job operation failed")); 199 else if (op == IPP_CANCEL_JOB) 200 cgiCopyTemplateLang("job-cancel.tmpl"); 201 else if (op == IPP_HOLD_JOB) 202 cgiCopyTemplateLang("job-hold.tmpl"); 203 else if (op == IPP_RELEASE_JOB) 204 cgiCopyTemplateLang("job-release.tmpl"); 205 else if (op == IPP_RESTART_JOB) 206 cgiCopyTemplateLang("job-restart.tmpl"); 207 208 cgiEndHTML(); 209} 210 211 212/* 213 * End of "$Id: jobs.c 11093 2013-07-03 20:48:42Z msweet $". 214 */ 215