/* * Class: org_coolreader_crengine_ReaderView * Method: swapToCacheInternal * Signature: ()I */ JNIEXPORT jint JNICALL Java_org_coolreader_crengine_ReaderView_swapToCacheInternal (JNIEnv * _env, jobject _this) { CRJNIEnv env(_env); ReaderViewNative * p = getNative(_env, _this); CRTimerUtil timeout(60000); // 1 minute, can be cancelled by Engine.suspendContinuousOperationInternal() _timeoutControl = timeout; return p->_docview->updateCache(_timeoutControl); }
/* * Class: org_coolreader_crengine_ReaderView * Method: goLinkInternal * Signature: (Ljava/lang/String;)I */ JNIEXPORT jint JNICALL Java_org_coolreader_crengine_ReaderView_goLinkInternal (JNIEnv * _env, jobject _this, jstring _link) { CRJNIEnv env(_env); ReaderViewNative * p = getNative(_env, _this); lString16 link = env.fromJavaString(_link); bool res = p->_docview->goLink( link, true ); return res ? 1 : 0; }
/* * Class: org_coolreader_crengine_ReaderView * Method: resize * Signature: (II)V */ JNIEXPORT void JNICALL Java_org_coolreader_crengine_ReaderView_resizeInternal (JNIEnv * _env, jobject _this, jint dx, jint dy) { CRJNIEnv env(_env); CRLog::debug("resizeInternal(%d, %d) is called", dx, dy); ReaderViewNative * p = getNative(_env, _this); DocViewCallback callback( _env, p->_docview, _this ); p->_docview->Resize(dx, dy); CRLog::trace("resizeInternal() is finished"); }
static nsresult getNativeFromWrapper(XPCWrappedNative *wrapper, const nsIID &iid, void **ppThis, nsISupports **pThisRef, jsval *vp) { return getNative(wrapper->GetIdentityObject(), wrapper->GetOffsets(), wrapper->GetFlatJSObject(), iid, ppThis, pThisRef, vp); }
/* * Class: org_coolreader_crengine_ReaderView * Method: loadDocument * Signature: (Ljava/lang/String;)Z */ JNIEXPORT jboolean JNICALL Java_org_coolreader_crengine_ReaderView_loadDocumentInternal (JNIEnv * _env, jobject _this, jstring s) { CRJNIEnv env(_env); ReaderViewNative * p = getNative(_env, _this); DocViewCallback callback( _env, p->_docview, _this ); lString16 str = env.fromJavaString(s); bool res = p->loadDocument(str); return res ? JNI_TRUE : JNI_FALSE; }
/* * Class: org_coolreader_crengine_ReaderView * Method: doCommandInternal * Signature: (II)Z */ JNIEXPORT jboolean JNICALL Java_org_coolreader_crengine_ReaderView_doCommandInternal (JNIEnv * _env, jobject _this, jint cmd, jint param) { ReaderViewNative * p = getNative(_env, _this); DocViewCallback callback( _env, p->_docview, _this ); if ( cmd>=READERVIEW_DCMD_START && cmd<=READERVIEW_DCMD_END) { return p->doCommand(cmd, param)?JNI_TRUE:JNI_FALSE; } //CRLog::trace("doCommandInternal(%d, %d) -- passing to LVDocView", cmd, param); return p->_docview->doCommand((LVDocCmd)cmd, param) ? JNI_TRUE : JNI_FALSE; }
/* * Class: org_coolreader_crengine_ReaderView * Method: getTOCInternal * Signature: ()Lorg/coolreader/crengine/TOCItem; */ JNIEXPORT jobject JNICALL Java_org_coolreader_crengine_ReaderView_getTOCInternal (JNIEnv * _env, jobject _this) { CRJNIEnv env(_env); ReaderViewNative * p = getNative(_env, _this); if ( !p->_docview->isDocumentOpened() ) return NULL; DocViewCallback callback( _env, p->_docview, _this ); LVTocItem * toc = p->_docview->getToc(); return env.toJavaTOCItem(toc); }
/* * Class: org_coolreader_crengine_ReaderView * Method: updateSelectionInternal * Signature: (Lorg/coolreader/crengine/Selection;)V */ JNIEXPORT void JNICALL Java_org_coolreader_crengine_ReaderView_updateSelectionInternal (JNIEnv * _env, jobject _this, jobject _sel) { CRJNIEnv env(_env); ReaderViewNative * p = getNative(_env, _this); CRObjectAccessor sel(_env, _sel); CRStringField sel_startPos(sel, "startPos"); CRStringField sel_endPos(sel, "endPos"); CRStringField sel_text(sel, "text"); CRStringField sel_chapter(sel, "chapter"); CRIntField sel_startX(sel, "startX"); CRIntField sel_startY(sel, "startY"); CRIntField sel_endX(sel, "endX"); CRIntField sel_endY(sel, "endY"); CRIntField sel_percent(sel, "percent"); lvPoint startpt ( sel_startX.get(), sel_startY.get() ); lvPoint endpt ( sel_endX.get(), sel_endY.get() ); ldomXPointer startp = p->_docview->getNodeByPoint( startpt ); ldomXPointer endp = p->_docview->getNodeByPoint( endpt ); if ( !startp.isNull() && !endp.isNull() ) { ldomXRange r( startp, endp ); if ( r.getStart().isNull() || r.getEnd().isNull() ) return; r.sort(); if ( !r.getStart().isVisibleWordStart() ) r.getStart().prevVisibleWordStart(); //lString16 start = r.getStart().toString(); if ( !r.getEnd().isVisibleWordEnd() ) r.getEnd().nextVisibleWordEnd(); if ( r.isNull() ) return; //lString16 end = r.getEnd().toString(); //CRLog::debug("Range: %s - %s", UnicodeToUtf8(start).c_str(), UnicodeToUtf8(end).c_str()); r.setFlags(1); p->_docview->selectRange( r ); int page = p->_docview->getBookmarkPage(startp); int pages = p->_docview->getPageCount(); lString16 titleText; lString16 posText; p->_docview->getBookmarkPosText(startp, titleText, posText); int percent = 0; if ( pages>1 ) percent = 10000 * page/(pages-1); lString16 selText = r.getRangeText( '\n', 8192 ); sel_percent.set(percent); sel_startPos.set( startp.toString() ); sel_endPos.set( endp.toString() ); sel_text.set(selText); sel_chapter.set(titleText); } }
/* * Class: org_coolreader_crengine_ReaderView * Method: checkLinkInternal * Signature: (III)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_coolreader_crengine_ReaderView_checkLinkInternal (JNIEnv * _env, jobject _this, jint x, jint y, jint delta) { CRJNIEnv env(_env); ReaderViewNative * p = getNative(_env, _this); lString16 link; for ( int r=0; r<=delta; r+=5 ) { link = p->getLink(x, y, r); if ( !link.empty() ) return env.toJavaString(link); } return NULL; }
// getproperty handling JSBool JSSphere::getPropertySwitch(unsigned long theID, JSContext *cx, JSObject *obj, jsval id, jsval *vp) { switch (theID) { case PROP_center: *vp = as_jsval(cx, getNative().center); return JS_TRUE; case PROP_radius: *vp = as_jsval(cx, getNative().radius); return JS_TRUE; case PROP_hasPosition: *vp = as_jsval(cx, getNative().hasPosition()); return JS_TRUE; case PROP_hasSize: *vp = as_jsval(cx, getNative().hasSize()); return JS_TRUE; case PROP_hasArea: *vp = as_jsval(cx, getNative().hasArea()); return JS_TRUE; case PROP_hasVolume: *vp = as_jsval(cx, getNative().hasVolume()); return JS_TRUE; case PROP_isEmpty: *vp = as_jsval(cx, getNative().isEmpty()); return JS_TRUE; case PROP_size: *vp = as_jsval(cx, getNative().getSize()); return JS_TRUE; case PROP_volume: *vp = as_jsval(cx, getNative().getVolume()); return JS_TRUE; case PROP_area: *vp = as_jsval(cx, getNative().getArea()); return JS_TRUE; default: JS_ReportError(cx,"JSSphere::getProperty: index %d out of range", theID); return JS_FALSE; } };
/* * Class: org_coolreader_crengine_ReaderView * Method: destroyInternal * Signature: ()V */ JNIEXPORT void JNICALL Java_org_coolreader_crengine_ReaderView_destroyInternal (JNIEnv * env, jobject view) { ReaderViewNative * p = getNative(env, view); if ( p!=NULL ) { CRLog::info("Destroying RenderView"); delete p; jclass rvClass = env->FindClass("org/coolreader/crengine/ReaderView"); gNativeObjectID = env->GetFieldID(rvClass, "mNativeObject", "I"); env->SetIntField(view, gNativeObjectID, 0); } else { CRLog::error("RenderView is already destroyed"); } }
/* * Class: org_coolreader_crengine_ReaderView * Method: setPageBackgroundTextureInternal * Signature: ([BI)V */ JNIEXPORT void JNICALL Java_org_coolreader_crengine_ReaderView_setPageBackgroundTextureInternal (JNIEnv * _env, jobject _this, jbyteArray jdata, jint tileFlags ) { CRJNIEnv env(_env); ReaderViewNative * p = getNative(_env, _this); LVImageSourceRef img; if ( jdata!=NULL ) { LVStreamRef stream = env.jbyteArrayToStream( jdata ); if ( !stream.isNull() ) { img = LVCreateStreamImageSource(stream); } } p->_docview->setBackgroundImage(img, tileFlags!=0); }
/* * Class: org_coolreader_crengine_ReaderView * Method: updateBookInfoInternal * Signature: (Lorg/coolreader/crengine/BookInfo;)V */ JNIEXPORT void JNICALL Java_org_coolreader_crengine_ReaderView_updateBookInfoInternal (JNIEnv * _env, jobject _this, jobject _info) { CRJNIEnv env(_env); ReaderViewNative * p = getNative(_env, _this); if ( !p->_docview->isDocumentOpened() ) return; DocViewCallback callback( _env, p->_docview, _this ); CRObjectAccessor bookinfo(_env, _info); CRObjectAccessor fileinfo(_env, CRFieldAccessor(bookinfo, "fileInfo", "Lorg/coolreader/crengine/FileInfo;").getObject() ); CRStringField(fileinfo,"title").set(p->_docview->getTitle()); CRStringField(fileinfo,"authors").set(p->_docview->getAuthors()); CRStringField(fileinfo,"series").set(p->_docview->getSeries()); }
/* * Class: org_coolreader_crengine_ReaderView * Method: moveSelectionInternal * Signature: (Lorg/coolreader/crengine/Selection;II)Z */ JNIEXPORT jboolean JNICALL Java_org_coolreader_crengine_ReaderView_moveSelectionInternal (JNIEnv * _env, jobject _this, jobject _sel, jint _cmd, jint _param) { CRJNIEnv env(_env); ReaderViewNative * p = getNative(_env, _this); CRObjectAccessor sel(_env, _sel); CRStringField sel_startPos(sel, "startPos"); CRStringField sel_endPos(sel, "endPos"); CRStringField sel_text(sel, "text"); CRStringField sel_chapter(sel, "chapter"); CRIntField sel_startX(sel, "startX"); CRIntField sel_startY(sel, "startY"); CRIntField sel_endX(sel, "endX"); CRIntField sel_endY(sel, "endY"); CRIntField sel_percent(sel, "percent"); int res = p->_docview->doCommand( (LVDocCmd)_cmd, (int)_param ); if ( res ) { ldomXRangeList & sel = p->_docview->getDocument()->getSelections(); if ( sel.length()>0 ) { ldomXRange currSel; currSel = *sel[0]; if ( !currSel.isNull() ) { sel_startPos.set( currSel.getStart().toString() ); sel_endPos.set( currSel.getEnd().toString() ); lvPoint startpt ( currSel.getStart().toPoint() ); lvPoint endpt ( currSel.getEnd().toPoint() ); sel_startX.set( startpt.x ); sel_startY.set( startpt.y ); sel_endX.set( endpt.x ); sel_endY.set( endpt.y ); int page = p->_docview->getBookmarkPage(currSel.getStart()); int pages = p->_docview->getPageCount(); lString16 titleText; lString16 posText; p->_docview->getBookmarkPosText(currSel.getStart(), titleText, posText); int percent = 0; if ( pages>1 ) percent = 10000 * page/(pages-1); lString16 selText = currSel.getRangeText( '\n', 8192 ); sel_percent.set(percent); sel_text.set(selText); sel_chapter.set(titleText); return JNI_TRUE; } } } return JNI_FALSE; }
/* * Class: org_coolreader_crengine_ReaderView * Method: getCoverPageDataInternal * Signature: ()[B */ JNIEXPORT jbyteArray JNICALL Java_org_coolreader_crengine_ReaderView_getCoverPageDataInternal (JNIEnv * _env, jobject _this) { CRJNIEnv env(_env); ReaderViewNative * p = getNative(_env, _this); // CRLog::trace("getCoverPageDataInternal() : requesting cover image stream"); LVStreamRef stream = p->_docview->getCoverPageImageStream(); // CRLog::trace("getCoverPageDataInternal() : converting stream to byte array"); jbyteArray array = env.streamToJByteArray(stream); if ( array!=NULL ) CRLog::debug("getCoverPageDataInternal() : returned cover page array"); else CRLog::debug("getCoverPageDataInternal() : cover page data not found"); return array; }
/* * Class: org_coolreader_crengine_ReaderView * Method: goToPositionInternal * Signature: (Ljava/lang/String;)Z */ JNIEXPORT jboolean JNICALL Java_org_coolreader_crengine_ReaderView_goToPositionInternal (JNIEnv * _env, jobject _this, jstring jstr) { CRJNIEnv env(_env); ReaderViewNative * p = getNative(_env, _this); if ( !p->_docview->isDocumentOpened() ) return JNI_FALSE; DocViewCallback callback( _env, p->_docview, _this ); lString16 str = env.fromJavaString(jstr); ldomXPointer bm = p->_docview->getDocument()->createXPointer(str); if ( bm.isNull() ) return JNI_FALSE; p->_docview->goToBookmark(bm); return JNI_TRUE; }
/* * Class: org_coolreader_crengine_ReaderView * Method: getCurrentPageBookmarkInternal * Signature: ()Lorg/coolreader/crengine/Bookmark; */ JNIEXPORT jobject JNICALL Java_org_coolreader_crengine_ReaderView_getCurrentPageBookmarkInternal (JNIEnv *_env, jobject _this) { CRJNIEnv env(_env); ReaderViewNative * p = getNative(_env, _this); if ( !p->_docview->isDocumentOpened() ) return NULL; DocViewCallback callback( _env, p->_docview, _this ); CRLog::trace("getCurrentPageBookmarkInternal: calling getBookmark()"); ldomXPointer ptr = p->_docview->getBookmark(); if ( ptr.isNull() ) return JNI_FALSE; CRBookmark bm(ptr); lString16 comment; lString16 titleText; lString16 posText; bm.setType( bmkt_pos ); if ( p->_docview->getBookmarkPosText( ptr, titleText, posText ) ) { bm.setTitleText( titleText ); bm.setPosText( posText ); } bm.setStartPos( ptr.toString() ); int pos = ptr.toPoint().y; int fh = p->_docview->getDocument()->getFullHeight(); int percent = fh > 0 ? (int)(pos * (lInt64)10000 / fh) : 0; if ( percent<0 ) percent = 0; if ( percent>10000 ) percent = 10000; bm.setPercent( percent ); bm.setCommentText( comment ); jclass cls = _env->FindClass("org/coolreader/crengine/Bookmark"); jmethodID mid = _env->GetMethodID(cls, "<init>", "()V"); jobject obj = _env->NewObject(cls, mid); CRObjectAccessor acc(_env, obj); CRStringField(acc,"startPos").set(bm.getStartPos()); CRStringField(acc,"endPos").set(bm.getEndPos()); CRStringField(acc,"titleText").set(bm.getTitleText()); CRStringField(acc,"posText").set(bm.getPosText()); CRStringField(acc,"commentText").set(bm.getCommentText()); CRIntField(acc,"percent").set(bm.getPercent()); //CRIntField(acc,"page").set(bm.getPageNum()); CRIntField(acc,"type").set(bm.getType()); CRLongField(acc,"timeStamp").set((lInt64)bm.getTimestamp()*1000); return obj; }
JSBool xpc_qsUnwrapThisFromCcxImpl(XPCCallContext &ccx, const nsIID &iid, void **ppThis, nsISupports **pThisRef, jsval *vp) { nsISupports *native = ccx.GetIdentityObject(); if(!native) return xpc_qsThrow(ccx.GetJSContext(), NS_ERROR_XPC_HAS_BEEN_SHUTDOWN); nsresult rv = getNative(native, GetOffsets(native, ccx.GetProto()), ccx.GetFlattenedJSObject(), iid, ppThis, pThisRef, vp); if(NS_FAILED(rv)) return xpc_qsThrow(ccx.GetJSContext(), rv); return JS_TRUE; }
JSBool xpc_qsUnwrapThisImpl(JSContext *cx, JSObject *obj, JSObject *callee, const nsIID &iid, void **ppThis, nsISupports **pThisRef, jsval *vp, XPCLazyCallContext *lccx) { JSObject *cur = obj; XPCWrappedNativeTearOff *tearoff; XPCWrappedNative *wrapper = XPCWrappedNative::GetWrappedNativeOfJSObject(cx, obj, callee, &cur, &tearoff); if(wrapper) { nsresult rv = getNativeFromWrapper(wrapper, iid, ppThis, pThisRef, vp); if(NS_SUCCEEDED(rv)) { if(lccx) lccx->SetWrapper(cur, wrapper, tearoff); return JS_TRUE; } if(rv != NS_ERROR_NO_INTERFACE) return xpc_qsThrow(cx, rv); } else if(cur) { nsISupports *native = static_cast<nsISupports*>(xpc_GetJSPrivate(cur)); if(NS_SUCCEEDED(getNative(native, GetOffsetsFromSlimWrapper(cur), cur, iid, ppThis, pThisRef, vp))) { if(lccx) lccx->SetWrapper(cur, nsnull, nsnull); return JS_TRUE; } } *pThisRef = nsnull; return xpc_qsThrow(cx, NS_ERROR_XPC_BAD_OP_ON_WN_PROTO); }
/* * Class: org_coolreader_crengine_ReaderView * Method: getPageImageInternal * Signature: (Landroid/graphics/Bitmap;)V */ JNIEXPORT void JNICALL Java_org_coolreader_crengine_ReaderView_getPageImageInternal (JNIEnv * env, jobject view, jobject bitmap) { CRLog::trace("getPageImageInternal entered"); ReaderViewNative * p = getNative(env, view); //CRLog::info("Initialize callback"); DocViewCallback callback( env, p->_docview, view ); //CRLog::info("Initialized callback"); //CRLog::trace("getPageImageInternal calling bitmap->lock"); LVDrawBuf * drawbuf = BitmapAccessorInterface::getInstance()->lock(env, bitmap); if ( drawbuf!=NULL ) { p->_docview->Draw( *drawbuf ); //CRLog::trace("getPageImageInternal calling bitmap->unlock"); BitmapAccessorInterface::getInstance()->unlock(env, bitmap, drawbuf); } else { CRLog::error("bitmap accessor is invalid"); } //CRLog::trace("getPageImageInternal exiting"); }
/* * Class: org_coolreader_crengine_ReaderView * Method: getPositionPropsInternal * Signature: (Ljava/lang/String;)Lorg/coolreader/crengine/ReaderView/PositionProperties; */ JNIEXPORT jobject JNICALL Java_org_coolreader_crengine_ReaderView_getPositionPropsInternal (JNIEnv * _env, jobject _this, jstring _path) { CRJNIEnv env(_env); ReaderViewNative * p = getNative(_env, _this); if ( !p->_docview->isDocumentOpened() ) return NULL; DocViewCallback callback( _env, p->_docview, _this ); lString16 str = env.fromJavaString(_path); ldomXPointer bm; bool useCurPos = false; // use current Y position for scroll view mode if ( !str.empty() ) { bm = p->_docview->getDocument()->createXPointer(str); } else { useCurPos = p->_docview->getViewMode()==DVM_SCROLL; if ( !useCurPos ) { bm = p->_docview->getBookmark(); if ( bm.isNull() ) { CRLog::error("getPositionPropsInternal: Cannot get current position bookmark"); } } } jclass cls = _env->FindClass("org/coolreader/crengine/PositionProperties"); jmethodID mid = _env->GetMethodID(cls, "<init>", "()V"); jobject obj = _env->NewObject(cls, mid); CRObjectAccessor v(_env, obj); lvPoint pt = !bm.isNull() ? bm.toPoint() : lvPoint(0, p->_docview->GetPos()); CRIntField(v,"x").set(pt.x); CRIntField(v,"y").set(pt.y); CRIntField(v,"fullHeight").set(p->_docview->GetFullHeight()); CRIntField(v,"pageHeight").set(p->_docview->GetHeight()); CRIntField(v,"pageWidth").set(p->_docview->GetWidth()); CRIntField(v,"pageNumber").set(p->_docview->getCurPage()); CRIntField(v,"pageCount").set(p->_docview->getPageCount()); CRIntField(v,"pageMode").set(p->_docview->getViewMode()==DVM_PAGES ? p->_docview->getVisiblePageCount() : 0); return obj; }
nitf::HashTableIterator nitf::HashTable::begin() { nitf_HashTableIterator x = nitf_HashTable_begin(getNative()); return nitf::HashTableIterator(x); }
nitf::HashTableIterator nitf::HashTable::end() { nitf_HashTableIterator x = nitf_HashTable_end(getNative()); return nitf::HashTableIterator(x); }
bool nitf::HashTable::exists(const std::string& key) { return nitf_HashTable_exists(getNative(), key.c_str()); }
void nitf::HashTable::print() { nitf_HashTable_print(getNative()); }
void nitf::HashTable::initDefaults() { nitf_HashTable_initDefaults(getNative()); }
NITF_DATA* nitf::HashTable::remove(const std::string& key) { return nitf_HashTable_remove(getNative(), key.c_str()); }
void nitf::HashTable::setPolicy(int policy) { nitf_HashTable_setPolicy(getNative(), policy); }
nsresult xpc_qsUnwrapArgImpl(JSContext *cx, jsval v, const nsIID &iid, void **ppArg, nsISupports **ppArgRef, jsval *vp) { // From XPCConvert::JSData2Native if(JSVAL_IS_VOID(v) || JSVAL_IS_NULL(v)) { *ppArg = nsnull; *ppArgRef = nsnull; return NS_OK; } if(!JSVAL_IS_OBJECT(v)) { *ppArgRef = nsnull; return ((JSVAL_IS_INT(v) && JSVAL_TO_INT(v) == 0) ? NS_ERROR_XPC_BAD_CONVERT_JS_ZERO_ISNOT_NULL : NS_ERROR_XPC_BAD_CONVERT_JS); } JSObject *src = JSVAL_TO_OBJECT(v); if(IS_SLIM_WRAPPER(src)) { nsISupports *iface = static_cast<nsISupports*>(xpc_GetJSPrivate(src)); if(NS_FAILED(getNative(iface, GetOffsetsFromSlimWrapper(src), src, iid, ppArg, ppArgRef, vp))) return NS_ERROR_XPC_BAD_CONVERT_JS; return NS_OK; } // From XPCConvert::JSObject2NativeInterface XPCWrappedNative* wrappedNative = XPCWrappedNative::GetWrappedNativeOfJSObject(cx, src); nsISupports *iface; if(wrappedNative) { iface = wrappedNative->GetIdentityObject(); if(NS_FAILED(getNativeFromWrapper(wrappedNative, iid, ppArg, ppArgRef, vp))) return NS_ERROR_XPC_BAD_CONVERT_JS; return NS_OK; } // else... // Slow path. // XXX E4X breaks the world. Don't try wrapping E4X objects! // This hack can be removed (or changed accordingly) when the // DOM <-> E4X bindings are complete, see bug 270553 if(JS_TypeOfValue(cx, OBJECT_TO_JSVAL(src)) == JSTYPE_XML) { *ppArgRef = nsnull; return NS_ERROR_XPC_BAD_CONVERT_JS; } // Does the JSObject have 'nsISupportness'? // XXX hmm, I wonder if this matters anymore with no // oldstyle DOM objects around. if(XPCConvert::GetISupportsFromJSObject(src, &iface)) { if(!iface || NS_FAILED(iface->QueryInterface(iid, ppArg))) { *ppArgRef = nsnull; return NS_ERROR_XPC_BAD_CONVERT_JS; } *ppArgRef = static_cast<nsISupports*>(*ppArg); return NS_OK; } // Create the ccx needed for quick stubs. XPCCallContext ccx(JS_CALLER, cx); if(!ccx.IsValid()) { *ppArgRef = nsnull; return NS_ERROR_XPC_BAD_CONVERT_JS; } nsXPCWrappedJS *wrapper; nsresult rv = nsXPCWrappedJS::GetNewOrUsed(ccx, src, iid, nsnull, &wrapper); if(NS_FAILED(rv) || !wrapper) { *ppArgRef = nsnull; return rv; } // We need to go through the QueryInterface logic to make this return // the right thing for the various 'special' interfaces; e.g. // nsIPropertyBag. We must use AggregatedQueryInterface in cases where // there is an outer to avoid nasty recursion. rv = wrapper->QueryInterface(iid, ppArg); if(NS_SUCCEEDED(rv)) { *ppArgRef = static_cast<nsISupports*>(*ppArg); *vp = OBJECT_TO_JSVAL(wrapper->GetJSObject()); } NS_RELEASE(wrapper); return rv; }
//! Is the object valid (native object not null)? virtual bool isValid() const { return getNative() != NULL; }