home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Telnet 2.7b5 / source / Preferences / prefs.c next >
Encoding:
C/C++ Source or Header  |  1995-04-03  |  12.3 KB  |  377 lines  |  [TEXT/CWIE]

  1. /****************************************************************
  2. *    NCSA Telnet for the Macintosh                                *
  3. *                                                                *
  4. *    National Center for Supercomputing Applications                *
  5. *    Software Development Group                                    *
  6. *    152 Computing Applications Building                            *
  7. *    605 E. Springfield Ave.                                        *
  8. *    Champaign, IL  61820                                        *
  9. *                                                                *
  10. *    Copyright (c) 1993,                                            *
  11. *    Board of Trustees of the University of Illinois                *
  12. *****************************************************************
  13. *    Revisions:
  14. *    5/93    Telnet 2.6:    Rewritten entirely -- Jim Browne
  15. */
  16.  
  17. #ifdef MPW
  18. #pragma segment Configure
  19. #endif
  20.  
  21.  
  22. #include "prefs.proto.h"
  23. #include "mainseg.proto.h"        // For quit proto
  24. #include "errors.proto.h"
  25.  
  26. FTPServerPrefs*        gFTPServerPrefs=NULL;
  27. ApplicationPrefs*    gApplicationPrefs=NULL;
  28.  
  29. void PREFSUnload(void) { }
  30.  
  31.  
  32. OSErr OpenPreferencesFile( void)
  33. {
  34.     Str255    **PreferencesFileNameHdl;
  35.     OSErr     err;
  36.     
  37.     PreferencesFileNameHdl = (Str255**)GetString(PREFERENCES_FILE_NAME_STR_ID);
  38.     if (PreferencesFileNameHdl == NULL) {
  39.         DebugStr("\pSomeone has deleted the prefs file name resource!");
  40.         forcequit();
  41.         }
  42.     
  43.     HLock((Handle)PreferencesFileNameHdl);
  44.         
  45.     /* look for an existing settings file. */
  46.     /* first, try the application folder */
  47.     TelInfo->SettingsFile=HOpenResFile(TelInfo->ApFolder.vRefNum, TelInfo->ApFolder.parID,
  48.                                             (StringPtr)*PreferencesFileNameHdl,fsRdWrShPerm);
  49.  
  50.     if (TelInfo->SettingsFile == -1) /* Look in System Folder */
  51.         {
  52.         TelInfo->SettingsFile = HOpenResFile(TelInfo->SysFolder.vRefNum, 
  53.                                                 TelInfo->SysFolder.parID, 
  54.                                             (StringPtr)*PreferencesFileNameHdl, fsRdWrShPerm);
  55.         }
  56.  
  57.     if (TelInfo->SettingsFile == -1) /* Look in Preferences Folder */
  58.         {
  59.         TelInfo->SettingsFile = HOpenResFile(TelInfo->PrefFolder.vRefNum, 
  60.                                                 TelInfo->PrefFolder.parID,
  61.                                             (StringPtr)*PreferencesFileNameHdl, fsRdWrShPerm);
  62.         }
  63.  
  64.     if (TelInfo->SettingsFile == -1)
  65.           {
  66.         if ((err = HCreate(TelInfo->PrefFolder.vRefNum, TelInfo->PrefFolder.parID,
  67.                         (StringPtr)*PreferencesFileNameHdl, 'NCSA', 'pref')) != noErr)
  68.             FatalAlert(CANT_CREATE_PREFS, 120, err);
  69.  
  70.         HCreateResFile(TelInfo->PrefFolder.vRefNum, TelInfo->PrefFolder.parID,
  71.                     (StringPtr)*PreferencesFileNameHdl);
  72.  
  73.         if (ResError() != noErr)
  74.             FatalAlert(CANT_CREATE_PREFS, 120, ResError());
  75.  
  76.         TelInfo->SettingsFile = HOpenResFile(TelInfo->PrefFolder.vRefNum, 
  77.                                                 TelInfo->PrefFolder.parID,
  78.                                             (StringPtr)*PreferencesFileNameHdl, fsRdWrShPerm);
  79.  
  80.         if (TelInfo->SettingsFile == -1)
  81.             FatalAlert(CANT_CREATE_PREFS, 120, ResError());        // Give up
  82.             
  83.         if ((err = NewPreferences()) != noErr) return(err);
  84.           }
  85.         
  86.     UseResFile(TelInfo->SettingsFile);
  87.     ReleaseResource((Handle)PreferencesFileNameHdl);
  88.  
  89.     return    noErr;
  90. }
  91.  
  92. OSErr NewPreferences(void)
  93. {
  94.     ApplicationPrefs    **AppPrefsHdl;
  95.     FTPServerPrefs        **FTPPrefsHdl;
  96.     SessionPrefs        **DefaultSessionPrefs;
  97.     TerminalPrefs        **DefaultTerminalPrefs;
  98.         
  99.     // Get the master copies from the application's resource fork
  100.     
  101.     AppPrefsHdl = (ApplicationPrefs **)GetResource(APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_APPID);
  102.     if ((ResError() != noErr) || (AppPrefsHdl == NULL)) return(ResError());
  103.     DetachResource((Handle)AppPrefsHdl);
  104.     
  105.     FTPPrefsHdl = (FTPServerPrefs **)GetResource(FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_APPID);
  106.     if ((ResError() != noErr) || (FTPPrefsHdl == NULL)) return(ResError());
  107.     DetachResource((Handle)FTPPrefsHdl);
  108.  
  109.     DefaultSessionPrefs = (SessionPrefs **)GetResource(SESSIONPREFS_RESTYPE, SESSIONPREFS_APPID);
  110.     if ((ResError() != noErr) || (DefaultSessionPrefs == NULL)) return(ResError());
  111.     DetachResource((Handle)DefaultSessionPrefs);
  112.     
  113.     DefaultTerminalPrefs = (TerminalPrefs **)GetResource(TERMINALPREFS_RESTYPE, TERMINALPREFS_APPID);
  114.     if ((ResError() != noErr) || (DefaultTerminalPrefs == NULL)) return(ResError());
  115.     DetachResource((Handle)DefaultTerminalPrefs);
  116.  
  117.     // Add them to the Preferences file
  118.     
  119.     UseResFile(TelInfo->SettingsFile);
  120.     if (ResError() != noErr) return(ResError());
  121.     AddResource((Handle)AppPrefsHdl, APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_ID, "\p");
  122.     if (ResError() != noErr) return(ResError());
  123.     AddResource((Handle)FTPPrefsHdl,FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_ID, "\p");
  124.     if (ResError() != noErr) return(ResError());
  125.     AddResource((Handle)DefaultSessionPrefs,SESSIONPREFS_RESTYPE, SESSIONPREFS_APPID, "\p<Default>");
  126.     if (ResError() != noErr) return(ResError());
  127.     AddResource((Handle)DefaultTerminalPrefs,TERMINALPREFS_RESTYPE, TERMINALPREFS_APPID, "\p<Default>");
  128.     if (ResError() != noErr) return(ResError());
  129.  
  130.     // Update the preferences file and release the resources
  131.     
  132.     UpdateResFile(TelInfo->SettingsFile);
  133.     ReleaseResource((Handle)AppPrefsHdl);
  134.     ReleaseResource((Handle)FTPPrefsHdl);
  135.     ReleaseResource((Handle)DefaultSessionPrefs);
  136.     ReleaseResource((Handle)DefaultTerminalPrefs);
  137.     return(ResError());
  138. }
  139.  
  140. OSErr LoadPreferences(void)
  141. {
  142.     ApplicationPrefs    **AppPrefsHdl;
  143.     FTPServerPrefs        **FTPPrefsHdl;
  144.     
  145.     UseResFile(TelInfo->SettingsFile);
  146.     if (ResError() != noErr) return(ResError());
  147.     
  148.     AppPrefsHdl = (ApplicationPrefs **)GetResource(APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_ID);
  149.     if ((ResError() != noErr) || (AppPrefsHdl == NULL)) return(ResError());
  150.  
  151.     HLock((Handle) AppPrefsHdl);
  152.     BlockMove(*AppPrefsHdl, gApplicationPrefs, sizeof(ApplicationPrefs));
  153.     ReleaseResource((Handle) AppPrefsHdl);
  154.     
  155.     FTPPrefsHdl = (FTPServerPrefs **)GetResource(FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_ID);
  156.     if ((ResError() != noErr) || (FTPPrefsHdl == NULL)) return(ResError());
  157.  
  158.     HLock((Handle) FTPPrefsHdl);
  159.     BlockMove(*FTPPrefsHdl, gFTPServerPrefs, sizeof(FTPServerPrefs));
  160.     ReleaseResource((Handle) FTPPrefsHdl);
  161.     
  162.     if (TelInfo->haveColorQuickDraw)
  163.     {
  164.         UseResFile(TelInfo->SettingsFile);
  165.         TelInfo->AnsiColors = GetNewPalette(10000);
  166.         if (TelInfo->AnsiColors == NULL) //get the Application's copy instead
  167.         {
  168.             UseResFile(TelInfo->ApplicationFile);
  169.             TelInfo->AnsiColors = GetNewPalette(9999);
  170.             DetachResource((Handle)TelInfo->AnsiColors);
  171.             UseResFile(TelInfo->SettingsFile);
  172.             AddResource((Handle)TelInfo->AnsiColors, 'pltt', 10000, "\pANSI Colors");//make the new resource
  173.             UpdateResFile(TelInfo->SettingsFile);
  174.         }
  175.         DetachResource((Handle)TelInfo->AnsiColors);
  176.     }
  177.     CheckPrefsVersion();
  178.     return(noErr);
  179. }
  180.  
  181. OSErr SaveAppPreferences(void)
  182. {
  183.     ApplicationPrefs    **AppPrefsHdl;
  184.     Boolean                UserHasBeenAlerted = FALSE, UserResponse;
  185.     
  186.     UseResFile(TelInfo->SettingsFile);
  187.     if (ResError() != noErr) return(ResError());
  188.     
  189.     AppPrefsHdl = (ApplicationPrefs **)GetResource(APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_ID);
  190.     if ((ResError() != noErr) || (AppPrefsHdl == NULL)) return(ResError());
  191.  
  192.     HLock((Handle) AppPrefsHdl);
  193.     if (gApplicationPrefs->version < (*AppPrefsHdl)->version) 
  194.     {
  195.         UserResponse = AskUserAlert(PREFS_ARE_NEWER_ID, TRUE);        // Cancel is default
  196.         if (UserResponse == TRUE) return(noErr);    // User doesn't want to destroy prefs
  197.         UserHasBeenAlerted = TRUE;                    // Don't ask the user twice!
  198.     }
  199.         
  200.     BlockMove(gApplicationPrefs, *AppPrefsHdl, sizeof(ApplicationPrefs));
  201.     ChangedResource((Handle) AppPrefsHdl);
  202.     UpdateResFile(TelInfo->SettingsFile);
  203.     ReleaseResource((Handle) AppPrefsHdl);
  204.     return(noErr);
  205. }
  206. OSErr SaveFTPPreferences(void)
  207. {
  208.     FTPServerPrefs        **FTPPrefsHdl;
  209.     Boolean                UserHasBeenAlerted = FALSE, UserResponse;
  210.     
  211.     UseResFile(TelInfo->SettingsFile);
  212.     if (ResError() != noErr) return(ResError());
  213.     
  214.     FTPPrefsHdl = (FTPServerPrefs **)GetResource(FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_ID);
  215.     if ((ResError() != noErr) || (FTPPrefsHdl == NULL)) return(ResError());
  216.  
  217.     HLock((Handle) FTPPrefsHdl);
  218.     if ((gFTPServerPrefs->version < (*FTPPrefsHdl)->version) && (!UserHasBeenAlerted)) {
  219.         UserResponse = AskUserAlert(PREFS_ARE_NEWER_ID, TRUE);        // Cancel is default
  220.         if (UserResponse == TRUE) return(noErr);    // User doesn't want to destroy prefs
  221.         }
  222.                 
  223.     BlockMove(gFTPServerPrefs, *FTPPrefsHdl, sizeof(FTPServerPrefs));
  224.     ChangedResource((Handle) FTPPrefsHdl);
  225.  
  226.     UpdateResFile(TelInfo->SettingsFile);
  227.     ReleaseResource((Handle) FTPPrefsHdl);
  228.     return(noErr);
  229. }
  230.  
  231. TerminalPrefs    **GetDefaultTerminal(void)
  232. {
  233.     TerminalPrefs    **theTerminalHdl;
  234.     short            scratchshort;
  235.     
  236.     UseResFile(TelInfo->SettingsFile);
  237.     theTerminalHdl = (TerminalPrefs **)Get1NamedResource(TERMINALPREFS_RESTYPE, "\p<Default>");
  238.     
  239.     // If there is an error here, we put up a dialog box about the prefs
  240.     // being messed up and then we restore the default from the master copy
  241.     // in the application's resource fork.
  242.     
  243.     if (theTerminalHdl == NULL) {
  244.         FatalCancelAlert(PREFERENCES_PROBLEM, "\pRepair", 110, ResError());
  245.         UseResFile(TelInfo->ApplicationFile);
  246.         theTerminalHdl = (TerminalPrefs **)Get1NamedResource(TERMINALPREFS_RESTYPE, "\p<Default>");
  247.         
  248.         // If the master copy is not there, it's a fatal error!
  249.         if (theTerminalHdl == NULL)
  250.             FatalAlert(RESOURCE_PROBLEM, 111, ResError());    // Doesn't return
  251.         
  252.         DetachResource((Handle)theTerminalHdl);    
  253.         UseResFile(TelInfo->SettingsFile);
  254.         scratchshort = Unique1ID(TERMINALPREFS_RESTYPE);
  255.         AddResource((Handle)theTerminalHdl, TERMINALPREFS_RESTYPE, scratchshort, "\p<Default>");
  256.  
  257.         // If an error ocurred fixing the prefs file, it's a fatal error!
  258.         if (ResError() != noErr) 
  259.             FatalAlert(NUKED_PREFS, 112, ResError());    // Doesn't return
  260.             
  261.         UpdateResFile(TelInfo->SettingsFile);
  262.         }
  263.         
  264.     DetachResource((Handle)theTerminalHdl);
  265.     return(theTerminalHdl);
  266. }
  267.  
  268. SessionPrefs    **GetDefaultSession(void)
  269. {
  270.     SessionPrefs    **theSessionHdl;
  271.     short            scratchshort;
  272.     
  273.     UseResFile(TelInfo->SettingsFile);
  274.     theSessionHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, "\p<Default>");
  275.  
  276.     // If there is an error here, we put up a dialog box about the prefs
  277.     // being messed up and then we restore the default from the master copy
  278.     // in the application's resource fork.
  279.     
  280.     if (theSessionHdl == NULL) {
  281.         FatalCancelAlert(PREFERENCES_PROBLEM, "\pRepair", 100, ResError());
  282.         UseResFile(TelInfo->ApplicationFile);
  283.         theSessionHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, "\p<Default>");
  284.         
  285.         // If the master copy is not there, it's a fatal error!
  286.         if (theSessionHdl == NULL)
  287.             FatalAlert(RESOURCE_PROBLEM, 101, ResError());    // Doesn't return
  288.             
  289.         DetachResource((Handle)theSessionHdl);
  290.         UseResFile(TelInfo->SettingsFile);
  291.         scratchshort = Unique1ID(SESSIONPREFS_RESTYPE);
  292.         AddResource((Handle)theSessionHdl, SESSIONPREFS_RESTYPE, scratchshort, "\p<Default>");
  293.  
  294.         // If an error ocurred fixing the prefs file, it's a fatal error!
  295.         if (ResError() != noErr) 
  296.             FatalAlert(NUKED_PREFS, 102, ResError());    // Doesn't return
  297.             
  298.         UpdateResFile(TelInfo->SettingsFile);
  299.         }
  300.         
  301.     DetachResource((Handle)theSessionHdl);
  302.     return(theSessionHdl);
  303. }
  304.  
  305. void    GetHostNameFromSession(StringPtr string)
  306. {
  307.     SessionPrefs    **sessHdl;
  308.     
  309.     UseResFile(TelInfo->SettingsFile);
  310.     sessHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, string);
  311.     HLock((Handle)sessHdl);
  312.     
  313.     BlockMove((**sessHdl).hostname, string, Length((**sessHdl).hostname)+1);
  314.     
  315.     ReleaseResource((Handle)sessHdl);
  316. }
  317.  
  318.  
  319. Boolean            ProcessHostnameString(StringPtr    HostnameString, short *port)
  320. {
  321.     Str255            MungeString;
  322.     short            scratchshort;
  323.     long            portRequested;
  324.     StringPtr        xxxxptr, yyyyptr;
  325.     Boolean            foundPort = FALSE;
  326.     
  327.     //    Copy the whole damn thing over
  328.     BlockMove(HostnameString, MungeString, 255);
  329.     
  330.     //    Remove leading spaces
  331.     scratchshort = 1;
  332.     while((scratchshort <= Length(MungeString)) && (MungeString[scratchshort] == ' '))
  333.         scratchshort++;
  334.     
  335.     if (scratchshort > Length(MungeString)) {
  336.         HostnameString[0] = 0;
  337.         return(FALSE);
  338.         }
  339.  
  340.     xxxxptr = &MungeString[scratchshort-1];
  341.     
  342.     //    Now look for a port number...
  343.     while((scratchshort <= Length(MungeString)) && (MungeString[scratchshort] != ' '))
  344.         scratchshort++;
  345.     
  346.     yyyyptr = &MungeString[scratchshort];
  347.     
  348.     if (scratchshort < Length(MungeString)) {
  349.         MungeString[scratchshort] = Length(MungeString) - scratchshort;
  350.         StringToNum(&MungeString[scratchshort], &portRequested);
  351.         if ((portRequested > 0) && (portRequested < 65535))    foundPort = TRUE;
  352.         }
  353.     
  354.     xxxxptr[0] = yyyyptr - xxxxptr - 1;
  355.  
  356.     //    Copy parsed hostname string back
  357.     BlockMove(xxxxptr, HostnameString, Length(xxxxptr)+1);
  358.     
  359.     *port = (short)portRequested;
  360.     
  361.     return(foundPort);
  362. }
  363.  
  364. void CheckPrefsVersion(void)
  365. {
  366.     if (gApplicationPrefs->version != OUR_PREFS_VERSION_NUMBER) //need to correctly set new values
  367.     {
  368.         if (gApplicationPrefs->version < NO_TIMEOUTS_VERSION)
  369.         {
  370.              gApplicationPrefs->SendTimeout = 15; //before d5, we need to set these
  371.             gApplicationPrefs->OpenTimeout = 15;
  372.         }
  373.         gApplicationPrefs->StaggerWindowsOffset = 10;//before b1, we need to set this
  374.         gApplicationPrefs->version = OUR_PREFS_VERSION_NUMBER;
  375.         SaveAppPreferences();
  376.     }
  377. }