home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Applications / Telnet 2.6.1d1 / src / source / config / prefs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-01-02  |  12.9 KB  |  392 lines  |  [TEXT/KAHL]

  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. #include "TelnetHeader.h"
  22. #include "debug.h"
  23. #include "telneterrors.h"
  24. #include "prefs.proto.h"
  25. #include "mainseg.proto.h"        // For quit proto
  26.  
  27. FTPServerPrefs*        gFTPServerPrefs=NULL;
  28. ApplicationPrefs*    gApplicationPrefs=NULL;
  29.  
  30. OSErr OpenPreferencesFile( void)
  31. {
  32.     Str255    **PreferencesFileNameHdl;
  33.     OSErr     err;
  34.     
  35.     PreferencesFileNameHdl = (Str255**)GetString(PREFERENCES_FILE_NAME_STR_ID);
  36.     if (PreferencesFileNameHdl == NULL) {
  37.         DebugStr("\pSomeone has deleted the prefs file name resource!");
  38.         forcequit();
  39.         }
  40.     
  41.     HLock((Handle)PreferencesFileNameHdl);
  42.         
  43.     /* look for an existing settings file. */
  44.     /* first, try the application folder */
  45.     TelInfo->SettingsFile=HOpenResFile(TelInfo->ApFolder.vRefNum, TelInfo->ApFolder.parID,
  46.                                             (StringPtr)*PreferencesFileNameHdl,fsRdWrShPerm);
  47.  
  48.     if (TelInfo->SettingsFile == -1) /* Look in System Folder */
  49.         {
  50.         TelInfo->SettingsFile = HOpenResFile(TelInfo->SysFolder.vRefNum, 
  51.                                                 TelInfo->SysFolder.parID, 
  52.                                             (StringPtr)*PreferencesFileNameHdl, fsRdWrShPerm);
  53.         }
  54.  
  55.     if (TelInfo->SettingsFile == -1) /* Look in Preferences Folder */
  56.         {
  57.         TelInfo->SettingsFile = HOpenResFile(TelInfo->PrefFolder.vRefNum, 
  58.                                                 TelInfo->PrefFolder.parID,
  59.                                             (StringPtr)*PreferencesFileNameHdl, fsRdWrShPerm);
  60.         }
  61.  
  62.     if (TelInfo->SettingsFile == -1)
  63.           {
  64.         if (err = HCreate(TelInfo->PrefFolder.vRefNum, TelInfo->PrefFolder.parID,
  65.                         (StringPtr)*PreferencesFileNameHdl, 'NCSA', 'pref') != noErr)
  66.             FatalAlert(CANT_CREATE_PREFS, 120, err);
  67.  
  68.         HCreateResFile(TelInfo->PrefFolder.vRefNum, TelInfo->PrefFolder.parID,
  69.                     (StringPtr)*PreferencesFileNameHdl);
  70.  
  71.         if (ResError() != noErr)
  72.             FatalAlert(CANT_CREATE_PREFS, 120, ResError());
  73.  
  74.         TelInfo->SettingsFile = HOpenResFile(TelInfo->PrefFolder.vRefNum, 
  75.                                                 TelInfo->PrefFolder.parID,
  76.                                             (StringPtr)*PreferencesFileNameHdl, fsRdWrShPerm);
  77.  
  78.         if (TelInfo->SettingsFile == -1)
  79.             FatalAlert(CANT_CREATE_PREFS, 120, ResError());        // Give up
  80.             
  81.         if ((err = NewPreferences()) != noErr) return(err);
  82.           }
  83.         
  84.     UseResFile(TelInfo->SettingsFile);
  85.     ReleaseResource((Handle)PreferencesFileNameHdl);
  86. }
  87.  
  88. OSErr NewPreferences(void)
  89. {
  90.     ApplicationPrefs    **AppPrefsHdl;
  91.     FTPServerPrefs        **FTPPrefsHdl;
  92.     SessionPrefs        **DefaultSessionPrefs;
  93.     TerminalPrefs        **DefaultTerminalPrefs;
  94.         
  95.     // Get the master copies from the application's resource fork
  96.     
  97.     AppPrefsHdl = (ApplicationPrefs **)GetResource(APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_APPID);
  98.     if ((ResError() != noErr) || (AppPrefsHdl == NULL)) return(ResError());
  99.     DetachResource((Handle)AppPrefsHdl);
  100.     
  101.     FTPPrefsHdl = (FTPServerPrefs **)GetResource(FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_APPID);
  102.     if ((ResError() != noErr) || (FTPPrefsHdl == NULL)) return(ResError());
  103.     DetachResource((Handle)FTPPrefsHdl);
  104.  
  105.     DefaultSessionPrefs = (SessionPrefs **)GetResource(SESSIONPREFS_RESTYPE, SESSIONPREFS_APPID);
  106.     if ((ResError() != noErr) || (DefaultSessionPrefs == NULL)) return(ResError());
  107.     DetachResource((Handle)DefaultSessionPrefs);
  108.     
  109.     DefaultTerminalPrefs = (TerminalPrefs **)GetResource(TERMINALPREFS_RESTYPE, TERMINALPREFS_APPID);
  110.     if ((ResError() != noErr) || (DefaultTerminalPrefs == NULL)) return(ResError());
  111.     DetachResource((Handle)DefaultTerminalPrefs);
  112.  
  113.     // Add them to the Preferences file
  114.     
  115.     UseResFile(TelInfo->SettingsFile);
  116.     if (ResError() != noErr) return(ResError());
  117.     AddResource((Handle)AppPrefsHdl, APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_ID, "\p");
  118.     if (ResError() != noErr) return(ResError());
  119.     AddResource((Handle)FTPPrefsHdl,FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_ID, "\p");
  120.     if (ResError() != noErr) return(ResError());
  121.     AddResource((Handle)DefaultSessionPrefs,SESSIONPREFS_RESTYPE, SESSIONPREFS_APPID, "\p<Default>");
  122.     if (ResError() != noErr) return(ResError());
  123.     AddResource((Handle)DefaultTerminalPrefs,TERMINALPREFS_RESTYPE, TERMINALPREFS_APPID, "\p<Default>");
  124.     if (ResError() != noErr) return(ResError());
  125.  
  126.     // Update the preferences file and release the resources
  127.     
  128.     UpdateResFile(TelInfo->SettingsFile);
  129.     ReleaseResource((Handle)AppPrefsHdl);
  130.     ReleaseResource((Handle)FTPPrefsHdl);
  131.     ReleaseResource((Handle)DefaultSessionPrefs);
  132.     ReleaseResource((Handle)DefaultTerminalPrefs);
  133.     return(ResError());
  134. }
  135.  
  136. OSErr LoadPreferences(void)
  137. {
  138.     ApplicationPrefs    **AppPrefsHdl;
  139.     FTPServerPrefs        **FTPPrefsHdl;
  140.     
  141.     UseResFile(TelInfo->SettingsFile);
  142.     if (ResError() != noErr) return(ResError());
  143.     
  144.     AppPrefsHdl = (ApplicationPrefs **)GetResource(APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_ID);
  145.     if ((ResError() != noErr) || (AppPrefsHdl == NULL)) return(ResError());
  146.  
  147.     HLock((Handle) AppPrefsHdl);
  148.     BlockMove(*AppPrefsHdl, gApplicationPrefs, sizeof(ApplicationPrefs));
  149.     ReleaseResource((Handle) AppPrefsHdl);
  150.     
  151.     FTPPrefsHdl = (FTPServerPrefs **)GetResource(FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_ID);
  152.     if ((ResError() != noErr) || (FTPPrefsHdl == NULL)) return(ResError());
  153.  
  154.     HLock((Handle) FTPPrefsHdl);
  155.     BlockMove(*FTPPrefsHdl, gFTPServerPrefs, sizeof(FTPServerPrefs));
  156.     ReleaseResource((Handle) FTPPrefsHdl);
  157.     
  158.     return(noErr);
  159. }
  160.  
  161. OSErr SavePreferences(void)
  162. {
  163.     ApplicationPrefs    **AppPrefsHdl;
  164.     FTPServerPrefs        **FTPPrefsHdl;
  165.     Boolean                UserHasBeenAlerted = FALSE, UserResponse;
  166.     
  167.     UseResFile(TelInfo->SettingsFile);
  168.     if (ResError() != noErr) return(ResError());
  169.     
  170.     AppPrefsHdl = (ApplicationPrefs **)GetResource(APPLICATIONPREFS_RESTYPE, APPLICATIONPREFS_ID);
  171.     if ((ResError() != noErr) || (AppPrefsHdl == NULL)) return(ResError());
  172.  
  173.     HLock((Handle) AppPrefsHdl);
  174.     if (gApplicationPrefs->version < (*AppPrefsHdl)->version) {
  175.         UserResponse = AskUserAlert(PREFS_ARE_NEWER_ID, TRUE);        // Cancel is default
  176.         if (UserResponse == TRUE) return(noErr);    // User doesn't want to destroy prefs
  177.         UserHasBeenAlerted = TRUE;                    // Don't ask the user twice!
  178.         }
  179.         
  180.     BlockMove(gApplicationPrefs, *AppPrefsHdl, sizeof(ApplicationPrefs));
  181.     ChangedResource((Handle) AppPrefsHdl);
  182.     
  183.     FTPPrefsHdl = (FTPServerPrefs **)GetResource(FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_ID);
  184.     if ((ResError() != noErr) || (FTPPrefsHdl == NULL)) return(ResError());
  185.  
  186.     HLock((Handle) FTPPrefsHdl);
  187.     if ((gFTPServerPrefs->version < (*FTPPrefsHdl)->version) && (!UserHasBeenAlerted)) {
  188.         UserResponse = AskUserAlert(PREFS_ARE_NEWER_ID, TRUE);        // Cancel is default
  189.         if (UserResponse == TRUE) return(noErr);    // User doesn't want to destroy prefs
  190.         }
  191.                 
  192.     BlockMove(gFTPServerPrefs, *FTPPrefsHdl, sizeof(FTPServerPrefs));
  193.     ChangedResource((Handle) FTPPrefsHdl);
  194.  
  195.     UpdateResFile(TelInfo->SettingsFile);
  196.     ReleaseResource((Handle) AppPrefsHdl);
  197.     ReleaseResource((Handle) FTPPrefsHdl);
  198.     return(noErr);
  199. }
  200.  
  201. TerminalPrefs    **GetDefaultTerminal(void)
  202. {
  203.     TerminalPrefs    **theTerminalHdl;
  204.     short            scratchshort;
  205.     
  206.     UseResFile(TelInfo->SettingsFile);
  207.     theTerminalHdl = (TerminalPrefs **)Get1NamedResource(TERMINALPREFS_RESTYPE, "\p<Default>");
  208.     
  209.     // If there is an error here, we put up a dialog box about the prefs
  210.     // being messed up and then we restore the default from the master copy
  211.     // in the application's resource fork.
  212.     
  213.     if (theTerminalHdl == NULL) {
  214.         FatalCancelAlert(PREFERENCES_PROBLEM, "\pRepair", 110, ResError());
  215.         UseResFile(TelInfo->ApplicationFile);
  216.         theTerminalHdl = (TerminalPrefs **)Get1NamedResource(TERMINALPREFS_RESTYPE, "\p<Default>");
  217.         
  218.         // If the master copy is not there, it's a fatal error!
  219.         if (theTerminalHdl == NULL)
  220.             FatalAlert(RESOURCE_PROBLEM, 111, ResError());    // Doesn't return
  221.         
  222.         DetachResource((Handle)theTerminalHdl);    
  223.         UseResFile(TelInfo->SettingsFile);
  224.         scratchshort = Unique1ID(TERMINALPREFS_RESTYPE);
  225.         AddResource((Handle)theTerminalHdl, TERMINALPREFS_RESTYPE, scratchshort, "\p<Default>");
  226.  
  227.         // If an error ocurred fixing the prefs file, it's a fatal error!
  228.         if (ResError() != noErr) 
  229.             FatalAlert(NUKED_PREFS, 112, ResError());    // Doesn't return
  230.             
  231.         UpdateResFile(TelInfo->SettingsFile);
  232.         }
  233.         
  234.     DetachResource((Handle)theTerminalHdl);
  235.     return(theTerminalHdl);
  236. }
  237.  
  238. SessionPrefs    **GetDefaultSession(void)
  239. {
  240.     SessionPrefs    **theSessionHdl;
  241.     short            scratchshort;
  242.     
  243.     UseResFile(TelInfo->SettingsFile);
  244.     theSessionHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, "\p<Default>");
  245.  
  246.     // If there is an error here, we put up a dialog box about the prefs
  247.     // being messed up and then we restore the default from the master copy
  248.     // in the application's resource fork.
  249.     
  250.     if (theSessionHdl == NULL) {
  251.         FatalCancelAlert(PREFERENCES_PROBLEM, "\pRepair", 100, ResError());
  252.         UseResFile(TelInfo->ApplicationFile);
  253.         theSessionHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, "\p<Default>");
  254.         
  255.         // If the master copy is not there, it's a fatal error!
  256.         if (theSessionHdl == NULL)
  257.             FatalAlert(RESOURCE_PROBLEM, 101, ResError());    // Doesn't return
  258.             
  259.         DetachResource((Handle)theSessionHdl);
  260.         UseResFile(TelInfo->SettingsFile);
  261.         scratchshort = Unique1ID(SESSIONPREFS_RESTYPE);
  262.         AddResource((Handle)theSessionHdl, SESSIONPREFS_RESTYPE, scratchshort, "\p<Default>");
  263.  
  264.         // If an error ocurred fixing the prefs file, it's a fatal error!
  265.         if (ResError() != noErr) 
  266.             FatalAlert(NUKED_PREFS, 102, ResError());    // Doesn't return
  267.             
  268.         UpdateResFile(TelInfo->SettingsFile);
  269.         }
  270.         
  271.     DetachResource((Handle)theSessionHdl);
  272.     return(theSessionHdl);
  273. }
  274.  
  275. void    GetHostNameFromSession(StringPtr string)
  276. {
  277.     SessionPrefs    **sessHdl;
  278.     
  279.     UseResFile(TelInfo->SettingsFile);
  280.     sessHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, string);
  281.     HLock((Handle)sessHdl);
  282.     
  283.     BlockMove((**sessHdl).hostname, string, Length((**sessHdl).hostname)+1);
  284.     
  285.     ReleaseResource((Handle)sessHdl);
  286. }
  287.  
  288. //    We recognize the following input string: "xxxx yyyy"
  289. //    If "xxxx" matches a session name, that session record is used.  Otherwise, the default
  290. //    session record is used with "xxxx" as the DNS hostname.   "yyyy", if extant, is
  291. //    converted to a number.  If it is a valid number, it is used as the port to connect to.
  292. //    WARNING: Do not pass this routing a blank string.  (We check this in PresentOpenConnectionDialog.)
  293. ConnInitParams    **NameToConnInitParams(StringPtr InputString)
  294. {
  295.     ConnInitParams    **theHdl;
  296.     SessionPrefs    **sessHdl;
  297.     TerminalPrefs    **termHdl;
  298.     short            portRequested;
  299.     Boolean            foundPort;
  300.     
  301.     theHdl = (ConnInitParams **)NewHandleClear(sizeof(ConnInitParams));
  302.     
  303.     foundPort = ProcessHostnameString(InputString, &portRequested);        
  304.         
  305.     UseResFile(TelInfo->SettingsFile);
  306.     sessHdl = (SessionPrefs **)Get1NamedResource(SESSIONPREFS_RESTYPE, InputString);
  307.     if (sessHdl == NULL) {                // Connect to host xxxx w/default session.
  308.         sessHdl = GetDefaultSession();
  309.         DetachResource((Handle) sessHdl);
  310.         HLock((Handle)sessHdl);
  311.         BlockMove(InputString, (**sessHdl).hostname, 64);
  312.         }
  313.     else {    
  314.         DetachResource((Handle) sessHdl);
  315.         HLock((Handle)sessHdl);
  316.         }
  317.  
  318.     (**theHdl).session = sessHdl;
  319.     
  320.     UseResFile(TelInfo->SettingsFile);
  321.     termHdl = (TerminalPrefs **)Get1NamedResource(TERMINALPREFS_RESTYPE, (**sessHdl).TerminalEmulation);
  322.     if (termHdl == NULL) termHdl = GetDefaultTerminal();
  323.     DetachResource((Handle) termHdl);
  324.     (**theHdl).terminal = termHdl;
  325.     HUnlock((Handle)sessHdl);
  326.     
  327.     ((**theHdl).WindowName)[0] = 0;
  328.     (**theHdl).ftpstate = 0;
  329.     (**sessHdl).ip_address = 0;
  330.     
  331.     if (foundPort) (**sessHdl).port = portRequested;
  332.     
  333.     return(theHdl);
  334. }
  335.  
  336. ConnInitParams    **ReturnDefaultConnInitParams(void)
  337. {
  338.     ConnInitParams    **theHdl;
  339.  
  340.     theHdl = (ConnInitParams **)NewHandleClear(sizeof(ConnInitParams));
  341.  
  342.     (**theHdl).session = GetDefaultSession();
  343.     (**(**theHdl).session).ip_address = 0;
  344.     (**theHdl).terminal = GetDefaultTerminal();
  345.     
  346.     return(theHdl);
  347. }
  348.  
  349. Boolean            ProcessHostnameString(StringPtr    HostnameString, short *port)
  350. {
  351.     Str255            MungeString;
  352.     short            scratchshort;
  353.     long            portRequested;
  354.     StringPtr        xxxxptr, yyyyptr;
  355.     Boolean            foundPort = FALSE;
  356.     
  357.     //    Copy the whole damn thing over
  358.     BlockMove(HostnameString, MungeString, 255);
  359.     
  360.     //    Remove leading spaces
  361.     scratchshort = 1;
  362.     while((scratchshort <= Length(MungeString)) && (MungeString[scratchshort] == ' '))
  363.         scratchshort++;
  364.     
  365.     if (scratchshort > Length(MungeString)) {
  366.         HostnameString[0] = 0;
  367.         return(FALSE);
  368.         }
  369.  
  370.     xxxxptr = &MungeString[scratchshort-1];
  371.     
  372.     //    Now look for a port number...
  373.     while((scratchshort <= Length(MungeString)) && (MungeString[scratchshort] != ' '))
  374.         scratchshort++;
  375.     
  376.     yyyyptr = &MungeString[scratchshort];
  377.     
  378.     if (scratchshort < Length(MungeString)) {
  379.         MungeString[scratchshort] = Length(MungeString) - scratchshort;
  380.         StringToNum(&MungeString[scratchshort], &portRequested);
  381.         if ((portRequested > 0) && (portRequested < 65535))    foundPort = TRUE;
  382.         }
  383.     
  384.     xxxxptr[0] = yyyyptr - xxxxptr - 1;
  385.  
  386.     //    Copy parsed hostname string back
  387.     BlockMove(xxxxptr, HostnameString, Length(xxxxptr)+1);
  388.     
  389.     *port = (short)portRequested;
  390.     
  391.     return(foundPort);
  392. }