00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "cupsdconf.h"
00021
00022 #include <qfile.h>
00023 #include <klocale.h>
00024 #include <kdebug.h>
00025 #include <kconfig.h>
00026
00027 #include <stdlib.h>
00028 #include <cups/cups.h>
00029 #include <cups/ipp.h>
00030 #include <cups/language.h>
00031
00032 CupsdConf::CupsdConf()
00033 {
00034 servername_ = QString::null;
00035 serveradmin_ = QString::null;
00036 user_ = QString::null;
00037 group_ = QString::null;
00038 remroot_ = QString::null;
00039 accesslog_ = QString::null;
00040 errorlog_ = QString::null;
00041 pagelog_ = QString::null;
00042 loglevel_ = -1;
00043 maxlogsize_ = -1;
00044 datadir_ = QString::null;
00045 requestroot_ = QString::null;
00046 serverbin_ = QString::null;
00047 serverroot_ = QString::null;
00048 tempdir_ = QString::null;
00049 fontpath_ = QString::null;
00050 documentroot_ = QString::null;
00051 defaultcharset_ = QString::null;
00052 defaultlanguage_ = QString::null;
00053 preservejobhistory_ = -1;
00054 preservejobfiles_ = -1;
00055 autopurgejobs_ = -1;
00056 maxjobs_ = -1;
00057 filterlimit_ = -1;
00058 classification_ = QString::null;
00059 classifyoverride_ = -1;
00060 printcap_ = QString::null;
00061 ripcache_ = QString::null;
00062 hostnamelookups_ = -1;
00063 keepalive_ = -1;
00064 keepalivetimeout_ = -1;
00065 maxclients_ = -1;
00066 maxrequestsize_ = -1;
00067 timeout_ = -1;
00068 browsing_ = -1;
00069 browseshortnames_ = -1;
00070 implicitclasses_ = -1;
00071 implicitanyclasses_ = -1;
00072 hideimplicitmembers_ = -1;
00073 browseprotocols_ = -1;
00074
00075 browseport_ = -1;
00076
00077
00078
00079
00080 browseorder_ = -1;
00081 browseinterval_ = -1;
00082 browsetimeout_ = -1;
00083 systemgroup_ = QString::null;
00084 locations_.setAutoDelete(true);
00085 resources_.setAutoDelete(true);
00086 servercertificate_ = QString::null;
00087 serverkey_ = QString::null;
00088
00089 loadAvailableResources();
00090 }
00091
00092 CupsdConf::~CupsdConf()
00093 {
00094 }
00095
00096 bool CupsdConf::loadFromFile(const QString& filename)
00097 {
00098 QFile f(filename);
00099 if (!f.exists() || !f.open(IO_ReadOnly)) return false;
00100 else
00101 {
00102 QTextStream t(&f);
00103 QString line;
00104 bool done(false), value(true);
00105 while (!done && value)
00106 {
00107 line = t.readLine().simplifyWhiteSpace();
00108 if (line.isEmpty())
00109 {
00110 if (t.atEnd()) done = true;
00111 else continue;
00112 }
00113 else if (line[0] == '#') continue;
00114 else if (line.left(9).lower() == "<location")
00115 {
00116 CupsLocation *location = new CupsLocation();
00117 locations_.append(location);
00118 if (!location->parseResource(line) || !parseLocation(location, t))
00119 value = false;
00120
00121 for (resources_.first();resources_.current();resources_.next())
00122 if (resources_.current()->path_ == location->resourcename_)
00123 location->resource_ = resources_.current();
00124 }
00125 else value = parseOption(line);
00126 }
00127 f.close();
00128 return value;
00129 }
00130 }
00131
00132 bool CupsdConf::saveToFile(const QString& filename)
00133 {
00134 QFile f(filename);
00135 if (!f.open(IO_WriteOnly)) return false;
00136 else
00137 {
00138 QTextStream t(&f);
00139 t << comments_[HEADER_COMM] << endl;
00140 t << comments_[SERVERNAME_COMM] << endl;
00141 if (!servername_.isNull()) t << "ServerName " << servername_ << endl;
00142 t << endl << comments_[SERVERADMIN_COMM] << endl;
00143 if (!serveradmin_.isNull()) t << "ServerAdmin " << serveradmin_ << endl;
00144 t << endl << comments_[USER_COMM] << endl;
00145 if (!user_.isNull()) t << "User " << user_ << endl;
00146 t << endl << comments_[GROUP_COMM] << endl;
00147 if (!group_.isNull()) t << "Group " << group_ << endl;
00148 t << endl << comments_[REMOTEROOT_COMM] << endl;
00149 if (!remroot_.isNull()) t << "RemoteRoot " << remroot_ << endl;
00150 t << endl << comments_[ACCESSLOG_COMM] << endl;
00151 if (!accesslog_.isNull()) t << "AccessLog " << accesslog_ << endl;
00152 t << endl << comments_[ERRORLOG_COMM] << endl;
00153 if (!errorlog_.isNull()) t << "ErrorLog " << errorlog_ << endl;
00154 t << endl << comments_[PAGELOG_COMM] << endl;
00155 if (!pagelog_.isNull()) t << "PageLog " << pagelog_ << endl;
00156 t << endl << comments_[LOGLEVEL_COMM] << endl;
00157 if (loglevel_ != -1)
00158 {
00159 t << "LogLevel ";
00160 switch (loglevel_)
00161 {
00162 case LOGLEVEL_DEBUG2: t << "debug2" << endl; break;
00163 case LOGLEVEL_DEBUG: t << "debug" << endl; break;
00164 case LOGLEVEL_INFO: t << "info" << endl; break;
00165 case LOGLEVEL_WARN: t << "warn" << endl; break;
00166 case LOGLEVEL_ERROR: t << "error" << endl; break;
00167 case LOGLEVEL_NONE: t << "none" << endl; break;
00168 default: t << "info" << endl; break;
00169 }
00170 }
00171 t << endl << comments_[MAXLOGSIZE_COMM] << endl;
00172 if (maxlogsize_ != -1) t << "MaxLogSize " << maxlogsize_ << endl;
00173 t << endl << comments_[DATADIR_COMM] << endl;
00174 if (!datadir_.isNull()) t << "DataDir " << datadir_ << endl;
00175 t << endl << comments_[REQUESTROOT_COMM] << endl;
00176 if (!requestroot_.isNull()) t << "RequestRoot " << requestroot_ << endl;
00177 t << endl << comments_[SERVERBIN_COMM] << endl;
00178 if (!serverbin_.isNull()) t << "ServerBin " << serverbin_ << endl;
00179 t << endl << comments_[SERVERROOT_COMM] << endl;
00180 if (!serverroot_.isNull()) t << "ServerRoot " << serverroot_ << endl;
00181 t << endl << comments_[SERVERCERTIFICATE_COMM] << endl;
00182 if (!servercertificate_.isNull()) t << "ServerCertificate " << servercertificate_ << endl;
00183 t << endl << comments_[SERVERKEY_COMM] << endl;
00184 if (!serverkey_.isNull()) t << "ServerKey " << serverkey_ << endl;
00185 t << endl << comments_[TEMPDIR_COMM] << endl;
00186 if (!tempdir_.isNull()) t << "TempDir " << tempdir_ << endl;
00187 t << endl << comments_[FONTPATH_COMM] << endl;
00188 if (!fontpath_.isNull()) t << "FontPath " << fontpath_ << endl;
00189 t << endl << comments_[DOCUMENTROOT_COMM] << endl;
00190 if (!documentroot_.isNull()) t << "DocumentRoot " << documentroot_ << endl;
00191 t << endl << comments_[DEFAULTCHARSET_COMM] << endl;
00192 if (!defaultcharset_.isNull()) t << "DefaultCharset " << defaultcharset_ << endl;
00193 t << endl << comments_[DEFAULTLANG_COMM] << endl;
00194 if (!defaultlanguage_.isNull()) t << "DefaultLanguage " << defaultlanguage_ << endl;
00195 t << endl << comments_[PRESERVEJOBHIST_COMM] << endl;
00196 if (preservejobhistory_ != -1) t << "PreserveJobHistory " << (preservejobhistory_ == 1 ? "Yes" : "No") << endl;
00197 t << endl << comments_[PRESERVEJOBFILE_COMM] << endl;
00198 if (preservejobfiles_ != -1) t << "PreserveJobFiles " << (preservejobfiles_ == 1 ? "Yes" : "No") << endl;
00199 t << endl << comments_[AUTOPURGEJOBS_COMM] << endl;
00200 if (autopurgejobs_ != -1) t << "AutoPurgeJobs " << (autopurgejobs_ == 1 ? "Yes" : "No") << endl;
00201 t << endl << comments_[MAXJOBS_COMM] << endl;
00202 if (maxjobs_ != -1) t << "MaxJobs " << maxjobs_ << endl;
00203 t << endl << comments_[FILTERLIMIT_COMM] << endl;
00204 if (filterlimit_ != -1) t << "FilterLimit " << filterlimit_ << endl;
00205 t << endl << comments_[CLASSIFICATION_COMM] << endl;
00206 if (!classification_.isNull()) t << "Classification " << classification_ << endl;
00207 t << endl << comments_[CLASSIFYOVERRIDE_COMM] << endl;
00208 if (classifyoverride_ != -1) t << "ClassifyOverride " << (classifyoverride_ == 1 ? "On" : "Off") << endl;
00209 t << endl << comments_[PRINTCAP_COMM] << endl;
00210 if (!printcap_.isNull()) t << "Printcap " << printcap_ << endl;
00211 t << endl << comments_[RIPCACHE_COMM] << endl;
00212 if (!ripcache_.isNull()) t << "RIPCache " << ripcache_ << endl;
00213 t << endl << comments_[PORT_COMM] << endl;
00214 QValueList<int>::Iterator it;
00215 for (it=port_.begin();it!=port_.end();++it)
00216 t << "Port " << (*it) << endl;
00217 t << endl << comments_[HOSTNAMELOOKUPS_COMM] << endl;
00218 if (hostnamelookups_ != -1) t << "HostNameLookups " << (hostnamelookups_ == 1 ? "On" : "Off") << endl;
00219 t << endl << comments_[KEEPALIVE_COMM] << endl;
00220 if (keepalive_ != -1) t << "KeepAlive " << (keepalive_ == 1 ? "On" : "Off") << endl;
00221 t << endl << comments_[KEEPALIVETIMEOUT_COMM] << endl;
00222 if (keepalivetimeout_ != -1) t << "KeepAliveTimeout " << keepalivetimeout_ << endl;
00223 t << endl << comments_[MAXCLIENTS_COMM] << endl;
00224 if (maxclients_ != -1) t << "MaxClients " << maxclients_ << endl;
00225 t << endl << comments_[MAXREQUESTSIZE_COMM] << endl;
00226 if (maxrequestsize_ != -1) t << "MaxRequestSize " << maxrequestsize_ << endl;
00227 t << endl << comments_[TIMEOUT_COMM] << endl;
00228 if (timeout_ != -1) t << "Timeout " << timeout_ << endl;
00229 t << endl << comments_[BROWSING_COMM] << endl;
00230 if (browsing_ != -1) t << "Browsing " << (browsing_ == 1 ? "On" : "Off") << endl;
00231 t << endl << comments_[BROWSESHORTNAMES_COMM] << endl;
00232 if (browseshortnames_ != -1) t << "BrowseShortNames " << (browseshortnames_ == 1 ? "Yes" : "No") << endl;
00233 t << endl << comments_[IMPLICITCLASSES_COMM] << endl;
00234 if (implicitclasses_ != -1) t << "ImplicitClasses " << (implicitclasses_ == 1 ? "On" : "Off") << endl;
00235 t << endl << comments_[IMPLICITANYCLASSES_COMM] << endl;
00236 if (implicitanyclasses_ != -1) t << "ImplicitAnyClasses " << (implicitanyclasses_ == 1 ? "On" : "Off") << endl;
00237 t << endl << comments_[HIDEIMPLICITMEMBERS_COMM] << endl;
00238 if (hideimplicitmembers_ != -1) t << "HideImplicitMembers " << (hideimplicitmembers_ == 1 ? "On" : "Off") << endl;
00239 t << endl << comments_[BROWSEPROTOCOLS_COMM] << endl;
00240 switch (browseprotocols_)
00241 {
00242 case BROWSE_ALL: t << "BrowseProtocols all" << endl; break;
00243 case BROWSE_CUPS: t << "BrowseProtocols cups" << endl; break;
00244 case BROWSE_SLP: t << "BrowseProtocols slp" << endl; break;
00245 default: break;
00246 }
00247 t << endl << comments_[BROWSEADDRESS_COMM] << endl;
00248 QStringList::Iterator sit;
00249 for (sit=browseaddress_.begin();sit!=browseaddress_.end();++sit)
00250 t << "BrowseAddress " << (*sit) << endl;
00251 t << endl << comments_[BROWSEPORT_COMM] << endl;
00252 if (browseport_ != -1) t << "BrowsePort " << browseport_ << endl;
00253 t << endl << comments_[BROWSERELAY_COMM] << endl;
00254 for (sit=browserelay_.begin();sit!=browserelay_.end();++sit)
00255 {
00256 t << "BrowseRelay " << (*sit);
00257 ++sit;
00258 t << " " << (*sit) << endl;
00259 }
00260 t << endl << comments_[BROWSEPOLL_COMM] << endl;
00261 for (sit=browsepoll_.begin();sit!=browsepoll_.end();++sit)
00262 t << "BrowsePoll " << (*sit) << endl;
00263 t << endl << comments_[BROWSEALLOWDENY_COMM] << endl;
00264 for (sit=browseallow_.begin();sit!=browseallow_.end();++sit)
00265 t << "BrowseAllow " << (*sit) << endl;
00266 for (sit=browsedeny_.begin();sit!=browsedeny_.end();++sit)
00267 t << "BrowseDeny " << (*sit) << endl;
00268 t << endl << comments_[BROWSEORDER_COMM] << endl;
00269 if (browseorder_ != -1) t << "BrowseOrder " << (browseorder_ == ORDER_ALLOW_DENY ? "allow,deny" : "deny,allow") << endl;
00270 t << endl << comments_[BROWSEINTERVAL_COMM] << endl;
00271 if (browseinterval_ != -1) t << "BrowseInterval " << browseinterval_ << endl;
00272 t << endl << comments_[BROWSETIMEOUT_COMM] << endl;
00273 if (browsetimeout_ != -1) t << "BrowseTimeout " << browsetimeout_ << endl;
00274 t << endl << comments_[SYSTEMGROUP_COMM] << endl;
00275 if (!systemgroup_.isNull()) t << "SystemGroup " << systemgroup_ << endl;
00276 t << endl << comments_[LOCATIONSCOMPLETE_COMM] << endl;
00277 for (locations_.first();locations_.current();locations_.next())
00278 {
00279 CupsLocation *loc = locations_.current();
00280 t << "<Location " << loc->resourcename_ << ">" << endl;
00281 if (loc->authtype_ != -1)
00282 {
00283 t << "AuthType ";
00284 switch (loc->authtype_)
00285 {
00286 case AUTHTYPE_NONE: t << "None" << endl; break;
00287 case AUTHTYPE_BASIC: t << "Basic" << endl; break;
00288 case AUTHTYPE_DIGEST: t << "Digest" << endl; break;
00289 default: t << "None" << endl; break;
00290 }
00291 }
00292 if (loc->authtype_ != AUTHTYPE_NONE)
00293 {
00294 if (loc->authclass_ != -1)
00295 {
00296 t << "AuthClass ";
00297 switch (loc->authclass_)
00298 {
00299 case AUTHCLASS_ANONYMOUS: t << "Anonymous" << endl; break;
00300 case AUTHCLASS_USER: t << "User" << endl; break;
00301 case AUTHCLASS_SYSTEM: t << "System" << endl; break;
00302 case AUTHCLASS_GROUP: t << "Group" << endl; break;
00303 default: t << "User" << endl; break;
00304 }
00305 }
00306 if (!loc->authgroupname_.isEmpty()) t << "AuthGroupName " << loc->authgroupname_ << endl;
00307 if (loc->order_ != -1) t << "Order " << (loc->order_ == ORDER_ALLOW_DENY ? "Allow,Deny" : "Deny,Allow") << endl;
00308 for (sit=loc->allow_.begin();sit!=loc->allow_.end();++sit)
00309 t << "Allow From " << (*sit) << endl;
00310 for (sit=loc->deny_.begin();sit!=loc->deny_.end();++sit)
00311 t << "Deny From " << (*sit) << endl;
00312 }
00313 if (loc->encryption_ != -1)
00314 {
00315 t << "Encryption ";
00316 switch (loc->encryption_)
00317 {
00318 case ENCRYPT_ALWAYS: t << "Always" << endl; break;
00319 case ENCRYPT_NEVER: t << "Never" << endl; break;
00320 case ENCRYPT_REQUIRED: t << "Required" << endl; break;
00321 case ENCRYPT_IFREQUESTED: t << "IfRequested" << endl; break;
00322 default: t << "IfRequested" << endl; break;
00323 }
00324 }
00325 t << "</Location>" << endl;
00326 }
00327 return true;
00328 }
00329 }
00330
00331 bool CupsdConf::parseLocation(CupsLocation *location, QTextStream& file)
00332 {
00333 QString line;
00334 bool done(false);
00335 bool value(true);
00336 while (!done && value)
00337 {
00338 line = file.readLine().simplifyWhiteSpace();
00339 if (line.isEmpty())
00340 {
00341 if (file.atEnd())
00342 {
00343 value = false;
00344 done = true;
00345 }
00346 else continue;
00347 }
00348 else if (line[0] == '#') continue;
00349 else if (line.lower() == "</location>") done = true;
00350 else value = location->parseOption(line);
00351 }
00352 return value;
00353 }
00354
00355 bool CupsdConf::parseOption(const QString& line)
00356 {
00357 QStringList wordlist_ = QStringList::split(' ', line.simplifyWhiteSpace().append(' '), false);
00358 if (wordlist_.count() == 0)
00359 return false;
00360 if (wordlist_.count() == 1)
00361 {
00362 kdDebug() << "warning: empty option \"" << (*(wordlist_.at(0))) << "\", adding a pseudo empty argument" << endl;
00363 wordlist_.append(QString(""));
00364 }
00365 QString opt = *(wordlist_.at(0));
00366 if (opt.lower() == "servername") servername_ = *(wordlist_.at(1));
00367 else if (opt.lower() == "serveradmin") serveradmin_ = *(wordlist_.at(1));
00368 else if (opt.lower() == "user") user_ = *(wordlist_.at(1));
00369 else if (opt.lower() == "group") group_ = *(wordlist_.at(1));
00370 else if (opt.lower() == "remoteroot") remroot_ = *(wordlist_.at(1));
00371 else if (opt.lower() == "accesslog") accesslog_ = *(wordlist_.at(1));
00372 else if (opt.lower() == "errorlog") errorlog_ = *(wordlist_.at(1));
00373 else if (opt.lower() == "pagelog") pagelog_ = *(wordlist_.at(1));
00374 else if (opt.lower() == "loglevel")
00375 {
00376 QString log = *(wordlist_.at(1));
00377 if (log.lower() == "debug2") loglevel_ = LOGLEVEL_DEBUG2;
00378 else if (log.lower() == "debug") loglevel_ = LOGLEVEL_DEBUG;
00379 else if (log.lower() == "info") loglevel_ = LOGLEVEL_INFO;
00380 else if (log.lower() == "warn") loglevel_ = LOGLEVEL_WARN;
00381 else if (log.lower() == "error") loglevel_ = LOGLEVEL_ERROR;
00382 else if (log.lower() == "none") loglevel_ = LOGLEVEL_NONE;
00383 else return false;
00384 }
00385 else if (opt.lower() == "maxlogsize") maxlogsize_ = (*(wordlist_.at(1))).toInt();
00386 else if (opt.lower() == "datadir") datadir_ = *(wordlist_.at(1));
00387 else if (opt.lower() == "requestroot") requestroot_ = *(wordlist_.at(1));
00388 else if (opt.lower() == "serverbin") serverbin_ = *(wordlist_.at(1));
00389 else if (opt.lower() == "serverroot") serverroot_ = *(wordlist_.at(1));
00390 else if (opt.lower() == "servercertificate") servercertificate_ = *(wordlist_.at(1));
00391 else if (opt.lower() == "serverkey") serverkey_ = *(wordlist_.at(1));
00392 else if (opt.lower() == "tempdir") tempdir_ = *(wordlist_.at(1));
00393 else if (opt.lower() == "fontpath") fontpath_ = *(wordlist_.at(1));
00394 else if (opt.lower() == "documentroot") documentroot_ = *(wordlist_.at(1));
00395 else if (opt.lower() == "defaultcharset") defaultcharset_ = *(wordlist_.at(1));
00396 else if (opt.lower() == "defaultlanguage") defaultlanguage_ = *(wordlist_.at(1));
00397 else if (opt.lower() == "preservejobhistory") preservejobhistory_ = (*(wordlist_.at(1)) == "Yes" ? 1 : 0);
00398 else if (opt.lower() == "preservejobfiles") preservejobfiles_ = (*(wordlist_.at(1)) == "Yes" ? 1 : 0);
00399 else if (opt.lower() == "autopurgejobs") autopurgejobs_ = (*(wordlist_.at(1)) == "Yes" ? 1 : 0);
00400 else if (opt.lower() == "maxjobs") maxjobs_ = (*(wordlist_.at(1))).toInt();
00401 else if (opt.lower() == "filterlimit") filterlimit_ = (*(wordlist_.at(1))).toInt();
00402 else if (opt.lower() == "classification") classification_ = (*(wordlist_.at(1)));
00403 else if (opt.lower() == "classifyoverride") classifyoverride_ = (*(wordlist_.at(1)) == "On" ? 1 : 0);
00404 else if (opt.lower() == "printcap") printcap_ = *(wordlist_.at(1));
00405 else if (opt.lower() == "ripcache") ripcache_ = *(wordlist_.at(1));
00406 else if (opt.lower() == "port") port_.append((*(wordlist_.at(1))).toInt());
00407 else if (opt.lower() == "hostnamelookups") hostnamelookups_ = (*(wordlist_.at(1)) == "On" ? 1 : 0);
00408 else if (opt.lower() == "keepalive") keepalive_ = (*(wordlist_.at(1)) == "On" ? 1 : 0);
00409 else if (opt.lower() == "keepalivetimeout") keepalivetimeout_ = (*(wordlist_.at(1))).toInt();
00410 else if (opt.lower() == "maxclients") maxclients_ = (*(wordlist_.at(1))).toInt();
00411 else if (opt.lower() == "maxrequestsize") maxrequestsize_ = (*(wordlist_.at(1))).toInt();
00412 else if (opt.lower() == "timeout") timeout_ = (*(wordlist_.at(1))).toInt();
00413 else if (opt.lower() == "browsing") browsing_ = (*(wordlist_.at(1)) == "On" ? 1 : 0);
00414 else if (opt.lower() == "browseshortnames") browseshortnames_ = (*(wordlist_.at(1)) == "Yes" ? 1 : 0);
00415 else if (opt.lower() == "implicitclasses") implicitclasses_ = (*(wordlist_.at(1)) == "On" ? 1 : 0);
00416 else if (opt.lower() == "implicitanyclasses") implicitanyclasses_ = (*(wordlist_.at(1)) == "On" ? 1 : 0);
00417 else if (opt.lower() == "hideimplicitmembers") hideimplicitmembers_ = (*(wordlist_.at(1)) == "On" ? 1 : 0);
00418 else if (opt.lower() == "browseprotocols")
00419 {
00420 QString value = *(wordlist_.at(1));
00421 if (value.lower() == "all") browseprotocols_ = 0;
00422 else if (value.lower() == "cups") browseprotocols_ = 1;
00423 else if (value.lower() == "slp") browseprotocols_ = 2;
00424 else browseprotocols_ = -1;
00425 }
00426 else if (opt.lower() == "browseaddress") browseaddress_.append(*(wordlist_.at(1)));
00427 else if (opt.lower() == "browseport") browseport_ = (*(wordlist_.at(1))).toInt();
00428 else if (opt.lower() == "browserelay")
00429 {
00430 if (wordlist_.count() < 3) return false;
00431 browserelay_.append(*(wordlist_.at(1)));
00432 browserelay_.append(*(wordlist_.at(2)));
00433 }
00434 else if (opt.lower() == "browsepoll") browsepoll_.append(*(wordlist_.at(1)));
00435 else if (opt.lower() == "browseallow") browseallow_.append(*(wordlist_.at(1)));
00436 else if (opt.lower() == "browsedeny") browsedeny_.append(*(wordlist_.at(1)));
00437 else if (opt.lower() == "browseorder")
00438 {
00439 QString value = *(wordlist_.at(1));
00440 if (value.lower() == "allow,deny") browseorder_ = ORDER_ALLOW_DENY;
00441 else if (value.lower() == "deny,allow") browseorder_ = ORDER_DENY_ALLOW;
00442 else return false;
00443 }
00444 else if (opt.lower() == "browseinterval") browseinterval_ = (*(wordlist_.at(1))).toInt();
00445 else if (opt.lower() == "browsetimeout") browsetimeout_ = (*(wordlist_.at(1))).toInt();
00446 else if (opt.lower() == "systemgroup") systemgroup_ = *(wordlist_.at(1));
00447 else return false;
00448 return true;
00449 }
00450
00451 bool CupsdConf::loadAvailableResources()
00452 {
00453 KConfig conf("kdeprintrc");
00454 conf.setGroup("CUPS");
00455 QString host = conf.readEntry("Host",cupsServer());
00456 int port = conf.readNumEntry("Port",ippPort());
00457 http_t *http_ = httpConnect(host.local8Bit(),port);
00458
00459 resources_.clear();
00460
00461 resources_.append(new CupsResource("/"));
00462 resources_.append(new CupsResource("/admin"));
00463 resources_.append(new CupsResource("/printers"));
00464 resources_.append(new CupsResource("/classes"));
00465
00466 if (!http_)
00467 return false;
00468
00469
00470 ipp_t *request_ = ippNew();
00471 cups_lang_t* lang = cupsLangDefault();
00472 ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, cupsLangEncoding(lang));
00473 ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, lang->language);
00474 request_->request.op.operation_id = CUPS_GET_PRINTERS;
00475 request_ = cupsDoRequest(http_, request_, "/printers/");
00476 if (request_)
00477 {
00478 QString name;
00479 int type(0);
00480 ipp_attribute_t *attr = request_->attrs;
00481 while (attr)
00482 {
00483
00484 if (!attr->name)
00485 {
00486 if (!(type & CUPS_PRINTER_REMOTE) && !(type & CUPS_PRINTER_IMPLICIT) && !name.isEmpty())
00487 resources_.append(new CupsResource("/printers/"+name));
00488 name = "";
00489 type = 0;
00490 }
00491 else if (strcmp(attr->name, "printer-name") == 0) name = attr->values[0].string.text;
00492 else if (strcmp(attr->name, "printer-type") == 0) type = attr->values[0].integer;
00493 attr = attr->next;
00494 }
00495 if (!(type & CUPS_PRINTER_REMOTE) && !(type & CUPS_PRINTER_IMPLICIT) && !name.isEmpty())
00496 resources_.append(new CupsResource("/printers/"+name));
00497 ippDelete(request_);
00498 }
00499
00500 request_ = ippNew();
00501 ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, cupsLangEncoding(lang));
00502 ippAddString(request_, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, lang->language);
00503 request_->request.op.operation_id = CUPS_GET_CLASSES;
00504 request_ = cupsDoRequest(http_, request_, "/classes/");
00505 if (request_)
00506 {
00507 QString name;
00508 int type(0);
00509 ipp_attribute_t *attr = request_->attrs;
00510 while (attr)
00511 {
00512
00513 if (!attr->name)
00514 {
00515 if (!(type & CUPS_PRINTER_REMOTE) && !name.isEmpty())
00516 resources_.append(new CupsResource("/classes/"+name));
00517 name = "";
00518 type = 0;
00519 }
00520 else if (strcmp(attr->name, "printer-name") == 0) name = attr->values[0].string.text;
00521 else if (strcmp(attr->name, "printer-type") == 0) type = attr->values[0].integer;
00522 attr = attr->next;
00523 }
00524 if (!(type & CUPS_PRINTER_REMOTE) && !name.isEmpty())
00525 resources_.append(new CupsResource("/classes/"+name));
00526 ippDelete(request_);
00527 }
00528 httpClose(http_);
00529 return true;
00530 }
00531
00532
00533
00534 CupsLocation::CupsLocation()
00535 {
00536 resource_ = 0;
00537 resourcename_ = "";
00538 authtype_ = -1;
00539 authclass_ = -1;
00540 authgroupname_ = QString::null;
00541 order_ = -1;
00542
00543
00544 encryption_ = -1;
00545 }
00546
00547 CupsLocation::CupsLocation(const CupsLocation& loc)
00548 : resource_(loc.resource_),
00549 resourcename_(loc.resourcename_),
00550 authtype_(loc.authtype_),
00551 authclass_(loc.authclass_),
00552 authgroupname_(loc.authgroupname_),
00553 order_(loc.order_),
00554 allow_(loc.allow_),
00555 deny_(loc.deny_),
00556 encryption_(loc.encryption_)
00557 {
00558 }
00559
00560 bool CupsLocation::parseResource(const QString& line)
00561 {
00562 QString str = line.simplifyWhiteSpace();
00563 int p1 = line.find(' '), p2 = line.find('>');
00564 if (p1 != -1 && p2 != -1)
00565 {
00566 resourcename_ = str.mid(p1+1,p2-p1-1);
00567 return true;
00568 }
00569 else return false;
00570 }
00571
00572 bool CupsLocation::parseOption(const QString& line)
00573 {
00574 QStringList wordlist_ = QStringList::split(' ', line.simplifyWhiteSpace().append(' '), false);
00575 if (wordlist_.count() == 0) return false;
00576 if (wordlist_.count() == 1)
00577 {
00578 kdDebug() << "warning: empty option \"" << (*(wordlist_.at(0))) << "\", adding a pseudo empty argument" << endl;
00579 wordlist_.append(QString(""));
00580 }
00581 QString opt = *(wordlist_.at(0)), value = *(wordlist_.at(1));
00582 if (opt.lower() == "authtype")
00583 {
00584 if (value.lower() == "none") authtype_ = AUTHTYPE_NONE;
00585 else if (value.lower() == "basic") authtype_ = AUTHTYPE_BASIC;
00586 else if (value.lower() == "digest") authtype_ = AUTHTYPE_DIGEST;
00587 else return false;
00588 }
00589 else if (opt.lower() == "authclass")
00590 {
00591 if (value.lower() == "anonymous") authclass_ = AUTHCLASS_ANONYMOUS;
00592 else if (value.lower() == "user") authclass_ = AUTHCLASS_USER;
00593 else if (value.lower() == "system") authclass_ = AUTHCLASS_SYSTEM;
00594 else if (value.lower() == "group") authclass_ = AUTHCLASS_GROUP;
00595 else return false;
00596 }
00597 else if (opt.lower() == "authgroupname") authgroupname_ = value;
00598 else if (opt.lower() == "allow") allow_.append(*(wordlist_.at(2)));
00599 else if (opt.lower() == "deny") deny_.append(*(wordlist_.at(2)));
00600 else if (opt.lower() == "order")
00601 {
00602 if (value.lower() == "allow,deny") order_ = ORDER_ALLOW_DENY;
00603 else if (value.lower() == "deny,allow") order_ = ORDER_DENY_ALLOW;
00604 else return false;
00605 }
00606 else if (opt.lower() == "encryption")
00607 {
00608 if (value.lower() == "always") encryption_ = ENCRYPT_ALWAYS;
00609 else if (value.lower() == "never") encryption_ = ENCRYPT_NEVER;
00610 else if (value.lower() == "required") encryption_ = ENCRYPT_REQUIRED;
00611 else if (value.lower() == "ifrequested") encryption_ = ENCRYPT_IFREQUESTED;
00612 else return false;
00613 }
00614 return true;
00615 }
00616
00617
00618
00619 CupsResource::CupsResource()
00620 {
00621 type_ = RESOURCE_GLOBAL;
00622 }
00623
00624 CupsResource::CupsResource(const QString& path)
00625 {
00626 setPath(path);
00627 }
00628
00629 void CupsResource::setPath(const QString& path)
00630 {
00631 path_ = path;
00632 type_ = typeFromPath(path_);
00633 text_ = pathToText(path_);
00634 }
00635
00636 int CupsResource::typeFromText(const QString& text)
00637 {
00638 if (text == i18n("Base", "Root") || text == i18n("All printers") || text == i18n("All classes")) return RESOURCE_GLOBAL;
00639 else if (text == i18n("Administration")) return RESOURCE_ADMIN;
00640 else if (text.find(i18n("Class")) == 0) return RESOURCE_CLASS;
00641 else if (text.find(i18n("Printer")) == 0) return RESOURCE_PRINTER;
00642 else return RESOURCE_PRINTER;
00643 }
00644
00645 int CupsResource::typeFromPath(const QString& path)
00646 {
00647 if (path == "/admin") return RESOURCE_ADMIN;
00648 else if (path == "/printers" || path == "/classes" || path == "/") return RESOURCE_GLOBAL;
00649 else if (path.left(9) == "/printers") return RESOURCE_PRINTER;
00650 else if (path.left(8) == "/classes") return RESOURCE_CLASS;
00651 else return RESOURCE_GLOBAL;
00652 }
00653
00654 QString CupsResource::textToPath(const QString& text)
00655 {
00656 QString path("/");
00657 if (text == i18n("Administration")) path = "/admin";
00658 else if (text == i18n("All printers")) path = "/printers";
00659 else if (text == i18n("All classes")) path = "/classes";
00660 else if (text == i18n("Base", "Root")) path = "/";
00661 else if (text.find(i18n("Printer")) == 0)
00662 {
00663 path = "/printers/";
00664 path.append(text.right(text.length()-i18n("Printer").length()-1));
00665 }
00666 else if (text.find(i18n("Class")) == 0)
00667 {
00668 path = "/classes/";
00669 path.append(text.right(text.length()-i18n("Class").length()-1));
00670 }
00671 return path;
00672 }
00673
00674 QString CupsResource::pathToText(const QString& path)
00675 {
00676 QString text(i18n("Base", "Root"));
00677 if (path == "/admin") text = i18n("Administration");
00678 else if (path == "/printers") text = i18n("All printers");
00679 else if (path == "/classes") text = i18n("All classes");
00680 else if (path == "/") text = i18n("Root");
00681 else if (path.find("/printers/") == 0)
00682 {
00683 text = i18n("Printer");
00684 text.append(" ");
00685 text.append(path.right(path.length()-10));
00686 }
00687 else if (path.find("/classes/") == 0)
00688 {
00689 text = i18n("Class");
00690 text.append(" ");
00691 text.append(path.right(path.length()-9));
00692 }
00693 return text;
00694 }
00695
00696 QString CupsResource::typeToIconName(int type)
00697 {
00698 switch (type)
00699 {
00700 case RESOURCE_ADMIN:
00701 case RESOURCE_GLOBAL:
00702 return QString("folder");
00703 case RESOURCE_PRINTER:
00704 return QString("kdeprint_printer");
00705 case RESOURCE_CLASS:
00706 return QString("kdeprint_printer_class");
00707 }
00708 return QString("folder");
00709 }