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