void KXmlCommandAdvancedDlg::parseXmlCommand(KXmlCommand *xmlcmd) { m_view->clear(); TQListViewItem *root = new TQListViewItem(m_view, xmlcmd->name(), xmlcmd->name()); DrMain *driver = xmlcmd->driver(); root->setPixmap(0, SmallIcon("fileprint")); root->setOpen(true); if (driver) { DrMain *clone = driver->cloneDriver(); if (!clone->get("text").isEmpty()) root->setText(0, clone->get("text")); root->setText(1, "__root__"); clone->setName("__root__"); m_opts["__root__"] = clone; parseGroupItem(clone, root); clone->flatten(); } m_command->setText(xmlcmd->command()); m_inputfile->setText(xmlcmd->io(true, false)); m_inputpipe->setText(xmlcmd->io(true, true)); m_outputfile->setText(xmlcmd->io(false, false)); m_outputpipe->setText(xmlcmd->io(false, true)); m_comment->setText( xmlcmd->comment() ); viewItem(0); }
void KMDriverDbWidget::slotOtherClicked() { if(m_external.isEmpty()) { KFileDialog dlg(QString::null, QString::null, this, 0, true); KURL url; dlg.setMode(KFile::File); dlg.setCaption(i18n("Select Driver")); if(dlg.exec()) url = dlg.selectedURL(); if(!url.isEmpty()) { QString filename; if(KIO::NetAccess::download(url, filename, this)) { DrMain *driver = KMFactory::self()->manager()->loadFileDriver(filename); if(driver) { m_external = filename; disconnect(m_manu, SIGNAL(highlighted(const QString &)), this, SLOT(slotManufacturerSelected(const QString &))); m_manu->clear(); m_model->clear(); QString s = driver->get("manufacturer"); m_manu->insertItem((s.isEmpty() ? i18n("<Unknown>") : s)); s = driver->get("model"); m_model->insertItem((s.isEmpty() ? i18n("<Unknown>") : s)); m_manu->setCurrentItem(0); m_model->setCurrentItem(0); m_other->setText(i18n("Database")); m_desc = driver->get("description"); delete driver; } else {
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; }
void KPrinterImpl::preparePrinting(KPrinter *printer) { // page size -> try to find page size and margins from driver file // use "PageSize" as option name to find the wanted page size. It's // up to the driver loader to use that option name. KMManager *mgr = KMFactory::self()->manager(); DrMain *driver = mgr->loadPrinterDriver(mgr->findPrinter(printer->printerName()), false); if (driver) { // Find the page size: // 1) print option // 2) default driver option QString psname = printer->option("PageSize"); if (psname.isEmpty()) { DrListOption *opt = (DrListOption*)driver->findOption("PageSize"); if (opt) psname = opt->get("default"); } if (!psname.isEmpty()) { printer->setOption("kde-pagesize",TQString::number((int)pageNameToPageSize(psname))); DrPageSize *ps = driver->findPageSize(psname); if (ps) { printer->setRealPageSize( ps ); } } // Find the numerical resolution // 1) print option (Resolution) // 2) default driver option (Resolution) // 3) default printer resolution // The resolution must have the format: XXXdpi or XXXxYYYdpi. In the second // case the YYY value is used as resolution. TQString res = printer->option( "Resolution" ); if ( res.isEmpty() ) { DrBase *opt = driver->findOption( "Resolution" ); if ( opt ) res = opt->get( "default" ); if ( res.isEmpty() ) res = driver->get( "resolution" ); } if ( !res.isEmpty() ) { TQRegExp re( "(\\d+)(?:x(\\d+))?dpi" ); if ( re.search( res ) != -1 ) { if ( !re.cap( 2 ).isEmpty() ) printer->setOption( "kde-resolution", re.cap( 2 ) ); else printer->setOption( "kde-resolution", re.cap( 1 ) ); } } // Find the supported fonts TQString fonts = driver->get( "fonts" ); if ( !fonts.isEmpty() ) printer->setOption( "kde-fonts", fonts ); delete driver; } }
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; }
PrintcapEntry* LPRngToolHandler::createEntry(KMPrinter *prt) { QString prot = prt->deviceProtocol(); if (prot != "parallel" && prot != "lpd" && prot != "smb" && prot != "socket") { manager()->setErrorMsg(i18n("Unsupported backend: %1.").arg(prot)); return NULL; } PrintcapEntry *entry = new PrintcapEntry; entry->addField("cm", Field::String, prt->description()); QString lp, comment("##LPRNGTOOL## "); if (prot == "parallel") { comment.append("DEVICE "); lp = prt->device().mid( 9 ); entry->addField("rw@", Field::Boolean); } else if (prot == "socket") { comment.append("SOCKET "); KURL url( prt->device() ); lp = url.host(); if (url.port() == 0) lp.append("%9100"); else lp.append("%").append(QString::number(url.port())); } else if (prot == "lpd") { comment.append("QUEUE "); KURL url( prt->device() ); lp = url.path().mid(1) + "@" + url.host(); } else if (prot == "smb") { comment.append("SMB "); lp = "| " + filterDir() + "/smbprint"; QString work, server, printer, user, passwd; if ( splitSmbURI( prt->device(), work, server, printer, user, passwd ) ) { entry->addField("xfer_options", Field::String, QString::fromLatin1("authfile=\"auth\" crlf=\"0\" hostip=\"\" host=\"%1\" printer=\"%2\" remote_mode=\"SMB\" share=\"//%3/%4\" workgroup=\"%5\"").arg(server).arg(printer).arg(server).arg(printer).arg(work)); QFile authfile(LprSettings::self()->baseSpoolDir() + "/" + prt->printerName() + "/auth"); if (authfile.open(IO_WriteOnly)) { QTextStream t(&authfile); t << "username="******"password="******"Invalid printer backend specification: %1" ).arg( prt->device() ) ); delete entry; return NULL; } } if (prt->driver()) { DrMain *driver = prt->driver(); comment.append("filtertype=IFHP ifhp_options=status@,sync@,pagecount@,waitend@ printerdb_entry="); comment.append(driver->get("driverID")); entry->addField("ifhp", Field::String, QString::fromLatin1("model=%1,status@,sync@,pagecount@,waitend@").arg(driver->get("driverID"))); entry->addField("lprngtooloptions", Field::String, QString::fromLatin1("FILTERTYPE=\"IFHP\" IFHP_OPTIONS=\"status@,sync@,pagecount@,waitend@\" PRINTERDB_ENTRY=\"%1\"").arg(driver->get("driverID"))); QMap<QString,QString> opts; QString optstr; driver->getOptions(opts, false); for (QMap<QString,QString>::ConstIterator it=opts.begin(); it!=opts.end(); ++it) if (it.key() != "lpr") optstr.append(*it).append(","); if (!optstr.isEmpty()) { optstr.truncate(optstr.length()-1); entry->addField("prefix_z", Field::String, optstr); } if (!opts["lpr"].isEmpty()) entry->addField("lpr", Field::String, opts["lpr"]); } entry->addField("lp", Field::String, lp); entry->comment = comment; return entry; }
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; }