00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kmspecialmanager.h"
00021 #include "kmmanager.h"
00022 #include "kmprinter.h"
00023 #include "kdeprintcheck.h"
00024 #include "kxmlcommand.h"
00025 #include "driver.h"
00026
00027 #include <qfile.h>
00028 #include <kstandarddirs.h>
00029 #include <kglobal.h>
00030 #include <ksimpleconfig.h>
00031 #include <klocale.h>
00032 #include <kdebug.h>
00033
00034 #include <unistd.h>
00035 #include <sys/types.h>
00036 #include <sys/stat.h>
00037
00038 KMSpecialManager::KMSpecialManager(KMManager *parent, const char *name)
00039 : QObject(parent,name), m_mgr(parent), m_loaded(false)
00040 {
00041 }
00042
00043 bool KMSpecialManager::savePrinters()
00044 {
00045
00046 QString confname;
00047 if (getuid() == 0)
00048 {
00049 confname = locate("data", "kdeprint/specials.desktop");
00050 if (confname.startsWith(KGlobal::dirs()->localkdedir()))
00051 {
00052
00053 m_mgr->setErrorMsg(i18n("A file share/kdeprint/specials.desktop was found in your "
00054 "local KDE directory. This file probably comes from a previous KDE "
00055 "release and should be removed in order to manage global pseudo "
00056 "printers."));
00057 return false;
00058 }
00059 }
00060 else
00061 confname = locateLocal("data","kdeprint/specials.desktop");
00062
00063 KSimpleConfig conf(confname);
00064
00065
00066 conf.setGroup("General");
00067 int n = conf.readNumEntry("Number",0);
00068 for (int i=0;i<n;i++)
00069 conf.deleteGroup(QString::fromLatin1("Printer %1").arg(i),true);
00070
00071
00072 n = 0;
00073 QPtrListIterator<KMPrinter> it(m_mgr->m_printers);
00074 for (;it.current();++it)
00075 {
00076 if (!it.current()->isSpecial() || it.current()->isVirtual()) continue;
00077 conf.setGroup(QString::fromLatin1("Printer %1").arg(n));
00078 conf.writeEntry("Name",it.current()->name());
00079 conf.writeEntry("Description",it.current()->description());
00080 conf.writeEntry("Comment",it.current()->location());
00081 conf.writePathEntry("Command",it.current()->option("kde-special-command"));
00082 conf.writePathEntry("File",it.current()->option("kde-special-file"));
00083 conf.writeEntry("Icon",it.current()->pixmap());
00084 conf.writeEntry("Extension",it.current()->option("kde-special-extension"));
00085 conf.writeEntry("Mimetype",it.current()->option("kde-special-mimetype"));
00086 conf.writeEntry("Require",it.current()->option("kde-special-require"));
00087 n++;
00088 }
00089 conf.setGroup("General");
00090 conf.writeEntry("Number",n);
00091
00092
00093 if (getuid() == 0)
00094 {
00095 conf.sync();
00096 ::chmod(QFile::encodeName(confname), S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
00097 }
00098
00099
00100 m_loaded = false;
00101
00102 return true;
00103 }
00104
00105 bool KMSpecialManager::loadPrinters()
00106 {
00107 if (m_loaded) return true;
00108
00109 bool result(true);
00110 QString localDir = KGlobal::dirs()->localkdedir();
00111 QStringList files = KGlobal::dirs()->findAllResources("data", "kdeprint/specials.desktop");
00112
00113
00114 QStringList orderedFiles;
00115 for (QStringList::ConstIterator it=files.begin(); it!=files.end(); ++it)
00116 {
00117 if ((*it).startsWith(localDir))
00118 orderedFiles.append(*it);
00119 else
00120 orderedFiles.prepend(*it);
00121 }
00122
00123 for (QStringList::ConstIterator it=orderedFiles.begin(); it!=orderedFiles.end() && result; ++it)
00124 {
00125
00126 if (getuid() == 0 && (*it).startsWith(localDir))
00127 break;
00128 else
00129 result = loadDesktopFile(*it);
00130 }
00131
00132 return result;
00133 }
00134
00135 bool KMSpecialManager::loadDesktopFile(const QString& filename)
00136 {
00137 KSimpleConfig conf(filename);
00138 conf.setGroup("General");
00139 int n = conf.readNumEntry("Number",0);
00140 for (int i=0;i<n;i++)
00141 {
00142 QString grpname = QString::fromLatin1("Printer %1").arg(i);
00143 if (!conf.hasGroup(grpname)) continue;
00144 conf.setGroup(grpname);
00145 KMPrinter *printer = new KMPrinter;
00146 printer->setName(conf.readEntry("Name"));
00147 printer->setPrinterName(printer->name());
00148 printer->setDescription(conf.readEntry("Description"));
00149 printer->setLocation(conf.readEntry("Comment"));
00150 printer->setOption("kde-special-command",conf.readPathEntry("Command"));
00151 printer->setOption("kde-special-file",conf.readPathEntry("File"));
00152 printer->setOption("kde-special-extension",conf.readEntry("Extension"));
00153 printer->setOption("kde-special-mimetype",conf.readEntry("Mimetype"));
00154 printer->setOption("kde-special-require",conf.readEntry("Require"));
00155 printer->setPixmap(conf.readEntry("Icon","unknown"));
00156 printer->setType(KMPrinter::Special);
00157 if ( !KdeprintChecker::check( &conf ) ||
00158 !KXmlCommandManager::self()->checkCommand( printer->option( "kde-special-command" ),
00159 KXmlCommandManager::None, KXmlCommandManager::None, 0 ) )
00160 printer->addType(KMPrinter::Invalid);
00161 printer->setState(KMPrinter::Idle);
00162 printer->setAcceptJobs(true);
00163 m_mgr->addPrinter(printer);
00164 }
00165
00166 return true;
00167 }
00168
00169 void KMSpecialManager::refresh()
00170 {
00171 if (!m_loaded)
00172 loadPrinters();
00173 else
00174 {
00175 QPtrListIterator<KMPrinter> it(m_mgr->m_printers);
00176 for (;it.current();++it)
00177 if (it.current()->isSpecial())
00178 {
00179 it.current()->setDiscarded(false);
00180 it.current()->setType(KMPrinter::Special);
00181 if (KdeprintChecker::check(QStringList::split(',',it.current()->option("kde-special-require"),false)))
00182 it.current()->addType(KMPrinter::Invalid);
00183 }
00184 }
00185 }
00186
00187 KXmlCommand* KMSpecialManager::loadCommand(KMPrinter *pr)
00188 {
00189 KXmlCommand *xmlCmd = loadCommand(pr->option("kde-special-command"));
00190 if (xmlCmd && xmlCmd->driver())
00191 xmlCmd->driver()->set("text", pr->printerName());
00192 return xmlCmd;
00193 }
00194
00195 KXmlCommand* KMSpecialManager::loadCommand(const QString& xmlId)
00196 {
00197 return KXmlCommandManager::self()->loadCommand(xmlId, true);
00198 }
00199
00200 DrMain* KMSpecialManager::loadDriver(KMPrinter *pr)
00201 {
00202 KXmlCommand *xmlCmd;
00203 DrMain *driver(0);
00204
00205 if ((xmlCmd=loadCommand(pr)) != 0)
00206 {
00207 driver = xmlCmd->takeDriver();
00208 delete xmlCmd;
00209 }
00210
00211 return driver;
00212 }
00213
00214 QString KMSpecialManager::setupCommand(const QString& cmd, const QMap<QString,QString>& opts)
00215 {
00216 QString s(cmd);
00217 if (!s.isEmpty())
00218 {
00219 KXmlCommand *xmlCmd = loadCommand(cmd);
00220 if (xmlCmd)
00221 {
00222 s = xmlCmd->buildCommand(opts, false, false);
00223 delete xmlCmd;
00224 }
00225 }
00226
00227 return s;
00228 }