#include <CoreFoundation/CoreFoundation.h>
#include "CNSLHeaders.h"
CFStringRef SLPRAdminNotifierCopyDesctriptionCallback ( const void *item )
{
CNSLResult* itemResult = (CNSLResult*)item;
return itemResult->GetURLRef();
}
Boolean SLPRAdminNotifierEqualCallback ( const void *item1, const void *item2 )
{
CNSLResult* item1Result = (CNSLResult*)item1;
CNSLResult* item2Result = (CNSLResult*)item2;
if ( item1 && item2 )
return ( ::CFStringCompare( item1Result->GetURLRef(), item2Result->GetURLRef(), kCFCompareCaseInsensitive ) == kCFCompareEqualTo );
else
return false;
}
CFStringRef CNSLResult::GetURLRef( void ) const
{
return GetAttributeRef( kDSNAttrURLSAFE_CFSTR );
}
CFStringRef CNSLResult::GetServiceTypeRef( void ) const
{
return GetAttributeRef( kDS1AttrServiceTypeSAFE_CFSTR );
}
CNSLResult::CNSLResult()
{
mSelfPtr = this;
mAttributes = NULL;
}
CNSLResult::CNSLResult( CFMutableDictionaryRef initialResults )
{
mSelfPtr = this;
mAttributes = initialResults;
if ( mAttributes )
::CFRetain( mAttributes );
}
CNSLResult::~CNSLResult()
{
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 CNSLResult::SetURL( const char* urlPtr )
{
CFStringRef urlForService = NULL;
if ( urlPtr )
urlForService = ::CFStringCreateWithCString( kCFAllocatorDefault, urlPtr, kCFStringEncodingUTF8 );
if ( urlForService )
{
AddAttribute( kDSNAttrURLSAFE_CFSTR, urlForService );
::CFRelease( urlForService );
}
}
void CNSLResult::SetURL( CFStringRef urlForService )
{
if ( urlForService )
{
AddAttribute( kDSNAttrURLSAFE_CFSTR, urlForService );
}
}
void CNSLResult::SetServiceType( const char* serviceType )
{
CFStringRef serviceTypeRef = NULL;
if ( serviceType )
serviceTypeRef = ::CFStringCreateWithCString( kCFAllocatorDefault, serviceType, kCFStringEncodingUTF8 );
if ( serviceTypeRef )
{
AddAttribute( kDS1AttrServiceTypeSAFE_CFSTR, serviceTypeRef );
AddAttribute( kDSNAttrRecordTypeSAFE_CFSTR, serviceTypeRef ); ::CFRelease( serviceTypeRef );
}
}
void CNSLResult::SetServiceType( CFStringRef serviceTypeRef )
{
if ( serviceTypeRef )
{
AddAttribute( kDS1AttrServiceTypeSAFE_CFSTR, serviceTypeRef );
AddAttribute( kDSNAttrRecordTypeSAFE_CFSTR, serviceTypeRef ); }
}
#pragma mark -
void CNSLResult::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 )
valueRef = ::CFStringCreateWithCString( kCFAllocatorDefault, value, ::NSLGetSystemEncoding() );
if ( !valueRef )
DBGLOG( "CNSLResult::AddAttribute, couldn't create valueRef! (%s)\n", value );
else
AddAttribute( keyRef, valueRef );
if ( keyRef )
::CFRelease( keyRef );
if ( valueRef )
::CFRelease( valueRef );
}
}
void CNSLResult::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( "CNSLResult::AddAttribute ignoring attribute\n" );
}
#pragma mark -
CFStringRef CNSLResult::GetAttributeRef( CFStringRef keyRef ) const
{
CFStringRef result = NULL;
if ( mSelfPtr != this )
{
fprintf( stderr, "CNSLResult::GetAttributeRef called on a bad CNSLResult object!\n" );
return NULL;
}
if ( mAttributes && keyRef && ::CFDictionaryGetCount( mAttributes ) > 0 && ::CFDictionaryContainsKey( mAttributes, keyRef ) )
result = (CFStringRef)::CFDictionaryGetValue( mAttributes, keyRef );
else if ( mAttributes && getenv( "NSLDEBUG" ) )
{
DBGLOG( "CNSLResult::GetAttributeRef not found in dictionary!\n" );
::CFShow( mAttributes );
}
return result;
}