+++ /dev/null
-[\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
--- /dev/null
+#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;
+}