kmvirtualmanager.cpp
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 }
This file is part of the documentation for kdeprint Library Version 3.2.2.