13 #ifndef hifi_NetworkPeer_h
14 #define hifi_NetworkPeer_h
18 #include <QtCore/QObject>
19 #include <QtCore/QSharedPointer>
20 #include <QtCore/QTimer>
21 #include <QtCore/QUuid>
26 const QString ICE_SERVER_HOSTNAME =
"localhost";
27 const quint16 ICE_SERVER_DEFAULT_PORT = 7337;
28 const int ICE_HEARBEAT_INTERVAL_MSECS = 1 * 1000;
29 const int MAX_ICE_CONNECTION_ATTEMPTS = 5;
31 const int UDP_PUNCH_PING_INTERVAL_MS = 250;
33 class NetworkPeer :
public QObject {
36 NetworkPeer(QObject* parent = 0);
37 NetworkPeer(
const QUuid& uuid,
const SockAddr& publicSocket,
const SockAddr& localSocket, QObject* parent = 0);
39 bool isNull()
const {
return _uuid.isNull(); }
40 bool hasSockets()
const {
return !_localSocket.isNull() && !_publicSocket.isNull(); }
42 const QUuid& getUUID()
const {
return _uuid; }
43 void setUUID(
const QUuid& uuid) { _uuid = uuid; }
45 using LocalID = NetworkLocalID;
46 static const LocalID NULL_LOCAL_ID = 0;
48 LocalID getLocalID()
const {
return _localID; }
49 void setLocalID(LocalID localID) { _localID = localID; }
54 const SockAddr& getPublicSocket()
const {
return _publicSocket; }
55 const SockAddr& getLocalSocket()
const {
return _localSocket; }
56 const SockAddr& getSymmetricSocket()
const {
return _symmetricSocket; }
58 void setPublicSocket(
const SockAddr& publicSocket);
59 void setLocalSocket(
const SockAddr& localSocket);
60 void setSymmetricSocket(
const SockAddr& symmetricSocket);
62 const SockAddr* getActiveSocket()
const {
return _activeSocket; }
64 void activatePublicSocket();
65 void activateLocalSocket();
66 void activateSymmetricSocket();
68 void activateMatchingOrNewSymmetricSocket(
const SockAddr& matchableSockAddr);
70 quint64 getWakeTimestamp()
const {
return _wakeTimestamp; }
71 void setWakeTimestamp(quint64 wakeTimestamp) { _wakeTimestamp = wakeTimestamp; }
73 quint64 getLastHeardMicrostamp()
const {
return _lastHeardMicrostamp; }
74 void setLastHeardMicrostamp(quint64 lastHeardMicrostamp) { _lastHeardMicrostamp = lastHeardMicrostamp; }
76 QByteArray toByteArray()
const;
78 int getConnectionAttempts()
const {
return _connectionAttempts; }
79 void incrementConnectionAttempts() { ++_connectionAttempts; }
80 void resetConnectionAttempts() { _connectionAttempts = 0; }
87 bool isForcedNeverSilent()
const {
return _isForcedNeverSilent; }
88 void setIsForcedNeverSilent(
bool isForcedNeverSilent) { _isForcedNeverSilent = isForcedNeverSilent; }
90 friend QDataStream& operator<<(QDataStream& out,
const NetworkPeer& peer);
91 friend QDataStream& operator>>(QDataStream& in, NetworkPeer& peer);
93 void startPingTimer();
97 void pingTimerTimeout();
98 void socketActivated(
const SockAddr& sockAddr);
99 void socketUpdated(SockAddr previousAddress, SockAddr currentAddress);
102 void setActiveSocket(SockAddr* discoveredSocket);
105 LocalID _localID { 0 };
107 SockAddr _publicSocket;
108 SockAddr _localSocket;
109 SockAddr _symmetricSocket;
110 SockAddr* _activeSocket;
112 quint64 _wakeTimestamp;
113 std::atomic_ullong _lastHeardMicrostamp;
115 QTimer* _pingTimer = NULL;
117 int _connectionAttempts;
119 bool _isForcedNeverSilent {
false };
122 QDebug operator<<(QDebug debug,
const NetworkPeer &peer);
123 typedef QSharedPointer<NetworkPeer> SharedNetworkPeer;