void Png::PngEncodeAsync(const FunctionCallbackInfo<Value> &args) { Isolate *isolate = Isolate::GetCurrent(); HandleScope scope(isolate); if (args.Length() != 1) { args.GetReturnValue().Set(VException("One argument required - callback function.")); return; } if (!args[0]->IsFunction()) { args.GetReturnValue().Set(VException("First argument must be a function.")); return; } Local<Function> callback = Local<Function>::Cast(args[0]); Png *png = ObjectWrap::Unwrap<Png>(args.This()); encode_request *enc_req = (encode_request *)malloc(sizeof(*enc_req)); if (!enc_req) { args.GetReturnValue().Set(VException("malloc in Png::PngEncodeAsync failed.")); return; } enc_req->callback.Reset(isolate, callback); enc_req->png_obj = png; enc_req->png = NULL; enc_req->png_len = 0; enc_req->error = NULL; // We need to pull out the buffer data before // we go to the thread pool. Local<Value> buf_val = png->handle()->GetHiddenValue(String::NewFromUtf8(isolate, "buffer")); enc_req->buf_data = Buffer::Data(buf_val->ToObject()); uv_work_t* req = new uv_work_t; req->data = enc_req; uv_queue_work(uv_default_loop(), req, UV_PngEncode, (uv_after_work_cb)UV_PngEncodeAfter); png->Ref(); }
Handle<Value> Png::PngEncodeAsync(const Arguments &args) { HandleScope scope; if (args.Length() != 1) return VException("One argument required - callback function."); if (!args[0]->IsFunction()) return VException("First argument must be a function."); Local<Function> callback = Local<Function>::Cast(args[0]); Png *png = ObjectWrap::Unwrap<Png>(args.This()); encode_request *enc_req = (encode_request *)malloc(sizeof(*enc_req)); if (!enc_req) return VException("malloc in Png::PngEncodeAsync failed."); enc_req->callback = Persistent<Function>::New(callback); enc_req->png_obj = png; enc_req->png = NULL; enc_req->png_len = 0; enc_req->error = NULL; // We need to pull out the buffer data before // we go to the thread pool. Local<Value> buf_val = png->handle_->GetHiddenValue(String::New("buffer")); enc_req->buf_data = BufferData(buf_val->ToObject()); uv_work_t* req = new uv_work_t; req->data = enc_req; uv_queue_work(uv_default_loop(), req, UV_PngEncode, (uv_after_work_cb)UV_PngEncodeAfter); png->Ref(); return Undefined(); }