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) {
154 const gchar* channel,
156 const FlutterPlatformMessageResponseHandle* response_handle,
158 FlBinaryMessenger*
self = FL_BINARY_MESSENGER(
user_data);
164 FlBinaryMessengerImpl*
self = FL_BINARY_MESSENGER_IMPL(
object);
166 g_weak_ref_clear(&self->engine);
168 g_clear_pointer(&self->platform_message_handlers, g_hash_table_unref);
170 G_OBJECT_CLASS(fl_binary_messenger_impl_parent_class)->dispose(
object);
174 FlBinaryMessenger* messenger,
175 const gchar* channel,
178 GDestroyNotify destroy_notify) {
179 FlBinaryMessengerImpl*
self = FL_BINARY_MESSENGER_IMPL(messenger);
182 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
183 if (engine ==
nullptr) {
184 if (handler !=
nullptr) {
186 "Attempted to set message handler on an FlBinaryMessenger without an "
189 if (destroy_notify !=
nullptr) {
195 if (handler !=
nullptr) {
196 g_hash_table_replace(
197 self->platform_message_handlers, g_strdup(channel),
200 g_hash_table_remove(self->platform_message_handlers, channel);
205 g_object_unref(
value);
206 return G_SOURCE_REMOVE;
211 FlBinaryMessengerResponseHandle* response_handle_,
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_);
220 g_return_val_if_fail(response_handle->messenger ==
self, FALSE);
221 g_return_val_if_fail(response_handle->response_handle !=
nullptr, FALSE);
223 FlEngine* engine = FL_ENGINE(g_weak_ref_get(&self->engine));
224 if (engine ==
nullptr) {
228 gboolean result =
false;
229 if (response_handle->response_handle ==
nullptr) {
233 "Attempted to respond to a message that is already responded to");
237 engine, response_handle->response_handle, response,
error);
238 response_handle->response_handle =
nullptr;
249 GAsyncResult* result,
251 g_autoptr(GTask) task = G_TASK(
user_data);
252 g_task_return_pointer(task, g_object_ref(result), g_object_unref);
256 const gchar* channel,
258 GCancellable* cancellable,
259 GAsyncReadyCallback callback,
261 FlBinaryMessengerImpl*
self = FL_BINARY_MESSENGER_IMPL(messenger);
263 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
264 if (engine ==
nullptr) {
269 engine, channel, message, cancellable,
271 callback !=
nullptr ? g_task_new(
self, cancellable, callback,
user_data)
276 GAsyncResult* result,
278 FlBinaryMessengerImpl*
self = FL_BINARY_MESSENGER_IMPL(messenger);
279 g_return_val_if_fail(g_task_is_valid(result,
self), FALSE);
281 GTask* task = G_TASK(result);
282 g_autoptr(GAsyncResult) r =
283 G_ASYNC_RESULT(g_task_propagate_pointer(task,
error));
288 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
289 if (engine ==
nullptr) {
298 GAsyncResult* result,
301 FL_BINARY_MESSENGER(
object), result,
error);
302 if (response ==
nullptr) {
312 GAsyncResult* result,
314 g_autoptr(GError)
error =
nullptr;
316 g_warning(
"Failed to resize channel: %s",
error->message);
321 const gchar* channel,
323 FML_DCHECK(new_size >= 0);
337 GAsyncResult* result,
339 g_autoptr(GError)
error =
nullptr;
341 g_warning(
"Failed to set warns on channel overflow: %s",
error->message);
346 const gchar* channel,
359 static void shutdown(FlBinaryMessenger* messenger) {
360 FlBinaryMessengerImpl*
self = FL_BINARY_MESSENGER_IMPL(messenger);
364 g_autoptr(GHashTable) handlers =
self->platform_message_handlers;
365 self->platform_message_handlers = g_hash_table_new_full(
367 g_hash_table_remove_all(handlers);
371 FlBinaryMessengerImplClass* klass) {
376 FlBinaryMessengerInterface* iface) {
387 self->platform_message_handlers = g_hash_table_new_full(
392 g_return_val_if_fail(FL_IS_ENGINE(engine),
nullptr);
394 FlBinaryMessengerImpl*
self = FL_BINARY_MESSENGER_IMPL(
395 g_object_new(fl_binary_messenger_impl_get_type(),
nullptr));
398 FL_IS_BINARY_MESSENGER_IMPL(
self);
400 g_weak_ref_init(&self->engine, G_OBJECT(engine));
405 return FL_BINARY_MESSENGER(
self);
409 FlBinaryMessenger*
self,
410 const gchar* channel,
413 GDestroyNotify destroy_notify) {
414 g_return_if_fail(FL_IS_BINARY_MESSENGER(
self));
415 g_return_if_fail(channel !=
nullptr);
417 FL_BINARY_MESSENGER_GET_IFACE(
self)->set_message_handler_on_channel(
418 self, channel, handler,
user_data, destroy_notify);
423 FlBinaryMessenger*
self,
424 FlBinaryMessengerResponseHandle* response_handle,
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),
431 return FL_BINARY_MESSENGER_GET_IFACE(
self)->send_response(
432 self, response_handle, response,
error);
436 FlBinaryMessenger*
self,
437 const gchar* channel,
439 GCancellable* cancellable,
440 GAsyncReadyCallback callback,
442 g_return_if_fail(FL_IS_BINARY_MESSENGER(
self));
443 g_return_if_fail(channel !=
nullptr);
445 FL_BINARY_MESSENGER_GET_IFACE(
self)->send_on_channel(
446 self, channel, message, cancellable, callback,
user_data);
450 FlBinaryMessenger*
self,
451 GAsyncResult* result,
453 g_return_val_if_fail(FL_IS_BINARY_MESSENGER(
self), FALSE);
455 return FL_BINARY_MESSENGER_GET_IFACE(
self)->send_on_channel_finish(
456 self, result,
error);
460 const gchar* channel,
462 g_return_if_fail(FL_IS_BINARY_MESSENGER(
self));
464 return FL_BINARY_MESSENGER_GET_IFACE(
self)->resize_channel(
self, channel,
469 FlBinaryMessenger*
self,
470 const gchar* channel,
472 g_return_if_fail(FL_IS_BINARY_MESSENGER(
self));
474 return FL_BINARY_MESSENGER_GET_IFACE(
self)->set_warns_on_channel_overflow(
475 self, channel, warns);
479 FlBinaryMessenger* messenger,
480 const gchar* channel,
482 const FlutterPlatformMessageResponseHandle* response_handle) {
483 FlBinaryMessengerImpl*
self = FL_BINARY_MESSENGER_IMPL(messenger);
486 g_hash_table_lookup(self->platform_message_handlers, channel));
487 if (handler ==
nullptr) {
491 g_autoptr(FlBinaryMessengerResponseHandleImpl) handle =
494 FL_BINARY_MESSENGER_RESPONSE_HANDLE(handle),
501 g_return_if_fail(FL_IS_BINARY_MESSENGER(
self));
503 return FL_BINARY_MESSENGER_GET_IFACE(
self)->shutdown(
self);