#ifdef HAVE_CONFIG_H #include #endif #include namespace efl { namespace ethumb { namespace js { namespace { Ethumb_Exists* extract_ethumb_exists(v8::Local object) { return compatibility_get_pointer_internal_field(object, 0); } efl::eina::js::global_ref* extract_ethumb_exists_cb(v8::Local object) { return compatibility_get_pointer_internal_field *>(object, 1); } v8::Local wrap_ethumb_exists(Ethumb_Exists *exists, efl::eina::js::global_ref* cb, v8::Isolate *isolate) { using v8::String; using v8::Boolean; using v8::ObjectTemplate; using v8::FunctionTemplate; auto obj_tpl = compatibility_new(isolate); obj_tpl->SetInternalFieldCount(2); auto ret = obj_tpl->NewInstance(); auto cancel = [](compatibility_callback_info_type info) -> compatibility_return_type { if (info.Length() != 0) return compatibility_return(); auto exists = extract_ethumb_exists(info.This()); auto cb = extract_ethumb_exists_cb(info.This()); if (ethumb_client_thumb_exists_check(exists)) return compatibility_return(); delete cb; ethumb_client_thumb_exists_cancel(exists); return compatibility_return(); }; auto check = [](compatibility_callback_info_type info) -> compatibility_return_type { if (info.Length() != 0) return compatibility_return(); auto isolate = info.GetIsolate(); auto exists = extract_ethumb_exists(info.This()); auto ret = ethumb_client_thumb_exists_check(exists); return compatibility_return(compatibility_new(isolate, ret), info); }; ret->Set(compatibility_new(isolate, "cancel"), compatibility_new(isolate, cancel) ->GetFunction()); ret->Set(compatibility_new(isolate, "check"), compatibility_new(isolate, check) ->GetFunction()); compatibility_set_pointer_internal_field(ret, 0, exists); compatibility_set_pointer_internal_field(ret, 1, cb); return ret; } // ==================================================== Ethumb_Client_Async* extract_ethumb_client_async(v8::Local o) { return compatibility_get_pointer_internal_field(o, 0); } efl::eina::js::global_ref* extract_ethumb_client_async_cb(v8::Local object) { return compatibility_get_pointer_internal_field *>(object, 1); } Ethumb_Client* extract_ethumb_client_async_client(v8::Local o) { return compatibility_get_pointer_internal_field(o, 0); } v8::Local wrap_ethumb_client_async(Ethumb_Client_Async *request, efl::eina::js::global_ref* cb, Ethumb_Client *client, v8::Isolate *isolate) { using v8::String; using v8::Boolean; using v8::ObjectTemplate; using v8::FunctionTemplate; auto obj_tpl = compatibility_new(isolate); obj_tpl->SetInternalFieldCount(3); auto ret = obj_tpl->NewInstance(); auto cancel = [](compatibility_callback_info_type info) -> compatibility_return_type { if (info.Length() != 0) return compatibility_return(); auto request = extract_ethumb_client_async(info.This()); auto cb = extract_ethumb_client_async_cb(info.This()); auto client = extract_ethumb_client_async_client(info.This()); delete cb; ethumb_client_thumb_async_cancel(client, request); return compatibility_return(); }; ret->Set(compatibility_new(isolate, "cancel"), compatibility_new(isolate, cancel) ->GetFunction()); compatibility_set_pointer_internal_field(ret, 0, request); compatibility_set_pointer_internal_field(ret, 1, cb); compatibility_set_pointer_internal_field(ret, 2, client); return ret; } Ethumb_Client* extract_ethumb_client(v8::Local object) { return compatibility_get_pointer_internal_field(object, 0); } v8::Local wrap_ethumb_client(Ethumb_Client *client, v8::Isolate *isolate) { using v8::Integer; using v8::String; using v8::Boolean; using v8::Value; using v8::Object; using v8::ObjectTemplate; using v8::Handle; using v8::Function; using v8::FunctionTemplate; using std::unique_ptr; typedef efl::eina::js::global_ref persistent_t; auto obj_tpl = compatibility_new(isolate); obj_tpl->SetInternalFieldCount(1); auto ret = obj_tpl->NewInstance(); auto disconnect = [](compatibility_callback_info_type info) -> compatibility_return_type { if (info.Length() != 0) return compatibility_return(); ethumb_client_disconnect(extract_ethumb_client(info.This())); return compatibility_return(); }; auto on_server_die_callback_set = [](compatibility_callback_info_type info) -> compatibility_return_type { if (info.Length() != 1 || !info[0]->IsFunction()) return compatibility_return(); auto isolate = info.GetIsolate(); unique_ptr cb_data{new persistent_t(isolate, info[0])}; auto client = extract_ethumb_client(info.This()); auto server_die_cb = [](void *data, Ethumb_Client *client) { auto persistent = reinterpret_cast(data); auto o = persistent->handle(); auto isolate = v8::Isolate::GetCurrent(); Handle args{wrap_ethumb_client(client, isolate)}; Function::Cast(*o)->Call(o->ToObject(), 1, &args); }; auto free_data = [](void *data) { auto persistent = reinterpret_cast(data); delete persistent; }; ethumb_client_on_server_die_callback_set(client, server_die_cb, cb_data.release(), free_data); return compatibility_return(); }; auto file_set = [](compatibility_callback_info_type info) -> compatibility_return_type { if (info.Length() != 2 || !info[0]->IsString() || !info[1]->IsString()) return compatibility_return(); auto isolate = info.GetIsolate(); auto ret = ethumb_client_file_set(extract_ethumb_client(info.This()), *String::Utf8Value(info[0]), *String::Utf8Value(info[1])); return compatibility_return(compatibility_new(isolate, ret), info); }; auto file_get = [](compatibility_callback_info_type info) -> compatibility_return_type { if (info.Length() != 0) return compatibility_return(); auto isolate = info.GetIsolate(); auto ret = compatibility_new(isolate); const char *path; const char *key; ethumb_client_file_get(extract_ethumb_client(info.This()), &path, &key); ret->Set(compatibility_new(isolate, "path"), compatibility_new(isolate, path)); ret->Set(compatibility_new(isolate, "key"), compatibility_new(isolate, key)); return compatibility_return(ret, info); }; auto file_free = [](compatibility_callback_info_type info) -> compatibility_return_type { if (info.Length() != 0) return compatibility_return(); ethumb_client_file_free(extract_ethumb_client(info.This())); return compatibility_return(); }; auto thumb_exists = [](compatibility_callback_info_type info) -> compatibility_return_type { if (info.Length() != 1 || !info[0]->IsFunction()) return compatibility_return(); auto isolate = info.GetIsolate(); unique_ptr cb_data{new persistent_t(isolate, info[0])}; auto client = extract_ethumb_client(info.This()); auto exists_cb = [](void *data, Ethumb_Client *client, Ethumb_Exists *thread, Eina_Bool exists) { auto persistent = reinterpret_cast(data); auto o = persistent->handle(); auto isolate = v8::Isolate::GetCurrent(); Handle args[3] = { wrap_ethumb_client(client, isolate), wrap_ethumb_exists(thread, NULL, isolate), compatibility_new(isolate, exists) }; Function::Cast(*o)->Call(o->ToObject(), 3, args); delete persistent; }; auto ret = ethumb_client_thumb_exists(client, exists_cb, cb_data.get()); return compatibility_return(wrap_ethumb_exists(ret, cb_data.release(), isolate), info); }; auto generate = [](compatibility_callback_info_type info) -> compatibility_return_type { if (info.Length() != 1 || !info[0]->IsFunction()) return compatibility_return(); auto isolate = info.GetIsolate(); unique_ptr cb_data{new persistent_t(isolate, info[0])}; auto client = extract_ethumb_client(info.This()); auto generated_cb = [](void *data, Ethumb_Client *client, int id, const char *file, const char *key, const char *thumb_path, const char *thumb_key, Eina_Bool success) { auto persistent = reinterpret_cast(data); auto o = persistent->handle(); auto isolate = v8::Isolate::GetCurrent(); Handle args[7] = { wrap_ethumb_client(client, isolate), compatibility_new(isolate, id), compatibility_new(isolate, file), compatibility_new(isolate, key), compatibility_new(isolate, thumb_path), compatibility_new(isolate, thumb_key), compatibility_new(isolate, success) }; Function::Cast(*o)->Call(o->ToObject(), 7, args); }; auto free_data = [](void *data) { auto persistent = reinterpret_cast(data); delete persistent; }; auto ret = ethumb_client_generate(client, generated_cb, cb_data.release(), free_data); return compatibility_return(compatibility_new(isolate, ret), info); }; auto generate_cancel = [](compatibility_callback_info_type info) -> compatibility_return_type { if (info.Length() != 2 || !info[0]->IsNumber() || !info[1]->IsFunction()) { return compatibility_return(); } auto isolate = info.GetIsolate(); unique_ptr cb_data{new persistent_t(isolate, info[1])}; auto client = extract_ethumb_client(info.This()); auto cancel_cb = [](void *data, Eina_Bool success) { auto persistent = reinterpret_cast(data); auto o = persistent->handle(); auto isolate = v8::Isolate::GetCurrent(); Handle args{compatibility_new(isolate, success)}; Function::Cast(*o)->Call(o->ToObject(), 1, &args); }; auto free_data = [](void *data) { auto persistent = reinterpret_cast(data); delete persistent; }; ethumb_client_generate_cancel(client, info[0]->IntegerValue(), cancel_cb, cb_data.release(), free_data); return compatibility_return(); }; auto generate_cancel_all = [](compatibility_callback_info_type info) -> compatibility_return_type { if (info.Length() != 1 || !info[0]->IsFunction()) return compatibility_return(); auto client = extract_ethumb_client(info.This()); ethumb_client_generate_cancel_all(client); return compatibility_return(); }; auto thumb_async_get = [](compatibility_callback_info_type info) -> compatibility_return_type { if (info.Length() != 1 || !info[0]->IsFunction()) return compatibility_return(); auto isolate = info.GetIsolate(); unique_ptr cb_data{new persistent_t(isolate, info[0])}; auto client = extract_ethumb_client(info.This()); auto done_cb = [](Ethumb_Client *client, const char *thumb_path, const char *thumb_key, void *data) { auto persistent = reinterpret_cast(data); auto o = persistent->handle(); auto isolate = v8::Isolate::GetCurrent(); Handle args[3] = { wrap_ethumb_client(client, isolate), compatibility_new(isolate, thumb_path), compatibility_new(isolate, thumb_key) }; Function::Cast(*o)->Call(o->ToObject(), 3, args); delete persistent; }; auto error_cb = [](Ethumb_Client *client, void *data) { auto persistent = reinterpret_cast(data); auto o = persistent->handle(); auto isolate = v8::Isolate::GetCurrent(); Handle args{wrap_ethumb_client(client, isolate)}; Function::Cast(*o)->Call(o->ToObject(), 1, &args); delete persistent; }; auto ret = ethumb_client_thumb_async_get(client, done_cb, error_cb, cb_data.get()); auto wrapped_ret = wrap_ethumb_client_async(ret, cb_data.release(), client, isolate); return compatibility_return(wrapped_ret, info); }; ret->Set(compatibility_new(isolate, "disconnect"), compatibility_new(isolate, disconnect) ->GetFunction()); ret->Set(compatibility_new(isolate, "setOnServerDieCallback"), compatibility_new(isolate, on_server_die_callback_set) ->GetFunction()); ret->Set(compatibility_new(isolate, "setFile"), compatibility_new(isolate, file_set) ->GetFunction()); ret->Set(compatibility_new(isolate, "getFile"), compatibility_new(isolate, file_get) ->GetFunction()); ret->Set(compatibility_new(isolate, "freeFile"), compatibility_new(isolate, file_free) ->GetFunction()); ret->Set(compatibility_new(isolate, "existsThumb"), compatibility_new(isolate, thumb_exists) ->GetFunction()); ret->Set(compatibility_new(isolate, "generate"), compatibility_new(isolate, generate) ->GetFunction()); ret->Set(compatibility_new(isolate, "cancelGenerate"), compatibility_new(isolate, generate_cancel) ->GetFunction()); ret->Set(compatibility_new(isolate, "cancelAllGenerate"), compatibility_new(isolate, generate_cancel_all) ->GetFunction()); ret->Set(compatibility_new(isolate, "getThumbAsync"), compatibility_new(isolate, thumb_async_get) ->GetFunction()); compatibility_set_pointer_internal_field(ret, 0, client); return ret; } EAPI void register_client_init(v8::Isolate *isolate, v8::Handle global, v8::Handle name) { using v8::Integer; using v8::FunctionTemplate; auto init = [](compatibility_callback_info_type args) -> compatibility_return_type { if (args.Length() != 0) return compatibility_return(); auto isolate = args.GetIsolate(); auto ret = ethumb_client_init(); return compatibility_return(compatibility_new(isolate, ret), args); }; global->Set(name, compatibility_new(isolate, init) ->GetFunction()); } EAPI void register_client_shutdown(v8::Isolate *isolate, v8::Handle global, v8::Handle name) { using v8::Integer; using v8::FunctionTemplate; auto shutdown = [](compatibility_callback_info_type args) -> compatibility_return_type { if (args.Length() != 0) return compatibility_return(); auto isolate = args.GetIsolate(); auto ret = ethumb_client_shutdown(); return compatibility_return(compatibility_new(isolate, ret), args); }; global->Set(name, compatibility_new(isolate, shutdown) ->GetFunction()); } EAPI void register_client_connect(v8::Isolate *isolate, v8::Handle global, v8::Handle name) { using v8::Integer; using v8::Boolean; using v8::Value; using v8::FunctionTemplate; using v8::Function; using v8::Handle; using std::unique_ptr; typedef efl::eina::js::global_ref persistent_t; auto shutdown = [](compatibility_callback_info_type args) -> compatibility_return_type { if (args.Length() != 1 || !args[0]->IsFunction()) return compatibility_return(); auto isolate = args.GetIsolate(); unique_ptr cb_data{new persistent_t(isolate, args[0])}; auto connect_cb = [](void *data, Ethumb_Client *client, Eina_Bool success) { auto persistent = reinterpret_cast(data); auto o = persistent->handle(); auto isolate = v8::Isolate::GetCurrent(); Handle args[2] = { wrap_ethumb_client(client, isolate), compatibility_new(isolate, success) }; Function::Cast(*o)->Call(o->ToObject(), 2, args); }; auto free_data = [](void *data) { auto persistent = reinterpret_cast(data); delete persistent; }; auto ret = ethumb_client_connect(connect_cb, cb_data.release(), free_data); return compatibility_return(wrap_ethumb_client(ret, isolate), args); }; global->Set(name, compatibility_new(isolate, shutdown) ->GetFunction()); } } EAPI void register_ethumb(v8::Isolate *isolate, v8::Handle exports) { using v8::String; auto ethumbNamespace = efl::eo::js::get_namespace({"Ethumb"}, isolate, exports); register_client_init(isolate, ethumbNamespace, compatibility_new(isolate, "initClient")); register_client_shutdown(isolate, ethumbNamespace, compatibility_new(isolate, "shutdownClient")); register_client_connect(isolate, ethumbNamespace, compatibility_new(isolate, "connectClient")); } } } } // namespace efl { namespace ethumb { namespace js {