You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdelibs/kdeprint/foomatic/kmfoomaticmanager.cpp

198 lines
6.2 KiB

/*
* This file is part of the KDE libraries
* Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License version 2 as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
**/
#include "kmfoomaticmanager.h"
#include "kpipeprocess.h"
#include "driver.h"
#include <qdom.h>
#include <klocale.h>
#include <kdebug.h>
#include <kprocess.h>
#include <unistd.h>
KMFoomaticManager::KMFoomaticManager(QObject *parent, const char *name, const QStringList & /*args*/)
: KMManager(parent,name)
{
setHasManagement(getuid() == 0);
setPrinterOperationMask(KMManager::PrinterConfigure);
}
KMFoomaticManager::~KMFoomaticManager()
{
}
void KMFoomaticManager::listPrinters()
{
KPipeProcess proc("foomatic-configure -Q -q -r");
QDomDocument doc;
doc.setContent(&proc);
QDomElement docElem = doc.documentElement();
if (docElem.isNull() || docElem.tagName() != "queues")
return;
QDomNode queueNode = docElem.firstChild();
while (!queueNode.isNull())
{
QDomElement queueElem = queueNode.toElement();
if (!queueElem.isNull() && queueElem.tagName() == "queue")
{
KMPrinter *printer = createPrinterFromElement(&queueElem);
if (printer)
addPrinter(printer);
}
queueNode = queueNode.nextSibling();
}
}
DrMain* KMFoomaticManager::loadPrinterDriver(KMPrinter *printer, bool)
{
if (printer->option("foomatic") != "1")
{
setErrorMsg(i18n("This is not a Foomatic printer"));
return NULL;
}
else if (printer->option("driver").isEmpty() || printer->option("printer").isEmpty())
{
setErrorMsg(i18n("Some printer information are missing"));
return NULL;
}
QString cmd = "foomatic-combo-xml -p ";
cmd += KProcess::quote(printer->option("printer"));
cmd += " -d ";
cmd += KProcess::quote(printer->option("driver"));
KPipeProcess proc(cmd);
QDomDocument doc;
doc.setContent(&proc);
QDomElement docElem = doc.documentElement();
return createDriverFromXML(&docElem);
}
KMPrinter* KMFoomaticManager::createPrinterFromElement(QDomElement *elem)
{
QDomElement e = elem->namedItem("name").toElement();
if (!e.isNull())
{
KMPrinter *printer = new KMPrinter;
printer->setType(KMPrinter::Printer);
printer->setName(e.text());
printer->setPrinterName(e.text());
printer->setState(KMPrinter::Idle);
/*if (printer->name().find('/') != -1)
{
QString s(printer->name());
int p = s.find('/');
printer->setPrinterName(s.left(p));
printer->setInstanceName(s.mid(p+1));
printer->addType(KMPrinter::Virtual);
}*/
if (!(e=elem->namedItem("description").toElement()).isNull())
printer->setDescription(e.text());
if (!(e=elem->namedItem("location").toElement()).isNull())
printer->setLocation(e.text());
if (!(e=elem->namedItem("connect").toElement()).isNull())
printer->setDevice(e.text());
printer->setOption("foomatic", elem->attribute("foomatic"));
printer->setOption("spooler", elem->attribute("spooler"));
if (elem->attribute("foomatic") == "1")
{
if (!(e=elem->namedItem("printer").toElement()).isNull())
printer->setOption("printer", e.text());
if (!(e=elem->namedItem("driver").toElement()).isNull())
printer->setOption("driver", e.text());
}
return printer;
}
return NULL;
}
DrMain* KMFoomaticManager::createDriverFromXML(QDomElement *elem)
{
DrMain *driver = new DrMain();
QDomElement pelem = elem->namedItem("printer").toElement(), delem = elem->namedItem("driver").toElement();
if (!pelem.isNull() && !delem.isNull())
{
driver->set("manufacturer", pelem.namedItem("make").toElement().text());
driver->set("model", pelem.namedItem("model").toElement().text());
QString s = QString::fromLatin1("%1 %2 (%3)").arg(driver->get("manufacturer")).arg(driver->get("model")).arg(delem.namedItem("name").toElement().text());
driver->set("description", s);
driver->set("text", s);
QDomElement opts = elem->namedItem("options").toElement();
if (!opts.isNull())
{
QDomElement o = opts.firstChild().toElement();
while (!o.isNull())
{
if (o.tagName() == "option")
{
QString type = o.attribute("type");
DrBase *dropt(0);
if (type == "bool" || type == "enum")
{
if (type == "bool") dropt = new DrBooleanOption();
else dropt = new DrListOption();
QString defval = o.namedItem("arg_defval").toElement().text(), valuetext;
QDomNode val = o.namedItem("enum_vals").firstChild();
while (!val.isNull())
{
DrBase *choice = new DrBase();
choice->setName(val.namedItem("ev_shortname").namedItem("en").toElement().text());
choice->set("text", i18n(val.namedItem("ev_longname").namedItem("en").toElement().text().latin1()));
static_cast<DrListOption*>(dropt)->addChoice(choice);
if (val.toElement().attribute("id") == defval)
valuetext = choice->name();
val = val.nextSibling();
}
dropt->set("default", valuetext);
dropt->setValueText(valuetext);
}
else if (type == "int" || type == "float")
{
if (type == "int") dropt = new DrIntegerOption();
else dropt = new DrFloatOption();
dropt->set("minval", o.namedItem("arg_min").toElement().text());
dropt->set("maxval", o.namedItem("arg_max").toElement().text());
QString defval = o.namedItem("arg_defval").toElement().text();
dropt->set("default", defval);
dropt->setValueText(defval);
}
if (dropt)
{
dropt->setName(o.namedItem("arg_shortname").namedItem("en").toElement().text());
dropt->set("text", i18n(o.namedItem("arg_longname").namedItem("en").toElement().text().latin1()));
driver->addOption(dropt);
}
}
o = o.nextSibling().toElement();
}
}
}
return driver;
}