mangayomi/packages/desktop_webview_window/linux/message_channel_plugin.cc
kodjomoustapha e0b770d2a8 Upgrade
2024-02-06 17:27:34 +01:00

92 lines
2.8 KiB
C++

//
// Created by boyan on 11/23/21.
//
#include "message_channel_plugin.h"
#include <set>
#include "glib.h"
namespace {
class ClientMessageChannelPlugin {
public:
explicit ClientMessageChannelPlugin(FlMethodChannel *channel);
void DispatchMethodCall(FlMethodCall *call) {
auto *name = fl_method_call_get_name(call);
auto *args = fl_method_call_get_args(call);
fl_method_channel_invoke_method(channel_, name, args, nullptr, nullptr, nullptr);
}
~ClientMessageChannelPlugin();
private:
FlMethodChannel *channel_;
};
class ServerMessageChannelPlugin {
public:
void AddClient(ClientMessageChannelPlugin *client) {
clients_.insert(client);
}
void RemoveClient(ClientMessageChannelPlugin *client) {
clients_.erase(client);
}
void DispatchMethodCall(FlMethodCall *call, ClientMessageChannelPlugin *client_from) {
for (auto client: clients_) {
if (client != client_from) {
client->DispatchMethodCall(call);
}
}
}
private:
std::set<ClientMessageChannelPlugin *> clients_;
};
ServerMessageChannelPlugin *g_server_message_channel_plugin = nullptr;
ClientMessageChannelPlugin::ClientMessageChannelPlugin(FlMethodChannel *channel) : channel_(channel) {
g_object_ref(channel_);
g_server_message_channel_plugin->AddClient(this);
}
ClientMessageChannelPlugin::~ClientMessageChannelPlugin() {
g_object_unref(channel_);
g_server_message_channel_plugin->RemoveClient(this);
}
void client_plugin_proxy_dispatch_method_call(FlMethodChannel *channel, FlMethodCall *call, gpointer user_data) {
auto *client = static_cast<ClientMessageChannelPlugin *>(user_data);
g_assert(g_server_message_channel_plugin);
g_server_message_channel_plugin->DispatchMethodCall(call, client);
fl_method_call_respond_success(call, nullptr, nullptr);
}
}
void client_message_channel_plugin_register_with_registrar(FlPluginRegistrar *registrar) {
if (!g_server_message_channel_plugin) {
g_server_message_channel_plugin = new ServerMessageChannelPlugin();
}
g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
FlMethodChannel *channel = fl_method_channel_new(fl_plugin_registrar_get_messenger(registrar),
"webview_message/client_channel",
FL_METHOD_CODEC(codec));
auto *client_message_channel_plugin = new ClientMessageChannelPlugin(channel);
fl_method_channel_set_method_call_handler(channel,
client_plugin_proxy_dispatch_method_call,
client_message_channel_plugin,
[](gpointer pointer) {
delete static_cast<ClientMessageChannelPlugin *>(pointer);
});
}