root/src/servers/print_addon/PrintAddOnServerApplication.cpp
/*
 * 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();
}