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