@@ -143,6 +143,18 @@ static void platform_message_handler_free(gpointer data) {
143
143
g_free (self);
144
144
}
145
145
146
+ static void engine_weak_notify_cb (gpointer user_data,
147
+ GObject* where_the_object_was) {
148
+ FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL (user_data);
149
+
150
+ // Disconnect any handlers.
151
+ // Take the reference in case a handler tries to modify this table.
152
+ g_autoptr (GHashTable) handlers = self->platform_message_handlers ;
153
+ self->platform_message_handlers = g_hash_table_new_full (
154
+ g_str_hash, g_str_equal, g_free, platform_message_handler_free);
155
+ g_hash_table_remove_all (handlers);
156
+ }
157
+
146
158
static gboolean fl_binary_messenger_platform_message_cb (
147
159
FlEngine* engine,
148
160
const gchar* channel,
@@ -168,6 +180,14 @@ static gboolean fl_binary_messenger_platform_message_cb(
168
180
169
181
static void fl_binary_messenger_impl_dispose (GObject* object) {
170
182
FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL (object);
183
+
184
+ {
185
+ g_autoptr (FlEngine) engine = FL_ENGINE (g_weak_ref_get (&self->engine ));
186
+ if (engine) {
187
+ g_object_weak_unref (G_OBJECT (engine), engine_weak_notify_cb, self);
188
+ }
189
+ }
190
+
171
191
g_weak_ref_clear (&self->engine );
172
192
173
193
g_clear_pointer (&self->platform_message_handlers , g_hash_table_unref);
@@ -206,6 +226,13 @@ static void set_message_handler_on_channel(
206
226
}
207
227
}
208
228
229
+ static gboolean has_message_handler_on_channel (FlBinaryMessenger* messenger,
230
+ const gchar* channel) {
231
+ FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL (messenger);
232
+ return g_hash_table_contains (self->platform_message_handlers ,
233
+ g_strdup (channel));
234
+ }
235
+
209
236
gboolean do_unref (gpointer value) {
210
237
g_object_unref (value);
211
238
return G_SOURCE_REMOVE;
@@ -302,6 +329,7 @@ static void fl_binary_messenger_impl_class_init(
302
329
static void fl_binary_messenger_impl_iface_init (
303
330
FlBinaryMessengerInterface* iface) {
304
331
iface->set_message_handler_on_channel = set_message_handler_on_channel;
332
+ iface->has_message_handler_on_channel = has_message_handler_on_channel;
305
333
iface->send_response = send_response;
306
334
iface->send_on_channel = send_on_channel;
307
335
iface->send_on_channel_finish = send_on_channel_finish;
@@ -322,6 +350,7 @@ FlBinaryMessenger* fl_binary_messenger_new(FlEngine* engine) {
322
350
FL_IS_BINARY_MESSENGER_IMPL (self);
323
351
324
352
g_weak_ref_init (&self->engine , G_OBJECT (engine));
353
+ g_object_weak_ref (G_OBJECT (engine), engine_weak_notify_cb, self);
325
354
326
355
fl_engine_set_platform_message_handler (
327
356
engine, fl_binary_messenger_platform_message_cb, self, NULL );
@@ -342,6 +371,16 @@ G_MODULE_EXPORT void fl_binary_messenger_set_message_handler_on_channel(
342
371
self, channel, handler, user_data, destroy_notify);
343
372
}
344
373
374
+ G_MODULE_EXPORT gboolean
375
+ fl_binary_messenger_has_message_handler_on_channel (FlBinaryMessenger* self,
376
+ const gchar* channel) {
377
+ g_return_val_if_fail (FL_IS_BINARY_MESSENGER (self), FALSE );
378
+ g_return_val_if_fail (channel != nullptr , FALSE );
379
+
380
+ return FL_BINARY_MESSENGER_GET_IFACE (self)->has_message_handler_on_channel (
381
+ self, channel);
382
+ }
383
+
345
384
// Note: This function can be called from any thread.
346
385
G_MODULE_EXPORT gboolean fl_binary_messenger_send_response (
347
386
FlBinaryMessenger* self,
0 commit comments