Revert manifest to default one
[external/cups.git] / cgi-bin / jobs.c
1 /*
2  * "$Id: jobs.c 9771 2011-05-12 05:21:56Z mike $"
3  *
4  *   Job status CGI for CUPS.
5  *
6  *   Copyright 2007-2011 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
32 static 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
39 int                                     /* O - Exit status */
40 main(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
137 static void
138 do_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     strcpy(url, "5;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 9771 2011-05-12 05:21:56Z mike $".
214  */