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" 114b8a7115SIngo Weinhold #include "MIMEManager.h" 124b8a7115SIngo Weinhold #include "Registrar.h" 1351d6b22eSIngo Weinhold #include "TRoster.h" 144b8a7115SIngo Weinhold 152ad75c74SIngo Weinhold /*! 162ad75c74SIngo Weinhold \class Registrar 172ad75c74SIngo Weinhold \brief The application class of the registrar. 182ad75c74SIngo Weinhold 192ad75c74SIngo Weinhold Glues the registrar services together and dispatches the roster messages. 202ad75c74SIngo Weinhold */ 212ad75c74SIngo Weinhold 224b8a7115SIngo Weinhold // constructor 232ad75c74SIngo Weinhold /*! \brief Creates the registrar application class. 242ad75c74SIngo Weinhold */ 254b8a7115SIngo Weinhold Registrar::Registrar() 264b8a7115SIngo Weinhold : BApplication(kRegistrarSignature), 2751d6b22eSIngo Weinhold fRoster(NULL), 284b8a7115SIngo Weinhold fClipboardHandler(NULL), 294b8a7115SIngo Weinhold fMIMEManager(NULL) 304b8a7115SIngo Weinhold { 314b8a7115SIngo Weinhold FUNCTION_START(); 324b8a7115SIngo Weinhold } 334b8a7115SIngo Weinhold 344b8a7115SIngo Weinhold // destructor 352ad75c74SIngo Weinhold /*! \brief Frees all resources associated with the registrar. 362ad75c74SIngo Weinhold 372ad75c74SIngo Weinhold All registrar services, that haven't been shut down earlier, are 382ad75c74SIngo Weinhold terminated. 392ad75c74SIngo Weinhold */ 404b8a7115SIngo Weinhold Registrar::~Registrar() 414b8a7115SIngo Weinhold { 424b8a7115SIngo Weinhold FUNCTION_START(); 4360aa4feaSIngo Weinhold Lock(); 444b8a7115SIngo Weinhold fMIMEManager->Lock(); 454b8a7115SIngo Weinhold fMIMEManager->Quit(); 464b8a7115SIngo Weinhold RemoveHandler(fClipboardHandler); 474b8a7115SIngo Weinhold delete fClipboardHandler; 4851d6b22eSIngo Weinhold delete fRoster; 49c39e4532SIngo Weinhold FUNCTION_END(); 504b8a7115SIngo Weinhold } 514b8a7115SIngo Weinhold 524b8a7115SIngo Weinhold // MessageReceived 532ad75c74SIngo Weinhold /*! \brief Overrides the super class version to dispatch roster specific 542ad75c74SIngo Weinhold messages. 552ad75c74SIngo Weinhold \param message The message to be handled 562ad75c74SIngo Weinhold */ 574b8a7115SIngo Weinhold void 584b8a7115SIngo Weinhold Registrar::MessageReceived(BMessage *message) 594b8a7115SIngo Weinhold { 604b8a7115SIngo Weinhold FUNCTION_START(); 614b8a7115SIngo Weinhold switch (message->what) { 624b8a7115SIngo Weinhold case B_REG_GET_MIME_MESSENGER: 634b8a7115SIngo Weinhold { 644b8a7115SIngo Weinhold PRINT(("B_REG_GET_MIME_MESSENGER\n")); 654b8a7115SIngo Weinhold BMessenger messenger(NULL, fMIMEManager); 664b8a7115SIngo Weinhold BMessage reply(B_REG_SUCCESS); 674b8a7115SIngo Weinhold reply.AddMessenger("messenger", messenger); 684b8a7115SIngo Weinhold message->SendReply(&reply); 694b8a7115SIngo Weinhold break; 704b8a7115SIngo Weinhold } 714b8a7115SIngo Weinhold case B_REG_GET_CLIPBOARD_MESSENGER: 724b8a7115SIngo Weinhold { 734b8a7115SIngo Weinhold PRINT(("B_REG_GET_CLIPBOARD_MESSENGER\n")); 744b8a7115SIngo Weinhold BMessenger messenger(fClipboardHandler); 754b8a7115SIngo Weinhold BMessage reply(B_REG_SUCCESS); 764b8a7115SIngo Weinhold reply.AddMessenger("messenger", messenger); 774b8a7115SIngo Weinhold message->SendReply(&reply); 784b8a7115SIngo Weinhold break; 794b8a7115SIngo Weinhold } 8051d6b22eSIngo Weinhold case B_REG_ADD_APP: 8151d6b22eSIngo Weinhold fRoster->HandleAddApplication(message); 8251d6b22eSIngo Weinhold break; 8351d6b22eSIngo Weinhold case B_REG_COMPLETE_REGISTRATION: 8451d6b22eSIngo Weinhold fRoster->HandleCompleteRegistration(message); 8551d6b22eSIngo Weinhold break; 862e042baaSIngo Weinhold case B_REG_IS_APP_PRE_REGISTERED: 8751d6b22eSIngo Weinhold fRoster->HandleIsAppPreRegistered(message); 8851d6b22eSIngo Weinhold break; 8951d6b22eSIngo Weinhold case B_REG_REMOVE_PRE_REGISTERED_APP: 9051d6b22eSIngo Weinhold fRoster->HandleRemovePreRegApp(message); 9151d6b22eSIngo Weinhold break; 9251d6b22eSIngo Weinhold case B_REG_REMOVE_APP: 9351d6b22eSIngo Weinhold fRoster->HandleRemoveApp(message); 9451d6b22eSIngo Weinhold break; 95c39e4532SIngo Weinhold case B_REG_SET_THREAD_AND_TEAM: 96c39e4532SIngo Weinhold fRoster->HandleSetThreadAndTeam(message); 97c39e4532SIngo Weinhold break; 98*af8eec40SIngo Weinhold case B_REG_SET_SIGNATURE: 99*af8eec40SIngo Weinhold fRoster->HandleSetSignature(message); 100*af8eec40SIngo Weinhold break; 1012e042baaSIngo Weinhold case B_REG_GET_APP_INFO: 1022e042baaSIngo Weinhold fRoster->HandleGetAppInfo(message); 1032e042baaSIngo Weinhold break; 1042e042baaSIngo Weinhold case B_REG_GET_APP_LIST: 1052e042baaSIngo Weinhold fRoster->HandleGetAppList(message); 1062e042baaSIngo Weinhold break; 1072e042baaSIngo Weinhold case B_REG_ACTIVATE_APP: 1082e042baaSIngo Weinhold fRoster->HandleActivateApp(message); 109c39e4532SIngo Weinhold break; 1104b8a7115SIngo Weinhold default: 1114b8a7115SIngo Weinhold BApplication::MessageReceived(message); 1124b8a7115SIngo Weinhold break; 1134b8a7115SIngo Weinhold } 1144b8a7115SIngo Weinhold FUNCTION_END(); 1154b8a7115SIngo Weinhold } 1164b8a7115SIngo Weinhold 1174b8a7115SIngo Weinhold // ReadyToRun 1182ad75c74SIngo Weinhold /*! \brief Overrides the super class version to initialize the registrar 1192ad75c74SIngo Weinhold services. 1202ad75c74SIngo Weinhold */ 1214b8a7115SIngo Weinhold void 1224b8a7115SIngo Weinhold Registrar::ReadyToRun() 1234b8a7115SIngo Weinhold { 1244b8a7115SIngo Weinhold FUNCTION_START(); 12560aa4feaSIngo Weinhold // create roster 1262ad75c74SIngo Weinhold fRoster = new TRoster; 12760aa4feaSIngo Weinhold fRoster->Init(); 12860aa4feaSIngo Weinhold // create clipboard handler 1292ad75c74SIngo Weinhold fClipboardHandler = new ClipboardHandler; 1302ad75c74SIngo Weinhold AddHandler(fClipboardHandler); 13160aa4feaSIngo Weinhold // create MIME manager 1322ad75c74SIngo Weinhold fMIMEManager = new MIMEManager; 1332ad75c74SIngo Weinhold fMIMEManager->Run(); 134afac6ebeSIngo Weinhold // init the global be_roster 135afac6ebeSIngo Weinhold BPrivate::init_registrar_roster(be_app_messenger, 136afac6ebeSIngo Weinhold BMessenger(NULL, fMIMEManager)); 1372ad75c74SIngo Weinhold FUNCTION_END(); 1384b8a7115SIngo Weinhold } 1394b8a7115SIngo Weinhold 1404b8a7115SIngo Weinhold // QuitRequested 1412ad75c74SIngo Weinhold /*! \brief Overrides the super class version to avoid termination of the 1422ad75c74SIngo Weinhold registrar until the system shutdown. 1432ad75c74SIngo Weinhold */ 1444b8a7115SIngo Weinhold bool 1454b8a7115SIngo Weinhold Registrar::QuitRequested() 1464b8a7115SIngo Weinhold { 1474b8a7115SIngo Weinhold FUNCTION_START(); 1484b8a7115SIngo Weinhold // The final registrar must not quit. At least not that easily. ;-) 1494b8a7115SIngo Weinhold return BApplication::QuitRequested(); 1504b8a7115SIngo Weinhold } 1514b8a7115SIngo Weinhold 152afac6ebeSIngo Weinhold // init_registrar_roster 153afac6ebeSIngo Weinhold /*! \brief Initializes the global \a be_roster. 154afac6ebeSIngo Weinhold 155afac6ebeSIngo Weinhold While this is done automagically for all other applications while libbe 156afac6ebeSIngo Weinhold initialization, the registrar needs to help out a bit. 157afac6ebeSIngo Weinhold 158afac6ebeSIngo Weinhold \param mainMessenger A BMessenger targeting the registrar application. 159afac6ebeSIngo Weinhold \param mimeMessenger A BMessenger targeting the MIME manager. 160afac6ebeSIngo Weinhold */ 161afac6ebeSIngo Weinhold void 162afac6ebeSIngo Weinhold BPrivate::init_registrar_roster(BMessenger mainMessenger, 163afac6ebeSIngo Weinhold BMessenger mimeMessenger) 164afac6ebeSIngo Weinhold { 165afac6ebeSIngo Weinhold BRoster *roster = const_cast<BRoster*>(be_roster); 166afac6ebeSIngo Weinhold roster->fMess = mainMessenger; 167afac6ebeSIngo Weinhold roster->fMimeMess = mimeMessenger; 168afac6ebeSIngo Weinhold } 169afac6ebeSIngo Weinhold 1704b8a7115SIngo Weinhold 1714b8a7115SIngo Weinhold // main 1722ad75c74SIngo Weinhold /*! \brief Creates and runs the registrar application. 1732ad75c74SIngo Weinhold 1742ad75c74SIngo Weinhold The main thread is renamed. 1752ad75c74SIngo Weinhold 1762ad75c74SIngo Weinhold \return 0. 1772ad75c74SIngo Weinhold */ 1784b8a7115SIngo Weinhold int 1794b8a7115SIngo Weinhold main() 1804b8a7115SIngo Weinhold { 1814b8a7115SIngo Weinhold FUNCTION_START(); 1824b8a7115SIngo Weinhold // rename the main thread 1834b8a7115SIngo Weinhold rename_thread(find_thread(NULL), kRosterThreadName); 1844b8a7115SIngo Weinhold // create and run the registrar application 1854b8a7115SIngo Weinhold Registrar *app = new Registrar(); 1864b8a7115SIngo Weinhold PRINT(("app->Run()...\n")); 1874b8a7115SIngo Weinhold app->Run(); 1884b8a7115SIngo Weinhold PRINT(("delete app...\n")); 1894b8a7115SIngo Weinhold delete app; 1904b8a7115SIngo Weinhold FUNCTION_END(); 1914b8a7115SIngo Weinhold return 0; 1924b8a7115SIngo Weinhold } 1934b8a7115SIngo Weinhold 194