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 "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()) {
return Nan::ThrowError("This function expects an array");
}
@ -31,30 +73,11 @@ NAN_METHOD(Elevate) {
std::vector<std::wstring> arguments =
etcher::v8utils::GetArguments(info[0].As<v8::Array>());
v8::Local<v8::Function> callback = info[1].As<v8::Function>();
etcher::ELEVATE_RESULT result = etcher::Elevate(
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::Callback *callback = new Nan::Callback(info[1].As<v8::Function>());
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)

View File

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

View File

@ -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 "
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 "
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";
}
}