#ifndef __CDSRefTable_h__
#define __CDSRefTable_h__ 1
#include "DirServicesTypes.h"
#include "PrivateTypes.h"
#include "DSMutexSemaphore.h"
#define kMaxFWTableItems 512
#define kMaxFWTables 0x0F
typedef struct sListFWInfo *sListFWInfoPtr;
typedef struct sListFWInfo {
UInt32 fRefNum;
UInt32 fType;
SInt32 fPID;
sListFWInfoPtr fNext;
} sListFWInfo;
typedef struct sPIDFWInfo {
SInt32 fPID;
sPIDFWInfo *fNext;
} sPIDFWInfo;
typedef struct sFWRefEntry {
UInt32 fRefNum;
UInt32 fType;
UInt32 fOffset;
UInt32 fBufTag;
UInt32 fParentID;
SInt32 fPID;
sListFWInfo *fChildren;
sPIDFWInfo *fChildPID;
} sFWRefEntry;
typedef struct sRefFWTable *sRefFWTablePtr;
typedef struct sRefFWTable {
UInt32 fTableNum;
UInt32 fCurRefNum;
UInt32 fItemCnt;
sFWRefEntry *fTableData[ kMaxFWTableItems ];
} sRefFWTable;
class CDSRefTable
{
public:
CDSRefTable ( void );
~CDSRefTable ( void );
void ClearAllTables ( 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 NewDirRef ( UInt32 *outNewRef, SInt32 inPID );
tDirStatus NewNodeRef ( UInt32 *outNewRef, UInt32 inParentID, SInt32 inPID );
tDirStatus NewRecordRef ( UInt32 *outNewRef, UInt32 inParentID, SInt32 inPID );
tDirStatus NewAttrListRef ( UInt32 *outNewRef, UInt32 inParentID, SInt32 inPID );
tDirStatus NewAttrValueRef ( UInt32 *outNewRef, UInt32 inParentID, SInt32 inPID );
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 );
tDirStatus GetOffset ( UInt32 inRefNum, UInt32 inType, UInt32* outOffset, SInt32 inPID );
tDirStatus SetOffset ( UInt32 inRefNum, UInt32 inType, UInt32 inOffset, SInt32 inPID );
tDirStatus GetBufTag ( UInt32 inRefNum, UInt32 inType, UInt32* outBufTag, SInt32 inPID );
tDirStatus SetBufTag ( UInt32 inRefNum, UInt32 inType, UInt32 inBufTag, SInt32 inPID );
private:
DSMutexSemaphore fTableMutex;
UInt32 fTableCount;
sRefFWTable *fRefTables[ kMaxFWTables + 1 ]; UInt32 fRefCount;
private:
tDirStatus VerifyReference ( tDirReference inDirRef, UInt32 inType, SInt32 inPID );
tDirStatus GetNewRef ( UInt32 *outRef, UInt32 inParentID, eRefTypes inType, SInt32 inPID );
tDirStatus RemoveRef ( UInt32 inRefNum, UInt32 inType, SInt32 inPID );
tDirStatus GetReference ( UInt32 inRefNum, sFWRefEntry **outRefData );
tDirStatus LinkToParent ( UInt32 inRefNum, UInt32 inType, UInt32 inParentID, SInt32 inPID );
tDirStatus UnlinkFromParent ( UInt32 inRefNum );
void RemoveChildren ( sListFWInfo *inChildList, SInt32 inPID );
sRefFWTable* GetNextTable ( sRefFWTable *inCurTable );
sRefFWTable* GetThisTable ( UInt32 inTableNum );
sFWRefEntry* GetTableRef ( UInt32 inRefNum );
UInt32 GetRefCount ( void );
};
#endif