#ifndef __CATALOGPRIVATE__
#define __CATALOGPRIVATE__
#include <sys/appleapiopts.h>
#ifdef KERNEL
#ifdef __APPLE_API_PRIVATE
#include "../../hfs_format.h"
#include "FileMgrInternal.h"
#include "BTreesInternal.h"
#include <sys/lock.h>
enum {
kCatalogIteratorCount = 16 };
enum {
kShortPascalName,
kShortUnicodeName,
kLongUnicodeName };
struct UniStr63 {
UInt16 length;
UniChar unicode[63];
};
typedef struct UniStr63 UniStr63;
struct CatalogIterator
{
struct CatalogIterator *nextMRU; struct CatalogIterator *nextLRU;
ExtendedVCB *volume;
SInt16 currentIndex;
SInt16 reserved;
UInt32 currentOffset;
UInt32 nextOffset;
HFSCatalogNodeID folderID;
UInt32 btreeNodeHint; UInt16 btreeIndexHint; UInt16 nameType; HFSCatalogNodeID parentID; union
{
Str31 pascalName;
UniStr63 unicodeName;
HFSUniStr255 * longNamePtr;
} folderName;
struct lock__bsd__ iterator_lock;
};
typedef struct CatalogIterator CatalogIterator;
struct CatalogCacheGlobals {
UInt32 iteratorCount; CatalogIterator * mru;
CatalogIterator * lru;
UInt32 reserved;
HFSUniStr255 longName;
simple_lock_data_t simplelock;
};
typedef struct CatalogCacheGlobals CatalogCacheGlobals;
extern OSErr LocateCatalogNode( const ExtendedVCB *volume, HFSCatalogNodeID folderID, const CatalogName *name,
UInt32 hint, CatalogKey *key, CatalogRecord *data, UInt32 *newHint);
extern OSErr LocateCatalogNodeByKey ( const ExtendedVCB *volume, UInt32 hint, CatalogKey *keyPtr,
CatalogRecord *dataPtr, UInt32 *newHint );
extern OSErr LocateCatalogRecord( const ExtendedVCB *volume, HFSCatalogNodeID folderID, const CatalogName *name,
UInt32 hint, CatalogKey *keyPtr, CatalogRecord *dataPtr, UInt32 *newHint);
extern OSErr LocateCatalogNodeWithRetry ( const ExtendedVCB *volume, HFSCatalogNodeID folderID, ConstStr31Param pascalName,
CatalogName *unicodeName, UInt32 hint, CatalogKey *keyPtr, CatalogRecord *dataPtr,
UInt32 *newHint );
extern OSErr FlushCatalog( ExtendedVCB *volume);
extern void ConvertInputNameToUnicode(ConstStr31Param name, TextEncoding encodingHint,
TextEncoding *actualEncoding, CatalogName *catalogName);
extern void BuildCatalogKey( HFSCatalogNodeID parentID, const CatalogName *name, Boolean isHFSPlus,
CatalogKey *key);
extern OSErr BuildCatalogKeyUTF8(ExtendedVCB *volume, HFSCatalogNodeID parentID, const char *name,
UInt32 length, CatalogKey *key, UInt32 *textEncoding);
extern void CopyCatalogName( const CatalogName *srcName, CatalogName *dstName, Boolean isHFSPLus);
extern OSErr ResolveFileID( ExtendedVCB *vcb, HFSCatalogNodeID fileID, HFSCatalogNodeID *parentID, Str31 name );
#if 0
extern OSErr CreateFileThreadID( FIDParam *filePB, WDCBRecPtr *wdcbPtr );
extern OSErr ExchangeFiles( FIDParam *filePB, WDCBRecPtr *wdcbPtr );
#endif
extern CatalogIterator* GetCatalogIterator(ExtendedVCB *volume, HFSCatalogNodeID folderID, UInt32 offset);
extern OSErr ReleaseCatalogIterator( CatalogIterator *catalogIterator );
extern void TrashCatalogIterator( const ExtendedVCB *volume, HFSCatalogNodeID folderID );
void AgeCatalogIterator( CatalogIterator *catalogIterator );
extern void UpdateBtreeIterator( const CatalogIterator *catalogIterator, BTreeIterator *btreeIterator );
extern void UpdateCatalogIterator( const BTreeIterator *btreeIterator, CatalogIterator *catalogIterator );
#endif
#endif
#endif //__CATALOGPRIVATE__