5#include "flutter/shell/platform/linux/public/flutter_linux/fl_method_channel.h"
9#include "flutter/shell/platform/linux/fl_method_call_private.h"
10#include "flutter/shell/platform/linux/fl_method_channel_private.h"
11#include "flutter/shell/platform/linux/fl_method_codec_private.h"
34G_DEFINE_TYPE(FlMethodChannel, fl_method_channel, G_TYPE_OBJECT)
40 FlBinaryMessengerResponseHandle* response_handle,
44 if (
self->method_call_handler ==
nullptr) {
48 g_autofree gchar* method =
nullptr;
50 g_autoptr(GError)
error =
nullptr;
53 g_warning(
"Failed to decode method call: %s",
error->message);
67 g_task_return_pointer(task,
result, g_object_unref);
72 g_autoptr(FlMethodChannel)
self = FL_METHOD_CHANNEL(
user_data);
77 if (
self->method_call_handler_destroy_notify !=
nullptr) {
78 self->method_call_handler_destroy_notify(
self->method_call_handler_data);
80 self->method_call_handler =
nullptr;
81 self->method_call_handler_data =
nullptr;
82 self->method_call_handler_destroy_notify =
nullptr;
86 FlMethodChannel*
self = FL_METHOD_CHANNEL(
object);
92 g_clear_object(&
self->messenger);
93 g_clear_pointer(&
self->name, g_free);
94 g_clear_object(&
self->codec);
96 if (
self->method_call_handler_destroy_notify !=
nullptr) {
97 self->method_call_handler_destroy_notify(
self->method_call_handler_data);
99 self->method_call_handler =
nullptr;
100 self->method_call_handler_data =
nullptr;
101 self->method_call_handler_destroy_notify =
nullptr;
103 G_OBJECT_CLASS(fl_method_channel_parent_class)->dispose(
object);
113 FlBinaryMessenger* messenger,
115 FlMethodCodec* codec) {
116 g_return_val_if_fail(FL_IS_BINARY_MESSENGER(messenger),
nullptr);
117 g_return_val_if_fail(
name !=
nullptr,
nullptr);
118 g_return_val_if_fail(FL_IS_METHOD_CODEC(codec),
nullptr);
120 FlMethodChannel*
self =
121 FL_METHOD_CHANNEL(g_object_new(fl_method_channel_get_type(),
nullptr));
123 self->messenger = FL_BINARY_MESSENGER(g_object_ref(messenger));
125 self->codec = FL_METHOD_CODEC(g_object_ref(codec));
135 FlMethodChannel*
self,
136 FlMethodChannelMethodCallHandler handler,
138 GDestroyNotify destroy_notify) {
139 g_return_if_fail(FL_IS_METHOD_CHANNEL(
self));
142 if (
self->channel_closed) {
143 if (handler !=
nullptr) {
145 "Attempted to set method call handler on a closed FlMethodChannel");
147 if (destroy_notify !=
nullptr) {
153 if (
self->method_call_handler_destroy_notify !=
nullptr) {
154 self->method_call_handler_destroy_notify(
self->method_call_handler_data);
157 self->method_call_handler = handler;
159 self->method_call_handler_destroy_notify = destroy_notify;
163 FlMethodChannel*
self,
166 GCancellable* cancellable,
169 g_return_if_fail(FL_IS_METHOD_CHANNEL(
self));
170 g_return_if_fail(method !=
nullptr);
172 g_autoptr(GTask) task =
176 g_autoptr(GError)
error =
nullptr;
180 if (task !=
nullptr) {
181 g_task_return_error(task,
error);
189 g_steal_pointer(&task));
193 FlMethodChannel*
self,
196 g_return_val_if_fail(FL_IS_METHOD_CHANNEL(
self),
nullptr);
197 g_return_val_if_fail(g_task_is_valid(
result,
self),
nullptr);
199 g_autoptr(GTask) task = G_TASK(
result);
200 GAsyncResult* r = G_ASYNC_RESULT(g_task_propagate_pointer(task,
nullptr));
202 g_autoptr(GBytes) response =
204 if (response ==
nullptr) {
212 FlMethodChannel*
self,
213 FlBinaryMessengerResponseHandle* response_handle,
214 FlMethodResponse* response,
216 g_return_val_if_fail(FL_IS_METHOD_CHANNEL(
self),
FALSE);
217 g_return_val_if_fail(FL_IS_BINARY_MESSENGER_RESPONSE_HANDLE(response_handle),
219 g_return_val_if_fail(FL_IS_METHOD_SUCCESS_RESPONSE(response) ||
220 FL_IS_METHOD_ERROR_RESPONSE(response) ||
221 FL_IS_METHOD_NOT_IMPLEMENTED_RESPONSE(response),
224 g_autoptr(GBytes)
message =
nullptr;
225 if (FL_IS_METHOD_SUCCESS_RESPONSE(response)) {
226 FlMethodSuccessResponse* r = FL_METHOD_SUCCESS_RESPONSE(response);
232 }
else if (FL_IS_METHOD_ERROR_RESPONSE(response)) {
233 FlMethodErrorResponse* r = FL_METHOD_ERROR_RESPONSE(response);
241 }
else if (FL_IS_METHOD_NOT_IMPLEMENTED_RESPONSE(response)) {
244 g_assert_not_reached();
G_DEFINE_TYPE(FlBasicMessageChannelResponseHandle, fl_basic_message_channel_response_handle, G_TYPE_OBJECT) static void fl_basic_message_channel_response_handle_dispose(GObject *object)
G_MODULE_EXPORT GBytes * fl_binary_messenger_send_on_channel_finish(FlBinaryMessenger *self, GAsyncResult *result, GError **error)
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)
G_MODULE_EXPORT void fl_binary_messenger_send_on_channel(FlBinaryMessenger *self, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
G_MODULE_EXPORT gboolean fl_binary_messenger_send_response(FlBinaryMessenger *self, FlBinaryMessengerResponseHandle *response_handle, GBytes *response, GError **error)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
FlMethodCall * fl_method_call_new(const gchar *name, FlValue *args, FlMethodChannel *channel, FlBinaryMessengerResponseHandle *response_handle)
static void message_cb(FlBinaryMessenger *messenger, const gchar *channel, GBytes *message, FlBinaryMessengerResponseHandle *response_handle, gpointer user_data)
static void fl_method_channel_class_init(FlMethodChannelClass *klass)
static void fl_method_channel_init(FlMethodChannel *self)
G_MODULE_EXPORT FlMethodResponse * fl_method_channel_invoke_method_finish(FlMethodChannel *self, GAsyncResult *result, GError **error)
G_MODULE_EXPORT FlMethodChannel * fl_method_channel_new(FlBinaryMessenger *messenger, const gchar *name, FlMethodCodec *codec)
G_MODULE_EXPORT void fl_method_channel_invoke_method(FlMethodChannel *self, const gchar *method, FlValue *args, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
static void message_response_cb(GObject *object, GAsyncResult *result, gpointer user_data)
gboolean fl_method_channel_respond(FlMethodChannel *self, FlBinaryMessengerResponseHandle *response_handle, FlMethodResponse *response, GError **error)
static void fl_method_channel_dispose(GObject *object)
static void channel_closed_cb(gpointer user_data)
G_MODULE_EXPORT void fl_method_channel_set_method_call_handler(FlMethodChannel *self, FlMethodChannelMethodCallHandler handler, gpointer user_data, GDestroyNotify destroy_notify)
G_BEGIN_DECLS G_MODULE_EXPORT FlMethodCall * method_call
FlMethodResponse * fl_method_codec_decode_response(FlMethodCodec *self, GBytes *message, GError **error)
gboolean fl_method_codec_decode_method_call(FlMethodCodec *self, GBytes *message, gchar **name, FlValue **args, GError **error)
GBytes * fl_method_codec_encode_success_envelope(FlMethodCodec *self, FlValue *result, GError **error)
GBytes * fl_method_codec_encode_method_call(FlMethodCodec *self, const gchar *name, FlValue *args, GError **error)
GBytes * fl_method_codec_encode_error_envelope(FlMethodCodec *self, const gchar *code, const gchar *message, FlValue *details, GError **error)
G_MODULE_EXPORT FlValue * fl_method_success_response_get_result(FlMethodSuccessResponse *self)
G_MODULE_EXPORT const gchar * fl_method_error_response_get_message(FlMethodErrorResponse *self)
G_MODULE_EXPORT FlValue * fl_method_error_response_get_details(FlMethodErrorResponse *self)
G_MODULE_EXPORT const gchar * fl_method_error_response_get_code(FlMethodErrorResponse *self)
const uint8_t uint32_t uint32_t GError ** error
typedefG_BEGIN_DECLS struct _FlValue FlValue
DEF_SWITCHES_START aot vmservice shared library name
FlMethodChannelMethodCallHandler method_call_handler
FlBinaryMessenger * messenger
GDestroyNotify method_call_handler_destroy_notify
gpointer method_call_handler_data