reworked device manager
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8671 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,7 @@
|
|||||||
BInputServerMethod::BInputServerMethod(const char *name,
|
BInputServerMethod::BInputServerMethod(const char *name,
|
||||||
const uchar *icon)
|
const uchar *icon)
|
||||||
{
|
{
|
||||||
|
fOwner = new _BMethodAddOn_(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user