xref: /haiku/src/servers/registrar/Registrar.cpp (revision 7c82774099652449030b316e009b965a99bb2f87)
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