diff options
Diffstat (limited to 'kdeprint/lpr/lprhandler.cpp')
-rw-r--r-- | kdeprint/lpr/lprhandler.cpp | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/kdeprint/lpr/lprhandler.cpp b/kdeprint/lpr/lprhandler.cpp new file mode 100644 index 000000000..396562691 --- /dev/null +++ b/kdeprint/lpr/lprhandler.cpp @@ -0,0 +1,270 @@ +/* + * 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 "lprhandler.h" +#include "kmprinter.h" +#include "printcapentry.h" +#include "kmmanager.h" +#include "lprsettings.h" +#include "driver.h" + +#include <qfile.h> +#include <qtextstream.h> +#include <qvaluestack.h> +#include <klocale.h> + +#include <unistd.h> + +LprHandler::LprHandler(const QString& name, KMManager *mgr) +: m_name(name), m_manager(mgr) +{ +} + +LprHandler::~LprHandler() +{ +} + +bool LprHandler::validate(PrintcapEntry*) +{ + return true; +} + +KMPrinter* LprHandler::createPrinter(PrintcapEntry *entry) +{ + KMPrinter *prt = new KMPrinter; + prt->setPrinterName(entry->name); + prt->setName(entry->name); + prt->setType(KMPrinter::Printer); + return prt; +} + +bool LprHandler::completePrinter(KMPrinter *prt, PrintcapEntry *entry, bool) +{ + prt->setDescription(i18n("Unknown (unrecognized entry)")); + QString val = entry->field("lp"); + KURL uri; + if (!val.isEmpty() && val != "/dev/null") + { + int p = val.find('@'); + if (p != -1) + { + prt->setLocation(i18n("Remote queue (%1) on %2").arg(val.left(p)).arg(val.mid(p+1))); + uri.setProtocol("lpd"); + uri.setHost(val.mid(p+1)); + uri.setPath("/" + val.left(p)); + } + else if ((p = val.find('%')) != -1) + { + prt->setLocation(i18n("Network printer (%1)").arg("socket")); + uri.setProtocol("socket"); + uri.setHost(val.left(p)); + uri.setPort(val.mid(p+1).toInt()); + } + else + { + prt->setLocation(i18n("Local printer on %1").arg(val)); + uri.setProtocol("parallel"); + uri.setPath(val); + } + } + else if (!(val = entry->field("rp")).isEmpty()) + { + QString rm = entry->has("rm") ? + entry->field("rm") : + LprSettings::self()->defaultRemoteHost(); + prt->setLocation(i18n("Remote queue (%1) on %2").arg(val).arg(rm)); + uri.setProtocol("lpd"); + uri.setHost(rm); + uri.setPath("/" + val); + } + else + prt->setLocation(i18n("Unknown (unrecognized entry)")); + prt->setDevice(uri.url()); + return true; +} + +DrMain* LprHandler::loadDriver(KMPrinter*, PrintcapEntry*, bool) +{ + manager()->setErrorMsg(i18n("Unrecognized entry.")); + return NULL; +} + +bool LprHandler::savePrinterDriver(KMPrinter*, PrintcapEntry*, DrMain*, bool*) +{ + manager()->setErrorMsg(i18n("Unrecognized entry.")); + return false; +} + +DrMain* LprHandler::loadDbDriver(const QString&) +{ + manager()->setErrorMsg(i18n("Unrecognized entry.")); + return NULL; +} + +PrintcapEntry* LprHandler::createEntry(KMPrinter *prt) +{ + // this default handler only supports local parallel and remote lpd URIs + KURL uri ( prt->device() ); + QString prot = uri.protocol(); + if (!prot.isEmpty() && prot != "parallel" && prot != "file" && prot != "lpd" && prot != "socket") + { + manager()->setErrorMsg(i18n("Unsupported backend: %1.").arg(prot)); + return NULL; + } + PrintcapEntry *entry = new PrintcapEntry; + entry->comment = "# Default handler"; + if (prot == "lpd") + { + entry->addField("rm", Field::String, uri.host()); + QString rp = uri.path(); + if (rp[0] == '/') + rp = rp.mid(1); + entry->addField("rp", Field::String, rp); + // force this entry to null (otherwise it seems it's redirected + // to /dev/lp0 by default) + entry->addField("lp", Field::String, QString::null); + } + else if ( prot == "socket" ) + { + QString lp = uri.host(); + if ( uri.port() == 0 ) + lp.append( "%9100" ); + else + lp.append( "%" ).append( QString::number( uri.port() ) ); + entry->addField("lp", Field::String, lp); + } + else + { + entry->addField("lp", Field::String, uri.path()); + } + return entry; +} + +bool LprHandler::removePrinter(KMPrinter*, PrintcapEntry*) +{ + return true; +} + +QString LprHandler::printOptions(KPrinter*) +{ + return QString::null; +} + +void LprHandler::reset() +{ +} + +DrMain* LprHandler::loadToolDriver(const QString& filename) +{ + QFile f(filename); + if (f.open(IO_ReadOnly)) + { + DrMain *driver = new DrMain; + QValueStack<DrGroup*> groups; + QTextStream t(&f); + QStringList l; + DrListOption *lopt(0); + DrBase *opt(0); + + groups.push(driver); + driver->set("text", "Tool Driver"); + while (!t.atEnd()) + { + l = QStringList::split('|', t.readLine().stripWhiteSpace(), false); + if (l.count() == 0) + continue; + if (l[0] == "GROUP") + { + DrGroup *grp = new DrGroup; + grp->setName(l[1]); + grp->set("text", l[2]); + groups.top()->addGroup(grp); + groups.push(grp); + } + else if (l[0] == "ENDGROUP") + { + groups.pop(); + } + else if (l[0] == "OPTION") + { + opt = 0; + lopt = 0; + if (l.count() > 3) + { + if (l[3] == "STRING") + opt = new DrStringOption; + else if (l[3] == "BOOLEAN") + { + lopt = new DrBooleanOption; + opt = lopt; + } + } + else + { + lopt = new DrListOption; + opt = lopt; + } + if (opt) + { + opt->setName(l[1]); + opt->set("text", l[2]); + groups.top()->addOption(opt); + } + } + else if (l[0] == "CHOICE" && lopt) + { + DrBase *ch = new DrBase; + ch->setName(l[1]); + ch->set("text", l[2]); + lopt->addChoice(ch); + } + else if (l[0] == "DEFAULT" && opt) + { + opt->setValueText(l[1]); + opt->set("default", l[1]); + } + } + return driver; + } + return NULL; +} + +QString LprHandler::driverDirectory() +{ + if (m_cacheddriverdir.isEmpty()) + m_cacheddriverdir = driverDirInternal(); + return m_cacheddriverdir; +} + +QString LprHandler::driverDirInternal() +{ + return QString::null; +} + +QString LprHandler::locateDir(const QString& dirname, const QString& paths) +{ + QStringList pathlist = QStringList::split(':', paths, false); + for (QStringList::ConstIterator it=pathlist.begin(); it!=pathlist.end(); ++it) + { + QString testpath = *it + "/" + dirname; + if (::access(QFile::encodeName(testpath), F_OK) == 0) + return testpath; + } + return QString::null; +} |