reworked device manager

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8671 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2004-08-27 06:46:21 +00:00
parent 4158964bd7
commit b69a5532ae
6 changed files with 134 additions and 42 deletions
+2 -2
View File
@@ -354,7 +354,7 @@ 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_; //info.addon = new _BDeviceAddOn_;
fDeviceList.Insert(info); fDeviceList.Insert(info);
} }
@@ -407,7 +407,7 @@ 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_; //info.addon = new _BMethodAddOn_;
fMethodList.Insert(info); fMethodList.Insert(info);
+105 -35
View File
@@ -22,6 +22,101 @@
#include "InputServer.h" #include "InputServer.h"
IAHandler::IAHandler(DeviceManager * manager)
: BHandler ("DeviceManager")
{
fManager = manager;
}
void
IAHandler::MessageReceived(BMessage * msg)
{
if (msg->what == B_NODE_MONITOR) {
int32 opcode;
if (msg->FindInt32("opcode", &opcode) == B_OK) {
switch (opcode) {
case B_ENTRY_CREATED:
break;
case B_ENTRY_REMOVED:
break;
case B_ENTRY_MOVED:
case B_STAT_CHANGED:
case B_ATTR_CHANGED:
case B_DEVICE_MOUNTED:
case B_DEVICE_UNMOUNTED:
default:
BHandler::MessageReceived(msg);
break;
}
}
}
}
status_t
IAHandler::AddDirectory(const node_ref * nref)
{
BDirectory directory(nref);
status_t status = directory.InitCheck();
if (status != B_OK)
return status;
status = watch_node(nref, B_WATCH_DIRECTORY, this);
if (status != B_OK)
return status;
BEntry entry;
while (directory.GetNextEntry(&entry, true) == B_OK) {
add_on_entry_info entry_info;
if (entry.GetName(entry_info.name) != B_OK) {
continue; // discard and proceed
}
if (entry.GetNodeRef(&entry_info.nref) != B_OK) {
continue; // discard and proceed
}
entry_info.dir_nref = *nref;
// TODO : handle refs
}
return B_OK;
}
status_t
IAHandler::RemoveDirectory(const node_ref * nref)
{
BDirectory directory(nref);
status_t status = directory.InitCheck();
if (status != B_OK)
return status;
status = watch_node(nref, B_STOP_WATCHING, this);
if (status != B_OK)
return status;
BEntry entry;
while (directory.GetNextEntry(&entry, true) == B_OK) {
add_on_entry_info entry_info;
if (entry.GetName(entry_info.name) != B_OK) {
continue; // discard and proceed
}
if (entry.GetNodeRef(&entry_info.nref) != B_OK) {
continue; // discard and proceed
}
entry_info.dir_nref = *nref;
// TODO : handle refs
}
return B_OK;
}
DeviceManager::DeviceManager() DeviceManager::DeviceManager()
: :
fLock("device manager") fLock("device manager")
@@ -37,37 +132,7 @@ DeviceManager::~DeviceManager()
void void
DeviceManager::LoadState() DeviceManager::LoadState()
{ {
class IAHandler : public AddOnMonitorHandler {
private:
DeviceManager * fManager;
public:
IAHandler(DeviceManager * manager) {
fManager = manager;
}
virtual void AddOnCreated(const add_on_entry_info * entry_info) {
}
virtual void AddOnEnabled(const add_on_entry_info * entry_info) {
CALLED();
entry_ref ref;
make_entry_ref(entry_info->dir_nref.device, entry_info->dir_nref.node,
entry_info->name, &ref);
BEntry entry(&ref, false);
//fManager->RegisterAddOn(entry);
}
virtual void AddOnDisabled(const add_on_entry_info * entry_info) {
CALLED();
entry_ref ref;
make_entry_ref(entry_info->dir_nref.device, entry_info->dir_nref.node,
entry_info->name, &ref);
BEntry entry(&ref, false);
//fManager->UnregisterAddOn(entry);
}
virtual void AddOnRemoved(const add_on_entry_info * entry_info) {
}
};
fHandler = new IAHandler(this); fHandler = new IAHandler(this);
fAddOnMonitor = new AddOnMonitor(fHandler);
} }
@@ -75,10 +140,6 @@ void
DeviceManager::SaveState() DeviceManager::SaveState()
{ {
CALLED(); CALLED();
BMessenger messenger(fAddOnMonitor);
messenger.SendMessage(B_QUIT_REQUESTED);
int32 exit_value;
wait_for_thread(fAddOnMonitor->Thread(), &exit_value);
delete fHandler; delete fHandler;
} }
@@ -87,6 +148,9 @@ status_t
DeviceManager::StartMonitoringDevice(_BDeviceAddOn_ *addon, DeviceManager::StartMonitoringDevice(_BDeviceAddOn_ *addon,
const char *device) const char *device)
{ {
// test if already monitored
// monitor if needed
status_t err; status_t err;
node_ref nref; node_ref nref;
BDirectory directory; BDirectory directory;
@@ -98,6 +162,8 @@ DeviceManager::StartMonitoringDevice(_BDeviceAddOn_ *addon,
return B_OK; return B_OK;
} else } else
return err; return err;
// add in list
} }
@@ -105,6 +171,10 @@ status_t
DeviceManager::StopMonitoringDevice(_BDeviceAddOn_ *addon, DeviceManager::StopMonitoringDevice(_BDeviceAddOn_ *addon,
const char *device) const char *device)
{ {
// test if still monitored
// remove from list
// stop monitoring if needed
status_t err; status_t err;
node_ref nref; node_ref nref;
BDirectory directory; BDirectory directory;
@@ -116,4 +186,4 @@ DeviceManager::StopMonitoringDevice(_BDeviceAddOn_ *addon,
return B_OK; return B_OK;
} else } else
return err; return err;
} }
+15 -5
View File
@@ -10,14 +10,26 @@
// Manager for devices monitoring // Manager for devices monitoring
#include <Handler.h>
#include <Locker.h> #include <Locker.h>
#include <InputServerDevice.h> #include <InputServerDevice.h>
#include <InputServerFilter.h> #include <InputServerFilter.h>
#include <InputServerMethod.h> #include <InputServerMethod.h>
#include "AddOnMonitor.h"
#include "AddOnMonitorHandler.h"
#include "TList.h" #include "TList.h"
class DeviceManager;
class IAHandler : public BHandler {
public:
IAHandler(DeviceManager * manager);
void MessageReceived(BMessage * msg);
status_t AddDirectory(const node_ref * nref);
status_t RemoveDirectory(const node_ref * nref);
private:
DeviceManager * fManager;
};
class DeviceManager { class DeviceManager {
public: public:
DeviceManager(); DeviceManager();
@@ -36,9 +48,7 @@ class DeviceManager {
private: private:
BLocker fLock; BLocker fLock;
IAHandler *fHandler;
AddOnMonitorHandler *fHandler;
AddOnMonitor *fAddOnMonitor;
}; };
#endif // _DEVICE_MANAGER_H #endif // _DEVICE_MANAGER_H
+8
View File
@@ -72,12 +72,20 @@ class InputDeviceListItem
class _BDeviceAddOn_ class _BDeviceAddOn_
{ {
public:
_BDeviceAddOn_(BInputServerDevice *device)
: fDevice(device) {};
BInputServerDevice *fDevice;
}; };
class _BMethodAddOn_ class _BMethodAddOn_
{ {
public:
_BMethodAddOn_(BInputServerMethod *method)
: fMethod(method) {};
BInputServerMethod *fMethod;
}; };
/*****************************************************************************/ /*****************************************************************************/
+3
View File
@@ -41,6 +41,7 @@
*/ */
BInputServerDevice::BInputServerDevice() BInputServerDevice::BInputServerDevice()
{ {
fOwner = new _BDeviceAddOn_(this);
} }
@@ -73,6 +74,8 @@ BInputServerDevice::~BInputServerDevice()
} }
InputServer::gInputDeviceListLocker.Unlock(); InputServer::gInputDeviceListLocker.Unlock();
delete fOwner;
} }
+1
View File
@@ -42,6 +42,7 @@
BInputServerMethod::BInputServerMethod(const char *name, BInputServerMethod::BInputServerMethod(const char *name,
const uchar *icon) const uchar *icon)
{ {
fOwner = new _BMethodAddOn_(this);
} }