cc_tools_qt
Common Environment for Protocol Analysis.
Loading...
Searching...
No Matches
Supporting Inter-Plugin Configuration

The cc_tools_qt allows one plugin to influence the configuration of another. The configuration exchange is done via QVariantMap data type and it's up to the plugins to interpret the values stored in the map.

Receiving Inter-Plugin Configuration Request

The plugin class is expected to extend the cc_tools_qt::ToolsPlugin and override the applyInterPluginConfigImpl() member function.

class MyFilterPlugin : public cc_tools_qt::ToolsPlugin
{
...
protected:
void applyInterPluginConfigImpl(const QVariantMap& props) override
{
auto somePropVar = props.value("some_prop");
if (somePropVar.isValid()) {
// The inter-plugin configuration contains a value this plugin
// can use:
auto someProp = somePropVar.value<QString>();
... // Do something with the extracted value.
}
}
...
};
Interface class for plugin definition.
Definition ToolsPlugin.h:42
virtual void applyInterPluginConfigImpl(const QVariantMap &props)
Polymorphic inter-plugin configuration application.
Definition ToolsPlugin.cpp:171

In most cases the plugin configuration is handled inside the class extending the socket, filter, or protocol, then such class can override its applyInterPluginConfigImpl() member function while the plugin's applyInterPluginConfigImpl() one can redirect the request.

class MySocket : public cc_tools_qt::ToolsSocket
{
...
protected:
void applyInterPluginConfigImpl(const QVariantMap& props) override
{
auto somePropVar = props.value("some_prop");
if (somePropVar.isValid()) {
// The inter-plugin configuration contains a value this plugin
// can use:
auto someProp = somePropVar.value<QString>();
... // Do something with the extracted value.
}
}
...
};
class MySocketPlugin : public cc_tools_qt::ToolsPlugin
{
public:
MyFilterPlugin() : m_socket(new MySocket) {...}
protected:
void applyInterPluginConfigImpl(const QVariantMap& props) override
{
m_socket->applyInterPluginConfig(props);
}
...
};
Main polymorphic interface class for sockets.
Definition ToolsSocket.h:40
virtual void applyInterPluginConfigImpl(const QVariantMap &props)
Polymorphic inter-plugin configuration application.
Definition ToolsSocket.cpp:167

Sending Inter-Plugin Configuration Request

The plugin class can invoke inheirted reportInterPluginConfig() member function to report populated inter-plugin configuration.

class MyFilterPlugin : public cc_tools_qt::ToolsPlugin
{
...
private:
void someEvent()
{
QVariantMap props;
prop["some_prop"] = QVariant::fromValue(QString("some_value"));
prop["some_other_prop"] = QVariant::fromValue(123);
}
};
void reportInterPluginConfig(const QVariantMap &props)
Report inter-plugin configuration.
Definition ToolsPlugin.cpp:200

In case the inter-plugin configuration event is initiated inside the class extending the socket, filter, or protocol, then such class can use inherited cc_tools_qt::ToolsSocket::reportInterPluginConfig() member function. The plugin class will connect the signals automatically and emit its own sigInterPluginConfigReport().

class MySocket : public cc_tools_qt::ToolsSocket
{
...
private:
void someEvent()
{
QVariantMap props;
prop["some_prop"] = QVariant::fromValue(QString("some_value"));
prop["some_other_prop"] = QVariant::fromValue(123);
}
};
void reportInterPluginConfig(const QVariantMap &props)
Report inter-plugin configuration.
Definition ToolsSocket.cpp:221

HOWEVER, depending on the implementation of the actual plugin, the socket, filter, or protocol objects may be created before the the cc_tools_qt::ToolsPlugin calls appropriate createSocketImpl(), createFilterImpl(), or createProtocolImpl() to get hold on the appropriate object, and may require an ability to still initiate inter-plugin configuration. In such case the the actual plugin is expected to explicitly connect appropriate signal:

class MySocketPlugin : public cc_tools_qt::ToolsPlugin
{
...
protected:
virtual ToolsSocketPtr createSocketImpl()
{
createSocketIfNeeded();
return m_socket;
}
virtual QWidget* createConfigurationWidgetImpl()
{
createSocketIfNeeded();
auto widget = ... // Create widget and connect its signals
return widget;
}
private:
void createSocketIfNeeded()
{
if (m_socket) {
return;
}
m_socket.reset(new MySocket);
connect(
);
}
private
std::shared_ptr<MySocket> m_socket;
};
virtual QWidget * createConfigurationWidgetImpl()
Create configuration widget.
Definition ToolsPlugin.cpp:190
virtual ToolsSocketPtr createSocketImpl()
Create socket object.
Definition ToolsPlugin.cpp:175
void sigInterPluginConfigReport(const QVariantMap &props)
Signal to report inter-plugin configuration.

Note that the automatic connection of the cc_tools_qt::ToolsSocket::sigInterPluginConfigReport, cc_tools_qt::ToolsFilter::sigInterPluginConfigReport, cc_tools_qt::ToolsProtocol::sigInterPluginConfigReport signals to the cc_tools_qt::ToolsPlugin::sigInterPluginConfigReport signal mentioned earlier happens ONLY when the deriving plugin class does NOT perform such a connection (to avoid duplication).