10
10
11
11
#include < gmodule.h>
12
12
13
+ // Added here to stop the compiler from optimizing this function away.
14
+ G_MODULE_EXPORT GType fl_binary_messenger_get_type ();
15
+
13
16
G_DEFINE_QUARK (fl_binary_messenger_codec_error_quark,
14
17
fl_binary_messenger_codec_error)
15
18
16
- struct _FlBinaryMessenger {
19
+ G_DECLARE_FINAL_TYPE(FlBinaryMessengerImpl,
20
+ fl_binary_messenger_impl,
21
+ FL,
22
+ BINARY_MESSENGER_IMPL,
23
+ GObject)
24
+
25
+ G_DECLARE_FINAL_TYPE(FlBinaryMessengerResponseHandleImpl,
26
+ fl_binary_messenger_response_handle_impl,
27
+ FL,
28
+ BINARY_MESSENGER_RESPONSE_HANDLE_IMPL,
29
+ FlBinaryMessengerResponseHandle)
30
+
31
+ G_DEFINE_INTERFACE(FlBinaryMessenger, fl_binary_messenger, G_TYPE_OBJECT)
32
+
33
+ struct _FlBinaryMessengerImpl {
17
34
GObject parent_instance;
18
35
19
36
FlEngine* engine;
@@ -22,26 +39,47 @@ struct _FlBinaryMessenger {
22
39
GHashTable* platform_message_handlers;
23
40
};
24
41
25
- G_DEFINE_TYPE (FlBinaryMessenger, fl_binary_messenger, G_TYPE_OBJECT)
42
+ static void fl_binary_messenger_impl_iface_init (
43
+ FlBinaryMessengerInterface* iface);
26
44
27
- struct _FlBinaryMessengerResponseHandle {
28
- GObject parent_instance;
45
+ G_DEFINE_TYPE_WITH_CODE (
46
+ FlBinaryMessengerImpl,
47
+ fl_binary_messenger_impl,
48
+ G_TYPE_OBJECT,
49
+ G_IMPLEMENT_INTERFACE (fl_binary_messenger_get_type(),
50
+ fl_binary_messenger_impl_iface_init))
51
+
52
+ static void fl_binary_messenger_response_handle_class_init(
53
+ FlBinaryMessengerResponseHandleClass* klass) {}
54
+
55
+ G_DEFINE_TYPE (FlBinaryMessengerResponseHandle,
56
+ fl_binary_messenger_response_handle,
57
+ G_TYPE_OBJECT)
58
+
59
+ static void fl_binary_messenger_response_handle_init(
60
+ FlBinaryMessengerResponseHandle* self) {}
61
+
62
+ struct _FlBinaryMessengerResponseHandleImpl {
63
+ FlBinaryMessengerResponseHandle parent_instance;
29
64
30
65
// Messenger sending response on.
31
- FlBinaryMessenger * messenger;
66
+ FlBinaryMessengerImpl * messenger;
32
67
33
68
// Handle to send the response with. This is cleared to nullptr when it is
34
69
// used.
35
70
const FlutterPlatformMessageResponseHandle* response_handle;
36
71
};
37
72
38
- G_DEFINE_TYPE (FlBinaryMessengerResponseHandle,
39
- fl_binary_messenger_response_handle,
40
- G_TYPE_OBJECT)
73
+ G_DEFINE_TYPE (FlBinaryMessengerResponseHandleImpl,
74
+ fl_binary_messenger_response_handle_impl,
75
+ fl_binary_messenger_response_handle_get_type ())
76
+
77
+ static void fl_binary_messenger_default_init(
78
+ FlBinaryMessengerInterface* iface) {}
41
79
42
- static void fl_binary_messenger_response_handle_dispose (GObject* object) {
43
- FlBinaryMessengerResponseHandle * self =
44
- FL_BINARY_MESSENGER_RESPONSE_HANDLE (object);
80
+ static void fl_binary_messenger_response_handle_impl_dispose (GObject* object) {
81
+ FlBinaryMessengerResponseHandleImpl * self =
82
+ FL_BINARY_MESSENGER_RESPONSE_HANDLE_IMPL (object);
45
83
46
84
if (self->response_handle != nullptr && self->messenger ->engine != nullptr ) {
47
85
g_critical (" FlBinaryMessengerResponseHandle was not responded to" );
@@ -50,25 +88,28 @@ static void fl_binary_messenger_response_handle_dispose(GObject* object) {
50
88
g_clear_object (&self->messenger );
51
89
self->response_handle = nullptr ;
52
90
53
- G_OBJECT_CLASS (fl_binary_messenger_response_handle_parent_class )
91
+ G_OBJECT_CLASS (fl_binary_messenger_response_handle_impl_parent_class )
54
92
->dispose (object);
55
93
}
56
94
57
- static void fl_binary_messenger_response_handle_class_init (
58
- FlBinaryMessengerResponseHandleClass* klass) {
59
- G_OBJECT_CLASS (klass)->dispose = fl_binary_messenger_response_handle_dispose;
95
+ static void fl_binary_messenger_response_handle_impl_class_init (
96
+ FlBinaryMessengerResponseHandleImplClass* klass) {
97
+ G_OBJECT_CLASS (klass)->dispose =
98
+ fl_binary_messenger_response_handle_impl_dispose;
60
99
}
61
100
62
- static void fl_binary_messenger_response_handle_init (
63
- FlBinaryMessengerResponseHandle * self) {}
101
+ static void fl_binary_messenger_response_handle_impl_init (
102
+ FlBinaryMessengerResponseHandleImpl * self) {}
64
103
65
- static FlBinaryMessengerResponseHandle* fl_binary_messenger_response_handle_new (
66
- FlBinaryMessenger* messenger,
104
+ static FlBinaryMessengerResponseHandleImpl*
105
+ fl_binary_messenger_response_handle_impl_new (
106
+ FlBinaryMessengerImpl* messenger,
67
107
const FlutterPlatformMessageResponseHandle* response_handle) {
68
- FlBinaryMessengerResponseHandle* self = FL_BINARY_MESSENGER_RESPONSE_HANDLE (
69
- g_object_new (fl_binary_messenger_response_handle_get_type (), nullptr ));
108
+ FlBinaryMessengerResponseHandleImpl* self =
109
+ FL_BINARY_MESSENGER_RESPONSE_HANDLE_IMPL (g_object_new (
110
+ fl_binary_messenger_response_handle_impl_get_type (), nullptr ));
70
111
71
- self->messenger = FL_BINARY_MESSENGER (g_object_ref (messenger));
112
+ self->messenger = FL_BINARY_MESSENGER_IMPL (g_object_ref (messenger));
72
113
self->response_handle = response_handle;
73
114
74
115
return self;
@@ -102,7 +143,7 @@ static void platform_message_handler_free(gpointer data) {
102
143
103
144
static void engine_weak_notify_cb (gpointer user_data,
104
145
GObject* where_the_object_was) {
105
- FlBinaryMessenger * self = FL_BINARY_MESSENGER (user_data);
146
+ FlBinaryMessengerImpl * self = FL_BINARY_MESSENGER_IMPL (user_data);
106
147
self->engine = nullptr ;
107
148
108
149
// Disconnect any handlers.
@@ -119,24 +160,25 @@ static gboolean fl_binary_messenger_platform_message_cb(
119
160
GBytes* message,
120
161
const FlutterPlatformMessageResponseHandle* response_handle,
121
162
void * user_data) {
122
- FlBinaryMessenger * self = FL_BINARY_MESSENGER (user_data);
163
+ FlBinaryMessengerImpl * self = FL_BINARY_MESSENGER_IMPL (user_data);
123
164
124
165
PlatformMessageHandler* handler = static_cast <PlatformMessageHandler*>(
125
166
g_hash_table_lookup (self->platform_message_handlers , channel));
126
167
if (handler == nullptr ) {
127
168
return FALSE ;
128
169
}
129
170
130
- g_autoptr (FlBinaryMessengerResponseHandle) handle =
131
- fl_binary_messenger_response_handle_new (self, response_handle);
132
- handler->message_handler (self, channel, message, handle,
171
+ g_autoptr (FlBinaryMessengerResponseHandleImpl) handle =
172
+ fl_binary_messenger_response_handle_impl_new (self, response_handle);
173
+ handler->message_handler (FL_BINARY_MESSENGER (self), channel, message,
174
+ FL_BINARY_MESSENGER_RESPONSE_HANDLE (handle),
133
175
handler->message_handler_data );
134
176
135
177
return TRUE ;
136
178
}
137
179
138
- static void fl_binary_messenger_dispose (GObject* object) {
139
- FlBinaryMessenger * self = FL_BINARY_MESSENGER (object);
180
+ static void fl_binary_messenger_impl_dispose (GObject* object) {
181
+ FlBinaryMessengerImpl * self = FL_BINARY_MESSENGER_IMPL (object);
140
182
141
183
if (self->engine != nullptr ) {
142
184
g_object_weak_unref (G_OBJECT (self->engine ), engine_weak_notify_cb, self);
@@ -145,41 +187,16 @@ static void fl_binary_messenger_dispose(GObject* object) {
145
187
146
188
g_clear_pointer (&self->platform_message_handlers , g_hash_table_unref);
147
189
148
- G_OBJECT_CLASS (fl_binary_messenger_parent_class)->dispose (object);
149
- }
150
-
151
- static void fl_binary_messenger_class_init (FlBinaryMessengerClass* klass) {
152
- G_OBJECT_CLASS (klass)->dispose = fl_binary_messenger_dispose;
190
+ G_OBJECT_CLASS (fl_binary_messenger_impl_parent_class)->dispose (object);
153
191
}
154
192
155
- static void fl_binary_messenger_init (FlBinaryMessenger* self) {
156
- self->platform_message_handlers = g_hash_table_new_full (
157
- g_str_hash, g_str_equal, g_free, platform_message_handler_free);
158
- }
159
-
160
- FlBinaryMessenger* fl_binary_messenger_new (FlEngine* engine) {
161
- g_return_val_if_fail (FL_IS_ENGINE (engine), nullptr );
162
-
163
- FlBinaryMessenger* self = FL_BINARY_MESSENGER (
164
- g_object_new (fl_binary_messenger_get_type (), nullptr ));
165
-
166
- self->engine = engine;
167
- g_object_weak_ref (G_OBJECT (engine), engine_weak_notify_cb, self);
168
-
169
- fl_engine_set_platform_message_handler (
170
- engine, fl_binary_messenger_platform_message_cb, self, NULL );
171
-
172
- return self;
173
- }
174
-
175
- G_MODULE_EXPORT void fl_binary_messenger_set_message_handler_on_channel (
176
- FlBinaryMessenger* self,
193
+ static void set_message_handler_on_channel (
194
+ FlBinaryMessenger* messenger,
177
195
const gchar* channel,
178
196
FlBinaryMessengerMessageHandler handler,
179
197
gpointer user_data,
180
198
GDestroyNotify destroy_notify) {
181
- g_return_if_fail (FL_IS_BINARY_MESSENGER (self));
182
- g_return_if_fail (channel != nullptr );
199
+ FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL (messenger);
183
200
184
201
// Don't set handlers if engine already gone.
185
202
if (self->engine == nullptr ) {
@@ -203,13 +220,16 @@ G_MODULE_EXPORT void fl_binary_messenger_set_message_handler_on_channel(
203
220
}
204
221
}
205
222
206
- G_MODULE_EXPORT gboolean fl_binary_messenger_send_response (
207
- FlBinaryMessenger* self,
208
- FlBinaryMessengerResponseHandle* response_handle,
209
- GBytes* response,
210
- GError** error) {
211
- g_return_val_if_fail (FL_IS_BINARY_MESSENGER (self), FALSE );
212
- g_return_val_if_fail (response_handle != nullptr , FALSE );
223
+ static gboolean send_response (FlBinaryMessenger* messenger,
224
+ FlBinaryMessengerResponseHandle* response_handle_,
225
+ GBytes* response,
226
+ GError** error) {
227
+ FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL (messenger);
228
+ g_return_val_if_fail (
229
+ FL_IS_BINARY_MESSENGER_RESPONSE_HANDLE_IMPL (response_handle_), FALSE );
230
+ FlBinaryMessengerResponseHandleImpl* response_handle =
231
+ FL_BINARY_MESSENGER_RESPONSE_HANDLE_IMPL (response_handle_);
232
+
213
233
g_return_val_if_fail (response_handle->messenger == self, FALSE );
214
234
g_return_val_if_fail (response_handle->response_handle != nullptr , FALSE );
215
235
@@ -239,15 +259,13 @@ static void platform_message_ready_cb(GObject* object,
239
259
g_task_return_pointer (task, result, g_object_unref);
240
260
}
241
261
242
- G_MODULE_EXPORT void fl_binary_messenger_send_on_channel (
243
- FlBinaryMessenger* self,
244
- const gchar* channel,
245
- GBytes* message,
246
- GCancellable* cancellable,
247
- GAsyncReadyCallback callback,
248
- gpointer user_data) {
249
- g_return_if_fail (FL_IS_BINARY_MESSENGER (self));
250
- g_return_if_fail (channel != nullptr );
262
+ static void send_on_channel (FlBinaryMessenger* messenger,
263
+ const gchar* channel,
264
+ GBytes* message,
265
+ GCancellable* cancellable,
266
+ GAsyncReadyCallback callback,
267
+ gpointer user_data) {
268
+ FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL (messenger);
251
269
252
270
if (self->engine == nullptr ) {
253
271
return ;
@@ -260,11 +278,10 @@ G_MODULE_EXPORT void fl_binary_messenger_send_on_channel(
260
278
: nullptr );
261
279
}
262
280
263
- G_MODULE_EXPORT GBytes* fl_binary_messenger_send_on_channel_finish (
264
- FlBinaryMessenger* self,
265
- GAsyncResult* result,
266
- GError** error) {
267
- g_return_val_if_fail (FL_IS_BINARY_MESSENGER (self), FALSE );
281
+ static GBytes* send_on_channel_finish (FlBinaryMessenger* messenger,
282
+ GAsyncResult* result,
283
+ GError** error) {
284
+ FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL (messenger);
268
285
g_return_val_if_fail (g_task_is_valid (result, self), FALSE );
269
286
270
287
g_autoptr (GTask) task = G_TASK (result);
@@ -276,3 +293,89 @@ G_MODULE_EXPORT GBytes* fl_binary_messenger_send_on_channel_finish(
276
293
277
294
return fl_engine_send_platform_message_finish (self->engine , r, error);
278
295
}
296
+
297
+ static void fl_binary_messenger_impl_class_init (
298
+ FlBinaryMessengerImplClass* klass) {
299
+ G_OBJECT_CLASS (klass)->dispose = fl_binary_messenger_impl_dispose;
300
+ }
301
+
302
+ static void fl_binary_messenger_impl_iface_init (
303
+ FlBinaryMessengerInterface* iface) {
304
+ iface->set_message_handler_on_channel = set_message_handler_on_channel;
305
+ iface->send_response = send_response;
306
+ iface->send_on_channel = send_on_channel;
307
+ iface->send_on_channel_finish = send_on_channel_finish;
308
+ }
309
+
310
+ static void fl_binary_messenger_impl_init (FlBinaryMessengerImpl* self) {
311
+ self->platform_message_handlers = g_hash_table_new_full (
312
+ g_str_hash, g_str_equal, g_free, platform_message_handler_free);
313
+ }
314
+
315
+ FlBinaryMessenger* fl_binary_messenger_new (FlEngine* engine) {
316
+ g_return_val_if_fail (FL_IS_ENGINE (engine), nullptr );
317
+
318
+ FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL (
319
+ g_object_new (fl_binary_messenger_impl_get_type (), nullptr ));
320
+
321
+ // Added to stop compiler complaining about an unused function.
322
+ FL_IS_BINARY_MESSENGER_IMPL (self);
323
+
324
+ self->engine = engine;
325
+ g_object_weak_ref (G_OBJECT (engine), engine_weak_notify_cb, self);
326
+
327
+ fl_engine_set_platform_message_handler (
328
+ engine, fl_binary_messenger_platform_message_cb, self, NULL );
329
+
330
+ return FL_BINARY_MESSENGER (self);
331
+ }
332
+
333
+ G_MODULE_EXPORT void fl_binary_messenger_set_message_handler_on_channel (
334
+ FlBinaryMessenger* self,
335
+ const gchar* channel,
336
+ FlBinaryMessengerMessageHandler handler,
337
+ gpointer user_data,
338
+ GDestroyNotify destroy_notify) {
339
+ g_return_if_fail (FL_IS_BINARY_MESSENGER (self));
340
+ g_return_if_fail (channel != nullptr );
341
+
342
+ FL_BINARY_MESSENGER_GET_IFACE (self)->set_message_handler_on_channel (
343
+ self, channel, handler, user_data, destroy_notify);
344
+ }
345
+
346
+ G_MODULE_EXPORT gboolean fl_binary_messenger_send_response (
347
+ FlBinaryMessenger* self,
348
+ FlBinaryMessengerResponseHandle* response_handle,
349
+ GBytes* response,
350
+ GError** error) {
351
+ g_return_val_if_fail (FL_IS_BINARY_MESSENGER (self), FALSE );
352
+ g_return_val_if_fail (FL_IS_BINARY_MESSENGER_RESPONSE_HANDLE (response_handle),
353
+ FALSE );
354
+
355
+ return FL_BINARY_MESSENGER_GET_IFACE (self)->send_response (
356
+ self, response_handle, response, error);
357
+ }
358
+
359
+ G_MODULE_EXPORT void fl_binary_messenger_send_on_channel (
360
+ FlBinaryMessenger* self,
361
+ const gchar* channel,
362
+ GBytes* message,
363
+ GCancellable* cancellable,
364
+ GAsyncReadyCallback callback,
365
+ gpointer user_data) {
366
+ g_return_if_fail (FL_IS_BINARY_MESSENGER (self));
367
+ g_return_if_fail (channel != nullptr );
368
+
369
+ FL_BINARY_MESSENGER_GET_IFACE (self)->send_on_channel (
370
+ self, channel, message, cancellable, callback, user_data);
371
+ }
372
+
373
+ G_MODULE_EXPORT GBytes* fl_binary_messenger_send_on_channel_finish (
374
+ FlBinaryMessenger* self,
375
+ GAsyncResult* result,
376
+ GError** error) {
377
+ g_return_val_if_fail (FL_IS_BINARY_MESSENGER (self), FALSE );
378
+
379
+ return FL_BINARY_MESSENGER_GET_IFACE (self)->send_on_channel_finish (
380
+ self, result, error);
381
+ }
0 commit comments