20#include "ipprequest.h"
25#include <cups/language.h>
29#include <tqdatetime.h>
38static TQCString cups_authstring =
"";
40void dumpRequest(ipp_t *req,
bool answer =
false,
const TQString& s = TQString::null)
42 kdDebug(500) <<
"==========" << endl;
44 kdDebug(500) << (answer ?
"Answer" :
"Request") << endl;
46 kdDebug(500) << s << endl;
47 kdDebug(500) <<
"==========" << endl;
50 kdDebug(500) <<
"Null request" << endl;
53 kdDebug(500) <<
"State = 0x" << TQString::number(ippGetState(req), 16) << endl;
54 kdDebug(500) <<
"ID = 0x" << TQString::number(ippGetRequestId(req), 16) << endl;
57 kdDebug(500) <<
"Status = 0x" << TQString::number(ippGetStatusCode(req), 16) << endl;
58 kdDebug(500) <<
"Status message = " << ippErrorString(ippGetStatusCode(req)) << endl;
61 kdDebug(500) <<
"Operation = 0x" << TQString::number(ippGetOperation(req), 16) << endl;
63 int majorVersion = ippGetVersion(req, &minorVersion);
64 kdDebug(500) <<
"Version = " << (int)(majorVersion) <<
"." << (int)(minorVersion) << endl;
67 ipp_attribute_t *attr = ippFirstAttribute(req);
70 TQString s = TQString::fromLatin1(
"%1 (0x%2) = ").arg(ippGetName(attr)).arg(ippGetValueTag(attr), 0, 16);
71 for (
int i=0;i<ippGetCount(attr);i++)
73 switch (ippGetValueTag(attr))
77 s += (
"0x"+TQString::number(ippGetInteger(attr, i), 16));
80 s += (ippGetBoolean(attr, i) ?
"true" :
"false");
87 case IPP_TAG_MIMETYPE:
88 case IPP_TAG_NAMELANG:
89 case IPP_TAG_TEXTLANG:
91 case IPP_TAG_LANGUAGE:
92 s += ippGetString(attr, i, NULL);
97 if (i != (ippGetCount(attr)-1))
100 kdDebug(500) << s << endl;
101 attr = ippNextAttribute(req);
105TQString errorString(
int status)
111 str = i18n(
"You don't have access to the requested resource.");
113 case IPP_NOT_AUTHORIZED:
114 str = i18n(
"You are not authorized to access the requested resource.");
116 case IPP_NOT_POSSIBLE:
117 str = i18n(
"The requested operation cannot be completed.");
119 case IPP_SERVICE_UNAVAILABLE:
120 str = i18n(
"The requested service is currently unavailable.");
122 case IPP_NOT_ACCEPTING:
123 str = i18n(
"The target printer is not accepting print jobs.");
126 str = TQString::fromLocal8Bit(ippErrorString((ipp_status_t)status));
134IppRequest::IppRequest()
143IppRequest::~IppRequest()
148void IppRequest::init()
159 TQCString langstr = TDEGlobal::locale()->language().latin1();
160 cups_lang_t* lang = cupsLangGet(langstr.data());
162 lang->encoding = CUPS_UTF8;
163 ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(lang));
164 ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, lang->language);
168void IppRequest::addString_p(
int group,
int type,
const TQString& name,
const TQString& value)
171 ippAddString(request_,(ipp_tag_t)group,(ipp_tag_t)type,name.latin1(),NULL,(value.isEmpty() ?
"" : value.local8Bit().data()));
174void IppRequest::addStringList_p(
int group,
int type,
const TQString& name,
const TQStringList& values)
179 const char *vlsRefs[values.count()];
181 for(
unsigned i_vl = 0; i_vl < values.count(); i_vl++)
183 vlsRefs[i_vl] = (
const char*)vlsBuf.size();
184 vlsBuf += values[i_vl].local8Bit();
188 for(
unsigned i_vl = 0; i_vl < values.count(); i_vl++)
189 vlsRefs[i_vl] = vlsBuf.data()+(intptr_t)vlsRefs[i_vl];
190 ippAddStrings(request_,(ipp_tag_t)group,(ipp_tag_t)type,name.latin1(),(
int)(values.count()),NULL,(
const char**)&vlsRefs);
194void IppRequest::addInteger_p(
int group,
int type,
const TQString& name,
int value)
196 if (!name.isEmpty()) ippAddInteger(request_,(ipp_tag_t)group,(ipp_tag_t)type,name.latin1(),value);
199void IppRequest::addIntegerList_p(
int group,
int type,
const TQString& name,
const TQValueList<int>& values)
203 ipp_attribute_t *attr = ippAddIntegers(request_,(ipp_tag_t)group,(ipp_tag_t)type,name.latin1(),(
int)(values.count()),NULL);
205 for (TQValueList<int>::ConstIterator it=values.begin(); it != values.end(); ++it, i++)
206 ippSetInteger(request_, &attr, i, *it);
210void IppRequest::addBoolean(
int group,
const TQString& name,
bool value)
212 if (!name.isEmpty()) ippAddBoolean(request_,(ipp_tag_t)group,name.latin1(),(
char)value);
215void IppRequest::addBoolean(
int group,
const TQString& name,
const TQValueList<bool>& values)
219 ipp_attribute_t *attr = ippAddBooleans(request_,(ipp_tag_t)group,name.latin1(),(
int)(values.count()),NULL);
221 for (TQValueList<bool>::ConstIterator it=values.begin(); it != values.end(); ++it, i++)
222 ippSetBoolean(request_, &attr, i, (
char)(*it));
226void IppRequest::setOperation(
int op)
228 ippSetOperation(request_, (ipp_op_t)op);
229 ippSetRequestId(request_, 1);
232int IppRequest::status()
234 return (request_ ? ippGetStatusCode(request_) : (connect_ ? cupsLastError() : -2));
237TQString IppRequest::statusMessage()
243 msg = i18n(
"Connection to CUPS server failed. Check that the CUPS server is correctly installed and running.");
246 msg = i18n(
"The IPP request failed for an unknown reason.");
249 msg = errorString(status());
255bool IppRequest::integerValue_p(
const TQString& name,
int& value,
int type)
257 if (!request_ || name.isEmpty())
return false;
258 ipp_attribute_t *attr = ippFindAttribute(request_, name.latin1(), (ipp_tag_t)type);
261 value = ippGetInteger(attr, 0);
267bool IppRequest::stringValue_p(
const TQString& name, TQString& value,
int type)
269 if (!request_ || name.isEmpty())
return false;
270 ipp_attribute_t *attr = ippFindAttribute(request_, name.latin1(), (ipp_tag_t)type);
273 value = TQString::fromLocal8Bit(ippGetString(attr, 0, NULL));
279bool IppRequest::stringListValue_p(
const TQString& name, TQStringList& values,
int type)
281 if (!request_ || name.isEmpty())
return false;
282 ipp_attribute_t *attr = ippFindAttribute(request_, name.latin1(), (ipp_tag_t)type);
286 for (
int i=0;i<ippGetCount(attr);i++)
287 values.append(TQString::fromLocal8Bit(ippGetString(attr, i, NULL)));
293bool IppRequest::boolean(
const TQString& name,
bool& value)
295 if (!request_ || name.isEmpty())
return false;
296 ipp_attribute_t *attr = ippFindAttribute(request_, name.latin1(), IPP_TAG_BOOLEAN);
299 value = (bool)ippGetBoolean(attr, 0);
305bool IppRequest::doFileRequest(
const TQString& res,
const TQString& filename)
307 TQString myHost = host_;
309 if (myHost.isEmpty()) myHost = CupsInfos::self()->host();
310 if (myPort <= 0) myPort = CupsInfos::self()->port();
311 http_t *HTTP = httpConnect2(
312 myHost.latin1(), myPort, NULL, AF_UNSPEC,
313 HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL);
315 connect_ = (HTTP != NULL);
324 httpSetAuthString( HTTP, NULL, cups_authstring.data() );
328 dumpRequest(request_,
false,
"Request to "+myHost+
":"+TQString::number(myPort));
331 request_ = cupsDoFileRequest(HTTP, request_, (res.isEmpty() ?
"/" : res.latin1()), (filename.isEmpty() ? NULL : filename.latin1()));
332 cups_authstring = httpGetAuthString( HTTP );
337 dumpRequest(request_,
true);
341 if ( request_ && ippGetStatusCode(request_) == 0x406 )
344 if (!request_ || ippGetState(request_) == IPP_ERROR || (ippGetStatusCode(request_) & 0x0F00))
351bool IppRequest::htmlReport(
int group, TQTextStream& output)
353 if (!request_)
return false;
355 output <<
"<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">" << endl;
356 output <<
"<tr><th bgcolor=\"dark blue\"><font color=\"white\">" << i18n(
"Attribute") <<
"</font></th>" << endl;
357 output <<
"<th bgcolor=\"dark blue\"><font color=\"white\">" << i18n(
"Values") <<
"</font></th></tr>" << endl;
359 ipp_attribute_t *attr = ippFirstAttribute(request_);
360 while (attr && ippGetGroupTag(attr) != group)
361 attr = ippNextAttribute(request_);
363 const ipp_uchar_t *d;
367 while (attr && ippGetGroupTag(attr) == group)
369 output <<
" <tr bgcolor=\"" << (bg ?
"#ffffd9" :
"#ffffff") <<
"\">\n <td><b>" << ippGetName(attr) <<
"</b></td>\n <td>" << endl;
371 for (
int i=0; i<ippGetCount(attr); i++)
373 switch (ippGetValueTag(attr))
375 case IPP_TAG_INTEGER:
376 if (ippGetName(attr) && strstr(ippGetName(attr),
"time"))
378 dt.setTime_t((
unsigned int)(ippGetInteger(attr, i)));
379 output << dt.toString();
382 output << ippGetInteger(attr, i);
385 output <<
"0x" << hex << ippGetInteger(attr, i) << dec;
387 case IPP_TAG_BOOLEAN:
388 output << (ippGetBoolean(attr, i) ? i18n(
"True") : i18n(
"False"));
391 case IPP_TAG_TEXTLANG:
392 case IPP_TAG_NAMELANG:
395 case IPP_TAG_KEYWORD:
397 case IPP_TAG_CHARSET:
398 case IPP_TAG_LANGUAGE:
399 case IPP_TAG_MIMETYPE:
400 output << ippGetString(attr, i, NULL);
402 case IPP_TAG_RESOLUTION:
406 xres = ippGetResolution(attr, i, &yres, &units);
407 output <<
"( " << xres
408 <<
", " << yres <<
" )";
413 lowervalue = ippGetRange(attr, i, &uppervalue);
414 output <<
"[ " << (lowervalue > 0 ? lowervalue : 1)
415 <<
", " << (uppervalue > 0 ? uppervalue : 65535) <<
" ]";
418 d = ippGetDate(attr, i);
419 dateStr.sprintf(
"%.4d-%.2d-%.2d, %.2d:%.2d:%.2d %c%.2d%.2d",
420 d[0]*256+d[1], d[2], d[3],
428 if (i < ippGetCount(attr)-1)
431 output <<
"</td>\n </tr>" << endl;
432 attr = ippNextAttribute(request_);
435 output <<
"</table>" << endl;
440TQMap<TQString,TQString> IppRequest::toMap(
int group)
442 TQMap<TQString,TQString> opts;
445 ipp_attribute_t *attr = first();
448 if (group != -1 && ippGetGroupTag(attr) != group)
450 attr = ippNextAttribute(request_);
454 for (
int i=0; i<ippGetCount(attr); i++)
456 switch (ippGetValueTag(attr))
458 case IPP_TAG_INTEGER:
460 value.append(TQString::number(ippGetInteger(attr, i))).append(
",");
462 case IPP_TAG_BOOLEAN:
463 value.append((ippGetBoolean(attr, i) ?
"true" :
"false")).append(
",");
468 lowervalue = ippGetRange(attr, i, &uppervalue);
470 value.append(TQString::number(lowervalue));
471 if (lowervalue != uppervalue)
475 value.append(TQString::number(uppervalue));
482 case IPP_TAG_KEYWORD:
484 case IPP_TAG_MIMETYPE:
485 case IPP_TAG_NAMELANG:
486 case IPP_TAG_TEXTLANG:
487 case IPP_TAG_CHARSET:
488 case IPP_TAG_LANGUAGE:
489 value.append(TQString::fromLocal8Bit(ippGetString(attr, i, NULL))).append(
",");
495 if (!value.isEmpty())
496 value.truncate(value.length()-1);
497 opts[TQString::fromLocal8Bit(ippGetName(attr))] = value;
498 attr = ippNextAttribute(request_);
504void IppRequest::setMap(
const TQMap<TQString,TQString>& opts)
509 TQRegExp re(
"^\"|\"$");
510 cups_option_t *options = NULL;
512 for (TQMap<TQString,TQString>::ConstIterator it=opts.begin(); it!=opts.end(); ++it)
514 if (it.key().startsWith(
"kde-") || it.key().startsWith(
"app-"))
516 TQString value = it.data().stripWhiteSpace(), lovalue;
517 value.replace(re,
"");
518 lovalue = value.lower();
522 if (value ==
"true" || value ==
"false")
523 addBoolean(IPP_TAG_JOB, it.key(), (value ==
"true"));
524 else if (value.isEmpty() || lovalue ==
"off" || lovalue ==
"on"
525 || lovalue ==
"yes" || lovalue ==
"no"
526 || lovalue ==
"true" || lovalue ==
"false")
527 addName(IPP_TAG_JOB, it.key(), value);
529 n = cupsAddOption(it.key().local8Bit(), value.local8Bit(), n, &options);
532 cupsEncodeOptions(request_, n, options);
533 cupsFreeOptions(n, options);
536 ipp_attribute_t *attr = ippFindAttribute(request_,
"document-format", IPP_TAG_NAME);
537 ippDeleteAttribute(request_, attr);
540ipp_attribute_t* IppRequest::first()
541{
return (request_ ? ippFirstAttribute(request_) : NULL); }