|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: File: CatalogPrivate.h
24:
25: Contains: Private Catalog Manager interfaces.
26:
27: Version: HFS Plus 1.0
28:
29: Copyright: � 1997-1998 by Apple Computer, Inc., all rights reserved.
30:
31: File Ownership:
32:
33: DRI: Don Brady
34:
35: Other Contact: xxx put other contact here xxx
36:
37: Technology: xxx put technology here xxx
38:
39: Writers:
40:
41: (JL) Jim Luther
42: (msd) Mark Day
43: (DSH) Deric Horn
44: (djb) Don Brady
45:
46: Change History (most recent first):
47: <MacOSX> 11/10/98 djb Remove obsolete PrepareInputName prototype;
48: <MacOSX> 4/6/98 djb Added lock data stuctures and ReleaseCatalogIterator prototype;
49: <MacOSX> 4/6/98 djb Removed CatalogDataCache since its no longer used.
50: <MacOSX> 4/2/98 djb InvalidateCatalogNodeCache does nothing under MacOS X.
51: <MacOSX> 3/31/98 djb Sync up with final HFSVolumes.h header file.
52:
53: <CS10> 11/20/97 djb Radar #2002357. Fixing retry mechanism.
54: <CS9> 11/17/97 djb PrepareInputName routine now returns an error.
55: <CS8> 11/13/97 djb Radar #1683572. Move CatalogIterator to this file from
56: FileMgrInternal.i. Double size of short unicode name.
57: <CS7> 10/31/97 JL #2000184 - Changed prototypes for CreateFileThreadID and
58: ExchangeFiles.
59: <CS6> 10/17/97 msd In CatalogCacheGlobals, add room for a single UniStr255 so
60: catalog iterators can step over long Unicode names.
61: <CS5> 10/17/97 djb Add ConvertInputNameToUnicode for Catalog Create/Rename.
62: <CS4> 10/1/97 djb Change catalog iterator implementation.
63: <CS3> 7/16/97 DSH FilesInternal.i renamed FileMgrInternal.i to avoid name
64: collision
65: <CS2> 6/24/97 djb Add LocateCatalogNodeByMangledName routine.
66: <CS1> 6/24/97 djb first checked in
67: */
68:
69: #ifndef __CATALOGPRIVATE__
70: #define __CATALOGPRIVATE__
71:
72: #include "../../hfs_format.h"
73:
74: #include "FileMgrInternal.h"
75: #include "BTreesInternal.h"
76:
77: #include <sys/lock.h>
78:
79: // private catalog data cache
80:
81:
82:
83: enum {
84: kCatalogIteratorCount = 16 // total number of Catalog iterators (shared by all HFS/HFS Plus volumes)
85: };
86:
87:
88: // Catalog Iterator Name Types
89: enum {
90: kShortPascalName,
91: kShortUnicodeName,
92: kLongUnicodeName // non-local name
93: };
94:
95:
96: // short unicode name (used by CatalogIterator)
97: struct UniStr63 {
98: UInt16 length; /* number of unicode characters */
99: UniChar unicode[63]; /* unicode characters */
100: };
101: typedef struct UniStr63 UniStr63;
102:
103:
104: struct CatalogIterator
105: {
106: struct CatalogIterator *nextMRU; // next iterator in MRU order
107: struct CatalogIterator *nextLRU; // next iterator in LRU order
108:
109: ExtendedVCB *volume;
110: SInt16 currentIndex;
111: SInt16 reserved;
112: UInt32 currentOffset;
113: UInt32 nextOffset;
114: HFSCatalogNodeID folderID;
115:
116: UInt32 btreeNodeHint; // node the key was last seen in
117: UInt16 btreeIndexHint; // index the key was last seen at
118: UInt16 nameType; // { 0 = Pascal, 1 = Unicode, 3 = long name}
119: HFSCatalogNodeID parentID; // parent folder ID
120: union
121: {
122: Str31 pascalName;
123: UniStr63 unicodeName;
124: HFSUniStr255 * longNamePtr;
125: } folderName;
126:
127: struct lock__bsd__ iterator_lock;
128: };
129: typedef struct CatalogIterator CatalogIterator;
130:
131:
132: struct CatalogCacheGlobals {
133: UInt32 iteratorCount; // Number of iterators in cache
134: CatalogIterator * mru;
135: CatalogIterator * lru;
136: UInt32 reserved;
137: HFSUniStr255 longName; // used by a single kLongUnicodeName iterator
138:
139: simple_lock_data_t simplelock;
140: };
141: typedef struct CatalogCacheGlobals CatalogCacheGlobals;
142:
143:
144: //
145: // Private Catalog Manager Routines (for use only by Catalog Manager, CatSearch and FileID Services)
146: //
147:
148: extern OSErr LocateCatalogThread( const ExtendedVCB *volume, HFSCatalogNodeID nodeID, CatalogRecord *threadData,
149: UInt16 *threadSize, UInt32 *threadHint);
150:
151: extern OSErr LocateCatalogNode( const ExtendedVCB *volume, HFSCatalogNodeID folderID, const CatalogName *name,
152: UInt32 hint, CatalogKey *key, CatalogRecord *data, UInt32 *newHint);
153:
154: extern OSErr LocateCatalogNodeByKey ( const ExtendedVCB *volume, UInt32 hint, CatalogKey *keyPtr,
155: CatalogRecord *dataPtr, UInt32 *newHint );
156:
157: extern OSErr LocateCatalogRecord( const ExtendedVCB *volume, HFSCatalogNodeID folderID, const CatalogName *name,
158: UInt32 hint, CatalogKey *keyPtr, CatalogRecord *dataPtr, UInt32 *newHint);
159:
160: extern OSErr LocateCatalogNodeWithRetry ( const ExtendedVCB *volume, HFSCatalogNodeID folderID, ConstStr31Param pascalName,
161: CatalogName *unicodeName, UInt32 hint, CatalogKey *keyPtr, CatalogRecord *dataPtr,
162: UInt32 *newHint );
163:
164: extern OSErr LocateCatalogNodeByMangledName( const ExtendedVCB *volume, HFSCatalogNodeID folderID,
165: ConstStr31Param name, UInt32 length,
166: CatalogKey *keyPtr, CatalogRecord *dataPtr, UInt32 *hintPtr );
167:
168: extern OSErr FlushCatalog( ExtendedVCB *volume);
169:
170: #define InvalidateCatalogNodeCache(v, pid)
171:
172: extern OSErr UpdateFolderCount( ExtendedVCB *volume, HFSCatalogNodeID parentID, const CatalogName *name, SInt16 newType,
173: UInt32 hint, SInt16 valenceDelta);
174:
175: extern UInt16 GetCatalogRecordSize( const CatalogRecord *dataRecord);
176:
177: extern void ConvertInputNameToUnicode(ConstStr31Param name, TextEncoding encodingHint,
178: TextEncoding *actualEncoding, CatalogName *catalogName);
179:
180: extern void BuildCatalogKey( HFSCatalogNodeID parentID, const CatalogName *name, Boolean isHFSPlus,
181: CatalogKey *key);
182:
183: extern OSErr BuildCatalogKeyUTF8(ExtendedVCB *volume, HFSCatalogNodeID parentID, const char *name,
184: UInt32 length, CatalogKey *key, UInt32 *textEncoding);
185:
186: extern void UpdateCatalogName( ConstStr31Param srcName, Str31 destName);
187:
188: extern UInt32 CatalogNameLength( const CatalogName *name, Boolean isHFSPlus);
189:
190: extern void CopyCatalogName( const CatalogName *srcName, CatalogName *dstName, Boolean isHFSPLus);
191:
192: extern OSErr ResolveFileID( ExtendedVCB *vcb, HFSCatalogNodeID fileID, HFSCatalogNodeID *parentID, Str31 name );
193:
194: #if 0
195: extern OSErr CreateFileThreadID( FIDParam *filePB, WDCBRecPtr *wdcbPtr );
196:
197: extern OSErr ExchangeFiles( FIDParam *filePB, WDCBRecPtr *wdcbPtr );
198: #endif
199:
200: extern void CopyCatalogNodeData( const ExtendedVCB *volume, const CatalogRecord *dataPtr, CatalogNodeData *nodeData);
201:
202: extern void UpdateVolumeEncodings( ExtendedVCB *volume, TextEncoding encoding);
203:
204: extern void AdjustVolumeCounts( ExtendedVCB *volume, SInt16 type, SInt16 delta );
205:
206:
207: // Catalog Iterator Routines
208:
209: extern CatalogIterator* oGetCatalogIterator( const ExtendedVCB *volume, HFSCatalogNodeID folderID, UInt16 index);
210: extern CatalogIterator* GetCatalogIterator(ExtendedVCB *volume, HFSCatalogNodeID folderID, UInt32 offset);
211:
212: extern OSErr ReleaseCatalogIterator( CatalogIterator *catalogIterator );
213:
214: extern void TrashCatalogIterator( const ExtendedVCB *volume, HFSCatalogNodeID folderID );
215:
216: void AgeCatalogIterator( CatalogIterator *catalogIterator );
217:
218: extern void UpdateBtreeIterator( const CatalogIterator *catalogIterator, BTreeIterator *btreeIterator );
219:
220: extern void UpdateCatalogIterator( const BTreeIterator *btreeIterator, CatalogIterator *catalogIterator );
221:
222:
223: #endif //__CATALOGPRIVATE__
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.