mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-28 01:29:20 +00:00
4325cdcc78
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included. The Tools directory, containing mostly junk, is also excluded.
145 lines
4.4 KiB
C
145 lines
4.4 KiB
C
/*
|
|
File: FoldersGlue.c
|
|
|
|
Contains: FindFolder (also known as Folder Manager) glue for 7.0 Apps
|
|
that will allow them to run on 6.0 also.
|
|
|
|
Written by: Prashant Patel
|
|
|
|
Copyright: © 1990-1991 by Apple Computer, Inc., all rights reserved.
|
|
|
|
Change History (most recent first):
|
|
|
|
<4> 11/14/91 JL Had to change ifndef of SystemSevenOrLater to If it was false
|
|
because it's always defined in Types.h.
|
|
<3> 11/13/91 JL Changed kSupportSysDir to kNoSupportsSysDir and changed logic to
|
|
check for System Folder support. The 17th bit of vMAttrib is set
|
|
if there is no support - the logic got confusing. This fixes the
|
|
bug about not recognizing a System Folder on a drive that has
|
|
one.
|
|
<2> 11/4/91 JSM Conditionalize glue for pre-System 7 only.
|
|
<1> 11/13/90 PP (PP/dba) first checked in
|
|
|
|
*/
|
|
|
|
|
|
#include <Folders.h>
|
|
#include <GestaltEqu.h>
|
|
#include <SysEqu.h>
|
|
#include <Errors.h>
|
|
#include <Files.h>
|
|
|
|
/* Real FindFolder Trap in Sys 7.0. */
|
|
pascal OSErr
|
|
__FindFolder(short vRefNum, OSType, Boolean createFolder, short* foundVRefNum, long* foundDirID)
|
|
= { 0x7000, 0xA823 };
|
|
|
|
#if !(SystemSevenOrLater)
|
|
|
|
/* need glue for FindFolder for pre-7.0 systems */
|
|
|
|
/* Global Reference number of system resource file (word) */
|
|
#define SYSMAP (* (short *) SysMap)
|
|
|
|
#define kNoSupportsSysDir (1<<17) // Does volume support System Folder? <3>
|
|
|
|
typedef struct
|
|
{ // GetVolParms buffer
|
|
short version;
|
|
long attributes;
|
|
} VolParmsBuf;
|
|
|
|
|
|
pascal OSErr FindFolder(short vRefNum,
|
|
OSType folderType,
|
|
Boolean createFolder,
|
|
short* foundVRefNum,
|
|
long* foundDirID)
|
|
{
|
|
OSErr error; // return code
|
|
long result; // Gestalt result
|
|
Boolean findFolderPresent = false;
|
|
HParamBlockRec hpb; // generic h Param Block
|
|
VolParmsBuf volumeParms; // answer from GetVolParms
|
|
|
|
/* Determine if real FindFolder is present or not. */
|
|
error = Gestalt( gestaltFindFolderAttr, &result );
|
|
if (error == noErr)
|
|
{
|
|
if (result & (1<<gestaltFindFolderPresent))
|
|
findFolderPresent = true;
|
|
}
|
|
|
|
if (findFolderPresent)
|
|
return (__FindFolder(vRefNum, folderType, createFolder, foundVRefNum, foundDirID));
|
|
|
|
else
|
|
{
|
|
/* Folders that do not reside in System Folder are not valid for 6.0.
|
|
In such a case, return paramErr.
|
|
*/
|
|
|
|
if (folderType != kSystemFolderType &&
|
|
folderType != kTemporaryFolderType &&
|
|
folderType != kPreferencesFolderType &&
|
|
folderType != kExtensionFolderType &&
|
|
folderType != kControlPanelFolderType &&
|
|
folderType != kAppleMenuFolderType &&
|
|
folderType != kStartupFolderType &&
|
|
folderType != kPrintMonitorDocsFolderType)
|
|
return (paramErr);
|
|
|
|
hpb.fileParam.ioNamePtr = nil; // not interested in name
|
|
|
|
if (vRefNum == (short)kOnSystemDisk) // vRefNum of Boot disk
|
|
{
|
|
/* Get vRefNum of the System disk. HParamBlockRec mapped to FCBPBRec. */
|
|
hpb.fileParam.ioFRefNum = SYSMAP; // the system file's refNum
|
|
hpb.fileParam.ioFDirIndex = 0; // get file by refNum
|
|
(*(FCBPBPtr)&hpb).ioFCBParID = fsRtDirID; // init in case of an MFS disk
|
|
error = PBGetFCBInfoSync ((FCBPBPtr) &hpb);
|
|
if (error != noErr)
|
|
goto EXIT;
|
|
|
|
/* cooked vRefNum is returned in ioFCBVRefNum. */
|
|
hpb.volumeParam.ioVRefNum = (*(FCBPBPtr)&hpb).ioFCBVRefNum;
|
|
}
|
|
else
|
|
hpb.volumeParam.ioVRefNum = vRefNum;
|
|
|
|
/* Get volume params for this disk, specially the attributes bits. */
|
|
|
|
hpb.ioParam.ioReqCount = sizeof (VolParmsBuf); // size of return buffer
|
|
hpb.ioParam.ioBuffer = (Ptr) &volumeParms; // pointer to return buffer
|
|
error = PBHGetVolParmsSync (&hpb);
|
|
|
|
if (error == paramErr || // just lack of PBHGetVolParms
|
|
(error == noErr && !(volumeParms.attributes & kNoSupportsSysDir))) // System Folder supported <3>
|
|
{
|
|
/* Get cooked vRefNum and System Folder dirID by calling HGetVInfo. */
|
|
hpb.volumeParam.ioVolIndex = 0; // get info by vRefNum
|
|
hpb.volumeParam.ioVFndrInfo[0] = 0; // init in case of an MFS disk
|
|
hpb.fileParam.ioDirID = 0; // *** bug related to changing working Dir???
|
|
error = PBHGetVInfoSync (&hpb);
|
|
if (error != noErr)
|
|
goto EXIT;
|
|
|
|
if (hpb.volumeParam.ioVFndrInfo[0] != 0) // System Folder dirID on this disk
|
|
{
|
|
*foundVRefNum = hpb.volumeParam.ioVRefNum; // cooked vRefNum is returned
|
|
*foundDirID = hpb.volumeParam.ioVFndrInfo[0]; // System Folder dirID on this disk
|
|
}
|
|
else
|
|
error = fnfErr;
|
|
}
|
|
else if (error == noErr)
|
|
error = fnfErr;
|
|
|
|
}
|
|
|
|
EXIT:
|
|
|
|
return (error);
|
|
}
|
|
|
|
#endif |