/* Python interface to inferiors.

   Copyright (C) 2009-2026 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include "python-internal.h"
#include "process-stratum-target.h"
#include "inferior.h"
#include "observable.h"
#include "target-connection.h"
#include "py-events.h"
#include "py-event.h"
#include "arch-utils.h"
#include "remote.h"
#include "charset.h"
#include "gdbsupport/unordered_map.h"

/* The Python object that represents a connection.  */

struct connection_object : public PyObject
{
  /* The process target that represents this connection.   When a
     connection_object is created this field will always point at a valid
     target.  Later, if GDB stops using this target (the target is popped
     from all target stacks) then this field is set to nullptr, which
     indicates that this Python object is now in the invalid state (see
     the is_valid() method below).  */
  struct process_stratum_target *target;
};

extern PyTypeObject connection_object_type;

extern PyTypeObject remote_connection_object_type;

/* Require that CONNECTION be valid.  */
#define CONNPY_REQUIRE_VALID(connection)			\
  do {								\
    if (connection->target == nullptr)				\
      {								\
	PyErr_SetString (PyExc_RuntimeError,			\
			 _("Connection no longer exists."));	\
	return nullptr;						\
      }								\
  } while (0)

/* A map between process_stratum targets and the Python object representing
   them.  We actually hold a gdbpy_ref around the Python object so that
   reference counts are handled correctly when entries are deleted.  */
static gdb::unordered_map<process_stratum_target *,
			  gdbpy_ref<connection_object>> all_connection_objects;

/* Return a reference to a gdb.TargetConnection object for TARGET.  If
   TARGET is nullptr then a reference to None is returned.

   Previously created gdb.TargetConnection objects are cached, and
   additional references to the same connection object can be returned with
   later calls to this function.  */

gdbpy_ref<>
target_to_connection_object (process_stratum_target *target)
{
  if (target == nullptr)
    return gdbpy_ref<>::new_reference (Py_None);

  gdbpy_ref <connection_object> conn_obj;
  auto conn_obj_iter = all_connection_objects.find (target);
  if (conn_obj_iter == all_connection_objects.end ())
    {
      PyTypeObject *type;

      if (is_remote_target (target))
	type = &remote_connection_object_type;
      else
	type = &connection_object_type;

      conn_obj.reset (PyObject_New (connection_object, type));
      if (conn_obj == nullptr)
	return nullptr;
      conn_obj->target = target;
      all_connection_objects.emplace (target, conn_obj);
    }
  else
    conn_obj = conn_obj_iter->second;

  gdb_assert (conn_obj != nullptr);

  /* Repackage the result as a PyObject reference.  */
  return gdbpy_ref<> ((PyObject *) conn_obj.release ());
}

/* Return a list of gdb.TargetConnection objects, one for each currently
   active connection.  The returned list is in no particular order.  */

PyObject *
gdbpy_connections (PyObject *self, PyObject *args)
{
  gdbpy_ref<> list (PyList_New (0));
  if (list == nullptr)
    return nullptr;

  for (process_stratum_target *target : all_non_exited_process_targets ())
    {
      gdb_assert (target != nullptr);

      gdbpy_ref<> conn = target_to_connection_object (target);
      if (conn == nullptr)
	return nullptr;
      gdb_assert (conn.get () != Py_None);

      if (PyList_Append (list.get (), conn.get ()) < 0)
	return nullptr;
    }

  return list.release ();
}

/* Emit a connection event for TARGET to REGISTRY.  Return 0 on success, or
   a negative value on error.  */

static int
emit_connection_event (process_stratum_target *target,
		       eventregistry_object *registry)
{
  gdbpy_ref<> event_obj
    = create_event_object (&connection_event_object_type);
  if (event_obj == nullptr)
    return -1;

  gdbpy_ref<> conn = target_to_connection_object (target);
  if (evpy_add_attribute (event_obj.get (), "connection", conn.get ()) < 0)
    return -1;

  return evpy_emit_event (event_obj.get (), registry);
}

/* Callback for the connection_removed observer.  */

static void
connpy_connection_removed (process_stratum_target *target)
{
  if (!gdb_python_initialized)
    return;

  gdbpy_enter enter_py;

  if (!evregpy_no_listeners_p (gdb_py_events.connection_removed))
    if (emit_connection_event (target, gdb_py_events.connection_removed) < 0)
      gdbpy_print_stack ();

  auto conn_obj_iter = all_connection_objects.find (target);
  if (conn_obj_iter != all_connection_objects.end ())
    {
      gdbpy_ref <connection_object> conn_obj = conn_obj_iter->second;
      conn_obj->target = nullptr;
      all_connection_objects.erase (target);
    }
}

/* Called when a gdb.TargetConnection object is deallocated.  */

static void
connpy_connection_dealloc (PyObject *obj)
{
  connection_object *conn_obj = (connection_object *) obj;

  /* As the all_connection_objects map holds a reference to each connection
     object we can only enter the dealloc function when the reference in
     all_connection_objects has been erased.

     As we always set the target pointer back to nullptr before we erase
     items from all_connection_objects then, when we get here, the target
     pointer must be nullptr.  */
  gdb_assert (conn_obj->target == nullptr);

  Py_TYPE (obj)->tp_free (obj);
}

/* Implement repr() for gdb.TargetConnection.  */

static PyObject *
connpy_repr (PyObject *obj)
{
  connection_object *self = (connection_object *) obj;
  process_stratum_target *target = self->target;

  if (target == nullptr)
    return gdb_py_invalid_object_repr (obj);

  return PyUnicode_FromFormat ("<%s num=%d, what=\"%s\">",
			       Py_TYPE (obj)->tp_name,
			       target->connection_number,
			       make_target_connection_string (target).c_str ());
}

/* Implementation of gdb.TargetConnection.is_valid() -> Boolean.  Returns
   True if this connection object is still associated with a
   process_stratum_target, otherwise, returns False.  */

static PyObject *
connpy_is_valid (PyObject *self, PyObject *args)
{
  connection_object *conn = (connection_object *) self;

  if (conn->target == nullptr)
    Py_RETURN_FALSE;

  Py_RETURN_TRUE;
}

/* Return the id number of this connection.  */

static PyObject *
connpy_get_connection_num (PyObject *self, void *closure)
{
  connection_object *conn = (connection_object *) self;

  CONNPY_REQUIRE_VALID (conn);

  auto num = conn->target->connection_number;
  return gdb_py_object_from_longest (num).release ();
}

/* Return a string that gives the short name for this connection type.  */

static PyObject *
connpy_get_connection_type (PyObject *self, void *closure)
{
  connection_object *conn = (connection_object *) self;

  CONNPY_REQUIRE_VALID (conn);

  const char *shortname = conn->target->shortname ();
  return host_string_to_python_string (shortname).release ();
}

/* Return a string that gives a longer description of this connection type.  */

static PyObject *
connpy_get_description (PyObject *self, void *closure)
{
  connection_object *conn = (connection_object *) self;

  CONNPY_REQUIRE_VALID (conn);

  const char *longname = conn->target->longname ();
  return host_string_to_python_string (longname).release ();
}

/* Return a string that gives additional details about this connection, or
   None, if there are no additional details for this connection type.  */

static PyObject *
connpy_get_connection_details (PyObject *self, void *closure)
{
  connection_object *conn = (connection_object *) self;

  CONNPY_REQUIRE_VALID (conn);

  const char *details = conn->target->connection_string ();
  if (details != nullptr)
    return host_string_to_python_string (details).release ();
  else
    Py_RETURN_NONE;
}

/* Python specific initialization for this file.  */

static int
gdbpy_initialize_connection ()
{
  if (gdbpy_type_ready (&connection_object_type) < 0)
    return -1;

  if (gdbpy_type_ready (&remote_connection_object_type) < 0)
    return -1;

  return 0;
}

/* Set of callbacks used to implement gdb.send_packet.  */

struct py_send_packet_callbacks : public send_remote_packet_callbacks
{
  /* Constructor, initialise the result to nullptr.  It is invalid to try
     and read the result before sending a packet and processing the
     reply.  */

  py_send_packet_callbacks ()
    : m_result (nullptr)
  { /* Nothing.  */ }

  /* There's nothing to do when the packet is sent.  */

  void sending (gdb::array_view<const char> &buf) override
  { /* Nothing.  */ }

  /* When the result is returned create a Python object and assign this
     into M_RESULT.  If for any reason we can't create a Python object to
     represent the result then M_RESULT is set to nullptr, and Python's
     internal error flags will be set.  If the result we got back from the
     remote is empty then set the result to None.  */

  void received (gdb::array_view<const char> &buf) override
  {
    if (buf.size () > 0 && buf.data ()[0] != '\0')
      m_result.reset (PyBytes_FromStringAndSize (buf.data (), buf.size ()));
    else
      {
	/* We didn't get back any result data; set the result to None.  */
	Py_INCREF (Py_None);
	m_result.reset (Py_None);
      }
  }

  /* Get a reference to the result as a Python object.  It is invalid to
     call this before sending a packet to the remote and processing the
     reply.

     The result value is setup in the RECEIVED call above.  If the RECEIVED
     call causes an error then the result value will be set to nullptr,
     and the error reason is left stored in Python's global error state.

     It is important that the result is inspected immediately after sending
     a packet to the remote, and any error fetched,  calling any other
     Python functions that might clear the error state, or rely on an error
     not being set will cause undefined behavior.  */

  gdbpy_ref<> result () const
  {
    return m_result;
  }

private:

  /* A reference to the result value.  */

  gdbpy_ref<> m_result;
};

/* Implement RemoteTargetConnection.send_packet function.  Send a packet to
   the target identified by SELF.  The connection must still be valid, and
   the packet to be sent must be non-empty, otherwise an exception will be
   thrown.  */

static PyObject *
connpy_send_packet (PyObject *self, PyObject *args, PyObject *kw)
{
  connection_object *conn = (connection_object *) self;

  CONNPY_REQUIRE_VALID (conn);

  static const char *keywords[] = {"packet", nullptr};
  PyObject *packet_obj;

  if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "O", keywords,
					&packet_obj))
    return nullptr;

  /* If the packet is a unicode string then convert it to a bytes object.  */
  if (PyUnicode_Check (packet_obj))
    {
      /* We encode the string to bytes using the ascii codec, if this fails
	 then a suitable error will have been set.  */
      packet_obj = PyUnicode_AsASCIIString (packet_obj);
      if (packet_obj == nullptr)
	return nullptr;
    }

  /* Check the packet is now a bytes object.  */
  if (!PyBytes_Check (packet_obj))
    {
      PyErr_SetString (PyExc_TypeError, _("Packet is not a bytes object"));
      return nullptr;
    }

  Py_ssize_t packet_len = 0;
  char *packet_str_nonconst = nullptr;
  if (PyBytes_AsStringAndSize (packet_obj, &packet_str_nonconst,
			       &packet_len) < 0)
    return nullptr;
  const char *packet_str = packet_str_nonconst;
  gdb_assert (packet_str != nullptr);

  if (packet_len == 0)
    {
      PyErr_SetString (PyExc_ValueError, _("Packet must not be empty"));
      return nullptr;
    }

  try
    {
      scoped_restore_current_thread restore_thread;
      switch_to_target_no_thread (conn->target);

      gdb::array_view<const char> view (packet_str, packet_len);
      py_send_packet_callbacks callbacks;
      send_remote_packet (view, &callbacks);
      PyObject *result = callbacks.result ().release ();
      /* If we encountered an error converting the reply to a Python
	 object, then the result here can be nullptr.  In that case, Python
	 should be aware that an error occurred.  */
      gdb_assert ((result == nullptr) == (PyErr_Occurred () != nullptr));
      return result;
    }
  catch (const gdb_exception &except)
    {
      return gdbpy_handle_gdb_exception (nullptr, except);
    }
}

/* Global initialization for this file.  */

INIT_GDB_FILE (py_connection)
{
  gdb::observers::connection_removed.attach (connpy_connection_removed,
					     "py-connection");
}

GDBPY_INITIALIZE_FILE (gdbpy_initialize_connection);

/* Methods for the gdb.TargetConnection object type.  */

static PyMethodDef connection_object_methods[] =
{
  { "is_valid", connpy_is_valid, METH_NOARGS,
    "is_valid () -> Boolean.\n\
Return true if this TargetConnection is valid, false if not." },
  { NULL }
};

/* Methods for the gdb.RemoteTargetConnection object type.  */

static PyMethodDef remote_connection_object_methods[] =
{
  { "send_packet", (PyCFunction) connpy_send_packet,
    METH_VARARGS | METH_KEYWORDS,
    "send_packet (PACKET) -> Bytes\n\
Send PACKET to a remote target, return the reply as a bytes array." },
  { NULL }
};

/* Attributes for the gdb.TargetConnection object type.  */

static gdb_PyGetSetDef connection_object_getset[] =
{
  { "num", connpy_get_connection_num, NULL,
    "ID number of this connection, as assigned by GDB.", NULL },
  { "type", connpy_get_connection_type, NULL,
    "A short string that is the name for this connection type.", NULL },
  { "description", connpy_get_description, NULL,
    "A longer string describing this connection type.", NULL },
  { "details", connpy_get_connection_details, NULL,
    "A string containing additional connection details.", NULL },
  { NULL }
};

/* Define the gdb.TargetConnection object type.  */

PyTypeObject connection_object_type =
{
  PyVarObject_HEAD_INIT (NULL, 0)
  "gdb.TargetConnection",	  /* tp_name */
  sizeof (connection_object),	  /* tp_basicsize */
  0,				  /* tp_itemsize */
  connpy_connection_dealloc,	  /* tp_dealloc */
  0,				  /* tp_print */
  0,				  /* tp_getattr */
  0,				  /* tp_setattr */
  0,				  /* tp_compare */
  connpy_repr,			  /* tp_repr */
  0,				  /* tp_as_number */
  0,				  /* tp_as_sequence */
  0,				  /* tp_as_mapping */
  0,				  /* tp_hash  */
  0,				  /* tp_call */
  0,				  /* tp_str */
  0,				  /* tp_getattro */
  0,				  /* tp_setattro */
  0,				  /* tp_as_buffer */
  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,	/* tp_flags */
  "GDB target connection object", /* tp_doc */
  0,				  /* tp_traverse */
  0,				  /* tp_clear */
  0,				  /* tp_richcompare */
  0,				  /* tp_weaklistoffset */
  0,				  /* tp_iter */
  0,				  /* tp_iternext */
  connection_object_methods,	  /* tp_methods */
  0,				  /* tp_members */
  connection_object_getset,	  /* tp_getset */
  0,				  /* tp_base */
  0,				  /* tp_dict */
  0,				  /* tp_descr_get */
  0,				  /* tp_descr_set */
  0,				  /* tp_dictoffset */
  0,				  /* tp_init */
  0				  /* tp_alloc */
};

/* Define the gdb.RemoteTargetConnection object type.  */

PyTypeObject remote_connection_object_type =
{
  PyVarObject_HEAD_INIT (NULL, 0)
  "gdb.RemoteTargetConnection",	  /* tp_name */
  sizeof (connection_object),	  /* tp_basicsize */
  0,				  /* tp_itemsize */
  connpy_connection_dealloc,	  /* tp_dealloc */
  0,				  /* tp_print */
  0,				  /* tp_getattr */
  0,				  /* tp_setattr */
  0,				  /* tp_compare */
  connpy_repr,			  /* tp_repr */
  0,				  /* tp_as_number */
  0,				  /* tp_as_sequence */
  0,				  /* tp_as_mapping */
  0,				  /* tp_hash  */
  0,				  /* tp_call */
  0,				  /* tp_str */
  0,				  /* tp_getattro */
  0,				  /* tp_setattro */
  0,				  /* tp_as_buffer */
  Py_TPFLAGS_DEFAULT,		  /* tp_flags */
  "GDB remote target connection object",	  /* tp_doc */
  0,				  /* tp_traverse */
  0,				  /* tp_clear */
  0,				  /* tp_richcompare */
  0,				  /* tp_weaklistoffset */
  0,				  /* tp_iter */
  0,				  /* tp_iternext */
  remote_connection_object_methods,	  /* tp_methods */
  0,				  /* tp_members */
  0,				  /* tp_getset */
  &connection_object_type,	  /* tp_base */
  0,				  /* tp_dict */
  0,				  /* tp_descr_get */
  0,				  /* tp_descr_set */
  0,				  /* tp_dictoffset */
  0,				  /* tp_init */
  0				  /* tp_alloc */
};
