#include <TargetConditionals.h>
#include <IOKit/hid/IOHIDDevicePlugIn.h>
#include <IOKit/hid/IOHIDServicePlugIn.h>
#include "IOHIDIUnknown.h"
#include "IOHIDDeviceClass.h"
#include "IOHIDUPSClass.h"
#include "IOHIDEventServiceClass.h"
int IOHIDIUnknown::factoryRefCount = 0;
void IOHIDIUnknown::factoryAddRef()
{
if (0 == factoryRefCount++) {
CFUUIDRef factoryId = kIOHIDDeviceFactoryID;
CFPlugInAddInstanceForFactory(factoryId);
}
}
void IOHIDIUnknown::factoryRelease()
{
if (1 == factoryRefCount--) {
CFUUIDRef factoryId = kIOHIDDeviceFactoryID;
CFPlugInRemoveInstanceForFactory(factoryId);
}
else if (factoryRefCount < 0)
factoryRefCount = 0;
}
IOHIDIUnknown::IOHIDIUnknown(void *unknownVTable)
: refCount(1)
{
iunknown.pseudoVTable = (IUnknownVTbl *) unknownVTable;
iunknown.obj = this;
factoryAddRef();
};
IOHIDIUnknown::~IOHIDIUnknown()
{
factoryRelease();
}
UInt32 IOHIDIUnknown::addRef()
{
refCount += 1;
return refCount;
}
UInt32 IOHIDIUnknown::release()
{
UInt32 retVal = refCount - 1;
if (retVal > 0)
refCount = retVal;
else if (retVal == 0) {
refCount = retVal;
delete this;
}
else
retVal = 0;
return retVal;
}
HRESULT IOHIDIUnknown::
genericQueryInterface(void *self, REFIID iid, void **ppv)
{
IOHIDIUnknown *me = ((InterfaceMap *) self)->obj;
return me->queryInterface(iid, ppv);
}
UInt32 IOHIDIUnknown::genericAddRef(void *self)
{
IOHIDIUnknown *me = ((InterfaceMap *) self)->obj;
return me->addRef();
}
UInt32 IOHIDIUnknown::genericRelease(void *self)
{
IOHIDIUnknown *me = ((InterfaceMap *) self)->obj;
return me->release();
}