189 lines
3.2 KiB
C++
189 lines
3.2 KiB
C++
/*
|
|
* Copyright 2002-2008, Haiku, Inc. All Rights Reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*/
|
|
|
|
|
|
#include <InputServerDevice.h>
|
|
|
|
#include <new>
|
|
|
|
#include <Directory.h>
|
|
#include <Path.h>
|
|
|
|
#include "InputServer.h"
|
|
|
|
|
|
DeviceAddOn::DeviceAddOn(BInputServerDevice *device)
|
|
:
|
|
fDevice(device)
|
|
{
|
|
}
|
|
|
|
|
|
DeviceAddOn::~DeviceAddOn()
|
|
{
|
|
while (const char* path = fMonitoredPaths.PathAt(0)) {
|
|
gInputServer->AddOnManager()->StopMonitoringDevice(this, path);
|
|
}
|
|
}
|
|
|
|
|
|
bool
|
|
DeviceAddOn::HasPath(const char* path) const
|
|
{
|
|
return fMonitoredPaths.HasPath(path);
|
|
}
|
|
|
|
|
|
status_t
|
|
DeviceAddOn::AddPath(const char* path)
|
|
{
|
|
return fMonitoredPaths.AddPath(path);
|
|
}
|
|
|
|
|
|
status_t
|
|
DeviceAddOn::RemovePath(const char* path)
|
|
{
|
|
return fMonitoredPaths.RemovePath(path);
|
|
}
|
|
|
|
|
|
int32
|
|
DeviceAddOn::CountPaths() const
|
|
{
|
|
return fMonitoredPaths.CountPaths();
|
|
}
|
|
|
|
|
|
// #pragma mark -
|
|
|
|
|
|
BInputServerDevice::BInputServerDevice()
|
|
{
|
|
fOwner = new(std::nothrow) DeviceAddOn(this);
|
|
}
|
|
|
|
|
|
BInputServerDevice::~BInputServerDevice()
|
|
{
|
|
CALLED();
|
|
|
|
gInputServer->UnregisterDevices(*this);
|
|
delete fOwner;
|
|
}
|
|
|
|
|
|
status_t
|
|
BInputServerDevice::InitCheck()
|
|
{
|
|
if (fOwner == NULL)
|
|
return B_NO_MEMORY;
|
|
return B_OK;
|
|
}
|
|
|
|
|
|
status_t
|
|
BInputServerDevice::SystemShuttingDown()
|
|
{
|
|
return B_OK;
|
|
}
|
|
|
|
|
|
status_t
|
|
BInputServerDevice::Start(const char* device, void* cookie)
|
|
{
|
|
return B_OK;
|
|
}
|
|
|
|
|
|
status_t
|
|
BInputServerDevice::Stop(const char* device, void* cookie)
|
|
{
|
|
return B_OK;
|
|
}
|
|
|
|
|
|
status_t
|
|
BInputServerDevice::Control(const char* device, void* cookie,
|
|
uint32 code, BMessage* message)
|
|
{
|
|
return B_OK;
|
|
}
|
|
|
|
|
|
status_t
|
|
BInputServerDevice::RegisterDevices(input_device_ref** devices)
|
|
{
|
|
CALLED();
|
|
return gInputServer->RegisterDevices(*this, devices);
|
|
}
|
|
|
|
|
|
status_t
|
|
BInputServerDevice::UnregisterDevices(input_device_ref** devices)
|
|
{
|
|
CALLED();
|
|
// TODO: is this function supposed to remove devices that do not belong to this object?
|
|
// (at least that's what the previous implementation allowed for)
|
|
return gInputServer->UnregisterDevices(*this, devices);
|
|
}
|
|
|
|
|
|
status_t
|
|
BInputServerDevice::EnqueueMessage(BMessage* message)
|
|
{
|
|
return gInputServer->EnqueueDeviceMessage(message);
|
|
}
|
|
|
|
|
|
status_t
|
|
BInputServerDevice::StartMonitoringDevice(const char* device)
|
|
{
|
|
CALLED();
|
|
PRINT(("StartMonitoringDevice %s\n", device));
|
|
|
|
return gInputServer->AddOnManager()->StartMonitoringDevice(fOwner, device);
|
|
}
|
|
|
|
|
|
status_t
|
|
BInputServerDevice::StopMonitoringDevice(const char* device)
|
|
{
|
|
return gInputServer->AddOnManager()->StopMonitoringDevice(fOwner, device);
|
|
}
|
|
|
|
|
|
status_t
|
|
BInputServerDevice::AddDevices(const char* path)
|
|
{
|
|
BDirectory directory;
|
|
status_t status = directory.SetTo(path);
|
|
if (status != B_OK)
|
|
return status;
|
|
|
|
BEntry entry;
|
|
while (directory.GetNextEntry(&entry) == B_OK) {
|
|
BPath entryPath(&entry);
|
|
|
|
if (entry.IsDirectory()) {
|
|
AddDevices(entryPath.Path());
|
|
} else {
|
|
BMessage added(B_NODE_MONITOR);
|
|
added.AddInt32("opcode", B_ENTRY_CREATED);
|
|
added.AddString("path", entryPath.Path());
|
|
|
|
Control(NULL, NULL, B_INPUT_DEVICE_ADDED, &added);
|
|
}
|
|
}
|
|
|
|
return B_OK;
|
|
}
|
|
|
|
|
|
void BInputServerDevice::_ReservedInputServerDevice1() {}
|
|
void BInputServerDevice::_ReservedInputServerDevice2() {}
|
|
void BInputServerDevice::_ReservedInputServerDevice3() {}
|
|
void BInputServerDevice::_ReservedInputServerDevice4() {}
|