This is a checkpoint milestone for webclient 2.0. Webclient currently
doesn't run, but several unit tests for webclient do.
I'll be proceeding through the rest of the webclient interfaces,
building junit tests as I go, in the coming months. I hope to flesh out
the basic framework, then publish build instructions, and hopefully I
can get some contributions from the community.
M util/classes/org/mozilla/util/Utilities.java
new method: getImplFromServices:
+ *
+ * <p>This method tries to load the resource
+ * <code>META-INF/services/>interfaceClassName></code>, where
+ * <code>>interfaceClassName<</code> is the argument to this
+ * method. If the resource is found, interpret it as a
+ * <code>Properties</code> file and read out its first line.
+ * Interpret the first line as the fully qualified class name of a
+ * class that implements <code></code>. The named class must have a
+ * public no-arg constructor.</p>
M webclient/build-tests.xml
- junit testcases for Webclient APIs, developed using test-first.
M webclient/build.xml
- changes for new package name structure:
packages org.mozilla.webclient.{wrapper_native, wrapper_non_native} have gone away. Replaced with org.mozilla.webclient.impl.{wrapper_native, wrapper_non_native}
- changes to accomodate "Services" based approach for pluggable
webclient implementation.
- don't bother re-naming the javah generated files, just let javah pick
the names.
- pass debugging args from build.properties
- changed name of junit test target to "test".
M webclient/classes_spec/org/mozilla/webclient/BrowserControl.java
- got rid of BROWSER_TYPE. No longer necessary due to the new
pluggability mechanism.
M webclient/classes_spec/org/mozilla/webclient/BrowserControlFactory.java
- Leverage the org.mozilla.util.Utilities.getImplFromServices()
mechanism to allow a vendor-pluggable webclient implementation of the
new "WebclientFactory" interface, which is method for method
compatible with BrowserControlFactory. Make all BrowserControlFactory
methods call through to methods on the vendor provided
WebclientFactory implementation.
R webclient/classes_spec/org/mozilla/webclient/BrowserControlFactoryInterface.java
A webclient/classes_spec/org/mozilla/webclient/BrowserControlICE.java
R webclient/classes_spec/org/mozilla/webclient/BrowserControlImpl.java
R webclient/classes_spec/org/mozilla/webclient/BrowserType.java
- move all implementation specific classe to the impl package.
M webclient/classes_spec/org/mozilla/webclient/ImplObject.java
- ImplObject shouldn't depend on vendor private classes.
M webclient/classes_spec/org/mozilla/webclient/Preferences.java
- new method
+ public void unregisterPrefChangedCallback(PrefChangedCallback cb,
+ String prefName, Object closure);
M webclient/classes_spec/org/mozilla/webclient/ProfileManager.java
- properly specify this interface.
A webclient/classes_spec/org/mozilla/webclient/WebclientFactory.java
* <p>This interface allows a pluggable webclient API implementation.
* The static methods in {@link BrowserControlFactory} call through to
* methods on this interface. Please see {@link BrowserControlFactory}
* for information on how to hook up your <code>WebclientFactory</code>
* implementation to the <code>BrowserControlFactory</code></p>
R webclient/classes_spec/org/mozilla/webclient/WrapperFactory.java
R webclient/classes_spec/org/mozilla/webclient/impl/BrowserControlFactoryImpl.java
- moved these to the impl class
A webclient/classes_spec/org/mozilla/webclient/impl/BrowserControlImpl.java
A webclient/classes_spec/org/mozilla/webclient/impl/Service.java
A webclient/classes_spec/org/mozilla/webclient/impl/WebclientFactoryImpl.java
A webclient/classes_spec/org/mozilla/webclient/impl/WrapperFactory.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/BookmarkEntryImpl.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/BookmarksImpl.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/CurrentPageImpl.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/EventRegistrationImpl.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/HistoryImpl.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/ISupportsPeer.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/ImplObjectNative.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/NativeEventThread.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/NavigationImpl.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/PreferencesImpl.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/ProfileManagerImpl.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/RDFEnumeration.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/RDFTreeNode.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/SelectionImpl.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/WCEventListenerWrapper.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/WCMouseListenerImpl.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/WindowControlImpl.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/WrapperFactoryImpl.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/gtk/GtkBrowserControlCanvas.java
A webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/win32/Win32BrowserControlCanvas.java
- copied from old package naming scheme.
- lots and lots of cleanup.
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/BookmarkEntryImpl.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/BookmarksImpl.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/CurrentPageImpl.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/EventRegistrationImpl.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/HistoryImpl.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/ISupportsPeer.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/ImplObjectNative.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/NativeEventThread.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/NavigationImpl.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/PreferencesImpl.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/ProfileManagerImpl.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/RDFEnumeration.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/RDFTreeNode.java
A webclient/classes_spec/org/mozilla/webclient/wrapper_native/README
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/SelectionImpl.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/WCEventListenerWrapper.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/WCMouseListenerImpl.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/WindowControlImpl.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/WrapperFactoryImpl.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/gtk/GtkBrowserControlCanvas.java
R webclient/classes_spec/org/mozilla/webclient/wrapper_native/win32/Win32BrowserControlCanvas.java
- removed from old package naming scheme
M webclient/src_moz/BookmarksImpl.cpp
- remove dependency on RDFActionEvents by inlining all the code that
formerly was in the events.
- package name change
- JNI include file name change
M webclient/src_moz/CurrentPageImpl.cpp
M webclient/src_moz/HistoryImpl.cpp
M webclient/src_moz/ISupportsPeer.cpp
- package name change
- JNI include file name change
M webclient/src_moz/Makefile.in
- get rid of PreferencesActionEvents.cpp and RDFActionEvents.cpp
- add ProfileManagerImpl.cpp
M webclient/src_moz/NativeEventThread.cpp
- this file is not done yet. I've been pulling misplaced initialization
stuff out of here and putting it into WrapperFactoryImpl.cpp.
- got rid of gComponentManager, since we can use do_CreateInstance
instead.
- package name change
- JNI include file name change
M webclient/src_moz/NativeEventThreadActionEvents.h
- JNI include file name change
M webclient/src_moz/NavigationImpl.cpp
- package name change
- JNI include file name change
R webclient/src_moz/PreferencesActionEvents.cpp
R webclient/src_moz/PreferencesActionEvents.h
- don't need these anymore! woohoo!
M webclient/src_moz/PreferencesImpl.cpp
- remove dependency on PreferencesActionEvents by inlining code into the
methods that used to use the events.
A webclient/src_moz/ProfileManagerImpl.cpp
- new class, implementation of the ProfileManager interface.
M webclient/src_moz/PromptActionEvents.cpp
- change erroneous comment so my grep performed correctly.
R webclient/src_moz/RDFActionEvents.cpp
R webclient/src_moz/RDFActionEvents.h
- don't need these anymore! woohoo!
M webclient/src_moz/RDFEnumeration.cpp
M webclient/src_moz/RDFTreeNode.cpp
- remove dependency on RDFActionEvents by inlining code into the
methods that used to use the events.
M webclient/src_moz/WindowControlActionEvents.cpp
- deallocate shareInitiContext.
M webclient/src_moz/WindowControlImpl.cpp
- package name change
- JNI include file name change
- remove the "sleep so I can attach gdb" code. Moved to
WrapperFactoryImpl.cpp.
M webclient/src_moz/WrapperFactoryImpl.cpp
- lots of changes. This is now where the app initialization and
shutdown happens,
M webclient/src_moz/dom_util.cpp
- comment change
M webclient/src_moz/ns_globals.h
- get rid of inappropriate global usage.
M webclient/src_moz/ns_util.h
- new struct WebclientContext for singletons.
M webclient/src_moz/rdf_util.cpp
- new methods, rdf_startup and rdf_shutdown.
- replace calls to nsComponentManager::CreateInstance() with
do_CreateInstance().
M webclient/src_moz/rdf_util.h
- new methods, rdf_startup and rdf_shutdown.
M webclient/src_moz/gtk/GtkBrowserControlCanvas.cpp
- package name change
- JNI include file name change
M webclient/src_moz/gtk/GtkBrowserControlCanvasStub.cpp
- package name change
- JNI include file name change
- this file isn't needed anymore, thankfully! I'll remove it soon.
M webclient/src_moz/gtk/StubFunctions.h
- package name change
- JNI include file name change
- this file isn't needed anymore, thankfully! I'll remove it soon.
M webclient/src_moz/motif/BrowserControlNativeShimStub.cpp
M webclient/src_moz/motif/MotifBrowserControlCanvas.cpp
M webclient/src_moz/motif/MotifBrowserControlCanvasStub.cpp
M webclient/src_moz/motif/NativeLoaderStub.cpp
M webclient/src_moz/win32/Win32BrowserControlCanvas.cpp
- package name change
- JNI include file name change
M webclient/src_share/jni_util.cpp
M webclient/src_share/jni_util.h
- util_InitializeShareInitContext() takes a JNIEnv *.
- new methods
+void util_DeleteGlobalRef(JNIEnv *env, jobject toDeleteRef);
+void util_DeleteLocalRef(JNIEnv *env, jobject toDeleteRef);
+void util_getSystemProperty(JNIEnv *env,
+ const char *propName,
+ char *propValue,
+ jint propValueLen);
M webclient/src_share/jni_util_export.cpp
M webclient/src_share/jni_util_export.h
+JNIEXPORT jobjectArray util_GetJstringArrayFromJcharArray(JNIEnv *env,
+ jint len,
+ jchar **strings,
+ jint *stringLengths)
A webclient/test/automated/src/classes/org/mozilla/webclient/BookmarksTest.java
R webclient/test/automated/src/classes/org/mozilla/webclient/BrowserControlFactoryTest.java
A webclient/test/automated/src/classes/org/mozilla/webclient/PreferencesTest.java
A webclient/test/automated/src/classes/org/mozilla/webclient/ProfileManagerTest.java
A webclient/test/automated/src/classes/org/mozilla/webclient/impl/WebclientFactoryImplTest.java
A webclient/test/automated/src/classes/org/mozilla/webclient/impl/wrapper_native/WrapperFactoryImplTest.java
A webclient/test/automated/src/classes/org/mozilla/webclient/impl/wrapper_native/gtk/TestGtkBrowserControlCanvas.java
R webclient/test/automated/src/classes/org/mozilla/webclient/wrapper_native/gtk/TestGtkBrowserControlCanvas.java
A webclient/test/automated/src/test/BrowserControlFactoryTest_correct
- junit tests! TEST FIRST!
git-svn-id: svn://10.0.0.236/trunk@147393 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -20,100 +20,155 @@
|
||||
* Contributor(s): Ed Burns <edburns@acm.org>
|
||||
*/
|
||||
|
||||
#include "PreferencesImpl.h"
|
||||
#include "PreferencesActionEvents.h"
|
||||
#include "org_mozilla_webclient_impl_wrapper_0005fnative_PreferencesImpl.h"
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_mozilla_webclient_wrapper_1native_PreferencesImpl_nativeSetUnicharPref
|
||||
(JNIEnv *env, jobject obj, jint webShellPtr, jstring prefName,
|
||||
jstring prefValue)
|
||||
#include <nsIPref.h>
|
||||
#include <nsIServiceManager.h> // for do_getService
|
||||
#include <nsDataHashtable.h>
|
||||
#include <nsHashKeys.h> // for nsStringHashKey
|
||||
#include "ns_util.h"
|
||||
//
|
||||
// Local Data
|
||||
//
|
||||
|
||||
#include "ns_util.h"
|
||||
|
||||
typedef struct _peStruct {
|
||||
WebclientContext *cx;
|
||||
jobject obj;
|
||||
jobject callback;
|
||||
} peStruct;
|
||||
|
||||
nsDataHashtable<nsCStringHashKey,peStruct *> closures;
|
||||
|
||||
//
|
||||
// Local functions
|
||||
//
|
||||
|
||||
void prefEnumerator(const char *name, void *closure);
|
||||
static int PR_CALLBACK prefChanged(const char *name, void *closure);
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_PreferencesImpl_nativeStartup
|
||||
(JNIEnv *env, jobject obj, jint nativeContext)
|
||||
{
|
||||
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
|
||||
|
||||
if (initContext == nsnull) {
|
||||
::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to netiveSetPref");
|
||||
return;
|
||||
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
|
||||
("PreferencesImpl_nativeStartup: entering\n"));
|
||||
WebclientContext *wcContext = (WebclientContext *) nativeContext;
|
||||
|
||||
PR_ASSERT(wcContext);
|
||||
|
||||
nsCOMPtr<nsIPref> prefs(do_GetService(NS_PREF_CONTRACTID));
|
||||
|
||||
if (!prefs) {
|
||||
::util_ThrowExceptionToJava(env, "Can't get the preferences.");
|
||||
return;
|
||||
}
|
||||
|
||||
const char * prefNameChars = (char *) ::util_GetStringUTFChars(env,
|
||||
prefName);
|
||||
const jchar * prefValueChars = (jchar *) ::util_GetStringChars(env,
|
||||
prefValue);
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
wsSetUnicharPrefEvent *actionEvent = nsnull;
|
||||
void *voidResult = nsnull;
|
||||
wcContext->sPrefs = prefs.get();
|
||||
NS_ADDREF(wcContext->sPrefs);
|
||||
|
||||
closures.Init();
|
||||
|
||||
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
|
||||
("PreferencesImpl_nativeStartup: exiting\n"));
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_PreferencesImpl_nativeShutdown
|
||||
(JNIEnv *env, jobject obj, jint nativeContext)
|
||||
{
|
||||
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
|
||||
("PreferencesImpl_nativeShutdown: entering\n"));
|
||||
WebclientContext *wcContext = (WebclientContext *) nativeContext;
|
||||
|
||||
PR_ASSERT(wcContext);
|
||||
|
||||
closures.Clear();
|
||||
|
||||
NS_RELEASE(wcContext->sPrefs);
|
||||
wcContext->sPrefs = nsnull;
|
||||
|
||||
|
||||
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
|
||||
("PreferencesImpl_nativeShutdown: exiting\n"));
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_mozilla_webclient_impl_wrapper_1native_PreferencesImpl_nativeSetUnicharPref
|
||||
(JNIEnv *env, jobject obj, jint nativeContext, jstring prefName,
|
||||
jstring prefValue)
|
||||
{
|
||||
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
|
||||
("PreferencesImpl_nativeSetUnicharPref: entering\n"));
|
||||
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
WebclientContext *wcContext = (WebclientContext *) nativeContext;
|
||||
nsCOMPtr<nsIPref> prefs = nsnull;
|
||||
PR_ASSERT(wcContext);
|
||||
|
||||
prefs = wcContext->sPrefs;
|
||||
PR_ASSERT(prefs);
|
||||
|
||||
const char * prefNameChars = (char *)::util_GetStringUTFChars(env,
|
||||
prefName);
|
||||
const jchar * prefValueChars = (jchar *)::util_GetStringChars(env,
|
||||
prefValue);
|
||||
if (nsnull == prefNameChars) {
|
||||
::util_ThrowExceptionToJava(env, "nativeSetUnicharPref: unable to extract Java string for pref name");
|
||||
rv = NS_ERROR_NULL_POINTER;
|
||||
goto NSUP_CLEANUP;
|
||||
goto OMWIWNPINSUP_CLEANUP;
|
||||
}
|
||||
if (nsnull == prefValueChars) {
|
||||
::util_ThrowExceptionToJava(env, "nativeSetUnicharPref: unable to extract Java string for pref value");
|
||||
rv = NS_ERROR_NULL_POINTER;
|
||||
goto NSUP_CLEANUP;
|
||||
goto OMWIWNPINSUP_CLEANUP;
|
||||
}
|
||||
|
||||
if (!(actionEvent = new wsSetUnicharPrefEvent(prefNameChars,
|
||||
prefValueChars))) {
|
||||
::util_ThrowExceptionToJava(env, "nativeSetPref: unable to create actionEvent");
|
||||
rv = NS_ERROR_NULL_POINTER;
|
||||
goto NSUP_CLEANUP;
|
||||
}
|
||||
|
||||
voidResult = ::util_PostSynchronousEvent(initContext,
|
||||
(PLEvent *) *actionEvent);
|
||||
rv = (nsresult) voidResult;
|
||||
rv = prefs->SetUnicharPref(prefNameChars,
|
||||
(const PRUnichar *) prefValueChars);
|
||||
|
||||
NSUP_CLEANUP:
|
||||
OMWIWNPINSUP_CLEANUP:
|
||||
|
||||
::util_ReleaseStringUTFChars(env, prefName, prefNameChars);
|
||||
::util_ReleaseStringChars(env, prefName, prefValueChars);
|
||||
::util_ReleaseStringChars(env, prefValue, prefValueChars);
|
||||
|
||||
if (NS_FAILED(rv)) {
|
||||
// PENDING(edburns): set a more specific kind of pref
|
||||
::util_ThrowExceptionToJava(env, "nativeSetUnicharPref: can't set pref");
|
||||
}
|
||||
|
||||
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
|
||||
("PreferencesImpl_nativeSetUnicharPref: exiting\n"));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_mozilla_webclient_wrapper_1native_PreferencesImpl_nativeSetIntPref
|
||||
(JNIEnv *env, jobject obj, jint webShellPtr, jstring prefName,
|
||||
Java_org_mozilla_webclient_impl_wrapper_1native_PreferencesImpl_nativeSetIntPref
|
||||
(JNIEnv *env, jobject obj, jint nativeContext, jstring prefName,
|
||||
jint prefValue)
|
||||
{
|
||||
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
|
||||
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
|
||||
("PreferencesImpl_nativeSetIntPref: entering\n"));
|
||||
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
WebclientContext *wcContext = (WebclientContext *) nativeContext;
|
||||
nsCOMPtr<nsIPref> prefs = nsnull;
|
||||
PR_ASSERT(wcContext);
|
||||
|
||||
prefs = wcContext->sPrefs;
|
||||
PR_ASSERT(prefs);
|
||||
|
||||
if (initContext == nsnull) {
|
||||
::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to netiveSetPref");
|
||||
return;
|
||||
}
|
||||
const char * prefNameChars = (char *) ::util_GetStringUTFChars(env,
|
||||
prefName);
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
wsSetIntPrefEvent *actionEvent = nsnull;
|
||||
void *voidResult = nsnull;
|
||||
|
||||
if (nsnull == prefNameChars) {
|
||||
::util_ThrowExceptionToJava(env, "nativeSetIntPref: unable to extract Java string");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(actionEvent = new wsSetIntPrefEvent(prefNameChars,
|
||||
(PRInt32) prefValue))) {
|
||||
::util_ThrowExceptionToJava(env, "nativeSetPref: unable to create actionEvent");
|
||||
rv = NS_ERROR_NULL_POINTER;
|
||||
goto NSIP_CLEANUP;
|
||||
}
|
||||
rv = prefs->SetIntPref(prefNameChars, (PRInt32) prefValue);
|
||||
|
||||
voidResult = ::util_PostSynchronousEvent(initContext,
|
||||
(PLEvent *) *actionEvent);
|
||||
rv = (nsresult) voidResult;
|
||||
|
||||
NSIP_CLEANUP:
|
||||
|
||||
::util_ReleaseStringUTFChars(env, prefName, prefNameChars);
|
||||
|
||||
if (NS_FAILED(rv)) {
|
||||
@@ -121,45 +176,36 @@ Java_org_mozilla_webclient_wrapper_1native_PreferencesImpl_nativeSetIntPref
|
||||
::util_ThrowExceptionToJava(env, "nativeSetIntPref: can't set pref");
|
||||
}
|
||||
|
||||
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
|
||||
("PreferencesImpl_nativeSetIntPref: exiting\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_mozilla_webclient_wrapper_1native_PreferencesImpl_nativeSetBoolPref
|
||||
(JNIEnv *env, jobject obj, jint webShellPtr, jstring prefName,
|
||||
Java_org_mozilla_webclient_impl_wrapper_1native_PreferencesImpl_nativeSetBoolPref
|
||||
(JNIEnv *env, jobject obj, jint nativeContext, jstring prefName,
|
||||
jboolean prefValue)
|
||||
{
|
||||
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
|
||||
|
||||
if (initContext == nsnull) {
|
||||
::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to netiveSetPref");
|
||||
return;
|
||||
}
|
||||
|
||||
const char * prefNameChars = (char *) ::util_GetStringUTFChars(env,
|
||||
prefName);
|
||||
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
|
||||
("PreferencesImpl_nativeSetIntPref: entering\n"));
|
||||
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
wsSetBoolPrefEvent *actionEvent = nsnull;
|
||||
void *voidResult = nsnull;
|
||||
WebclientContext *wcContext = (WebclientContext *) nativeContext;
|
||||
nsCOMPtr<nsIPref> prefs = nsnull;
|
||||
PR_ASSERT(wcContext);
|
||||
|
||||
prefs = wcContext->sPrefs;
|
||||
PR_ASSERT(prefs);
|
||||
|
||||
const char * prefNameChars = (char *)::util_GetStringUTFChars(env,
|
||||
prefName);
|
||||
if (nsnull == prefNameChars) {
|
||||
::util_ThrowExceptionToJava(env, "nativeSetBoolPref: unable to extract Java string");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(actionEvent = new wsSetBoolPrefEvent(prefNameChars,
|
||||
prefValue))) {
|
||||
::util_ThrowExceptionToJava(env, "nativeSetPref: unable to create actionEvent");
|
||||
rv = NS_ERROR_NULL_POINTER;
|
||||
goto NSBP_CLEANUP;
|
||||
}
|
||||
|
||||
voidResult = ::util_PostSynchronousEvent(initContext,
|
||||
(PLEvent *) *actionEvent);
|
||||
rv = (nsresult) voidResult;
|
||||
|
||||
NSBP_CLEANUP:
|
||||
rv = prefs->SetBoolPref(prefNameChars, prefValue);
|
||||
|
||||
::util_ReleaseStringUTFChars(env, prefName, prefNameChars);
|
||||
|
||||
@@ -169,31 +215,34 @@ Java_org_mozilla_webclient_wrapper_1native_PreferencesImpl_nativeSetBoolPref
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
|
||||
("PreferencesImpl_nativeSetIntPref: exiting\n"));
|
||||
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_org_mozilla_webclient_wrapper_1native_PreferencesImpl_nativeGetPrefs
|
||||
(JNIEnv *env, jobject obj, jint webShellPtr, jobject props)
|
||||
Java_org_mozilla_webclient_impl_wrapper_1native_PreferencesImpl_nativeGetPrefs
|
||||
(JNIEnv *env, jobject obj, jint nativeContext, jobject props)
|
||||
{
|
||||
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
|
||||
("PreferencesImpl_nativeGetIntPref: entering\n"));
|
||||
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
jobject newProps;
|
||||
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
|
||||
wsGetPrefsEvent *actionEvent = nsnull;
|
||||
void *voidResult = nsnull;
|
||||
|
||||
if (initContext == nsnull) {
|
||||
::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to netiveGetPrefs");
|
||||
return props;
|
||||
}
|
||||
|
||||
PR_ASSERT(initContext->initComplete);
|
||||
jobject newProps = nsnull;
|
||||
WebclientContext *wcContext = (WebclientContext *) nativeContext;
|
||||
nsCOMPtr<nsIPref> prefs = nsnull;
|
||||
PR_ASSERT(wcContext);
|
||||
|
||||
prefs = wcContext->sPrefs;
|
||||
PR_ASSERT(prefs);
|
||||
|
||||
// step one: create or clear props
|
||||
if (nsnull == props) {
|
||||
if (nsnull ==
|
||||
(newProps =
|
||||
::util_CreatePropertiesObject(env, (jobject)
|
||||
&(initContext->shareContext)))) {
|
||||
&(wcContext->shareContext)))) {
|
||||
::util_ThrowExceptionToJava(env, "Exception: nativeGetPrefs: can't create prefs.");
|
||||
return props;
|
||||
}
|
||||
@@ -204,7 +253,7 @@ Java_org_mozilla_webclient_wrapper_1native_PreferencesImpl_nativeGetPrefs
|
||||
}
|
||||
else {
|
||||
::util_ClearPropertiesObject(env, props, (jobject)
|
||||
&(initContext->shareContext));
|
||||
&(wcContext->shareContext));
|
||||
|
||||
}
|
||||
PR_ASSERT(props);
|
||||
@@ -212,64 +261,46 @@ Java_org_mozilla_webclient_wrapper_1native_PreferencesImpl_nativeGetPrefs
|
||||
// step two, call the magic enumeration function, to populate the
|
||||
// properties
|
||||
peStruct pes;
|
||||
pes.cx = initContext;
|
||||
pes.cx = wcContext;
|
||||
pes.obj = props;
|
||||
if (!(actionEvent = new wsGetPrefsEvent(&pes))) {
|
||||
::util_ThrowExceptionToJava(env, "nativeSetPref: unable to create actionEvent");
|
||||
return props;
|
||||
}
|
||||
|
||||
voidResult = ::util_PostSynchronousEvent(initContext,
|
||||
(PLEvent *) *actionEvent);
|
||||
rv = (nsresult) voidResult;
|
||||
|
||||
rv = prefs->EnumerateChildren("", prefEnumerator, &pes);
|
||||
|
||||
if (NS_FAILED(rv)) {
|
||||
// PENDING(edburns): set a more specific kind of pref
|
||||
::util_ThrowExceptionToJava(env, "nativeGetPrefs: can't get prefs");
|
||||
}
|
||||
|
||||
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
|
||||
("PreferencesImpl_nativeGetIntPref: exiting\n"));
|
||||
|
||||
return props;
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_mozilla_webclient_wrapper_1native_PreferencesImpl_nativeRegisterPrefChangedCallback
|
||||
(JNIEnv *env, jobject obj, jint webShellPtr,
|
||||
Java_org_mozilla_webclient_impl_wrapper_1native_PreferencesImpl_nativeRegisterPrefChangedCallback
|
||||
(JNIEnv *env, jobject obj, jint nativeContext,
|
||||
jobject callback, jstring prefName, jobject closure)
|
||||
{
|
||||
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
|
||||
("PreferencesImpl_nativeRegisterPrefChangedCallback: entering\n"));
|
||||
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr;
|
||||
const char *prefNameChars;
|
||||
wsRegisterPrefCallbackEvent *actionEvent = nsnull;
|
||||
void *voidResult = nsnull;
|
||||
WebclientContext *wcContext = (WebclientContext *) nativeContext;
|
||||
const char *prefNameChars = nsnull;
|
||||
nsCOMPtr<nsIPref> prefs = nsnull;
|
||||
PR_ASSERT(wcContext);
|
||||
|
||||
if (initContext == nsnull) {
|
||||
::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to nativeRegisterPrefChangedCallback");
|
||||
return;
|
||||
}
|
||||
|
||||
PR_ASSERT(initContext->initComplete);
|
||||
prefs = wcContext->sPrefs;
|
||||
PR_ASSERT(prefs);
|
||||
|
||||
if (nsnull == (callback = ::util_NewGlobalRef(env, callback))) {
|
||||
::util_ThrowExceptionToJava(env, "Exception: nativeRegisterPrefChangedCallback: can't global ref for callback");
|
||||
return;
|
||||
}
|
||||
|
||||
if (nsnull == (closure = ::util_NewGlobalRef(env, closure))) {
|
||||
::util_ThrowExceptionToJava(env, "Exception: nativeRegisterPrefChangedCallback: can't global ref for closure");
|
||||
return;
|
||||
}
|
||||
|
||||
// step one, set up our struct
|
||||
peStruct *pes;
|
||||
peStruct *pes = new peStruct();
|
||||
|
||||
if (nsnull == (pes = new peStruct())) {
|
||||
::util_ThrowExceptionToJava(env, "Exception: nativeRegisterPrefChangedCallback: can't get peStruct");
|
||||
return;
|
||||
}
|
||||
|
||||
pes->cx = initContext;
|
||||
pes->obj = closure;
|
||||
pes->callback = callback;
|
||||
pes->cx = wcContext;
|
||||
pes->obj = ::util_NewGlobalRef(env, closure);
|
||||
pes->callback = ::util_NewGlobalRef(env, callback);
|
||||
closures.Put(nsDependentCString(prefNameChars), pes);
|
||||
|
||||
// step two: create a const char * from the prefName
|
||||
if (nsnull == (prefNameChars = ::util_GetStringUTFChars(env, prefName))) {
|
||||
@@ -277,15 +308,7 @@ Java_org_mozilla_webclient_wrapper_1native_PreferencesImpl_nativeRegisterPrefCha
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(actionEvent = new wsRegisterPrefCallbackEvent(prefNameChars, pes))) {
|
||||
::util_ThrowExceptionToJava(env, "nativeSetPref: unable to create actionEvent");
|
||||
rv = NS_ERROR_NULL_POINTER;
|
||||
return;
|
||||
}
|
||||
|
||||
voidResult = ::util_PostSynchronousEvent(initContext,
|
||||
(PLEvent *) *actionEvent);
|
||||
rv = (nsresult) voidResult;
|
||||
rv = prefs->RegisterCallback(prefNameChars, prefChanged, pes);
|
||||
|
||||
if (NS_FAILED(rv)) {
|
||||
// PENDING(edburns): set a more specific kind of pref
|
||||
@@ -293,6 +316,165 @@ Java_org_mozilla_webclient_wrapper_1native_PreferencesImpl_nativeRegisterPrefCha
|
||||
}
|
||||
|
||||
::util_ReleaseStringUTFChars(env, prefName, prefNameChars);
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_mozilla_webclient_impl_wrapper_1native_PreferencesImpl_nativeUnregisterPrefChangedCallback
|
||||
(JNIEnv *env, jobject obj, jint nativeContext,
|
||||
jobject callback, jstring prefName, jobject closure)
|
||||
{
|
||||
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
|
||||
("PreferencesImpl_nativeRegisterPrefChangedCallback: entering\n"));
|
||||
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
WebclientContext *wcContext = (WebclientContext *) nativeContext;
|
||||
const char *prefNameChars = nsnull;
|
||||
nsCOMPtr<nsIPref> prefs = nsnull;
|
||||
PR_ASSERT(wcContext);
|
||||
|
||||
prefs = wcContext->sPrefs;
|
||||
PR_ASSERT(prefs);
|
||||
|
||||
// step one, set up our struct
|
||||
peStruct *pes = nsnull;
|
||||
|
||||
|
||||
// step two: create a const char * from the prefName
|
||||
if (nsnull == (prefNameChars = ::util_GetStringUTFChars(env, prefName))) {
|
||||
::util_ThrowExceptionToJava(env, "Exception: nativeRegisterPrefChangedCallback: can't get string for prefName");
|
||||
return;
|
||||
}
|
||||
|
||||
nsDependentCString prefNameCString(prefNameChars);
|
||||
|
||||
if (closures.Get(prefNameCString, &pes)) {
|
||||
closures.Remove(prefNameCString);
|
||||
|
||||
rv = prefs->UnregisterCallback(prefNameChars, prefChanged, pes);
|
||||
|
||||
if (NS_FAILED(rv)) {
|
||||
// PENDING(edburns): set a more specific kind of pref
|
||||
::util_ThrowExceptionToJava(env, "nativeRegisterPrefChangedCallback: can't set callback");
|
||||
}
|
||||
|
||||
::util_DeleteGlobalRef(env, pes->obj);
|
||||
::util_DeleteGlobalRef(env, pes->callback);
|
||||
delete pes;
|
||||
}
|
||||
|
||||
::util_ReleaseStringUTFChars(env, prefName, prefNameChars);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Helper functions
|
||||
//
|
||||
|
||||
void prefEnumerator(const char *name, void *closure)
|
||||
{
|
||||
JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION);
|
||||
if (nsnull == closure) {
|
||||
return;
|
||||
}
|
||||
peStruct *pes = (peStruct *) closure;
|
||||
WebclientContext *wcContext = pes->cx;
|
||||
jobject props = pes->obj;
|
||||
PRInt32 prefType, intVal;
|
||||
PRBool boolVal;
|
||||
jstring prefName = nsnull;
|
||||
jstring prefValue = nsnull;
|
||||
PRUnichar *prefValueUni = nsnull;
|
||||
nsAutoString prefValueAuto;
|
||||
const PRInt32 bufLen = 20;
|
||||
char buf[bufLen];
|
||||
memset(buf, 0, bufLen);
|
||||
nsCOMPtr<nsIPref> prefs = wcContext->sPrefs;
|
||||
|
||||
if (nsnull == props || !prefs) {
|
||||
return;
|
||||
}
|
||||
if (NS_FAILED(prefs->GetPrefType(name, &prefType))) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (nsnull == (prefName = ::util_NewStringUTF(env, name))) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch(prefType) {
|
||||
case nsIPref::ePrefInt:
|
||||
if (NS_SUCCEEDED(prefs->GetIntPref(name, &intVal))) {
|
||||
WC_ITOA(intVal, buf, 10);
|
||||
prefValue = ::util_NewStringUTF(env, buf);
|
||||
}
|
||||
break;
|
||||
case nsIPref::ePrefBool:
|
||||
if (NS_SUCCEEDED(prefs->GetBoolPref(name, &boolVal))) {
|
||||
if (boolVal) {
|
||||
prefValue = ::util_NewStringUTF(env, "true");
|
||||
}
|
||||
else {
|
||||
prefValue = ::util_NewStringUTF(env, "false");
|
||||
}
|
||||
}
|
||||
break;
|
||||
case nsIPref::ePrefString:
|
||||
if (NS_SUCCEEDED(prefs->CopyUnicharPref(name, &prefValueUni))) {
|
||||
prefValueAuto = prefValueUni;
|
||||
prefValue = ::util_NewString(env, (const jchar *) prefValueUni,
|
||||
prefValueAuto.Length());
|
||||
delete [] prefValueUni;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
PR_ASSERT(PR_TRUE);
|
||||
break;
|
||||
}
|
||||
if (nsnull == prefValue) {
|
||||
prefValue = ::util_NewStringUTF(env, "");
|
||||
}
|
||||
::util_StoreIntoPropertiesObject(env, props, prefName, prefValue,
|
||||
(jobject) &(wcContext->shareContext));
|
||||
::util_DeleteLocalRef(env, prefName);
|
||||
::util_DeleteLocalRef(env, prefValue);
|
||||
}
|
||||
|
||||
static int PR_CALLBACK prefChanged(const char *name, void *closure)
|
||||
{
|
||||
if (nsnull == name || nsnull == closure) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
nsresult rv;
|
||||
int result;
|
||||
JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION);
|
||||
peStruct *pes = (peStruct *) closure;
|
||||
jstring prefName;
|
||||
|
||||
if (!(prefName = ::util_NewStringUTF(env, name))) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
#ifdef BAL_INTERFACE
|
||||
#else
|
||||
jclass pcClass = nsnull;
|
||||
jmethodID pcMID = nsnull;
|
||||
|
||||
if (!(pcClass = env->GetObjectClass(pes->callback))) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
if (!(pcMID =env->GetMethodID(pcClass, "prefChanged",
|
||||
"(Ljava/lang/String;Ljava/lang/Object;)I"))){
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
result = env->CallIntMethod(pes->callback, pcMID, prefName,
|
||||
pes->obj);
|
||||
|
||||
#endif
|
||||
|
||||
::util_DeleteStringUTF(env, prefName);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user