// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "flutter/shell/platform/linux/public/flutter_linux/fl_method_response.h" #include G_DEFINE_QUARK(fl_method_response_error_quark, fl_method_response_error) struct _FlMethodSuccessResponse { FlMethodResponse parent_instance; FlValue* result; }; struct _FlMethodErrorResponse { FlMethodResponse parent_instance; gchar* code; gchar* message; FlValue* details; }; struct _FlMethodNotImplementedResponse { FlMethodResponse parent_instance; }; // Added here to stop the compiler from optimising these functions away. G_MODULE_EXPORT GType fl_method_response_get_type(); G_MODULE_EXPORT GType fl_method_success_response_get_type(); G_MODULE_EXPORT GType fl_method_error_response_get_type(); G_MODULE_EXPORT GType fl_method_not_implemented_response_get_type(); G_DEFINE_TYPE(FlMethodResponse, fl_method_response, G_TYPE_OBJECT) G_DEFINE_TYPE(FlMethodSuccessResponse, fl_method_success_response, fl_method_response_get_type()) G_DEFINE_TYPE(FlMethodErrorResponse, fl_method_error_response, fl_method_response_get_type()) G_DEFINE_TYPE(FlMethodNotImplementedResponse, fl_method_not_implemented_response, fl_method_response_get_type()) static void fl_method_response_class_init(FlMethodResponseClass* klass) {} static void fl_method_response_init(FlMethodResponse* self) {} static void fl_method_success_response_dispose(GObject* object) { FlMethodSuccessResponse* self = FL_METHOD_SUCCESS_RESPONSE(object); g_clear_pointer(&self->result, fl_value_unref); G_OBJECT_CLASS(fl_method_success_response_parent_class)->dispose(object); } static void fl_method_success_response_class_init( FlMethodSuccessResponseClass* klass) { G_OBJECT_CLASS(klass)->dispose = fl_method_success_response_dispose; } static void fl_method_success_response_init(FlMethodSuccessResponse* self) {} static void fl_method_error_response_dispose(GObject* object) { FlMethodErrorResponse* self = FL_METHOD_ERROR_RESPONSE(object); g_clear_pointer(&self->code, g_free); g_clear_pointer(&self->message, g_free); g_clear_pointer(&self->details, fl_value_unref); G_OBJECT_CLASS(fl_method_error_response_parent_class)->dispose(object); } static void fl_method_error_response_class_init( FlMethodErrorResponseClass* klass) { G_OBJECT_CLASS(klass)->dispose = fl_method_error_response_dispose; } static void fl_method_error_response_init(FlMethodErrorResponse* self) {} static void fl_method_not_implemented_response_class_init( FlMethodNotImplementedResponseClass* klass) {} static void fl_method_not_implemented_response_init( FlMethodNotImplementedResponse* self) {} G_MODULE_EXPORT FlValue* fl_method_response_get_result(FlMethodResponse* self, GError** error) { if (FL_IS_METHOD_SUCCESS_RESPONSE(self)) { return fl_method_success_response_get_result( FL_METHOD_SUCCESS_RESPONSE(self)); } if (FL_IS_METHOD_ERROR_RESPONSE(self)) { const gchar* code = fl_method_error_response_get_code(FL_METHOD_ERROR_RESPONSE(self)); const gchar* message = fl_method_error_response_get_message(FL_METHOD_ERROR_RESPONSE(self)); FlValue* details = fl_method_error_response_get_details(FL_METHOD_ERROR_RESPONSE(self)); g_autofree gchar* details_text = nullptr; if (details != nullptr) { details_text = fl_value_to_string(details); } g_autoptr(GString) error_message = g_string_new(""); g_string_append_printf(error_message, "Remote code returned error %s", code); if (message != nullptr) { g_string_append_printf(error_message, ": %s", message); } if (details_text != nullptr) { g_string_append_printf(error_message, " %s", details_text); } g_set_error_literal(error, FL_METHOD_RESPONSE_ERROR, FL_METHOD_RESPONSE_ERROR_REMOTE_ERROR, error_message->str); return nullptr; } else if (FL_IS_METHOD_NOT_IMPLEMENTED_RESPONSE(self)) { g_set_error(error, FL_METHOD_RESPONSE_ERROR, FL_METHOD_RESPONSE_ERROR_NOT_IMPLEMENTED, "Requested method is not implemented"); return nullptr; } else { g_set_error(error, FL_METHOD_RESPONSE_ERROR, FL_METHOD_RESPONSE_ERROR_FAILED, "Unknown response type"); return nullptr; } } G_MODULE_EXPORT FlMethodSuccessResponse* fl_method_success_response_new( FlValue* result) { FlMethodSuccessResponse* self = FL_METHOD_SUCCESS_RESPONSE( g_object_new(fl_method_success_response_get_type(), nullptr)); if (result != nullptr) { self->result = fl_value_ref(result); } return self; } G_MODULE_EXPORT FlValue* fl_method_success_response_get_result( FlMethodSuccessResponse* self) { g_return_val_if_fail(FL_IS_METHOD_SUCCESS_RESPONSE(self), nullptr); return self->result; } G_MODULE_EXPORT FlMethodErrorResponse* fl_method_error_response_new( const gchar* code, const gchar* message, FlValue* details) { g_return_val_if_fail(code != nullptr, nullptr); FlMethodErrorResponse* self = FL_METHOD_ERROR_RESPONSE( g_object_new(fl_method_error_response_get_type(), nullptr)); self->code = g_strdup(code); self->message = g_strdup(message); self->details = details != nullptr ? fl_value_ref(details) : nullptr; return self; } G_MODULE_EXPORT const gchar* fl_method_error_response_get_code( FlMethodErrorResponse* self) { g_return_val_if_fail(FL_IS_METHOD_ERROR_RESPONSE(self), nullptr); return self->code; } G_MODULE_EXPORT const gchar* fl_method_error_response_get_message( FlMethodErrorResponse* self) { g_return_val_if_fail(FL_IS_METHOD_ERROR_RESPONSE(self), nullptr); return self->message; } G_MODULE_EXPORT FlValue* fl_method_error_response_get_details( FlMethodErrorResponse* self) { g_return_val_if_fail(FL_IS_METHOD_ERROR_RESPONSE(self), nullptr); return self->details; } G_MODULE_EXPORT FlMethodNotImplementedResponse* fl_method_not_implemented_response_new() { return FL_METHOD_NOT_IMPLEMENTED_RESPONSE( g_object_new(fl_method_not_implemented_response_get_type(), nullptr)); }