#include <CoreFoundation/CoreFoundation.h>
#include "BSDHeaders.h"
BSDResult::BSDResult()
{
mSelfPtr = this;
mAttributes = NULL;
}
BSDResult::BSDResult( CFMutableDictionaryRef initialResults )
{
mSelfPtr = this;
mAttributes = initialResults;
if ( mAttributes )
::CFRetain( mAttributes );
}
BSDResult::~BSDResult()
{
mSelfPtr = NULL;
if ( mAttributes )
::CFRelease( mAttributes );
}
void FreeDictItems(const void *inKey, const void *inValue, void *inContext)
{
if ( inKey )
::CFRelease(inKey);
if ( inValue )
::CFRelease(inValue);
}
#pragma mark -
void BSDResult::AddAttribute( const char* key, const char* value )
{
if ( !mAttributes )
{
mAttributes = ::CFDictionaryCreateMutable( NULL, 0, &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks );
}
if ( mAttributes && key && value )
{
CFStringRef keyRef, valueRef;
keyRef = ::CFStringCreateWithCString( kCFAllocatorDefault, key, kCFStringEncodingUTF8 );
valueRef = ::CFStringCreateWithCString( kCFAllocatorDefault, value, kCFStringEncodingUTF8 );
if ( !valueRef )
DBGLOG( "BSDResult::AddAttribute, couldn't create valueRef! (%s)\n", value );
else
AddAttribute( keyRef, valueRef );
if ( keyRef )
::CFRelease( keyRef );
if ( valueRef )
::CFRelease( valueRef );
}
}
void BSDResult::AddAttribute( CFStringRef keyRef, CFStringRef valueRef )
{
if ( !mAttributes )
{
mAttributes = ::CFDictionaryCreateMutable( NULL, 0, &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks );
}
if ( mAttributes && keyRef && valueRef )
{
::CFDictionaryAddValue( mAttributes, keyRef, valueRef );
if ( getenv("NSLDEBUG") )
CFShow( mAttributes );
}
else
DBGLOG( "BSDResult::AddAttribute ignoring attribute\n" );
}
#pragma mark -
CFStringRef BSDResult::GetAttributeRef( CFStringRef keyRef ) const
{
CFStringRef result = NULL;
if ( mSelfPtr != this )
{
fprintf( stderr, "BSDResult::GetAttributeRef called on a bad BSDResult object!\n" );
return NULL;
}
if ( mAttributes && keyRef && ::CFDictionaryGetCount( mAttributes ) > 0 && ::CFDictionaryContainsKey( mAttributes, keyRef ) )
result = (CFStringRef)::CFDictionaryGetValue( mAttributes, keyRef );
else if ( mAttributes && getenv( "NSLDEBUG" ) )
{
DBGLOG( "BSDResult::GetAttributeRef not found in dictionary!\n" );
::CFShow( mAttributes );
}
return result;
}