Add a versioned IPluginsListener and deprecate the non-versioned class.
This commit is contained in:
+75
-13
@@ -44,7 +44,8 @@
|
||||
#include "Translator.h"
|
||||
#include "Logger.h"
|
||||
#include "frame_tasks.h"
|
||||
#include <am-string.h>
|
||||
#include <amtl/am-string.h>
|
||||
#include <amtl/am-linkedlist.h>
|
||||
#include <bridge/include/IVEngineServerBridge.h>
|
||||
#include <bridge/include/CoreProvider.h>
|
||||
|
||||
@@ -2240,7 +2241,42 @@ void CPluginManager::ForEachPlugin(ke::Lambda<void(CPlugin *)> callback)
|
||||
callback(*iter);
|
||||
}
|
||||
|
||||
class OldPluginAPI : public IPluginManager
|
||||
class PluginsListenerV1Wrapper final
|
||||
: public IPluginsListener,
|
||||
public ke::Refcounted<PluginsListenerV1Wrapper>
|
||||
{
|
||||
public:
|
||||
PluginsListenerV1Wrapper(IPluginsListener_V1 *impl)
|
||||
: impl_(impl)
|
||||
{}
|
||||
|
||||
// The v2 listener was added with API v7, so we pin these wrappers to v6.
|
||||
unsigned int GetApiVersion() const override {
|
||||
return 6;
|
||||
}
|
||||
|
||||
void OnPluginLoaded(IPlugin *plugin) override {
|
||||
impl_->OnPluginLoaded(plugin);
|
||||
}
|
||||
void OnPluginPauseChange(IPlugin *plugin, bool paused) override {
|
||||
impl_->OnPluginPauseChange(plugin, paused);
|
||||
}
|
||||
void OnPluginUnloaded(IPlugin *plugin) override {
|
||||
impl_->OnPluginUnloaded(plugin);
|
||||
}
|
||||
void OnPluginDestroyed(IPlugin *plugin) override {
|
||||
impl_->OnPluginDestroyed(plugin);
|
||||
}
|
||||
|
||||
bool matches(IPluginsListener_V1 *impl) const {
|
||||
return impl_ == impl;
|
||||
}
|
||||
|
||||
private:
|
||||
IPluginsListener_V1 *impl_;
|
||||
};
|
||||
|
||||
class OldPluginAPI final : public IPluginManager
|
||||
{
|
||||
public:
|
||||
IPlugin *LoadPlugin(const char *path,
|
||||
@@ -2248,45 +2284,71 @@ public:
|
||||
PluginType type,
|
||||
char error[],
|
||||
size_t maxlength,
|
||||
bool *wasloaded)
|
||||
bool *wasloaded) override
|
||||
{
|
||||
return g_PluginSys.LoadPlugin(path, debug, type, error, maxlength, wasloaded);
|
||||
}
|
||||
|
||||
bool UnloadPlugin(IPlugin *plugin)
|
||||
bool UnloadPlugin(IPlugin *plugin) override
|
||||
{
|
||||
return g_PluginSys.UnloadPlugin(plugin);
|
||||
}
|
||||
|
||||
IPlugin *FindPluginByContext(const sp_context_t *ctx)
|
||||
IPlugin *FindPluginByContext(const sp_context_t *ctx) override
|
||||
{
|
||||
return g_PluginSys.FindPluginByContext(ctx);
|
||||
}
|
||||
|
||||
unsigned int GetPluginCount()
|
||||
unsigned int GetPluginCount() override
|
||||
{
|
||||
return g_PluginSys.GetPluginCount();
|
||||
}
|
||||
|
||||
IPluginIterator *GetPluginIterator()
|
||||
IPluginIterator *GetPluginIterator() override
|
||||
{
|
||||
return g_PluginSys.GetPluginIterator();
|
||||
}
|
||||
|
||||
void AddPluginsListener(IPluginsListener *listener)
|
||||
void AddPluginsListener_V1(IPluginsListener_V1 *listener) override
|
||||
{
|
||||
ke::Ref<PluginsListenerV1Wrapper> wrapper = new PluginsListenerV1Wrapper(listener);
|
||||
|
||||
v1_wrappers_.append(wrapper);
|
||||
g_PluginSys.AddPluginsListener(wrapper);
|
||||
}
|
||||
|
||||
void RemovePluginsListener_V1(IPluginsListener_V1 *listener) override
|
||||
{
|
||||
ke::Ref<PluginsListenerV1Wrapper> wrapper;
|
||||
|
||||
// Find which wrapper has this listener.
|
||||
for (decltype(v1_wrappers_)::iterator iter(v1_wrappers_); !iter.done(); iter.next()) {
|
||||
if ((*iter)->matches(listener)) {
|
||||
wrapper = *iter;
|
||||
iter.remove();
|
||||
break;
|
||||
}
|
||||
}
|
||||
g_PluginSys.RemovePluginsListener(wrapper);
|
||||
}
|
||||
|
||||
IPlugin *PluginFromHandle(Handle_t handle, HandleError *err) override
|
||||
{
|
||||
return g_PluginSys.PluginFromHandle(handle, err);
|
||||
}
|
||||
|
||||
void AddPluginsListener(IPluginsListener *listener) override
|
||||
{
|
||||
g_PluginSys.AddPluginsListener(listener);
|
||||
}
|
||||
|
||||
void RemovePluginsListener(IPluginsListener *listener)
|
||||
void RemovePluginsListener(IPluginsListener *listener) override
|
||||
{
|
||||
g_PluginSys.RemovePluginsListener(listener);
|
||||
}
|
||||
|
||||
IPlugin *PluginFromHandle(Handle_t handle, HandleError *err)
|
||||
{
|
||||
return g_PluginSys.PluginFromHandle(handle, err);
|
||||
}
|
||||
private:
|
||||
ReentrantList<ke::Ref<PluginsListenerV1Wrapper>> v1_wrappers_;
|
||||
};
|
||||
|
||||
static OldPluginAPI sOldPluginAPI;
|
||||
|
||||
Reference in New Issue
Block a user