From 94035ecc19b86ce766cc367e17e3f6fe5dde6622 Mon Sep 17 00:00:00 2001 From: Luigi Pinca Date: Sun, 15 Dec 2013 13:25:44 +0100 Subject: [PATCH 1/2] Save file data before it is wiped by `gp_file_free`, fixes #29 --- src/camera_helpers.cc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/camera_helpers.cc b/src/camera_helpers.cc index a7be531..15589ef 100644 --- a/src/camera_helpers.cc +++ b/src/camera_helpers.cc @@ -274,6 +274,7 @@ GPCamera::getCameraFile(take_picture_request *req, CameraFile **file){ void GPCamera::downloadPicture(take_picture_request *req){ CameraFile *file; + const char *data; int retval; std::ostringstream folder; std::string name; @@ -293,7 +294,7 @@ GPCamera::downloadPicture(take_picture_request *req){ retval = getCameraFile(req, &file); if (retval == GP_OK) { - retval = gp_camera_file_get ( req->camera, folder.str().c_str(), name.c_str(), GP_FILE_TYPE_NORMAL, file, req->context); + retval = gp_camera_file_get(req->camera, folder.str().c_str(), name.c_str(), GP_FILE_TYPE_NORMAL, file, req->context); } else { req->ret=retval; return; @@ -301,7 +302,13 @@ GPCamera::downloadPicture(take_picture_request *req){ // Fallback to downloading into buffer if(retval == GP_OK && req->target_path.empty()){ - retval = gp_file_get_data_and_size (file, &req->data, &req->length); + retval = gp_file_get_data_and_size(file, &data, &req->length); + if (retval == GP_OK && req->length != 0) { + // `gp_file_free` will call `free` on `file->data` pointer. We need to save our data + req->data = new char[req->length]; + memmove(const_cast(req->data), data, req->length); + } + data = NULL; } if(retval == GP_OK){ From dee5f56e23c4406460a8c377b55e4e51214f7247 Mon Sep 17 00:00:00 2001 From: Luigi Pinca Date: Sun, 15 Dec 2013 15:23:35 +0100 Subject: [PATCH 2/2] Refactored the creation of the node.js buffer --- src/camera.cc | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/camera.cc b/src/camera.cc index 167ba6a..b2ad48d 100644 --- a/src/camera.cc +++ b/src/camera.cc @@ -117,15 +117,18 @@ void GPCamera::Async_CaptureCb(uv_work_t *req, int status){ } else if(capture_req->data && capture_req->download) { argc = 2; - node::Buffer* slowBuffer = node::Buffer::New(capture_req->length); + Local globalObj = Context::GetCurrent()->Global(); + Local bufferConstructor = Local::Cast(globalObj->Get(String::New("Buffer"))); + Handle constructorArgs[1]; + constructorArgs[0] = capture_req->length + ? Integer::New(capture_req->length) + : Integer::New(0); + Local buffer = bufferConstructor->NewInstance(1, constructorArgs); if(capture_req->length){ - memmove(Buffer::Data(slowBuffer), capture_req->data, capture_req->length); - Local globalObj = Context::GetCurrent()->Global(); - Local bufferConstructor = Local::Cast(globalObj->Get(String::New("Buffer"))); - Handle constructorArgs[3] = { slowBuffer->handle_, Integer::New(capture_req->length), Integer::New(0) }; - Local actualBuffer = bufferConstructor->NewInstance(3, constructorArgs); - argv[1] = actualBuffer; + memmove(Buffer::Data(buffer), capture_req->data, capture_req->length); + delete capture_req->data; } + argv[1] = buffer; }else{ argc = 2; argv[1] = cv::CastToJS(capture_req->path);