DrMain* KMLpdManager::loadPrinterDriver(KMPrinter *printer, bool config) { PrintcapEntry *entry = findPrintcapEntry(printer->name()); if (!entry) return NULL; // check for printtool driver (only for configuration) QString sd = entry->arg("sd"), dr(entry->comment(7)); if (QFile::exists(sd+"/postscript.cfg") && config && !dr.isEmpty()) { QMap<QString,QString> map = loadPrinttoolCfgFile(sd+"/postscript.cfg"); PrinttoolEntry *ptentry = findPrinttoolEntry(dr); if (!ptentry) return NULL; DrMain *dr = ptentry->createDriver(); dr->setOptions(map); map = loadPrinttoolCfgFile(sd+"/general.cfg"); dr->setOptions(map); map = loadPrinttoolCfgFile(sd+"/textonly.cfg"); dr->setOptions(map); return dr; } // default if (entry->m_comment.startsWith("##PRINTTOOL3##")) setErrorMsg(i18n("No driver found (raw printer)")); else setErrorMsg(i18n("Printer type not recognized.")); return NULL; }
void KMLpdManager::loadPrintcapFile(const QString& filename) { QFile f(filename); if (f.exists() && f.open(IO_ReadOnly)) { QTextStream t(&f); QString line, comment; PrintcapEntry *entry; while (!t.eof()) { line = getPrintcapLine(t,&comment); if (line.isEmpty()) continue; entry = new PrintcapEntry; if (entry->readLine(line)) { m_entries.insert(entry->m_name,entry); entry->m_comment = comment; } else { delete entry; break; } } } }
bool KMLpdManager::removePrinter(KMPrinter *printer) { PrintcapEntry *ent = findPrintcapEntry(printer->printerName()); if (ent) { ent = m_entries.take(printer->printerName()); if (!writePrinters()) { m_entries.insert(ent->m_name,ent); return false; } QCString cmd = "rm -rf "; cmd += QFile::encodeName(KProcess::quote(ent->arg("sd"))); system(cmd.data()); delete ent; return true; } else return false; }
bool KMLpdManager::savePrinterDriver(KMPrinter *printer, DrMain *driver) { // To be able to save a printer driver, a printcap entry MUST exist. // We can then retrieve the spool directory from it. QString spooldir; PrintcapEntry *ent = findPrintcapEntry(printer->printerName()); if (!ent) return false; spooldir = ent->arg("sd"); if (driver->get("drtype") == "printtool" && !spooldir.isEmpty()) { QMap<QString,QString> options; driver->getOptions(options,true); // add some standard options options["DESIRED_TO"] = "ps"; options["PRINTER_TYPE"] = ent->comment(2); // get type from printcap entry (works in anycases) options["PS_SEND_EOF"] = "NO"; if (!checkGsDriver(options["GSDEVICE"])) return false; QString resol(options["RESOLUTION"]), color(options["COLOR"]); // update entry comment to make printtool happy and save printcap file ent->m_comment = QString::fromLatin1("##PRINTTOOL3## %1 %2 %3 %4 {} {%5} %6 {}").arg(options["PRINTER_TYPE"]).arg(options["GSDEVICE"]).arg((resol.isEmpty() ? QString::fromLatin1("NAxNA") : resol)).arg(options["PAPERSIZE"]).arg(driver->name()).arg((color.isEmpty() ? QString::fromLatin1("Default") : color.right(color.length()-15))); ent->m_args["if"] = spooldir+QString::fromLatin1("/filter"); if (!writePrinters()) return false; // write various driver files using templates QCString cmd = "cp "; cmd += QFile::encodeName(KProcess::quote(driverDirectory()+"/master-filter")); cmd += " "; cmd += QFile::encodeName(KProcess::quote(spooldir + "/filter")); if (system(cmd.data()) == 0 && savePrinttoolCfgFile(driverDirectory()+"/general.cfg.in",spooldir,options) && savePrinttoolCfgFile(driverDirectory()+"/postscript.cfg.in",spooldir,options) && savePrinttoolCfgFile(driverDirectory()+"/textonly.cfg.in",spooldir,options)) return true; setErrorMsg(i18n("Unable to write driver associated files in spool directory.")); } return false; }
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 KMLpdManager::completePrinterShort(KMPrinter *printer) { PrintcapEntry *entry = m_entries.find(printer->name()); if (entry) { QString type(entry->comment(2)), driver(entry->comment(7)), lp(entry->arg("lp")); printer->setDescription(i18n("Local printer queue (%1)").arg(type.isEmpty() ? i18n("Unknown type of local printer queue", "Unknown") : type)); printer->setLocation(i18n("<Not available>")); printer->setDriverInfo(driver.isEmpty() ? i18n("Unknown Driver", "Unknown") : driver); // device KURL url; if (!entry->arg("rm").isEmpty()) { url = QString::fromLatin1("lpd://%1/%2").arg(entry->arg("rm")).arg(entry->arg("rp")); printer->setDescription(i18n("Remote LPD queue %1@%2").arg(entry->arg("rp")).arg(entry->arg("rm"))); } else if (!lp.isEmpty() && lp != "/dev/null") url = QString::fromLatin1("parallel:%1").arg(lp); else if (QFile::exists(entry->arg("sd")+"/.config")) { QMap<QString,QString> map = loadPrinttoolCfgFile(entry->arg("sd")+"/.config"); if (type == "SMB") { QStringList l = QStringList::split('\\',map["share"],false); if (map["workgroup"].isEmpty()) url = QString::fromLatin1("smb://%1/%2").arg(l[0]).arg(l[1]); else url = QString::fromLatin1("smb://%1/%2/%3").arg(map["workgroup"]).arg(l[0]).arg(l[1]); url.setUser(map["user"]); url.setPass(map["password"]); } else if (type == "DIRECT") url = QString::fromLatin1("socket://%1:%2").arg(map["printer_ip"]).arg(map["port"]); else if (type == "NCP") { url = QString::fromLatin1("ncp://%1/%2").arg(map["server"]).arg(map["queue"]); url.setUser(map["user"]); url.setPass(map["password"]); } } printer->setDevice(url); return true; } else return false; }
bool KMLpdManager::createPrinter(KMPrinter *printer) { // 1) create the printcap entry PrintcapEntry *ent = findPrintcapEntry(printer->printerName()); if (!ent) { ent = new PrintcapEntry(); ent->m_name = printer->printerName(); } else { if (!printer->driver() && printer->option("kde-driver") != "raw") printer->setDriver(loadPrinterDriver(printer,true)); // remove it from current entries ent = m_entries.take(ent->m_name); ent->m_args.clear(); } // Standard options if (printer->device().protocol() == "lpd") { // remote lpd queue ent->m_args["rm"] = printer->device().host(); ent->m_args["rp"] = printer->device().path().replace("/",QString::fromLatin1("")); ent->m_args["lpd_bounce"] = "true"; ent->m_comment = QString::fromLatin1("##PRINTTOOL3## REMOTE"); } ent->m_args["mx"] = (printer->option("mx").isEmpty() ? "#0" : printer->option("mx")); ent->m_args["sh"] = QString::null; // create spool directory (if necessary) and update PrintcapEntry object if (!createSpooldir(ent)) { setErrorMsg(i18n("Unable to create spool directory %1 for printer %2.").arg(ent->arg("sd")).arg(ent->m_name)); delete ent; return false; } if (!printer->driver() || printer->driver()->get("drtype") == "printtool") if (!createPrinttoolEntry(printer,ent)) { setErrorMsg(i18n("Unable to save information for printer <b>%1</b>.").arg(printer->printerName())); delete ent; return false; } // 2) write the printcap file m_entries.insert(ent->m_name,ent); if (!writePrinters()) return false; // 3) save the printer driver (if any) if (printer->driver()) { if (!savePrinterDriver(printer,printer->driver())) { m_entries.remove(ent->m_name); writePrinters(); return false; } } // 4) change permissions of spool directory QCString cmd = "chmod -R o-rwx,g+rwX "; cmd += QFile::encodeName(KProcess::quote(ent->arg("sd"))); cmd += "&& chown -R lp.lp "; cmd += QFile::encodeName(KProcess::quote(ent->arg("sd"))); if (system(cmd.data()) != 0) { setErrorMsg(i18n("Unable to set correct permissions on spool directory %1 for printer <b>%2</b>.").arg(ent->arg("sd")).arg(ent->m_name)); return false; } return true; }
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; }
PrintcapEntry* ApsHandler::createEntry(KMPrinter *prt) { TQString prot = prt->deviceProtocol(); if (prot != "parallel" && prot != "lpd" && prot != "smb" && prot != "ncp") { manager()->setErrorMsg(i18n("Unsupported backend: %1.").arg(prot)); return NULL; } TQString path = sysconfDir() + "/" + prt->printerName(); if (!TDEStandardDirs::makeDir(path, 0755)) { manager()->setErrorMsg(i18n("Unable to create directory %1.").arg(path)); return NULL; } if (prot == "smb" || prot == "ncp") { // either "smb" or "ncp" TQFile::remove(path + "/smbclient.conf"); TQFile::remove(path + "/netware.conf"); TQFile f; if (prot == "smb") { f.setName(path + "/smbclient.conf"); if (f.open(IO_WriteOnly)) { TQTextStream t(&f); TQString work, server, printer, user, passwd; if ( splitSmbURI( prt->device(), work, server, printer, user, passwd ) ) { if (work.isEmpty()) { manager()->setErrorMsg(i18n("Missing element: %1.").arg("Workgroup")); return NULL; } t << "SMB_SERVER='" << server << "'" << endl; t << "SMB_PRINTER='" << printer << "'" << endl; t << "SMB_IP=''" << endl; t << "SMB_WORKGROUP='" << work << "'" << endl; t << "SMB_BUFFER=1400" << endl; t << "SMB_FLAGS='-N'" << endl; if (!user.isEmpty()) { t << "SMB_USER='******'" << endl; t << "SMB_PASSWD='" << passwd << "'" << endl; } } else { manager()->setErrorMsg( i18n( "Invalid printer backend specification: %1" ).arg( prt->device() ) ); return NULL; } } else { manager()->setErrorMsg(i18n("Unable to create the file %1.").arg(f.name())); return NULL; } } else { f.setName(path + "/netware.conf"); if (f.open(IO_WriteOnly)) { TQString work, server, printer, user, passwd; TQString uri = prt->device(); uri.replace( 0, 3, "smb" ); if ( splitSmbURI( uri, work, server, printer, user, passwd ) ) { TQTextStream t(&f); t << "NCP_SERVER='" << server << "'" << endl; t << "NCP_PRINTER='" << printer << "'" << endl; if (!user.isEmpty()) { t << "NCP_USER='******'" << endl; t << "NCP_PASSWD='" << passwd << "'" << endl; } } else { manager()->setErrorMsg( i18n( "Invalid printer backend specification: %1" ).arg( prt->device() ) ); return NULL; } } else { manager()->setErrorMsg(i18n("Unable to create the file %1.").arg(f.name())); return NULL; } } // change file permissions ::chmod(TQFile::encodeName(f.name()).data(), S_IRUSR|S_IWUSR); } PrintcapEntry *entry = LprHandler::createEntry(prt); if (!entry) { entry = new PrintcapEntry; entry->addField("lp", Field::String, "/dev/null"); } TQString sd = LprSettings::self()->baseSpoolDir() + "/" + prt->printerName(); entry->addField("af", Field::String, sd + "/acct"); entry->addField("lf", Field::String, sd + "/log"); entry->addField("if", Field::String, sysconfDir() + "/basedir/bin/apsfilter"); entry->comment = TQString::fromLatin1("# APS%1_BEGIN:printer%2").arg(m_counter).arg(m_counter); entry->postcomment = TQString::fromLatin1("# APS%1_END").arg(m_counter); m_counter++; return entry; }