summaryrefslogtreecommitdiffstats
path: root/netwerk/base/nsASocketHandler.h
blob: c68da7c359a89d10e8a9d9d910c61b60fa77dd32 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/* 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 "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};

  bool mIsPrivate{false};

  //
  // 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;
};

#endif  // !nsASocketHandler_h__