IOConfigDirectoryIterator.cpp [plain text]
#import <IOKit/firewire/IOConfigDirectory.h>
#import <IOKit/firewire/IOFireWireDevice.h>
#import "FWDebugging.h"
#import "IOConfigDirectoryIterator.h"
#import <libkern/c++/OSIterator.h>
OSDefineMetaClassAndStructors(IOConfigDirectoryIterator, OSIterator)
IOReturn IOConfigDirectoryIterator::init(IOConfigDirectory *owner,
UInt32 testVal, UInt32 testMask)
{
IOReturn status = kIOReturnSuccess;
if( !OSIterator::init() )
status = kIOReturnError;
if( status == kIOReturnSuccess )
{
fDirectorySet = OSSet::withCapacity(2);
if( fDirectorySet == NULL )
status = kIOReturnNoMemory;
}
int position = 0;
while( status == kIOReturnSuccess && position < owner->getNumEntries() )
{
UInt32 value;
IOConfigDirectory * next;
status = owner->getIndexEntry( position, value );
if( status == kIOReturnSuccess && (value & testMask) == testVal )
{
status = owner->getIndexValue( position, next );
if( status == kIOReturnSuccess )
{
fDirectorySet->setObject( next );
next->release();
}
}
position++;
}
if( status == kIOReturnSuccess )
{
fDirectoryIterator = OSCollectionIterator::withCollection( fDirectorySet );
if( fDirectoryIterator == NULL )
status = kIOReturnNoMemory;
}
return status;
}
void IOConfigDirectoryIterator::free()
{
if( fDirectoryIterator != NULL )
{
fDirectoryIterator->release();
fDirectoryIterator = NULL;
}
if( fDirectorySet != NULL )
{
fDirectorySet->release();
fDirectorySet = NULL;
}
OSIterator::free();
}
void IOConfigDirectoryIterator::reset()
{
fDirectoryIterator->reset();
}
bool IOConfigDirectoryIterator::isValid()
{
return true;
}
OSObject *IOConfigDirectoryIterator::getNextObject()
{
return fDirectoryIterator->getNextObject();
}