home *** CD-ROM | disk | FTP | other *** search
- /* -*- Mode: C; tab-width: 4; 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.
- */
- /* acptlang.c */
- /* File implement Accept-Language and Accept-Charset */
-
- #include "intlpriv.h"
- #include "prefapi.h"
-
- static char *accept_language = NULL;
- static const char *pref_accept_language = "intl.accept_languages";
-
- static char *accept_charset = NULL;
- static const char *pref_accept_charset = "intl.accept_charsets";
-
-
- PRIVATE void FilterOutHumanReadableText(char* str)
- {
- if(NULL == str)
- return;
- /*
- Currently, we only do this on Window build because
- 1. I only know window have this problem
- 2. Macintosh should be ok since we do not store this in this
- format on the Mac
- 3. I don't know about UNIX for now.
-
- We probably need to build this for all the platform since
- the preference will be for xp so a window pref could be
- used on Mac and UNIX
-
- */
- #if ((defined XP_WIN) || (defined XP_UNIX) || (defined XP_OS2))
- if(strchr(str, '[') != NULL) /* Searching [ to determinate wheather */
- /* This is "Window-Style" AcceptLang Pref */
- {
- int state= 0;
- char *in, *out;
- /*
- State Machine:
-
- State 0 State 1 State 2
- Hit [ Goto State 1 Copy in (Err!) Emit [,] Goto State 1
- Hit ] Ignore in Goto State 2 ignore In
- Else Ignore in Copy in ignore In
-
- Sample data:
- in: AAA BBB [abb-a], CC DD [ee-ff]
- state: 0000000001111112222222221111112
- action: abb-a ,ee-ff \0
- Out: abb-a,ee-ff
-
-
- */
- for(state=0, in=out=str; *in!=0; in++)
- {
- switch(state)
- {
- case 1: /* Between [ and ] */
- if(*in == ']') /* hit ] */
- state = 2; /* Change state to 2 */
- else
- *out++ = *in; /* Copy text between [ and ] */
- break;
- case 2: /* Before hit not-first [ */
- if(*in == '[') /* hit the not-first [ */
- {
- state = 1; /* Change state to 1 */
- *out++ = ','; /* Need to copy , */
- }
- break;
- case 0: /* Before hit first [ */
- default:
- if(*in == '[') /* hit first [ */
- state = 1; /* Change state to 1 */
- break;
- }
-
- }
- *out = '\0'; /* NULL terminate output */
- }
- #endif
- }
-
- /* callback routine invoked by prefapi when the pref value changes */
- /* According to the comment in mime2fun.c
- Win16 build fails if PR_CALLBACK is declared as static
- So I change it to MODULE_PRIVATE
- */
-
- MODULE_PRIVATE int PR_CALLBACK intl_SetAcceptLanguage(const char * newpref, void * data)
- {
- if (accept_language) {
- XP_FREE(accept_language);
- accept_language = NULL;
- }
-
- PREF_CopyCharPref(pref_accept_language, &accept_language);
- FilterOutHumanReadableText(accept_language);
- return PREF_NOERROR;
- }
-
- /* INTL_GetAcceptLanguage() */
- /* return the AcceptLanguage from XP Preference */
- /* this should be a C style NULL terminated string */
- PUBLIC char* INTL_GetAcceptLanguage()
- {
- if (accept_language == NULL)
- {
- PREF_CopyCharPref(pref_accept_language, &accept_language);
-
- if (accept_language)
- PREF_RegisterCallback(pref_accept_language, intl_SetAcceptLanguage, NULL);
- }
- FilterOutHumanReadableText(accept_language);
-
- return accept_language;
- }
-
- /* callback routine invoked by prefapi when the pref value changes */
- /* According to the comment in mime2fun.c
- Win16 build fails if PR_CALLBACK is declared as static
- So I change it to MODULE_PRIVATE
- */
- MODULE_PRIVATE int PR_CALLBACK intl_SetAcceptCharset(const char * newpref, void * data)
- {
- if (accept_charset) {
- XP_FREE(accept_charset);
- accept_charset = NULL;
- }
-
- PREF_CopyCharPref(pref_accept_charset, &accept_charset);
- FilterOutHumanReadableText(accept_charset);
- return PREF_NOERROR;
- }
-
- /* INTL_GetAcceptCharset() */
- /* return the AcceptCharset from XP Preference */
- /* this should be a C style NULL terminated string */
- PUBLIC char* INTL_GetAcceptCharset()
- {
- if (accept_charset == NULL)
- {
- PREF_CopyCharPref(pref_accept_charset, &accept_charset);
-
- if (accept_charset)
- PREF_RegisterCallback(pref_accept_charset, intl_SetAcceptCharset, NULL);
- }
-
- return accept_charset;
- }
-
-