]> git.ipfire.org Git - thirdparty/open-vm-tools.git/commitdiff
Allow an intialization failure to fail the plugin load.
authorVMware, Inc <>
Thu, 18 Nov 2010 22:05:50 +0000 (14:05 -0800)
committerMarcelo Vanzin <mvanzin@vmware.com>
Thu, 18 Nov 2010 22:05:50 +0000 (14:05 -0800)
Relocate the initialization code into an Initialize() method so that if it
fails it can return a clear status that the caller can act upon.

Signed-off-by: Marcelo Vanzin <mvanzin@vmware.com>
open-vm-tools/services/plugins/unity/unityPlugin.cpp
open-vm-tools/services/plugins/unity/unityPlugin.h
open-vm-tools/services/plugins/unity/unityPluginEntry.cpp

index bc21a35ad085dcc3d939419f7d0c4b6b8ce0ab82..b5b41046caf82c43cb4f555f12861e3696ee3481 100644 (file)
@@ -65,11 +65,22 @@ static NotifyIconRpcCallback gNotifyIconCallback;
 /**
  * Constructor for the Unity plugin, initialized Unity, and common options values
  *
+ */
+
+UnityPlugin::UnityPlugin() : mUnityUpdateChannel(NULL)
+{
+}
+
+/**
+ * Initializer for the Unity plugin, initialized Unity, and common options values
+ *
  * @param[in]  ctx      Host application context.
  *
+ * @return true if initialization was successful.
  */
 
-UnityPlugin::UnityPlugin(ToolsAppCtx *ctx) : mUnityUpdateChannel(NULL)
+gboolean
+UnityPlugin::Initialize(ToolsAppCtx *ctx)
 {
    ASSERT(ctx);
 
@@ -88,7 +99,7 @@ UnityPlugin::UnityPlugin(ToolsAppCtx *ctx) : mUnityUpdateChannel(NULL)
    mUnityUpdateChannel = UnityUpdateChannelInit();
    if (NULL == mUnityUpdateChannel) {
       Warning("%s: Unable to initialize Unity update channel.\n", __FUNCTION__);
-      return;
+      return false;
    }
    unityHostCallbacks.updateCbCtx = mUnityUpdateChannel;
 
@@ -127,6 +138,7 @@ UnityPlugin::UnityPlugin(ToolsAppCtx *ctx) : mUnityUpdateChannel(NULL)
                      /* blue */ 0xdc << 16;
    }
    Unity_SetConfigDesktopColor(desktopColor);
+   return true;
 }
 
 
index cb99bf6cfa7465fcc1a2467905f5f8a55bbe74ee..7462d9e3ca82ef239a1bfd512e9f3ca18eea95f8 100644 (file)
@@ -117,6 +117,16 @@ class ToolsPlugin {
 public:
    virtual ~ToolsPlugin() {};
 
+
+   /**
+    * Initializer for the plugin.
+    *
+    * @param[in]  ctx      Host application context.
+    *
+    * @return true if initialization was successful.
+    */
+   virtual gboolean Initialize(ToolsAppCtx *ctx) = 0;
+
    /**
     * Handles a reset signal. This callback is called when the service receives a
     * "reset" message from the VMX, meaning the VMX may be restarting the RPC
@@ -193,9 +203,11 @@ public:
 
 class UnityPlugin  : public ToolsPlugin {
 public:
-   UnityPlugin(ToolsAppCtx *ctx);
+   UnityPlugin();
    virtual ~UnityPlugin();
 
+   virtual gboolean Initialize(ToolsAppCtx *ctx);
+
    virtual gboolean Reset(gpointer src) { return TRUE; }
    virtual void Shutdown(gpointer src) {};
    virtual gboolean SetOption(gpointer src, const std::string &option, const std::string &value)
@@ -212,9 +224,11 @@ protected:
 #ifdef _WIN32
 class UnityPluginWin32 : public UnityPlugin {
 public:
-   UnityPluginWin32(ToolsAppCtx *ctx);
+   UnityPluginWin32();
    virtual ~UnityPluginWin32();
 
+   virtual gboolean Initialize(ToolsAppCtx *ctx);
+
    virtual std::vector<ToolsAppCapability> GetCapabilities(gboolean set);
    virtual void SessionChange(gpointer src, DWORD code, DWORD id) {};
 
index 5806fd015aa870fee893b2fc8ad16c416f1191ca..99f90284662eadbc86492950925c21e7e0933d08 100644 (file)
@@ -186,15 +186,21 @@ ToolsOnLoad(ToolsAppCtx *ctx)
       ToolsPlugin *pluginInstance = NULL;
 
 #if WIN32
-      pluginInstance = new UnityPluginWin32(ctx);
+      pluginInstance = new UnityPluginWin32();
 #else // Linux
-      pluginInstance = new UnityPlugin(ctx);
+      pluginInstance = new UnityPlugin();
 #endif
 
       if (!pluginInstance) {
          // There's nothing we can do if we can't construct the plugin instance
          return NULL;
       }
+
+      if (!pluginInstance->Initialize(ctx)) {
+         g_warning("%s: Unity Plugin failed to initialize.\n", __FUNCTION__);
+         delete pluginInstance;
+         return NULL;
+      }
       regData._private = pluginInstance;
 
       std::vector<RpcChannelCallback> rpcs = pluginInstance->GetRpcCallbackList();