#include <stdio.h>
#include <string.h>
#include <CoreServices/CoreServices.h>
#include "GenericNBPURL.h"
#include "NSLDebugLog.h"
void MakeGenericNBPURL(const char *entityType, const char *zoneName, const char *name, char* returnBuffer, UInt16* returnBufferLen )
{
char safeEntityType[256*3];
char safeZoneName[32*3], safeName[32*3];
Size urlLength = 0;
if ( entityType && zoneName && name )
{
{
char tempBuf[256];
UInt16 bufLen = 256;
Boolean textChanged;
OSStatus status;
UInt16 entityTypeLen = strlen(entityType);
status = NSLHexEncodeText( entityType, entityTypeLen, tempBuf, &bufLen, &textChanged );
if ( !status )
{
tempBuf[bufLen] = '\0';
strcpy( safeEntityType, tempBuf );
}
else
{
safeEntityType[0] = '\0';
DBGLOG( "NSLHexEncodeText failed for entityType, status = %ld\n", status );
}
UInt16 zoneNameLen = strlen(zoneName);
bufLen = 256;
status = NSLHexEncodeText( zoneName, zoneNameLen, tempBuf, &bufLen, &textChanged );
if ( !status )
{
tempBuf[bufLen] = '\0';
strcpy( safeZoneName, tempBuf );
}
else
DBGLOG( "NSLHexEncodeText failed, status = %ld\n", status );
UInt16 nameLen = strlen(name);
bufLen = 256;
status = NSLHexEncodeText( (char*)name, nameLen, tempBuf, &bufLen, &textChanged );
if ( !status )
{
tempBuf[bufLen] = '\0';
strcpy( safeName, tempBuf );
}
else
DBGLOG( "NSLHexEncodeText failed, status = %ld\n", status );
}
urlLength = strlen( safeEntityType )
+ strlen( kNBPDivider )
+ strlen( safeZoneName )
+ strlen( kEntityZoneDelimiter )
+ strlen( safeName )
+ 1;
if ( urlLength <= *returnBufferLen )
{
strcpy( returnBuffer, safeEntityType );
strcat( returnBuffer, kNBPDivider );
strcat( returnBuffer, safeName );
strcat( returnBuffer, kEntityZoneDelimiter );
strcat( returnBuffer, safeZoneName );
*returnBufferLen = urlLength;
}
else
*returnBufferLen = 0;
}
}
#if 0
OSStatus ParseGenericNBPURL(char* url, StringPtr entityType, StringPtr zoneName, StringPtr name)
{
char* curPtr1;
char* curPtr2;
OSStatus status = kNBPURLBadSyntaxErr;
if ( IsGenericNBPURL( url ) )
{
string convertedURL = url;
DecodeHTTPString( convertedURL );
curPtr1 = (Ptr)convertedURL.c_str();
curPtr2 = strstr( convertedURL.c_str(), kNBPDivider );
if ( curPtr2 )
{
::BlockMove( convertedURL.c_str(), &entityType[1], curPtr2-curPtr1 );
entityType[0] = curPtr2-curPtr1;
curPtr1 = curPtr2+strlen(kNBPDivider); curPtr2 = strstr( curPtr1, kEntityZoneDelimiter );
if ( curPtr2 )
{
::BlockMove( curPtr1, &name[1], curPtr2-curPtr1 );
name[0] = curPtr2-curPtr1;
curPtr1 = curPtr2 + strlen(kEntityZoneDelimiter);
strcpy( (char*)zoneName, curPtr1 ); c2pstr( (char*)zoneName );
if ( zoneName[zoneName[0]] == '/' )
zoneName[0]--;
status = noErr;
}
}
}
return status;
}
#endif