From 2c0d45d7c12f8bc55c3c57471595641e6794115c Mon Sep 17 00:00:00 2001 From: Michael Pfeiffer Date: Sun, 28 Jul 2002 17:05:03 +0000 Subject: [PATCH] Async. start Page/Printer Config Dialog. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@499 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/print/Jamfile | 22 +++- src/servers/print/PrintServerApp.R5.cpp | 124 +++++++++++++----- .../print/PrintServerApp.Scripting.cpp | 2 +- src/servers/print/PrintServerApp.h | 2 + src/servers/print/Printer.cpp | 14 +- src/servers/print/Printer.h | 7 +- 6 files changed, 128 insertions(+), 43 deletions(-) diff --git a/src/servers/print/Jamfile b/src/servers/print/Jamfile index bf6c8f30ff..bc363dd7d4 100644 --- a/src/servers/print/Jamfile +++ b/src/servers/print/Jamfile @@ -3,14 +3,26 @@ SubDir OBOS_TOP src servers print ; UsePrivateHeaders interface ; UsePrivateHeaders shared ; -AddResources print_server : PrintServer.FileTypes.rsrc ; - -Server print_server : +Server + print_server + : PrintServerApp.cpp PrintServerApp.R5.cpp PrintServerApp.Scripting.cpp Printer.Scripting.cpp Printer.cpp BeUtils.cpp -; -LinkSharedOSLibs print_server : be root ; + ; + +LinkSharedOSLibs + print_server + : + be + root + ; + +XRes + print_server + : + PrintServer.FileTypes.rsrc + ; \ No newline at end of file diff --git a/src/servers/print/PrintServerApp.R5.cpp b/src/servers/print/PrintServerApp.R5.cpp index ba31463e77..b8029a0e65 100644 --- a/src/servers/print/PrintServerApp.R5.cpp +++ b/src/servers/print/PrintServerApp.R5.cpp @@ -47,8 +47,94 @@ #include #include + // TODO: + // Somehow block application that wants to show page/printer config dialog + // Handle situation where there are pending print jobs but printer is requested for deletion + +struct AsyncThreadParams { + Printer* printer; + BMessage message; + + AsyncThreadParams(Printer* p, BMessage* m) + : printer(p) + , message(*m) + { } +}; + +status_t PrintServerApp::async_thread(void* data) +{ + AsyncThreadParams* p = (AsyncThreadParams*)data; + + Printer* printer = p->printer; + BMessage* msg = &p->message; + + switch (msg->what) { + // Handle showing the page config dialog + case PSRV_SHOW_PAGE_SETUP: { + if (printer != NULL) { + BMessage reply(*msg); + if (printer->ConfigurePage(reply) == B_OK) { + msg->SendReply(&reply); + break; + } + } + else { + // If no default printer, give user choice of aborting or setting up a printer + BAlert* alert = new BAlert("Info", "Hang on there! You don't have any printers set up!\nYou'll need to do that before trying to print\n\nWould you like to set up a printer now?", "No thanks", "Sure!"); + if (alert->Go() == 1) { + run_add_printer_panel(); + } + + } + // Always stop dialog flow + BMessage reply('stop'); + msg->SendReply(&reply); + } + break; + + // Handle showing the print config dialog + case PSRV_SHOW_PRINT_SETUP: { + if (printer != NULL) { + BMessage reply(*msg); + if (printer->ConfigureJob(reply) == B_OK) { + msg->SendReply(&reply); + break; + } + } + BMessage reply('stop'); + msg->SendReply(&reply); + } + break; + + } + + if (printer) printer->Release(); + delete p; +} + + +// Async. processing of received message +void PrintServerApp::AsyncHandleMessage(BMessage* msg) +{ + AsyncThreadParams* data = new AsyncThreadParams(fDefaultPrinter, msg); + + thread_id tid = spawn_thread(async_thread, "async", B_NORMAL_PRIORITY, (void*)data); + + if (tid > 0) { + if (fDefaultPrinter) fDefaultPrinter->Acquire(); + resume_thread(tid); + } else { + delete data; + } +} + + void PrintServerApp::Handle_BeOSR5_Message(BMessage* msg) { + printf("PrintServerApp::Handle_BeOSR5_Message\n"); + msg->PrintToStream(); + fflush(stdout); + switch(msg->what) { // Get currently selected printer case PSRV_GET_ACTIVE_PRINTER: { @@ -98,41 +184,9 @@ void PrintServerApp::Handle_BeOSR5_Message(BMessage* msg) } break; - // Handle showing the page config dialog - case PSRV_SHOW_PAGE_SETUP: { - if (fDefaultPrinter != NULL) { - BMessage reply(*msg); - if (fDefaultPrinter->ConfigurePage(reply) == B_OK) { - msg->SendReply(&reply); - } - } - else { - // If no default printer, give user choice of aborting or setting up a printer - BAlert* alert = new BAlert("Info", "Hang on there! You don't have any printers set up!\nYou'll need to do that before trying to print\n\nWould you like to set up a printer now?", "No thanks", "Sure!"); - if (alert->Go() == 1) { - run_add_printer_panel(); - } - - // Always stop dialog flow - BMessage reply('stop'); - msg->SendReply(&reply); - } - } - break; - - // Handle showing the print config dialog - case PSRV_SHOW_PRINT_SETUP: { - if (fDefaultPrinter != NULL) { - BMessage reply(*msg); - if (fDefaultPrinter->ConfigureJob(reply) == B_OK) { - msg->SendReply(&reply); - } - } - else { - BMessage reply('stop'); - msg->SendReply(&reply); - } - } + case PSRV_SHOW_PAGE_SETUP: + case PSRV_SHOW_PRINT_SETUP: + AsyncHandleMessage(msg); break; // Tell printer addon to print a spooled job diff --git a/src/servers/print/PrintServerApp.Scripting.cpp b/src/servers/print/PrintServerApp.Scripting.cpp index abd32c8759..33d9cb25d9 100644 --- a/src/servers/print/PrintServerApp.Scripting.cpp +++ b/src/servers/print/PrintServerApp.Scripting.cpp @@ -107,7 +107,7 @@ PrintServerApp::HandleScriptingCommand(BMessage* msg) status_t rc = B_BAD_VALUE; if (printer != NULL && (rc=printer->Remove()) == B_OK) { - delete printer; + printer->Release(); } BMessage reply(B_REPLY); diff --git a/src/servers/print/PrintServerApp.h b/src/servers/print/PrintServerApp.h index 2de5b1d7b6..f2b8e874a3 100644 --- a/src/servers/print/PrintServerApp.h +++ b/src/servers/print/PrintServerApp.h @@ -82,6 +82,8 @@ private: BBitmap fSelectedIconLarge; // "Classic" BeOS R5 support, see PrintServerApp.R5.cpp + static status_t async_thread(void* data); + void AsyncHandleMessage(BMessage* msg); void Handle_BeOSR5_Message(BMessage* msg); }; diff --git a/src/servers/print/Printer.cpp b/src/servers/print/Printer.cpp index 5fc308ef24..9598a444dd 100644 --- a/src/servers/print/Printer.cpp +++ b/src/servers/print/Printer.cpp @@ -108,7 +108,8 @@ Printer* Printer::At(int32 idx) // --------------------------------------------------------------- Printer::Printer(const BNode* node) : Inherited(B_EMPTY_STRING), - fNode(*node) + fNode(*node), + fRefCount(1) { // Set our name to the name of the passed node BString name; @@ -126,6 +127,17 @@ Printer::~Printer() be_app->RemoveHandler(this); } +void Printer::Acquire() +{ + fRefCount ++; +} + +void Printer::Release() +{ + fRefCount --; + if (fRefCount == 0) delete this; +} + status_t Printer::Remove() { status_t rc = B_OK; diff --git a/src/servers/print/Printer.h b/src/servers/print/Printer.h index f92a8595c0..18f5a33361 100644 --- a/src/servers/print/Printer.h +++ b/src/servers/print/Printer.h @@ -61,10 +61,14 @@ class Printer; class Printer : public BHandler { typedef BHandler Inherited; + public: Printer(const BNode* node); ~Printer(); - + + void Acquire(); + void Release(); + // Static helper functions static Printer* Find(const BString& name); static Printer* At(int32 idx); @@ -87,6 +91,7 @@ private: status_t LoadPrinterAddon(image_id& id); BNode fNode; + int32 fRefCount; static BObjectList sPrinters; };