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