kdeprint Library API Documentation

kmvirtualmanager.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 "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 // Replace default options with the new loaded ones: this is needed 00075 // if we want to handle 2 lpoptions correctly (system-wide and local). 00076 // Anyway, the virtual printers will be reloaded only if something has 00077 // changed in one of the files, so it's better to reset everything, to 00078 // be sure to use the new changes. Edited options will be left unchanged. 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 // we need some options to know how to load the driver 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 { // remove default instance => only remove options, keep the KMPrinter object 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 { // create it if necessary 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 // if root, then only use global file: trick -> use twice the same file 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 { // parse printers looking for instances -> undiscarded them, real printers 00186 // are undiscarded by the manager itself. Also update printer status. 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 // load printers if necessary 00221 refresh(); 00222 00223 // then look for instances 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 { // keep only instances corresponding to an existing and 00255 // non discarded printer. 00256 // "clone" the real printer and modify settings as needed 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 // parse options 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 // add printer to the manager 00272 addPrinter(printer); // don't use "printer" after this point !!! 00273 // check default state 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 }
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 Sun Oct 10 18:55:55 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003