home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C++ / Applications / Nuntius 1.2 / src / Nuntius / UPrefsFileMgr.cp < prev    next >
Encoding:
Text File  |  1994-04-13  |  6.6 KB  |  262 lines  |  [TEXT/MPS ]

  1. // Copyright © 1994 Peter Speck (speck@dat.ruc.dk).  All rights reserved.
  2. // UPrefsFileMgr.cp
  3.  
  4. #include "UPrefsFileMgr.h"
  5. #include "Tools.h"
  6. #include "FileTools.h"
  7. #include "UBufferedFileStream.h"
  8. #include "UNntp.h"
  9.  
  10. #include <RsrcGlobals.h>
  11. #include <ErrorGlobals.h>
  12.  
  13. #include <Errors.h>
  14. #include <Folders.h>
  15.  
  16. #pragma segment MyTools
  17.  
  18. PPrefsFileMgr *gPrefsFileMgr = nil;
  19.  
  20. PPrefsFileMgr::PPrefsFileMgr()
  21.     : PPrefsDatabase()
  22. {
  23.     fPrefsFile = nil;
  24.     fTmpFile = nil;
  25.     fPrefsIsValid = false;
  26. }
  27.  
  28. void PPrefsFileMgr::IPrefsFileMgr(FSSpec spec)
  29. {
  30.     IPrefsDatabase();
  31.     FailInfo fi;
  32.     if (fi.Try())
  33.     {
  34.         fPrefsFile = NewFile(kPrefsFileType, kSignature, kUsesDataFork, preferResourceFork, !kDataOpen, !kRsrcOpen);
  35.         fTmpFile = NewFile(kPrefsFileType, kSignature, kUsesDataFork, preferResourceFork, !kDataOpen, !kRsrcOpen);
  36.         fPrefsFile->SetPermissions(fsRdWrPerm, fsRdWrPerm);
  37.         fTmpFile->SetPermissions(fsRdWrPerm, fsRdWrPerm);        
  38.         fPrefsFile->Specify(spec);
  39.         gPrefsFileMgr = this;
  40.         fi.Success();
  41.     }
  42.     else // fail
  43.     {
  44.         delete this;
  45.         fi.ReSignal();
  46.     }
  47. }
  48.  
  49. PPrefsFileMgr::~PPrefsFileMgr()
  50. {
  51.     gPrefsFileMgr = nil;
  52.     if (fPrefsFile)
  53.         fPrefsFile->CloseFile();
  54.     FreeIfObject(fPrefsFile); fPrefsFile = nil;
  55.     FreeIfObject(fTmpFile); fTmpFile = nil;
  56. }
  57.  
  58. TFile *PPrefsFileMgr::GetFile()
  59. {
  60.     return fPrefsFile;
  61. }
  62.  
  63. void PPrefsFileMgr::Load()
  64. {
  65.     DeleteAll();
  66.     TBufferedFileStream *aStream = nil;
  67.     VOLATILE(aStream);
  68.     FailInfo fi;
  69.     if (fi.Try())
  70.     {
  71.         fPrefsFile->SetPermissions(fsRdWrPerm, fsRdWrPerm);
  72.         fTmpFile->SetPermissions(fsRdWrPerm, fsRdWrPerm);        
  73.         if (!FileExist(fPrefsFile))
  74.         {
  75. #if qDebug
  76.             fprintf(stderr, "Prefs _file_ did not exist, does not read it...\n");
  77. #endif
  78.             fi.Success();
  79.             return;
  80.         }
  81.         FailOSErr(fPrefsFile->OpenFile());
  82.         aStream = NewBufferedFileStream(fPrefsFile, 16 * 1024, 0);
  83.         DoRead(aStream);
  84.         FreeIfObject(aStream); aStream = nil;
  85. //        FailOSErr(fPrefsFile->CloseFile());
  86.         fPrefsIsValid = true; // I hope
  87.         fi.Success();
  88.     }
  89.     else // fail
  90.     {
  91.         FreeIfObject(aStream); aStream = nil;
  92.         fPrefsFile->CloseFile();
  93.         if (fi.error != fnfErr)
  94.             gApplication->ShowError(fi.error, messageOpenPrefsFailed);
  95.     }
  96. }
  97.  
  98. void PPrefsFileMgr::Save()
  99. {
  100.     if (fPrefsIsValid == false || IsDirty() == false)
  101.         return;
  102.     TBufferedFileStream *aStream = nil;
  103.     VOLATILE(aStream);
  104.     FailInfo fi;
  105.     if (fi.Try())
  106.     {
  107.         fIsDirty = false; // if we fails, just drop the settings
  108.         SpecifyTmpFile();
  109.         FailOSErr(fTmpFile->CreateFile());
  110.         FailOSErr(fTmpFile->OpenFile());
  111.         aStream = NewBufferedFileStream(fTmpFile, 0, 16 * 1024);
  112.         DoWrite(aStream);
  113.         FreeIfObject(aStream); aStream = nil;
  114.         if (FileExist(fPrefsFile))
  115.         {
  116.             fTmpFile->ExchangeFiles(fPrefsFile);
  117.             // fPrefsFile now contains what we have just saved
  118.             // so let us delete our temp file.
  119.             // But, the file-access refnums have too been swapped,
  120.             // so they have to be swapped back.
  121. #define macroSwap(t,x,y) { t temp = x; x = y; y = temp; }
  122.             macroSwap(short, fPrefsFile->fDataRefNum, fTmpFile->fDataRefNum);
  123.             macroSwap(short, fPrefsFile->fRsrcRefNum, fTmpFile->fRsrcRefNum);
  124.             // fTmpFile refers now to the old prefs file, in the Temp folder
  125.             FailOSErr(fTmpFile->CloseFile());
  126.             OSErr err = fTmpFile->DeleteFile();        
  127. #if qDebug
  128.             if (err != noErr)
  129.                 fprintf(stderr, "Couldn't delete temp file, err = %ld\n", long(err));
  130. #endif
  131.         }
  132.         else
  133.         {
  134.             // FailOSErr(fTmpFile->CloseFile());
  135.             // close temp file, and move it to the proper place
  136.             FSSpec spec;
  137.             fPrefsFile->GetFileSpec(spec);
  138.             OSErr err = fTmpFile->MoveAndRename(spec);
  139. #if qDebug
  140.             if (err != noErr)
  141.                 fprintf(stderr, "Error from MoveAndRename = %ld\n", long(err));
  142. #endif
  143.         }
  144.         FailOSErr(fPrefsFile->FlushVolume());
  145.         fi.Success();
  146.     }
  147.     else // fail
  148.     {
  149.         FreeIfObject(aStream); aStream = nil;
  150.         fTmpFile->CloseFile();
  151.         fTmpFile->DeleteFile();        
  152.         gApplication->ShowError(fi.error, messageWritePrefsFailed);
  153.     }
  154. }
  155.  
  156. void PPrefsFileMgr::SpecifyTmpFile()
  157. {
  158. //- NewFile
  159.     short vRefNum = fPrefsFile->GetVolRefNum();
  160.     FSSpec spec;
  161.     OSErr err = FindFolder(vRefNum, kTemporaryFolderType, kCreateFolder, spec.vRefNum, spec.parID);
  162.     if (err != noErr)
  163.     {
  164. #if qDebug
  165.         fprintf(stderr, "Error from FindTempFolder: %ld\n", long(err));
  166. #endif
  167.         fPrefsFile->GetFileSpec(spec);
  168.     }
  169.     CStr255 s;
  170.     MyGetIndString(s, kTempPrefsName);
  171.     SubstituteStringItems(s, "«num»", long(TickCount() & 0x7FFFFFFF));
  172.     CheckFilenameSanity(s);
  173.     CopyCString2String(s, spec.name);
  174.     MakeFilenameUnique(spec);
  175.     fTmpFile->Specify(spec);
  176.     fPrefsFile->SetPermissions(fsRdWrPerm, fsRdWrPerm);
  177.     fTmpFile->SetPermissions(fsRdWrPerm, fsRdWrPerm);        
  178. }
  179.  
  180. void PPrefsFileMgr::SetPrefsValidationState(Boolean valid)
  181. {
  182.     fPrefsIsValid = valid;
  183. }
  184.  
  185. //============================================================================
  186. void GetPrefsLocationFileUntitledName(CStr255 &name, short stringID)
  187. {
  188.     MyGetIndString(name, stringID);
  189. }
  190.  
  191. void GetPrefsDocLocation(FSSpec &spec)
  192. {
  193.     if (gPrefsFileMgr)
  194.     {
  195.         TFile *prefFile = gPrefsFileMgr->GetFile();
  196.         if (prefFile)
  197.         {
  198.             spec.vRefNum = prefFile->GetVolRefNum();
  199.             spec.parID = prefFile->GetDirID();
  200. #if qDebug
  201.             fprintf(stderr, "Got prefs loc = %ld:%ld from gPrefsFileMgr\n", long(spec.vRefNum), spec.parID);
  202. #endif
  203.             return;
  204.         }
  205.     }
  206.     FailOSErr(FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder, spec.vRefNum, spec.parID));
  207.     CStr255 folderName;
  208.     MyGetIndString(folderName, kPrivateFilesFolderName);
  209.     if (UsesFakeNntp())
  210.         folderName += " (DB)";
  211.     CopyCString2String(folderName, spec.name);
  212.     Boolean targetIsFolder, wasAliased;
  213.     OSErr errNo = ResolveAliasFile(spec, true, targetIsFolder, wasAliased);
  214.     if (errNo != fnfErr)
  215.         FailOSErr(errNo);
  216. #if qDebug
  217.     fprintf(stderr, "targetIsFolder = %ld\n", long(targetIsFolder));
  218. #endif
  219.     if (errNo != fnfErr && !targetIsFolder)
  220.     {
  221.         StdAlert(phLocalPrefsNotAllowed);
  222.         Failure(0, 0);
  223.     }
  224.     GoInsideFolder(spec);
  225. #if qDebug
  226.     fprintf(stderr, "Got prefs loc = %ld:%ld from FindFolder\n", long(spec.vRefNum), spec.parID);
  227. #endif
  228. }
  229.  
  230. void GoPrefsLocation(TFile *file, short stringID)
  231. {
  232.     FailInfo fi;
  233.     if (fi.Try())
  234.     {
  235.         FSSpec spec;
  236.         GetPrefsDocLocation(spec);
  237.         CStr255 name;
  238.         GetPrefsLocationFileUntitledName(name, stringID);
  239.         CopyCString2String(name, spec.name);
  240.     // create TFile
  241.         file->Specify(spec);
  242.         file->SetPermissions(fsRdWrPerm, fsRdWrPerm);
  243.         ResolveAliasFile(file);
  244. #if qDebug
  245.         if (!IsObject(file))
  246.             ProgramBreak("NewPrefsLocationFile obj is not object");
  247. #endif
  248. #if qDebugNewPrefsLocationFile
  249.         CStr255 s(file->fFileSpec.name);
  250.         CStr255 pathName;
  251.         extern void GetPathNameFromDirID(short vRefNum, long dirID, CStr255 &pathName);
  252.         GetPathNameFromDirID(file->fFileSpec.vRefNum, file->fFileSpec.parID, pathName);
  253.         fprintf(stderr, "Name of NewPrefsLocationFile file: ");
  254.         fprintf(stderr, "path = '%s', ", (char*) pathName);
  255.         fprintf(stderr, "name = '%s'\n", (char*)s);
  256. #endif
  257.         fi.Success();
  258.     }
  259.     else // fail
  260.         fi.ReSignal();
  261. }
  262.