From b69a5532aee3a9b3e410c09e9353886df6972da3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 27 Aug 2004 06:46:21 +0000 Subject: [PATCH] reworked device manager git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8671 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/input/AddOnManager.cpp | 4 +- src/servers/input/DeviceManager.cpp | 140 ++++++++++++++++++------ src/servers/input/DeviceManager.h | 20 +++- src/servers/input/InputServer.h | 8 ++ src/servers/input/InputServerDevice.cpp | 3 + src/servers/input/InputServerMethod.cpp | 1 + 6 files changed, 134 insertions(+), 42 deletions(-) diff --git a/src/servers/input/AddOnManager.cpp b/src/servers/input/AddOnManager.cpp index ecabb52998..268b084cf8 100644 --- a/src/servers/input/AddOnManager.cpp +++ b/src/servers/input/AddOnManager.cpp @@ -354,7 +354,7 @@ AddOnManager::RegisterDevice(BInputServerDevice *device, const entry_ref &ref, i info.ref = ref; info.addon_image = addon_image; info.isd = device; - info.addon = new _BDeviceAddOn_; + //info.addon = new _BDeviceAddOn_; fDeviceList.Insert(info); } @@ -407,7 +407,7 @@ AddOnManager::RegisterMethod(BInputServerMethod *method, const entry_ref &ref, i info.ref = ref; info.addon_image = addon_image; info.ism = method; - info.addon = new _BMethodAddOn_; + //info.addon = new _BMethodAddOn_; fMethodList.Insert(info); diff --git a/src/servers/input/DeviceManager.cpp b/src/servers/input/DeviceManager.cpp index e1736c6ee5..bef1048310 100644 --- a/src/servers/input/DeviceManager.cpp +++ b/src/servers/input/DeviceManager.cpp @@ -22,6 +22,101 @@ #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() : fLock("device manager") @@ -37,37 +132,7 @@ DeviceManager::~DeviceManager() void 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); - fAddOnMonitor = new AddOnMonitor(fHandler); } @@ -75,10 +140,6 @@ void DeviceManager::SaveState() { CALLED(); - BMessenger messenger(fAddOnMonitor); - messenger.SendMessage(B_QUIT_REQUESTED); - int32 exit_value; - wait_for_thread(fAddOnMonitor->Thread(), &exit_value); delete fHandler; } @@ -87,6 +148,9 @@ status_t DeviceManager::StartMonitoringDevice(_BDeviceAddOn_ *addon, const char *device) { + // test if already monitored + + // monitor if needed status_t err; node_ref nref; BDirectory directory; @@ -98,6 +162,8 @@ DeviceManager::StartMonitoringDevice(_BDeviceAddOn_ *addon, return B_OK; } else return err; + + // add in list } @@ -105,6 +171,10 @@ status_t DeviceManager::StopMonitoringDevice(_BDeviceAddOn_ *addon, const char *device) { + // test if still monitored + // remove from list + + // stop monitoring if needed status_t err; node_ref nref; BDirectory directory; @@ -116,4 +186,4 @@ DeviceManager::StopMonitoringDevice(_BDeviceAddOn_ *addon, return B_OK; } else return err; -} \ No newline at end of file +} diff --git a/src/servers/input/DeviceManager.h b/src/servers/input/DeviceManager.h index afbcf7c6e5..30290e4246 100644 --- a/src/servers/input/DeviceManager.h +++ b/src/servers/input/DeviceManager.h @@ -10,14 +10,26 @@ // Manager for devices monitoring +#include #include #include #include #include -#include "AddOnMonitor.h" -#include "AddOnMonitorHandler.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 { public: DeviceManager(); @@ -36,9 +48,7 @@ class DeviceManager { private: BLocker fLock; - - AddOnMonitorHandler *fHandler; - AddOnMonitor *fAddOnMonitor; + IAHandler *fHandler; }; #endif // _DEVICE_MANAGER_H diff --git a/src/servers/input/InputServer.h b/src/servers/input/InputServer.h index 78f58364e1..f38a62ebf1 100644 --- a/src/servers/input/InputServer.h +++ b/src/servers/input/InputServer.h @@ -72,12 +72,20 @@ class InputDeviceListItem class _BDeviceAddOn_ { + public: + _BDeviceAddOn_(BInputServerDevice *device) + : fDevice(device) {}; + BInputServerDevice *fDevice; }; class _BMethodAddOn_ { + public: + _BMethodAddOn_(BInputServerMethod *method) + : fMethod(method) {}; + BInputServerMethod *fMethod; }; /*****************************************************************************/ diff --git a/src/servers/input/InputServerDevice.cpp b/src/servers/input/InputServerDevice.cpp index 15c40e36ed..6af97b5287 100644 --- a/src/servers/input/InputServerDevice.cpp +++ b/src/servers/input/InputServerDevice.cpp @@ -41,6 +41,7 @@ */ BInputServerDevice::BInputServerDevice() { + fOwner = new _BDeviceAddOn_(this); } @@ -73,6 +74,8 @@ BInputServerDevice::~BInputServerDevice() } InputServer::gInputDeviceListLocker.Unlock(); + + delete fOwner; } diff --git a/src/servers/input/InputServerMethod.cpp b/src/servers/input/InputServerMethod.cpp index 5365d46af7..8f406e21b0 100644 --- a/src/servers/input/InputServerMethod.cpp +++ b/src/servers/input/InputServerMethod.cpp @@ -42,6 +42,7 @@ BInputServerMethod::BInputServerMethod(const char *name, const uchar *icon) { + fOwner = new _BMethodAddOn_(this); }