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