Add json generator for plugins description.
authorpius.lee <pius.lee@samsung.com>
Wed, 8 Jul 2015 13:14:48 +0000 (22:14 +0900)
committerpius.lee <pius.lee@samsung.com>
Wed, 8 Jul 2015 13:17:20 +0000 (22:17 +0900)
This generator make json file for lazy loading in build time.

Change-Id: I8e593440977d3dd1cad623be9be13cb31f51d8d6

packaging/webapi-plugins.spec
plugins.json [deleted file]
src/tizen-wrt.gyp
src/tool/desc_gentool.cc [new file with mode: 0644]
src/tool/tool.gyp [new file with mode: 0644]

index e352840178235f0d62684e263938bac96e6043ca..91d19d765855d9c9bc12c087a36bd019cc7f4231 100755 (executable)
@@ -551,12 +551,13 @@ mkdir -p %{buildroot}%{ringtones_directory}
 cp res/tvsounds/*.pcm %{buildroot}%{ringtones_directory}
 %endif
 
-# temporary plugins description for lazy loading
+# execute desc_gentool
+LD_LIBRARY_PATH=$LD_LIBRARY_PATH:%{buildroot}%{_libdir}/%{crosswalk_extensions} out/Default/desc_gentool %{buildroot}%{_libdir}/%{crosswalk_extensions} > plugins.json
 
+# temporary plugins description for lazy loading
 install -p -m 644 plugins.json %{buildroot}%{_libdir}/%{crosswalk_extensions}/plugins.json
 
 
-
 %files
 %{_libdir}/%{crosswalk_extensions}/libtizen*.so
 %{_libdir}/%{crosswalk_extensions}/plugins.json
diff --git a/plugins.json b/plugins.json
deleted file mode 100644 (file)
index f727094..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-[\r
-       {"name":"tizen",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.time",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_time.so",\r
-        "entry_points":["tizen.TZDate", "tizen.TimeDuration"]\r
-       },\r
-       {"name":"tizen.application",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_application.so",\r
-        "entry_points":["tizen.ApplicationControl", "tizen.ApplicationControlData"]\r
-       },\r
-       {"name":"tizen.account",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_account.so",\r
-        "entry_points":["tizen.Account"]\r
-       },\r
-       {"name":"tizen.alarm",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_alarm.so",\r
-        "entry_points":["tizen.AlarmRelative", "tizen.AlarmAbsolute"]\r
-       },\r
-       {"name":"tizen.archive",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_archive.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.badge",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_badge.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.bluetooth",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_bluetooth.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.bookmark",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_bookmark.so",\r
-        "entry_points":["tizen.BookmarkItem", "tizen.BookmarkFolder"]\r
-       },\r
-       {"name":"tizen.calendar",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_calendar.so",\r
-        "entry_points":["tizen.Calendar", "tizen.CalendarEventId", "tizen.CalendarEvent", "tizen.CalendarTask", "tizen.CalendarAlarm", "tizen.CalendarAttendee", "tizen.CalendarRecurrenceRule"]\r
-       },\r
-       {"name":"tizen.callhistory",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_callhistory.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.contact",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_contact.so",\r
-        "entry_points":["tizen.ContactRef", "tizen.ContactName", "tizen.ContactOrganization", "tizen.ContactWebSite", "tizen.ContactAnniversary", "tizen.ContactAddress",\r
-         "tizen.ContactPhoneNumber", "tizen.ContactEmailAddress", "tizen.ContactGroup", "tizen.ContactRelationship", "tizen.ContactInstantMessenger", "tizen.Contact", "tizen.AddressBook"]\r
-       },\r
-       {"name":"tizen.content",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_content.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.datacontrol",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_datacontrol.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.download",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_download.so",\r
-        "entry_points":["tizen.DownloadRequest"]\r
-       },\r
-       {"name":"tizen.exif",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_exif.so",\r
-        "entry_points":["tizen.ExifInformation"]\r
-       },\r
-       {"name":"tizen.filesystem",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_filesystem.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.fmradio",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_fmradio.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.humanactivitymonitor",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_humanactivitymonitor.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.keymanager",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_keymanager.so",\r
-        "entry_points":["tizen.Key", "tizen.Data", "tizen.Certificate"]\r
-       },\r
-       {"name":"tizen.mediacontroller",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_mediacontroller.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.mediakey",\r
-       "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_mediakey.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.messageport",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_messageport.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.messaging",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_messaging.so",\r
-        "entry_points":["tizen.Message", "tizen.MessageAttachment"]\r
-       },\r
-       {"name":"tizen.networkbearerselection",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_networkbearerselection.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.nfc",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_notification.so",\r
-        "entry_points":["tizen.NDEFMessage", "tizen.NDEFRecord", "tizen.NDEFRecordText", "tizen.NDEFRecordURI", "tizen.NDEFRecordMedia"]\r
-       },\r
-       {"name":"tizen.notification",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_notification.so",\r
-        "entry_points":["tizen.StatusNotification", "tizen.NotificationDetailInfo"]\r
-       },\r
-       {"name":"tizen.package",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_package.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.power",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_power.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.push",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_push.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.seService",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_secureelement.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.sensorservice",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_sensor.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.sound",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_sound.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.systeminfo",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_systeminfo.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.systemsetting",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_systemsetting.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"xwalk.utils",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_utils.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.websetting",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_websetting.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.inputdevice",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_inputdevice.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.tvaudio",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_tvaudio.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.tvchannel",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_tvchannel.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.tvdisplay",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_tvdisplay.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.tvinputdevice",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_tvinputdevice.so",\r
-        "entry_points":[]\r
-       },\r
-       {"name":"tizen.tvwindow",\r
-        "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_tvwindow.so",\r
-        "entry_points":[]\r
-       }\r
-]\r
index d305aaf1bc419fa47f0a8972a201bf15994614ad..7b0e7ef67d1fa64cfa6122c3fe63b928cd9b4f8a 100755 (executable)
@@ -8,6 +8,7 @@
       'target_name': 'build_all_tizen_extensions',
       'type': 'none',
       'dependencies': [
+        'tool/tool.gyp:*',
         'common/common.gyp:*',
         'tizen/tizen.gyp:*',
         'utils/utils.gyp:*',
diff --git a/src/tool/desc_gentool.cc b/src/tool/desc_gentool.cc
new file mode 100644 (file)
index 0000000..d9986ff
--- /dev/null
@@ -0,0 +1,197 @@
+#include <iostream>
+#include <string>
+#include <vector>
+#include <map>
+#include <functional>
+
+#include <dlfcn.h>
+#include <dirent.h>
+
+#include <common/extension.h>
+
+static std::string prefix_ = "libtizen";
+static std::string postfix_ = ".so";
+static std::string target_path_ = "/usr/lib/tizen-extensions-crosswalk/";
+
+typedef common::Extension *(*CreateExtensionFunc)(void);
+
+struct module_description {
+  std::string name;
+  std::string lib;
+  std::vector<std::string> entries;
+};
+
+
+static XW_Extension ext = 0;
+static std::map<XW_Extension, module_description> descriptions;
+
+#ifndef JSON_MINIFY
+  #define PRINT_TAB() std::cout << "\t"
+#else
+  #define PRINT_TAB()
+#endif 
+
+void print_json() {
+  std::cout << "[" << std::endl;
+  for (const auto& kv : descriptions) {
+    const module_description &desc = kv.second;
+    PRINT_TAB();
+    std::cout << "{" << std::endl;
+    PRINT_TAB();
+    PRINT_TAB();
+    std::cout << "\"name\":\"" << desc.name << "\"," << std::endl;
+    PRINT_TAB();
+    PRINT_TAB();
+    std::cout << "\"lib\":\"" << desc.lib << "\"," << std::endl;
+    PRINT_TAB();
+    PRINT_TAB();
+    std::cout << "\"entry_points\": [";
+    for (std::vector<std::string>::size_type i=0; i<desc.entries.size(); i++) {
+      if (i != 0) {
+        std::cout << ",";
+      }
+      std::cout << "\"" << desc.entries[i] << "\"";
+    }
+    std::cout << "]" << std::endl;
+    PRINT_TAB();
+    std::cout << "}";
+    if (kv.first != ext) {
+      std::cout << ",";
+    }
+    std::cout << std::endl;
+  }
+  std::cout << "]" << std::endl;
+}
+
+const void* get_interface(const char* name) {
+  if (!strcmp(name, XW_CORE_INTERFACE_1)) {
+    static const XW_CoreInterface coreInterface1 = {
+      [](XW_Extension extension, const char* name) {
+        module_description *desc = &descriptions[extension];
+        desc->name = name;
+      },
+      [](XW_Extension extension, const char* api) {},
+      [](XW_Extension extension, XW_CreatedInstanceCallback created,
+         XW_DestroyedInstanceCallback destroyed) {},
+      [](XW_Extension extension, XW_ShutdownCallback shutdown_callback) {},
+      [](XW_Instance instance, void* data) {},
+      [](XW_Instance instance) -> void* { return nullptr; }
+      };
+    return &coreInterface1;
+  }
+
+  if (!strcmp(name, XW_INTERNAL_ENTRY_POINTS_INTERFACE_1)) {
+    static const XW_Internal_EntryPointsInterface entryPointsInterface1 = {
+      [](XW_Extension extension, const char** entries) {
+        module_description *desc = &descriptions[extension];
+        for (int i=0; entries[i]; i++) {
+          desc->entries.push_back(std::string(entries[i]));
+        }
+      }
+    };
+    return &entryPointsInterface1;
+  }
+  
+  if (!strcmp(name, XW_MESSAGING_INTERFACE_1)) {
+    static const XW_MessagingInterface_1 messagingInterface1 = {
+      [](XW_Extension extension, XW_HandleMessageCallback handle_message) {
+      },
+      [](XW_Instance instance, const char* message) {
+      }
+    };
+    return &messagingInterface1;
+  }
+
+  if (!strcmp(name, XW_INTERNAL_SYNC_MESSAGING_INTERFACE_1)) {
+    static const XW_Internal_SyncMessagingInterface syncMessagingInterface1 = {
+      [](XW_Extension extension, XW_HandleSyncMessageCallback handle_sync_msg) {
+      },
+      [](XW_Instance instance, const char* reply){
+      }
+    };
+    return &syncMessagingInterface1;
+  }
+
+  if (!strcmp(name, XW_INTERNAL_RUNTIME_INTERFACE_1)) {
+    static const XW_Internal_RuntimeInterface_1 runtimeInterface1 = {
+      [](XW_Extension extension, const char* key, char* value, size_t vlen) {
+      }
+    };
+    return &runtimeInterface1;
+  }
+
+  if (!strcmp(name, XW_INTERNAL_PERMISSIONS_INTERFACE_1)) {
+    static const XW_Internal_PermissionsInterface_1 permissionsInterface1 = {
+      [](XW_Extension extension, const char* api_name) -> int {
+        return XW_ERROR;
+      },
+      [](XW_Extension extension, const char* perm_table) -> int {
+        return XW_ERROR;
+      }
+    };
+    return &permissionsInterface1;
+  }
+
+  LOGW("Interface '%s' is not supported.", name);
+  return NULL;
+}
+
+int main(int argc, char* argv[]) {
+  if (argc < 2) {
+    std::cerr << "Need tizen crosswalk path" << std::endl;
+    return -1;
+  }
+  std::string tce_path = argv[1];
+  
+  if (tce_path.empty()) {
+    std::cerr << "Invalid tizen crosswalk path" << std::endl;
+    return -1;
+  }
+
+  DIR * dir;
+  struct dirent *ent;
+  if ((dir = opendir(tce_path.c_str())) != NULL) {
+    while ((ent = readdir(dir)) != NULL) {
+      std::string fname = ent->d_name;
+
+      if (fname.size() > prefix_.size() + postfix_.size() &&
+          !fname.compare(0, prefix_.size(), prefix_) &&
+          !fname.compare(fname.size() - postfix_.size(), postfix_.size(),
+                        postfix_)) {
+        std::string so_path = tce_path + "/" + fname;
+        char* error;
+        void *handle = dlopen(so_path.c_str(), RTLD_LAZY);
+        if ((error = dlerror()) != NULL) {
+          std::cerr << "cannot open " << so_path << std::endl;
+          std::cerr << "Error >>" << error << std::endl;
+          return -1;
+        }
+
+        XW_Initialize_Func initialize = reinterpret_cast<XW_Initialize_Func>(
+                dlsym(handle, "XW_Initialize"));
+
+        if (!initialize) {
+          std::cerr << "Can not loading extension " << fname << std::endl;
+        } else {
+          ext++;
+          descriptions[ext] = module_description();
+          descriptions[ext].lib = target_path_ + fname;
+          int ret = initialize(ext, get_interface);
+          if (ret != XW_OK) {
+            std::cerr << "Error loading extension " << fname << std::endl;
+          }
+        }
+
+        dlclose(handle);
+      }
+    }
+    closedir(dir);
+
+    print_json();
+  } else {
+    std::cerr << "path not exist : " << tce_path << std::endl;
+    return -1;
+  }
+
+  return 0;
+}
diff --git a/src/tool/tool.gyp b/src/tool/tool.gyp
new file mode 100644 (file)
index 0000000..384c34c
--- /dev/null
@@ -0,0 +1,25 @@
+{
+    'target_defaults': {
+        'variables': {'packages': ['dlog']},
+        'includes': [
+            '../common/pkg-config.gypi'
+        ]
+    },
+    'targets' : [
+        {
+            'target_name': 'desc_gentool',
+            'cflags': [
+                '-std=c++0x',
+                '-Wall'
+            ],
+            'link_settings': {'libraries': [ '-ldl'], },
+            'include_dirs': [
+                '../'
+            ],
+            'type': 'executable',
+            'sources': [
+                'desc_gentool.cc'
+            ]
+        }
+    ]
+}