kdeprint Library API Documentation

cupsdconf.cpp

00001 /* 00002 * This file is part of the KDE libraries 00003 * Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be> 00004 * 00005 * This library is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU Library General Public 00007 * License version 2 as published by the Free Software Foundation. 00008 * 00009 * This library is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 * Library General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU Library General Public License 00015 * along with this library; see the file COPYING.LIB. If not, write to 00016 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00017 * Boston, MA 02111-1307, USA. 00018 **/ 00019 00020 #include "cupsdconf.h" 00021 00022 #include <qfile.h> 00023 #include <qregexp.h> 00024 #include <klocale.h> 00025 #include <kdebug.h> 00026 #include <kconfig.h> 00027 00028 #include <stdlib.h> 00029 #include <cups/cups.h> 00030 #include <cups/ipp.h> 00031 #include <cups/language.h> 00032 00033 QString findDir(const QStringList& list) 00034 { 00035 for (QStringList::ConstIterator it=list.begin(); it!=list.end(); ++it) 00036 if (QFile::exists(*it)) 00037 return *it; 00038 // if nothing found, just use the first as default value 00039 return list[0]; 00040 } 00041 00042 void splitSizeSpec(const QString& s, int& sz, int& suff) 00043 { 00044 int p = s.find(QRegExp("\\D")); 00045 sz = s.mid(0, p).toInt(); 00046 if (p != -1) 00047 { 00048 switch (s[p].latin1()) 00049 { 00050 case 'k': suff = UNIT_KB; break; 00051 default: 00052 case 'm': suff = UNIT_MB; break; 00053 case 'g': suff = UNIT_GB; break; 00054 case 't': suff = UNIT_TILE; break; 00055 } 00056 } 00057 else 00058 suff = UNIT_MB; 00059 } 00060 00061 CupsdConf::CupsdConf() 00062 { 00063 // start by trying to find CUPS directories (useful later) 00064 datadir_ = findDir(QStringList("/usr/share/cups") 00065 << "/usr/local/share/cups" 00066 << "/opt/share/cups" 00067 << "/opt/local/share/cups"); 00068 documentdir_ = findDir(QStringList(datadir_+"/doc") 00069 << datadir_.left(datadir_.length()-5)+"/doc/cups"); 00070 //fontpath_ << (datadir_+"/fonts"); 00071 requestdir_ = findDir(QStringList("/var/spool/cups") 00072 << "/var/cups"); 00073 serverbin_ = findDir(QStringList("/usr/lib/cups") 00074 << "/usr/local/lib/cups" 00075 << "/opt/lib/cups" 00076 << "/opt/local/lib/cups"); 00077 serverfiles_ = findDir(QStringList("/etc/cups") 00078 << "/usr/local/etc/cups"); 00079 tmpfiles_ = requestdir_+"/tmp"; 00080 00081 // other options 00082 servername_ = QString::null; 00083 serveradmin_ = QString::null; 00084 classification_ = CLASS_NONE; 00085 otherclassname_ = QString::null; 00086 classoverride_ = false; 00087 charset_ = "utf-8"; 00088 language_ = "en"; 00089 printcap_ = "/etc/printcap"; 00090 printcapformat_ = PRINTCAP_BSD; 00091 remoteroot_ = "remroot"; 00092 systemgroup_ = "sys"; 00093 encryptcert_ = serverfiles_+"/ssl/server.crt"; 00094 encryptkey_ = serverfiles_+"/ssl/server.key"; 00095 hostnamelookup_ = HOSTNAME_OFF; 00096 keepalive_ = true; 00097 keepalivetimeout_ = 60; 00098 maxclients_ = 100; 00099 maxrequestsize_ = "0"; 00100 clienttimeout_ = 300; 00101 // listenaddresses_ 00102 QString logdir = findDir(QStringList("/var/log/cups") 00103 << "/var/spool/cups/log" 00104 << "/var/cups/log"); 00105 accesslog_ = logdir+"/access_log"; 00106 errorlog_ = logdir+"/error_log"; 00107 pagelog_ = logdir+"/page_log"; 00108 maxlogsize_ = "1m"; 00109 loglevel_ = LOGLEVEL_INFO; 00110 keepjobhistory_ = true; 00111 keepjobfiles_ = false; 00112 autopurgejobs_ = false; 00113 maxjobs_ = 0; 00114 maxjobsperprinter_ = 0; 00115 maxjobsperuser_ = 0; 00116 user_ = "lp"; 00117 group_ = "sys"; 00118 ripcache_ = "8m"; 00119 filterlimit_ = 0; 00120 browsing_ = true; 00121 browseprotocols_ << "CUPS"; 00122 browseport_ = ippPort(); 00123 browseinterval_ = 30; 00124 browsetimeout_ = 300; 00125 // browseaddresses_ 00126 browseorder_ = ORDER_ALLOW_DENY; 00127 useimplicitclasses_ = true; 00128 hideimplicitmembers_ = true; 00129 useshortnames_ = true; 00130 useanyclasses_ = false; 00131 00132 loadAvailableResources(); 00133 } 00134 00135 CupsdConf::~CupsdConf() 00136 { 00137 } 00138 00139 bool CupsdConf::loadFromFile(const QString& filename) 00140 { 00141 QFile f(filename); 00142 if (!f.exists() || !f.open(IO_ReadOnly)) return false; 00143 else 00144 { 00145 QTextStream t(&f); 00146 QString line; 00147 bool done(false), value(true); 00148 while (!done && value) 00149 { 00150 line = t.readLine().simplifyWhiteSpace(); 00151 if (line.isEmpty()) 00152 { 00153 if (t.atEnd()) done = true; 00154 else continue; 00155 } 00156 else if (line[0] == '#') continue; 00157 else if (line.left(9).lower() == "<location") 00158 { 00159 CupsLocation *location = new CupsLocation(); 00160 locations_.append(location); 00161 if (!location->parseResource(line) || !parseLocation(location, t)) 00162 value = false; 00163 // search corresponding resource 00164 for (resources_.first();resources_.current();resources_.next()) 00165 if (resources_.current()->path_ == location->resourcename_) 00166 location->resource_ = resources_.current(); 00167 } 00168 else value = parseOption(line); 00169 } 00170 f.close(); 00171 return value; 00172 } 00173 } 00174 00175 bool CupsdConf::saveToFile(const QString& filename) 00176 { 00177 QFile f(filename); 00178 if (!f.open(IO_WriteOnly)) 00179 return false; 00180 else 00181 { 00182 QTextStream t(&f); 00183 t << comments_["header"] << endl; 00184 t << "# Server" << endl << endl; 00185 00186 t << comments_["servername"] << endl; 00187 if ( !servername_.isEmpty() ) 00188 t << "ServerName " << servername_ << endl; 00189 00190 t << endl << comments_["serveradmin"] << endl; 00191 if ( !serveradmin_.isEmpty() ) 00192 t << "ServerAdmin " << serveradmin_ << endl; 00193 00194 t << endl << comments_["classification"] << endl; 00195 t << "Classification "; 00196 switch (classification_) 00197 { 00198 default: 00199 case CLASS_NONE: t << "none"; break; 00200 case CLASS_CLASSIFIED: t << "classified"; break; 00201 case CLASS_CONFIDENTIAL: t << "confidential"; break; 00202 case CLASS_SECRET: t << "secret"; break; 00203 case CLASS_TOPSECRET: t << "topsecret"; break; 00204 case CLASS_UNCLASSIFIED: t << "unclassified"; break; 00205 case CLASS_OTHER: t << otherclassname_; break; 00206 } 00207 t << endl; 00208 00209 t << endl << comments_["classifyoverride"] << endl; 00210 if (classification_ != CLASS_NONE) t << "ClassifyOverride " << (classoverride_ ? "Yes" : "No") << endl; 00211 00212 t << endl << comments_["defaultcharset"] << endl; 00213 t << "DefaultCharset " << charset_.upper() << endl; 00214 00215 t << endl << comments_["defaultlanguage"] << endl; 00216 t << "DefaultLanguage " << language_.lower() << endl; 00217 00218 t << endl << comments_["printcap"] << endl; 00219 t << "Printcap " << printcap_ << endl; 00220 00221 t << endl << comments_["printcapformat"] << endl; 00222 t << "PrintcapFormat " << (printcapformat_ == PRINTCAP_SOLARIS ? "Solaris" : "BSD") << endl; 00223 00224 t << endl << "# Security" << endl; 00225 t << endl << comments_["remoteroot"] << endl; 00226 t << "RemoteRoot " << remoteroot_ << endl; 00227 00228 t << endl << comments_["systemgroup"] << endl; 00229 t << "SystemGroup " << systemgroup_ << endl; 00230 00231 t << endl << comments_["servercertificate"] << endl; 00232 t << "ServerCertificate " << encryptcert_ << endl; 00233 00234 t << endl << comments_["serverkey"] << endl; 00235 t << "ServerKey " << encryptkey_ << endl; 00236 00237 t << endl << comments_["locations"] << endl; 00238 for (locations_.first(); locations_.current(); locations_.next()) 00239 { 00240 CupsLocation *loc = locations_.current(); 00241 t << "<Location " << loc->resourcename_ << ">" << endl; 00242 if (loc->authtype_ != AUTHTYPE_NONE) 00243 { 00244 t << "AuthType "; 00245 switch (loc->authtype_) 00246 { 00247 case AUTHTYPE_BASIC: t << "Basic"; break; 00248 case AUTHTYPE_DIGEST: t << "Digest"; break; 00249 } 00250 t << endl; 00251 } 00252 if (loc->authclass_ != AUTHCLASS_ANONYMOUS) 00253 { 00254 switch (loc->authclass_) 00255 { 00256 case AUTHCLASS_USER: 00257 if (!loc->authname_.isEmpty()) 00258 t << "Require user " << loc->authname_ << endl; 00259 else 00260 t << "AuthClass User" << endl; 00261 break; 00262 case AUTHCLASS_GROUP: 00263 if (!loc->authname_.isEmpty()) 00264 t << "Require group " << loc->authname_ << endl; 00265 else 00266 t << "AuthClass Group" << endl; 00267 break; 00268 case AUTHCLASS_SYSTEM: 00269 t << "AuthClass System" << endl; 00270 break; 00271 } 00272 } 00273 t << "Encryption "; 00274 switch (loc->encryption_) 00275 { 00276 case ENCRYPT_ALWAYS: t << "Always"; break; 00277 case ENCRYPT_NEVER: t << "Never"; break; 00278 case ENCRYPT_REQUIRED: t << "Required"; break; 00279 default: 00280 case ENCRYPT_IFREQUESTED: t << "IfRequested"; break; 00281 } 00282 t << endl; 00283 t << "Satisfy " << (loc->satisfy_ == SATISFY_ALL ? "All" : "Any") << endl; 00284 t << "Order " << (loc->order_ == ORDER_ALLOW_DENY ? "allow,deny" : "deny,allow") << endl; 00285 for (QStringList::ConstIterator it=loc->addresses_.begin(); it!=loc->addresses_.end(); ++it) 00286 t << *it << endl; 00287 t << "</Location>" << endl; 00288 } 00289 00290 t << endl << "# Network" << endl; 00291 t << endl << comments_["hostnamelookups"] << endl; 00292 t << "HostnameLookups "; 00293 switch (hostnamelookup_) 00294 { 00295 default: 00296 case HOSTNAME_OFF: t << "Off"; break; 00297 case HOSTNAME_ON: t << "On"; break; 00298 case HOSTNAME_DOUBLE: t << "Double"; break; 00299 } 00300 t << endl; 00301 00302 t << endl << comments_["keepalive"] << endl; 00303 t << "KeepAlive " << (keepalive_ ? "On" : "Off") << endl; 00304 00305 t << endl << comments_["keepalivetimeout"] << endl; 00306 t << "KeepAliveTimeout " << keepalivetimeout_ << endl; 00307 00308 t << endl << comments_["maxclients"] << endl; 00309 t << "MaxClients " << maxclients_ << endl; 00310 00311 t << endl << comments_["maxrequestsize"] << endl; 00312 t << "MaxRequestSize " << maxrequestsize_ << endl; 00313 00314 t << endl << comments_["timeout"] << endl; 00315 t << "Timeout " << clienttimeout_ << endl; 00316 00317 t << endl << comments_["listen"] << endl; 00318 for (QStringList::ConstIterator it=listenaddresses_.begin(); it!=listenaddresses_.end(); ++it) 00319 t << *it << endl; 00320 00321 t << endl << "# Log" << endl; 00322 t << endl << comments_["accesslog"] << endl; 00323 t << "AccessLog " << accesslog_ << endl; 00324 00325 t << endl << comments_["errorlog"] << endl; 00326 t << "ErrorLog " << errorlog_ << endl; 00327 00328 t << endl << comments_["pagelog"] << endl; 00329 t << "PageLog " << pagelog_ << endl; 00330 00331 t << endl << comments_["maxlogsize"] << endl; 00332 //t << "MaxLogSize " << maxlogsize_ << "m" << endl; 00333 t << "MaxLogSize " << maxlogsize_ << endl; 00334 00335 t << endl << comments_["loglevel"] << endl; 00336 t << "LogLevel "; 00337 switch (loglevel_) 00338 { 00339 case LOGLEVEL_NONE: t << "none"; break; 00340 default: 00341 case LOGLEVEL_INFO: t << "info"; break; 00342 case LOGLEVEL_ERROR: t << "error"; break; 00343 case LOGLEVEL_WARN: t << "warn"; break; 00344 case LOGLEVEL_DEBUG: t << "debug"; break; 00345 case LOGLEVEL_DEBUG2: t << "debug2"; break; 00346 } 00347 t << endl; 00348 00349 t << endl << "# Jobs" << endl; 00350 t << endl << comments_["preservejobhistory"] << endl; 00351 t << "PreserveJobHistory " << (keepjobhistory_ ? "On" : "Off") << endl; 00352 00353 t << endl << comments_["preservejobfiles"] << endl; 00354 if (keepjobhistory_) t << "PreserveJobFiles " << (keepjobfiles_ ? "On" : "Off") << endl; 00355 00356 t << endl << comments_["autopurgejobs"] << endl; 00357 if (keepjobhistory_) t << "AutoPurgeJobs " << (autopurgejobs_ ? "Yes" : "No") << endl; 00358 00359 t << endl << comments_["maxjobs"] << endl; 00360 t << "MaxJobs " << maxjobs_ << endl; 00361 00362 t << endl << comments_["maxjobsperprinter"] << endl; 00363 t << "MaxJobsPerPrinter " << maxjobsperprinter_ << endl; 00364 00365 t << endl << comments_["maxjobsperuser"] << endl; 00366 t << "MaxJobsPerUser " << maxjobsperuser_ << endl; 00367 00368 t << endl << "# Filter" << endl; 00369 t << endl << comments_["user"] << endl; 00370 t << "User " << user_ << endl; 00371 00372 t << endl << comments_["group"] << endl; 00373 t << "Group " << group_ << endl; 00374 00375 t << endl << comments_["ripcache"] << endl; 00376 t << "RIPCache " << ripcache_ << endl; 00377 00378 t << endl << comments_["filterlimit"] << endl; 00379 t << "FilterLimit " << filterlimit_ << endl; 00380 00381 t << endl << "# Directories" << endl; 00382 t << endl << comments_["datadir"] << endl; 00383 t << "DataDir " << datadir_ << endl; 00384 00385 t << endl << comments_["documentroot"] << endl; 00386 t << "DocumentRoot " << documentdir_ << endl; 00387 00388 t << endl << comments_["fontpath"] << endl; 00389 for (QStringList::ConstIterator it=fontpath_.begin(); it!=fontpath_.end(); ++it) 00390 t << "FontPath " << *it << endl; 00391 00392 t << endl << comments_["requestroot"] << endl; 00393 t << "RequestRoot " << requestdir_ << endl; 00394 00395 t << endl << comments_["serverbin"] << endl; 00396 t << "ServerBin " << serverbin_ << endl; 00397 00398 t << endl << comments_["serverroot"] << endl; 00399 t << "ServerRoot " << serverfiles_ << endl; 00400 00401 t << endl << comments_["tempdir"] << endl; 00402 t << "TempDir " << tmpfiles_ << endl; 00403 00404 t << endl << "# Browsing" << endl; 00405 t << endl << comments_["browsing"] << endl; 00406 t << "Browsing " << (browsing_ ? "On" : "Off") << endl; 00407 00408 t << endl << comments_["browseprotocols"] << endl; 00409 if (browsing_) 00410 { 00411 t << "BrowseProtocols "; 00412 for (QStringList::ConstIterator it=browseprotocols_.begin(); it!=browseprotocols_.end(); ++it) 00413 t << (*it).upper() << " "; 00414 t << endl; 00415 } 00416 00417 t << endl << comments_["browseport"] << endl; 00418 if (browsing_) t << "BrowsePort " << browseport_ << endl; 00419 00420 t << endl << comments_["browseinterval"] << endl; 00421 if (browsing_) t << "BrowseInterval " << browseinterval_ << endl; 00422 00423 t << endl << comments_["browsetimeout"] << endl; 00424 if (browsing_) t << "BrowseTimeout " << browsetimeout_ << endl; 00425 00426 t << endl << comments_["browseaddress"] << endl; 00427 if (browsing_) 00428 for (QStringList::ConstIterator it=browseaddresses_.begin(); it!=browseaddresses_.end(); ++it) 00429 if ((*it).startsWith("Send")) 00430 t << "BrowseAddress " << (*it).mid(5) << endl; 00431 else 00432 t << "Browse" << (*it) << endl; 00433 00434 t << endl << comments_["browseorder"] << endl; 00435 if (browsing_) t << "BrowseOrder " << (browseorder_ == ORDER_ALLOW_DENY ? "allow,deny" : "deny,allow") << endl; 00436 00437 t << endl << comments_["implicitclasses"] << endl; 00438 if (browsing_) t << "ImplicitClasses " << (useimplicitclasses_ ? "On" : "Off") << endl; 00439 00440 t << endl << comments_["implicitanyclasses"] << endl; 00441 if (browsing_) t << "ImplicitAnyClasses " << (useanyclasses_ ? "On" : "Off") << endl; 00442 00443 t << endl << comments_["hideimplicitmembers"] << endl; 00444 if (browsing_) t << "HideImplicitMembers " << (hideimplicitmembers_ ? "Yes" : "No") << endl; 00445 00446 t << endl << comments_["browseshortnames"] << endl; 00447 if (browsing_) t << "BrowseShortNames " << (useshortnames_ ? "Yes" : "No") << endl; 00448 00449 t << endl << "# Unknown" << endl; 00450 for (QValueList< QPair<QString,QString> >::ConstIterator it=unknown_.begin(); it!=unknown_.end(); ++it) 00451 t << (*it).first << " " << (*it).second << endl; 00452 00453 return true; 00454 } 00455 } 00456 00457 bool CupsdConf::parseLocation(CupsLocation *location, QTextStream& file) 00458 { 00459 QString line; 00460 bool done(false); 00461 bool value(true); 00462 while (!done && value) 00463 { 00464 line = file.readLine().simplifyWhiteSpace(); 00465 if (line.isEmpty()) 00466 { 00467 if (file.atEnd()) 00468 { 00469 value = false; 00470 done = true; 00471 } 00472 else continue; 00473 } 00474 else if (line[0] == '#') continue; 00475 else if (line.lower() == "</location>") done = true; 00476 else value = location->parseOption(line); 00477 } 00478 return value; 00479 } 00480 00481 bool CupsdConf::parseOption(const QString& line) 00482 { 00483 int p(-1); 00484 QString keyword, value, l(line.simplifyWhiteSpace()); 00485 00486 if ((p=l.find(' ')) != -1) 00487 { 00488 keyword = l.left(p).lower(); 00489 value = l.mid(p+1); 00490 } 00491 else 00492 { 00493 keyword = l.lower(); 00494 } 00495 00496 //kdDebug() << "cupsd.conf keyword=" << keyword << endl; 00497 if (keyword == "accesslog") accesslog_ = value; 00498 else if (keyword == "autopurgejobs") autopurgejobs_ = (value.lower() == "yes"); 00499 else if (keyword == "browseaddress") browseaddresses_.append("Send "+value); 00500 else if (keyword == "browseallow") browseaddresses_.append("Allow "+value); 00501 else if (keyword == "browsedeny") browseaddresses_.append("Deny "+value); 00502 else if (keyword == "browseinterval") browseinterval_ = value.toInt(); 00503 else if (keyword == "browseorder") browseorder_ = (value.lower() == "deny,allow" ? ORDER_DENY_ALLOW : ORDER_ALLOW_DENY); 00504 else if (keyword == "browsepoll") browseaddresses_.append("Poll "+value); 00505 else if (keyword == "browseport") browseport_ = value.toInt(); 00506 else if (keyword == "browseprotocols") 00507 { 00508 browseprotocols_.clear(); 00509 QStringList prots = QStringList::split(QRegExp("\\s"), value, false); 00510 if (prots.find("all") != prots.end()) 00511 browseprotocols_ << "CUPS" << "SLP"; 00512 else 00513 for (QStringList::ConstIterator it=prots.begin(); it!=prots.end(); ++it) 00514 browseprotocols_ << (*it).upper(); 00515 } 00516 else if (keyword == "browserelay") browseaddresses_.append("Relay "+value); 00517 else if (keyword == "browseshortnames") useshortnames_ = (value.lower() != "no"); 00518 else if (keyword == "browsetimeout") browsetimeout_ = value.toInt(); 00519 else if (keyword == "browsing") browsing_ = (value.lower() != "off"); 00520 else if (keyword == "classification") 00521 { 00522 QString cl = value.lower(); 00523 if (cl == "none") classification_ = CLASS_NONE; 00524 else if (cl == "classified") classification_ = CLASS_CLASSIFIED; 00525 else if (cl == "confidential") classification_ = CLASS_CONFIDENTIAL; 00526 else if (cl == "secret") classification_ = CLASS_SECRET; 00527 else if (cl == "topsecret") classification_ = CLASS_TOPSECRET; 00528 else if (cl == "unclassified") classification_ = CLASS_UNCLASSIFIED; 00529 else 00530 { 00531 classification_ = CLASS_OTHER; 00532 otherclassname_ = cl; 00533 } 00534 } 00535 else if (keyword == "classifyoverride") classoverride_ = (value.lower() == "yes"); 00536 else if (keyword == "datadir") datadir_ = value; 00537 else if (keyword == "defaultcharset") charset_ = value; 00538 else if (keyword == "defaultlanguage") language_ = value; 00539 else if (keyword == "documentroot") documentdir_ = value; 00540 else if (keyword == "errorlog") errorlog_ = value; 00541 else if (keyword == "filterlimit") filterlimit_ = value.toInt(); 00542 else if (keyword == "fontpath") fontpath_ += QStringList::split(':', value, false); 00543 else if (keyword == "group") group_ = value; 00544 else if (keyword == "hideimplicitmembers") hideimplicitmembers_ = (value.lower() != "no"); 00545 else if (keyword == "hostnamelookups") 00546 { 00547 QString h = value.lower(); 00548 if (h == "on") hostnamelookup_ = HOSTNAME_ON; 00549 else if (h == "double") hostnamelookup_ = HOSTNAME_DOUBLE; 00550 else hostnamelookup_ = HOSTNAME_OFF; 00551 } 00552 else if (keyword == "implicitclasses") useimplicitclasses_ = (value.lower() != "off"); 00553 else if (keyword == "implicitanyclasses") useanyclasses_ = (value.lower() == "on"); 00554 else if (keyword == "keepalive") keepalive_ = (value.lower() != "off"); 00555 else if (keyword == "keepalivetimeout") keepalivetimeout_ = value.toInt(); 00556 else if (keyword == "listen") listenaddresses_.append("Listen "+value); 00557 else if (keyword == "loglevel") 00558 { 00559 QString ll = value.lower(); 00560 if (ll == "none") loglevel_ = LOGLEVEL_NONE; 00561 else if (ll == "error") loglevel_ = LOGLEVEL_ERROR; 00562 else if (ll == "warn") loglevel_ = LOGLEVEL_WARN; 00563 else if (ll == "info") loglevel_ = LOGLEVEL_INFO; 00564 else if (ll == "debug") loglevel_ = LOGLEVEL_DEBUG; 00565 else if (ll == "debug2") loglevel_ = LOGLEVEL_DEBUG2; 00566 } 00567 else if (keyword == "maxclients") maxclients_ = value.toInt(); 00568 else if (keyword == "maxjobs") maxjobs_ = value.toInt(); 00569 else if (keyword == "maxjobsperprinter") maxjobsperprinter_ = value.toInt(); 00570 else if (keyword == "maxjobsperuser") maxjobsperuser_ = value.toInt(); 00571 else if (keyword == "maxrequestsize") maxrequestsize_ = value; 00572 else if (keyword == "maxlogsize") maxlogsize_ = value; 00573 /*{ 00574 // FIXME: support for suffixes 00575 int suffix; 00576 splitSizeSpec( value, maxlogsize_, suffix ); 00577 }*/ 00578 else if (keyword == "pagelog") pagelog_ = value; 00579 else if (keyword == "port") listenaddresses_.append("Listen *:"+value); 00580 else if (keyword == "preservejobhistory") keepjobhistory_ = (value != "off"); 00581 else if (keyword == "preservejobfiles") keepjobfiles_ = (value == "on"); 00582 else if (keyword == "printcap") printcap_ = value; 00583 else if (keyword == "printcapformat") printcapformat_ = (value.lower() == "solaris" ? PRINTCAP_SOLARIS : PRINTCAP_BSD); 00584 else if (keyword == "requestroot") requestdir_ = value; 00585 else if (keyword == "remoteroot") remoteroot_ = value; 00586 else if (keyword == "ripcache") ripcache_ = value; 00587 else if (keyword == "serveradmin") serveradmin_ = value; 00588 else if (keyword == "serverbin") serverbin_ = value; 00589 else if (keyword == "servercertificate") encryptcert_ = value; 00590 else if (keyword == "serverkey") encryptkey_ = value; 00591 else if (keyword == "servername") servername_ = value; 00592 else if (keyword == "serverroot") serverfiles_ = value; 00593 else if (keyword == "ssllisten") listenaddresses_.append("SSLListen "+value); 00594 else if (keyword == "sslport") listenaddresses_.append("SSLListen *:"+value); 00595 else if (keyword == "systemgroup") systemgroup_ = value; 00596 else if (keyword == "tempdir") tmpfiles_ = value; 00597 else if (keyword == "timeout") clienttimeout_ = value.toInt(); 00598 else if (keyword == "user") user_ = value; 00599 else 00600 { 00601 // unrecognized option 00602 unknown_ << QPair<QString,QString>(keyword, value); 00603 } 00604 return true; 00605 } 00606 00607 bool CupsdConf::loadAvailableResources() 00608 { 00609 KConfig conf("kdeprintrc"); 00610 conf.setGroup("CUPS"); 00611 QString host = conf.readEntry("Host",cupsServer()); 00612 int port = conf.readNumEntry("Port",ippPort()); 00613 http_t *http_ = httpConnect(host.local8Bit(),port); 00614 00615 resources_.clear(); 00616 // standard resources 00617 resources_.append(new CupsResource("/")); 00618 resources_.append(new CupsResource("/admin")); 00619 resources_.append(new CupsResource("/printers")); 00620 resources_.append(new CupsResource("/classes")); 00621 resources_.append(new CupsResource("/jobs")); 00622 00623 if (!http_) 00624 return false; 00625 00626 // printer resources 00627 ipp_t *request_ = ippNew(); 00628 cups_lang_t* lang = cupsLangDefault(); 00629 ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, cupsLangEncoding(lang)); 00630 ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, lang->language); 00631 request_->request.op.operation_id = CUPS_GET_PRINTERS; 00632 request_ = cupsDoRequest(http_, request_, "/printers/"); 00633 if (request_) 00634 { 00635 QString name; 00636 int type(0); 00637 ipp_attribute_t *attr = request_->attrs; 00638 while (attr) 00639 { 00640 // check new printer (keep only local non-implicit printers) 00641 if (!attr->name) 00642 { 00643 if (!(type & CUPS_PRINTER_REMOTE) && !(type & CUPS_PRINTER_IMPLICIT) && !name.isEmpty()) 00644 resources_.append(new CupsResource("/printers/"+name)); 00645 name = ""; 00646 type = 0; 00647 } 00648 else if (strcmp(attr->name, "printer-name") == 0) name = attr->values[0].string.text; 00649 else if (strcmp(attr->name, "printer-type") == 0) type = attr->values[0].integer; 00650 attr = attr->next; 00651 } 00652 if (!(type & CUPS_PRINTER_REMOTE) && !(type & CUPS_PRINTER_IMPLICIT) && !name.isEmpty()) 00653 resources_.append(new CupsResource("/printers/"+name)); 00654 ippDelete(request_); 00655 } 00656 // class resources 00657 request_ = ippNew(); 00658 ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, cupsLangEncoding(lang)); 00659 ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, lang->language); 00660 request_->request.op.operation_id = CUPS_GET_CLASSES; 00661 request_ = cupsDoRequest(http_, request_, "/classes/"); 00662 if (request_) 00663 { 00664 QString name; 00665 int type(0); 00666 ipp_attribute_t *attr = request_->attrs; 00667 while (attr) 00668 { 00669 // check new class (keep only local classes) 00670 if (!attr->name) 00671 { 00672 if (!(type & CUPS_PRINTER_REMOTE) && !name.isEmpty()) 00673 resources_.append(new CupsResource("/classes/"+name)); 00674 name = ""; 00675 type = 0; 00676 } 00677 else if (strcmp(attr->name, "printer-name") == 0) name = attr->values[0].string.text; 00678 else if (strcmp(attr->name, "printer-type") == 0) type = attr->values[0].integer; 00679 attr = attr->next; 00680 } 00681 if (!(type & CUPS_PRINTER_REMOTE) && !name.isEmpty()) 00682 resources_.append(new CupsResource("/classes/"+name)); 00683 ippDelete(request_); 00684 } 00685 httpClose(http_); 00686 return true; 00687 } 00688 00689 //------------------------------------------------------------------------------------------------ 00690 00691 CupsLocation::CupsLocation() 00692 { 00693 resource_ = 0; 00694 resourcename_ = ""; 00695 authtype_ = AUTHTYPE_NONE; 00696 authclass_ = AUTHCLASS_ANONYMOUS; 00697 authname_ = QString::null; 00698 encryption_ = ENCRYPT_IFREQUESTED; 00699 satisfy_ = SATISFY_ALL; 00700 order_ = ORDER_ALLOW_DENY; 00701 // addresses_ 00702 } 00703 00704 CupsLocation::CupsLocation(const CupsLocation& loc) 00705 : resource_(loc.resource_), 00706 resourcename_(loc.resourcename_), 00707 authtype_(loc.authtype_), 00708 authclass_(loc.authclass_), 00709 authname_(loc.authname_), 00710 encryption_(loc.encryption_), 00711 satisfy_(loc.satisfy_), 00712 order_(loc.order_), 00713 addresses_(loc.addresses_) 00714 { 00715 } 00716 00717 bool CupsLocation::parseResource(const QString& line) 00718 { 00719 QString str = line.simplifyWhiteSpace(); 00720 int p1 = line.find(' '), p2 = line.find('>'); 00721 if (p1 != -1 && p2 != -1) 00722 { 00723 resourcename_ = str.mid(p1+1,p2-p1-1); 00724 return true; 00725 } 00726 else return false; 00727 } 00728 00729 bool CupsLocation::parseOption(const QString& line) 00730 { 00731 int p(-1); 00732 QString keyword, value, l(line.simplifyWhiteSpace()); 00733 00734 if ((p=l.find(' ')) != -1) 00735 { 00736 keyword = l.left(p).lower(); 00737 value = l.mid(p+1); 00738 } 00739 else 00740 { 00741 keyword = l.lower(); 00742 } 00743 00744 if (keyword == "authtype") 00745 { 00746 QString a = value.lower(); 00747 if (a == "basic") authtype_ = AUTHTYPE_BASIC; 00748 else if (a == "digest") authtype_ = AUTHTYPE_DIGEST; 00749 else authtype_ = AUTHTYPE_NONE; 00750 } 00751 else if (keyword == "authclass") 00752 { 00753 QString a = value.lower(); 00754 if (a == "user") authclass_ = AUTHCLASS_USER; 00755 else if (a == "system") authclass_ = AUTHCLASS_SYSTEM; 00756 else if (a == "group") authclass_ = AUTHCLASS_GROUP; 00757 else authclass_ = AUTHCLASS_ANONYMOUS; 00758 } 00759 else if (keyword == "authgroupname") authname_ = value; 00760 else if (keyword == "require") 00761 { 00762 int p = value.find(' '); 00763 if (p != -1) 00764 { 00765 authname_ = value.mid(p+1); 00766 QString cl = value.left(p).lower(); 00767 if (cl == "user") 00768 authclass_ = AUTHCLASS_USER; 00769 else if (cl == "group") 00770 authclass_ = AUTHCLASS_GROUP; 00771 } 00772 } 00773 else if (keyword == "allow") addresses_.append("Allow "+value); 00774 else if (keyword == "deny") addresses_.append("Deny "+value); 00775 else if (keyword == "order") order_ = (value.lower() == "deny,allow" ? ORDER_DENY_ALLOW : ORDER_ALLOW_DENY); 00776 else if (keyword == "encryption") 00777 { 00778 QString e = value.lower(); 00779 if (e == "always") encryption_ = ENCRYPT_ALWAYS; 00780 else if (e == "never") encryption_ = ENCRYPT_NEVER; 00781 else if (e == "required") encryption_ = ENCRYPT_REQUIRED; 00782 else encryption_ = ENCRYPT_IFREQUESTED; 00783 } 00784 else if (keyword == "satisfy") satisfy_ = (value.lower() == "any" ? SATISFY_ANY : SATISFY_ALL); 00785 else return false; 00786 return true; 00787 } 00788 00789 //------------------------------------------------------------------------------------------------ 00790 00791 CupsResource::CupsResource() 00792 { 00793 type_ = RESOURCE_GLOBAL; 00794 } 00795 00796 CupsResource::CupsResource(const QString& path) 00797 { 00798 setPath(path); 00799 } 00800 00801 void CupsResource::setPath(const QString& path) 00802 { 00803 path_ = path; 00804 type_ = typeFromPath(path_); 00805 text_ = pathToText(path_); 00806 } 00807 00808 int CupsResource::typeFromText(const QString& text) 00809 { 00810 if (text == i18n("Base", "Root") || text == i18n("All printers") || text == i18n("All classes") || text == i18n("Print jobs")) return RESOURCE_GLOBAL; 00811 else if (text == i18n("Administration")) return RESOURCE_ADMIN; 00812 else if (text.find(i18n("Class")) == 0) return RESOURCE_CLASS; 00813 else if (text.find(i18n("Printer")) == 0) return RESOURCE_PRINTER; 00814 else return RESOURCE_PRINTER; 00815 } 00816 00817 int CupsResource::typeFromPath(const QString& path) 00818 { 00819 if (path == "/admin") return RESOURCE_ADMIN; 00820 else if (path == "/printers" || path == "/classes" || path == "/" || path == "/jobs") return RESOURCE_GLOBAL; 00821 else if (path.left(9) == "/printers") return RESOURCE_PRINTER; 00822 else if (path.left(8) == "/classes") return RESOURCE_CLASS; 00823 else return RESOURCE_GLOBAL; 00824 } 00825 00826 QString CupsResource::textToPath(const QString& text) 00827 { 00828 QString path("/"); 00829 if (text == i18n("Administration")) path = "/admin"; 00830 else if (text == i18n("All printers")) path = "/printers"; 00831 else if (text == i18n("All classes")) path = "/classes"; 00832 else if (text == i18n("Print jobs")) path = "/jobs"; 00833 else if (text == i18n("Base", "Root")) path = "/"; 00834 else if (text.find(i18n("Printer")) == 0) 00835 { 00836 path = "/printers/"; 00837 path.append(text.right(text.length()-i18n("Printer").length()-1)); 00838 } 00839 else if (text.find(i18n("Class")) == 0) 00840 { 00841 path = "/classes/"; 00842 path.append(text.right(text.length()-i18n("Class").length()-1)); 00843 } 00844 return path; 00845 } 00846 00847 QString CupsResource::pathToText(const QString& path) 00848 { 00849 QString text(i18n("Base", "Root")); 00850 if (path == "/admin") text = i18n("Administration"); 00851 else if (path == "/printers") text = i18n("All printers"); 00852 else if (path == "/classes") text = i18n("All classes"); 00853 else if (path == "/") text = i18n("Root"); 00854 else if (path == "/jobs") text = i18n("Print jobs"); 00855 else if (path.find("/printers/") == 0) 00856 { 00857 text = i18n("Printer"); 00858 text.append(" "); 00859 text.append(path.right(path.length()-10)); 00860 } 00861 else if (path.find("/classes/") == 0) 00862 { 00863 text = i18n("Class"); 00864 text.append(" "); 00865 text.append(path.right(path.length()-9)); 00866 } 00867 return text; 00868 } 00869 00870 QString CupsResource::typeToIconName(int type) 00871 { 00872 switch (type) 00873 { 00874 case RESOURCE_ADMIN: 00875 case RESOURCE_GLOBAL: 00876 return QString("folder"); 00877 case RESOURCE_PRINTER: 00878 return QString("kdeprint_printer"); 00879 case RESOURCE_CLASS: 00880 return QString("kdeprint_printer_class"); 00881 } 00882 return QString("folder"); 00883 }
KDE Logo
This file is part of the documentation for kdeprint Library Version 3.2.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 16 17:23:16 2005 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003