#ifndef __CDSRefMap_h__
#define __CDSRefMap_h__ 1
#include "DirServicesTypes.h"
#include "DSMutexSemaphore.h"
#include "PrivateTypes.h"
#include "CDSRefTable.h"
typedef struct sFWRefMapEntry {
UInt32 fRefNum;
UInt32 fType;
UInt32 fRemoteRefNum;
UInt32 fParentID;
SInt32 fPID;
sListFWInfo *fChildren;
sPIDFWInfo *fChildPID;
UInt32 fMessageTableIndex;
char *fPluginName;
bool fBigEndian;
} sFWRefMapEntry;
typedef struct sRefMapTable *sRefMapTablePtr;
typedef struct sRefMapTable {
UInt32 fTableNum;
UInt32 fCurRefNum;
UInt32 fItemCnt;
sFWRefMapEntry *fTableData[ kMaxFWTableItems ];
} sRefMapTable;
class CDSRefMap
{
public:
CDSRefMap ( void );
~CDSRefMap ( void );
void ClearAllMaps ( void );
tDirStatus VerifyDirRef ( tDirReference inDirRef, SInt32 inPID );
tDirStatus VerifyNodeRef ( tDirNodeReference inDirNodeRef, SInt32 inPID );
tDirStatus VerifyRecordRef ( tRecordReference inRecordRef, SInt32 inPID );
tDirStatus VerifyAttrListRef ( tAttributeListRef inAttributeListRef, SInt32 inPID );
tDirStatus VerifyAttrValueRef ( tAttributeValueListRef inAttributeValueListRef, SInt32 inPID );
tDirStatus NewDirRefMap ( UInt32 *outNewRef, SInt32 inPID, UInt32 serverRef, UInt32 messageIndex );
tDirStatus NewNodeRefMap ( UInt32 *outNewRef, UInt32 inParentID, SInt32 inPID, UInt32 serverRef, UInt32 messageIndex, char* inPluginName );
tDirStatus NewRecordRefMap ( UInt32 *outNewRef, UInt32 inParentID, SInt32 inPID, UInt32 serverRef, UInt32 messageIndex );
tDirStatus NewAttrListRefMap ( UInt32 *outNewRef, UInt32 inParentID, SInt32 inPID, UInt32 serverRef, UInt32 messageIndex );
tDirStatus NewAttrValueRefMap ( UInt32 *outNewRef, UInt32 inParentID, SInt32 inPID, UInt32 serverRef, UInt32 messageIndex );
tDirStatus RemoveDirRef ( UInt32 inDirRef, SInt32 inPID );
tDirStatus RemoveNodeRef ( UInt32 inNodeRef, SInt32 inPID );
tDirStatus RemoveRecordRef ( UInt32 inRecRef, SInt32 inPID );
tDirStatus RemoveAttrListRef ( UInt32 inAttrListRef, SInt32 inPID );
tDirStatus RemoveAttrValueRef ( UInt32 InAttrValueRef, SInt32 inPID );
UInt32 GetMessageTableIndex( UInt32 inRefNum, UInt32 inType, SInt32 inPID );
tDirStatus SetMessageTableIndex( UInt32 inRefNum, UInt32 inType, UInt32 inMsgTableIndex, SInt32 inPID );
char* GetPluginName ( UInt32 inRefNum, SInt32 inPID );
UInt32 GetRefNum ( UInt32 inRefNum, UInt32 inType, SInt32 inPID );
private:
DSMutexSemaphore fMapMutex;
UInt32 fTableCount;
sRefMapTable *fRefMapTables[ kMaxFWTables + 1 ]; 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 );
};
#endif