Changed to use the DormantNodeManager class.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@720 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -15,6 +15,7 @@
|
|||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "TMap.h"
|
#include "TMap.h"
|
||||||
#include "ServerInterface.h"
|
#include "ServerInterface.h"
|
||||||
|
#include "DormantNodeManager.h"
|
||||||
|
|
||||||
void DumpFlavorInfo(const flavor_info *info);
|
void DumpFlavorInfo(const flavor_info *info);
|
||||||
|
|
||||||
@@ -35,7 +36,6 @@ public:
|
|||||||
void ScanAddOnFlavors(BMediaAddOn *addon);
|
void ScanAddOnFlavors(BMediaAddOn *addon);
|
||||||
|
|
||||||
Map<ino_t,media_addon_id> *filemap;
|
Map<ino_t,media_addon_id> *filemap;
|
||||||
Map<media_addon_id,BMediaAddOn *> *addonmap;
|
|
||||||
|
|
||||||
BMediaRoster *mediaroster;
|
BMediaRoster *mediaroster;
|
||||||
ino_t DirNodeSystem;
|
ino_t DirNodeSystem;
|
||||||
@@ -49,7 +49,6 @@ Application::Application(const char *sig) :
|
|||||||
{
|
{
|
||||||
mediaroster = BMediaRoster::Roster();
|
mediaroster = BMediaRoster::Roster();
|
||||||
filemap = new Map<ino_t,media_addon_id>;
|
filemap = new Map<ino_t,media_addon_id>;
|
||||||
addonmap = new Map<media_addon_id,BMediaAddOn *>;
|
|
||||||
control_port = create_port(64,"media_addon_server port");
|
control_port = create_port(64,"media_addon_server port");
|
||||||
control_thread = spawn_thread(controlthread,"media_addon_server control",12,this);
|
control_thread = spawn_thread(controlthread,"media_addon_server control",12,this);
|
||||||
resume_thread(control_thread);
|
resume_thread(control_thread);
|
||||||
@@ -61,12 +60,11 @@ Application::~Application()
|
|||||||
status_t err;
|
status_t err;
|
||||||
wait_for_thread(control_thread,&err);
|
wait_for_thread(control_thread,&err);
|
||||||
|
|
||||||
// delete all BMediaAddOn objects
|
// unregister all media add-ons
|
||||||
BMediaAddOn *addon;
|
media_addon_id id;
|
||||||
for (int32 index = 0; addonmap->GetAt(index,&addon); index++)
|
for (int32 index = 0; filemap->GetAt(index,&id); index++)
|
||||||
delete addon;
|
_DormantNodeManager->UnregisterAddon(id);
|
||||||
|
|
||||||
delete addonmap;
|
|
||||||
delete filemap;
|
delete filemap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,12 +85,13 @@ Application::HandleMessage(int32 code, void *data, size_t size)
|
|||||||
{
|
{
|
||||||
const xfer_addonserver_rescan_mediaaddon_flavors *msg = (const xfer_addonserver_rescan_mediaaddon_flavors *)data;
|
const xfer_addonserver_rescan_mediaaddon_flavors *msg = (const xfer_addonserver_rescan_mediaaddon_flavors *)data;
|
||||||
BMediaAddOn *addon;
|
BMediaAddOn *addon;
|
||||||
if (addonmap->Get(msg->addonid, &addon)) {
|
addon = _DormantNodeManager->GetAddon(msg->addonid);
|
||||||
ASSERT(msg->addonid == addon->AddonID());
|
if (!addon) {
|
||||||
ScanAddOnFlavors(addon);
|
|
||||||
} else {
|
|
||||||
printf("Can't find a addon object for id %d\n",(int)msg->addonid);
|
printf("Can't find a addon object for id %d\n",(int)msg->addonid);
|
||||||
}
|
break;
|
||||||
|
}
|
||||||
|
ScanAddOnFlavors(addon);
|
||||||
|
_DormantNodeManager->PutAddon(msg->addonid);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,6 +140,9 @@ Application::ScanAddOnFlavors(BMediaAddOn *addon)
|
|||||||
status_t rv;
|
status_t rv;
|
||||||
|
|
||||||
ASSERT(addon);
|
ASSERT(addon);
|
||||||
|
ASSERT(addon->AddonID() > 0);
|
||||||
|
|
||||||
|
printf("scanning media add-on flavors for id %d\n",addon->AddonID());
|
||||||
|
|
||||||
port = find_port("media_server port");
|
port = find_port("media_server port");
|
||||||
if (port <= B_OK) {
|
if (port <= B_OK) {
|
||||||
@@ -148,8 +150,6 @@ Application::ScanAddOnFlavors(BMediaAddOn *addon)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(addon->AddonID() > 0);
|
|
||||||
|
|
||||||
// the server should remove previously registered "dormant_flavor_info"s
|
// the server should remove previously registered "dormant_flavor_info"s
|
||||||
purge_id = addon->AddonID();
|
purge_id = addon->AddonID();
|
||||||
|
|
||||||
@@ -204,39 +204,25 @@ Application::AddOnAdded(const char *path, ino_t file_node)
|
|||||||
{
|
{
|
||||||
printf("\n\nloading BMediaAddOn from %s\n",path);
|
printf("\n\nloading BMediaAddOn from %s\n",path);
|
||||||
|
|
||||||
BMediaAddOn *(*make_addon)(image_id you);
|
BMediaAddOn *addon;
|
||||||
BMediaAddOn *addon = 0;
|
|
||||||
media_addon_id id;
|
media_addon_id id;
|
||||||
image_id image;
|
|
||||||
status_t rv;
|
status_t rv;
|
||||||
|
|
||||||
image = load_add_on(path);
|
id = _DormantNodeManager->RegisterAddon(path);
|
||||||
if (image < B_OK) {
|
if (id <= 0) {
|
||||||
printf("loading failed %lx %s\n", image, strerror(image));
|
printf("failed to register add-on\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
rv = get_image_symbol(image, "make_media_addon", B_SYMBOL_TYPE_TEXT, (void**)&make_addon);
|
addon = _DormantNodeManager->GetAddon(id);
|
||||||
if (rv < B_OK) {
|
if (addon == NULL) {
|
||||||
printf("loading failed, function not found %lx %s\n", rv, strerror(rv));
|
printf("failed to get add-on\n");
|
||||||
unload_add_on(image);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
addon = make_addon(image);
|
|
||||||
if (addon == 0) {
|
|
||||||
printf("creating BMediaAddOn failed\n");
|
|
||||||
unload_add_on(image);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
id = addon->AddonID();
|
|
||||||
ASSERT(id > 0);
|
|
||||||
|
|
||||||
printf("adding media add-on %d\n",(int)id);
|
printf("adding media add-on %d\n",(int)id);
|
||||||
|
|
||||||
filemap->Insert(file_node, id);
|
filemap->Insert(file_node, id);
|
||||||
addonmap->Insert(id, addon);
|
|
||||||
|
|
||||||
ScanAddOnFlavors(addon);
|
ScanAddOnFlavors(addon);
|
||||||
|
|
||||||
@@ -287,6 +273,7 @@ flavor 0:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
_DormantNodeManager->PutAddon(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -294,19 +281,12 @@ void
|
|||||||
Application::AddOnRemoved(ino_t file_node)
|
Application::AddOnRemoved(ino_t file_node)
|
||||||
{
|
{
|
||||||
media_addon_id id;
|
media_addon_id id;
|
||||||
BMediaAddOn *addon;
|
|
||||||
if (!filemap->Get(file_node,&id)) {
|
if (!filemap->Get(file_node,&id)) {
|
||||||
printf("inode %Ld removed, but no media add-on found\n",file_node);
|
printf("inode %Ld removed, but no media add-on found\n",file_node);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
filemap->Remove(file_node);
|
filemap->Remove(file_node);
|
||||||
printf("removing media add-on %d\n",(int)id);
|
_DormantNodeManager->UnregisterAddon(id);
|
||||||
if (!addonmap->Get(id,&addon)) {
|
|
||||||
printf("no BMediaAddon object found\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
delete addon;
|
|
||||||
addonmap->Remove(id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
Reference in New Issue
Block a user