nsresult JavaToXPTCStubMap::Find(jint aJavaObjectHashCode, const nsIID& aIID, nsJavaXPTCStub** aResult) { NS_PRECONDITION(aResult != nsnull, "null ptr"); if (!aResult) return NS_ERROR_FAILURE; nsAutoLock lock(gJavaXPCOMLock); *aResult = nsnull; Entry* e = static_cast<Entry*> (PL_DHashTableOperate(mHashTable, NS_INT32_TO_PTR(aJavaObjectHashCode), PL_DHASH_LOOKUP)); if (PL_DHASH_ENTRY_IS_FREE(e)) return NS_OK; nsresult rv = e->xptcstub->QueryInterface(aIID, (void**) aResult); #ifdef DEBUG_JAVAXPCOM if (NS_SUCCEEDED(rv)) { char* iid_str = aIID.ToString(); LOG(("< JavaToXPTCStubMap (Java=%08x | XPCOM=%08x | IID=%s)\n", (PRUint32) aJavaObjectHashCode, (PRUint32) *aResult, iid_str)); PR_Free(iid_str); } #endif // NS_NOINTERFACE is not an error condition if (rv == NS_NOINTERFACE) rv = NS_OK; return rv; }
nsresult NativeToJavaProxyMap::Add(JNIEnv* env, nsISupports* aXPCOMObject, const nsIID& aIID, jobject aProxy) { nsAutoLock lock(gJavaXPCOMLock); Entry* e = static_cast<Entry*>(PL_DHashTableOperate(mHashTable, aXPCOMObject, PL_DHASH_ADD)); if (!e) return NS_ERROR_FAILURE; jobject ref = nsnull; jobject weakRefObj = env->NewObject(weakReferenceClass, weakReferenceConstructorMID, aProxy); if (weakRefObj) ref = env->NewGlobalRef(weakRefObj); if (!ref) return NS_ERROR_OUT_OF_MEMORY; // Add Java proxy weak reference ref to start of list ProxyList* item = new ProxyList(ref, aIID, e->list); e->key = aXPCOMObject; e->list = item; #ifdef DEBUG_JAVAXPCOM char* iid_str = aIID.ToString(); LOG(("+ NativeToJavaProxyMap (Java=%08x | XPCOM=%08x | IID=%s)\n", (PRUint32) env->CallStaticIntMethod(systemClass, hashCodeMID, aProxy), (PRUint32) aXPCOMObject, iid_str)); NS_Free(iid_str); #endif return NS_OK; }
/* void testISupports2 ([iid_is (iid)] in ITestErlXPCOMComponent obj, in nsIIDRef iid); */ NS_IMETHODIMP TestErlXPCOMComponent::TestISupportsIID(ITestErlXPCOMComponent *obj, const nsIID & iid) { char *iidstr = iid.ToString(); std::cout << "Hola desde TestErlXPCOMComponent::TestISupports2("<< iidstr <<")\n"; PR_Free(iidstr); return NS_OK; }
nsresult NativeToJavaProxyMap::Remove(JNIEnv* env, nsISupports* aNativeObject, const nsIID& aIID) { // This is only called from finalizeProxy(), which already holds the lock. // nsAutoLock lock(gJavaXPCOMLock); Entry* e = static_cast<Entry*>(PL_DHashTableOperate(mHashTable, aNativeObject, PL_DHASH_LOOKUP)); if (PL_DHASH_ENTRY_IS_FREE(e)) { NS_WARNING("XPCOM object not found in hash table"); return NS_ERROR_FAILURE; } ProxyList* item = e->list; ProxyList* last = e->list; while (item != nsnull) { if (item->iid.Equals(aIID)) { #ifdef DEBUG_JAVAXPCOM char* iid_str = aIID.ToString(); LOG(("- NativeToJavaProxyMap (Java=%08x | XPCOM=%08x | IID=%s)\n", (PRUint32) env->CallStaticIntMethod(systemClass, hashCodeMID, item->javaObject), (PRUint32) aNativeObject, iid_str)); NS_Free(iid_str); #endif env->CallVoidMethod(item->javaObject, clearReferentMID); env->DeleteGlobalRef(item->javaObject); if (item == e->list) { e->list = item->next; if (e->list == nsnull) PL_DHashTableOperate(mHashTable, aNativeObject, PL_DHASH_REMOVE); } else { last->next = item->next; } delete item; return NS_OK; } last = item; item = item->next; } NS_WARNING("Java proxy matching given IID not found"); return NS_ERROR_FAILURE; }
nsresult NativeToJavaProxyMap::Find(JNIEnv* env, nsISupports* aNativeObject, const nsIID& aIID, jobject* aResult) { NS_PRECONDITION(aResult != nsnull, "null ptr"); if (!aResult) return NS_ERROR_FAILURE; nsAutoLock lock(gJavaXPCOMLock); *aResult = nsnull; Entry* e = static_cast<Entry*>(PL_DHashTableOperate(mHashTable, aNativeObject, PL_DHASH_LOOKUP)); if (PL_DHASH_ENTRY_IS_FREE(e)) return NS_OK; ProxyList* item = e->list; while (item != nsnull && *aResult == nsnull) { if (item->iid.Equals(aIID)) { jobject referentObj = env->CallObjectMethod(item->javaObject, getReferentMID); if (!env->IsSameObject(referentObj, NULL)) { *aResult = referentObj; #ifdef DEBUG_JAVAXPCOM char* iid_str = aIID.ToString(); LOG(("< NativeToJavaProxyMap (Java=%08x | XPCOM=%08x | IID=%s)\n", (PRUint32) env->CallStaticIntMethod(systemClass, hashCodeMID, *aResult), (PRUint32) aNativeObject, iid_str)); NS_Free(iid_str); #endif } } item = item->next; } return NS_OK; }