1 /*
2 * PrinterCap.cpp
3 * Copyright 1999-2000 Y.Takagi. All Rights Reserved.
4 */
5
6 #include "PrinterCap.h"
7 #include "PrinterData.h"
8
BaseCap(const string & label)9 BaseCap::BaseCap(const string &label)
10 :
11 fLabel(label)
12 {
13 }
14
15
~BaseCap()16 BaseCap::~BaseCap()
17 {
18 }
19
20
21 const char*
Label() const22 BaseCap::Label() const
23 {
24 return fLabel.c_str();
25 }
26
27
EnumCap(const string & label,bool isDefault)28 EnumCap::EnumCap(const string &label, bool isDefault)
29 :
30 BaseCap(label),
31 fIsDefault(isDefault)
32 {
33 }
34
35
36 const char*
Key() const37 EnumCap::Key() const
38 {
39 return fKey.c_str();
40 }
41
42
PaperCap(const string & label,bool isDefault,JobData::Paper paper,const BRect & paperRect,const BRect & physicalRect)43 PaperCap::PaperCap(const string &label, bool isDefault, JobData::Paper paper,
44 const BRect &paperRect, const BRect &physicalRect)
45 :
46 EnumCap(label, isDefault),
47 fPaper(paper),
48 fPaperRect(paperRect),
49 fPhysicalRect(physicalRect)
50 {
51 }
52
53
54 int32
ID() const55 PaperCap::ID() const
56 {
57 return fPaper;
58 }
59
60
PaperSourceCap(const string & label,bool isDefault,JobData::PaperSource paperSource)61 PaperSourceCap::PaperSourceCap(const string &label, bool isDefault,
62 JobData::PaperSource paperSource)
63 :
64 EnumCap(label, isDefault),
65 fPaperSource(paperSource)
66 {
67 }
68
69
70 int32
ID() const71 PaperSourceCap::ID() const
72 {
73 return fPaperSource;
74 }
75
76
ResolutionCap(const string & label,bool isDefault,int32 id,int xResolution,int yResolution)77 ResolutionCap::ResolutionCap(const string &label, bool isDefault,
78 int32 id, int xResolution, int yResolution)
79 :
80 EnumCap(label, isDefault),
81 fID(id),
82 fXResolution(xResolution),
83 fYResolution(yResolution)
84 {
85 }
86
87
88 int32
ID() const89 ResolutionCap::ID() const
90 {
91 return fID;
92 }
93
94
OrientationCap(const string & label,bool isDefault,JobData::Orientation orientation)95 OrientationCap::OrientationCap(const string &label, bool isDefault,
96 JobData::Orientation orientation)
97 :
98 EnumCap(label, isDefault),
99 fOrientation(orientation)
100 {
101 }
102
103
104 int32
ID() const105 OrientationCap::ID() const
106 {
107 return fOrientation;
108 }
109
110
PrintStyleCap(const string & label,bool isDefault,JobData::PrintStyle printStyle)111 PrintStyleCap::PrintStyleCap(const string &label, bool isDefault,
112 JobData::PrintStyle printStyle)
113 :
114 EnumCap(label, isDefault),
115 fPrintStyle(printStyle)
116 {
117 }
118
119
120 int32
ID() const121 PrintStyleCap::ID() const
122 {
123 return fPrintStyle;
124 }
125
126
BindingLocationCap(const string & label,bool isDefault,JobData::BindingLocation bindingLocation)127 BindingLocationCap::BindingLocationCap(const string &label, bool isDefault,
128 JobData::BindingLocation bindingLocation)
129 :
130 EnumCap(label, isDefault),
131 fBindingLocation(bindingLocation)
132 {
133 }
134
135
136 int32
ID() const137 BindingLocationCap::ID() const
138 {
139 return fBindingLocation;
140 }
141
142
ColorCap(const string & label,bool isDefault,JobData::Color color)143 ColorCap::ColorCap(const string &label, bool isDefault, JobData::Color color)
144 :
145 EnumCap(label, isDefault),
146 fColor(color)
147 {
148 }
149
150
151 int32
ID() const152 ColorCap::ID() const
153 {
154 return fColor;
155 }
156
157
ProtocolClassCap(const string & label,bool isDefault,int32 protocolClass,const string & description)158 ProtocolClassCap::ProtocolClassCap(const string &label, bool isDefault,
159 int32 protocolClass, const string &description)
160 :
161 EnumCap(label, isDefault),
162 fProtocolClass(protocolClass),
163 fDescription(description)
164 {
165 }
166
167
168 int32
ID() const169 ProtocolClassCap::ID() const
170 {
171 return fProtocolClass;
172 }
173
174
DriverSpecificCap(const string & label,int32 category,Type type)175 DriverSpecificCap::DriverSpecificCap(const string& label, int32 category,
176 Type type)
177 :
178 EnumCap(label, false),
179 fCategory(category),
180 fType(type)
181 {
182 }
183
184
185 int32
ID() const186 DriverSpecificCap::ID() const
187 {
188 return fCategory;
189 }
190
191
ListItemCap(const string & label,bool isDefault,int32 id)192 ListItemCap::ListItemCap(const string& label, bool isDefault, int32 id)
193 :
194 EnumCap(label, isDefault),
195 fID(id)
196 {
197 }
198
199
200 int32
ID() const201 ListItemCap::ID() const
202 {
203 return fID;
204 }
205
206
BooleanCap(const string & label,bool defaultValue)207 BooleanCap::BooleanCap(const string& label, bool defaultValue)
208 :
209 BaseCap(label),
210 fDefaultValue(defaultValue)
211 {
212 }
213
214
215 bool
DefaultValue() const216 BooleanCap::DefaultValue() const
217 {
218 return fDefaultValue;
219 }
220
221
IntRangeCap(const string & label,int lower,int upper,int defaultValue)222 IntRangeCap::IntRangeCap(const string& label, int lower, int upper,
223 int defaultValue)
224 :
225 BaseCap(label),
226 fLower(lower),
227 fUpper(upper),
228 fDefaultValue(defaultValue)
229 {
230 }
231
232
233 int32
Lower() const234 IntRangeCap::Lower() const
235 {
236 return fLower;
237 }
238
239
240 int32
Upper() const241 IntRangeCap::Upper() const
242 {
243 return fUpper;
244 }
245
246
247 int32
DefaultValue() const248 IntRangeCap::DefaultValue() const
249 {
250 return fDefaultValue;
251 }
252
253
DoubleRangeCap(const string & label,double lower,double upper,double defaultValue)254 DoubleRangeCap::DoubleRangeCap(const string& label, double lower, double upper,
255 double defaultValue)
256 :
257 BaseCap(label),
258 fLower(lower),
259 fUpper(upper),
260 fDefaultValue(defaultValue)
261 {
262 }
263
264
265 double
Lower() const266 DoubleRangeCap::Lower() const
267 {
268 return fLower;
269 }
270
271
272 double
Upper() const273 DoubleRangeCap::Upper() const
274 {
275 return fUpper;
276 }
277
278
279 double
DefaultValue() const280 DoubleRangeCap::DefaultValue() const
281 {
282 return fDefaultValue;
283 }
284
285
PrinterCap(const PrinterData * printer_data)286 PrinterCap::PrinterCap(const PrinterData *printer_data)
287 :
288 fPrinterData(printer_data)
289 {
290 }
291
292
~PrinterCap()293 PrinterCap::~PrinterCap()
294 {
295 }
296
297
298 const EnumCap*
GetDefaultCap(CapID category) const299 PrinterCap::GetDefaultCap(CapID category) const
300 {
301 int count = CountCap(category);
302 if (count <= 0)
303 return NULL;
304
305 const BaseCap **base_cap = GetCaps(category);
306 while (count--) {
307 const EnumCap* enumCap = dynamic_cast<const EnumCap*>(*base_cap);
308 if (enumCap == NULL)
309 return NULL;
310
311 if (enumCap->fIsDefault) {
312 return enumCap;
313 }
314
315 base_cap++;
316 }
317
318 return static_cast<const EnumCap*>(GetCaps(category)[0]);
319 }
320
321
322 template<typename Predicate>
323 const BaseCap*
FindCap(CapID category,Predicate & predicate) const324 PrinterCap::FindCap(CapID category, Predicate& predicate) const
325 {
326 int count = CountCap(category);
327 if (count <= 0)
328 return NULL;
329
330 const BaseCap **base_cap = GetCaps(category);
331 while (count--) {
332 if (predicate(*base_cap)) {
333 return *base_cap;
334 }
335 base_cap++;
336 }
337 return NULL;
338
339 }
340
341 const EnumCap*
FindCap(CapID category,int id) const342 PrinterCap::FindCap(CapID category, int id) const
343 {
344 IDPredicate predicate(id);
345 return static_cast<const EnumCap*>(FindCap(category, predicate));
346 }
347
348
349 const BaseCap*
FindCap(CapID category,const char * label) const350 PrinterCap::FindCap(CapID category, const char* label) const
351 {
352 LabelPredicate predicate(label);
353 return FindCap(category, predicate);
354 }
355
356
357 const EnumCap*
FindCapWithKey(CapID category,const char * key) const358 PrinterCap::FindCapWithKey(CapID category, const char* key) const
359 {
360 KeyPredicate predicate(key);
361 return static_cast<const EnumCap*>(FindCap(category, predicate));
362 }
363
364
365 const BooleanCap*
FindBooleanCap(CapID category) const366 PrinterCap::FindBooleanCap(CapID category) const
367 {
368 if (CountCap(category) != 1)
369 return NULL;
370 return dynamic_cast<const BooleanCap*>(GetCaps(category)[0]);
371 }
372
373
374 const IntRangeCap*
FindIntRangeCap(CapID category) const375 PrinterCap::FindIntRangeCap(CapID category) const
376 {
377 if (CountCap(category) != 1)
378 return NULL;
379 return dynamic_cast<const IntRangeCap*>(GetCaps(category)[0]);
380 }
381
382
383 const DoubleRangeCap*
FindDoubleRangeCap(CapID category) const384 PrinterCap::FindDoubleRangeCap(CapID category) const
385 {
386 if (CountCap(category) != 1)
387 return NULL;
388 return dynamic_cast<const DoubleRangeCap*>(GetCaps(category)[0]);
389 }
390
391
392 int
GetProtocolClass() const393 PrinterCap::GetProtocolClass() const {
394 return fPrinterData->GetProtocolClass();
395 }
396
397
398 const PrinterData*
GetPrinterData() const399 PrinterCap::GetPrinterData() const
400 {
401 return fPrinterData;
402 }
403