Simplify conversions between native types and v8 types.

This commit is contained in:
Cheng Zhao 2013-09-23 21:12:40 +08:00
parent 26f0e49c9a
commit 770a0068a3

View file

@ -23,17 +23,48 @@ namespace api {
namespace { namespace {
base::FilePath V8ValueToFilePath(v8::Handle<v8::Value> path) { // Trick to overload functions by return value's type.
std::string path_string(*v8::String::Utf8Value(path)); struct FromV8Value {
return base::FilePath::FromUTF8Unsafe(path_string); explicit FromV8Value(v8::Handle<v8::Value> value) : value_(value) {}
}
operator std::string() {
return *v8::String::Utf8Value(value_);
}
operator int() {
return value_->IntegerValue();
}
operator base::FilePath() {
return base::FilePath::FromUTF8Unsafe(FromV8Value(value_));
}
operator atom::NativeWindow*() {
if (value_->IsObject()) {
Window* window = Window::Unwrap<Window>(value_->ToObject());
if (window && window->window())
return window->window();
}
return NULL;
}
operator v8::Persistent<v8::Function>() {
return value_->IsFunction() ?
v8::Persistent<v8::Function>::New(
node_isolate,
v8::Handle<v8::Function>::Cast(value_)) :
v8::Persistent<v8::Function>();
}
v8::Handle<v8::Value> value_;
};
v8::Handle<v8::Value> ToV8Value(const base::FilePath& path) { v8::Handle<v8::Value> ToV8Value(const base::FilePath& path) {
std::string path_string(path.AsUTF8Unsafe()); std::string path_string(path.AsUTF8Unsafe());
return v8::String::New(path_string.data(), path_string.size()); return v8::String::New(path_string.data(), path_string.size());
} }
v8::Handle<v8::Value> ToV8Value(void*) { v8::Handle<v8::Value> ToV8Value(void* whatever) {
return v8::Undefined(); return v8::Undefined();
} }
@ -88,32 +119,19 @@ v8::Handle<v8::Value> ShowMessageBox(const v8::Arguments &args) {
!args[4]->IsString()) // detail !args[4]->IsString()) // detail
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
NativeWindow* native_window = NULL; NativeWindow* native_window = FromV8Value(args[5]);
if (args[5]->IsObject()) { v8::Persistent<v8::Function> callback = FromV8Value(args[6]);
Window* window = Window::Unwrap<Window>(args[5]->ToObject());
if (!window || !window->window())
return node::ThrowError("Invalid window");
native_window = window->window();
}
v8::Persistent<v8::Function> callback;
if (args[6]->IsFunction()) {
callback = v8::Persistent<v8::Function>::New(
node_isolate,
v8::Local<v8::Function>::Cast(args[6]));
}
MessageBoxType type = (MessageBoxType)(args[0]->IntegerValue()); MessageBoxType type = (MessageBoxType)(args[0]->IntegerValue());
std::vector<std::string> buttons; std::vector<std::string> buttons;
v8::Handle<v8::Array> v8_buttons = v8::Handle<v8::Array>::Cast(args[1]); v8::Handle<v8::Array> v8_buttons = v8::Handle<v8::Array>::Cast(args[1]);
for (uint32_t i = 0; i < v8_buttons->Length(); ++i) for (uint32_t i = 0; i < v8_buttons->Length(); ++i)
buttons.push_back(*v8::String::Utf8Value(v8_buttons->Get(i))); buttons.push_back(FromV8Value(v8_buttons->Get(i)));
std::string title(*v8::String::Utf8Value(args[2])); std::string title = FromV8Value(args[2]);
std::string message(*v8::String::Utf8Value(args[3])); std::string message = FromV8Value(args[3]);
std::string detail(*v8::String::Utf8Value(args[4])); std::string detail = FromV8Value(args[4]);
if (callback.IsEmpty()) { if (callback.IsEmpty()) {
int chosen = atom::ShowMessageBox( int chosen = atom::ShowMessageBox(
@ -140,25 +158,12 @@ v8::Handle<v8::Value> ShowOpenDialog(const v8::Arguments &args) {
!args[2]->IsNumber()) // properties !args[2]->IsNumber()) // properties
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
NativeWindow* native_window = NULL; NativeWindow* native_window = FromV8Value(args[3]);
if (args[3]->IsObject()) { v8::Persistent<v8::Function> callback = FromV8Value(args[4]);
Window* window = Window::Unwrap<Window>(args[3]->ToObject());
if (!window || !window->window())
return node::ThrowError("Invalid window");
native_window = window->window(); std::string title = FromV8Value(args[0]);
} base::FilePath default_path = FromV8Value(args[1]);
int properties = FromV8Value(args[2]);
v8::Persistent<v8::Function> callback;
if (args[4]->IsFunction()) {
callback = v8::Persistent<v8::Function>::New(
node_isolate,
v8::Local<v8::Function>::Cast(args[4]));
}
std::string title(*v8::String::Utf8Value(args[0]));
base::FilePath default_path(V8ValueToFilePath(args[1]));
int properties = args[2]->IntegerValue();
if (callback.IsEmpty()) { if (callback.IsEmpty()) {
std::vector<base::FilePath> paths; std::vector<base::FilePath> paths;
@ -193,24 +198,11 @@ v8::Handle<v8::Value> ShowSaveDialog(const v8::Arguments &args) {
!args[1]->IsString()) // default_path !args[1]->IsString()) // default_path
return node::ThrowTypeError("Bad argument"); return node::ThrowTypeError("Bad argument");
NativeWindow* native_window = NULL; NativeWindow* native_window = FromV8Value(args[2]);
if (args[2]->IsObject()) { v8::Persistent<v8::Function> callback = FromV8Value(args[3]);
Window* window = Window::Unwrap<Window>(args[2]->ToObject());
if (!window || !window->window())
return node::ThrowError("Invalid window");
native_window = window->window(); std::string title = FromV8Value(args[0]);
} base::FilePath default_path = FromV8Value(args[1]);
v8::Persistent<v8::Function> callback;
if (args[3]->IsFunction()) {
callback = v8::Persistent<v8::Function>::New(
node_isolate,
v8::Local<v8::Function>::Cast(args[3]));
}
std::string title(*v8::String::Utf8Value(args[0]));
base::FilePath default_path(V8ValueToFilePath(args[1]));
if (callback.IsEmpty()) { if (callback.IsEmpty()) {
base::FilePath path; base::FilePath path;