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