Complete DeviceManager, need testing though.

Fix crash with TeamMonitor when quitting.
Moved app signature to a common place


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8674 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2004-08-27 13:14:17 +00:00
parent 6276c26824
commit 97c19e92aa
6 changed files with 151 additions and 82 deletions
+1 -13
View File
@@ -185,7 +185,6 @@ AddOnManager::UnregisterAddOn(BEntry &entry)
if (!strcmp(pinfo->ref.name, ref.name)) { if (!strcmp(pinfo->ref.name, ref.name)) {
InputServer::StartStopDevices(pinfo->isd, false); InputServer::StartStopDevices(pinfo->isd, false);
delete pinfo->isd; delete pinfo->isd;
delete pinfo->addon;
if (pinfo->addon_image >= B_OK) if (pinfo->addon_image >= B_OK)
unload_add_on(pinfo->addon_image); unload_add_on(pinfo->addon_image);
fDeviceList.RemoveCurrent(); fDeviceList.RemoveCurrent();
@@ -208,7 +207,6 @@ AddOnManager::UnregisterAddOn(BEntry &entry)
for (fMethodList.Rewind(); fMethodList.GetNext(&pinfo);) { for (fMethodList.Rewind(); fMethodList.GetNext(&pinfo);) {
if (!strcmp(pinfo->ref.name, ref.name)) { if (!strcmp(pinfo->ref.name, ref.name)) {
delete pinfo->ism; delete pinfo->ism;
delete pinfo->addon;
if (pinfo->addon_image >= B_OK) if (pinfo->addon_image >= B_OK)
unload_add_on(pinfo->addon_image); unload_add_on(pinfo->addon_image);
fMethodList.RemoveCurrent(); fMethodList.RemoveCurrent();
@@ -255,7 +253,7 @@ AddOnManager::RegisterAddOns()
const directory_which directories[] = { const directory_which directories[] = {
B_USER_ADDONS_DIRECTORY, B_USER_ADDONS_DIRECTORY,
B_COMMON_ADDONS_DIRECTORY, B_COMMON_ADDONS_DIRECTORY,
// B_BEOS_ADDONS_DIRECTORY, B_BEOS_ADDONS_DIRECTORY,
}; };
const char subDirectories[][24] = { const char subDirectories[][24] = {
"input_server/devices", "input_server/devices",
@@ -278,12 +276,6 @@ AddOnManager::RegisterAddOns()
} }
} }
// ToDo: this is for our own convenience only, and should be removed
// in the final release
//if ((directory.SetTo("/boot/home/develop/openbeos/current/distro/x86.R1/beos/system/add-ons/media/plugins") == B_OK)
// && (directory.GetNodeRef(&nref) == B_OK)) {
// fHandler->AddDirectory(&nref);
//}
} }
@@ -305,7 +297,6 @@ AddOnManager::UnregisterAddOns()
for (fDeviceList.Rewind(); fDeviceList.GetNext(&pinfo);) { for (fDeviceList.Rewind(); fDeviceList.GetNext(&pinfo);) {
InputServer::StartStopDevices(pinfo->isd, false); InputServer::StartStopDevices(pinfo->isd, false);
delete pinfo->isd; delete pinfo->isd;
delete pinfo->addon;
if (pinfo->addon_image >= B_OK) if (pinfo->addon_image >= B_OK)
unload_add_on(pinfo->addon_image); unload_add_on(pinfo->addon_image);
fDeviceList.RemoveCurrent(); fDeviceList.RemoveCurrent();
@@ -326,7 +317,6 @@ AddOnManager::UnregisterAddOns()
method_info *pinfo; method_info *pinfo;
for (fMethodList.Rewind(); fMethodList.GetNext(&pinfo);) { for (fMethodList.Rewind(); fMethodList.GetNext(&pinfo);) {
delete pinfo->ism; delete pinfo->ism;
delete pinfo->addon;
if (pinfo->addon_image >= B_OK) if (pinfo->addon_image >= B_OK)
unload_add_on(pinfo->addon_image); unload_add_on(pinfo->addon_image);
fMethodList.RemoveCurrent(); fMethodList.RemoveCurrent();
@@ -354,7 +344,6 @@ AddOnManager::RegisterDevice(BInputServerDevice *device, const entry_ref &ref, i
info.ref = ref; info.ref = ref;
info.addon_image = addon_image; info.addon_image = addon_image;
info.isd = device; info.isd = device;
//info.addon = new _BDeviceAddOn_;
fDeviceList.Insert(info); fDeviceList.Insert(info);
} }
@@ -407,7 +396,6 @@ AddOnManager::RegisterMethod(BInputServerMethod *method, const entry_ref &ref, i
info.ref = ref; info.ref = ref;
info.addon_image = addon_image; info.addon_image = addon_image;
info.ism = method; info.ism = method;
//info.addon = new _BMethodAddOn_;
fMethodList.Insert(info); fMethodList.Insert(info);
-2
View File
@@ -39,7 +39,6 @@ class AddOnManager {
private: private:
struct device_info { struct device_info {
entry_ref ref; entry_ref ref;
_BDeviceAddOn_* addon;
image_id addon_image; image_id addon_image;
BInputServerDevice *isd; BInputServerDevice *isd;
}; };
@@ -50,7 +49,6 @@ class AddOnManager {
}; };
struct method_info { struct method_info {
entry_ref ref; entry_ref ref;
_BMethodAddOn_* addon;
image_id addon_image; image_id addon_image;
BInputServerMethod *ism; BInputServerMethod *ism;
}; };
+135 -47
View File
@@ -25,6 +25,7 @@
IAHandler::IAHandler(DeviceManager * manager) IAHandler::IAHandler(DeviceManager * manager)
: BHandler ("DeviceManager") : BHandler ("DeviceManager")
{ {
CALLED();
fManager = manager; fManager = manager;
} }
@@ -32,18 +33,33 @@ IAHandler::IAHandler(DeviceManager * manager)
void void
IAHandler::MessageReceived(BMessage * msg) IAHandler::MessageReceived(BMessage * msg)
{ {
CALLED();
if (msg->what == B_NODE_MONITOR) { if (msg->what == B_NODE_MONITOR) {
int32 opcode; int32 opcode;
if (msg->FindInt32("opcode", &opcode) == B_OK) { if (msg->FindInt32("opcode", &opcode) == B_OK) {
switch (opcode) { switch (opcode) {
case B_ENTRY_CREATED: case B_ENTRY_CREATED:
break;
case B_ENTRY_REMOVED: case B_ENTRY_REMOVED:
break;
case B_ENTRY_MOVED: case B_ENTRY_MOVED:
{
node_ref dir_nref;
if ((msg->FindInt32("device", &dir_nref.device)!=B_OK)
|| (msg->FindInt64("directory", &dir_nref.node)!=B_OK))
return;
_BDeviceAddOn_ *addon = NULL;
int32 i = 0;
while ((addon = fManager->GetAddOn(i++)) !=NULL) {
int32 j=0;
node_ref *dnref = NULL;
while ((dnref = (node_ref *)addon->fMonitoredRefs.ItemAt(j++)) != NULL) {
if (*dnref == dir_nref) {
addon->fDevice->Control(NULL, NULL, msg->what, msg);
}
}
}
}
break;
case B_STAT_CHANGED: case B_STAT_CHANGED:
case B_ATTR_CHANGED: case B_ATTR_CHANGED:
case B_DEVICE_MOUNTED: case B_DEVICE_MOUNTED:
@@ -58,8 +74,9 @@ IAHandler::MessageReceived(BMessage * msg)
status_t status_t
IAHandler::AddDirectory(const node_ref * nref) IAHandler::AddDirectory(const node_ref * nref, _BDeviceAddOn_ *addon)
{ {
CALLED();
BDirectory directory(nref); BDirectory directory(nref);
status_t status = directory.InitCheck(); status_t status = directory.InitCheck();
if (status != B_OK) if (status != B_OK)
@@ -71,16 +88,14 @@ IAHandler::AddDirectory(const node_ref * nref)
BEntry entry; BEntry entry;
while (directory.GetNextEntry(&entry, true) == B_OK) { while (directory.GetNextEntry(&entry, true) == B_OK) {
add_on_entry_info entry_info; entry_ref ref;
if (entry.GetName(entry_info.name) != B_OK) { entry.GetRef(&ref);
continue; // discard and proceed BMessage msg(B_NODE_MONITOR);
} msg.AddInt32("opcode", B_ENTRY_CREATED);
if (entry.GetNodeRef(&entry_info.nref) != B_OK) { msg.AddInt32("device", nref->device);
continue; // discard and proceed msg.AddInt64("directory", nref->node);
} msg.AddString("name", ref.name);
entry_info.dir_nref = *nref; addon->fDevice->Control(NULL, NULL, msg.what, &msg);
// TODO : handle refs
} }
return B_OK; return B_OK;
@@ -88,8 +103,9 @@ IAHandler::AddDirectory(const node_ref * nref)
status_t status_t
IAHandler::RemoveDirectory(const node_ref * nref) IAHandler::RemoveDirectory(const node_ref * nref, _BDeviceAddOn_ *addon)
{ {
CALLED();
BDirectory directory(nref); BDirectory directory(nref);
status_t status = directory.InitCheck(); status_t status = directory.InitCheck();
if (status != B_OK) if (status != B_OK)
@@ -101,16 +117,14 @@ IAHandler::RemoveDirectory(const node_ref * nref)
BEntry entry; BEntry entry;
while (directory.GetNextEntry(&entry, true) == B_OK) { while (directory.GetNextEntry(&entry, true) == B_OK) {
add_on_entry_info entry_info; entry_ref ref;
if (entry.GetName(entry_info.name) != B_OK) { entry.GetRef(&ref);
continue; // discard and proceed BMessage msg(B_NODE_MONITOR);
} msg.AddInt32("opcode", B_ENTRY_REMOVED);
if (entry.GetNodeRef(&entry_info.nref) != B_OK) { msg.AddInt32("device", nref->device);
continue; // discard and proceed msg.AddInt64("directory", nref->node);
} msg.AddString("name", ref.name);
entry_info.dir_nref = *nref; addon->fDevice->Control(NULL, NULL, msg.what, &msg);
// TODO : handle refs
} }
return B_OK; return B_OK;
@@ -126,6 +140,9 @@ DeviceManager::DeviceManager()
DeviceManager::~DeviceManager() DeviceManager::~DeviceManager()
{ {
_BDeviceAddOn_ *addon = NULL;
while ((addon = (_BDeviceAddOn_ *)fDeviceAddons.RemoveItem((int32)0)) !=NULL)
delete addon;
} }
@@ -148,22 +165,59 @@ status_t
DeviceManager::StartMonitoringDevice(_BDeviceAddOn_ *addon, DeviceManager::StartMonitoringDevice(_BDeviceAddOn_ *addon,
const char *device) const char *device)
{ {
// test if already monitored CALLED();
// monitor if needed
status_t err; status_t err;
node_ref nref; node_ref nref;
BDirectory directory; BDirectory directory;
BPath path("/dev"); BPath path("/dev");
if (((err = path.Append(device)) == B_OK) if (((err = path.Append(device)) != B_OK)
&& ((err = directory.SetTo(path.Path())) == B_OK) || ((err = directory.SetTo(path.Path())) != B_OK)
&& ((err = directory.GetNodeRef(&nref)) == B_OK) || ((err = directory.GetNodeRef(&nref)) != B_OK))
&& ((err = fHandler->AddDirectory(&nref)) == B_OK) ) {
return B_OK;
} else
return err; return err;
// add in list // test if already monitored
bool alreadyMonitored = false;
_BDeviceAddOn_ *tmpaddon = NULL;
int32 i = 0;
while ((tmpaddon = (_BDeviceAddOn_ *)fDeviceAddons.ItemAt(i++)) !=NULL) {
int32 j=0;
node_ref *dnref = NULL;
while ((dnref = (node_ref *)tmpaddon->fMonitoredRefs.ItemAt(j++)) != NULL) {
if (*dnref == nref) {
alreadyMonitored = true;
break;
}
}
if (alreadyMonitored)
break;
}
// monitor if needed
if (!alreadyMonitored) {
if ((err = fHandler->AddDirectory(&nref, addon)) != B_OK)
return err;
}
// add addon in list
if (!fDeviceAddons.HasItem(addon))
fDeviceAddons.AddItem(addon);
// add dir ref in list
int32 j=0;
node_ref *dnref = NULL;
alreadyMonitored = false;
while ((dnref = (node_ref *)addon->fMonitoredRefs.ItemAt(j++)) != NULL) {
if (*dnref == nref) {
alreadyMonitored = true;
break;
}
}
if (!alreadyMonitored) {
addon->fMonitoredRefs.AddItem(new node_ref(nref));
}
return B_OK;
} }
@@ -171,19 +225,53 @@ status_t
DeviceManager::StopMonitoringDevice(_BDeviceAddOn_ *addon, DeviceManager::StopMonitoringDevice(_BDeviceAddOn_ *addon,
const char *device) const char *device)
{ {
// test if still monitored CALLED();
// remove from list
// stop monitoring if needed
status_t err; status_t err;
node_ref nref; node_ref nref;
BDirectory directory; BDirectory directory;
BPath path("/dev"); BPath path("/dev");
if (((err = path.Append(device)) == B_OK) if (((err = path.Append(device)) != B_OK)
&& ((err = directory.SetTo(path.Path())) == B_OK) || ((err = directory.SetTo(path.Path())) != B_OK)
&& ((err = directory.GetNodeRef(&nref)) == B_OK) || ((err = directory.GetNodeRef(&nref)) != B_OK))
/*&& ((err = fHandler->RemoveDirectory(&nref)) ==B_OK)*/) {
return B_OK;
} else
return err; return err;
// test if still monitored
bool stillMonitored = false;
_BDeviceAddOn_ *tmpaddon = NULL;
int32 i = 0;
while ((tmpaddon = (_BDeviceAddOn_ *)fDeviceAddons.ItemAt(i++)) !=NULL) {
if (addon == tmpaddon)
continue;
int32 j=0;
node_ref *dnref = NULL;
while ((dnref = (node_ref *)tmpaddon->fMonitoredRefs.ItemAt(j++)) != NULL) {
if (*dnref == nref) {
stillMonitored = true;
break;
}
}
if (stillMonitored)
break;
}
// remove from list
node_ref *dnref = NULL;
int32 j=0;
while ((dnref = (node_ref *)addon->fMonitoredRefs.ItemAt(j)) != NULL) {
if (*dnref == nref) {
addon->fMonitoredRefs.RemoveItem(j);
delete dnref;
break;
}
j++;
}
// stop monitoring if needed
if (!stillMonitored) {
if ((err = fHandler->RemoveDirectory(&nref, addon)) != B_OK)
return err;
}
return B_OK;
} }
+6 -6
View File
@@ -23,8 +23,8 @@ class IAHandler : public BHandler {
public: public:
IAHandler(DeviceManager * manager); IAHandler(DeviceManager * manager);
void MessageReceived(BMessage * msg); void MessageReceived(BMessage * msg);
status_t AddDirectory(const node_ref * nref); status_t AddDirectory(const node_ref * nref, _BDeviceAddOn_ *addon);
status_t RemoveDirectory(const node_ref * nref); status_t RemoveDirectory(const node_ref * nref, _BDeviceAddOn_ *addon);
private: private:
DeviceManager * fManager; DeviceManager * fManager;
@@ -42,11 +42,11 @@ class DeviceManager {
const char *device); const char *device);
status_t StopMonitoringDevice(_BDeviceAddOn_ *addon, status_t StopMonitoringDevice(_BDeviceAddOn_ *addon,
const char *device); const char *device);
_BDeviceAddOn_ *GetAddOn(int32 index) {
return (_BDeviceAddOn_*)fDeviceAddons.ItemAt(index);
}
private: private:
BList fDeviceAddons;
private:
BLocker fLock; BLocker fLock;
IAHandler *fHandler; IAHandler *fHandler;
}; };
+5 -13
View File
@@ -75,11 +75,6 @@ BLocker InputServer::gInputMethodListLocker;
DeviceManager InputServer::gDeviceManager; DeviceManager InputServer::gDeviceManager;
/*BList InputServer::mInputServerDeviceList;
BList InputServer::mInputServerFilterList;
BList InputServer::mInputServerMethodList;*/
/* /*
* *
*/ */
@@ -97,23 +92,17 @@ int main()
* Method: InputServer::InputServer() * Method: InputServer::InputServer()
* Descr: * Descr:
*/ */
InputServer::InputServer(void) : BApplication("application/x-vnd.OBOS-input_server") InputServer::InputServer(void) : BApplication(INPUTSERVER_SIGNATURE)
{ {
CALLED(); CALLED();
void *pointer=NULL; void *pointer=NULL;
EventLoop(pointer); EventLoop(pointer);
// InitTestDevice();
gDeviceManager.LoadState(); gDeviceManager.LoadState();
fAddOnManager = new AddOnManager(); fAddOnManager = new AddOnManager();
fAddOnManager->LoadState(); fAddOnManager->LoadState();
// InitDevices();
// InitFilters();
// InitMethods();
} }
/* /*
@@ -141,7 +130,7 @@ InputServer::ArgvReceived(int32 argc, char** argv)
printf("InputServer::ArgvReceived - Restarting ...\n"); printf("InputServer::ArgvReceived - Restarting ...\n");
status_t quit_status; status_t quit_status;
//BMessenger msgr = BMessenger("application/x-vnd.OpenBeOS-input_server", -1, &quit_status); //BMessenger msgr = BMessenger("application/x-vnd.OpenBeOS-input_server", -1, &quit_status);
BMessenger msgr = BMessenger("application/x-vnd.OBOS-input_server", -1, &quit_status); BMessenger msgr = BMessenger(INPUTSERVER_SIGNATURE, -1, &quit_status);
if (B_OK == quit_status) { if (B_OK == quit_status) {
BMessage msg = BMessage(B_QUIT_REQUESTED); BMessage msg = BMessage(B_QUIT_REQUESTED);
msgr.SendMessage(&msg); msgr.SendMessage(&msg);
@@ -487,6 +476,9 @@ bool
InputServer::QuitRequested(void) InputServer::QuitRequested(void)
{ {
CALLED(); CALLED();
if (!BApplication::QuitRequested())
return false;
fAddOnManager->SaveState(); fAddOnManager->SaveState();
gDeviceManager.SaveState(); gDeviceManager.SaveState();
+3
View File
@@ -49,6 +49,8 @@
#include <OS.h> #include <OS.h>
#include <SupportDefs.h> #include <SupportDefs.h>
#define INPUTSERVER_SIGNATURE "application/x-vnd.OBOS-input_server"
#if DEBUG>=1 #if DEBUG>=1
#define EXIT() printf("EXIT %s\n", __PRETTY_FUNCTION__) #define EXIT() printf("EXIT %s\n", __PRETTY_FUNCTION__)
#define CALLED() printf("CALLED %s\n", __PRETTY_FUNCTION__) #define CALLED() printf("CALLED %s\n", __PRETTY_FUNCTION__)
@@ -77,6 +79,7 @@ class _BDeviceAddOn_
: fDevice(device) {}; : fDevice(device) {};
BInputServerDevice *fDevice; BInputServerDevice *fDevice;
BList fMonitoredRefs;
}; };
class _BMethodAddOn_ class _BMethodAddOn_