#ifndef __CDSRefMap_h__
#define __CDSRefMap_h__ 1
#include "DirServicesTypes.h"
#include "PrivateTypes.h"
#include "DSMutexSemaphore.h"
#include "CDSRefTable.h"
class CDSRefMap;
extern DSMutexSemaphore *gFWRefMapMutex;
extern CDSRefMap *gFWRefMap;
typedef struct sFWRefMapEntry {
uInt32 fRefNum;
uInt32 fType;
uInt32 fRemoteRefNum;
uInt32 fParentID;
sInt32 fPID;
sListFWInfo *fChildren;
sPIDFWInfo *fChildPID;
uInt32 fMessageTableIndex;
} sFWRefMapEntry;
typedef sInt32 RefMapDeallocateProc ( uInt32 inRefNum, sFWRefMapEntry *entry );
typedef struct sRefMapTable *sRefMapTablePtr;
typedef struct sRefMapTable {
uInt32 fTableNum;
uInt32 fCurRefNum;
uInt32 fItemCnt;
sFWRefMapEntry *fTableData[ kMaxFWTableItems ];
} sRefMapTable;
class CDSRefMap {
public:
CDSRefMap ( RefMapDeallocateProc *deallocProc );
virtual ~CDSRefMap ( void );
static tDirStatus VerifyDirRef ( tDirReference inDirRef, sInt32 inPID );
static tDirStatus VerifyNodeRef ( tDirNodeReference inDirNodeRef, sInt32 inPID );
static tDirStatus VerifyRecordRef ( tRecordReference inRecordRef, sInt32 inPID );
static tDirStatus VerifyAttrListRef ( tAttributeListRef inAttributeListRef, sInt32 inPID );
static tDirStatus VerifyAttrValueRef ( tAttributeValueListRef inAttributeValueListRef, sInt32 inPID );
static tDirStatus NewDirRefMap ( uInt32 *outNewRef, sInt32 inPID, uInt32 serverRef, uInt32 messageIndex );
static tDirStatus NewNodeRefMap ( uInt32 *outNewRef, uInt32 inParentID, sInt32 inPID, uInt32 serverRef, uInt32 messageIndex );
static tDirStatus NewRecordRefMap ( uInt32 *outNewRef, uInt32 inParentID, sInt32 inPID, uInt32 serverRef, uInt32 messageIndex );
static tDirStatus NewAttrListRefMap ( uInt32 *outNewRef, uInt32 inParentID, sInt32 inPID, uInt32 serverRef, uInt32 messageIndex );
static tDirStatus NewAttrValueRefMap ( uInt32 *outNewRef, uInt32 inParentID, sInt32 inPID, uInt32 serverRef, uInt32 messageIndex );
static tDirStatus RemoveDirRef ( uInt32 inDirRef, sInt32 inPID );
static tDirStatus RemoveNodeRef ( uInt32 inNodeRef, sInt32 inPID );
static tDirStatus RemoveRecordRef ( uInt32 inRecRef, sInt32 inPID );
static tDirStatus RemoveAttrListRef ( uInt32 inAttrListRef, sInt32 inPID );
static tDirStatus RemoveAttrValueRef ( uInt32 InAttrValueRef, sInt32 inPID );
static tDirStatus AddChildPIDToRef ( uInt32 inRefNum, uInt32 inParentPID, sInt32 inChildPID );
static void CheckClientPIDs ( bool inUseTimeOuts );
static tDirStatus SetRemoteRefNum ( uInt32 inRefNum, uInt32 inType, uInt32 inRemoteRefNum, sInt32 inPID );
static uInt32 GetMessageTableIndex( uInt32 inRefNum, uInt32 inType, sInt32 inPID );
static tDirStatus SetMessageTableIndex( uInt32 inRefNum, uInt32 inType, uInt32 inMsgTableIndex, sInt32 inPID );
static uInt32 GetRefNum ( uInt32 inRefNum, uInt32 inType, sInt32 inPID );
private:
tDirStatus VerifyReference ( tDirReference inDirRef, uInt32 inType, sInt32 inPID );
tDirStatus GetNewRef ( uInt32 *outRef, uInt32 inParentID, eRefTypes inType, sInt32 inPID, uInt32 serverRef, uInt32 messageIndex );
tDirStatus RemoveRef ( uInt32 inRefNum, uInt32 inType, sInt32 inPID );
tDirStatus GetReference ( uInt32 inRefNum, sFWRefMapEntry **outRefData );
tDirStatus LinkToParent ( uInt32 inRefNum, uInt32 inType, uInt32 inParentID, sInt32 inPID );
tDirStatus UnlinkFromParent ( uInt32 inRefNum );
void RemoveChildren ( sListFWInfo *inChildList, sInt32 inPID );
sRefMapTable* GetNextTable ( sRefMapTable *inCurTable );
sRefMapTable* GetThisTable ( uInt32 inTableNum );
sFWRefMapEntry* GetTableRef ( uInt32 inRefNum );
uInt32 UpdateClientPIDRefCount
( sInt32 inClientPID, bool inUpRefCount, uInt32 inDirRef=0 );
void DoCheckClientPIDs ( bool inUseTimeOuts );
uInt32 fTableCount;
sRefMapTable *fRefMapTables[ kMaxFWTables + 1 ]; RefMapDeallocateProc *fDeallocProc;
time_t fSunsetTime;
};
#endif