Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
fl_binary_messenger.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "flutter/shell/platform/linux/public/flutter_linux/fl_binary_messenger.h"
6#include "flutter/shell/platform/linux/fl_binary_messenger_private.h"
7
8#include "flutter/fml/logging.h"
9#include "flutter/shell/platform/linux/fl_engine_private.h"
10#include "flutter/shell/platform/linux/fl_method_codec_private.h"
11#include "flutter/shell/platform/linux/public/flutter_linux/fl_engine.h"
12#include "flutter/shell/platform/linux/public/flutter_linux/fl_method_channel.h"
13#include "flutter/shell/platform/linux/public/flutter_linux/fl_method_codec.h"
14#include "flutter/shell/platform/linux/public/flutter_linux/fl_standard_method_codec.h"
15
16#include <gmodule.h>
17
18static constexpr char kControlChannelName[] = "dev.flutter/channel-buffers";
19static constexpr char kResizeMethod[] = "resize";
20static constexpr char kOverflowMethod[] = "overflow";
21
23 fl_binary_messenger_codec_error)
24
25G_DECLARE_FINAL_TYPE(FlBinaryMessengerImpl,
29 GObject)
30
31G_DECLARE_FINAL_TYPE(FlBinaryMessengerResponseHandleImpl,
32 fl_binary_messenger_response_handle_impl,
33 FL,
34 BINARY_MESSENGER_RESPONSE_HANDLE_IMPL,
35 FlBinaryMessengerResponseHandle)
36
37G_DEFINE_INTERFACE(FlBinaryMessenger, fl_binary_messenger, G_TYPE_OBJECT)
38
39struct _FlBinaryMessengerImpl {
40 GObject parent_instance;
41
42 GWeakRef engine;
43
44 // PlatformMessageHandler keyed by channel name.
45 GHashTable* platform_message_handlers;
46};
47
49 FlBinaryMessengerInterface* iface);
50
52 FlBinaryMessengerImpl,
54 G_TYPE_OBJECT,
55 G_IMPLEMENT_INTERFACE(fl_binary_messenger_get_type(),
57
58static void fl_binary_messenger_response_handle_class_init(
59 FlBinaryMessengerResponseHandleClass* klass) {}
60
61G_DEFINE_TYPE(FlBinaryMessengerResponseHandle,
63 G_TYPE_OBJECT)
64
65static void fl_binary_messenger_response_handle_init(
66 FlBinaryMessengerResponseHandle* self) {}
67
69 FlBinaryMessengerResponseHandle parent_instance;
70
71 // Messenger sending response on.
72 FlBinaryMessengerImpl* messenger;
73
74 // Handle to send the response with. This is cleared to nullptr when it is
75 // used.
77};
78
79G_DEFINE_TYPE(FlBinaryMessengerResponseHandleImpl,
80 fl_binary_messenger_response_handle_impl,
81 fl_binary_messenger_response_handle_get_type())
82
83static void fl_binary_messenger_default_init(
84 FlBinaryMessengerInterface* iface) {}
85
87 FlBinaryMessengerResponseHandleImpl* self =
88 FL_BINARY_MESSENGER_RESPONSE_HANDLE_IMPL(object);
89
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");
94 }
95
96 g_clear_object(&self->messenger);
97 self->response_handle = nullptr;
98
99 G_OBJECT_CLASS(fl_binary_messenger_response_handle_impl_parent_class)
100 ->dispose(object);
101}
102
104 FlBinaryMessengerResponseHandleImplClass* klass) {
105 G_OBJECT_CLASS(klass)->dispose =
107}
108
110 FlBinaryMessengerResponseHandleImpl* self) {}
111
112static 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));
119
120 self->messenger = FL_BINARY_MESSENGER_IMPL(g_object_ref(messenger));
121 self->response_handle = response_handle;
122
123 return self;
124}
125
131
134 gpointer user_data,
135 GDestroyNotify destroy_notify) {
137 g_malloc0(sizeof(PlatformMessageHandler)));
138 self->message_handler = handler;
139 self->message_handler_data = user_data;
140 self->message_handler_destroy_notify = destroy_notify;
141 return self;
142}
143
144static void platform_message_handler_free(gpointer data) {
146 if (self->message_handler_destroy_notify) {
147 self->message_handler_destroy_notify(self->message_handler_data);
148 }
149 g_free(self);
150}
151
152static void engine_weak_notify_cb(gpointer user_data,
153 GObject* where_the_object_was) {
154 FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(user_data);
155
156 // Disconnect any handlers.
157 // Take the reference in case a handler tries to modify this table.
158 g_autoptr(GHashTable) handlers = self->platform_message_handlers;
159 self->platform_message_handlers = g_hash_table_new_full(
160 g_str_hash, g_str_equal, g_free, platform_message_handler_free);
161 g_hash_table_remove_all(handlers);
162}
163
165 FlEngine* engine,
166 const gchar* channel,
167 GBytes* message,
168 const FlutterPlatformMessageResponseHandle* response_handle,
169 void* user_data) {
170 FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(user_data);
171
172 PlatformMessageHandler* handler = static_cast<PlatformMessageHandler*>(
173 g_hash_table_lookup(self->platform_message_handlers, channel));
174 if (handler == nullptr) {
175 return FALSE;
176 }
177
178 g_autoptr(FlBinaryMessengerResponseHandleImpl) handle =
180 handler->message_handler(FL_BINARY_MESSENGER(self), channel, message,
181 FL_BINARY_MESSENGER_RESPONSE_HANDLE(handle),
182 handler->message_handler_data);
183
184 return TRUE;
185}
186
187static void fl_binary_messenger_impl_dispose(GObject* object) {
188 FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(object);
189
190 {
191 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
192 if (engine) {
193 g_object_weak_unref(G_OBJECT(engine), engine_weak_notify_cb, self);
194 }
195 }
196
197 g_weak_ref_clear(&self->engine);
198
199 g_clear_pointer(&self->platform_message_handlers, g_hash_table_unref);
200
201 G_OBJECT_CLASS(fl_binary_messenger_impl_parent_class)->dispose(object);
202}
203
205 FlBinaryMessenger* messenger,
206 const gchar* channel,
208 gpointer user_data,
209 GDestroyNotify destroy_notify) {
210 FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(messenger);
211
212 // Don't set handlers if engine already gone.
213 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
214 if (engine == nullptr) {
215 if (handler != nullptr) {
216 g_warning(
217 "Attempted to set message handler on an FlBinaryMessenger without an "
218 "engine");
219 }
220 if (destroy_notify != nullptr) {
221 destroy_notify(user_data);
222 }
223 return;
224 }
225
226 if (handler != nullptr) {
227 g_hash_table_replace(
228 self->platform_message_handlers, g_strdup(channel),
229 platform_message_handler_new(handler, user_data, destroy_notify));
230 } else {
231 g_hash_table_remove(self->platform_message_handlers, channel);
232 }
233}
234
235static gboolean do_unref(gpointer value) {
236 g_object_unref(value);
237 return G_SOURCE_REMOVE;
238}
239
240// Note: This function can be called from any thread.
241static gboolean send_response(FlBinaryMessenger* messenger,
242 FlBinaryMessengerResponseHandle* response_handle_,
243 GBytes* response,
244 GError** error) {
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_);
250
251 g_return_val_if_fail(response_handle->messenger == self, FALSE);
252 g_return_val_if_fail(response_handle->response_handle != nullptr, FALSE);
253
254 FlEngine* engine = FL_ENGINE(g_weak_ref_get(&self->engine));
255 if (engine == nullptr) {
256 return TRUE;
257 }
258
259 gboolean result = false;
260 if (response_handle->response_handle == nullptr) {
261 g_set_error(
264 "Attempted to respond to a message that is already responded to");
265 result = FALSE;
266 } else {
268 engine, response_handle->response_handle, response, error);
269 response_handle->response_handle = nullptr;
270 }
271
272 // This guarantees that the dispose method for the engine is executed
273 // on the platform thread in the rare chance this is the last ref.
274 g_idle_add(do_unref, engine);
275
276 return result;
277}
278
279static void platform_message_ready_cb(GObject* object,
280 GAsyncResult* result,
281 gpointer user_data) {
282 GTask* task = G_TASK(user_data);
283 g_task_return_pointer(task, result, g_object_unref);
284}
285
286static void send_on_channel(FlBinaryMessenger* messenger,
287 const gchar* channel,
288 GBytes* message,
289 GCancellable* cancellable,
290 GAsyncReadyCallback callback,
291 gpointer user_data) {
292 FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(messenger);
293
294 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
295 if (engine == nullptr) {
296 return;
297 }
298
300 engine, channel, message, cancellable,
301 callback != nullptr ? platform_message_ready_cb : nullptr,
302 callback != nullptr ? g_task_new(self, cancellable, callback, user_data)
303 : nullptr);
304}
305
306static GBytes* send_on_channel_finish(FlBinaryMessenger* messenger,
307 GAsyncResult* result,
308 GError** error) {
309 FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(messenger);
310 g_return_val_if_fail(g_task_is_valid(result, self), FALSE);
311
312 g_autoptr(GTask) task = G_TASK(result);
313 GAsyncResult* r = G_ASYNC_RESULT(g_task_propagate_pointer(task, nullptr));
314
315 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
316 if (engine == nullptr) {
317 return nullptr;
318 }
319
321}
322
323// Completes method call and returns TRUE if the call was successful.
324static gboolean finish_method(GObject* object,
325 GAsyncResult* result,
326 GError** error) {
327 g_autoptr(GBytes) response = fl_binary_messenger_send_on_channel_finish(
328 FL_BINARY_MESSENGER(object), result, error);
329 if (response == nullptr) {
330 return FALSE;
331 }
332 g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
333 return fl_method_codec_decode_response(FL_METHOD_CODEC(codec), response,
334 error) != nullptr;
335}
336
337// Called when a response is received for the resize channel message.
338static void resize_channel_response_cb(GObject* object,
339 GAsyncResult* result,
340 gpointer user_data) {
341 g_autoptr(GError) error = nullptr;
342 if (!finish_method(object, result, &error)) {
343 g_warning("Failed to resize channel: %s", error->message);
344 }
345}
346
347static void resize_channel(FlBinaryMessenger* messenger,
348 const gchar* channel,
349 int64_t new_size) {
350 FML_DCHECK(new_size >= 0);
351 g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
352 g_autoptr(FlValue) args = fl_value_new_list();
356 FL_METHOD_CODEC(codec), kResizeMethod, args, nullptr);
359 nullptr);
360}
361
362// Called when a response is received for the warns on overflow message.
364 GAsyncResult* result,
365 gpointer user_data) {
366 g_autoptr(GError) error = nullptr;
367 if (!finish_method(object, result, &error)) {
368 g_warning("Failed to set warns on channel overflow: %s", error->message);
369 }
370}
371
372static void set_warns_on_channel_overflow(FlBinaryMessenger* messenger,
373 const gchar* channel,
374 bool warns) {
375 g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
376 g_autoptr(FlValue) args = fl_value_new_list();
380 FL_METHOD_CODEC(codec), kOverflowMethod, args, nullptr);
382 messenger, kControlChannelName, message, nullptr,
384}
385
387 FlBinaryMessengerImplClass* klass) {
388 G_OBJECT_CLASS(klass)->dispose = fl_binary_messenger_impl_dispose;
389}
390
392 FlBinaryMessengerInterface* iface) {
393 iface->set_message_handler_on_channel = set_message_handler_on_channel;
394 iface->send_response = send_response;
395 iface->send_on_channel = send_on_channel;
396 iface->send_on_channel_finish = send_on_channel_finish;
397 iface->resize_channel = resize_channel;
398 iface->set_warns_on_channel_overflow = set_warns_on_channel_overflow;
399}
400
401static void fl_binary_messenger_impl_init(FlBinaryMessengerImpl* self) {
402 self->platform_message_handlers = g_hash_table_new_full(
403 g_str_hash, g_str_equal, g_free, platform_message_handler_free);
404}
405
406FlBinaryMessenger* fl_binary_messenger_new(FlEngine* engine) {
407 g_return_val_if_fail(FL_IS_ENGINE(engine), nullptr);
408
409 FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(
410 g_object_new(fl_binary_messenger_impl_get_type(), nullptr));
411
412 // Added to stop compiler complaining about an unused function.
413 FL_IS_BINARY_MESSENGER_IMPL(self);
414
415 g_weak_ref_init(&self->engine, G_OBJECT(engine));
416 g_object_weak_ref(G_OBJECT(engine), engine_weak_notify_cb, self);
417
420
421 return FL_BINARY_MESSENGER(self);
422}
423
425 FlBinaryMessenger* self,
426 const gchar* channel,
428 gpointer user_data,
429 GDestroyNotify destroy_notify) {
430 g_return_if_fail(FL_IS_BINARY_MESSENGER(self));
431 g_return_if_fail(channel != nullptr);
432
433 FL_BINARY_MESSENGER_GET_IFACE(self)->set_message_handler_on_channel(
434 self, channel, handler, user_data, destroy_notify);
435}
436
437// Note: This function can be called from any thread.
438G_MODULE_EXPORT gboolean fl_binary_messenger_send_response(
439 FlBinaryMessenger* self,
440 FlBinaryMessengerResponseHandle* response_handle,
441 GBytes* response,
442 GError** error) {
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),
445 FALSE);
446
447 return FL_BINARY_MESSENGER_GET_IFACE(self)->send_response(
448 self, response_handle, response, error);
449}
450
452 FlBinaryMessenger* self,
453 const gchar* channel,
454 GBytes* message,
455 GCancellable* cancellable,
456 GAsyncReadyCallback callback,
457 gpointer user_data) {
458 g_return_if_fail(FL_IS_BINARY_MESSENGER(self));
459 g_return_if_fail(channel != nullptr);
460
461 FL_BINARY_MESSENGER_GET_IFACE(self)->send_on_channel(
462 self, channel, message, cancellable, callback, user_data);
463}
464
466 FlBinaryMessenger* self,
467 GAsyncResult* result,
468 GError** error) {
469 g_return_val_if_fail(FL_IS_BINARY_MESSENGER(self), FALSE);
470
471 return FL_BINARY_MESSENGER_GET_IFACE(self)->send_on_channel_finish(
472 self, result, error);
473}
474
475G_MODULE_EXPORT void fl_binary_messenger_resize_channel(FlBinaryMessenger* self,
476 const gchar* channel,
477 int64_t new_size) {
478 g_return_if_fail(FL_IS_BINARY_MESSENGER(self));
479
480 return FL_BINARY_MESSENGER_GET_IFACE(self)->resize_channel(self, channel,
481 new_size);
482}
483
485 FlBinaryMessenger* self,
486 const gchar* channel,
487 bool warns) {
488 g_return_if_fail(FL_IS_BINARY_MESSENGER(self));
489
490 return FL_BINARY_MESSENGER_GET_IFACE(self)->set_warns_on_channel_overflow(
491 self, channel, warns);
492}
FlutterEngine engine
Definition main.cc:68
static void fl_binary_messenger_impl_class_init(FlBinaryMessengerImplClass *klass)
static void resize_channel(FlBinaryMessenger *messenger, const gchar *channel, int64_t new_size)
G_MODULE_EXPORT GBytes * fl_binary_messenger_send_on_channel_finish(FlBinaryMessenger *self, GAsyncResult *result, GError **error)
static void send_on_channel(FlBinaryMessenger *messenger, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
static void fl_binary_messenger_response_handle_impl_dispose(GObject *object)
G_DEFINE_QUARK(fl_binary_messenger_codec_error_quark, fl_binary_messenger_codec_error) G_DECLARE_FINAL_TYPE(FlBinaryMessengerImpl
static void set_message_handler_on_channel(FlBinaryMessenger *messenger, const gchar *channel, FlBinaryMessengerMessageHandler handler, gpointer user_data, GDestroyNotify destroy_notify)
static gboolean fl_binary_messenger_platform_message_cb(FlEngine *engine, const gchar *channel, GBytes *message, const FlutterPlatformMessageResponseHandle *response_handle, void *user_data)
G_MODULE_EXPORT void fl_binary_messenger_resize_channel(FlBinaryMessenger *self, const gchar *channel, int64_t new_size)
G_MODULE_EXPORT void fl_binary_messenger_set_message_handler_on_channel(FlBinaryMessenger *self, const gchar *channel, FlBinaryMessengerMessageHandler handler, gpointer user_data, GDestroyNotify destroy_notify)
static void engine_weak_notify_cb(gpointer user_data, GObject *where_the_object_was)
G_MODULE_EXPORT void fl_binary_messenger_send_on_channel(FlBinaryMessenger *self, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
static void fl_binary_messenger_impl_dispose(GObject *object)
static void platform_message_ready_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void fl_binary_messenger_response_handle_impl_init(FlBinaryMessengerResponseHandleImpl *self)
FlBinaryMessenger * fl_binary_messenger_new(FlEngine *engine)
static void fl_binary_messenger_impl_init(FlBinaryMessengerImpl *self)
GObject G_DECLARE_FINAL_TYPE(FlBinaryMessengerResponseHandleImpl, fl_binary_messenger_response_handle_impl, FL, BINARY_MESSENGER_RESPONSE_HANDLE_IMPL, FlBinaryMessengerResponseHandle) struct _FlBinaryMessengerImpl
G_MODULE_EXPORT gboolean fl_binary_messenger_send_response(FlBinaryMessenger *self, FlBinaryMessengerResponseHandle *response_handle, GBytes *response, GError **error)
G_MODULE_EXPORT void fl_binary_messenger_set_warns_on_channel_overflow(FlBinaryMessenger *self, const gchar *channel, bool warns)
static gboolean send_response(FlBinaryMessenger *messenger, FlBinaryMessengerResponseHandle *response_handle_, GBytes *response, GError **error)
static void set_warns_on_channel_overflow(FlBinaryMessenger *messenger, const gchar *channel, bool warns)
static constexpr char kControlChannelName[]
static void fl_binary_messenger_impl_iface_init(FlBinaryMessengerInterface *iface)
static constexpr char kOverflowMethod[]
static void resize_channel_response_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static gboolean finish_method(GObject *object, GAsyncResult *result, GError **error)
static void set_warns_on_channel_overflow_response_cb(GObject *object, GAsyncResult *result, gpointer user_data)
BINARY_MESSENGER_IMPL
static FlBinaryMessengerResponseHandleImpl * fl_binary_messenger_response_handle_impl_new(FlBinaryMessengerImpl *messenger, const FlutterPlatformMessageResponseHandle *response_handle)
static void fl_binary_messenger_response_handle_impl_class_init(FlBinaryMessengerResponseHandleImplClass *klass)
static gboolean do_unref(gpointer value)
static constexpr char kResizeMethod[]
fl_binary_messenger_impl
G_DEFINE_TYPE(FlBinaryMessengerResponseHandle, fl_binary_messenger_response_handle, G_TYPE_OBJECT) static void fl_binary_messenger_response_handle_init(FlBinaryMessengerResponseHandle *self)
static PlatformMessageHandler * platform_message_handler_new(FlBinaryMessengerMessageHandler handler, gpointer user_data, GDestroyNotify destroy_notify)
G_DEFINE_TYPE_WITH_CODE(FlBinaryMessengerImpl, fl_binary_messenger_impl, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(fl_binary_messenger_get_type(), fl_binary_messenger_impl_iface_init)) static void fl_binary_messenger_response_handle_class_init(FlBinaryMessengerResponseHandleClass *klass)
static GBytes * send_on_channel_finish(FlBinaryMessenger *messenger, GAsyncResult *result, GError **error)
static void platform_message_handler_free(gpointer data)
G_MODULE_EXPORT GQuark fl_binary_messenger_codec_error_quark(void) G_GNUC_CONST
#define FL_BINARY_MESSENGER_ERROR
@ FL_BINARY_MESSENGER_ERROR_ALREADY_RESPONDED
G_MODULE_EXPORT GObject typedef void(* FlBinaryMessengerMessageHandler)(FlBinaryMessenger *messenger, const gchar *channel, GBytes *message, FlBinaryMessengerResponseHandle *response_handle, gpointer user_data)
G_MODULE_EXPORT fl_binary_messenger_response_handle
void fl_engine_set_platform_message_handler(FlEngine *self, FlEnginePlatformMessageHandler handler, gpointer user_data, GDestroyNotify destroy_notify)
Definition fl_engine.cc:583
gboolean fl_engine_send_platform_message_response(FlEngine *self, const FlutterPlatformMessageResponseHandle *handle, GBytes *response, GError **error)
Definition fl_engine.cc:636
void fl_engine_send_platform_message(FlEngine *self, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
Definition fl_engine.cc:668
GBytes * fl_engine_send_platform_message_finish(FlEngine *self, GAsyncResult *result, GError **error)
Definition fl_engine.cc:727
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
G_DEFINE_INTERFACE(FlKeyboardViewDelegate, fl_keyboard_view_delegate, G_TYPE_OBJECT) static void fl_keyboard_view_delegate_default_init(FlKeyboardViewDelegateInterface *iface)
FlMethodResponse * fl_method_codec_decode_response(FlMethodCodec *self, GBytes *message, GError **error)
GBytes * fl_method_codec_encode_method_call(FlMethodCodec *self, const gchar *name, FlValue *args, GError **error)
const uint8_t uint32_t uint32_t GError ** error
uint8_t value
G_MODULE_EXPORT FlStandardMethodCodec * fl_standard_method_codec_new()
GAsyncResult * result
G_MODULE_EXPORT FlValue * fl_value_new_string(const gchar *value)
Definition fl_value.cc:276
G_MODULE_EXPORT FlValue * fl_value_new_bool(bool value)
Definition fl_value.cc:255
G_MODULE_EXPORT FlValue * fl_value_new_int(int64_t value)
Definition fl_value.cc:262
G_MODULE_EXPORT void fl_value_append_take(FlValue *self, FlValue *value)
Definition fl_value.cc:600
G_MODULE_EXPORT FlValue * fl_value_new_list()
Definition fl_value.cc:349
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition fl_value.h:42
#define FML_DCHECK(condition)
Definition logging.h:103
Win32Message message
return FALSE
FlBinaryMessengerMessageHandler message_handler
GDestroyNotify message_handler_destroy_notify
FlBinaryMessengerResponseHandle parent_instance
const FlutterPlatformMessageResponseHandle * response_handle