• 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 <tdestandarddirs.h>
26#include <tqtextstream.h>
27#include <tqregexp.h>
28#include <kdebug.h>
29#include <tdelocale.h>
30#include <tdeprocess.h>
31#include <stdlib.h>
32
33static 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
47LpcHelper::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
59LpcHelper::~LpcHelper()
60{
61}
62
63KMPrinter::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
70KMPrinter::PrinterState LpcHelper::state(KMPrinter *prt) const
71{
72 return state(prt->printerName());
73}
74
75void 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
110void 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
142void 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
166bool 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
177bool 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
193int 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
205static 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
220int 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
231bool 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
269bool 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
287bool 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
305bool 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
  • 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.