Flutter Linux Embedder
fl_binary_messenger.cc
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
7 
8 #include "flutter/fml/logging.h"
15 
16 #include <gmodule.h>
17 
18 static constexpr char kControlChannelName[] = "dev.flutter/channel-buffers";
19 static constexpr char kResizeMethod[] = "resize";
20 static constexpr char kOverflowMethod[] = "overflow";
21 
23  fl_binary_messenger_codec_error)
24 
25 G_DECLARE_FINAL_TYPE(FlBinaryMessengerImpl,
27  FL,
29  GObject)
30 
31 G_DECLARE_FINAL_TYPE(FlBinaryMessengerResponseHandleImpl,
32  fl_binary_messenger_response_handle_impl,
33  FL,
34  BINARY_MESSENGER_RESPONSE_HANDLE_IMPL,
35  FlBinaryMessengerResponseHandle)
36 
37 G_DEFINE_INTERFACE(FlBinaryMessenger, fl_binary_messenger, G_TYPE_OBJECT)
38 
39 struct _FlBinaryMessengerImpl {
40  GObject parent_instance;
41 
42  GWeakRef engine;
43 
44  // PlatformMessageHandler keyed by channel name.
45  GHashTable* platform_message_handlers;
46 };
47 
49  FlBinaryMessengerInterface* iface);
50 
52  FlBinaryMessengerImpl,
54  G_TYPE_OBJECT,
55  G_IMPLEMENT_INTERFACE(fl_binary_messenger_get_type(),
57 
58 static void fl_binary_messenger_response_handle_class_init(
59  FlBinaryMessengerResponseHandleClass* klass) {}
60 
61 G_DEFINE_TYPE(FlBinaryMessengerResponseHandle,
63  G_TYPE_OBJECT)
64 
65 static void fl_binary_messenger_response_handle_init(
66  FlBinaryMessengerResponseHandle* self) {}
67 
69  FlBinaryMessengerResponseHandle parent_instance;
70 
71  // Messenger sending response on.
72  FlBinaryMessengerImpl* messenger;
73 
74  // Handle to send the response with. This is cleared to nullptr when it is
75  // used.
76  const FlutterPlatformMessageResponseHandle* response_handle;
77 };
78 
79 G_DEFINE_TYPE(FlBinaryMessengerResponseHandleImpl,
80  fl_binary_messenger_response_handle_impl,
81  fl_binary_messenger_response_handle_get_type())
82 
83 static void fl_binary_messenger_default_init(
84  FlBinaryMessengerInterface* iface) {}
85 
87  FlBinaryMessengerResponseHandleImpl* self =
88  FL_BINARY_MESSENGER_RESPONSE_HANDLE_IMPL(object);
89 
90  g_autoptr(FlEngine) engine =
91  FL_ENGINE(g_weak_ref_get(&self->messenger->engine));
92  if (self->response_handle != nullptr && engine != nullptr) {
93  g_critical("FlBinaryMessengerResponseHandle was not responded to");
94  }
95 
96  g_clear_object(&self->messenger);
97  self->response_handle = nullptr;
98 
99  G_OBJECT_CLASS(fl_binary_messenger_response_handle_impl_parent_class)
100  ->dispose(object);
101 }
102 
104  FlBinaryMessengerResponseHandleImplClass* klass) {
105  G_OBJECT_CLASS(klass)->dispose =
107 }
108 
110  FlBinaryMessengerResponseHandleImpl* self) {}
111 
112 static FlBinaryMessengerResponseHandleImpl*
114  FlBinaryMessengerImpl* messenger,
115  const FlutterPlatformMessageResponseHandle* response_handle) {
116  FlBinaryMessengerResponseHandleImpl* self =
117  FL_BINARY_MESSENGER_RESPONSE_HANDLE_IMPL(g_object_new(
118  fl_binary_messenger_response_handle_impl_get_type(), nullptr));
119 
120  self->messenger = FL_BINARY_MESSENGER_IMPL(g_object_ref(messenger));
121  self->response_handle = response_handle;
122 
123  return self;
124 }
125 
126 typedef struct {
131 
134  gpointer user_data,
135  GDestroyNotify destroy_notify) {
136  PlatformMessageHandler* self = static_cast<PlatformMessageHandler*>(
137  g_malloc0(sizeof(PlatformMessageHandler)));
138  self->message_handler = handler;
139  self->message_handler_data = user_data;
140  self->message_handler_destroy_notify = destroy_notify;
141  return self;
142 }
143 
144 static void platform_message_handler_free(gpointer data) {
145  PlatformMessageHandler* self = static_cast<PlatformMessageHandler*>(data);
146  if (self->message_handler_destroy_notify) {
147  self->message_handler_destroy_notify(self->message_handler_data);
148  }
149  g_free(self);
150 }
151 
153  FlEngine* engine,
154  const gchar* channel,
155  GBytes* message,
156  const FlutterPlatformMessageResponseHandle* response_handle,
157  void* user_data) {
158  FlBinaryMessenger* self = FL_BINARY_MESSENGER(user_data);
159  return fl_binary_messenger_handle_message(self, channel, message,
160  response_handle);
161 }
162 
163 static void fl_binary_messenger_impl_dispose(GObject* object) {
164  FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(object);
165 
166  g_weak_ref_clear(&self->engine);
167 
168  g_clear_pointer(&self->platform_message_handlers, g_hash_table_unref);
169 
170  G_OBJECT_CLASS(fl_binary_messenger_impl_parent_class)->dispose(object);
171 }
172 
174  FlBinaryMessenger* messenger,
175  const gchar* channel,
177  gpointer user_data,
178  GDestroyNotify destroy_notify) {
179  FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(messenger);
180 
181  // Don't set handlers if engine already gone.
182  g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
183  if (engine == nullptr) {
184  if (handler != nullptr) {
185  g_warning(
186  "Attempted to set message handler on an FlBinaryMessenger without an "
187  "engine");
188  }
189  if (destroy_notify != nullptr) {
190  destroy_notify(user_data);
191  }
192  return;
193  }
194 
195  if (handler != nullptr) {
196  g_hash_table_replace(
197  self->platform_message_handlers, g_strdup(channel),
198  platform_message_handler_new(handler, user_data, destroy_notify));
199  } else {
200  g_hash_table_remove(self->platform_message_handlers, channel);
201  }
202 }
203 
204 static gboolean do_unref(gpointer value) {
205  g_object_unref(value);
206  return G_SOURCE_REMOVE;
207 }
208 
209 // Note: This function can be called from any thread.
210 static gboolean send_response(FlBinaryMessenger* messenger,
211  FlBinaryMessengerResponseHandle* response_handle_,
212  GBytes* response,
213  GError** error) {
214  FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(messenger);
215  g_return_val_if_fail(
216  FL_IS_BINARY_MESSENGER_RESPONSE_HANDLE_IMPL(response_handle_), FALSE);
217  FlBinaryMessengerResponseHandleImpl* response_handle =
218  FL_BINARY_MESSENGER_RESPONSE_HANDLE_IMPL(response_handle_);
219 
220  g_return_val_if_fail(response_handle->messenger == self, FALSE);
221  g_return_val_if_fail(response_handle->response_handle != nullptr, FALSE);
222 
223  FlEngine* engine = FL_ENGINE(g_weak_ref_get(&self->engine));
224  if (engine == nullptr) {
225  return TRUE;
226  }
227 
228  gboolean result = false;
229  if (response_handle->response_handle == nullptr) {
230  g_set_error(
233  "Attempted to respond to a message that is already responded to");
234  result = FALSE;
235  } else {
237  engine, response_handle->response_handle, response, error);
238  response_handle->response_handle = nullptr;
239  }
240 
241  // This guarantees that the dispose method for the engine is executed
242  // on the platform thread in the rare chance this is the last ref.
243  g_idle_add(do_unref, engine);
244 
245  return result;
246 }
247 
248 static void platform_message_ready_cb(GObject* object,
249  GAsyncResult* result,
250  gpointer user_data) {
251  g_autoptr(GTask) task = G_TASK(user_data);
252  g_task_return_pointer(task, g_object_ref(result), g_object_unref);
253 }
254 
255 static void send_on_channel(FlBinaryMessenger* messenger,
256  const gchar* channel,
257  GBytes* message,
258  GCancellable* cancellable,
259  GAsyncReadyCallback callback,
260  gpointer user_data) {
261  FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(messenger);
262 
263  g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
264  if (engine == nullptr) {
265  return;
266  }
267 
269  engine, channel, message, cancellable,
270  callback != nullptr ? platform_message_ready_cb : nullptr,
271  callback != nullptr ? g_task_new(self, cancellable, callback, user_data)
272  : nullptr);
273 }
274 
275 static GBytes* send_on_channel_finish(FlBinaryMessenger* messenger,
276  GAsyncResult* result,
277  GError** error) {
278  FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(messenger);
279  g_return_val_if_fail(g_task_is_valid(result, self), FALSE);
280 
281  GTask* task = G_TASK(result);
282  g_autoptr(GAsyncResult) r =
283  G_ASYNC_RESULT(g_task_propagate_pointer(task, error));
284  if (r == nullptr) {
285  return nullptr;
286  }
287 
288  g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
289  if (engine == nullptr) {
290  return nullptr;
291  }
292 
294 }
295 
296 // Completes method call and returns TRUE if the call was successful.
297 static gboolean finish_method(GObject* object,
298  GAsyncResult* result,
299  GError** error) {
300  g_autoptr(GBytes) response = fl_binary_messenger_send_on_channel_finish(
301  FL_BINARY_MESSENGER(object), result, error);
302  if (response == nullptr) {
303  return FALSE;
304  }
305  g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
306  return fl_method_codec_decode_response(FL_METHOD_CODEC(codec), response,
307  error) != nullptr;
308 }
309 
310 // Called when a response is received for the resize channel message.
311 static void resize_channel_response_cb(GObject* object,
312  GAsyncResult* result,
313  gpointer user_data) {
314  g_autoptr(GError) error = nullptr;
315  if (!finish_method(object, result, &error)) {
316  g_warning("Failed to resize channel: %s", error->message);
317  }
318 }
319 
320 static void resize_channel(FlBinaryMessenger* messenger,
321  const gchar* channel,
322  int64_t new_size) {
323  FML_DCHECK(new_size >= 0);
324  g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
325  g_autoptr(FlValue) args = fl_value_new_list();
328  g_autoptr(GBytes) message = fl_method_codec_encode_method_call(
329  FL_METHOD_CODEC(codec), kResizeMethod, args, nullptr);
332  nullptr);
333 }
334 
335 // Called when a response is received for the warns on overflow message.
336 static void set_warns_on_channel_overflow_response_cb(GObject* object,
337  GAsyncResult* result,
338  gpointer user_data) {
339  g_autoptr(GError) error = nullptr;
340  if (!finish_method(object, result, &error)) {
341  g_warning("Failed to set warns on channel overflow: %s", error->message);
342  }
343 }
344 
345 static void set_warns_on_channel_overflow(FlBinaryMessenger* messenger,
346  const gchar* channel,
347  bool warns) {
348  g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
349  g_autoptr(FlValue) args = fl_value_new_list();
352  g_autoptr(GBytes) message = fl_method_codec_encode_method_call(
353  FL_METHOD_CODEC(codec), kOverflowMethod, args, nullptr);
355  messenger, kControlChannelName, message, nullptr,
357 }
358 
359 static void shutdown(FlBinaryMessenger* messenger) {
360  FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(messenger);
361 
362  // Disconnect any handlers.
363  // Take the reference in case a handler tries to modify this table.
364  g_autoptr(GHashTable) handlers = self->platform_message_handlers;
365  self->platform_message_handlers = g_hash_table_new_full(
366  g_str_hash, g_str_equal, g_free, platform_message_handler_free);
367  g_hash_table_remove_all(handlers);
368 }
369 
371  FlBinaryMessengerImplClass* klass) {
372  G_OBJECT_CLASS(klass)->dispose = fl_binary_messenger_impl_dispose;
373 }
374 
376  FlBinaryMessengerInterface* iface) {
377  iface->set_message_handler_on_channel = set_message_handler_on_channel;
378  iface->send_response = send_response;
379  iface->send_on_channel = send_on_channel;
380  iface->send_on_channel_finish = send_on_channel_finish;
381  iface->resize_channel = resize_channel;
382  iface->set_warns_on_channel_overflow = set_warns_on_channel_overflow;
383  iface->shutdown = shutdown;
384 }
385 
386 static void fl_binary_messenger_impl_init(FlBinaryMessengerImpl* self) {
387  self->platform_message_handlers = g_hash_table_new_full(
388  g_str_hash, g_str_equal, g_free, platform_message_handler_free);
389 }
390 
391 FlBinaryMessenger* fl_binary_messenger_new(FlEngine* engine) {
392  g_return_val_if_fail(FL_IS_ENGINE(engine), nullptr);
393 
394  FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(
395  g_object_new(fl_binary_messenger_impl_get_type(), nullptr));
396 
397  // Added to stop compiler complaining about an unused function.
398  FL_IS_BINARY_MESSENGER_IMPL(self);
399 
400  g_weak_ref_init(&self->engine, G_OBJECT(engine));
401 
403  engine, fl_binary_messenger_platform_message_cb, self, NULL);
404 
405  return FL_BINARY_MESSENGER(self);
406 }
407 
409  FlBinaryMessenger* self,
410  const gchar* channel,
412  gpointer user_data,
413  GDestroyNotify destroy_notify) {
414  g_return_if_fail(FL_IS_BINARY_MESSENGER(self));
415  g_return_if_fail(channel != nullptr);
416 
417  FL_BINARY_MESSENGER_GET_IFACE(self)->set_message_handler_on_channel(
418  self, channel, handler, user_data, destroy_notify);
419 }
420 
421 // Note: This function can be called from any thread.
422 G_MODULE_EXPORT gboolean fl_binary_messenger_send_response(
423  FlBinaryMessenger* self,
424  FlBinaryMessengerResponseHandle* response_handle,
425  GBytes* response,
426  GError** error) {
427  g_return_val_if_fail(FL_IS_BINARY_MESSENGER(self), FALSE);
428  g_return_val_if_fail(FL_IS_BINARY_MESSENGER_RESPONSE_HANDLE(response_handle),
429  FALSE);
430 
431  return FL_BINARY_MESSENGER_GET_IFACE(self)->send_response(
432  self, response_handle, response, error);
433 }
434 
436  FlBinaryMessenger* self,
437  const gchar* channel,
438  GBytes* message,
439  GCancellable* cancellable,
440  GAsyncReadyCallback callback,
441  gpointer user_data) {
442  g_return_if_fail(FL_IS_BINARY_MESSENGER(self));
443  g_return_if_fail(channel != nullptr);
444 
445  FL_BINARY_MESSENGER_GET_IFACE(self)->send_on_channel(
446  self, channel, message, cancellable, callback, user_data);
447 }
448 
450  FlBinaryMessenger* self,
451  GAsyncResult* result,
452  GError** error) {
453  g_return_val_if_fail(FL_IS_BINARY_MESSENGER(self), FALSE);
454 
455  return FL_BINARY_MESSENGER_GET_IFACE(self)->send_on_channel_finish(
456  self, result, error);
457 }
458 
459 G_MODULE_EXPORT void fl_binary_messenger_resize_channel(FlBinaryMessenger* self,
460  const gchar* channel,
461  int64_t new_size) {
462  g_return_if_fail(FL_IS_BINARY_MESSENGER(self));
463 
464  return FL_BINARY_MESSENGER_GET_IFACE(self)->resize_channel(self, channel,
465  new_size);
466 }
467 
469  FlBinaryMessenger* self,
470  const gchar* channel,
471  bool warns) {
472  g_return_if_fail(FL_IS_BINARY_MESSENGER(self));
473 
474  return FL_BINARY_MESSENGER_GET_IFACE(self)->set_warns_on_channel_overflow(
475  self, channel, warns);
476 }
477 
479  FlBinaryMessenger* messenger,
480  const gchar* channel,
481  GBytes* message,
482  const FlutterPlatformMessageResponseHandle* response_handle) {
483  FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(messenger);
484 
485  PlatformMessageHandler* handler = static_cast<PlatformMessageHandler*>(
486  g_hash_table_lookup(self->platform_message_handlers, channel));
487  if (handler == nullptr) {
488  return FALSE;
489  }
490 
491  g_autoptr(FlBinaryMessengerResponseHandleImpl) handle =
492  fl_binary_messenger_response_handle_impl_new(self, response_handle);
493  handler->message_handler(FL_BINARY_MESSENGER(self), channel, message,
494  FL_BINARY_MESSENGER_RESPONSE_HANDLE(handle),
495  handler->message_handler_data);
496 
497  return TRUE;
498 }
499 
500 void fl_binary_messenger_shutdown(FlBinaryMessenger* self) {
501  g_return_if_fail(FL_IS_BINARY_MESSENGER(self));
502 
503  return FL_BINARY_MESSENGER_GET_IFACE(self)->shutdown(self);
504 }
fl_engine_set_platform_message_handler
void fl_engine_set_platform_message_handler(FlEngine *self, FlEnginePlatformMessageHandler handler, gpointer user_data, GDestroyNotify destroy_notify)
Definition: fl_engine.cc:760
fl_binary_messenger_response_handle_impl_dispose
static void fl_binary_messenger_response_handle_impl_dispose(GObject *object)
Definition: fl_binary_messenger.cc:86
fl_binary_messenger_impl_iface_init
static void fl_binary_messenger_impl_iface_init(FlBinaryMessengerInterface *iface)
Definition: fl_binary_messenger.cc:375
fl_binary_messenger_shutdown
void fl_binary_messenger_shutdown(FlBinaryMessenger *self)
Definition: fl_binary_messenger.cc:500
set_warns_on_channel_overflow_response_cb
static void set_warns_on_channel_overflow_response_cb(GObject *object, GAsyncResult *result, gpointer user_data)
Definition: fl_binary_messenger.cc:336
fl_method_codec_encode_method_call
GBytes * fl_method_codec_encode_method_call(FlMethodCodec *self, const gchar *name, FlValue *args, GError **error)
Definition: fl_method_codec.cc:16
finish_method
static gboolean finish_method(GObject *object, GAsyncResult *result, GError **error)
Definition: fl_binary_messenger.cc:297
G_DEFINE_TYPE_WITH_CODE
G_DEFINE_TYPE_WITH_CODE(FlBinaryMessengerImpl, fl_binary_messenger_impl, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(fl_binary_messenger_get_type(), fl_binary_messenger_impl_iface_init)) static void fl_binary_messenger_response_handle_class_init(FlBinaryMessengerResponseHandleClass *klass)
Definition: fl_binary_messenger.cc:51
platform_message_ready_cb
static void platform_message_ready_cb(GObject *object, GAsyncResult *result, gpointer user_data)
Definition: fl_binary_messenger.cc:248
_FlBinaryMessengerResponseHandleImpl
Definition: fl_binary_messenger.cc:68
kResizeMethod
static constexpr char kResizeMethod[]
Definition: fl_binary_messenger.cc:19
fl_standard_method_codec_new
G_MODULE_EXPORT FlStandardMethodCodec * fl_standard_method_codec_new()
Definition: fl_standard_method_codec.cc:291
send_response
static gboolean send_response(FlBinaryMessenger *messenger, FlBinaryMessengerResponseHandle *response_handle_, GBytes *response, GError **error)
Definition: fl_binary_messenger.cc:210
fl_value_new_list
G_MODULE_EXPORT FlValue * fl_value_new_list()
Definition: fl_value.cc:349
fl_binary_messenger_impl
fl_binary_messenger_impl
Definition: fl_binary_messenger.cc:26
fl_method_channel.h
fl_value_new_bool
G_MODULE_EXPORT FlValue * fl_value_new_bool(bool value)
Definition: fl_value.cc:255
FlValue
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition: fl_value.h:42
shutdown
static void shutdown(FlBinaryMessenger *messenger)
Definition: fl_binary_messenger.cc:359
PlatformMessageHandler
Definition: fl_binary_messenger.cc:126
send_on_channel_finish
static GBytes * send_on_channel_finish(FlBinaryMessenger *messenger, GAsyncResult *result, GError **error)
Definition: fl_binary_messenger.cc:275
_FlBinaryMessengerResponseHandleImpl::messenger
FlBinaryMessengerImpl * messenger
Definition: fl_binary_messenger.cc:72
_FlBinaryMessengerResponseHandleImpl::parent_instance
FlBinaryMessengerResponseHandle parent_instance
Definition: fl_binary_messenger.cc:69
platform_message_handler_free
static void platform_message_handler_free(gpointer data)
Definition: fl_binary_messenger.cc:144
FL_BINARY_MESSENGER_ERROR
#define FL_BINARY_MESSENGER_ERROR
Definition: fl_binary_messenger.h:27
G_DECLARE_FINAL_TYPE
GObject G_DECLARE_FINAL_TYPE(FlBinaryMessengerResponseHandleImpl, fl_binary_messenger_response_handle_impl, FL, BINARY_MESSENGER_RESPONSE_HANDLE_IMPL, FlBinaryMessengerResponseHandle) struct _FlBinaryMessengerImpl
Definition: fl_binary_messenger.cc:31
fl_value_new_int
G_MODULE_EXPORT FlValue * fl_value_new_int(int64_t value)
Definition: fl_value.cc:262
send_on_channel
static void send_on_channel(FlBinaryMessenger *messenger, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
Definition: fl_binary_messenger.cc:255
fl_binary_messenger_new
FlBinaryMessenger * fl_binary_messenger_new(FlEngine *engine)
Definition: fl_binary_messenger.cc:391
G_DEFINE_INTERFACE
G_DEFINE_INTERFACE(FlKeyboardViewDelegate, fl_keyboard_view_delegate, G_TYPE_OBJECT) static void fl_keyboard_view_delegate_default_init(FlKeyboardViewDelegateInterface *iface)
Definition: fl_keyboard_view_delegate.cc:7
fl_binary_messenger_response_handle_impl_new
static FlBinaryMessengerResponseHandleImpl * fl_binary_messenger_response_handle_impl_new(FlBinaryMessengerImpl *messenger, const FlutterPlatformMessageResponseHandle *response_handle)
Definition: fl_binary_messenger.cc:113
kOverflowMethod
static constexpr char kOverflowMethod[]
Definition: fl_binary_messenger.cc:20
user_data
G_BEGIN_DECLS G_MODULE_EXPORT FlValue gpointer user_data
Definition: fl_event_channel.h:90
fl_binary_messenger_impl_init
static void fl_binary_messenger_impl_init(FlBinaryMessengerImpl *self)
Definition: fl_binary_messenger.cc:386
G_DEFINE_QUARK
G_DEFINE_QUARK(fl_binary_messenger_codec_error_quark, fl_binary_messenger_codec_error) G_DECLARE_FINAL_TYPE(FlBinaryMessengerImpl
PlatformMessageHandler::message_handler
FlBinaryMessengerMessageHandler message_handler
Definition: fl_binary_messenger.cc:127
fl_binary_messenger_response_handle_impl_init
static void fl_binary_messenger_response_handle_impl_init(FlBinaryMessengerResponseHandleImpl *self)
Definition: fl_binary_messenger.cc:109
fl_binary_messenger_set_warns_on_channel_overflow
G_MODULE_EXPORT void fl_binary_messenger_set_warns_on_channel_overflow(FlBinaryMessenger *self, const gchar *channel, bool warns)
Definition: fl_binary_messenger.cc:468
fl_binary_messenger.h
PlatformMessageHandler::message_handler_data
gpointer message_handler_data
Definition: fl_binary_messenger.cc:128
fl_binary_messenger_impl_class_init
static void fl_binary_messenger_impl_class_init(FlBinaryMessengerImplClass *klass)
Definition: fl_binary_messenger.cc:370
fl_binary_messenger_response_handle_impl_class_init
static void fl_binary_messenger_response_handle_impl_class_init(FlBinaryMessengerResponseHandleImplClass *klass)
Definition: fl_binary_messenger.cc:103
fl_binary_messenger_platform_message_cb
static gboolean fl_binary_messenger_platform_message_cb(FlEngine *engine, const gchar *channel, GBytes *message, const FlutterPlatformMessageResponseHandle *response_handle, void *user_data)
Definition: fl_binary_messenger.cc:152
fl_engine_private.h
fl_binary_messenger_set_message_handler_on_channel
G_MODULE_EXPORT void fl_binary_messenger_set_message_handler_on_channel(FlBinaryMessenger *self, const gchar *channel, FlBinaryMessengerMessageHandler handler, gpointer user_data, GDestroyNotify destroy_notify)
Definition: fl_binary_messenger.cc:408
do_unref
static gboolean do_unref(gpointer value)
Definition: fl_binary_messenger.cc:204
resize_channel
static void resize_channel(FlBinaryMessenger *messenger, const gchar *channel, int64_t new_size)
Definition: fl_binary_messenger.cc:320
TRUE
return TRUE
Definition: fl_pixel_buffer_texture_test.cc:53
FlBinaryMessengerMessageHandler
G_MODULE_EXPORT GObject typedef void(* FlBinaryMessengerMessageHandler)(FlBinaryMessenger *messenger, const gchar *channel, GBytes *message, FlBinaryMessengerResponseHandle *response_handle, gpointer user_data)
Definition: fl_binary_messenger.h:66
fl_value_append_take
G_MODULE_EXPORT void fl_value_append_take(FlValue *self, FlValue *value)
Definition: fl_value.cc:600
fl_engine_send_platform_message_finish
GBytes * fl_engine_send_platform_message_finish(FlEngine *self, GAsyncResult *result, GError **error)
Definition: fl_engine.cc:887
fl_method_codec_decode_response
FlMethodResponse * fl_method_codec_decode_response(FlMethodCodec *self, GBytes *message, GError **error)
Definition: fl_method_codec.cc:88
fl_binary_messenger_send_on_channel_finish
G_MODULE_EXPORT GBytes * fl_binary_messenger_send_on_channel_finish(FlBinaryMessenger *self, GAsyncResult *result, GError **error)
Definition: fl_binary_messenger.cc:449
fl_method_codec.h
FL
FL
Definition: fl_binary_messenger.cc:27
fl_standard_method_codec.h
kControlChannelName
static constexpr char kControlChannelName[]
Definition: fl_binary_messenger.cc:18
fl_binary_messenger_private.h
fl_binary_messenger_codec_error_quark
G_MODULE_EXPORT GQuark fl_binary_messenger_codec_error_quark(void) G_GNUC_CONST
FL_BINARY_MESSENGER_ERROR_ALREADY_RESPONDED
@ FL_BINARY_MESSENGER_ERROR_ALREADY_RESPONDED
Definition: fl_binary_messenger.h:31
platform_message_handler_new
static PlatformMessageHandler * platform_message_handler_new(FlBinaryMessengerMessageHandler handler, gpointer user_data, GDestroyNotify destroy_notify)
Definition: fl_binary_messenger.cc:132
G_DEFINE_TYPE
G_DEFINE_TYPE(FlBinaryMessengerResponseHandle, fl_binary_messenger_response_handle, G_TYPE_OBJECT) static void fl_binary_messenger_response_handle_init(FlBinaryMessengerResponseHandle *self)
Definition: fl_binary_messenger.cc:61
args
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
Definition: fl_event_channel.h:89
fl_engine.h
error
const uint8_t uint32_t uint32_t GError ** error
Definition: fl_pixel_buffer_texture_test.cc:40
fl_engine_send_platform_message
void fl_engine_send_platform_message(FlEngine *self, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
Definition: fl_engine.cc:828
PlatformMessageHandler::message_handler_destroy_notify
GDestroyNotify message_handler_destroy_notify
Definition: fl_binary_messenger.cc:129
fl_binary_messenger_impl_dispose
static void fl_binary_messenger_impl_dispose(GObject *object)
Definition: fl_binary_messenger.cc:163
fl_binary_messenger_handle_message
gboolean fl_binary_messenger_handle_message(FlBinaryMessenger *messenger, const gchar *channel, GBytes *message, const FlutterPlatformMessageResponseHandle *response_handle)
Definition: fl_binary_messenger.cc:478
fl_binary_messenger_response_handle
G_MODULE_EXPORT fl_binary_messenger_response_handle
Definition: fl_binary_messenger.h:46
BINARY_MESSENGER_IMPL
BINARY_MESSENGER_IMPL
Definition: fl_binary_messenger.cc:28
resize_channel_response_cb
static void resize_channel_response_cb(GObject *object, GAsyncResult *result, gpointer user_data)
Definition: fl_binary_messenger.cc:311
set_message_handler_on_channel
static void set_message_handler_on_channel(FlBinaryMessenger *messenger, const gchar *channel, FlBinaryMessengerMessageHandler handler, gpointer user_data, GDestroyNotify destroy_notify)
Definition: fl_binary_messenger.cc:173
fl_binary_messenger_resize_channel
G_MODULE_EXPORT void fl_binary_messenger_resize_channel(FlBinaryMessenger *self, const gchar *channel, int64_t new_size)
Definition: fl_binary_messenger.cc:459
fl_binary_messenger_send_response
G_MODULE_EXPORT gboolean fl_binary_messenger_send_response(FlBinaryMessenger *self, FlBinaryMessengerResponseHandle *response_handle, GBytes *response, GError **error)
Definition: fl_binary_messenger.cc:422
set_warns_on_channel_overflow
static void set_warns_on_channel_overflow(FlBinaryMessenger *messenger, const gchar *channel, bool warns)
Definition: fl_binary_messenger.cc:345
fl_method_codec_private.h
value
uint8_t value
Definition: fl_standard_message_codec.cc:36
fl_engine_send_platform_message_response
gboolean fl_engine_send_platform_message_response(FlEngine *self, const FlutterPlatformMessageResponseHandle *handle, GBytes *response, GError **error)
Definition: fl_engine.cc:796
fl_binary_messenger_send_on_channel
G_MODULE_EXPORT void fl_binary_messenger_send_on_channel(FlBinaryMessenger *self, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
Definition: fl_binary_messenger.cc:435
fl_value_new_string
G_MODULE_EXPORT FlValue * fl_value_new_string(const gchar *value)
Definition: fl_value.cc:276
_FlBinaryMessengerResponseHandleImpl::response_handle
const FlutterPlatformMessageResponseHandle * response_handle
Definition: fl_binary_messenger.cc:76