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;
}
Пример #2
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();
}
Пример #5
0
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;
}
Пример #6
0
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;
}
Пример #8
0
/* 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;
}
Пример #9
0
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;
}