1/* 2 * Copyright 2003-2008, Haiku. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Philippe Houdoin 7 * Simon Gauvin 8 * Michael Pfeiffer 9 * Dr. Hartmut Reh 10 */ 11 12#include "PrinterDriver.h" 13 14#include "JobSetupWindow.h" 15#include "PageSetupWindow.h" 16#include "PrintJobReader.h" 17 18 19#include <File.h> 20#include <Node.h> 21#include <Message.h> 22#include <PrintJob.h> 23 24 25#include <stdio.h> 26 27 28PrinterDriver::PrinterDriver(BNode* printerNode) 29 : fPrinting(false) 30 , fJobFile(NULL) 31 , fPrinterNode(printerNode) 32{ 33} 34 35 36PrinterDriver::~PrinterDriver() 37{ 38} 39 40 41status_t 42PrinterDriver::PrintJob(BFile *spoolFile, BMessage *jobMsg) 43{ 44 if (!spoolFile || !fPrinterNode) 45 return B_ERROR; 46 47 fJobFile = spoolFile; 48 print_file_header pfh; 49 50 // read print file header 51 fJobFile->Seek(0, SEEK_SET); 52 fJobFile->Read(&pfh, sizeof(pfh)); 53 54 // read job message 55 BMessage msg; 56 msg.Unflatten(fJobFile); 57 58 BeginJob(); 59 fPrinting = true; 60 61 printf("PrinterDriver::PrintJob, print massage read from spool file\n"); 62 jobMsg->PrintToStream(); 63 64 printf("\nPrinterDriver::PrintJob, print massage passed to print job\n"); 65 msg.PrintToStream(); 66 printf("\n"); 67 68 for (int32 page = 1; page <= pfh.page_count; ++page) { 69 printf("PrinterDriver::PrintPage(): Faking print of page %" B_PRId32 70 "/ %" B_PRId32 "\n", page, pfh.page_count); 71 } 72 73 fJobFile->Seek(0, SEEK_SET); 74 PrintJobReader reader(fJobFile); 75 76 status_t status = reader.InitCheck(); 77 printf("\nPrintJobReader::InitCheck(): %s\n", status == B_OK ? "B_OK" : "B_ERROR"); 78 printf("PrintJobReader::NumberOfPages(): %" B_PRId32 "\n", 79 reader.NumberOfPages()); 80 printf("PrintJobReader::FirstPage(): %" B_PRId32 "\n", reader.FirstPage()); 81 printf("PrintJobReader::LastPage(): %" B_PRId32 "\n", reader.LastPage()); 82 83 BRect rect = reader.PaperRect(); 84 printf("PrintJobReader::PaperRect(): BRect(l:%.1f, t:%.1f, r:%.1f, b:%.1f)\n", 85 rect.left, rect.top, rect.right, rect.bottom); 86 87 rect = reader.PrintableRect(); 88 printf("PrintJobReader::PrintableRect(): BRect(l:%.1f, t:%.1f, r:%.1f, b:%.1f)\n", 89 rect.left, rect.top, rect.right, rect.bottom); 90 91 int32 xdpi, ydpi; 92 reader.GetResolution(&xdpi, &ydpi); 93 printf("PrintJobReader::GetResolution(): xdpi:%" B_PRId32 ", ydpi:%" 94 B_PRId32 "\n", xdpi, ydpi); 95 printf("PrintJobReader::GetScale(): %.1f\n", reader.GetScale()); 96 97 fPrinting = false; 98 EndJob(); 99 100 return status; 101} 102 103 104void 105PrinterDriver::StopPrinting() 106{ 107 fPrinting = false; 108} 109 110 111status_t 112PrinterDriver::BeginJob() 113{ 114 return B_OK; 115} 116 117 118status_t 119PrinterDriver::PrintPage(int32 pageNumber, int32 pageCount) 120{ 121 return B_OK; 122} 123 124 125status_t 126PrinterDriver::EndJob() 127{ 128 return B_OK; 129} 130 131 132BlockingWindow* 133PrinterDriver::NewPageSetupWindow(BMessage *setupMsg, const char *printerName) 134{ 135 return new PageSetupWindow(setupMsg, printerName); 136} 137 138 139BlockingWindow* 140PrinterDriver::NewJobSetupWindow(BMessage *jobMsg, const char *printerName) 141{ 142 return new JobSetupWindow(jobMsg, printerName); 143} 144 145 146status_t 147PrinterDriver::PageSetup(BMessage *setupMsg, const char *printerName) 148{ 149 BlockingWindow* w = NewPageSetupWindow(setupMsg, printerName); 150 return w->Go(); 151} 152 153 154status_t 155PrinterDriver::JobSetup(BMessage *jobMsg, const char *printerName) 156{ 157 // set default value if property not set 158 if (!jobMsg->HasInt32("copies")) 159 jobMsg->AddInt32("copies", 1); 160 161 if (!jobMsg->HasInt32("first_page")) 162 jobMsg->AddInt32("first_page", 1); 163 164 if (!jobMsg->HasInt32("last_page")) 165 jobMsg->AddInt32("last_page", INT32_MAX); 166 167 BlockingWindow* w = NewJobSetupWindow(jobMsg, printerName); 168 return w->Go(); 169} 170 171 172/* copied from PDFlib.h: */ 173#define letter_width (float) 612.0 174#define letter_height (float) 792.0 175 176 177BMessage* 178PrinterDriver::GetDefaultSettings() 179{ 180 BMessage* msg = new BMessage(); 181 BRect paperRect(0, 0, letter_width, letter_height); 182 BRect printableRect(paperRect); 183 printableRect.InsetBy(10, 10); 184 msg->AddRect("paper_rect", paperRect); 185 msg->AddRect("printable_rect", printableRect); 186 msg->AddInt32("orientation", 0); 187 msg->AddInt32("xres", 300); 188 msg->AddInt32("yres", 300); 189 return msg; 190} 191