diff --git a/src/elevator_init.cpp b/src/elevator_init.cpp index b16ed356..2bbf23c5 100644 --- a/src/elevator_init.cpp +++ b/src/elevator_init.cpp @@ -20,7 +20,49 @@ #include "os/elevate.h" #include "utils/v8utils.h" -NAN_METHOD(Elevate) { +class ElevateWorker : public Nan::AsyncWorker { + public: + ElevateWorker(Nan::Callback *callback, + const std::vector &arguments) + : Nan::AsyncWorker(callback) { + this->arguments = arguments; + } + + ~ElevateWorker() {} + + void Execute() { + etcher::ELEVATE_RESULT result = etcher::Elevate( + this->arguments.front(), + std::vector(this->arguments.begin() + 1, + this->arguments.end())); + + switch (result) { + case etcher::ELEVATE_RESULT::ELEVATE_SUCCESS: + cancelled = false; + break; + case etcher::ELEVATE_RESULT::ELEVATE_CANCELLED: + cancelled = true; + break; + default: + this->SetErrorMessage(etcher::ElevateResultToString(result).c_str()); + } + } + + void HandleOKCallback() { + v8::Local results = Nan::New(); + Nan::Set(results, Nan::New("cancelled").ToLocalChecked(), + this->cancelled ? Nan::True() : Nan::False()); + v8::Local argv[2] = { Nan::Null(), results }; + callback->Call(2, argv); + } + + private: + std::vector arguments; + v8::Local results; + bool cancelled; +}; + +NAN_METHOD(elevate) { if (!info[0]->IsArray()) { return Nan::ThrowError("This function expects an array"); } @@ -31,30 +73,11 @@ NAN_METHOD(Elevate) { std::vector arguments = etcher::v8utils::GetArguments(info[0].As()); - v8::Local callback = info[1].As(); - - etcher::ELEVATE_RESULT result = etcher::Elevate( - arguments.front(), - std::vector(arguments.begin() + 1, arguments.end())); - - // Create results object - v8::Isolate *isolate = v8::Isolate::GetCurrent(); - v8::Local results = v8::Object::New(isolate); - - switch (result) { - case etcher::ELEVATE_RESULT::ELEVATE_SUCCESS: - results->Set(v8::String::NewFromUtf8(isolate, "cancelled"), Nan::False()); - YIELD_OBJECT(callback, results); - break; - case etcher::ELEVATE_RESULT::ELEVATE_CANCELLED: - results->Set(v8::String::NewFromUtf8(isolate, "cancelled"), Nan::True()); - YIELD_OBJECT(callback, results); - break; - default: - YIELD_ERROR(callback, etcher::ElevateResultToString(result)); - } + Nan::Callback *callback = new Nan::Callback(info[1].As()); + Nan::AsyncQueueWorker(new ElevateWorker(callback, arguments)); + info.GetReturnValue().SetUndefined(); } -NAN_MODULE_INIT(ElevatorInit) { NAN_SET_FUNCTION("elevate", Elevate); } +NAN_MODULE_INIT(ElevatorInit) { NAN_EXPORT(target, elevate); } NODE_MODULE(elevator, ElevatorInit) diff --git a/src/os/elevate.h b/src/os/elevate.h index fb7fd3ee..6ab9d06e 100644 --- a/src/os/elevate.h +++ b/src/os/elevate.h @@ -56,7 +56,7 @@ enum class ELEVATE_RESULT { ELEVATE_RESULT Elevate(const std::wstring &command, std::vector arguments); -std::wstring ElevateResultToString(const ELEVATE_RESULT &result); +std::string ElevateResultToString(const ELEVATE_RESULT &result); } // namespace etcher diff --git a/src/os/win32/elevate.cpp b/src/os/win32/elevate.cpp index 1a7483aa..f06c47b1 100644 --- a/src/os/win32/elevate.cpp +++ b/src/os/win32/elevate.cpp @@ -127,32 +127,32 @@ etcher::ELEVATE_RESULT etcher::Elevate(const std::wstring &command, return etcher::ELEVATE_RESULT::ELEVATE_SUCCESS; } -std::wstring +std::string etcher::ElevateResultToString(const etcher::ELEVATE_RESULT &result) { switch (result) { case etcher::ELEVATE_RESULT::ELEVATE_SUCCESS: - return L"Success"; + return "Success"; case etcher::ELEVATE_RESULT::ELEVATE_CANCELLED: - return L"The user cancelled the elevation request"; + return "The user cancelled the elevation request"; case etcher::ELEVATE_RESULT::ELEVATE_FILE_NOT_FOUND: - return L"The specified file was not found"; + return "The specified file was not found"; case etcher::ELEVATE_RESULT::ELEVATE_PATH_NOT_FOUND: - return L"The specified path was not found"; + return "The specified path was not found"; case etcher::ELEVATE_RESULT::ELEVATE_DDE_FAIL: - return L"The Dynamic Data Exchange (DDE) transaction failed"; + return "The Dynamic Data Exchange (DDE) transaction failed"; case etcher::ELEVATE_RESULT::ELEVATE_NO_ASSOCIATION: - return L"There is no application associated with the " - "specified file name extension"; + return "There is no application associated with the " + "specified file name extension"; case etcher::ELEVATE_RESULT::ELEVATE_ACCESS_DENIED: - return L"Access to the specified file is denied"; + return "Access to the specified file is denied"; case etcher::ELEVATE_RESULT::ELEVATE_DLL_NOT_FOUND: - return L"One of the library files necessary to run the " - "application can't be found"; + return "One of the library files necessary to run the " + "application can't be found"; case etcher::ELEVATE_RESULT::ELEVATE_NOT_ENOUGH_MEMORY: - return L"There is not enough memory to perform the specified action"; + return "There is not enough memory to perform the specified action"; case etcher::ELEVATE_RESULT::ELEVATE_SHARING_VIOLATION: - return L"A sharing violation occurred"; + return "A sharing violation occurred"; default: - return L"Unknown error"; + return "Unknown error"; } }