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