mac-rom/Libs/InterfaceSrcs/FoldersGlue.c
Elliot Nunn 4325cdcc78 Bring in CubeE sources
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.
2017-12-26 09:52:23 +08:00

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