nsJavaObjectInfo::nsJavaObjectInfo(nsISupports* instance) { NS_INIT_ISUPPORTS(); m_argc = 0; m_size = 5; m_step = 3; m_keys = (char**) malloc(m_size*sizeof(char*)); m_vals = (char**) malloc(m_size*sizeof(char*)); m_docbase = NULL; m_instance = instance; // backward compatibility with plugin API - fix when new API will appear if (NS_FAILED(m_instance->QueryInterface(kIWFInstanceWrapperIID, (void**)&m_jpiwrapper))) OJI_LOG("FAILED to get nsIWFInstanceWrapper"); nsIPluginInstance* plugin = nsnull; if (NS_FAILED(m_instance->QueryInterface(kIPluginInstanceIID, (void**)&plugin))) OJI_LOG("FAILED to get nsIPluginInstance"); /* member initializers and constructor code */ m_wrapper = (JavaObjectWrapper*) malloc(sizeof(JavaObjectWrapper)); m_wrapper->info = (void*)this; m_wrapper->plugin = (void*)plugin; m_wrapper->GetParameters = &::GetParameters; m_wrapper->ShowDocument = &::ShowDocument; m_wrapper->ShowStatus = &::ShowStatus; m_wrapper->GetJSThread = &::GetJSThread; m_wrapper->dead = 0; }
NS_IMETHODIMP nsPluggableJVM::StartupJVM(const char *classPath, nsPluggableJVMStatus *status, jlong sup) { JavaVMInitArgs vm_args; jint res; OJI_LOG("nsPluggableJVM::StartupJVM"); *status = nsPluggableJVMStatus_Failed; if (sup == nsnull) return NS_ERROR_FAILURE; const char* plugin_home = getenv("WFHOME"); if (plugin_home == NULL) { OJI_LOG("Env variable JAVA_PLUGIN_HOME not set"); return NS_ERROR_FAILURE; } if (NS_FAILED(loadPluginDLL(plugin_home))) return NS_ERROR_FAILURE; memset(&vm_args, 0, sizeof(vm_args)); vm_args.version = JNI_VERSION_1_2; // XXX: add classpath here if (NS_FAILED(initJVM(&m_ctx, &vm_args))) return NS_ERROR_FAILURE; // initialize capability mechanism JVMP_SecurityCap cap; JVMP_FORBID_ALL_CAPS(cap); JVMP_ALLOW_CAP(cap, JVMP_CAP_SYS_SYSTEM); JVMP_ALLOW_CAP(cap, JVMP_CAP_SYS_SYSEVENT) JVMP_ALLOW_CAP(cap, JVMP_CAP_SYS_EVENT); JVMP_ALLOW_CAP(cap, JVMP_CAP_SYS_CALL); jbyte** prins; jint pnum = 2; jint* plen; if (!newPrincipalsFromStrings(&prins, &plen, pnum, "CAPS", "MOZILLA")) return JNI_FALSE; if ((m_jvmp_context->JVMP_EnableCapabilities) (m_ctx, &cap, pnum, plen, prins) != JNI_TRUE) { OJI_LOG("Can\'t enable caps"); return JNI_FALSE; }; deletePrincipals(prins, plen, pnum); SetConsoleVisibility(PR_TRUE); char* ext_dll = PR_GetLibraryName(plugin_home, LIBEXT); OJI_LOG2("JVMP_RegisterExtension: %s", ext_dll); res = (m_jvmp_context->JVMP_RegisterExtension)(m_ctx, ext_dll, &m_extID, sup); PR_Free(ext_dll); if (res != JNI_TRUE || m_extID == 0) return NS_ERROR_FAILURE; OJI_LOG("JVMP_RegisterExtension OK"); *status = nsPluggableJVMStatus_Running; return NS_OK; }
// XXX: for now, this code can leak window descriptors, // as not unregisters old window, if new one has come // with another native handle. // SetWindow() with size changing hopefully works well NS_IMETHODIMP nsAppletHTMLObject::SetWindow(nsPluginWindow* window) { OJI_LOG2("nsAppletHTMLObject::SetWindow(%p)", window != nsnull ? (void*)window->window : 0x0); nsresult res = NS_OK; if (m_jvm == NULL) { OJI_LOG("m_jvm is NULL"); return NS_ERROR_FAILURE; } if (window != NULL) { jint new_id; res = m_jvm->RegisterWindow(window, &new_id); if (NS_FAILED(res)) return res; //if (m_id != 0 && new_id != m_id) m_jvm->UnregisterWindow(m_id); m_id = new_id; } else { if (m_id != 0) m_jvm->UnregisterWindow(m_id); m_id = 0; } return m_jobject->SetWindow(m_id); }
NS_IMETHODIMP nsAppletHTMLObject::Start(void) { OJI_LOG("nsAppletHTMLObject::Start"); m_dead = PR_FALSE; return m_jobject->Start(); }
nsresult nsPluggableJVM::initJVM(JVMP_CallingContext* *penv, JavaVMInitArgs* vm_args) { jint res = (m_jvmp_context->JVMP_GetRunningJVM)(penv, vm_args, JNI_TRUE); if (res == JNI_TRUE) { OJI_LOG("OK GOT JVM!!!!"); return NS_OK; } else { OJI_LOG("BAD - NO JVM!!!!"); return NS_ERROR_FAILURE; } return NS_OK; }
nsPluggableJVM::~nsPluggableJVM() { OJI_LOG("nsPluggableJVM::~nsPluggableJVM"); if (m_jvmp_context) { if (m_ctx != nsnull && m_extID != 0) (m_jvmp_context->JVMP_UnregisterExtension)(m_ctx, m_extID); } }
NS_IMETHODIMP nsAppletHTMLObject::Stop(void) { OJI_LOG("nsAppletHTMLObject::Stop"); if (m_jobject) m_jobject->Stop(); if (m_id && m_jvm) m_jvm->UnregisterWindow(m_id); m_id = 0; m_dead = PR_TRUE; return NS_OK; }
/* void UnregisterWindow (in jp_jint ID); */ NS_IMETHODIMP nsPluggableJVM::UnregisterWindow(jint ID) { if ((m_jvmp_context->JVMP_UnregisterWindow)(m_ctx, ID) != JNI_TRUE) { OJI_LOG("can\'t unregister window"); return NS_ERROR_FAILURE; }; return NS_OK; }
NS_IMETHODIMP nsPluggableJVM::RegisterWindow(nsPluginWindow* rwin, jint *ID) { JVMP_DrawingSurfaceInfo w; OJI_LOG("nsPluggableJVM::RegisterWindow"); w.window = (JPluginWindow *)rwin->window; w.x = rwin->x; w.y = rwin->y; w.width = rwin->width; w.height = rwin->height; if ((m_jvmp_context->JVMP_RegisterWindow)(m_ctx, &w, ID) != JNI_TRUE) { OJI_LOG("can\'t register window"); return NS_ERROR_FAILURE; }; OJI_LOG2("Registed our native window with ID %ld", *ID); return NS_OK; }
NS_IMETHODIMP nsAppletHTMLObject::Destroy(void) { OJI_LOG("nsAppletHTMLObject::Destroy"); m_dead = PR_TRUE; if (m_jobject) { m_jobject->Destroy(); NS_RELEASE(m_jobject); } if (m_peer) NS_RELEASE(m_peer); if (m_peer2) NS_RELEASE(m_peer2); if (m_jvm) NS_RELEASE(m_jvm); //OJI_LOG2("mRefCnt=%d",mRefCnt); return NS_OK; }
nsJavaObjectInfo::~nsJavaObjectInfo() { OJI_LOG("nsJavaObjectInfo::~nsJavaObjectInfo"); for (PRUint32 i=0; i < m_argc; i++) { if (m_keys[i]) free(m_keys[i]); if (m_vals[i]) free(m_vals[i]); } free(m_keys); free(m_vals); if (m_jpiwrapper) NS_RELEASE(m_jpiwrapper); WrapperRelease(m_wrapper); // if m_wrapper is hold by someone else, like Java native method // set field in wrapper that it cannot be used anymore and should be released //m_wrapper->dead = 1; //m_wrapper->Release(m_wrapper); }
NS_IMETHODIMP nsAppletHTMLObject::Initialize(nsIPluginInstancePeer *peer) { nsresult res; OJI_LOG("nsAppletHTMLObject::Initialize"); m_peer = peer; NS_ADDREF(m_peer); peer->QueryInterface(kIPluginInstancePeer2IID, (void **)&m_peer2); m_jobject = new nsJavaHTMLObject(m_factory); NS_ADDREF(m_jobject); res = nsServiceManager::GetService(kPluginManagerCID, kIPluginManagerIID, getter_AddRefs(m_mgr)); if (NS_FAILED(res)) return res; m_id = 0; if (NS_FAILED(res = m_factory->GetJVM(&m_jvm))) return res; if (NS_FAILED(res = m_jvm->GetJNIEnv(&m_env))) return res; if (NS_FAILED(res = m_jobject->Initialize(peer, m_jvm))) return res; // find out applet information from our peer and explain it // to nsJavaHTMLObject // in new API nsJavaHTMLObject should get everything needed // from peer nsJavaObjectInfo* info = new nsJavaObjectInfo((nsIWFInstanceWrapper*)this); NS_ADDREF(info); nsIPluginTagInfo *tagInfo; if (NS_SUCCEEDED(res = peer->QueryInterface(kIPluginTagInfoIID, (void **)&tagInfo))) { PRUint16 argc = 0, i; char **keys, **vals; tagInfo->GetAttributes(argc, (const char* const* &)keys, (const char* const* &) vals); for (i=0; i<argc; i++) info->AddParameter(keys[i], vals[i]); NS_RELEASE(tagInfo); } nsIPluginTagInfo2 *extTagInfo; if (NS_SUCCEEDED(res = peer->QueryInterface(kIPluginTagInfo2IID, (void **)&extTagInfo))) { nsPluginTagType tagType = nsPluginTagType_Unknown; if (NS_SUCCEEDED(extTagInfo->GetTagType(&tagType))) { if (tagType == nsPluginTagType_Applet || tagType == nsPluginTagType_Object) { PRUint16 argc = 0, i; char **keys, **vals; extTagInfo->GetParameters(argc, (const char*const*&)keys, (const char*const*&) vals); for (i=0; i<argc; i++) info->AddParameter(keys[i], vals[i]); } nsJavaObjectType type = mapType(tagType); info->SetType(type); if (NS_FAILED(res = m_jobject->SetType(type))) return res; } const char *docbase = NULL; if (NS_FAILED(res = extTagInfo->GetDocumentBase(&docbase))) { OJI_LOG("Failed to obtain doc base"); } if (docbase != NULL) { char *slash = strrchr((char*)docbase, '/'); if (slash != NULL) *(slash+1) = 0; OJI_LOG2("real docbase is %s", docbase); info->SetDocBase(docbase); } NS_RELEASE(extTagInfo); } // really it's crucial to call SetType() _before_ passing Java object info // otherwise parameters will be passed to wrapper - and silently ignored res = m_jobject->SetJavaObjectInfo(info); NS_RELEASE(info); return res; }
nsAppletHTMLObject::~nsAppletHTMLObject(void) { OJI_LOG("nsAppletHTMLObject::~nsAppletHTMLObject"); if (m_factory) NS_RELEASE(m_factory); }
NS_IMETHODIMP nsAppletHTMLObject::HandleEvent(nsPluginEvent* event, PRBool* handled) { OJI_LOG("nsAppletHTMLObject::HandleEvent"); return NS_ERROR_NOT_IMPLEMENTED; }
NS_IMETHODIMP nsAppletHTMLObject::Print(nsPluginPrint* platformPrint) { OJI_LOG("nsAppletHTMLObject::Print"); return NS_ERROR_NOT_IMPLEMENTED; }
NS_IMETHODIMP nsAppletHTMLObject::NewStream(nsIPluginStreamListener** listener) { OJI_LOG("nsAppletHTMLObject::NewStream"); return NS_ERROR_NOT_IMPLEMENTED; }
nsWFSecureEnv::~nsWFSecureEnv(void) { OJI_LOG("nsWFSecureEnv::~nsWFSecureEnv"); NS_RELEASE(m_jvm); }
NS_IMETHODIMP nsAppletHTMLObject::GetText(const char* *result) { OJI_LOG("nsAppletHTMLObject::GetText"); return NS_OK; }