home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1998 / MacHack 1998.toast / The Hacks! / Talking KeyBoard / Source / pref.c < prev    next >
Encoding:
Text File  |  1998-06-06  |  4.2 KB  |  172 lines  |  [TEXT/CWIE]

  1. // Program Author: Paul Baxter
  2. //    pbaxter@assistivetech.com
  3. //
  4. //
  5.  
  6. #include <Speech.h>
  7. #include <Ctype.h>
  8. #include <DeskBus.h>
  9. #include <Retrace.h>
  10.  
  11. #include "pref.h"
  12. #include "globals.h"
  13.  
  14. enum {
  15.     rPrefStrings = 128
  16. };
  17. enum {
  18.     rPrefFileName = 1
  19. };
  20.  
  21. #define kPrefFileType        'pref'
  22. #define kPrefCreatorType    'PBAX'
  23. #define kPrefResourceType    'pref'
  24. #define kPrefResourceID        128
  25.  
  26. #define kCurrentPrefVersion    1
  27.  
  28. static short gPrefsResFile = -1;
  29. static OSErr OpenPrefsFile(void);
  30. static void ClosePrefsFile(void);
  31.  
  32. // * ****************************************************************************** *
  33. // *            LoadPrefs
  34. // *                                Load pref file into memory
  35. // * ****************************************************************************** *
  36. OSErr LoadPrefs(void)
  37. {
  38.     Handle prefHandle;
  39.     Boolean prefsExist;
  40.     OSErr err;
  41.  
  42.     err = OpenPrefsFile();
  43.     if (!err) {
  44.         // get pref resource
  45.         // if this is a new file it will get the resource from our default pref
  46.         UseResFile(gPrefsResFile);
  47.         prefHandle = GetResource(kPrefResourceType, kPrefResourceID);
  48.         prefsExist = (HomeResFile(prefHandle) == gPrefsResFile);
  49.         if (prefHandle && prefsExist) {
  50.  
  51.             // check current version
  52.             if ((**(PrefHandle)prefHandle).version < kCurrentPrefVersion) {
  53.  
  54.                 // delete old pref resource from pref file .. it will be updated during save
  55.                 RemoveResource(prefHandle);
  56.                 UpdateResFile(gPrefsResFile);
  57.                 DisposeHandle(prefHandle);
  58.                 prefHandle = GetResource(kPrefResourceType, kPrefResourceID);
  59.             }
  60.         }
  61.         // did we at least load default prefs?
  62.         if (!prefHandle) return -1;
  63.  
  64.         // lock and detach
  65.         // This will derefenced at interupt time and can not move!!!!!!!!!
  66.         HLockHi(prefHandle);
  67.         DetachResource(prefHandle);
  68.  
  69.         // set global
  70.         gPrefs = (PrefHandle)prefHandle;
  71.  
  72.         ClosePrefsFile();
  73.  
  74.     }
  75.  
  76.     return err;
  77. }
  78.  
  79.  
  80. // * ****************************************************************************** *
  81. // *            OpenPrefsFile
  82. // *                                open pref file
  83. // * ****************************************************************************** *
  84. static OSErr OpenPrefsFile(void)
  85. {
  86.     Str32 prefsName;
  87.     FInfo fndrInfo;
  88.     FSSpec spec;
  89.     long foundDirID;
  90.     short foundVRefNum;
  91.     Boolean prefsExist;
  92.     OSErr err;
  93.  
  94.     prefsExist = true;
  95.     err = FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder, &foundVRefNum, &foundDirID);
  96.     if (err) return err;
  97.  
  98.     GetIndString(prefsName, rPrefStrings, rPrefFileName);
  99.  
  100.     // see if the file exists
  101.     err = FSMakeFSSpec( foundVRefNum, foundDirID, prefsName, &spec);
  102.     if (err == fnfErr) {
  103.         HCreateResFile(foundVRefNum, foundDirID, prefsName);
  104.         prefsExist = false;
  105.         err = ResError();
  106.     }
  107.     if (err) return err;
  108.  
  109.     // set creator and type
  110.     err = HGetFInfo(foundVRefNum, foundDirID, prefsName, &fndrInfo);
  111.     if ((!err) && (!prefsExist))  {
  112.         fndrInfo.fdType = kPrefFileType;
  113.         fndrInfo.fdCreator = kPrefCreatorType;
  114.         err = HSetFInfo(foundVRefNum, foundDirID, prefsName, &fndrInfo);
  115.         if (err) return err;
  116.     }
  117.  
  118.     // open the file
  119.     gPrefsResFile = HOpenResFile(foundVRefNum, foundDirID, prefsName,  fsRdWrPerm);
  120.     err = ResError();
  121.     if (gPrefsResFile <= 0) 
  122.         err = fnfErr;
  123.  
  124.     return err;
  125. }
  126.  
  127. // * ****************************************************************************** *
  128. // *            ClosePrefsFile
  129. // *                                close pref file
  130. // * ****************************************************************************** *
  131. static void ClosePrefsFile(void)
  132. {
  133.     if (gPrefsResFile > 0) {
  134.         CloseResFile(gPrefsResFile);
  135.         gPrefsResFile = -1;
  136.     }
  137. }
  138.  
  139. // * ****************************************************************************** *
  140. // *            SavePrefs
  141. // *                                Save pref file
  142. // * ****************************************************************************** *
  143. OSErr SavePrefs(void)
  144. {
  145.     Handle tmpHandle;
  146.     OSErr err;
  147.  
  148.     err = OpenPrefsFile();
  149.     if ((!err) && (gPrefs) && (gPrefsResFile > 0)) {
  150.  
  151.         // Remove old resource
  152.         UseResFile(gPrefsResFile);
  153.         SetResLoad(false);
  154.         tmpHandle = Get1Resource(kPrefResourceType, kPrefResourceID);
  155.         SetResLoad(true);
  156.         if (tmpHandle) {
  157.             RemoveResource(tmpHandle);
  158.             UpdateResFile(gPrefsResFile);
  159.         }
  160.  
  161.         // add new resource
  162.         UseResFile(gPrefsResFile);
  163.         AddResource((Handle)gPrefs, kPrefResourceType, kPrefResourceID, "\p");
  164.         HUnlock((Handle)gPrefs);
  165.         ChangedResource((Handle)gPrefs);
  166.         WriteResource((Handle)gPrefs);
  167.         HandToHand(&(Handle)gPrefs);
  168.         ClosePrefsFile();
  169.         HLock((Handle)gPrefs);
  170.     }
  171.     return err;
  172. }