#include "PrintTransport.h"
#include <Directory.h>
#include <File.h>
#include <FindDirectory.h>
#include <Path.h>
#include <String.h>
PrintTransport::PrintTransport()
: fDataIO(NULL)
, fAddOnID(-1)
, fExitProc(NULL)
{
}
PrintTransport::~PrintTransport()
{
if (fExitProc) {
(*fExitProc)();
fExitProc = NULL;
}
if (fAddOnID >= 0) {
unload_add_on(fAddOnID);
fAddOnID = -1;
}
}
status_t PrintTransport::Open(BNode* printerFolder)
{
if (fDataIO != NULL) {
return B_ERROR;
}
BString transportName;
if (printerFolder->ReadAttrString("transport", &transportName) != B_OK) {
return B_ERROR;
}
const directory_which paths[] = {
B_USER_NONPACKAGED_ADDONS_DIRECTORY,
B_USER_ADDONS_DIRECTORY,
B_SYSTEM_NONPACKAGED_ADDONS_DIRECTORY,
B_SYSTEM_ADDONS_DIRECTORY,
};
BPath path;
for (uint32 i = 0; i < sizeof(paths) / sizeof(paths[0]); ++i) {
if (find_directory(paths[i], &path) != B_OK)
continue;
path.Append("Print/transport");
path.Append(transportName.String());
fAddOnID = load_add_on(path.Path());
if (fAddOnID >= 0)
break;
}
if (fAddOnID < 0) {
return B_ERROR;
}
BDataIO* (*initProc)(BMessage*);
get_image_symbol(fAddOnID, "init_transport", B_SYMBOL_TYPE_TEXT, (void **) &initProc);
get_image_symbol(fAddOnID, "exit_transport", B_SYMBOL_TYPE_TEXT, (void **) &fExitProc);
if (initProc == NULL || fExitProc == NULL) {
return B_ERROR;
}
node_ref ref;
BDirectory dir;
printerFolder->GetNodeRef(&ref);
dir.SetTo(&ref);
if (path.SetTo(&dir, NULL) != B_OK) {
return B_ERROR;
}
BMessage input('TRIN');
input.AddString("printer_file", path.Path());
fDataIO = (*initProc)(&input);
return B_OK;
}
BDataIO*
PrintTransport::GetDataIO()
{
return fDataIO;
}
bool PrintTransport::IsPrintToFileCanceled() const
{
BFile* file = dynamic_cast<BFile*>(fDataIO);
return fDataIO == NULL || (file != NULL && file->InitCheck() != B_OK);
}