⛏️ index : haiku.git

/*
 * Copyright 2010 Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Michael Pfeiffer
 */
#include "PrintAddOnServerApplication.h"

#include <PrinterDriverAddOn.h>

#include <String.h>

PrintAddOnServerApplication::PrintAddOnServerApplication(const char* signature)
	:
	BApplication(signature)
{

}


void
PrintAddOnServerApplication::MessageReceived(BMessage* message)
{
	switch (message->what) {
		case kMessageAddPrinter:
			AddPrinter(message);
			break;

		case kMessageConfigPage:
			ConfigPage(message);
			break;

		case kMessageConfigJob:
			ConfigJob(message);
			break;

		case kMessageDefaultSettings:
			DefaultSettings(message);
			break;

		case kMessageTakeJob:
			TakeJob(message);
			break;

		default:
			BApplication::MessageReceived(message);
	}
}


void
PrintAddOnServerApplication::AddPrinter(BMessage* message)
{
	BString driver;
	BString name;
	if (message->FindString(kPrinterDriverAttribute, &driver) != B_OK
			|| message->FindString(kPrinterNameAttribute, &name) != B_OK) {
		SendReply(message, B_BAD_VALUE);
		return;
	}

	status_t status = AddPrinter(driver.String(), name.String());
	SendReply(message, status);
}


status_t
PrintAddOnServerApplication::AddPrinter(const char* driver,
	const char* spoolFolderName)
{
	PrinterDriverAddOn addOn(driver);
	return addOn.AddPrinter(spoolFolderName);
}


void
PrintAddOnServerApplication::ConfigPage(BMessage* message)
{
	BString driver;
	BString folder;
	BMessage settings;
	if (message->FindString(kPrinterDriverAttribute, &driver) != B_OK
		|| message->FindString(kPrinterFolderAttribute, &folder) != B_OK
		|| message->FindMessage(kPrintSettingsAttribute, &settings) != B_OK) {
		SendReply(message, B_BAD_VALUE);
		return;
	}

	BDirectory spoolFolder(folder.String());
	status_t status = ConfigPage(driver.String(), &spoolFolder, &settings);

	if (status != B_OK)
		SendReply(message, status);
	else {
		BMessage reply(B_REPLY);
		reply.AddMessage(kPrintSettingsAttribute, &settings);
		SendReply(message, &reply);
	}
}


status_t
PrintAddOnServerApplication::ConfigPage(const char* driver,
	BDirectory* spoolFolder, BMessage* settings)
{
	PrinterDriverAddOn addOn(driver);
	return addOn.ConfigPage(spoolFolder, settings);
}


void
PrintAddOnServerApplication::ConfigJob(BMessage* message)
{
	BString driver;
	BString folder;
	BMessage settings;
	if (message->FindString(kPrinterDriverAttribute, &driver) != B_OK
		|| message->FindString(kPrinterFolderAttribute, &folder) != B_OK
		|| message->FindMessage(kPrintSettingsAttribute, &settings) != B_OK) {
		SendReply(message, B_BAD_VALUE);
		return;
	}

	BDirectory spoolFolder(folder.String());
	status_t status = ConfigJob(driver.String(), &spoolFolder, &settings);

	if (status != B_OK)
		SendReply(message, status);
	else {
		BMessage reply(B_REPLY);
		reply.AddMessage(kPrintSettingsAttribute, &settings);
		SendReply(message, &reply);
	}
}


status_t
PrintAddOnServerApplication::ConfigJob(const char* driver,
				BDirectory* spoolFolder,
				BMessage* settings)
{
	PrinterDriverAddOn addOn(driver);
	return addOn.ConfigJob(spoolFolder, settings);
}


void
PrintAddOnServerApplication::DefaultSettings(BMessage* message)
{
	BString driver;
	BString folder;
	if (message->FindString(kPrinterDriverAttribute, &driver) != B_OK
		|| message->FindString(kPrinterFolderAttribute, &folder) != B_OK) {
		SendReply(message, B_BAD_VALUE);
		return;
	}

	BMessage settings;
	BDirectory spoolFolder(folder.String());
	status_t status = DefaultSettings(driver.String(), &spoolFolder, &settings);

	if (status != B_OK)
		SendReply(message, status);
	else {
		BMessage reply(B_REPLY);
		reply.AddMessage(kPrintSettingsAttribute, &settings);
		SendReply(message, &reply);
	}
}


status_t
PrintAddOnServerApplication::DefaultSettings(const char* driver,
	BDirectory* spoolFolder, BMessage* settings)
{
	PrinterDriverAddOn addOn(driver);
	return addOn.DefaultSettings(spoolFolder, settings);
}


void
PrintAddOnServerApplication::TakeJob(BMessage* message)
{
	BString driver;
	BString folder;
	BString jobFile;
	if (message->FindString(kPrinterDriverAttribute, &driver) != B_OK
		|| message->FindString(kPrinterFolderAttribute, &folder) != B_OK
		|| message->FindString(kPrintJobFileAttribute, &jobFile) != B_OK) {
		SendReply(message, B_BAD_VALUE);
		return;
	}

	BDirectory spoolFolder(folder.String());
	status_t status = TakeJob(driver.String(), jobFile.String(),
		&spoolFolder);
	SendReply(message, status);
}


status_t
PrintAddOnServerApplication::TakeJob(const char* driver, const char* spoolFile,
				BDirectory* spoolFolder)
{
	PrinterDriverAddOn addOn(driver);
	return addOn.TakeJob(spoolFile, spoolFolder);
}


void
PrintAddOnServerApplication::SendReply(BMessage* message, status_t status)
{
	BMessage reply(B_REPLY);
	reply.AddInt32(kPrintAddOnServerStatusAttribute, status);
	message->SendReply(&reply);
}


void
PrintAddOnServerApplication::SendReply(BMessage* message, BMessage* reply)
{
	reply->AddInt32(kPrintAddOnServerStatusAttribute, B_OK);
	message->SendReply(reply);
}


int
main(int argc, char* argv[])
{
	PrintAddOnServerApplication application(
		kPrintAddOnServerApplicationSignature);
	application.Run();
}