@@ -14,6 +14,8 @@ struct CachedObject {
1414 napi_env env;
1515};
1616
17+ typedef Napi::Object (*WrapFunc)(Napi::Env, QObject *);
18+
1719/* *
1820 * C++ side cache for wrapper objects.
1921 *
@@ -26,6 +28,7 @@ class DLL_EXPORT WrapperCache : public QObject {
2628
2729 private:
2830 QMap<uint64_t , CachedObject> cache;
31+ QMap<QString, WrapFunc> wrapperRegistry;
2932
3033 public:
3134 /* *
@@ -64,6 +67,35 @@ class DLL_EXPORT WrapperCache : public QObject {
6467 return wrapper;
6568 }
6669
70+ void registerWrapper (QString typeName, WrapFunc wrapFunc) {
71+ this ->wrapperRegistry [typeName] = wrapFunc;
72+ }
73+
74+ Napi::Value getWrapper (Napi::Env env, QObject* qobject) {
75+ if (qobject == nullptr ) {
76+ return env.Null ();
77+ }
78+
79+ uint64_t ptrHash = extrautils::hashPointerTo53bit (qobject);
80+ if (this ->cache .contains (ptrHash)) {
81+ napi_value result = nullptr ;
82+ napi_get_reference_value (env, this ->cache [ptrHash].ref , &result);
83+
84+ napi_valuetype valuetype;
85+ napi_typeof (env, result, &valuetype);
86+ if (valuetype != napi_null) {
87+ return Napi::Object (env, result);
88+ }
89+ }
90+
91+ // QString className(object->metaObject()->className());
92+ // if (this->wrapperRegistry.contains(className)) {
93+ // this->wrapperRegistry[className]
94+ // }
95+
96+ return env.Null ();
97+ }
98+
6799 /* *
68100 * Store a mapping from Qt Object to wrapper
69101 *
@@ -89,8 +121,8 @@ class DLL_EXPORT WrapperCache : public QObject {
89121 static Napi::Object init (Napi::Env env, Napi::Object exports) {
90122 exports.Set (" WrapperCache_injectCallback" ,
91123 Napi::Function::New<injectDestroyCallback>(env));
92- // exports.Set("WrapperCache_storeJS ",
93- // Napi::Function::New<storeJS>(env));
124+ exports.Set (" WrapperCache_store " ,
125+ Napi::Function::New<storeJS>(env));
94126 return exports;
95127 }
96128
@@ -101,6 +133,17 @@ class DLL_EXPORT WrapperCache : public QObject {
101133 return env.Null ();
102134 }
103135
136+ static Napi::Value storeJS (const Napi::CallbackInfo& info) {
137+ Napi::Env env = info.Env ();
138+
139+ Napi::Object objectWrapper = info[0 ].As <Napi::Object>();
140+ QObject* qobject = info[1 ].As <Napi::External<QObject>>().Data ();
141+
142+ uint64_t ptrHash = extrautils::hashPointerTo53bit (qobject);
143+ instance.store (env, ptrHash, qobject, objectWrapper, false );
144+ return env.Null ();
145+ }
146+
104147 static Napi::FunctionReference destroyedCallback;
105148
106149 public Q_SLOTS:
0 commit comments