/* * Copyright (c) 2002 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * The contents of this file constitute Original Code as defined in and * are subject to the Apple Public Source License Version 1.1 (the * "License"). You may not use this file except in compliance with the * License. Please obtain a copy of the License at * http://www.apple.com/publicsource and read it before using this file. * * This Original Code and all software distributed under the License are * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the * License for the specific language governing rights and limitations * under the License. * * @APPLE_LICENSE_HEADER_END@ */ /*! * @header CDSRefTable * DirectoryService Framework reference table for all * "client side buffer parsing" operations on plugin data * returned in standard buffer format. * References here always use 0x00300000 bits */ #ifndef __CDSRefTable_h__ #define __CDSRefTable_h__ 1 // App #include "DirServicesTypes.h" // Misc #include "PrivateTypes.h" #include "DSMutexSemaphore.h" //RCF#include class CDSRefTable; extern DSMutexSemaphore *gFWTableMutex; extern CDSRefTable *gFWRefTable; #define kMaxTableItems 512 #define kMaxTables 0x0F typedef struct sListInfo *sListInfoPtr; //note fPID defined everywhere as sInt32 to remove warnings of comparing -1 to uInt32 since failed PID is -1 //struct to contain reference to the actual ref entry of the child ref typedef struct sListInfo { uInt32 fRefNum; uInt32 fType; sInt32 fPID; sListInfoPtr fNext; } sListInfo; //struct to contain PID of the child client process granted access to a ref from the parent client process typedef struct sPIDInfo { sInt32 fPID; sPIDInfo *fNext; } sPIDInfo; //struct of the main ref entry typedef struct sFWRefEntry { uInt32 fRefNum; uInt32 fType; uInt32 fOffset; uInt32 fBufTag; uInt32 fParentID; sInt32 fPID; sListInfo *fChildren; sPIDInfo *fChildPID; } sFWRefEntry; typedef sInt32 RefDeallocateProc ( uInt32 inRefNum, sFWRefEntry *entry ); // ------------------------------------------- typedef struct sRefTable *sRefTablePtr; typedef struct sRefTable { uInt32 fTableNum; uInt32 fCurRefNum; uInt32 fItemCnt; sFWRefEntry *fTableData[ kMaxTableItems ]; } sRefTable; typedef enum { eDirectoryRefType = 'Dire', eNodeRefType = 'Node', eRecordRefType = 'Reco', eAttrListRefType = 'AtLi', eAttrValueListRefType = 'AtVa' } eRefTypes; //------------------------------------------------------------------------------------ // * CDSRefTable //------------------------------------------------------------------------------------ class CDSRefTable { public: CDSRefTable ( RefDeallocateProc *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 void CheckClientPIDs ( bool inUseTimeOuts ); 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 ( sListInfo *inChildList, sInt32 inPID ); sRefTable* GetNextTable ( sRefTable *inCurTable ); sRefTable* GetThisTable ( uInt32 inTableNum ); sFWRefEntry* GetTableRef ( uInt32 inRefNum ); uInt32 UpdateClientPIDRefCount ( sInt32 inClientPID, bool inUpRefCount, uInt32 inDirRef=0 ); void DoCheckClientPIDs ( bool inUseTimeOuts ); uInt32 fTableCount; sRefTable *fRefTables[ kMaxTables + 1 ]; //added 1 since table is 1-based and code depends upon having that last //index in as kMaxTables ie. note array is 0-based RefDeallocateProc *fDeallocProc; //RCF CFMutableDictionaryRef fClientPIDList; //RCF DSMutexSemaphore *fClientPIDListLock; //mutex on the client PID list tracking references per PID time_t fSunsetTime; }; #endif