#include "includes.h"
#include "printing.h"
#ifdef HAVE_IPRINT
#include <cups/cups.h>
#include <cups/language.h>
#define OPERATION_NOVELL_LIST_PRINTERS 0x401A
#define OPERATION_NOVELL_MGMT 0x401C
#define NOVELL_SERVER_SYSNAME "sysname="
#define NOVELL_SERVER_SYSNAME_NETWARE "NetWare IA32"
#define NOVELL_SERVER_VERSION_STRING "iprintserverversion="
#define NOVELL_SERVER_VERSION_OES_SP1 33554432
static const char *
iprint_passwd_cb(const char *prompt)
{
return (NULL);
}
static const char *iprint_server(void)
{
if ((lp_iprint_server() != NULL) && (strlen(lp_iprint_server()) > 0)) {
DEBUG(10, ("iprint server explicitly set to %s\n",
lp_iprint_server()));
return lp_iprint_server();
}
DEBUG(10, ("iprint server left to default %s\n", cupsServer()));
return cupsServer();
}
static int iprint_get_server_version(http_t *http, char* serviceUri)
{
ipp_t *request = NULL,
*response = NULL;
ipp_attribute_t *attr;
cups_lang_t *language = NULL;
char *ver;
char *vertmp;
int serverVersion = 0;
char *os;
int osFlag = 0;
char *temp;
request = ippNew();
request->request.op.operation_id = (ipp_op_t)OPERATION_NOVELL_MGMT;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, "utf-8");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"service-uri", NULL, serviceUri);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"operation-name", NULL, "get-server-version");
if (((response = cupsDoRequest(http, request, "/ipp/")) == NULL) ||
(response->request.status.status_code >= IPP_OK_CONFLICT))
goto out;
if (((attr = ippFindAttribute(response, "server-version",
IPP_TAG_STRING)) != NULL)) {
if ((ver = strstr(attr->values[0].string.text,
NOVELL_SERVER_VERSION_STRING)) != NULL) {
ver += strlen(NOVELL_SERVER_VERSION_STRING);
serverVersion = strtol(ver, &vertmp, 10);
if ((ver == vertmp) || (serverVersion < 0))
serverVersion = 0;
}
if ((os = strstr(attr->values[0].string.text,
NOVELL_SERVER_SYSNAME)) != NULL) {
os += strlen(NOVELL_SERVER_SYSNAME);
if ((temp = strchr(os,'<')) != NULL)
*temp = '\0';
if (strcmp(os,NOVELL_SERVER_SYSNAME_NETWARE))
osFlag = 1;
}
}
out:
if (response)
ippDelete(response);
if (language)
cupsLangFree(language);
if (osFlag == 0)
serverVersion *= -1;
return serverVersion;
}
static int iprint_cache_add_printer(http_t *http,
int reqId,
char* url)
{
ipp_t *request = NULL,
*response = NULL;
ipp_attribute_t *attr;
cups_lang_t *language = NULL;
char *name,
*info,
smb_enabled,
secure;
char *httpPath;
static const char *pattrs[] =
{
"printer-name",
"security-enabled",
"printer-info",
"smb-enabled"
};
request = ippNew();
request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
request->request.op.request_id = reqId;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, "utf-8");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, url);
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"requested-attributes",
(sizeof(pattrs) / sizeof(pattrs[0])),
NULL, pattrs);
if ((httpPath = strstr(url,"://")) == NULL ||
(httpPath = strchr(httpPath+3,'/')) == NULL)
{
ippDelete(request);
request = NULL;
goto out;
}
if ((response = cupsDoRequest(http, request, httpPath)) == NULL) {
ipp_status_t lastErr = cupsLastError();
if (lastErr == IPP_FORBIDDEN ||
lastErr == IPP_NOT_AUTHENTICATED ||
lastErr == IPP_NOT_AUTHORIZED)
goto out;
DEBUG(0,("Unable to get printer list - %s\n",
ippErrorString(lastErr)));
goto out;
}
for (attr = response->attrs; attr != NULL;) {
while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
attr = attr->next;
if (attr == NULL)
break;
name = NULL;
info = NULL;
smb_enabled= 1;
secure = 0;
while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER) {
if (strcmp(attr->name, "printer-name") == 0 &&
attr->value_tag == IPP_TAG_NAME)
name = attr->values[0].string.text;
if (strcmp(attr->name, "printer-info") == 0 &&
(attr->value_tag == IPP_TAG_TEXT ||
attr->value_tag == IPP_TAG_TEXTLANG))
info = attr->values[0].string.text;
if (!strcmp(attr->name, "smb-enabled") &&
((attr->value_tag == IPP_TAG_INTEGER &&
!attr->values[0].integer) ||
(attr->value_tag == IPP_TAG_BOOLEAN &&
!attr->values[0].boolean)))
smb_enabled = 0;
if (!strcmp(attr->name, "security-enabled") &&
((attr->value_tag == IPP_TAG_INTEGER &&
attr->values[0].integer) ||
(attr->value_tag == IPP_TAG_BOOLEAN &&
attr->values[0].boolean)))
secure = 1;
attr = attr->next;
}
if (name != NULL && !secure && smb_enabled)
pcap_cache_add(name, info);
}
out:
if (response)
ippDelete(response);
return(0);
}
BOOL iprint_cache_reload(void)
{
http_t *http = NULL;
ipp_t *request = NULL,
*response = NULL;
ipp_attribute_t *attr;
cups_lang_t *language = NULL;
int i;
BOOL ret = False;
DEBUG(5, ("reloading iprint printcap cache\n"));
cupsSetPasswordCB(iprint_passwd_cb);
if ((http = httpConnect(iprint_server(), ippPort())) == NULL) {
DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
iprint_server(), strerror(errno)));
goto out;
}
request = ippNew();
request->request.op.operation_id =
(ipp_op_t)OPERATION_NOVELL_LIST_PRINTERS;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, "utf-8");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"ipp-server", NULL, "ippSrvr");
if ((response = cupsDoRequest(http, request, "/ipp")) == NULL) {
DEBUG(0,("Unable to get printer list - %s\n",
ippErrorString(cupsLastError())));
goto out;
}
for (attr = response->attrs; attr != NULL;) {
while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
attr = attr->next;
if (attr == NULL)
break;
while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
{
if (strcmp(attr->name, "printer-name") == 0 &&
(attr->value_tag == IPP_TAG_URI ||
attr->value_tag == IPP_TAG_NAME ||
attr->value_tag == IPP_TAG_TEXT ||
attr->value_tag == IPP_TAG_NAMELANG ||
attr->value_tag == IPP_TAG_TEXTLANG))
{
for (i = 0; i<attr->num_values; i++)
{
char *url = attr->values[i].string.text;
if (!url || !strlen(url))
continue;
iprint_cache_add_printer(http, i+2, url);
}
}
attr = attr->next;
}
}
ret = True;
out:
if (response)
ippDelete(response);
if (language)
cupsLangFree(language);
if (http)
httpClose(http);
return ret;
}
static int iprint_job_delete(const char *sharename, const char *lprm_command, struct printjob *pjob)
{
int ret = 1;
http_t *http = NULL;
ipp_t *request = NULL,
*response = NULL;
cups_lang_t *language = NULL;
char uri[HTTP_MAX_URI];
char httpPath[HTTP_MAX_URI];
DEBUG(5,("iprint_job_delete(%s, %p (%d))\n", sharename, pjob, pjob->sysjob));
cupsSetPasswordCB(iprint_passwd_cb);
if ((http = httpConnect(iprint_server(), ippPort())) == NULL) {
DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
iprint_server(), strerror(errno)));
goto out;
}
request = ippNew();
request->request.op.operation_id = IPP_CANCEL_JOB;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, "utf-8");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
slprintf(uri, sizeof(uri) - 1, "ipp://%s/ipp/%s", iprint_server(), sharename);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", pjob->sysjob);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
NULL, pjob->user);
slprintf(httpPath, sizeof(httpPath) - 1, "/ipp/%s", sharename);
if ((response = cupsDoRequest(http, request, httpPath)) != NULL) {
if (response->request.status.status_code >= IPP_OK_CONFLICT) {
DEBUG(0,("Unable to cancel job %d - %s\n", pjob->sysjob,
ippErrorString(cupsLastError())));
} else {
ret = 0;
}
} else {
DEBUG(0,("Unable to cancel job %d - %s\n", pjob->sysjob,
ippErrorString(cupsLastError())));
}
out:
if (response)
ippDelete(response);
if (language)
cupsLangFree(language);
if (http)
httpClose(http);
return ret;
}
static int iprint_job_pause(int snum, struct printjob *pjob)
{
int ret = 1;
http_t *http = NULL;
ipp_t *request = NULL,
*response = NULL;
cups_lang_t *language = NULL;
char uri[HTTP_MAX_URI];
char httpPath[HTTP_MAX_URI];
DEBUG(5,("iprint_job_pause(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
cupsSetPasswordCB(iprint_passwd_cb);
if ((http = httpConnect(iprint_server(), ippPort())) == NULL) {
DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
iprint_server(), strerror(errno)));
goto out;
}
request = ippNew();
request->request.op.operation_id = IPP_HOLD_JOB;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, "utf-8");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
slprintf(uri, sizeof(uri) - 1, "ipp://%s/ipp/%s", iprint_server(), PRINTERNAME(snum));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", pjob->sysjob);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
NULL, pjob->user);
slprintf(httpPath, sizeof(httpPath) - 1, "/ipp/%s", PRINTERNAME(snum));
if ((response = cupsDoRequest(http, request, httpPath)) != NULL) {
if (response->request.status.status_code >= IPP_OK_CONFLICT) {
DEBUG(0,("Unable to hold job %d - %s\n", pjob->sysjob,
ippErrorString(cupsLastError())));
} else {
ret = 0;
}
} else {
DEBUG(0,("Unable to hold job %d - %s\n", pjob->sysjob,
ippErrorString(cupsLastError())));
}
out:
if (response)
ippDelete(response);
if (language)
cupsLangFree(language);
if (http)
httpClose(http);
return ret;
}
static int iprint_job_resume(int snum, struct printjob *pjob)
{
int ret = 1;
http_t *http = NULL;
ipp_t *request = NULL,
*response = NULL;
cups_lang_t *language = NULL;
char uri[HTTP_MAX_URI];
char httpPath[HTTP_MAX_URI];
DEBUG(5,("iprint_job_resume(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
cupsSetPasswordCB(iprint_passwd_cb);
if ((http = httpConnect(iprint_server(), ippPort())) == NULL) {
DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
iprint_server(), strerror(errno)));
goto out;
}
request = ippNew();
request->request.op.operation_id = IPP_RELEASE_JOB;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, "utf-8");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
slprintf(uri, sizeof(uri) - 1, "ipp://%s/ipp/%s", iprint_server(), PRINTERNAME(snum));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", pjob->sysjob);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
NULL, pjob->user);
slprintf(httpPath, sizeof(httpPath) - 1, "/ipp/%s", PRINTERNAME(snum));
if ((response = cupsDoRequest(http, request, httpPath)) != NULL) {
if (response->request.status.status_code >= IPP_OK_CONFLICT) {
DEBUG(0,("Unable to release job %d - %s\n", pjob->sysjob,
ippErrorString(cupsLastError())));
} else {
ret = 0;
}
} else {
DEBUG(0,("Unable to release job %d - %s\n", pjob->sysjob,
ippErrorString(cupsLastError())));
}
out:
if (response)
ippDelete(response);
if (language)
cupsLangFree(language);
if (http)
httpClose(http);
return ret;
}
static int iprint_job_submit(int snum, struct printjob *pjob)
{
int ret = 1;
http_t *http = NULL;
ipp_t *request = NULL,
*response = NULL;
ipp_attribute_t *attr;
cups_lang_t *language = NULL;
char uri[HTTP_MAX_URI];
char *clientname = NULL;
DEBUG(5,("iprint_job_submit(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
cupsSetPasswordCB(iprint_passwd_cb);
if ((http = httpConnect(iprint_server(), ippPort())) == NULL) {
DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
iprint_server(), strerror(errno)));
goto out;
}
request = ippNew();
request->request.op.operation_id = IPP_PRINT_JOB;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, "utf-8");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
slprintf(uri, sizeof(uri) - 1, "ipp://%s/ipp/%s", iprint_server(), PRINTERNAME(snum));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
NULL, pjob->user);
clientname = client_name();
if (strcmp(clientname, "UNKNOWN") == 0) {
clientname = client_addr();
}
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
"job-originating-host-name", NULL,
clientname);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL,
pjob->jobname);
slprintf(uri, sizeof(uri) - 1, "/ipp/%s", PRINTERNAME(snum));
if ((response = cupsDoFileRequest(http, request, uri, pjob->filename)) != NULL) {
if (response->request.status.status_code >= IPP_OK_CONFLICT) {
DEBUG(0,("Unable to print file to %s - %s\n", PRINTERNAME(snum),
ippErrorString(cupsLastError())));
} else {
ret = 0;
}
} else {
DEBUG(0,("Unable to print file to `%s' - %s\n", PRINTERNAME(snum),
ippErrorString(cupsLastError())));
}
if ( ret == 0 )
unlink(pjob->filename);
if ( ret == 0 ) {
attr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER);
if (attr != NULL && attr->group_tag == IPP_TAG_JOB)
{
pjob->sysjob = attr->values[0].integer;
}
}
out:
if (response)
ippDelete(response);
if (language)
cupsLangFree(language);
if (http)
httpClose(http);
return ret;
}
static int iprint_queue_get(const char *sharename,
enum printing_types printing_type,
char *lpq_command,
print_queue_struct **q,
print_status_struct *status)
{
fstring printername;
http_t *http = NULL;
ipp_t *request = NULL,
*response = NULL;
ipp_attribute_t *attr = NULL;
cups_lang_t *language = NULL;
char uri[HTTP_MAX_URI];
char serviceUri[HTTP_MAX_URI];
char httpPath[HTTP_MAX_URI];
int jobUseUnixTime = 0;
int qcount = 0,
qalloc = 0;
print_queue_struct *queue = NULL,
*temp;
const char *user_name,
*job_name;
int job_id;
int job_k_octets;
time_t job_time;
time_t printer_current_time = 0;
time_t printer_up_time = 0;
ipp_jstate_t job_status;
int job_priority;
static const char *jattrs[] =
{
"job-id",
"job-k-octets",
"job-name",
"job-originating-user-name",
"job-priority",
"job-state",
"time-at-creation",
};
static const char *pattrs[] =
{
"printer-state",
"printer-state-message",
"printer-current-time",
"printer-up-time"
};
*q = NULL;
fstrcpy( printername, lpq_command );
DEBUG(5,("iprint_queue_get(%s, %p, %p)\n", printername, q, status));
cupsSetPasswordCB(iprint_passwd_cb);
if ((http = httpConnect(iprint_server(), ippPort())) == NULL) {
DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
iprint_server(), strerror(errno)));
goto out;
}
slprintf(uri, sizeof(uri) - 1, "ipp://%s/ipp/%s", iprint_server(), printername);
slprintf(serviceUri, sizeof(serviceUri) - 1, "ipp://%s/ipp/", iprint_server());
if (iprint_get_server_version(http, serviceUri) >=
NOVELL_SERVER_VERSION_OES_SP1)
jobUseUnixTime = 1;
request = ippNew();
request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
request->request.op.request_id = 2;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, "utf-8");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"requested-attributes",
(sizeof(pattrs) / sizeof(pattrs[0])),
NULL, pattrs);
slprintf(httpPath, sizeof(httpPath) - 1, "/ipp/%s", printername);
if ((response = cupsDoRequest(http, request, httpPath)) == NULL) {
DEBUG(0,("Unable to get printer status for %s - %s\n", printername,
ippErrorString(cupsLastError())));
*q = queue;
goto out;
}
if (response->request.status.status_code >= IPP_OK_CONFLICT) {
DEBUG(0,("Unable to get printer status for %s - %s\n", printername,
ippErrorString(response->request.status.status_code)));
*q = queue;
goto out;
}
if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL) {
if (attr->values[0].integer == IPP_PRINTER_STOPPED)
status->status = LPSTAT_STOPPED;
else
status->status = LPSTAT_OK;
}
if ((attr = ippFindAttribute(response, "printer-state-message",
IPP_TAG_TEXT)) != NULL)
fstrcpy(status->message, attr->values[0].string.text);
if ((attr = ippFindAttribute(response, "printer-current-time",
IPP_TAG_DATE)) != NULL)
printer_current_time = ippDateToTime(attr->values[0].date);
if ((attr = ippFindAttribute(response, "printer-up-time",
IPP_TAG_INTEGER)) != NULL)
printer_up_time = attr->values[0].integer;
ippDelete(response);
response = NULL;
request = ippNew();
request->request.op.operation_id = IPP_GET_JOBS;
request->request.op.request_id = 3;
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, "utf-8");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"requested-attributes",
(sizeof(jattrs) / sizeof(jattrs[0])),
NULL, jattrs);
slprintf(httpPath, sizeof(httpPath) - 1, "/ipp/%s", printername);
if ((response = cupsDoRequest(http, request, httpPath)) == NULL) {
DEBUG(0,("Unable to get jobs for %s - %s\n", uri,
ippErrorString(cupsLastError())));
goto out;
}
if (response->request.status.status_code >= IPP_OK_CONFLICT) {
DEBUG(0,("Unable to get jobs for %s - %s\n", uri,
ippErrorString(response->request.status.status_code)));
goto out;
}
qcount = 0;
qalloc = 0;
queue = NULL;
for (attr = response->attrs; attr != NULL; attr = attr->next) {
while (attr != NULL && attr->group_tag != IPP_TAG_JOB)
attr = attr->next;
if (attr == NULL)
break;
if (qcount >= qalloc) {
qalloc += 16;
queue = SMB_REALLOC_ARRAY(queue, print_queue_struct, qalloc);
if (queue == NULL) {
DEBUG(0,("iprint_queue_get: Not enough memory!"));
qcount = 0;
goto out;
}
}
temp = queue + qcount;
memset(temp, 0, sizeof(print_queue_struct));
job_id = 0;
job_priority = 50;
job_status = IPP_JOB_PENDING;
job_time = 0;
job_k_octets = 0;
user_name = NULL;
job_name = NULL;
while (attr != NULL && attr->group_tag == IPP_TAG_JOB) {
if (attr->name == NULL) {
attr = attr->next;
break;
}
if (strcmp(attr->name, "job-id") == 0 &&
attr->value_tag == IPP_TAG_INTEGER)
job_id = attr->values[0].integer;
if (strcmp(attr->name, "job-k-octets") == 0 &&
attr->value_tag == IPP_TAG_INTEGER)
job_k_octets = attr->values[0].integer;
if (strcmp(attr->name, "job-priority") == 0 &&
attr->value_tag == IPP_TAG_INTEGER)
job_priority = attr->values[0].integer;
if (strcmp(attr->name, "job-state") == 0 &&
attr->value_tag == IPP_TAG_ENUM)
job_status = (ipp_jstate_t)(attr->values[0].integer);
if (strcmp(attr->name, "time-at-creation") == 0 &&
attr->value_tag == IPP_TAG_INTEGER)
{
if (jobUseUnixTime)
job_time = attr->values[0].integer;
else
job_time = time(NULL) - printer_up_time + attr->values[0].integer;
}
if (strcmp(attr->name, "job-name") == 0 &&
(attr->value_tag == IPP_TAG_NAMELANG ||
attr->value_tag == IPP_TAG_NAME))
job_name = attr->values[0].string.text;
if (strcmp(attr->name, "job-originating-user-name") == 0 &&
(attr->value_tag == IPP_TAG_NAMELANG ||
attr->value_tag == IPP_TAG_NAME))
user_name = attr->values[0].string.text;
attr = attr->next;
}
if (user_name == NULL || job_name == NULL || job_id == 0) {
if (attr == NULL)
break;
else
continue;
}
temp->job = job_id;
temp->size = job_k_octets * 1024;
temp->status = job_status == IPP_JOB_PENDING ? LPQ_QUEUED :
job_status == IPP_JOB_STOPPED ? LPQ_PAUSED :
job_status == IPP_JOB_HELD ? LPQ_PAUSED :
LPQ_PRINTING;
temp->priority = job_priority;
temp->time = job_time;
strncpy(temp->fs_user, user_name, sizeof(temp->fs_user) - 1);
strncpy(temp->fs_file, job_name, sizeof(temp->fs_file) - 1);
qcount ++;
if (attr == NULL)
break;
}
*q = queue;
out:
if (response)
ippDelete(response);
if (language)
cupsLangFree(language);
if (http)
httpClose(http);
return qcount;
}
static int iprint_queue_pause(int snum)
{
return(-1);
}
static int iprint_queue_resume(int snum)
{
return(-1);
}
struct printif iprint_printif =
{
PRINT_IPRINT,
iprint_queue_get,
iprint_queue_pause,
iprint_queue_resume,
iprint_job_delete,
iprint_job_pause,
iprint_job_resume,
iprint_job_submit,
};
#else
void print_iprint_dummy(void);
void print_iprint_dummy(void) {}
#endif