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:
beveloper
2002-08-12 20:05:18 +00:00
parent 3ba329f7bf
commit e2c48499a6
+23 -43
View File
@@ -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