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