Skip to content

Commit 1ee78c1

Browse files
Rushmbroadst
authored andcommitted
refactor(HyperVisor,InstanceReturnHandler): use new generic worker
1 parent b66dabd commit 1ee78c1

File tree

6 files changed

+56
-84
lines changed

6 files changed

+56
-84
lines changed

src/hypervisor.cc

Lines changed: 38 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "network_filter.h"
1414
#include "interface.h"
1515
#include "hypervisor.h"
16+
#include "worker.h"
1617

1718
namespace NLV {
1819

@@ -229,64 +230,45 @@ NAN_METHOD(Hypervisor::New)
229230
return info.GetReturnValue().Set(info.This());
230231
}
231232

232-
int Hypervisor::ConnectWorker::auth_callback(virConnectCredentialPtr cred,
233-
unsigned int ncred, void *data)
234-
{
235-
Hypervisor *hypervisor = static_cast<ConnectWorker*>(data)->hypervisor_;
236-
237-
for (unsigned int i = 0; i < ncred; ++i) {
238-
switch (cred[i].type) {
239-
case VIR_CRED_AUTHNAME:
240-
cred[i].result = strdup(hypervisor->username_.c_str());
241-
if (cred[i].result == NULL)
242-
return -1;
243-
cred[i].resultlen = strlen(cred[i].result);
244-
break;
245-
246-
case VIR_CRED_PASSPHRASE:
247-
cred[i].result = strdup(hypervisor->password_.c_str());
248-
if (cred[i].result == NULL)
249-
return -1;
250-
cred[i].resultlen = strlen(cred[i].result);
251-
break;
252-
}
253-
}
254-
255-
return 0;
256-
}
257-
258233
NAN_METHOD(Hypervisor::Connect)
259234
{
260-
Nan::HandleScope scope;
261-
if (info.Length() == 1 && !info[0]->IsFunction()) {
262-
Nan::ThrowTypeError("You must specify a function as first argument");
263-
return;
264-
}
265-
266-
Nan::Callback *callback = new Nan::Callback(info[0].As<Function>());
267-
Hypervisor *hv = Nan::ObjectWrap::Unwrap<Hypervisor>(info.This());
268-
Nan::AsyncQueueWorker(new ConnectWorker(callback, hv));
269-
return;
270-
}
271-
272-
NLV_WORKER_EXECUTE(Hypervisor, Connect)
273-
{
274-
static int supported_cred_types[] = {
275-
VIR_CRED_AUTHNAME,
276-
VIR_CRED_PASSPHRASE,
277-
};
278-
279-
virConnectAuth auth;
280-
auth.credtype = supported_cred_types;
281-
auth.ncredtype = sizeof(supported_cred_types) / sizeof(int);
282-
auth.cb = ConnectWorker::auth_callback;
283-
auth.cbdata = this;
284-
285-
hypervisor_->handle_ =
286-
virConnectOpenAuth((const char*) hypervisor_->uri_.c_str(), &auth,
287-
hypervisor_->readOnly_ ? VIR_CONNECT_RO : 0);
288-
if (hypervisor_->handle_ == NULL)
289-
SetVirError(virSaveLastError());
235+
Hypervisor *hv = Hypervisor::Unwrap(info.This());
236+
std::string uri = hv->uri_;
237+
Worker::RunAsync(info, [=](Worker::SetOnFinishedHandler onFinished ) {
238+
static int supported_cred_types[] = {
239+
VIR_CRED_AUTHNAME,
240+
VIR_CRED_PASSPHRASE,
241+
};
242+
243+
virConnectAuth auth;
244+
auth.credtype = supported_cred_types;
245+
auth.ncredtype = sizeof(supported_cred_types) / sizeof(int);
246+
auth.cb = [](virConnectCredentialPtr cred, unsigned int ncred, void *data) {
247+
Hypervisor *hypervisor = static_cast<Hypervisor*>(data);
248+
for (unsigned int i = 0; i < ncred; ++i) {
249+
switch (cred[i].type) {
250+
case VIR_CRED_AUTHNAME:
251+
cred[i].result = strdup(hypervisor->username_.c_str());
252+
if (cred[i].result == NULL)
253+
return -1;
254+
cred[i].resultlen = strlen(cred[i].result);
255+
break;
256+
257+
case VIR_CRED_PASSPHRASE:
258+
cred[i].result = strdup(hypervisor->password_.c_str());
259+
if (cred[i].result == NULL)
260+
return -1;
261+
cred[i].resultlen = strlen(cred[i].result);
262+
break;
263+
}
264+
}
265+
return 0;
266+
};
267+
auth.cbdata = hv;
268+
hv->handle_ = virConnectOpenAuth(uri.c_str(), &auth,
269+
hv->readOnly_ ? VIR_CONNECT_RO : 0);
270+
return onFinished(PrimitiveReturnHandler(true));
271+
});
290272
}
291273

292274
NAN_METHOD(Hypervisor::Disconnect)

src/hypervisor.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -96,18 +96,6 @@ class Hypervisor : public NLVObject<Hypervisor, virConnectPtr, HypervisorCleanup
9696
// static NAN_METHOD(FindStoragePoolSources);
9797

9898
private:
99-
// ACTION WORKERS
100-
class ConnectWorker : public NLVAsyncWorker<virConnectPtr> {
101-
public:
102-
ConnectWorker(Nan::Callback *callback, Hypervisor *hypervisor)
103-
: NLVAsyncWorker(callback, NULL), hypervisor_(hypervisor) {}
104-
105-
void Execute();
106-
static int auth_callback(virConnectCredentialPtr cred, unsigned int ncred, void *data);
107-
private:
108-
Hypervisor *hypervisor_;
109-
};
110-
11199
class DisconnectWorker : public NLVAsyncWorker<virConnectPtr> {
112100
public:
113101
DisconnectWorker(Nan::Callback *callback, Hypervisor *hypervisor)

src/nlv_object.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ class NLVObjectBase : public Nan::ObjectWrap
5454
virtual void ClearHandle() = 0;
5555
virtual void ClearChildren() = 0;
5656
virtual void SetParentReference(NLVObjectBasePtr *parentReference) = 0;
57+
58+
std::vector<NLVObjectBasePtr*> children_;
5759
};
5860

5961
template <typename ParentClass, typename HandleType, typename CleanupHandler>
@@ -99,6 +101,7 @@ class NLVObject : public NLVObjectBase
99101

100102
return ObjectWrap::Unwrap<ParentClass>(val);
101103
}
104+
102105
NAN_INLINE static ParentClass* Unwrap(v8::Local<v8::Value> val) {
103106
if(!val->IsObject()) {
104107
char error[128];
@@ -146,8 +149,6 @@ class NLVObject : public NLVObjectBase
146149
parentReference_ = parentReference;
147150
}
148151

149-
std::vector<NLVObjectBasePtr*> children_;
150-
151152
protected:
152153
HandleType handle_;
153154
NLVObjectBasePtr* parentReference_;
@@ -181,5 +182,4 @@ NAN_INLINE unsigned int GetFlags(v8::Local<v8::Value> val) {
181182

182183
};
183184

184-
185185
#endif // NLV_OBJECT_H

src/storage_pool.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ NAN_METHOD(StoragePool::LookupByVolume)
115115
return virSaveLastError();
116116
}
117117

118-
return onFinished(InstanceReturnHandler<Hypervisor, StoragePool>(storagePool));
118+
return onFinished(InstanceReturnHandler<StoragePool>(storagePool));
119119
});
120120
}
121121

@@ -136,7 +136,7 @@ NAN_METHOD(StoragePool::Create)
136136
if (lookupHandle == NULL) {
137137
return virSaveLastError();
138138
}
139-
return onFinished(InstanceReturnHandler<Hypervisor, StoragePool>(lookupHandle));
139+
return onFinished(InstanceReturnHandler<StoragePool>(lookupHandle));
140140
});
141141
}
142142

src/storage_volume.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ NAN_METHOD(StorageVolume::Create)
4747
Nan::ThrowTypeError("You must specify a string and callback");
4848
return;
4949
}
50-
5150
auto sp = StoragePool::UnwrapHandle(info.This());
5251
std::string xmlData(*Nan::Utf8String(info[0]->ToString()));
5352
unsigned int flags = GetFlags(info[1]);
@@ -57,7 +56,7 @@ NAN_METHOD(StorageVolume::Create)
5756
if (handle == NULL) {
5857
return virSaveLastError();
5958
}
60-
return onFinished(InstanceReturnHandler<StoragePool, StorageVolume>(handle));
59+
return onFinished(InstanceReturnHandler<StorageVolume>(handle));
6160
});
6261
}
6362

src/worker.h

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ namespace NLV {
1414
OnFinishedHandler on_finished_handler;
1515

1616
explicit Worker(Nan::Callback *callback, ExecuteHandler handler)
17-
: NLVAsyncWorkerBase(callback), execute_handler(handler) { };
17+
: NLVAsyncWorkerBase(callback), execute_handler(handler)
18+
{ };
1819

1920
void HandleOKCallback() {
2021
on_finished_handler(this);
@@ -30,7 +31,8 @@ namespace NLV {
3031
on_finished_handler = handler;
3132
return nullptr;
3233
});
33-
if(error) {
34+
35+
if (error) {
3436
SetVirError(error);
3537
}
3638
}
@@ -47,25 +49,26 @@ namespace NLV {
4749
};
4850
}
4951

50-
template<class ParentClass, class T, class Y>
52+
template<class T, class Y>
5153
Worker::OnFinishedHandler InstanceReturnHandler(Y val) {
5254
return [=](Worker* worker) {
5355
Nan::HandleScope scope;
5456
Nan::TryCatch try_catch;
5557

5658
Local<Object> childObject = T::NewInstance(val);
5759
Local<Value> parentObject = worker->GetFromPersistent("parent");
60+
T* child = T::Unwrap(childObject);
61+
NLVObjectBasePtr* childPtr = new NLVObjectBasePtr(child);
5862
if (parentObject->IsObject()) {
5963
childObject->Set(Nan::New("_parent").ToLocalChecked(), parentObject);
64+
65+
auto parent = Nan::ObjectWrap::Unwrap<NLVObjectBase>(parentObject->ToObject());
66+
if (parent) {
67+
parent->children_.push_back(childPtr);
68+
}
6069
}
6170

62-
T *child = Nan::ObjectWrap::Unwrap<T>(childObject);
63-
NLVObjectBasePtr *childPtr = new NLVObjectBasePtr(child);
6471
child->SetParentReference(childPtr);
65-
auto parent = ParentClass::Unwrap(parentObject);
66-
if (parent) {
67-
parent->children_.push_back(childPtr);
68-
}
6972

7073
if (try_catch.HasCaught()) {
7174
v8::Local<v8::Value> argv[] = { try_catch.Exception() };

0 commit comments

Comments
 (0)