The Webview Univeral Flutter package for Appeto SDK.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

93 lignes
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. }