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; }
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::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; }
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; }