home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / lib / libmocha / lm_nav.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  10.4 KB  |  389 lines

  1. /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public License
  4.  * Version 1.0 (the "NPL"); you may not use this file except in
  5.  * compliance with the NPL.  You may obtain a copy of the NPL at
  6.  * http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the NPL is distributed on an "AS IS" basis,
  9.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
  10.  * for the specific language governing rights and limitations under the
  11.  * NPL.
  12.  *
  13.  * The Initial Developer of this code under the NPL is Netscape
  14.  * Communications Corporation.  Portions created by Netscape are
  15.  * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
  16.  * Reserved.
  17.  */
  18. /*
  19.  * JS reflection of the Navigator top-level object.
  20.  *
  21.  * Brendan Eich, 11/16/95
  22.  */
  23. #include "lm.h"
  24. #include "prmem.h"
  25. #include "java.h"
  26. #include "gui.h"
  27. #include "prefapi.h"
  28. #include "msgcom.h"
  29.  
  30. #include "secnav.h"
  31.  
  32. typedef struct JSNavigator {
  33.     JSString        *userAgent;
  34.     JSString        *appCodeName;
  35.     JSString        *appVersion;
  36.     JSString        *appName;
  37.     JSString        *appLanguage;
  38.     JSString        *appPlatform;
  39.     JSString        *securityPolicy;
  40. } JSNavigator;
  41.  
  42. enum nav_slot {
  43.     NAV_USER_AGENT      = -1,
  44.     NAV_APP_CODE_NAME   = -2,
  45.     NAV_APP_VERSION     = -3,
  46.     NAV_APP_NAME        = -4,
  47.     NAV_APP_LANGUAGE    = -5,
  48.     NAV_APP_PLATFORM    = -6,
  49.     NAV_SECURITY_POLICY = -7
  50. };
  51.  
  52. static JSPropertySpec nav_props[] = {
  53.     {"userAgent",     NAV_USER_AGENT,       JSPROP_ENUMERATE | JSPROP_READONLY},
  54.     {"appCodeName",   NAV_APP_CODE_NAME,    JSPROP_ENUMERATE | JSPROP_READONLY},
  55.     {"appVersion",    NAV_APP_VERSION,      JSPROP_ENUMERATE | JSPROP_READONLY},
  56.     {"appName",       NAV_APP_NAME,         JSPROP_ENUMERATE | JSPROP_READONLY},
  57.     {"language",      NAV_APP_LANGUAGE,     JSPROP_ENUMERATE | JSPROP_READONLY},
  58.     {"platform",      NAV_APP_PLATFORM,     JSPROP_ENUMERATE | JSPROP_READONLY},
  59.     {"securityPolicy", NAV_SECURITY_POLICY, JSPROP_ENUMERATE | JSPROP_READONLY},
  60.     {0}
  61. };
  62.  
  63. extern JSClass lm_navigator_class;
  64.  
  65. PR_STATIC_CALLBACK(JSBool)
  66. nav_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
  67. {
  68.     JSNavigator *nav;
  69.     JSString *str;
  70.     jsint slot;
  71.  
  72.     if (!JSVAL_IS_INT(id))
  73.     return JS_TRUE;
  74.  
  75.     slot = JSVAL_TO_INT(id);
  76.  
  77.     nav = JS_GetInstancePrivate(cx, obj, &lm_navigator_class, NULL);
  78.     if (!nav)
  79.     return JS_TRUE;
  80.  
  81.     switch (slot) {
  82.       case NAV_USER_AGENT:
  83.         str = nav->userAgent;
  84.         break;
  85.       case NAV_APP_CODE_NAME:
  86.         str = nav->appCodeName;
  87.         break;
  88.       case NAV_APP_VERSION:
  89.         str = nav->appVersion;
  90.         break;
  91.       case NAV_APP_NAME:
  92.         str = nav->appName;
  93.         break;
  94.       case NAV_APP_LANGUAGE:
  95.         str = nav->appLanguage;
  96.         break;
  97.       case NAV_APP_PLATFORM:
  98.         str = nav->appPlatform;
  99.         break;
  100.       case NAV_SECURITY_POLICY:
  101.         str = nav->securityPolicy;
  102.         break;
  103.  
  104.  
  105.       default:
  106.         /* Don't mess with user-defined or method properties. */
  107.         return JS_TRUE;
  108.     }
  109.  
  110.     if (str)
  111.     *vp = STRING_TO_JSVAL(str);
  112.     else
  113.         *vp = JS_GetEmptyStringValue(cx);
  114.     return JS_TRUE;
  115. }
  116.  
  117.  
  118. PR_STATIC_CALLBACK(void)
  119. nav_finalize(JSContext *cx, JSObject *obj)
  120. {
  121.     JSNavigator *nav;
  122.  
  123.     nav = JS_GetPrivate(cx, obj);
  124.     if (!nav)
  125.     return;
  126.  
  127.     JS_UnlockGCThing(cx, nav->userAgent);
  128.     JS_UnlockGCThing(cx, nav->appCodeName);
  129.     JS_UnlockGCThing(cx, nav->appVersion);
  130.     JS_UnlockGCThing(cx, nav->appName);
  131.     JS_UnlockGCThing(cx, nav->appLanguage);
  132.     JS_UnlockGCThing(cx, nav->appPlatform);
  133.     JS_UnlockGCThing(cx, nav->securityPolicy);
  134.     XP_DELETE(nav);
  135. }
  136.  
  137. JSClass lm_navigator_class = {
  138.     "Navigator", JSCLASS_HAS_PRIVATE,
  139.     JS_PropertyStub, JS_PropertyStub, nav_getProperty, nav_getProperty,
  140.     JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, nav_finalize
  141. };
  142.  
  143. PR_STATIC_CALLBACK(JSBool)
  144. Navigator(JSContext *cx, JSObject *obj,
  145.           uint argc, jsval *argv, jsval *rval)
  146. {
  147.     return JS_TRUE;
  148. }
  149.  
  150. PR_STATIC_CALLBACK(JSBool)
  151. nav_java_enabled(JSContext *cx, JSObject *obj,
  152.                  uint argc, jsval *argv, jsval *rval)
  153. {
  154. #ifdef JAVA
  155.     *rval = BOOLEAN_TO_JSVAL(LJ_GetJavaEnabled());
  156. #else
  157.     *rval = JSVAL_FALSE;
  158. #endif
  159.     return JS_TRUE;
  160. }
  161.  
  162. PR_STATIC_CALLBACK(JSBool)
  163. nav_taint_enabled(JSContext *cx, JSObject *obj,
  164.                  uint argc, jsval *argv, jsval *rval)
  165. {
  166.     *rval = JSVAL_FALSE;
  167.     return JS_TRUE;
  168. }
  169.  
  170.  
  171. /*
  172.  * 1 arg == get pref value
  173.  * 2 args == set pref value
  174.  */
  175. PR_STATIC_CALLBACK(JSBool)
  176. nav_prefs(JSContext *cx, JSObject *obj,
  177.           uint argc, jsval *argv, jsval *rval)
  178. {
  179.     JSBool       ok = JS_TRUE;
  180.  
  181.     if (argc != 1 && argc != 2)
  182.     return JS_TRUE;
  183.  
  184.     ok = lm_CanAccessTarget(cx, argc == 1
  185.                                 ? JSTARGET_UNIVERSAL_PREFERENCES_READ
  186.                                 : JSTARGET_UNIVERSAL_PREFERENCES_WRITE);
  187.  
  188.     if (!ok)
  189.     return JS_FALSE;
  190.     
  191.     return ET_HandlePref(cx, argc, argv, rval);
  192.  
  193. }
  194.  
  195. PR_STATIC_CALLBACK(JSBool)
  196. nav_save_prefs(JSContext *cx, JSObject *obj,
  197.           uint argc, jsval *argv, jsval *rval)
  198. {
  199.     JSBool       ok = JS_TRUE;
  200.  
  201.     ok = lm_CanAccessTarget(cx, JSTARGET_UNIVERSAL_PREFERENCES_WRITE);
  202.  
  203.     if (!ok)
  204.     return JS_FALSE;
  205.     
  206.     ET_moz_CallFunctionAsync((ETVoidPtrFunc)PREF_SavePrefFile, NULL);
  207.     return JS_TRUE;
  208. }
  209.  
  210. JSBool PR_CALLBACK
  211. nav_is_default(JSContext *cx, JSObject *obj,
  212.           uint argc, jsval *argv, jsval *rval)
  213. {
  214. #ifdef XP_WIN
  215.     *rval = BOOLEAN_TO_JSVAL(
  216.     ET_moz_CallFunctionBool((ETBoolPtrFunc)FE_IsNetscapeDefault, NULL));
  217. #endif
  218.     return JS_TRUE;
  219. }
  220.  
  221. JSBool PR_CALLBACK
  222. nav_make_default(JSContext *cx, JSObject *obj,
  223.           uint argc, jsval *argv, jsval *rval)
  224. {
  225. #ifdef XP_WIN
  226.     *rval = BOOLEAN_TO_JSVAL(
  227.     ET_moz_CallFunctionBool((ETBoolPtrFunc)FE_MakeNetscapeDefault, NULL));
  228. #endif    
  229.     return JS_TRUE;
  230. }
  231.  
  232. static JSFunctionSpec nav_methods[] = {
  233.     {"javaEnabled",        nav_java_enabled,       0},
  234.     {"taintEnabled",        nav_taint_enabled,      0},
  235.     {"preference",           nav_prefs,              1},
  236.     {"savePreferences",        nav_save_prefs,        0},
  237.     {"isNetscapeDefault",   nav_is_default,        0},
  238.     {"makeNetscapeDefault", nav_make_default,          0},
  239.     {0}
  240. };
  241.  
  242. /*
  243.  * ------------------------------------------------------------------
  244.  */
  245. static JSClass mail_class =
  246. {
  247.     "Mail", 0 /* no private data, yet */,
  248.     JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
  249.     JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub
  250. };
  251.  
  252. /*
  253.  * Update an imap mail folder
  254.  */
  255. PR_STATIC_CALLBACK(JSBool)
  256. mail_update(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
  257. {
  258. #ifdef MOZ_MAIL_NEWS
  259.     jsval folder;
  260.     char *folder_url;
  261.  
  262.     /* make sure we got a string as our input value */
  263.     if (!JSVAL_IS_STRING(argv[0]) &&
  264.         !JS_ConvertValue(cx, argv[0], JSTYPE_STRING, &argv[0])) {
  265.     return JS_FALSE;
  266.     }
  267.  
  268.     folder_url = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
  269.     XP_TRACE(("Folder URL = '%s'", folder_url));
  270.     /* use et_moz.c stuff to send a message over to the mozilla thread */
  271.     ET_moz_CallFunctionAsync((ETVoidPtrFunc) MSG_IMAPFolderChangedNotification, folder_url);
  272. #endif /* MOZ_MAIL_NEWS */
  273.     return JS_TRUE;
  274.  
  275. }
  276.  
  277. static JSFunctionSpec mail_methods[] = {
  278.     {"updateFolder",       mail_update,          1},
  279.     {0}
  280. };
  281.  
  282. static JSObject *
  283. lm_NewMailObject(JSContext * cx)
  284. {
  285.     JSObject *obj;
  286.  
  287.     obj = JS_NewObject(cx, &mail_class, NULL, NULL);
  288.     if (!obj || !JS_DefineFunctions(cx, obj, mail_methods))
  289.     return NULL;
  290.  
  291.     return obj;
  292. }
  293.  
  294. /*
  295.  * ------------------------------------------------------------------
  296.  */
  297.  
  298. JSObject *
  299. lm_DefineNavigator(MochaDecoder *decoder)
  300. {
  301.     JSObject *obj, *list_obj, *mail_obj;
  302.     JSContext *cx;
  303.     JSNavigator *nav;
  304.     char *userAgent;
  305.  
  306.     obj = decoder->navigator;
  307.     if (obj)
  308.         return obj;
  309.  
  310.     cx = decoder->js_context;
  311.     nav = JS_malloc(cx, sizeof *nav);
  312.     if (!nav)
  313.         return NULL;
  314.     XP_BZERO(nav, sizeof *nav);
  315.  
  316.     obj = JS_InitClass(cx, decoder->window_object, NULL, &lm_navigator_class,
  317.                        Navigator, 0, nav_props, nav_methods, NULL, NULL);
  318.     if (!obj || !JS_SetPrivate(cx, obj, nav)) {
  319.         JS_free(cx, nav);
  320.         return NULL;
  321.     }
  322.     
  323.     if (!JS_DefineProperty(cx, decoder->window_object, "navigator",
  324.                OBJECT_TO_JSVAL(obj), NULL, NULL,
  325.                            JSPROP_ENUMERATE | JSPROP_READONLY)) {
  326.         return NULL;
  327.     }
  328.  
  329.     /* XXX bail on null returns from PR_smprintf and JS_NewStringCopyZ */
  330.     userAgent = PR_smprintf("%s/%s", XP_AppCodeName, XP_AppVersion);
  331.     nav->userAgent = JS_NewStringCopyZ(cx, userAgent);
  332.     PR_FREEIF(userAgent);
  333.     JS_LockGCThing(cx, nav->userAgent);
  334.  
  335.     nav->appCodeName = JS_NewStringCopyZ(cx, XP_AppCodeName);
  336.     JS_LockGCThing(cx, nav->appCodeName);
  337.  
  338.     nav->appVersion = JS_NewStringCopyZ(cx, XP_AppVersion);
  339.     JS_LockGCThing(cx, nav->appVersion);
  340.  
  341.     nav->appName = JS_NewStringCopyZ(cx, XP_AppName);
  342.     JS_LockGCThing(cx, nav->appName);
  343.  
  344.     nav->appLanguage = JS_NewStringCopyZ(cx, XP_AppLanguage);
  345.     JS_LockGCThing(cx, nav->appLanguage);
  346.  
  347.     nav->appPlatform = JS_NewStringCopyZ(cx, XP_AppPlatform);
  348.     JS_LockGCThing(cx, nav->appPlatform);
  349.  
  350.     nav->securityPolicy = JS_NewStringCopyZ(cx, SECNAV_GetPolicyNameString());
  351.     JS_LockGCThing(cx, nav->securityPolicy);
  352.  
  353.  
  354.     /* Ask lm_plgin.c to create objects for plug-in and MIME-type arrays */
  355.  
  356.     list_obj = lm_NewPluginList(cx, obj);
  357.     if (!list_obj || 
  358.     !JS_DefineProperty(cx, obj, "plugins",
  359.                OBJECT_TO_JSVAL(list_obj), 
  360.                NULL, NULL,
  361.                            JSPROP_ENUMERATE | JSPROP_READONLY)) {
  362.     return NULL;
  363.     }
  364.  
  365.     list_obj = lm_NewMIMETypeList(cx);
  366.     if (!list_obj ||
  367.     !JS_DefineProperty(cx, obj, "mimeTypes",
  368.                OBJECT_TO_JSVAL(list_obj), 
  369.                NULL, NULL,
  370.                            JSPROP_ENUMERATE | JSPROP_READONLY)) {
  371.     return NULL;
  372.     }
  373.  
  374.     /* mail stuff -- don't make it JSPROP_ENUMERATE for now XXX */
  375.     mail_obj = lm_NewMailObject(cx);
  376.     if (!mail_obj ||
  377.     !JS_DefineProperty(cx, obj, "mail",
  378.                OBJECT_TO_JSVAL(mail_obj), 
  379.                NULL, NULL,
  380.                            JSPROP_READONLY)) {
  381.     return NULL;
  382.     }
  383.  
  384.  
  385.  
  386.     decoder->navigator = obj;
  387.     return obj;
  388. }
  389.