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 }