#include <strings.h>
#include <string.h>
#include <stdlib.h> // for calloc and free
#include "CDataBuff.h"
CDataBuff::CDataBuff ( UInt32 inSize )
: fSize( 0 ), fLength( 0 ), fData( nil )
{
GrowBuff( inSize );
}
CDataBuff::~CDataBuff ( void )
{
if ( fData != nil )
{
::free( fData );
fData = nil;
}
}
void CDataBuff::AppendString ( const char *inStr )
{
UInt32 len = 0;
if ( inStr != nil )
{
len = ::strlen( inStr );
GrowBuff( fLength + len + 1 );
::strcpy ( &fData[ fLength ], inStr );
fLength += len;
}
}
void CDataBuff::AppendLong ( UInt32 inLong )
{
UInt32 len = 4;
GrowBuff( fLength + len + 1 );
::memcpy( &fData[ fLength ], &inLong, 4 );
fLength += len;
}
void CDataBuff::AppendShort ( UInt16 inShort )
{
UInt32 len = 2;
GrowBuff( fLength + len + 1 );
::memcpy( &fData[ fLength ], &inShort, 2 );
fLength += len;
}
void CDataBuff::AppendBlock ( const void *inData, UInt32 inLength )
{
GrowBuff( fLength + inLength + 1 );
::memcpy( &fData[ fLength ], inData, inLength );
fLength += inLength;
}
void CDataBuff::Clear ( UInt32 inSize )
{
fLength = 0;
if ( inSize == 0 ) {
bzero(fData, fSize);
}
else if ( inSize < fSize )
{
::free( fData );
fData = nil;
GrowBuff( inSize ); }
else
{
bzero( fData, fSize );
}
}
UInt32 CDataBuff::GetSize ( void )
{
return( fSize );
}
UInt32 CDataBuff::GetLength ( void )
{
return( fLength );
}
char* CDataBuff::GetData ( void )
{
return( fData );
}
void CDataBuff::GrowBuff ( UInt32 inNewSize )
{
UInt32 newSize = inNewSize;
if ( newSize == 0 )
{
newSize = kDefaultSize;
}
if ( (newSize <= fSize) && (fData != nil) )
{
return;
}
if ( newSize != kDefaultSize )
{
register UInt32 pow2 = 16;
while ( pow2 < newSize )
{
pow2 <<= 1;
}
newSize = pow2;
}
register char *newData = (char *)::calloc( 1, newSize );
if ( fData != nil )
{
if ( fLength != 0 )
{
::memcpy( newData, fData, fLength );
}
::free( fData );
fData = nil;
}
fSize = newSize;
fData = newData;
}
SInt32 dsCDataBuffFromAttrTypeAndStringValue( CDataBuff* inOutAttrDataBuff, CDataBuff* inOutDataBuff, bool inbAttrInfoOnly, const char* inAttrType, const char* inAttrValue )
{
if ( (inOutAttrDataBuff == nil) || (inOutDataBuff == nil) )
{
return((SInt32)eDSNullDataBuff);
}
if (inAttrType == nil)
{
return((SInt32)eDSNullAttributeType);
}
inOutDataBuff->Clear();
inOutDataBuff->AppendShort( ::strlen( inAttrType ) );
inOutDataBuff->AppendString( inAttrType );
if ( ( inbAttrInfoOnly == false ) && (inAttrValue != nil) )
{
inOutDataBuff->AppendShort( 1 );
inOutDataBuff->AppendLong( ::strlen( inAttrValue ) );
inOutDataBuff->AppendString( inAttrValue );
}
else
{
inOutDataBuff->AppendShort( 0 );
}
inOutAttrDataBuff->AppendLong( inOutDataBuff->GetLength() );
inOutAttrDataBuff->AppendBlock( inOutDataBuff->GetData(), inOutDataBuff->GetLength() );
return((SInt32)eDSNoErr);
}
SInt32 dsCDataBuffFromAttrTypeAndStringValues( CDataBuff* inOutAttrDataBuff, CDataBuff* inOutDataBuff, bool inbAttrInfoOnly, const char* inAttrType, const char* inAttrValue, ... )
{
va_list args;
SInt32 result = eDSNoErr;
va_start( args, inAttrValue );
result = dsCDataBuffFromAttrTypeAndStringArgValues(inOutAttrDataBuff, inOutDataBuff, inbAttrInfoOnly, inAttrType, inAttrValue, args);
va_end( args );
return(result);
}
SInt32 dsCDataBuffFromAttrTypeAndStringArgValues( CDataBuff* inOutAttrDataBuff, CDataBuff* inOutDataBuff, bool inbAttrInfoOnly, const char* inAttrType, const char* inAttrValue, va_list inAttrValues )
{
if ( (inOutAttrDataBuff == nil) || (inOutDataBuff == nil) )
{
return((SInt32)eDSNullDataBuff);
}
if (inAttrType == nil)
{
return((SInt32)eDSNullAttributeType);
}
if ( (inAttrValue == nil) && !inbAttrInfoOnly )
{
return((SInt32)eDSNullAttributeValue);
}
inOutDataBuff->Clear();
inOutDataBuff->AppendShort( ::strlen( inAttrType ) );
inOutDataBuff->AppendString( inAttrType );
if ( inbAttrInfoOnly == false )
{
CDataBuff* tmpDataBuff = new CDataBuff();
tmpDataBuff->Clear();
UInt32 numAttrValues = 0;
const char* argString = inAttrValue;
while (argString != nil)
{
numAttrValues++;
tmpDataBuff->AppendLong( ::strlen( argString ) );
tmpDataBuff->AppendString( argString );
argString = va_arg( inAttrValues, char * );
}
inOutDataBuff->AppendShort( numAttrValues );
inOutDataBuff->AppendBlock( tmpDataBuff->GetData(), tmpDataBuff->GetLength() );
delete(tmpDataBuff);
tmpDataBuff = nil;
}
else
{
inOutDataBuff->AppendShort( 0 );
}
va_end( inAttrValues );
inOutAttrDataBuff->AppendLong( inOutDataBuff->GetLength() );
inOutAttrDataBuff->AppendBlock( inOutDataBuff->GetData(), inOutDataBuff->GetLength() );
return((SInt32)eDSNoErr);
}
SInt32 dsCDataBuffFromAttrTypeAndStringValues( CDataBuff* inOutAttrDataBuff, CDataBuff* inOutDataBuff, bool inbAttrInfoOnly, const char* inAttrType, const char** inAttrValues )
{
if ( (inOutAttrDataBuff == nil) || (inOutDataBuff == nil) )
{
return((SInt32)eDSNullDataBuff);
}
if (inAttrType == nil)
{
return((SInt32)eDSNullAttributeType);
}
inOutDataBuff->Clear();
inOutDataBuff->AppendShort( ::strlen( inAttrType ) );
inOutDataBuff->AppendString( inAttrType );
if ( ( inbAttrInfoOnly == false ) && (inAttrValues != nil) && (inAttrValues[0] != nil) )
{
CDataBuff* tmpDataBuff = new CDataBuff();
tmpDataBuff->Clear();
UInt32 numAttrValues = 0;
const char* argString = inAttrValues[numAttrValues];
while (argString != nil) {
numAttrValues++;
tmpDataBuff->AppendLong( ::strlen( argString ) );
tmpDataBuff->AppendString( argString );
argString = inAttrValues[numAttrValues];
}
inOutDataBuff->AppendShort( numAttrValues );
inOutDataBuff->AppendBlock( tmpDataBuff->GetData(), tmpDataBuff->GetLength() );
delete(tmpDataBuff);
tmpDataBuff = nil;
}
else
{
inOutDataBuff->AppendShort( 0 );
}
inOutAttrDataBuff->AppendLong( inOutDataBuff->GetLength() );
inOutAttrDataBuff->AppendBlock( inOutDataBuff->GetData(), inOutDataBuff->GetLength() );
return((SInt32)eDSNoErr);
}
SInt32 dsCDataBuffFromAttrTypeAndData( CDataBuff* inOutAttrDataBuff, CDataBuff* inOutDataBuff, bool inbAttrInfoOnly, const char* inAttrType,
const char* inAttrValue, UInt32 inLength )
{
if ( (inOutAttrDataBuff == nil) || (inOutDataBuff == nil) )
{
return((SInt32)eDSNullDataBuff);
}
if (inAttrType == nil)
{
return((SInt32)eDSNullAttributeType);
}
inOutDataBuff->Clear();
inOutDataBuff->AppendShort( ::strlen( inAttrType ) );
inOutDataBuff->AppendString( inAttrType );
if ( ( inbAttrInfoOnly == false ) && (inAttrValue != nil) )
{
inOutDataBuff->AppendShort( 1 );
inOutDataBuff->AppendLong( inLength );
inOutDataBuff->AppendBlock( inAttrValue, inLength );
}
else
{
inOutDataBuff->AppendShort( 0 );
}
inOutAttrDataBuff->AppendLong( inOutDataBuff->GetLength() );
inOutAttrDataBuff->AppendBlock( inOutDataBuff->GetData(), inOutDataBuff->GetLength() );
return((SInt32)eDSNoErr);
}