#include "DirServices.h"
#include "DirServicesConst.h"
#include "DirServicesUtils.h"
#include "DirServicesTypes.h"
#include "DirServicesPriv.h"
#include "PrivateTypes.h"
#include "CDSRefMap.h"
#include "DSLogException.h"
#include "CMessaging.h"
#include "DSMutexSemaphore.h"
#include <string.h>
#include <stdlib.h>
#include <mach/mach.h> // mach ipc approach to IsDirServiceRunning
#include <mach/mach_error.h>
#include <servers/bootstrap.h>
#define kDSFWDefaultRemotePort 625 //TODO need final port number
#define kDSFWMaxRemoteConnections 8
CMessaging *gMessageTable[kDSFWMaxRemoteConnections+1]
= {nil,nil,nil,nil,nil,nil,nil,nil,nil};
uInt32 gMaxEndpoints = kDSFWMaxRemoteConnections + 1;
uInt32 gDSConnections = 0; sInt32 gProcessPID = -1; dsBool gResetSession = true; DSMutexSemaphore *gLock = nil; CDSRefTable *gFWRefTable = nil; CDSRefMap *gFWRefMap = nil;
void CheckToCleanUpLostTCPConnection ( tDirStatus *inStatus, uInt32 inMessageIndex, uInt32 lineNumber );
tDirStatus dsOpenDirService ( tDirReference *outDirRef )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
try
{
if ( gLock == nil)
{
gLock = new DSMutexSemaphore();
LogThenThrowIfNilMacro( gLock, eMemoryAllocError );
}
gLock->Wait();
if ( (gProcessPID != getpid()) ) {
if (gFWRefTable != nil)
{
delete(gFWRefTable);
gFWRefTable = nil;
}
if (gFWRefMap != nil)
{
delete(gFWRefMap);
gFWRefMap = nil;
}
gProcessPID = getpid();
}
if ( (dsIsDirServiceRunning() != eDSNoErr) || (gResetSession) ) {
if ( gMessageTable[0] != nil )
{
gMessageTable[0]->Lock();
gMessageTable[0]->CloseCommPort(); gMessageTable[0]->Unlock();
}
gDSConnections = 0;
gResetSession = false;
}
if ( gMessageTable[0] == nil )
{
gMessageTable[0] = new CMessaging(true);
siStatus = gMessageTable[0]->OpenCommPort();
}
if ( gFWRefTable == nil )
{
gFWRefTable = new CDSRefTable( nil );
if ( gFWRefTable == nil ) throw( (sInt32)eMemoryAllocError );
}
if ( gFWRefMap == nil )
{
gFWRefMap = new CDSRefMap( nil );
if ( gFWRefMap == nil ) throw( (sInt32)eMemoryAllocError );
}
gDSConnections++; gLock->Signal();
LogThenThrowIfDSErrorMacro( siStatus );
LogThenThrowIfNilMacro( gMessageTable[0], eMemoryAllocError );
gMessageTable[0]->Lock();
gMessageTable[0]->ClearMessageBlock();
siStatus = gMessageTable[0]->SendInlineMessage( kOpenDirService );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = (tDirStatus)gMessageTable[0]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[0]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
if ( outDirRef != nil )
{
siStatus = gMessageTable[0]->Get_Value_FromMsg( outDirRef, ktDirRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDirRef );
}
gMessageTable[0]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[0] != nil ) && ( gProcessPID == getpid() ) )
{
gMessageTable[0]->Unlock();
}
if ( gLock != nil )
{
gLock->Signal();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[0] != nil ) && ( gProcessPID == getpid() ) )
{
gMessageTable[0]->Unlock();
}
if ( gLock != nil )
{
gLock->Signal();
}
}
return( outResult );
}
tDirStatus dsOpenDirServiceProxy ( tDirReference *outDirRef,
const char *inIPAddress,
unsigned long inIPPort,
tDataNodePtr inAuthMethod, tDataBufferPtr inAuthStepData,
tDataBufferPtr outAuthStepDataResponse, tContextData *ioContinueData ) {
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
uInt32 tableIndex = 0;
tDataBufferPtr versBuff = nil;
try
{
if ( gLock == nil)
{
gLock = new DSMutexSemaphore();
LogThenThrowIfNilMacro( gLock, eMemoryAllocError );
}
gLock->Wait();
for (tableIndex = 1; tableIndex < gMaxEndpoints; tableIndex++)
{
if ( gMessageTable[tableIndex] == nil )
{
messageIndex = tableIndex;
break;
}
}
LogThenThrowIfTrueMacro( (messageIndex == 0), eDSMaxSessionsOpen );
if ( gProcessPID != getpid() ) {
for (tableIndex = 1; tableIndex < gMaxEndpoints; tableIndex++)
{
if ( gMessageTable[tableIndex] != nil )
{
gMessageTable[tableIndex]->Lock();
gMessageTable[tableIndex]->CloseTCPEndpoint();
gMessageTable[tableIndex]->Unlock();
delete(gMessageTable[tableIndex]);
gMessageTable[tableIndex] = nil;
}
}
if (gFWRefTable != nil)
{
delete(gFWRefTable);
gFWRefTable = nil;
}
if (gFWRefMap != nil)
{
delete(gFWRefMap);
gFWRefMap = nil;
}
gProcessPID = getpid();
}
if ( gMessageTable[messageIndex] == nil )
{
gMessageTable[messageIndex] = new CMessaging(false);
if (gMessageTable[messageIndex] != nil)
{
if (inIPPort != 0)
{
siStatus = gMessageTable[messageIndex]->ConfigTCP(inIPAddress, inIPPort);
}
else
{
siStatus = gMessageTable[messageIndex]->ConfigTCP(inIPAddress, kDSFWDefaultRemotePort);
}
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->OpenTCPEndpoint();
LOG2( kStdErr, "DirServices::dsOpenDirServiceProxy: Correlate the messageIndex: %d with the actual CMessaging class ptr %d.", messageIndex, (uInt32)gMessageTable[messageIndex] );
}
}
if ( gFWRefTable == nil )
{
gFWRefTable = new CDSRefTable( nil );
if ( gFWRefTable == nil ) throw( (sInt32)eMemoryAllocError );
}
if ( gFWRefMap == nil )
{
gFWRefMap = new CDSRefMap( nil );
if ( gFWRefMap == nil ) throw( (sInt32)eMemoryAllocError );
}
gLock->Signal();
LogThenThrowIfDSErrorMacro( siStatus );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eMemoryAllocError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inAuthMethod, eDSNullAutMethod, eDSEmptyAuthMethod );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTDataBuff( inAuthStepData, eDSNullAuthStepData, eDSEmptyAuthStepData );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTDataBuff( outAuthStepDataResponse, eDSNullAuthStepDataResp, eDSEmptyAuthStepDataResp );
LogThenThrowIfDSErrorMacro( outResult );
versBuff = dsDataBufferAllocate( 0, 16 ); LogThenThrowIfNilMacro( versBuff, eMemoryAllocError );
memcpy( &(versBuff->fBufferData), "DSProxy1.3", 10 );
versBuff->fBufferLength = 10;
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( versBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = dsDataBufferDeAllocate( 0, versBuff ); LogThenThrowThisIfDSErrorMacro( siStatus, eMemoryError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inAuthMethod, kAuthMethod );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inAuthStepData, kAuthStepBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( outAuthStepDataResponse, kAuthResponseBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 3 );
if ( ioContinueData != nil )
{
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( (uInt32)*ioContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterReceiveError - 4 );
}
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kOpenDirServiceProxy );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = (tDirStatus)gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
if ( outDirRef != nil )
{
tDirNodeReference aRef = 0;
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( &aRef, ktDirRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDirRef );
CDSRefMap::NewDirRefMap( outDirRef, gProcessPID, aRef, messageIndex );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( (messageIndex != 0) && ( gMessageTable[messageIndex] != nil ) && ( gProcessPID == getpid() ) )
{
gLock->Wait();
if (gMessageTable[messageIndex] != nil )
{
gMessageTable[messageIndex]->CloseTCPEndpoint();
gMessageTable[messageIndex]->Unlock();
delete(gMessageTable[messageIndex]);
gMessageTable[messageIndex] = nil;
}
gLock->Signal();
}
if ( gLock != nil )
{
gLock->Signal();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( (messageIndex != 0) && ( gMessageTable[messageIndex] != nil ) && ( gProcessPID == getpid() ) )
{
gLock->Wait();
if (gMessageTable[messageIndex] != nil )
{
gMessageTable[messageIndex]->CloseTCPEndpoint();
gMessageTable[messageIndex]->Unlock();
delete(gMessageTable[messageIndex]);
gMessageTable[messageIndex] = nil;
}
gLock->Signal();
}
if ( gLock != nil )
{
gLock->Signal();
}
}
return( outResult );
}
tDirStatus dsCloseDirService ( tDirReference inDirRef )
{
tDirStatus outResult = eDSNoErr;
uInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inDirRef,eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
LogThenThrowIfTrueMacro(gProcessPID != getpid(), eDSInvalidSession);
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inDirRef, eDirectoryRefType, gProcessPID), ktDirRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gDSConnections, kNodeCount );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kCloseDirService );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = (tDirStatus)gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
CDSRefMap::RemoveDirRef( inDirRef, gProcessPID );
gMessageTable[messageIndex]->Unlock();
LogThenThrowIfNilMacro( gLock, eUnknownServerError );
gLock->Wait();
if ((messageIndex == 0) && (gDSConnections > 0))
{
gDSConnections--; }
if ((messageIndex == 0) && ( gMessageTable[messageIndex] != nil ) && (gDSConnections == 0))
{
gMessageTable[messageIndex]->Lock();
siStatus = gMessageTable[messageIndex]->CloseCommPort();
gMessageTable[messageIndex]->Unlock();
LogThenThrowIfDSErrorMacro( siStatus );
}
if ((messageIndex != 0) && ( gMessageTable[messageIndex] != nil ))
{
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->CloseTCPEndpoint();
gMessageTable[messageIndex]->Unlock();
delete(gMessageTable[messageIndex]);
gMessageTable[messageIndex] = nil;
}
gLock->Signal();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) && ( gProcessPID == getpid() ) )
{
gMessageTable[messageIndex]->Unlock();
}
if ( gLock != nil )
{
gLock->Signal();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) && ( gProcessPID == getpid() ) )
{
gMessageTable[messageIndex]->Unlock();
}
if ( gLock != nil )
{
gLock->Signal();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsAddChildPIDToReference ( tDirReference inDirRef, long inValidChildPID, unsigned long inValidAPIReferenceToGrantChild )
{
tDirStatus outResult = eDSNoErr;
uInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inDirRef, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inDirRef, eDirectoryRefType, gProcessPID), ktDirRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( (sInt32)inValidChildPID, ktPidRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inValidAPIReferenceToGrantChild, eNodeRefType, gProcessPID), ktGenericRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kAddChildPIDToReference );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = (tDirStatus)gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsIsDirServiceRunning ( )
{
tDirStatus outResult = eServerNotRunning;
kern_return_t machErr = 0;
mach_port_t aPort = 0;
mach_port_t bPort = 0;
machErr = task_get_bootstrap_port( mach_task_self(), &aPort );
if ( machErr == 0 )
{
machErr = bootstrap_look_up( aPort, (char *)"DirectoryService", &bPort );
if ( machErr == 0 )
{
outResult = eDSNoErr;
}
}
return( outResult );
}
tDirStatus dsGetDirNodeCount ( tDirReference inDirRef, uInt32 *outNodeCount )
{
tDirStatus outResult = eDSNoErr;
uInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inDirRef, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inDirRef, eDirectoryRefType, gProcessPID), ktDirRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kGetDirNodeCount );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = (tDirStatus)gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
if ( outNodeCount != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( outNodeCount, kNodeCount );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoNodeCount );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsGetDirNodeCountWithInfo ( tDirReference inDirRef, uInt32 *outNodeCount, uInt32 *outDirectoryNodeChangeToken )
{
tDirStatus outResult = eDSNoErr;
uInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inDirRef, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inDirRef, eDirectoryRefType, gProcessPID), ktDirRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kGetDirNodeChangeToken );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = (tDirStatus)gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
if ( outNodeCount != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( outNodeCount, kNodeCount );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoNodeCount );
}
if ( outDirectoryNodeChangeToken != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( outDirectoryNodeChangeToken, kNodeChangeToken );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoNodeChangeToken );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( ( gMessageTable[messageIndex] != nil )!= nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsGetDirNodeList ( tDirReference inDirRef,
tDataBufferPtr outDataBuff,
unsigned long *outNodeCount,
tContextData *ioContinueData )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inDirRef, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( outDataBuff, eDSNullDataBuff, eDSEmptyBuffer );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inDirRef, eDirectoryRefType, gProcessPID), ktDirRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( outDataBuff->fBufferSize, kOutBuffLen );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
if ( ioContinueData != nil )
{
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( (uInt32)*ioContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterReceiveError - 2 );
}
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kGetDirNodeList );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Get_tDataBuff_FromMsg( &outDataBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDataBuff );
if ( outNodeCount != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( outNodeCount, kNodeCount );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoNodeCount );
}
if ( ioContinueData != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)ioContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoContinueData );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsReleaseContinueData ( tDirReference inDirReference,
tContextData inContinueData )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inDirReference, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inDirReference, ktDirRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( (uInt32)inContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kReleaseContinueData );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsFindDirNodes ( tDirReference inDirRef,
tDataBufferPtr outDataBuff,
tDataListPtr inNodeNamePattern,
tDirPatternMatch inPatternMatchType,
unsigned long *outDirNodeCount,
tContextData *ioContinueData )
{
tDirStatus outResult = eDSNoErr;
dsBool bSendList = true;
sInt32 siStatus = eDSNoErr;
sInt32 siDataLen = 0;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inDirRef, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
if ( (inPatternMatchType == eDSLocalNodeNames) ||
(inPatternMatchType == eDSConfigNodeName) ||
(inPatternMatchType == eDSAuthenticationSearchNodeName) ||
(inPatternMatchType == eDSContactsSearchNodeName) ||
(inPatternMatchType == eDSNetworkSearchNodeName) ||
(inPatternMatchType == eDSLocalHostedNodes) ||
(inPatternMatchType == eDSDefaultNetworkNodes) )
{
bSendList = false;
}
else
{
outResult = VerifyTNodeList( inNodeNamePattern, eDSNullNodeNamePattern, eDSEmptyNodeNamePattern );
LogThenThrowIfDSErrorMacro( outResult );
siDataLen = dsGetDataLength( inNodeNamePattern );
}
outResult = VerifyTDataBuff( outDataBuff, eDSNullDataBuff, eDSEmptyBuffer );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inDirRef, eDirectoryRefType, gProcessPID), ktDirRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( outDataBuff->fBufferSize, kOutBuffLen );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
if ( bSendList == true )
{
siStatus = gMessageTable[messageIndex]->Add_tDataList_ToMsg( inNodeNamePattern, kNodeNamePatt );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
}
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inPatternMatchType, ktDirPattMatch );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 3 );
if ( ioContinueData != nil )
{
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( (uInt32)*ioContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterReceiveError - 4 );
}
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kFindDirNodes );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
if ( outDataBuff != nil )
{
siStatus = gMessageTable[messageIndex]->Get_tDataBuff_FromMsg( &outDataBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDataBuff );
}
if ( outDirNodeCount != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( outDirNodeCount, kNodeCount );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoNodeCount );
}
if ( ioContinueData != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)ioContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoContinueData );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsGetDirNodeName ( tDirReference inDirRef,
tDataBufferPtr inDataBuff,
unsigned long inDirNodeIndex,
tDataList **outDataList )
{
tDirStatus outResult = eDSInvalidBuffFormat;
uInt32 siStatus = eDSNoErr;
siStatus = IsNodePathStrBuffer( inDataBuff );
if (siStatus == eDSNoErr)
{
outResult = ExtractDirNodeName(inDataBuff, inDirNodeIndex, outDataList);
}
return( outResult );
}
tDirStatus dsOpenDirNode ( tDirReference inDirRef,
tDataListPtr inDirNodeName,
tDirNodeReference *outDirNodeRef )
{
tDirStatus outResult = eDSNoErr;
tDirNodeReference nodeRef = 0;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex = 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inDirRef, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTNodeList( inDirNodeName, eDSNullNodeName, eDSEmptyNodeName );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inDirRef, eDirectoryRefType, gProcessPID), ktDirRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataList_ToMsg( inDirNodeName, kDirNodeName );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( nodeRef, ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kOpenDirNode );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
if ( outDirNodeRef != nil )
{
tDirNodeReference aRef = 0;
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( &aRef, ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDirRef );
if (messageIndex != 0)
{
CDSRefMap::NewNodeRefMap( outDirNodeRef, inDirRef, gProcessPID, aRef, messageIndex );
}
else
{
*outDirNodeRef = aRef;
}
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsCloseDirNode ( tDirNodeReference inNodeRef )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inNodeRef, eNodeRefType, gProcessPID), ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kCloseDirNode );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
CDSRefMap::RemoveNodeRef( inNodeRef, gProcessPID );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsGetDirNodeInfo ( tDirNodeReference inNodeRef, tDataListPtr inDirNodeInfoTypeList, tDataBufferPtr outDataBuff, dsBool inAttrInfoOnly, unsigned long *outAttrInfoCount, tAttributeListRef *outAttrListRef, tContextData *ioContinueData ) {
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( outDataBuff, eDSNullDataBuff, eDSEmptyBuffer );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTNodeList( inDirNodeInfoTypeList, eDSNullNodeInfoTypeList, eDSEmptyNodeInfoTypeList );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inNodeRef, eNodeRefType, gProcessPID), ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( outDataBuff->fBufferSize, kOutBuffLen );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_tDataList_ToMsg( inDirNodeInfoTypeList, kNodeInfoTypeList );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inAttrInfoOnly, kAttrInfoOnly );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 3 );
if ( ioContinueData != nil )
{
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( (uInt32)*ioContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterReceiveError - 4 );
}
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kGetDirNodeInfo );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Get_tDataBuff_FromMsg( &outDataBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDataBuff );
if ( outAttrInfoCount != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( outAttrInfoCount, kAttrInfoCount );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoAttrCount );
}
if ( outAttrListRef != nil )
{
tAttributeListRef aRef = 0;
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( &aRef, ktAttrListRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoAttrListRef );
if (messageIndex != 0)
{
CDSRefMap::NewAttrListRefMap( outAttrListRef, inNodeRef, gProcessPID, aRef, messageIndex );
}
else
{
*outAttrListRef = aRef;
}
}
if ( ioContinueData != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)ioContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoContinueData );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsGetRecordList ( tDirNodeReference inNodeRef, tDataBufferPtr inOutDataBuff, tDataListPtr inRecNameList, tDirPatternMatch inPatternMatch, tDataListPtr inRecTypeList, tDataListPtr inAttribTypeList, dsBool inAttrInfoOnly, unsigned long *inOutRecEntryCount, tContextData *ioContinueData ) {
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inOutDataBuff, eDSNullDataBuff, eDSEmptyBuffer );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTNodeList( inRecNameList, eDSNullRecNameList, eDSEmptyRecordNameList );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTNodeList( inRecTypeList, eDSNullRecTypeList, eDSEmptyRecordTypeList );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTNodeList( inAttribTypeList, eDSNullAttributeTypeList, eDSEmptyAttributeTypeList );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inNodeRef, eNodeRefType, gProcessPID), ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inOutDataBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_tDataList_ToMsg( inRecNameList, kRecNameList );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inPatternMatch, ktDirPattMatch );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 3 );
siStatus = gMessageTable[messageIndex]->Add_tDataList_ToMsg( inRecTypeList, kRecTypeList );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 4 );
siStatus = gMessageTable[messageIndex]->Add_tDataList_ToMsg( inAttribTypeList, kAttrTypeList );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 5 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inAttrInfoOnly, kAttrInfoOnly );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 6 );
if ( inOutRecEntryCount != nil )
{
if (*inOutRecEntryCount < 0 )
{
*inOutRecEntryCount = 0;
}
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg ( *inOutRecEntryCount, kAttrRecEntryCount );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 7 );
}
if ( ioContinueData != nil )
{
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( (uInt32)*ioContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterReceiveError - 8 );
}
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kGetRecordList );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
if ( outResult != eDSBufferTooSmall )
{
LogThenThrowIfDSErrorMacro( outResult );
}
siStatus = gMessageTable[messageIndex]->Get_tDataBuff_FromMsg( &inOutDataBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDataBuff );
if ( inOutRecEntryCount != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( inOutRecEntryCount, kAttrRecEntryCount );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoRecEntryCount );
}
if ( ioContinueData != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)ioContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoContinueData );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
if ( ( outResult != eDSNoErr ) && ( outResult != eDSBufferTooSmall ) )
{
if ( ioContinueData != nil )
{
*ioContinueData = nil;
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsGetRecordEntry ( tDirNodeReference inNodeRef,
tDataBufferPtr inOutDataBuff,
unsigned long inRecordEntryIndex,
tAttributeListRef *outAttriListRef,
tRecordEntryPtr *outRecEntryPtr )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
siStatus = IsStdBuffer( inOutDataBuff );
if (siStatus == eDSNoErr)
{
outResult = ExtractRecordEntry(inOutDataBuff, inRecordEntryIndex, outAttriListRef, outRecEntryPtr);
return( outResult );
}
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inOutDataBuff, eDSNullDataBuff, eDSEmptyBuffer );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inNodeRef, eNodeRefType, gProcessPID), ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inOutDataBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inRecordEntryIndex, kRecEntryIndex );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kGetRecordEntry );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Get_tDataBuff_FromMsg( &inOutDataBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDataBuff );
if ( outAttriListRef != nil )
{
tAttributeListRef aRef = 0;
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( &aRef, ktAttrListRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoAttrListRef );
if (messageIndex != 0)
{
CDSRefMap::NewAttrListRefMap( outAttriListRef, inNodeRef, gProcessPID, aRef, messageIndex );
}
else
{
*outAttriListRef = aRef;
}
}
if ( outRecEntryPtr != nil )
{
siStatus = gMessageTable[messageIndex]->Get_tRecordEntry_FromMsg( outRecEntryPtr, ktRecordEntry );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoRecEntry );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsGetAttributeEntry ( tDirNodeReference inNodeRef, tDataBufferPtr inOutDataBuff, tAttributeListRef inAttrListRef, unsigned long inAttrInfoIndex, tAttributeValueListRef *outAttrValueListRef, tAttributeEntryPtr *outAttrInfoPtr ) {
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex = 0;
try
{
siStatus = IsFWReference( inAttrListRef );
if (siStatus == eDSNoErr)
{
outResult = ExtractAttributeEntry(inOutDataBuff, inAttrListRef, inAttrInfoIndex, outAttrValueListRef, outAttrInfoPtr);
return( outResult );
}
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inOutDataBuff, eDSNullDataBuff, eDSEmptyBuffer );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inNodeRef, eNodeRefType, gProcessPID), ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inOutDataBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inAttrListRef, eAttrListRefType, gProcessPID), ktAttrListRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 3 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inAttrInfoIndex, kAttrInfoIndex );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 4 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kGetAttributeEntry );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Get_tDataBuff_FromMsg( &inOutDataBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDataBuff );
if ( outAttrValueListRef != nil )
{
tAttributeValueListRef aRef = 0;
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( &aRef, ktAttrValueListRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoAttrValueListRef );
if (messageIndex != 0)
{
CDSRefMap::NewAttrValueRefMap( outAttrValueListRef, inAttrListRef, gProcessPID, aRef, messageIndex );
}
else
{
*outAttrValueListRef = aRef;
}
}
if ( outAttrInfoPtr != nil )
{
siStatus = gMessageTable[messageIndex]->Get_tAttrEntry_FromMsg( outAttrInfoPtr, ktAttrEntry );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoAttrEntry );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsGetAttributeValue ( tDirNodeReference inNodeRef,
tDataBufferPtr inOutDataBuff,
unsigned long inAttrValueIndex,
tAttributeValueListRef inAttrValueListRef,
tAttributeValueEntryPtr *outAttrValue )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
siStatus = IsFWReference( inAttrValueListRef );
if (siStatus == eDSNoErr)
{
outResult = ExtractAttributeValue(inOutDataBuff, inAttrValueListRef, inAttrValueIndex, outAttrValue);
return( outResult );
}
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inOutDataBuff, eDSNullDataBuff, eDSEmptyBuffer );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inNodeRef, eNodeRefType, gProcessPID), ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inOutDataBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inAttrValueIndex, kAttrValueIndex );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inAttrValueListRef, eAttrValueListRefType, gProcessPID), ktAttrValueListRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 3 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kGetAttributeValue );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Get_tDataBuff_FromMsg( &inOutDataBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDataBuff );
if ( outAttrValue != nil )
{
siStatus = gMessageTable[messageIndex]->Get_tAttrValueEntry_FromMsg( outAttrValue, ktAttrValueEntry );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoAttrValueEntry );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsCloseAttributeList ( tAttributeListRef inAttributeListRef )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
siStatus = IsFWReference( inAttributeListRef );
if (siStatus == eDSNoErr)
{
outResult = CDSRefTable::RemoveAttrListRef( inAttributeListRef, gProcessPID );
return( outResult );
}
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inAttributeListRef,eAttrListRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inAttributeListRef,eAttrListRefType, gProcessPID), ktAttrListRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kCloseAttributeList );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
CDSRefMap::RemoveAttrListRef( inAttributeListRef, gProcessPID );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsCloseAttributeValueList ( tAttributeValueListRef inAttributeValueListRef )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
siStatus = IsFWReference( inAttributeValueListRef );
if (siStatus == eDSNoErr)
{
outResult = CDSRefTable::RemoveAttrValueRef( inAttributeValueListRef, gProcessPID );
return( outResult );
}
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inAttributeValueListRef,eAttrValueListRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inAttributeValueListRef, eAttrListRefType, gProcessPID), ktAttrValueListRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kCloseAttributeValueList );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
CDSRefMap::RemoveAttrListRef( inAttributeValueListRef, gProcessPID );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsOpenRecord ( tDirNodeReference inNodeRef,
tDataNodePtr inRecType,
tDataNodePtr inRecName,
tRecordReference *outRecRef )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex = 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inRecType, eDSNullRecType, eDSEmptyRecordType );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTDataBuff( inRecName, eDSNullRecName, eDSEmptyRecordName );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inNodeRef, eNodeRefType, gProcessPID), ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inRecType, kRecTypeBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inRecName, kRecNameBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kOpenRecord );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
if ( outRecRef != nil )
{
tRecordReference aRef = 0;
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( &aRef, ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoRecRef );
if (messageIndex != 0)
{
CDSRefMap::NewRecordRefMap( outRecRef, inNodeRef, gProcessPID, aRef, messageIndex );
}
else
{
*outRecRef = aRef;
}
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsGetRecordReferenceInfo ( tRecordReference inRecRef,
tRecordEntryPtr *outRecInfo )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inRecRef, eRecordRefType, gProcessPID), ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kGetRecordReferenceInfo );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
if ( outRecInfo != nil )
{
siStatus = gMessageTable[messageIndex]->Get_tRecordEntry_FromMsg( outRecInfo, ktRecordEntry );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoRecEntry );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsGetRecordAttributeInfo ( tRecordReference inRecRef,
tDataNodePtr inAttributeType,
tAttributeEntryPtr *outAttrInfoPtr )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex = 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inAttributeType, eDSNullAttributeType, eDSEmptyAttributeType );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inRecRef, eRecordRefType, gProcessPID), ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inAttributeType, kAttrTypeBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kGetRecordAttributeInfo );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
if ( outAttrInfoPtr != nil )
{
siStatus = gMessageTable[messageIndex]->Get_tAttrEntry_FromMsg( outAttrInfoPtr, ktAttrEntry );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoAttrEntry );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsGetRecordAttributeValueByID ( tRecordReference inRecRef,
tDataNodePtr inAttributeType,
unsigned long inValueID,
tAttributeValueEntryPtr *outEntryPtr )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inAttributeType, eDSNullAttributeType, eDSEmptyAttributeType );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inRecRef, eRecordRefType, gProcessPID), ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inAttributeType, kAttrTypeBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inValueID, kAttrValueID );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kGetRecordAttributeValueByID );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
if ( outEntryPtr != nil )
{
siStatus = gMessageTable[messageIndex]->Get_tAttrValueEntry_FromMsg( outEntryPtr, ktAttrValueEntry );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoAttrValueEntry );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsGetRecordAttributeValueByIndex ( tRecordReference inRecRef,
tDataNodePtr inAttributeType,
unsigned long inAttrValueIndex,
tAttributeValueEntryPtr *outEntryPtr )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inAttributeType, eDSNullAttributeType, eDSEmptyAttributeType );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inRecRef, eRecordRefType, gProcessPID), ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inAttributeType, kAttrTypeBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inAttrValueIndex, kAttrValueIndex );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kGetRecordAttributeValueByIndex );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
if ( outEntryPtr != nil )
{
siStatus = gMessageTable[messageIndex]->Get_tAttrValueEntry_FromMsg( outEntryPtr, ktAttrValueEntry );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoAttrValueEntry );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsFlushRecord ( tRecordReference inRecRef )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inRecRef, eRecordRefType, gProcessPID), ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kFlushRecord );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsCloseRecord ( tRecordReference inRecRef )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inRecRef, eRecordRefType, gProcessPID), ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kCloseRecord );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
CDSRefMap::RemoveRecordRef( inRecRef, gProcessPID );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsSetRecordName ( tRecordReference inRecRef,
tDataNodePtr inNewRecordName )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inNewRecordName, eDSNullRecName, eDSEmptyRecordName );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inRecRef, eRecordRefType, gProcessPID), ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inNewRecordName, kRecNameBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kSetRecordName );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsSetRecordType ( tRecordReference inRecRef, tDataNodePtr inNewRecordType )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inNewRecordType, eDSNullRecType, eDSEmptyRecordType );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inRecRef, eRecordRefType, gProcessPID), ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inNewRecordType, kRecTypeBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kSetRecordType );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsDeleteRecord ( tRecordReference inRecRef )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inRecRef, eRecordRefType, gProcessPID), ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kDeleteRecord );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
CDSRefMap::RemoveRecordRef( inRecRef, gProcessPID );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsCreateRecord ( tDirNodeReference inNodeRef,
tDataNodePtr inRecType,
tDataNodePtr inRecName )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inRecType, eDSNullRecType, eDSEmptyRecordType );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTDataBuff( inRecName, eDSNullRecName, eDSEmptyRecordName );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inNodeRef, eNodeRefType, gProcessPID), ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inRecType, kRecTypeBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inRecName, kRecNameBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( false, kOpenRecBool );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 3 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kCreateRecord );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsCreateRecordAndOpen ( tDirNodeReference inNodeRef,
tDataNodePtr inRecType,
tDataNodePtr inRecName,
tRecordReference *outRecRef )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex = 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inRecType, eDSNullRecType, eDSEmptyRecordType );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTDataBuff( inRecName, eDSNullRecName, eDSEmptyRecordName );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inNodeRef, eNodeRefType, gProcessPID), ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inRecType, kRecTypeBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inRecName, kRecNameBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( true, kOpenRecBool );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 3 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kCreateRecordAndOpen );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
if ( outRecRef != nil )
{
tRecordReference aRef = 0;
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( &aRef, ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoRecRef );
if (messageIndex != 0)
{
CDSRefMap::NewRecordRefMap( outRecRef, inNodeRef, gProcessPID, aRef, messageIndex );
}
else
{
*outRecRef = aRef;
}
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsAddAttribute ( tRecordReference inRecRef,
tDataNodePtr inNewAttr,
tAccessControlEntryPtr inNewAttrAccess,
tDataNodePtr inFirstAttrValue )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inNewAttr, eDSNullAttribute, eDSEmptyAttribute );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inRecRef, eRecordRefType, gProcessPID), ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inNewAttr, kNewAttrBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
if ( inFirstAttrValue != nil)
{
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inFirstAttrValue, kFirstAttrBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 3 );
}
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kAddAttribute );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsRemoveAttribute ( tRecordReference inRecRef,
tDataNodePtr inAttribute )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inAttribute, eDSNullAttribute, eDSEmptyAttribute );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inRecRef, eRecordRefType, gProcessPID), ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inAttribute, kAttrBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kRemoveAttribute );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsAddAttributeValue ( tRecordReference inRecRef,
tDataNodePtr inAttrType,
tDataNodePtr inAttrValue )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inAttrType, eDSNullAttributeType, eDSEmptyAttributeType );
LogThenThrowIfDSErrorMacro( outResult );
LogThenThrowIfNilMacro( inAttrValue, eDSNullAttributeValue );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inRecRef, eRecordRefType, gProcessPID), ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inAttrType, kAttrTypeBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inAttrValue, kAttrValueBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kAddAttributeValue );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsRemoveAttributeValue ( tRecordReference inRecRef,
tDataNodePtr inAttrType,
unsigned long inAttrValueID )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inAttrType, eDSNullAttributeType, eDSEmptyAttributeType );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inRecRef, eRecordRefType, gProcessPID), ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inAttrType, kAttrTypeBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inAttrValueID, kAttrValueID );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kRemoveAttributeValue );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsSetAttributeValue ( tRecordReference inRecRef,
tDataNodePtr inAttrType,
tAttributeValueEntryPtr inAttrValueEntry )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inAttrType, eDSNullAttributeType, eDSEmptyAttributeType );
LogThenThrowIfDSErrorMacro( outResult );
LogThenThrowIfNilMacro( inAttrValueEntry, eDSNullAttributeValue );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inRecRef, eRecordRefType, gProcessPID), ktRecRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inAttrType, kAttrTypeBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_tAttrValueEntry_ToMsg( inAttrValueEntry );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kSetAttributeValue );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsDoDirNodeAuth ( tDirNodeReference inNodeRef,
tDataNodePtr inAuthMethod,
dsBool inDirNodeAuthOnlyFlag,
tDataBufferPtr inAuthStepData,
tDataBufferPtr outAuthStepDataResponse, tContextData *ioContinueData )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inAuthMethod, eDSNullAutMethod, eDSEmptyAuthMethod );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTDataBuff( inAuthStepData, eDSNullAuthStepData, eDSEmptyAuthStepData );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTDataBuff( outAuthStepDataResponse, eDSNullAuthStepDataResp, eDSEmptyAuthStepDataResp );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inNodeRef, eNodeRefType, gProcessPID), ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inAuthMethod, kAuthMethod );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inDirNodeAuthOnlyFlag, kAuthOnlyBool );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inAuthStepData, kAuthStepBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 3 );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( outAuthStepDataResponse, kAuthResponseBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 4 );
if ( ioContinueData != nil )
{
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( (uInt32)*ioContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterReceiveError - 5 );
}
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kDoDirNodeAuth );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
if ( outAuthStepDataResponse != nil )
{
siStatus = gMessageTable[messageIndex]->Get_tDataBuff_FromMsg( &outAuthStepDataResponse, kAuthStepDataResponse );
}
if ( ioContinueData != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)ioContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoContinueData );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsDoAttributeValueSearch ( tDirNodeReference inDirNodeRef,
tDataBufferPtr outDataBuff,
tDataListPtr inRecTypeList,
tDataNodePtr inAttrType,
tDirPatternMatch inPattMatchType,
tDataNodePtr inPatt2Match,
unsigned long *inOutMatchRecordCount,
tContextData *ioContinueData )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inDirNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( outDataBuff, eDSNullDataBuff, eDSEmptyBuffer );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTNodeList( inRecTypeList, eDSNullRecTypeList, eDSEmptyRecordTypeList );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTDataBuff( inAttrType, eDSNullAttributeType, eDSEmptyAttributeType );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTDataBuff( inPatt2Match, eDSNullNodeNamePattern, eDSEmptyPatternMatch );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inDirNodeRef, eNodeRefType, gProcessPID), ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( outDataBuff->fBufferSize, kOutBuffLen );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_tDataList_ToMsg( inRecTypeList, kRecTypeList );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inAttrType, kAttrType );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 3 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inPattMatchType, kAttrPattMatch );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 4 );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inPatt2Match, kAttrMatch );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 5 );
if ( inOutMatchRecordCount != nil )
{
if (*inOutMatchRecordCount < 0 )
{
*inOutMatchRecordCount = 0;
}
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg ( *inOutMatchRecordCount, kMatchRecCount );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 6 );
}
if ( ioContinueData != nil )
{
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( (uInt32)*ioContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 7 );
}
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kDoAttributeValueSearch );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
if ( outResult != eDSBufferTooSmall )
{
LogThenThrowIfDSErrorMacro( outResult );
}
siStatus = gMessageTable[messageIndex]->Get_tDataBuff_FromMsg( &outDataBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDataBuff );
if ( inOutMatchRecordCount != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( inOutMatchRecordCount, kMatchRecCount );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoRecMatchCount );
}
if ( ioContinueData != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)ioContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoContinueData );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsDoAttributeValueSearchWithData ( tDirNodeReference inDirNodeRef,
tDataBufferPtr inOutDataBuff,
tDataListPtr inRecTypeList,
tDataNodePtr inAttrType,
tDirPatternMatch inPattMatchType,
tDataNodePtr inPatt2Match,
tDataListPtr inAttrTypeRequestList,
dsBool inAttrInfoOnly,
unsigned long *inOutMatchRecordCount,
tContextData *ioContinueData )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inDirNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inOutDataBuff, eDSNullDataBuff, eDSEmptyBuffer );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTNodeList( inRecTypeList, eDSNullRecTypeList, eDSEmptyRecordTypeList );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTDataBuff( inAttrType, eDSNullAttributeType, eDSEmptyAttributeType );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTDataBuff( inPatt2Match, eDSNullNodeNamePattern, eDSEmptyPatternMatch );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTNodeList( inAttrTypeRequestList, eDSNullAttributeRequestList, eDSEmptyAttributeRequestList );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inDirNodeRef, eNodeRefType, gProcessPID), ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inOutDataBuff->fBufferSize, kOutBuffLen );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_tDataList_ToMsg( inRecTypeList, kRecTypeList );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inAttrType, kAttrType );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 3 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inPattMatchType, kAttrPattMatch );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 4 );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inPatt2Match, kAttrMatch );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 5 );
siStatus = gMessageTable[messageIndex]->Add_tDataList_ToMsg( inAttrTypeRequestList, kAttrTypeRequestList );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 6 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inAttrInfoOnly, kAttrInfoOnly );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 6 );
if ( inOutMatchRecordCount != nil )
{
if (*inOutMatchRecordCount < 0 )
{
*inOutMatchRecordCount = 0;
}
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg ( *inOutMatchRecordCount, kMatchRecCount );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 7 );
}
if ( ioContinueData != nil )
{
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( (uInt32)*ioContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 8 );
}
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kDoAttributeValueSearchWithData );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
if ( outResult != eDSBufferTooSmall )
{
LogThenThrowIfDSErrorMacro( outResult );
}
siStatus = gMessageTable[messageIndex]->Get_tDataBuff_FromMsg( &inOutDataBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDataBuff );
if ( inOutMatchRecordCount != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( inOutMatchRecordCount, kMatchRecCount );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoRecMatchCount );
}
if ( ioContinueData != nil )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)ioContinueData, kContextData );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoContinueData );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsDoPlugInCustomCall ( tDirNodeReference inNodeRef,
unsigned long inRequestCode,
tDataBuffer *inDataBuff,
tDataBuffer *outDataBuff )
{
tDirStatus outResult = eDSNoErr;
sInt32 siStatus = eDSNoErr;
uInt32 blockLen = 0;
uInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inDataBuff, eDSNullDataBuff, eDSEmptyBuffer );
LogThenThrowIfDSErrorMacro( outResult );
if ( outDataBuff == nil )
{
blockLen = inDataBuff->fBufferSize;
}
else
{
blockLen = inDataBuff->fBufferSize + outDataBuff->fBufferSize;
}
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inNodeRef, eNodeRefType, gProcessPID), ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inRequestCode, kCustomRequestCode );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inDataBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
if ( outDataBuff != nil )
{
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( outDataBuff->fBufferSize, kOutBuffLen );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
}
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kDoPlugInCustomCall );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
if ( outDataBuff != nil )
{
siStatus = gMessageTable[messageIndex]->Get_tDataBuff_FromMsg( &outDataBuff, ktDataBuff );
}
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
tDirStatus dsVerifyDirRefNum ( tDirReference inDirRef )
{
tDirStatus outResult = eDSNoErr;
uInt32 siStatus = eDSNoErr;
uInt32 messageIndex= 0;
if ( inDirRef == 0x00F0F0F0 )
{
return( outResult );
}
try
{
LogThenThrowIfNilMacro( gFWRefMap, eDSRefTableError );
messageIndex = gFWRefMap->GetMessageTableIndex(inDirRef, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableError );
gMessageTable[messageIndex]->Lock();
gMessageTable[messageIndex]->ClearMessageBlock();
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap->GetRefNum(inDirRef, eDirectoryRefType, gProcessPID), ktDirRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kVerifyDirRefNum );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = (tDirStatus)gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (uInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
gMessageTable[messageIndex]->Unlock();
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
catch (...)
{
outResult = eDSCannotAccessSession;
if ( ( gMessageTable[messageIndex] != nil ) )
{
gMessageTable[messageIndex]->Unlock();
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return( outResult );
}
void CheckToCleanUpLostTCPConnection ( tDirStatus *inStatus, uInt32 inMessageIndex, uInt32 lineNumber )
{
if (*inStatus != eDSNoErr)
{
if ( inMessageIndex != 0 ) {
if ( ( *inStatus == eDSTCPReceiveError ) ||
( *inStatus == eDSTCPSendError ) ) {
*inStatus = eDSCannotAccessSession;
if ( ( gMessageTable[inMessageIndex] != nil ) &&
( gProcessPID == getpid() ) &&
( gLock != nil ) )
{
gLock->Wait();
if (gMessageTable[inMessageIndex] != nil )
{
LOG1( kStdErr, "DirServices::CheckToCleanUpLostTCPConnection: TCP connection was lost - refer to line %d.", lineNumber );
gMessageTable[inMessageIndex]->Lock();
gMessageTable[inMessageIndex]->CloseTCPEndpoint();
gMessageTable[inMessageIndex]->Unlock();
delete(gMessageTable[inMessageIndex]);
gMessageTable[inMessageIndex] = nil;
}
gLock->Signal();
}
}
}
}
}