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:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user