8 #include "flutter/fml/logging.h"
23 fl_binary_messenger_codec_error)
32 fl_binary_messenger_response_handle_impl,
34 BINARY_MESSENGER_RESPONSE_HANDLE_IMPL,
35 FlBinaryMessengerResponseHandle)
39 struct _FlBinaryMessengerImpl {
40 GObject parent_instance;
45 GHashTable* platform_message_handlers;
49 FlBinaryMessengerInterface* iface);
52 FlBinaryMessengerImpl,
55 G_IMPLEMENT_INTERFACE(fl_binary_messenger_get_type(),
58 static void fl_binary_messenger_response_handle_class_init(
59 FlBinaryMessengerResponseHandleClass* klass) {}
65 static void fl_binary_messenger_response_handle_init(
66 FlBinaryMessengerResponseHandle*
self) {}
80 fl_binary_messenger_response_handle_impl,
81 fl_binary_messenger_response_handle_get_type())
83 static
void fl_binary_messenger_default_init(
84 FlBinaryMessengerInterface* iface) {}
87 FlBinaryMessengerResponseHandleImpl*
self =
88 FL_BINARY_MESSENGER_RESPONSE_HANDLE_IMPL(
object);
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");
96 g_clear_object(&self->messenger);
97 self->response_handle =
nullptr;
99 G_OBJECT_CLASS(fl_binary_messenger_response_handle_impl_parent_class)
104 FlBinaryMessengerResponseHandleImplClass* klass) {
105 G_OBJECT_CLASS(klass)->dispose =
110 FlBinaryMessengerResponseHandleImpl*
self) {}
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));
120 self->messenger = FL_BINARY_MESSENGER_IMPL(g_object_ref(messenger));
121 self->response_handle = response_handle;
135 GDestroyNotify destroy_notify) {
140 self->message_handler_destroy_notify = destroy_notify;
146 if (self->message_handler_destroy_notify) {
153 GObject* where_the_object_was) {
154 FlBinaryMessengerImpl*
self = FL_BINARY_MESSENGER_IMPL(
user_data);
158 g_autoptr(GHashTable) handlers =
self->platform_message_handlers;
159 self->platform_message_handlers = g_hash_table_new_full(
161 g_hash_table_remove_all(handlers);
166 const gchar* channel,
168 const FlutterPlatformMessageResponseHandle* response_handle,
170 FlBinaryMessengerImpl*
self = FL_BINARY_MESSENGER_IMPL(
user_data);
173 g_hash_table_lookup(self->platform_message_handlers, channel));
174 if (handler ==
nullptr) {
178 g_autoptr(FlBinaryMessengerResponseHandleImpl) handle =
181 FL_BINARY_MESSENGER_RESPONSE_HANDLE(handle),
188 FlBinaryMessengerImpl*
self = FL_BINARY_MESSENGER_IMPL(
object);
191 g_autoptr(FlEngine)
engine = FL_ENGINE(g_weak_ref_get(&self->engine));
197 g_weak_ref_clear(&self->engine);
199 g_clear_pointer(&self->platform_message_handlers, g_hash_table_unref);
201 G_OBJECT_CLASS(fl_binary_messenger_impl_parent_class)->dispose(
object);
205 FlBinaryMessenger* messenger,
206 const gchar* channel,
209 GDestroyNotify destroy_notify) {
210 FlBinaryMessengerImpl*
self = FL_BINARY_MESSENGER_IMPL(messenger);
213 g_autoptr(FlEngine)
engine = FL_ENGINE(g_weak_ref_get(&self->engine));
215 if (handler !=
nullptr) {
217 "Attempted to set message handler on an FlBinaryMessenger without an "
220 if (destroy_notify !=
nullptr) {
226 if (handler !=
nullptr) {
227 g_hash_table_replace(
228 self->platform_message_handlers, g_strdup(channel),
231 g_hash_table_remove(self->platform_message_handlers, channel);
236 g_object_unref(
value);
237 return G_SOURCE_REMOVE;
242 FlBinaryMessengerResponseHandle* response_handle_,
245 FlBinaryMessengerImpl*
self = FL_BINARY_MESSENGER_IMPL(messenger);
246 g_return_val_if_fail(
247 FL_IS_BINARY_MESSENGER_RESPONSE_HANDLE_IMPL(response_handle_), FALSE);
248 FlBinaryMessengerResponseHandleImpl* response_handle =
249 FL_BINARY_MESSENGER_RESPONSE_HANDLE_IMPL(response_handle_);
251 g_return_val_if_fail(response_handle->messenger ==
self, FALSE);
252 g_return_val_if_fail(response_handle->response_handle !=
nullptr, FALSE);
254 FlEngine*
engine = FL_ENGINE(g_weak_ref_get(&self->engine));
260 if (response_handle->response_handle ==
nullptr) {
264 "Attempted to respond to a message that is already responded to");
268 engine, response_handle->response_handle, response,
error);
269 response_handle->response_handle =
nullptr;
283 g_task_return_pointer(task,
result, g_object_unref);
287 const gchar* channel,
289 GCancellable* cancellable,
292 FlBinaryMessengerImpl*
self = FL_BINARY_MESSENGER_IMPL(messenger);
294 g_autoptr(FlEngine)
engine = FL_ENGINE(g_weak_ref_get(&self->engine));
300 engine, channel, message, cancellable,
309 FlBinaryMessengerImpl*
self = FL_BINARY_MESSENGER_IMPL(messenger);
310 g_return_val_if_fail(g_task_is_valid(
result,
self), FALSE);
312 g_autoptr(GTask) task = G_TASK(
result);
313 GAsyncResult* r = G_ASYNC_RESULT(g_task_propagate_pointer(task,
nullptr));
315 g_autoptr(FlEngine)
engine = FL_ENGINE(g_weak_ref_get(&self->engine));
329 if (response ==
nullptr) {
341 g_autoptr(GError)
error =
nullptr;
343 g_warning(
"Failed to resize channel: %s",
error->message);
348 const gchar* channel,
350 FML_DCHECK(new_size >= 0);
366 g_autoptr(GError)
error =
nullptr;
368 g_warning(
"Failed to set warns on channel overflow: %s",
error->message);
373 const gchar* channel,
387 FlBinaryMessengerImplClass* klass) {
392 FlBinaryMessengerInterface* iface) {
402 self->platform_message_handlers = g_hash_table_new_full(
407 g_return_val_if_fail(FL_IS_ENGINE(
engine),
nullptr);
409 FlBinaryMessengerImpl*
self = FL_BINARY_MESSENGER_IMPL(
410 g_object_new(fl_binary_messenger_impl_get_type(),
nullptr));
413 FL_IS_BINARY_MESSENGER_IMPL(
self);
415 g_weak_ref_init(&self->engine, G_OBJECT(
engine));
421 return FL_BINARY_MESSENGER(
self);
425 FlBinaryMessenger*
self,
426 const gchar* channel,
429 GDestroyNotify destroy_notify) {
430 g_return_if_fail(FL_IS_BINARY_MESSENGER(
self));
431 g_return_if_fail(channel !=
nullptr);
433 FL_BINARY_MESSENGER_GET_IFACE(
self)->set_message_handler_on_channel(
434 self, channel, handler,
user_data, destroy_notify);
439 FlBinaryMessenger*
self,
440 FlBinaryMessengerResponseHandle* response_handle,
443 g_return_val_if_fail(FL_IS_BINARY_MESSENGER(
self), FALSE);
444 g_return_val_if_fail(FL_IS_BINARY_MESSENGER_RESPONSE_HANDLE(response_handle),
447 return FL_BINARY_MESSENGER_GET_IFACE(
self)->send_response(
448 self, response_handle, response,
error);
452 FlBinaryMessenger*
self,
453 const gchar* channel,
455 GCancellable* cancellable,
458 g_return_if_fail(FL_IS_BINARY_MESSENGER(
self));
459 g_return_if_fail(channel !=
nullptr);
461 FL_BINARY_MESSENGER_GET_IFACE(
self)->send_on_channel(
466 FlBinaryMessenger*
self,
469 g_return_val_if_fail(FL_IS_BINARY_MESSENGER(
self), FALSE);
471 return FL_BINARY_MESSENGER_GET_IFACE(
self)->send_on_channel_finish(
476 const gchar* channel,
478 g_return_if_fail(FL_IS_BINARY_MESSENGER(
self));
480 return FL_BINARY_MESSENGER_GET_IFACE(
self)->resize_channel(
self, channel,
485 FlBinaryMessenger*
self,
486 const gchar* channel,
488 g_return_if_fail(FL_IS_BINARY_MESSENGER(
self));
490 return FL_BINARY_MESSENGER_GET_IFACE(
self)->set_warns_on_channel_overflow(
491 self, channel, warns);