xref: /haiku/src/libs/print/libprint/JobData.cpp (revision 308f0e195dc9a71620970f8ebfe6e02fe6e27ddc)
1 /*
2  * JobData.cpp
3  * Copyright 1999-2000 Y.Takagi. All Rights Reserved.
4  */
5 
6 #include <InterfaceDefs.h>
7 #include <Message.h>
8 #include "JobData.h"
9 #include "PrinterCap.h"
10 #include "DbgMsg.h"
11 
12 static const char *kJDXRes                  = "xres";
13 static const char *kJDYRes                  = "yres";
14 static const char *kJDCopies                = "copies";
15 static const char *kJDOrientation           = "orientation";
16 static const char *kJDScaling               = "scale";
17 static const char *kJDScaledPaperRect       = "paper_rect";
18 static const char *kJDScaledPrintableRect   = "printable_rect";
19 static const char *kJDFirstPage             = "first_page";
20 static const char *kJDLastPage              = "last_page";
21 
22 static const char *kJDShowPreview           = "JJJJ_showPreview";
23 static const char *kJDPaper                 = "JJJJ_paper";
24 static const char *kJDNup                   = "JJJJ_nup";
25 static const char *kJDGamma                 = "JJJJ_gamma";
26 static const char *kJDInkDensity            = "JJJJ_ink_density";
27 static const char *kJDPaperSource           = "JJJJ_paper_source";
28 static const char *kJDCollate               = "JJJJ_collate";
29 static const char *kJDReverse               = "JJJJ_reverse";
30 static const char *kJDPrintStyle            = "JJJJ_print_style";
31 static const char *kJDBindingLocation       = "JJJJ_binding_location";
32 static const char *kJDPageOrder             = "JJJJ_page_order";
33 static const char *kJDColor                 = "JJJJ_color";
34 static const char *kJDDitherType            = "JJJJ_dither_type";
35 static const char *kJDPaperRect             = "JJJJ_paper_rect";
36 static const char* kJDPrintableRect         = "JJJJ_printable_rect";
37 static const char* kJDPageSelection         = "JJJJ_page_selection";
38 static const char* kJDMarginUnit            = "JJJJ_margin_unit";
39 static const char* kJDPhysicalRect          = "JJJJ_physical_rect";
40 static const char* kJDScaledPhysicalRect    = "JJJJ_scaled_physical_rect";
41 static const char* kJDResolution            = "JJJJ_resolution";
42 
43 
44 JobData::JobData(BMessage *msg, const PrinterCap *cap, Settings settings)
45 {
46 	load(msg, cap, settings);
47 }
48 
49 
50 JobData::~JobData()
51 {
52 }
53 
54 
55 JobData::JobData(const JobData &job_data)
56 {
57 	*this = job_data;
58 }
59 
60 
61 JobData&
62 JobData::operator=(const JobData &job_data)
63 {
64 	fShowPreview           = job_data.fShowPreview;
65 	fPaper                 = job_data.fPaper;
66 	fResolutionID          = job_data.fResolutionID;
67 	fXRes                  = job_data.fXRes;
68 	fYRes                  = job_data.fYRes;
69 	fOrientation           = job_data.fOrientation;
70 	fScaling               = job_data.fScaling;
71 	fPaperRect             = job_data.fPaperRect;
72 	fScaledPaperRect       = job_data.fScaledPaperRect;
73 	fPrintableRect         = job_data.fPrintableRect;
74 	fScaledPrintableRect   = job_data.fScaledPrintableRect;
75 	fNup                   = job_data.fNup;
76 	fFirstPage             = job_data.fFirstPage;
77 	fLastPage              = job_data.fLastPage;
78 	fGamma                 = job_data.fGamma;
79 	fInkDensity            = job_data.fInkDensity;
80 	fPaperSource           = job_data.fPaperSource;
81 	fCopies                = job_data.fCopies;
82 	fCollate               = job_data.fCollate;
83 	fReverse               = job_data.fReverse;
84 	fPrintStyle            = job_data.fPrintStyle;
85 	fBindingLocation       = job_data.fBindingLocation;
86 	fPageOrder             = job_data.fPageOrder;
87 	fSettings              = job_data.fSettings;
88 	fMsg                   = job_data.fMsg;
89 	fColor                 = job_data.fColor;
90 	fDitherType            = job_data.fDitherType;
91 	fPageSelection         = job_data.fPageSelection;
92 	fMarginUnit            = job_data.fMarginUnit;
93 	fPhysicalRect          = job_data.fPhysicalRect;
94 	fScaledPhysicalRect    = job_data.fScaledPhysicalRect;
95 	return *this;
96 }
97 
98 
99 void
100 JobData::load(BMessage *msg, const PrinterCap *cap, Settings settings)
101 {
102 	fMsg = msg;
103 	fSettings = settings;
104 
105 	const PaperCap *paperCap = NULL;
106 
107  	if (msg->HasBool(kJDShowPreview))
108  		fShowPreview = msg->FindBool(kJDShowPreview);
109  	else
110  		fShowPreview = false;
111 
112 	if (msg->HasInt32(kJDPaper))
113 		fPaper = (Paper)msg->FindInt32(kJDPaper);
114 	else if (cap->isSupport(PrinterCap::kPaper)) {
115 		paperCap = (const PaperCap *)cap->getDefaultCap(PrinterCap::kPaper);
116 		fPaper = paperCap->fPaper;
117 	} else
118 		fPaper = kA4;
119 
120 	if (msg->HasInt32(kJDResolution)) {
121 		int32 resolution;
122 		msg->FindInt32(kJDResolution, &resolution);
123 		fResolutionID = resolution;
124 	} else if (cap->isSupport(PrinterCap::kResolution)) {
125 		fResolutionID = cap->getDefaultCap(PrinterCap::kResolution)->ID();
126 	} else {
127 		// should not reach here!
128 		fResolutionID = 0;
129 	}
130 
131 	if (msg->HasInt64(kJDXRes)) {
132 		int64 xres64;
133 		msg->FindInt64(kJDXRes, &xres64);
134 		fXRes = xres64;
135 	} else if (cap->isSupport(PrinterCap::kResolution)) {
136 		fXRes = ((const ResolutionCap *)cap->getDefaultCap(
137 			PrinterCap::kResolution))->fXResolution;
138 	} else {
139 		fXRes = 300;
140 	}
141 
142 	if (msg->HasInt64(kJDYRes)) {
143 		int64 yres64;
144 		msg->FindInt64(kJDYRes, &yres64);
145 		fYRes = yres64;
146 	} else if (cap->isSupport(PrinterCap::kResolution)) {
147 		fYRes = ((const ResolutionCap *)cap->getDefaultCap(
148 			PrinterCap::kResolution))->fYResolution;
149 	} else {
150 		fYRes = 300;
151 	}
152 
153 	if (msg->HasInt32(kJDOrientation))
154 		fOrientation = (Orientation)msg->FindInt32(kJDOrientation);
155 	else if (cap->isSupport(PrinterCap::kOrientation))
156 		fOrientation = ((const OrientationCap *)cap->getDefaultCap(
157 			PrinterCap::kOrientation))->fOrientation;
158 	else
159 		fOrientation = kPortrait;
160 
161 	if (msg->HasFloat(kJDScaling))
162 		fScaling = msg->FindFloat(kJDScaling);
163 	else
164 		fScaling = 100.0f;
165 
166 	if (msg->HasRect(kJDPaperRect)) {
167 		fPaperRect = msg->FindRect(kJDPaperRect);
168 	} else if (paperCap != NULL) {
169 		fPaperRect = paperCap->fPaperRect;
170 	}
171 
172 	if (msg->HasRect(kJDScaledPaperRect)) {
173 		fScaledPaperRect = msg->FindRect(kJDScaledPaperRect);
174 	} else {
175 		fScaledPaperRect = fPaperRect;
176 	}
177 
178 	if (msg->HasRect(kJDPrintableRect)) {
179 		fPrintableRect = msg->FindRect(kJDPrintableRect);
180 	} else if (paperCap != NULL) {
181 		fPrintableRect = paperCap->fPhysicalRect;
182 	}
183 
184 	if (msg->HasRect(kJDScaledPrintableRect)) {
185 		fScaledPrintableRect = msg->FindRect(kJDScaledPrintableRect);
186 	} else {
187 		fScaledPrintableRect = fPrintableRect;
188 	}
189 
190 	if (msg->HasRect(kJDPhysicalRect)) {
191 		fPhysicalRect = msg->FindRect(kJDPhysicalRect);
192 	} else if (paperCap != NULL) {
193 		fPhysicalRect = paperCap->fPhysicalRect;
194 	}
195 
196 	if (msg->HasRect(kJDScaledPhysicalRect)) {
197 		fScaledPhysicalRect = msg->FindRect(kJDScaledPhysicalRect);
198 	} else {
199 		fScaledPhysicalRect = fPhysicalRect;
200 	}
201 
202 	if (msg->HasInt32(kJDFirstPage))
203 		fFirstPage = msg->FindInt32(kJDFirstPage);
204 	else
205 		fFirstPage = 1;
206 
207 	if (msg->HasInt32(kJDLastPage))
208 		fLastPage = msg->FindInt32(kJDLastPage);
209 	else
210 		fLastPage = -1;
211 
212 	if (msg->HasInt32(kJDNup))
213 		fNup = msg->FindInt32(kJDNup);
214 	else
215 		fNup = 1;
216 
217 	if (msg->HasFloat(kJDGamma))
218 		fGamma = fMsg->FindFloat(kJDGamma);
219 	else
220 		fGamma = 0.25f;
221 
222 	if (msg->HasFloat(kJDInkDensity))
223 		fInkDensity = fMsg->FindFloat(kJDInkDensity);
224 	else
225 		fInkDensity = 0.0f;
226 
227 	if (msg->HasInt32(kJDPaperSource))
228 		fPaperSource = (PaperSource)fMsg->FindInt32(kJDPaperSource);
229 	else if (cap->isSupport(PrinterCap::kPaperSource))
230 		fPaperSource = ((const PaperSourceCap *)cap->getDefaultCap(
231 			PrinterCap::kPaperSource))->fPaperSource;
232 	else
233 		fPaperSource = kAuto;
234 
235 	if (msg->HasInt32(kJDCopies))
236 		fCopies = msg->FindInt32(kJDCopies);
237 	else
238 		fCopies = 1;
239 
240 	if (msg->HasBool(kJDCollate))
241 		fCollate = msg->FindBool(kJDCollate);
242 	else
243 		fCollate = false;
244 
245 	if (msg->HasBool(kJDReverse))
246 		fReverse = msg->FindBool(kJDReverse);
247 	else
248 		fReverse = false;
249 
250 	if (msg->HasInt32(kJDPrintStyle))
251 		fPrintStyle = (PrintStyle)msg->FindInt32(kJDPrintStyle);
252 	else if (cap->isSupport(PrinterCap::kPrintStyle))
253 		fPrintStyle = ((const PrintStyleCap *)cap->getDefaultCap(
254 			PrinterCap::kPrintStyle))->fPrintStyle;
255 	else
256 		fPrintStyle = kSimplex;
257 
258 	if (msg->HasInt32(kJDBindingLocation))
259 		fBindingLocation = (BindingLocation)msg->FindInt32(kJDBindingLocation);
260 	else if (cap->isSupport(PrinterCap::kBindingLocation))
261 		fBindingLocation = ((const BindingLocationCap *)cap->getDefaultCap(
262 			PrinterCap::kBindingLocation))->fBindingLocation;
263 	else
264 		fBindingLocation = kLongEdgeLeft;
265 
266 	if (msg->HasInt32(kJDPageOrder))
267 		fPageOrder = (PageOrder)msg->FindInt32(kJDPageOrder);
268 	else
269 		fPageOrder = kAcrossFromLeft;
270 
271 	if (msg->HasInt32(kJDColor))
272 		fColor = (Color)msg->FindInt32(kJDColor);
273 	else if (cap->isSupport(PrinterCap::kColor))
274 		fColor = ((const ColorCap *)cap->getDefaultCap(PrinterCap::kColor))
275 			->fColor;
276 	else
277 		fColor = kMonochrome;
278 
279 	if (msg->HasInt32(kJDDitherType))
280 		fDitherType = (Halftone::DitherType)msg->FindInt32(kJDDitherType);
281 	else
282 		fDitherType = Halftone::kTypeFloydSteinberg;
283 
284 	if (msg->HasInt32(kJDPageSelection))
285 		fPageSelection = (PageSelection)msg->FindInt32(kJDPageSelection);
286 	else
287 		fPageSelection = kAllPages;
288 
289 	if (msg->HasInt32(kJDMarginUnit))
290 		fMarginUnit = (MarginUnit)msg->FindInt32(kJDMarginUnit);
291 	else
292 		fMarginUnit = kUnitInch;
293 }
294 
295 
296 void
297 JobData::save(BMessage *msg)
298 {
299 	if (msg == NULL) {
300 		msg = fMsg;
301 	}
302 
303 	// page settings
304 	msg->RemoveName(kJDPaper);
305 	msg->AddInt32(kJDPaper, fPaper);
306 
307 	msg->RemoveName(kJDResolution);
308 	msg->AddInt32(kJDResolution, fResolutionID);
309 
310 	msg->RemoveName(kJDXRes);
311 	msg->AddInt64(kJDXRes, fXRes);
312 
313 	msg->RemoveName(kJDYRes);
314 	msg->AddInt64(kJDYRes, fYRes);
315 
316 	msg->RemoveName(kJDOrientation);
317 	msg->AddInt32(kJDOrientation, fOrientation);
318 
319 	msg->RemoveName(kJDScaling);
320 	msg->AddFloat(kJDScaling, fScaling);
321 
322 	msg->RemoveName(kJDPaperRect);
323 	msg->AddRect(kJDPaperRect, fPaperRect);
324 
325 	msg->RemoveName(kJDScaledPaperRect);
326 	msg->AddRect(kJDScaledPaperRect, fScaledPaperRect);
327 
328 	msg->RemoveName(kJDPrintableRect);
329 	msg->AddRect(kJDPrintableRect, fPrintableRect);
330 
331 	msg->RemoveName(kJDScaledPrintableRect);
332 	msg->AddRect(kJDScaledPrintableRect, fScaledPrintableRect);
333 
334 	msg->RemoveName(kJDPhysicalRect);
335 	msg->AddRect(kJDPhysicalRect, fPhysicalRect);
336 
337 	msg->RemoveName(kJDScaledPhysicalRect);
338 	msg->AddRect(kJDScaledPhysicalRect, fScaledPhysicalRect);
339 
340 	msg->RemoveName(kJDMarginUnit);
341 	msg->AddInt32(kJDMarginUnit, fMarginUnit);
342 
343 	// page settings end here
344 
345 	// job settings
346 
347 	// make sure job settings are not present in page settings
348 	msg->RemoveName(kJDShowPreview);
349 	if (fSettings == kJobSettings)
350 		msg->AddBool(kJDShowPreview, fShowPreview);
351 
352 	msg->RemoveName(kJDNup);
353 	if (fSettings == kJobSettings)
354 		msg->AddInt32(kJDNup, fNup);
355 
356 	msg->RemoveName(kJDFirstPage);
357 	if (fSettings == kJobSettings)
358 		msg->AddInt32(kJDFirstPage, fFirstPage);
359 
360 	msg->RemoveName(kJDLastPage);
361 	if (fSettings == kJobSettings)
362 		msg->AddInt32(kJDLastPage, fLastPage);
363 
364 	msg->RemoveName(kJDGamma);
365 	if (fSettings == kJobSettings)
366 		msg->AddFloat(kJDGamma, fGamma);
367 
368 	msg->RemoveName(kJDInkDensity);
369 	if (fSettings == kJobSettings)
370 		msg->AddFloat(kJDInkDensity, fInkDensity);
371 
372 	msg->RemoveName(kJDPaperSource);
373 	if (fSettings == kJobSettings)
374 		msg->AddInt32(kJDPaperSource, fPaperSource);
375 
376 	msg->RemoveName(kJDCopies);
377 	if (fSettings == kJobSettings)
378 		msg->AddInt32(kJDCopies, fCopies);
379 
380 	msg->RemoveName(kJDCollate);
381 	if (fSettings == kJobSettings)
382 		msg->AddBool(kJDCollate, fCollate);
383 
384 	msg->RemoveName(kJDReverse);
385 	if (fSettings == kJobSettings)
386 		msg->AddBool(kJDReverse, fReverse);
387 
388 	msg->RemoveName(kJDPrintStyle);
389 	if (fSettings == kJobSettings)
390 		msg->AddInt32(kJDPrintStyle, fPrintStyle);
391 
392 	msg->RemoveName(kJDBindingLocation);
393 	if (fSettings == kJobSettings)
394 		msg->AddInt32(kJDBindingLocation, fBindingLocation);
395 
396 	msg->RemoveName(kJDPageOrder);
397 	if (fSettings == kJobSettings)
398 		msg->AddInt32(kJDPageOrder, fPageOrder);
399 
400 	msg->RemoveName(kJDColor);
401 	if (fSettings == kJobSettings)
402 		msg->AddInt32(kJDColor, fColor);
403 
404 	msg->RemoveName(kJDDitherType);
405 	if (fSettings == kJobSettings)
406 		msg->AddInt32(kJDDitherType, fDitherType);
407 
408 	msg->RemoveName(kJDPageSelection);
409 	if (fSettings == kJobSettings)
410 		msg->AddInt32(kJDPageSelection, fPageSelection);
411 }
412