home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Exec 4 / CD_Magazyn_EXEC_nr_4.iso / Recent / dev / c / apputil.lha / apputil / settings.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-11-05  |  3.4 KB  |  172 lines

  1. /*
  2.  * settings.c
  3.  * ==========
  4.  * Functions for loading and saving application settings.
  5.  *
  6.  * Copyright (C) 1999-2000 HÃ¥kan L. Younes (lorens@hem.passagen.se)
  7.  */
  8.  
  9. #include <exec/memory.h>
  10.  
  11. #include <clib/alib_stdio_protos.h>
  12. #include <proto/dos.h>
  13. #include <proto/exec.h>
  14.  
  15. #include "apputil.h"
  16.  
  17.  
  18. static STRPTR settingsPath;
  19.  
  20.  
  21. static BOOL SaveInEnv(BOOL arc, STRPTR basename, VOID *buf, LONG len) {
  22.   BPTR lock;
  23.   struct FileInfoBlock *fib;
  24.   UBYTE filename[MAXBASENAMELEN + 8];
  25.   BOOL success;
  26.  
  27.   sprintf(filename, "%s:%s", (arc ? "ENVARC" : "ENV"), basename);
  28.   lock = Lock(filename, ACCESS_WRITE);
  29.   if (lock == NULL) {
  30.     if (IoErr() == ERROR_DIR_NOT_FOUND) {
  31.       lock = CreateDir(filename);
  32.     } else {
  33.       return FALSE;
  34.     }
  35.   } else {
  36.     fib = AllocDosObject(DOS_FIB, NULL);
  37.     if (fib != NULL) {
  38.       if (!Examine(lock, fib) || fib->fib_DirEntryType <= 0) {
  39.     UnLock(lock);
  40.     lock = NULL;
  41.       }
  42.       FreeDosObject(DOS_FIB, fib);
  43.     } else {
  44.       UnLock(lock);
  45.       lock = NULL;
  46.     }
  47.   }
  48.  
  49.   if (lock != NULL) {
  50.     lock = CurrentDir(lock);
  51.     sprintf(filename, "%s.prefs", basename);
  52.     success = SaveSettingsAs(filename, buf, len);
  53.     UnLock(CurrentDir(lock));
  54.  
  55.     return success;
  56.   } else {
  57.     return FALSE;
  58.   }
  59. }
  60.  
  61.  
  62. BOOL InitSettings(STRPTR path, STRPTR basename, VOID *buf, LONG len) {
  63.   BPTR lock;
  64.   UBYTE filename[2 * MAXBASENAMELEN + 12];
  65.   BOOL success;
  66.  
  67.   if (strlen(basename) > MAXBASENAMELEN) {
  68.     return FALSE;
  69.   }
  70.  
  71.   if (path != NULL) {
  72.     settingsPath = AllocVec((strlen(path) + 1L) * sizeof *settingsPath,
  73.                 MEMF_PUBLIC);
  74.     if (settingsPath != NULL) {
  75.       strcpy(settingsPath, path);
  76.     }
  77.     success = LoadSettings(path, buf, len);
  78.   } else {
  79.     settingsPath = NULL;
  80.     success = FALSE;
  81.   }
  82.  
  83.   if (!success) {
  84.     lock = GetProgramDir();
  85.     if (lock != NULL) {
  86.       lock = CurrentDir(lock);
  87.       sprintf(filename, "%s.prefs", basename);
  88.       success = LoadSettings(filename, buf, len);
  89.       CurrentDir(lock);
  90.     }
  91.   }
  92.  
  93.   if (!success) {
  94.     sprintf(filename, "ENV:%s/%s.prefs", basename, basename);
  95.     return LoadSettings(filename, buf, len);
  96.   } else {
  97.     return TRUE;
  98.   }
  99. }
  100.  
  101.  
  102. VOID DisposeSettings(VOID) {
  103.   FreeVec(settingsPath);
  104. }
  105.  
  106.  
  107. BOOL LoadSettings(STRPTR path, VOID *buf, LONG len) {
  108.   BPTR file;
  109.   LONG n;
  110.  
  111.   file = Open(path, MODE_OLDFILE);
  112.   if (file != NULL) {
  113.     n = Read(file, buf, len);
  114.     Close(file);
  115.  
  116.     return (BOOL)(n == len);
  117.   } else {
  118.     return FALSE;
  119.   }
  120. }
  121.  
  122.  
  123. BOOL SaveSettings(STRPTR basename, VOID *buf, LONG len) {
  124.   BPTR lock;
  125.   UBYTE filename[2 * MAXBASENAMELEN + 12];
  126.   BOOL success;
  127.  
  128.   if (strlen(basename) > MAXBASENAMELEN) {
  129.     return FALSE;
  130.   }
  131.  
  132.   if (settingsPath != NULL) {
  133.     success = SaveSettingsAs(settingsPath, buf, len);
  134.   } else {
  135.     success = FALSE;
  136.   }
  137.  
  138.   if (!success) {
  139.     lock = GetProgramDir();
  140.     if (lock != NULL) {
  141.       lock = CurrentDir(lock);
  142.       sprintf(filename, "%s.prefs", basename);
  143.       success = SaveSettingsAs(filename, buf, len);
  144.       CurrentDir(lock);
  145.     }
  146.   }
  147.  
  148.   if (!success) {
  149.     SaveInEnv(FALSE, basename, buf, len);
  150.     return SaveInEnv(TRUE, basename, buf, len);
  151.   } else {
  152.     return TRUE;
  153.   }
  154. }
  155.  
  156.  
  157. BOOL SaveSettingsAs(STRPTR path, VOID *buf, LONG len) {
  158.   BPTR file;
  159.   LONG n;
  160.  
  161.   file = Open(path, MODE_NEWFILE);
  162.   if (file != NULL) {
  163.     n = Write(file, buf, len);
  164.     Close(file);
  165.     SetProtection(path, FIBF_EXECUTE);
  166.  
  167.     return (BOOL)(n == len);
  168.   } else {
  169.     return FALSE;
  170.   }
  171. }
  172.