changeset in /hg/icedtea: Moved IcedTeaPlugin related classes in...
Deepak Bhole
dbhole at redhat.com
Sat Oct 18 21:23:16 PDT 2008
changeset 3e5d21f2b7a4 in /hg/icedtea
details: http://icedtea.classpath.org/hg/icedtea?cmd=changeset;node=3e5d21f2b7a4
description:
Moved IcedTeaPlugin related classes into a separate jar, so that it can be run
in a sandbox.
Removed new files out of the IcedTeaPlugin patch, and moved them into a
directory, so that history can be tracked properly.
diffstat:
18 files changed, 4811 insertions(+), 4850 deletions(-)
Makefile.am | 25
patches/icedtea-liveconnect.patch | 3559 ----------
patches/icedtea-plugin.patch | 1294 ---
plugin/gcj/java/src/main/sun/applet/PluginAppletViewer.java | 1008 ++
plugin/gcj/java/src/main/sun/applet/PluginMain.java | 274
plugin/icedtea/java/src/main/sun/applet/GetMemberPluginCallRequest.java | 72
plugin/icedtea/java/src/main/sun/applet/GetWindowPluginCallRequest.java | 66
plugin/icedtea/java/src/main/sun/applet/PluginAppletSecurityContext.java | 847 ++
plugin/icedtea/java/src/main/sun/applet/PluginAppletViewer.java | 1439 ++++
plugin/icedtea/java/src/main/sun/applet/PluginCallRequest.java | 56
plugin/icedtea/java/src/main/sun/applet/PluginDebug.java | 13
plugin/icedtea/java/src/main/sun/applet/PluginException.java | 14
plugin/icedtea/java/src/main/sun/applet/PluginMain.java | 533 +
plugin/icedtea/java/src/main/sun/applet/PluginMessageConsumer.java | 49
plugin/icedtea/java/src/main/sun/applet/PluginMessageHandlerWorker.java | 59
plugin/icedtea/java/src/main/sun/applet/PluginObjectStore.java | 119
plugin/icedtea/java/src/main/sun/applet/TestEnv.java | 172
plugin/icedtea/java/src/main/sun/applet/VoidPluginCallRequest.java | 62
diffs (truncated from 9811 to 500 lines):
diff -r 8e3089767a4a -r 3e5d21f2b7a4 Makefile.am
--- a/Makefile.am Thu Sep 18 11:31:59 2008 -0400
+++ b/Makefile.am Thu Sep 18 15:49:10 2008 -0400
@@ -12,12 +12,14 @@ if ENABLE_LIVECONNECT
if ENABLE_LIVECONNECT
ICEDTEAPLUGIN_CLEAN = clean-IcedTeaPlugin
ICEDTEAPLUGIN_TARGET = IcedTeaPlugin.so
+ICEDTEAPLUGIN_JAR = IcedTeaPlugin.jar
PLUGIN_PATCH = patches/icedtea-liveconnect.patch
EXCLUDE_LIVECONNECT =
LIVECONNECT_DIR = -C lib/rt netscape
else
ICEDTEAPLUGIN_CLEAN =
ICEDTEAPLUGIN_TARGET =
+ICEDTEAPLUGIN_JAR =
PLUGIN_PATCH = patches/icedtea-plugin.patch
EXCLUDE_LIVECONNECT = | grep -v 'netscape/javascript'
LIVECONNECT_DIR =
@@ -894,7 +896,7 @@ stamps/icedtea.stamp: stamps/bootstrap-d
stamps/icedtea.stamp: stamps/bootstrap-directory-symlink.stamp \
stamps/hotspot-tools.stamp stamps/plugs.stamp \
stamps/ports.stamp stamps/patch.stamp stamps/overlay.stamp \
- $(GCJWEBPLUGIN_TARGET) $(ICEDTEAPLUGIN_TARGET) \
+ $(GCJWEBPLUGIN_TARGET) $(ICEDTEAPLUGIN_TARGET) $(ICEDTEAPLUGIN_JAR) \
extra-lib/about.jar stamps/cacao.stamp stamps/visualvm.stamp
$(MAKE) \
$(ICEDTEA_ENV) \
@@ -905,6 +907,10 @@ if ENABLE_LIVECONNECT
$(BUILD_OUTPUT_DIR)/j2sdk-image/jre/lib/$(INSTALL_ARCH_DIR)
cp -pPRf IcedTeaPlugin.so \
$(BUILD_OUTPUT_DIR)/j2re-image/lib/$(INSTALL_ARCH_DIR)
+ cp -pPRf IcedTeaPlugin.jar \
+ $(BUILD_OUTPUT_DIR)/j2sdk-image/jre/lib/
+ cp -pPRf IcedTeaPlugin.jar \
+ $(BUILD_OUTPUT_DIR)/j2re-image/lib/
else
if ENABLE_PLUGIN
cp -pPRf gcjwebplugin.so \
@@ -945,7 +951,7 @@ stamps/icedtea-debug.stamp: stamps/boots
stamps/icedtea-debug.stamp: stamps/bootstrap-directory-symlink.stamp \
stamps/hotspot-tools.stamp stamps/plugs.stamp \
stamps/ports.stamp stamps/patch.stamp stamps/overlay.stamp \
- $(GCJWEBPLUGIN_TARGET) $(ICEDTEAPLUGIN_TARGET) \
+ $(GCJWEBPLUGIN_TARGET) $(ICEDTEAPLUGIN_TARGET) $(ICEDTEAPLUGIN_JAR) \
extra-lib/about.jar stamps/cacao.stamp
$(MAKE) \
$(ICEDTEA_ENV) \
@@ -956,6 +962,10 @@ if ENABLE_LIVECONNECT
$(BUILD_OUTPUT_DIR)-debug/j2sdk-image/jre/lib/$(INSTALL_ARCH_DIR)
cp -pPRf IcedTeaPlugin.so \
$(BUILD_OUTPUT_DIR)-debug/j2re-image/lib/$(INSTALL_ARCH_DIR)
+ cp -pPRf IcedTeaPlugin.jar \
+ $(BUILD_OUTPUT_DIR)-debug/j2sdk-image/jre/lib/
+ cp -pPRf IcedTeaPlugin.jar \
+ $(BUILD_OUTPUT_DIR)-debug/j2re-image/lib/
else
if ENABLE_PLUGIN
cp -pPRf gcjwebplugin.so \
@@ -1308,6 +1318,17 @@ IcedTeaPlugin.so: IcedTeaPlugin.o
$(GTK_LIBS) \
$(XULRUNNER_LIBS) \
-shared -o $@
+
+# icedtea plugin jar for java-side classes
+IcedTeaPlugin.jar:
+ mkdir -p $(BUILD_OUTPUT_DIR)/plugin/icedtea/classes
+ (cd plugin/icedtea/java/src/main/; \
+ $(ICEDTEA_BOOT_DIR)/bin/javac -g \
+ -d $(BUILD_OUTPUT_DIR)/plugin/icedtea/classes \
+ -bootclasspath $(ICEDTEA_BOOT_DIR)/jre/lib/rt.jar \
+ sun/applet/*.java \
+ )
+ $(JAR) cf $@ -C $(BUILD_OUTPUT_DIR)/plugin/icedtea/classes sun
clean-IcedTeaPlugin:
rm -f IcedTeaPlugin.o
diff -r 8e3089767a4a -r 3e5d21f2b7a4 patches/icedtea-liveconnect.patch
--- a/patches/icedtea-liveconnect.patch Thu Sep 18 11:31:59 2008 -0400
+++ b/patches/icedtea-liveconnect.patch Thu Sep 18 15:49:10 2008 -0400
@@ -1,6 +1,6 @@ diff -urN openjdk.orig/jdk/make/sun/Make
diff -urN openjdk.orig/jdk/make/sun/Makefile openjdk/jdk/make/sun/Makefile
--- openjdk.orig/jdk/make/sun/Makefile 2008-07-10 15:54:44.000000000 -0400
-+++ openjdk/jdk/make/sun/Makefile 2008-09-15 16:21:47.000000000 -0400
++++ openjdk/jdk/make/sun/Makefile 2008-09-18 14:28:41.000000000 -0400
@@ -66,6 +66,7 @@
$(HEADLESS_SUBDIR) $(DGA_SUBDIR) \
font jpeg cmm applet rmi beans $(JDBC_SUBDIR) \
@@ -11,7 +11,7 @@ diff -urN openjdk.orig/jdk/make/sun/Make
all build clean clobber::
diff -urN openjdk.orig/jdk/make/sun/Makefile.orig openjdk/jdk/make/sun/Makefile.orig
--- openjdk.orig/jdk/make/sun/Makefile.orig 1969-12-31 19:00:00.000000000 -0500
-+++ openjdk/jdk/make/sun/Makefile.orig 2008-09-15 16:21:47.000000000 -0400
++++ openjdk/jdk/make/sun/Makefile.orig 2008-09-18 14:28:41.000000000 -0400
@@ -0,0 +1,73 @@
+#
+# Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved.
@@ -88,7 +88,7 @@ diff -urN openjdk.orig/jdk/make/sun/Make
+
diff -urN openjdk.orig/jdk/make/sun/plugin/Makefile openjdk/jdk/make/sun/plugin/Makefile
--- openjdk.orig/jdk/make/sun/plugin/Makefile 1969-12-31 19:00:00.000000000 -0500
-+++ openjdk/jdk/make/sun/plugin/Makefile 2008-09-15 16:21:47.000000000 -0400
++++ openjdk/jdk/make/sun/plugin/Makefile 2008-09-18 14:28:41.000000000 -0400
@@ -0,0 +1,53 @@
+#
+# Copyright 1995-2005 Sun Microsystems, Inc. All Rights Reserved.
@@ -143,3556 +143,3 @@ diff -urN openjdk.orig/jdk/make/sun/plug
+JAVA_ARGS = "{ \"sun.applet.PluginMain\" }"
+include $(BUILDDIR)/common/Program.gmk
+
-diff -urN openjdk.orig/jdk/src/share/classes/sun/applet/GetMemberPluginCallRequest.java openjdk/jdk/src/share/classes/sun/applet/GetMemberPluginCallRequest.java
---- openjdk.orig/jdk/src/share/classes/sun/applet/GetMemberPluginCallRequest.java 1969-12-31 19:00:00.000000000 -0500
-+++ openjdk/jdk/src/share/classes/sun/applet/GetMemberPluginCallRequest.java 2008-09-15 16:22:06.000000000 -0400
-@@ -0,0 +1,72 @@
-+/* GetMemberPluginCallRequest -- represent Java-to-JavaScript requests
-+ Copyright (C) 2008 Red Hat
-+
-+This file is part of IcedTea.
-+
-+IcedTea is free software; you can redistribute it and/or modify
-+it under the terms of the GNU General Public License as published by
-+the Free Software Foundation; either version 2, or (at your option)
-+any later version.
-+
-+IcedTea is distributed in the hope that it will be useful, but
-+WITHOUT ANY WARRANTY; without even the implied warranty of
-+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+General Public License for more details.
-+
-+You should have received a copy of the GNU General Public License
-+along with IcedTea; see the file COPYING. If not, write to the
-+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-+02110-1301 USA.
-+
-+Linking this library statically or dynamically with other modules is
-+making a combined work based on this library. Thus, the terms and
-+conditions of the GNU General Public License cover the whole
-+combination.
-+
-+As a special exception, the copyright holders of this library give you
-+permission to link this library with independent modules to produce an
-+executable, regardless of the license terms of these independent
-+modules, and to copy and distribute the resulting executable under
-+terms of your choice, provided that you also meet, for each linked
-+independent module, the terms and conditions of the license of that
-+module. An independent module is a module which is not derived from
-+or based on this library. If you modify this library, you may extend
-+this exception to your version of the library, but you are not
-+obligated to do so. If you do not wish to do so, delete this
-+exception statement from your version. */
-+
-+package sun.applet;
-+
-+class GetMemberPluginCallRequest extends PluginCallRequest {
-+ Object object = null;
-+
-+ public GetMemberPluginCallRequest(String message, String returnString) {
-+ super(message, returnString);
-+ System.out.println ("GetMEMBerPLUGINCAlL " + message + " " + returnString);
-+ }
-+
-+ public void parseReturn(String message) {
-+ System.out.println ("GetMEMBerparseReturn GOT: " + message);
-+ String[] args = message.split(" ");
-+ // FIXME: add thread ID to messages to support multiple
-+ // threads using the netscape.javascript package.
-+ object = PluginAppletSecurityContext.contexts.get(
-+ 0).store.getObject(Integer.parseInt(args[1]));
-+ done = true;
-+ }
-+
-+ /**
-+ * Returns whether the given message is serviceable by this object
-+ *
-+ * @param message The message to service
-+ * @return boolean indicating if message is serviceable
-+ */
-+ public boolean serviceable(String message) {
-+ return message.contains("JavaScriptCall") ||
-+ message.contains("JavaScriptEval") ||
-+ message.contains("JavaScriptGetMember") ||
-+ message.contains("JavaScriptGetSlot") ||
-+ message.contains("JavaScriptToString");
-+ }
-+}
-+
-diff -urN openjdk.orig/jdk/src/share/classes/sun/applet/GetWindowPluginCallRequest.java openjdk/jdk/src/share/classes/sun/applet/GetWindowPluginCallRequest.java
---- openjdk.orig/jdk/src/share/classes/sun/applet/GetWindowPluginCallRequest.java 1969-12-31 19:00:00.000000000 -0500
-+++ openjdk/jdk/src/share/classes/sun/applet/GetWindowPluginCallRequest.java 2008-09-15 16:22:06.000000000 -0400
-@@ -0,0 +1,66 @@
-+/* GetWindowPluginCallRequest -- represent Java-to-JavaScript requests
-+ Copyright (C) 2008 Red Hat
-+
-+This file is part of IcedTea.
-+
-+IcedTea is free software; you can redistribute it and/or modify
-+it under the terms of the GNU General Public License as published by
-+the Free Software Foundation; either version 2, or (at your option)
-+any later version.
-+
-+IcedTea is distributed in the hope that it will be useful, but
-+WITHOUT ANY WARRANTY; without even the implied warranty of
-+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+General Public License for more details.
-+
-+You should have received a copy of the GNU General Public License
-+along with IcedTea; see the file COPYING. If not, write to the
-+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-+02110-1301 USA.
-+
-+Linking this library statically or dynamically with other modules is
-+making a combined work based on this library. Thus, the terms and
-+conditions of the GNU General Public License cover the whole
-+combination.
-+
-+As a special exception, the copyright holders of this library give you
-+permission to link this library with independent modules to produce an
-+executable, regardless of the license terms of these independent
-+modules, and to copy and distribute the resulting executable under
-+terms of your choice, provided that you also meet, for each linked
-+independent module, the terms and conditions of the license of that
-+module. An independent module is a module which is not derived from
-+or based on this library. If you modify this library, you may extend
-+this exception to your version of the library, but you are not
-+obligated to do so. If you do not wish to do so, delete this
-+exception statement from your version. */
-+
-+package sun.applet;
-+
-+class GetWindowPluginCallRequest extends PluginCallRequest {
-+ // FIXME: look into int vs long JavaScript internal values.
-+ int internal;
-+
-+ public GetWindowPluginCallRequest(String message, String returnString) {
-+ super(message, returnString);
-+ }
-+
-+ public void parseReturn(String message) {
-+ System.out.println ("GetWINDOWparseReturn GOT: " + message);
-+ String[] args = message.split(" ");
-+ // FIXME: add thread ID to messages to support multiple
-+ // threads using the netscape.javascript package.
-+ internal = Integer.parseInt(args[1]);
-+ done = true;
-+ }
-+
-+ /**
-+ * Returns whether the given message is serviceable by this object
-+ *
-+ * @param message The message to service
-+ * @return boolean indicating if message is serviceable
-+ */
-+ public boolean serviceable(String message) {
-+ return message.contains("JavaScriptGetWindow");
-+ }
-+}
-diff -urN openjdk.orig/jdk/src/share/classes/sun/applet/PluginAppletSecurityContext.java openjdk/jdk/src/share/classes/sun/applet/PluginAppletSecurityContext.java
---- openjdk.orig/jdk/src/share/classes/sun/applet/PluginAppletSecurityContext.java 1969-12-31 19:00:00.000000000 -0500
-+++ openjdk/jdk/src/share/classes/sun/applet/PluginAppletSecurityContext.java 2008-09-15 16:22:07.000000000 -0400
-@@ -0,0 +1,847 @@
-+/* PluginAppletSecurityContext -- execute plugin JNI messages
-+ Copyright (C) 2008 Red Hat
-+
-+This file is part of IcedTea.
-+
-+IcedTea is free software; you can redistribute it and/or modify
-+it under the terms of the GNU General Public License as published by
-+the Free Software Foundation; either version 2, or (at your option)
-+any later version.
-+
-+IcedTea is distributed in the hope that it will be useful, but
-+WITHOUT ANY WARRANTY; without even the implied warranty of
-+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+General Public License for more details.
-+
-+You should have received a copy of the GNU General Public License
-+along with IcedTea; see the file COPYING. If not, write to the
-+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-+02110-1301 USA.
-+
-+Linking this library statically or dynamically with other modules is
-+making a combined work based on this library. Thus, the terms and
-+conditions of the GNU General Public License cover the whole
-+combination.
-+
-+As a special exception, the copyright holders of this library give you
-+permission to link this library with independent modules to produce an
-+executable, regardless of the license terms of these independent
-+modules, and to copy and distribute the resulting executable under
-+terms of your choice, provided that you also meet, for each linked
-+independent module, the terms and conditions of the license of that
-+module. An independent module is a module which is not derived from
-+or based on this library. If you modify this library, you may extend
-+this exception to your version of the library, but you are not
-+obligated to do so. If you do not wish to do so, delete this
-+exception statement from your version. */
-+
-+package sun.applet;
-+
-+import java.lang.reflect.Array;
-+import java.lang.reflect.Constructor;
-+import java.lang.reflect.Field;
-+import java.lang.reflect.Method;
-+import java.util.ArrayList;
-+import java.util.HashMap;
-+import java.util.List;
-+import java.util.StringTokenizer;
-+
-+class Signature {
-+ private String signature;
-+ private int currentIndex;
-+ private List<Class> typeList;
-+ private static final char ARRAY = '[';
-+ private static final char OBJECT = 'L';
-+ private static final char SIGNATURE_ENDCLASS = ';';
-+ private static final char SIGNATURE_FUNC = '(';
-+ private static final char SIGNATURE_ENDFUNC = ')';
-+ private static final char VOID = 'V';
-+ private static final char BOOLEAN = 'Z';
-+ private static final char BYTE = 'B';
-+ private static final char CHARACTER = 'C';
-+ private static final char SHORT = 'S';
-+ private static final char INTEGER = 'I';
-+ private static final char LONG = 'J';
-+ private static final char FLOAT = 'F';
-+ private static final char DOUBLE = 'D';
-+
-+ private String nextTypeName() {
-+ char key = signature.charAt(currentIndex++);
-+
-+ switch (key) {
-+ case ARRAY:
-+ return nextTypeName() + "[]";
-+
-+ case OBJECT:
-+ int endClass = signature.indexOf(SIGNATURE_ENDCLASS, currentIndex);
-+ String retVal = signature.substring(currentIndex, endClass);
-+ retVal = retVal.replace('/', '.');
-+ currentIndex = endClass + 1;
-+ return retVal;
-+
-+ // FIXME: generated bytecode with classes named after
-+ // primitives will not work in this scheme -- those
-+ // classes will be incorrectly treated as primitive
-+ // types.
-+ case VOID:
-+ return "void";
-+ case BOOLEAN:
-+ return "boolean";
-+ case BYTE:
-+ return "byte";
-+ case CHARACTER:
-+ return "char";
-+ case SHORT:
-+ return "short";
-+ case INTEGER:
-+ return "int";
-+ case LONG:
-+ return "long";
-+ case FLOAT:
-+ return "float";
-+ case DOUBLE:
-+ return "double";
-+
-+ case SIGNATURE_ENDFUNC:
-+ case SIGNATURE_FUNC:
-+ return nextTypeName();
-+
-+ default:
-+ throw new IllegalArgumentException(
-+ "Invalid JNI signature character '" + key + "'");
-+ }
-+ }
-+
-+ public Signature(String signature, String src) {
-+ this.signature = signature;
-+ currentIndex = 0;
-+ typeList = new ArrayList<Class>(10);
-+
-+ String elem;
-+ while (currentIndex < signature.length()) {
-+ elem = nextTypeName();
-+ // System.out.println ("NEXT TYPE: " + elem);
-+ Class primitive = primitiveNameToType(elem);
-+ if (primitive != null)
-+ typeList.add(primitive);
-+ else {
-+ // System.out.println ("HERE1");
-+ int dimsize = 0;
-+ int n = elem.indexOf('[');
-+ if (n != -1) {
-+ // System.out.println ("HERE2");
-+ String arrayType = elem.substring(0, n);
-+ dimsize++;
-+ n = elem.indexOf('[', n + 1);
-+ // System.out.println ("HERE2.5");
-+ while (n != -1) {
-+ dimsize++;
-+ n = elem.indexOf('[', n + 1);
-+ // System.out.println ("HERE2.8");
-+ }
-+ int[] dims = new int[dimsize];
-+ primitive = primitiveNameToType(arrayType);
-+ // System.out.println ("HERE3");
-+ if (primitive != null) {
-+ typeList.add(Array.newInstance(primitive, dims)
-+ .getClass());
-+ // System.out.println ("HERE4");
-+ } else
-+ typeList.add(Array.newInstance(
-+ getClass(arrayType, src), dims).getClass());
-+ } else {
-+ typeList.add(getClass(elem, src));
-+ }
-+ }
-+ }
-+ if (typeList.size() == 0) {
-+ throw new IllegalArgumentException("Invalid JNI signature '"
-+ + signature + "'");
-+ }
-+ }
-+
-+ public static Class getClass(String name, String src) {
-+
-+ Class c = null;
-+
-+ try {
-+ c = Class.forName(name);
-+ } catch (ClassNotFoundException cnfe) {
-+
-+ StringTokenizer st = new StringTokenizer(src, ",");
-+
-+ while (st.hasMoreTokens()) {
-+
-+ String tok = st.nextToken();
-+ System.err.println("Searching for " + name + " at key " + tok);
-+
-+ try {
-+ c = PluginAppletSecurityContext.classLoaders.get(tok).loadClass(name);
-+ } catch (ClassNotFoundException e) {
-+ // do nothing .. thrown below
-+ }
-+
-+ if (c != null)
-+ break;
-+ }
-+ }
-+
-+ if (c == null) {
-+ throw (new RuntimeException(new ClassNotFoundException("Unable to find class " + name)));
-+ }
-+
-+ return c;
-+ }
-+
-+ public static Class primitiveNameToType(String name) {
-+ if (name.equals("void"))
-+ return Void.TYPE;
-+ else if (name.equals("boolean"))
-+ return Boolean.TYPE;
-+ else if (name.equals("byte"))
-+ return Byte.TYPE;
-+ else if (name.equals("char"))
-+ return Character.TYPE;
-+ else if (name.equals("short"))
-+ return Short.TYPE;
-+ else if (name.equals("int"))
-+ return Integer.TYPE;
-+ else if (name.equals("long"))
-+ return Long.TYPE;
-+ else if (name.equals("float"))
-+ return Float.TYPE;
-+ else if (name.equals("double"))
-+ return Double.TYPE;
-+ else
-+ return null;
-+ }
-+
-+ public Class[] getClassArray() {
-+ return typeList.subList(0, typeList.size() - 1).toArray(new Class[] {});
-+ }
-+}
-+
-+public class PluginAppletSecurityContext {
-+ // Context identifier -> PluginAppletSecurityContext object.
-+ // FIXME: make private
-+ public static HashMap<Integer, PluginAppletSecurityContext> contexts = new HashMap();
-+
-+ public static HashMap<String, ClassLoader> classLoaders = new HashMap<String, ClassLoader>();
-+
-+ // FIXME: make private
-+ public PluginObjectStore store = new PluginObjectStore();
-+ private Throwable throwable = null;
-+ private ClassLoader liveconnectLoader = ClassLoader.getSystemClassLoader();
-+ int identifier = 0;
-+
-+ static {
-+ // FIXME: when should we add each new security context? but how would
-+ // we be able to know which context applies to which request from nspr?
-+ // the nspr jni functions do not know what applet they are being called
-+ // in reference to
More information about the distro-pkg-dev
mailing list