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

  1. // Copyright Â© 1992 Peter Speck, speck@dat.ruc.dk. All rights reserved.
  2. // UNewsApplCmds.cp
  3.  
  4. #include "UNewsApplCmds.h"
  5. #include "UNewsAppl.h"
  6. #include "UGroupTreeDoc.h"
  7. #include "UGroupTree.h"
  8. #include "UGroupTreeCmds.h"
  9. #include "UPrefsFileMgr.h"
  10. #include "UProgress.h"
  11. #include "UProgressCache.h"
  12. #include "UArticleCache.h"
  13. #include "UArticleTextCache.h"
  14. #include "UNntp.h"
  15. #include "UMacTCP.h"
  16. #include "Tools.h"
  17. #include "FileTools.h"
  18. #include "NetAsciiTools.h"
  19. #include "UPassword.h"
  20. #include "UThread.h"
  21. #include "UPreferencesView.h"
  22. #include "ViewTools.h"
  23.  
  24. #include <ErrorGlobals.h>
  25. #include <RsrcGlobals.h>
  26.  
  27. #include <UDialog.h>
  28.  
  29. #include <Resources.h>
  30. #include <ToolUtils.h>
  31. #include <Folders.h>
  32. #include <Errors.h>
  33. #include <Script.h>
  34. #include <Packages.h>
  35.  
  36. #pragma segment MyMisc
  37.  
  38. #define qDebugPrefsBrief qDebug
  39. #define qDebugPrefs qDebugPrefsBrief & 1
  40.  
  41. #if qDebug & 1
  42. #define macroLog(x) fprintf(stderr, x)
  43. #else
  44. #define macroLog(x)
  45. #endif
  46.  
  47. const kCurrentPrefsVersion = 27;
  48. const kMinimumPrefsVersion = 17;
  49.  
  50. void CloseDownTheManagers()
  51. {
  52.     CloseDownUArticleCache();
  53.     CloseDownUArticleTextCache();
  54.     CloseDownUNntp();
  55.     CloseDownUMacTCP();
  56.     CloseDownUThread();
  57. //    CloseDownUProgressCache(); Main thread as a progress window left in it
  58. }
  59.  
  60. TOpenPrefsCommand::TOpenPrefsCommand()
  61. {
  62. }
  63.  
  64. pascal void TOpenPrefsCommand::Initialize()
  65. {
  66.     inherited::Initialize();
  67.     fGroupTreeFile = nil;
  68.     fDocFileList = nil;
  69.     fOldPrefsVersion = 0;
  70.     fMinNeededVersion = kCurrentPrefsVersion;
  71. #if qDebugPrefs
  72.     fprintf(stderr, "Creates TOpenPrefsCommand at $%lx\n", this);
  73. #endif
  74. }
  75.  
  76. void TOpenPrefsCommand::IOpenPrefsCommand(TList *docList)
  77. {
  78.     inherited::ICommand(cUpdatePrefs, nil, false, false, nil);
  79.     fDocFileList = docList;
  80. }
  81.  
  82. pascal void TOpenPrefsCommand::Free()
  83. {
  84. #if qDebugPrefs
  85.     fprintf(stderr, "Frees TOpenPrefsCommand at $%lx\n", this);
  86. #endif
  87.     if (fDocFileList)
  88.     {
  89.         fDocFileList->FreeAll();
  90.         fDocFileList->Free(); fDocFileList = nil;
  91.     }
  92.     FreeIfObject(fGroupTreeFile); fGroupTreeFile = nil;
  93.     inherited::Free();
  94. }
  95.  
  96. pascal void TOpenPrefsCommand::DoIt()
  97. {
  98.     FailInfo fi;
  99.     if (fi.Try())
  100.     {
  101.         macroLog("Updating prefs file location\n");
  102.         FailInfo fi2;
  103.         if (fi2.Try())
  104.         {
  105.             CStr255 name;
  106.             MyGetIndString(name, kPrefsFileName);
  107.             MoveFileToPrivate(name);
  108.             fi2.Success();
  109.         }
  110.         else // fail
  111.         {
  112.             // silent, don't care
  113.         }
  114.  
  115.         macroLog("Opens prefs file\n");
  116.         OpenPrefsFile();
  117.         macroLog("Upgrades prefs\n");
  118.         UpgradePrefs();
  119.  
  120.         macroLog("Updating folder locations\n");
  121.         UpdateFolders();
  122.  
  123.         macroLog("Creates progress indicator\n");
  124.         gCurProgress->SetProgressType(true, false);
  125.         gCurProgress->SetWorkToDo(kCandyStribes);
  126.         gCurProgress->SetTitle(kStartupTitle);
  127.         gCurProgress->SetUpperText(kStartupUpperText);
  128.         TWindow *window = gCurProgress->GetWindow();
  129.         window->Center(true, true, window->IsModal() );
  130.  
  131.         macroLog("Init UNntp, UArticleTextCache, UArticleCache etc\n");
  132.         InitUNetAsciiTools();
  133.         InitUPassword();
  134.         InitUNntp();
  135.         InitUArticleTextCache();
  136.         InitUArticleCache();
  137.  
  138.         macroLog("Opens group tree document\n");
  139.         OpenGroupTreeFile();
  140.         
  141.         if (fUpdateServerInfo)
  142.         {
  143.             macroLog("Asks for server info\n");
  144.             AskNewsServer();
  145.         }
  146.         else
  147.         {
  148.             macroLog("Checks server IP\n");
  149.             CheckNewsServerIP();
  150.         }
  151.  
  152.         macroLog("Changes prefs valid state to OK\n");
  153.         gPrefsFileMgr->SetPrefsValidationState(true);
  154.         
  155.         if (gNewsAppl->GetGroupTreeDoc()->GetGroupTree()->TreeIsEmpty())
  156.         {
  157.             macroLog("Rebuilds list of all groups\n");
  158.             BuildListOfAllGroups();
  159.         }
  160.  
  161.         macroLog("Changes state to real-running\n");
  162.         gNewsAppl->fApplIsRunning = true;
  163.         InvalidateMenus(); // menus change as we're real running now
  164.         
  165.         macroLog("Removes progress bar\n");
  166.         gCurProgress->WorkDone();
  167.         
  168.         macroLog("Opens other Finderâ„¢ documents\n");
  169.         gApplication->OpenOld(cOpen, fDocFileList);
  170.         
  171.         if (fUpdateServerInfo)
  172.         {
  173.             // actually: is prefs file new, a sort of cPrefsFileFinderNew
  174.             macroLog("Creates new empty documents as the prefs is new\n");
  175.             gNewsAppl->GetGroupTreeDoc()->CreateGroupTreeWindow();
  176.             gNewsAppl->OpenNew(cNewGroupListDoc);
  177.         }
  178.         
  179.         if (gPrefs->GetBooleanPrefs('ChNw'))
  180.         {
  181.             FailInfo checkFI;
  182.             if (checkFI.Try())
  183.             {
  184.                 macroLog("Checks for new groups\n");
  185.                 TUpdateListOfAllGroupsCommand *cmd = new TUpdateListOfAllGroupsCommand();
  186.                 cmd->IUpdateListOfAllGroupsCommand(gNewsAppl->fGroupTreeDoc, false);
  187.                 cmd->DoIt();
  188.                 cmd->Free(); cmd = nil;
  189.                 checkFI.Success();
  190.             }
  191.             else
  192.                 if (checkFI.error)
  193.                     gApplication->ShowError(checkFI.error, checkFI.message);
  194.         }
  195.  
  196.         macroLog("Restores old window state\n");
  197.         gNewsAppl->RestoreWindowState();
  198.  
  199.         macroLog("Checks for old pre-final version\n");
  200.         CheckPreFinalVersion();
  201.         
  202.         macroLog("Done. We're running.\n");
  203.         fi.Success();
  204.     }
  205.     else // fail
  206.     {
  207.         gCurProgress->WorkDone();
  208.         gApplication->DoMenuCommand(cQuit);
  209.         FailNewMessage(fi.error, fi.message, messageOpenPrefsFailed);
  210.     }
  211. }
  212.  
  213. TFile *TOpenPrefsCommand::GetSpecialFile(OSType fileType)
  214. {
  215.     CObjectIterator iter(fDocFileList);
  216.     for (TFile *aFile = (TFile *)iter.FirstObject(); iter.More(); aFile = (TFile *)iter.NextObject())
  217.     {
  218.         if (aFile->fFileType == fileType && aFile->fCreator == kSignature)
  219.         {
  220.             fDocFileList->Delete(aFile);
  221.             return aFile;
  222.         }
  223.     }
  224.     return nil;
  225. }
  226.  
  227. void TOpenPrefsCommand::OpenPrefsFile()
  228. {
  229.     FSSpec spec;
  230.     TFile *file = GetSpecialFile(kPrefsFileType);
  231.     if (file)
  232.     {
  233.         file->GetFileSpec(spec);
  234.         FreeIfObject(file); file = nil;
  235.     }
  236.     else
  237.     {
  238.         GetPrefsDocLocation(spec);
  239.         CStr255 name;
  240.         MyGetIndString(name, kPrefsFileName);
  241.         CopyCString2String(name, spec.name);
  242.     }
  243.     Boolean targetIsFolder, wasAliased;
  244.     OSErr err = ResolveAliasFile(spec, true, targetIsFolder, wasAliased);
  245.     if (err != fnfErr)
  246.         FailOSErr(err);
  247.     *( (short*) SFSaveDisk) = -spec.vRefNum;
  248.     *( (long*) CurDirStore) = spec.parID;
  249.     PPrefsFileMgr *pfm = new PPrefsFileMgr();
  250.     pfm->IPrefsFileMgr(spec);
  251.     gPrefsFileMgr->Load();
  252. }
  253.  
  254. void TOpenPrefsCommand::OpenGroupTreeFile()
  255. {
  256.     if (!fGroupTreeFile)
  257.     {
  258. #if qDebugPrefs
  259.         fprintf(stderr, "Had no GroupTree file _object_, creates one\n");
  260. #endif
  261.         fGroupTreeFile = GetSpecialFile(kGroupTreeDocFileType);
  262.         if (!fGroupTreeFile)
  263.             fGroupTreeFile = gApplication->DoMakeFile(cNewGroupTreeDoc);
  264.     }
  265. #if qDebug
  266.     if (!IsObject(fGroupTreeFile))
  267.         ProgramBreak("fGroupTreeFile is not object");
  268. #endif
  269.     if (!FileExist(fGroupTreeFile))
  270.     {
  271. #if qDebugPrefs
  272.         fprintf(stderr, "GroupTree _file_ did not exist, does not read it...\n");
  273. #endif
  274.         fGroupTreeFile->Free(); fGroupTreeFile = nil;
  275.         gApplication->OpenNew(cNewGroupTreeDoc);
  276.         return;
  277.     }
  278.     ResolveAliasFile(fGroupTreeFile);
  279.     TFile *file = fGroupTreeFile; fGroupTreeFile = nil;
  280.     gNewsAppl->OpenOneOld(file);
  281. }
  282.  
  283. void TOpenPrefsCommand::UpgradePrefs()
  284. {
  285.     gPrefsFileMgr->SetPrefsValidationState(false);
  286.     const long kNewPrefs = 0;
  287.     fOldPrefsVersion = kNewPrefs;
  288.     if (gPrefs->PrefExists('Vers'))
  289.         fOldPrefsVersion = gPrefs->GetLongPrefs('Vers');
  290.     long fMinNeededVersion = kCurrentPrefsVersion;
  291.     if (gPrefs->PrefExists('Ver-'))
  292.         fMinNeededVersion = gPrefs->GetLongPrefs('Ver-');
  293.     if (kCurrentPrefsVersion < fMinNeededVersion)
  294.     {
  295.         gApplication->ShowError(errTooNewFileFormat, messageUsePrefs);
  296.         fOldPrefsVersion = kNewPrefs;
  297.         gPrefs->DeleteAll();
  298.     }
  299. #if qDebugPrefsBrief
  300.     if (qDebugPrefs || fOldPrefsVersion != kCurrentPrefsVersion)
  301.         fprintf(stderr, "Version of prefs data: %ld -> %ld\n", fOldPrefsVersion, kCurrentPrefsVersion);
  302. #endif
  303.     TextStyle ts;
  304.     fUpdateServerInfo = false;
  305.  
  306.     if (fOldPrefsVersion == kNewPrefs)
  307.     {
  308.         fUpdateServerInfo = true;
  309.         gPrefs->SetStringPrefs('SvNa', "");
  310.         gPrefs->SetLongPrefs('SvIP', 0);
  311.         gPrefs->SetLongPrefs('STio', 45);
  312.         gPrefs->SetShortPrefs('artS', 0);
  313.         gPrefs->SetShortPrefs('disS', 0);
  314.         gPrefs->SetBooleanPrefs('BiAs', true);
  315.         gPrefs->SetBooleanPrefs('UUna', false);
  316.         gPrefs->SetBooleanPrefs('NaOK', false);
  317.         gPrefs->SetStringPrefs('@adr', "");
  318.         gPrefs->SetStringPrefs('Name', "");
  319.         gPrefs->SetStringPrefs('Orga', "");
  320.         gPrefs->SetBooleanPrefs('DUSi', false);
  321.         gPrefs->SetBooleanPrefs('EdHe', false);
  322.         gPrefs->SetBooleanPrefs('EdSi', false);
  323.         gPrefs->SetBooleanPrefs('Head', false);
  324.         gPrefs->SetLongPrefs('STio', 45);
  325.         gPrefs->SetLongPrefs('Mntp', 5);
  326.         gPrefs->SetLongPrefs('Tntp', 2 * 60 * 60);
  327.         MAGetTextStyle(kArticleViewTextStyle, ts);
  328.         gPrefs->SetTextStylePrefs('TSar', ts);
  329.         MAGetTextStyle(kDiscListViewTextStyle, ts);
  330.         gPrefs->SetTextStylePrefs('TSdi', ts);
  331.         MAGetTextStyle(kGroupListTextStyle, ts);
  332.         gPrefs->SetTextStylePrefs('TSgl', ts);
  333.         MAGetTextStyle(kGroupTreeTextStyle, ts);
  334.         gPrefs->SetTextStylePrefs('TSgt', ts);
  335.         gPrefs->SetBooleanPrefs('BLau', false);
  336.         gPrefs->SetBooleanPrefs('BLOP', true);
  337.         gPrefs->DeletePrefs('DLgo');
  338.         gPrefs->DeletePrefs('EDNa');
  339.         gPrefs->DeletePrefs('BLNa');
  340.         gPrefs->DeletePrefs('WGup');
  341.         gPrefs->DeletePrefs('WGTp');
  342.         gPrefs->SetStringPrefs('UNam', "");
  343.         gPrefs->SetBooleanPrefs('EuOp', false);
  344.         ;    // 12 is only folder change
  345.         gPrefs->SetLongPrefs('WrLn', 75);
  346.         gPrefs->DeletePrefs('BLid');
  347.         gPrefs->DeletePrefs('EDid');
  348.         gPrefs->SetBooleanPrefs('AuUp', false);
  349.     }
  350.  
  351.     if (fOldPrefsVersion <= 18)
  352.         gPrefs->SetShortPrefs('SvPo', 119);
  353.  
  354.     if (fOldPrefsVersion <= 19)
  355.     {
  356.         gPrefs->SetBooleanPrefs('ChNw', false);
  357.         gPrefs->SetBooleanPrefs('WSav', true);
  358.     }
  359.  
  360.     if (fOldPrefsVersion <= 20)
  361.         ; // bogous AMem set (as short)
  362.  
  363.     if (fOldPrefsVersion <= 21)
  364.         gPrefs->SetLongPrefs('AMem', 100 * 1024);
  365.  
  366.     if (fOldPrefsVersion <= 22)
  367.         gPrefs->SetLongPrefs('XHSz', 25);
  368.  
  369.     if (fOldPrefsVersion <= 23)
  370.         gPrefs->SetStringPrefs('Tran', "Latin1/US-ASCII (In/Out)");
  371.  
  372.     if (fOldPrefsVersion <= 24)
  373.         gPrefs->SetLongPrefs('Mart', 500);
  374.  
  375.     if (fOldPrefsVersion <= 25)
  376.         gPrefs->SetBooleanPrefs('2022', false);
  377.  
  378.     if (fOldPrefsVersion <= 26)
  379.         gPrefs->SetBooleanPrefs('AlAu', false);
  380.  
  381.     if (fOldPrefsVersion <= 27)
  382.         gPrefs->SetLongPrefs('CNAT', 10);
  383.  
  384. // --insert updates above this line ----------------------------------------
  385.  
  386. // At last!
  387.     if (kMinimumPrefsVersion > fMinNeededVersion)
  388.         gPrefs->SetLongPrefs('Ver-', kMinimumPrefsVersion);
  389.     gPrefs->SetLongPrefs('Vers', kCurrentPrefsVersion);
  390. }
  391.  
  392. void TOpenPrefsCommand::AskNewsServer()
  393. {
  394.     TWindow *window = gViewServer->NewTemplateWindow(kAskNewsServerView, nil);
  395. #if qDebug
  396.     if (!window)
  397.         ProgramBreak("Could not create kAskNewsServerView window");
  398. #endif
  399.     window->Open();
  400.     Boolean foundServer = false;
  401.     while (!foundServer)
  402.     {
  403.         window->Show(true, kRedraw);
  404.         CStr255 name("");
  405.         while (name.Length() < 1) // needs at least one char
  406.         {
  407.             while (true)
  408.             {
  409.                 IDType dismisser = MyPoseModally(window);
  410.                 if (dismisser == 'SOpt')
  411.                 {
  412.                     DoNewsServerPreferencesDialog();
  413.                     continue;
  414.                 }
  415.                 if (dismisser == 'ok  ')
  416.                     break;
  417.                 window->CloseByUser();
  418.                 Failure(0, 0);
  419.             }
  420.             TEditText *et = (TEditText*)window->FindSubView(kNewsServerNameViewID);
  421.             if (et)
  422.                 et->GetText(name);
  423.         }
  424.         window->Show(false, !kRedraw);
  425.         FailInfo fi;
  426.         if (fi.Try())
  427.         {
  428.             UseNewServer(name);
  429.             foundServer = true;
  430.             fi.Success();
  431.         }
  432.         else
  433.             if (fi.error)
  434.                 gApplication->ShowError(fi.error, fi.message);
  435.     }
  436.     window->CloseByUser();
  437. }
  438.  
  439. void TOpenPrefsCommand::UseNewServer(CStr255 &name)
  440. {
  441.     PNntp *nntp = nil;
  442.     VOLATILE(nntp);
  443.     FailInfo fi;
  444.     if (fi.Try())
  445.     {
  446.         gCurProgress->SetText(kNewServerObtainingAddress);
  447.         gCurProgress->StartProgress(true);
  448.  
  449.         short pos = name.Pos(" ");
  450.         if (pos)
  451.         {
  452.             CStr255 num = name;
  453.             num.Delete(1, pos);
  454.             name.Delete(pos, name.Length() - pos + 1);
  455.             long port;
  456.             StringToNum(num, port);
  457.             gPrefs->SetShortPrefs('SvPo', short(port));
  458.         }
  459.         long ip;
  460.         if (UsesFakeNntp())
  461.             ip = 0x01020304;
  462.         else
  463.             ip = DotName2IP(name);
  464.         gPrefs->SetStringPrefs('SvNa', name);
  465.         gPrefs->SetLongPrefs('SvIP', ip);
  466.         gCurProgress->Worked(0);
  467.  
  468.         gNntpCache->FlushCache();
  469.         
  470.         if (!IsOptionKeyDown())
  471.         {
  472.             nntp = gNntpCache->GetNntp(); // checks that we can connect
  473.             gCurProgress->SetText(kNewServerBasicTest);
  474.             nntp->ExamineNewsServer();  // and that it can be used
  475.             gNntpCache->ReturnNntp(nntp); nntp = nil;
  476.         }
  477.  
  478.         fi.Success();
  479.     }
  480.     else // fail
  481.     {
  482.         gNntpCache->DiscardNntp(nntp); nntp = nil;
  483.         gCurProgress->WorkDone();
  484.         if (fi.error == authNameErr)
  485.             FailNewMessage(errCouldNotFindServer, fi.message, messageUseNewNewsServer);
  486.         else
  487.             FailNewMessage(fi.error, fi.message, messageUseNewNewsServer);
  488.     }
  489. }
  490.  
  491. void TOpenPrefsCommand::CheckNewsServerIP()
  492. {
  493.     PNntp *nntp = nil;
  494.     VOLATILE(nntp);
  495.     FailInfo fi;
  496.     if (fi.Try())
  497.     {
  498.         gCurProgress->SetText(kNewServerObtainingAddress);
  499.         gCurProgress->StartProgress(true);
  500.         long old_ip = gPrefs->GetLongPrefs('SvIP');
  501.         CStr255 name;
  502.         gPrefs->GetStringPrefs('SvNa', name);
  503.         long new_ip;
  504.         if (UsesFakeNntp())
  505.             new_ip = 0x01020304;
  506.         else
  507.             new_ip = DotName2IP(name);
  508.         if (new_ip != old_ip)
  509.         {
  510. #if qDebug
  511.             fprintf(stderr, "The newsserver IP has changed $%ld -> $%ld\n", old_ip, new_ip);
  512. #endif
  513.             gPrefs->SetLongPrefs('SvIP', new_ip);
  514.             gNntpCache->FlushCache();
  515.             if (!IsOptionKeyDown())
  516.             {
  517.                 nntp = gNntpCache->GetNntp(); // checks that we can connect
  518.                 gCurProgress->SetText(kNewServerBasicTest);
  519.                 nntp->ExamineNewsServer();  // and that it can be used
  520.                 gNntpCache->ReturnNntp(nntp); nntp = nil;
  521.             }    
  522.         }
  523.         gCurProgress->Worked(0);
  524.         fi.Success();
  525.     }
  526.     else // fail
  527.     {
  528.         gNntpCache->DiscardNntp(nntp); nntp = nil;
  529.         gCurProgress->WorkDone();
  530.         if (fi.error == authNameErr)
  531.             FailNewMessage(errCouldNotFindServer, fi.message, messageUpdateServerIP);
  532.         else
  533.             FailNewMessage(fi.error, fi.message, messageUpdateServerIP);
  534.     }
  535. }
  536.  
  537. void TOpenPrefsCommand::BuildListOfAllGroups()
  538. {
  539.     FailInfo fi;
  540.     if (fi.Try())
  541.     {
  542.         gNewsAppl->GetGroupTreeDoc()->RebuildGroupTree();
  543.         fi.Success();
  544.     }
  545.     else // fail
  546.     {
  547.         gNewsAppl->GetGroupTreeDoc()->DoInitialState(); // discard changes
  548.         fi.ReSignal();
  549.     }
  550. }
  551.  
  552. void TOpenPrefsCommand::UpdateFolders()
  553. {
  554.     FailInfo fi;
  555.     if (fi.Try())
  556.     {
  557.         if (fOldPrefsVersion <= 12)
  558.         {
  559.             MovePrefFileToTrash("Nuntius data files");
  560.             CStr255 name;
  561.             MyGetIndString(name, kGroupTreeFileName);
  562.             MoveFileToPrivate(name);
  563.             MoveGroupLists();
  564.         }
  565.         fi.Success();
  566.     }
  567.     else // fail, but silent
  568.     {
  569. #if qDebug
  570.         fprintf(stderr, "Got exeption in UpdateSystemFolder, ignores it\n");
  571.         fprintf(stderr, "- err = %ld\n", long(fi.error));
  572. #endif
  573.     }
  574. }
  575.  
  576. void TOpenPrefsCommand::GetNuntiusTrashFolder(FSSpec &spec)
  577. {
  578.     OSErr err = FindFolder(spec.vRefNum, kTrashFolderType, kCreateFolder, 
  579.         spec.vRefNum, spec.parID);
  580.     if (err != noErr)
  581.     {
  582. #if qDebug
  583.         fprintf(stderr, "Could not create trash folder for obsolote files, err = %ld\n", long(err));
  584. #endif
  585.         FailOSErr(err);
  586.     }
  587.  
  588.     CStr255 s;
  589.     MyGetIndString(s, kObsoloteFolderName);
  590.     CopyCString2String(s, spec.name);
  591.     long createdDirID;
  592.     err = FSpDirCreate(spec, smRoman, createdDirID);
  593.     if (err != noErr && err != dupFNErr)
  594.     {
  595. #if qDebug
  596.         fprintf(stderr, "Could not create 'Obsolote Nuntius files' trash folder, err = %ld\n", long(err));
  597. #endif
  598.         FailOSErr(err);
  599.     }
  600. #if qDebugPrefs
  601.     fprintf(stderr, "Nuntius trash folder created\n");
  602. #endif
  603. }
  604.  
  605. void TOpenPrefsCommand::MoveToTrash(const FSSpec &spec)
  606. {
  607.     CInfoPBRec pb;
  608.     pb.dirInfo.ioFDirIndex = 0;
  609.     pb.dirInfo.ioDrDirID = spec.parID;
  610.     pb.dirInfo.ioVRefNum = spec.vRefNum;
  611.     pb.dirInfo.ioNamePtr = spec.name;
  612.     PBGetCatInfoSync(&pb);
  613.     if (pb.dirInfo.ioResult != noErr) // did not exist
  614.         return;
  615.     FSSpec trashSpec;
  616.     GetNuntiusTrashFolder(trashSpec);
  617.     FailOSErr(FSpCatMove(spec, trashSpec));
  618. }
  619.  
  620. void TOpenPrefsCommand::MovePrefFileToTrash(const CStr255 &name)
  621. {
  622. #if qDebugPrefs
  623.     fprintf(stderr, "Moves file '%s' to trash\n", (char*)name);
  624. #endif
  625.     FSSpec spec;
  626.     FailOSErr(FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder, spec.vRefNum, spec.parID));
  627.     CopyCString2String(name, spec.name);
  628.     MoveToTrash(spec);
  629. }
  630.  
  631. void TOpenPrefsCommand::MoveFileToPrivate(const CStr255 &name)
  632. {
  633.     FSSpec fromSpec;
  634.     FailOSErr(FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder, fromSpec.vRefNum, fromSpec.parID));
  635.     CopyCString2String(name, fromSpec.name);
  636.     if (!FileExist(fromSpec))
  637.         return;
  638. #if qDebugPrefs
  639.     fprintf(stderr, "Moves file '%s' to private files\n", (char*)name);
  640. #endif
  641.     FSSpec destSpec;
  642.     FailOSErr(FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder, destSpec.vRefNum, destSpec.parID));
  643.     CStr255 folderName;
  644.     MyGetIndString(folderName, kPrivateFilesFolderName);
  645.     if (UsesFakeNntp())
  646.         folderName += " (DB)";
  647.     CopyCString2String(folderName, destSpec.name);
  648.     FailOSErr(FSpCatMove(fromSpec, destSpec));
  649. }
  650.  
  651. void TOpenPrefsCommand::MoveGroupLists()
  652. {
  653.     short vRefNum; long dirID;
  654.     FailOSErr(FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder, vRefNum, dirID));
  655.     CStr255 name("");
  656.     HParamBlockRec pbf;
  657.     pbf.fileParam.ioFDirIndex = 1;
  658.     while (true)
  659.     {
  660.         pbf.fileParam.ioVRefNum = vRefNum;
  661.         pbf.fileParam.ioDirID = dirID;
  662.         pbf.fileParam.ioNamePtr = (StringPtr)name;
  663.         pbf.fileParam.ioFVersNum = 0;
  664.         if (PBHGetFInfoSync(&pbf) != noErr)
  665.             break;
  666.         pbf.fileParam.ioFDirIndex++;
  667.         if (pbf.fileParam.ioFlFndrInfo.fdType != kGroupListDocFileType)
  668.             continue;
  669. #if qDebugPrefs
  670.         fprintf(stderr, "Moves the grouplist '%s' to private files\n", (char*)name);
  671. #endif
  672.         pbf.fileParam.ioFDirIndex = 1;
  673.         MoveFileToPrivate(name);
  674.     }
  675. }
  676.  
  677. void TOpenPrefsCommand::CheckPreFinalVersion()
  678. {
  679.     VersRecHndl vH = nil;
  680.     vH = VersRecHndl(GetResource('vers', 1));
  681.     FailNILResource(Handle(vH));
  682.     FailNIL(vH);
  683.     if ((*vH)->numericVersion.stage == 0x80)
  684.         return;
  685.     unsigned long nowDT;
  686.     long compileDT;
  687.     CStr255 s;
  688.     MyGetIndString(s, kFECompileDateTimeNumber);
  689.     StringToNum(s, compileDT);
  690.     GetDateTime(nowDT);
  691.     if (nowDT - compileDT < 30 * 24 * 60 * 60)
  692.         return;
  693.     StdAlert(phOldPreFinalVersionWarning);
  694. }
  695.