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

tdeprint

  • tdeprint
  • lpr
lpchelper.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 "lpchelper.h"
21 #include "kpipeprocess.h"
22 #include "kmjob.h"
23 #include "lprsettings.h"
24 
25 #include <kstandarddirs.h>
26 #include <tqtextstream.h>
27 #include <tqregexp.h>
28 #include <kdebug.h>
29 #include <tdelocale.h>
30 #include <kprocess.h>
31 #include <stdlib.h>
32 
33 static TQString execute(const TQString& cmd)
34 {
35  KPipeProcess proc;
36  TQString output;
37  if (proc.open(cmd))
38  {
39  TQTextStream t(&proc);
40  while (!t.atEnd())
41  output.append(t.readLine()).append("\n");
42  proc.close();
43  }
44  return output;
45 }
46 
47 LpcHelper::LpcHelper(TQObject *parent, const char *name)
48 : TQObject(parent, name)
49 {
50  // look for the "lpc" executable. Use the PATH variable and
51  // add some specific dirs.
52  TQString PATH = getenv("PATH");
53  PATH.append(":/usr/sbin:/usr/local/sbin:/sbin:/opt/sbin:/opt/local/sbin");
54  m_exepath = TDEStandardDirs::findExe("lpc", PATH);
55  m_checkpcpath = TDEStandardDirs::findExe("checkpc", PATH);
56  m_lprmpath = TDEStandardDirs::findExe("lprm");
57 }
58 
59 LpcHelper::~LpcHelper()
60 {
61 }
62 
63 KMPrinter::PrinterState LpcHelper::state(const TQString& prname) const
64 {
65  if (m_state.contains(prname))
66  return m_state[prname];
67  return KMPrinter::Unknown;
68 }
69 
70 KMPrinter::PrinterState LpcHelper::state(KMPrinter *prt) const
71 {
72  return state(prt->printerName());
73 }
74 
75 void LpcHelper::parsetStatusLPR(TQTextStream &t)
76 {
77  TQString printer, line;
78  int p(-1);
79 
80  while (!t.atEnd())
81  {
82  line = t.readLine();
83  if (line.isEmpty())
84  continue;
85  else if (!line[0].isSpace() && (p = line.find(':')) != -1)
86  {
87  printer = line.left(p);
88  m_state[printer] = KMPrinter::Idle;
89  }
90  else if (line.find("printing is disabled") != -1)
91  {
92  if (!printer.isEmpty())
93  m_state[printer] = KMPrinter::PrinterState((KMPrinter::Stopped) | (m_state[printer] & ~KMPrinter::StateMask));
94  }
95  else if (line.find("queuing is disabled") != -1)
96  {
97  if (!printer.isEmpty())
98  m_state[printer] = KMPrinter::PrinterState((KMPrinter::Rejecting) | (m_state[printer] & KMPrinter::StateMask));
99  }
100  else if (line.find("entries") != -1)
101  {
102  if (!printer.isEmpty() &&
103  (m_state[printer] & KMPrinter::StateMask) != KMPrinter::Stopped &&
104  line.find("no entries") == -1)
105  m_state[printer] = KMPrinter::PrinterState((m_state[printer] & ~KMPrinter::StateMask) | KMPrinter::Processing);
106  }
107  }
108 }
109 
110 void LpcHelper::parsetStatusLPRng(TQTextStream& t)
111 {
112  TQStringList l;
113  int p(-1);
114  TQString printer;
115 
116  while (!t.atEnd())
117  if (t.readLine().stripWhiteSpace().startsWith("Printer"))
118  break;
119  while (!t.atEnd())
120  {
121  l = TQStringList::split(TQRegExp("\\s"), t.readLine(), false);
122  if (l.count() < 4)
123  continue;
124  p = l[0].find('@');
125  if (p == 0)
126  printer = l[0];
127  else
128  printer = l[0].left(p);
129  int st(0);
130  if (l[1] == "disabled")
131  st = KMPrinter::Stopped;
132  else if (l[3] != "0")
133  st = KMPrinter::Processing;
134  else
135  st = KMPrinter::Idle;
136  if (l[2] == "disabled")
137  st |= KMPrinter::Rejecting;
138  m_state[printer] = KMPrinter::PrinterState(st);
139  }
140 }
141 
142 void LpcHelper::updateStates()
143 {
144  KPipeProcess proc;
145 
146  m_state.clear();
147  if (!m_exepath.isEmpty() && proc.open(m_exepath + " status all"))
148  {
149  TQTextStream t(&proc);
150 
151  switch (LprSettings::self()->mode())
152  {
153  default:
154  case LprSettings::LPR:
155  parsetStatusLPR(t);
156  break;
157  case LprSettings::LPRng:
158  parsetStatusLPRng(t);
159  break;
160  }
161  proc.close();
162  }
163 
164 }
165 
166 bool LpcHelper::enable(KMPrinter *prt, bool state, TQString& msg)
167 {
168  int st = m_state[prt->printerName()] & KMPrinter::StateMask;
169  if (changeState(prt->printerName(), (state ? "enable" : "disable"), msg))
170  {
171  m_state[prt->printerName()] = KMPrinter::PrinterState((state ? KMPrinter::Rejecting : 0) | st);
172  return true;
173  }
174  return false;
175 }
176 
177 bool LpcHelper::start(KMPrinter *prt, bool state, TQString& msg)
178 {
179  int rej = m_state[prt->printerName()] & ~KMPrinter::StateMask;
180  if (changeState(prt->printerName(), (state ? "start" : "stop"), msg))
181  {
182  m_state[prt->printerName()] = KMPrinter::PrinterState((state ? KMPrinter::Idle : KMPrinter::Stopped) | rej);
183  return true;
184  }
185  return false;
186 }
187 
188 // status
189 // 0 : success
190 // -1 : permission denied
191 // -2 : unknown printer
192 // 1 : unknown error
193 int LpcHelper::parseStateChangeLPR(const TQString& result, const TQString& printer)
194 {
195  if (result.startsWith(printer + ":"))
196  return 0;
197  else if (result.startsWith("?Privileged"))
198  return -1;
199  else if (result.startsWith("unknown"))
200  return -2;
201  else
202  return 1;
203 }
204 
205 static TQString lprngAnswer(const TQString& result, const TQString& printer)
206 {
207  int p, q;
208 
209  p = result.find("\n" + printer);
210  if (p != -1)
211  {
212  q = result.find(':', p)+2;
213  p = result.find('\n', q);
214  TQString answer = result.mid(q, p-q).stripWhiteSpace();
215  return answer;
216  }
217  return TQString::null;
218 }
219 
220 int LpcHelper::parseStateChangeLPRng(const TQString& result, const TQString& printer)
221 {
222  TQString answer = lprngAnswer(result, printer);
223  if (answer == "no")
224  return -1;
225  else if (answer == "disabled" || answer == "enabled" || answer == "started" || answer == "stopped")
226  return 0;
227  else
228  return 1;
229 }
230 
231 bool LpcHelper::changeState(const TQString& printer, const TQString& op, TQString& msg)
232 {
233  if (m_exepath.isEmpty())
234  {
235  msg = i18n("The executable %1 couldn't be found in your PATH.").arg("lpc");
236  return false;
237  }
238  TQString result = execute(m_exepath + " " + op + " " + TDEProcess::quote(printer));
239  int status;
240 
241  switch (LprSettings::self()->mode())
242  {
243  default:
244  case LprSettings::LPR:
245  status = parseStateChangeLPR(result, printer);
246  break;
247  case LprSettings::LPRng:
248  status = parseStateChangeLPRng(result, printer);
249  break;
250  }
251  switch (status)
252  {
253  case 0:
254  break;
255  case -1:
256  msg = i18n("Permission denied.");
257  break;
258  case -2:
259  msg = i18n("Printer %1 does not exist.").arg(printer);
260  break;
261  default:
262  case 1:
263  msg = i18n("Unknown error: %1").arg(result.replace(TQRegExp("\\n"), " "));
264  break;
265  }
266  return (status == 0);
267 }
268 
269 bool LpcHelper::removeJob(KMJob *job, TQString& msg)
270 {
271  if (m_lprmpath.isEmpty())
272  {
273  msg = i18n("The executable %1 couldn't be found in your PATH.").arg("lprm");
274  return false;
275  }
276  TQString result = execute(m_lprmpath + " -P " + TDEProcess::quote(job->printer()) + " " + TQString::number(job->id()));
277  if (result.find("dequeued") != -1)
278  return true;
279  else if (result.find("Permission denied") != -1 || result.find("no permissions") != -1)
280  msg = i18n("Permission denied.");
281  else
282  msg = i18n("Execution of lprm failed: %1").arg(result);
283  return false;
284 }
285 
286 // LPRng only
287 bool LpcHelper::changeJobState(KMJob *job, int state, TQString& msg)
288 {
289  if (m_lprmpath.isEmpty())
290  {
291  msg = i18n("The executable %1 couldn't be found in your PATH.").arg("lpc");
292  return false;
293  }
294  TQString result = execute(m_exepath + (state == KMJob::Held ? " hold " : " release ") + TDEProcess::quote(job->printer()) + " " + TQString::number(job->id()));
295  TQString answer = lprngAnswer(result, job->printer());
296  if (answer == "no")
297  {
298  msg = i18n("Permission denied.");
299  return false;
300  }
301  else
302  return true;
303 }
304 
305 bool LpcHelper::restart(TQString& msg)
306 {
307  TQString s;
308  if (m_exepath.isEmpty())
309  s = "lpc";
310  else if (m_checkpcpath.isEmpty())
311  s = "checkpc";
312  if (!s.isEmpty())
313  {
314  msg = i18n("The executable %1 couldn't be found in your PATH.").arg(s);
315  return false;
316  }
317  ::system(TQFile::encodeName(m_exepath + " reread"));
318  ::system(TQFile::encodeName(m_checkpcpath + " -f"));
319  return true;
320 }

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.