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/IODataQueue.h>
#include "IOHIDResource.h"
#include "IOHIDUserDevice.h"
class IOHIDResourceQueue: public IODataQueue
{
OSDeclareDefaultStructors( IOHIDResourceQueue )
protected:
IOMemoryDescriptor * _descriptor;
public:
static IOHIDResourceQueue *withEntries(UInt32 numEntries, UInt32 entrySize);
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;
IOHIDUserDevice * _device;
mach_port_t _port;
IOHIDResourceQueue * _queue;
IOLock * _lock;
OSSet * _pending;
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);
IOReturn createDevice(IOHIDResourceDeviceUserClient *target, void *reference, IOExternalMethodArguments *arguments);
IOReturn handleReport(IOHIDResourceDeviceUserClient *target, void *reference, IOExternalMethodArguments *arguments);
IOReturn postReportResult(IOHIDResourceDeviceUserClient *target, void *reference, IOExternalMethodArguments *arguments);
IOReturn terminateDevice();
void cleanupPendingReports();
IOMemoryDescriptor * createMemoryDescriptorFromInputArguments(IOExternalMethodArguments * arguments);
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 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