From 908f89a2bfa0c39a077532cea49a2b80e3f95ea2 Mon Sep 17 00:00:00 2001 From: "edburns%acm.org" Date: Mon, 19 Jun 2006 18:50:01 +0000 Subject: [PATCH] I now have the pluglet.dll XPCOM module loading. The reason it was not loading: it depends on jvm.dll, which was not on my path. I had to add %JDKHOME%\jre\bin\client to my path and now it loaded. Thanks to shaver and plasticmillion on #developers for the tip to use depends.exe, the Dependency Walker. What a nice tool. Of course, there is now a crash after it loads, which will be my next step after this checkin. A plugins/src/iPlugletEngine.idl A plugins/src/iPlugletManager.idl - make IDL files for our external interfaces. M plugins/src/Makefile.in - move PlugletEngine.cpp to the top of the list. M plugins/src/PlugletEngine.cpp M plugins/src/PlugletEngine.h - big changes here. Make this a proper generic XPCOM component. - use the iPlugletManager interface, and the nsICategoryManager to make sure we get called at startup. M plugins/src/Pluglet.cpp M plugins/src/Pluglet.h M plugins/src/PlugletFactory.cpp M plugins/src/PlugletFactory.h M plugins/src/PlugletInputStream.cpp M plugins/src/PlugletInputStream.h M plugins/src/PlugletLoader.cpp M plugins/src/PlugletManager.cpp M plugins/src/PlugletPeer.cpp M plugins/src/PlugletStreamInfo.cpp M plugins/src/PlugletStreamListener.cpp M plugins/src/PlugletViewWindows.cpp M plugins/src/PlugletsDir.cpp M plugins/src/Registry.cpp - remove static method PlugletEngine::GetJNIEnv, in favor of instance method and use of nsIServiceManager. git-svn-id: svn://10.0.0.236/trunk@200339 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/java/plugins/src/Makefile.in | 7 +- mozilla/java/plugins/src/Pluglet.cpp | 100 +++++- mozilla/java/plugins/src/Pluglet.h | 3 + mozilla/java/plugins/src/PlugletEngine.cpp | 330 ++++++++++-------- mozilla/java/plugins/src/PlugletEngine.h | 29 +- mozilla/java/plugins/src/PlugletFactory.cpp | 70 +++- mozilla/java/plugins/src/PlugletFactory.h | 4 +- .../java/plugins/src/PlugletInputStream.cpp | 46 ++- mozilla/java/plugins/src/PlugletInputStream.h | 1 + mozilla/java/plugins/src/PlugletLoader.cpp | 77 +++- mozilla/java/plugins/src/PlugletManager.cpp | 39 ++- mozilla/java/plugins/src/PlugletPeer.cpp | 51 ++- .../java/plugins/src/PlugletStreamInfo.cpp | 50 ++- .../plugins/src/PlugletStreamListener.cpp | 97 ++++- .../java/plugins/src/PlugletViewWindows.cpp | 27 +- mozilla/java/plugins/src/PlugletsDir.cpp | 1 - mozilla/java/plugins/src/Registry.cpp | 39 ++- mozilla/java/plugins/src/iPlugletEngine.idl | 43 +++ mozilla/java/plugins/src/iPlugletManager.idl | 17 + 19 files changed, 779 insertions(+), 252 deletions(-) create mode 100644 mozilla/java/plugins/src/iPlugletEngine.idl create mode 100644 mozilla/java/plugins/src/iPlugletManager.idl diff --git a/mozilla/java/plugins/src/Makefile.in b/mozilla/java/plugins/src/Makefile.in index 8055ebe583b..88bc2e83db8 100644 --- a/mozilla/java/plugins/src/Makefile.in +++ b/mozilla/java/plugins/src/Makefile.in @@ -50,9 +50,9 @@ endif endif CPPSRCS = \ + PlugletEngine.cpp \ List.cpp \ Pluglet.cpp \ - PlugletEngine.cpp \ PlugletFactory.cpp \ PlugletInputStream.cpp \ PlugletLoader.cpp \ @@ -80,6 +80,11 @@ endif endif endif +XPIDLSRCS = \ + iPlugletEngine.idl \ + iPlugletManager.idl \ + $(NULL) + CXXFLAGS := $(MOZ_TOOLKIT_REGISTRY_CFLAGS) -DMOZILLA_INTERNAL_API -D_REENTRANT -DOJI_DISABLE $(CXXFLAGS) ifeq ($(OS_ARCH),Darwin) diff --git a/mozilla/java/plugins/src/Pluglet.cpp b/mozilla/java/plugins/src/Pluglet.cpp index 676edabe032..7f2fa1a3b6e 100644 --- a/mozilla/java/plugins/src/Pluglet.cpp +++ b/mozilla/java/plugins/src/Pluglet.cpp @@ -18,14 +18,18 @@ * * Contributor(s): */ +#include "nsIServiceManager.h" + #include "Pluglet.h" -#include "PlugletEngine.h" +#include "iPlugletEngine.h" #include "PlugletStreamListener.h" #include "PlugletPeer.h" #include "Registry.h" #include "PlugletViewFactory.h" #include "PlugletLog.h" + + jmethodID Pluglet::initializeMID = NULL; jmethodID Pluglet::startMID = NULL; jmethodID Pluglet::stopMID = NULL; @@ -38,8 +42,29 @@ static NS_DEFINE_IID(kIPluginInstanceIID, NS_IPLUGININSTANCE_IID); NS_IMPL_ISUPPORTS1(Pluglet,nsIPluginInstance); -Pluglet::Pluglet(jobject object) { - jthis = PlugletEngine::GetJNIEnv()->NewGlobalRef(object); +Pluglet::Pluglet(jobject object) : plugletEngine(nsnull) { + nsIServiceManager *servman = nsnull; + NS_GetServiceManager(&servman); + nsresult rv; + rv = servman->GetServiceByContractID(PLUGLETENGINE_ContractID, + NS_GET_IID(iPlugletEngine), + getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, + ("Pluglet::Pluglet: Cannot access iPlugletEngine service\n")); + return; + } + + JNIEnv *jniEnv = nsnull; + rv = plugletEngine->GetJNIEnv(&jniEnv); + if (NS_FAILED(rv)) { + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, + ("Pluglet::Pluglet: plugletEngine->GetJNIEnv failed\n")); + return; + } + + + jthis = jniEnv->NewGlobalRef(object); //nb check for null peer = NULL; view = PlugletViewFactory::GetPlugletView(); @@ -48,7 +73,16 @@ Pluglet::Pluglet(jobject object) { Pluglet::~Pluglet() { Registry::Remove(jthis); - PlugletEngine::GetJNIEnv()->DeleteGlobalRef(jthis); + JNIEnv *jniEnv = nsnull; + nsresult rv; + rv = plugletEngine->GetJNIEnv(&jniEnv); + if (NS_FAILED(rv)) { + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, + ("Pluglet::~Pluglet: plugletEngine->GetJNIEnv failed\n")); + return; + } + + jniEnv->DeleteGlobalRef(jthis); NS_RELEASE(peer); } @@ -62,7 +96,15 @@ NS_METHOD Pluglet::HandleEvent(nsPluginEvent* event, PRBool* handled) { NS_METHOD Pluglet::Initialize(nsIPluginInstancePeer* _peer) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("Pluglet::Initialize\n")); - JNIEnv *env = PlugletEngine::GetJNIEnv(); + JNIEnv *env = nsnull; + nsresult rv; + rv = plugletEngine->GetJNIEnv(&env); + + if (NS_FAILED(rv)) { + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, + ("Pluglet::Initialize: plugletEngine->GetJNIEnv failed\n")); + return rv; + } if (!printMID) { jclass clazz = env->FindClass("org/mozilla/pluglet/Pluglet"); if (env->ExceptionOccurred()) { @@ -126,7 +168,14 @@ NS_METHOD Pluglet::GetPeer(nsIPluginInstancePeer* *result) { NS_METHOD Pluglet::Start(void) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("Pluglet::Start\n")); - JNIEnv * env = PlugletEngine::GetJNIEnv(); + JNIEnv *env = nsnull; + nsresult rv; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, + ("Pluglet::Start: plugletEngine->GetJNIEnv failed\n")); + return rv; + } env->CallVoidMethod(jthis,startMID); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); @@ -137,7 +186,14 @@ NS_METHOD Pluglet::Start(void) { NS_METHOD Pluglet::Stop(void) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("Pluglet::Stop\n")); - JNIEnv * env = PlugletEngine::GetJNIEnv(); + JNIEnv *env = nsnull; + nsresult rv; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, + ("Pluglet::Stop: plugletEngine->GetJNIEnv failed\n")); + return rv; + } env->CallVoidMethod(jthis,stopMID); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); @@ -148,7 +204,15 @@ NS_METHOD Pluglet::Stop(void) { NS_METHOD Pluglet::Destroy(void) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("Pluglet::Destroy\n")); - JNIEnv * env = PlugletEngine::GetJNIEnv(); + JNIEnv *env = nsnull; + nsresult rv; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, + ("Pluglet::Destroy: plugletEngine->GetJNIEnv failed\n")); + return rv; + } + env->CallVoidMethod(jthis,destroyMID); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); @@ -163,7 +227,15 @@ NS_METHOD Pluglet::NewStream(nsIPluginStreamListener** listener) { if(!listener) { return NS_ERROR_FAILURE; } - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsresult rv; + JNIEnv *env; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, + ("Pluglet::Destroy: plugletEngine->GetJNIEnv failed\n")); + return rv; + } + jobject obj = env->CallObjectMethod(jthis,newStreamMID); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); @@ -186,7 +258,15 @@ NS_METHOD Pluglet::SetWindow(nsPluginWindow* window) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("Pluglet::SetWindow\n")); if (view->SetWindow(window) == PR_TRUE) { - JNIEnv *env = PlugletEngine::GetJNIEnv(); + nsresult rv; + JNIEnv *env; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, + ("Pluglet::Destroy: plugletEngine->GetJNIEnv failed\n")); + return rv; + } + env->CallVoidMethod(jthis,setWindowMID,view->GetJObject()); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); diff --git a/mozilla/java/plugins/src/Pluglet.h b/mozilla/java/plugins/src/Pluglet.h index 6160cb65ba9..239f1a1b596 100644 --- a/mozilla/java/plugins/src/Pluglet.h +++ b/mozilla/java/plugins/src/Pluglet.h @@ -24,6 +24,8 @@ #include "jni.h" #include "PlugletView.h" +class iPlugletEngine; + class Pluglet : public nsIPluginInstance { public: NS_IMETHOD HandleEvent(nsPluginEvent* event, PRBool* handled); @@ -52,5 +54,6 @@ class Pluglet : public nsIPluginInstance { static jmethodID getValueMID; nsIPluginInstancePeer *peer; PlugletView *view; + nsCOMPtr plugletEngine; }; #endif /* __Pluglet_h__ */ diff --git a/mozilla/java/plugins/src/PlugletEngine.cpp b/mozilla/java/plugins/src/PlugletEngine.cpp index 083b899550a..82916d08d70 100644 --- a/mozilla/java/plugins/src/PlugletEngine.cpp +++ b/mozilla/java/plugins/src/PlugletEngine.cpp @@ -18,14 +18,17 @@ * * Contributor(s): */ +#include "nsIGenericFactory.h" +#include "nsICategoryManager.h" +#include "nsIObserver.h" +#include "nsMemory.h" + #include "PlugletEngine.h" #include "Pluglet.h" #include "nsIServiceManager.h" #include "nsServiceManagerUtils.h" #include "prenv.h" #include "PlugletManager.h" -#include "nsIGenericFactory.h" -#include "nsIModule.h" #include "PlugletLog.h" #ifndef OJI_DISABLE @@ -44,94 +47,6 @@ static NS_DEFINE_CID(kPluginManagerCID, NS_PLUGINMANAGER_CID); PRLogModuleInfo* PlugletLog::log = NULL; -#define PLUGLETENGINE_ContractID \ - "@mozilla.org/blackwood/pluglet-engine;1" - -#define PLUGLETENGINE_CID \ -{ /* C1E694F3-9BE1-11d3-837C-0004AC56C49E */ \ - 0xc1e694f3, 0x9be1, 0x11d3, { 0x83, 0x7c, 0x0, 0x4, 0xac, 0x56, 0xc4, 0x9e } \ -} - - - - -#ifdef XP_PC - -NS_GENERIC_FACTORY_CONSTRUCTOR(PlugletEngine) - -#else //XP_PC - -#include - -/* - * CheckForXTSymbol - * return value - * 1 - AWT will not complain - * 0 - AWT will not work - * - */ - -int -CheckForXTSymbol(void) -{ - Dl_info dlinfo; - void *v; - v = dlsym(RTLD_DEFAULT, "vendorShellWidgetClass"); - if (v != NULL && dladdr(v, &dlinfo)) { - if (strstr(dlinfo.dli_fname, "libXt.so") != NULL) { - fprintf(stderr, "\nRuntime link error - it appears that " - "libXt got loaded before libXm,\n" - "which is not allowed for pluglets\n"); - return 0; - } - } - return 1; - -} - -static NS_IMETHODIMP -PlugletEngineConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult) -{ - nsresult rv; - PlugletEngine * inst; - if ( !CheckForXTSymbol() ) { - rv = NS_ERROR_FAILURE; - return rv; - } - if (NULL == aResult) { - rv = NS_ERROR_NULL_POINTER; - return rv; - } - *aResult = NULL; - if (NULL != aOuter) { - rv = NS_ERROR_NO_AGGREGATION; - return rv; - } - NS_NEWXPCOM(inst, PlugletEngine); - if (NULL == inst) { - rv = NS_ERROR_OUT_OF_MEMORY; - return rv; - } - NS_ADDREF(inst); - rv = inst->QueryInterface(aIID, aResult); - NS_RELEASE(inst); - return rv; -} - -#endif //XP_PC - - -static nsModuleComponentInfo components[] = -{ - { - "Pluglet Engine", - PLUGLETENGINE_CID, - PLUGLETENGINE_ContractID, - PlugletEngineConstructor - } -}; - -NS_IMPL_NSGETMODULE("PlugletEngineModule",components); int PlugletEngine::objectCount = 0; @@ -143,26 +58,66 @@ jobject PlugletEngine::plugletManager = NULL; #define PLUGIN_MIME_DESCRIPTION "*:*:Pluglet Engine" -NS_IMPL_ISUPPORTS1(PlugletEngine,nsIPlugin); -NS_METHOD PlugletEngine::Initialize(void) { +PlugletEngine::PlugletEngine() { + NS_INIT_ISUPPORTS(); + PlugletLog::log = PR_NewLogModule("pluglets"); + dir = new PlugletsDir(); + engine = this; + objectCount++; +} + +PlugletEngine::~PlugletEngine(void) { + delete dir; + objectCount--; +} + +NS_IMPL_ISUPPORTS3(PlugletEngine, nsIObserver, iPlugletEngine, nsIPlugin); +NS_IMETHODIMP +PlugletEngine::Observe(nsISupports *aSubject, const char *aTopic, + const PRUnichar *aData) +{ + return NS_OK; +} + +NS_IMETHODIMP +PlugletEngine::Initialize(void) +{ //nb ??? return NS_OK; } -NS_METHOD PlugletEngine::Shutdown(void) { +NS_IMETHODIMP +PlugletEngine::Shutdown(void) +{ //nb ??? return NS_OK; } -NS_METHOD PlugletEngine::CreateInstance(nsISupports *aOuter, - REFNSIID aIID, void **aResult) { +NS_IMETHODIMP +PlugletEngine::CreateInstance(nsISupports *aOuter, REFNSIID aIID, + void **aResult) +{ return NS_ERROR_FAILURE; //nb to do } - -NS_METHOD PlugletEngine::CreatePluginInstance(nsISupports *aOuter, REFNSIID aIID, - const char* aPluginMIMEType, void **aResult) { + +NS_IMETHODIMP +PlugletEngine::LockFactory(PRBool aLock) +{ + if(aLock) { + PR_AtomicIncrement(&lockCount); + } else { + PR_AtomicDecrement(&lockCount); + } + return NS_OK; +} + +NS_IMETHODIMP +PlugletEngine::CreatePluginInstance(nsISupports *aOuter, REFNSIID aIID, + const char* aPluginMIMEType, + void **aResult) +{ PR_LOG(PlugletLog::log, PR_LOG_DEBUG, - ("PlugletEngine::CreatePluginInstance\n")); + ("PlugletEngine::CreatePluginInstance\n")); if (!aResult) { return NS_ERROR_FAILURE; } @@ -176,32 +131,23 @@ NS_METHOD PlugletEngine::CreatePluginInstance(nsISupports *aOuter, REFNSIID aIID return plugletFactory->CreatePluginInstance(aPluginMIMEType,aResult); } -NS_METHOD PlugletEngine::GetMIMEDescription(const char* *result) { +NS_IMETHODIMP PlugletEngine::GetMIMEDescription(const char* *result) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("PlugletEngine::GetMimeDescription\n")); if (!result) { return NS_ERROR_FAILURE; } - *result = PLUGIN_MIME_DESCRIPTION; + *result = strdup(PLUGIN_MIME_DESCRIPTION); return NS_OK; } -NS_METHOD PlugletEngine::GetValue(nsPluginVariable variable, void *value) { +NS_IMETHODIMP PlugletEngine::GetValue(nsPluginVariable variable, void *value) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("PlugletEngine::GetValue; stub\n")); //nb ???? return NS_OK; } -NS_METHOD PlugletEngine::LockFactory(PRBool aLock) { - if(aLock) { - PR_AtomicIncrement(&lockCount); - } else { - PR_AtomicDecrement(&lockCount); - } - return NS_OK; -} - char *ToString(jobject obj,JNIEnv *env) { static jmethodID toStringID = NULL; if (!toStringID) { @@ -217,18 +163,6 @@ char *ToString(jobject obj,JNIEnv *env) { return res; } -PlugletEngine::PlugletEngine() { - PlugletLog::log = PR_NewLogModule("pluglets"); - dir = new PlugletsDir(); - engine = this; - objectCount++; -} - -PlugletEngine::~PlugletEngine(void) { - delete dir; - objectCount--; -} - #ifdef OJI_DISABLE @@ -274,8 +208,12 @@ void PlugletEngine::StartJVM() { #endif /* OJI_DISABLE */ -JNIEnv * PlugletEngine::GetJNIEnv(void) { +NS_IMETHODIMP PlugletEngine::GetJNIEnv(JNIEnv * *jniEnv) +{ JNIEnv * res = NULL; + if (nsnull == jniEnv) { + return NS_ERROR_NULL_POINTER; + } #ifndef OJI_DISABLE nsresult result; if (!jvmManager) { @@ -285,10 +223,10 @@ JNIEnv * PlugletEngine::GetJNIEnv(void) { } } if (!jvmManager) { - return NULL; + return result; } - if (NS_FAILED(jvmManager->CreateProxyJNI(NULL,&res))) { - return NULL; + if (NS_FAILED(result = jvmManager->CreateProxyJNI(NULL,&res))) { + return result; } if (!securityContext) { securityContext = new PlugletSecurityContext(); @@ -304,10 +242,16 @@ JNIEnv * PlugletEngine::GetJNIEnv(void) { jvm->AttachCurrentThread((void**)&res,NULL); } #endif /* OJI_DISABLE */ - return res; + *jniEnv = res; + return NS_OK; } -jobject PlugletEngine::GetPlugletManager(void) { +NS_IMETHODIMP PlugletEngine::GetPlugletManager(void * *jobj) +{ + if (nsnull == jobj) { + return NS_ERROR_NULL_POINTER; + } + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("PlugletEngine::GetPlugletManager\n")); //Changed by John Sublet NS_WITH_SERVICE deprecated currently is @@ -318,33 +262,141 @@ jobject PlugletEngine::GetPlugletManager(void) { //NS_WITH_SERVICE(nsIPluginManager,_pluginManager,kPluginManagerCID,&res); nsCOMPtr _pluginManager (do_GetService(kPluginManagerCID)); - // Changed by John Sublet : FIXME this assumes _pluginManager will be properly set to NULL if (_pluginManager) { pluginManager = _pluginManager; } if (!pluginManager) { - return NULL; + return NS_ERROR_NULL_POINTER; } if (!plugletManager) { plugletManager = PlugletManager::GetJObject(pluginManager.get()); } - return plugletManager; + *jobj = pluginManager; + return NS_OK; } -PlugletEngine * PlugletEngine::GetEngine(void) { - return engine; +NS_IMETHODIMP PlugletEngine::GetEngine(iPlugletEngine **outEngine) +{ + if (nsnull == outEngine) { + return NS_ERROR_NULL_POINTER; + } + *outEngine = engine; + return NS_OK; } -void PlugletEngine::IncObjectCount(void) { + +NS_IMETHODIMP PlugletEngine::IncObjectCount() +{ objectCount++; + return NS_OK; } -void PlugletEngine::DecObjectCount(void) { +NS_IMETHODIMP PlugletEngine::DecObjectCount() +{ objectCount--; + return NS_OK; } -PRBool PlugletEngine::IsUnloadable(void) { - return (lockCount == 0 - && objectCount == 0); +NS_IMETHODIMP PlugletEngine::GetUnloadable(PRBool *aUnloadable) +{ + if (nsnull == aUnloadable) { + return NS_ERROR_NULL_POINTER; + } + *aUnloadable = (PRBool) (lockCount == 0 + && objectCount == 0); + return NS_OK; } + +static NS_METHOD PlugletEngineRegistration(nsIComponentManager *aCompMgr, + nsIFile *aPath, + const char *registryLocation, + const char *componentType, + const nsModuleComponentInfo *info) +{ + nsresult rv; + nsCOMPtr servman = + do_QueryInterface((nsISupports*)aCompMgr, &rv); + if (NS_FAILED(rv)) + return rv; + nsCOMPtr catman; + servman->GetServiceByContractID(NS_CATEGORYMANAGER_CONTRACTID, + NS_GET_IID(nsICategoryManager), + getter_AddRefs(catman)); + if (NS_FAILED(rv)) + return rv; + char* previous = nsnull; + rv = catman->AddCategoryEntry("xpcom-startup", + "PlugletEngine", + PLUGLETENGINE_ContractID, + PR_TRUE, + PR_TRUE, + &previous); + if (previous) { + nsMemory::Free(previous); + } + + return rv; +} +static NS_METHOD PlugletEngineUnregistration(nsIComponentManager *aCompMgr, + nsIFile *aPath, + const char *registryLocation, + const nsModuleComponentInfo *info) +{ + nsresult rv; + nsCOMPtr servman = + do_QueryInterface((nsISupports*)aCompMgr, &rv); + if (NS_FAILED(rv)) + return rv; + nsCOMPtr catman; + servman->GetServiceByContractID(NS_CATEGORYMANAGER_CONTRACTID, + NS_GET_IID(nsICategoryManager), + getter_AddRefs(catman)); + if (NS_FAILED(rv)) + return rv; + rv = catman->DeleteCategoryEntry("xpcom-startup", + "PlugletEngine", + PR_TRUE); + return rv; +} + +NS_EXPORT +nsresult +iPlugletEngine::GetInstance(iPlugletEngine* *result) +{ + nsIServiceManager *servman = nsnull; + NS_GetServiceManager(&servman); + nsresult rv; + rv = servman->GetServiceByContractID(PLUGLETENGINE_ContractID, + NS_GET_IID(iPlugletEngine), + (void **) &result); + if (NS_FAILED(rv)) { + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, + ("Pluglet::PlugletFactory: Cannot access iPlugletEngine service\n")); + return rv; + } + + + return NS_OK; +} + +PlugletEngine *PlugletEngine::_NewInstance() +{ + PlugletEngine *result = new PlugletEngine(); + return result; +} + +NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(PlugletEngine, + PlugletEngine::_NewInstance) + +static const nsModuleComponentInfo components[] = +{ + { "PlugletEngine", + PLUGLETENGINE_CID, + PLUGLETENGINE_ContractID, + PlugletEngineConstructor, + PlugletEngineRegistration, + PlugletEngineUnregistration + } +}; +NS_IMPL_NSGETMODULE(PlugletEngineModule, components) diff --git a/mozilla/java/plugins/src/PlugletEngine.h b/mozilla/java/plugins/src/PlugletEngine.h index 8f72910087a..eadbf7384d8 100644 --- a/mozilla/java/plugins/src/PlugletEngine.h +++ b/mozilla/java/plugins/src/PlugletEngine.h @@ -21,9 +21,10 @@ #ifndef __PlugletEngine_h__ #define __PlugletEngine_h__ #include "nsplugin.h" -#include "jni.h" #include "nsIPluginManager.h" +#include "nsIObserver.h" #include "PlugletsDir.h" +#include "iPlugletEngine.h" #include "nsCOMPtr.h" #ifndef OJI_DISABLE @@ -31,26 +32,18 @@ #include "PlugletSecurityContext.h" #endif /* OJI_DISABLE */ -class PlugletEngine : public nsIPlugin { +class PlugletEngine : public nsIObserver, public iPlugletEngine, public nsIPlugin { public: - NS_IMETHOD CreatePluginInstance(nsISupports *aOuter, REFNSIID aIID, - const char* aPluginMIMEType, - void **aResult); - NS_IMETHOD CreateInstance(nsISupports *aOuter, const nsIID & iid, void * *_retval); - NS_IMETHOD LockFactory(PRBool aLock); - NS_IMETHOD Initialize(void); - NS_IMETHOD Shutdown(void); - NS_IMETHOD GetMIMEDescription(const char* *result); - NS_IMETHOD GetValue(nsPluginVariable variable, void *value); - NS_DECL_ISUPPORTS PlugletEngine(); virtual ~PlugletEngine(void); - static JNIEnv * GetJNIEnv(void); - static jobject GetPlugletManager(void); - static void IncObjectCount(void); - static void DecObjectCount(void); - static PRBool IsUnloadable(void); - static PlugletEngine * GetEngine(void); + NS_DECL_ISUPPORTS + NS_DECL_NSIOBSERVER + NS_DECL_IPLUGLETENGINE + NS_DECL_NSIPLUGIN + NS_DECL_NSIFACTORY + + static PlugletEngine *_NewInstance(); + private: static int objectCount; static PRInt32 lockCount; diff --git a/mozilla/java/plugins/src/PlugletFactory.cpp b/mozilla/java/plugins/src/PlugletFactory.cpp index 8a763fe27ab..98c1ebd4747 100644 --- a/mozilla/java/plugins/src/PlugletFactory.cpp +++ b/mozilla/java/plugins/src/PlugletFactory.cpp @@ -18,8 +18,10 @@ * * Contributor(s): */ +#include "nsIServiceManager.h" + #include "PlugletFactory.h" -#include "PlugletEngine.h" +#include "iPlugletEngine.h" #include "PlugletLoader.h" #include "Pluglet.h" #include "plstr.h" @@ -37,9 +39,14 @@ nsresult PlugletFactory::CreatePluginInstance(const char* aPluginMIMEType, void || Initialize() != NS_OK) { return NS_ERROR_FAILURE; } - JNIEnv *env = PlugletEngine::GetJNIEnv(); - if(!env) { - return NS_ERROR_FAILURE; + JNIEnv *env = nsnull; + nsresult rv; + rv = plugletEngine->GetJNIEnv(&env); + + if (NS_FAILED(rv)) { + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, + ("Pluglet::Initialize: plugletEngine->GetJNIEnv failed\n")); + return rv; } jstring jstr = env->NewStringUTF(aPluginMIMEType); jobject obj = env->CallObjectMethod(jthis,createPlugletMID, jstr); @@ -59,10 +66,16 @@ nsresult PlugletFactory::CreatePluginInstance(const char* aPluginMIMEType, void nsresult PlugletFactory::Initialize(void) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("PlugletFactory::Initialize\n")); - JNIEnv *env = PlugletEngine::GetJNIEnv(); - if(!env) { - return NS_ERROR_FAILURE; + JNIEnv *env = nsnull; + nsresult rv; + rv = plugletEngine->GetJNIEnv(&env); + + if (NS_FAILED(rv)) { + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, + ("Pluglet::Initialize: plugletEngine->GetJNIEnv failed\n")); + return rv; } + if (!initializeMID) { jclass clazz = env->FindClass("org/mozilla/pluglet/PlugletFactory"); if(!clazz) { @@ -91,7 +104,12 @@ nsresult PlugletFactory::Initialize(void) { if (!jthis) { return NS_ERROR_FAILURE; } - env->CallVoidMethod(jthis,initializeMID,PlugletEngine::GetPlugletManager()); + jobject plugletEngineObj = nsnull; + rv = plugletEngine->GetPlugletManager((void **) &plugletEngineObj); + if (NS_FAILED(rv)) { + return rv; + } + env->CallVoidMethod(jthis,initializeMID,plugletEngineObj); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); return NS_ERROR_FAILURE; @@ -107,9 +125,14 @@ nsresult PlugletFactory::Shutdown(void) { if(!jthis) { return NS_ERROR_FAILURE; } - JNIEnv *env = PlugletEngine::GetJNIEnv(); - if(!env) { - return NS_ERROR_FAILURE; + JNIEnv *env = nsnull; + nsresult rv; + rv = plugletEngine->GetJNIEnv(&env); + + if (NS_FAILED(rv)) { + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, + ("Pluglet::Initialize: plugletEngine->GetJNIEnv failed\n")); + return rv; } env->CallVoidMethod(jthis,shutdownMID); if (env->ExceptionOccurred()) { @@ -129,12 +152,24 @@ nsresult PlugletFactory::GetMIMEDescription(const char* *result) { return (*result) ? NS_OK : NS_ERROR_FAILURE; } -PlugletFactory::PlugletFactory(const char *mimeDescription, const char *path) { +PlugletFactory::PlugletFactory(const char *mimeDescription, const char *path) : plugletEngine(nsnull) { jthis = NULL; this->path = new char[strlen(path)+1]; strcpy(this->path,path); this->mimeDescription = new char[strlen(mimeDescription)+1]; strcpy(this->mimeDescription,mimeDescription); + + nsIServiceManager *servman = nsnull; + NS_GetServiceManager(&servman); + nsresult rv; + rv = servman->GetServiceByContractID(PLUGLETENGINE_ContractID, + NS_GET_IID(iPlugletEngine), + getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, + ("Pluglet::PlugletFactory: Cannot access iPlugletEngine service\n")); + return; + } } @@ -145,7 +180,16 @@ PlugletFactory::~PlugletFactory(void) { if (mimeDescription != NULL) { delete[] mimeDescription; } - JNIEnv *env = PlugletEngine::GetJNIEnv(); + JNIEnv *env = nsnull; + nsresult rv; + rv = plugletEngine->GetJNIEnv(&env); + + if (NS_FAILED(rv)) { + PR_LOG(PlugletLog::log, PR_LOG_DEBUG, + ("PlugletFactory::~PlugletFactory: plugletEngine->GetJNIEnv failed\n")); + return; + } + if (env != NULL) { env->DeleteGlobalRef(jthis); } diff --git a/mozilla/java/plugins/src/PlugletFactory.h b/mozilla/java/plugins/src/PlugletFactory.h index 4e5c1577528..542e5d6d0df 100644 --- a/mozilla/java/plugins/src/PlugletFactory.h +++ b/mozilla/java/plugins/src/PlugletFactory.h @@ -21,7 +21,8 @@ #ifndef __PlugletFactory_h__ #define __PlugletFactory_h__ #include "nsplugin.h" -#include "jni.h" + +#include "iPlugletEngine.h" class PlugletFactory { public: @@ -42,6 +43,7 @@ class PlugletFactory { char *mimeDescription; char *path; PlugletFactory(const char *mimeDescription,const char * path); + nsCOMPtr plugletEngine; }; #endif /* __PlugletFactory_h__ */ diff --git a/mozilla/java/plugins/src/PlugletInputStream.cpp b/mozilla/java/plugins/src/PlugletInputStream.cpp index 2aaa2a6d401..a423550e2b2 100644 --- a/mozilla/java/plugins/src/PlugletInputStream.cpp +++ b/mozilla/java/plugins/src/PlugletInputStream.cpp @@ -18,15 +18,25 @@ * * Contributor(s): */ -#include "nsISupports.h" #include "PlugletInputStream.h" -#include "PlugletEngine.h" +#include "nsCOMPtr.h" +#include "iPlugletEngine.h" jclass PlugletInputStream::clazz = NULL; jmethodID PlugletInputStream::initMID = NULL; void PlugletInputStream::Initialize(void) { - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } + clazz = env->FindClass("org/mozilla/pluglet/mozilla/PlugletInputStream"); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); @@ -45,25 +55,45 @@ void PlugletInputStream::Initialize(void) { void PlugletInputStream::Destroy(void) { //nb who gonna cal it? - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } + if(clazz) { env->DeleteGlobalRef(clazz); } } jobject PlugletInputStream::GetJObject(const nsIInputStream *stream) { - jobject res = NULL; - JNIEnv *env = PlugletEngine::GetJNIEnv(); + jobject res = nsnull; + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return res; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return res; + } + if(!clazz) { Initialize(); if (! clazz) { - return NULL; + return nsnull; } } res = env->NewObject(clazz,initMID,(jlong)stream); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); - res = NULL; + res = nsnull; } return res; } diff --git a/mozilla/java/plugins/src/PlugletInputStream.h b/mozilla/java/plugins/src/PlugletInputStream.h index 612c6bb6df4..4c962acdaff 100644 --- a/mozilla/java/plugins/src/PlugletInputStream.h +++ b/mozilla/java/plugins/src/PlugletInputStream.h @@ -25,6 +25,7 @@ class PlugletInputStream { public: + static jobject GetJObject(const nsIInputStream *stream); private: static void Initialize(void); diff --git a/mozilla/java/plugins/src/PlugletLoader.cpp b/mozilla/java/plugins/src/PlugletLoader.cpp index c742e1d8d40..dd933135f1e 100644 --- a/mozilla/java/plugins/src/PlugletLoader.cpp +++ b/mozilla/java/plugins/src/PlugletLoader.cpp @@ -19,24 +19,25 @@ * Contributor(s): */ #include "string.h" -#include "PlugletEngine.h" +#include "iPlugletEngine.h" #include "PlugletLoader.h" #include "PlugletLog.h" +#include "nsCOMPtr.h" -jclass PlugletLoader::clazz = NULL; -jmethodID PlugletLoader::getMIMEDescriptionMID = NULL; -jmethodID PlugletLoader::getPlugletMID = NULL; +jclass PlugletLoader::clazz = nsnull; +jmethodID PlugletLoader::getMIMEDescriptionMID = nsnull; +jmethodID PlugletLoader::getPlugletMID = nsnull; //nb for debug only static char *ToString(jobject obj,JNIEnv *env) { - static jmethodID toStringID = NULL; + static jmethodID toStringID = nsnull; if (!toStringID) { jclass clazz = env->FindClass("java/lang/Object"); toStringID = env->GetMethodID(clazz,"toString","()Ljava/lang/String;"); } jstring jstr = (jstring) env->CallObjectMethod(obj,toStringID); //nb check for jni exception - const char * str = env->GetStringUTFChars(jstr,NULL); + const char * str = env->GetStringUTFChars(jstr,nsnull); //nb check for jni exception char * res = new char[strlen(str)]; strcpy(res,str); @@ -48,14 +49,24 @@ void PlugletLoader::Initialize(void) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("PlugletLoader::Initialize\n")); //nb errors handling - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } + if (!env) { return; } clazz = env->FindClass("org/mozilla/pluglet/PlugletLoader"); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); - clazz = NULL; + clazz = nsnull; return; } clazz = (jclass) env->NewGlobalRef(clazz); @@ -63,13 +74,13 @@ void PlugletLoader::Initialize(void) { getMIMEDescriptionMID = env->GetStaticMethodID(clazz,"getMIMEDescription","(Ljava/lang/String;)Ljava/lang/String;"); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); - clazz = NULL; + clazz = nsnull; return; } getPlugletMID = env->GetStaticMethodID(clazz,"getPluglet","(Ljava/lang/String;)Lorg/mozilla/pluglet/PlugletFactory;"); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); - clazz = NULL; + clazz = nsnull; return; } } @@ -77,7 +88,16 @@ void PlugletLoader::Initialize(void) { void PlugletLoader::Destroy(void) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("PlugletLoader::destroy\n")); - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } if (env) { env->DeleteGlobalRef(clazz); } @@ -89,23 +109,32 @@ char * PlugletLoader::GetMIMEDescription(const char * path) { if (!clazz) { Initialize(); if (!clazz) { - return NULL; + return nsnull; } } - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return nsnull; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return nsnull; + } jstring jpath = env->NewStringUTF(path); //nb check for null jstring mimeDescription = (jstring)env->CallStaticObjectMethod(clazz,getMIMEDescriptionMID,jpath); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); - return NULL; + return nsnull; } if (!mimeDescription) { - return NULL; + return nsnull; } - const char* str = env->GetStringUTFChars(mimeDescription,NULL); - char *res = NULL; + const char* str = env->GetStringUTFChars(mimeDescription,nsnull); + char *res = nsnull; if(str) { res = new char[strlen(str)+1]; strcpy(res,str); @@ -121,10 +150,20 @@ jobject PlugletLoader::GetPluglet(const char * path) { if (!clazz) { Initialize(); if (!clazz) { - return NULL; + return nsnull; } } - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return nsnull; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return nsnull; + } + jstring jpath = env->NewStringUTF(path); jobject jpluglet = env->CallStaticObjectMethod(clazz,getPlugletMID,jpath); //nb check for jni exc diff --git a/mozilla/java/plugins/src/PlugletManager.cpp b/mozilla/java/plugins/src/PlugletManager.cpp index edf54f5c154..27831256118 100644 --- a/mozilla/java/plugins/src/PlugletManager.cpp +++ b/mozilla/java/plugins/src/PlugletManager.cpp @@ -19,13 +19,24 @@ * Contributor(s): */ #include "PlugletManager.h" -#include "PlugletEngine.h" +#include "iPlugletEngine.h" +#include "nsCOMPtr.h" jclass PlugletManager::clazz = NULL; jmethodID PlugletManager::initMID = NULL; void PlugletManager::Initialize(void) { - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } + clazz = env->FindClass("org/mozilla/pluglet/mozilla/PlugletManagerImpl"); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); @@ -44,7 +55,17 @@ void PlugletManager::Initialize(void) { void PlugletManager::Destroy(void) { //nb who gonna cal it? - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } + if(clazz) { env->DeleteGlobalRef(clazz); } @@ -52,7 +73,17 @@ void PlugletManager::Destroy(void) { jobject PlugletManager::GetJObject(const nsIPluginManager *stream) { jobject res = NULL; - JNIEnv *env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return nsnull; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return nsnull; + } + if(!clazz) { Initialize(); if (! clazz) { diff --git a/mozilla/java/plugins/src/PlugletPeer.cpp b/mozilla/java/plugins/src/PlugletPeer.cpp index b17454238eb..1fecb3aadbe 100644 --- a/mozilla/java/plugins/src/PlugletPeer.cpp +++ b/mozilla/java/plugins/src/PlugletPeer.cpp @@ -20,17 +20,28 @@ */ #include "nsISupports.h" #include "PlugletPeer.h" -#include "PlugletEngine.h" +#include "iPlugletEngine.h" +#include "nsCOMPtr.h" -jclass PlugletPeer::clazz = NULL; -jmethodID PlugletPeer::initMID = NULL; +jclass PlugletPeer::clazz = nsnull; +jmethodID PlugletPeer::initMID = nsnull; void PlugletPeer::Initialize(void) { - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } + clazz = env->FindClass("org/mozilla/pluglet/mozilla/PlugletPeerImpl"); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); - clazz = NULL; + clazz = nsnull; return; } clazz = (jclass) env->NewGlobalRef(clazz); @@ -38,32 +49,50 @@ void PlugletPeer::Initialize(void) { if (env->ExceptionOccurred() || !initMID) { env->ExceptionDescribe(); - clazz = NULL; + clazz = nsnull; return; } } void PlugletPeer::Destroy(void) { //nb who gonna cal it? - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } if(clazz) { env->DeleteGlobalRef(clazz); } } jobject PlugletPeer::GetJObject(const nsIPluginInstancePeer *peer) { - jobject res = NULL; - JNIEnv *env = PlugletEngine::GetJNIEnv(); + jobject res = nsnull; + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return res; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return res; + } if(!clazz) { Initialize(); if (! clazz) { - return NULL; + return nsnull; } } res = env->NewObject(clazz,initMID,(jlong)peer); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); - res = NULL; + res = nsnull; } return res; } diff --git a/mozilla/java/plugins/src/PlugletStreamInfo.cpp b/mozilla/java/plugins/src/PlugletStreamInfo.cpp index 929109aec31..6ce93bd6077 100644 --- a/mozilla/java/plugins/src/PlugletStreamInfo.cpp +++ b/mozilla/java/plugins/src/PlugletStreamInfo.cpp @@ -19,49 +19,77 @@ * Contributor(s): */ #include "PlugletStreamInfo.h" -#include "PlugletEngine.h" +#include "iPlugletEngine.h" +#include "nsCOMPtr.h" -jclass PlugletStreamInfo::clazz = NULL; -jmethodID PlugletStreamInfo::initMID = NULL; +jclass PlugletStreamInfo::clazz = nsnull; +jmethodID PlugletStreamInfo::initMID = nsnull; void PlugletStreamInfo::Initialize(void) { - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } clazz = env->FindClass("org/mozilla/pluglet/mozilla/PlugletStreamInfoImpl"); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); - clazz = NULL; + clazz = nsnull; return; } clazz = (jclass) env->NewGlobalRef(clazz); initMID = env->GetMethodID(clazz,"","(J)V"); if (!initMID) { env->ExceptionDescribe(); - clazz = NULL; + clazz = nsnull; return; } } void PlugletStreamInfo::Destroy(void) { //nb who gonna call it? - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } if (clazz) { env->DeleteGlobalRef(clazz); } } jobject PlugletStreamInfo::GetJObject(const nsIPluginStreamInfo *streamInfo) { - jobject res = NULL; - JNIEnv *env = PlugletEngine::GetJNIEnv(); + jobject res = nsnull; + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return nsnull; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return nsnull; + } if(!clazz) { Initialize(); if (! clazz) { - return NULL; + return nsnull; } } res = env->NewObject(clazz,initMID,(jlong)streamInfo); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); - res = NULL; + res = nsnull; } return res; } diff --git a/mozilla/java/plugins/src/PlugletStreamListener.cpp b/mozilla/java/plugins/src/PlugletStreamListener.cpp index 31b577a1b93..25428d5d3c1 100644 --- a/mozilla/java/plugins/src/PlugletStreamListener.cpp +++ b/mozilla/java/plugins/src/PlugletStreamListener.cpp @@ -19,10 +19,11 @@ * Contributor(s): */ #include "PlugletStreamListener.h" -#include "PlugletEngine.h" +#include "iPlugletEngine.h" #include "PlugletStreamInfo.h" #include "PlugletInputStream.h" #include "PlugletLog.h" +#include "nsCOMPtr.h" jmethodID PlugletStreamListener::onStartBindingMID = NULL; jmethodID PlugletStreamListener::onDataAvailableMID = NULL; @@ -33,7 +34,16 @@ jmethodID PlugletStreamListener::getStreamTypeMID = NULL; void PlugletStreamListener::Initialize(void) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("PlugletStreamListener::Initialize\n")); - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } jclass clazz = env->FindClass("org/mozilla/pluglet/PlugletStreamListener"); onStartBindingMID = env->GetMethodID(clazz, "onStartBinding","(Lorg/mozilla/pluglet/mozilla/PlugletStreamInfo;)V"); onDataAvailableMID = env->GetMethodID(clazz,"onDataAvailable","(Lorg/mozilla/pluglet/mozilla/PlugletStreamInfo;Ljava/io/InputStream;I)V"); @@ -43,20 +53,51 @@ void PlugletStreamListener::Initialize(void) { } PlugletStreamListener::PlugletStreamListener(jobject object) { - jthis = PlugletEngine::GetJNIEnv()->NewGlobalRef(object); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } + + jthis = env->NewGlobalRef(object); if (!onStopBindingMID) { Initialize(); } } PlugletStreamListener::~PlugletStreamListener(void) { - PlugletEngine::GetJNIEnv()->DeleteGlobalRef(jthis); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } + + env->DeleteGlobalRef(jthis); } NS_METHOD PlugletStreamListener::OnStartBinding(nsIPluginStreamInfo* pluginInfo) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("PlugletStreamListener::OnStartBinding\n")); - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return rv; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return rv; + } env->CallVoidMethod(jthis,onStartBindingMID,PlugletStreamInfo::GetJObject(pluginInfo)); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); @@ -68,7 +109,17 @@ NS_METHOD PlugletStreamListener::OnStartBinding(nsIPluginStreamInfo* pluginInfo NS_METHOD PlugletStreamListener::OnDataAvailable(nsIPluginStreamInfo* pluginInfo, nsIInputStream* input, PRUint32 length) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("PlugletStreamListener::OnDataAvailable\n")); - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return rv; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return rv; + } + env->CallVoidMethod(jthis,onDataAvailableMID,PlugletStreamInfo::GetJObject(pluginInfo), PlugletInputStream::GetJObject(input),(jint)length); if (env->ExceptionOccurred()) { @@ -81,7 +132,17 @@ NS_METHOD PlugletStreamListener::OnDataAvailable(nsIPluginStreamInfo* pluginInfo NS_METHOD PlugletStreamListener::OnFileAvailable(nsIPluginStreamInfo* pluginInfo, const char* fileName) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("PlugletStreamListener::OnFileAvailable\n")); - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return rv; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return rv; + } + env->CallVoidMethod(jthis,onFileAvailableMID,PlugletStreamInfo::GetJObject(pluginInfo), env->NewStringUTF(fileName)); if (env->ExceptionOccurred()) { @@ -94,7 +155,16 @@ NS_METHOD PlugletStreamListener::OnFileAvailable(nsIPluginStreamInfo* pluginInfo NS_METHOD PlugletStreamListener::OnStopBinding(nsIPluginStreamInfo* pluginInfo, nsresult status) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("PlugletStreamListener::OnStopBinding\n")); - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return rv; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return rv; + } env->CallVoidMethod(jthis,onStopBindingMID,PlugletStreamInfo::GetJObject(pluginInfo),status); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); @@ -106,7 +176,16 @@ NS_METHOD PlugletStreamListener::OnStopBinding(nsIPluginStreamInfo* pluginInfo, NS_METHOD PlugletStreamListener::GetStreamType(nsPluginStreamType *result) { PR_LOG(PlugletLog::log, PR_LOG_DEBUG, ("PlugletStreamListener::GetStreamType\n")); - JNIEnv * env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return rv; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return rv; + } *result = (nsPluginStreamType)env->CallIntMethod(jthis,getStreamTypeMID); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); diff --git a/mozilla/java/plugins/src/PlugletViewWindows.cpp b/mozilla/java/plugins/src/PlugletViewWindows.cpp index 244fe1cd8ae..5054abfd67e 100644 --- a/mozilla/java/plugins/src/PlugletViewWindows.cpp +++ b/mozilla/java/plugins/src/PlugletViewWindows.cpp @@ -20,7 +20,8 @@ */ #include #include "PlugletViewWindows.h" -#include "PlugletEngine.h" +#include "iPlugletEngine.h" +#include "nsCOMPtr.h" jclass PlugletViewWindows::clazz = NULL; @@ -32,7 +33,17 @@ PlugletViewWindows::PlugletViewWindows() { isCreated = FALSE; } void PlugletViewWindows::Initialize() { - JNIEnv *env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } + clazz = env->FindClass("sun/awt/windows/WEmbeddedFrame"); if (!clazz) { env->ExceptionDescribe(); @@ -68,7 +79,17 @@ PRBool PlugletViewWindows::SetWindow(nsPluginWindow* window) { return PR_FALSE; } } - JNIEnv *env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return PR_FALSE; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return PR_FALSE; + } + frame = env->NewObject(clazz,initMID,(jint)window->window); if (!frame) { env->ExceptionDescribe(); diff --git a/mozilla/java/plugins/src/PlugletsDir.cpp b/mozilla/java/plugins/src/PlugletsDir.cpp index e70f02b2605..d506118c77f 100644 --- a/mozilla/java/plugins/src/PlugletsDir.cpp +++ b/mozilla/java/plugins/src/PlugletsDir.cpp @@ -42,7 +42,6 @@ void PlugletsDir::LoadPluglets() { if (!list) { list = new List(); char * path = PR_GetEnv("PLUGLET"); - char defpath[2000]; if (!path) { nsSpecialSystemDirectory sysdir(nsSpecialSystemDirectory::OS_CurrentProcessDirectory); sysdir += "plugins"; diff --git a/mozilla/java/plugins/src/Registry.cpp b/mozilla/java/plugins/src/Registry.cpp index 0914a5a6c45..e8633a9a8dc 100644 --- a/mozilla/java/plugins/src/Registry.cpp +++ b/mozilla/java/plugins/src/Registry.cpp @@ -19,8 +19,9 @@ * Contributor(s): */ -#include "PlugletEngine.h" +#include "iPlugletEngine.h" #include "Registry.h" +#include "nsCOMPtr.h" jclass Registry::clazz = NULL; jmethodID Registry::setPeerMID = NULL; @@ -33,7 +34,17 @@ void Registry::SetPeer(jobject key, jlong peer) { return; } } - JNIEnv *env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } + env->CallStaticVoidMethod(clazz,setPeerMID,key,peer); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); @@ -48,7 +59,17 @@ void Registry::Remove(jobject key) { return; } } - JNIEnv *env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } + env->CallStaticVoidMethod(clazz,removeMID,key); if (env->ExceptionOccurred()) { env->ExceptionDescribe(); @@ -57,7 +78,17 @@ void Registry::Remove(jobject key) { } void Registry::Initialize() { - JNIEnv *env = PlugletEngine::GetJNIEnv(); + nsCOMPtr plugletEngine; + nsresult rv = iPlugletEngine::GetInstance(getter_AddRefs(plugletEngine)); + if (NS_FAILED(rv)) { + return; + } + JNIEnv *env = nsnull; + rv = plugletEngine->GetJNIEnv(&env); + if (NS_FAILED(rv)) { + return; + } + if(!env) { return; } diff --git a/mozilla/java/plugins/src/iPlugletEngine.idl b/mozilla/java/plugins/src/iPlugletEngine.idl new file mode 100644 index 00000000000..ecccf60049e --- /dev/null +++ b/mozilla/java/plugins/src/iPlugletEngine.idl @@ -0,0 +1,43 @@ +#include "nsISupports.idl" + +%{C++ +#ifndef JNI_H +#include "jni.h" +#endif + +#define PLUGLETENGINE_CID \ +{ /* C1E694F3-9BE1-11d3-837C-0004AC56C49E */ \ + 0xc1e694f3, \ + 0x9be1, \ + 0x11d3, \ + { 0x83, 0x7c, 0x0, 0x4, 0xac, 0x56, 0xc4, 0x9e } \ +} + +#define PLUGLETENGINE_ContractID \ + "@mozilla.org/blackwood/pluglet-engine;1" + +%} + +native JNIEnv(JNIEnv *); + +[scriptable, uuid(89fc201d-c83e-45bb-ab88-0d3776869373)] +interface iPlugletEngine : nsISupports +{ + +%{C++ + // NS_DEFINE_STATIC_IID_ACCESSOR(NS_IJVMMANAGER_IID) + NS_DEFINE_STATIC_CID_ACCESSOR(PLUGLETENGINE_CID) +%} + + [noscript] void getJNIEnv(out JNIEnv outEnv); + [noscript] void getPlugletManager(out voidPtr jobj); + void getEngine(out iPlugletEngine engine); + void incObjectCount(); + void decObjectCount(); + readonly attribute boolean unloadable; +%{C++ + + static NS_EXPORT nsresult GetInstance(iPlugletEngine* *result); + +%} +}; diff --git a/mozilla/java/plugins/src/iPlugletManager.idl b/mozilla/java/plugins/src/iPlugletManager.idl new file mode 100644 index 00000000000..1e3548588f0 --- /dev/null +++ b/mozilla/java/plugins/src/iPlugletManager.idl @@ -0,0 +1,17 @@ +#include "nsISupports.idl" + +%{C++ +#ifndef JNI_H +#include "jni.h" +#endif + +%} + +interface nsIPluginManager; + +[scriptable, uuid(b57bffe6-d9b5-4756-b698-4ea170ec4333)] +interface iPlugletManager : nsISupports +{ + [noscript] void getJObject(in nsIPluginManager instancePeer, + out voidPtr outEnv); +};