pascal OSErr PBCatSearchSyncCompat(CSParamPtr paramBlock) { static Boolean fullExtFSDispatchingtested = false; static Boolean hasFullExtFSDispatching = false; OSErr result; Boolean supportsCatSearch; long response; GetVolParmsInfoBuffer volParmsInfo; long infoSize; result = noErr; /* See if File Manager will pass CatSearch requests to external file systems */ /* we will store the results in a static variable so we do NOT have to call Gestalt */ /* everytime we are called. */ if ( !fullExtFSDispatchingtested ) { fullExtFSDispatchingtested = true; if ( Gestalt(gestaltFSAttr, &response) == noErr ) { hasFullExtFSDispatching = ((response & (1L << gestaltFullExtFSDispatching)) != 0); } } /* CatSearch is a per volume attribute, so we have to check each time we are */ /* called to see if it is available on the volume specified. */ supportsCatSearch = false; if ( hasFullExtFSDispatching ) { infoSize = sizeof(GetVolParmsInfoBuffer); result = HGetVolParms(paramBlock->ioNamePtr, paramBlock->ioVRefNum, &volParmsInfo, &infoSize); if ( result == noErr ) { supportsCatSearch = hasCatSearch(volParmsInfo); } } /* noErr or paramErr is OK here. */ /* paramErr just means that GetVolParms is NOT supported by this volume */ if ( (result == noErr) || (result == paramErr) ) { if ( supportsCatSearch ) { /* Volume supports CatSearch so use it. */ /* CatSearch is faster than an indexed search. */ result = PBCatSearchSync(paramBlock); } else { /* Volume does NOT support CatSearch so */ /* search using IndexedSearch from root directory. */ result = IndexedSearch(paramBlock, fsRtDirID); } } return ( result ); }
pascal OSErr DTOpen(ConstStr255Param volName, short vRefNum, short *dtRefNum, Boolean *newDTDatabase) { OSErr error; GetVolParmsInfoBuffer volParmsInfo; long infoSize; DTPBRec pb; /* Check for volume Desktop Manager support before calling */ infoSize = sizeof(GetVolParmsInfoBuffer); error = HGetVolParms(volName, vRefNum, &volParmsInfo, &infoSize); if ( error == noErr ) { if ( hasDesktopMgr(&volParmsInfo) ) { pb.ioNamePtr = (StringPtr)volName; pb.ioVRefNum = vRefNum; error = PBDTOpenInform(&pb); /* PBDTOpenInform informs us if the desktop was just created */ /* by leaving the low bit of ioTagInfo clear (0) */ *newDTDatabase = ((pb.ioTagInfo & 1L) == 0); if ( error == paramErr ) { error = PBDTGetPath(&pb); /* PBDTGetPath doesn't tell us if the database is new */ /* so assume it is not new */ *newDTDatabase = false; } *dtRefNum = pb.ioDTRefNum; } else { error = paramErr; } } return ( error ); }