IOHIDLibUserClientIniter.cpp [plain text]
#include <libkern/c++/OSDictionary.h>
#include <IOKit/IOService.h>
class IOHIDLibUserClientIniter : public IOService
{
OSDeclareDefaultStructors(IOHIDLibUserClientIniter);
public:
virtual bool start(IOService * provider);
protected:
virtual void mergeProperties(OSObject* dest, OSObject* src) ;
};
#define super IOService
OSDefineMetaClassAndStructors(IOHIDLibUserClientIniter, IOService);
bool IOHIDLibUserClientIniter::start(IOService * provider)
{
OSDictionary * dictObj = OSDynamicCast(OSDictionary, getProperty("IOProviderMergeProperties"));
OSDictionary * providerMergeProperties = NULL;
if (!super::start(provider))
return false;
providerMergeProperties = (dictObj) ? (OSDictionary *)dictObj->copyCollection() : NULL;
if ( !providerMergeProperties )
{
return false;
}
const OSSymbol * userClientClass = NULL;
OSObject * temp = providerMergeProperties->getObject( gIOUserClientClassKey ) ;
if ( userClientClass = OSDynamicCast(OSSymbol, temp) )
{}
else if ( OSDynamicCast(OSString, temp) )
{
userClientClass = OSSymbol::withString((const OSString *) temp); providerMergeProperties->setObject(gIOUserClientClassKey, (OSObject *) userClientClass);
userClientClass->release();
}
else
{
providerMergeProperties->removeObject(gIOUserClientClassKey);
}
if (userClientClass)
{
provider->setProperty(gIOUserClientClassKey, (OSObject *)userClientClass);
}
OSDictionary * providerProps = NULL;
dictObj = provider->getPropertyTable();
providerProps = (dictObj) ? (OSDictionary *)dictObj->copyCollection() : NULL;
if (providerProps)
{
mergeProperties(providerProps, providerMergeProperties) ;
provider->setPropertyTable(providerProps);
providerProps->release();
}
setProperty("IOProviderMergeProperties", providerMergeProperties);
providerMergeProperties->release();
return true ;
}
void
IOHIDLibUserClientIniter::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 (destObject && OSDynamicCast(OSDictionary, srcObject))
mergeProperties(destObject, srcObject );
else if ( !destObject )
dest->setObject(keyObject, srcObject) ;
}
srcIterator->release() ;
}