DrMain* ApsHandler::loadApsDriver(bool config) { DrMain *driver = loadToolDriver(locate("data", (config ? "tdeprint/apsdriver1" : "tdeprint/apsdriver2"))); if (driver) driver->set("text", "APS Common Driver"); return driver; }
DrMain* LPRngToolHandler::loadDbDriver(const QString& s) { int p = s.find('/'); DrMain* driver = loadToolDriver(locate("data", "kdeprint/lprngtooldriver1")); if (driver) driver->set("driverID", s.mid(p+1)); return driver; }
DrMain* ApsHandler::loadDbDriver(const TQString& s) { int p = s.find('/'); DrMain *driver = loadApsDriver(true); if (driver) driver->set("gsdriver", s.mid(p+1)); return driver; }
DrMain* LPRngToolHandler::loadDriver(KMPrinter *prt, PrintcapEntry *entry, bool config) { if (entry->field("lprngtooloptions").isEmpty()) { manager()->setErrorMsg(i18n("No driver defined for that printer. It might be a raw printer.")); return NULL; } DrMain* driver = loadToolDriver(locate("data", "kdeprint/lprngtooldriver1")); if (driver) { QString model = prt->option("driverID"); driver->set("text", i18n("LPRngTool Common Driver (%1)").arg((model.isEmpty() ? i18n("unknown") : model))); if (!model.isEmpty()) driver->set("driverID", model); QMap<QString,QString> opts = parseZOptions(entry->field("prefix_z")); opts["lpr"] = entry->field("lpr"); driver->setOptions(opts); // if not configuring, don't show the "lpr" options if (!config) driver->removeOptionGlobally("lpr"); } return driver; }
DrMain *PPDLoader::readFromFile(const QString &filename) { // Initialization m_groups.clear(); m_option = NULL; m_fonts.clear(); // Open driver file QIODevice *d = KFilterDev::deviceForFile(filename); if(d && d->open(IO_ReadOnly)) { DrMain *driver = new DrMain; bool result = true; m_groups.push(driver); kdeprint_ppdscanner_init(d); if(kdeprint_ppdparse(this) != 0) result = false; kdeprint_ppdscanner_terminate(true); if(result) { if(m_groups.size() > 1) kdWarning(500) << "PPD syntax error, GROUP specification not correctly closed" << endl; if(driver->has("foodata")) { Foomatic2Loader loader; if(loader.readFromBuffer(driver->get("foodata"))) { driver = loader.modifyDriver(driver); } else kdWarning(500) << "PPD syntax error, Foomatic data read failed" << endl; } processPageSizes(driver); if(!m_fonts.isEmpty()) driver->set("fonts", m_fonts.join(",")); return driver; } else kdWarning(500) << "PPD syntax error, PPD parse failed" << endl; delete driver; m_ps.clear(); } else kdWarning(500) << "PPD read error, unable to open device for file " << filename << endl; return 0; }
DrMain* ApsHandler::loadDriver(KMPrinter *prt, PrintcapEntry *entry, bool config) { DrMain *driver = loadApsDriver(config); if (driver /* && config */ ) // Load resources in all case, to get the correct page size { TQMap<TQString,TQString> opts = loadResources(entry); if ( !config && opts.contains( "PAPERSIZE" ) ) { // this is needed to keep applications informed // about the current selected page size opts[ "PageSize" ] = opts[ "PAPERSIZE" ]; // default page size needs to be set to the actual // value of the printer driver, otherwise it's blocked // to A4 DrBase *opt = driver->findOption( "PageSize" ); if ( opt ) opt->set( "default", opts[ "PageSize" ] ); } driver->setOptions(opts); driver->set("gsdriver", opts["PRINTER"]); } return driver; }
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; }
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; }
DrMain *PrinttoolEntry::createDriver() { // create driver DrMain *dr = new DrMain(); dr->setName(m_name); dr->set("description", m_description); dr->set("text", m_description); dr->set("drtype", "printtool"); DrGroup *gr(0); DrListOption *lopt(0); DrStringOption *sopt(0); DrBooleanOption *bopt(0); DrBase *ch(0); if(m_gsdriver != "TEXT") { // create GS group gr = new DrGroup(); gr->set("text", i18n("GhostScript settings")); dr->addGroup(gr); // Pseudo option to have access to GS driver lopt = new DrListOption(); lopt->setName("GSDEVICE"); lopt->set("text", i18n("Driver")); lopt->set("default", m_gsdriver); gr->addOption(lopt); ch = new DrBase(); ch->setName(m_gsdriver); ch->set("text", m_gsdriver); lopt->addChoice(ch); lopt->setValueText(m_gsdriver); // Resolutions if(m_resolutions.count() > 0) { lopt = new DrListOption(); lopt->setName("RESOLUTION"); lopt->set("text", i18n("Resolution")); gr->addOption(lopt); QPtrListIterator< Resolution > it(m_resolutions); for(int i = 0; it.current(); ++it, i++) { ch = new DrBase; ch->setName(QString::fromLatin1("%1x%2").arg(it.current()->xdpi).arg(it.current()->ydpi)); if(it.current()->comment.isEmpty()) ch->set("text", QString::fromLatin1("%1x%2 DPI").arg(it.current()->xdpi).arg(it.current()->ydpi)); else ch->set("text", QString::fromLatin1("%2x%3 DPI (%1)").arg(it.current()->comment).arg(it.current()->xdpi).arg(it.current()->ydpi)); lopt->addChoice(ch); } QString defval = lopt->choices()->first()->name(); lopt->set("default", defval); lopt->setValueText(defval); } // BitsPerPixels if(m_depths.count() > 0) { lopt = new DrListOption(); lopt->setName("COLOR"); lopt->set("text", i18n("Color depth")); gr->addOption(lopt); QPtrListIterator< BitsPerPixel > it(m_depths); for(int i = 0; it.current(); ++it, i++) { ch = new DrBase; if(m_gsdriver != "uniprint") ch->setName(QString::fromLatin1("-dBitsPerPixel=%1").arg(it.current()->bpp)); else ch->setName(it.current()->bpp); if(it.current()->comment.isEmpty()) ch->set("text", it.current()->bpp); else ch->set("text", QString::fromLatin1("%1 - %2").arg(it.current()->bpp).arg(it.current()->comment)); lopt->addChoice(ch); } QString defval = lopt->choices()->first()->name(); lopt->set("default", defval); lopt->setValueText(defval); } // additional GS options sopt = new DrStringOption; sopt->setName("EXTRA_GS_OPTIONS"); sopt->set("text", i18n("Additional GS options")); gr->addOption(sopt); } // General group gr = new DrGroup(); gr->set("text", i18n("General")); dr->addGroup(gr); // Page size lopt = new DrListOption(); lopt->setName("PAPERSIZE"); lopt->set("text", i18n("Page size")); lopt->set("default", "letter"); gr->addOption(lopt); int i(0); while(pt_pagesize[i]) { ch = new DrBase(); ch->setName(pt_pagesize[i++]); ch->set("text", i18n(pt_pagesize[i++])); lopt->addChoice(ch); } lopt->setValueText("letter"); // Nup lopt = new DrListOption(); lopt->setName("NUP"); lopt->set("text", i18n("Pages per sheet")); lopt->set("default", "1"); gr->addOption(lopt); i = 0; while(pt_nup[i] != -1) { ch = new DrBase(); ch->setName(QString::number(pt_nup[i++])); ch->set("text", ch->name()); lopt->addChoice(ch); } lopt->setValueText("1"); // Margins sopt = new DrStringOption(); sopt->setName("RTLFTMAR"); sopt->set("text", i18n("Left/right margin (1/72 in)")); sopt->setValueText("18"); gr->addOption(sopt); sopt = new DrStringOption(); sopt->setName("TOPBOTMAR"); sopt->set("text", i18n("Top/bottom margin (1/72 in)")); sopt->setValueText("18"); gr->addOption(sopt); // Text group gr = new DrGroup(); gr->set("text", i18n("Text options")); dr->addGroup(gr); // Send EOF bopt = new DrBooleanOption(); bopt->setName("TEXT_SEND_EOF"); bopt->set("text", i18n("Send EOF after job to eject page")); gr->addOption(bopt); setupBooleanOption(bopt); bopt->setValueText("NO"); // Fix stair-stepping bopt = new DrBooleanOption(); bopt->setName("CRLFTRANS"); bopt->set("text", i18n("Fix stair-stepping text")); gr->addOption(bopt); setupBooleanOption(bopt); bopt->choices()->first()->setName("1"); bopt->choices()->last()->setName("0"); bopt->setValueText("0"); if(m_gsdriver != "POSTSCRIPT") { // Fast text printing bopt = new DrBooleanOption(); bopt->setName("ASCII_TO_PS"); bopt->set("text", i18n("Fast text printing (non-PS printers only)")); gr->addOption(bopt); setupBooleanOption(bopt); bopt->choices()->first()->setName("NO"); bopt->choices()->last()->setName("YES"); bopt->setValueText("NO"); } return dr; }
DrMain* Foomatic2Loader::buildDriver() const { if ( m_foodata.isEmpty() ) return NULL; QVariant v = m_foodata.find( "VAR" ).data(); if ( !v.isNull() && v.type() == QVariant::Map ) { DrMain *driver = new DrMain; QMap<QString,DrGroup*> groups; driver->set( "manufacturer", v.mapFind( "make" ).data().toString() ); driver->set( "model", v.mapFind( "model" ).data().toString() ); driver->set( "matic_printer", v.mapFind( "id" ).data().toString() ); driver->set( "matic_driver", v.mapFind( "driver" ).data().toString() ); driver->set( "text", QString( "%1 %2 (%3)" ).arg( driver->get( "manufacturer" ) ).arg( driver->get( "model" ) ).arg( driver->get( "matic_driver" ) ) ); if ( m_foodata.contains( "POSTPIPE" ) ) driver->set( "postpipe", m_foodata.find( "POSTPIPE" ).data().toString() ); v = v.mapFind( "args" ).data(); if ( !v.isNull() && v.type() == QVariant::List ) { QValueList<QVariant>::ConstIterator it = v.listBegin(); for ( ; it!=v.listEnd(); ++it ) { if ( ( *it ).type() != QVariant::Map ) continue; DrBase *opt = createOption( ( *it ).toMap() ); if ( opt ) { QString group = DrGroup::groupForOption( opt->name() ); DrGroup *grp = NULL; if ( !groups.contains( group ) ) { grp = new DrGroup; grp->set( "text", group ); driver->addGroup( grp ); groups.insert( group, grp ); } else grp = groups[ group ]; grp->addOption( opt ); if ( opt->name() == "PageSize" ) { // try to add the corresponding page sizes QVariant choices = ( *it ).mapFind( "vals_byname" ).data(); QRegExp re( "(\\d+) +(\\d+)" ); if ( choices.type() == QVariant::Map ) { QMap<QString,QVariant>::ConstIterator it = choices.mapBegin(); for ( ; it!=choices.mapEnd(); ++it ) { QString driverval = ( *it ).mapFind( "driverval" ).data().toString(); if ( re.exactMatch( driverval ) ) { driver->addPageSize( new DrPageSize( it.key(), re.cap( 1 ).toInt(), re.cap( 2 ).toInt(), 36, 24, 36, 24 ) ); } } } } } else kdWarning( 500 ) << "Failed to create option: " << ( *it ).toMap()[ "name" ].toString() << endl; } } return driver; } return NULL; }