mirror of
https://github.com/balena-io/etcher.git
synced 2025-07-22 18:56:31 +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 "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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user