CSrvrMessaging.cpp [plain text]
#include "CSrvrMessaging.h"
#include "PrivateTypes.h"
#include "DirServicesTypes.h"
#include "DSUtils.h"
#include "CLog.h"
#include <string.h>
#include <stdlib.h>
#include <stddef.h> // for offsetof()
#include <unistd.h> // for sleep()
CSrvrMessaging::CSrvrMessaging ( void )
{
}
CSrvrMessaging::~CSrvrMessaging ( void )
{
}
sInt32 CSrvrMessaging::Add_tDataBuff_ToMsg ( sComData **inMsg, tDataBuffer *inBuff, eValueType inType )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
uInt32 offset = 0;
result = GetEmptyObj( (*inMsg), inType, &pObj );
if ( result == eDSNoErr )
{
pObj->type = inType; pObj->count = 1;
if ( inBuff != nil )
{
pObj->used = inBuff->fBufferLength;
pObj->length = inBuff->fBufferSize;
offset = pObj->offset;
Grow( inMsg, offset, inBuff->fBufferSize );
::memcpy( (char *)(*inMsg) + offset, inBuff->fBufferData, inBuff->fBufferSize );
(*inMsg)->fDataLength += inBuff->fBufferSize;
}
else
{
pObj->length = 0;
}
}
return( result );
}
sInt32 CSrvrMessaging::Add_tDataList_ToMsg ( sComData **inMsg, tDataList *inList, eValueType inType )
{
sInt32 result = eDSNoErr;
bool done = false;
uInt32 offset = 0;
uInt32 length = 0;
uInt32 len = 0;
tDataNodePtr pCurrNode = nil;
tDataBufferPriv *pPrivData = nil;
sObject *pObj = nil;
if ( ((*inMsg) != nil) && (inList != nil) )
{
result = GetEmptyObj( (*inMsg), inType, &pObj );
if ( result == eDSNoErr )
{
pObj->type = inType; pObj->count = inList->fDataNodeCount;
pObj->length = ::dsGetDataLengthPriv( inList ) + (inList->fDataNodeCount * sizeof( uInt32 ));
length = pObj->length;
offset = pObj->offset;
Grow( inMsg, offset, length );
pCurrNode = inList->fDataListHead;
while ( !done )
{
pPrivData = (tDataBufferPriv *)pCurrNode;
len = pPrivData->fBufferLength; ::memcpy( (char *)(*inMsg) + offset, &len, 4 );
(*inMsg)->fDataLength += 4;
offset += 4;
::memcpy( (char *)(*inMsg) + offset, pPrivData->fBufferData, len );
(*inMsg)->fDataLength += len;
offset += len;
if ( pPrivData->fNextPtr == nil )
{
done = true;
}
else
{
pCurrNode = pPrivData->fNextPtr;
}
}
}
}
return( result );
}
sInt32 CSrvrMessaging::Add_Value_ToMsg ( sComData *inMsg, uInt32 inValue, eValueType inType )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
result = GetEmptyObj( inMsg, inType, &pObj );
if ( result == eDSNoErr )
{
pObj->type = inType;
pObj->count = inValue; pObj->length = 0;
}
return( result );
}
sInt32 CSrvrMessaging::Add_tAttrEntry_ToMsg ( sComData **inMsg, tAttributeEntry *inData )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
uInt32 offset = 0;
uInt32 length = 0;
result = GetEmptyObj( (*inMsg), ktAttrValueEntry, &pObj );
if ( result == eDSNoErr )
{
pObj->type = ktAttrEntry;
pObj->count = 1;
if ( inData != nil )
{
pObj->length = sizeof( tAttributeEntry ) + inData->fAttributeSignature.fBufferSize;
length = pObj->length;
offset = pObj->offset;
Grow( inMsg, offset, length );
::memcpy( (char *)(*inMsg) + offset, inData, length );
(*inMsg)->fDataLength += length;
}
else
{
pObj->length = 0;
}
}
return( result );
}
sInt32 CSrvrMessaging::Add_tAttrValueEntry_ToMsg ( sComData **inMsg, tAttributeValueEntry *inData )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
uInt32 offset = 0;
uInt32 length = 0;
result = GetEmptyObj( (*inMsg), ktAttrValueEntry, &pObj );
if ( result == eDSNoErr )
{
pObj->type = ktAttrValueEntry;
pObj->count = 1;
if ( inData != nil )
{
pObj->length = sizeof( tAttributeValueEntry ) + inData->fAttributeValueData.fBufferSize;
length = pObj->length;
offset = pObj->offset;
Grow( inMsg, offset, length );
::memcpy( (char *) (*inMsg) + offset, inData, length );
(*inMsg)->fDataLength += length;
}
else
{
pObj->count = 0;
pObj->length = 0;
}
}
return( result );
}
sInt32 CSrvrMessaging::Add_tRecordEntry_ToMsg ( sComData **inMsg, tRecordEntry *inData )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
uInt32 offset = 0;
uInt32 length = 0;
result = GetEmptyObj( (*inMsg), ktRecordEntry, &pObj );
if ( result == eDSNoErr )
{
pObj->type = ktRecordEntry;
pObj->count = 1;
if ( inData != nil )
{
pObj->length = sizeof( tRecordEntry ) + inData->fRecordNameAndType.fBufferSize;
length = pObj->length;
offset = pObj->offset;
Grow( inMsg, offset, length );
::memcpy( (char *)(*inMsg) + offset, inData, length );
(*inMsg)->fDataLength += length;
}
else
{
pObj->length = 0;
}
}
return( result );
}
sInt32 CSrvrMessaging::Get_tDataBuff_FromMsg ( sComData *inMsg, tDataBuffer **outBuff, eValueType inType )
{
sInt32 result = eDSNoErr;
uInt32 offset = 0;
uInt32 length = 0;
sObject *pObj = nil;
result = GetThisObj( inMsg, inType, &pObj );
if ( result == eDSNoErr )
{
offset = pObj->offset;
length = pObj->length;
if ( length >= 0 )
{
if ( *outBuff == nil )
{
*outBuff = ::dsDataBufferAllocatePriv( length );
}
if ( *outBuff != nil )
{
::memset( (*outBuff)->fBufferData, 0, (*outBuff)->fBufferSize );
if ( (*outBuff)->fBufferSize >= pObj->length )
{
::memcpy( (*outBuff)->fBufferData, (char *)inMsg + offset, length );
(*outBuff)->fBufferLength = pObj->used;
}
else
{
::memcpy( (*outBuff)->fBufferData, (char *)inMsg + offset, (*outBuff)->fBufferSize );
(*outBuff)->fBufferLength = pObj->used;
result = eDSBufferTooSmall;
}
}
else
{
result = eDSNullDataBuff;
}
}
}
return( result );
}
sInt32 CSrvrMessaging::Get_tDataList_FromMsg ( sComData *inMsg, tDataList **outList, eValueType inType )
{
sInt32 siResult = eDSNoErr;
uInt32 offset = 0;
uInt32 length = 0;
uInt32 count = 0;
uInt32 cntr = 0;
sObject *pObj = nil;
tDataList *pOutList = nil;
char *tmpStr = nil;
try
{
siResult = GetThisObj( inMsg, inType, &pObj );
if ( siResult == eDSNoErr )
{
if ( outList != nil )
{
pOutList = ::dsDataListAllocatePriv();
if ( pOutList != nil )
{
offset = pObj->offset;
count = pObj->count;
while ( cntr < count )
{
::memcpy( &length, (char *)inMsg + offset, 4 );
offset += 4;
tmpStr = (char *)calloc(1, length+1);
if ( tmpStr == nil ) throw((sInt32)eMemoryAllocError);
strncpy(tmpStr, (char *)inMsg + offset, length);
::dsAppendStringToListAllocPriv( pOutList, tmpStr );
free( tmpStr );
offset += length;
cntr++;
}
*outList = pOutList;
}
else
{
siResult = eMemoryError;
}
}
else
{
siResult = eDSNullDataList;
}
}
}
catch( sInt32 err )
{
DBGLOG1( 0x00FF, "***CSrvrMessaging::Get_tDataList_FromMsg with error %l", err );
if ( pOutList != nil )
{
::dsDataListDeallocatePriv( pOutList );
free( pOutList );
pOutList = nil;
}
siResult = err;
}
return( siResult );
}
sInt32 CSrvrMessaging::Get_Value_FromMsg ( sComData *inMsg, uInt32 *outValue, eValueType inType )
{
uInt32 result = eDSNoErr;
sObject *pObj = nil;
result = GetThisObj( inMsg, inType, &pObj );
if ( result == eDSNoErr )
{
*outValue = pObj->count;
}
return( result );
}
sInt32 CSrvrMessaging::Get_tAttrEntry_FromMsg ( sComData *inMsg, tAttributeEntry **outAttrEntry, eValueType inType )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
tAttributeEntry *pAttrEntry = nil;
result = GetThisObj( inMsg, inType, &pObj );
if ( result == eDSNoErr )
{
pAttrEntry = (tAttributeEntry *)::calloc( 1, pObj->length );
if ( pAttrEntry != nil )
{
::memcpy( pAttrEntry, (char *)inMsg + pObj->offset, pObj->length );
*outAttrEntry = pAttrEntry;
}
else
{
result = eDSNullAttribute;
}
}
return( result );
}
sInt32 CSrvrMessaging::Get_tAttrValueEntry_FromMsg ( sComData *inMsg,
tAttributeValueEntry **outAttrValue,
eValueType inType )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
tAttributeValueEntry *pAttrValueEntry = nil;
result = GetThisObj( inMsg, inType, &pObj );
if ( result == eDSNoErr )
{
pAttrValueEntry = (tAttributeValueEntry *)::calloc( 1, pObj->length );
if ( pAttrValueEntry != nil )
{
::memcpy( pAttrValueEntry, (char *)inMsg + pObj->offset, pObj->length );
*outAttrValue = pAttrValueEntry;
}
else
{
result = eDSNullAttributeValue;
}
}
return( result );
}
sInt32 CSrvrMessaging::Get_tRecordEntry_FromMsg ( sComData *inMsg, tRecordEntry **outRecEntry, eValueType inType )
{
sInt32 result = eDSNoErr;
sObject *pObj = nil;
tRecordEntry *pRecordEntry = nil;
result = GetThisObj( inMsg, inType, &pObj );
if ( result == eDSNoErr )
{
pRecordEntry = (tRecordEntry *)::calloc( 1, pObj->length );
if ( pRecordEntry != nil )
{
::memcpy( pRecordEntry, (char *)inMsg + pObj->offset, pObj->length );
*outRecEntry = pRecordEntry;
}
else
{
result = eDSNullRecEntryPtr;
}
}
return( result );
}
sInt32 CSrvrMessaging::GetEmptyObj ( sComData *inMsg, eValueType inType, sObject **outObj )
{
sInt32 siResult = eDSIndexNotFound;
uInt32 i;
for ( i = 0; i < 10; i++ )
{
if ( inMsg->obj[ i ].type == 0 )
{
*outObj = &inMsg->obj[ i ];
if ( i == 0 )
{
(*outObj)->offset = offsetof(struct sComData, data);
}
else
{
(*outObj)->offset = inMsg->obj[ i - 1 ].offset + inMsg->obj[ i - 1 ].length;
}
siResult = eDSNoErr;
break;
}
else if ( inMsg->obj[ i ].type == (uInt32)inType )
{
break;
}
}
return( siResult );
}
sInt32 CSrvrMessaging::GetThisObj ( sComData *inMsg, eValueType inType, sObject **outObj )
{
sInt32 siResult = eDSIndexNotFound;
uInt32 i;
for ( i = 0; i < 10; i++ )
{
if ( inMsg->obj[ i ].type == (uInt32)inType )
{
*outObj = &inMsg->obj[ i ];
siResult = eDSNoErr;
break;
}
}
return( siResult );
}
void CSrvrMessaging::ClearDataBlock ( sComData *inMsg )
{
if ( inMsg != nil )
{
::memset( inMsg->obj, 0, (sizeof( sObject ) * 10 ) );
::memset( inMsg->data, 0, inMsg->fDataSize );
inMsg->fDataLength = 0;
}
}
void CSrvrMessaging::ClearMessageBlock ( sComData *inMsg )
{
if ( inMsg != nil )
{
::memset( inMsg->obj, 0, (sizeof( sObject ) * 10 ) );
}
}
void CSrvrMessaging::Grow ( sComData **inMsg, uInt32 inOffset, uInt32 inSize )
{
uInt32 newSize = 0;
sComData *pNewPtr = nil;
if ( inSize == 0 )
{
return;
}
if ( ((*inMsg)->fDataLength + inSize) > (*inMsg)->fDataSize )
{
newSize = (*inMsg)->fDataSize;
while( newSize < ((*inMsg)->fDataLength + inSize) )
{
newSize += kMsgBlockSize;
}
pNewPtr = (sComData *)::calloc( 1, sizeof( sComData ) + newSize );
if ( pNewPtr == nil )
{
throw( (sInt32)eMemoryAllocError );
}
::memcpy( pNewPtr, (*inMsg), sizeof( sComData ) + (*inMsg)->fDataLength );
::free( (*inMsg) );
(*inMsg) = nil;
(*inMsg) = (sComData *)pNewPtr;
pNewPtr = nil;
(*inMsg)->fDataSize = newSize;
}
}