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; 1347a0335c8SIngo Weinhold case B_REG_START_WATCHING: 1357a0335c8SIngo Weinhold fRoster->HandleStartWatching(message); 1367a0335c8SIngo Weinhold break; 1377a0335c8SIngo Weinhold case B_REG_STOP_WATCHING: 1387a0335c8SIngo Weinhold fRoster->HandleStopWatching(message); 1397a0335c8SIngo Weinhold break; 140*7c827740STyler Dauwalder case B_REG_GET_RECENT_DOCUMENTS: 141*7c827740STyler Dauwalder fRoster->HandleGetRecentDocuments(message); 142*7c827740STyler Dauwalder break; 143*7c827740STyler Dauwalder case B_REG_GET_RECENT_FOLDERS: 144*7c827740STyler Dauwalder fRoster->HandleGetRecentFolders(message); 145*7c827740STyler Dauwalder break; 146*7c827740STyler Dauwalder case B_REG_GET_RECENT_APPS: 147*7c827740STyler Dauwalder fRoster->HandleGetRecentApps(message); 148*7c827740STyler Dauwalder break; 149*7c827740STyler Dauwalder case B_REG_ADD_TO_RECENT_DOCUMENTS: 150*7c827740STyler Dauwalder fRoster->HandleAddToRecentDocuments(message); 151*7c827740STyler Dauwalder break; 152*7c827740STyler Dauwalder case B_REG_ADD_TO_RECENT_FOLDERS: 153*7c827740STyler Dauwalder fRoster->HandleAddToRecentFolders(message); 154*7c827740STyler Dauwalder break; 155*7c827740STyler Dauwalder case B_REG_ADD_TO_RECENT_APPS: 156*7c827740STyler Dauwalder fRoster->HandleAddToRecentApps(message); 157*7c827740STyler Dauwalder break; 158*7c827740STyler Dauwalder case B_REG_CLEAR_RECENT_DOCUMENTS: 159*7c827740STyler Dauwalder fRoster->HandleClearRecentDocuments(message); 160*7c827740STyler Dauwalder break; 161*7c827740STyler Dauwalder case B_REG_CLEAR_RECENT_FOLDERS: 162*7c827740STyler Dauwalder fRoster->HandleClearRecentFolders(message); 163*7c827740STyler Dauwalder break; 164*7c827740STyler Dauwalder case B_REG_CLEAR_RECENT_APPS: 165*7c827740STyler Dauwalder fRoster->HandleClearRecentApps(message); 166*7c827740STyler Dauwalder break; 16744c3726bSIngo Weinhold // message runner requests 16844c3726bSIngo Weinhold case B_REG_REGISTER_MESSAGE_RUNNER: 16944c3726bSIngo Weinhold fMessageRunnerManager->HandleRegisterRunner(message); 17044c3726bSIngo Weinhold break; 17144c3726bSIngo Weinhold case B_REG_UNREGISTER_MESSAGE_RUNNER: 17244c3726bSIngo Weinhold fMessageRunnerManager->HandleUnregisterRunner(message); 17344c3726bSIngo Weinhold break; 17444c3726bSIngo Weinhold case B_REG_SET_MESSAGE_RUNNER_PARAMS: 17544c3726bSIngo Weinhold fMessageRunnerManager->HandleSetRunnerParams(message); 17644c3726bSIngo Weinhold break; 17744c3726bSIngo Weinhold case B_REG_GET_MESSAGE_RUNNER_INFO: 17844c3726bSIngo Weinhold fMessageRunnerManager->HandleGetRunnerInfo(message); 17944c3726bSIngo Weinhold break; 180463322c2SIngo Weinhold // internal messages 181463322c2SIngo Weinhold case B_REG_ROSTER_SANITY_EVENT: 182463322c2SIngo Weinhold fRoster->CheckSanity(); 183463322c2SIngo Weinhold fSanityEvent->SetTime(system_time() + kRosterSanityEventInterval); 184463322c2SIngo Weinhold fEventQueue->AddEvent(fSanityEvent); 185463322c2SIngo Weinhold break; 1864b8a7115SIngo Weinhold default: 1874b8a7115SIngo Weinhold BApplication::MessageReceived(message); 1884b8a7115SIngo Weinhold break; 1894b8a7115SIngo Weinhold } 190463322c2SIngo Weinhold // FUNCTION_END(); 1914b8a7115SIngo Weinhold } 1924b8a7115SIngo Weinhold 1934b8a7115SIngo Weinhold // ReadyToRun 1942ad75c74SIngo Weinhold /*! \brief Overrides the super class version to initialize the registrar 1952ad75c74SIngo Weinhold services. 1962ad75c74SIngo Weinhold */ 1974b8a7115SIngo Weinhold void 1984b8a7115SIngo Weinhold Registrar::ReadyToRun() 1994b8a7115SIngo Weinhold { 2004b8a7115SIngo Weinhold FUNCTION_START(); 20160aa4feaSIngo Weinhold // create roster 2022ad75c74SIngo Weinhold fRoster = new TRoster; 20360aa4feaSIngo Weinhold fRoster->Init(); 20460aa4feaSIngo Weinhold // create clipboard handler 2052ad75c74SIngo Weinhold fClipboardHandler = new ClipboardHandler; 2062ad75c74SIngo Weinhold AddHandler(fClipboardHandler); 20760aa4feaSIngo Weinhold // create MIME manager 2082ad75c74SIngo Weinhold fMIMEManager = new MIMEManager; 2092ad75c74SIngo Weinhold fMIMEManager->Run(); 21044c3726bSIngo Weinhold // create message runner manager 21144c3726bSIngo Weinhold fEventQueue = new EventQueue(kEventQueueName); 21244c3726bSIngo Weinhold fMessageRunnerManager = new MessageRunnerManager(fEventQueue); 213afac6ebeSIngo Weinhold // init the global be_roster 214afac6ebeSIngo Weinhold BPrivate::init_registrar_roster(be_app_messenger, 215afac6ebeSIngo Weinhold BMessenger(NULL, fMIMEManager)); 216463322c2SIngo Weinhold // create and schedule the sanity message event 217463322c2SIngo Weinhold fSanityEvent = new MessageEvent(system_time() + kRosterSanityEventInterval, 218463322c2SIngo Weinhold this, B_REG_ROSTER_SANITY_EVENT); 219463322c2SIngo Weinhold fSanityEvent->SetAutoDelete(false); 220463322c2SIngo Weinhold fEventQueue->AddEvent(fSanityEvent); 2212ad75c74SIngo Weinhold FUNCTION_END(); 2224b8a7115SIngo Weinhold } 2234b8a7115SIngo Weinhold 2244b8a7115SIngo Weinhold // QuitRequested 2252ad75c74SIngo Weinhold /*! \brief Overrides the super class version to avoid termination of the 2262ad75c74SIngo Weinhold registrar until the system shutdown. 2272ad75c74SIngo Weinhold */ 2284b8a7115SIngo Weinhold bool 2294b8a7115SIngo Weinhold Registrar::QuitRequested() 2304b8a7115SIngo Weinhold { 2314b8a7115SIngo Weinhold FUNCTION_START(); 2324b8a7115SIngo Weinhold // The final registrar must not quit. At least not that easily. ;-) 2334b8a7115SIngo Weinhold return BApplication::QuitRequested(); 2344b8a7115SIngo Weinhold } 2354b8a7115SIngo Weinhold 236463322c2SIngo Weinhold // GetEventQueue 237463322c2SIngo Weinhold /*! \brief Returns the registrar's event queue. 238463322c2SIngo Weinhold \return The registrar's event queue. 239463322c2SIngo Weinhold */ 240463322c2SIngo Weinhold EventQueue* 241463322c2SIngo Weinhold Registrar::GetEventQueue() const 242463322c2SIngo Weinhold { 243463322c2SIngo Weinhold return fEventQueue; 244463322c2SIngo Weinhold } 245463322c2SIngo Weinhold 246463322c2SIngo Weinhold // App 247463322c2SIngo Weinhold /*! \brief Returns the Registrar application object. 248463322c2SIngo Weinhold \return The Registrar application object. 249463322c2SIngo Weinhold */ 250463322c2SIngo Weinhold Registrar* 251463322c2SIngo Weinhold Registrar::App() 252463322c2SIngo Weinhold { 253463322c2SIngo Weinhold return dynamic_cast<Registrar*>(be_app); 254463322c2SIngo Weinhold } 255463322c2SIngo Weinhold 256463322c2SIngo Weinhold 257afac6ebeSIngo Weinhold // init_registrar_roster 258afac6ebeSIngo Weinhold /*! \brief Initializes the global \a be_roster. 259afac6ebeSIngo Weinhold 260afac6ebeSIngo Weinhold While this is done automagically for all other applications while libbe 261afac6ebeSIngo Weinhold initialization, the registrar needs to help out a bit. 262afac6ebeSIngo Weinhold 263afac6ebeSIngo Weinhold \param mainMessenger A BMessenger targeting the registrar application. 264afac6ebeSIngo Weinhold \param mimeMessenger A BMessenger targeting the MIME manager. 265afac6ebeSIngo Weinhold */ 266afac6ebeSIngo Weinhold void 267afac6ebeSIngo Weinhold BPrivate::init_registrar_roster(BMessenger mainMessenger, 268afac6ebeSIngo Weinhold BMessenger mimeMessenger) 269afac6ebeSIngo Weinhold { 270afac6ebeSIngo Weinhold BRoster *roster = const_cast<BRoster*>(be_roster); 271afac6ebeSIngo Weinhold roster->fMess = mainMessenger; 272afac6ebeSIngo Weinhold roster->fMimeMess = mimeMessenger; 273afac6ebeSIngo Weinhold } 274afac6ebeSIngo Weinhold 2754b8a7115SIngo Weinhold 2764b8a7115SIngo Weinhold // main 2772ad75c74SIngo Weinhold /*! \brief Creates and runs the registrar application. 2782ad75c74SIngo Weinhold 2792ad75c74SIngo Weinhold The main thread is renamed. 2802ad75c74SIngo Weinhold 2812ad75c74SIngo Weinhold \return 0. 2822ad75c74SIngo Weinhold */ 2834b8a7115SIngo Weinhold int 2844b8a7115SIngo Weinhold main() 2854b8a7115SIngo Weinhold { 2864b8a7115SIngo Weinhold FUNCTION_START(); 2874b8a7115SIngo Weinhold // rename the main thread 2884b8a7115SIngo Weinhold rename_thread(find_thread(NULL), kRosterThreadName); 2894b8a7115SIngo Weinhold // create and run the registrar application 2904b8a7115SIngo Weinhold Registrar *app = new Registrar(); 2914b8a7115SIngo Weinhold PRINT(("app->Run()...\n")); 2924b8a7115SIngo Weinhold app->Run(); 2934b8a7115SIngo Weinhold PRINT(("delete app...\n")); 2944b8a7115SIngo Weinhold delete app; 2954b8a7115SIngo Weinhold FUNCTION_END(); 2964b8a7115SIngo Weinhold return 0; 2974b8a7115SIngo Weinhold } 2984b8a7115SIngo Weinhold 299