r7945 - in /trunk/licq/src/plugins: generalplugin.cpp generalplugin.h plugin.cpp plugin.h protocolplugin.cpp protocolplugin.h tests/plugintest.cpp
[email protected] Sun, 24 Oct 2010 19:38:25 -0000
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);
}