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