// 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_string_codec.h"

#include <gmodule.h>

G_DEFINE_QUARK(fl_string_codec_error_quark, fl_string_codec_error)

struct _FlStringCodec {
  FlMessageCodec parent_instance;
};

G_DEFINE_TYPE(FlStringCodec, fl_string_codec, fl_message_codec_get_type())

// Implments FlMessageCodec::encode_message
static GBytes* fl_string_codec_encode_message(FlMessageCodec* codec,
                                              FlValue* value,
                                              GError** error) {
  if (fl_value_get_type(value) != FL_VALUE_TYPE_STRING) {
    g_set_error(error, FL_MESSAGE_CODEC_ERROR,
                FL_MESSAGE_CODEC_ERROR_UNSUPPORTED_TYPE,
                "Only string values supported");
    return nullptr;
  }

  const gchar* text = fl_value_get_string(value);
  return g_bytes_new(text, strlen(text));
}

// Implments FlMessageCodec::decode_message
static FlValue* fl_string_codec_decode_message(FlMessageCodec* codec,
                                               GBytes* message,
                                               GError** error) {
  gsize data_length;
  const gchar* data =
      static_cast<const gchar*>(g_bytes_get_data(message, &data_length));
  return fl_value_new_string_sized(data, data_length);
}

static void fl_string_codec_class_init(FlStringCodecClass* klass) {
  FL_MESSAGE_CODEC_CLASS(klass)->encode_message =
      fl_string_codec_encode_message;
  FL_MESSAGE_CODEC_CLASS(klass)->decode_message =
      fl_string_codec_decode_message;
}

static void fl_string_codec_init(FlStringCodec* self) {}

G_MODULE_EXPORT FlStringCodec* fl_string_codec_new() {
  return static_cast<FlStringCodec*>(
      g_object_new(fl_string_codec_get_type(), nullptr));
}
