IOHIDResourceUserClient.h [plain text]
#ifndef _IOHIDRESOURCE_USERCLIENT_H
#define _IOHIDRESOURCE_USERCLIENT_H
#include <IOKit/hid/IOHIDKeys.h>
typedef enum {
kIOHIDResourceUserClientTypeDevice = 0
} IOHIDResourceUserClientType;
typedef enum {
kIOHIDResourceDeviceUserClientMethodCreate,
kIOHIDResourceDeviceUserClientMethodTerminate,
kIOHIDResourceDeviceUserClientMethodHandleReport,
kIOHIDResourceDeviceUserClientMethodPostReportResponse,
kIOHIDResourceDeviceUserClientMethodCount
} IOHIDResourceDeviceUserClientExternalMethods;
typedef enum {
kIOHIDResourceUserClientResponseIndexResult = 0,
kIOHIDResourceUserClientResponseIndexToken,
kIOHIDResourceUserClientResponseIndexCount
} IOHIDResourceUserClientResponseIndex;
typedef enum {
kIOHIDResourceReportDirectionIn,
kIOHIDResourceReportDirectionOut
} IOHIDResourceReportDirection;
typedef struct {
IOHIDResourceReportDirection direction;
IOHIDReportType type;
uint32_t reportID;
uint32_t length;
uint64_t token;
} IOHIDResourceDataQueueHeader;
#if KERNEL
#include <IOKit/IOUserClient.h>
#include <IOKit/IOSharedDataQueue.h>
#include <IOKit/IOCommandGate.h>
#include <IOKit/IOTimerEventSource.h>
#include "IOHIDResource.h"
#include "IOHIDUserDevice.h"
class IOHIDResourceQueue: public IOSharedDataQueue
{
OSDeclareDefaultStructors( IOHIDResourceQueue )
protected:
IOMemoryDescriptor * _descriptor;
public:
static IOHIDResourceQueue *withCapacity(UInt32 capacity);
virtual void free();
virtual Boolean enqueueReport(IOHIDResourceDataQueueHeader * header, IOMemoryDescriptor * report = NULL);
virtual IOMemoryDescriptor *getMemoryDescriptor();
virtual void setNotificationPort(mach_port_t port);
};
class IOHIDResourceDeviceUserClient : public IOUserClient
{
OSDeclareDefaultStructors(IOHIDResourceDeviceUserClient);
private:
IOHIDResource * _owner;
OSDictionary * _properties;
IOHIDUserDevice * _device;
IOTimerEventSource * _createDeviceTimer;
IOCommandGate * _commandGate;
mach_port_t _port;
IOHIDResourceQueue * _queue;
OSSet * _pending;
uint32_t _maxClientTimeoutUS;
u_int64_t _tokenIndex;
static const IOExternalMethodDispatch _methods[kIOHIDResourceDeviceUserClientMethodCount];
static IOReturn _createDevice(IOHIDResourceDeviceUserClient *target, void *reference, IOExternalMethodArguments *arguments);
static IOReturn _terminateDevice(IOHIDResourceDeviceUserClient *target, void *reference, IOExternalMethodArguments *arguments);
static IOReturn _handleReport(IOHIDResourceDeviceUserClient *target, void *reference, IOExternalMethodArguments *arguments);
static IOReturn _postReportResult(IOHIDResourceDeviceUserClient *target, void *reference, IOExternalMethodArguments *arguments);
void createAndStartDeviceAsyncCallback();
typedef struct {
uint32_t selector;
IOExternalMethodArguments * arguments;
IOExternalMethodDispatch * dispatch;
OSObject * target;
void * reference;
} ExternalMethodGatedArguments;
IOReturn externalMethodGated(ExternalMethodGatedArguments * arguments);
IOReturn registerNotificationPortGated(mach_port_t port);
IOReturn clientMemoryForTypeGated(IOOptionBits * options, IOMemoryDescriptor ** memory);
typedef struct {
IOMemoryDescriptor * report;
IOHIDReportType reportType;
IOOptionBits options;
} ReportGatedArguments;
IOReturn getReportGated(ReportGatedArguments * arguments);
IOReturn setReportGated(ReportGatedArguments * arguments);
IOReturn createAndStartDevice();
IOReturn createAndStartDeviceAsync();
IOReturn createDevice(IOExternalMethodArguments *arguments);
IOReturn handleReport(IOExternalMethodArguments *arguments);
IOReturn postReportResult(IOExternalMethodArguments *arguments);
IOReturn terminateDevice();
void cleanupPendingReports();
IOMemoryDescriptor * createMemoryDescriptorFromInputArguments(IOExternalMethodArguments * arguments);
void ReportComplete(void *param, IOReturn res, UInt32 remaining);
public:
virtual bool initWithTask(task_t owningTask, void * security_id, UInt32 type);
virtual IOReturn clientClose(void);
virtual IOService * getService(void);
virtual IOReturn externalMethod(uint32_t selector, IOExternalMethodArguments *arguments,
IOExternalMethodDispatch *dispatch, OSObject *target,
void *reference);
virtual IOReturn clientMemoryForType(UInt32 type, IOOptionBits * options, IOMemoryDescriptor ** memory );
virtual bool start(IOService * provider);
virtual void stop(IOService * provider);
virtual void free();
virtual IOReturn registerNotificationPort(mach_port_t port, UInt32 type, io_user_reference_t refCon);
virtual IOReturn getReport(IOMemoryDescriptor *report, IOHIDReportType reportType, IOOptionBits options);
virtual IOReturn setReport(IOMemoryDescriptor *report, IOHIDReportType reportType, IOOptionBits options);
};
#endif
#endif