#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 "DSSwapUtils.h"
#include "DSTCPEndpoint.h"
#include "CClientEndPoint.h"
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h> // for stat()
#include <sys/sysctl.h> // for sysctl()
#include <unistd.h>
#include <syslog.h>
#include <mach/mach.h> // mach ipc approach to IsDirServiceRunning
#include <mach/mach_error.h>
#include <servers/bootstrap.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#define kDSFWDefaultRemotePort 625 //TODO need final port number
#define kDSFWMaxRemoteConnections 8
const UInt32 gMaxEndpoints = kDSFWMaxRemoteConnections + 2;
static CMessaging *gMessageTable[gMaxEndpoints]
= { NULL };
static UInt32 gDSConnections[gMaxEndpoints]
= { 0 }; static int gTranslateFlag = 0;
static DSMutexSemaphore gLock("API Global::gLock");
pid_t gProcessPID = getpid(); CDSRefMap gFWRefMap;
CDSRefTable gFWRefTable;
void CheckToCleanUpLostTCPConnection ( SInt32 *inStatus, UInt32 inMessageIndex, UInt32 lineNumber );
tDirStatus dsOpenDirService ( tDirReference *outDirRef )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
SInt32 tempStatus = eDSNoErr;
try
{
LogThenThrowIfNilMacro( outDirRef, eDSNullParameter );
gLock.WaitLock();
try
{
do
{
#ifndef SERVERINTERNAL
if ( (siStatus = dsIsDirServiceRunning()) != eDSNoErr )
break;
#endif
if ( gMessageTable[0] == nil )
{
CClientEndPoint *endPoint = NULL;
#ifndef SERVERINTERNAL
char *envPort = getenv( "DS_DEBUG_MODE" );
endPoint = new CClientEndPoint( envPort ? kDSStdMachDebugPortName : kDSStdMachPortName );
if ( endPoint != NULL )
{
siStatus = endPoint->Connect();
if ( siStatus != eDSNoErr && envPort != NULL ) {
fprintf( stderr, "DirectoryService.framework - Request to connect to DEBUG mach port failed, using default port\n" );
DSDelete( endPoint );
endPoint = new CClientEndPoint( kDSStdMachPortName );
if ( endPoint != NULL ) {
siStatus = endPoint->Connect();
}
}
}
if ( endPoint == NULL ) {
siStatus = eMemoryAllocError;
}
#endif
if ( siStatus == eDSNoErr ) {
gMessageTable[0] = new CMessaging( endPoint, gTranslateFlag );
}
else {
delete endPoint;
}
}
if ( siStatus == eDSNoErr )
gDSConnections[0] += 1; break;
} while(1);
}
catch ( SInt32 err )
{
gLock.SignalLock();
throw err;
}
catch ( ... )
{
gLock.SignalLock();
throw (SInt32)eDSCannotAccessSession;
}
gLock.SignalLock();
LogThenThrowIfDSErrorMacro( siStatus );
LogThenThrowIfNilMacro( gMessageTable[0], eMemoryAllocError );
gMessageTable[0]->Lock();
try
{
gMessageTable[0]->ClearMessageBlock();
siStatus = gMessageTable[0]->SendInlineMessage( kOpenDirService );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = (tDirStatus)gMessageTable[0]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[0]->Get_Value_FromMsg( (UInt32 *)&tempStatus, kResult );
outResult = tempStatus;
LogThenThrowIfDSErrorMacro( outResult );
if ( outDirRef != nil )
{
siStatus = gMessageTable[0]->Get_Value_FromMsg( outDirRef, ktDirRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDirRef );
}
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[0]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
return (tDirStatus) outResult;
}
tDirStatus dsOpenDirServiceProxy ( tDirReference *outDirRef,
const char *inHostOrIPAddress,
UInt32 inIPPort,
tDataNodePtr inAuthMethod, tDataBufferPtr inAuthStepData,
tDataBufferPtr outAuthStepDataResponse, tContextData *ioContinueData ) {
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
UInt32 tableIndex = 0;
tDataBufferPtr versBuff = nil;
UInt32 serverVersion = 0;
try
{
LogThenThrowIfNilMacro( outDirRef, eDSNullParameter );
gLock.WaitLock();
try
{
for (tableIndex = 2; tableIndex < gMaxEndpoints; tableIndex++)
{
if ( gMessageTable[tableIndex] == nil )
{
messageIndex = tableIndex;
break;
}
}
LogThenThrowIfTrueMacro( (messageIndex == 0), eDSMaxSessionsOpen );
if ( gMessageTable[messageIndex] == nil )
{
struct addrinfo hints = { 0 };
struct addrinfo *answer = NULL;
char port[12];
hints.ai_family = PF_INET; hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
if ( inIPPort == 0 )
inIPPort = kDSFWDefaultRemotePort;
snprintf( port, sizeof(port), "%u", (uint32_t) inIPPort );
if ( getaddrinfo(inHostOrIPAddress, port, &hints, &answer) == 0 )
{
DSTCPEndpoint *endPoint = new DSTCPEndpoint( kTCPOpenTimeout, kTCPRWTimeout );
if ( endPoint != NULL )
{
siStatus = endPoint->ConnectTo( answer );
if (siStatus == eDSNoErr)
{
siStatus = endPoint->ClientNegotiateKey();
if ( siStatus == eDSNoErr ) {
gMessageTable[messageIndex] = new CMessaging( endPoint, 1, false );
gDSConnections[messageIndex] += 1; }
else {
delete endPoint;
}
}
}
else
{
siStatus = eMemoryError;
}
freeaddrinfo( answer );
answer = NULL;
}
else
{
siStatus = eDSSendFailed;
}
LogThenThrowIfDSErrorMacro( siStatus );
}
}
catch( SInt32 err )
{
gLock.SignalLock();
throw err;
}
catch( ... )
{
gLock.SignalLock();
throw (SInt32)eDSCannotAccessSession;
}
gLock.SignalLock();
LogThenThrowIfDSErrorMacro( siStatus );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eMemoryAllocError );
#if __BIG_ENDIAN__
const char *vers[] = { "DSProxy1.3" };
int versLen[] = { sizeof("DSProxy1.3") - 1 };
int count = sizeof(vers) / sizeof(const char *);
#else
const char *vers[] = { "DSProxy1.4", "DSProxy1.3" };
int versLen[] = { sizeof("DSProxy1.4") - 1, sizeof("DSProxy1.3") - 1 };
int count = sizeof(vers) / sizeof(const char *);
#endif
gMessageTable[messageIndex]->Lock();
try
{
for ( int ii = 0; ii < count; ii++ )
{
try
{
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 );
versBuff->fBufferLength = versLen[ii];
memcpy( &(versBuff->fBufferData), vers[ii], versBuff->fBufferLength );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( versBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
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 );
outResult = outResult;
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (UInt32 *)&serverVersion, kNodeCount );
siStatus = eDSNoErr;
gMessageTable[messageIndex]->SetServerVersion(serverVersion);
if ( outDirRef != nil )
{
tDirNodeReference aRef = 0;
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( &aRef, ktDirRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDirRef );
gFWRefMap.NewDirRefMap( outDirRef, gProcessPID, aRef, messageIndex );
#if __LITTLE_ENDIAN__
if ( serverVersion >= 10400 ) {
gMessageTable[messageIndex]->SetTranslateMode( 2 );
}
#else
gMessageTable[messageIndex]->SetTranslateMode( gTranslateFlag );
#endif
}
break;
}
catch ( SInt32 err )
{
if ( err != eDSTCPVersionMismatch )
throw err;
}
catch ( ... )
{
throw (SInt32) eDSCannotAccessSession;
}
}
}
catch ( SInt32 err )
{
if ( (messageIndex != 0) && ( gMessageTable[messageIndex] != nil ) )
{
gLock.WaitLock();
if (gMessageTable[messageIndex] != nil )
{
DSDelete( gMessageTable[messageIndex] );
}
gLock.SignalLock();
}
throw err;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
return (tDirStatus) outResult;
}
tDirStatus dsOpenDirServiceLocal ( tDirReference *outDirRef, const char *inFilePath )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
tDataBufferPtr fpBuff = nil;
char newPath[PATH_MAX+1] = { 0 };
struct stat statResult;
try
{
LogThenThrowIfNilMacro( outDirRef, eDSNullParameter );
if ( DSIsStringEmpty(inFilePath) || strcmp(inFilePath, "Default") == 0 )
strlcpy( newPath, "/var/db/dslocal/nodes/Default/", sizeof(newPath) );
else
strlcpy( newPath, inFilePath, sizeof(newPath) );
unsigned length = strlen( newPath );
if ( length >= PATH_MAX )
LogThenThrowThisIfDSErrorMacro( siStatus, eDSInvalidFilePath );
if ( newPath[length-1] != '/' )
newPath[length++] = '/';
char *dirPath = strstr( newPath, "/dslocal/nodes/" );
if ( dirPath != NULL && strcmp(dirPath, "/dslocal/nodes/") == 0 ) {
strlcat( newPath, "Default/", sizeof(newPath) );
}
gLock.WaitLock();
try
{
do
{
#ifndef SERVERINTERNAL
if ( dsIsDirServiceRunning() == eDSNoErr )
{
struct stat localDirStat;
if ( lstat(newPath, &statResult) == 0 && lstat("/var/db/dslocal/nodes/Default", &localDirStat) == 0 )
{
if ( statResult.st_ino == localDirStat.st_ino && statResult.st_dev == localDirStat.st_dev ) {
gLock.SignalLock();
return dsOpenDirService( outDirRef );
}
}
}
if ( (siStatus = dsIsDirServiceLocalRunning()) != eDSNoErr )
break;
#endif
if ( gMessageTable[1] == nil )
{
CClientEndPoint *endPoint = NULL;
#ifndef SERVERINTERNAL
endPoint = new CClientEndPoint( kDSStdMachLocalPortName );
if ( endPoint != NULL ) {
siStatus = endPoint->Connect();
}
else {
siStatus = eMemoryAllocError;
}
#endif
if ( siStatus == eDSNoErr ) {
gMessageTable[1] = new CMessaging( endPoint, gTranslateFlag );
gDSConnections[1] += 1; }
else {
delete endPoint;
}
}
break;
} while(1);
}
catch( SInt32 err )
{
gLock.SignalLock();
throw err;
}
catch( ... )
{
gLock.SignalLock();
throw (SInt32) eDSCannotAccessSession;
}
gLock.SignalLock();
LogThenThrowIfDSErrorMacro( siStatus );
LogThenThrowIfNilMacro( gMessageTable[1], eMemoryAllocError );
gMessageTable[1]->Lock();
try
{
gMessageTable[1]->ClearMessageBlock();
fpBuff = dsDataNodeAllocateString( 0, newPath );
LogThenThrowIfNilMacro( fpBuff, eMemoryAllocError );
siStatus = gMessageTable[1]->Add_tDataBuff_ToMsg( fpBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = dsDataBufferDeAllocate( 0, fpBuff ); LogThenThrowThisIfDSErrorMacro( siStatus, eMemoryError );
siStatus = gMessageTable[1]->SendInlineMessage( kOpenDirServiceLocal );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = (tDirStatus)gMessageTable[1]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[1]->Get_Value_FromMsg( (UInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
if ( outDirRef != nil )
{
tDirNodeReference aRef = 0;
siStatus = gMessageTable[1]->Get_Value_FromMsg( &aRef, ktDirRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDirRef );
gFWRefMap.NewDirRefMap( outDirRef, gProcessPID, aRef, 1 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus) err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[1]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
return (tDirStatus) outResult;
}
tDirStatus dsCloseDirService ( tDirReference inDirRef )
{
SInt32 outResult = eDSNoErr;
UInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inDirRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inDirRef,eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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[messageIndex], 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 );
gFWRefMap.RemoveDirRef( inDirRef, gProcessPID );
}
catch( SInt32 err )
{
gMessageTable[messageIndex]->Unlock();
throw err;
}
catch( ... )
{
gMessageTable[messageIndex]->Unlock();
throw (SInt32) eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
gLock.WaitLock();
try
{
gDSConnections[messageIndex] -= 1;
if (gDSConnections[messageIndex] == 0)
{
if ( gMessageTable[messageIndex] != nil )
{
gMessageTable[messageIndex]->CloseConnection();
if ( messageIndex > 1 ) {
DSDelete( gMessageTable[messageIndex] );
}
}
}
}
catch( SInt32 err )
{
outResult = (tDirStatus) err;
}
catch( ... )
{
outResult = eDSCannotAccessSession;
}
gLock.SignalLock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsAddChildPIDToReference ( tDirReference inDirRef, SInt32 inValidChildPID, UInt32 inValidAPIReferenceToGrantChild )
{
SInt32 outResult = eDSNoErr;
UInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inDirRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inDirRef, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsIsDirServiceRunning ( void )
{
#ifdef SERVERINTERNAL
SInt32 outResult = eServerNotRunning;
mach_port_t bPort = 0;
if ( bootstrap_look_up(bootstrap_port, (char *)kDSStdMachPortName, &bPort) == 0 )
{
mach_port_mod_refs( mach_task_self(), bPort, MACH_PORT_RIGHT_SEND, -1 );
outResult = eDSNoErr;
}
return (tDirStatus) outResult;
#else
return eDSNoErr; #endif
}
tDirStatus dsIsDirServiceLocalRunning ( void )
{
SInt32 outResult = eServerNotRunning;
mach_port_t bPort = 0;
if ( bootstrap_look_up(bootstrap_port, (char *)kDSStdMachLocalPortName, &bPort) == 0 )
{
mach_port_mod_refs( mach_task_self(), bPort, MACH_PORT_RIGHT_SEND, -1 );
outResult = eDSNoErr;
}
return (tDirStatus) outResult;
}
tDirStatus dsGetDirNodeCount ( tDirReference inDirRef, UInt32 *outNodeCount )
{
SInt32 outResult = eDSNoErr;
UInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfNilMacro( outNodeCount, eDSNullParameter );
LogThenThrowIfTrueMacro(inDirRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inDirRef, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsGetDirNodeCountWithInfo ( tDirReference inDirRef, UInt32 *outNodeCount, UInt32 *outDirectoryNodeChangeToken )
{
SInt32 outResult = eDSNoErr;
UInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inDirRef == 0, eDSInvalidReference);
LogThenThrowIfTrueMacro(( outNodeCount == nil ) && ( outDirectoryNodeChangeToken == nil), eDSNullParameter);
messageIndex = gFWRefMap.GetMessageTableIndex(inDirRef, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsGetDirNodeList ( tDirReference inDirRef,
tDataBufferPtr outDataBuff,
UInt32 *outNodeCount,
tContextData *ioContinueData )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inDirRef == 0, eDSInvalidReference);
LogThenThrowIfNilMacro( outNodeCount, eDSNullParameter );
messageIndex = gFWRefMap.GetMessageTableIndex(inDirRef, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsReleaseContinueData ( tDirReference inDirReference,
tContextData inContinueData )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inDirReference == 0, eDSInvalidReference);
LogThenThrowIfZeroMacro( inContinueData, eDSInvalidContext );
messageIndex = gFWRefMap.GetMessageTableIndex(inDirReference, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
catch ( SInt32 err )
{
outResult = (tDirStatus) err;
}
catch ( ... )
{
outResult = eUnknownServerError;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsFindDirNodes ( tDirReference inDirRef,
tDataBufferPtr outDataBuff,
tDataListPtr inNodeNamePattern,
tDirPatternMatch inPatternMatchType,
UInt32 *outDirNodeCount,
tContextData *ioContinueData )
{
SInt32 outResult = eDSNoErr;
dsBool bSendList = true;
SInt32 siStatus = eDSNoErr;
SInt32 siDataLen = 0;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inDirRef == 0, eDSInvalidReference);
LogThenThrowIfNilMacro( outDirNodeCount, eDSNullParameter );
messageIndex = gFWRefMap.GetMessageTableIndex(inDirRef, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsGetDirNodeName ( tDirReference inDirRef,
tDataBufferPtr inDataBuff,
UInt32 inDirNodeIndex,
tDataList **outDataList )
{
SInt32 outResult = eDSInvalidBuffFormat;
UInt32 siStatus = eDSNoErr;
siStatus = IsNodePathStrBuffer( inDataBuff );
if (siStatus == eDSNoErr)
{
outResult = ExtractDirNodeName(inDataBuff, inDirNodeIndex, outDataList);
}
return (tDirStatus) outResult;
}
tDirStatus dsOpenDirNode ( tDirReference inDirRef,
tDataListPtr inDirNodeName,
tDirNodeReference *outDirNodeRef )
{
SInt32 outResult = eDSNoErr;
tDirNodeReference nodeRef = 0;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex = 0;
try
{
LogThenThrowIfTrueMacro(inDirRef == 0, eDSInvalidReference);
LogThenThrowIfNilMacro( outDirNodeRef, eDSNullParameter );
messageIndex = gFWRefMap.GetMessageTableIndex(inDirRef, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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;
tDataNodePtr nodePtr = nil;
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( &aRef, ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoDirRef );
if (messageIndex != 0)
{
dsDataListGetNodeAlloc( 0, inDirNodeName, 1, &nodePtr );
char* pluginNameValue = nil;
if ( (nodePtr != nil) && (nodePtr->fBufferLength > 0) )
{
UInt32 pluginNameLength = nodePtr->fBufferLength;
pluginNameValue = (char *) calloc(1, 1 + pluginNameLength);
memcpy(pluginNameValue, nodePtr->fBufferData, pluginNameLength);
dsDataBufferDeAllocate( 0, nodePtr ); }
gFWRefMap.NewNodeRefMap( outDirNodeRef, inDirRef, gProcessPID, aRef, messageIndex, pluginNameValue );
}
else
{
*outDirNodeRef = aRef;
}
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsCloseDirNode ( tDirNodeReference inNodeRef )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inNodeRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
gFWRefMap.RemoveNodeRef( inNodeRef, gProcessPID );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsGetDirNodeInfo ( tDirNodeReference inNodeRef, tDataListPtr inDirNodeInfoTypeList, tDataBufferPtr outDataBuff, dsBool inAttrInfoOnly, UInt32 *outAttrInfoCount, tAttributeListRef *outAttrListRef, tContextData *ioContinueData ) {
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex = 0;
dsBool closeServerRef = false;
tAttributeListRef aRef = 0;
try
{
LogThenThrowIfTrueMacro(inNodeRef == 0, eDSInvalidReference);
LogThenThrowIfNilMacro( outAttrInfoCount, eDSNullParameter );
LogThenThrowIfNilMacro( outAttrListRef, eDSNullParameter );
messageIndex = gFWRefMap.GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 )
{
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( &aRef, ktAttrListRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoAttrListRef );
siStatus = IsStdBuffer( outDataBuff );
if (siStatus == eDSNoErr)
{
siStatus = MakeGDNIFWRef(outDataBuff, outAttrListRef);
if (siStatus == eDSNoErr)
{
closeServerRef = true;
}
}
else
{
if (messageIndex != 0)
{
gFWRefMap.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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
if (closeServerRef)
{
dsCloseAttributeList(aRef);
}
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsGetRecordList ( tDirNodeReference inNodeRef, tDataBufferPtr inOutDataBuff, tDataListPtr inRecNameList, tDirPatternMatch inPatternMatch, tDataListPtr inRecTypeList, tDataListPtr inAttribTypeList, dsBool inAttrInfoOnly, UInt32 *inOutRecEntryCount, tContextData *ioContinueData ) {
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
UInt32 serverVersion = 0;
try
{
LogThenThrowIfTrueMacro(inNodeRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
serverVersion = gMessageTable[messageIndex]->GetServerVersion();
if (serverVersion > 0)
{
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inOutDataBuff->fBufferSize, kOutBuffLen );
}
else
{
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
if ( ( outResult != eDSNoErr ) && ( outResult != eDSBufferTooSmall ) )
{
if ( ioContinueData != nil )
{
*ioContinueData = 0;
}
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsGetRecordEntry ( tDirNodeReference inNodeRef,
tDataBufferPtr inOutDataBuff,
UInt32 inRecordEntryIndex,
tAttributeListRef *outAttrListRef,
tRecordEntryPtr *outRecEntryPtr )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inNodeRef == 0, eDSInvalidReference);
LogThenThrowIfNilMacro( outAttrListRef, eDSNullParameter );
LogThenThrowIfNilMacro( outRecEntryPtr, eDSNullParameter );
LogThenThrowIfZeroMacro( inRecordEntryIndex, eDSInvalidIndex );
siStatus = IsStdBuffer( inOutDataBuff );
if (siStatus == eDSNoErr)
{
outResult = ExtractRecordEntry(inOutDataBuff, inRecordEntryIndex, outAttrListRef, outRecEntryPtr);
return (tDirStatus) outResult;
}
messageIndex = gFWRefMap.GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 ( outAttrListRef != nil )
{
tAttributeListRef aRef = 0;
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( &aRef, ktAttrListRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoAttrListRef );
if (messageIndex != 0)
{
gFWRefMap.NewAttrListRefMap( outAttrListRef, inNodeRef, gProcessPID, aRef, messageIndex );
}
else
{
*outAttrListRef = aRef;
}
}
if ( outRecEntryPtr != nil )
{
siStatus = gMessageTable[messageIndex]->Get_tRecordEntry_FromMsg( outRecEntryPtr, ktRecordEntry );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoRecEntry );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsGetAttributeEntry ( tDirNodeReference inNodeRef, tDataBufferPtr inOutDataBuff, tAttributeListRef inAttrListRef, UInt32 inAttrInfoIndex, tAttributeValueListRef *outAttrValueListRef, tAttributeEntryPtr *outAttrInfoPtr ) {
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex = 0;
try
{
LogThenThrowIfTrueMacro(inNodeRef == 0, eDSInvalidReference);
LogThenThrowIfNilMacro( outAttrValueListRef, eDSNullParameter );
LogThenThrowIfNilMacro( outAttrInfoPtr, eDSNullParameter );
LogThenThrowIfZeroMacro( inAttrInfoIndex, eDSInvalidIndex );
siStatus = IsFWReference( inAttrListRef );
if (siStatus == eDSNoErr)
{
outResult = ExtractAttributeEntry(inOutDataBuff, inAttrListRef, inAttrInfoIndex, outAttrValueListRef, outAttrInfoPtr);
return (tDirStatus) outResult;
}
messageIndex = gFWRefMap.GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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)
{
gFWRefMap.NewAttrValueRefMap( outAttrValueListRef, inAttrListRef, gProcessPID, aRef, messageIndex );
}
else
{
*outAttrValueListRef = aRef;
}
}
if ( outAttrInfoPtr != nil )
{
siStatus = gMessageTable[messageIndex]->Get_tAttrEntry_FromMsg( outAttrInfoPtr, ktAttrEntry );
LogThenThrowThisIfDSErrorMacro( siStatus, eDataReceiveErr_NoAttrEntry );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsGetNextAttributeEntry ( tDirNodeReference inNodeRef, tDataBufferPtr inOutDataBuff, tAttributeListRef inAttrListRef, UInt32 inAttrInfoIndex, SInt32 *inOutAttributeOffset,
tAttributeValueListRef *outAttrValueListRef, tAttributeEntryPtr *outAttrInfoPtr ) {
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
try
{
LogThenThrowIfTrueMacro(inNodeRef == 0, eDSInvalidReference);
LogThenThrowIfNilMacro( outAttrValueListRef, eDSNullParameter );
LogThenThrowIfNilMacro( outAttrInfoPtr, eDSNullParameter );
LogThenThrowIfZeroMacro( inAttrInfoIndex, eDSInvalidIndex );
siStatus = IsFWReference( inAttrListRef );
if (siStatus == eDSNoErr)
{
outResult = ExtractNextAttributeEntry(inOutDataBuff, inAttrListRef, inAttrInfoIndex, inOutAttributeOffset, outAttrValueListRef, outAttrInfoPtr);
return (tDirStatus) outResult;
}
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
outResult = dsGetAttributeEntry(inNodeRef, inOutDataBuff, inAttrListRef, inAttrInfoIndex, outAttrValueListRef, outAttrInfoPtr);
return (tDirStatus) outResult;
}
tDirStatus dsGetAttributeValue ( tDirNodeReference inNodeRef,
tDataBufferPtr inOutDataBuff,
UInt32 inAttrValueIndex,
tAttributeValueListRef inAttrValueListRef,
tAttributeValueEntryPtr *outAttrValue )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inNodeRef == 0, eDSInvalidReference);
LogThenThrowIfNilMacro( outAttrValue, eDSNullParameter );
LogThenThrowIfZeroMacro( inAttrValueIndex, eDSInvalidIndex );
siStatus = IsFWReference( inAttrValueListRef );
if (siStatus == eDSNoErr)
{
outResult = ExtractAttributeValue(inOutDataBuff, inAttrValueListRef, inAttrValueIndex, outAttrValue);
return (tDirStatus) outResult;
}
messageIndex = gFWRefMap.GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsGetNextAttributeValue ( tDirNodeReference inNodeRef,
tDataBufferPtr inOutDataBuff,
UInt32 inAttrValueIndex,
SInt32 *inOutAttributeValueOffset,
tAttributeValueListRef inAttrValueListRef,
tAttributeValueEntryPtr *outAttrValue )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
try
{
LogThenThrowIfTrueMacro(inNodeRef == 0, eDSInvalidReference);
LogThenThrowIfNilMacro( outAttrValue, eDSNullParameter );
LogThenThrowIfZeroMacro( inAttrValueIndex, eDSInvalidIndex );
siStatus = IsFWReference( inAttrValueListRef );
if (siStatus == eDSNoErr)
{
outResult = ExtractNextAttributeValue(inOutDataBuff, inAttrValueListRef, inAttrValueIndex, inOutAttributeValueOffset, outAttrValue);
return (tDirStatus) outResult;
}
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
outResult = dsGetAttributeValue(inNodeRef, inOutDataBuff, inAttrValueIndex, inAttrValueListRef, outAttrValue);
return (tDirStatus) outResult;
}
tDirStatus dsCloseAttributeList ( tAttributeListRef inAttributeListRef )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inAttributeListRef == 0, eDSInvalidReference);
siStatus = IsFWReference( inAttributeListRef );
if (siStatus == eDSNoErr)
{
outResult = gFWRefTable.RemoveAttrListRef( inAttributeListRef, gProcessPID );
return (tDirStatus) outResult;
}
messageIndex = gFWRefMap.GetMessageTableIndex(inAttributeListRef,eAttrListRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
gFWRefMap.RemoveAttrListRef( inAttributeListRef, gProcessPID );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsCloseAttributeValueList ( tAttributeValueListRef inAttributeValueListRef )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inAttributeValueListRef == 0, eDSInvalidReference);
siStatus = IsFWReference( inAttributeValueListRef );
if (siStatus == eDSNoErr)
{
outResult = gFWRefTable.RemoveAttrValueRef( inAttributeValueListRef, gProcessPID );
return (tDirStatus) outResult;
}
messageIndex = gFWRefMap.GetMessageTableIndex(inAttributeValueListRef,eAttrValueListRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
gMessageTable[messageIndex]->ClearMessageBlock();
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( gFWRefMap.GetRefNum(inAttributeValueListRef, eAttrValueListRefType, 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 );
gFWRefMap.RemoveAttrListRef( inAttributeValueListRef, gProcessPID );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsOpenRecord ( tDirNodeReference inNodeRef,
tDataNodePtr inRecType,
tDataNodePtr inRecName,
tRecordReference *outRecRef )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex = 0;
try
{
LogThenThrowIfTrueMacro(inNodeRef == 0, eDSInvalidReference);
LogThenThrowIfNilMacro( outRecRef, eDSNullParameter );
messageIndex = gFWRefMap.GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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)
{
gFWRefMap.NewRecordRefMap( outRecRef, inNodeRef, gProcessPID, aRef, messageIndex );
}
else
{
*outRecRef = aRef;
}
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsGetRecordReferenceInfo ( tRecordReference inRecRef,
tRecordEntryPtr *outRecInfo )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
LogThenThrowIfNilMacro( outRecInfo, eDSNullParameter );
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsGetRecordAttributeInfo ( tRecordReference inRecRef,
tDataNodePtr inAttributeType,
tAttributeEntryPtr *outAttrInfoPtr )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex = 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
LogThenThrowIfNilMacro( outAttrInfoPtr, eDSNullParameter );
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsGetRecordAttributeValueByID ( tRecordReference inRecRef,
tDataNodePtr inAttributeType,
UInt32 inValueID,
tAttributeValueEntryPtr *outEntryPtr )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
LogThenThrowIfNilMacro( outEntryPtr, eDSNullParameter );
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsGetRecordAttributeValueByIndex ( tRecordReference inRecRef,
tDataNodePtr inAttributeType,
UInt32 inAttrValueIndex,
tAttributeValueEntryPtr *outEntryPtr )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
LogThenThrowIfNilMacro( outEntryPtr, eDSNullParameter );
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
LogThenThrowIfZeroMacro( inAttrValueIndex, eDSInvalidIndex );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsGetRecordAttributeValueByValue ( tRecordReference inRecRef,
tDataNodePtr inAttributeType,
tDataNodePtr inAttributeValue,
tAttributeValueEntryPtr *outEntryPtr )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
LogThenThrowIfNilMacro( outEntryPtr, eDSNullParameter );
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inAttributeType, eDSNullAttributeType, eDSEmptyAttributeType );
LogThenThrowIfDSErrorMacro( outResult );
LogThenThrowIfNilMacro( inAttributeValue, eDSNullAttributeValue );
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_tDataBuff_ToMsg( inAttributeValue, kAttrValueBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kGetRecordAttributeValueByValue );
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsFlushRecord ( tRecordReference inRecRef )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsCloseRecord ( tRecordReference inRecRef )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
gFWRefMap.RemoveRecordRef( inRecRef, gProcessPID );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsSetRecordName ( tRecordReference inRecRef,
tDataNodePtr inNewRecordName )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsSetRecordType ( tRecordReference inRecRef, tDataNodePtr inNewRecordType )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsDeleteRecord ( tRecordReference inRecRef )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
gFWRefMap.RemoveRecordRef( inRecRef, gProcessPID );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsCreateRecord ( tDirNodeReference inNodeRef,
tDataNodePtr inRecType,
tDataNodePtr inRecName )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inNodeRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsCreateRecordAndOpen ( tDirNodeReference inNodeRef,
tDataNodePtr inRecType,
tDataNodePtr inRecName,
tRecordReference *outRecRef )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex = 0;
try
{
LogThenThrowIfTrueMacro(inNodeRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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( (outRecRef != nil), 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)
{
gFWRefMap.NewRecordRefMap( outRecRef, inNodeRef, gProcessPID, aRef, messageIndex );
}
else
{
*outRecRef = aRef;
}
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsAddAttribute ( tRecordReference inRecRef,
tDataNodePtr inNewAttr,
tAccessControlEntryPtr inNewAttrAccess,
tDataNodePtr inFirstAttrValue )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsRemoveAttribute ( tRecordReference inRecRef,
tDataNodePtr inAttribute )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsAddAttributeValue ( tRecordReference inRecRef,
tDataNodePtr inAttrType,
tDataNodePtr inAttrValue )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsRemoveAttributeValue ( tRecordReference inRecRef,
tDataNodePtr inAttrType,
UInt32 inAttrValueID )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsSetAttributeValue ( tRecordReference inRecRef,
tDataNodePtr inAttrType,
tAttributeValueEntryPtr inAttrValueEntry )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsSetAttributeValues ( tRecordReference inRecRef,
tDataNodePtr inAttrType,
tDataListPtr inAttributeValuesPtr )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inRecRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inRecRef,eRecordRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
gMessageTable[messageIndex]->ClearMessageBlock();
outResult = VerifyTDataBuff( inAttrType, eDSNullAttributeType, eDSEmptyAttributeType );
LogThenThrowIfDSErrorMacro( outResult );
outResult = VerifyTNodeList( inAttributeValuesPtr, eDSNullDataList, eDSEmptyDataList );
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_tDataList_ToMsg( inAttributeValuesPtr, kAttrValueList );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kSetAttributeValues );
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->GetReplyMessage();
LogThenThrowIfDSErrorMacro( siStatus );
siStatus = gMessageTable[messageIndex]->Get_Value_FromMsg( (UInt32 *)&outResult, kResult );
LogThenThrowIfDSErrorMacro( outResult );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsDoDirNodeAuth ( tDirNodeReference inNodeRef,
tDataNodePtr inAuthMethod,
dsBool inDirNodeAuthOnlyFlag,
tDataBufferPtr inAuthStepData,
tDataBufferPtr outAuthStepDataResponse, tContextData *ioContinueData )
{
SInt32 outResult = eDSNoErr;
outResult = dsDoDirNodeAuthOnRecordType( inNodeRef,
inAuthMethod,
inDirNodeAuthOnlyFlag,
inAuthStepData,
outAuthStepDataResponse,
ioContinueData,
nil);
return (tDirStatus) outResult;
}
tDirStatus dsDoDirNodeAuthOnRecordType ( tDirNodeReference inNodeRef,
tDataNodePtr inAuthMethod,
dsBool inDirNodeAuthOnlyFlag,
tDataBufferPtr inAuthStepData,
tDataBufferPtr outAuthStepDataResponse,
tContextData *ioContinueData,
tDataNodePtr inRecordType )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inNodeRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
if (inRecordType != nil)
{
outResult = VerifyTDataBuff( inRecordType, eDSNullRecType, eDSEmptyRecordType );
LogThenThrowIfDSErrorMacro( outResult );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inRecordType, kRecTypeBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 6 );
}
if (inRecordType == nil)
{
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kDoDirNodeAuth );
}
else
{
siStatus = gMessageTable[messageIndex]->SendInlineMessage( kDoDirNodeAuthOnRecordType );
}
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsDoAttributeValueSearch ( tDirNodeReference inDirNodeRef,
tDataBufferPtr outDataBuff,
tDataListPtr inRecTypeList,
tDataNodePtr inAttrType,
tDirPatternMatch inPattMatchType,
tDataNodePtr inPatt2Match,
UInt32 *inOutMatchRecordCount,
tContextData *ioContinueData )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inDirNodeRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inDirNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsDoMultipleAttributeValueSearch ( tDirNodeReference inDirNodeRef,
tDataBufferPtr outDataBuff,
tDataListPtr inRecTypeList,
tDataNodePtr inAttrType,
tDirPatternMatch inPattMatchType,
tDataListPtr inPatterns2Match,
UInt32 *inOutMatchRecordCount,
tContextData *ioContinueData )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inDirNodeRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inDirNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 = VerifyTNodeList( inPatterns2Match, eDSNullAttributeValue, 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_tDataList_ToMsg( inPatterns2Match, kAttrMatches );
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( kDoMultipleAttributeValueSearch );
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsDoAttributeValueSearchWithData ( tDirNodeReference inDirNodeRef,
tDataBufferPtr inOutDataBuff,
tDataListPtr inRecTypeList,
tDataNodePtr inAttrType,
tDirPatternMatch inPattMatchType,
tDataNodePtr inPatt2Match,
tDataListPtr inAttrTypeRequestList,
dsBool inAttrInfoOnly,
UInt32 *inOutMatchRecordCount,
tContextData *ioContinueData )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inDirNodeRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inDirNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsDoMultipleAttributeValueSearchWithData ( tDirNodeReference inDirNodeRef,
tDataBufferPtr inOutDataBuff,
tDataListPtr inRecTypeList,
tDataNodePtr inAttrType,
tDirPatternMatch inPattMatchType,
tDataListPtr inPatterns2Match,
tDataListPtr inAttrTypeRequestList,
dsBool inAttrInfoOnly,
UInt32 *inOutMatchRecordCount,
tContextData *ioContinueData )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
try
{
LogThenThrowIfTrueMacro(inDirNodeRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inDirNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 = VerifyTNodeList( inPatterns2Match, eDSNullAttributeValue, 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_tDataList_ToMsg( inPatterns2Match, kAttrMatches );
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( kDoMultipleAttributeValueSearchWithData );
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsDoPlugInCustomCall ( tDirNodeReference inNodeRef,
UInt32 inRequestCode,
tDataBuffer *inDataBuff,
tDataBuffer *outDataBuff )
{
SInt32 outResult = eDSNoErr;
SInt32 siStatus = eDSNoErr;
UInt32 blockLen = 0;
UInt32 messageIndex= 0;
UInt32 serverNodeRef = 0;
try
{
LogThenThrowIfTrueMacro(inNodeRef == 0, eDSInvalidReference);
messageIndex = gFWRefMap.GetMessageTableIndex(inNodeRef, eNodeRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
gMessageTable[messageIndex]->ClearMessageBlock();
if ( inDataBuff == NULL )
outResult = eDSNullDataBuff;
LogThenThrowIfDSErrorMacro( outResult );
if ( outDataBuff == nil )
{
blockLen = inDataBuff->fBufferSize;
}
else
{
blockLen = inDataBuff->fBufferSize + outDataBuff->fBufferSize;
}
serverNodeRef = gFWRefMap.GetRefNum( inNodeRef, eNodeRefType, gProcessPID );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( serverNodeRef, ktNodeRef );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inNodeRef, ktNodeRefMap );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 1 );
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( inRequestCode, kCustomRequestCode );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 2 );
siStatus = gMessageTable[messageIndex]->Add_tDataBuff_ToMsg( inDataBuff, ktDataBuff );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 3 );
if ( outDataBuff != nil )
{
siStatus = gMessageTable[messageIndex]->Add_Value_ToMsg( outDataBuff->fBufferSize, kOutBuffLen );
LogThenThrowThisIfDSErrorMacro( siStatus, eParameterSendError - 4 );
}
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 );
}
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
tDirStatus dsVerifyDirRefNum ( tDirReference inDirRef )
{
SInt32 outResult = eDSNoErr;
UInt32 siStatus = eDSNoErr;
UInt32 messageIndex= 0;
if ( inDirRef == 0x00F0F0F0 )
{
return (tDirStatus) outResult;
}
if ( inDirRef == 0x0 )
{
return( eDSInvalidReference );
}
try
{
messageIndex = gFWRefMap.GetMessageTableIndex(inDirRef, eDirectoryRefType, gProcessPID);
LogThenThrowIfTrueMacro( messageIndex > gMaxEndpoints, eDSRefTableIndexOutOfBoundsError );
LogThenThrowIfNilMacro( gMessageTable[messageIndex], eDSRefTableEntryNilError );
gMessageTable[messageIndex]->Lock();
try
{
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 );
}
catch ( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
gMessageTable[messageIndex]->Unlock();
}
catch( SInt32 err )
{
outResult = (tDirStatus)err;
}
catch ( ... )
{
outResult = eDSCannotAccessSession;
}
CheckToCleanUpLostTCPConnection(&outResult, messageIndex, __LINE__);
return (tDirStatus) outResult;
}
void CheckToCleanUpLostTCPConnection ( SInt32 *inStatus, UInt32 inMessageIndex, UInt32 lineNumber )
{
if (*inStatus != eDSNoErr)
{
if ( inMessageIndex != 0 ) {
if ( ( *inStatus == eDSTCPReceiveError ) ||
( *inStatus == eDSTCPSendError ) ) {
*inStatus = eDSCannotAccessSession;
if ( ( gMessageTable[inMessageIndex] != nil ) )
{
gLock.WaitLock();
if (gMessageTable[inMessageIndex] != nil )
{
LOG1( kStdErr, "DirServices::CheckToCleanUpLostTCPConnection: TCP connection was lost - refer to line %d.", lineNumber );
DSDelete(gMessageTable[inMessageIndex]);
}
gLock.SignalLock();
}
}
}
}
}