From 9bc0d2cd9d38750658770e69bf0445dc5162beb7 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Fri, 10 Aug 2012 16:51:25 -0500 Subject: [PATCH] Update to new CUPS 1.6 API --- CMakeLists.txt | 13 ++ config.h.cmake | 3 + tdeprint/cups/cupsdconf2/cupsdconf.cpp | 36 ++++ tdeprint/cups/ipprequest.cpp | 244 ++++++++++++++++++++++++- tdeprint/cups/ipprequest.h | 11 +- tdeprint/cups/kmcupsjobmanager.cpp | 72 ++++++++ tdeprint/cups/kmcupsmanager.cpp | 71 +++++++ tdeprint/cups/kmcupsuimanager.cpp | 21 +++ tdeprint/cups/kmwfax.cpp | 10 + tdeprint/cups/kmwippselect.cpp | 8 + 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 + #include + #include + 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;istate, 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::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::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;inum_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 << "" << i18n("Attribute") << "" << endl; output << "" << i18n("Values") << "" << 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 << " \n " << ippGetName(attr) << "\n " << endl; + bg = !bg; + for (int i=0; i 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 << "
"; + } + output << "\n " << endl; + attr = ippNextAttribute(request_); +#else // HAVE_CUPS_1_6 while (attr && attr->group_tag == group) { output << " \n " << attr->name << "\n " << endl; @@ -423,6 +596,7 @@ bool IppRequest::htmlReport(int group, TQTextStream& output) } output << "\n " << endl; attr = attr->next; +#endif // HAVE_CUPS_1_6 } // end table output << "" << endl; @@ -438,6 +612,59 @@ TQMap 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 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 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& 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 toMap(int group = -1); void setMap(const TQMap& 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 #include +#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 #include +#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 #include +#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 #include +#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(); }