home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Mark Pilgrim / Go Sit In The Corner 1.0 / source / cdev code / cdev prefs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-30  |  4.9 KB  |  207 lines  |  [TEXT/KAHL]

  1. /**********************************************************************\
  2.  
  3. File:        cdev prefs.c
  4.  
  5. Purpose:    This module handles the preferences file, which contains
  6.             info about current options.
  7.             
  8.  
  9. Go Sit In The Corner -=- not you, just the cursor
  10. Copyright ©1994, Mark Pilgrim
  11.  
  12. This program is free software; you can redistribute it and/or modify
  13. it under the terms of the GNU General Public License as published by
  14. the Free Software Foundation; either version 2 of the License, or
  15. (at your option) any later version.
  16.  
  17. This program is distributed in the hope that it will be useful,
  18. but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20. GNU General Public License for more details.
  21.  
  22. You should have received a copy of the GNU General Public License
  23. along with this program in a file named "GNU General Public License".
  24. If not, write to the Free Software Foundation, 675 Mass Ave,
  25. Cambridge, MA 02139, USA.
  26.  
  27. \**********************************************************************/
  28.  
  29. #include "cdev globals.h"
  30. #include "cdev prefs.h"
  31. #include "Folders.h"
  32. #include "GestaltEQU.h"
  33.  
  34. int PreferencesInit(PrefHandle prefsHandle)
  35. {
  36.     int            prefsFileID;
  37.     int            err;
  38.     
  39.     err=OpenPrefsFile(&prefsFileID, prefsHandle);
  40.     if (err!=prefs_allsWell)
  41.     {
  42.         if ((err==prefs_diskReadErr) || (err==prefs_diskWriteErr) || (err==prefs_virginErr))
  43.             ClosePrefsFile(prefsFileID);
  44.         return err;
  45.     }
  46.     
  47.     GetNextPrefs(prefsFileID, prefsHandle);
  48.     if (err!=prefs_allsWell)
  49.     {
  50.         ClosePrefsFile(prefsFileID);
  51.         return err;
  52.     }
  53.     
  54.     ClosePrefsFile(prefsFileID);
  55.     
  56.     return prefs_allsWell;
  57. }
  58.  
  59. int OpenPrefsFile(int *prefsFileID, PrefHandle prefsHandle)
  60. {
  61.     int                thisFile;
  62.     OSErr            isHuman;
  63.     int                vRefNum;
  64.     long            dirID;
  65.     FSSpec            prefsFile;
  66.     FInfo            prefsInfo;
  67.     int                temp;
  68.     long            count;
  69.     Boolean            newPrefs;
  70.     int                err;
  71.     unsigned char    *name=PREFS_FILE_NAME;
  72.     long            gestalt_temp;
  73.     Boolean            gHasFSSpecs;
  74.     
  75.     isHuman = Gestalt(gestaltFSAttr, &gestalt_temp);
  76.     gHasFSSpecs=((isHuman==noErr) && (gestalt_temp & (1 << gestaltHasFSSpecCalls)));
  77.     
  78.     newPrefs=FALSE;
  79.     isHuman=FindFolder(kOnSystemDisk, 'pref', kCreateFolder, &vRefNum, &dirID);
  80.     
  81.     if (isHuman!=noErr)
  82.         return prefs_cantOpenPrefsErr;
  83.  
  84.     if (gHasFSSpecs)
  85.     {
  86.         isHuman=FSMakeFSSpec(vRefNum, dirID, name, &prefsFile);
  87.         if (isHuman!=noErr)
  88.         {
  89.             if (isHuman==fnfErr)
  90.             {
  91.                 isHuman=FSpCreate(&prefsFile, CREATOR, PREFS_TYPE, 0);
  92.                 if (isHuman!=noErr)
  93.                     return prefs_cantCreatePrefsErr;
  94.                 newPrefs=TRUE;
  95.             }
  96.             else return prefs_cantOpenPrefsErr;
  97.         }
  98.         isHuman=FSpOpenDF(&prefsFile, fsRdWrPerm, &thisFile);
  99.         *prefsFileID=thisFile;
  100.         if (isHuman!=noErr)
  101.             return prefs_cantOpenPrefsErr;
  102.     }
  103.     else
  104.     {
  105.         isHuman=HOpen(vRefNum, dirID, name, fsRdWrPerm, &thisFile);
  106.         *prefsFileID=thisFile;
  107.         if (isHuman!=noErr)
  108.         {
  109.             if (isHuman==fnfErr)
  110.             {
  111.                 isHuman=HCreate(vRefNum, dirID, name, CREATOR, PREFS_TYPE);
  112.                 if (isHuman!=noErr)
  113.                     return prefs_cantCreatePrefsErr;
  114.                 prefsInfo.fdType=PREFS_TYPE;
  115.                 prefsInfo.fdCreator=CREATOR;
  116.                 prefsInfo.fdFlags=0;
  117.                 prefsInfo.fdLocation.h=prefsInfo.fdLocation.v=0;
  118.                 prefsInfo.fdFldr=0;
  119.                 isHuman=HSetFInfo(vRefNum, dirID, name, &prefsInfo);
  120.                 if (isHuman!=noErr)
  121.                     return prefs_cantCreatePrefsErr;
  122.                 isHuman=HOpen(vRefNum, dirID, name, fsRdWrPerm, &thisFile);
  123.                 *prefsFileID=thisFile;
  124.                 if (isHuman!=noErr)
  125.                     return prefs_cantOpenPrefsErr;
  126.                 newPrefs=TRUE;
  127.             }
  128.             else return prefs_cantOpenPrefsErr;
  129.         }
  130.     }
  131.     if (newPrefs)
  132.     {
  133.         return Virgin(*prefsFileID, prefsHandle);
  134.     }
  135.     
  136.     return prefs_allsWell;
  137. }
  138.  
  139. void ClosePrefsFile(int prefsFileID)
  140. {
  141.     FSClose(prefsFileID);
  142.     FlushVol(0L, kOnSystemDisk);
  143. }
  144.  
  145. int GetNextPrefs(int prefsFileID, PrefHandle prefsHandle)
  146. {
  147.     OSErr        isHuman;
  148.     long        count;
  149.     
  150.     count=GetHandleSize(prefsHandle);
  151.     isHuman=FSRead(prefsFileID, &count, *prefsHandle);
  152.     if (isHuman!=noErr)
  153.         return prefs_diskReadErr;
  154.     
  155.     return prefs_allsWell;
  156. }
  157.  
  158. int SavePrefs(int prefsFileID, PrefHandle prefsHandle)
  159. {
  160.     long        oldEOF;
  161.     OSErr        isHuman;
  162.     long        count;
  163.     
  164.     isHuman=SetEOF(prefsFileID, GetHandleSize(prefsHandle));
  165.     if (isHuman!=noErr)
  166.         return prefs_diskWriteErr;
  167.  
  168.     SetFPos(prefsFileID, 1, 0L);
  169.     count=GetHandleSize(prefsHandle);
  170.     isHuman=FSWrite(prefsFileID, &count, *prefsHandle);
  171.     if (isHuman!=noErr)
  172.         return prefs_diskWriteErr;
  173.     
  174.     return prefs_allsWell;
  175. }
  176.  
  177. int Virgin(int prefsFileID, PrefHandle prefsHandle)
  178. {
  179.     int            err;
  180.     
  181.     DefaultPrefs(prefsHandle);
  182.     err=SavePrefs(prefsFileID, prefsHandle);
  183.     
  184.     return (err==prefs_allsWell) ? prefs_virginErr : err;
  185. }
  186.  
  187. void DefaultPrefs(PrefHandle prefsHandle)
  188. {
  189.     int                i;
  190.     
  191.     (**prefsHandle).showIcon=0xFF;
  192.     (**prefsHandle).isOn=0xFF;
  193.     (**prefsHandle).ourCodePtr=0L;
  194.     (**prefsHandle).ourVBLPtr=0L;
  195.     (**prefsHandle).whichCorner=0x00;    /* top-left corner */
  196.     (**prefsHandle).always=0x00;        /* only if no mouse movement */
  197. }
  198.  
  199. void SaveThePrefs(PrefHandle prefsHandle)
  200. {
  201.     int                prefsFileID;
  202.     
  203.     OpenPrefsFile(&prefsFileID, prefsHandle);
  204.     SavePrefs(prefsFileID, prefsHandle);
  205.     ClosePrefsFile(prefsFileID);
  206. }
  207.