/*
 * BRLTTY - A background process providing access to the console screen (when in
 *          text mode) for a blind person using a refreshable braille display.
 *
 * Copyright (C) 1995-2023 by The BRLTTY Developers.
 *
 * BRLTTY comes with ABSOLUTELY NO WARRANTY.
 *
 * This is free software, placed under the terms of the
 * GNU Lesser General Public License, as published by the Free Software
 * Foundation; either version 2.1 of the License, or (at your option) any
 * later version. Please see the file LICENSE-LGPL for details.
 *
 * Web Page: http://brltty.app/
 *
 * This software is maintained by Dave Mielke <dave@mielke.cc>.
 */

#ifndef BRLTTY_INCLUDED_GIO_INTERNAL
#define BRLTTY_INCLUDED_GIO_INTERNAL

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

typedef struct GioHandleStruct GioHandle;

typedef int GioDisconnectResourceMethod (GioHandle *handle);

typedef GioEndpoint *GioGetChainedEndpointMethod (GioHandle *handle);

typedef const char *MakeResourceIdentifierMethod (GioHandle *handle, char *buffer, size_t size);

typedef char *GioGetResourceNameMethod (GioHandle *handle, int timeout);

typedef void *GioGetResourceObjectMethod (GioHandle *handle);

typedef ssize_t GioWriteDataMethod (GioHandle *handle, const void *data, size_t size, int timeout);

typedef int GioAwaitInputMethod (GioHandle *handle, int timeout);

typedef ssize_t GioReadDataMethod (
  GioHandle *handle, void *buffer, size_t size,
  int initialTimeout, int subsequentTimeout
);

typedef int GioMonitorInputMethod (GioHandle *handle, AsyncMonitorCallback *callback, void *data);

typedef int GioReconfigureResourceMethod (GioHandle *handle, const SerialParameters *parameters);

typedef ssize_t GioTellResourceMethod (
  GioHandle *handle, uint8_t recipient, uint8_t type,
  uint8_t request, uint16_t value, uint16_t index,
  const void *data, uint16_t size, int timeout
);

typedef ssize_t GioAskResourceMethod (
  GioHandle *handle, uint8_t recipient, uint8_t type,
  uint8_t request, uint16_t value, uint16_t index,
  void *buffer, uint16_t size, int timeout
);

typedef HidItemsDescriptor *GioGetHidDescriptorMethod(GioHandle *handle);

typedef int GioGetHidReportSizeMethod (
  GioHandle *handle, HidReportIdentifier identifier,
  HidReportSize *size, int timeout
);

typedef ssize_t GioGetHidReportMethod (
  GioHandle *handle, HidReportIdentifier identifier,
  unsigned char *buffer, size_t size, int timeout
);

typedef ssize_t GioSetHidReportMethod (
  GioHandle *handle, HidReportIdentifier identifier,
  const unsigned char *data, size_t size, int timeout
);

typedef ssize_t GioGetHidFeatureMethod (
  GioHandle *handle, HidReportIdentifier identifier,
  unsigned char *buffer, size_t size, int timeout
);

typedef ssize_t GioSetHidFeatureMethod (
  GioHandle *handle, HidReportIdentifier identifier,
  const unsigned char *data, size_t size, int timeout
);

typedef struct {
  GioDisconnectResourceMethod *disconnectResource;
  GioGetChainedEndpointMethod *getChainedEndpoint;

  MakeResourceIdentifierMethod *makeResourceIdentifier;
  GioGetResourceNameMethod *getResourceName;
  GioGetResourceObjectMethod *getResourceObject;

  GioWriteDataMethod *writeData;
  GioAwaitInputMethod *awaitInput;
  GioReadDataMethod *readData;
  GioMonitorInputMethod *monitorInput;
  GioReconfigureResourceMethod *reconfigureResource;

  GioTellResourceMethod *tellResource;
  GioAskResourceMethod *askResource;

  GioGetHidReportSizeMethod *getHidReportSize;
  GioGetHidDescriptorMethod *getHidDescriptor;
  GioGetHidReportMethod *getHidReport;
  GioSetHidReportMethod *setHidReport;
  GioGetHidFeatureMethod *getHidFeature;
  GioSetHidFeatureMethod *setHidFeature;
} GioHandleMethods;

struct GioEndpointStruct {
  GioHandle *handle;
  const GioHandleMethods *handleMethods;
  GioOptions options;
  GioTypeIdentifier resourceType;
  unsigned int bytesPerSecond;
  unsigned char referenceCount;

  struct {
    int error;
    unsigned int from;
    unsigned int to;
    unsigned char buffer[0X40];
  } input;
};

typedef int GioIsSupportedMethod (const GioDescriptor *descriptor);

typedef const GioOptions *GioGetOptionsMethod (const GioDescriptor *descriptor);

typedef const GioHandleMethods *GioGetHandleMethodsMethod (void);

typedef GioHandle *GioConnectResourceMethod (
  const char *identifier,
  const GioDescriptor *descriptor
);

typedef int GioPrepareEndpointMethod (GioEndpoint *endpoint);

typedef struct {
  GioIsSupportedMethod *isSupported;

  GioGetOptionsMethod *getOptions;
  GioGetHandleMethodsMethod *getHandleMethods;

  GioConnectResourceMethod *connectResource;
  GioPrepareEndpointMethod *prepareEndpoint;
} GioPrivateProperties;

typedef struct {
  const GioPublicProperties *public;
  const GioPrivateProperties *private;
} GioProperties;

extern const GioProperties *const gioProperties[];
extern const GioProperties gioProperties_serial;
extern const GioProperties gioProperties_usb;
extern const GioProperties gioProperties_bluetooth;
extern const GioProperties gioProperties_hid;
extern const GioProperties gioProperties_null;

extern void gioSetBytesPerSecond (GioEndpoint *endpoint, const SerialParameters *parameters);
extern void gioSetApplicationData (GioEndpoint *endpoint, const void *data);

static inline int
gioIsHidSupported (const GioDescriptor *descriptor) {
  return gioProperties_hid.private->isSupported(descriptor);
}

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* BRLTTY_INCLUDED_GIO_INTERNAL */
