Milán Major

netscape-revival

1 branch
Code

cmd/xfe/prefs.c

/* -*- Mode: C; tab-width: 8 -*-
   prefs.c --- reading and writing X preferences settings
   Copyright © 1997 Netscape Communications Corporation, all rights reserved.
 */

/* for XP_GetString() */
#include <xpgetstr.h>

#include "mozilla.h"
#include "xfe.h"
#include "fonts.h"
#include "libi18n.h"

#ifdef EDITOR
#include "xeditor.h"
#endif /*EDITOR*/

#ifdef Bool
#undef Bool
#endif

extern int XFE_WELCOME_HTML;
extern int XFE_TILDE_USER_SYNTAX_DISALLOWED;


/* If this is defined, we write ~/ to the preferences file as an
   abreviation of $HOME.  If not defined, we still parse ~/ from
   the file, but the next time the preferences are saved, full
   paths will be written.

   Writing out ~/ all the time makes Netscape 1.0 and 1.1 unable
   to read these preferences files.  Hmm...
 */
#define USE_TWIDDLE

static void
prefs_write_tag (FILE *fp, char *tag)
{
  fputs (tag, fp);
  if (strlen (tag) < 7)
    fputs (":\t\t\t", fp);
  else if (strlen (tag) < 15)
    fputs (":\t\t", fp);
  else
    fputs (":\t", fp);
}

static void
prefs_write_string (FILE *fp, char *tag, char *value, XP_Bool multi_line_p)
{
  prefs_write_tag (fp, tag);
  while (value && *value)
    {
      if (*value == '\n')
	{
	  if (multi_line_p && value[1])
	    fputs ("\n\t\t\t", fp);
          else if (multi_line_p)
	    fputs ("\n", fp);
	  else
	    fputc (' ', fp);
	}
      else
	{
	  fputc (*value, fp);
	}
      value++;
    }
  fputc ('\n', fp);
}


static void
prefs_write_path (FILE *fp, char *tag, char *value)
{
  char *suffix = 0;
#ifdef USE_TWIDDLE
  const char *home = getenv ("HOME");
  if (home && value && !strncmp (home, value, strlen (home)))
    {
      suffix = value + strlen (home);
      if (home[strlen(home)-1] == '/')
	;
      else if (suffix[0] == '/')
	suffix++;
      else if (suffix[0] != 0)
	suffix = 0;
    }
#endif /* USE_TWIDDLE */
  prefs_write_tag (fp, tag);
  if (suffix)
    fputs ("~/", fp);
  fputs (suffix ? suffix : (value ? value : ""), fp);
  fputs ("\n", fp);
}


static void
prefs_write_int (FILE *fp, char *tag, int value)
{
  prefs_write_tag (fp, tag);
  fprintf (fp, "%d\n", value);
}


static void
prefs_write_bool (FILE *fp, char *tag, XP_Bool value)
{
  prefs_write_tag (fp, tag);
  fputs (value ? "True\n" : "False\n", fp);
}

#if 0
static void
prefs_write_color(FILE* fp, char* tag, LO_Color* value)
{
  prefs_write_tag (fp, tag);
  fprintf(fp, "#%02x%02x%02x\n", value->red, value->green, value->blue);
}

static Boolean
prefs_parse_color(LO_Color* color, char* string)
{
    if (!LO_ParseRGB(string, &color->red, &color->green, &color->blue)) {
	color->red = color->blue = color->green = 0; /* black */
	return FALSE;
    }
    return TRUE;
}
#endif /* 0 */


#ifdef DEBUG_jwz
extern XP_Bool IL_AnimationLoopsEnabled;
extern XP_Bool IL_AnimationsEnabled;
#endif /* DEBUG_jwz */



/* saves out the global preferences.
 * 
 * returns True on success and FALSE
 * on failure (unable to open prefs file)
 */
PUBLIC Bool
XFE_SavePrefs (char * filename, XFE_GlobalPrefs *prefs)
{

  FILE * fp = fopen(filename, "w");
  fe_FontSettings *next;
  fe_FontSettings *set;

#ifdef DEBUG_jwz
  prefs->anim_loop_p = IL_AnimationLoopsEnabled;
  prefs->anim_p = IL_AnimationsEnabled;
#endif /* DEBUG_jwz */

  if(!fp)
    return(FALSE);

  fprintf (fp,
	   "# Netscape Preferences File\n"
	   "# Version: %s\n"
	   "# This is a generated file!  Do not edit.\n"
	   "\n",
	   fe_version);

  /* OPTIONS MENU
   */
  prefs_write_bool (fp, "SHOW_TOOLBAR", prefs->show_toolbar_p);
  prefs_write_bool (fp, "SHOW_URL", prefs->show_url_p);
  prefs_write_bool (fp, "SHOW_DIRECTORY_BUTTONS",
		    prefs->show_directory_buttons_p);
  prefs_write_bool (fp, "SHOW_MENUBAR", prefs->show_menubar_p);
  prefs_write_bool (fp, "SHOW_BOTTOM_STATUS_BAR", prefs->show_bottom_status_bar_p);
  prefs_write_bool (fp, "AUTOLOAD_IMAGES", prefs->autoload_images_p);
  prefs_write_bool (fp, "FTP_FILE_INFO", prefs->fancy_ftp_p);
#ifdef HAVE_SECURITY
  prefs_write_bool (fp, "SHOW_SECURITY_BAR", prefs->show_security_bar_p);
#endif
  fputs ("\n", fp);

  /* APPLICATIONS
   */
  prefs_write_string (fp, "TN3270", prefs->tn3270_command, FALSE);
  prefs_write_string (fp, "TELNET", prefs->telnet_command, FALSE);
  prefs_write_string (fp, "RLOGIN", prefs->rlogin_command, FALSE);
  prefs_write_string (fp, "RLOGIN_USER", prefs->rlogin_user_command, FALSE);
#ifdef DEBUG_jwz
  prefs_write_string (fp, "OTHER_BROWSER", prefs->other_browser, FALSE);
#endif /* DEBUG_jwz */
  fputs ("\n", fp);

  /* CACHE
   */
  prefs_write_int    (fp, "MEMORY_CACHE_SIZE", prefs->memory_cache_size);
  prefs_write_int    (fp, "DISK_CACHE_SIZE", prefs->disk_cache_size);
  prefs_write_path   (fp, "CACHE_DIR", prefs->cache_dir);
  prefs_write_int    (fp, "VERIFY_DOCUMENTS", prefs->verify_documents);
  prefs_write_bool    (fp, "CACHE_SSL_PAGES", prefs->cache_ssl_p);
  fputs ("\n", fp);

  /* COLORS
   */

  /* COMPOSITION
   */
  prefs_write_bool   (fp, "8BIT_MAIL_AND_NEWS", !prefs->qp_p);
  prefs_write_bool   (fp, "SEND_FORMATTED_TEXT", !prefs->send_formatted_text_p);
  prefs_write_bool   (fp, "QUEUE_FOR_LATER", prefs->queue_for_later_p);
  prefs_write_bool   (fp, "MAIL_BCC_SELF", prefs->mailbccself_p);
  prefs_write_bool   (fp, "NEWS_BCC_SELF", prefs->newsbccself_p);
  prefs_write_string (fp, "MAIL_BCC", prefs->mail_bcc, FALSE);
  prefs_write_string (fp, "NEWS_BCC", prefs->news_bcc, FALSE);
  prefs_write_path   (fp, "MAIL_FCC", prefs->mail_fcc);
  prefs_write_path   (fp, "NEWS_FCC", prefs->news_fcc);
  prefs_write_bool (fp, "MAIL_AUTOQUOTE_REPLY", prefs->autoquote_reply);
  fputs ("\n", fp);

  /* DIRECTORIES
   */
  prefs_write_path (fp, "TMPDIR", prefs->tmp_dir);
  prefs_write_path (fp, "BOOKMARKS_FILE", prefs->bookmark_file);
  prefs_write_path (fp, "HISTORY_FILE",   prefs->history_file);
  fputs ("\n", fp);

  /* FONTS
   */
  prefs_write_int (fp, "DOC_CSID", prefs->doc_csid);
  prefs_write_string (fp, "FONT_CHARSET", fe_GetFontCharSetSetting(), FALSE);
  set = fe_GetFontSettings();
  next = set;
  while (next)
  {
	prefs_write_string (fp, "FONT_SPEC", next->spec, FALSE);
	next = next->next;
  }
  fe_FreeFontSettings(set);
  prefs_write_int (fp, "CITATION_FONT", (int) prefs->citation_font);
  prefs_write_int (fp, "CITATION_SIZE", (int) prefs->citation_size);
  prefs_write_string (fp, "CITATION_COLOR", prefs->citation_color, FALSE);
  fputs ("\n", fp);

  /* HELPERS
   */
  prefs_write_path (fp, "MIME_TYPES", prefs->global_mime_types_file);
  prefs_write_path (fp, "PERSONAL_MIME_TYPES", prefs->private_mime_types_file);
  prefs_write_path (fp, "MAILCAP", prefs->global_mailcap_file);
  prefs_write_path (fp, "PERSONAL_MAILCAP", prefs->private_mailcap_file);
  fputs ("\n", fp);

  /* IDENTITY
   */
  prefs_write_string (fp, "REAL_NAME", prefs->real_name, FALSE);
  prefs_write_string (fp, "EMAIL_ADDRESS", prefs->email_address,FALSE);

#ifdef DEBUG_jwz
  prefs_write_string (fp, "EMAIL_ADDRESSES", prefs->email_addresses, TRUE);
  fputs ("\n", fp);
#endif /* DEBUG_jwz */

  prefs_write_string (fp, "ORGANIZATION", prefs->organization, TRUE);
  prefs_write_path   (fp, "SIGNATURE_FILE", prefs->signature_file);
  prefs_write_int    (fp, "SIGNATURE_DATE", (int) prefs->signature_date);
  prefs_write_int    (fp, "ANONYMITY_LEVEL", prefs->anonymity_level);
  fputs ("\n", fp);

  /* IMAGES
   */
  prefs_write_string (fp, "DITHER_IMAGES", prefs->dither_images, FALSE);
  prefs_write_bool   (fp, "STREAMING_IMAGES", prefs->streaming_images);
#ifdef DEBUG_jwz
  prefs_write_bool   (fp, "ANIMATIONS", prefs->anim_p);
  prefs_write_bool   (fp, "ANIMATION_LOOPS", prefs->anim_loop_p);
#endif /* DEBUG_jwz */
  fputs ("\n", fp);

  /* MAIL
   */
  prefs_write_string (fp, "MAILHOST", prefs->mailhost, FALSE);
  prefs_write_path   (fp, "MAIL_DIR", prefs->mail_directory);
  prefs_write_int    (fp, "BIFF_INTERVAL", prefs->biff_interval);
  prefs_write_bool   (fp, "AUTO_CHECK_MAIL", prefs->auto_check_mail);
  prefs_write_bool   (fp, "USE_MOVEMAIL", prefs->use_movemail_p);
  prefs_write_bool   (fp, "BUILTIN_MOVEMAIL", prefs->builtin_movemail_p);
  prefs_write_path   (fp, "MOVEMAIL_PROGRAM", prefs->movemail_program);
  prefs_write_string (fp, "POP3_HOST", prefs->pop3_host, FALSE);
  prefs_write_string (fp, "POP3_USER_ID", prefs->pop3_user_id, FALSE);
  prefs_write_bool   (fp, "POP3_LEAVE_ON_SERVER",
		      prefs->pop3_leave_mail_on_server);
  prefs_write_int    (fp, "POP3_MSG_SIZE_LIMIT",
		      prefs->pop3_msg_size_limit_p ? prefs->pop3_msg_size_limit :
		      -prefs->pop3_msg_size_limit);
  prefs_write_string (fp, "MAIL_FOLDER_COLUMNS", prefs->mail_folder_columns,
		      FALSE);
  prefs_write_string (fp, "MAIL_MESSAGE_COLUMNS", prefs->mail_message_columns,
		      FALSE);
  prefs_write_string (fp, "MAIL_SASH_GEOMETRY", prefs->mail_sash_geometry,
		      FALSE);
  prefs_write_bool   (fp, "AUTO_EMPTY_TRASH", prefs->emptyTrash);
  prefs_write_bool   (fp, "REMEMBER_MAIL_PASSWORD", prefs->rememberPswd);
  prefs_write_string (fp, "MAIL_PASSWORD",
		      prefs->rememberPswd ? prefs->pop3_password : "",
		      FALSE);
  prefs_write_bool   (fp, "THREAD_MAIL", prefs->mail_thread_p);
  prefs_write_int    (fp, "MAIL_PANE_STYLE", prefs->mail_pane_style);
  prefs_write_int    (fp, "MAIL_SORT_STYLE", prefs->mail_sort_style);
  prefs_write_bool   (fp, "MOVEMAIL_WARN", prefs->movemail_warn);

  fputs ("\n", fp);

  /* NETWORK
   */
  prefs_write_int    (fp, "MAX_CONNECTIONS", prefs->max_connections);
  prefs_write_int    (fp, "SOCKET_BUFFER_SIZE", prefs->network_buffer_size);
  fputs ("\n", fp);

  /* PROTOCOLS
   */
  prefs_write_bool   (fp, "USE_EMAIL_FOR_ANON_FTP", prefs->email_anonftp);
  prefs_write_bool   (fp, "ALERT_EMAIL_FORM_SUBMIT", prefs->email_submit);
  prefs_write_int    (fp, "ACCEPT_COOKIE", prefs->accept_cookie);
  fputs ("\n", fp);

  /* NEWS
   */
  prefs_write_string (fp, "NNTPSERVER", prefs->newshost, FALSE);
  prefs_write_path   (fp, "NEWSRC_DIR", prefs->newsrc_directory);
  prefs_write_int    (fp, "NEWS_MAX_ARTICLES", prefs->news_max_articles);
  prefs_write_bool   (fp, "NEWS_CACHE_HEADERS", prefs->news_cache_xover);
  prefs_write_bool   (fp, "SHOW_FIRST_UNREAD", prefs->show_first_unread_p);
  prefs_write_string (fp, "NEWS_FOLDER_COLUMNS", prefs->news_folder_columns,
		      FALSE);
  prefs_write_string (fp, "NEWS_MESSAGE_COLUMNS", prefs->news_message_columns,
		      FALSE);
  prefs_write_string (fp, "NEWS_SASH_GEOMETRY", prefs->news_sash_geometry,
		      FALSE);
  prefs_write_bool   (fp, "THREAD_NEWS", !prefs->no_news_thread_p);
  prefs_write_int    (fp, "NEWS_PANE_STYLE", prefs->news_pane_style);
  prefs_write_int    (fp, "NEWS_SORT_STYLE", prefs->news_sort_style);
  fputs ("\n", fp);

  /* PROXIES
   */
  prefs_write_int    (fp, "PROXY_MODE", prefs->proxy_mode);
  prefs_write_string (fp, "PROXY_URL", prefs->proxy_url, FALSE);

  prefs_write_string (fp, "SOCKS_HOST", prefs->socks_host, FALSE);

  prefs_write_string (fp, "FTP_PROXY", prefs->ftp_proxy, FALSE);
  prefs_write_string (fp, "HTTP_PROXY", prefs->http_proxy, FALSE);
#ifdef HAVE_SECURITY
  prefs_write_string (fp, "HTTPS_PROXY", prefs->https_proxy, FALSE);
#endif
  prefs_write_string (fp, "GOPHER_PROXY", prefs->gopher_proxy, FALSE);
  prefs_write_string (fp, "WAIS_PROXY", prefs->wais_proxy, FALSE);
  prefs_write_string (fp, "NO_PROXY", prefs->no_proxy, FALSE);
  fputs ("\n", fp);

  /* SECURITY
   */
  prefs_write_string (fp, "LICENSE_ACCEPTED", prefs->license_accepted, FALSE);

#ifdef HAVE_SECURITY
  prefs_write_int  (fp, "ASK_PASSWORD", prefs->ask_password);
  prefs_write_int  (fp, "PASSWORD_TIMEOUT", prefs->password_timeout);

  prefs_write_bool (fp, "WARN_ENTER_SECURE", prefs->enter_warn);
  prefs_write_bool (fp, "WARN_LEAVE_SECURE", prefs->leave_warn);
  prefs_write_bool (fp, "WARN_MIXED_SECURE", prefs->mixed_warn);
  prefs_write_bool (fp, "WARN_SUBMIT_INSECURE", prefs->submit_warn);
#endif /* HAVE_SECURITY -- jwz */

#ifdef JAVA
  prefs_write_bool (fp, "DISABLE_JAVA", prefs->disable_java);
#else /* jwz */
  prefs_write_bool (fp, "DISABLE_JAVA", TRUE);
#endif

#ifdef MOCHA
  prefs_write_bool (fp, "DISABLE_JAVASCRIPT", prefs->disable_javascript);
#else /* jwz */
  prefs_write_bool (fp, "DISABLE_JAVASCRIPT", TRUE);
#endif /* MOCHA */

#ifdef HAVE_SECURITY /* jwz */
  prefs_write_string (fp, "DEFAULT_USER_CERT",
		      (!strcasecomp(prefs->def_user_cert, prefs->email_address)
		       ? "do the default"
		       : prefs->def_user_cert),
		      FALSE);
  prefs_write_string (fp, "DEFAULT_MAIL_CERT",
		      (!strcasecomp(prefs->def_mail_cert, prefs->email_address)
		       ? "do the default"
		       : prefs->def_mail_cert),
		      FALSE);
  prefs_write_bool (fp, "ENABLE_SSL2", prefs->ssl2_enable);
  prefs_write_bool (fp, "ENABLE_SSL3", prefs->ssl3_enable);
  prefs_write_string (fp, "CIPHER", prefs->cipher, FALSE);

  /* New 4.0 preferences for 3.01... */
  fputs ("\n", fp);
  prefs_write_bool (fp, "CRYPTO_SIGN_OUTGOING_MAIL",
		    prefs->crypto_sign_outgoing_mail);
  prefs_write_bool (fp, "CRYPTO_SIGN_OUTGOING_NEWS",
		    prefs->crypto_sign_outgoing_news);
  prefs_write_bool (fp, "ENCRYPT_OUTGOING_MAIL",
		    prefs->encrypt_outgoing_mail);
  prefs_write_bool (fp, "WARN_FORWARD_ENCRYPTED",
		    prefs->warn_forward_encrypted);
  prefs_write_bool (fp, "WARN_REPLY_UNENCRYPTED",
		    prefs->warn_reply_unencrypted);

  fputs ("\n", fp);
  prefs_write_int (fp, "SECURITY_KEYGEN_MAXBITS",
		   prefs->security_keygen_maxbits);

  prefs_write_bool (fp, "SECURITY_SSL2_DES_64",
		    prefs->security_ssl2_des_64);
  prefs_write_bool (fp, "SECURITY_SSL2_DES_EDE3_192",
		    prefs->security_ssl2_des_ede3_192);
  prefs_write_bool (fp, "SECURITY_SSL2_RC2_40",
		    prefs->security_ssl2_rc2_40);
  prefs_write_bool (fp, "SECURITY_SSL2_RC2_128",
		    prefs->security_ssl2_rc2_128);
  prefs_write_bool (fp, "SECURITY_SSL2_RC4_40",
		    prefs->security_ssl2_rc4_40);
  prefs_write_bool (fp, "SECURITY_SSL2_RC4_128",
		    prefs->security_ssl2_rc4_128);

  prefs_write_bool (fp, "SECURITY_SSL3_FORTEZZA_FORTEZZA_SHA",
		    prefs->security_ssl3_fortezza_fortezza_sha);
  prefs_write_bool (fp, "SECURITY_SSL3_FORTEZZA_NULL_SHA",
		    prefs->security_ssl3_fortezza_null_sha);
  prefs_write_bool (fp, "SECURITY_SSL3_FORTEZZA_RC4_SHA",
		    prefs->security_ssl3_fortezza_rc4_sha);
  prefs_write_bool (fp, "SECURITY_SSL3_RSA_DES_EDE3_SHA",
		    prefs->security_ssl3_rsa_des_ede3_sha);
  prefs_write_bool (fp, "SECURITY_SSL3_RSA_DES_SHA",
		    prefs->security_ssl3_rsa_des_sha);
  prefs_write_bool (fp, "SECURITY_SSL3_RSA_NULL_MD5",
		    prefs->security_ssl3_rsa_null_md5);
  prefs_write_bool (fp, "SECURITY_SSL3_RSA_RC2_40_MD5",
		    prefs->security_ssl3_rsa_rc2_40_md5);
  prefs_write_bool (fp, "SECURITY_SSL3_RSA_RC4_40_MD5",
		    prefs->security_ssl3_rsa_rc4_40_md5);
  prefs_write_bool (fp, "SECURITY_SSL3_RSA_RC4_128_MD5",
		    prefs->security_ssl3_rsa_rc4_128_md5);

  prefs_write_bool (fp, "SECURITY_SMIME_DES",
		    prefs->security_smime_des);
  prefs_write_bool (fp, "SECURITY_SMIME_DES_EDE3",
		    prefs->security_smime_des_ede3);
  prefs_write_bool (fp, "SECURITY_SMIME_RC2_40",
		    prefs->security_smime_rc2_40);
  prefs_write_bool (fp, "SECURITY_SMIME_RC2_64",
		    prefs->security_smime_rc2_64);
  prefs_write_bool (fp, "SECURITY_SMIME_RC2_128",
		    prefs->security_smime_rc2_128);
  prefs_write_bool (fp, "SECURITY_SMIME_RC5_B64R16K40",
		    prefs->security_smime_rc5_b64r16k40);
  prefs_write_bool (fp, "SECURITY_SMIME_RC5_B64R16K64",
		    prefs->security_smime_rc5_b64r16k64);
  prefs_write_bool (fp, "SECURITY_SMIME_RC5_B64R16K128",
		    prefs->security_smime_rc5_b64r16k128);

  fputs ("\n", fp);
#endif /* HAVE_SECURITY */

  /* STYLES (GENERAL APPEARANCE)
   */
  prefs_write_bool (fp, "TOOLBAR_ICONS", prefs->toolbar_icons_p);
  prefs_write_bool (fp, "TOOLBAR_TEXT", prefs->toolbar_text_p);
  prefs_write_bool (fp, "TOOLBAR_TIPS", prefs->toolbar_tips_p);
  prefs_write_string (fp, "HOME_DOCUMENT", prefs->home_document,FALSE);

  prefs_write_int  (fp, "STARTUP_MODE", prefs->startup_mode);

  prefs_write_bool (fp, "UNDERLINE_LINKS", prefs->underline_links_p);
  prefs_write_int (fp, "HISTORY_EXPIRATION",
		   prefs->global_history_expiration);
  prefs_write_bool (fp, "FIXED_MESSAGE_FONT", prefs->fixed_message_font_p);
/*** no longer valid. we need one each for mail and news - dp
  prefs_write_int  (fp, "SORT_MESSAGES", prefs->msg_sort_style);
  prefs_write_bool (fp, "THREAD_MESSAGES", prefs->msg_thread_p);
***/
  fputs ("\n", fp);

  /* BOOKMARK
   */
  prefs_write_string (fp, "ADD_URLS", prefs->put_added_urls_under, FALSE);
  prefs_write_string (fp, "BOOKMARK_MENU", prefs->begin_bookmark_menu_under,
		      FALSE);
  fputs ("\n", fp);

  /* PRINT
   */
  prefs_write_string (fp, "PRINT_COMMAND", prefs->print_command, FALSE);
  prefs_write_bool   (fp, "PRINT_REVERSED", prefs->print_reversed);
  prefs_write_bool   (fp, "PRINT_COLOR", prefs->print_color);
  prefs_write_bool   (fp, "PRINT_LANDSCAPE", prefs->print_landscape);
  prefs_write_int    (fp, "PRINT_PAPER", prefs->print_paper_size);
#ifdef DEBUG_jwz
  prefs_write_int    (fp, "PRINT_SIZE", prefs->print_font_size);
  prefs_write_bool   (fp, "PRINT_HEADER_P", prefs->print_header_p);
  prefs_write_bool   (fp, "PRINT_FOOTER_P", prefs->print_footer_p);
  prefs_write_string (fp, "PRINT_HEADER", prefs->print_header, FALSE);
  prefs_write_string (fp, "PRINT_FOOTER", prefs->print_footer, FALSE);
  prefs_write_int    (fp, "PRINT_HMARGIN", prefs->print_hmargin);
  prefs_write_int    (fp, "PRINT_VMARGIN", prefs->print_vmargin);
#endif /* DEBUG_jwz */

#ifdef EDITOR
  fputs ("\n", fp);
  prefs_write_bool(fp, "EDITOR_CHARACTER_TOOLBAR",
		   prefs->editor_character_toolbar);
  prefs_write_bool(fp, "EDITOR_PARAGRAPH_TOOLBAR",
		   prefs->editor_paragraph_toolbar);
  prefs_write_string(fp, "EDITOR_AUTHOR_NAME",
		     prefs->editor_author_name, FALSE);
  prefs_write_string(fp, "EDITOR_HTML_EDITOR",
		     prefs->editor_html_editor, FALSE);
  prefs_write_string(fp, "EDITOR_IMAGE_EDITOR",
		     prefs->editor_image_editor, FALSE);
  prefs_write_string(fp, "EDITOR_DOCUMENT_TEMPLATE",
		     prefs->editor_document_template, FALSE);
  prefs_write_int(fp, "EDITOR_AUTOSAVE_PERIOD", prefs->editor_autosave_period);
  prefs_write_bool(fp, "EDITOR_CUSTOM_COLORS",
		   prefs->editor_custom_colors);
  prefs_write_color(fp, "EDITOR_BACKGROUND_COLOR",
		    &prefs->editor_background_color);
  prefs_write_color(fp, "EDITOR_NORMAL_COLOR",
		    &prefs->editor_normal_color);
  prefs_write_color(fp, "EDITOR_LINK_COLOR",
		    &prefs->editor_link_color);
  prefs_write_color(fp, "EDITOR_ACTIVE_COLOR",
		    &prefs->editor_active_color);
  prefs_write_color(fp, "EDITOR_FOLLOWED_COLOR",
		    &prefs->editor_followed_color);
  prefs_write_string(fp, "EDITOR_BACKGROUND_IMAGE",
		     prefs->editor_background_image, FALSE);
  prefs_write_bool(fp, "EDITOR_MAINTAIN_LINKS",
		   prefs->editor_maintain_links);
  prefs_write_bool(fp, "EDITOR_KEEP_IMAGES",
		   prefs->editor_keep_images);
  prefs_write_string(fp, "EDITOR_PUBLISH_LOCATION",
		     prefs->editor_publish_location, FALSE);
  prefs_write_string(fp, "EDITOR_BROWSE_LOCATION",
		     prefs->editor_browse_location, FALSE);
  prefs_write_string(fp, "EDITOR_PUBLISH_USERNAME",
		     prefs->editor_publish_username, FALSE);
  if (prefs->editor_save_publish_password) {
      prefs_write_string(fp, "EDITOR_PUBLISH_PASSWORD",
			 prefs->editor_publish_password, FALSE);
  }
  prefs_write_bool(fp, "EDITOR_COPYRIGHT_HINT",
		   prefs->editor_copyright_hint);
#endif

  fclose (fp);

  return (TRUE);
}


static void xfe_prefs_from_environment (XFE_GlobalPrefs *prefs);


/* reads in the global preferences.
 * 
 * returns True on success and FALSE
 * on failure (unable to open prefs file)
 *
 * the prefs structure must be zero'd at creation since
 * this function will free any existing char pointers 
 * passed in and will malloc new ones.
 */
PUBLIC Bool
XFE_ReadPrefs(char * filename, XFE_GlobalPrefs *prefs)
{
  FILE * fp;
  char buffer [1024];
  char *name, *value, *colon;

  /* First set all slots to the builtin defaults.
     Then, let the environment override that.
     Then, let the file override the environment.

     This means that, generally, the environment variables are only
     consulted when there is no preferences file on disk - once the
     preferences get saved, the prevailing env. var values will have
     been captured in it.
   */

  XFE_DefaultPrefs (xfe_PREFS_ALL, prefs);
  xfe_prefs_from_environment (prefs);

  fp = fopen (filename, "r");

  if (!fp)
    return(FALSE);

  if (! fgets(buffer, 1024, fp))
    *buffer = 0;

  while (fgets (buffer, 1024, fp))
    {
      name = XP_StripLine (buffer);

      if (*name == '#')
	continue;  /* comment */

      colon = strchr (name, ':');
		
      if (!colon)
	continue;  /* not a name/value pair */

      *colon= '\0';  /* terminate */

      value = XP_StripLine (colon+1);

# define BOOLP(x) (strcasecmp((x),"TRUE") ? FALSE : TRUE)

      /* OPTIONS MENU
       */
      if (!strcasecmp ("SHOW_TOOLBAR", name))
	prefs->show_toolbar_p = BOOLP (value);
      else if (!strcasecmp ("SHOW_URL", name))
	prefs->show_url_p = BOOLP (value);
      else if (!strcasecmp ("SHOW_DIRECTORY_BUTTONS", name))
	prefs->show_directory_buttons_p = BOOLP (value);
      else if (!strcasecmp ("SHOW_MENUBAR", name))
	prefs->show_menubar_p = BOOLP (value);
      else if (!strcasecmp ("SHOW_BOTTOM_STATUS_BAR", name))
	prefs->show_bottom_status_bar_p = BOOLP (value);
      else if (!strcasecmp ("AUTOLOAD_IMAGES", name))
	prefs->autoload_images_p = BOOLP (value);
      else if (!strcasecmp ("FTP_FILE_INFO", name))
	prefs->fancy_ftp_p = BOOLP (value);
#ifdef HAVE_SECURITY
      else if (!strcasecmp ("SHOW_SECURITY_BAR", name))
	prefs->show_security_bar_p = BOOLP (value);
#endif


      /* APPLICATIONS
       */
      else if (!strcasecmp ("TN3270", name))
	StrAllocCopy (prefs->tn3270_command, value);
      else if (!strcasecmp ("TELNET", name))
	StrAllocCopy (prefs->telnet_command, value);
      else if (!strcasecmp ("RLOGIN", name))
	StrAllocCopy (prefs->rlogin_command, value);
      else if (!strcasecmp ("RLOGIN_USER", name))
	StrAllocCopy (prefs->rlogin_user_command, value);
#ifdef DEBUG_jwz
      else if (!strcasecmp ("OTHER_BROWSER", name))
	StrAllocCopy (prefs->other_browser, value);
#endif /* DEBUG_jwz */

      /* CACHE
       */
      else if (!strcasecmp ("MEMORY_CACHE_SIZE", name))
	prefs->memory_cache_size = atoi (value);
      else if (!strcasecmp ("DISK_CACHE_SIZE", name))
	prefs->disk_cache_size = atoi (value);
      else if (!strcasecmp ("CACHE_DIR", name))
	StrAllocCopy (prefs->cache_dir, value);
      else if (!strcasecmp ("VERIFY_DOCUMENTS", name))
	prefs->verify_documents = atoi (value);
      else if (!strcasecmp ("CACHE_SSL_PAGES", name))
	prefs->cache_ssl_p = BOOLP (value);

      /* COLORS
       */
	
      /* COMPOSITION
       */
      else if (!strcasecmp ("8BIT_MAIL_AND_NEWS", name))
	prefs->qp_p = !BOOLP (value);
      else if (!strcasecmp ("SEND_FORMATTED_TEXT", name))
	prefs->send_formatted_text_p = !BOOLP (value);
      else if (!strcasecmp ("QUEUE_FOR_LATER", name))
	prefs->queue_for_later_p = BOOLP (value);
      else if (!strcasecmp ("MAIL_BCC_SELF", name))
	prefs->mailbccself_p = BOOLP (value);
      else if (!strcasecmp ("NEWS_BCC_SELF", name))
	prefs->newsbccself_p = BOOLP (value);
      else if (!strcasecmp ("MAIL_BCC", name))
	StrAllocCopy (prefs->mail_bcc, value);
      else if (!strcasecmp ("NEWS_BCC", name))
	StrAllocCopy (prefs->news_bcc, value);
      else if (!strcasecmp ("MAIL_FCC", name))
	StrAllocCopy (prefs->mail_fcc, value);
      else if (!strcasecmp ("NEWS_FCC", name))
	StrAllocCopy (prefs->news_fcc, value);
      else if (!strcasecmp ("MAIL_AUTOQUOTE_REPLY", name))
	prefs->autoquote_reply = BOOLP (value);

      /* DIRECTORIES
       */
      else if (!strcasecmp ("TMPDIR", name))
	StrAllocCopy (prefs->tmp_dir, value);
      else if (!strcasecmp ("BOOKMARKS_FILE", name))
	StrAllocCopy (prefs->bookmark_file, value);
      else if (!strcasecmp ("HISTORY_FILE", name))
	StrAllocCopy (prefs->history_file, value);

      /* FONTS
       */
      else if (!strcasecmp ("DOC_CSID", name))
	prefs->doc_csid = atoi (value);
      else if (!strcasecmp ("FONT_CHARSET", name))
	fe_ReadFontCharSet(value);
      else if (!strcasecmp ("FONT_SPEC", name))
	fe_ReadFontSpec(value);
      else if (!strcasecmp ("CITATION_FONT", name))
	prefs->citation_font = (MSG_FONT) atoi (value);
      else if (!strcasecmp ("CITATION_SIZE", name))
	prefs->citation_size = (MSG_CITATION_SIZE) atoi (value);
      else if (!strcasecmp ("CITATION_COLOR", name))
	StrAllocCopy (prefs->citation_color, value);

      /* HELPERS
       */
      else if (!strcasecmp ("MIME_TYPES", name))
	StrAllocCopy (prefs->global_mime_types_file, value);
      else if (!strcasecmp ("PERSONAL_MIME_TYPES", name))
	StrAllocCopy (prefs->private_mime_types_file, value);
      else if (!strcasecmp ("MAILCAP", name))
	StrAllocCopy (prefs->global_mailcap_file, value);
      else if (!strcasecmp ("PERSONAL_MAILCAP", name))
	StrAllocCopy (prefs->private_mailcap_file, value);

      /* IDENTITY
       */
      else if (!strcasecmp ("REAL_NAME", name))
	StrAllocCopy (prefs->real_name, value);
      else if (!strcasecmp ("EMAIL_ADDRESS", name))
	StrAllocCopy (prefs->email_address, value);
#ifdef DEBUG_jwz
      else if (!strcasecmp ("EMAIL_ADDRESSES", name))
        {
          /* do continuation lines */
          value = strdup (value);
          while (1)
            {
              char buffer2 [1024];
              char c = fgetc (fp);
              char *s;
              if (c != '\t' && c != ' ')
                {
                  if (c != ungetc(c, fp))
                    abort();
                  break;
                }
              if (!fgets (buffer2, sizeof(buffer2), fp))
                abort();
              s = buffer2;
              while (*s == ' ' || *s == '\t')
                s++;
              XP_StripLine (s);
              StrAllocCat (value, "\n");
              StrAllocCat (value, s);
            }

          StrAllocCopy (prefs->email_addresses, value);
        }
#endif /* DEBUG_jwz */
      else if (!strcasecmp ("ORGANIZATION", name))
	StrAllocCopy (prefs->organization, value);
      else if (!strcasecmp ("SIGNATURE_FILE", name))
	StrAllocCopy (prefs->signature_file, value);
      else if (!strcasecmp ("SIGNATURE_DATE", name))
	prefs->signature_date = (time_t) atol (value);
      else if (!strcasecmp ("ANONYMITY_LEVEL", name))
	prefs->anonymity_level = atol (value);

      /* IMAGES
       */
      else if (!strcasecmp ("DITHER_IMAGES", name))
	StrAllocCopy (prefs->dither_images, value);
      else if (!strcasecmp ("STREAMING_IMAGES", name))
	prefs->streaming_images = BOOLP (value);
#ifdef DEBUG_jwz
      else if (!strcasecmp ("ANIMATIONS", name))
	prefs->anim_p = BOOLP (value);
      else if (!strcasecmp ("ANIMATION_LOOPS", name))
	prefs->anim_loop_p = BOOLP (value);
#endif /* DEBUG_jwz */

      /* MAIL
       */
      else if (!strcasecmp ("MAILHOST", name))
	StrAllocCopy (prefs->mailhost, value);
      else if (!strcasecmp ("MAIL_DIR", name))
/*####*/	StrAllocCopy (prefs->mail_directory, value);
      else if (!strcasecmp ("BIFF_INTERVAL", name))
	prefs->biff_interval = atol(value);
      else if (!strcasecmp ("AUTO_CHECK_MAIL", name))
	prefs->auto_check_mail = BOOLP (value);
      else if (!strcasecmp ("USE_MOVEMAIL", name))
	prefs->use_movemail_p = BOOLP (value);
      else if (!strcasecmp ("BUILTIN_MOVEMAIL", name))
	prefs->builtin_movemail_p = BOOLP (value);
      else if (!strcasecmp ("MOVEMAIL_PROGRAM", name))
	StrAllocCopy (prefs->movemail_program, value);
      else if (!strcasecmp ("POP3_HOST", name))
	StrAllocCopy (prefs->pop3_host, value);
      else if (!strcasecmp ("POP3_USER_ID", name))
	StrAllocCopy (prefs->pop3_user_id, value);
      else if (!strcasecmp ("POP3_LEAVE_ON_SERVER", name))
	prefs->pop3_leave_mail_on_server = BOOLP (value);
      else if (!strcasecmp ("POP3_MSG_SIZE_LIMIT", name))
	prefs->pop3_msg_size_limit = atol (value);
      else if (!strcasecmp ("MAIL_FOLDER_COLUMNS", name))
	StrAllocCopy(prefs->mail_folder_columns, value);
      else if (!strcasecmp ("MAIL_MESSAGE_COLUMNS", name))
	StrAllocCopy(prefs->mail_message_columns, value);

      else if (!strcasecmp ("MAIL_SASH_GEOMETRY", name))
	StrAllocCopy(prefs->mail_sash_geometry, value);
      else if (!strcasecmp ("AUTO_EMPTY_TRASH", name))
	prefs->emptyTrash = BOOLP (value);
      else if (!strcasecmp ("REMEMBER_MAIL_PASSWORD", name))
	prefs->rememberPswd = BOOLP (value);
      else if (!strcasecmp ("MAIL_PASSWORD", name))
	StrAllocCopy (prefs->pop3_password, value);
      else if (!strcasecmp ("THREAD_MAIL", name))
	prefs->mail_thread_p = BOOLP (value);
      else if (!strcasecmp ("MAIL_PANE_STYLE", name))
	prefs->mail_pane_style = atoi (value);
      else if (!strcasecmp ("MAIL_SORT_STYLE", name))
	prefs->mail_sort_style = atol (value);
      else if (!strcasecmp ("MOVEMAIL_WARN", name))
        prefs->movemail_warn = BOOLP (value);

      /* NETWORK
       */
      else if (!strcasecmp ("MAX_CONNECTIONS", name))
	prefs->max_connections = atoi (value);
      else if (!strcasecmp ("SOCKET_BUFFER_SIZE", name))
	prefs->network_buffer_size = atoi (value);

      /* PROTOCOLS
       */
      else if (!strcasecmp("USE_EMAIL_FOR_ANON_FTP", name))
      prefs->email_anonftp = BOOLP(value);
      else if (!strcasecmp("ALERT_EMAIL_FORM_SUBMIT", name))
	prefs->email_submit = BOOLP(value);
      else if (!strcasecmp("ACCEPT_COOKIE", name))
	prefs->accept_cookie = atoi(value);

      /* NEWS
       */
      else if (!strcasecmp ("NNTPSERVER", name))
	StrAllocCopy (prefs->newshost, value);
      else if (!strcasecmp ("NEWSRC_DIR", name))
	StrAllocCopy (prefs->newsrc_directory, value);
      else if (!strcasecmp ("NEWS_MAX_ARTICLES", name))
	prefs->news_max_articles = atol (value);
      else if (!strcasecmp ("NEWS_CACHE_HEADERS", name))
	prefs->news_cache_xover = BOOLP (value);
      else if (!strcasecmp ("SHOW_FIRST_UNREAD", name))
	prefs->show_first_unread_p = BOOLP (value);
      else if (!strcasecmp ("NEWS_FOLDER_COLUMNS", name))
	StrAllocCopy(prefs->news_folder_columns, value);
      else if (!strcasecmp ("NEWS_MESSAGE_COLUMNS", name))
	StrAllocCopy(prefs->news_message_columns, value);
      else if (!strcasecmp ("NEWS_SASH_GEOMETRY", name))
	StrAllocCopy(prefs->news_sash_geometry, value);
      else if (!strcasecmp ("THREAD_NEWS", name))
	prefs->no_news_thread_p = !BOOLP (value);
      else if (!strcasecmp ("NEWS_PANE_STYLE", name))
	prefs->news_pane_style = atoi (value);
      else if (!strcasecmp ("NEWS_SORT_STYLE", name))
	prefs->news_sort_style = atol (value);

      /* PROXIES
       */
      else if (!strcasecmp ("PROXY_URL", name))
	StrAllocCopy (prefs->proxy_url, value);
      else if (!strcasecmp ("PROXY_MODE", name))
	prefs->proxy_mode = atol (value);
      else if (!strcasecmp ("SOCKS_HOST", name))
	StrAllocCopy (prefs->socks_host, value);
      else if (!strcasecmp ("FTP_PROXY", name))
	StrAllocCopy (prefs->ftp_proxy, value);
      else if (!strcasecmp ("HTTP_PROXY", name))
	StrAllocCopy (prefs->http_proxy, value);
#ifdef HAVE_SECURITY
      else if (!strcasecmp ("HTTPS_PROXY", name))
	StrAllocCopy (prefs->https_proxy, value);
#endif
      else if (!strcasecmp ("GOPHER_PROXY", name))
	StrAllocCopy (prefs->gopher_proxy, value);
      else if (!strcasecmp ("WAIS_PROXY", name))
	StrAllocCopy (prefs->wais_proxy, value);
      else if (!strcasecmp ("NO_PROXY", name))
	StrAllocCopy (prefs->no_proxy, value);

      /* SECURITY
       */
#ifdef HAVE_SECURITY
      else if (!strcasecmp ("ASK_PASSWORD", name))
	prefs->ask_password = atoi (value);
      else if (!strcasecmp ("PASSWORD_TIMEOUT", name))
	prefs->password_timeout = atoi (value);

      else if (!strcasecmp ("WARN_ENTER_SECURE", name))
	prefs->enter_warn = BOOLP (value);
      else if (!strcasecmp ("WARN_LEAVE_SECURE", name))
	prefs->leave_warn = BOOLP (value);
      else if (!strcasecmp ("WARN_MIXED_SECURE", name))
	prefs->mixed_warn = BOOLP (value);
      else if (!strcasecmp ("WARN_SUBMIT_INSECURE", name))
	prefs->submit_warn = BOOLP (value);
#endif /* HAVE_SECURITY -- jwz */

#ifdef JAVA
      else if (!strcasecmp ("DISABLE_JAVA", name))
	prefs->disable_java = BOOLP (value);
#endif
#ifdef MOCHA
      else if (!strcasecmp ("DISABLE_JAVASCRIPT", name))
	prefs->disable_javascript = BOOLP (value);
#endif
#ifdef HAVE_SECURITY /* jwz */
      else if (!strcasecmp ("DEFAULT_USER_CERT", name))
	StrAllocCopy (prefs->def_user_cert, value);
      else if (!strcasecmp ("DEFAULT_MAIL_CERT", name))
	StrAllocCopy (prefs->def_mail_cert, value);
      else if (!strcasecmp ("ENABLE_SSL2", name))
	prefs->ssl2_enable = BOOLP (value);
      else if (!strcasecmp ("ENABLE_SSL3", name))
	prefs->ssl3_enable = BOOLP (value);
      else if (!strcasecmp ("CIPHER", name))
	StrAllocCopy (prefs->cipher, value);
#endif /* HAVE_SECURITY -- jwz */

      else if (!strcasecmp ("LICENSE_ACCEPTED", name))
	StrAllocCopy (prefs->license_accepted, value);

#ifdef HAVE_SECURITY /* jwz */
      /* New 4.0 preferences for 3.01... */
      else if (!strcasecmp ("CRYPTO_SIGN_OUTGOING_MAIL", name))
	prefs->crypto_sign_outgoing_mail = BOOLP (value);
      else if (!strcasecmp ("CRYPTO_SIGN_OUTGOING_NEWS", name))
	prefs->crypto_sign_outgoing_news = BOOLP (value);
      else if (!strcasecmp ("ENCRYPT_OUTGOING_MAIL", name))
	prefs->encrypt_outgoing_mail = BOOLP (value);
      else if (!strcasecmp ("WARN_FORWARD_ENCRYPTED", name))
	prefs->warn_forward_encrypted = BOOLP (value);
      else if (!strcasecmp ("WARN_REPLY_UNENCRYPTED", name))
	prefs->warn_reply_unencrypted = BOOLP (value);

      else if (!strcasecmp ("SECURITY_KEYGEN_MAXBITS", name))
	prefs->security_keygen_maxbits = atol (value);

      else if (!strcasecmp ("SECURITY_SSL2_DES_64", name))
	prefs->security_ssl2_des_64 = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SSL2_DES_EDE3_192", name))
	prefs->security_ssl2_des_ede3_192 = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SSL2_RC2_40", name))
	prefs->security_ssl2_rc2_40 = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SSL2_RC2_128", name))
	prefs->security_ssl2_rc2_128 = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SSL2_RC4_40", name))
	prefs->security_ssl2_rc4_40 = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SSL2_RC4_128", name))
	prefs->security_ssl2_rc4_128 = BOOLP (value);

      else if (!strcasecmp ("SECURITY_SSL3_FORTEZZA_FORTEZZA_SHA", name))
	prefs->security_ssl3_fortezza_fortezza_sha = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SSL3_FORTEZZA_NULL_SHA", name))
	prefs->security_ssl3_fortezza_null_sha = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SSL3_FORTEZZA_RC4_SHA", name))
	prefs->security_ssl3_fortezza_rc4_sha = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SSL3_RSA_DES_EDE3_SHA", name))
	prefs->security_ssl3_rsa_des_ede3_sha = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SSL3_RSA_DES_SHA", name))
	prefs->security_ssl3_rsa_des_sha = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SSL3_RSA_NULL_MD5", name))
	prefs->security_ssl3_rsa_null_md5 = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SSL3_RSA_RC2_40_MD5", name))
	prefs->security_ssl3_rsa_rc2_40_md5 = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SSL3_RSA_RC4_40_MD5", name))
	prefs->security_ssl3_rsa_rc4_40_md5 = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SSL3_RSA_RC4_128_MD5", name))
	prefs->security_ssl3_rsa_rc4_128_md5 = BOOLP (value);

      else if (!strcasecmp ("SECURITY_SMIME_DES", name))
	prefs->security_smime_des = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SMIME_DES_EDE3", name))
	prefs->security_smime_des_ede3 = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SMIME_RC2_40", name))
	prefs->security_smime_rc2_40 = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SMIME_RC2_64", name))
	prefs->security_smime_rc2_64 = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SMIME_RC2_128", name))
	prefs->security_smime_rc2_128 = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SMIME_RC5_B64R16K40", name))
	prefs->security_smime_rc5_b64r16k40 = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SMIME_RC5_B64R16K64", name))
	prefs->security_smime_rc5_b64r16k64 = BOOLP (value);
      else if (!strcasecmp ("SECURITY_SMIME_RC5_B64R16K128", name))
	prefs->security_smime_rc5_b64r16k128 = BOOLP (value);
#endif /* HAVE_SECURITY -- jwz */


      /* STYLES (GENERAL APPEARANCE)
       */
      else if (!strcasecmp ("TOOLBAR_ICONS", name))
	prefs->toolbar_icons_p = BOOLP (value);
      else if (!strcasecmp ("TOOLBAR_TEXT", name))
	prefs->toolbar_text_p = BOOLP (value);
      else if (!strcasecmp ("TOOLBAR_TIPS", name))
	prefs->toolbar_tips_p = BOOLP (value);
      else if (!strcasecmp ("STARTUP_MODE", name))
	prefs->startup_mode = atoi (value);
      else if (!strcasecmp ("HOME_DOCUMENT", name))
	StrAllocCopy (prefs->home_document, value);
      else if (!strcasecmp ("UNDERLINE_LINKS", name))
	prefs->underline_links_p = BOOLP (value);
      else if (!strcasecmp ("HISTORY_EXPIRATION", name))
	prefs->global_history_expiration = atoi (value);
      else if (!strcasecmp ("FIXED_MESSAGE_FONT", name))
	prefs->fixed_message_font_p = BOOLP (value);
/*** no longer valid. we need one each for mail and news - dp
      else if (!strcasecmp ("SORT_MESSAGES", name))
	prefs->msg_sort_style = atol (value);
      else if (!strcasecmp ("THREAD_MESSAGES", name))
	prefs->msg_thread_p = BOOLP (value);
***/

      /* BOOKMARK
       */
      else if (!strcasecmp ("ADD_URLS", name))
	StrAllocCopy (prefs->put_added_urls_under, value);
      else if (!strcasecmp ("BOOKMARK_MENU", name))
	StrAllocCopy (prefs->begin_bookmark_menu_under, value);

      /* PRINT
       */
      else if (!strcasecmp ("PRINT_COMMAND", name))
	StrAllocCopy (prefs->print_command, value);
      else if (!strcasecmp ("PRINT_REVERSED", name))
	prefs->print_reversed = BOOLP (value);
      else if (!strcasecmp ("PRINT_COLOR", name))
	prefs->print_color = BOOLP (value);
      else if (!strcasecmp ("PRINT_LANDSCAPE", name))
	prefs->print_landscape = BOOLP (value);
      else if (!strcasecmp ("PRINT_PAPER", name))
	prefs->print_paper_size = atoi (value);

#ifdef DEBUG_jwz
      else if (!strcasecmp ("PRINT_SIZE", name))
	prefs->print_font_size = atoi (value);
      else if (!strcasecmp ("PRINT_HEADER_P", name))
	prefs->print_header_p = BOOLP (value);
      else if (!strcasecmp ("PRINT_FOOTER_P", name))
	prefs->print_footer_p = BOOLP (value);
      else if (!strcasecmp ("PRINT_HEADER", name))
	  StrAllocCopy (prefs->print_header, value);
      else if (!strcasecmp ("PRINT_FOOTER", name))
	  StrAllocCopy (prefs->print_footer, value);
      else if (!strcasecmp ("PRINT_HMARGIN", name))
	prefs->print_hmargin = atoi (value);
      else if (!strcasecmp ("PRINT_VMARGIN", name))
	prefs->print_vmargin = atoi (value);
#endif /* DEBUG_jwz */

#ifdef EDITOR
      /* EDITOR */
      else if (!strcasecmp ("EDITOR_CHARACTER_TOOLBAR", name))
	  prefs->editor_character_toolbar = BOOLP(value);
      else if (!strcasecmp ("EDITOR_PARAGRAPH_TOOLBAR", name))
	  prefs->editor_paragraph_toolbar = BOOLP(value);
      else if (!strcasecmp ("EDITOR_AUTHOR_NAME", name))
	  StrAllocCopy (prefs->editor_author_name, value);
      else if (!strcasecmp ("EDITOR_HTML_EDITOR", name))
	  StrAllocCopy (prefs->editor_html_editor, value);
      else if (!strcasecmp ("EDITOR_IMAGE_EDITOR", name))
	  StrAllocCopy (prefs->editor_image_editor, value);
      else if (!strcasecmp ("EDITOR_NEW_DOCUMENT_TEMPLATE", name))
	  StrAllocCopy (prefs->editor_document_template, value);
      else if (!strcasecmp ("EDITOR_AUTOSAVE_PERIOD", name))
	  prefs->editor_autosave_period = atoi(value);
      else if (!strcasecmp ("EDITOR_CUSTOM_COLORS", name))
	  prefs->editor_custom_colors = BOOLP(value);
      else if (!strcasecmp ("EDITOR_BACKGROUND_COLOR", name))
	  prefs_parse_color(&prefs->editor_background_color, value);
      else if (!strcasecmp ("EDITOR_NORMAL_COLOR", name))
	  prefs_parse_color(&prefs->editor_normal_color, value);
      else if (!strcasecmp ("EDITOR_LINK_COLOR", name))
	  prefs_parse_color(&prefs->editor_link_color, value);
      else if (!strcasecmp ("EDITOR_ACTIVE_COLOR", name))
	  prefs_parse_color(&prefs->editor_active_color, value);
      else if (!strcasecmp ("EDITOR_FOLLOWED_COLOR", name))
	  prefs_parse_color(&prefs->editor_followed_color, value);
      else if (!strcasecmp ("EDITOR_BACKGROUND_IMAGE", name))
	  StrAllocCopy (prefs->editor_background_image, value);
      else if (!strcasecmp ("EDITOR_MAINTAIN_LINKS", name))
	  prefs->editor_maintain_links = BOOLP(value);
      else if (!strcasecmp ("EDITOR_KEEP_IMAGES", name))
	  prefs->editor_keep_images = BOOLP(value);
      else if (!strcasecmp ("EDITOR_PUBLISH_LOCATION", name))
	  StrAllocCopy (prefs->editor_publish_location, value);
      else if (!strcasecmp ("EDITOR_BROWSE_LOCATION", name))
	  StrAllocCopy (prefs->editor_browse_location, value);
      else if (!strcasecmp ("EDITOR_PUBLISH_USERNAME", name))
	  StrAllocCopy (prefs->editor_publish_username, value);
      else if (!strcasecmp ("EDITOR_PUBLISH_PASSWORD", name))
	  StrAllocCopy (prefs->editor_publish_password, value);
      else if (!strcasecmp ("EDITOR_COPYRIGHT_HINT", name))
	  prefs->editor_copyright_hint = BOOLP(value);
      /* to to add publish stuff */
#endif /*EDITOR*/
    }

  fclose (fp);

  prefs->pop3_msg_size_limit_p = (prefs->pop3_msg_size_limit > 0) ? True : False;
  prefs->pop3_msg_size_limit = abs (prefs->pop3_msg_size_limit);

  if (!prefs->dither_images ||
      !strcasecmp (prefs->dither_images, "TRUE") ||
      !strcasecmp (prefs->dither_images, "FALSE"))
    StrAllocCopy (prefs->dither_images, "Auto");

  if (!strcasecomp(prefs->def_user_cert, "do the default"))
    prefs->def_user_cert = XP_STRDUP(prefs->email_address);
  if (!strcasecomp(prefs->def_mail_cert, "do the default"))
    prefs->def_mail_cert = XP_STRDUP(prefs->email_address);

  {
    char *home = getenv ("HOME");
    if (!home) home = "";

#define FROB(SLOT)							\
    if (prefs->SLOT && *prefs->SLOT == '~')				\
      {									\
	if (prefs->SLOT[1] != '/' && prefs->SLOT[1] != 0)		\
	  {								\
	    fprintf (stderr,	XP_GetString( XFE_TILDE_USER_SYNTAX_DISALLOWED ), \
		     XP_AppName);					\
	  }								\
	else								\
	  {								\
	    char *new = (char *)					\
	      malloc (strlen (prefs->SLOT) + strlen (home) + 3);	\
	    strcpy (new, home);						\
	    if (home[strlen(home)-1] != '/')				\
	      strcat (new, "/");					\
	    if (prefs->SLOT[1] && prefs->SLOT[2])			\
	      strcat (new, prefs->SLOT + 2);				\
	    free (prefs->SLOT);						\
	    prefs->SLOT = new;						\
	  }								\
      }

    FROB(cache_dir)
    FROB(mail_fcc)
    FROB(news_fcc)
    FROB(tmp_dir)
    FROB(bookmark_file)
    FROB(history_file)
    FROB(global_mime_types_file)
    FROB(private_mime_types_file)
    FROB(global_mailcap_file)
    FROB(private_mailcap_file)
    FROB(signature_file)
    FROB(mail_directory)
    FROB(movemail_program)
    FROB(newsrc_directory)

#ifdef EDITOR
    FROB(editor_html_editor);
    FROB(editor_image_editor);
    FROB(editor_background_image);
#endif

#ifdef DEBUG_jwz
    IL_AnimationLoopsEnabled = prefs->anim_loop_p;
    IL_AnimationsEnabled = prefs->anim_p;
#endif /* DEBUG_jwz */
  }

  return (TRUE);
}

static char * xfe_organization (void);

static void
xfe_prefs_from_environment (XFE_GlobalPrefs *prefs)
{
  /* Set some slots in the prefs structure based on the environment.
   */
  char *env;
  if ((env = getenv ("WWW_HOME")))     StrAllocCopy (prefs->home_document,env);
  if ((env = getenv ("NNTPSERVER")))   StrAllocCopy (prefs->newshost, env);
  if ((env = getenv ("TMPDIR")))       StrAllocCopy (prefs->tmp_dir, env);

  if ((env = getenv ("NEWSRC")))
    {
      char *s;
      StrAllocCopy (prefs->newsrc_directory, env);
      s = strrchr (prefs->newsrc_directory, '/');
      if (s) *s = 0;
    }

  /* These damn proxy env vars *should* be set to "host:port" but apparently
     for historical reasons they tend to be set to "http://host:port/proxy/"
     so if there are any slashes in the name, extract the host and port as
     if it were a URL.

     And, as extra BS, we need to map "http://host/" to "host:80".  FMH.
   */
#define PARSE_PROXY_ENV(NAME,VAR)				\
    if ((env = getenv (NAME)))					\
      {								\
	char *new = (strchr (env, '/')				\
		     ? NET_ParseURL (env, GET_HOST_PART)	\
		     : strdup (env));				\
        if (! strchr (new, ':'))				\
	  {							\
	    char *new2 = (char *) malloc (strlen (new) + 10);	\
	    strcpy (new2, new);					\
	    strcat (new2, ":80");				\
	    free (new);						\
	    new = new2;						\
	  }							\
	if (VAR) free (VAR);					\
	VAR = new;						\
      }
  PARSE_PROXY_ENV ("ftp_proxy", prefs->ftp_proxy)
  PARSE_PROXY_ENV ("http_proxy", prefs->http_proxy)
#ifdef HAVE_SECURITY
  PARSE_PROXY_ENV ("https_proxy", prefs->https_proxy)
#endif
  PARSE_PROXY_ENV ("gopher_proxy", prefs->gopher_proxy)
  PARSE_PROXY_ENV ("wais_proxy", prefs->wais_proxy)
  /* #### hack commas in some way? */
  PARSE_PROXY_ENV ("no_proxy", prefs->no_proxy)
#undef PARSE_PROXY_ENV

  if (prefs->organization) free (prefs->organization);
  prefs->organization = xfe_organization ();
}


/* Hack yet another damned environment variable.
   Returns a string for the organization, or "" if none.
   Consults the ORGANIZATION environment variable, which
   may be a string (the organization) or 
 */
static char *
xfe_organization ()
{
  char *e;

  e = getenv ("NEWSORG");	/* trn gives this priority. */
  if (!e || !*e)
    e = getenv ("ORGANIZATION");

  if (!e || !*e)
    {
      /* GNUS does this so it must be right... */
      char *home = getenv ("HOME");
      if (!home) home = "";
      e = (char *) malloc (strlen (home) + 20);
      strcpy (e, home);
      strcat (e, "/.organization");
    }
  else
    {
      e = strdup (e);
    }

  if (*e == '/')
    {
      FILE *f = fopen (e, "r");
      if (f)
	{
	  char buf [1024];
	  char *s = buf;
	  int left = sizeof (buf) - 5;
	  int read;
	  *s = 0;
	  while (1)
	    {
	      if (fgets (s, left, f))
		read = strlen (s);
	      else
		break;
	      left -= read;
	      s += read;
	      *s++ = '\t';
	    }
	  *s = 0;
	  fclose (f);
	  free (e);
	  e = strdup (fe_StringTrim (buf));
	}
      else
	{
	  /* File unreadable - set e to "" */
	  *e = 0;
	}
    }

  if (! e) abort ();
  return e;
}


int16
XFE_GetDefaultCSID(void)
{
  int16 csid;

  csid = 0;

  if ((fe_globalData.default_url_charset != NULL)
      && (fe_globalData.default_url_charset[0] != 0))
  	csid = (INTL_CharSetNameToID((char *)fe_globalData.default_url_charset));

  if (csid)
  {
	if (csid == CS_JIS)
	{
		csid = CS_JIS_AUTO;
	}
	return csid;
  }

  return (CS_LATIN1);
}

extern void ekit_DefaultPrefs(XFE_GlobalPrefs *prefs);

void
XFE_DefaultPrefs (int which, XFE_GlobalPrefs *prefs)
{
  char *home = getenv ("HOME");
  char *tmp = getenv ("TMPDIR");
  char buf [1024];
  if (!home) home = "";
  if (!tmp || !*tmp) tmp = 0;
  if (!strcmp (home, "/"))
    home = "";

#define REPLACE_STRING(slot,string)	\
  if (slot) free (slot);		\
  slot = strdup (string)

  if (which == xfe_PREFS_ALL || which == xfe_PREFS_CACHE)
    {
#ifndef OLD_UNIX_FILES
      PR_snprintf (buf, sizeof (buf), "%.900s/.netscape/cache/", home);
#else  /* OLD_UNIX_FILES */
      PR_snprintf (buf, sizeof (buf), "%.900s/.netscape-cache/", home);
#endif /* OLD_UNIX_FILES */
      REPLACE_STRING (prefs->cache_dir, buf);
      prefs->memory_cache_size			= 3000;
      prefs->disk_cache_size			= 5000;
      prefs->verify_documents			= 0;
      prefs->cache_ssl_p			= False;
    }
  if (which == xfe_PREFS_ALL || which == xfe_PREFS_COMPOSITION)
    {
      prefs->qp_p = FALSE;
      prefs->send_formatted_text_p = FALSE;
      prefs->queue_for_later_p = FALSE;
      prefs->mail_bcc = 0;
      prefs->news_bcc = 0;
      PR_snprintf (buf, sizeof (buf), "%.900s/nsmail/Sent", home);
      REPLACE_STRING (prefs->mail_fcc, buf);
      REPLACE_STRING (prefs->news_fcc, buf);
      prefs->autoquote_reply = True;
    }
  if (which == xfe_PREFS_ALL || which == xfe_PREFS_SERVERS)
    {
      char buf [1024];
      char *id = 0, *name = 0;
      fe_DefaultUserInfo (&id, &name, False);

      REPLACE_STRING (prefs->mailhost,		"localhost");
      REPLACE_STRING (prefs->pop3_host,         "pop");
      REPLACE_STRING (prefs->pop3_user_id,      (id ? id : "unknown"));
      REPLACE_STRING (prefs->movemail_program,	"");
      if (name) free (name);
      if (id) free (id);

      PR_snprintf (buf, sizeof (buf), "%.900s/nsmail/", home);
      REPLACE_STRING (prefs->mail_directory, 	buf);

      prefs->use_movemail_p = TRUE;
      prefs->builtin_movemail_p = TRUE;
      prefs->pop3_leave_mail_on_server = FALSE;
      prefs->pop3_msg_size_limit = -50000;
      prefs->pop3_msg_size_limit_p = False;
      REPLACE_STRING(prefs->mail_folder_columns, "");
      REPLACE_STRING(prefs->mail_message_columns, "");
      prefs->mail_pane_style = FE_PANES_NORMAL;
      prefs->news_pane_style = FE_PANES_NORMAL;
      prefs->biff_interval = 10;
      prefs->auto_check_mail = True;

      REPLACE_STRING (prefs->tmp_dir,		(tmp ? tmp : "/tmp"));
#ifndef OLD_UNIX_FILES
      PR_snprintf (buf, sizeof (buf),
		    "%.900s/.netscape/bookmarks.html",	home);
#else  /* OLD_UNIX_FILES */
      PR_snprintf (buf, sizeof (buf),
		    "%.900s/.netscape-bookmarks.html",	home);
#endif /* OLD_UNIX_FILES */
      REPLACE_STRING (prefs->bookmark_file, 		buf);
#ifndef OLD_UNIX_FILES
      PR_snprintf (buf, sizeof (buf), "%.900s/.netscape/history.db", home);
#else  /* OLD_UNIX_FILES */
      PR_snprintf (buf, sizeof (buf), "%.900s/.netscape-history.db", home);
#endif /* OLD_UNIX_FILES */
      REPLACE_STRING (prefs->history_file, 		buf);

      REPLACE_STRING (prefs->newshost,		"news");
      prefs->news_max_articles			= 100;
      REPLACE_STRING (prefs->newsrc_directory, 	home);
      prefs->news_cache_xover			= FALSE;
      prefs->show_first_unread_p		= FALSE;
      REPLACE_STRING(prefs->news_folder_columns, "");
      REPLACE_STRING(prefs->news_message_columns, "");
    }
  if (which == xfe_PREFS_ALL || which == xfe_PREFS_FONTS)
    {
      prefs->doc_csid = XFE_GetDefaultCSID();
      prefs->citation_font = MSG_ItalicFont;
      prefs->citation_size = MSG_NormalSize;
      REPLACE_STRING (prefs->citation_color, "");
    }
  if (which == xfe_PREFS_ALL || which == xfe_PREFS_HELPERS)
    {
#define DIR "/usr/local/lib/netscape/"
      REPLACE_STRING (prefs->global_mime_types_file, DIR "mime.types");
      REPLACE_STRING (prefs->global_mailcap_file,    DIR "mailcap");
#undef DIR
      PR_snprintf (buf, sizeof (buf), "%.900s/.mime.types", home);
      REPLACE_STRING (prefs->private_mime_types_file, buf);
      PR_snprintf (buf, sizeof (buf), "%.900s/.mailcap", home);
      REPLACE_STRING (prefs->private_mailcap_file, buf);

      REPLACE_STRING (prefs->telnet_command,	"xterm -e telnet %h %p");
      REPLACE_STRING (prefs->tn3270_command,	"xterm -e tn3270 %h");
      REPLACE_STRING (prefs->rlogin_command,	"xterm -e rlogin %h");
      REPLACE_STRING (prefs->rlogin_user_command,"xterm -e rlogin %h -l %u");
    }
  if (which == xfe_PREFS_ALL || which == xfe_PREFS_IDENTITY)
    {
      char *o = xfe_organization ();
      fe_DefaultUserInfo (&prefs->email_address, &prefs->real_name, False);
      REPLACE_STRING (prefs->organization,	o);
      PR_snprintf (buf, sizeof (buf), "%.900s/.signature", home);
      REPLACE_STRING (prefs->signature_file, 	buf);
      prefs->anonymity_level = 0;
      free (o);
    }
  if (which == xfe_PREFS_ALL || which == xfe_PREFS_IMAGES)
    {
      REPLACE_STRING (prefs->dither_images, "Auto");
      prefs->streaming_images	= True;
#ifdef DEBUG_jwz
      prefs->anim_p = True;
      prefs->anim_loop_p = True;
#endif /* DEBUG_jwz */
    }
  if (which == xfe_PREFS_ALL || which == xfe_PREFS_NETWORK)
    {
      prefs->network_buffer_size		= 32;
      prefs->max_connections			= 4;
    }
  if (which == xfe_PREFS_ALL || which == xfe_PREFS_PROXIES)
    {
      prefs->proxy_mode = 0; /* no proxies */
      REPLACE_STRING (prefs->proxy_url,		"");

      REPLACE_STRING (prefs->ftp_proxy,		"");
      REPLACE_STRING (prefs->gopher_proxy,	"");
      REPLACE_STRING (prefs->http_proxy,	"");
#ifdef HAVE_SECURITY /* added by jwz */
      REPLACE_STRING (prefs->https_proxy,	"");
#endif /* HAVE_SECURITY */
      REPLACE_STRING (prefs->wais_proxy,	"");
      REPLACE_STRING (prefs->no_proxy,		"");
      REPLACE_STRING (prefs->socks_host,	"");
    }
  if (which == xfe_PREFS_ALL || which == xfe_PREFS_PROTOCOLS)
    {
      prefs->email_anonftp = False;
      prefs->email_submit = True;
      prefs->accept_cookie = NET_SilentCookies;
    }
  if (which == xfe_PREFS_ALL || which == xfe_PREFS_SEC_GENERAL)
    {
      prefs->ask_password	= 1;
      prefs->password_timeout	= 30;

#ifdef HAVE_SECURITY
      prefs->enter_warn		= True;
      prefs->leave_warn		= True;
      prefs->mixed_warn		= True;
      prefs->submit_warn	= True;
      prefs->ssl2_enable        = True;
      prefs->ssl3_enable        = True;
#else
      prefs->enter_warn		= False;
      prefs->leave_warn		= False;
      prefs->mixed_warn		= False;
      prefs->submit_warn	= False;
      prefs->ssl2_enable        = False;
      prefs->ssl3_enable        = False;
#endif

#ifdef JAVA
      prefs->disable_java	= False;
#endif
#ifdef MOCHA
      prefs->disable_javascript	= False;
#endif /* MOCHA */

      prefs->cipher             = NULL;
    }
  if (which == xfe_PREFS_ALL || which == xfe_PREFS_SEC_PASSWORDS)
    {
      /* Nothing to do for now */
    }
  if (which == xfe_PREFS_ALL || which == xfe_PREFS_SEC_PERSONAL)
    {
      REPLACE_STRING(prefs->def_user_cert, "do the default");
      REPLACE_STRING(prefs->def_mail_cert, "do the default");
    }

  /* New 4.0 preferences for 3.01... */
  if (which == xfe_PREFS_ALL)
    {
      prefs->crypto_sign_outgoing_mail = FALSE;
      prefs->crypto_sign_outgoing_news = FALSE;
      prefs->encrypt_outgoing_mail     = FALSE;
      prefs->warn_forward_encrypted    = TRUE;
      prefs->warn_reply_unencrypted    = TRUE;

      prefs->security_keygen_maxbits		 = 512;

      prefs->security_ssl2_des_ede3_192		 = TRUE;  /* Domestic */
      prefs->security_ssl2_des_64		 = TRUE;  /* Domestic */
      prefs->security_ssl2_rc2_40		 = TRUE;  /* Export   */
      prefs->security_ssl2_rc2_128		 = TRUE;  /* Domestic */
      prefs->security_ssl2_rc4_40		 = TRUE;  /* Export   */
      prefs->security_ssl2_rc4_128		 = TRUE;  /* Domestic */

      prefs->security_ssl3_fortezza_fortezza_sha = TRUE;  /* Fortezza */
      prefs->security_ssl3_fortezza_null_sha	 = FALSE; /* Fortezza */
      prefs->security_ssl3_fortezza_rc4_sha	 = TRUE;  /* Fortezza */
      prefs->security_ssl3_rsa_des_ede3_sha	 = TRUE;  /* Domestic */
      prefs->security_ssl3_rsa_des_sha		 = TRUE;  /* Domestic */
      prefs->security_ssl3_rsa_null_md5		 = FALSE; /* Export   */
      prefs->security_ssl3_rsa_rc2_40_md5	 = TRUE;  /* Export   */
      prefs->security_ssl3_rsa_rc4_40_md5	 = TRUE;  /* Export   */
      prefs->security_ssl3_rsa_rc4_128_md5	 = TRUE;  /* Domestic */

      prefs->security_smime_des			 = TRUE;  /* Domestic */
      prefs->security_smime_des_ede3		 = TRUE;  /* Domestic */
      prefs->security_smime_rc2_40		 = TRUE;  /* Export   */
      prefs->security_smime_rc2_64		 = TRUE;  /* Domestic */
      prefs->security_smime_rc2_128		 = TRUE;  /* Domestic */
      prefs->security_smime_rc5_b64r16k40 	 = TRUE;
      prefs->security_smime_rc5_b64r16k64 	 = TRUE;
      prefs->security_smime_rc5_b64r16k128	 = TRUE;
    }

  if (which == xfe_PREFS_ALL || which == xfe_PREFS_STYLES)
    {
      char *h = (
#if defined(__sgi)
		 fe_VendorAnim
		 ? XP_GetString(XFE_WELCOME_HTML) :
#endif
		 xfe_get_netscape_home_page_url());

      prefs->toolbar_icons_p			= True;
      prefs->toolbar_text_p			= True;
      prefs->toolbar_tips_p			= True;

      prefs->startup_mode			= 0;

      REPLACE_STRING (prefs->home_document, h);
      prefs->underline_links_p			= True;
      prefs->global_history_expiration		= 9;
      prefs->fixed_message_font_p		= FALSE;
/*** no longer valid. we need one each for mail and news - dp
      prefs->msg_sort_style = 0;
      prefs->msg_thread_p = TRUE;
***/
      prefs->show_toolbar_p			= True;
      prefs->show_url_p				= True;
      prefs->show_directory_buttons_p		= True;
      prefs->show_menubar_p			= True;
      prefs->show_bottom_status_bar_p		= True;
      prefs->autoload_images_p			= True;
      prefs->fancy_ftp_p			= True;
      prefs->doc_csid				= XFE_GetDefaultCSID();
#ifdef HAVE_SECURITY
      prefs->show_security_bar_p		= True;
#endif
    }

#ifdef EDITOR
    if (which == xfe_PREFS_ALL) {
	fe_EditorDefaultGetColors(&prefs->editor_background_color,
				  &prefs->editor_normal_color,
				  &prefs->editor_link_color,
				  &prefs->editor_active_color,
				  &prefs->editor_followed_color);

	/* editor_document_template is only default string allocated */
	REPLACE_STRING(prefs->editor_document_template,
		       fe_EditorDefaultGetTemplate());
	REPLACE_STRING(prefs->editor_html_editor, "xterm -e vi %f");
	prefs->editor_autosave_period = 0; /* minutes */
	prefs->editor_maintain_links = TRUE;
	prefs->editor_keep_images = TRUE;
	prefs->editor_copyright_hint = TRUE;
	prefs->editor_character_toolbar = TRUE;
	prefs->editor_paragraph_toolbar = TRUE;
    }
#endif

  if (which == xfe_PREFS_ALL) /* ### || which == xfe_PREFS_PRINT) */
    {
#if defined(__sgi) || (defined(__sun) && defined(__svr4__))
      REPLACE_STRING (prefs->print_command,	"lp");
#else
      REPLACE_STRING (prefs->print_command,	"lpr");
#endif
      prefs->print_reversed			= False;
      prefs->print_color			= True;
      prefs->print_landscape			= False;
      prefs->print_paper_size			= 0;
#ifdef DEBUG_jwz
      prefs->print_font_size                    = 0;
      prefs->print_header_p                     = True;
      prefs->print_footer_p                     = True;
      REPLACE_STRING (prefs->print_header,	"");
      REPLACE_STRING (prefs->print_footer,	"");
      prefs->print_hmargin			= 72 * 0.75;
      prefs->print_vmargin			= 72;
#endif /* DEBUG_jwz */
    }

  /*
   * This doesn't have a place in the prefs dialog yet,
   * So only set the default if we're resetting *all*
   * of the prefs.  (Like when ~/.netscape/prefs isn't on disk.)
   * DEM 4/30/96
   */
  if ( which == xfe_PREFS_ALL ) {
      prefs->movemail_warn = False;
  }

  /*
   * If the user specified alternate default prefs using the e-kit,
   * use them instead of the hard-wired values.
   */
  ekit_DefaultPrefs(prefs);
#undef REPLACE_STRING
}



/* bare-minimum implementation of 4.0 preferences in 3.01. */

#include "prefapi.h"

static XP_Bool *
pref_get_bool_slot(const char *pref_name, XFE_GlobalPrefs *prefs)
{
  if (!strcasecomp(pref_name,		     "mail.crypto_sign_outgoing_mail"))
    return &prefs->crypto_sign_outgoing_mail;
  else if (!strcasecomp(pref_name,	     "mail.crypto_sign_outgoing_news"))
    return &prefs->crypto_sign_outgoing_news;
  else if (!strcasecomp(pref_name,	     "mail.encrypt_outgoing_mail"))
    return &prefs->encrypt_outgoing_mail;
  else if (!strcasecomp(pref_name,	     "mail.warn_forward_encrypted"))
    return &prefs->warn_forward_encrypted;
  else if (!strcasecomp(pref_name,	     "mail.warn_reply_unencrypted"))
    return &prefs->warn_reply_unencrypted;
  else if (!strcasecomp(pref_name,	     "security.enable_ssl2"))
    return &prefs->ssl2_enable;
  else if (!strcasecomp(pref_name,	     "security.enable_ssl3"))
    return &prefs->ssl3_enable;
  else if (!strcasecomp(pref_name,	     "security.warn_viewing_mixed"))
    return &prefs->mixed_warn;
  else if (!strcasecomp(pref_name,	     "security.warn_entering_secure"))
    return &prefs->enter_warn;
  else if (!strcasecomp(pref_name,	     "security.warn_leaving_secure"))
    return &prefs->leave_warn;
  else if (!strcasecomp(pref_name,	     "security.warn_submit_insecure"))
    return &prefs->submit_warn;

  else if (!strcasecomp(pref_name,	     "security.smime.des"))
    return &prefs->security_smime_des;
  else if (!strcasecomp(pref_name,	     "security.smime.des_ede3"))
    return &prefs->security_smime_des_ede3;
  else if (!strcasecomp(pref_name,	     "security.smime.rc2_40"))
    return &prefs->security_smime_rc2_40;
  else if (!strcasecomp(pref_name,	     "security.smime.rc2_64"))
    return &prefs->security_smime_rc2_64;
  else if (!strcasecomp(pref_name,	     "security.smime.rc2_128"))
    return &prefs->security_smime_rc2_128;
  else if (!strcasecomp(pref_name,	     "security.smime.rc5.b64r16k128"))
    return &prefs->security_smime_rc5_b64r16k128;
  else if (!strcasecomp(pref_name,	     "security.smime.rc5.b64r16k40"))
    return &prefs->security_smime_rc5_b64r16k40;
  else if (!strcasecomp(pref_name,	     "security.smime.rc5.b64r16k64"))
    return &prefs->security_smime_rc5_b64r16k64;
  else if (!strcasecomp(pref_name,	     "security.ssl2.des_64"))
    return &prefs->security_ssl2_des_64;
  else if (!strcasecomp(pref_name,	     "security.ssl2.des_ede3_192"))
    return &prefs->security_ssl2_des_ede3_192;
  else if (!strcasecomp(pref_name,	     "security.ssl2.rc2_40"))
    return &prefs->security_ssl2_rc2_40;
  else if (!strcasecomp(pref_name,	     "security.ssl2.rc2_128"))
    return &prefs->security_ssl2_rc2_128;
  else if (!strcasecomp(pref_name,	     "security.ssl2.rc4_40"))
    return &prefs->security_ssl2_rc4_40;
  else if (!strcasecomp(pref_name,	     "security.ssl2.rc4_128"))
    return &prefs->security_ssl2_rc4_128;
  else if (!strcasecomp(pref_name,	"security.ssl3.fortezza_fortezza_sha"))
    return &prefs->security_ssl3_fortezza_fortezza_sha;
  else if (!strcasecomp(pref_name,	    "security.ssl3.fortezza_null_sha"))
    return &prefs->security_ssl3_fortezza_null_sha;
  else if (!strcasecomp(pref_name,	     "security.ssl3.fortezza_rc4_sha"))
    return &prefs->security_ssl3_fortezza_rc4_sha;
  else if (!strcasecomp(pref_name,	     "security.ssl3.rsa_des_ede3_sha"))
    return &prefs->security_ssl3_rsa_des_ede3_sha;
  else if (!strcasecomp(pref_name,	     "security.ssl3.rsa_des_sha"))
    return &prefs->security_ssl3_rsa_des_sha;
  else if (!strcasecomp(pref_name,	     "security.ssl3.rsa_null_md5"))
    return &prefs->security_ssl3_rsa_null_md5;
  else if (!strcasecomp(pref_name,	     "security.ssl3.rsa_rc2_40_md5"))
    return &prefs->security_ssl3_rsa_rc2_40_md5;
  else if (!strcasecomp(pref_name,	     "security.ssl3.rsa_rc4_40_md5"))
    return &prefs->security_ssl3_rsa_rc4_40_md5;
  else if (!strcasecomp(pref_name,	     "security.ssl3.rsa_rc4_128_md5"))
    return &prefs->security_ssl3_rsa_rc4_128_md5;

  else
    {
      XP_ASSERT(0);
      return 0;
    }
}

static int *
pref_get_int_slot(const char *pref_name, XFE_GlobalPrefs *prefs)
{
  if (!strcasecomp(pref_name,      "security.ask_for_password"))
    return &prefs->ask_password;
  else if (!strcasecomp(pref_name, "security.password_lifetime"))
    return &prefs->password_timeout;
  else if (!strcasecomp(pref_name, "security.keygen.maxbits"))
    return &prefs->security_keygen_maxbits;
  else
    {
      XP_ASSERT(0);
      return 0;
    }
}

static char **
pref_get_string_slot(const char *pref_name, XFE_GlobalPrefs *prefs)
{
  if (!strcasecomp(pref_name, "security.ciphers"))
    return &prefs->cipher;
  else if (!strcasecomp(pref_name, "security.default_personal_cert"))
    return &prefs->def_user_cert;
  else if (!strcasecomp(pref_name, "security.default_mail_cert"))
    return &prefs->def_mail_cert;
  else
    {
      XP_ASSERT(0);
      return 0;
    }
}

int
PREF_SetBoolPref(const char *pref, XP_Bool value)
{
  XP_Bool *slot = pref_get_bool_slot (pref, &fe_globalPrefs);
  if (!slot) return -1;
  *slot = value;
  return 0;
}

int
PREF_SetIntPref(const char *pref, int32 value)
{
  int *slot = pref_get_int_slot (pref, &fe_globalPrefs);
  if (!slot) return -1;
  *slot = value;
  return 0;
}

int
PREF_SetCharPref(const char *pref, const char *value)
{
  char **slot = pref_get_string_slot (pref, &fe_globalPrefs);
  if (!slot) return -1;
  if (*slot) free(*slot);
  *slot = strdup(value ? value : "");
  return 0;
}

int
PREF_GetBoolPref(const char *pref, XP_Bool *return_val)
{
  XP_Bool *slot = pref_get_bool_slot (pref, &fe_globalPrefs);
  if (!slot) return -1;
  *return_val = *slot;
  return 0;
}

int
PREF_GetIntPref(const char *pref, int32 *return_int)
{
  int *slot = pref_get_int_slot (pref, &fe_globalPrefs);
  if (!slot) return -1;
  *return_int = *slot;
  return 0;
}

int
PREF_GetCharPref(const char *pref, char *return_buf, int *buf_len)
{
  char **slot = pref_get_string_slot (pref, &fe_globalPrefs);
  if (!slot) return -1;
  if (!*slot)
    *return_buf = 0;
  else
    strcpy(return_buf, *slot);	     /* Robert T. Morris, Jr. Memorial Bug. */
  *buf_len = strlen(return_buf);
  return 0;
}

int
PREF_CopyCharPref(const char *pref, char **return_buf)
{
  char **slot = pref_get_string_slot (pref, &fe_globalPrefs);
  *return_buf = 0;
  if (!slot) return -1;
  if (*slot)
    *return_buf = strdup(*slot);
  else
    *return_buf = strdup("");
  return 0;
}


extern int XFE_ERROR_SAVING_OPTIONS;

int
PREF_SavePrefFile(void)
{
  if (!XFE_SavePrefs ((char *) fe_globalData.user_prefs_file, &fe_globalPrefs))
    {
      fe_perror (fe_all_MWContexts->context,
		 XP_GetString(XFE_ERROR_SAVING_OPTIONS));
      return -1;
    }
  return 0;
}