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