summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt13
-rw-r--r--config.h.cmake3
-rw-r--r--tdeprint/cups/cupsdconf2/cupsdconf.cpp36
-rw-r--r--tdeprint/cups/ipprequest.cpp244
-rw-r--r--tdeprint/cups/ipprequest.h11
-rw-r--r--tdeprint/cups/kmcupsjobmanager.cpp72
-rw-r--r--tdeprint/cups/kmcupsmanager.cpp71
-rw-r--r--tdeprint/cups/kmcupsuimanager.cpp21
-rw-r--r--tdeprint/cups/kmwfax.cpp10
-rw-r--r--tdeprint/cups/kmwippselect.cpp8
10 files changed, 478 insertions, 11 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 113c618c1..ceaa5eb6f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -693,6 +693,19 @@ if( WITH_CUPS )
set( HAVE_CUPS 1 )
# FIXME if CUPS is at least 1.1.20, doesn't have password caching
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 )
diff --git a/config.h.cmake b/config.h.cmake
index 1237494f5..36e30793c 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -83,6 +83,9 @@
/* CUPS doesn't have password caching */
#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. */
#undef HAVE_DECL_GETSERVBYNAME_R
diff --git a/tdeprint/cups/cupsdconf2/cupsdconf.cpp b/tdeprint/cups/cupsdconf2/cupsdconf.cpp
index 0cd041d48..971da38ff 100644
--- a/tdeprint/cups/cupsdconf2/cupsdconf.cpp
+++ b/tdeprint/cups/cupsdconf2/cupsdconf.cpp
@@ -629,26 +629,44 @@ bool CupsdConf::loadAvailableResources()
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_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;
+#endif // HAVE_CUPS_1_6
request_ = cupsDoRequest(http_, request_, "/printers/");
if (request_)
{
TQString name;
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;
+#endif // HAVE_CUPS_1_6
while (attr)
{
// 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)
+#endif // HAVE_CUPS_1_6
{
if (!(type & CUPS_PRINTER_REMOTE) && !(type & CUPS_PRINTER_IMPLICIT) && !name.isEmpty())
resources_.append(new CupsResource("/printers/"+name));
name = "";
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-type") == 0) type = attr->values[0].integer;
attr = attr->next;
+#endif // HAVE_CUPS_1_6
}
if (!(type & CUPS_PRINTER_REMOTE) && !(type & CUPS_PRINTER_IMPLICIT) && !name.isEmpty())
resources_.append(new CupsResource("/printers/"+name));
@@ -658,26 +676,44 @@ bool CupsdConf::loadAvailableResources()
request_ = ippNew();
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);
+#ifdef HAVE_CUPS_1_6
+ ippSetOperation(request_, CUPS_GET_CLASSES);
+#else // HAVE_CUPS_1_6
request_->request.op.operation_id = CUPS_GET_CLASSES;
+#endif // HAVE_CUPS_1_6
request_ = cupsDoRequest(http_, request_, "/classes/");
if (request_)
{
TQString name;
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;
+#endif // HAVE_CUPS_1_6
while (attr)
{
// check new class (keep only local classes)
+#ifdef HAVE_CUPS_1_6
+ if (!ippGetName(attr))
+#else // HAVE_CUPS_1_6
if (!attr->name)
+#endif // HAVE_CUPS_1_6
{
if (!(type & CUPS_PRINTER_REMOTE) && !name.isEmpty())
resources_.append(new CupsResource("/classes/"+name));
name = "";
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-type") == 0) type = attr->values[0].integer;
attr = attr->next;
+#endif // HAVE_CUPS_1_6
}
if (!(type & CUPS_PRINTER_REMOTE) && !name.isEmpty())
resources_.append(new CupsResource("/classes/"+name));
diff --git a/tdeprint/cups/ipprequest.cpp b/tdeprint/cups/ipprequest.cpp
index c7472a9ae..4bf899897 100644
--- a/tdeprint/cups/ipprequest.cpp
+++ b/tdeprint/cups/ipprequest.cpp
@@ -51,6 +51,58 @@ void dumpRequest(ipp_t *req, bool answer = false, const TQString& s = TQString::
kdDebug(500) << "Null request" << endl;
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) << "ID = 0x" << TQString::number(req->request.status.request_id, 16) << endl;
if (answer)
@@ -99,6 +151,7 @@ void dumpRequest(ipp_t *req, bool answer = false, const TQString& s = TQString::
kdDebug(500) << s << endl;
attr = attr->next;
}
+#endif // HAVE_CUPS_1_6
}
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);
int i(0);
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());
+#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);
int i(0);
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;
+#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);
int i(0);
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);
+#endif // HAVE_CUPS_1_6
}
}
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.request_id = 1; // 0 is not RFC-compliant, should be at least 1
+#endif // HAVE_CUPS_1_6
}
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));
+#endif // HAVE_CUPS_1_6
}
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);
if (attr)
{
+#ifdef HAVE_CUPS_1_6
+ value = ippGetInteger(attr, 0);
+#else // HAVE_CUPS_1_6
value = attr->values[0].integer;
+#endif // HAVE_CUPS_1_6
return true;
}
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);
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);
+#endif // HAVE_CUPS_1_6
return true;
}
else return false;
@@ -273,8 +355,13 @@ bool IppRequest::stringListValue_p(const TQString& name, TQStringList& values, i
values.clear();
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++)
values.append(TQString::fromLocal8Bit(attr->values[i].string.text));
+#endif // HAVE_CUPS_1_6
return true;
}
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);
if (attr)
{
+#ifdef HAVE_CUPS_1_6
+ value = (bool)ippGetBoolean(attr, 0);
+#else // HAVE_CUPS_1_6
value = (bool)attr->values[0].boolean;
+#endif // HAVE_CUPS_1_6
return true;
}
else return false;
@@ -338,10 +429,18 @@ bool IppRequest::doFileRequest(const TQString& res, const TQString& filename)
}
/* 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 )
+#endif // HAVE_CUPS_1_6
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))
+#endif // HAVE_CUPS_1_6
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 << "<th bgcolor=\"dark blue\"><font color=\"white\">" << i18n("Values") << "</font></th></tr>" << endl;
// 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;
while (attr && attr->group_tag != group)
attr = attr->next;
+#endif // HAVE_CUPS_1_6
// print each attribute
- ipp_uchar_t *d;
- TQCString dateStr;
- TQDateTime dt;
- bool bg(false);
+ const ipp_uchar_t *d;
+ TQCString dateStr;
+ TQDateTime dt;
+ 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)
{
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;
attr = attr->next;
+#endif // HAVE_CUPS_1_6
}
// end table
output << "</table>" << endl;
@@ -438,6 +612,59 @@ TQMap<TQString,TQString> IppRequest::toMap(int group)
ipp_attribute_t *attr = first();
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)
{
attr = attr->next;
@@ -486,6 +713,7 @@ TQMap<TQString,TQString> IppRequest::toMap(int group)
value.truncate(value.length()-1);
opts[TQString::fromLocal8Bit(attr->name)] = value;
attr = attr->next;
+#endif // HAVE_CUPS_1_6
}
}
return opts;
@@ -542,3 +770,11 @@ void IppRequest::setMap(const TQMap<TQString,TQString>& opts)
}
#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 \ No newline at end of file
diff --git a/tdeprint/cups/ipprequest.h b/tdeprint/cups/ipprequest.h
index ba8b2f081..11d7f4091 100644
--- a/tdeprint/cups/ipprequest.h
+++ b/tdeprint/cups/ipprequest.h
@@ -72,7 +72,7 @@ public:
bool keyword(const TQString& name, TQStringList& value);
bool mime(const TQString& name, TQString& value);
ipp_attribute_t* first();
- ipp_attribute_t* last();
+ ipp_t* request();
TQMap<TQString,TQString> toMap(int group = -1);
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)
{ 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)
{ host_ = host; }
@@ -193,4 +187,7 @@ inline void IppRequest::setPort(int p)
inline void IppRequest::dump(int state)
{ dump_ = state; }
+inline ipp_t* IppRequest::request()
+{ return request_; }
+
#endif
diff --git a/tdeprint/cups/kmcupsjobmanager.cpp b/tdeprint/cups/kmcupsjobmanager.cpp
index be088d360..0b31489cc 100644
--- a/tdeprint/cups/kmcupsjobmanager.cpp
+++ b/tdeprint/cups/kmcupsjobmanager.cpp
@@ -36,6 +36,8 @@
#include <kdebug.h>
#include <kurl.h>
+#include "config.h"
+
KMCupsJobManager::KMCupsJobManager(TQObject *parent, const char *name, const TQStringList & /*args*/)
: KMJobManager(parent,name)
{
@@ -166,10 +168,79 @@ bool KMCupsJobManager::listJobs(const TQString& prname, KMJobManager::JobType ty
void KMCupsJobManager::parseListAnswer(IppRequest& req, KMPrinter *pr)
{
ipp_attribute_t *attr = req.first();
+ ipp_attribute_t *nextAttr;
KMJob *job = new KMJob();
TQString uri;
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);
if (name == "job-id") job->setId(attr->values[0].integer);
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;
+#endif // HAVE_CUPS_1_6
}
delete job;
}
diff --git a/tdeprint/cups/kmcupsmanager.cpp b/tdeprint/cups/kmcupsmanager.cpp
index 43b2d587a..66acb8daf 100644
--- a/tdeprint/cups/kmcupsmanager.cpp
+++ b/tdeprint/cups/kmcupsmanager.cpp
@@ -476,9 +476,59 @@ void KMCupsManager::loadServerPrinters()
void KMCupsManager::processRequest(IppRequest* req)
{
ipp_attribute_t *attr = req->first();
+ ipp_attribute_t *nextAttr;
KMPrinter *printer = new KMPrinter();
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);
if (attrname == "printer-name")
{
@@ -524,6 +574,7 @@ void KMCupsManager::processRequest(IppRequest* req)
printer = new KMPrinter();
}
attr = attr->next;
+#endif // HAVE_CUPS_1_6
}
delete printer;
}
@@ -817,6 +868,7 @@ TQStringList KMCupsManager::detectLocalPrinters()
{
TQStringList list;
IppRequest req;
+ ipp_attribute_t *nextAttr;
req.setOperation(CUPS_GET_DEVICES);
if (req.doRequest("/"))
{
@@ -824,6 +876,24 @@ TQStringList KMCupsManager::detectLocalPrinters()
ipp_attribute_t *attr = req.first();
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);
if (attrname == "device-info") desc = 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;
}
attr = attr->next;
+#endif // HAVE_CUPS_1_6
}
}
return list;
diff --git a/tdeprint/cups/kmcupsuimanager.cpp b/tdeprint/cups/kmcupsuimanager.cpp
index c3dfcb1ac..d0dfe3cdc 100644
--- a/tdeprint/cups/kmcupsuimanager.cpp
+++ b/tdeprint/cups/kmcupsuimanager.cpp
@@ -60,6 +60,8 @@
#include <kaction.h>
#include <kmessagebox.h>
+#include "config.h"
+
KMCupsUiManager::KMCupsUiManager(TQObject *parent, const char *name, const TQStringList & /*args*/)
: KMUiManager(parent,name)
{
@@ -143,6 +145,24 @@ void KMCupsUiManager::setupWizard(KMWizard *wizard)
ipp_attribute_t *attr = req.first();
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 (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);
}
attr = attr->next;
+#endif // HAVE_CUPS_1_6
}
backend->enableBackend(KMWizard::Class, true);
backend->enableBackend(KMWizard::Custom+5, true);
diff --git a/tdeprint/cups/kmwfax.cpp b/tdeprint/cups/kmwfax.cpp
index a9a120b6c..51ecbab73 100644
--- a/tdeprint/cups/kmwfax.cpp
+++ b/tdeprint/cups/kmwfax.cpp
@@ -30,6 +30,8 @@
#include <kiconloader.h>
#include <kurl.h>
+#include "config.h"
+
KMWFax::KMWFax(TQWidget *parent, const char *name)
: KMWizardPage(parent,name)
{
@@ -55,11 +57,19 @@ KMWFax::KMWFax(TQWidget *parent, const char *name)
ipp_attribute_t *attr = req.first();
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)
{
m_list->insertItem(SmallIcon("blockdevice"),TQString::fromLatin1(attr->values[0].string.text));
}
attr = attr->next;
+#endif // HAVE_CUPS_1_6
}
}
}
diff --git a/tdeprint/cups/kmwippselect.cpp b/tdeprint/cups/kmwippselect.cpp
index b5e6c0405..a10a14ba5 100644
--- a/tdeprint/cups/kmwippselect.cpp
+++ b/tdeprint/cups/kmwippselect.cpp
@@ -29,6 +29,8 @@
#include <kdebug.h>
#include <kiconloader.h>
+#include "config.h"
+
KMWIppSelect::KMWIppSelect(TQWidget *parent, const char *name)
: KMWizardPage(parent,name)
{
@@ -83,9 +85,15 @@ void KMWIppSelect::initPrinter(KMPrinter *p)
ipp_attribute_t *attr = req.first();
while (attr)
{
+#ifdef HAVE_CUPS_1_6
+ if (ippGetName(attr) && strcmp(ippGetName(attr),"printer-name") == 0)
+ m_list->insertItem(SmallIcon("tdeprint_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)
m_list->insertItem(SmallIcon("tdeprint_printer"),TQString::fromLatin1(attr->values[0].string.text));
attr = attr->next;
+#endif // HAVE_CUPS_1_6
}
m_list->sort();
}