зеркало из https://github.com/mozilla/gecko-dev.git
167 строки
4.6 KiB
C
167 строки
4.6 KiB
C
|
/* -*- 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;
|
||
|
}
|
||
|
|