21 #include <QtCore/QDebug>
22 #include <QtCore/QMutex>
23 #include <QtCore/QSharedPointer>
24 #include <QtCore/QUuid>
26 #include <QReadLocker>
27 #include <UUIDHasher.h>
29 #include <TBBHelpers.h>
32 #include "NetworkPeer.h"
35 #include "SimpleMovingAverage.h"
36 #include "MovingPercentile.h"
37 #include "NodePermissions.h"
39 #include "udt/ConnectionStats.h"
40 #include "NumericalConstants.h"
42 class Node :
public NetworkPeer {
45 using Stats = udt::ConnectionStats::Stats;
48 const SockAddr& publicSocket,
const SockAddr& localSocket,
49 QObject* parent =
nullptr);
51 bool operator==(
const Node& otherNode)
const {
return _uuid == otherNode._uuid; }
52 bool operator!=(
const Node& otherNode)
const {
return !(*
this == otherNode); }
54 char getType()
const {
return _type; }
55 void setType(
char type);
57 bool isReplicated()
const {
return _isReplicated; }
58 void setIsReplicated(
bool isReplicated) { _isReplicated = isReplicated; }
60 bool isUpstream()
const {
return _isUpstream; }
61 void setIsUpstream(
bool isUpstream) { _isUpstream = isUpstream; }
63 const QUuid& getConnectionSecret()
const {
return _connectionSecret; }
64 void setConnectionSecret(
const QUuid& connectionSecret);
65 HMACAuth* getAuthenticateHash()
const {
return _authenticateHash.get(); }
67 NodeData* getLinkedData()
const {
return _linkedData.get(); }
68 void setLinkedData(std::unique_ptr<NodeData> linkedData) { _linkedData = std::move(linkedData); }
70 int getPingMs()
const {
return _pingMs; }
71 void setPingMs(
int pingMs) { _pingMs = pingMs; }
73 qint64 getClockSkewUsec()
const {
return _clockSkewUsec; }
74 void updateClockSkewUsec(qint64 clockSkewSample);
75 QMutex& getMutex() {
return _mutex; }
77 void setPermissions(
const NodePermissions& newPermissions) { _permissions = newPermissions; }
78 NodePermissions getPermissions()
const {
return _permissions; }
79 bool isAllowedEditor()
const {
return _permissions.can(NodePermissions::Permission::canAdjustLocks); }
80 bool getCanRez()
const {
return _permissions.can(NodePermissions::Permission::canRezPermanentEntities); }
81 bool getCanRezTmp()
const {
return _permissions.can(NodePermissions::Permission::canRezTemporaryEntities); }
82 bool getCanWriteToAssetServer()
const {
return _permissions.can(NodePermissions::Permission::canWriteToAssetServer); }
83 bool getCanKick()
const {
return _permissions.can(NodePermissions::Permission::canKick); }
84 bool getCanReplaceContent()
const {
return _permissions.can(NodePermissions::Permission::canReplaceDomainContent); }
85 bool getCanGetAndSetPrivateUserData()
const {
return _permissions.can(NodePermissions::Permission::canGetAndSetPrivateUserData); }
86 bool getCanRezAvatarEntities()
const {
return _permissions.can(NodePermissions::Permission::canRezAvatarEntities); }
87 bool getCanViewAssetURLs()
const {
return _permissions.can(NodePermissions::Permission::canViewAssetURLs); }
89 using NodesIgnoredPair = std::pair<std::vector<QUuid>,
bool>;
91 NodesIgnoredPair parseIgnoreRequestMessage(QSharedPointer<ReceivedMessage> message);
92 void addIgnoredNode(
const QUuid& otherNodeID);
93 void removeIgnoredNode(
const QUuid& otherNodeID);
94 bool isIgnoringNodeWithID(
const QUuid& nodeID)
const;
96 using IgnoredNodeIDs = std::vector<QUuid>;
97 const IgnoredNodeIDs& getIgnoredNodeIDs()
const {
return _ignoredNodeIDs; }
99 friend QDataStream& operator<<(QDataStream& out,
const Node& node);
100 friend QDataStream& operator>>(QDataStream& in, Node& node);
102 void updateStats(Stats stats);
103 const Stats& getConnectionStats()
const;
105 int getInboundPPS()
const;
106 int getOutboundPPS()
const;
107 float getInboundKbps()
const;
108 float getOutboundKbps()
const;
115 QUuid _connectionSecret;
116 std::unique_ptr<HMACAuth> _authenticateHash {
nullptr };
117 std::unique_ptr<NodeData> _linkedData;
118 bool _isReplicated {
false };
120 qint64 _clockSkewUsec;
122 MovingPercentile _clockSkewMovingPercentile;
123 NodePermissions _permissions;
124 bool _isUpstream {
false };
126 IgnoredNodeIDs _ignoredNodeIDs;
127 mutable QReadWriteLock _ignoredNodeIDSetLock;
128 std::vector<QString> _replicatedUsernames { };
133 Q_DECLARE_METATYPE(Node*)
135 typedef QSharedPointer<Node> SharedNodePointer;
136 Q_DECLARE_METATYPE(SharedNodePointer)
140 struct hash<SharedNodePointer> {
141 size_t operator()(
const SharedNodePointer& p)
const {
143 return hash<Node*>()(p.data());
148 QDebug operator<<(QDebug debug,
const Node& node);
quint8 NodeType_t
An 8-bit value identifying the type of a node - domain server, audio mixer, etc.
Definition: NodeType.h:22