--- /dev/null
+/*\r
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include <dlog/dlog.h>\r
+#include <map>\r
+#include <unistd.h>\r
+#include <v8.h>\r
+#include <node.h>\r
+#include "nmt.h"\r
+#include "translator.h"\r
+\r
+#ifdef LOG_TAG\r
+#undef LOG_TAG\r
+#endif\r
+#define LOG_TAG "WRT_SERVICE_NMT"\r
+\r
+using namespace node;\r
+using namespace v8;\r
+using namespace std;\r
+using namespace SrOnDeviceNmt;\r
+\r
+namespace wrt {\r
+namespace service {\r
+\r
+static void logd(const char* tag, const char* format, ...){\r
+ va_list args;\r
+ va_start(args, format);\r
+ LOG_VA(LOG_DEBUG, tag, format, args);\r
+ va_end(args);\r
+}\r
+\r
+static NMT *_nmt = NULL;\r
+static Translator translator;\r
+\r
+static map<string,pair<string, string>> model_list = {\r
+ {"bg", {"Bulgarian", "rmE8Va3gon"}},\r
+ {"cs", {"Czech", "o9i8ZKUGk4"}},\r
+ {"de", {"German", "cwzIAj3oJT"}},\r
+ {"es", {"Spanish", "4KKRqmCg5x"}},\r
+ {"fr", {"French", "0HEUtxuBp6"}},\r
+ {"it", {"Italian", "6io0TjUf1z"}},\r
+ {"ko", {"Korean", "UkFnQa8EAT"}},\r
+ {"nl", {"Dutch", "bjPxXxwt5E"}},\r
+ {"pl", {"Polish", "wgjC6UsLUJ"}},\r
+ {"pt", {"Portuguese", "356EJyAM9o"}},\r
+ {"ru", {"Russian", "mq7ZH7ehh0"}},\r
+ {"zh", {"Chinese", "OJ981RFTyA"}},\r
+};\r
+\r
+NMT::NMT(){\r
+}\r
+\r
+NMT::~NMT(){\r
+};\r
+\r
+void NMT::Init(){\r
+ logd(LOG_TAG, __PRETTY_FUNCTION__);\r
+}\r
+\r
+void NMT::Uninit(){\r
+ logd(LOG_TAG, __PRETTY_FUNCTION__);\r
+}\r
+\r
+void NMT::SetPath(){\r
+ logd(LOG_TAG, __PRETTY_FUNCTION__);\r
+ vector<string> data_paths;\r
+ for(map<string,pair<string, string>>::iterator iter = model_list.begin(); iter != model_list.end(); ++iter ){\r
+ string modelPath = "/opt/usr/globalapps/" + iter->second.second + "/shared/res/assets";\r
+ if(access(modelPath.c_str(), 0) != -1)\r
+ data_paths.push_back(modelPath);\r
+ }\r
+ translator.setPath(data_paths);\r
+}\r
+\r
+static void NMTinit(const FunctionCallbackInfo<Value>& /*args*/){\r
+ logd(LOG_TAG, __PRETTY_FUNCTION__);\r
+ if (_nmt == NULL) {\r
+ _nmt = new NMT();\r
+ }\r
+ _nmt->Init();\r
+ _nmt->SetPath();\r
+}\r
+\r
+static void NMTuninit(const FunctionCallbackInfo<Value>& /*args*/){\r
+ logd(LOG_TAG, __PRETTY_FUNCTION__);\r
+ if (_nmt != NULL) {\r
+ _nmt->Uninit();\r
+ delete _nmt;\r
+ _nmt = NULL;\r
+ }\r
+}\r
+\r
+static void NMTsetPath(const FunctionCallbackInfo<Value>& args){\r
+ logd(LOG_TAG, __PRETTY_FUNCTION__);\r
+ if (_nmt == NULL) {\r
+ _nmt = new NMT();\r
+ _nmt->Init();\r
+ }\r
+ Isolate* isolate = args.GetIsolate();\r
+ HandleScope scope(isolate);\r
+ _nmt->SetPath();\r
+ args.GetReturnValue().Set(Undefined(isolate));\r
+\r
+}\r
+\r
+static void NMTtranslate(const FunctionCallbackInfo<Value>& args){\r
+ logd(LOG_TAG, __PRETTY_FUNCTION__);\r
+ if (_nmt == NULL) {\r
+ _nmt = new NMT();\r
+ _nmt->Init();\r
+ }\r
+ Isolate* isolate = args.GetIsolate();\r
+ HandleScope scope(isolate);\r
+ if(args.Length() != 3 || !args[0]->IsString() || !args[1]->IsString() || !args[2]->IsString()) {\r
+ logd(LOG_TAG, "Invalid Argument");\r
+ return;\r
+ }\r
+\r
+ string str0(*String::Utf8Value(isolate, args[0]));\r
+ string str1(*String::Utf8Value(isolate, args[1]));\r
+ string str2(*String::Utf8Value(isolate, args[2]));\r
+\r
+ string transResult = translator.translate(str0, str1, str2);\r
+ args.GetReturnValue().Set(String::NewFromUtf8(isolate, transResult.c_str()).ToLocalChecked());\r
+}\r
+\r
+static void NMTgetAvailableSourceLanguageList(const FunctionCallbackInfo<Value>& args){\r
+ logd(LOG_TAG, __PRETTY_FUNCTION__);\r
+ if (_nmt == NULL) {\r
+ _nmt = new NMT();\r
+ _nmt->Init();\r
+ }\r
+ Isolate* isolate = args.GetIsolate();\r
+ HandleScope scope(isolate);\r
+\r
+ vector<string> sourcelist = translator.getAvailableSourceLanguageList();\r
+ if (sourcelist.size()) {\r
+ Local<Array> array = Array::New(isolate, sourcelist.size());\r
+ int idx = 0;\r
+ for (auto it = sourcelist.begin(); it != sourcelist.end(); ++it) {\r
+ array->Set(isolate->GetCurrentContext(), Integer::New(isolate, idx++), String::NewFromUtf8(isolate, it->c_str()).ToLocalChecked());\r
+ }\r
+ args.GetReturnValue().Set(array);\r
+ }\r
+ else {\r
+ logd(LOG_TAG, "Invalid Result");\r
+ args.GetReturnValue().Set(Undefined(isolate));\r
+ }\r
+}\r
+\r
+static void NMTgetAvailableTargetLanguageList(const FunctionCallbackInfo<Value>& args){\r
+ logd(LOG_TAG, __PRETTY_FUNCTION__);\r
+ if (_nmt == NULL) {\r
+ _nmt = new NMT();\r
+ _nmt->Init();\r
+ }\r
+ Isolate* isolate = args.GetIsolate();\r
+ HandleScope scope(isolate);\r
+ if(args.Length() != 1 || !args[0]->IsString()) {\r
+ logd(LOG_TAG, "Invalid Argument");\r
+ return;\r
+ }\r
+\r
+ string str(*String::Utf8Value(isolate, args[0]));\r
+ vector<string> targetlist = translator.getAvailableTargetLanguageList(str);\r
+ if (targetlist.size()) {\r
+ Local<Array> array = Array::New(isolate, targetlist.size());\r
+ int idx = 0;\r
+ for (auto it = targetlist.begin(); it != targetlist.end(); ++it) {\r
+ array->Set(isolate->GetCurrentContext(), Integer::New(isolate, idx++), String::NewFromUtf8(isolate, it->c_str()).ToLocalChecked());\r
+ }\r
+ args.GetReturnValue().Set(array);\r
+ }\r
+ else {\r
+ logd(LOG_TAG, "Invalid Result");\r
+ args.GetReturnValue().Set(Undefined(isolate));\r
+ }\r
+}\r
+\r
+static void NMTisDirectionAvailable(const FunctionCallbackInfo<Value>& args){\r
+ logd(LOG_TAG, __PRETTY_FUNCTION__);\r
+ if (_nmt == NULL) {\r
+ _nmt = new NMT();\r
+ _nmt->Init();\r
+ }\r
+ Isolate* isolate = args.GetIsolate();\r
+ HandleScope scope(isolate);\r
+ if(args.Length() != 2 || !args[0]->IsString() || !args[1]->IsString()) {\r
+ logd(LOG_TAG, "Invalid Argument");\r
+ return;\r
+ }\r
+\r
+ string str0(*String::Utf8Value(isolate, args[0]));\r
+ string str1(*String::Utf8Value(isolate, args[1]));\r
+ int avail = translator.isDirectionAvailable(str0, str1);\r
+ args.GetReturnValue().Set(avail);\r
+\r
+}\r
+\r
+static void NMTgetModelList(const FunctionCallbackInfo<Value>& args){\r
+ logd(LOG_TAG, __PRETTY_FUNCTION__);\r
+ if (_nmt == NULL) {\r
+ _nmt = new NMT();\r
+ _nmt->Init();\r
+ }\r
+ Isolate* isolate = args.GetIsolate();\r
+ HandleScope scope(isolate);\r
+\r
+ if (model_list.size()) {\r
+ string modelListResult, modelData;\r
+ for (auto it = model_list.begin(); it != model_list.end(); ++it) {\r
+ if (it != model_list.begin())\r
+ modelData = modelData + ",";\r
+ modelData = modelData + "{\"model\":\""+it->first+"\",\"name\":\""+it->second.first+"\",\"pkgId\":\""+it->second.second+"\"}";\r
+ }\r
+ modelListResult = "{\"modelList\":[" +modelData + "]}";\r
+ args.GetReturnValue().Set(String::NewFromUtf8(isolate, modelListResult.c_str()).ToLocalChecked());\r
+ }\r
+ else {\r
+ logd(LOG_TAG, "Invalid Result");\r
+ args.GetReturnValue().Set(Undefined(isolate));\r
+ }\r
+}\r
+\r
+\r
+static void init(Handle<Object> target) {\r
+ NODE_SET_METHOD(target, "init", NMTinit);\r
+ NODE_SET_METHOD(target, "uninit", NMTuninit);\r
+ NODE_SET_METHOD(target, "setPath", NMTsetPath);\r
+ NODE_SET_METHOD(target, "translate", NMTtranslate);\r
+ NODE_SET_METHOD(target, "getAvailableSourceLanguageList", NMTgetAvailableSourceLanguageList);\r
+ NODE_SET_METHOD(target, "getAvailableTargetLanguageList", NMTgetAvailableTargetLanguageList);\r
+ NODE_SET_METHOD(target, "isDirectionAvailable", NMTisDirectionAvailable);\r
+ NODE_SET_METHOD(target, "getModelList", NMTgetModelList);\r
+}\r
+\r
+NODE_MODULE(nmt, init);\r
+\r
+} // namespace service\r
+} // namespace wrt\r