1998-10-23 00:09:16 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
|
|
*
|
1999-11-06 05:47:15 +03:00
|
|
|
* The contents of this file are subject to the Netscape Public
|
|
|
|
* License Version 1.1 (the "License"); you may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of
|
|
|
|
* the License at http://www.mozilla.org/NPL/
|
1998-10-23 00:09:16 +04:00
|
|
|
*
|
1999-11-06 05:47:15 +03:00
|
|
|
* Software distributed under the License is distributed on an "AS
|
|
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
|
|
* implied. See the License for the specific language governing
|
|
|
|
* rights and limitations under the License.
|
1998-10-23 00:09:16 +04:00
|
|
|
*
|
1999-11-06 05:47:15 +03:00
|
|
|
* The Original Code is mozilla.org code.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is Netscape
|
1998-10-23 00:09:16 +04:00
|
|
|
* Communications Corporation. Portions created by Netscape are
|
1999-11-06 05:47:15 +03:00
|
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
|
|
* Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s):
|
1998-10-23 00:09:16 +04:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "lm.h"
|
|
|
|
#include "libi18n.h"
|
|
|
|
|
|
|
|
typedef struct JSEnvironment {
|
|
|
|
MochaDecoder *decoder;
|
|
|
|
} JSEnvironment;
|
|
|
|
|
|
|
|
enum environment_tinyid {
|
|
|
|
ENVIRONMENT_LANGUAGE = -1,
|
|
|
|
ENVIRONMENT_LANGUAGE_COLLATE = -2,
|
|
|
|
ENVIRONMENT_LANGUAGE_MONETARY = -3,
|
|
|
|
ENVIRONMENT_LANGUAGE_NUMERIC = -4,
|
|
|
|
ENVIRONMENT_LANGUAGE_TIME = -5,
|
|
|
|
ENVIRONMENT_COUNTRY = -6,
|
|
|
|
ENVIRONMENT_COUNTRY_COLLATE = -7,
|
|
|
|
ENVIRONMENT_COUNTRY_MONETARY = -8,
|
|
|
|
ENVIRONMENT_COUNTRY_NUMERIC = -9,
|
|
|
|
ENVIRONMENT_COUNTRYE_TIME = -10,
|
|
|
|
ENVIRONMENT_LOCALES = -11
|
|
|
|
};
|
|
|
|
|
|
|
|
static JSPropertySpec environment_props[] = {
|
|
|
|
{"language", ENVIRONMENT_LANGUAGE, JSPROP_ENUMERATE | JSPROP_READONLY},
|
|
|
|
{"languageCollate", ENVIRONMENT_LANGUAGE_COLLATE, JSPROP_ENUMERATE | JSPROP_READONLY},
|
|
|
|
{"languageMonetary", ENVIRONMENT_LANGUAGE_MONETARY, JSPROP_ENUMERATE | JSPROP_READONLY},
|
|
|
|
{"languageNumeric", ENVIRONMENT_LANGUAGE_NUMERIC, JSPROP_ENUMERATE | JSPROP_READONLY},
|
|
|
|
{"languageTime", ENVIRONMENT_LANGUAGE_TIME, JSPROP_ENUMERATE | JSPROP_READONLY},
|
|
|
|
{"country", ENVIRONMENT_COUNTRY, JSPROP_ENUMERATE | JSPROP_READONLY},
|
|
|
|
{"countryCollate", ENVIRONMENT_COUNTRY_COLLATE, JSPROP_ENUMERATE | JSPROP_READONLY},
|
|
|
|
{"countryMonetary", ENVIRONMENT_COUNTRY_MONETARY, JSPROP_ENUMERATE | JSPROP_READONLY},
|
|
|
|
{"countryNumeric", ENVIRONMENT_COUNTRY_NUMERIC, JSPROP_ENUMERATE | JSPROP_READONLY},
|
|
|
|
{"countryTime", ENVIRONMENT_COUNTRYE_TIME, JSPROP_ENUMERATE | JSPROP_READONLY},
|
|
|
|
{"locales", ENVIRONMENT_LOCALES, JSPROP_ENUMERATE | JSPROP_READONLY},
|
|
|
|
{0}
|
|
|
|
};
|
|
|
|
|
|
|
|
extern JSClass lm_environment_class;
|
|
|
|
|
|
|
|
|
|
|
|
PR_STATIC_CALLBACK(JSBool)
|
|
|
|
environment_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
|
|
|
|
{
|
|
|
|
JSEnvironment *environment;
|
|
|
|
jsint slot;
|
|
|
|
char * arch = NULL;
|
|
|
|
|
|
|
|
if (!JSVAL_IS_INT(id))
|
|
|
|
return JS_TRUE;
|
|
|
|
|
|
|
|
slot = JSVAL_TO_INT(id);
|
|
|
|
|
|
|
|
environment = JS_GetInstancePrivate(cx, obj, &lm_environment_class, NULL);
|
|
|
|
if (!environment)
|
|
|
|
return JS_TRUE;
|
|
|
|
|
|
|
|
/* Temporary using JSTARGET_UNIVERSAL_BROWSER_READ, change this to a real one before ship. */
|
|
|
|
if (!lm_CanAccessTarget(cx, JSTARGET_UNIVERSAL_BROWSER_READ))
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
switch (slot) {
|
|
|
|
case ENVIRONMENT_LANGUAGE:
|
|
|
|
arch = INTL_GetLanguageCountry(INTL_LanguageSel);
|
|
|
|
break;
|
|
|
|
case ENVIRONMENT_LANGUAGE_COLLATE:
|
|
|
|
arch = INTL_GetLanguageCountry(INTL_LanguageCollateSel);
|
|
|
|
break;
|
|
|
|
case ENVIRONMENT_LANGUAGE_MONETARY:
|
|
|
|
arch = INTL_GetLanguageCountry(INTL_LanguageMonetarySel);
|
|
|
|
break;
|
|
|
|
case ENVIRONMENT_LANGUAGE_NUMERIC:
|
|
|
|
arch = INTL_GetLanguageCountry(INTL_LanguageNumericSel);
|
|
|
|
break;
|
|
|
|
case ENVIRONMENT_LANGUAGE_TIME:
|
|
|
|
arch = INTL_GetLanguageCountry(INTL_LanguageTimeSel);
|
|
|
|
break;
|
|
|
|
case ENVIRONMENT_COUNTRY:
|
|
|
|
arch = INTL_GetLanguageCountry(INTL_CountrySel);
|
|
|
|
break;
|
|
|
|
case ENVIRONMENT_COUNTRY_COLLATE:
|
|
|
|
arch = INTL_GetLanguageCountry(INTL_CountryCollateSel);
|
|
|
|
break;
|
|
|
|
case ENVIRONMENT_COUNTRY_MONETARY:
|
|
|
|
arch = INTL_GetLanguageCountry(INTL_CountryMonetarySel);
|
|
|
|
break;
|
|
|
|
case ENVIRONMENT_COUNTRY_NUMERIC:
|
|
|
|
arch = INTL_GetLanguageCountry(INTL_CountryNumericSel);
|
|
|
|
break;
|
|
|
|
case ENVIRONMENT_COUNTRYE_TIME:
|
|
|
|
arch = INTL_GetLanguageCountry(INTL_CountryTimeSel);
|
|
|
|
break;
|
|
|
|
case ENVIRONMENT_LOCALES:
|
|
|
|
arch = INTL_GetLanguageCountry(INTL_ALL_LocalesSel);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (arch != NULL)
|
|
|
|
{
|
|
|
|
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, arch));
|
|
|
|
XP_FREE(arch);
|
|
|
|
}
|
|
|
|
|
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
PR_STATIC_CALLBACK(void)
|
|
|
|
environment_finalize(JSContext *cx, JSObject *obj)
|
|
|
|
{
|
|
|
|
JSEnvironment *environment;
|
|
|
|
|
|
|
|
environment = JS_GetPrivate(cx, obj);
|
|
|
|
if (!environment)
|
|
|
|
return;
|
|
|
|
DROP_BACK_COUNT(environment->decoder);
|
|
|
|
JS_free(cx, environment);
|
|
|
|
}
|
|
|
|
|
|
|
|
JSClass lm_environment_class = {
|
|
|
|
"Environment", JSCLASS_HAS_PRIVATE,
|
|
|
|
JS_PropertyStub, JS_PropertyStub, environment_getProperty, JS_PropertyStub,
|
|
|
|
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, environment_finalize
|
|
|
|
};
|
|
|
|
|
|
|
|
PR_STATIC_CALLBACK(JSBool)
|
|
|
|
Environment(JSContext *cx, JSObject *obj,
|
|
|
|
uint argc, jsval *argv, jsval *rval)
|
|
|
|
{
|
|
|
|
return JS_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
JSObject *
|
|
|
|
lm_DefineEnvironment(MochaDecoder *decoder)
|
|
|
|
{
|
|
|
|
JSObject *obj;
|
|
|
|
JSContext *cx;
|
|
|
|
JSEnvironment *environment;
|
|
|
|
|
|
|
|
obj = decoder->environment;
|
|
|
|
if (obj)
|
|
|
|
return obj;
|
|
|
|
|
|
|
|
cx = decoder->js_context;
|
|
|
|
if (!(environment = JS_malloc(cx, sizeof(JSEnvironment))))
|
|
|
|
return NULL;
|
|
|
|
environment->decoder = NULL; /* in case of error below */
|
|
|
|
|
|
|
|
obj = JS_InitClass(cx, decoder->window_object, NULL, &lm_environment_class,
|
|
|
|
Environment, 0, environment_props, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
if (!obj || !JS_SetPrivate(cx, obj, environment)) {
|
|
|
|
JS_free(cx, environment);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!JS_DefineProperty(cx, decoder->window_object, "environment",
|
|
|
|
OBJECT_TO_JSVAL(obj), NULL, NULL,
|
|
|
|
JSPROP_ENUMERATE | JSPROP_READONLY)) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
environment->decoder = HOLD_BACK_COUNT(decoder);
|
|
|
|
decoder->environment = obj;
|
|
|
|
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|