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
This commit is contained in:
Michael Pfeiffer
2004-02-13 23:46:07 +00:00
parent 370f27ad77
commit 69512fac34
@@ -0,0 +1,224 @@
/*
* PrinterDriver.cpp
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
* Copyright 2004 Michael Pfeiffer.
*/
#include "PrinterDriver.h"
#include <fs_attr.h> // for attr_info
#include <File.h>
#include <Message.h>
#include <Node.h>
#include <String.h>
#include <memory> // 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<char> _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<char> _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;
}