Clean a bit the devfs monitoring stuff. Now monitores the correct folder, and registers everything that is already present(hotplugging not tested)
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29090 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
06b6c3cbfa
commit
734ab97cfa
@ -77,7 +77,10 @@ void BluetoothServer::ArgvReceived(int32 argc, char **argv)
|
||||
|
||||
void BluetoothServer::ReadyToRun(void)
|
||||
{
|
||||
fDeviceManager->StartMonitoringDevice("bluetooth/h2generic");
|
||||
fDeviceManager->StartMonitoringDevice("bluetooth/h2");
|
||||
fDeviceManager->StartMonitoringDevice("bluetooth/h3");
|
||||
fDeviceManager->StartMonitoringDevice("bluetooth/h4");
|
||||
fDeviceManager->StartMonitoringDevice("bluetooth/h5");
|
||||
// Launch the notifier thread
|
||||
if ( resume_thread(fEventListener) != B_OK )
|
||||
{
|
||||
|
@ -1,16 +1,3 @@
|
||||
/*
|
||||
** Copyright 2004, the Haiku project. All rights reserved.
|
||||
** Distributed under the terms of the Haiku License.
|
||||
**
|
||||
**
|
||||
** Author : Jérôme Duval
|
||||
** Original authors: Marcus Overhagen, Axel Dörfler
|
||||
**
|
||||
** Bluetooth adaptation: Oliver Ruiz Dorantes
|
||||
**
|
||||
*/
|
||||
|
||||
|
||||
#include <Application.h>
|
||||
#include <Autolock.h>
|
||||
#include <String.h>
|
||||
@ -36,46 +23,56 @@
|
||||
|
||||
|
||||
void
|
||||
DeviceManager::MessageReceived(BMessage * msg)
|
||||
DeviceManager::MessageReceived(BMessage* msg)
|
||||
{
|
||||
if (msg->what == B_NODE_MONITOR) {
|
||||
int32 opcode;
|
||||
if (msg->FindInt32("opcode", &opcode) == B_OK) {
|
||||
switch (opcode) {
|
||||
case B_ENTRY_CREATED:
|
||||
case B_ENTRY_REMOVED:
|
||||
case B_ENTRY_MOVED:
|
||||
{
|
||||
node_ref dir_nref;
|
||||
const char *name;
|
||||
BDirectory dir;
|
||||
|
||||
(Output::Instance()->Post("Bus changing ...\n", BLACKBOARD_DEVICEMANAGER));
|
||||
|
||||
if ((msg->FindInt32("device", &dir_nref.device)!=B_OK)
|
||||
|| (msg->FindInt64("directory", &dir_nref.node)!=B_OK)
|
||||
|| (msg->FindString("name", &name) != B_OK))
|
||||
return;
|
||||
switch (opcode) {
|
||||
case B_ENTRY_CREATED:
|
||||
case B_ENTRY_MOVED:
|
||||
{
|
||||
entry_ref ref;
|
||||
const char *name;
|
||||
BDirectory dir;
|
||||
|
||||
// Check if the entry is a File or a directory
|
||||
if (dir.SetTo(&dir_nref) == B_OK) {
|
||||
(Output::Instance()->Post(name, BLACKBOARD_DEVICEMANAGER));
|
||||
(Output::Instance()->Post(" adding folder...\n", BLACKBOARD_DEVICEMANAGER));
|
||||
AddDirectory(&dir_nref);
|
||||
} else {
|
||||
// Then it is a device!
|
||||
// post it to server
|
||||
// msg->what = BT_MSG_ADD_DEVICE;
|
||||
// be_app_messenger.SendMessage(msg);
|
||||
// (Output::Instance()->Post("New bluetooth device on bus ...\n", BLACKBOARD_DEVICEMANAGER));
|
||||
}
|
||||
}
|
||||
case B_STAT_CHANGED:
|
||||
case B_ATTR_CHANGED:
|
||||
case B_DEVICE_MOUNTED:
|
||||
case B_DEVICE_UNMOUNTED:
|
||||
default:
|
||||
BLooper::MessageReceived(msg);
|
||||
Output::Instance()->Post("Something new in the bus ... ", BLACKBOARD_DEVICEMANAGER);
|
||||
|
||||
if ((msg->FindInt32("device", &ref.device)!=B_OK)
|
||||
|| (msg->FindInt64("directory", &ref.directory)!=B_OK)
|
||||
|| (msg->FindString("name", &name) != B_OK))
|
||||
return;
|
||||
|
||||
Output::Instance()->Postf(BLACKBOARD_DEVICEMANAGER, " -> %s\n", name);
|
||||
|
||||
ref.set_name(name);
|
||||
|
||||
// Check if the entry is a File or a directory
|
||||
if (dir.SetTo(&ref) == B_OK) {
|
||||
printf("%s: Entry %s is taken as a dir\n", __FUNCTION__, name);
|
||||
node_ref nref;
|
||||
dir.GetNodeRef(&nref);
|
||||
AddDirectory(&nref);
|
||||
|
||||
} else {
|
||||
printf("%s: Entry %s is taken as a file\n", __FUNCTION__, name);
|
||||
AddDevice(&ref);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case B_ENTRY_REMOVED:
|
||||
{
|
||||
Output::Instance()->Post("Something removed from the bus ...\n",
|
||||
BLACKBOARD_DEVICEMANAGER);
|
||||
|
||||
}
|
||||
break;
|
||||
case B_STAT_CHANGED:
|
||||
case B_ATTR_CHANGED:
|
||||
case B_DEVICE_MOUNTED:
|
||||
case B_DEVICE_UNMOUNTED:
|
||||
default:
|
||||
BLooper::MessageReceived(msg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -87,43 +84,35 @@ status_t
|
||||
DeviceManager::AddDirectory(node_ref *nref)
|
||||
{
|
||||
BDirectory directory(nref);
|
||||
status_t status = directory.InitCheck();
|
||||
if (status != B_OK) {
|
||||
(Output::Instance()->Post("AddDirectory::Initcheck Failed\n", BLACKBOARD_DEVICEMANAGER));
|
||||
status_t status = directory.InitCheck();
|
||||
if (status != B_OK) {
|
||||
Output::Instance()->Post("AddDirectory::Initcheck Failed\n", BLACKBOARD_DEVICEMANAGER);
|
||||
return status;
|
||||
}
|
||||
|
||||
status = watch_node(nref, B_WATCH_DIRECTORY, this);
|
||||
if (status != B_OK) {
|
||||
(Output::Instance()->Post("AddDirectory::watch_node Failed\n", BLACKBOARD_DEVICEMANAGER));
|
||||
if (status != B_OK) {
|
||||
Output::Instance()->Post("AddDirectory::watch_node Failed\n", BLACKBOARD_DEVICEMANAGER);
|
||||
return status;
|
||||
}
|
||||
|
||||
BEntry entry;
|
||||
while (directory.GetNextEntry(&entry, true) == B_OK) {
|
||||
|
||||
// its suposed to be devices ...
|
||||
entry_ref ref;
|
||||
entry.GetRef(&ref);
|
||||
BPath path(new BEntry(&ref));
|
||||
BString* str = new BString(path.Path());
|
||||
|
||||
BMessage* msg = new BMessage(BT_MSG_ADD_DEVICE);
|
||||
msg->AddInt32("opcode", B_ENTRY_CREATED);
|
||||
msg->AddInt32("device", nref->device);
|
||||
msg->AddInt64("directory", nref->node);
|
||||
msg->AddString("name", *str );
|
||||
|
||||
be_app_messenger.SendMessage(msg);
|
||||
|
||||
|
||||
(Output::Instance()->Post( path.Path(), BLACKBOARD_DEVICEMANAGER));
|
||||
(Output::Instance()->Post(" Entry added\n", BLACKBOARD_DEVICEMANAGER));
|
||||
// BPath path(*nref);
|
||||
// BString str(path.Path());
|
||||
//
|
||||
// Output::Instance()->Postf(BLACKBOARD_DEVICEMANAGER,
|
||||
// "Exploring entries in %s\n", str.String());
|
||||
|
||||
entry_ref ref;
|
||||
status_t error;
|
||||
while ((error = directory.GetNextRef(&ref)) == B_OK) {
|
||||
// its suposed to be devices ...
|
||||
AddDevice(&ref);
|
||||
}
|
||||
(Output::Instance()->Post("Finished exploring entries\n", BLACKBOARD_DEVICEMANAGER));
|
||||
|
||||
return B_OK;
|
||||
Output::Instance()->Postf(BLACKBOARD_DEVICEMANAGER,
|
||||
"Finished exploring entries(%s)\n", strerror(error));
|
||||
|
||||
return (error == B_OK || error == B_ENTRY_NOT_FOUND)?B_OK:error;
|
||||
}
|
||||
|
||||
|
||||
@ -131,7 +120,7 @@ status_t
|
||||
DeviceManager::RemoveDirectory(node_ref* nref)
|
||||
{
|
||||
BDirectory directory(nref);
|
||||
status_t status = directory.InitCheck();
|
||||
status_t status = directory.InitCheck();
|
||||
if (status != B_OK)
|
||||
return status;
|
||||
|
||||
@ -140,7 +129,7 @@ DeviceManager::RemoveDirectory(node_ref* nref)
|
||||
return status;
|
||||
|
||||
BEntry entry;
|
||||
while (directory.GetNextEntry(&entry, true) == B_OK) {
|
||||
while (directory.GetNextEntry(&entry, true) == B_OK) {
|
||||
entry_ref ref;
|
||||
entry.GetRef(&ref);
|
||||
BMessage msg(B_NODE_MONITOR);
|
||||
@ -148,17 +137,35 @@ DeviceManager::RemoveDirectory(node_ref* nref)
|
||||
msg.AddInt32("device", nref->device);
|
||||
msg.AddInt64("directory", nref->node);
|
||||
msg.AddString("name", ref.name);
|
||||
//addon->fDevice->Control(NULL, NULL, msg.what, &msg);
|
||||
//addon->fDevice->Control(NULL, NULL, msg.what, &msg);
|
||||
}
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
DeviceManager::DeviceManager()
|
||||
:
|
||||
fLock("device manager")
|
||||
status_t
|
||||
DeviceManager::AddDevice(entry_ref* ref)
|
||||
{
|
||||
BPath path(ref);
|
||||
BString* str = new BString(path.Path());
|
||||
|
||||
BMessage* msg = new BMessage(BT_MSG_ADD_DEVICE);
|
||||
msg->AddInt32("opcode", B_ENTRY_CREATED);
|
||||
msg->AddInt32("device", ref->device);
|
||||
msg->AddInt64("directory", ref->directory);
|
||||
|
||||
msg->AddString("name", *str );
|
||||
|
||||
Output::Instance()->Postf(BLACKBOARD_DEVICEMANAGER, "Device %s registered\n", path.Path());
|
||||
return be_app_messenger.SendMessage(msg);
|
||||
}
|
||||
|
||||
|
||||
DeviceManager::DeviceManager() :
|
||||
fLock("device manager")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -171,7 +178,6 @@ DeviceManager::~DeviceManager()
|
||||
void
|
||||
DeviceManager::LoadState()
|
||||
{
|
||||
|
||||
if (!Lock())
|
||||
return;
|
||||
Run();
|
||||
@ -182,11 +188,12 @@ DeviceManager::LoadState()
|
||||
void
|
||||
DeviceManager::SaveState()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
DeviceManager::StartMonitoringDevice(const char *device)
|
||||
status_t
|
||||
DeviceManager::StartMonitoringDevice(const char *device)
|
||||
{
|
||||
|
||||
status_t err;
|
||||
@ -195,135 +202,125 @@ DeviceManager::StartMonitoringDevice(const char *device)
|
||||
BPath path("/dev");
|
||||
|
||||
/* Build the path */
|
||||
if ((err = path.Append(device)) != B_OK) {
|
||||
if ((err = path.Append(device)) != B_OK) {
|
||||
printf("DeviceManager::StartMonitoringDevice BPath::Append() error %s: %s\n", path.Path(), strerror(err));
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Check the path */
|
||||
if ((err = directory.SetTo(path.Path())) != B_OK) {
|
||||
/* Entry not there ... */
|
||||
if (err != B_ENTRY_NOT_FOUND) { // something else we cannot handle
|
||||
printf("DeviceManager::StartMonitoringDevice SetTo error %s: %s\n", path.Path(), strerror(err));
|
||||
if ((err = directory.SetTo(path.Path())) != B_OK) {
|
||||
/* Entry not there ... */
|
||||
if (err != B_ENTRY_NOT_FOUND) { // something else we cannot handle
|
||||
printf("DeviceManager::StartMonitoringDevice SetTo error %s: %s\n", path.Path(), strerror(err));
|
||||
return err;
|
||||
}
|
||||
/* Create it */
|
||||
if ((err = create_directory(path.Path(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) != B_OK
|
||||
|| (err = directory.SetTo(path.Path())) != B_OK) {
|
||||
|| (err = directory.SetTo(path.Path())) != B_OK) {
|
||||
printf("DeviceManager::StartMonitoringDevice CreateDirectory error %s: %s\n", path.Path(), strerror(err));
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
/* get noderef */
|
||||
if ((err = directory.GetNodeRef(&nref)) != B_OK) {
|
||||
printf("DeviceManager::StartMonitoringDevice GetNodeRef error %s: %s\n", path.Path(), strerror(err));
|
||||
|
||||
// get noderef
|
||||
if ((err = directory.GetNodeRef(&nref)) != B_OK) {
|
||||
printf("DeviceManager::StartMonitoringDevice GetNodeRef error %s: %s\n", path.Path(), strerror(err));
|
||||
return err;
|
||||
}
|
||||
|
||||
// test if already monitored in any add-on
|
||||
|
||||
(Output::Instance()->Post(device, BLACKBOARD_DEVICEMANAGER));
|
||||
(Output::Instance()->Post(" Being monitorized\n", BLACKBOARD_DEVICEMANAGER));
|
||||
|
||||
bool alreadyMonitored = false;
|
||||
#if 0
|
||||
HCIDelegate *tmphd = NULL;
|
||||
int32 i = 0;
|
||||
// start monitoring the root
|
||||
status_t error = watch_node(&nref, B_WATCH_DIRECTORY, this);
|
||||
if (error != B_OK)
|
||||
return error;
|
||||
|
||||
// TODO!! ask the server if this needs to be monitored
|
||||
Output::Instance()->Postf(BLACKBOARD_DEVICEMANAGER, "%s path being monitorized\n", path.Path());
|
||||
|
||||
while ((tmphd = (HCIDelegate *)fDelegatesList.ItemAt(i++)) !=NULL) {
|
||||
// We are monitoring the root we may have already directories inside
|
||||
// to be monitored
|
||||
entry_ref driverRef;
|
||||
while ((error = directory.GetNextRef(&driverRef)) == B_OK) {
|
||||
|
||||
/* Find out the reference*/
|
||||
node_ref *dnref = (node_ref *)tmphd->fMonitoredRefs ;
|
||||
if (*dnref == nref) {
|
||||
// its suposed to be directories that needs to be monitored...
|
||||
BNode driverNode(&driverRef);
|
||||
node_ref driverNRef;
|
||||
driverNode.GetNodeRef(&driverNRef);
|
||||
AddDirectory(&driverNRef);
|
||||
}
|
||||
|
||||
Output::Instance()->Postf(BLACKBOARD_DEVICEMANAGER, "Finished exploring entries(%s)\n", strerror(error));
|
||||
|
||||
#if 0
|
||||
HCIDelegate *tmphd = NULL;
|
||||
int32 i = 0;
|
||||
|
||||
// TODO!! ask the server if this needs to be monitored
|
||||
|
||||
while ((tmphd = (HCIDelegate *)fDelegatesList.ItemAt(i++)) !=NULL) {
|
||||
|
||||
/* Find out the reference*/
|
||||
node_ref *dnref = (node_ref *)tmphd->fMonitoredRefs ;
|
||||
if (*dnref == nref) {
|
||||
printf("StartMonitoringDevice already monitored\n");
|
||||
alreadyMonitored = true;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
// monitor if needed
|
||||
if (!alreadyMonitored) {
|
||||
if ((err = AddDirectory(&nref)) != 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; // why rechecking?
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
status_t
|
||||
DeviceManager::StopMonitoringDevice(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))
|
||||
if (((err = path.Append(device)) != B_OK)
|
||||
|| ((err = directory.SetTo(path.Path())) != B_OK)
|
||||
|| ((err = directory.GetNodeRef(&nref)) != B_OK))
|
||||
return err;
|
||||
|
||||
// test if still monitored
|
||||
bool stillMonitored = false;
|
||||
|
||||
// test if still monitored
|
||||
bool stillMonitored = false;
|
||||
/*
|
||||
int32 i = 0;
|
||||
while ((tmpaddon = (_BDeviceAddOn_ *)fDeviceAddons.ItemAt(i++)) !=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) {
|
||||
node_ref *dnref = NULL;
|
||||
while ((dnref = (node_ref *)tmpaddon->fMonitoredRefs.ItemAt(j++)) != NULL) {
|
||||
if (*dnref == nref) {
|
||||
stillMonitored = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (stillMonitored)
|
||||
break;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// remove from list
|
||||
node_ref *dnref = NULL;
|
||||
node_ref *dnref = NULL;
|
||||
int32 j=0;
|
||||
while ((dnref = (node_ref *)addon->fMonitoredRefs.ItemAt(j)) != NULL) {
|
||||
if (*dnref == nref) {
|
||||
while ((dnref = (node_ref *)addon->fMonitoredRefs.ItemAt(j)) != NULL) {
|
||||
if (*dnref == nref) {
|
||||
addon->fMonitoredRefs.RemoveItem(j);
|
||||
delete dnref;
|
||||
break;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
|
||||
// stop monitoring if needed
|
||||
|
||||
// stop monitoring if needed
|
||||
if (!stillMonitored) {
|
||||
if ((err = RemoveDirectory(&nref, addon)) != B_OK)
|
||||
return err;
|
||||
}
|
||||
*/
|
||||
}
|
||||
*/
|
||||
return B_OK;
|
||||
}
|
||||
|
@ -9,16 +9,11 @@
|
||||
#define _DEVICE_MANAGER_H
|
||||
|
||||
// Manager for devices monitoring
|
||||
|
||||
#include <Handler.h>
|
||||
#include <Node.h>
|
||||
#include <Looper.h>
|
||||
#include <Locker.h>
|
||||
/*#include <InputServerDevice.h>
|
||||
#include <InputServerFilter.h>
|
||||
#include <InputServerMethod.h>
|
||||
#include "TList.h"
|
||||
*/
|
||||
|
||||
|
||||
class DeviceManager : public BLooper {
|
||||
public:
|
||||
@ -28,14 +23,15 @@ class DeviceManager : public BLooper {
|
||||
void LoadState();
|
||||
void SaveState();
|
||||
|
||||
status_t StartMonitoringDevice(const char *device);
|
||||
status_t StopMonitoringDevice(const char *device);
|
||||
status_t StartMonitoringDevice(const char* device);
|
||||
status_t StopMonitoringDevice(const char* device);
|
||||
|
||||
void MessageReceived(BMessage *msg);
|
||||
|
||||
private:
|
||||
status_t AddDirectory(node_ref *nref);
|
||||
status_t RemoveDirectory(node_ref *nref);
|
||||
status_t AddDirectory(node_ref* nref);
|
||||
status_t RemoveDirectory(node_ref* nref);
|
||||
status_t AddDevice(entry_ref* nref);
|
||||
|
||||
BLocker fLock;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user