#include "IOUSBIUnknown.h"
#include "IOUSBDeviceClass.h"
#include "IOUSBInterfaceClass.h"
#include <IOKit/usb/IOUSBLib.h>
int IOUSBIUnknown::factoryRefCount = 0;
void
*IOUSBLibFactory(CFAllocatorRef allocator, CFUUIDRef typeID)
{
if (CFEqual(typeID, kIOUSBDeviceUserClientTypeID))
return (void *) IOUSBDeviceClass::alloc();
else if (CFEqual(typeID, kIOUSBInterfaceUserClientTypeID))
return (void *) IOUSBInterfaceClass::alloc();
return NULL;
}
void
IOUSBIUnknown::factoryAddRef()
{
if (0 == factoryRefCount++)
{
CFUUIDRef factoryId = kIOUSBFactoryID;
CFRetain(factoryId);
CFPlugInAddInstanceForFactory(factoryId);
}
}
void
IOUSBIUnknown::factoryRelease()
{
if (1 == factoryRefCount--)
{
CFUUIDRef factoryId = kIOUSBFactoryID;
CFPlugInRemoveInstanceForFactory(factoryId);
CFRelease(factoryId);
}
else if (factoryRefCount < 0)
factoryRefCount = 0;
}
IOUSBIUnknown::IOUSBIUnknown(void *unknownVTable)
: refCount(1)
{
iunknown.pseudoVTable = (IUnknownVTbl *) unknownVTable;
iunknown.obj = this;
factoryAddRef();
};
IOUSBIUnknown::~IOUSBIUnknown()
{
factoryRelease();
}
UInt32
IOUSBIUnknown::addRef()
{
refCount += 1;
return refCount;
}
UInt32
IOUSBIUnknown::release()
{
unsigned long retVal = refCount - 1;
if (retVal > 0)
refCount = retVal;
else if (retVal == 0) {
refCount = retVal;
delete this;
}
else
retVal = 0;
return retVal;
}
HRESULT IOUSBIUnknown::
genericQueryInterface(void *self, REFIID iid, void **ppv)
{
IOUSBIUnknown *me = ((InterfaceMap *) self)->obj;
return me->queryInterface(iid, ppv);
}
UInt32
IOUSBIUnknown::genericAddRef(void *self)
{
IOUSBIUnknown *me = ((InterfaceMap *) self)->obj;
return me->addRef();
}
UInt32
IOUSBIUnknown::genericRelease(void *self)
{
IOUSBIUnknown *me = ((InterfaceMap *) self)->obj;
return me->release();
}