IOSCSIIUnknown.cpp [plain text]
#include "IOSCSIIUnknown.h"
#include "IOSCSIDeviceClass.h"
int IOSCSIIUnknown::factoryRefCount = 0;
void *IOSCSILibFactory(CFAllocatorRef allocator, CFUUIDRef typeID)
{
if (CFEqual(typeID, kIOSCSIUserClientTypeID))
return (void *) IOSCSIDeviceClass::alloc();
else
return NULL;
}
void IOSCSIIUnknown::factoryAddRef()
{
if (0 == factoryRefCount++) {
CFUUIDRef factoryId = kIOSCSIFactoryID;
CFRetain(factoryId);
CFPlugInAddInstanceForFactory(factoryId);
}
}
void IOSCSIIUnknown::factoryRelease()
{
if (1 == factoryRefCount--) {
CFUUIDRef factoryId = kIOSCSIFactoryID;
CFPlugInRemoveInstanceForFactory(factoryId);
CFRelease(factoryId);
}
else if (factoryRefCount < 0)
factoryRefCount = 0;
}
IOSCSIIUnknown::IOSCSIIUnknown(void *unknownVTable)
: refCount(1)
{
iunknown.pseudoVTable = (IUnknownVTbl *) unknownVTable;
iunknown.obj = this;
factoryAddRef();
};
IOSCSIIUnknown::~IOSCSIIUnknown()
{
factoryRelease();
}
unsigned long IOSCSIIUnknown::addRef()
{
refCount += 1;
return refCount;
}
unsigned long IOSCSIIUnknown::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 IOSCSIIUnknown::
genericQueryInterface(void *self, REFIID iid, void **ppv)
{
IOSCSIIUnknown *me = ((InterfaceMap *) self)->obj;
return me->queryInterface(iid, ppv);
}
unsigned long IOSCSIIUnknown::genericAddRef(void *self)
{
IOSCSIIUnknown *me = ((InterfaceMap *) self)->obj;
return me->addRef();
}
unsigned long IOSCSIIUnknown::genericRelease(void *self)
{
IOSCSIIUnknown *me = ((InterfaceMap *) self)->obj;
return me->release();
}