3 #include "xwalk_extension_client.h"
5 #include "extension_adapter.h"
6 #include "extension_manager.h"
8 #define RETURN_IF_NULL(x) \
11 LOGW("%s is NULL", #x); \
15 using namespace wrt::xwalk;
20 void XWalkExtensionClient::ListenerAdapter::PostMessageToJS(const std::string& msg){
22 handler_->HandleMessageFromNative(msg);
25 void XWalkExtensionClient::ListenerAdapter::PostDataToJS(const std::string& msg, uint8_t* buffer, size_t len) {
27 handler_->HandleMessageFromNative(msg, buffer, len);
30 XWalkExtensionClient::XWalkExtensionClient() {
33 XWalkExtensionClient::~XWalkExtensionClient() {
34 for (auto itr = extension_apis_.begin(); itr != extension_apis_.end(); ++itr) {
39 XWalkExtensionClient::ExtensionCodePoints::ExtensionCodePoints(
40 Extension* extension) : extension_(extension) {
41 entry_points_ = extension->entry_points();
44 XWalkExtensionClient::ExtensionCodePoints::~ExtensionCodePoints() {
47 std::string XWalkExtensionClient::ExtensionCodePoints::api() {
48 return extension_->javascript_api();
51 int64_t XWalkExtensionClient::CreateInstance(const std::string& extension_name, InstanceHandler* handler) {
52 LOGD("Extension CreateInstance: [%s]", extension_name.c_str());
54 ExtensionMap& map = ExtensionManager::GetInstance()->extensions();
55 if (map.find(extension_name) == map.end()) {
56 LOGE("Can't find extension name %s", extension_name.c_str());
60 Extension* extention = map[extension_name];
61 ExtensionInstance *instance = extention->CreateInstance();
62 std::shared_ptr<ListenerAdapter> listener(new ListenerAdapter(handler));
63 instance->set_post_message_listener(listener.get());
64 instance->set_post_data_listener(listener.get());
66 ExtensionAdapter::GetInstance()->RegisterInstance(instance);
67 int64_t instance_id = instance->xw_instance();
68 listeners_[instance_id] = listener;
72 void XWalkExtensionClient::DestroyInstance(int64_t instance_id) {
73 ExtensionInstance* instance = ExtensionAdapter::GetExtensionInstance(instance_id);
74 RETURN_IF_NULL(instance);
75 listeners_[instance_id].reset();
76 listeners_.erase(instance_id);
80 void XWalkExtensionClient::PostMessageToNative(int64_t instance_id, const std::string& msg) {
81 ExtensionInstance* instance = ExtensionAdapter::GetExtensionInstance(instance_id);
82 RETURN_IF_NULL(instance);
83 instance->HandleMessage(msg);
86 void XWalkExtensionClient::PostMessageToNative(int64_t instance_id, const std::string& msg, unsigned char* buffer, std::size_t len) {
87 ExtensionInstance* instance = ExtensionAdapter::GetExtensionInstance(instance_id);
88 RETURN_IF_NULL(instance);
89 instance->HandleData(msg, buffer, len);
92 std::string XWalkExtensionClient::SendSyncMessageToNative(int64_t instance_id, const std::string& msg) {
93 ExtensionInstance* instance = ExtensionAdapter::GetExtensionInstance(instance_id);
94 RETURN_IF_NULL(instance);
95 instance->HandleSyncMessage(msg);
96 return instance->sync_replay_msg();
99 std::string XWalkExtensionClient::SendSyncMessageToNative(int64_t instance_id,
100 const std::string& msg,
101 unsigned char* buffer,
103 unsigned char** outbuffer,
104 std::size_t* outlen) {
105 ExtensionInstance* instance = ExtensionAdapter::GetExtensionInstance(instance_id);
106 RETURN_IF_NULL(instance);
107 instance->HandleSyncData(msg, buffer, len);
108 return instance->sync_data_reply_msg(outbuffer, outlen);
112 void XWalkExtensionClient::Initialize() {
113 LOGD("========== << Initialize >> ENTER ==========");
114 extension_apis_.clear();
115 ExtensionManager::GetInstance()->RegisterExtensionsByMetadata(this);
116 ExtensionMap& map = ExtensionManager::GetInstance()->extensions();
117 for (auto itr = map.begin(); itr != map.end(); ++itr) {
118 std::string name = itr->first;
119 Extension* extension = itr->second;
120 ExtensionCodePoints* code = new ExtensionCodePoints(extension);
121 extension_apis_.insert(std::make_pair(name, code));
123 LOGD("========== << Initialize >> END ==========");
126 const std::string XWalkExtensionClient::GetRuntimeVariable(const std::string& key) const{
130 void XWalkExtensionClient::UpdateRuntimeVariable(const std::string& key, const std::string& value){
131 rv_map_[key] = value;