kmfoomaticmanager.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kmfoomaticmanager.h"
00021 #include "kpipeprocess.h"
00022 #include "driver.h"
00023
00024 #include <qdom.h>
00025 #include <klocale.h>
00026 #include <kdebug.h>
00027 #include <kprocess.h>
00028
00029 #include <unistd.h>
00030
00031 KMFoomaticManager::KMFoomaticManager(QObject *parent, const char *name, const QStringList & )
00032 : KMManager(parent,name)
00033 {
00034 setHasManagement(getuid() == 0);
00035 setPrinterOperationMask(KMManager::PrinterConfigure);
00036 }
00037
00038 KMFoomaticManager::~KMFoomaticManager()
00039 {
00040 }
00041
00042 void KMFoomaticManager::listPrinters()
00043 {
00044 KPipeProcess proc("foomatic-configure -Q -q -r");
00045 QDomDocument doc;
00046
00047 doc.setContent(&proc);
00048 QDomElement docElem = doc.documentElement();
00049 if (docElem.isNull() || docElem.tagName() != "queues")
00050 return;
00051
00052 QDomNode queueNode = docElem.firstChild();
00053 while (!queueNode.isNull())
00054 {
00055 QDomElement queueElem = queueNode.toElement();
00056 if (!queueElem.isNull() && queueElem.tagName() == "queue")
00057 {
00058 KMPrinter *printer = createPrinterFromElement(&queueElem);
00059 if (printer)
00060 addPrinter(printer);
00061 }
00062 queueNode = queueNode.nextSibling();
00063 }
00064 }
00065
00066 DrMain* KMFoomaticManager::loadPrinterDriver(KMPrinter *printer, bool)
00067 {
00068 if (printer->option("foomatic") != "1")
00069 {
00070 setErrorMsg(i18n("This is not a Foomatic printer"));
00071 return NULL;
00072 }
00073 else if (printer->option("driver").isEmpty() || printer->option("printer").isEmpty())
00074 {
00075 setErrorMsg(i18n("Some printer information are missing"));
00076 return NULL;
00077 }
00078
00079 QString cmd = "foomatic-combo-xml -p ";
00080 cmd += KProcess::quote(printer->option("printer"));
00081 cmd += " -d ";
00082 cmd += KProcess::quote(printer->option("driver"));
00083 KPipeProcess proc(cmd);
00084 QDomDocument doc;
00085 doc.setContent(&proc);
00086 QDomElement docElem = doc.documentElement();
00087 return createDriverFromXML(&docElem);
00088 }
00089
00090 KMPrinter* KMFoomaticManager::createPrinterFromElement(QDomElement *elem)
00091 {
00092 QDomElement e = elem->namedItem("name").toElement();
00093 if (!e.isNull())
00094 {
00095 KMPrinter *printer = new KMPrinter;
00096 printer->setType(KMPrinter::Printer);
00097 printer->setName(e.text());
00098 printer->setPrinterName(e.text());
00099 printer->setState(KMPrinter::Idle);
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 if (!(e=elem->namedItem("description").toElement()).isNull())
00110 printer->setDescription(e.text());
00111 if (!(e=elem->namedItem("location").toElement()).isNull())
00112 printer->setLocation(e.text());
00113 if (!(e=elem->namedItem("connect").toElement()).isNull())
00114 printer->setDevice(e.text());
00115
00116 printer->setOption("foomatic", elem->attribute("foomatic"));
00117 printer->setOption("spooler", elem->attribute("spooler"));
00118 if (elem->attribute("foomatic") == "1")
00119 {
00120 if (!(e=elem->namedItem("printer").toElement()).isNull())
00121 printer->setOption("printer", e.text());
00122 if (!(e=elem->namedItem("driver").toElement()).isNull())
00123 printer->setOption("driver", e.text());
00124 }
00125
00126 return printer;
00127 }
00128 return NULL;
00129 }
00130
00131 DrMain* KMFoomaticManager::createDriverFromXML(QDomElement *elem)
00132 {
00133 DrMain *driver = new DrMain();
00134 QDomElement pelem = elem->namedItem("printer").toElement(), delem = elem->namedItem("driver").toElement();
00135 if (!pelem.isNull() && !delem.isNull())
00136 {
00137 driver->set("manufacturer", pelem.namedItem("make").toElement().text());
00138 driver->set("model", pelem.namedItem("model").toElement().text());
00139 QString s = QString::fromLatin1("%1 %2 (%3)").arg(driver->get("manufacturer")).arg(driver->get("model")).arg(delem.namedItem("name").toElement().text());
00140 driver->set("description", s);
00141 driver->set("text", s);
00142
00143 QDomElement opts = elem->namedItem("options").toElement();
00144 if (!opts.isNull())
00145 {
00146 QDomElement o = opts.firstChild().toElement();
00147 while (!o.isNull())
00148 {
00149 if (o.tagName() == "option")
00150 {
00151 QString type = o.attribute("type");
00152 DrBase *dropt(0);
00153
00154 if (type == "bool" || type == "enum")
00155 {
00156 if (type == "bool") dropt = new DrBooleanOption();
00157 else dropt = new DrListOption();
00158 QString defval = o.namedItem("arg_defval").toElement().text(), valuetext;
00159 QDomNode val = o.namedItem("enum_vals").firstChild();
00160 while (!val.isNull())
00161 {
00162 DrBase *choice = new DrBase();
00163 choice->setName(val.namedItem("ev_shortname").namedItem("en").toElement().text());
00164 choice->set("text", i18n(val.namedItem("ev_longname").namedItem("en").toElement().text().latin1()));
00165 static_cast<DrListOption*>(dropt)->addChoice(choice);
00166 if (val.toElement().attribute("id") == defval)
00167 valuetext = choice->name();
00168
00169 val = val.nextSibling();
00170 }
00171 dropt->set("default", valuetext);
00172 dropt->setValueText(valuetext);
00173 }
00174 else if (type == "int" || type == "float")
00175 {
00176 if (type == "int") dropt = new DrIntegerOption();
00177 else dropt = new DrFloatOption();
00178 dropt->set("minval", o.namedItem("arg_min").toElement().text());
00179 dropt->set("maxval", o.namedItem("arg_max").toElement().text());
00180 QString defval = o.namedItem("arg_defval").toElement().text();
00181 dropt->set("default", defval);
00182 dropt->setValueText(defval);
00183 }
00184
00185 if (dropt)
00186 {
00187 dropt->setName(o.namedItem("arg_shortname").namedItem("en").toElement().text());
00188 dropt->set("text", i18n(o.namedItem("arg_longname").namedItem("en").toElement().text().latin1()));
00189 driver->addOption(dropt);
00190 }
00191 }
00192 o = o.nextSibling().toElement();
00193 }
00194 }
00195 }
00196 return driver;
00197 }
|