/* Remote target communications for serial-line targets in custom GDB protocol
   Copyright (C) 1999-2024 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/>.  */

#ifndef GDB_REMOTE_H
#define GDB_REMOTE_H

#include "remote-notif.h"

struct target_desc;
struct remote_target;

class process_stratum_target;

/* True when printing "remote" debug statements is enabled.  */

extern bool remote_debug;

/* Print a "remote" debug statement.  */

#define remote_debug_printf(fmt, ...) \
  debug_prefixed_printf_cond (remote_debug, "remote", fmt, ##__VA_ARGS__)

/* Same as the above, but don't include the function name.  */

#define remote_debug_printf_nofunc(fmt, ...) \
		debug_prefixed_printf_cond_nofunc (remote_debug, "remote", \
						   fmt, ##__VA_ARGS__)

/* Print "remote" enter/exit debug statements.  */

#define REMOTE_SCOPED_DEBUG_ENTER_EXIT \
  scoped_debug_enter_exit (remote_debug, "remote")

/* Read a packet from the remote machine, with error checking, and
   store it in *BUF.  Resize *BUF using xrealloc if necessary to hold
   the result, and update *SIZEOF_BUF.  If FOREVER, wait forever
   rather than timing out; this is used (in synchronous mode) to wait
   for a target that is is executing user code to stop.  */

extern void getpkt (remote_target *remote,
		    char **buf, long *sizeof_buf, int forever);

/* Send a packet to the remote machine, with error checking.  The data
   of the packet is in BUF.  The string in BUF can be at most PBUFSIZ
   - 5 to account for the $, # and checksum, and for a possible /0 if
   we are debugging (remote_debug) and want to print the sent packet
   as a string.  */

extern int putpkt (remote_target *remote, const char *buf);

void register_remote_g_packet_guess (struct gdbarch *gdbarch, int bytes,
				     const struct target_desc *tdesc);
void register_remote_support_xml (const char *);

void remote_file_put (const char *local_file, const char *remote_file,
		      int from_tty);
void remote_file_get (const char *remote_file, const char *local_file,
		      int from_tty);
void remote_file_delete (const char *remote_file, int from_tty);

extern int remote_register_number_and_offset (struct gdbarch *gdbarch,
					      int regnum, int *pnum,
					      int *poffset);

extern void remote_notif_get_pending_events (remote_target *remote,
					     const notif_client *np);
extern bool remote_target_is_non_stop_p (remote_target *t);

/* An abstract class that represents the set of callbacks that are made
   from the send_remote_packet function (declared below).  */

struct send_remote_packet_callbacks
{
  /* The SENDING callback is called once send_remote_packet has performed
     its error checking and setup, just before the packet is sent to the
     remote target.  BUF is the content of the packet that will be sent
     (before any of the protocol specific prefix, suffix, or escaping is
     applied).  */

  virtual void sending (gdb::array_view<const char> &buf) = 0;

  /* The RECEIVED callback is called once a reply has been received from
     the remote target.  The content of the reply is in BUF which can't be
     modified, and which is not guaranteed to remain valid after the
     RECEIVED call has returned.  If you need to preserve the contents of
     BUF then a copy should be taken.  */

  virtual void received (gdb::array_view<const char> &buf) = 0;
};

/* Send BUF to the current remote target.  If BUF points to an empty
   string, either zero length, or the first character is the null
   character, then an error is thrown.  If the current target is not a
   remote target then an error is thrown.

   Calls CALLBACKS->sending() just before the packet is sent to the remote
   target, and calls CALLBACKS->received() with the reply once this is
   received from the remote target.  */

extern void send_remote_packet (gdb::array_view<const char> &buf,
				send_remote_packet_callbacks *callbacks);


/* Return true if TARGET is a remote, or extended-remote target, otherwise,
   return false.  */

extern bool is_remote_target (process_stratum_target *target);

/* Return true if REGNUM was returned as an expedited register in the last
   stop reply we received.  */

extern bool remote_register_is_expedited (int regnum);

#endif /* GDB_REMOTE_H */
