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