• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdeprint
 

tdeprint

  • tdeprint
  • lpr
lprngtoolhandler.cpp
1/*
2 * This file is part of the KDE libraries
3 * Copyright (c) 2001 Michael Goffioul <tdeprint@swing.be>
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License version 2 as published by the Free Software Foundation.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 **/
19
20#include "lprngtoolhandler.h"
21#include "printcapentry.h"
22#include "kmprinter.h"
23#include "util.h"
24#include "lprsettings.h"
25#include "driver.h"
26#include "kmmanager.h"
27#include "kprinter.h"
28
29#include <tqfile.h>
30#include <tqtextstream.h>
31#include <tdelocale.h>
32#include <kdebug.h>
33#include <tdestandarddirs.h>
34
35LPRngToolHandler::LPRngToolHandler(KMManager *mgr)
36: LprHandler("lprngtool", mgr)
37{
38}
39
40bool LPRngToolHandler::validate(PrintcapEntry *entry)
41{
42 if (entry->comment.startsWith("##LPRNGTOOL##") &&
43 entry->comment.find("UNKNOWN") == -1)
44 return true;
45 return false;
46}
47
48bool LPRngToolHandler::completePrinter(KMPrinter *prt, PrintcapEntry *entry, bool shortmode)
49{
50 TQString str, lp;
51
52 // look for type in comment
53 TQStringList l = TQStringList::split(' ', entry->comment, false);
54 lp = entry->field("lp");
55 if (l.count() < 1)
56 return false;
57
58 if (l[1] == "DEVICE" || l[1] == "SOCKET" || l[1] == "QUEUE")
59 LprHandler::completePrinter(prt, entry, shortmode);
60 else if (l[1] == "SMB")
61 {
62 TQMap<TQString,TQString> opts = parseXferOptions(entry->field("xfer_options"));
63 TQString user, pass;
64 loadAuthFile(LprSettings::self()->baseSpoolDir() + "/" + entry->name + "/" + opts["authfile"], user, pass);
65 TQString uri = buildSmbURI(
66 opts[ "workgroup" ],
67 opts[ "host" ],
68 opts[ "printer" ],
69 user,
70 pass );
71 prt->setDevice( uri );
72 prt->setLocation(i18n("Network printer (%1)").arg("smb"));
73 }
74
75 // look for comment
76 if (!(str=entry->field("cm")).isEmpty())
77 prt->setDescription(str);
78
79 // driver
80 //if (!shortmode)
81 //{
82 if (!(str=entry->field("ifhp")).isEmpty())
83 {
84 TQString model;
85 int p = str.find("model");
86 if (p != -1)
87 {
88 p = str.find('=', p);
89 if (p != -1)
90 {
91 p++;
92 int q = str.find(',', p);
93 if (q == -1)
94 model = str.mid(p);
95 else
96 model = str.mid(p, q-p);
97 }
98 }
99 prt->setDriverInfo(i18n("IFHP Driver (%1)").arg((model.isEmpty() ? i18n("unknown") : model)));
100 prt->setOption("driverID", model);
101 }
102 //}
103 return true;
104}
105
106TQMap<TQString,TQString> LPRngToolHandler::parseXferOptions(const TQString& str)
107{
108 uint p(0), q;
109 TQMap<TQString,TQString> opts;
110 TQString key, val;
111
112 while (p < str.length())
113 {
114 key = val = TQString::null;
115 // skip spaces
116 while (p < str.length() && str[p].isSpace())
117 p++;
118 q = p;
119 while (q < str.length() && str[q] != '=')
120 q++;
121 key = str.mid(p, q-p);
122 p = q+2;
123 while (p < str.length() && str[p] != '"')
124 p++;
125 val = str.mid(q+2, p-q-2);
126 if (!key.isEmpty())
127 opts[key] = val;
128 p++;
129 }
130 return opts;
131}
132
133void LPRngToolHandler::loadAuthFile(const TQString& filename, TQString& user, TQString& pass)
134{
135 TQFile f(filename);
136 if (f.open(IO_ReadOnly))
137 {
138 TQTextStream t(&f);
139 TQString line;
140 while (!t.atEnd())
141 {
142 line = t.readLine().stripWhiteSpace();
143 if (line.isEmpty())
144 continue;
145 int p = line.find('=');
146 if (p != -1)
147 {
148 TQString key = line.left(p);
149 if (key == "username")
150 user = line.mid(p+1);
151 else if (key == "password")
152 pass = line.mid(p+1);
153 }
154 }
155 }
156}
157
158DrMain* LPRngToolHandler::loadDriver(KMPrinter *prt, PrintcapEntry *entry, bool config)
159{
160 if (entry->field("lprngtooloptions").isEmpty())
161 {
162 manager()->setErrorMsg(i18n("No driver defined for that printer. It might be a raw printer."));
163 return NULL;
164 }
165
166 DrMain* driver = loadToolDriver(locate("data", "tdeprint/lprngtooldriver1"));
167 if (driver)
168 {
169 TQString model = prt->option("driverID");
170 driver->set("text", i18n("LPRngTool Common Driver (%1)").arg((model.isEmpty() ? i18n("unknown") : model)));
171 if (!model.isEmpty())
172 driver->set("driverID", model);
173 TQMap<TQString,TQString> opts = parseZOptions(entry->field("prefix_z"));
174 opts["lpr"] = entry->field("lpr");
175 driver->setOptions(opts);
176 // if not configuring, don't show the "lpr" options
177 if (!config)
178 driver->removeOptionGlobally("lpr");
179 }
180 return driver;
181}
182
183DrMain* LPRngToolHandler::loadDbDriver(const TQString& s)
184{
185 int p = s.find('/');
186 DrMain* driver = loadToolDriver(locate("data", "tdeprint/lprngtooldriver1"));
187 if (driver)
188 driver->set("driverID", s.mid(p+1));
189 return driver;
190}
191
192TQValueList< TQPair<TQString,TQStringList> > LPRngToolHandler::loadChoiceDict(const TQString& filename)
193{
194 TQFile f(filename);
195 TQValueList< TQPair<TQString,TQStringList> > dict;
196 if (f.open(IO_ReadOnly))
197 {
198 TQTextStream t(&f);
199 TQString line, key;
200 TQStringList l;
201 while (!t.atEnd())
202 {
203 line = t.readLine().stripWhiteSpace();
204 if (line.startsWith("OPTION"))
205 {
206 if (l.count() > 0 && !key.isEmpty())
207 dict << TQPair<TQString,TQStringList>(key, l);
208 l.clear();
209 key = TQString::null;
210 if (line.contains('|') == 2 || line.right(7) == "BOOLEAN")
211 {
212 int p = line.find('|', 7);
213 key = line.mid(7, p-7);
214 }
215 }
216 else if (line.startsWith("CHOICE"))
217 {
218 int p = line.find('|', 7);
219 l << line.mid(7, p-7);
220 }
221 }
222 }
223 return dict;
224}
225
226TQMap<TQString,TQString> LPRngToolHandler::parseZOptions(const TQString& optstr)
227{
228 TQMap<TQString,TQString> opts;
229 TQStringList l = TQStringList::split(',', optstr, false);
230 if (l.count() == 0)
231 return opts;
232
233 if (m_dict.count() == 0)
234 m_dict = loadChoiceDict(locate("data", "tdeprint/lprngtooldriver1"));
235
236 TQString unknown;
237 for (TQStringList::ConstIterator it=l.begin(); it!=l.end(); ++it)
238 {
239 bool found(false);
240 for (TQValueList< TQPair<TQString,TQStringList> >::ConstIterator p=m_dict.begin(); p!=m_dict.end() && !found; ++p)
241 {
242 if ((*p).second.find(*it) != (*p).second.end())
243 {
244 opts[(*p).first] = (*it);
245 found = true;
246 }
247 }
248 if (!found)
249 {
250 unknown.append(*it).append(',');
251 }
252 }
253 if (!unknown.isEmpty())
254 {
255 unknown.truncate(unknown.length()-1);
256 opts["filter"] = unknown;
257 }
258 return opts;
259}
260
261TQString LPRngToolHandler::filterDir()
262{
263 return driverDirectory();
264}
265
266TQString LPRngToolHandler::driverDirInternal()
267{
268 return locateDir("filters", "/usr/lib:/usr/local/lib:/opt/lib:/usr/libexec:/usr/local/libexec:/opt/libexec");
269}
270
271PrintcapEntry* LPRngToolHandler::createEntry(KMPrinter *prt)
272{
273 TQString prot = prt->deviceProtocol();
274 if (prot != "parallel" && prot != "lpd" && prot != "smb" && prot != "socket")
275 {
276 manager()->setErrorMsg(i18n("Unsupported backend: %1.").arg(prot));
277 return NULL;
278 }
279 PrintcapEntry *entry = new PrintcapEntry;
280 entry->addField("cm", Field::String, prt->description());
281 TQString lp, comment("##LPRNGTOOL## ");
282 if (prot == "parallel")
283 {
284 comment.append("DEVICE ");
285 lp = prt->device().mid( 9 );
286 entry->addField("rw@", Field::Boolean);
287 }
288 else if (prot == "socket")
289 {
290 comment.append("SOCKET ");
291 KURL url( prt->device() );
292 lp = url.host();
293 if (url.port() == 0)
294 lp.append("%9100");
295 else
296 lp.append("%").append(TQString::number(url.port()));
297 }
298 else if (prot == "lpd")
299 {
300 comment.append("QUEUE ");
301 KURL url( prt->device() );
302 lp = url.path().mid(1) + "@" + url.host();
303 }
304 else if (prot == "smb")
305 {
306 comment.append("SMB ");
307 lp = "| " + filterDir() + "/smbprint";
308 TQString work, server, printer, user, passwd;
309 if ( splitSmbURI( prt->device(), work, server, printer, user, passwd ) )
310 {
311 entry->addField("xfer_options", Field::String, TQString::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));
312 TQFile authfile(LprSettings::self()->baseSpoolDir() + "/" + prt->printerName() + "/auth");
313 if (authfile.open(IO_WriteOnly))
314 {
315 TQTextStream t(&authfile);
316 t << "username=" << user << endl;
317 t << "password=" << passwd << endl;
318 authfile.close();
319 }
320 }
321 else
322 {
323 manager()->setErrorMsg( i18n( "Invalid printer backend specification: %1" ).arg( prt->device() ) );
324 delete entry;
325 return NULL;
326 }
327 }
328
329 if (prt->driver())
330 {
331 DrMain *driver = prt->driver();
332 comment.append("filtertype=IFHP ifhp_options=status@,sync@,pagecount@,waitend@ printerdb_entry=");
333 comment.append(driver->get("driverID"));
334 entry->addField("ifhp", Field::String, TQString::fromLatin1("model=%1,status@,sync@,pagecount@,waitend@").arg(driver->get("driverID")));
335 entry->addField("lprngtooloptions", Field::String, TQString::fromLatin1("FILTERTYPE=\"IFHP\" IFHP_OPTIONS=\"status@,sync@,pagecount@,waitend@\" PRINTERDB_ENTRY=\"%1\"").arg(driver->get("driverID")));
336 TQMap<TQString,TQString> opts;
337 TQString optstr;
338 driver->getOptions(opts, false);
339 for (TQMap<TQString,TQString>::ConstIterator it=opts.begin(); it!=opts.end(); ++it)
340 if (it.key() != "lpr")
341 optstr.append(*it).append(",");
342 if (!optstr.isEmpty())
343 {
344 optstr.truncate(optstr.length()-1);
345 entry->addField("prefix_z", Field::String, optstr);
346 }
347 if (!opts["lpr"].isEmpty())
348 entry->addField("lpr", Field::String, opts["lpr"]);
349 }
350
351 entry->addField("lp", Field::String, lp);
352 entry->comment = comment;
353
354 return entry;
355}
356
357bool LPRngToolHandler::savePrinterDriver(KMPrinter*, PrintcapEntry *entry, DrMain *driver, bool *mustSave)
358{
359 // save options in the "prefix_z" field and tell the manager to save the printcap file
360 TQMap<TQString,TQString> opts;
361 TQString optstr;
362 driver->getOptions(opts, false);
363 for (TQMap<TQString,TQString>::ConstIterator it=opts.begin(); it!=opts.end(); ++it)
364 if (it.key() != "lpr")
365 optstr.append(*it).append(",");
366 if (!optstr.isEmpty())
367 optstr.truncate(optstr.length()-1);
368 // save options in any case, otherwise nothing will happen whn
369 // options are reset to their default value
370 entry->addField("prefix_z", Field::String, optstr);
371 entry->addField("lpr", Field::String, opts["lpr"]);
372 if (mustSave)
373 *mustSave = true;
374 return true;
375}
376
377TQString LPRngToolHandler::printOptions(KPrinter *printer)
378{
379 TQString optstr;
380 TQMap<TQString,TQString> opts = printer->options();
381 for (TQMap<TQString,TQString>::ConstIterator it=opts.begin(); it!=opts.end(); ++it)
382 {
383 if (it.key().startsWith("kde-") || it.key().startsWith("_kde-") || it.key() == "lpr" || it.key().startsWith( "app-" ))
384 continue;
385 optstr.append(*it).append(",");
386 }
387 if (!optstr.isEmpty())
388 {
389 optstr.truncate(optstr.length()-1);
390 optstr.prepend("-Z '").append("'");
391 }
392 return optstr;
393}
KPrinter
This class is the main interface to access the TDE print framework.
Definition: kprinter.h:89
KPrinter::options
const TQMap< TQString, TQString > & options() const
Returns the complete set of print options from the KPrinter object.
Definition: kprinter.cpp:903

tdeprint

Skip menu "tdeprint"
  • Main Page
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

tdeprint

Skip menu "tdeprint"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdeprint by doxygen 1.9.4
This website is maintained by Timothy Pearson.