xref: /haiku/src/servers/registrar/Registrar.cpp (revision 44c3726b9d7e53a60e30e74df26efa5e8f7f9b50)
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"
11*44c3726bSIngo Weinhold #include "EventQueue.h"
12*44c3726bSIngo Weinhold #include "MessageRunnerManager.h"
134b8a7115SIngo Weinhold #include "MIMEManager.h"
144b8a7115SIngo Weinhold #include "Registrar.h"
1551d6b22eSIngo Weinhold #include "TRoster.h"
164b8a7115SIngo Weinhold 
17*44c3726bSIngo Weinhold static const char *kEventQueueName = "timer_thread";
18*44c3726bSIngo Weinhold 
192ad75c74SIngo Weinhold /*!
202ad75c74SIngo Weinhold 	\class Registrar
212ad75c74SIngo Weinhold 	\brief The application class of the registrar.
222ad75c74SIngo Weinhold 
232ad75c74SIngo Weinhold 	Glues the registrar services together and dispatches the roster messages.
242ad75c74SIngo Weinhold */
252ad75c74SIngo Weinhold 
264b8a7115SIngo Weinhold // constructor
272ad75c74SIngo Weinhold /*!	\brief Creates the registrar application class.
282ad75c74SIngo Weinhold */
294b8a7115SIngo Weinhold Registrar::Registrar()
304b8a7115SIngo Weinhold 		 : BApplication(kRegistrarSignature),
3151d6b22eSIngo Weinhold 		   fRoster(NULL),
324b8a7115SIngo Weinhold 		   fClipboardHandler(NULL),
33*44c3726bSIngo Weinhold 		   fMIMEManager(NULL),
34*44c3726bSIngo Weinhold 		   fEventQueue(NULL),
35*44c3726bSIngo Weinhold 		   fMessageRunnerManager(NULL)
364b8a7115SIngo Weinhold {
374b8a7115SIngo Weinhold 	FUNCTION_START();
384b8a7115SIngo Weinhold }
394b8a7115SIngo Weinhold 
404b8a7115SIngo Weinhold // destructor
412ad75c74SIngo Weinhold /*!	\brief Frees all resources associated with the registrar.
422ad75c74SIngo Weinhold 
432ad75c74SIngo Weinhold 	All registrar services, that haven't been shut down earlier, are
442ad75c74SIngo Weinhold 	terminated.
452ad75c74SIngo Weinhold */
464b8a7115SIngo Weinhold Registrar::~Registrar()
474b8a7115SIngo Weinhold {
484b8a7115SIngo Weinhold 	FUNCTION_START();
4960aa4feaSIngo Weinhold 	Lock();
50*44c3726bSIngo Weinhold 	fEventQueue->Die();
51*44c3726bSIngo Weinhold 	delete fMessageRunnerManager;
52*44c3726bSIngo Weinhold 	delete fEventQueue;
534b8a7115SIngo Weinhold 	fMIMEManager->Lock();
544b8a7115SIngo Weinhold 	fMIMEManager->Quit();
554b8a7115SIngo Weinhold 	RemoveHandler(fClipboardHandler);
564b8a7115SIngo Weinhold 	delete fClipboardHandler;
5751d6b22eSIngo Weinhold 	delete fRoster;
58c39e4532SIngo Weinhold 	FUNCTION_END();
594b8a7115SIngo Weinhold }
604b8a7115SIngo Weinhold 
614b8a7115SIngo Weinhold // MessageReceived
622ad75c74SIngo Weinhold /*!	\brief Overrides the super class version to dispatch roster specific
632ad75c74SIngo Weinhold 		   messages.
642ad75c74SIngo Weinhold 	\param message The message to be handled
652ad75c74SIngo Weinhold */
664b8a7115SIngo Weinhold void
674b8a7115SIngo Weinhold Registrar::MessageReceived(BMessage *message)
684b8a7115SIngo Weinhold {
694b8a7115SIngo Weinhold 	FUNCTION_START();
704b8a7115SIngo Weinhold 	switch (message->what) {
71*44c3726bSIngo Weinhold 		// general requests
724b8a7115SIngo Weinhold 		case B_REG_GET_MIME_MESSENGER:
734b8a7115SIngo Weinhold 		{
744b8a7115SIngo Weinhold 			PRINT(("B_REG_GET_MIME_MESSENGER\n"));
754b8a7115SIngo Weinhold 			BMessenger messenger(NULL, fMIMEManager);
764b8a7115SIngo Weinhold 			BMessage reply(B_REG_SUCCESS);
774b8a7115SIngo Weinhold 			reply.AddMessenger("messenger", messenger);
784b8a7115SIngo Weinhold 			message->SendReply(&reply);
794b8a7115SIngo Weinhold 			break;
804b8a7115SIngo Weinhold 		}
814b8a7115SIngo Weinhold 		case B_REG_GET_CLIPBOARD_MESSENGER:
824b8a7115SIngo Weinhold 		{
834b8a7115SIngo Weinhold 			PRINT(("B_REG_GET_CLIPBOARD_MESSENGER\n"));
844b8a7115SIngo Weinhold 			BMessenger messenger(fClipboardHandler);
854b8a7115SIngo Weinhold 			BMessage reply(B_REG_SUCCESS);
864b8a7115SIngo Weinhold 			reply.AddMessenger("messenger", messenger);
874b8a7115SIngo Weinhold 			message->SendReply(&reply);
884b8a7115SIngo Weinhold 			break;
894b8a7115SIngo Weinhold 		}
90*44c3726bSIngo Weinhold 		// roster requests
9151d6b22eSIngo Weinhold 		case B_REG_ADD_APP:
9251d6b22eSIngo Weinhold 			fRoster->HandleAddApplication(message);
9351d6b22eSIngo Weinhold 			break;
9451d6b22eSIngo Weinhold 		case B_REG_COMPLETE_REGISTRATION:
9551d6b22eSIngo Weinhold 			fRoster->HandleCompleteRegistration(message);
9651d6b22eSIngo Weinhold 			break;
972e042baaSIngo Weinhold 		case B_REG_IS_APP_PRE_REGISTERED:
9851d6b22eSIngo Weinhold 			fRoster->HandleIsAppPreRegistered(message);
9951d6b22eSIngo Weinhold 			break;
10051d6b22eSIngo Weinhold 		case B_REG_REMOVE_PRE_REGISTERED_APP:
10151d6b22eSIngo Weinhold 			fRoster->HandleRemovePreRegApp(message);
10251d6b22eSIngo Weinhold 			break;
10351d6b22eSIngo Weinhold 		case B_REG_REMOVE_APP:
10451d6b22eSIngo Weinhold 			fRoster->HandleRemoveApp(message);
10551d6b22eSIngo Weinhold 			break;
106c39e4532SIngo Weinhold 		case B_REG_SET_THREAD_AND_TEAM:
107c39e4532SIngo Weinhold 			fRoster->HandleSetThreadAndTeam(message);
108c39e4532SIngo Weinhold 			break;
109af8eec40SIngo Weinhold 		case B_REG_SET_SIGNATURE:
110af8eec40SIngo Weinhold 			fRoster->HandleSetSignature(message);
111af8eec40SIngo Weinhold 			break;
1122e042baaSIngo Weinhold 		case B_REG_GET_APP_INFO:
1132e042baaSIngo Weinhold 			fRoster->HandleGetAppInfo(message);
1142e042baaSIngo Weinhold 			break;
1152e042baaSIngo Weinhold 		case B_REG_GET_APP_LIST:
1162e042baaSIngo Weinhold 			fRoster->HandleGetAppList(message);
1172e042baaSIngo Weinhold 			break;
1182e042baaSIngo Weinhold 		case B_REG_ACTIVATE_APP:
1192e042baaSIngo Weinhold 			fRoster->HandleActivateApp(message);
120c39e4532SIngo Weinhold 			break;
121*44c3726bSIngo Weinhold 		// message runner requests
122*44c3726bSIngo Weinhold 		case B_REG_REGISTER_MESSAGE_RUNNER:
123*44c3726bSIngo Weinhold 			fMessageRunnerManager->HandleRegisterRunner(message);
124*44c3726bSIngo Weinhold 			break;
125*44c3726bSIngo Weinhold 		case B_REG_UNREGISTER_MESSAGE_RUNNER:
126*44c3726bSIngo Weinhold 			fMessageRunnerManager->HandleUnregisterRunner(message);
127*44c3726bSIngo Weinhold 			break;
128*44c3726bSIngo Weinhold 		case B_REG_SET_MESSAGE_RUNNER_PARAMS:
129*44c3726bSIngo Weinhold 			fMessageRunnerManager->HandleSetRunnerParams(message);
130*44c3726bSIngo Weinhold 			break;
131*44c3726bSIngo Weinhold 		case B_REG_GET_MESSAGE_RUNNER_INFO:
132*44c3726bSIngo Weinhold 			fMessageRunnerManager->HandleGetRunnerInfo(message);
133*44c3726bSIngo Weinhold 			break;
1344b8a7115SIngo Weinhold 		default:
1354b8a7115SIngo Weinhold 			BApplication::MessageReceived(message);
1364b8a7115SIngo Weinhold 			break;
1374b8a7115SIngo Weinhold 	}
1384b8a7115SIngo Weinhold 	FUNCTION_END();
1394b8a7115SIngo Weinhold }
1404b8a7115SIngo Weinhold 
1414b8a7115SIngo Weinhold // ReadyToRun
1422ad75c74SIngo Weinhold /*!	\brief Overrides the super class version to initialize the registrar
1432ad75c74SIngo Weinhold 		   services.
1442ad75c74SIngo Weinhold */
1454b8a7115SIngo Weinhold void
1464b8a7115SIngo Weinhold Registrar::ReadyToRun()
1474b8a7115SIngo Weinhold {
1484b8a7115SIngo Weinhold 	FUNCTION_START();
14960aa4feaSIngo Weinhold 	// create roster
1502ad75c74SIngo Weinhold 	fRoster = new TRoster;
15160aa4feaSIngo Weinhold 	fRoster->Init();
15260aa4feaSIngo Weinhold 	// create clipboard handler
1532ad75c74SIngo Weinhold 	fClipboardHandler = new ClipboardHandler;
1542ad75c74SIngo Weinhold 	AddHandler(fClipboardHandler);
15560aa4feaSIngo Weinhold 	// create MIME manager
1562ad75c74SIngo Weinhold 	fMIMEManager = new MIMEManager;
1572ad75c74SIngo Weinhold 	fMIMEManager->Run();
158*44c3726bSIngo Weinhold 	// create message runner manager
159*44c3726bSIngo Weinhold 	fEventQueue = new EventQueue(kEventQueueName);
160*44c3726bSIngo Weinhold 	fMessageRunnerManager = new MessageRunnerManager(fEventQueue);
161afac6ebeSIngo Weinhold 	// init the global be_roster
162afac6ebeSIngo Weinhold 	BPrivate::init_registrar_roster(be_app_messenger,
163afac6ebeSIngo Weinhold 									BMessenger(NULL, fMIMEManager));
1642ad75c74SIngo Weinhold 	FUNCTION_END();
1654b8a7115SIngo Weinhold }
1664b8a7115SIngo Weinhold 
1674b8a7115SIngo Weinhold // QuitRequested
1682ad75c74SIngo Weinhold /*!	\brief Overrides the super class version to avoid termination of the
1692ad75c74SIngo Weinhold 		   registrar until the system shutdown.
1702ad75c74SIngo Weinhold */
1714b8a7115SIngo Weinhold bool
1724b8a7115SIngo Weinhold Registrar::QuitRequested()
1734b8a7115SIngo Weinhold {
1744b8a7115SIngo Weinhold 	FUNCTION_START();
1754b8a7115SIngo Weinhold 	// The final registrar must not quit. At least not that easily. ;-)
1764b8a7115SIngo Weinhold 	return BApplication::QuitRequested();
1774b8a7115SIngo Weinhold }
1784b8a7115SIngo Weinhold 
179afac6ebeSIngo Weinhold // init_registrar_roster
180afac6ebeSIngo Weinhold /*!	\brief Initializes the global \a be_roster.
181afac6ebeSIngo Weinhold 
182afac6ebeSIngo Weinhold 	While this is done automagically for all other applications while libbe
183afac6ebeSIngo Weinhold 	initialization, the registrar needs to help out a bit.
184afac6ebeSIngo Weinhold 
185afac6ebeSIngo Weinhold 	\param mainMessenger A BMessenger targeting the registrar application.
186afac6ebeSIngo Weinhold 	\param mimeMessenger A BMessenger targeting the MIME manager.
187afac6ebeSIngo Weinhold */
188afac6ebeSIngo Weinhold void
189afac6ebeSIngo Weinhold BPrivate::init_registrar_roster(BMessenger mainMessenger,
190afac6ebeSIngo Weinhold 								BMessenger mimeMessenger)
191afac6ebeSIngo Weinhold {
192afac6ebeSIngo Weinhold 	BRoster *roster = const_cast<BRoster*>(be_roster);
193afac6ebeSIngo Weinhold 	roster->fMess = mainMessenger;
194afac6ebeSIngo Weinhold 	roster->fMimeMess = mimeMessenger;
195afac6ebeSIngo Weinhold }
196afac6ebeSIngo Weinhold 
1974b8a7115SIngo Weinhold 
1984b8a7115SIngo Weinhold // main
1992ad75c74SIngo Weinhold /*!	\brief Creates and runs the registrar application.
2002ad75c74SIngo Weinhold 
2012ad75c74SIngo Weinhold 	The main thread is renamed.
2022ad75c74SIngo Weinhold 
2032ad75c74SIngo Weinhold 	\return 0.
2042ad75c74SIngo Weinhold */
2054b8a7115SIngo Weinhold int
2064b8a7115SIngo Weinhold main()
2074b8a7115SIngo Weinhold {
2084b8a7115SIngo Weinhold 	FUNCTION_START();
2094b8a7115SIngo Weinhold 	// rename the main thread
2104b8a7115SIngo Weinhold 	rename_thread(find_thread(NULL), kRosterThreadName);
2114b8a7115SIngo Weinhold 	// create and run the registrar application
2124b8a7115SIngo Weinhold 	Registrar *app = new Registrar();
2134b8a7115SIngo Weinhold PRINT(("app->Run()...\n"));
2144b8a7115SIngo Weinhold 	app->Run();
2154b8a7115SIngo Weinhold PRINT(("delete app...\n"));
2164b8a7115SIngo Weinhold 	delete app;
2174b8a7115SIngo Weinhold 	FUNCTION_END();
2184b8a7115SIngo Weinhold 	return 0;
2194b8a7115SIngo Weinhold }
2204b8a7115SIngo Weinhold 
221