• 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 <kstandarddirs.h>
34 
35 LPRngToolHandler::LPRngToolHandler(KMManager *mgr)
36 : LprHandler("lprngtool", mgr)
37 {
38 }
39 
40 bool 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 
48 bool 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 
106 TQMap<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 
133 void 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 
158 DrMain* 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 
183 DrMain* 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 
192 TQValueList< 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 
226 TQMap<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 
261 TQString LPRngToolHandler::filterDir()
262 {
263  return driverDirectory();
264 }
265 
266 TQString LPRngToolHandler::driverDirInternal()
267 {
268  return locateDir("filters", "/usr/lib:/usr/local/lib:/opt/lib:/usr/libexec:/usr/local/libexec:/opt/libexec");
269 }
270 
271 PrintcapEntry* 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 
357 bool 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 
377 TQString 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::options
const TQMap< TQString, TQString > & options() const
Returns the complete set of print options from the KPrinter object.
Definition: kprinter.cpp:897
KPrinter
This class is the main interface to access the TDE print framework.
Definition: kprinter.h:88

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
  •     tdecore
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  • tdeioslave
  •   http
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdeprint by doxygen 1.8.8
This website is maintained by Timothy Pearson.