14b8a7115SIngo Weinhold // Registrar.cpp 24b8a7115SIngo Weinhold 34b8a7115SIngo Weinhold #include "Debug.h" 44b8a7115SIngo Weinhold 54b8a7115SIngo Weinhold #include <Application.h> 64b8a7115SIngo Weinhold #include <Message.h> 74b8a7115SIngo Weinhold #include <OS.h> 84b8a7115SIngo Weinhold #include <RegistrarDefs.h> 94b8a7115SIngo Weinhold 104b8a7115SIngo Weinhold #include "ClipboardHandler.h" 11*44c3726bSIngo Weinhold #include "EventQueue.h" 12*44c3726bSIngo Weinhold #include "MessageRunnerManager.h" 134b8a7115SIngo Weinhold #include "MIMEManager.h" 144b8a7115SIngo Weinhold #include "Registrar.h" 1551d6b22eSIngo Weinhold #include "TRoster.h" 164b8a7115SIngo Weinhold 17*44c3726bSIngo Weinhold static const char *kEventQueueName = "timer_thread"; 18*44c3726bSIngo Weinhold 192ad75c74SIngo Weinhold /*! 202ad75c74SIngo Weinhold \class Registrar 212ad75c74SIngo Weinhold \brief The application class of the registrar. 222ad75c74SIngo Weinhold 232ad75c74SIngo Weinhold Glues the registrar services together and dispatches the roster messages. 242ad75c74SIngo Weinhold */ 252ad75c74SIngo Weinhold 264b8a7115SIngo Weinhold // constructor 272ad75c74SIngo Weinhold /*! \brief Creates the registrar application class. 282ad75c74SIngo Weinhold */ 294b8a7115SIngo Weinhold Registrar::Registrar() 304b8a7115SIngo Weinhold : BApplication(kRegistrarSignature), 3151d6b22eSIngo Weinhold fRoster(NULL), 324b8a7115SIngo Weinhold fClipboardHandler(NULL), 33*44c3726bSIngo Weinhold fMIMEManager(NULL), 34*44c3726bSIngo Weinhold fEventQueue(NULL), 35*44c3726bSIngo Weinhold fMessageRunnerManager(NULL) 364b8a7115SIngo Weinhold { 374b8a7115SIngo Weinhold FUNCTION_START(); 384b8a7115SIngo Weinhold } 394b8a7115SIngo Weinhold 404b8a7115SIngo Weinhold // destructor 412ad75c74SIngo Weinhold /*! \brief Frees all resources associated with the registrar. 422ad75c74SIngo Weinhold 432ad75c74SIngo Weinhold All registrar services, that haven't been shut down earlier, are 442ad75c74SIngo Weinhold terminated. 452ad75c74SIngo Weinhold */ 464b8a7115SIngo Weinhold Registrar::~Registrar() 474b8a7115SIngo Weinhold { 484b8a7115SIngo Weinhold FUNCTION_START(); 4960aa4feaSIngo Weinhold Lock(); 50*44c3726bSIngo Weinhold fEventQueue->Die(); 51*44c3726bSIngo Weinhold delete fMessageRunnerManager; 52*44c3726bSIngo Weinhold delete fEventQueue; 534b8a7115SIngo Weinhold fMIMEManager->Lock(); 544b8a7115SIngo Weinhold fMIMEManager->Quit(); 554b8a7115SIngo Weinhold RemoveHandler(fClipboardHandler); 564b8a7115SIngo Weinhold delete fClipboardHandler; 5751d6b22eSIngo Weinhold delete fRoster; 58c39e4532SIngo Weinhold FUNCTION_END(); 594b8a7115SIngo Weinhold } 604b8a7115SIngo Weinhold 614b8a7115SIngo Weinhold // MessageReceived 622ad75c74SIngo Weinhold /*! \brief Overrides the super class version to dispatch roster specific 632ad75c74SIngo Weinhold messages. 642ad75c74SIngo Weinhold \param message The message to be handled 652ad75c74SIngo Weinhold */ 664b8a7115SIngo Weinhold void 674b8a7115SIngo Weinhold Registrar::MessageReceived(BMessage *message) 684b8a7115SIngo Weinhold { 694b8a7115SIngo Weinhold FUNCTION_START(); 704b8a7115SIngo Weinhold switch (message->what) { 71*44c3726bSIngo Weinhold // general requests 724b8a7115SIngo Weinhold case B_REG_GET_MIME_MESSENGER: 734b8a7115SIngo Weinhold { 744b8a7115SIngo Weinhold PRINT(("B_REG_GET_MIME_MESSENGER\n")); 754b8a7115SIngo Weinhold BMessenger messenger(NULL, fMIMEManager); 764b8a7115SIngo Weinhold BMessage reply(B_REG_SUCCESS); 774b8a7115SIngo Weinhold reply.AddMessenger("messenger", messenger); 784b8a7115SIngo Weinhold message->SendReply(&reply); 794b8a7115SIngo Weinhold break; 804b8a7115SIngo Weinhold } 814b8a7115SIngo Weinhold case B_REG_GET_CLIPBOARD_MESSENGER: 824b8a7115SIngo Weinhold { 834b8a7115SIngo Weinhold PRINT(("B_REG_GET_CLIPBOARD_MESSENGER\n")); 844b8a7115SIngo Weinhold BMessenger messenger(fClipboardHandler); 854b8a7115SIngo Weinhold BMessage reply(B_REG_SUCCESS); 864b8a7115SIngo Weinhold reply.AddMessenger("messenger", messenger); 874b8a7115SIngo Weinhold message->SendReply(&reply); 884b8a7115SIngo Weinhold break; 894b8a7115SIngo Weinhold } 90*44c3726bSIngo Weinhold // roster requests 9151d6b22eSIngo Weinhold case B_REG_ADD_APP: 9251d6b22eSIngo Weinhold fRoster->HandleAddApplication(message); 9351d6b22eSIngo Weinhold break; 9451d6b22eSIngo Weinhold case B_REG_COMPLETE_REGISTRATION: 9551d6b22eSIngo Weinhold fRoster->HandleCompleteRegistration(message); 9651d6b22eSIngo Weinhold break; 972e042baaSIngo Weinhold case B_REG_IS_APP_PRE_REGISTERED: 9851d6b22eSIngo Weinhold fRoster->HandleIsAppPreRegistered(message); 9951d6b22eSIngo Weinhold break; 10051d6b22eSIngo Weinhold case B_REG_REMOVE_PRE_REGISTERED_APP: 10151d6b22eSIngo Weinhold fRoster->HandleRemovePreRegApp(message); 10251d6b22eSIngo Weinhold break; 10351d6b22eSIngo Weinhold case B_REG_REMOVE_APP: 10451d6b22eSIngo Weinhold fRoster->HandleRemoveApp(message); 10551d6b22eSIngo Weinhold break; 106c39e4532SIngo Weinhold case B_REG_SET_THREAD_AND_TEAM: 107c39e4532SIngo Weinhold fRoster->HandleSetThreadAndTeam(message); 108c39e4532SIngo Weinhold break; 109af8eec40SIngo Weinhold case B_REG_SET_SIGNATURE: 110af8eec40SIngo Weinhold fRoster->HandleSetSignature(message); 111af8eec40SIngo Weinhold break; 1122e042baaSIngo Weinhold case B_REG_GET_APP_INFO: 1132e042baaSIngo Weinhold fRoster->HandleGetAppInfo(message); 1142e042baaSIngo Weinhold break; 1152e042baaSIngo Weinhold case B_REG_GET_APP_LIST: 1162e042baaSIngo Weinhold fRoster->HandleGetAppList(message); 1172e042baaSIngo Weinhold break; 1182e042baaSIngo Weinhold case B_REG_ACTIVATE_APP: 1192e042baaSIngo Weinhold fRoster->HandleActivateApp(message); 120c39e4532SIngo Weinhold break; 121*44c3726bSIngo Weinhold // message runner requests 122*44c3726bSIngo Weinhold case B_REG_REGISTER_MESSAGE_RUNNER: 123*44c3726bSIngo Weinhold fMessageRunnerManager->HandleRegisterRunner(message); 124*44c3726bSIngo Weinhold break; 125*44c3726bSIngo Weinhold case B_REG_UNREGISTER_MESSAGE_RUNNER: 126*44c3726bSIngo Weinhold fMessageRunnerManager->HandleUnregisterRunner(message); 127*44c3726bSIngo Weinhold break; 128*44c3726bSIngo Weinhold case B_REG_SET_MESSAGE_RUNNER_PARAMS: 129*44c3726bSIngo Weinhold fMessageRunnerManager->HandleSetRunnerParams(message); 130*44c3726bSIngo Weinhold break; 131*44c3726bSIngo Weinhold case B_REG_GET_MESSAGE_RUNNER_INFO: 132*44c3726bSIngo Weinhold fMessageRunnerManager->HandleGetRunnerInfo(message); 133*44c3726bSIngo Weinhold break; 1344b8a7115SIngo Weinhold default: 1354b8a7115SIngo Weinhold BApplication::MessageReceived(message); 1364b8a7115SIngo Weinhold break; 1374b8a7115SIngo Weinhold } 1384b8a7115SIngo Weinhold FUNCTION_END(); 1394b8a7115SIngo Weinhold } 1404b8a7115SIngo Weinhold 1414b8a7115SIngo Weinhold // ReadyToRun 1422ad75c74SIngo Weinhold /*! \brief Overrides the super class version to initialize the registrar 1432ad75c74SIngo Weinhold services. 1442ad75c74SIngo Weinhold */ 1454b8a7115SIngo Weinhold void 1464b8a7115SIngo Weinhold Registrar::ReadyToRun() 1474b8a7115SIngo Weinhold { 1484b8a7115SIngo Weinhold FUNCTION_START(); 14960aa4feaSIngo Weinhold // create roster 1502ad75c74SIngo Weinhold fRoster = new TRoster; 15160aa4feaSIngo Weinhold fRoster->Init(); 15260aa4feaSIngo Weinhold // create clipboard handler 1532ad75c74SIngo Weinhold fClipboardHandler = new ClipboardHandler; 1542ad75c74SIngo Weinhold AddHandler(fClipboardHandler); 15560aa4feaSIngo Weinhold // create MIME manager 1562ad75c74SIngo Weinhold fMIMEManager = new MIMEManager; 1572ad75c74SIngo Weinhold fMIMEManager->Run(); 158*44c3726bSIngo Weinhold // create message runner manager 159*44c3726bSIngo Weinhold fEventQueue = new EventQueue(kEventQueueName); 160*44c3726bSIngo Weinhold fMessageRunnerManager = new MessageRunnerManager(fEventQueue); 161afac6ebeSIngo Weinhold // init the global be_roster 162afac6ebeSIngo Weinhold BPrivate::init_registrar_roster(be_app_messenger, 163afac6ebeSIngo Weinhold BMessenger(NULL, fMIMEManager)); 1642ad75c74SIngo Weinhold FUNCTION_END(); 1654b8a7115SIngo Weinhold } 1664b8a7115SIngo Weinhold 1674b8a7115SIngo Weinhold // QuitRequested 1682ad75c74SIngo Weinhold /*! \brief Overrides the super class version to avoid termination of the 1692ad75c74SIngo Weinhold registrar until the system shutdown. 1702ad75c74SIngo Weinhold */ 1714b8a7115SIngo Weinhold bool 1724b8a7115SIngo Weinhold Registrar::QuitRequested() 1734b8a7115SIngo Weinhold { 1744b8a7115SIngo Weinhold FUNCTION_START(); 1754b8a7115SIngo Weinhold // The final registrar must not quit. At least not that easily. ;-) 1764b8a7115SIngo Weinhold return BApplication::QuitRequested(); 1774b8a7115SIngo Weinhold } 1784b8a7115SIngo Weinhold 179afac6ebeSIngo Weinhold // init_registrar_roster 180afac6ebeSIngo Weinhold /*! \brief Initializes the global \a be_roster. 181afac6ebeSIngo Weinhold 182afac6ebeSIngo Weinhold While this is done automagically for all other applications while libbe 183afac6ebeSIngo Weinhold initialization, the registrar needs to help out a bit. 184afac6ebeSIngo Weinhold 185afac6ebeSIngo Weinhold \param mainMessenger A BMessenger targeting the registrar application. 186afac6ebeSIngo Weinhold \param mimeMessenger A BMessenger targeting the MIME manager. 187afac6ebeSIngo Weinhold */ 188afac6ebeSIngo Weinhold void 189afac6ebeSIngo Weinhold BPrivate::init_registrar_roster(BMessenger mainMessenger, 190afac6ebeSIngo Weinhold BMessenger mimeMessenger) 191afac6ebeSIngo Weinhold { 192afac6ebeSIngo Weinhold BRoster *roster = const_cast<BRoster*>(be_roster); 193afac6ebeSIngo Weinhold roster->fMess = mainMessenger; 194afac6ebeSIngo Weinhold roster->fMimeMess = mimeMessenger; 195afac6ebeSIngo Weinhold } 196afac6ebeSIngo Weinhold 1974b8a7115SIngo Weinhold 1984b8a7115SIngo Weinhold // main 1992ad75c74SIngo Weinhold /*! \brief Creates and runs the registrar application. 2002ad75c74SIngo Weinhold 2012ad75c74SIngo Weinhold The main thread is renamed. 2022ad75c74SIngo Weinhold 2032ad75c74SIngo Weinhold \return 0. 2042ad75c74SIngo Weinhold */ 2054b8a7115SIngo Weinhold int 2064b8a7115SIngo Weinhold main() 2074b8a7115SIngo Weinhold { 2084b8a7115SIngo Weinhold FUNCTION_START(); 2094b8a7115SIngo Weinhold // rename the main thread 2104b8a7115SIngo Weinhold rename_thread(find_thread(NULL), kRosterThreadName); 2114b8a7115SIngo Weinhold // create and run the registrar application 2124b8a7115SIngo Weinhold Registrar *app = new Registrar(); 2134b8a7115SIngo Weinhold PRINT(("app->Run()...\n")); 2144b8a7115SIngo Weinhold app->Run(); 2154b8a7115SIngo Weinhold PRINT(("delete app...\n")); 2164b8a7115SIngo Weinhold delete app; 2174b8a7115SIngo Weinhold FUNCTION_END(); 2184b8a7115SIngo Weinhold return 0; 2194b8a7115SIngo Weinhold } 2204b8a7115SIngo Weinhold 221