Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 
 

93 wiersze
2.8 KiB

  1. //
  2. // Created by boyan on 11/23/21.
  3. //
  4. #include "message_channel_plugin.h"
  5. #include <set>
  6. #include "glib.h"
  7. namespace {
  8. class ClientMessageChannelPlugin {
  9. public:
  10. explicit ClientMessageChannelPlugin(FlMethodChannel *channel);
  11. void DispatchMethodCall(FlMethodCall *call) {
  12. auto *name = fl_method_call_get_name(call);
  13. auto *args = fl_method_call_get_args(call);
  14. fl_method_channel_invoke_method(channel_, name, args, nullptr, nullptr, nullptr);
  15. }
  16. ~ClientMessageChannelPlugin();
  17. private:
  18. FlMethodChannel *channel_;
  19. };
  20. class ServerMessageChannelPlugin {
  21. public:
  22. void AddClient(ClientMessageChannelPlugin *client) {
  23. clients_.insert(client);
  24. }
  25. void RemoveClient(ClientMessageChannelPlugin *client) {
  26. clients_.erase(client);
  27. }
  28. void DispatchMethodCall(FlMethodCall *call, ClientMessageChannelPlugin *client_from) {
  29. for (auto client: clients_) {
  30. if (client != client_from) {
  31. client->DispatchMethodCall(call);
  32. }
  33. }
  34. }
  35. private:
  36. std::set<ClientMessageChannelPlugin *> clients_;
  37. };
  38. ServerMessageChannelPlugin *g_server_message_channel_plugin = nullptr;
  39. ClientMessageChannelPlugin::ClientMessageChannelPlugin(FlMethodChannel *channel) : channel_(channel) {
  40. g_object_ref(channel_);
  41. g_server_message_channel_plugin->AddClient(this);
  42. }
  43. ClientMessageChannelPlugin::~ClientMessageChannelPlugin() {
  44. g_object_unref(channel_);
  45. g_server_message_channel_plugin->RemoveClient(this);
  46. }
  47. void client_plugin_proxy_dispatch_method_call(FlMethodChannel *channel, FlMethodCall *call, gpointer user_data) {
  48. auto *client = static_cast<ClientMessageChannelPlugin *>(user_data);
  49. g_assert(g_server_message_channel_plugin);
  50. g_server_message_channel_plugin->DispatchMethodCall(call, client);
  51. fl_method_call_respond_success(call, nullptr, nullptr);
  52. }
  53. }
  54. void client_message_channel_plugin_register_with_registrar(FlPluginRegistrar *registrar) {
  55. if (!g_server_message_channel_plugin) {
  56. g_server_message_channel_plugin = new ServerMessageChannelPlugin();
  57. }
  58. g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
  59. FlMethodChannel *channel = fl_method_channel_new(fl_plugin_registrar_get_messenger(registrar),
  60. "webview_message/client_channel",
  61. FL_METHOD_CODEC(codec));
  62. auto *client_message_channel_plugin = new ClientMessageChannelPlugin(channel);
  63. fl_method_channel_set_method_call_handler(channel,
  64. client_plugin_proxy_dispatch_method_call,
  65. client_message_channel_plugin,
  66. [](gpointer pointer) {
  67. delete static_cast<ClientMessageChannelPlugin *>(pointer);
  68. });
  69. }