mirror of
https://github.com/balena-io/etcher.git
synced 2025-07-23 03:06:38 +00:00
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:
parent
4a6955c173
commit
0ce2fca40a
@ -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)
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user