#include "bundle/extension_client.h"
+#include <unistd.h>
#include <glib.h>
#include <gio/gio.h>
#include <string>
return ret;
}
-void ExtensionClient::Initialize(const std::string& uuid) {
- // Connect to DBusServer for ExtensionServer
- if (dbus_extension_client_.ConnectByName(
- uuid + "." + std::string(kDBusNameForExtension))) {
- using std::placeholders::_1;
- using std::placeholders::_2;
- dbus_extension_client_.SetSignalCallback(
- kDBusInterfaceNameForExtension,
- std::bind(&ExtensionClient::HandleSignal, this, _1, _2));
- } else {
+bool ExtensionClient::Initialize(const std::string& uuid) {
+ // Retry connecting to ExtensionServer
+ // ExtensionServer can not be ready at this time yet.
+ const int retry_max = 20;
+ bool connected = false;
+ for (int i=0; i < retry_max; i++) {
+ connected = dbus_extension_client_.ConnectByName(
+ uuid + "." + std::string(kDBusNameForExtension));
+ if (connected) break;
+ LOGGER(WARN) << "Failed to connect to ExtensionServer. retry "
+ << (i+1) << "/" << retry_max;
+ usleep(50*1000);
+ }
+
+ if (!connected) {
LOGGER(ERROR) << "Failed to connect to the dbus server for Extension.";
- return;
+ return false;
}
+ // Set signal handler
+ using std::placeholders::_1;
+ using std::placeholders::_2;
+ dbus_extension_client_.SetSignalCallback(
+ kDBusInterfaceNameForExtension,
+ std::bind(&ExtensionClient::HandleSignal, this, _1, _2));
+
// get extensions from ExtensionServer
GVariant* value = dbus_extension_client_.Call(
kDBusInterfaceNameForExtension, kMethodGetExtensions,
if (!value) {
LOGGER(ERROR) << "Failed to get extension list from ExtensionServer.";
- return;
+ return false;
}
gchar* name;
}
g_variant_unref(value);
+
+ return true;
}
void ExtensionClient::HandleSignal(
std::string SendSyncMessageToNative(const std::string& instance_id,
const std::string& msg);
- void Initialize(const std::string& uuid);
+ bool Initialize(const std::string& uuid);
struct ExtensionCodePoints {
std::string api;
ModuleSystem::ResetModuleSystemFromContext(context);
}
-void ExtensionRendererController::InitializeExtensions(
+bool ExtensionRendererController::InitializeExtensions(
const std::string& uuid) {
- extensions_client_->Initialize(uuid);
+ return extensions_client_->Initialize(uuid);
}
} // namespace wrt
void DidCreateScriptContext(v8::Handle<v8::Context> context);
void WillReleaseScriptContext(v8::Handle<v8::Context> context);
- void InitializeExtensions(const std::string& uuid);
+ bool InitializeExtensions(const std::string& uuid);
private:
ExtensionRendererController();
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <unistd.h>
#include <v8.h>
#include <ewk_ipc_message.h>
#include <string>
wrt::ExtensionRendererController& controller =
wrt::ExtensionRendererController::GetInstance();
- // TODO(wy80.choi): Temporarily, uuid is passed as theme arguments.
controller.InitializeExtensions(uuid);
controller.DidCreateScriptContext(context);
}
}
bool ExtensionServer::Start(const StringVector& paths) {
+ // Register system extensions to support Tizen Device APIs
+ RegisterSystemExtensions();
+
+ // Register user extensions
+ for (auto it = paths.begin(); it != paths.end(); ++it) {
+ if (utils::Exists(*it)) {
+ RegisterExtension(*it);
+ }
+ }
+
// Connect to DBusServer for Application of Runtime
if (!dbus_application_client_.ConnectByName(
app_uuid_ + "." + std::string(kDBusNameForApplication))) {
std::bind(&ExtensionServer::HandleDBusMethod, this, _1, _2, _3, _4));
dbus_server_.Start(app_uuid_ + "." + std::string(kDBusNameForExtension));
- // Register system extensions to support Tizen Device APIs
- RegisterSystemExtensions();
-
- // Register user extensions
- for (auto it = paths.begin(); it != paths.end(); ++it) {
- if (utils::Exists(*it)) {
- RegisterExtension(*it);
- }
- }
-
// Send 'ready' signal to Injected Bundle.
NotifyEPCreatedToApplication();
void ExtensionServer::OnGetExtensions(GDBusMethodInvocation* invocation) {
GVariantBuilder builder;
+
g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
// build an array of extensions
// close container('(ssas)') for extension
g_variant_builder_close(&builder);
}
- GVariant* reply = g_variant_builder_end(&builder);
+
+ GVariant* reply = NULL;
+ if (extensions_.size() == 0) {
+ reply = g_variant_new_array(G_VARIANT_TYPE("(ssas)"), NULL, 0);
+ } else {
+ reply = g_variant_builder_end(&builder);
+ }
+
g_dbus_method_invocation_return_value(
invocation, g_variant_new_tuple(&reply, 1));
}