#ifndef __CDSRefTable_h__
#define __CDSRefTable_h__ 1
#include "DirServicesTypes.h"
#include "PrivateTypes.h"
#include "DSMutexSemaphore.h"
class CDSRefTable;
extern DSMutexSemaphore *gFWTableMutex;
extern CDSRefTable *gFWRefTable;
#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 sInt32 RefFWDeallocateProc ( uInt32 inRefNum, sFWRefEntry *entry );
typedef struct sRefFWTable *sRefFWTablePtr;
typedef struct sRefFWTable {
uInt32 fTableNum;
uInt32 fCurRefNum;
uInt32 fItemCnt;
sFWRefEntry *fTableData[ kMaxFWTableItems ];
} sRefFWTable;
class CDSRefTable {
public:
CDSRefTable ( RefFWDeallocateProc *deallocProc );
virtual ~CDSRefTable ( 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 NewDirRef ( uInt32 *outNewRef, sInt32 inPID );
static tDirStatus NewNodeRef ( uInt32 *outNewRef, uInt32 inParentID, sInt32 inPID );
static tDirStatus NewRecordRef ( uInt32 *outNewRef, uInt32 inParentID, sInt32 inPID );
static tDirStatus NewAttrListRef ( uInt32 *outNewRef, uInt32 inParentID, sInt32 inPID );
static tDirStatus NewAttrValueRef ( uInt32 *outNewRef, uInt32 inParentID, sInt32 inPID );
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 tDirStatus GetOffset ( uInt32 inRefNum, uInt32 inType, uInt32* outOffset, sInt32 inPID );
static tDirStatus SetOffset ( uInt32 inRefNum, uInt32 inType, uInt32 inOffset, sInt32 inPID );
static tDirStatus GetBufTag ( uInt32 inRefNum, uInt32 inType, uInt32* outBufTag, sInt32 inPID );
static tDirStatus SetBufTag ( uInt32 inRefNum, uInt32 inType, uInt32 inBufTag, sInt32 inPID );
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 );
uInt32 fTableCount;
sRefFWTable *fRefTables[ kMaxFWTables + 1 ]; RefFWDeallocateProc *fDeallocProc;
time_t fSunsetTime;
uInt32 fRefCount;
};
#endif