IOFireWireUserClientIniter.cpp [plain text]
#import "IOFireWireUserClientIniter.h"
#import <IOKit/assert.h>
#import <IOKit/IOLib.h>
#import <IOKit/IOService.h>
#import <libkern/OSAtomic.h>
#undef super
#define super IOService
OSDefineMetaClassAndStructors(IOFireWireUserClientIniter, super);
OSMetaClassDefineReservedUnused(IOFireWireUserClientIniter, 0);
OSMetaClassDefineReservedUnused(IOFireWireUserClientIniter, 1);
OSMetaClassDefineReservedUnused(IOFireWireUserClientIniter, 2);
OSMetaClassDefineReservedUnused(IOFireWireUserClientIniter, 3);
bool
IOFireWireUserClientIniter::init(OSDictionary * propTable)
{
fPropTable = propTable ;
fProvider = NULL ;
return super::init(propTable) ;
}
bool
IOFireWireUserClientIniter::start(
IOService* provider)
{
if( provider == NULL )
{
return false;
}
fProvider = provider ;
fProvider->retain();
OSObject* dictObj = getProperty("IOProviderMergeProperties");
fProviderMergeProperties = OSDynamicCast(OSDictionary, dictObj);
if ( !fProviderMergeProperties )
{
fHasUCIniter = false;
IOLog("%s %u: couldn't get fProviderMergeProperties\n", __FILE__, __LINE__ ) ;
return false;
}
OSObject * userClientClassObject = fProviderMergeProperties->getObject( gIOUserClientClassKey );
if( OSDynamicCast(OSString, userClientClassObject) != NULL )
{
const OSSymbol * userClientClassSymbol = OSSymbol::withString((const OSString *) userClientClassObject);
if( userClientClassSymbol != NULL )
{
fProviderMergeProperties->setObject(gIOUserClientClassKey, (OSObject *) userClientClassSymbol);
userClientClassSymbol->release();
}
}
else if( OSDynamicCast(OSSymbol, userClientClassObject) == NULL )
{
fProviderMergeProperties->removeObject(gIOUserClientClassKey);
}
OSDictionary* providerProps = fProvider->getPropertyTable() ;
if (providerProps)
{
mergeProperties(providerProps, fProviderMergeProperties) ;
}
return true ;
}
void
IOFireWireUserClientIniter::stop(IOService* provider)
{
IOService::stop(provider) ;
}
void IOFireWireUserClientIniter::free()
{
if( fProvider != NULL )
{
fProvider->release();
fProvider = NULL;
}
IOService::free();
}
void
IOFireWireUserClientIniter::mergeProperties(OSObject* inDest, OSObject* inSrc)
{
OSDictionary* dest = OSDynamicCast(OSDictionary, inDest);
OSDictionary* src = OSDynamicCast(OSDictionary, inSrc);
if (!src || !dest)
return;
OSCollectionIterator* srcIterator = OSCollectionIterator::withCollection(src);
OSSymbol* keyObject = NULL;
OSObject* destObject = NULL;
OSObject* srcObject = NULL;
while (NULL != (keyObject = OSDynamicCast(OSSymbol, srcIterator->getNextObject())))
{
srcObject = src->getObject(keyObject);
destObject = dest->getObject(keyObject);
if (OSDynamicCast(OSDictionary, srcObject))
{
srcObject = copyDictionaryProperty((OSDictionary*)srcObject);
if( destObject )
mergeProperties(destObject, srcObject);
else
dest->setObject(keyObject, srcObject);
srcObject->release();
}
else
{
dest->setObject(keyObject, srcObject);
}
}
srcIterator->release();
}
OSDictionary*
IOFireWireUserClientIniter::copyDictionaryProperty(
OSDictionary* srcDictionary)
{
OSDictionary* result = NULL;
OSObject* srcObject = NULL;
OSCollectionIterator* srcIterator = NULL;
OSSymbol* keyObject = NULL;
result = OSDictionary::withCapacity(srcDictionary->getCount());
if (result)
{
srcIterator = OSCollectionIterator::withCollection(srcDictionary);
if (srcIterator)
{
while ( (keyObject = OSDynamicCast(OSSymbol, srcIterator->getNextObject())) )
{
srcObject = srcDictionary->getObject(keyObject);
if (OSDynamicCast(OSDictionary, srcObject))
{
srcObject = copyDictionaryProperty((OSDictionary*)srcObject);
result->setObject(keyObject, srcObject);
srcObject->release();
}
else
{
result->setObject(keyObject, srcObject);
}
}
srcIterator->release();
}
}
return result;
}