r7945 - in /trunk/licq/src/plugins: generalplugin.cpp generalplugin.h plugin.cpp plugin.h protocolplugin.cpp protocolplugin.h tests/plugintest.cpp

[email protected]
Newsgroups gmane.network.licq.cvs
Message-ID <20101024193825.7F6B7224B83@thejon>
Author: erijo
Date: Mon Oct 25 04:38:25 2010
New Revision: 7945

Log:
Added callback that can be called just before the plugin's init function

Modified:
    trunk/licq/src/plugins/generalplugin.cpp
    trunk/licq/src/plugins/generalplugin.h
    trunk/licq/src/plugins/plugin.cpp
    trunk/licq/src/plugins/plugin.h
    trunk/licq/src/plugins/protocolplugin.cpp
    trunk/licq/src/plugins/protocolplugin.h
    trunk/licq/src/plugins/tests/plugintest.cpp

Modified: trunk/licq/src/plugins/generalplugin.cpp
==============================================================================
--- trunk/licq/src/plugins/generalplugin.cpp (original)
+++ trunk/licq/src/plugins/generalplugin.cpp Mon Oct 25 04:38:25 2010
@@ -62,7 +62,8 @@
   delete[] myArgvCopy;
 }
 
-bool GeneralPlugin::init(int argc, char** argv)
+bool GeneralPlugin::init(int argc, char** argv,
+                         void (*callback)(const Plugin&))
 {
   const size_t size = argc + 2;
 
@@ -85,7 +86,7 @@
   // and that messes up free, causing SIGSEGV in the destructor.
   ::memcpy(myArgvCopy, myArgv, size * sizeof(char*));
 
-  return callInitInThread();
+  return callInitInThread(callback);
 }
 
 void GeneralPlugin::pushSignal(Licq::PluginSignal* signal)

Modified: trunk/licq/src/plugins/generalplugin.h
==============================================================================
--- trunk/licq/src/plugins/generalplugin.h (original)
+++ trunk/licq/src/plugins/generalplugin.h Mon Oct 25 04:38:25 2010
@@ -43,7 +43,7 @@
   GeneralPlugin(DynamicLibrary::Ptr lib, PluginThread::Ptr pluginThread);
   virtual ~GeneralPlugin();
 
-  bool init(int argc, char** argv);
+  bool init(int argc, char** argv, void (*callback)(const Plugin&) = NULL);
 
   void pushSignal(Licq::PluginSignal* signal);
   Licq::PluginSignal* popSignal();

Modified: trunk/licq/src/plugins/plugin.cpp
==============================================================================
--- trunk/licq/src/plugins/plugin.cpp (original)
+++ trunk/licq/src/plugins/plugin.cpp Mon Oct 25 04:38:25 2010
@@ -33,6 +33,7 @@
   myLib(lib),
   myThread(pluginThread),
   mySignalMask(0),
+  myInitCallback(NULL),
   myStartCallback(NULL),
   myExitCallback(NULL),
   myId(INVALID_ID)
@@ -101,14 +102,21 @@
   myPipe.putChar(PipeShutdown);
 }
 
-bool Plugin::callInitInThread()
+bool Plugin::callInitInThread(void (*initCallback)(const Plugin&))
 {
+  assert(myInitCallback == NULL);
+  myInitCallback = initCallback;
   return myThread->initPlugin(&Plugin::initThreadEntry, this);
 }
 
 bool Plugin::initThreadEntry(void* plugin)
 {
-  return static_cast<Plugin*>(plugin)->initThreadEntry();
+  Plugin* thisPlugin = static_cast<Plugin*>(plugin);
+
+  if (thisPlugin->myInitCallback)
+    thisPlugin->myInitCallback(*thisPlugin);
+
+  return thisPlugin->initThreadEntry();
 }
 
 void* Plugin::startThreadEntry(void* plugin)

Modified: trunk/licq/src/plugins/plugin.h
==============================================================================
--- trunk/licq/src/plugins/plugin.h (original)
+++ trunk/licq/src/plugins/plugin.h Mon Oct 25 04:38:25 2010
@@ -61,8 +61,8 @@
    * @param exitCallback will be called in the plugin's thread just after the
    * plugin returns from the main function.
    */
-  void startThread(void (*startCallback)(const Plugin& plugin) = NULL,
-                   void (*exitCallback)(const Plugin& plugin) = NULL);
+  void startThread(void (*startCallback)(const Plugin&) = NULL,
+                   void (*exitCallback)(const Plugin&) = NULL);
 
   /**
    * Wait for the plugin to stop.
@@ -95,7 +95,7 @@
   void shutdown();
 
 protected:
-  bool callInitInThread();
+  bool callInitInThread(void (*initCallback)(const Plugin&) = NULL);
 
   DynamicLibrary::Ptr myLib;
   Licq::Pipe myPipe;
@@ -111,8 +111,9 @@
 
   PluginThread::Ptr myThread;
   unsigned long mySignalMask;
-  void (*myStartCallback)(const Plugin& plugin);
-  void (*myExitCallback)(const Plugin& plugin);
+  void (*myInitCallback)(const Plugin&);
+  void (*myStartCallback)(const Plugin&);
+  void (*myExitCallback)(const Plugin&);
 
   // Function pointers
   int (*myMain)();

Modified: trunk/licq/src/plugins/protocolplugin.cpp
==============================================================================
--- trunk/licq/src/plugins/protocolplugin.cpp (original)
+++ trunk/licq/src/plugins/protocolplugin.cpp Mon Oct 25 04:38:25 2010
@@ -43,9 +43,9 @@
   // Empty
 }
 
-bool ProtocolPlugin::init()
+bool ProtocolPlugin::init(void (*callback)(const Plugin&))
 {
-  return callInitInThread();
+  return callInitInThread(callback);
 }
 
 void ProtocolPlugin::pushSignal(Licq::ProtocolSignal* signal)

Modified: trunk/licq/src/plugins/protocolplugin.h
==============================================================================
--- trunk/licq/src/plugins/protocolplugin.h (original)
+++ trunk/licq/src/plugins/protocolplugin.h Mon Oct 25 04:38:25 2010
@@ -43,7 +43,7 @@
                  bool icq = false);
   virtual ~ProtocolPlugin();
 
-  bool init();
+  bool init(void (*callback)(const Plugin&) = NULL);
 
   void pushSignal(Licq::ProtocolSignal* signal);
   Licq::ProtocolSignal* popSignal();

Modified: trunk/licq/src/plugins/tests/plugintest.cpp
==============================================================================
--- trunk/licq/src/plugins/tests/plugintest.cpp (original)
+++ trunk/licq/src/plugins/tests/plugintest.cpp Mon Oct 25 04:38:25 2010
@@ -46,6 +46,11 @@
 public:
   PluginTest(DynamicLibrary::Ptr lib, PluginThread::Ptr thread) :
     Plugin(lib, thread, "Test") { /* Empty */ }
+
+  void init(void (*callback)(const Plugin&))
+  {
+    callInitInThread(callback);
+  }
 
 private:
   bool initThreadEntry()
@@ -109,6 +114,12 @@
   EXPECT_EQ(5, plugin.joinThread());
 }
 
+static bool InitCallbackCalled = false;
+static void initCallback(const Plugin&)
+{
+  InitCallbackCalled = true;
+}
+
 static bool StartCallbackCalled = false;
 static void startCallback(const Plugin&)
 {
@@ -123,11 +134,14 @@
 
 TEST_F(PluginFixture, runPluginWithCallbacks)
 {
+  InitCallbackCalled = false;
   StartCallbackCalled = false;
   ExitCallbackCalled = false;
+  plugin.init(&initCallback);
   plugin.startThread(&startCallback, &exitCallback);
   EXPECT_FALSE(plugin.isThisThread());
   EXPECT_EQ(5, plugin.joinThread());
+  EXPECT_TRUE(InitCallbackCalled);
   EXPECT_TRUE(StartCallbackCalled);
   EXPECT_TRUE(ExitCallbackCalled);
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.