GliderPRO/Sources/Prefs.c
John Calhoun 7a70d18ba6 First check-in.
Sources for Glider PRO, a Macintosh game written by John Calhoun and
published by Casady & Greene, Inc. I believe it was using CodeWarrior
IDE to create a fat (68K and PowerPC) binary.
2016-01-28 08:10:38 -08:00

1 line
6.1 KiB
C
Executable File

//============================================================================
//----------------------------------------------------------------------------
// Prefs.c
//----------------------------------------------------------------------------
//============================================================================
#include <Folders.h>
#include <Gestalt.h>
#include <Script.h>
#include <TextUtils.h>
#include <ToolUtils.h>
#include "Externs.h"
#include "Environ.h"
#define kPrefCreatorType 'ozm5'
#define kPrefFileType 'gliP'
#define kPrefFileName "\pGlider Prefs"
#define kDefaultPrefFName "\pPreferences"
#define kPrefsStringsID 160
#define kNewPrefsAlertID 160
#define kPrefsFNameIndex 1
Boolean CanUseFindFolder (void);
Boolean GetPrefsFPath (long *, short *);
Boolean CreatePrefsFolder (short *);
Boolean WritePrefs (long *, short *, prefsInfo *);
OSErr ReadPrefs (long *, short *, prefsInfo *);
Boolean DeletePrefs (long *, short *);
void BringUpDeletePrefsAlert (void);
//============================================================== Functions
//-------------------------------------------------------------- CanUseFindFolder
Boolean CanUseFindFolder (void)
{
OSErr theErr;
long theFeature;
if (!thisMac.hasGestalt)
return(false);
theErr = Gestalt(gestaltFindFolderAttr, &theFeature);
if (theErr != noErr)
return(false);
if (!BitTst(&theFeature, 31 - gestaltFindFolderPresent))
return(false);
else
return(true);
}
//-------------------------------------------------------------- GetPrefsFPath
Boolean GetPrefsFPath (long *prefDirID, short *systemVolRef)
{
OSErr theErr;
theErr = FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder,
systemVolRef, prefDirID);
if (theErr != noErr)
return(false);
return(true);
}
//-------------------------------------------------------------- CreatePrefsFolder
Boolean CreatePrefsFolder (short *systemVolRef)
{
HFileParam fileParamBlock;
Str255 folderName;
OSErr theErr;
GetIndString(folderName, kPrefsStringsID, kPrefsFNameIndex);
fileParamBlock.ioVRefNum = *systemVolRef;
fileParamBlock.ioDirID = 0;
fileParamBlock.ioNamePtr = folderName;
fileParamBlock.ioCompletion = nil;
theErr = PBDirCreate((HParmBlkPtr)&fileParamBlock, false);
if (theErr != noErr)
{
CheckFileError(theErr, "\pPreferences");
return(false);
}
return(true);
}
//-------------------------------------------------------------- WritePrefs
Boolean WritePrefs (long *prefDirID, short *systemVolRef, prefsInfo *thePrefs)
{
OSErr theErr;
short fileRefNum;
long byteCount;
FSSpec theSpecs;
Str255 fileName = kPrefFileName;
theErr = FSMakeFSSpec(*systemVolRef, *prefDirID, fileName, &theSpecs);
if (theErr != noErr)
{
if (theErr != fnfErr)
{
CheckFileError(theErr, "\pPreferences");
return(false);
}
theErr = FSpCreate(&theSpecs, kPrefCreatorType, kPrefFileType, smSystemScript);
if (theErr != noErr)
{
CheckFileError(theErr, "\pPreferences");
return(false);
}
}
theErr = FSpOpenDF(&theSpecs, fsRdWrPerm, &fileRefNum);
if (theErr != noErr)
{
CheckFileError(theErr, "\pPreferences");
return(false);
}
byteCount = sizeof(*thePrefs);
theErr = FSWrite(fileRefNum, &byteCount, thePrefs);
if (theErr != noErr)
{
CheckFileError(theErr, "\pPreferences");
return(false);
}
theErr = FSClose(fileRefNum);
if (theErr != noErr)
{
CheckFileError(theErr, "\pPreferences");
return(false);
}
return(true);
}
//-------------------------------------------------------------- SavePrefs
Boolean SavePrefs (prefsInfo *thePrefs, short versionNow)
{
long prefDirID;
short systemVolRef;
thePrefs->prefVersion = versionNow;
if (!GetPrefsFPath(&prefDirID, &systemVolRef))
return(false);
if (!WritePrefs(&prefDirID, &systemVolRef, thePrefs))
return(false);
return(true);
}
//-------------------------------------------------------------- ReadPrefs
OSErr ReadPrefs (long *prefDirID, short *systemVolRef, prefsInfo *thePrefs)
{
OSErr theErr;
short fileRefNum;
long byteCount;
FSSpec theSpecs;
Str255 fileName = kPrefFileName;
theErr = FSMakeFSSpec(*systemVolRef, *prefDirID, fileName, &theSpecs);
if (theErr != noErr)
{
if (theErr == fnfErr)
return(theErr);
else
{
CheckFileError(theErr, "\pPreferences");
return(theErr);
}
}
theErr = FSpOpenDF(&theSpecs, fsRdWrPerm, &fileRefNum);
if (theErr != noErr)
{
CheckFileError(theErr, "\pPreferences");
return(theErr);
}
byteCount = sizeof(*thePrefs);
theErr = FSRead(fileRefNum, &byteCount, thePrefs);
if (theErr != noErr)
{
if (theErr == eofErr)
theErr = FSClose(fileRefNum);
else
{
CheckFileError(theErr, "\pPreferences");
theErr = FSClose(fileRefNum);
}
return(theErr);
}
theErr = FSClose(fileRefNum);
if (theErr != noErr)
{
CheckFileError(theErr, "\pPreferences");
return(theErr);
}
return(theErr);
}
//-------------------------------------------------------------- DeletePrefs
Boolean DeletePrefs (long *dirID, short *volRef)
{
FSSpec theSpecs;
Str255 fileName = kPrefFileName;
OSErr theErr;
theErr = FSMakeFSSpec(*volRef, *dirID, fileName, &theSpecs);
if (theErr != noErr)
return(false);
else
theErr = FSpDelete(&theSpecs);
if (theErr != noErr)
return(false);
return(true);
}
//-------------------------------------------------------------- LoadPrefs
Boolean LoadPrefs (prefsInfo *thePrefs, short versionNeed)
{
long prefDirID;
OSErr theErr;
short systemVolRef;
Boolean noProblems;
noProblems = GetPrefsFPath(&prefDirID, &systemVolRef);
if (!noProblems)
return(false);
theErr = ReadPrefs(&prefDirID, &systemVolRef, thePrefs);
if (theErr == eofErr)
{
BringUpDeletePrefsAlert();
noProblems = DeletePrefs(&prefDirID, &systemVolRef);
return (false);
}
else if (theErr != noErr)
return (false);
if (thePrefs->prefVersion != versionNeed)
{
BringUpDeletePrefsAlert();
noProblems = DeletePrefs(&prefDirID, &systemVolRef);
return(false);
}
return (true);
}
//-------------------------------------------------------------- BringUpDeletePrefsAlert
void BringUpDeletePrefsAlert (void)
{
short whoCares;
InitCursor();
// CenterAlert(kNewPrefsAlertID);
whoCares = Alert(kNewPrefsAlertID, nil);
}