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 28 PrinterDriver::PrinterDriver(BNode* printerNode) 29 : fPrinting(false) 30 , fJobFile(NULL) 31 , fPrinterNode(printerNode) 32 { 33 } 34 35 36 PrinterDriver::~PrinterDriver() 37 { 38 } 39 40 41 status_t 42 PrinterDriver::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 104 void 105 PrinterDriver::StopPrinting() 106 { 107 fPrinting = false; 108 } 109 110 111 status_t 112 PrinterDriver::BeginJob() 113 { 114 return B_OK; 115 } 116 117 118 status_t 119 PrinterDriver::PrintPage(int32 pageNumber, int32 pageCount) 120 { 121 return B_OK; 122 } 123 124 125 status_t 126 PrinterDriver::EndJob() 127 { 128 return B_OK; 129 } 130 131 132 BlockingWindow* 133 PrinterDriver::NewPageSetupWindow(BMessage *setupMsg, const char *printerName) 134 { 135 return new PageSetupWindow(setupMsg, printerName); 136 } 137 138 139 BlockingWindow* 140 PrinterDriver::NewJobSetupWindow(BMessage *jobMsg, const char *printerName) 141 { 142 return new JobSetupWindow(jobMsg, printerName); 143 } 144 145 146 status_t 147 PrinterDriver::PageSetup(BMessage *setupMsg, const char *printerName) 148 { 149 BlockingWindow* w = NewPageSetupWindow(setupMsg, printerName); 150 return w->Go(); 151 } 152 153 154 status_t 155 PrinterDriver::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 177 BMessage* 178 PrinterDriver::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