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
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_VCL_PRINTERINFOMANAGER_HXX
#define INCLUDED_VCL_PRINTERINFOMANAGER_HXX
#include <memory>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <vcl/dllapi.h>
#include <vcl/jobdata.hxx>
#include <vcl/prntypes.hxx>
#include <osl/time.h>
#include <cstdio>
namespace psp
{
class SystemQueueInfo;
struct PrinterInfo : JobData
{
// basename of PPD
OUString m_aDriverName;
// can be the queue
OUString m_aLocation;
// a user defined comment
OUString m_aComment;
// a command line to pipe a PS-file to
OUString m_aCommand;
// a command line to pipe a PS-file to in case of direct print
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")
OUString m_aFeatures;
// auth-info-required, potential [domain],[username],[password] to prompt for to authenticate printing
OUString m_aAuthInfoRequired;
PrinterSetupMode meSetupMode;
PrinterInfo()
: JobData()
, meSetupMode(PrinterSetupMode::SingleJob)
{}
};
class VCL_DLLPUBLIC PrinterInfoManager
{
public:
enum class Type { Default = 0, CUPS = 1, CPD = 2 };
struct SystemPrintQueue
{
OUString m_aQueue;
OUString m_aLocation;
OUString m_aComment;
};
protected:
// needed for checkPrintersChanged: files (not necessarily existent)
// and their last known modification time
struct WatchFile
{
// the file in question
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
OUString m_aFile;
// details other config files that have this printer
// in case of removal all have to be removed
std::unordered_set< OUString > m_aAlternateFiles;
// the corresponding info and job data
PrinterInfo m_aInfo;
};
std::unordered_map< OUString, Printer > m_aPrinters;
PrinterInfo m_aGlobalDefaults;
std::vector< WatchFile > m_aWatchFiles;
OUString m_aDefaultPrinter;
OUString m_aSystemPrintCommand;
std::vector< SystemPrintQueue > m_aSystemPrintQueues;
std::unique_ptr<SystemQueueInfo>
m_pQueueInfo;
Type const m_eType;
bool m_bUseIncludeFeature;
bool m_bUseJobPatch;
OUString m_aSystemDefaultPaper;
PrinterInfoManager( Type eType = Type::Default );
virtual void initialize();
// 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;
public:
// there can only be one
static PrinterInfoManager& get();
// only called by SalData destructor, frees the global instance
static void release();
// get PrinterInfoManager type
Type getType() const { return m_eType; }
// lists the names of all known printers
void listPrinters( std::vector< OUString >& rVector ) const;
// gets info about a named printer
const PrinterInfo& getPrinterInfo( const OUString& rPrinter ) const;
// gets the name of the default printer
const OUString& getDefaultPrinter() const { return m_aDefaultPrinter; }
virtual void setupJobContextData( JobData& rData );
// 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 );
// 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 OUString& rPrinterName, bool bQuickCommand );
// close the FILE* returned by startSpool and does the actual spooling
// set bBanner to "false" will attempt to suppress banner printing
// set bBanner to "true" will rely on the system default
// returns true on success
virtual bool endSpool( const OUString& rPrinterName, const OUString& rJobTitle, FILE* pFile, const JobData& rDocumentJobData, bool bBanner, const OUString &rFaxNumber );
bool getUseIncludeFeature() const { return m_bUseIncludeFeature; }
bool getUseJobPatch() const { return m_bUseJobPatch; }
// check whether a printer's feature string contains a subfeature
bool checkFeatureToken( const OUString& rPrinterName, const char* pToken ) const;
virtual ~PrinterInfoManager();
};
} // namespace
#endif // INCLUDED_VCL_PRINTERINFOMANAGER_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|