-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathPdfVecObjects.cc
107 lines (82 loc) · 2.92 KB
/
PdfVecObjects.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <node.h>
#include "PdfObject.h"
#include "PdfVecObjects.h"
using v8::Handle;
using v8::Value;
using v8::Object;
using v8::Local;
using v8::Persistent;
using v8::FunctionTemplate;
using v8::Function;
using v8::Number;
using v8::Array;
using v8::External;
Nan::Persistent<FunctionTemplate> PdfVecObjects::constructor_template;
PdfVecObjects::PdfVecObjects() :
_obj(new PoDoFo::PdfVecObjects()),
_objFromElsewhere(false) {
}
PdfVecObjects::PdfVecObjects(PoDoFo::PdfVecObjects* obj) :
_obj(obj),
_objFromElsewhere(true) { }
PdfVecObjects::~PdfVecObjects() {
if (!_objFromElsewhere) { delete _obj; }
}
PoDoFo::PdfVecObjects* PdfVecObjects::Unwrap() {
return _obj;
}
void PdfVecObjects::Init(Handle<Object> exports) {
Nan::HandleScope scope;
// Prepare constructor template
Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New);
tpl->SetClassName(Nan::New("PdfVecObjects").ToLocalChecked());
tpl->InstanceTemplate()->SetInternalFieldCount(3);
// Prototype
Nan::SetPrototypeMethod(tpl, "GetSize", GetSize);
Nan::SetPrototypeMethod(tpl, "GetObjectCount", GetObjectCount);
Nan::SetPrototypeMethod(tpl, "ToArray", ToArray);
constructor_template.Reset(tpl);
exports->Set(Nan::New("PdfVecObjects").ToLocalChecked(), tpl->GetFunction());
}
NAN_METHOD(PdfVecObjects::New) {
Nan::HandleScope scope;
if (!info.IsConstructCall()) {
return Nan::ThrowTypeError("Use the new operator to create new PdfVecObjects objects");
}
PdfVecObjects* objects;
if (info.Length() == 1 && info[0]->IsExternal()) {
objects = new PdfVecObjects(static_cast<PoDoFo::PdfVecObjects*>(
External::Cast(*info[0])->Value()));
} else {
objects = new PdfVecObjects();
}
objects->Wrap(info.This());
info.GetReturnValue().Set(info.This());
}
NAN_METHOD(PdfVecObjects::GetSize) {
Nan::HandleScope scope;
PdfVecObjects* obj = ObjectWrap::Unwrap<PdfVecObjects>(info.This());
size_t size = obj->_obj->GetSize();
info.GetReturnValue().Set(Nan::New<Number>(size));
}
NAN_METHOD(PdfVecObjects::GetObjectCount) {
Nan::HandleScope scope;
PdfVecObjects* obj = ObjectWrap::Unwrap<PdfVecObjects>(info.This());
size_t count = obj->_obj->GetObjectCount();
info.GetReturnValue().Set(Nan::New<Number>(count));
}
NAN_METHOD(PdfVecObjects::ToArray) {
Nan::HandleScope scope;
PdfVecObjects* obj = ObjectWrap::Unwrap<PdfVecObjects>(info.This());
// Create JS array to contain wrapped instances of PdfObjects.
Local<Array> arr = Nan::New<Array>(obj->_obj->GetSize());
Local<FunctionTemplate> tpl = Nan::New(PdfObject::constructor_template);
for (PoDoFo::PdfVecObjects::iterator it = obj->_obj->begin();
it != obj->_obj->end(); ++it) {
Local<Function> func = tpl->GetFunction();
Handle<Value> newFuncArgs[] = { Nan::New<External>(*it) };
Local<Object> newObj = func->NewInstance(1, newFuncArgs);
arr->Set(std::distance(obj->_obj->begin(), it), newObj);
}
info.GetReturnValue().Set(arr);
}