Files
MapLibreParticleLab/src/thread_object.cpp
2015-02-04 18:21:39 +01:00

86 lines
2.6 KiB
C++

#include "thread_object.hpp"
#include "node_file_source.hpp"
#include <unistd.h>
////////////////////////////////////////////////////////////////////////////////////////////////
// Static Node Methods
v8::Persistent<v8::FunctionTemplate> ThreadObject::constructorTemplate;
void ThreadObject::Init(v8::Handle<v8::Object> target) {
NanScope();
v8::Local<v8::FunctionTemplate> t = NanNew<v8::FunctionTemplate>(New);
t->InstanceTemplate()->SetInternalFieldCount(1);
t->SetClassName(NanNew("ThreadObject"));
NanAssignPersistent(constructorTemplate, t);
target->Set(NanNew("ThreadObject"), t->GetFunction());
}
NAN_METHOD(ThreadObject::New) {
NanScope();
if (!args.IsConstructCall()) {
return NanThrowTypeError("Use the new operator to create new ThreadObject objects");
}
if (args.Length() < 1 || !NanHasInstance(NodeFileSource::constructorTemplate, args[0])) {
return NanThrowTypeError("Requires a FileSource as first argument");
}
auto fs = ObjectWrap::Unwrap<NodeFileSource>(args[0]->ToObject());
auto to = new ThreadObject(fs);
to->Wrap(args.This());
NanReturnValue(args.This());
}
////////////////////////////////////////////////////////////////////////////////////////////////
// Instance
ThreadObject::ThreadObject(NodeFileSource *fs) {
self = v8::Persistent<v8::Object>::New(handle_);
auto async = new uv_async_t;
async->data = this;
uv_async_init(uv_default_loop(), async, [](uv_async_t *as, int) {
NanScope();
auto to = reinterpret_cast<ThreadObject *>(as->data);
to->self.Dispose();
uv_close((uv_handle_t *)as, [](uv_handle_t *handle) {
delete reinterpret_cast<uv_async_t *>(handle);
});
});
thread = std::thread([this, fs, async]() {
auto loop = uv_loop_new();
fs->request({ mbgl::Resource::Image, "http://example.com" }, loop, [&](const mbgl::Response &res) {
fprintf(stderr, "response.status: %d\n", res.status);
fprintf(stderr, "response.etag: %s\n", res.etag.c_str());
fprintf(stderr, "response.modified: %lld\n", res.modified);
fprintf(stderr, "response.expires: %lld\n", res.expires);
fprintf(stderr, "response.data.size: %ld\n", res.data.size());
fprintf(stderr, "response.message: %s\n", res.message.c_str());
});
uv_run(loop, UV_RUN_DEFAULT);
uv_loop_delete(loop);
// Notify that the loop has finished executing.
uv_async_send(async);
});
}
ThreadObject::~ThreadObject() {
thread.join();
}