// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef HERMES_SOCKET_INTERFACE_H_
#define HERMES_SOCKET_INTERFACE_H_

#include <cstdint>

#include <base/callback.h>

namespace hermes {

// Interface representing a socket used to communicate with a modem.
class SocketInterface {
 public:
  using DataAvailableCallback = base::Callback<void(SocketInterface*)>;

  enum class Type {
    kQrtr,
    kMbim,
  };

  virtual ~SocketInterface() {}

  // Sets callback to run when data is available to be read from the
  // socket. Note that the client is responsible for ensuring that the
  // SocketInterface* passed as a parameter to the callback remains valid while
  // the callback is being run.
  virtual void SetDataAvailableCallback(DataAvailableCallback cb) = 0;

  // Opens the socket. Returns whether socket is open at the end of the call.
  virtual bool Open() = 0;
  // Closes the socket.
  virtual void Close() = 0;
  // Returns whether the socket is valid to be read from and written to.
  virtual bool IsValid() const = 0;
  // Returns the type of socket represented by this class.
  virtual Type GetType() const = 0;

  // Requests a service start (e.g. a QMI or MBIM service). The caller is
  // responsible for handling any (potentially asynchronous) response to the
  // service request. Returns whether the request was successfully sent.
  virtual bool StartService(uint32_t service, uint16_t version_major,
                            uint16_t version_minor) = 0;
  // Requests a service stop. The caller is responsible for handling any
  // (potentially asynchronous) response to the service end request. Returns
  // whether the request was successfully sent.
  virtual bool StopService(uint32_t service, uint16_t version_major,
                           uint16_t version_minor) = 0;

  // Receives data into the provided data buffer. On success, returns the bytes
  // received out. On failure, returns -1.
  virtual int Recv(void* buf, size_t size, void* metadata) = 0;
  // Sends provided data buffer. On success, returns the bytes sent out. On
  // failure, returns -1.
  virtual int Send(const void* data, size_t size, const void* metadata) = 0;
};

}  // namespace hermes

#endif  // HERMES_SOCKET_INTERFACE_H_
