Update to new CUPS 1.6 API

(cherry picked from commit 9bc0d2cd9d)
v3.5.13-sru
Timothy Pearson 12 years ago committed by Slávek Banko
parent 1eb94c672d
commit 6fc204a0c4

@ -688,6 +688,19 @@ if( WITH_CUPS )
set( HAVE_CUPS 1 ) set( HAVE_CUPS 1 )
# FIXME if CUPS is at least 1.1.20, doesn't have password caching # FIXME if CUPS is at least 1.1.20, doesn't have password caching
set( HAVE_CUPS_NO_PWD_CACHE 1 ) set( HAVE_CUPS_NO_PWD_CACHE 1 )
# save CMAKE_REQUIRED_LIBRARIES
set( bak_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} )
set( CMAKE_REQUIRED_LIBRARIES ${CUPS_LIBRARIES} )
check_c_source_compiles("
#include <cups/cups.h>
#include <cups/ipp.h>
#include <cups/language.h>
int main(int argc, char *argv[]) { ipp_attribute_t *attr = 0; ippGetName(attr); return 0; } "
HAVE_CUPS_1_6 )
# restore CMAKE_REQUIRED_LIBRARIES
set( CMAKE_REQUIRED_LIBRARIES ${bak_CMAKE_REQUIRED_LIBRARIES} )
unset( bak_CMAKE_REQUIRED_LIBRARIES )
endif( WITH_CUPS ) endif( WITH_CUPS )

@ -83,6 +83,9 @@
/* CUPS doesn't have password caching */ /* CUPS doesn't have password caching */
#cmakedefine HAVE_CUPS_NO_PWD_CACHE 1 #cmakedefine HAVE_CUPS_NO_PWD_CACHE 1
/* CUPS is at least version 1.6 */
#cmakedefine HAVE_CUPS_1_6 1
/* Define to 1 if you have the declaration of `getservbyname_r', and to 0 if you don't. */ /* Define to 1 if you have the declaration of `getservbyname_r', and to 0 if you don't. */
#undef HAVE_DECL_GETSERVBYNAME_R #undef HAVE_DECL_GETSERVBYNAME_R

@ -629,26 +629,44 @@ bool CupsdConf::loadAvailableResources()
cups_lang_t* lang = cupsLangDefault(); cups_lang_t* lang = cupsLangDefault();
ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, cupsLangEncoding(lang)); ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, cupsLangEncoding(lang));
ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, lang->language); ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, lang->language);
#ifdef HAVE_CUPS_1_6
ippSetOperation(request_, CUPS_GET_PRINTERS);
#else // HAVE_CUPS_1_6
request_->request.op.operation_id = CUPS_GET_PRINTERS; request_->request.op.operation_id = CUPS_GET_PRINTERS;
#endif // HAVE_CUPS_1_6
request_ = cupsDoRequest(http_, request_, "/printers/"); request_ = cupsDoRequest(http_, request_, "/printers/");
if (request_) if (request_)
{ {
TQString name; TQString name;
int type(0); int type(0);
#ifdef HAVE_CUPS_1_6
ipp_attribute_t *attr = ippFirstAttribute(request_);
#else // HAVE_CUPS_1_6
ipp_attribute_t *attr = request_->attrs; ipp_attribute_t *attr = request_->attrs;
#endif // HAVE_CUPS_1_6
while (attr) while (attr)
{ {
// check new printer (keep only local non-implicit printers) // check new printer (keep only local non-implicit printers)
#ifdef HAVE_CUPS_1_6
if (!ippGetName(attr))
#else // HAVE_CUPS_1_6
if (!attr->name) if (!attr->name)
#endif // HAVE_CUPS_1_6
{ {
if (!(type & CUPS_PRINTER_REMOTE) && !(type & CUPS_PRINTER_IMPLICIT) && !name.isEmpty()) if (!(type & CUPS_PRINTER_REMOTE) && !(type & CUPS_PRINTER_IMPLICIT) && !name.isEmpty())
resources_.append(new CupsResource("/printers/"+name)); resources_.append(new CupsResource("/printers/"+name));
name = ""; name = "";
type = 0; type = 0;
} }
#ifdef HAVE_CUPS_1_6
else if (strcmp(ippGetName(attr), "printer-name") == 0) name = ippGetString(attr, 0, NULL);
else if (strcmp(ippGetName(attr), "printer-type") == 0) type = ippGetInteger(attr, 0);
attr = ippNextAttribute(request_);
#else // HAVE_CUPS_1_6
else if (strcmp(attr->name, "printer-name") == 0) name = attr->values[0].string.text; else if (strcmp(attr->name, "printer-name") == 0) name = attr->values[0].string.text;
else if (strcmp(attr->name, "printer-type") == 0) type = attr->values[0].integer; else if (strcmp(attr->name, "printer-type") == 0) type = attr->values[0].integer;
attr = attr->next; attr = attr->next;
#endif // HAVE_CUPS_1_6
} }
if (!(type & CUPS_PRINTER_REMOTE) && !(type & CUPS_PRINTER_IMPLICIT) && !name.isEmpty()) if (!(type & CUPS_PRINTER_REMOTE) && !(type & CUPS_PRINTER_IMPLICIT) && !name.isEmpty())
resources_.append(new CupsResource("/printers/"+name)); resources_.append(new CupsResource("/printers/"+name));
@ -658,26 +676,44 @@ bool CupsdConf::loadAvailableResources()
request_ = ippNew(); request_ = ippNew();
ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, cupsLangEncoding(lang)); ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, cupsLangEncoding(lang));
ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, lang->language); ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, lang->language);
#ifdef HAVE_CUPS_1_6
ippSetOperation(request_, CUPS_GET_CLASSES);
#else // HAVE_CUPS_1_6
request_->request.op.operation_id = CUPS_GET_CLASSES; request_->request.op.operation_id = CUPS_GET_CLASSES;
#endif // HAVE_CUPS_1_6
request_ = cupsDoRequest(http_, request_, "/classes/"); request_ = cupsDoRequest(http_, request_, "/classes/");
if (request_) if (request_)
{ {
TQString name; TQString name;
int type(0); int type(0);
#ifdef HAVE_CUPS_1_6
ipp_attribute_t *attr = ippFirstAttribute(request_);
#else // HAVE_CUPS_1_6
ipp_attribute_t *attr = request_->attrs; ipp_attribute_t *attr = request_->attrs;
#endif // HAVE_CUPS_1_6
while (attr) while (attr)
{ {
// check new class (keep only local classes) // check new class (keep only local classes)
#ifdef HAVE_CUPS_1_6
if (!ippGetName(attr))
#else // HAVE_CUPS_1_6
if (!attr->name) if (!attr->name)
#endif // HAVE_CUPS_1_6
{ {
if (!(type & CUPS_PRINTER_REMOTE) && !name.isEmpty()) if (!(type & CUPS_PRINTER_REMOTE) && !name.isEmpty())
resources_.append(new CupsResource("/classes/"+name)); resources_.append(new CupsResource("/classes/"+name));
name = ""; name = "";
type = 0; type = 0;
} }
#ifdef HAVE_CUPS_1_6
else if (strcmp(ippGetName(attr), "printer-name") == 0) name = ippGetString(attr, 0, NULL);
else if (strcmp(ippGetName(attr), "printer-type") == 0) type = ippGetInteger(attr, 0);
attr = ippNextAttribute(request_);
#else // HAVE_CUPS_1_6
else if (strcmp(attr->name, "printer-name") == 0) name = attr->values[0].string.text; else if (strcmp(attr->name, "printer-name") == 0) name = attr->values[0].string.text;
else if (strcmp(attr->name, "printer-type") == 0) type = attr->values[0].integer; else if (strcmp(attr->name, "printer-type") == 0) type = attr->values[0].integer;
attr = attr->next; attr = attr->next;
#endif // HAVE_CUPS_1_6
} }
if (!(type & CUPS_PRINTER_REMOTE) && !name.isEmpty()) if (!(type & CUPS_PRINTER_REMOTE) && !name.isEmpty())
resources_.append(new CupsResource("/classes/"+name)); resources_.append(new CupsResource("/classes/"+name));

@ -51,6 +51,58 @@ void dumpRequest(ipp_t *req, bool answer = false, const TQString& s = TQString::
kdDebug(500) << "Null request" << endl; kdDebug(500) << "Null request" << endl;
return; return;
} }
#ifdef HAVE_CUPS_1_6
kdDebug(500) << "State = 0x" << TQString::number(ippGetState(req), 16) << endl;
kdDebug(500) << "ID = 0x" << TQString::number(ippGetRequestId(req), 16) << endl;
if (answer)
{
kdDebug(500) << "Status = 0x" << TQString::number(ippGetStatusCode(req), 16) << endl;
kdDebug(500) << "Status message = " << ippErrorString(ippGetStatusCode(req)) << endl;
}
else
kdDebug(500) << "Operation = 0x" << TQString::number(ippGetOperation(req), 16) << endl;
int minorVersion;
int majorVersion = ippGetVersion(req, &minorVersion);
kdDebug(500) << "Version = " << (int)(majorVersion) << "." << (int)(minorVersion) << endl;
kdDebug(500) << endl;
ipp_attribute_t *attr = ippFirstAttribute(req);
while (attr)
{
TQString s = TQString::fromLatin1("%1 (0x%2) = ").arg(ippGetName(attr)).arg(ippGetValueTag(attr), 0, 16);
for (int i=0;i<ippGetCount(attr);i++)
{
switch (ippGetValueTag(attr))
{
case IPP_TAG_INTEGER:
case IPP_TAG_ENUM:
s += ("0x"+TQString::number(ippGetInteger(attr, i), 16));
break;
case IPP_TAG_BOOLEAN:
s += (ippGetBoolean(attr, i) ? "true" : "false");
break;
case IPP_TAG_STRING:
case IPP_TAG_TEXT:
case IPP_TAG_NAME:
case IPP_TAG_KEYWORD:
case IPP_TAG_URI:
case IPP_TAG_MIMETYPE:
case IPP_TAG_NAMELANG:
case IPP_TAG_TEXTLANG:
case IPP_TAG_CHARSET:
case IPP_TAG_LANGUAGE:
s += ippGetString(attr, i, NULL);
break;
default:
break;
}
if (i != (ippGetCount(attr)-1))
s += ", ";
}
kdDebug(500) << s << endl;
attr = ippNextAttribute(req);
}
#else // HAVE_CUPS_1_6
kdDebug(500) << "State = 0x" << TQString::number(req->state, 16) << endl; kdDebug(500) << "State = 0x" << TQString::number(req->state, 16) << endl;
kdDebug(500) << "ID = 0x" << TQString::number(req->request.status.request_id, 16) << endl; kdDebug(500) << "ID = 0x" << TQString::number(req->request.status.request_id, 16) << endl;
if (answer) if (answer)
@ -99,6 +151,7 @@ void dumpRequest(ipp_t *req, bool answer = false, const TQString& s = TQString::
kdDebug(500) << s << endl; kdDebug(500) << s << endl;
attr = attr->next; attr = attr->next;
} }
#endif // HAVE_CUPS_1_6
} }
TQString errorString(int status) TQString errorString(int status)
@ -177,7 +230,11 @@ void IppRequest::addStringList_p(int group, int type, const TQString& name, cons
ipp_attribute_t *attr = ippAddStrings(request_,(ipp_tag_t)group,(ipp_tag_t)type,name.latin1(),(int)(values.count()),NULL,NULL); ipp_attribute_t *attr = ippAddStrings(request_,(ipp_tag_t)group,(ipp_tag_t)type,name.latin1(),(int)(values.count()),NULL,NULL);
int i(0); int i(0);
for (TQStringList::ConstIterator it=values.begin(); it != values.end(); ++it, i++) for (TQStringList::ConstIterator it=values.begin(); it != values.end(); ++it, i++)
#ifdef HAVE_CUPS_1_6
ippSetString(request_, &attr, i, strdup((*it).local8Bit()));
#else // HAVE_CUPS_1_6
attr->values[i].string.text = strdup((*it).local8Bit()); attr->values[i].string.text = strdup((*it).local8Bit());
#endif // HAVE_CUPS_1_6
} }
} }
@ -193,7 +250,11 @@ void IppRequest::addIntegerList_p(int group, int type, const TQString& name, con
ipp_attribute_t *attr = ippAddIntegers(request_,(ipp_tag_t)group,(ipp_tag_t)type,name.latin1(),(int)(values.count()),NULL); ipp_attribute_t *attr = ippAddIntegers(request_,(ipp_tag_t)group,(ipp_tag_t)type,name.latin1(),(int)(values.count()),NULL);
int i(0); int i(0);
for (TQValueList<int>::ConstIterator it=values.begin(); it != values.end(); ++it, i++) for (TQValueList<int>::ConstIterator it=values.begin(); it != values.end(); ++it, i++)
#ifdef HAVE_CUPS_1_6
ippSetInteger(request_, &attr, i, *it);
#else // HAVE_CUPS_1_6
attr->values[i].integer = *it; attr->values[i].integer = *it;
#endif // HAVE_CUPS_1_6
} }
} }
@ -209,19 +270,32 @@ void IppRequest::addBoolean(int group, const TQString& name, const TQValueList<b
ipp_attribute_t *attr = ippAddBooleans(request_,(ipp_tag_t)group,name.latin1(),(int)(values.count()),NULL); ipp_attribute_t *attr = ippAddBooleans(request_,(ipp_tag_t)group,name.latin1(),(int)(values.count()),NULL);
int i(0); int i(0);
for (TQValueList<bool>::ConstIterator it=values.begin(); it != values.end(); ++it, i++) for (TQValueList<bool>::ConstIterator it=values.begin(); it != values.end(); ++it, i++)
#ifdef HAVE_CUPS_1_6
ippSetBoolean(request_, &attr, i, (char)(*it));
#else // HAVE_CUPS_1_6
attr->values[i].boolean = (char)(*it); attr->values[i].boolean = (char)(*it);
#endif // HAVE_CUPS_1_6
} }
} }
void IppRequest::setOperation(int op) void IppRequest::setOperation(int op)
{ {
#ifdef HAVE_CUPS_1_6
ippSetOperation(request_, (ipp_op_t)op);
ippSetRequestId(request_, 1); // 0 is not RFC-compliant, should be at least 1
#else // HAVE_CUPS_1_6
request_->request.op.operation_id = (ipp_op_t)op; request_->request.op.operation_id = (ipp_op_t)op;
request_->request.op.request_id = 1; // 0 is not RFC-compliant, should be at least 1 request_->request.op.request_id = 1; // 0 is not RFC-compliant, should be at least 1
#endif // HAVE_CUPS_1_6
} }
int IppRequest::status() int IppRequest::status()
{ {
#ifdef HAVE_CUPS_1_6
return (request_ ? ippGetStatusCode(request_) : (connect_ ? cupsLastError() : -2));
#else // HAVE_CUPS_1_6
return (request_ ? request_->request.status.status_code : (connect_ ? cupsLastError() : -2)); return (request_ ? request_->request.status.status_code : (connect_ ? cupsLastError() : -2));
#endif // HAVE_CUPS_1_6
} }
TQString IppRequest::statusMessage() TQString IppRequest::statusMessage()
@ -248,7 +322,11 @@ bool IppRequest::integerValue_p(const TQString& name, int& value, int type)
ipp_attribute_t *attr = ippFindAttribute(request_, name.latin1(), (ipp_tag_t)type); ipp_attribute_t *attr = ippFindAttribute(request_, name.latin1(), (ipp_tag_t)type);
if (attr) if (attr)
{ {
#ifdef HAVE_CUPS_1_6
value = ippGetInteger(attr, 0);
#else // HAVE_CUPS_1_6
value = attr->values[0].integer; value = attr->values[0].integer;
#endif // HAVE_CUPS_1_6
return true; return true;
} }
else return false; else return false;
@ -260,7 +338,11 @@ bool IppRequest::stringValue_p(const TQString& name, TQString& value, int type)
ipp_attribute_t *attr = ippFindAttribute(request_, name.latin1(), (ipp_tag_t)type); ipp_attribute_t *attr = ippFindAttribute(request_, name.latin1(), (ipp_tag_t)type);
if (attr) if (attr)
{ {
#ifdef HAVE_CUPS_1_6
value = TQString::fromLocal8Bit(ippGetString(attr, 0, NULL));
#else // HAVE_CUPS_1_6
value = TQString::fromLocal8Bit(attr->values[0].string.text); value = TQString::fromLocal8Bit(attr->values[0].string.text);
#endif // HAVE_CUPS_1_6
return true; return true;
} }
else return false; else return false;
@ -273,8 +355,13 @@ bool IppRequest::stringListValue_p(const TQString& name, TQStringList& values, i
values.clear(); values.clear();
if (attr) if (attr)
{ {
#ifdef HAVE_CUPS_1_6
for (int i=0;i<ippGetCount(attr);i++)
values.append(TQString::fromLocal8Bit(ippGetString(attr, i, NULL)));
#else // HAVE_CUPS_1_6
for (int i=0;i<attr->num_values;i++) for (int i=0;i<attr->num_values;i++)
values.append(TQString::fromLocal8Bit(attr->values[i].string.text)); values.append(TQString::fromLocal8Bit(attr->values[i].string.text));
#endif // HAVE_CUPS_1_6
return true; return true;
} }
else return false; else return false;
@ -286,7 +373,11 @@ bool IppRequest::boolean(const TQString& name, bool& value)
ipp_attribute_t *attr = ippFindAttribute(request_, name.latin1(), IPP_TAG_BOOLEAN); ipp_attribute_t *attr = ippFindAttribute(request_, name.latin1(), IPP_TAG_BOOLEAN);
if (attr) if (attr)
{ {
#ifdef HAVE_CUPS_1_6
value = (bool)ippGetBoolean(attr, 0);
#else // HAVE_CUPS_1_6
value = (bool)attr->values[0].boolean; value = (bool)attr->values[0].boolean;
#endif // HAVE_CUPS_1_6
return true; return true;
} }
else return false; else return false;
@ -338,10 +429,18 @@ bool IppRequest::doFileRequest(const TQString& res, const TQString& filename)
} }
/* No printers found */ /* No printers found */
#ifdef HAVE_CUPS_1_6
if ( request_ && ippGetStatusCode(request_) == 0x406 )
#else // HAVE_CUPS_1_6
if ( request_ && request_->request.status.status_code == 0x406 ) if ( request_ && request_->request.status.status_code == 0x406 )
#endif // HAVE_CUPS_1_6
return true; return true;
#ifdef HAVE_CUPS_1_6
if (!request_ || ippGetState(request_) == IPP_ERROR || (ippGetStatusCode(request_) & 0x0F00))
#else // HAVE_CUPS_1_6
if (!request_ || request_->state == IPP_ERROR || (request_->request.status.status_code & 0x0F00)) if (!request_ || request_->state == IPP_ERROR || (request_->request.status.status_code & 0x0F00))
#endif // HAVE_CUPS_1_6
return false; return false;
@ -356,14 +455,88 @@ bool IppRequest::htmlReport(int group, TQTextStream& output)
output << "<tr><th bgcolor=\"dark blue\"><font color=\"white\">" << i18n("Attribute") << "</font></th>" << endl; output << "<tr><th bgcolor=\"dark blue\"><font color=\"white\">" << i18n("Attribute") << "</font></th>" << endl;
output << "<th bgcolor=\"dark blue\"><font color=\"white\">" << i18n("Values") << "</font></th></tr>" << endl; output << "<th bgcolor=\"dark blue\"><font color=\"white\">" << i18n("Values") << "</font></th></tr>" << endl;
// go to the first attribute of the specified group // go to the first attribute of the specified group
#ifdef HAVE_CUPS_1_6
ipp_attribute_t *attr = ippFirstAttribute(request_);
while (attr && ippGetGroupTag(attr) != group)
attr = ippNextAttribute(request_);
#else // HAVE_CUPS_1_6
ipp_attribute_t *attr = request_->attrs; ipp_attribute_t *attr = request_->attrs;
while (attr && attr->group_tag != group) while (attr && attr->group_tag != group)
attr = attr->next; attr = attr->next;
#endif // HAVE_CUPS_1_6
// print each attribute // print each attribute
ipp_uchar_t *d; const ipp_uchar_t *d;
TQCString dateStr; TQCString dateStr;
TQDateTime dt; TQDateTime dt;
bool bg(false); bool bg(false);
#ifdef HAVE_CUPS_1_6
while (attr && ippGetGroupTag(attr) == group)
{
output << " <tr bgcolor=\"" << (bg ? "#ffffd9" : "#ffffff") << "\">\n <td><b>" << ippGetName(attr) << "</b></td>\n <td>" << endl;
bg = !bg;
for (int i=0; i<ippGetCount(attr); i++)
{
switch (ippGetValueTag(attr))
{
case IPP_TAG_INTEGER:
if (ippGetName(attr) && strstr(ippGetName(attr), "time"))
{
dt.setTime_t((unsigned int)(ippGetInteger(attr, i)));
output << dt.toString();
}
else
output << ippGetInteger(attr, i);
break;
case IPP_TAG_ENUM:
output << "0x" << hex << ippGetInteger(attr, i) << dec;
break;
case IPP_TAG_BOOLEAN:
output << (ippGetBoolean(attr, i) ? i18n("True") : i18n("False"));
break;
case IPP_TAG_STRING:
case IPP_TAG_TEXTLANG:
case IPP_TAG_NAMELANG:
case IPP_TAG_TEXT:
case IPP_TAG_NAME:
case IPP_TAG_KEYWORD:
case IPP_TAG_URI:
case IPP_TAG_CHARSET:
case IPP_TAG_LANGUAGE:
case IPP_TAG_MIMETYPE:
output << ippGetString(attr, i, NULL);
break;
case IPP_TAG_RESOLUTION:
int xres;
int yres;
ipp_res_t units;
xres = ippGetResolution(attr, i, &yres, &units);
output << "( " << xres
<< ", " << yres << " )";
break;
case IPP_TAG_RANGE:
int lowervalue;
int uppervalue;
lowervalue = ippGetRange(attr, i, &uppervalue);
output << "[ " << (lowervalue > 0 ? lowervalue : 1)
<< ", " << (uppervalue > 0 ? uppervalue : 65535) << " ]";
break;
case IPP_TAG_DATE:
d = ippGetDate(attr, i);
dateStr.sprintf("%.4d-%.2d-%.2d, %.2d:%.2d:%.2d %c%.2d%.2d",
d[0]*256+d[1], d[2], d[3],
d[4], d[5], d[6],
d[8], d[9], d[10]);
output << dateStr;
break;
default:
continue;
}
if (i < ippGetCount(attr)-1)
output << "<br>";
}
output << "</td>\n </tr>" << endl;
attr = ippNextAttribute(request_);
#else // HAVE_CUPS_1_6
while (attr && attr->group_tag == group) while (attr && attr->group_tag == group)
{ {
output << " <tr bgcolor=\"" << (bg ? "#ffffd9" : "#ffffff") << "\">\n <td><b>" << attr->name << "</b></td>\n <td>" << endl; output << " <tr bgcolor=\"" << (bg ? "#ffffd9" : "#ffffff") << "\">\n <td><b>" << attr->name << "</b></td>\n <td>" << endl;
@ -423,6 +596,7 @@ bool IppRequest::htmlReport(int group, TQTextStream& output)
} }
output << "</td>\n </tr>" << endl; output << "</td>\n </tr>" << endl;
attr = attr->next; attr = attr->next;
#endif // HAVE_CUPS_1_6
} }
// end table // end table
output << "</table>" << endl; output << "</table>" << endl;
@ -438,6 +612,59 @@ TQMap<TQString,TQString> IppRequest::toMap(int group)
ipp_attribute_t *attr = first(); ipp_attribute_t *attr = first();
while (attr) while (attr)
{ {
#ifdef HAVE_CUPS_1_6
if (group != -1 && ippGetGroupTag(attr) != group)
{
attr = ippNextAttribute(request_);
continue;
}
TQString value;
for (int i=0; i<ippGetCount(attr); i++)
{
switch (ippGetValueTag(attr))
{
case IPP_TAG_INTEGER:
case IPP_TAG_ENUM:
value.append(TQString::number(ippGetInteger(attr, i))).append(",");
break;
case IPP_TAG_BOOLEAN:
value.append((ippGetBoolean(attr, i) ? "true" : "false")).append(",");
break;
case IPP_TAG_RANGE:
int lowervalue;
int uppervalue;
lowervalue = ippGetRange(attr, i, &uppervalue);
if (lowervalue > 0)
value.append(TQString::number(lowervalue));
if (lowervalue != uppervalue)
{
value.append("-");
if (uppervalue > 0)
value.append(TQString::number(uppervalue));
}
value.append(",");
break;
case IPP_TAG_STRING:
case IPP_TAG_TEXT:
case IPP_TAG_NAME:
case IPP_TAG_KEYWORD:
case IPP_TAG_URI:
case IPP_TAG_MIMETYPE:
case IPP_TAG_NAMELANG:
case IPP_TAG_TEXTLANG:
case IPP_TAG_CHARSET:
case IPP_TAG_LANGUAGE:
value.append(TQString::fromLocal8Bit(ippGetString(attr, i, NULL))).append(",");
break;
default:
break;
}
}
if (!value.isEmpty())
value.truncate(value.length()-1);
opts[TQString::fromLocal8Bit(ippGetName(attr))] = value;
attr = ippNextAttribute(request_);
#else // HAVE_CUPS_1_6
if (group != -1 && attr->group_tag != group) if (group != -1 && attr->group_tag != group)
{ {
attr = attr->next; attr = attr->next;
@ -486,6 +713,7 @@ TQMap<TQString,TQString> IppRequest::toMap(int group)
value.truncate(value.length()-1); value.truncate(value.length()-1);
opts[TQString::fromLocal8Bit(attr->name)] = value; opts[TQString::fromLocal8Bit(attr->name)] = value;
attr = attr->next; attr = attr->next;
#endif // HAVE_CUPS_1_6
} }
} }
return opts; return opts;
@ -542,3 +770,11 @@ void IppRequest::setMap(const TQMap<TQString,TQString>& opts)
} }
#endif #endif
} }
#ifdef HAVE_CUPS_1_6
ipp_attribute_t* IppRequest::first()
{ return (request_ ? ippFirstAttribute(request_) : NULL); }
#else // HAVE_CUPS_1_6
ipp_attribute_t* IppRequest::first()
{ return (request_ ? request_->attrs : NULL); }
#endif // HAVE_CUPS_1_6

@ -72,7 +72,7 @@ public:
bool keyword(const TQString& name, TQStringList& value); bool keyword(const TQString& name, TQStringList& value);
bool mime(const TQString& name, TQString& value); bool mime(const TQString& name, TQString& value);
ipp_attribute_t* first(); ipp_attribute_t* first();
ipp_attribute_t* last(); ipp_t* request();
TQMap<TQString,TQString> toMap(int group = -1); TQMap<TQString,TQString> toMap(int group = -1);
void setMap(const TQMap<TQString,TQString>& opts); void setMap(const TQMap<TQString,TQString>& opts);
@ -178,12 +178,6 @@ inline bool IppRequest::mime(const TQString& name, TQString& value)
inline bool IppRequest::doRequest(const TQString& res) inline bool IppRequest::doRequest(const TQString& res)
{ return doFileRequest(res); } { return doFileRequest(res); }
inline ipp_attribute_t* IppRequest::first()
{ return (request_ ? request_->attrs : NULL); }
inline ipp_attribute_t* IppRequest::last()
{ return (request_ ? request_->last : NULL); }
inline void IppRequest::setHost(const TQString& host) inline void IppRequest::setHost(const TQString& host)
{ host_ = host; } { host_ = host; }
@ -193,4 +187,7 @@ inline void IppRequest::setPort(int p)
inline void IppRequest::dump(int state) inline void IppRequest::dump(int state)
{ dump_ = state; } { dump_ = state; }
inline ipp_t* IppRequest::request()
{ return request_; }
#endif #endif

@ -36,6 +36,8 @@
#include <kdebug.h> #include <kdebug.h>
#include <kurl.h> #include <kurl.h>
#include "config.h"
KMCupsJobManager::KMCupsJobManager(TQObject *parent, const char *name, const TQStringList & /*args*/) KMCupsJobManager::KMCupsJobManager(TQObject *parent, const char *name, const TQStringList & /*args*/)
: KMJobManager(parent,name) : KMJobManager(parent,name)
{ {
@ -166,10 +168,79 @@ bool KMCupsJobManager::listJobs(const TQString& prname, KMJobManager::JobType ty
void KMCupsJobManager::parseListAnswer(IppRequest& req, KMPrinter *pr) void KMCupsJobManager::parseListAnswer(IppRequest& req, KMPrinter *pr)
{ {
ipp_attribute_t *attr = req.first(); ipp_attribute_t *attr = req.first();
ipp_attribute_t *nextAttr;
KMJob *job = new KMJob(); KMJob *job = new KMJob();
TQString uri; TQString uri;
while (attr) while (attr)
{ {
#ifdef HAVE_CUPS_1_6
TQString name(ippGetName(attr));
if (name == "job-id") job->setId(ippGetInteger(attr, 0));
else if (name == "job-uri") job->setUri(TQString::fromLocal8Bit(ippGetString(attr, 0, NULL)));
else if (name == "job-name") job->setName(TQString::fromLocal8Bit(ippGetString(attr, 0, NULL)));
else if (name == "job-state")
{
switch (ippGetInteger(attr, 0))
{
case IPP_JOB_PENDING:
job->setState(KMJob::Queued);
break;
case IPP_JOB_HELD:
job->setState(KMJob::Held);
break;
case IPP_JOB_PROCESSING:
job->setState(KMJob::Printing);
break;
case IPP_JOB_STOPPED:
job->setState(KMJob::Error);
break;
case IPP_JOB_CANCELLED:
job->setState(KMJob::Cancelled);
break;
case IPP_JOB_ABORTED:
job->setState(KMJob::Aborted);
break;
case IPP_JOB_COMPLETED:
job->setState(KMJob::Completed);
break;
default:
job->setState(KMJob::Unknown);
break;
}
}
else if (name == "job-k-octets") job->setSize(ippGetInteger(attr, 0));
else if (name == "job-originating-user-name") job->setOwner(TQString::fromLocal8Bit(ippGetString(attr, 0, NULL)));
else if (name == "job-k-octets-completed") job->setProcessedSize(ippGetInteger(attr, 0));
else if (name == "job-media-sheets") job->setPages(ippGetInteger(attr, 0));
else if (name == "job-media-sheets-completed") job->setProcessedPages(ippGetInteger(attr, 0));
else if (name == "job-printer-uri" && !pr->isRemote())
{
TQString str(ippGetString(attr, 0, NULL));
int p = str.findRev('/');
if (p != -1)
job->setPrinter(str.mid(p+1));
}
else if (name == "job-priority")
{
job->setAttribute(0, TQString::fromLatin1("%1").arg(ippGetInteger(attr, 0), 3));
}
else if (name == "job-billing")
{
job->setAttributeCount(2);
job->setAttribute(1, TQString::fromLocal8Bit(ippGetString(attr, 0, NULL)));
}
nextAttr = ippNextAttribute(req.request());
if (name.isEmpty() || (!nextAttr))
{
if (job->printer().isEmpty())
job->setPrinter(pr->printerName());
job->setRemote(pr->isRemote());
addJob(job); // don't use job after this call !!!
job = new KMJob();
}
attr = nextAttr;
#else // HAVE_CUPS_1_6
TQString name(attr->name); TQString name(attr->name);
if (name == "job-id") job->setId(attr->values[0].integer); if (name == "job-id") job->setId(attr->values[0].integer);
else if (name == "job-uri") job->setUri(TQString::fromLocal8Bit(attr->values[0].string.text)); else if (name == "job-uri") job->setUri(TQString::fromLocal8Bit(attr->values[0].string.text));
@ -236,6 +307,7 @@ void KMCupsJobManager::parseListAnswer(IppRequest& req, KMPrinter *pr)
} }
attr = attr->next; attr = attr->next;
#endif // HAVE_CUPS_1_6
} }
delete job; delete job;
} }

@ -476,9 +476,59 @@ void KMCupsManager::loadServerPrinters()
void KMCupsManager::processRequest(IppRequest* req) void KMCupsManager::processRequest(IppRequest* req)
{ {
ipp_attribute_t *attr = req->first(); ipp_attribute_t *attr = req->first();
ipp_attribute_t *nextAttr;
KMPrinter *printer = new KMPrinter(); KMPrinter *printer = new KMPrinter();
while (attr) while (attr)
{ {
#ifdef HAVE_CUPS_1_6
TQString attrname(ippGetName(attr));
if (attrname == "printer-name")
{
TQString value = TQString::fromLocal8Bit(ippGetString(attr, 0, NULL));
printer->setName(value);
printer->setPrinterName(value);
}
else if (attrname == "printer-type")
{
int value = ippGetInteger(attr, 0);
printer->setType(0);
printer->addType(((value & CUPS_PRINTER_CLASS) || (value & CUPS_PRINTER_IMPLICIT) ? KMPrinter::Class : KMPrinter::Printer));
if ((value & CUPS_PRINTER_REMOTE)) printer->addType(KMPrinter::Remote);
if ((value & CUPS_PRINTER_IMPLICIT)) printer->addType(KMPrinter::Implicit);
// convert printer-type attribute
printer->setPrinterCap( ( value & CUPS_PRINTER_OPTIONS ) >> 2 );
}
else if (attrname == "printer-state")
{
switch (ippGetInteger(attr, 0))
{
case IPP_PRINTER_IDLE: printer->setState(KMPrinter::Idle); break;
case IPP_PRINTER_PROCESSING: printer->setState(KMPrinter::Processing); break;
case IPP_PRINTER_STOPPED: printer->setState(KMPrinter::Stopped); break;
}
}
else if (attrname == "printer-uri-supported")
{
printer->setUri(KURL(ippGetString(attr, 0, NULL)));
}
else if (attrname == "printer-location")
{
printer->setLocation(TQString::fromLocal8Bit(ippGetString(attr, 0, NULL)));
}
else if (attrname == "printer-is-accepting-jobs")
{
printer->setAcceptJobs(ippGetBoolean(attr, 0));
}
nextAttr = ippNextAttribute(req->request());
if (attrname.isEmpty() || (!nextAttr))
{
addPrinter(printer);
printer = new KMPrinter();
}
attr = nextAttr;
#else // HAVE_CUPS_1_6
TQString attrname(attr->name); TQString attrname(attr->name);
if (attrname == "printer-name") if (attrname == "printer-name")
{ {
@ -524,6 +574,7 @@ void KMCupsManager::processRequest(IppRequest* req)
printer = new KMPrinter(); printer = new KMPrinter();
} }
attr = attr->next; attr = attr->next;
#endif // HAVE_CUPS_1_6
} }
delete printer; delete printer;
} }
@ -817,6 +868,7 @@ TQStringList KMCupsManager::detectLocalPrinters()
{ {
TQStringList list; TQStringList list;
IppRequest req; IppRequest req;
ipp_attribute_t *nextAttr;
req.setOperation(CUPS_GET_DEVICES); req.setOperation(CUPS_GET_DEVICES);
if (req.doRequest("/")) if (req.doRequest("/"))
{ {
@ -824,6 +876,24 @@ TQStringList KMCupsManager::detectLocalPrinters()
ipp_attribute_t *attr = req.first(); ipp_attribute_t *attr = req.first();
while (attr) while (attr)
{ {
#ifdef HAVE_CUPS_1_6
TQString attrname(ippGetName(attr));
if (attrname == "device-info") desc = ippGetString(attr, 0, NULL);
else if (attrname == "device-make-and-model") printer = ippGetString(attr, 0, NULL);
else if (attrname == "device-uri") uri = ippGetString(attr, 0, NULL);
else if ( attrname == "device-class" ) cl = ippGetString(attr, 0, NULL);
nextAttr = ippNextAttribute(req.request());
if (attrname.isEmpty() || (!nextAttr))
{
if (!uri.isEmpty())
{
if (printer == "Unknown") printer = TQString::null;
list << cl << uri << desc << printer;
}
uri = desc = printer = cl = TQString::null;
}
attr = nextAttr;
#else // HAVE_CUPS_1_6
TQString attrname(attr->name); TQString attrname(attr->name);
if (attrname == "device-info") desc = attr->values[0].string.text; if (attrname == "device-info") desc = attr->values[0].string.text;
else if (attrname == "device-make-and-model") printer = attr->values[0].string.text; else if (attrname == "device-make-and-model") printer = attr->values[0].string.text;
@ -839,6 +909,7 @@ TQStringList KMCupsManager::detectLocalPrinters()
uri = desc = printer = cl = TQString::null; uri = desc = printer = cl = TQString::null;
} }
attr = attr->next; attr = attr->next;
#endif // HAVE_CUPS_1_6
} }
} }
return list; return list;

@ -60,6 +60,8 @@
#include <kaction.h> #include <kaction.h>
#include <kmessagebox.h> #include <kmessagebox.h>
#include "config.h"
KMCupsUiManager::KMCupsUiManager(TQObject *parent, const char *name, const TQStringList & /*args*/) KMCupsUiManager::KMCupsUiManager(TQObject *parent, const char *name, const TQStringList & /*args*/)
: KMUiManager(parent,name) : KMUiManager(parent,name)
{ {
@ -143,6 +145,24 @@ void KMCupsUiManager::setupWizard(KMWizard *wizard)
ipp_attribute_t *attr = req.first(); ipp_attribute_t *attr = req.first();
while (attr) while (attr)
{ {
#ifdef HAVE_CUPS_1_6
if (ippGetName(attr) && strcmp(ippGetName(attr),"device-uri") == 0)
{
if (strncmp(ippGetString(attr, 0, NULL),"socket",6) == 0) backend->enableBackend(KMWizard::TCP,true);
else if (strncmp(ippGetString(attr, 0, NULL),"parallel",8) == 0) backend->enableBackend(KMWizard::Local,true);
else if (strncmp(ippGetString(attr, 0, NULL),"serial",6) == 0) backend->enableBackend(KMWizard::Local,true);
else if (strncmp(ippGetString(attr, 0, NULL),"smb",3) == 0) backend->enableBackend(KMWizard::SMB,true);
else if (strncmp(ippGetString(attr, 0, NULL),"lpd",3) == 0) backend->enableBackend(KMWizard::LPD,true);
else if (strncmp(ippGetString(attr, 0, NULL),"usb",3) == 0) backend->enableBackend(KMWizard::Local,true);
else if (strncmp(ippGetString(attr, 0, NULL),"http",4) == 0 || strncmp(ippGetString(attr, 0, NULL),"ipp",3) == 0)
{
backend->enableBackend(KMWizard::IPP,true);
backend->enableBackend(KMWizard::Custom+1,true);
}
else if (strncmp(ippGetString(attr, 0, NULL),"fax",3) == 0) backend->enableBackend(KMWizard::Custom+2,true);
}
attr = ippNextAttribute(req.request());
#else // HAVE_CUPS_1_6
if (attr->name && strcmp(attr->name,"device-uri") == 0) if (attr->name && strcmp(attr->name,"device-uri") == 0)
{ {
if (strncmp(attr->values[0].string.text,"socket",6) == 0) backend->enableBackend(KMWizard::TCP,true); if (strncmp(attr->values[0].string.text,"socket",6) == 0) backend->enableBackend(KMWizard::TCP,true);
@ -159,6 +179,7 @@ void KMCupsUiManager::setupWizard(KMWizard *wizard)
else if (strncmp(attr->values[0].string.text,"fax",3) == 0) backend->enableBackend(KMWizard::Custom+2,true); else if (strncmp(attr->values[0].string.text,"fax",3) == 0) backend->enableBackend(KMWizard::Custom+2,true);
} }
attr = attr->next; attr = attr->next;
#endif // HAVE_CUPS_1_6
} }
backend->enableBackend(KMWizard::Class, true); backend->enableBackend(KMWizard::Class, true);
backend->enableBackend(KMWizard::Custom+5, true); backend->enableBackend(KMWizard::Custom+5, true);

@ -30,6 +30,8 @@
#include <kiconloader.h> #include <kiconloader.h>
#include <kurl.h> #include <kurl.h>
#include "config.h"
KMWFax::KMWFax(TQWidget *parent, const char *name) KMWFax::KMWFax(TQWidget *parent, const char *name)
: KMWizardPage(parent,name) : KMWizardPage(parent,name)
{ {
@ -55,11 +57,19 @@ KMWFax::KMWFax(TQWidget *parent, const char *name)
ipp_attribute_t *attr = req.first(); ipp_attribute_t *attr = req.first();
while (attr) while (attr)
{ {
#ifdef HAVE_CUPS_1_6
if (ippGetName(attr) && strcmp(ippGetName(attr),"device-uri") == 0 && strncmp(ippGetString(attr, 0, NULL),"fax",3) == 0)
{
m_list->insertItem(SmallIcon("blockdevice"),TQString::fromLatin1(ippGetString(attr, 0, NULL)));
}
attr = ippNextAttribute(req.request());
#else // HAVE_CUPS_1_6
if (attr->name && strcmp(attr->name,"device-uri") == 0 && strncmp(attr->values[0].string.text,"fax",3) == 0) if (attr->name && strcmp(attr->name,"device-uri") == 0 && strncmp(attr->values[0].string.text,"fax",3) == 0)
{ {
m_list->insertItem(SmallIcon("blockdevice"),TQString::fromLatin1(attr->values[0].string.text)); m_list->insertItem(SmallIcon("blockdevice"),TQString::fromLatin1(attr->values[0].string.text));
} }
attr = attr->next; attr = attr->next;
#endif // HAVE_CUPS_1_6
} }
} }
} }

@ -29,6 +29,8 @@
#include <kdebug.h> #include <kdebug.h>
#include <kiconloader.h> #include <kiconloader.h>
#include "config.h"
KMWIppSelect::KMWIppSelect(TQWidget *parent, const char *name) KMWIppSelect::KMWIppSelect(TQWidget *parent, const char *name)
: KMWizardPage(parent,name) : KMWizardPage(parent,name)
{ {
@ -83,9 +85,15 @@ void KMWIppSelect::initPrinter(KMPrinter *p)
ipp_attribute_t *attr = req.first(); ipp_attribute_t *attr = req.first();
while (attr) while (attr)
{ {
#ifdef HAVE_CUPS_1_6
if (ippGetName(attr) && strcmp(ippGetName(attr),"printer-name") == 0)
m_list->insertItem(SmallIcon("kdeprint_printer"),TQString::fromLatin1(ippGetString(attr, 0, NULL)));
attr = ippNextAttribute(req.request());
#else // HAVE_CUPS_1_6
if (attr->name && strcmp(attr->name,"printer-name") == 0) if (attr->name && strcmp(attr->name,"printer-name") == 0)
m_list->insertItem(SmallIcon("kdeprint_printer"),TQString::fromLatin1(attr->values[0].string.text)); m_list->insertItem(SmallIcon("kdeprint_printer"),TQString::fromLatin1(attr->values[0].string.text));
attr = attr->next; attr = attr->next;
#endif // HAVE_CUPS_1_6
} }
m_list->sort(); m_list->sort();
} }

Loading…
Cancel
Save