minifix(GUI): run elevated process asynchronously on Windows (#1950)

Change-Type: patch
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
This commit is contained in:
Juan Cruz Viotti 2018-01-04 14:17:38 -04:00 committed by GitHub
parent 4a6955c173
commit 0ce2fca40a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 62 additions and 39 deletions

View File

@ -20,7 +20,49 @@
#include "os/elevate.h" #include "os/elevate.h"
#include "utils/v8utils.h" #include "utils/v8utils.h"
NAN_METHOD(Elevate) { class ElevateWorker : public Nan::AsyncWorker {
public:
ElevateWorker(Nan::Callback *callback,
const std::vector<std::wstring> &arguments)
: Nan::AsyncWorker(callback) {
this->arguments = arguments;
}
~ElevateWorker() {}
void Execute() {
etcher::ELEVATE_RESULT result = etcher::Elevate(
this->arguments.front(),
std::vector<std::wstring>(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<v8::Object> results = Nan::New<v8::Object>();
Nan::Set(results, Nan::New<v8::String>("cancelled").ToLocalChecked(),
this->cancelled ? Nan::True() : Nan::False());
v8::Local<v8::Value> argv[2] = { Nan::Null(), results };
callback->Call(2, argv);
}
private:
std::vector<std::wstring> arguments;
v8::Local<v8::Object> results;
bool cancelled;
};
NAN_METHOD(elevate) {
if (!info[0]->IsArray()) { if (!info[0]->IsArray()) {
return Nan::ThrowError("This function expects an array"); return Nan::ThrowError("This function expects an array");
} }
@ -31,30 +73,11 @@ NAN_METHOD(Elevate) {
std::vector<std::wstring> arguments = std::vector<std::wstring> arguments =
etcher::v8utils::GetArguments(info[0].As<v8::Array>()); etcher::v8utils::GetArguments(info[0].As<v8::Array>());
v8::Local<v8::Function> callback = info[1].As<v8::Function>(); Nan::Callback *callback = new Nan::Callback(info[1].As<v8::Function>());
Nan::AsyncQueueWorker(new ElevateWorker(callback, arguments));
etcher::ELEVATE_RESULT result = etcher::Elevate( info.GetReturnValue().SetUndefined();
arguments.front(),
std::vector<std::wstring>(arguments.begin() + 1, arguments.end()));
// Create results object
v8::Isolate *isolate = v8::Isolate::GetCurrent();
v8::Local<v8::Object> 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_MODULE_INIT(ElevatorInit) { NAN_SET_FUNCTION("elevate", Elevate); } NAN_MODULE_INIT(ElevatorInit) { NAN_EXPORT(target, elevate); }
NODE_MODULE(elevator, ElevatorInit) NODE_MODULE(elevator, ElevatorInit)

View File

@ -56,7 +56,7 @@ enum class ELEVATE_RESULT {
ELEVATE_RESULT Elevate(const std::wstring &command, ELEVATE_RESULT Elevate(const std::wstring &command,
std::vector<std::wstring> arguments); std::vector<std::wstring> arguments);
std::wstring ElevateResultToString(const ELEVATE_RESULT &result); std::string ElevateResultToString(const ELEVATE_RESULT &result);
} // namespace etcher } // namespace etcher

View File

@ -127,32 +127,32 @@ etcher::ELEVATE_RESULT etcher::Elevate(const std::wstring &command,
return etcher::ELEVATE_RESULT::ELEVATE_SUCCESS; return etcher::ELEVATE_RESULT::ELEVATE_SUCCESS;
} }
std::wstring std::string
etcher::ElevateResultToString(const etcher::ELEVATE_RESULT &result) { etcher::ElevateResultToString(const etcher::ELEVATE_RESULT &result) {
switch (result) { switch (result) {
case etcher::ELEVATE_RESULT::ELEVATE_SUCCESS: case etcher::ELEVATE_RESULT::ELEVATE_SUCCESS:
return L"Success"; return "Success";
case etcher::ELEVATE_RESULT::ELEVATE_CANCELLED: 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: 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: 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: 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: case etcher::ELEVATE_RESULT::ELEVATE_NO_ASSOCIATION:
return L"There is no application associated with the " return "There is no application associated with the "
"specified file name extension"; "specified file name extension";
case etcher::ELEVATE_RESULT::ELEVATE_ACCESS_DENIED: 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: case etcher::ELEVATE_RESULT::ELEVATE_DLL_NOT_FOUND:
return L"One of the library files necessary to run the " return "One of the library files necessary to run the "
"application can't be found"; "application can't be found";
case etcher::ELEVATE_RESULT::ELEVATE_NOT_ENOUGH_MEMORY: 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: case etcher::ELEVATE_RESULT::ELEVATE_SHARING_VIOLATION:
return L"A sharing violation occurred"; return "A sharing violation occurred";
default: default:
return L"Unknown error"; return "Unknown error";
} }
} }