00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include "kmvirtualmanager.h"
00021
#include "kmprinter.h"
00022
#include "kmfactory.h"
00023
#include "kmmanager.h"
00024
#include "kprinter.h"
00025
00026
#include <stdlib.h>
00027
#include <qfile.h>
00028
#include <qtextstream.h>
00029
#include <qdir.h>
00030
#include <qfileinfo.h>
00031
#include <klocale.h>
00032
#include <kstandarddirs.h>
00033
#include <kurl.h>
00034
#include <kdebug.h>
00035
00036
#include <unistd.h>
00037
00038
static QString instanceName(
const QString& prname,
const QString& instname)
00039 {
00040
QString str(prname);
00041
if (!instname.isEmpty())
00042 str.append(
"/"+instname);
00043
return str;
00044 }
00045
00046 KMVirtualManager::KMVirtualManager(KMManager *parent,
const char *name)
00047 :
QObject(parent,name), m_manager(parent)
00048 {
00049 }
00050
00051 KMVirtualManager::~KMVirtualManager()
00052 {
00053 }
00054
00055 KMPrinter* KMVirtualManager::findPrinter(
const QString& name)
00056 {
00057
return m_manager->findPrinter(name);
00058 }
00059
00060 KMPrinter* KMVirtualManager::findInstance(KMPrinter *p,
const QString& name)
00061 {
00062
QString instname(instanceName(p->printerName(),name));
00063
return findPrinter(instname);
00064 }
00065
00066
void KMVirtualManager::addPrinter(KMPrinter *p)
00067 {
00068
if (p && p->isValid())
00069 {
00070 KMPrinter *other = findPrinter(p->name());
00071
if (other)
00072 {
00073 other->copy(*p);
00074
00075
00076
00077
00078
00079 other->setDefaultOptions(p->defaultOptions());
00080
delete p;
00081 }
00082
else
00083 m_manager->addPrinter(p);
00084 }
00085
else
00086
delete p;
00087 }
00088
00089
void KMVirtualManager::setDefault(KMPrinter *p,
bool saveflag)
00090 {
00091 m_manager->setSoftDefault(p);
00092 m_defaultprinter = (p ? p->printerName() :
QString::null);
00093
if (saveflag) triggerSave();
00094 }
00095
00096
bool KMVirtualManager::isDefault(KMPrinter *p,
const QString& name)
00097 {
00098
QString instname(instanceName(p->printerName(),name));
00099 KMPrinter *printer = findPrinter(instname);
00100
if (printer)
00101
return printer->isSoftDefault();
00102
else
00103
return false;
00104 }
00105
00106
void KMVirtualManager::create(KMPrinter *p,
const QString& name)
00107 {
00108
QString instname = instanceName(p->printerName(),name);
00109
if (findPrinter(instname) != NULL)
return;
00110 KMPrinter *printer =
new KMPrinter;
00111 printer->setName(instname);
00112 printer->setPrinterName(p->printerName());
00113 printer->setInstanceName(name);
00114
if (!name.isEmpty())
00115 printer->setType(p->type()|KMPrinter::Virtual);
00116
00117
if (p->isSpecial())
00118 printer->setOptions(p->options());
00119 m_manager->addPrinter(printer);
00120 triggerSave();
00121 }
00122
00123
void KMVirtualManager::copy(KMPrinter *p,
const QString& src,
const QString& name)
00124 {
00125
QString instsrc(instanceName(p->printerName(),src)), instname(instanceName(p->printerName(),name));
00126 KMPrinter *prsrc = findPrinter(instsrc);
00127
if (!prsrc || findPrinter(instname) != NULL)
return;
00128 KMPrinter *printer =
new KMPrinter;
00129 printer->copy(*prsrc);
00130 printer->setName(instname);
00131 printer->setInstanceName(name);
00132 printer->setDefaultOptions(prsrc->defaultOptions());
00133 m_manager->addPrinter(printer);
00134 triggerSave();
00135 }
00136
00137
void KMVirtualManager::remove(KMPrinter *p,
const QString& name)
00138 {
00139
QString instname = instanceName(p->printerName(),name);
00140 KMPrinter *printer = findPrinter(instname);
00141
if (!printer)
return;
00142
if (name.isEmpty())
00143 {
00144 printer->setDefaultOptions(
QMap<QString,QString>());
00145 printer->setEditedOptions(
QMap<QString,QString>());
00146 printer->setEdited(
false);
00147 }
00148
else
00149 m_manager->m_printers.removeRef(printer);
00150 triggerSave();
00151 }
00152
00153
void KMVirtualManager::setAsDefault(KMPrinter *p,
const QString& name)
00154 {
00155
QString instname(instanceName(p->printerName(),name));
00156 KMPrinter *printer = findPrinter(instname);
00157
if (!printer)
00158 {
00159 create(p,name);
00160 printer = findPrinter(instname);
00161 }
00162
if (printer)
00163 setDefault(printer,
true);
00164 }
00165
00166
void KMVirtualManager::refresh()
00167 {
00168
QFileInfo fi(QDir::homeDirPath() + QFile::decodeName(
"/.lpoptions"));
00169
QFileInfo fi2(QFile::decodeName(
"/etc/cups/lpoptions"));
00170
00171
00172
if (getuid() == 0)
00173 fi.setFile(fi2.absFilePath());
00174
00175
if (!m_checktime.isValid() || m_checktime < QMAX(fi.lastModified(),fi2.lastModified()))
00176 {
00177 m_defaultprinter = QString::null;
00178
if (fi2.exists())
00179 loadFile(fi2.absFilePath());
00180
if (fi.exists() && fi.absFilePath() != fi2.absFilePath())
00181 loadFile(fi.absFilePath());
00182 m_checktime = QMAX(fi.lastModified(),fi2.lastModified());
00183 }
00184
else
00185 {
00186
00187
QPtrListIterator<KMPrinter> it(m_manager->m_printers);
00188
for (;it.current();++it)
00189
if (!it.current()->instanceName().isEmpty())
00190 {
00191 checkPrinter(it.current());
00192
if (it.current()->isValid()) it.current()->setDiscarded(
false);
00193 }
00194 }
00195 }
00196
00197
void KMVirtualManager::checkPrinter(KMPrinter *p)
00198 {
00199 KMPrinter *realprinter = m_manager->findPrinter(p->printerName());
00200
if (!realprinter || realprinter->isDiscarded())
00201 {
00202 p->setType(KMPrinter::Invalid);
00203 p->setState(KMPrinter::Unknown);
00204 }
00205
else
00206 {
00207
if (!p->instanceName().isEmpty())
00208 p->setType(realprinter->type()|KMPrinter::Virtual);
00209 p->setState(realprinter->state());
00210 }
00211 }
00212
00213
QString KMVirtualManager::defaultPrinterName()
00214 {
00215
return m_defaultprinter;
00216 }
00217
00218
void KMVirtualManager::virtualList(
QPtrList<KMPrinter>& list,
const QString& prname)
00219 {
00220
00221 refresh();
00222
00223
00224 list.setAutoDelete(
false);
00225 list.clear();
00226 kdDebug(500) <<
"KMVirtualManager::virtualList() prname=" << prname << endl;
00227
QPtrListIterator<KMPrinter> it(m_manager->m_printers);
00228
for (;it.current();++it)
00229
if (it.current()->printerName() == prname)
00230 list.append(it.current());
00231 }
00232
00233
void KMVirtualManager::loadFile(
const QString& filename)
00234 {
00235
QFile f(filename);
00236
if (f.exists() && f.open(IO_ReadOnly))
00237 {
00238
QTextStream t(&f);
00239
00240
QString line;
00241
QStringList words;
00242
QStringList pair;
00243 KMPrinter *printer, *realprinter;
00244
00245
while (!t.eof())
00246 {
00247 line = t.readLine().stripWhiteSpace();
00248
if (line.isEmpty())
continue;
00249 words = QStringList::split(
' ',line,
false);
00250
if (words.count() < 2)
continue;
00251 pair = QStringList::split(
'/',words[1],
false);
00252 realprinter = m_manager->findPrinter(KURL::decode_string(pair[0]));
00253
if (realprinter && !realprinter->isDiscarded())
00254 {
00255
00256
00257 printer =
new KMPrinter(*realprinter);
00258 printer->setName(KURL::decode_string(words[1]));
00259 printer->setPrinterName(KURL::decode_string(pair[0]));
00260
if (pair.count() > 1)
00261 {
00262 printer->setInstanceName(KURL::decode_string(pair[1]));
00263 printer->addType(KMPrinter::Virtual);
00264 }
00265
00266
for (uint i=2; i<words.count(); i++)
00267 {
00268 pair = QStringList::split(
'=',words[i],
false);
00269 printer->setDefaultOption(pair[0],(pair.count() > 1 ? pair[1] : QString::null));
00270 }
00271
00272 addPrinter(printer);
00273
00274
if (words[0].lower() ==
"default")
00275 setDefault(findPrinter(words[1]),
false);
00276 }
00277 }
00278 }
00279 }
00280
00281
void KMVirtualManager::triggerSave()
00282 {
00283
QString filename;
00284
if (getuid() == 0)
00285 {
00286
if (KStandardDirs::makeDir(QFile::decodeName(
"/etc/cups")))
00287 filename = QFile::decodeName(
"/etc/cups/lpoptions");
00288 }
00289
else
00290 filename = QDir::homeDirPath() + QFile::decodeName(
"/.lpoptions");
00291
if (!filename.isEmpty())
00292 {
00293 saveFile(filename);
00294 m_checktime =
QFileInfo(filename).lastModified();
00295 }
00296 }
00297
00298
void KMVirtualManager::saveFile(
const QString& filename)
00299 {
00300
QFile f(filename);
00301
if (f.open(IO_WriteOnly))
00302 {
00303
QTextStream t(&f);
00304
QPtrListIterator<KMPrinter> it(m_manager->m_printers);
00305
for (;it.current();++it)
00306 {
00307
if (it.current()->isSpecial())
00308 {
00309 t <<
"Special " << KURL::encode_string_no_slash( it.current()->printerName() );
00310
if ( !it.current()->instanceName().isEmpty() )
00311 t <<
"/" << KURL::encode_string_no_slash( it.current()->instanceName() );
00312 }
00313
else
00314 t << (it.current()->isSoftDefault() ?
"Default " :
"Dest ") << it.current()->name();
00315
QMap<QString,QString> opts = it.current()->defaultOptions();
00316
for (
QMap<QString,QString>::ConstIterator oit=opts.begin(); oit!=opts.end(); ++oit)
00317 {
00318 t <<
' ' << oit.key();
00319
if (!oit.data().isEmpty())
00320 t <<
'=' << oit.data();
00321 }
00322 t << endl;
00323 }
00324 }
00325 }
00326
00327
bool KMVirtualManager::testInstance(KMPrinter *p)
00328 {
00329
QString testpage = KMManager::self()->testPage();
00330
if (testpage.isEmpty())
00331
return false;
00332
else
00333 {
00334
KPrinter pr;
00335 pr.
setPrinterName(p->printerName());
00336 pr.
setSearchName(p->name());
00337 pr.
setOptions(p->defaultOptions());
00338
return (pr.
printFiles(testpage));
00339 }
00340 }
00341
00342
void KMVirtualManager::reload()
00343 {
00344 reset();
00345 }
00346
00347
void KMVirtualManager::configChanged()
00348 {
00349 reset();
00350 }