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

// This is a copy of GtkSocketAccessible, which requires GTK 3.24.30

struct _FlSocketAccessible {
  GtkContainerAccessible parent;
  AtkObject* accessible_socket;
};

G_DEFINE_TYPE(FlSocketAccessible,
              fl_socket_accessible,
              GTK_TYPE_CONTAINER_ACCESSIBLE)

static AtkObject* fl_socket_accessible_ref_child(AtkObject* object, int i) {
  FlSocketAccessible* self = FL_SOCKET_ACCESSIBLE(object);
  return i == 0 ? ATK_OBJECT(g_object_ref(self->accessible_socket)) : nullptr;
}

static int fl_socket_accessible_get_n_children(AtkObject* object) {
  return 1;
}

static void fl_socket_accessible_finalize(GObject* object) {
  FlSocketAccessible* self = FL_SOCKET_ACCESSIBLE(object);

  g_clear_object(&self->accessible_socket);

  G_OBJECT_CLASS(fl_socket_accessible_parent_class)->finalize(object);
}

static void fl_socket_accessible_initialize(AtkObject* object, gpointer data) {
  FlSocketAccessible* self = FL_SOCKET_ACCESSIBLE(object);

  ATK_OBJECT_CLASS(fl_socket_accessible_parent_class)->initialize(object, data);

  self->accessible_socket = atk_socket_new();
}

static void fl_socket_accessible_class_init(FlSocketAccessibleClass* klass) {
  GObjectClass* object_class = G_OBJECT_CLASS(klass);
  object_class->finalize = fl_socket_accessible_finalize;

  AtkObjectClass* atk_class = ATK_OBJECT_CLASS(klass);
  atk_class->initialize = fl_socket_accessible_initialize;
  atk_class->get_n_children = fl_socket_accessible_get_n_children;
  atk_class->ref_child = fl_socket_accessible_ref_child;
}

static void fl_socket_accessible_init(FlSocketAccessible* self) {}

void fl_socket_accessible_embed(FlSocketAccessible* self, gchar* id) {
  atk_socket_embed(ATK_SOCKET(self->accessible_socket), id);
}
