Provide web engine plugin selection feature 19/191119/6
authorJiyun Yang <ji.yang@samsung.com>
Thu, 11 Oct 2018 11:17:32 +0000 (20:17 +0900)
committerJIYUN YANG <ji.yang@samsung.com>
Mon, 5 Nov 2018 02:37:42 +0000 (02:37 +0000)
In-house user can choose web engine plugin by setting environment variable

Change-Id: I767c6f3c08019749e1d363b03af7267da6a94b21
Signed-off-by: Jiyun Yang <ji.yang@samsung.com>
dali/devel-api/adaptor-framework/environment-variable.cpp
dali/devel-api/adaptor-framework/environment-variable.h
dali/internal/system/common/environment-variables.h
dali/internal/web-engine/common/web-engine-impl.cpp
dali/internal/web-engine/common/web-engine-impl.h

index 9eb6582..1bcf1b6 100644 (file)
@@ -31,6 +31,11 @@ const char * GetEnvironmentVariable( const char * variable )
   return std::getenv( variable );
 }
 
+bool SetEnvironmentVariable( const char * variable, const char * value )
+{
+  return setenv( variable, value, 1 ) == 0;
+}
+
 } // namespace EnvironmentVariable
 
 } // namespace Dali
index b258d31..3ebe394 100644 (file)
@@ -34,6 +34,15 @@ namespace EnvironmentVariable
  */
 DALI_ADAPTOR_API const char * GetEnvironmentVariable( const char * variable );
 
+/**
+ * @brief Create or overwrite (when it does not exist) an environment variable.
+ *
+ * @param[in] variable Null-terminated character string identifying the name of the environmental variable.
+ * @param[in] value Null-terminated character string to set as a value.
+ * @return True on success, false on error.
+ */
+DALI_ADAPTOR_API bool SetEnvironmentVariable( const char * variable, const char * value );
+
 } // namespace EnvironmentVariable
 
 } // namespace Dali
index 2833f6b..cddaaa3 100644 (file)
@@ -112,6 +112,8 @@ namespace Adaptor
 
 #define DALI_ENV_DISABLE_STENCIL_BUFFER "DALI_DISABLE_STENCIL_BUFFER"
 
+#define DALI_ENV_WEB_ENGINE_NAME "DALI_WEB_ENGINE_NAME"
+
 } // namespace Adaptor
 
 } // namespace Internal
index 988462d..b727a48 100644 (file)
 // EXTERNAL INCLUDES
 #include <dlfcn.h>
 #include <dali/integration-api/debug.h>
-#include <dali/public-api/adaptor-framework/native-image-source.h>
 #include <dali/public-api/object/type-registry.h>
+#include <sstream>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/environment-variable.h>
+#include <dali/internal/system/common/environment-variables.h>
+#include <dali/public-api/adaptor-framework/native-image-source.h>
 
 namespace Dali
 {
@@ -36,7 +41,20 @@ namespace Adaptor
 namespace // unnamed namespace
 {
 
-const char* WEB_ENGINE_PLUGIN_SO( "libdali-web-engine-plugin.so" );
+constexpr char const * const kPluginFullNamePrefix = "libdali-web-engine-";
+constexpr char const * const kPluginFullNamePostfix = "-plugin.so";
+constexpr char const * const kPluginFullNameDefault = "libdali-web-engine-plugin.so";
+
+// Note: Dali WebView policy does not allow to use multiple web engines in an application.
+// So once pluginName is set to non-empty string, it will not change.
+std::string pluginName;
+
+std::string MakePluginName( const char* environmentName )
+{
+  std::stringstream fullName;
+  fullName << kPluginFullNamePrefix << environmentName << kPluginFullNamePostfix;
+  return std::move( fullName.str() );
+}
 
 Dali::BaseHandle Create()
 {
@@ -84,16 +102,40 @@ WebEngine::~WebEngine()
   }
 }
 
+bool WebEngine::InitializePluginHandle()
+{
+  if ( pluginName.length() == 0 )
+  {
+    // pluginName is not initialized yet.
+    const char* name = EnvironmentVariable::GetEnvironmentVariable( DALI_ENV_WEB_ENGINE_NAME );
+    if ( name )
+    {
+      pluginName = MakePluginName( name );
+      mHandle = dlopen( pluginName.c_str(), RTLD_LAZY );
+      if ( mHandle )
+      {
+        return true;
+      }
+    }
+    pluginName = std::string( kPluginFullNameDefault );
+  }
+
+  mHandle = dlopen( pluginName.c_str(), RTLD_LAZY );
+  if ( !mHandle )
+  {
+    DALI_LOG_ERROR( "Can't load %s : %s\n", pluginName.c_str(), dlerror() );
+    return false;
+  }
+
+  return true;
+}
+
 bool WebEngine::Initialize()
 {
   char* error = NULL;
 
-  mHandle = dlopen( WEB_ENGINE_PLUGIN_SO, RTLD_LAZY );
-
-  error = dlerror();
-  if( mHandle == NULL || error != NULL )
+  if ( !InitializePluginHandle() )
   {
-    DALI_LOG_ERROR( "WebEngine::Initialize(), dlopen error: %s\n", error );
     return false;
   }
 
index 3cb1eb6..90616ad 100644 (file)
@@ -187,9 +187,16 @@ private:
    */
   bool Initialize();
 
+  /**
+   * @brief Initializes library handle by loading web engine plugin.
+   *
+   * @return Whether the initialization succeed or not.
+   */
+  bool InitializePluginHandle();
+
 private:
 
-  Dali::WebEnginePlugin* mPlugin; ///< WebEngine plugin handle
+  Dali::WebEnginePlugin* mPlugin; ///< WebEnginePlugin instance
   void* mHandle; ///< Handle for the loaded library
 
   typedef Dali::WebEnginePlugin* (*CreateWebEngineFunction)();