From 69512fac34b4f9efc62cc2825c9edb525a069652 Mon Sep 17 00:00:00 2001 From: Michael Pfeiffer Date: Fri, 13 Feb 2004 23:46:07 +0000 Subject: [PATCH] Page and job setup dialogs remember latest settings. Simplified creation of a libprint printer driver. The printer add-on hook functions are implemented here. The libprint printer driver has to implement the function instantiate_printer_driver() where it creates an object of an inherited class from class PrinterDriver. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6577 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../drivers/shared/libprint/PrinterDriver.cpp | 224 ++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 src/add-ons/print/drivers/shared/libprint/PrinterDriver.cpp diff --git a/src/add-ons/print/drivers/shared/libprint/PrinterDriver.cpp b/src/add-ons/print/drivers/shared/libprint/PrinterDriver.cpp new file mode 100644 index 0000000000..a5f2fd7d5b --- /dev/null +++ b/src/add-ons/print/drivers/shared/libprint/PrinterDriver.cpp @@ -0,0 +1,224 @@ +/* + * PrinterDriver.cpp + * Copyright 1999-2000 Y.Takagi. All Rights Reserved. + * Copyright 2004 Michael Pfeiffer. + */ + +#include "PrinterDriver.h" + +#include // for attr_info +#include +#include +#include +#include +#include // for auto_ptr + +#include "BeUtils.h" +#include "AboutBox.h" +#include "DbgMsg.h" +#include "Exports.h" +#include "GraphicsDriver.h" +#include "PrinterCap.h" +#include "PrinterData.h" +#include "UIDriver.h" + + +// Implementation of PrinterDriver + +PrinterDriver::PrinterDriver(BNode* spoolFolder) + : fSpoolFolder(spoolFolder) + , fPrinterCap(NULL) + , fGraphicsDriver(NULL) +{ +} + +PrinterDriver::~PrinterDriver() +{ + delete fGraphicsDriver; + fGraphicsDriver = NULL; + + delete fPrinterCap; + fPrinterCap = NULL; +} + +void PrinterDriver::About() +{ + BString copyright; + copyright = "libprint Copyright © 1999-2000 Y.Takagi\n"; + copyright << GetCopyright(); + copyright << "All Rights Reserved."; + + AboutBox app(GetSignature(), GetDriverName(), GetVersion(), copyright.String()); + app.Run(); +} + +char* PrinterDriver::AddPrinter(char* printerName) +{ + DBGMSG((">%s: add_printer\n", GetDriverName())); + DBGMSG(("\tprinter_name: %s\n", printerName)); + DBGMSG(("<%s: add_printer\n", GetDriverName())); + return printerName; +} + +BMessage* PrinterDriver::ConfigPage(BMessage* settings) +{ + DBGMSG((">%s: config_page\n", GetDriverName())); + DUMP_BMESSAGE(settings); + DUMP_BNODE(fSpoolFolder); + + BMessage pageSettings(*settings); + MergeWithPreviousSettings(kAttrPageSettings, &pageSettings); + PrinterData printerData(fSpoolFolder); + fPrinterCap = InstantiatePrinterCap(&printerData); + UIDriver drv(&pageSettings, &printerData, fPrinterCap); + BMessage *result = drv.configPage(); + WriteSettings(kAttrPageSettings, result); + + DUMP_BMESSAGE(result); + DBGMSG(("<%s: config_page\n", GetDriverName())); + return result; +} + +BMessage* PrinterDriver::ConfigJob(BMessage* settings) +{ + DBGMSG((">%s: config_job\n", GetDriverName())); + DUMP_BMESSAGE(settings); + DUMP_BNODE(fSpoolFolder); + + BMessage jobSettings(*settings); + MergeWithPreviousSettings(kAttrJobSettings, &jobSettings); + PrinterData printerData(fSpoolFolder); + fPrinterCap = InstantiatePrinterCap(&printerData); + UIDriver drv(&jobSettings, &printerData, fPrinterCap); + BMessage *result = drv.configJob(); + WriteSettings(kAttrJobSettings, result); + + DUMP_BMESSAGE(result); + DBGMSG(("<%s: config_job\n", GetDriverName())); + return result; +} + +BMessage* PrinterDriver::TakeJob(BFile* printJob, BMessage* settings) +{ + DBGMSG((">%s: take_job\n", GetDriverName())); + DUMP_BMESSAGE(settings); + DUMP_BNODE(fSpoolFolder); + + PrinterData printerData(fSpoolFolder); + fPrinterCap = InstantiatePrinterCap(&printerData); + fGraphicsDriver = InstantiateGraphicsDriver(settings, &printerData, fPrinterCap); + BMessage *result = fGraphicsDriver->takeJob(printJob); + + DUMP_BMESSAGE(result); + DBGMSG(("<%s: take_job\n", GetDriverName())); + return result; +} + +// read settings from spool folder attribute +bool PrinterDriver::ReadSettings(const char* attrName, BMessage* settings) +{ + attr_info info; + char* data; + ssize_t size; + + settings->MakeEmpty(); + + if (fSpoolFolder->GetAttrInfo(attrName, &info) == B_OK && info.size > 0) { + data = new char[info.size]; + auto_ptr _data(data); + size = fSpoolFolder->ReadAttr(attrName, B_MESSAGE_TYPE, 0, data, info.size); + if (size == info.size && settings->Unflatten(data) == B_OK) { + return true; + } + } + return false; +} + +// write settings to spool folder attribute +void PrinterDriver::WriteSettings(const char* attrName, BMessage* settings) +{ + if (settings == NULL || settings->what != 'okok') return; + + size_t size; + char* data; + + size = settings->FlattenedSize(); + data = new char[size]; + auto_ptr _data(data); + + if (data != NULL && settings->Flatten(data, size) == B_OK) { + fSpoolFolder->WriteAttr(attrName, B_MESSAGE_TYPE, 0, data, size); + } +} + +// read settings from spool folder attribute and merge them to current settings +void PrinterDriver::MergeWithPreviousSettings(const char* attrName, BMessage* settings) +{ + if (settings == NULL) return; + + BMessage stored; + if (ReadSettings(attrName, &stored)) { + AddFields(&stored, settings); + *settings = stored; + } +} + +// Implementation of PrinterDriverInstance + +class PrinterDriverInstance +{ +public: + PrinterDriverInstance(BNode* spoolFolder = NULL); + ~PrinterDriverInstance(); + PrinterDriver* GetPrinterDriver() { return fInstance; } + +private: + PrinterDriver* fInstance; +}; + +PrinterDriverInstance::PrinterDriverInstance(BNode* spoolFolder) +{ + fInstance = instantiate_printer_driver(spoolFolder); +} + +PrinterDriverInstance::~PrinterDriverInstance() +{ + delete fInstance; + fInstance = NULL; +} + + +// printer driver add-on functions + +char *add_printer(char *printerName) +{ + PrinterDriverInstance instance; + return instance.GetPrinterDriver()->AddPrinter(printerName); +} + +BMessage *config_page(BNode *spoolFolder, BMessage *settings) +{ + PrinterDriverInstance instance(spoolFolder); + return instance.GetPrinterDriver()->ConfigPage(settings); +} + +BMessage *config_job(BNode *spoolFolder, BMessage *settings) +{ + PrinterDriverInstance instance(spoolFolder); + return instance.GetPrinterDriver()->ConfigJob(settings); +} + +BMessage *take_job(BFile *printJob, BNode *spoolFolder, BMessage *settings) +{ + PrinterDriverInstance instance(spoolFolder); + return instance.GetPrinterDriver()->TakeJob(printJob, settings); +} + +// main entry if printer driver is launched directly + +int main(int argc, char* argv[]) +{ + PrinterDriverInstance instance; + instance.GetPrinterDriver()->About(); + return 0; +}