/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * The contents of this file are subject to the Netscape Public License
 * Version 1.0 (the "NPL"); you may not use this file except in
 * compliance with the NPL.  You may obtain a copy of the NPL at
 * http://www.mozilla.org/NPL/
 *
 * Software distributed under the NPL is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
 * for the specific language governing rights and limitations under the
 * NPL.
 *
 * The Initial Developer of this code under the NPL is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
 * Reserved.
 */
/* 
   dialogs.c --- Preference dialogs.
   Created: Spence Murray <spence@netscape.com>, 30-Sep-95.
 */


#define PREFS_NET
#define PREFS_SOCKS
#define PREFS_DISK_CACHE
#define PREFS_VERIFY
#define PREFS_CLEAR_CACHE_BUTTONS
#define PREFS_SIG
#define PREFS_NEWS_MAX
#define PREFS_8BIT
/* #define PREFS_EMPTY_TRASH */
/* #define PREFS_QUEUED_DELIVERY */

#include <stdio.h>

#include "mozilla.h"
#include "xlate.h"
#include "xfe.h"
#include "felocale.h"
#include "nslocks.h"
#include "secnav.h"
#include "cert.h"
#include "mozjava.h"
#include "prnetdb.h"
#include "e_kit.h"
#include "pref_helpers.h"

#include "libmocha.h"

#include <Xm/Label.h>
#include <Xm/CascadeBG.h>
#include <Xm/PanedW.h>
#include <Xm/PushB.h>
#include <Xm/ToggleB.h>

#include <Xm/ArrowBG.h>

#ifndef _STDC_
#define _STDC_ 1
#define HACKED_STDC 1
#endif

#include <XmL/Folder.h>

#ifdef HACKED_STDC
#undef HACKED_STDC
#undef _STDC_
#endif

#include "xp_sec.h"

#include "msgcom.h"

#include "libimg.h"             /* Image Library public API. */


/* For sys_errlist and sys_nerr */
#include <sys/errno.h>
#if !defined(__FreeBSD__) && !defined(LINUX_GLIBC_2)
extern char *sys_errlist[];
extern int sys_nerr;
#endif

#include "prprf.h"
#include "libi18n.h"
#include "fonts.h"


/* for XP_GetString() */
#include <xpgetstr.h>
extern int XFE_UNKNOWN_ERROR;

extern int XFE_FILE_DOES_NOT_EXIST;
extern int XFE_FTP_PROXY_HOST;
#ifdef MOZ_MAIL_NEWS
extern int XFE_GLOBAL_MAILCAP_FILE;
extern int XFE_GLOBAL_MIME_FILE;
#endif
extern int XFE_GOPHER_PROXY_HOST;
extern int XFE_HOST_IS_UNKNOWN;
extern int XFE_HTTPS_PROXY_HOST;
extern int XFE_HTTP_PROXY_HOST;
extern int XFE_NO_PORT_NUMBER;
#ifdef MOZ_MAIL_NEWS
extern int XFE_MAIL_HOST;
extern int XFE_NEWS_HOST;
extern int XFE_NEWS_RC_DIRECTORY;
extern int XFE_PRIVATE_MAILCAP_FILE;
extern int XFE_PRIVATE_MIME_FILE;
#endif
extern int XFE_SOCKS_HOST;
extern int XFE_TEMP_DIRECTORY;
extern int XFE_WAIS_PROXY_HOST;
extern int XFE_WARNING;
extern int XFE_ERROR_SAVING_OPTIONS;
extern int XFE_GENERAL;
extern int XFE_PASSWORDS;
extern int XFE_PERSONAL_CERTIFICATES;
extern int XFE_SITE_CERTIFICATES;
extern int XFE_APPEARANCE;
extern int XFE_BOOKMARKS;
extern int XFE_COLORS;
extern int XFE_FONTS;
extern int XFE_APPLICATIONS;
extern int XFE_HELPERS;
extern int XFE_IMAGES;
extern int XFE_LANGUAGES;
extern int XFE_CACHE;
extern int XFE_CONNECTIONS;
extern int XFE_PROXIES;
extern int XFE_PROTOCOLS;
extern int XFE_LANG;
extern int XFE_APPEARANCE;
extern int XFE_COMPOSE_DLG;
extern int XFE_SERVERS;
extern int XFE_IDENTITY;
extern int XFE_ORGANIZATION;
extern int XFE_CHANGE_PASSWORD;
extern int XFE_SET_PASSWORD;
#ifdef MOZ_MAIL_NEWS
extern int XFE_PRIVATE_MIMETYPE_RELOAD;
extern int XFE_PRIVATE_MAILCAP_RELOAD;
extern int XFE_PRIVATE_RELOADED_MIMETYPE;
extern int XFE_PRIVATE_RELOADED_MAILCAP;
#endif

extern void fe_installGeneralAppearance(void);
extern void fe_installGeneralFonts(void);
extern void fe_installGeneralColors(void);
extern void fe_installGeneralAdvanced(void);
extern void fe_installGeneralPasswd(void);
extern void fe_installGeneralCache(void);
extern void fe_installGeneralProxies(void);
extern void fe_installBrowser(void);
extern void fe_installBrowserAppl(void);
#ifdef MOZ_MAIL_NEWS
extern void fe_installMailNews(void);
extern void fe_installMailNewsIdentity(void);
extern void fe_installMailNewsComposition(void);
extern void fe_installMailNewsMserver(void);
extern void fe_installMailNewsNserver(void);
extern void fe_installMailNewsAddrBook(void);
extern void fe_installOfflineNews(void);
extern void fe_installMserverMore(void);
#endif
extern void fe_installProxiesView(void);
extern void fe_installDiskMore(void);
extern void fe_installSslConfig(void);
extern void fe_installOffline(void);
extern void fe_installDiskSpace(void);

/* Preferences
 */

struct fe_prefs_data
{
  MWContext *context;

  Widget shell, form;
  Widget promptDialog;

  /*=== General prefs folder ===*/
  Widget general_form;

  /* Appearance page */
  Widget styles1_selector, styles1_page;
  Widget icons_p, text_p, both_p, tips_p;
  Widget browser_p, mail_p, news_p;
  Widget blank_p, home_p, home_text;
  Widget underline_p;
  Widget expire_days_p, expire_days_text, never_expire_p;

  /* Applications page */
  Widget apps_selector, apps_page;
  Widget tmp_text;
  Widget telnet_text, tn3270_text, rlogin_text, rlogin_user_text;

#if 0
  /* Bookmarks page */
  Widget bookmarks_selector, bookmarks_page;
  Widget book_text;
#endif

  /* Colors page */
  Widget colors_selector, colors_page;

  /* Fonts page */
  Widget fonts_selector, fonts_page;
  Widget prop_family_pulldown, fixed_family_pulldown;
  Widget prop_family_option, fixed_family_option;
  Widget prop_size_pulldown, fixed_size_pulldown;
  Widget prop_size_option, fixed_size_option;
  Widget prop_size_field, fixed_size_field;
  Widget prop_size_toggle, fixed_size_toggle;
  int fonts_changed;

  /* Helpers page */
  Widget helpers_selector, helpers_page;
  int helpers_changed;

  struct fe_prefs_helpers_data *helpers;

  /* Images page */
  Widget images_selector, images_page;
  Widget auto_p, dither_p, closest_p;
  Widget while_loading_p, after_loading_p;

  /* Languages page */
  Widget languages_selector, languages_page;
  Widget lang_reg_avail, lang_reg_pref, lang_reg_text;
  Widget tmpDefaultButton;

  /*=== Mail/News prefs folder ===*/
  Widget mailnews_form;

  /* Appearance page */
  Widget appearance_selector, appearance_page;
  Widget fixed_message_font_p, var_message_font_p;
  Widget cite_plain_p, cite_bold_p, cite_italic_p, cite_bold_italic_p;
  Widget cite_normal_p, cite_bigger_p, cite_smaller_p;
  Widget cite_color_text;
  Widget mail_horiz_p, mail_vert_p, mail_stack_p;
  Widget news_horiz_p, news_vert_p, news_stack_p;
  Widget msgwin_use_mailwin_p, msgwin_use_new_p, msgwin_use_existing_p;

  /* Compose page */
  Widget compose_selector, compose_page;
  Widget eightbit_toggle, qp_toggle;
  Widget deliverAuto_toggle, deliverQ_toggle;
  Widget mMailOutSelf_toggle, mMailOutOther_text;
  Widget nMailOutSelf_toggle, nMailOutOther_text;
  Widget mCopyOut_text;
  Widget nCopyOut_text;
  Widget autoquote_toggle;

  /* Servers page */
  Widget dirs_selector, dirs_page;
  Widget srvr_text, user_text;
  Widget pop_toggle;
  Widget movemail_text;
  Widget external_toggle, builtin_toggle;
  Widget no_limit, msg_limit, limit_text;
  Widget msg_remove, msg_leave;
  Widget check_every, check_never, check_text;
  Widget smtp_text, maildir_text;
  Widget newshost_text, newsrc_text, newsmax_text;

  /* Identity page */
  Widget identity_selector, identity_page;
  Widget user_name_text, user_mail_text, user_org_text, user_sig_text;

  /* Organization page */
  Widget organization_selector, organization_page;
  Widget emptyTrash_toggle, rememberPswd_toggle;
  Widget threadmail_toggle, threadnews_toggle;
  Widget mdate_toggle, mnum_toggle, msubject_toggle, msender_toggle;
  Widget ndate_toggle, nnum_toggle, nsubject_toggle, nsender_toggle;

  /*=== Network prefs folder ===*/
  Widget network_form;

  /* Cache page */
  Widget cache_selector, cache_page;
  Widget memory_text, memory_clear;
  Widget disk_text, disk_dir, disk_clear;
  Widget verify_label, once_p, every_p, expired_p;
  Widget cache_ssl_p;

  /* Nework page */
  Widget network_selector, network_page;
  Widget buf_label, buf_text;
  Widget conn_label, conn_text;

  /* Proxies page */
  Widget proxies_selector, proxies_page;
  Widget no_proxies_p, manual_p, manual_browse;
  Widget auto_proxies_p, proxy_label, proxy_text;
  Widget proxy_reload;

  Widget ftp_text, ftp_port;
  Widget gopher_text, gopher_port;
  Widget http_text, http_port;
  Widget https_text, https_port;
  Widget wais_text, wais_port;
  Widget no_text;
  Widget socks_text, socks_port;

  /* Protocols page */
  Widget protocols_selector, protocols_page;
  Widget cookie_p;	/* Show alert before accepting a cookie */
  Widget anon_ftp_p;	/* Use email address for anon ftp */
  Widget email_form_p;	/* Show alert before submiting a form by email */

  /* Languages page */
  Widget lang_selector, lang_page;
#ifdef JAVA
  Widget java_toggle;
#endif

  Widget javascript_toggle;

  /*=== Security prefs folder ===*/
  Widget security_form;

  /* General Security page */
  Widget sec_general_selector, sec_general_page;
  Widget enter_toggle, leave_toggle, mixed_toggle, submit_toggle;
  Widget ssl2_toggle, ssl3_toggle;

  /* Security Passwords page */
  Widget sec_passwords_selector, sec_passwords_page;
  Widget once_toggle, every_toggle, periodic_toggle;
  Widget periodic_text, change_password;
#ifdef FORTEZZA
  Widget fortezza_toggle, fortezza_timeout;
#endif

  /* Personal Certificates page */
  Widget personal_selector, personal_page;
  Widget pers_list, pers_info, pers_delete_cert, pers_new_cert;
  Widget site_default, pers_label;
  Widget pers_cert_menu;
  char *deleted_user_cert;

  /* Site Certificates page */
  Widget site_selector, site_page;
  Widget all_list, all_edit_cert, all_delete_cert;
  Widget all_label;
  char *deleted_site_cert;
};

void
FE_SetPasswordAskPrefs(MWContext *context, int askPW, int timeout)
{
}

void
FE_SetPasswordEnabled(MWContext *context, PRBool usePW)
{
}


void
fe_MarkHelpersModified(MWContext *context)
{
  /* Mark that the helpers have been modified. We need this
   * to detect if we need to save/reload all these helpers.
   * For doing this, the condition we adopt is
   * (1) User clicked on 'OK' button for the Edit Helpers Dialog
   *	This also covers the "New" case as the same Dialog
   *	is shown for the "New" and "Edit".
   * (2) User deleted a mime/type and confirmed it.
   */
  if (context && CONTEXT_DATA(context)->fep)
    CONTEXT_DATA(context)->fep->helpers_changed = TRUE;
}


const char *multiline_continuator = "\t\t\n";
/*
 * This belongs in a utility module
 *
 * Convert an array of strings
 * to multiline string (embedded new-lines)
 *
 *  returns a string built up from the array
 *
 * The caller must free the array
 */
char *
array_to_multiline_str(char **array, int cnt)
{
  char *mstring, *p;
  int i, str_len;

  /*
   * Handle an empty array
   */
  if (cnt == 0) {
    /* always allocate an array so the caller can free it */
    mstring = strdup("\n");
    return mstring;
  }

  /*
   * Get the length of the multiline string
   */
  str_len = 0;
  for (i=0; i<cnt; i++) {
    if (i != 0)
      str_len += strlen(multiline_continuator);
    str_len += strlen(array[i]);
  }
  str_len += 2; /* space for new-line and terminator */
  mstring = (char *)XP_ALLOC(str_len);

  for (p=mstring, i=0; i<cnt; i++) {
    if (i != 0) {
      strcpy(p, multiline_continuator);
      p += strlen(multiline_continuator);
    }
    strcpy(p, array[i]);
    p += strlen(array[i]);
  }
  /*
   * Note: don't add a final line-feed for multiline
   * as the prefs_write_string() function handles it funny
   */
  return mstring;
}

/*
 * This belongs in a utility module
 *
 * Convert an array of strings
 * to multiline preference (embedded new-lines)
 *
 *  returns a preference value string built up from the array
 *
 * The caller must free the array
 */
char *
array_to_multiline_pref(char **array, int cnt)
{
  char *string;
  string = array_to_multiline_str(array, cnt);
  return string;
}

/*
 * This belongs in a utility module
 *
 * Convert a multiline string (embedded new-lines)
 * to an array of strings
 *  create the array
 *  copies the lines into the array
 *  returns length of the array
 *
 * To free the array:
 *   for (i=0; i<cnt; i++)
 *      XP_FREE(array[i]);
 *   XP_FREE(array);
 */
int
multiline_str_to_array(const char *string, char ***array_p)
{
    char *p, *q, **array;
    int i, cnt, len;
    Boolean at_start_of_line;
    
    /* handle null string */
    if (string == NULL) {
	/* always allocate an array so the caller can free it */
	array = (char **)XP_ALLOC(sizeof(char *));
	array[0] = NULL;
	*array_p = array;
	return 0;
    }

    /* 
     * count the number of lines 
     * (count beginnings so we will count any last line without a '\n')
	 * This supports multibyte text only because '\n' is less than 0x40
     */
    cnt = 0;
    at_start_of_line = True;
    for (p=(char *)string; *p; p++) {
	if (at_start_of_line) {
	    cnt += 1;
	    at_start_of_line = False;
	}
	if (*p == '\n') {
	    at_start_of_line = True;
	}
    }

    /* copy lines into the array */
    array = (char **)XP_ALLOC((cnt+1) * sizeof(char *));
    i = 0;
    len = 0;
    for (p=q=(char *)string; *p; p++) {
	if (*p == '\n') {
	    array[i] = (char *)XP_ALLOC(len+1);
	    strncpy(array[i], q, len);
	    /* add a string terminator */
	    array[i][len] = '\0';
	    i += 1;
	    len = 0;
	    q = p + 1;
	}
	else
	    len += 1;
    }
    if (len) { /* include ending chars with no newline */
	array[i] = (char *)XP_ALLOC(len+1);
	strncpy(array[i], q, len);
	/* add a string terminator */
	array[i][len] = '\0';
    }

    *array_p = array;
    return cnt;
}

/*
 * This belongs in a utility module
 *
 * Convert a multiline preference (embedded new-lines)
 * to an array of strings
 *  create the array
 *  copies the lines into the array
 *  remove leading/trailing white space
 *  remove blank lines
 *  returns length of the array
 *
 * To free the array:
 *   for (i=0; i<cnt; i++)
 *      XP_FREE(array[i]);
 *   XP_FREE(array);
 */
int
multiline_pref_to_array(const char *string, char ***array_p)
{
  int i, j, cnt;
  char **array;

  /*
   * Convert the multiline string to an array
   * (with leading/trailing white space and blank lines)
   */
  cnt = multiline_str_to_array(string, array_p);

  /*
   * trim any leading/training white space
   */
  array = *array_p;
  for (i=0; i<cnt; i++) {
    char *tmp;
    tmp = XP_StripLine(array[i]);
    /* we can't lose the malloc address else free will fail */
    /* so if there was white space at the beginning we make a copy */
    if (tmp != array[i]) {
	char *tmp2 = array[i];
      	array[i] = strdup(tmp);
      	XP_FREE(tmp2);
    }
  }

  /*
   * remove any blank lines
   */
  for (i=0; i<cnt; i++) {
    if (array[i][0] == '\0') {
	XP_FREE(array[i]);
	for (j=i+1; j<cnt; j++)
	    array[j-1] = array[j];
	cnt -= 1;
    }
  }

  return cnt;
}

IL_DitherMode
fe_pref_string_to_dither_mode (char *s)
{
  if (!XP_STRCASECMP(s, "True") || !XP_STRCASECMP(s, "Dither"))
    return IL_Dither;
  else if (!XP_STRCASECMP(s, "False") || !XP_STRCASECMP(s, "ClosestColor"))
    return IL_ClosestColor;

  /* In the absence of a reasonable value, dithering is auto-selected */
  return IL_Auto;
}

#ifdef MOZ_MAIL_NEWS
void
fe_SetMailNewsSortBehavior(MWContext* context, XP_Bool thread, int sortcode)
{
  XP_ASSERT(context->type == MWContextMail || context->type == MWContextNews);
  if (context->type == MWContextMail || context->type == MWContextNews) {
    if (thread) {
      MSG_SetToggleStatus(ACTIVE_MAILTAB(context)->threadpane, MSG_SortByThread, NULL, 0,
			  thread ? MSG_Checked : MSG_Unchecked);
    } else {
      switch (sortcode) {
      case 0:
	MSG_Command(ACTIVE_MAILTAB(context)->threadpane, MSG_SortByDate, NULL, 0);
	break;
      case 1:
	MSG_Command(ACTIVE_MAILTAB(context)->threadpane, MSG_SortByMessageNumber, NULL, 0);
	break;
      case 2:
	MSG_Command(ACTIVE_MAILTAB(context)->threadpane, MSG_SortBySubject, NULL, 0);
	break;
      case 3:
	MSG_Command(ACTIVE_MAILTAB(context)->threadpane, MSG_SortBySender, NULL, 0);
	break;
      }
    }
  }
}
#endif

void
fe_InstallPreferences (MWContext *context)
{
	/* This function is called from main() */

	fe_installGeneralAppearance();
	fe_installGeneralFonts();
	fe_installGeneralColors();
	fe_installGeneralAdvanced();
	fe_installGeneralPasswd();
	fe_installGeneralCache();
	fe_installGeneralProxies();
	fe_installDiskSpace();

	fe_installBrowser();
	fe_installBrowserAppl();

#ifdef MOZ_MAIL_NEWS
	fe_installMailNews();
	fe_installMailNewsIdentity();
	fe_installMailNewsComposition();
	fe_installMailNewsMserver();
	fe_installMailNewsNserver();
	fe_installMailNewsAddrBook();
#endif

	fe_installOffline();
#ifdef MOZ_MAIL_NEWS
	fe_installOfflineNews();
	fe_installMserverMore();
#endif

	fe_installProxiesView();
	fe_installSslConfig();
	fe_installDiskMore();

	/* CACHE
	 */

	/* spider begin */
        FE_SARCacheDir = fe_globalPrefs.sar_cache_dir ;
        /* spider end */
	NET_DontDiskCacheSSL(!fe_globalPrefs.cache_ssl_p);

	/* bookmark_file
	 */

	FE_GlobalHist = fe_globalPrefs.history_file;

	/* NETWORK
	 */

	NET_ChangeMaxNumberOfConnections (50);
	NET_ChangeMaxNumberOfConnectionsPerContext (fe_globalPrefs.max_connections);
	/* The unit for tcp buffer size is changed from kbyes to btyes */
	NET_ChangeSocketBufferSize (fe_globalPrefs.network_buffer_size);

	/* NEWS
	 */

#ifdef MOZ_MAIL_NEWS
	NET_SetNumberOfNewsArticlesInListing (fe_globalPrefs.news_max_articles);
	NET_SetCacheXOVER (fe_globalPrefs.news_cache_xover);
#endif

	/* PROTOCOLS
	 */

#ifdef MOZ_MAIL_NEWS
	NET_WarnOnMailtoPost(fe_globalPrefs.email_submit);
#endif

#ifdef FORTEZZA
	if (fe_globalPrefs.fortezza_toggle) {
		int timeout = fe_globalPrefs.fortezza_timeout;
		/* '0' minute timeout because 1 minute... still pretty darn fast */
		FortezzaSetTimeout(timeout ? timeout : 1);
	} else {
		FortezzaSetTimeout(0);
	}
#endif
}

void
fe_GeneralPrefsDialog (MWContext *context)
{
}

void
fe_MailNewsPrefsDialog (MWContext *context)
{
}

void
fe_NetworkPrefsDialog (MWContext *context)
{
}

void
fe_SecurityPrefsDialog (MWContext *context)
{
}

/* spider begin */
void
fe_VerifyDiskCache (MWContext *context)
{

#ifdef PREFS_DISK_CACHE

  static Boolean done = False;
  if (done) return;
  done = True;

  if (fe_globalPrefs.disk_cache_size <= 0)
    return;

  fe_VerifyDiskCacheExistence(context, fe_globalPrefs.cache_dir) ;

#endif /* PREFS_DISK_CACHE */

#ifdef PREFS_OLD_WAY
#ifdef PREFS_DISK_CACHE
  struct stat st;
  char file [1024];
  char message [4000];
  static Boolean done = False;
  if (done) return;
  done = True;

  if (fe_globalPrefs.disk_cache_size <= 0)
    return;

  strcpy (file, fe_globalPrefs.cache_dir);
  if (file [strlen (file) - 1] == '/')
    file [strlen (file) - 1] = 0;

  if (stat (file, &st))
    {
      /* Doesn't exist - try to create it. */
      if (mkdir (file, 0700))
	{
	  /* Failed. */
	  char *error = ((errno >= 0 && errno < sys_nerr)
			 ? sys_errlist [errno]
			 : XP_GetString( XFE_UNKNOWN_ERROR));
	  PR_snprintf (message, sizeof (message),
		    fe_globalData.create_cache_dir_message,
		    file, error);
	}
      else
	{
	  /* Suceeded. */
	  PR_snprintf (message, sizeof (message),
			fe_globalData.created_cache_dir_message, file);
	}
    }
  else if (! (st.st_mode & S_IFDIR))
    {
      /* Exists but isn't a directory. */
      PR_snprintf (message, sizeof (message),
		    fe_globalData.cache_not_dir_message, file);
    }
  else
    {
      /* The disk cache is ok! */
      *message = 0;
    }

  if (*message)
    {
      PR_snprintf(message + strlen (message), sizeof (message),
	      fe_globalData.cache_suffix_message,
	      fe_globalPrefs.disk_cache_size, fe_progclass);
      FE_Alert (context, message);
    }
#endif /* PREFS_DISK_CACHE */
#endif /* PREFS_OLD_WAY */
}

void
fe_VerifySARDiskCache (MWContext *context)
{

#ifdef PREFS_DISK_CACHE

  fe_VerifyDiskCacheExistence(context, fe_globalPrefs.sar_cache_dir) ;

#endif /* PREFS_DISK_CACHE */
}

void
fe_VerifyDiskCacheExistence (MWContext *context, char * cache_directory)
{

#ifdef PREFS_DISK_CACHE
  struct stat st;
  char file [1024];
  char message [4000];

  if (!cache_directory)
    return ;

  strcpy (file, cache_directory);
  if (file [strlen (file) - 1] == '/')
    file [strlen (file) - 1] = 0;

  if (stat (file, &st))
    {
      /* Doesn't exist - try to create it. */
      if (mkdir (file, 0700))
	{
	  /* Failed. */
	  char *error = ((errno >= 0 && errno < sys_nerr)
			 ? sys_errlist [errno]
			 : XP_GetString( XFE_UNKNOWN_ERROR));
	  PR_snprintf (message, sizeof (message),
		    fe_globalData.create_cache_dir_message,
		    file, error);
	}
      else
	{
	  /* Suceeded. */
	  PR_snprintf (message, sizeof (message),
			fe_globalData.created_cache_dir_message, file);
	}
    }
  else if (! (st.st_mode & S_IFDIR))
    {
      /* Exists but isn't a directory. */
      PR_snprintf (message, sizeof (message),
		    fe_globalData.cache_not_dir_message, file);
    }
  else
    {
      /* The disk cache is ok! */
      *message = 0;
    }

  if (*message)
    {
      PR_snprintf(message + strlen (message), sizeof (message),
	      fe_globalData.cache_suffix_message,
	      fe_globalPrefs.disk_cache_size, fe_progclass);
      FE_Alert (context, message);
    }
#endif /* PREFS_DISK_CACHE */
}

/* spider end */

