2012-04-23 47 views
0

我写Agueas [1]为插件Node.js的传递对象到由C回调函数++代码

现在我已经同步码,C++类如下所示:

class LibAugeas : public node::ObjectWrap { 
public: 
    static void Init(Handle<Object> target); 

protected: 
    augeas * m_aug; 
    LibAugeas(); 
    ~LibAugeas(); 

    static Handle<Value> New(const Arguments& args); 

    static Handle<Value> get  (const Arguments& args); 
    static Handle<Value> set  (const Arguments& args); 
    static Handle<Value> setm  (const Arguments& args); 
    // other methods 
}; 

的用法这个类在JS:

var lib = require('...'); 
var aug = new lib.Augeas(...); 
aug.set(...); 
aug.get(...); 
// etc 

我要推动异步代码。

瓶颈是创建augeas对象(aug_init),而所有或一些镜头和文件正在加载和解析。这样的想法是创建augeas异步对象,然后通过创建JS对象的回调函数:

  1. 用纯C线:调用aug_init(),aug_load()得到augeas处理。
  2. 准备好后,使用augeas句柄来创建JS对象(请参阅第一个片段)
  3. 将创建的JS对象传递给回调函数。

用法可能是这样:

lib.heracles(function(aug) { 
     if (!aug.error()) { 
      console.log('Hello!'); 

      // async save: 
      aug.save(function(err, msg) { 
       console.log(msg); 
       }); 
     } else { 
      console.log('Sad, but true :-('); 
     } 
    } 
); 

最后,我的问题:我不知道如何在C++创建JS对象:-)

构造static Handle<Value> New(const Arguments& args);回报args.This(),但是当我在C++代码中时,我没有args,也无法包装对象。

那么,如何在C++中创建JS对象?请不要伤我的心脏说:-)

[1] http://augeas.net

回答

0

好,感谢大家:-) 我已经找到了正确的方法是不可能的。这里是一个静态方法,它创建一个JS对象,给定augeas句柄。 然后我可以将这个对象从C++代码传递给回调函数。

Local<Object> LibAugeas::New(augeas *aug) 
{ 
    LibAugeas *obj = new LibAugeas(); 
    obj->m_aug = aug; 

    Handle<ObjectTemplate> tpl = ObjectTemplate::New(); 
    tpl->SetInternalFieldCount(1); // one field for LibAugeas* pointer (via obj->Wrap()) 

#define _OBJ_NEW_METHOD(m) NODE_SET_METHOD(tpl, #m, m) 
    _OBJ_NEW_METHOD(get); 
    _OBJ_NEW_METHOD(set); 
    _OBJ_NEW_METHOD(setm); 
    _OBJ_NEW_METHOD(rm); 
    _OBJ_NEW_METHOD(mv); 
    _OBJ_NEW_METHOD(save); 
    _OBJ_NEW_METHOD(nmatch); 
    _OBJ_NEW_METHOD(insert); 
    _OBJ_NEW_METHOD(error); 

    Local<Object> O = tpl->NewInstance(); 
    obj->Wrap(O); 
    return O; 
} 
+0

更新:对象tenplate可能会创建一次,也可能会重用FunctionTemplate。 – Igor 2012-04-25 11:25:46