#include "ipp-var.h"
static void do_job_op(http_t *http, cups_lang_t *language, ipp_op_t op);
int
main(int argc,
char *argv[])
{
cups_lang_t *language;
http_t *http;
const char *which_jobs;
ipp_t *request,
*response;
const char *op;
cgiInitialize();
language = cupsLangDefault();
http = httpConnectEncrypt("localhost", ippPort(), cupsEncryption());
printf("Content-Type: text/html;charset=%s\n\n", cupsLangEncoding(language));
cgiSetVariable("TITLE", "Jobs");
ippSetServerVersion();
cgiCopyTemplateLang(stdout, TEMPLATES, "header.tmpl", getenv("LANG"));
if ((op = cgiGetVariable("OP")) != NULL)
{
if (strcmp(op, "cancel-job") == 0)
do_job_op(http, language, IPP_CANCEL_JOB);
else if (strcmp(op, "hold-job") == 0)
do_job_op(http, language, IPP_HOLD_JOB);
else if (strcmp(op, "release-job") == 0)
do_job_op(http, language, IPP_RELEASE_JOB);
else if (strcmp(op, "restart-job") == 0)
do_job_op(http, language, IPP_RESTART_JOB);
else
{
cgiCopyTemplateLang(stdout, TEMPLATES, "job-op.tmpl", getenv("LANG"));
}
}
else
{
request = ippNew();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
request->request.op.operation_id = IPP_GET_JOBS;
request->request.op.request_id = 1;
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL,
"ipp://localhost/jobs");
if ((which_jobs = cgiGetVariable("which_jobs")) != NULL)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs",
NULL, which_jobs);
ippGetAttributes(request, TEMPLATES, "jobs.tmpl", getenv("LANG"));
if ((response = cupsDoRequest(http, request, "/")) != NULL)
{
ippSetCGIVars(response, NULL, NULL, NULL, 0);
ippDelete(response);
cgiCopyTemplateLang(stdout, TEMPLATES, "jobs.tmpl", getenv("LANG"));
}
}
cgiCopyTemplateLang(stdout, TEMPLATES, "trailer.tmpl", getenv("LANG"));
httpClose(http);
cupsLangFree(language);
return (0);
}
static void
do_job_op(http_t *http,
cups_lang_t *language,
ipp_op_t op)
{
ipp_t *request,
*response;
char uri[HTTP_MAX_URI];
const char *job;
ipp_status_t status;
if ((job = cgiGetVariable("JOB_ID")) != NULL)
snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%s", job);
else
{
cgiSetVariable("ERROR", ippErrorString(IPP_NOT_FOUND));
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
return;
}
request = ippNew();
request->request.op.operation_id = op;
request->request.op.request_id = 1;
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri",
NULL, uri);
if (getenv("REMOTE_USER") != NULL)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
NULL, getenv("REMOTE_USER"));
else
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
NULL, "unknown");
if ((response = cupsDoRequest(http, request, "/jobs")) != NULL)
{
status = response->request.status.status_code;
ippDelete(response);
}
else
status = cupsLastError();
if (status > IPP_OK_CONFLICT)
{
cgiSetVariable("ERROR", ippErrorString(status));
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
}
else if (op == IPP_CANCEL_JOB)
cgiCopyTemplateLang(stdout, TEMPLATES, "job-cancel.tmpl", getenv("LANG"));
else if (op == IPP_HOLD_JOB)
cgiCopyTemplateLang(stdout, TEMPLATES, "job-hold.tmpl", getenv("LANG"));
else if (op == IPP_RELEASE_JOB)
cgiCopyTemplateLang(stdout, TEMPLATES, "job-release.tmpl", getenv("LANG"));
else if (op == IPP_RESTART_JOB)
cgiCopyTemplateLang(stdout, TEMPLATES, "job-restart.tmpl", getenv("LANG"));
}