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" 1144c3726bSIngo Weinhold #include "EventQueue.h" 12463322c2SIngo Weinhold #include "MessageEvent.h" 1344c3726bSIngo Weinhold #include "MessageRunnerManager.h" 144b8a7115SIngo Weinhold #include "MIMEManager.h" 154b8a7115SIngo Weinhold #include "Registrar.h" 1651d6b22eSIngo Weinhold #include "TRoster.h" 174b8a7115SIngo Weinhold 182ad75c74SIngo Weinhold /*! 192ad75c74SIngo Weinhold \class Registrar 202ad75c74SIngo Weinhold \brief The application class of the registrar. 212ad75c74SIngo Weinhold 222ad75c74SIngo Weinhold Glues the registrar services together and dispatches the roster messages. 232ad75c74SIngo Weinhold */ 242ad75c74SIngo Weinhold 25463322c2SIngo Weinhold //! Name of the event queue. 26463322c2SIngo Weinhold static const char *kEventQueueName = "timer_thread"; 27463322c2SIngo Weinhold 28463322c2SIngo Weinhold //! Time interval between two roster sanity checks (1 s). 29463322c2SIngo Weinhold static const bigtime_t kRosterSanityEventInterval = 1000000LL; 30463322c2SIngo Weinhold 314b8a7115SIngo Weinhold // constructor 322ad75c74SIngo Weinhold /*! \brief Creates the registrar application class. 332ad75c74SIngo Weinhold */ 344b8a7115SIngo Weinhold Registrar::Registrar() 354b8a7115SIngo Weinhold : BApplication(kRegistrarSignature), 3651d6b22eSIngo Weinhold fRoster(NULL), 374b8a7115SIngo Weinhold fClipboardHandler(NULL), 3844c3726bSIngo Weinhold fMIMEManager(NULL), 3944c3726bSIngo Weinhold fEventQueue(NULL), 40463322c2SIngo Weinhold fMessageRunnerManager(NULL), 41463322c2SIngo Weinhold fSanityEvent(NULL) 424b8a7115SIngo Weinhold { 434b8a7115SIngo Weinhold FUNCTION_START(); 444b8a7115SIngo Weinhold } 454b8a7115SIngo Weinhold 464b8a7115SIngo Weinhold // destructor 472ad75c74SIngo Weinhold /*! \brief Frees all resources associated with the registrar. 482ad75c74SIngo Weinhold 492ad75c74SIngo Weinhold All registrar services, that haven't been shut down earlier, are 502ad75c74SIngo Weinhold terminated. 512ad75c74SIngo Weinhold */ 524b8a7115SIngo Weinhold Registrar::~Registrar() 534b8a7115SIngo Weinhold { 544b8a7115SIngo Weinhold FUNCTION_START(); 5560aa4feaSIngo Weinhold Lock(); 5644c3726bSIngo Weinhold fEventQueue->Die(); 5744c3726bSIngo Weinhold delete fMessageRunnerManager; 5844c3726bSIngo Weinhold delete fEventQueue; 59463322c2SIngo Weinhold delete fSanityEvent; 604b8a7115SIngo Weinhold fMIMEManager->Lock(); 614b8a7115SIngo Weinhold fMIMEManager->Quit(); 624b8a7115SIngo Weinhold RemoveHandler(fClipboardHandler); 634b8a7115SIngo Weinhold delete fClipboardHandler; 6451d6b22eSIngo Weinhold delete fRoster; 65463322c2SIngo Weinhold // Invalidate the global be_roster, so that the BApplication destructor 66463322c2SIngo Weinhold // won't dead-lock when sending a message to itself. 67463322c2SIngo Weinhold BPrivate::init_registrar_roster(BMessenger(), BMessenger()); 68c39e4532SIngo Weinhold FUNCTION_END(); 694b8a7115SIngo Weinhold } 704b8a7115SIngo Weinhold 714b8a7115SIngo Weinhold // MessageReceived 722ad75c74SIngo Weinhold /*! \brief Overrides the super class version to dispatch roster specific 732ad75c74SIngo Weinhold messages. 742ad75c74SIngo Weinhold \param message The message to be handled 752ad75c74SIngo Weinhold */ 764b8a7115SIngo Weinhold void 774b8a7115SIngo Weinhold Registrar::MessageReceived(BMessage *message) 784b8a7115SIngo Weinhold { 79463322c2SIngo Weinhold // FUNCTION_START(); 804b8a7115SIngo Weinhold switch (message->what) { 8144c3726bSIngo Weinhold // general requests 824b8a7115SIngo Weinhold case B_REG_GET_MIME_MESSENGER: 834b8a7115SIngo Weinhold { 844b8a7115SIngo Weinhold PRINT(("B_REG_GET_MIME_MESSENGER\n")); 854b8a7115SIngo Weinhold BMessenger messenger(NULL, fMIMEManager); 864b8a7115SIngo Weinhold BMessage reply(B_REG_SUCCESS); 874b8a7115SIngo Weinhold reply.AddMessenger("messenger", messenger); 884b8a7115SIngo Weinhold message->SendReply(&reply); 894b8a7115SIngo Weinhold break; 904b8a7115SIngo Weinhold } 914b8a7115SIngo Weinhold case B_REG_GET_CLIPBOARD_MESSENGER: 924b8a7115SIngo Weinhold { 934b8a7115SIngo Weinhold PRINT(("B_REG_GET_CLIPBOARD_MESSENGER\n")); 944b8a7115SIngo Weinhold BMessenger messenger(fClipboardHandler); 954b8a7115SIngo Weinhold BMessage reply(B_REG_SUCCESS); 964b8a7115SIngo Weinhold reply.AddMessenger("messenger", messenger); 974b8a7115SIngo Weinhold message->SendReply(&reply); 984b8a7115SIngo Weinhold break; 994b8a7115SIngo Weinhold } 10044c3726bSIngo Weinhold // roster requests 10151d6b22eSIngo Weinhold case B_REG_ADD_APP: 10251d6b22eSIngo Weinhold fRoster->HandleAddApplication(message); 10351d6b22eSIngo Weinhold break; 10451d6b22eSIngo Weinhold case B_REG_COMPLETE_REGISTRATION: 10551d6b22eSIngo Weinhold fRoster->HandleCompleteRegistration(message); 10651d6b22eSIngo Weinhold break; 1072e042baaSIngo Weinhold case B_REG_IS_APP_PRE_REGISTERED: 10851d6b22eSIngo Weinhold fRoster->HandleIsAppPreRegistered(message); 10951d6b22eSIngo Weinhold break; 11051d6b22eSIngo Weinhold case B_REG_REMOVE_PRE_REGISTERED_APP: 11151d6b22eSIngo Weinhold fRoster->HandleRemovePreRegApp(message); 11251d6b22eSIngo Weinhold break; 11351d6b22eSIngo Weinhold case B_REG_REMOVE_APP: 11451d6b22eSIngo Weinhold fRoster->HandleRemoveApp(message); 11551d6b22eSIngo Weinhold break; 116c39e4532SIngo Weinhold case B_REG_SET_THREAD_AND_TEAM: 117c39e4532SIngo Weinhold fRoster->HandleSetThreadAndTeam(message); 118c39e4532SIngo Weinhold break; 119af8eec40SIngo Weinhold case B_REG_SET_SIGNATURE: 120af8eec40SIngo Weinhold fRoster->HandleSetSignature(message); 121af8eec40SIngo Weinhold break; 1222e042baaSIngo Weinhold case B_REG_GET_APP_INFO: 1232e042baaSIngo Weinhold fRoster->HandleGetAppInfo(message); 1242e042baaSIngo Weinhold break; 1252e042baaSIngo Weinhold case B_REG_GET_APP_LIST: 1262e042baaSIngo Weinhold fRoster->HandleGetAppList(message); 1272e042baaSIngo Weinhold break; 1282e042baaSIngo Weinhold case B_REG_ACTIVATE_APP: 1292e042baaSIngo Weinhold fRoster->HandleActivateApp(message); 130c39e4532SIngo Weinhold break; 13156d4d637SIngo Weinhold case B_REG_BROADCAST: 13256d4d637SIngo Weinhold fRoster->HandleBroadcast(message); 13356d4d637SIngo Weinhold break; 134*7a0335c8SIngo Weinhold case B_REG_START_WATCHING: 135*7a0335c8SIngo Weinhold fRoster->HandleStartWatching(message); 136*7a0335c8SIngo Weinhold break; 137*7a0335c8SIngo Weinhold case B_REG_STOP_WATCHING: 138*7a0335c8SIngo Weinhold fRoster->HandleStopWatching(message); 139*7a0335c8SIngo Weinhold break; 14044c3726bSIngo Weinhold // message runner requests 14144c3726bSIngo Weinhold case B_REG_REGISTER_MESSAGE_RUNNER: 14244c3726bSIngo Weinhold fMessageRunnerManager->HandleRegisterRunner(message); 14344c3726bSIngo Weinhold break; 14444c3726bSIngo Weinhold case B_REG_UNREGISTER_MESSAGE_RUNNER: 14544c3726bSIngo Weinhold fMessageRunnerManager->HandleUnregisterRunner(message); 14644c3726bSIngo Weinhold break; 14744c3726bSIngo Weinhold case B_REG_SET_MESSAGE_RUNNER_PARAMS: 14844c3726bSIngo Weinhold fMessageRunnerManager->HandleSetRunnerParams(message); 14944c3726bSIngo Weinhold break; 15044c3726bSIngo Weinhold case B_REG_GET_MESSAGE_RUNNER_INFO: 15144c3726bSIngo Weinhold fMessageRunnerManager->HandleGetRunnerInfo(message); 15244c3726bSIngo Weinhold break; 153463322c2SIngo Weinhold // internal messages 154463322c2SIngo Weinhold case B_REG_ROSTER_SANITY_EVENT: 155463322c2SIngo Weinhold fRoster->CheckSanity(); 156463322c2SIngo Weinhold fSanityEvent->SetTime(system_time() + kRosterSanityEventInterval); 157463322c2SIngo Weinhold fEventQueue->AddEvent(fSanityEvent); 158463322c2SIngo Weinhold break; 1594b8a7115SIngo Weinhold default: 1604b8a7115SIngo Weinhold BApplication::MessageReceived(message); 1614b8a7115SIngo Weinhold break; 1624b8a7115SIngo Weinhold } 163463322c2SIngo Weinhold // FUNCTION_END(); 1644b8a7115SIngo Weinhold } 1654b8a7115SIngo Weinhold 1664b8a7115SIngo Weinhold // ReadyToRun 1672ad75c74SIngo Weinhold /*! \brief Overrides the super class version to initialize the registrar 1682ad75c74SIngo Weinhold services. 1692ad75c74SIngo Weinhold */ 1704b8a7115SIngo Weinhold void 1714b8a7115SIngo Weinhold Registrar::ReadyToRun() 1724b8a7115SIngo Weinhold { 1734b8a7115SIngo Weinhold FUNCTION_START(); 17460aa4feaSIngo Weinhold // create roster 1752ad75c74SIngo Weinhold fRoster = new TRoster; 17660aa4feaSIngo Weinhold fRoster->Init(); 17760aa4feaSIngo Weinhold // create clipboard handler 1782ad75c74SIngo Weinhold fClipboardHandler = new ClipboardHandler; 1792ad75c74SIngo Weinhold AddHandler(fClipboardHandler); 18060aa4feaSIngo Weinhold // create MIME manager 1812ad75c74SIngo Weinhold fMIMEManager = new MIMEManager; 1822ad75c74SIngo Weinhold fMIMEManager->Run(); 18344c3726bSIngo Weinhold // create message runner manager 18444c3726bSIngo Weinhold fEventQueue = new EventQueue(kEventQueueName); 18544c3726bSIngo Weinhold fMessageRunnerManager = new MessageRunnerManager(fEventQueue); 186afac6ebeSIngo Weinhold // init the global be_roster 187afac6ebeSIngo Weinhold BPrivate::init_registrar_roster(be_app_messenger, 188afac6ebeSIngo Weinhold BMessenger(NULL, fMIMEManager)); 189463322c2SIngo Weinhold // create and schedule the sanity message event 190463322c2SIngo Weinhold fSanityEvent = new MessageEvent(system_time() + kRosterSanityEventInterval, 191463322c2SIngo Weinhold this, B_REG_ROSTER_SANITY_EVENT); 192463322c2SIngo Weinhold fSanityEvent->SetAutoDelete(false); 193463322c2SIngo Weinhold fEventQueue->AddEvent(fSanityEvent); 1942ad75c74SIngo Weinhold FUNCTION_END(); 1954b8a7115SIngo Weinhold } 1964b8a7115SIngo Weinhold 1974b8a7115SIngo Weinhold // QuitRequested 1982ad75c74SIngo Weinhold /*! \brief Overrides the super class version to avoid termination of the 1992ad75c74SIngo Weinhold registrar until the system shutdown. 2002ad75c74SIngo Weinhold */ 2014b8a7115SIngo Weinhold bool 2024b8a7115SIngo Weinhold Registrar::QuitRequested() 2034b8a7115SIngo Weinhold { 2044b8a7115SIngo Weinhold FUNCTION_START(); 2054b8a7115SIngo Weinhold // The final registrar must not quit. At least not that easily. ;-) 2064b8a7115SIngo Weinhold return BApplication::QuitRequested(); 2074b8a7115SIngo Weinhold } 2084b8a7115SIngo Weinhold 209463322c2SIngo Weinhold // GetEventQueue 210463322c2SIngo Weinhold /*! \brief Returns the registrar's event queue. 211463322c2SIngo Weinhold \return The registrar's event queue. 212463322c2SIngo Weinhold */ 213463322c2SIngo Weinhold EventQueue* 214463322c2SIngo Weinhold Registrar::GetEventQueue() const 215463322c2SIngo Weinhold { 216463322c2SIngo Weinhold return fEventQueue; 217463322c2SIngo Weinhold } 218463322c2SIngo Weinhold 219463322c2SIngo Weinhold // App 220463322c2SIngo Weinhold /*! \brief Returns the Registrar application object. 221463322c2SIngo Weinhold \return The Registrar application object. 222463322c2SIngo Weinhold */ 223463322c2SIngo Weinhold Registrar* 224463322c2SIngo Weinhold Registrar::App() 225463322c2SIngo Weinhold { 226463322c2SIngo Weinhold return dynamic_cast<Registrar*>(be_app); 227463322c2SIngo Weinhold } 228463322c2SIngo Weinhold 229463322c2SIngo Weinhold 230afac6ebeSIngo Weinhold // init_registrar_roster 231afac6ebeSIngo Weinhold /*! \brief Initializes the global \a be_roster. 232afac6ebeSIngo Weinhold 233afac6ebeSIngo Weinhold While this is done automagically for all other applications while libbe 234afac6ebeSIngo Weinhold initialization, the registrar needs to help out a bit. 235afac6ebeSIngo Weinhold 236afac6ebeSIngo Weinhold \param mainMessenger A BMessenger targeting the registrar application. 237afac6ebeSIngo Weinhold \param mimeMessenger A BMessenger targeting the MIME manager. 238afac6ebeSIngo Weinhold */ 239afac6ebeSIngo Weinhold void 240afac6ebeSIngo Weinhold BPrivate::init_registrar_roster(BMessenger mainMessenger, 241afac6ebeSIngo Weinhold BMessenger mimeMessenger) 242afac6ebeSIngo Weinhold { 243afac6ebeSIngo Weinhold BRoster *roster = const_cast<BRoster*>(be_roster); 244afac6ebeSIngo Weinhold roster->fMess = mainMessenger; 245afac6ebeSIngo Weinhold roster->fMimeMess = mimeMessenger; 246afac6ebeSIngo Weinhold } 247afac6ebeSIngo Weinhold 2484b8a7115SIngo Weinhold 2494b8a7115SIngo Weinhold // main 2502ad75c74SIngo Weinhold /*! \brief Creates and runs the registrar application. 2512ad75c74SIngo Weinhold 2522ad75c74SIngo Weinhold The main thread is renamed. 2532ad75c74SIngo Weinhold 2542ad75c74SIngo Weinhold \return 0. 2552ad75c74SIngo Weinhold */ 2564b8a7115SIngo Weinhold int 2574b8a7115SIngo Weinhold main() 2584b8a7115SIngo Weinhold { 2594b8a7115SIngo Weinhold FUNCTION_START(); 2604b8a7115SIngo Weinhold // rename the main thread 2614b8a7115SIngo Weinhold rename_thread(find_thread(NULL), kRosterThreadName); 2624b8a7115SIngo Weinhold // create and run the registrar application 2634b8a7115SIngo Weinhold Registrar *app = new Registrar(); 2644b8a7115SIngo Weinhold PRINT(("app->Run()...\n")); 2654b8a7115SIngo Weinhold app->Run(); 2664b8a7115SIngo Weinhold PRINT(("delete app...\n")); 2674b8a7115SIngo Weinhold delete app; 2684b8a7115SIngo Weinhold FUNCTION_END(); 2694b8a7115SIngo Weinhold return 0; 2704b8a7115SIngo Weinhold } 2714b8a7115SIngo Weinhold 272