Skip to content

Commit 5a6fa26

Browse files
committed
Make an interface for FlBinaryMessenger
1 parent 921872d commit 5a6fa26

File tree

3 files changed

+462
-103
lines changed

3 files changed

+462
-103
lines changed

shell/platform/linux/fl_binary_messenger.cc

Lines changed: 182 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,27 @@
1010

1111
#include <gmodule.h>
1212

13+
// Added here to stop the compiler from optimizing this function away.
14+
G_MODULE_EXPORT GType fl_binary_messenger_get_type();
15+
1316
G_DEFINE_QUARK(fl_binary_messenger_codec_error_quark,
1417
fl_binary_messenger_codec_error)
1518

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 {
1734
GObject parent_instance;
1835

1936
FlEngine* engine;
@@ -22,26 +39,47 @@ struct _FlBinaryMessenger {
2239
GHashTable* platform_message_handlers;
2340
};
2441

25-
G_DEFINE_TYPE(FlBinaryMessenger, fl_binary_messenger, G_TYPE_OBJECT)
42+
static void fl_binary_messenger_impl_iface_init(
43+
FlBinaryMessengerInterface* iface);
2644

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;
2964

3065
// Messenger sending response on.
31-
FlBinaryMessenger* messenger;
66+
FlBinaryMessengerImpl* messenger;
3267

3368
// Handle to send the response with. This is cleared to nullptr when it is
3469
// used.
3570
const FlutterPlatformMessageResponseHandle* response_handle;
3671
};
3772

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) {}
4179

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);
4583

4684
if (self->response_handle != nullptr && self->messenger->engine != nullptr) {
4785
g_critical("FlBinaryMessengerResponseHandle was not responded to");
@@ -50,25 +88,28 @@ static void fl_binary_messenger_response_handle_dispose(GObject* object) {
5088
g_clear_object(&self->messenger);
5189
self->response_handle = nullptr;
5290

53-
G_OBJECT_CLASS(fl_binary_messenger_response_handle_parent_class)
91+
G_OBJECT_CLASS(fl_binary_messenger_response_handle_impl_parent_class)
5492
->dispose(object);
5593
}
5694

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;
6099
}
61100

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) {}
64103

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,
67107
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));
70111

71-
self->messenger = FL_BINARY_MESSENGER(g_object_ref(messenger));
112+
self->messenger = FL_BINARY_MESSENGER_IMPL(g_object_ref(messenger));
72113
self->response_handle = response_handle;
73114

74115
return self;
@@ -102,7 +143,7 @@ static void platform_message_handler_free(gpointer data) {
102143

103144
static void engine_weak_notify_cb(gpointer user_data,
104145
GObject* where_the_object_was) {
105-
FlBinaryMessenger* self = FL_BINARY_MESSENGER(user_data);
146+
FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(user_data);
106147
self->engine = nullptr;
107148

108149
// Disconnect any handlers.
@@ -119,24 +160,25 @@ static gboolean fl_binary_messenger_platform_message_cb(
119160
GBytes* message,
120161
const FlutterPlatformMessageResponseHandle* response_handle,
121162
void* user_data) {
122-
FlBinaryMessenger* self = FL_BINARY_MESSENGER(user_data);
163+
FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(user_data);
123164

124165
PlatformMessageHandler* handler = static_cast<PlatformMessageHandler*>(
125166
g_hash_table_lookup(self->platform_message_handlers, channel));
126167
if (handler == nullptr) {
127168
return FALSE;
128169
}
129170

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),
133175
handler->message_handler_data);
134176

135177
return TRUE;
136178
}
137179

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);
140182

141183
if (self->engine != nullptr) {
142184
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) {
145187

146188
g_clear_pointer(&self->platform_message_handlers, g_hash_table_unref);
147189

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);
153191
}
154192

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,
177195
const gchar* channel,
178196
FlBinaryMessengerMessageHandler handler,
179197
gpointer user_data,
180198
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);
183200

184201
// Don't set handlers if engine already gone.
185202
if (self->engine == nullptr) {
@@ -203,13 +220,16 @@ G_MODULE_EXPORT void fl_binary_messenger_set_message_handler_on_channel(
203220
}
204221
}
205222

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+
213233
g_return_val_if_fail(response_handle->messenger == self, FALSE);
214234
g_return_val_if_fail(response_handle->response_handle != nullptr, FALSE);
215235

@@ -239,15 +259,13 @@ static void platform_message_ready_cb(GObject* object,
239259
g_task_return_pointer(task, result, g_object_unref);
240260
}
241261

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);
251269

252270
if (self->engine == nullptr) {
253271
return;
@@ -260,11 +278,10 @@ G_MODULE_EXPORT void fl_binary_messenger_send_on_channel(
260278
: nullptr);
261279
}
262280

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);
268285
g_return_val_if_fail(g_task_is_valid(result, self), FALSE);
269286

270287
g_autoptr(GTask) task = G_TASK(result);
@@ -276,3 +293,89 @@ G_MODULE_EXPORT GBytes* fl_binary_messenger_send_on_channel_finish(
276293

277294
return fl_engine_send_platform_message_finish(self->engine, r, error);
278295
}
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

Comments
 (0)