xref: /haiku/src/servers/media/AppManager.cpp (revision 8f3a684551ef612f4b2dee43979f4a20f887c082)
1 /*
2  * Copyright (c) 2002, 2003 Marcus Overhagen <Marcus@Overhagen.de>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files or portions
6  * thereof (the "Software"), to deal in the Software without restriction,
7  * including without limitation the rights to use, copy, modify, merge,
8  * publish, distribute, sublicense, and/or sell copies of the Software,
9  * and to permit persons to whom the Software is furnished to do so, subject
10  * to the following conditions:
11  *
12  *  * Redistributions of source code must retain the above copyright notice,
13  *    this list of conditions and the following disclaimer.
14  *
15  *  * Redistributions in binary form must reproduce the above copyright notice
16  *    in the  binary, as well as this list of conditions and the following
17  *    disclaimer in the documentation and/or other materials provided with
18  *    the distribution.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26  * THE SOFTWARE.
27  *
28  */
29 
30 
31 #include "AppManager.h"
32 
33 #include <stdio.h>
34 
35 #include <Application.h>
36 #include <Autolock.h>
37 #include <OS.h>
38 #include <Roster.h>
39 
40 #include <MediaDebug.h>
41 #include <MediaMisc.h>
42 
43 #include "BufferManager.h"
44 #include "media_server.h"
45 #include "NodeManager.h"
46 #include "NotificationManager.h"
47 
48 
AppManager()49 AppManager::AppManager()
50 	:
51 	BLocker("media app manager")
52 {
53 }
54 
55 
~AppManager()56 AppManager::~AppManager()
57 {
58 }
59 
60 
61 bool
HasTeam(team_id team)62 AppManager::HasTeam(team_id team)
63 {
64 	BAutolock lock(this);
65 	return fMap.find(team) != fMap.end();
66 }
67 
68 
69 status_t
RegisterTeam(team_id team,const BMessenger & messenger)70 AppManager::RegisterTeam(team_id team, const BMessenger& messenger)
71 {
72 	BAutolock lock(this);
73 
74 	TRACE("AppManager::RegisterTeam %" B_PRId32 "\n", team);
75 	if (HasTeam(team)) {
76 		ERROR("AppManager::RegisterTeam: team %" B_PRId32 " already"
77 			" registered\n", team);
78 		return B_ERROR;
79 	}
80 
81 	try {
82 		fMap.insert(std::make_pair(team, messenger));
83 	} catch (std::bad_alloc& exception) {
84 		return B_NO_MEMORY;
85 	}
86 
87 	return B_OK;
88 }
89 
90 
91 status_t
UnregisterTeam(team_id team)92 AppManager::UnregisterTeam(team_id team)
93 {
94 	TRACE("AppManager::UnregisterTeam %" B_PRId32 "\n", team);
95 
96 	Lock();
97 	bool isRemoved = fMap.erase(team) != 0;
98 	Unlock();
99 
100 	_CleanupTeam(team);
101 
102 	return isRemoved ? B_OK : B_ERROR;
103 }
104 
105 
106 team_id
AddOnServerTeam()107 AppManager::AddOnServerTeam()
108 {
109 	team_id id = be_roster->TeamFor(B_MEDIA_ADDON_SERVER_SIGNATURE);
110 	if (id < 0) {
111 		ERROR("media_server: Trouble, media_addon_server is dead!\n");
112 		return -1;
113 	}
114 	return id;
115 }
116 
117 
118 status_t
SendMessage(team_id team,BMessage * message)119 AppManager::SendMessage(team_id team, BMessage* message)
120 {
121 	BAutolock lock(this);
122 
123 	AppMap::iterator found = fMap.find(team);
124 	if (found == fMap.end())
125 		return B_NAME_NOT_FOUND;
126 
127 	return found->second.SendMessage(message);
128 }
129 
130 
131 void
Dump()132 AppManager::Dump()
133 {
134 	BAutolock lock(this);
135 
136 	printf("\n");
137 	printf("AppManager: list of applications follows:\n");
138 
139 	app_info info;
140 	AppMap::iterator iterator = fMap.begin();
141 	for (; iterator != fMap.end(); iterator++) {
142 		app_info info;
143 		be_roster->GetRunningAppInfo(iterator->first, &info);
144 		printf(" team %" B_PRId32 " \"%s\", messenger %svalid\n",
145 			iterator->first, info.ref.name,
146 			iterator->second.IsValid() ? "" : "NOT ");
147 	}
148 
149 	printf("AppManager: list end\n");
150 }
151 
152 
153 void
NotifyRosters()154 AppManager::NotifyRosters()
155 {
156 	BAutolock lock(this);
157 
158 	AppMap::iterator iterator = fMap.begin();
159 	for (; iterator != fMap.end(); iterator++)
160 		iterator->second.SendMessage(MEDIA_SERVER_ALIVE);
161 }
162 
163 
164 void
_CleanupTeam(team_id team)165 AppManager::_CleanupTeam(team_id team)
166 {
167 	ASSERT(!IsLocked());
168 
169 	TRACE("AppManager: cleaning up team %" B_PRId32 "\n", team);
170 
171 	gNodeManager->CleanupTeam(team);
172 	gBufferManager->CleanupTeam(team);
173 	gNotificationManager->CleanupTeam(team);
174 }
175