CNBPNodeLookupThread.cpp [plain text]
#include "CNBPPlugin.h"
#include "CNBPNodeLookupThread.h"
CNBPNodeLookupThread::CNBPNodeLookupThread( CNSLPlugin* parentPlugin )
: CNSLNodeLookupThread( parentPlugin )
{
DBGLOG( "CNBPNodeLookupThread::CNBPNodeLookupThread\n" );
mBuffer = NULL;
mNABuffer = NULL;
}
CNBPNodeLookupThread::~CNBPNodeLookupThread()
{
DBGLOG( "CNBPNodeLookupThread::~CNBPNodeLookupThread\n" );
if ( mBuffer != NULL )
{
char *buffer = mBuffer;
mBuffer = NULL;
free( buffer );
}
if ( mNABuffer != NULL )
{
NBPNameAndAddress *buffer = mNABuffer;
mNABuffer = NULL;
free( buffer );
}
}
void* CNBPNodeLookupThread::Run( void )
{
DBGLOG( "CNBPNodeLookupThread::Run\n" );
OSStatus status = noErr;
long actualCount = 0;
long bufferSize = sizeof(Str32) * kMaxZonesOnTryOne;
char *curZonePtr;
DoLocalZoneLookup();
mBuffer = (char *)malloc( bufferSize );
do
{
if ( mBuffer )
{
status = ZIPGetZoneList( LOOKUP_ALL, mBuffer, bufferSize, &actualCount );
if ( status == -1 )
{
AddResult(kNoZoneLabel);
status = 0;
actualCount = 0;
}
}
else
{
status = memFullErr;
}
if ( status > 0 )
{
bufferSize *= 2;
mBuffer = (char *)realloc( mBuffer, bufferSize );
if ( mBuffer == nil )
status = memFullErr;
}
}
while ( status > 0 && mBuffer );
for (long index = 0; index < actualCount; index++)
{
curZonePtr = &mBuffer[sizeof (Str32) * index];
if ( !curZonePtr )
{
DBGLOG("NBPLookup::StartNeighborhoodLookup got a null value from its mBuffer!\n");
break;
}
if ( curZonePtr && *curZonePtr != '\0' )
{
DBGLOG("Going to call Manager notifier with new Zone: %s\n", curZonePtr);
CFStringRef nodeRef = CFStringCreateWithCString( NULL, curZonePtr, NSLGetSystemEncoding() );
if ( nodeRef )
{
AddResult( nodeRef );
CFRelease( nodeRef );
}
else
DBGLOG("CNBPNodeLookupThread::Run() could not make a CFString!\n");
}
}
return NULL;
}
void CNBPNodeLookupThread::DoLocalZoneLookup( void )
{
long actualCount = 0;
char zoneBuf[33 * 5]; long bufferSize = sizeof(zoneBuf); OSStatus status = ZIPGetZoneList( LOOKUP_CURRENT, zoneBuf, bufferSize, &actualCount );
if ( status == -1 )
{
status = ZIPGetZoneList( LOOKUP_LOCAL, zoneBuf, bufferSize, &actualCount );
}
if ( status == -1 )
{
((CNBPPlugin*)GetParentPlugin())->SetLocalZone( (char*)kNoZoneLabel );
}
else
{
((CNBPPlugin*)GetParentPlugin())->SetLocalZone( (char*)zoneBuf );
}
DBGLOG( "CNBPNodeLookupThread::DoLocalZoneLookup, setting our current Zone to %s\n", ((CNBPPlugin*)GetParentPlugin())->GetLocalZone() );
}