Hi,
Ultimately, I want to call TEST_setJSCallBack of gecko C++(TESTManager.cpp)
from TESTManager.js for testing callback function. So, I tried to add two
interfaces in nsIDOMMozTESTManager.idl, and then, I called TEST_setJSCallback()
function in gecko js(TESTManager.js) such as below:
var com = Components.classes["@mozilla.org/testManager;1"]
.getService(Components.interfaces.nsIDOMMozTESTManager);
debug(com);
var ret = com.TEST_setJSCallBack(test111);
debug("SetJSCallBack = " + ret);
But, "ret" value is set by TEST_setJSCallBack function of gecko js, not c++
function.
Do you know what is wrong in my codes?
2013년 8월 4일 일요일 오후 3시 12분 48초 UTC+9, Josh Matthews 님의 말:
> I don't understand what you are trying to accomplish by having two
>
> separate implementations of nsIDOMMozTESTManager.
>
>
>
> On 08/03/2013 11:10 PM, Kilcheon Kim wrote:
>
> > Hi,
>
> >
>
> > Now I am trying to use xpcom for callback function.
>
> > But I couldn't call gecko c++ function from gecko js using the XPCOM.
>
> > My test codes are below.
>
> > In gecko js (TESTManager.js), I try to call "TEST_setJSCallBack" function
> > but it did not be called.
>
> > I don't know why gecko c++ function can't be called from gecko js.
>
> > Please check my sample code and find my mistake or something.
>
> > Please anybody help me.
>
> > Thanks.
>
> >
>
> >
>
> > 1. nsIDOMTESTManager.idl
>
> > ----------------------------------------------------------------------------------------------
>
> > #include "nsISupports.idl"
>
> >
>
> > [scriptable, function, uuid(2b9dfd66-d480-4b0d-9b15-8ed04858fd9c)]
>
> > interface IJSCallback : nsISupports {
>
> > boolean call(in int32_t bogus, in int32_t aData);
>
> > };
>
> >
>
> > [scriptable, uuid(4a096156-1bd7-4f69-b7eb-89371ff82eb5)]
>
> > interface nsIDOMMozTESTManager : nsISupports
>
> > {
>
> > jsval TEST_Initialize(in jsval x, in jsval y, in jsval width, in jsval
> > height);
>
> > int32_t TEST_setJSCallBack(in IJSCallback aCallback);
>
> > void TEST_add(in int32_t first, in int32_t second);
>
> > void TEST_sum(in int32_t first, in int32_t second, in IJSCallback
> > aCallback);
>
> > };
>
> > ---------------------------------------------------------------------------------------------
>
> >
>
> > 2. TESTManager.h
>
> > ---------------------------------------------------------------------------------------------
>
> > #ifndef DOM_TEST_TESTMANAGER_H
>
> > #define DOM_TEST_TESTMANAGER_H
>
> >
>
> > #include "nsProxyRelease.h"
>
> > #include "nsIDOMTESTManager.h"
>
> >
>
> > #define NSDOMMOZTESTMANAGER_CLASSNAME "TEST Manager"
>
> > #define NSDOMMOZTESTMANAGER_CID { 0xfb585e70, 0xef3d, 0x42e9,
> > { 0x9b, 0x9a, 0xf8, 0x53, 0xcb, 0x4c, 0x43, 0x14 } }
>
> > #define NSDOMMOZTESTMANAGER_CONTRACTID "@mozilla.com/MozTESTManager;1"
>
> >
>
> > class nsDOMMozTESTManager : public nsIDOMMozTESTManager
>
> > {
>
> > public:
>
> > NS_DECL_ISUPPORTS
>
> > NS_DECL_NSIDOMMOZTESTMANAGER
>
> >
>
> > nsDOMMozTESTManager();
>
> >
>
> > private:
>
> > ~nsDOMMozTESTManager();
>
> >
>
> > protected:
>
> > /* additional members */
>
> > nsCOMPtr<IJSCallback> m_JSCallBack;
>
> > };
>
> >
>
> >
>
> > class CJSCallback : public IJSCallback
>
> > {
>
> > public:
>
> > NS_DECL_ISUPPORTS
>
> > NS_DECL_IJSCALLBACK
>
> >
>
> > CJSCallback();
>
> >
>
> > private:
>
> > ~CJSCallback();
>
> >
>
> > protected:
>
> > /* additional members */
>
> > };
>
> >
>
> > #endif // DOM_TEST_TESTMANAGER_H
>
> > ---------------------------------------------------------------------------------------------
>
> >
>
> > 3. TESTManager.cpp
>
> > ---------------------------------------------------------------------------------------------
>
> > #include "base/basictypes.h"
>
> > #include "TESTManager.h"
>
> > #include "TESTCommon.h"
>
> >
>
> > using namespace mozilla;
>
> >
>
> > NS_IMPL_ISUPPORTS1(nsDOMMozTESTManager, nsIDOMMozTESTManager)
>
> >
>
> > nsDOMMozTESTManager::nsDOMMozTESTManager()
>
> > {
>
> > /* member initializers and constructor code */
>
> > DOM_TEST_LOGI("nsDOMMozTESTManager : constructor");
>
> > }
>
> >
>
> > nsDOMMozTESTManager::~nsDOMMozTESTManager()
>
> > {
>
> > /* destructor code */
>
> > DOM_TEST_LOGI("nsDOMMozTESTManager : destructor");
>
> > }
>
> >
>
> > NS_IMPL_CLASSINFO(nsDOMMozTESTManager, NULL, 0, NSDOMMOZTESTMANAGER_CID)
>
> > NS_IMPL_ISUPPORTS1_CI(nsDOMMozTESTManager, nsIDOMMozTESTManager)
>
> >
>
> >
>
> >
>
> > /* jsval TEST_Initialize (in jsval x, in jsval y, in jsval width, in jsval
> > height); */
>
> > NS_IMETHODIMP nsDOMMozTESTManager::TEST_Initialize(const JS::Value & x,
> > const JS::Value & y, const JS::Value & width, const JS::Value & height,
> > JS::Value *_retval)
>
> > {
>
> > DOM_TEST_LOGI("nsDOMMozTESTManager::TEST_Initialize");
>
> > return NS_ERROR_NOT_IMPLEMENTED;
>
> > }
>
> >
>
> > /* void SetJSCallBack (in IJSCallback aCallback); */
>
> > NS_IMETHODIMP nsDOMMozTESTManager::TEST_setJSCallBack(IJSCallback
> > *aCallback, int32_t *_retval)
>
> > {
>
> > DOM_TEST_LOGI("nsDOMMozTESTManager::TEST_SetJSCallBack");
>
> > nsDOMMozTESTManager::m_JSCallBack = aCallback;
>
> > *_retval = 123;
>
> > return NS_OK;
>
> > }
>
> >
>
> > /* void add (in int32_t first, in int32_t second); */
>
> > NS_IMETHODIMP nsDOMMozTESTManager::TEST_add(int32_t first, int32_t second)
>
> > {
>
> > DOM_TEST_LOGI("nsDOMMozTESTManager::TEST_add");
>
> > bool ret = true;
>
> > nsDOMMozTESTManager::m_JSCallBack->Call((int32_t)0, first+second,
> > &ret);
>
> > return NS_OK;
>
> > }
>
> >
>
> > /* void sum (in int32_t first, in int32_t second, in IJSCallback
> > aCallback); */
>
> > NS_IMETHODIMP nsDOMMozTESTManager::TEST_sum(int32_t first, int32_t second,
> > IJSCallback *aCallback)
>
> > {
>
> > DOM_TEST_LOGI("nsDOMMozTESTManager::TEST_sum : first = %d, second =
> > %d, aCallback = %x\n", first, second, aCallback);
>
> > PRBool ret = true;
>
> > TEST_add(first, second);
>
> > return NS_OK;
>
> > }
>
> >
>
> >
>
> > NS_IMPL_ISUPPORTS1(CJSCallback, IJSCallback)
>
> >
>
> > CJSCallback::CJSCallback()
>
> > {
>
> > DOM_TEST_LOGI("CJSCallback::CJSCallback");
>
> > }
>
> >
>
> > CJSCallback::~CJSCallback()
>
> > {
>
> > DOM_TEST_LOGI("CJSCallback::~CJSCallback");
>
> > }
>
> >
>
> > /* boolean call (in int32_t bogus, in int32_t aData); */
>
> >
>
> > NS_IMETHODIMP CJSCallback::Call(int32_t bogus, int32_t aData, bool *_retval)
>
> > {
>
> > DOM_TEST_LOGI("CJSCallback::Call : bogus = %d, aData = %d\n", bogus,
> > aData);
>
> > return NS_OK;
>
> > }
>
> > ---------------------------------------------------------------------------------------------
>
> >
>
> > 4. TESTCommon.h
>
> > ---------------------------------------------------------------------------------------------
>
> > #ifndef DOM_TEST_TESTCOMMON_H
>
> > #define DOM_TEST_TESTCOMMON_H
>
> >
>
> > #define PR_LOGGING
>
> >
>
> > #ifndef __func__
>
> > #ifdef __FUNCTION__
>
> > #define __func__ __FUNCTION__
>
> > #else
>
> > #define __func__ __FILE__
>
> > #endif
>
> > #endif
>
> >
>
> > #ifndef NAN
>
> > #define NAN std::numeric_limits<double>::quiet_NaN()
>
> > #endif
>
> >
>
> > #include "nsThreadUtils.h"
>
> > #include "nsIDOMTESTManager.h"
>
> > #include "prlog.h"
>
> >
>
> > #ifdef PR_LOGGING
>
> > extern PRLogModuleInfo* gTESTLog;
>
> > #define DOM_TEST_LOG( type, ... ) PR_LOG(gTESTLog, (PRLogModuleLevel)type,
> > ( __VA_ARGS__ ))
>
> > #else
>
> > #define DOM_TEST_LOG( type, ... )
>
> > #endif
>
> >
>
> > #define DOM_TEST_LOGA( ... ) DOM_TEST_LOG( 0, __VA_ARGS__ )
>
> >
>
> > /**
>
> > * From the least to the most output.
>
> > */
>
> > enum {
>
> > DOM_TEST_LOG_NOTHING,
>
> > DOM_TEST_LOG_ERROR,
>
> > DOM_TEST_LOG_WARNING,
>
> > DOM_TEST_LOG_INFO,
>
> > DOM_TEST_LOG_TRACE,
>
> > DOM_TEST_LOG_REFERENCES
>
> > };
>
> >
>
> > /**
>
> > * DOM_CAMERA_LOGR() can be called before 'gCameraLog' is set, so
>
> > * we need to handle this one a little differently.
>
> > */
>
> > #ifdef PR_LOGGING
>
> > #define DOM_TEST_LOGR( ... ) \
>
> > do { \
>
> > if (gTESTLog) { \
>
> > DOM_TEST_LOG( DOM_TEST_LOG_REFERENCES, __VA_ARGS__ ); \
>
> > } \
>
> > } while (0)
>
> > #else
>
> > #define DOM_TEST_LOGR( ... )
>
> > #endif
>
> > #define DOM_TEST_LOGT( ... ) DOM_TEST_LOG( DOM_TEST_LOG_TRACE,
> > __VA_ARGS__ )
>
> > #define DOM_TEST_LOGI( ... ) DOM_TEST_LOG( DOM_TEST_LOG_INFO,
> > __VA_ARGS__ )
>
> > #define DOM_TEST_LOGW( ... ) DOM_TEST_LOG( DOM_TEST_LOG_WARNING,
> > __VA_ARGS__ )
>
> > #define DOM_TEST_LOGE( ... ) DOM_TEST_LOG( DOM_TEST_LOG_ERROR,
> > __VA_ARGS__ )
>
> >
>
> > #ifdef PR_LOGGING
>
> >
>
> > static inline void nsLogAddRefTEST(const char *file, uint32_t line, void*
> > p, uint32_t count, const char *clazz, uint32_t size)
>
> > {
>
> > if (count == 1) {
>
> > DOM_TEST_LOGR("++++++++++++++++++++++++++++++++++++++++");
>
> > }
>
> > DOM_TEST_LOGR("%s:%d : TESTREF-ADD(%s): this=%p, mRefCnt=%d\n", file,
> > line, clazz, p, count);
>
> > }
>
> >
>
> > static inline void nsLogReleaseTEST(const char *file, uint32_t line, void*
> > p, uint32_t count, const char *clazz, bool abortOnDelete)
>
> > {
>
> > DOM_TEST_LOGR("%s:%d : TESTREF-REL(%s): this=%p, mRefCnt=%d\n", file,
> > line, clazz, p, count);
>
> > if (count == 0) {
>
> > if (!abortOnDelete) {
>
> > DOM_TEST_LOGR("----------------------------------------");
>
> > } else {
>
> > DOM_TEST_LOGR("---------- ABORTING ON DELETE ----------");
>
> > *((uint32_t *)0xdeadbeef) = 0x266230;
>
> > }
>
> > }
>
> > }
>
> >
>
> > #ifdef NS_LOG_ADDREF
>
> > #undef NS_LOG_ADDREF
>
> > #endif
>
> > #ifdef NS_LOG_RELEASE
>
> > #undef NS_LOG_RELEASE
>
> > #endif
>
> >
>
> > #define NS_LOG_ADDREF( p, n, c, s ) nsLogAddRefTEST(__FILE__, __LINE__,
> > (p), (n), (c), (s))
>
> > #ifdef DOM_TEST_DEBUG_REFS_ABORT_ON_DELETE
>
> > #define NS_LOG_RELEASE( p, n, c ) nsLogReleaseTEST(__FILE__, __LINE__,
> > (p), (n), (c), DOM_TEST_DEBUG_REFS_ABORT_ON_DELETE)
>
> > #else
>
> > #define NS_LOG_RELEASE( p, n, c ) nsLogReleaseTEST(__FILE__, __LINE__,
> > (p), (n), (c), false)
>
> > #endif
>
> >
>
> > #endif // PR_LOGGING
>
> >
>
> > #endif // DOM_TEST_TESTCOMMON_H
>
> >
>
> > ---------------------------------------------------------------------------------------------
>
> >
>
> > 5. TESTManager.js
>
> > ---------------------------------------------------------------------------------------------
>
> > /* This Source Code Form is subject to the terms of the Mozilla Public
>
> > * License, v. 2.0. If a copy of the MPL was not distributed with this
> > file,
>
> > * You can obtain one at http://mozilla.org/MPL/2.0/. */
>
> >
>
> > "use strict";
>
> >
>
> > /* static functions */
>
> > const DEBUG = true;
>
> >
>
> > function debug(aStr) {
>
> > if (DEBUG)
>
> > dump("TESTManager: " + aStr + "\n");
>
> > }
>
> >
>
> > const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
>
> >
>
> > Cu.import("resource://gre/modules/XPCOMUtils.jsm");
>
> > Cu.import("resource://gre/modules/Services.jsm");
>
> > Cu.import("resource://gre/modules/DOMRequestHelper.jsm");
>
> > Cu.import("resource://gre/modules/ObjectWrapper.jsm");
>
> > Cu.import("resource://gre/modules/ctypes.jsm");
>
> >
>
> > const TESTMANAGER_CONTRACTID = "@mozilla.org/testManager;1";
>
> > const TESTMANAGER_CID =
> > Components.ID("{4a096156-1bd7-4f69-b7eb-89371ff82eb5}");
>
> > const nsIDOMMozTESTManager = Ci.nsIDOMMozTESTManager;
>
> > const nsIClassInfo = Ci.nsIClassInfo;
>
> >
>
> > let library = ctypes.open("libTEST.so");;
>
> > let Test_Initialize;
>
> >
>
> > var test111 = function(sum) {
>
> > debug("test111 : " + sum);
>
> > }
>
> >
>
> > function TESTManager()
>
> > {
>
> > debug("Constructor");
>
> > }
>
> >
>
> > TESTManager.prototype = {
>
> >
>
> > __proto__: DOMRequestIpcHelper.prototype,
>
> >
>
> > classID : TESTMANAGER_CID,
>
> >
>
> > QueryInterface : XPCOMUtils.generateQI([nsIDOMMozTESTManager,
> > Ci.nsIDOMGlobalPropertyInitializer]),
>
> >
>
> > classInfo : XPCOMUtils.generateCI({ classID: TESTMANAGER_CID,
>
> > contractID: TESTMANAGER_CONTRACTID,
>
> > classDescription: "TESTManager",
>
> > interfaces: [nsIDOMMozTESTManager],
>
> > flags: nsIClassInfo.DOM_OBJECT }),
>
> >
>
> > TEST_Initialize: function TEST_Initialize(x, y, width, height) {
>
> > var that = this;
>
> >
>
> > var com = Components.classes["@mozilla.org/testManager;1"]
>
> >
> > .getService(Components.interfaces.nsIDOMMozTESTManager);
>
> > debug(com);
>
> > var ret = com.TEST_setJSCallBack(test111);
>
> > debug("SetJSCallBack = " + ret);
>
> >
>
> > // START ====== TEST Initialize
>
> > Test_Initialize = library.declare("Test_Initialize",
>
> > ctypes.default_abi,
>
> > ctypes.int32_t,
>
> > ctypes.int32_t,
>
> > ctypes.int32_t,
>
> > ctypes.int32_t,
>
> > ctypes.int32_t);
>
> > debug ("Test_Initialize = " + Test_Initialize);
>
> >
>
> > var result = Test_Initialize(x, y, width, height);
>
> > debug ("Test_Initialize : result = " + result);
>
> > // return result;
>
> > // END ====== TEST Initialize
>
> >
>
> > },
>
> >
>
> > TEST_setJSCallBack: function TEST_setJSCallBack(aCallback) {
>
> > debug("TEST_setJSCallBack 1111 = " + aCallback);
>
> > }
>
> >
>
> > this.NSGetFactory = XPCOMUtils.generateNSGetFactory([TESTManager])
>
> >
>
> > ---------------------------------------------------------------------------------------------
>
> >
_______________________________________________
dev-b2g mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-b2g