#include "CDSRefMap.h"
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/sysctl.h> // for struct kinfo_proc and sysctl()
#include "PrivateTypes.h"
#ifdef __LITTLE_ENDIAN__
static tRefMap fServerToLocalRefMap;
static tRefMap fMsgIDToServerRefMap;
static tRefMap fMsgIDToCustomCodeMap;
#endif
DSMutexSemaphore *gFWRefMapMutex = nil;
dsBool gLogFWRefMapCalls = false;
CDSRefMap::CDSRefMap ( RefMapDeallocateProc *deallocProc )
{
fTableCount = 0;
::memset( fRefMapTables, 0, sizeof( fRefMapTables ) );
if ( gFWRefMapMutex == nil )
{
gFWRefMapMutex = new DSMutexSemaphore();
if( gFWRefMapMutex == nil ) throw((sInt32)eMemoryAllocError);
}
fDeallocProc = deallocProc;
}
CDSRefMap::~CDSRefMap ( void )
{
uInt32 i = 1;
uInt32 j = 1;
for ( i = 1; i <= kMaxFWTables; i++ ) {
if ( fRefMapTables[ i ] != nil )
{
for (j=0; j< kMaxFWTableItems; j++)
{
if (fRefMapTables[ i ]->fTableData[j] != nil)
{
free(fRefMapTables[ i ]->fTableData[j]);
fRefMapTables[ i ]->fTableData[j] = nil;
}
}
free( fRefMapTables[ i ] ); fRefMapTables[ i ] = nil;
}
}
if ( gFWRefMapMutex != nil )
{
delete( gFWRefMapMutex );
gFWRefMapMutex = nil;
}
}
tDirStatus CDSRefMap::VerifyReference ( tDirReference inDirRef, uInt32 inType,
sInt32 inPID )
{
tDirStatus siResult = eDSInvalidReference;
sFWRefMapEntry *refData = nil;
sPIDFWInfo *pPIDInfo = nil;
if ((inDirRef & 0x00C00000) != 0)
{
siResult = GetReference( inDirRef, &refData );
if ( siResult == eDSNoErr )
{
if ( refData->fType != inType )
{
siResult = eDSInvalidRefType;
}
else
{
siResult = eDSInvalidRefType;
if (refData->fPID == inPID)
{
siResult = eDSNoErr;
}
else
{
pPIDInfo = refData->fChildPID;
while ( (pPIDInfo != nil) && (siResult != eDSNoErr) )
{
if (pPIDInfo->fPID == inPID)
{
siResult = eDSNoErr;
}
pPIDInfo = pPIDInfo->fNext;
}
}
}
}
}
return( siResult );
}
tDirStatus CDSRefMap::VerifyDirRef ( tDirReference inDirRef,
sInt32 inPID )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
if ( gFWRefMap != nil )
{
siResult = gFWRefMap->VerifyReference( inDirRef, eDirectoryRefType, inPID );
}
return( siResult );
}
tDirStatus CDSRefMap::VerifyNodeRef ( tDirNodeReference inDirNodeRef,
sInt32 inPID )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
if ( gFWRefMap != nil )
{
siResult = gFWRefMap->VerifyReference( inDirNodeRef, eNodeRefType, inPID );
}
return( siResult );
}
tDirStatus CDSRefMap::VerifyRecordRef ( tRecordReference inRecordRef,
sInt32 inPID )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
if ( gFWRefMap != nil )
{
siResult = gFWRefMap->VerifyReference( inRecordRef, eRecordRefType, inPID );
}
return( siResult );
}
tDirStatus CDSRefMap::VerifyAttrListRef ( tAttributeListRef inAttributeListRef,
sInt32 inPID )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
if ( gFWRefMap != nil )
{
siResult = gFWRefMap->VerifyReference( inAttributeListRef, eAttrListRefType, inPID );
}
return( siResult );
}
tDirStatus CDSRefMap::VerifyAttrValueRef ( tAttributeValueListRef inAttributeValueListRef,
sInt32 inPID )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
if ( gFWRefMap != nil )
{
siResult = gFWRefMap->VerifyReference( inAttributeValueListRef, eAttrValueListRefType, inPID );
}
return( siResult );
}
tDirStatus CDSRefMap::NewDirRefMap ( uInt32 *outNewRef, sInt32 inPID,
uInt32 serverRef,
uInt32 messageIndex )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
if ( gFWRefMap != nil )
{
siResult = gFWRefMap->GetNewRef( outNewRef, 0, eDirectoryRefType, inPID, serverRef, messageIndex );
}
return( siResult );
}
tDirStatus CDSRefMap::NewNodeRefMap ( uInt32 *outNewRef,
uInt32 inParentID,
sInt32 inPID,
uInt32 serverRef,
uInt32 messageIndex,
char *inPluginName)
{
tDirStatus siResult = eDSDirSrvcNotOpened;
if ( gFWRefMap != nil )
{
siResult = gFWRefMap->GetNewRef( outNewRef, inParentID, eNodeRefType, inPID, serverRef, messageIndex );
if (siResult == eDSNoErr)
{
siResult = gFWRefMap->SetPluginName( *outNewRef, eNodeRefType, inPluginName, inPID );
}
}
return( siResult );
}
tDirStatus CDSRefMap::NewRecordRefMap ( uInt32 *outNewRef,
uInt32 inParentID,
sInt32 inPID,
uInt32 serverRef,
uInt32 messageIndex )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
if ( gFWRefMap != nil )
{
siResult = gFWRefMap->GetNewRef( outNewRef, inParentID, eRecordRefType, inPID, serverRef, messageIndex );
}
return( siResult );
}
tDirStatus CDSRefMap::NewAttrListRefMap ( uInt32 *outNewRef,
uInt32 inParentID,
sInt32 inPID,
uInt32 serverRef,
uInt32 messageIndex )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
if ( gFWRefMap != nil )
{
siResult = gFWRefMap->GetNewRef( outNewRef, inParentID, eAttrListRefType, inPID, serverRef, messageIndex );
}
return( siResult );
}
tDirStatus CDSRefMap::NewAttrValueRefMap ( uInt32 *outNewRef,
uInt32 inParentID,
sInt32 inPID,
uInt32 serverRef,
uInt32 messageIndex )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
if ( gFWRefMap != nil )
{
siResult = gFWRefMap->GetNewRef( outNewRef, inParentID, eAttrValueListRefType, inPID, serverRef, messageIndex );
}
return( siResult );
}
tDirStatus CDSRefMap::RemoveDirRef ( uInt32 inDirRef, sInt32 inPID )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
if ( gFWRefMap != nil )
{
siResult = gFWRefMap->RemoveRef( inDirRef, eDirectoryRefType, inPID );
}
return( siResult );
}
tDirStatus CDSRefMap::RemoveNodeRef ( uInt32 inNodeRef, sInt32 inPID )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
if ( gFWRefMap != nil )
{
siResult = gFWRefMap->RemoveRef( inNodeRef, eNodeRefType, inPID );
}
return( siResult );
}
tDirStatus CDSRefMap::RemoveRecordRef ( uInt32 inRecRef, sInt32 inPID )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
if ( gFWRefMap != nil )
{
siResult = gFWRefMap->RemoveRef( inRecRef, eRecordRefType, inPID );
}
return( siResult );
}
tDirStatus CDSRefMap::RemoveAttrListRef ( uInt32 inAttrListRef, sInt32 inPID )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
if ( gFWRefMap != nil )
{
siResult = gFWRefMap->RemoveRef( inAttrListRef, eAttrListRefType, inPID );
}
return( siResult );
}
tDirStatus CDSRefMap::RemoveAttrValueRef ( uInt32 inAttrValueRef, sInt32 inPID )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
if ( gFWRefMap != nil )
{
siResult = gFWRefMap->RemoveRef( inAttrValueRef, eAttrValueListRefType, inPID );
}
return( siResult );
}
sFWRefMapEntry* CDSRefMap::GetTableRef ( uInt32 inRefNum )
{
uInt32 uiSlot = 0;
uInt32 uiRefNum = (inRefNum & 0x00FFFFFF);
uInt32 uiTableNum = (inRefNum & 0xFF000000) >> 24;
sRefMapTable *pTable = nil;
sFWRefMapEntry *pOutEntry = nil;
gFWRefMapMutex->Wait();
try
{
pTable = GetThisTable( uiTableNum );
if ( pTable == nil ) throw( (sInt32)eDSInvalidReference );
uiSlot = uiRefNum % kMaxFWTableItems;
if ( pTable->fTableData != nil)
{
if ( pTable->fTableData[ uiSlot ] != nil )
{
if ( uiRefNum == pTable->fTableData[ uiSlot ]->fRefNum )
{
pOutEntry = pTable->fTableData[ uiSlot ];
}
}
}
}
catch( sInt32 err )
{
}
gFWRefMapMutex->Signal();
return( pOutEntry );
}
sRefMapTable* CDSRefMap::GetNextTable ( sRefMapTable *inTable )
{
uInt32 uiTblNum = 0;
sRefMapTable *pOutTable = nil;
gFWRefMapMutex->Wait();
try
{
if ( inTable == nil )
{
if ( fRefMapTables[ 1 ] == nil )
{
fRefMapTables[ 1 ] = (sRefMapTable *)::calloc( sizeof( sRefMapTable ), sizeof( char ) );
if ( fRefMapTables[ 1 ] == nil ) throw((sInt32)eMemoryAllocError);
fRefMapTables[ 1 ]->fTableNum = 1;
fTableCount = 1;
}
pOutTable = fRefMapTables[ 1 ];
}
else
{
uiTblNum = inTable->fTableNum + 1;
if (uiTblNum > kMaxFWTables) throw( (sInt32)eDSInvalidReference );
if ( fRefMapTables[ uiTblNum ] == nil )
{
fTableCount = uiTblNum;
fRefMapTables[ uiTblNum ] = (sRefMapTable *)::calloc( sizeof( sRefMapTable ), sizeof( char ) );
if( fRefMapTables[ uiTblNum ] == nil ) throw((sInt32)eMemoryAllocError);
if (uiTblNum == 0) throw( (sInt32)eDSInvalidReference );
fRefMapTables[ uiTblNum ]->fTableNum = uiTblNum;
}
pOutTable = fRefMapTables[ uiTblNum ];
}
}
catch( sInt32 err )
{
}
gFWRefMapMutex->Signal();
return( pOutTable );
}
sRefMapTable* CDSRefMap::GetThisTable ( uInt32 inTableNum )
{
sRefMapTable *pOutTable = nil;
gFWRefMapMutex->Wait();
pOutTable = fRefMapTables[ inTableNum ];
gFWRefMapMutex->Signal();
return( pOutTable );
}
tDirStatus CDSRefMap::GetNewRef ( uInt32 *outRef,
uInt32 inParentID,
eRefTypes inType,
sInt32 inPID,
uInt32 serverRef,
uInt32 messageIndex )
{
bool done = false;
tDirStatus outResult = eDSNoErr;
sRefMapTable *pCurTable = nil;
uInt32 uiRefNum = 0;
uInt32 uiCntr = 0;
uInt32 uiSlot = 0;
uInt32 uiTableNum = 0;
gFWRefMapMutex->Wait();
try
{
*outRef = 0;
while ( !done )
{
pCurTable = GetNextTable( pCurTable );
if ( pCurTable == nil ) throw( (sInt32)eDSRefTableFWAllocError );
if ( pCurTable->fItemCnt < kMaxFWTableItems )
{
uiCntr = 0;
uiTableNum = pCurTable->fTableNum;
while ( (uiCntr < kMaxFWTableItems) && !done ) {
if ( (pCurTable->fCurRefNum == 0) ||
(pCurTable->fCurRefNum > 0x000FFFFF) )
{
pCurTable->fCurRefNum = 1;
}
uiRefNum = pCurTable->fCurRefNum++;
uiRefNum += 0x00C00000;
uiSlot = uiRefNum % kMaxFWTableItems;
if ( pCurTable->fTableData[ uiSlot ] == nil )
{
pCurTable->fTableData[ uiSlot ] = (sFWRefMapEntry *)::calloc( sizeof( sFWRefMapEntry ), sizeof( char ) );
if ( pCurTable->fTableData[ uiSlot ] == nil ) throw( (sInt32)eDSRefTableFWAllocError );
pCurTable->fTableData[ uiSlot ]->fRefNum = uiRefNum;
pCurTable->fTableData[ uiSlot ]->fType = inType;
pCurTable->fTableData[ uiSlot ]->fParentID = inParentID;
pCurTable->fTableData[ uiSlot ]->fPID = inPID;
pCurTable->fTableData[ uiSlot ]->fRemoteRefNum = serverRef;
pCurTable->fTableData[ uiSlot ]->fChildren = nil;
pCurTable->fTableData[ uiSlot ]->fChildPID = nil;
pCurTable->fTableData[ uiSlot ]->fMessageTableIndex = messageIndex;
uiTableNum = (uiTableNum << 24);
uiRefNum = uiRefNum | uiTableNum;
*outRef = uiRefNum;
pCurTable->fItemCnt++;
outResult = eDSNoErr;
done = true;
}
uiCntr++; }
}
}
if ( inParentID != 0 )
{
outResult = LinkToParent( *outRef, inType, inParentID, inPID );
}
}
catch( sInt32 err )
{
outResult = (tDirStatus)err;
}
gFWRefMapMutex->Signal();
return( outResult );
}
tDirStatus CDSRefMap::LinkToParent ( uInt32 inRefNum, uInt32 inType, uInt32 inParentID, sInt32 inPID )
{
tDirStatus dsResult = eDSNoErr;
sFWRefMapEntry *pCurrRef = nil;
sListFWInfo *pChildInfo = nil;
gFWRefMapMutex->Wait();
try
{
pCurrRef = GetTableRef( inParentID );
if ( pCurrRef == nil ) throw( (sInt32)eDSInvalidReference );
pChildInfo = (sListFWInfo *)::calloc( sizeof( sListFWInfo ), sizeof( char ) );
if ( pChildInfo == nil ) throw( (sInt32)eDSRefTableFWAllocError );
pChildInfo->fRefNum = inRefNum;
pChildInfo->fType = inType;
pChildInfo->fPID = inPID;
pChildInfo->fNext = pCurrRef->fChildren;
pCurrRef->fChildren = pChildInfo;
}
catch( sInt32 err )
{
dsResult = (tDirStatus)err;
}
gFWRefMapMutex->Signal();
return( dsResult );
}
tDirStatus CDSRefMap::UnlinkFromParent ( uInt32 inRefNum )
{
tDirStatus dsResult = eDSNoErr;
uInt32 i = 1;
uInt32 parentID = 0;
sFWRefMapEntry *pCurrRef = nil;
sFWRefMapEntry *pParentRef = nil;
sListFWInfo *pCurrChild = nil;
sListFWInfo *pPrevChild = nil;
gFWRefMapMutex->Wait();
try
{
pCurrRef = GetTableRef( inRefNum );
if ( pCurrRef == nil ) throw( (sInt32)eDSInvalidReference );
parentID = pCurrRef->fParentID;
if ( parentID != 0 )
{
pParentRef = GetTableRef( parentID );
if ( pParentRef == nil ) throw( (sInt32)eDSInvalidReference );
pCurrChild = pParentRef->fChildren;
pPrevChild = pParentRef->fChildren;
while ( pCurrChild != nil )
{
if ( pCurrChild->fRefNum == inRefNum )
{
if ( i == 1 )
{
pParentRef->fChildren = pCurrChild->fNext;
}
else
{
pPrevChild->fNext = pCurrChild->fNext;
}
free( pCurrChild );
pCurrChild = nil;
break;
}
pPrevChild = pCurrChild;
pCurrChild = pCurrChild->fNext;
i++;
}
}
}
catch( sInt32 err )
{
dsResult = (tDirStatus)err;
}
gFWRefMapMutex->Signal();
return( dsResult );
}
tDirStatus CDSRefMap::GetReference ( uInt32 inRefNum, sFWRefMapEntry **outRefData )
{
tDirStatus dsResult = eDSNoErr;
sFWRefMapEntry *pCurrRef = nil;
gFWRefMapMutex->Wait();
try
{
pCurrRef = GetTableRef( inRefNum );
if ( pCurrRef == nil ) throw( (sInt32)eDSInvalidReference );
*outRefData = pCurrRef;
}
catch( sInt32 err )
{
dsResult = (tDirStatus)err;
}
gFWRefMapMutex->Signal();
return( dsResult );
}
tDirStatus CDSRefMap::RemoveRef ( uInt32 inRefNum, uInt32 inType, sInt32 inPID )
{
tDirStatus dsResult = eDSNoErr;
sFWRefMapEntry *pCurrRef = nil;
sRefMapTable *pTable = nil;
uInt32 uiSlot = 0;
uInt32 uiTableNum = (inRefNum & 0xFF000000) >> 24;
uInt32 uiRefNum = (inRefNum & 0x00FFFFFF);
bool doFree = false;
sPIDFWInfo *pPIDInfo = nil;
sPIDFWInfo *pPrevPIDInfo = nil;
gFWRefMapMutex->Wait();
try
{
dsResult = VerifyReference( inRefNum, inType, inPID );
if ( dsResult == eDSNoErr )
{
pTable = GetThisTable( uiTableNum );
if ( pTable == nil ) throw( (sInt32)eDSInvalidReference );
uiSlot = uiRefNum % kMaxFWTableItems;
if ( inType != eDirectoryRefType ) {
dsResult = UnlinkFromParent( inRefNum );
if ( dsResult != eDSNoErr ) throw( (sInt32)dsResult );
}
pCurrRef = GetTableRef( inRefNum ); if ( pCurrRef == nil ) throw( (sInt32)eDSInvalidReference );
if (inType != pCurrRef->fType) throw( (sInt32)eDSInvalidReference );
if ( pCurrRef->fChildren != nil )
{
gFWRefMapMutex->Signal();
RemoveChildren( pCurrRef->fChildren, inPID );
gFWRefMapMutex->Wait();
}
if (pCurrRef->fPID == inPID)
{
pCurrRef->fPID = -1;
if (pCurrRef->fChildPID == nil)
{
doFree = true;
}
}
else
{
pPIDInfo = pCurrRef->fChildPID;
pPrevPIDInfo = pCurrRef->fChildPID;
while (pPIDInfo != nil)
{
if (pPIDInfo->fPID == inPID)
{
if (pPIDInfo == pCurrRef->fChildPID)
{
pCurrRef->fChildPID = pCurrRef->fChildPID->fNext;
free(pPIDInfo);
pPIDInfo = pCurrRef->fChildPID;
pPrevPIDInfo = pCurrRef->fChildPID;
}
else
{
pPrevPIDInfo->fNext = pPIDInfo->fNext;
free(pPIDInfo);
pPIDInfo = pPrevPIDInfo->fNext;
}
}
else
{
pPrevPIDInfo = pPIDInfo;
pPIDInfo = pPIDInfo->fNext;
}
}
if ( (pCurrRef->fPID == -1) && (pCurrRef->fChildPID == nil) )
{
doFree = true;
}
}
if (doFree)
{
if ( pTable->fTableData[ uiSlot ] != nil )
{
if ( uiRefNum == pTable->fTableData[ uiSlot ]->fRefNum )
{
pCurrRef = pTable->fTableData[ uiSlot ];
pTable->fTableData[ uiSlot ] = nil;
pTable->fItemCnt--;
if (fDeallocProc != nil)
{
gFWRefMapMutex->Signal();
dsResult = (tDirStatus)(*fDeallocProc)(inRefNum, pCurrRef);
gFWRefMapMutex->Wait();
}
#ifdef __LITTLE_ENDIAN__
RemoveServerToLocalRefMap(pCurrRef->fRemoteRefNum);
#endif
free(pCurrRef);
pCurrRef = nil;
}
}
}
}
}
catch( sInt32 err )
{
dsResult = (tDirStatus)err;
}
gFWRefMapMutex->Signal();
return( dsResult );
}
void CDSRefMap::RemoveChildren ( sListFWInfo *inChildList, sInt32 inPID )
{
sListFWInfo *pCurrChild = nil;
sListFWInfo *pNextChild = nil;
gFWRefMapMutex->Wait();
try
{
pCurrChild = inChildList;
while ( pCurrChild != nil )
{
pNextChild = pCurrChild->fNext;
if ( pCurrChild->fPID == inPID )
{
gFWRefMapMutex->Signal();
RemoveRef( pCurrChild->fRefNum, pCurrChild->fType, inPID );
gFWRefMapMutex->Wait();
}
pCurrChild = pNextChild;
}
}
catch( sInt32 err )
{
}
gFWRefMapMutex->Signal();
}
tDirStatus CDSRefMap:: AddChildPIDToRef ( uInt32 inRefNum, uInt32 inParentPID, sInt32 inChildPID )
{
tDirStatus dsResult = eDSNoErr;
sFWRefMapEntry *pCurrRef = nil;
sPIDFWInfo *pChildPIDInfo = nil;
gFWRefMapMutex->Wait();
try
{
dsResult = gFWRefMap->VerifyReference( inRefNum, eNodeRefType, inParentPID );
if ( dsResult != eDSNoErr ) throw( (sInt32)dsResult );
pCurrRef = gFWRefMap->GetTableRef( inRefNum );
if ( pCurrRef == nil ) throw( (sInt32)eDSInvalidReference );
pChildPIDInfo = (sPIDFWInfo *)::calloc( 1, sizeof( sPIDFWInfo ) );
if ( pChildPIDInfo == nil ) throw( (sInt32)eDSRefTableFWAllocError );
pChildPIDInfo->fPID = inChildPID;
pChildPIDInfo->fNext = pCurrRef->fChildPID;
pCurrRef->fChildPID = pChildPIDInfo;
}
catch( sInt32 err )
{
dsResult = (tDirStatus)err;
}
gFWRefMapMutex->Signal();
return( dsResult );
}
tDirStatus CDSRefMap::SetRemoteRefNum ( uInt32 inRefNum, uInt32 inType, uInt32 inRemoteRefNum, sInt32 inPID )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
sFWRefMapEntry *pCurrRef = nil;
if (gFWRefMap != nil)
{
siResult = gFWRefMap->VerifyReference( inRefNum, inType, inPID );
if (siResult == eDSNoErr)
{
pCurrRef = gFWRefMap->GetTableRef( inRefNum );
siResult = eDSInvalidReference;
if ( pCurrRef != nil )
{
pCurrRef->fRemoteRefNum = inRemoteRefNum;
siResult = eDSNoErr;
}
}
}
return( siResult );
}
tDirStatus CDSRefMap::SetMessageTableIndex ( uInt32 inRefNum, uInt32 inType, uInt32 inMsgTableIndex, sInt32 inPID )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
sFWRefMapEntry *pCurrRef = nil;
if (gFWRefMap != nil)
{
siResult = gFWRefMap->VerifyReference( inRefNum, inType, inPID );
if (siResult == eDSNoErr)
{
pCurrRef = gFWRefMap->GetTableRef( inRefNum );
siResult = eDSInvalidReference;
if ( pCurrRef != nil )
{
pCurrRef->fMessageTableIndex = inMsgTableIndex;
siResult = eDSNoErr;
}
}
}
return( siResult );
}
tDirStatus CDSRefMap::SetPluginName ( uInt32 inRefNum, uInt32 inType, char* inPluginName, sInt32 inPID )
{
tDirStatus siResult = eDSDirSrvcNotOpened;
sFWRefMapEntry *pCurrRef = nil;
if (gFWRefMap != nil)
{
siResult = gFWRefMap->VerifyReference( inRefNum, inType, inPID );
if (siResult == eDSNoErr)
{
pCurrRef = gFWRefMap->GetTableRef( inRefNum );
siResult = eDSInvalidReference;
if ( pCurrRef != nil )
{
pCurrRef->fPluginName = inPluginName;
siResult = eDSNoErr;
}
}
}
return( siResult );
}
uInt32 CDSRefMap::GetRefNum ( uInt32 inRefNum, uInt32 inType, sInt32 inPID )
{
sInt32 siResult = eDSNoErr;
uInt32 theRefNum = inRefNum; sFWRefMapEntry *pCurrRef = nil;
if ((inRefNum & 0x00C00000) != 0)
{
if (gFWRefMap != nil)
{
siResult = gFWRefMap->VerifyReference( inRefNum, inType, inPID );
if (siResult == eDSNoErr)
{
pCurrRef = gFWRefMap->GetTableRef( inRefNum );
if ( pCurrRef != nil )
{
theRefNum = pCurrRef->fRemoteRefNum;
}
}
}
}
return( theRefNum );
}
uInt32 CDSRefMap::GetMessageTableIndex ( uInt32 inRefNum, uInt32 inType, sInt32 inPID )
{
sInt32 siResult = eDSNoErr;
uInt32 theMsgTableIndex = 0; sFWRefMapEntry *pCurrRef = nil;
if ((inRefNum & 0x00C00000) != 0)
{
if (gFWRefMap != nil)
{
siResult = gFWRefMap->VerifyReference( inRefNum, inType, inPID );
if (siResult == eDSNoErr)
{
pCurrRef = gFWRefMap->GetTableRef( inRefNum );
if ( pCurrRef != nil )
{
theMsgTableIndex = pCurrRef->fMessageTableIndex;
}
}
}
}
return( theMsgTableIndex );
}
char* CDSRefMap::GetPluginName( uInt32 inRefNum, sInt32 inPID )
{
sInt32 siResult = eDSNoErr;
sFWRefMapEntry *pCurrRef = nil;
char *outPluginName = nil;
if ((inRefNum & 0x00C00000) != 0)
{
if (gFWRefMap != nil)
{
siResult = gFWRefMap->VerifyReference( inRefNum, eNodeRefType, inPID );
if (siResult == eDSNoErr)
{
pCurrRef = gFWRefMap->GetTableRef( inRefNum );
if ( pCurrRef != nil )
{
outPluginName = pCurrRef->fPluginName;
}
}
}
}
return( outPluginName );
}
uInt32 CDSRefMap::GetRefNumMap ( uInt32 inRefNum, uInt32 inType, sInt32 inPID )
{
sInt32 siResult = eDSNoErr;
uInt32 theRefNum = inRefNum; sFWRefMapEntry *pCurrRef = nil;
if ((inRefNum & 0x00C00000) != 0)
{
if (gFWRefMap != nil)
{
siResult = gFWRefMap->VerifyReference( inRefNum, inType, inPID );
if (siResult == eDSNoErr)
{
pCurrRef = gFWRefMap->GetTableRef( inRefNum );
if ( pCurrRef != nil )
{
theRefNum = pCurrRef->fRemoteRefNum;
}
}
}
}
return( theRefNum );
}
#ifdef __LITTLE_ENDIAN__
void CDSRefMap::MapServerRefToLocalRef( uInt32 inServerRef, uInt32 inLocalRef )
{
if (inServerRef != 0 && inLocalRef != 0)
{
fServerToLocalRefMap[inServerRef] = inLocalRef;
}
return;
}
void CDSRefMap::RemoveServerToLocalRefMap( uInt32 inServerRef )
{
if (inServerRef != 0)
{
tRefMapI aRefMapI;
aRefMapI = fServerToLocalRefMap.find(inServerRef);
if (aRefMapI != fServerToLocalRefMap.end())
{
fServerToLocalRefMap.erase(aRefMapI);
}
}
return;
}
uInt32 CDSRefMap::GetLocalRefFromServerMap( uInt32 inServerRef )
{
uInt32 retVal = 0;
if (inServerRef != 0)
{
tRefMapI aRefMapI;
aRefMapI = fServerToLocalRefMap.find(inServerRef);
if (aRefMapI != fServerToLocalRefMap.end())
{
retVal = aRefMapI->second;
}
}
return(retVal);
}
void CDSRefMap::MapMsgIDToServerRef( uInt32 inMsgID, uInt32 inServerRef )
{
if (inMsgID != 0 && inServerRef != 0)
{
fMsgIDToServerRefMap[inMsgID] = inServerRef;
}
return;
}
void CDSRefMap::RemoveMsgIDToServerRefMap( uInt32 inMsgID )
{
if (inMsgID != 0)
{
tRefMapI aRefMapI;
aRefMapI = fMsgIDToServerRefMap.find(inMsgID);
if (aRefMapI != fMsgIDToServerRefMap.end())
{
fMsgIDToServerRefMap.erase(aRefMapI);
}
}
return;
}
uInt32 CDSRefMap::GetServerRefFromMsgIDMap( uInt32 inMsgID )
{
uInt32 retVal = 0;
if (inMsgID != 0)
{
tRefMapI aRefMapI;
aRefMapI = fMsgIDToServerRefMap.find(inMsgID);
if (aRefMapI != fMsgIDToServerRefMap.end())
{
retVal = aRefMapI->second;
}
}
return(retVal);
}
void CDSRefMap::MapMsgIDToCustomCode( uInt32 inMsgID, uInt32 inCustomCode )
{
if (inMsgID != 0 && inCustomCode != 0)
{
fMsgIDToCustomCodeMap[inMsgID] = inCustomCode;
}
return;
}
void CDSRefMap::RemoveMsgIDToCustomCodeMap( uInt32 inMsgID )
{
if (inMsgID != 0)
{
tRefMapI aRefMapI;
aRefMapI = fMsgIDToCustomCodeMap.find(inMsgID);
if (aRefMapI != fMsgIDToCustomCodeMap.end())
{
fMsgIDToCustomCodeMap.erase(aRefMapI);
}
}
return;
}
uInt32 CDSRefMap::GetCustomCodeFromMsgIDMap( uInt32 inMsgID )
{
uInt32 retVal = 0;
if (inMsgID != 0)
{
tRefMapI aRefMapI;
aRefMapI = fMsgIDToCustomCodeMap.find(inMsgID);
if (aRefMapI != fMsgIDToCustomCodeMap.end())
{
retVal = aRefMapI->second;
}
}
return(retVal);
}
#endif