/* Copyright (C) 2021-2023 Free Software Foundation, Inc.
   Contributed by Oracle.

   This file is part of GNU Binutils.

   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, 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, write to the Free Software
   Foundation, 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

/* Defines the external interface between er_ipc and the routines */

#ifndef _IPCIO_H
#define _IPCIO_H
#include <pthread.h>
#include "gp-defs.h"
#include "StringBuilder.h"

class DbeThreadPool;
typedef long long DbeObj;
typedef void *Object;
typedef char *String;

#define BUFFER_SIZE_SMALL           512
#define BUFFER_SIZE_MEDIUM          512
#define BUFFER_SIZE_LARGE           1024*1024

#define REQUEST_HAS_NO_BODY         0xFFFFFFFF
#define RESPONSE_STATUS_DEFAULT     0
#define RESPONSE_STATUS_SUCCESS     1
#define RESPONSE_STATUS_FAILURE     2
#define RESPONSE_STATUS_CANCELLED   3

#define RESPONSE_TYPE_ACK           0
#define RESPONSE_TYPE_PROGRESS      1
#define RESPONSE_TYPE_COMPLETE      2
#define RESPONSE_TYPE_HANDSHAKE     3
#define HEADER_MARKER               0xff

#define REQUEST_TYPE_DEFAULT        0
#define REQUEST_TYPE_CANCEL         1
#define REQUEST_TYPE_HANDSHAKE      2

#define IPC_PROTOCOL_STR            "IPC_PROTOCOL_38"
#define IPC_VERSION_NUMBER          38

enum IPCrequestStatus
{
  INITIALIZED = 0,
  IN_PROGRESS,
  COMPLETED,
  CANCELLED_DEFAULT,
  CANCELLED_IMMEDIATE
};

enum IPCTraceLevel
{
  TRACE_LVL_0 = 0,
  TRACE_LVL_1,
  TRACE_LVL_2,
  TRACE_LVL_3,
  TRACE_LVL_4
};

class IPCrequest
{
  char *buf;
  int size;
  int idx;
  int requestID;
  int channelID;
  IPCrequestStatus status;
  bool cancelImmediate;
public:
  IPCrequest (int, int, int);
  ~IPCrequest ();
  IPCrequestStatus getStatus ();
  void setStatus (IPCrequestStatus);
  void read ();

  int getRequestID ()               { return requestID; }
  int getChannelID ()               { return channelID; }
  bool isCancelImmediate ()         { return cancelImmediate; }
  void setCancelImmediate ()        { cancelImmediate = true; }
  char rgetc ()                     { return buf[idx++]; }
};

class IPCresponse
{
public:
  IPCresponse (int sz);
  ~IPCresponse ();

  int getRequestID ()               { return requestID; }
  int getChannelID ()               { return channelID; }
  void setRequestID (int r)         { requestID = r; }
  void setChannelID (int c)         { channelID = c; }
  void setResponseType (int r)      { responseType = r; }
  void setResponseStatus (int s)    { responseStatus = s; }
  int getCurBufSize ()              { return sb->capacity (); }
  void sendByte (int);
  void sendIVal (int);
  void sendLVal (long long);
  void sendDVal (double);
  void sendSVal (const char *);
  void sendBVal (bool);
  void sendCVal (char);
  void sendAVal (void*);
  void print (void);
  void reset ();
  IPCresponse *next;

private:
  int requestID;
  int channelID;
  int responseType;
  int responseStatus;
  StringBuilder *sb;
};

class BufferPool
{
public:
  BufferPool ();
  ~BufferPool ();
  IPCresponse* getNewResponse (int);
  void recycle (IPCresponse *);
private:
  pthread_mutex_t p_mutex;
  IPCresponse *smallBuf;
  IPCresponse *largeBuf;
};

// Read from the wire
int readInt (IPCrequest*);
bool readBoolean (IPCrequest*);
long long readLong (IPCrequest*);
DbeObj readObject (IPCrequest*);
Object readArray (IPCrequest*);
String readString (IPCrequest*);
void readRequestHeader ();

// write to the wire
void writeString (const char *, IPCrequest*);
void writeBoolean (bool, IPCrequest*);
void writeInt (int, IPCrequest*);
void writeChar (char, IPCrequest*);
void writeLong (long long, IPCrequest*);
void writeDouble (double, IPCrequest*);
void writeArray (void *, IPCrequest*);
void writeObject (DbeObj, IPCrequest*);
void writeResponseGeneric (int, int, int);
int setProgress (int, const char *);    // Update the progress bar
int ipc_doWork (void *);                // The argument is an IPCrequest

extern int ipc_flags;
extern int ipc_single_threaded_mode;
extern DbeThreadPool *responseThreadPool;
extern DbeThreadPool *ipcThreadPool;
extern int cancelRequestedChannelID;

void ipc_default_log (const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
void ipc_response_log (IPCTraceLevel, const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
void ipc_request_log (IPCTraceLevel, const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));

#endif
