/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef nsASocketHandler_h_
#define nsASocketHandler_h_

#include "mozilla/OriginAttributes.h"
#include "nsError.h"
#include "nsINetAddr.h"
#include "nsISupports.h"
#include "prio.h"

// socket handler used by nsISocketTransportService.
// methods are only called on the socket thread.

class nsASocketHandler : public nsISupports {
 public:
  nsASocketHandler() = default;

  //
  // this condition variable will be checked to determine if the socket
  // handler should be detached.  it must only be accessed on the socket
  // thread.
  //
  nsresult mCondition{NS_OK};

  //
  // these flags can only be modified on the socket transport thread.
  // the socket transport service will check these flags before calling
  // PR_Poll.
  //
  uint16_t mPollFlags{0};

  //
  // this value specifies the maximum amount of time in seconds that may be
  // spent waiting for activity on this socket.  if this timeout is reached,
  // then OnSocketReady will be called with outFlags = -1.
  //
  // the default value for this member is UINT16_MAX, which disables the
  // timeout error checking.  (i.e., a timeout value of UINT16_MAX is
  // never reached.)
  //
  uint16_t mPollTimeout{UINT16_MAX};

  //
  // keys the connection pool for network partitioning.
  // must be set before the socket transport is built.
  //
  mozilla::OriginAttributes mOriginAttributes;

  //
  // called to service a socket
  //
  // params:
  //   socketRef - socket identifier
  //   fd        - socket file descriptor
  //   outFlags  - value of PR_PollDesc::out_flags after PR_Poll returns
  //               or -1 if a timeout occurred
  //
  virtual void OnSocketReady(PRFileDesc* fd, int16_t outFlags) = 0;

  //
  // called when a socket is no longer under the control of the socket
  // transport service.  the socket handler may close the socket at this
  // point.  after this call returns, the handler will no longer be owned
  // by the socket transport service.
  //
  virtual void OnSocketDetached(PRFileDesc* fd) = 0;

  //
  // called to determine if the socket is for a local peer.
  // when used for server sockets, indicates if it only accepts local
  // connections.
  //
  virtual void IsLocal(bool* aIsLocal) = 0;

  //
  // called to determine if this socket should not be terminated when Gecko
  // is turned offline. This is mostly useful for the debugging server
  // socket.
  //
  virtual void KeepWhenOffline(bool* aKeepWhenOffline) {
    *aKeepWhenOffline = false;
  }

  //
  // called when global pref for keepalive has changed.
  //
  virtual void OnKeepaliveEnabledPrefChange(bool aEnabled) {}

  //
  // called to determine the NetAddr. addr can only be assumed to be initialized
  // when NS_OK is returned
  //
  virtual nsresult GetRemoteAddr(mozilla::net::NetAddr* addr) {
    return NS_ERROR_NOT_IMPLEMENTED;
  }

  //
  // returns the number of bytes sent/transmitted over the socket
  //
  virtual uint64_t ByteCountSent() = 0;
  virtual uint64_t ByteCountReceived() = 0;

  //
  // returns true if this socket is used for a TRR service channel connection
  //
  virtual bool IsTRRConnection() { return false; }
};

#endif  // !nsASocketHandler_h_
