92 lines
2.8 KiB
C++
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);
|
|
});
|
|
}
|