1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
|
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: printerinfomanager.hxx,v $
* $Revision: 1.20 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#ifndef _PSPRINT_PRINTERINFOMANAGER_HXX_
#define _PSPRINT_PRINTERINFOMANAGER_HXX_
#include <hash_map>
#include <list>
#include "vcl/dllapi.h"
#include "vcl/helper.hxx"
#include "vcl/jobdata.hxx"
#include "vcl/helper.hxx"
#include "osl/file.hxx"
#include <cstdio>
namespace psp
{
class SystemQueueInfo;
struct PrinterInfo : JobData
{
// basename of PPD
rtl::OUString m_aDriverName;
// can be the queue
rtl::OUString m_aLocation;
// a user defined comment
rtl::OUString m_aComment;
// a command line to pipe a PS-file to
rtl::OUString m_aCommand;
// a command line to pipe a PS-file to in case of direct print
rtl::OUString m_aQuickCommand;
// a list of special features separated by ',' not used by psprint
// but assigned from the outside (currently for "fax","pdf=","autoqueue","external_dialog")
rtl::OUString m_aFeatures;
// a mapping of fonts to other fonts.
// this provides a method for the user
// to replace arbitrary fonts by printer builtin fonts
// currently this is only a mapping between font names
// assuming that only adbobe standard encoding fonts are
// built into the printer. in future it may be necessary
// to map to a font name and UCS2 vector which should be mapped
// this vector is currently implicitly given by the adobe
// standard encoding
bool m_bPerformFontSubstitution;
std::hash_map< rtl::OUString, rtl::OUString, rtl::OUStringHash >
m_aFontSubstitutes;
std::hash_map< fontID, fontID >
m_aFontSubstitutions;
PrinterInfo() :
JobData(),
m_bPerformFontSubstitution( false )
{}
};
class VCL_DLLPUBLIC PrinterInfoManager
{
public:
enum Type { Default = 0, CUPS = 1 };
struct SystemPrintQueue
{
rtl::OUString m_aQueue;
rtl::OUString m_aLocation;
rtl::OUString m_aComment;
};
protected:
// needed for checkPrintersChanged: files (not necessarily existant)
// and their last known modification time
struct WatchFile
{
// the file in question
rtl::OUString m_aFilePath;
// the last know modification time or 0, if file did not exist
TimeValue m_aModified;
};
// internal data to describe a printer
struct Printer
{
// configuration file containing this printer
// empty means a freshly added printer that has to be saved yet
rtl::OUString m_aFile;
// details other config files that have this printer
// in case of removal all have to be removed
std::list< rtl::OUString > m_aAlternateFiles;
// group in m_aFile containing the printer
// this must be unique over all configuration files
// it usually should be the printer name
rtl::OString m_aGroup;
// whether changes need to be saved
bool m_bModified;
// the corresponding info and job data
PrinterInfo m_aInfo;
};
std::hash_map< rtl::OUString, Printer, rtl::OUStringHash > m_aPrinters;
PrinterInfo m_aGlobalDefaults;
std::list< WatchFile > m_aWatchFiles;
rtl::OUString m_aDefaultPrinter;
rtl::OUString m_aSystemPrintCommand;
std::list< SystemPrintQueue > m_aSystemPrintQueues;
SystemQueueInfo* m_pQueueInfo;
Type m_eType;
bool m_bUseIncludeFeature;
rtl::OUString m_aSystemDefaultPaper;
bool m_bDisableCUPS;
PrinterInfoManager( Type eType = Default );
virtual ~PrinterInfoManager();
virtual void initialize();
// fill in font substitutions
// the resulting hash_map maps from source to target font ids
void fillFontSubstitutions( PrinterInfo& rInfo ) const;
// fill default paper if not configured in config file
// default paper is e.g. locale dependent
// if a paper is already set it will not be overwritten
void setDefaultPaper( PPDContext& rInfo ) const;
void initSystemDefaultPaper();
public:
// there can only be one
static PrinterInfoManager& get();
// get PrinterInfoManager type
Type getType() const { return m_eType; }
// lists the names of all known printers
void listPrinters( std::list< rtl::OUString >& rList ) const;
// gets the number of known printers
int countPrinters() const { return m_aPrinters.size(); }
// gets info about a named printer
const PrinterInfo& getPrinterInfo( const rtl::OUString& rPrinter ) const;
// gets the name of the default printer
const rtl::OUString& getDefaultPrinter() const { return m_aDefaultPrinter; }
virtual void setupJobContextData( JobData& rData );
// changes the info about a named printer
virtual void changePrinterInfo( const rtl::OUString& rPrinter, const PrinterInfo& rNewInfo );
// check if the printer configuration has changed
// if bwait is true, then this method waits for eventual asynchronous
// printer discovery to finish
virtual bool checkPrintersChanged( bool bWait );
// members for administration (->padmin)
// add a named printer
// addPrinter fails if a printer with the same name already exists
// or the driver does not exist
virtual bool addPrinter( const rtl::OUString& rPrinterName, const rtl::OUString& rDriverName );
// remove a named printer
// this fails if the config file belonging to this printer
// is not writeable
// if bCheckOnly is true, the printer is not really removed;
// this is for checking if the removal would fail
virtual bool removePrinter( const rtl::OUString& rPrinterName, bool bCheckOnly = false );
// save the changes to all printers. this fails if there
// is no writable config file at all
virtual bool writePrinterConfig();
// set a new default printer
// fails if the specified printer does not exist
virtual bool setDefaultPrinter( const rtl::OUString& rPrinterName );
// primarily used internally but also by padmin
// returns the printer queue names
virtual const std::list< SystemPrintQueue >& getSystemPrintQueues();
// similar but returnse whole commandlines
virtual void getSystemPrintCommands( std::list< rtl::OUString >& rCommands );
// abstract print command
// returns a stdio FILE* that a postscript file may be written to
// this may either be a regular file or the result of popen()
virtual FILE* startSpool( const rtl::OUString& rPrinterName, bool bQuickCommand );
// close the FILE* returned by startSpool and does the actual spooling
// returns a numerical job id
virtual int endSpool( const rtl::OUString& rPrinterName, const rtl::OUString& rJobTitle, FILE* pFile, const JobData& rDocumentJobData );
// for spadmin: whether adding or removing a printer is possible
virtual bool addOrRemovePossible() const;
bool getUseIncludeFeature() const { return m_bUseIncludeFeature; }
// check whether a printer's feature string contains a subfeature
bool checkFeatureToken( const rtl::OUString& rPrinterName, const char* pToken ) const;
// set m_bDisableCUPS and update printer config
void setCUPSDisabled( bool );
// gets m_bDisableCUPS, initialized from printer config
bool isCUPSDisabled() const;
};
} // namespace
#endif // _PSPRINT_PRINTERINFOMANAGER_HXX_
|