Flutter Engine
fl_json_method_codec.cc File Reference
#include "flutter/shell/platform/linux/public/flutter_linux/fl_json_method_codec.h"
#include <gmodule.h>
#include "flutter/shell/platform/linux/public/flutter_linux/fl_json_message_codec.h"

Go to the source code of this file.

Classes

struct  _FlJsonMethodCodec
 

Functions

 G_DEFINE_TYPE (FlJsonMethodCodec, fl_json_method_codec, fl_method_codec_get_type()) static void fl_json_method_codec_dispose(GObject *object)
 
static GBytes * fl_json_method_codec_encode_method_call (FlMethodCodec *codec, const gchar *name, FlValue *args, GError **error)
 
static gboolean fl_json_method_codec_decode_method_call (FlMethodCodec *codec, GBytes *message, gchar **name, FlValue **args, GError **error)
 
static GBytes * fl_json_method_codec_encode_success_envelope (FlMethodCodec *codec, FlValue *result, GError **error)
 
static GBytes * fl_json_method_codec_encode_error_envelope (FlMethodCodec *codec, const gchar *code, const gchar *error_message, FlValue *details, GError **error)
 
static FlMethodResponse * fl_json_method_codec_decode_response (FlMethodCodec *codec, GBytes *message, GError **error)
 
static void fl_json_method_codec_class_init (FlJsonMethodCodecClass *klass)
 
static void fl_json_method_codec_init (FlJsonMethodCodec *self)
 
G_MODULE_EXPORT FlJsonMethodCodec * fl_json_method_codec_new ()
 

Variables

static constexpr char kMethodKey [] = "method"
 
static constexpr char kArgsKey [] = "args"
 

Function Documentation

◆ fl_json_method_codec_class_init()

static void fl_json_method_codec_class_init ( FlJsonMethodCodecClass *  klass)
static

Definition at line 187 of file fl_json_method_codec.cc.

References fl_json_method_codec_decode_method_call(), fl_json_method_codec_decode_response(), fl_json_method_codec_encode_error_envelope(), fl_json_method_codec_encode_method_call(), and fl_json_method_codec_encode_success_envelope().

187  {
188  G_OBJECT_CLASS(klass)->dispose = fl_json_method_codec_dispose;
189  FL_METHOD_CODEC_CLASS(klass)->encode_method_call =
191  FL_METHOD_CODEC_CLASS(klass)->decode_method_call =
193  FL_METHOD_CODEC_CLASS(klass)->encode_success_envelope =
195  FL_METHOD_CODEC_CLASS(klass)->encode_error_envelope =
197  FL_METHOD_CODEC_CLASS(klass)->decode_response =
199 }
static gboolean fl_json_method_codec_decode_method_call(FlMethodCodec *codec, GBytes *message, gchar **name, FlValue **args, GError **error)
static GBytes * fl_json_method_codec_encode_success_envelope(FlMethodCodec *codec, FlValue *result, GError **error)
static GBytes * fl_json_method_codec_encode_error_envelope(FlMethodCodec *codec, const gchar *code, const gchar *error_message, FlValue *details, GError **error)
static GBytes * fl_json_method_codec_encode_method_call(FlMethodCodec *codec, const gchar *name, FlValue *args, GError **error)
static FlMethodResponse * fl_json_method_codec_decode_response(FlMethodCodec *codec, GBytes *message, GError **error)

◆ fl_json_method_codec_decode_method_call()

static gboolean fl_json_method_codec_decode_method_call ( FlMethodCodec *  codec,
GBytes *  message,
gchar **  name,
FlValue **  args,
GError **  error 
)
static

Definition at line 50 of file fl_json_method_codec.cc.

References fl_message_codec_decode_message(), FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, fl_value_get_string(), fl_value_get_type(), fl_value_lookup_string(), fl_value_ref(), FL_VALUE_TYPE_MAP, FL_VALUE_TYPE_STRING, kArgsKey, kMethodKey, TRUE, and value.

Referenced by fl_json_method_codec_class_init().

54  {
55  FlJsonMethodCodec* self = FL_JSON_METHOD_CODEC(codec);
56 
58  FL_MESSAGE_CODEC(self->codec), message, error);
59  if (value == nullptr) {
60  return FALSE;
61  }
62 
65  "Expected JSON map in method resonse, got %d instead",
67  return FALSE;
68  }
69 
71  if (method_value == nullptr) {
73  "Missing JSON method field in method resonse");
74  return FALSE;
75  }
76  if (fl_value_get_type(method_value) != FL_VALUE_TYPE_STRING) {
78  "Expected JSON string for method name, got %d instead",
79  fl_value_get_type(method_value));
80  return FALSE;
81  }
83 
84  *name = g_strdup(fl_value_get_string(method_value));
85  *args = args_value != nullptr ? fl_value_ref(args_value) : nullptr;
86 
87  return TRUE;
88 }
G_MODULE_EXPORT FlValueType fl_value_get_type(FlValue *self)
Definition: fl_value.cc:395
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition: fl_value.h:39
FlMethodResponse GError ** error
#define FL_MESSAGE_CODEC_ERROR
static constexpr char kArgsKey[]
uint8_t value
G_MODULE_EXPORT FlValue * fl_value_lookup_string(FlValue *self, const gchar *key)
Definition: fl_value.cc:712
static constexpr char kMethodKey[]
G_MODULE_EXPORT FlValue * fl_value_ref(FlValue *self)
Definition: fl_value.cc:335
const char * name
Definition: fuchsia.cc:50
return TRUE
Definition: fl_view.cc:107
G_MODULE_EXPORT const gchar * fl_value_get_string(FlValue *self)
Definition: fl_value.cc:596
G_MODULE_EXPORT FlValue * fl_message_codec_decode_message(FlMessageCodec *self, GBytes *message, GError **error)

◆ fl_json_method_codec_decode_response()

static FlMethodResponse* fl_json_method_codec_decode_response ( FlMethodCodec *  codec,
GBytes *  message,
GError **  error 
)
static

Definition at line 127 of file fl_json_method_codec.cc.

References fl_message_codec_decode_message(), FL_MESSAGE_CODEC_ERROR, FL_MESSAGE_CODEC_ERROR_FAILED, fl_method_error_response_new(), fl_method_success_response_new(), fl_value_get_length(), fl_value_get_list_value(), fl_value_get_string(), fl_value_get_type(), FL_VALUE_TYPE_LIST, FL_VALUE_TYPE_NULL, FL_VALUE_TYPE_STRING, length, and value.

Referenced by fl_json_method_codec_class_init().

130  {
131  FlJsonMethodCodec* self = FL_JSON_METHOD_CODEC(codec);
132 
134  FL_MESSAGE_CODEC(self->codec), message, error);
135  if (value == nullptr) {
136  return nullptr;
137  }
138 
141  "Expected JSON list in method resonse, got %d instead",
143  return nullptr;
144  }
145 
146  size_t length = fl_value_get_length(value);
147  if (length == 1) {
148  return FL_METHOD_RESPONSE(
150  } else if (length == 3) {
151  FlValue* code_value = fl_value_get_list_value(value, 0);
152  if (fl_value_get_type(code_value) != FL_VALUE_TYPE_STRING) {
154  "Error code wrong type");
155  return nullptr;
156  }
157  const gchar* code = fl_value_get_string(code_value);
158 
159  FlValue* message_value = fl_value_get_list_value(value, 1);
160  if (fl_value_get_type(message_value) != FL_VALUE_TYPE_STRING &&
161  fl_value_get_type(message_value) != FL_VALUE_TYPE_NULL) {
163  "Error message wrong type");
164  return nullptr;
165  }
166  const gchar* message =
167  fl_value_get_type(message_value) == FL_VALUE_TYPE_STRING
168  ? fl_value_get_string(message_value)
169  : nullptr;
170 
172  if (fl_value_get_type(args) == FL_VALUE_TYPE_NULL) {
173  args = nullptr;
174  }
175 
176  return FL_METHOD_RESPONSE(
177  fl_method_error_response_new(code, message, args));
178  } else {
180  "Got response envelope of length %zi, expected 1 (success) or "
181  "3 (error)",
182  length);
183  return nullptr;
184  }
185 }
G_MODULE_EXPORT FlMethodSuccessResponse * fl_method_success_response_new(FlValue *result)
G_MODULE_EXPORT FlValueType fl_value_get_type(FlValue *self)
Definition: fl_value.cc:395
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition: fl_value.h:39
FlMethodResponse GError ** error
#define FL_MESSAGE_CODEC_ERROR
uint8_t value
size_t length
G_MODULE_EXPORT FlValue * fl_value_get_list_value(FlValue *self, size_t index)
Definition: fl_value.cc:677
G_MODULE_EXPORT const gchar * fl_value_get_string(FlValue *self)
Definition: fl_value.cc:596
G_MODULE_EXPORT FlValue * fl_message_codec_decode_message(FlMessageCodec *self, GBytes *message, GError **error)
G_MODULE_EXPORT size_t fl_value_get_length(FlValue *self)
Definition: fl_value.cc:631
G_MODULE_EXPORT FlMethodErrorResponse * fl_method_error_response_new(const gchar *code, const gchar *message, FlValue *details)

◆ fl_json_method_codec_encode_error_envelope()

static GBytes* fl_json_method_codec_encode_error_envelope ( FlMethodCodec *  codec,
const gchar *  code,
const gchar *  error_message,
FlValue details,
GError **  error 
)
static

Definition at line 106 of file fl_json_method_codec.cc.

References fl_message_codec_encode_message(), fl_value_append_take(), fl_value_new_list(), fl_value_new_null(), fl_value_new_string(), and fl_value_ref().

Referenced by fl_json_method_codec_class_init().

111  {
112  FlJsonMethodCodec* self = FL_JSON_METHOD_CODEC(codec);
113 
114  g_autoptr(FlValue) message = fl_value_new_list();
116  fl_value_append_take(message, error_message != nullptr
117  ? fl_value_new_string(error_message)
118  : fl_value_new_null());
119  fl_value_append_take(message, details != nullptr ? fl_value_ref(details)
120  : fl_value_new_null());
121 
122  return fl_message_codec_encode_message(FL_MESSAGE_CODEC(self->codec), message,
123  error);
124 }
G_MODULE_EXPORT FlValue * fl_value_new_list()
Definition: fl_value.cc:310
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition: fl_value.h:39
FlMethodResponse GError ** error
G_MODULE_EXPORT void fl_value_append_take(FlValue *self, FlValue *value)
Definition: fl_value.cc:514
G_MODULE_EXPORT FlValue * fl_value_new_string(const gchar *value)
Definition: fl_value.cc:247
G_MODULE_EXPORT FlValue * fl_value_ref(FlValue *self)
Definition: fl_value.cc:335
G_MODULE_EXPORT GBytes * fl_message_codec_encode_message(FlMessageCodec *self, FlValue *message, GError **error)
G_MODULE_EXPORT FlValue * fl_value_new_null()
Definition: fl_value.cc:222

◆ fl_json_method_codec_encode_method_call()

static GBytes* fl_json_method_codec_encode_method_call ( FlMethodCodec *  codec,
const gchar *  name,
FlValue args,
GError **  error 
)
static

Definition at line 33 of file fl_json_method_codec.cc.

References fl_message_codec_encode_message(), fl_value_new_map(), fl_value_new_null(), fl_value_new_string(), fl_value_ref(), fl_value_set_take(), kArgsKey, and kMethodKey.

Referenced by fl_json_method_codec_class_init().

36  {
37  FlJsonMethodCodec* self = FL_JSON_METHOD_CODEC(codec);
38 
39  g_autoptr(FlValue) message = fl_value_new_map();
43  args != nullptr ? fl_value_ref(args) : fl_value_new_null());
44 
45  return fl_message_codec_encode_message(FL_MESSAGE_CODEC(self->codec), message,
46  error);
47 }
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition: fl_value.h:39
FlMethodResponse GError ** error
G_MODULE_EXPORT FlValue * fl_value_new_map()
Definition: fl_value.cc:327
static constexpr char kArgsKey[]
G_MODULE_EXPORT void fl_value_set_take(FlValue *self, FlValue *key, FlValue *value)
Definition: fl_value.cc:532
G_MODULE_EXPORT FlValue * fl_value_new_string(const gchar *value)
Definition: fl_value.cc:247
static constexpr char kMethodKey[]
G_MODULE_EXPORT FlValue * fl_value_ref(FlValue *self)
Definition: fl_value.cc:335
const char * name
Definition: fuchsia.cc:50
G_MODULE_EXPORT GBytes * fl_message_codec_encode_message(FlMessageCodec *self, FlValue *message, GError **error)
G_MODULE_EXPORT FlValue * fl_value_new_null()
Definition: fl_value.cc:222

◆ fl_json_method_codec_encode_success_envelope()

static GBytes* fl_json_method_codec_encode_success_envelope ( FlMethodCodec *  codec,
FlValue result,
GError **  error 
)
static

Definition at line 91 of file fl_json_method_codec.cc.

References fl_message_codec_encode_message(), fl_value_append_take(), fl_value_new_list(), fl_value_new_null(), and fl_value_ref().

Referenced by fl_json_method_codec_class_init().

94  {
95  FlJsonMethodCodec* self = FL_JSON_METHOD_CODEC(codec);
96 
97  g_autoptr(FlValue) message = fl_value_new_list();
99  message, result != nullptr ? fl_value_ref(result) : fl_value_new_null());
100 
101  return fl_message_codec_encode_message(FL_MESSAGE_CODEC(self->codec), message,
102  error);
103 }
G_MODULE_EXPORT FlValue * fl_value_new_list()
Definition: fl_value.cc:310
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition: fl_value.h:39
FlMethodResponse GError ** error
G_MODULE_EXPORT void fl_value_append_take(FlValue *self, FlValue *value)
Definition: fl_value.cc:514
G_MODULE_EXPORT FlValue * fl_value_ref(FlValue *self)
Definition: fl_value.cc:335
G_MODULE_EXPORT GBytes * fl_message_codec_encode_message(FlMessageCodec *self, FlValue *message, GError **error)
G_MODULE_EXPORT FlValue * fl_value_new_null()
Definition: fl_value.cc:222

◆ fl_json_method_codec_init()

static void fl_json_method_codec_init ( FlJsonMethodCodec *  self)
static

Definition at line 201 of file fl_json_method_codec.cc.

References fl_json_message_codec_new().

201  {
202  self->codec = fl_json_message_codec_new();
203 }
G_MODULE_EXPORT FlJsonMessageCodec * fl_json_message_codec_new()

◆ fl_json_method_codec_new()

G_MODULE_EXPORT FlJsonMethodCodec* fl_json_method_codec_new ( )

Definition at line 205 of file fl_json_method_codec.cc.

Referenced by decode_error_method_call(), decode_error_response(), decode_method_call(), decode_response_with_error(), decode_response_with_success(), encode_error_envelope(), encode_method_call(), encode_success_envelope(), fl_platform_plugin_new(), fl_text_input_plugin_new(), and TEST().

205  {
206  return static_cast<FlJsonMethodCodec*>(
207  g_object_new(fl_json_method_codec_get_type(), nullptr));
208 }

◆ G_DEFINE_TYPE()

G_DEFINE_TYPE ( FlJsonMethodCodec  ,
fl_json_method_codec  ,
fl_method_codec_get_type()   
)

Definition at line 20 of file fl_json_method_codec.cc.

24  {
25  FlJsonMethodCodec* self = FL_JSON_METHOD_CODEC(object);
26 
27  g_clear_object(&self->codec);
28 
29  G_OBJECT_CLASS(fl_json_method_codec_parent_class)->dispose(object);
30 }

Variable Documentation

◆ kArgsKey

constexpr char kArgsKey[] = "args"
static

◆ kMethodKey

constexpr char kMethodKey[] = "method"
static