From 6e6fa57fb5940312dffc51461250f3b85b457cf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 26 Aug 2004 16:11:24 +0000 Subject: [PATCH] Added a device manager for devices monitoring git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8666 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/input/DeviceManager.cpp | 119 ++++++++++++++++++++++++ src/servers/input/DeviceManager.h | 44 +++++++++ src/servers/input/InputServer.cpp | 5 + src/servers/input/InputServer.h | 3 + src/servers/input/InputServerDevice.cpp | 8 +- src/servers/input/Jamfile | 1 + 6 files changed, 174 insertions(+), 6 deletions(-) create mode 100644 src/servers/input/DeviceManager.cpp create mode 100644 src/servers/input/DeviceManager.h diff --git a/src/servers/input/DeviceManager.cpp b/src/servers/input/DeviceManager.cpp new file mode 100644 index 0000000000..e1736c6ee5 --- /dev/null +++ b/src/servers/input/DeviceManager.cpp @@ -0,0 +1,119 @@ +/* +** Copyright 2004, the OpenBeOS project. All rights reserved. +** Distributed under the terms of the OpenBeOS License. +** +** Author : Jérôme Duval +** Original authors: Marcus Overhagen, Axel Dörfler +*/ + + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "DeviceManager.h" +#include "InputServer.h" + + +DeviceManager::DeviceManager() + : + fLock("device manager") +{ +} + + +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); +} + + +void +DeviceManager::SaveState() +{ + CALLED(); + BMessenger messenger(fAddOnMonitor); + messenger.SendMessage(B_QUIT_REQUESTED); + int32 exit_value; + wait_for_thread(fAddOnMonitor->Thread(), &exit_value); + delete fHandler; +} + + +status_t +DeviceManager::StartMonitoringDevice(_BDeviceAddOn_ *addon, + const char *device) +{ + status_t err; + node_ref nref; + BDirectory directory; + BPath path("/dev"); + if (((err = path.Append(device)) == B_OK) + && ((err = directory.SetTo(path.Path())) == B_OK) + && ((err = directory.GetNodeRef(&nref)) == B_OK) + && ((err = fHandler->AddDirectory(&nref)) == B_OK) ) { + return B_OK; + } else + return err; +} + + +status_t +DeviceManager::StopMonitoringDevice(_BDeviceAddOn_ *addon, + const char *device) +{ + status_t err; + node_ref nref; + BDirectory directory; + BPath path("/dev"); + if (((err = path.Append(device)) == B_OK) + && ((err = directory.SetTo(path.Path())) == B_OK) + && ((err = directory.GetNodeRef(&nref)) == B_OK) + /*&& ((err = fHandler->RemoveDirectory(&nref)) ==B_OK)*/) { + 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 new file mode 100644 index 0000000000..afbcf7c6e5 --- /dev/null +++ b/src/servers/input/DeviceManager.h @@ -0,0 +1,44 @@ +/* +** Copyright 2004, the OpenBeOS project. All rights reserved. +** Distributed under the terms of the OpenBeOS License. +** +** Author : Jérôme Duval +** Original authors: Marcus Overhagen, Axel Dörfler +*/ +#ifndef _DEVICE_MANAGER_H +#define _DEVICE_MANAGER_H + +// Manager for devices monitoring + +#include +#include +#include +#include +#include "AddOnMonitor.h" +#include "AddOnMonitorHandler.h" +#include "TList.h" + +class DeviceManager { + public: + DeviceManager(); + ~DeviceManager(); + + void LoadState(); + void SaveState(); + + status_t StartMonitoringDevice(_BDeviceAddOn_ *addon, + const char *device); + status_t StopMonitoringDevice(_BDeviceAddOn_ *addon, + const char *device); + + private: + + private: + + BLocker fLock; + + AddOnMonitorHandler *fHandler; + AddOnMonitor *fAddOnMonitor; +}; + +#endif // _DEVICE_MANAGER_H diff --git a/src/servers/input/InputServer.cpp b/src/servers/input/InputServer.cpp index 831987c637..a115583b55 100644 --- a/src/servers/input/InputServer.cpp +++ b/src/servers/input/InputServer.cpp @@ -73,6 +73,8 @@ BLocker InputServer::gInputFilterListLocker; BList InputServer::gInputMethodList; BLocker InputServer::gInputMethodListLocker; +DeviceManager InputServer::gDeviceManager; + /*BList InputServer::mInputServerDeviceList; BList InputServer::mInputServerFilterList; BList InputServer::mInputServerMethodList;*/ @@ -103,6 +105,8 @@ InputServer::InputServer(void) : BApplication("application/x-vnd.OBOS-input_serv EventLoop(pointer); // InitTestDevice(); + + gDeviceManager.LoadState(); fAddOnManager = new AddOnManager(); fAddOnManager->LoadState(); @@ -484,6 +488,7 @@ InputServer::QuitRequested(void) { CALLED(); fAddOnManager->SaveState(); + gDeviceManager.SaveState(); kill_thread(ISPortThread); delete_port(EventLooperPort); diff --git a/src/servers/input/InputServer.h b/src/servers/input/InputServer.h index fe07646983..78f58364e1 100644 --- a/src/servers/input/InputServer.h +++ b/src/servers/input/InputServer.h @@ -35,6 +35,7 @@ #include #include #include "AddOnManager.h" +#include "DeviceManager.h" #include #include @@ -169,6 +170,8 @@ public: static BList gInputMethodList; static BLocker gInputMethodListLocker; + static DeviceManager gDeviceManager; + private: /*void InitTestDevice(); diff --git a/src/servers/input/InputServerDevice.cpp b/src/servers/input/InputServerDevice.cpp index 05e360a99f..15c40e36ed 100644 --- a/src/servers/input/InputServerDevice.cpp +++ b/src/servers/input/InputServerDevice.cpp @@ -229,10 +229,8 @@ BInputServerDevice::StartMonitoringDevice(const char *device) { CALLED(); PRINT(("StartMonitoringDevice %s\n", device)); - - status_t status = B_OK; - return status; + return InputServer::gDeviceManager.StartMonitoringDevice(fOwner, device); } @@ -244,9 +242,7 @@ status_t BInputServerDevice::StopMonitoringDevice(const char *device) { CALLED(); - status_t status = B_OK; - - return status; + return InputServer::gDeviceManager.StopMonitoringDevice(fOwner, device); } /** diff --git a/src/servers/input/Jamfile b/src/servers/input/Jamfile index 8c672c6252..7552abd2c1 100644 --- a/src/servers/input/Jamfile +++ b/src/servers/input/Jamfile @@ -17,6 +17,7 @@ Server input_server : InputServerMethod.cpp AddOnManager.cpp + DeviceManager.cpp # storage AddOnMonitor.cpp