Overte C++ Documentation
Node.h
1 //
2 // Node.h
3 // libraries/networking/src
4 //
5 // Created by Stephen Birarda on 2/15/13.
6 // Copyright 2013 High Fidelity, Inc.
7 // Copyright 2021 Vircadia contributors.
8 //
9 // Distributed under the Apache License, Version 2.0.
10 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
11 //
12 
13 #ifndef hifi_Node_h
14 #define hifi_Node_h
15 
16 #include <memory>
17 #include <ostream>
18 #include <stdint.h>
19 #include <vector>
20 
21 #include <QtCore/QDebug>
22 #include <QtCore/QMutex>
23 #include <QtCore/QSharedPointer>
24 #include <QtCore/QUuid>
25 
26 #include <QReadLocker>
27 #include <UUIDHasher.h>
28 
29 #include <TBBHelpers.h>
30 
31 #include "SockAddr.h"
32 #include "NetworkPeer.h"
33 #include "NodeData.h"
34 #include "NodeType.h"
35 #include "SimpleMovingAverage.h"
36 #include "MovingPercentile.h"
37 #include "NodePermissions.h"
38 #include "HMACAuth.h"
39 #include "udt/ConnectionStats.h"
40 #include "NumericalConstants.h"
41 
42 class Node : public NetworkPeer {
43  Q_OBJECT
44 public:
45  using Stats = udt::ConnectionStats::Stats;
46 
47  Node(const QUuid& uuid, NodeType_t type,
48  const SockAddr& publicSocket, const SockAddr& localSocket,
49  QObject* parent = nullptr);
50 
51  bool operator==(const Node& otherNode) const { return _uuid == otherNode._uuid; }
52  bool operator!=(const Node& otherNode) const { return !(*this == otherNode); }
53 
54  char getType() const { return _type; }
55  void setType(char type);
56 
57  bool isReplicated() const { return _isReplicated; }
58  void setIsReplicated(bool isReplicated) { _isReplicated = isReplicated; }
59 
60  bool isUpstream() const { return _isUpstream; }
61  void setIsUpstream(bool isUpstream) { _isUpstream = isUpstream; }
62 
63  const QUuid& getConnectionSecret() const { return _connectionSecret; }
64  void setConnectionSecret(const QUuid& connectionSecret);
65  HMACAuth* getAuthenticateHash() const { return _authenticateHash.get(); }
66 
67  NodeData* getLinkedData() const { return _linkedData.get(); }
68  void setLinkedData(std::unique_ptr<NodeData> linkedData) { _linkedData = std::move(linkedData); }
69 
70  int getPingMs() const { return _pingMs; }
71  void setPingMs(int pingMs) { _pingMs = pingMs; }
72 
73  qint64 getClockSkewUsec() const { return _clockSkewUsec; }
74  void updateClockSkewUsec(qint64 clockSkewSample);
75  QMutex& getMutex() { return _mutex; }
76 
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); }
88 
89  using NodesIgnoredPair = std::pair<std::vector<QUuid>, bool>;
90 
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;
95 
96  using IgnoredNodeIDs = std::vector<QUuid>;
97  const IgnoredNodeIDs& getIgnoredNodeIDs() const { return _ignoredNodeIDs; }
98 
99  friend QDataStream& operator<<(QDataStream& out, const Node& node);
100  friend QDataStream& operator>>(QDataStream& in, Node& node);
101 
102  void updateStats(Stats stats);
103  const Stats& getConnectionStats() const;
104 
105  int getInboundPPS() const;
106  int getOutboundPPS() const;
107  float getInboundKbps() const;
108  float getOutboundKbps() const;
109 
110 private:
111  Q_DISABLE_COPY(Node)
112 
113  NodeType_t _type;
114 
115  QUuid _connectionSecret;
116  std::unique_ptr<HMACAuth> _authenticateHash { nullptr };
117  std::unique_ptr<NodeData> _linkedData;
118  bool _isReplicated { false };
119  int _pingMs;
120  qint64 _clockSkewUsec;
121  QMutex _mutex;
122  MovingPercentile _clockSkewMovingPercentile;
123  NodePermissions _permissions;
124  bool _isUpstream { false };
125 
126  IgnoredNodeIDs _ignoredNodeIDs;
127  mutable QReadWriteLock _ignoredNodeIDSetLock;
128  std::vector<QString> _replicatedUsernames { };
129 
130  Stats _stats;
131 };
132 
133 Q_DECLARE_METATYPE(Node*)
134 
135 typedef QSharedPointer<Node> SharedNodePointer;
136 Q_DECLARE_METATYPE(SharedNodePointer)
137 
138 namespace std {
139  template<>
140  struct hash<SharedNodePointer> {
141  size_t operator()(const SharedNodePointer& p) const {
142  // Return the hash of the pointer
143  return hash<Node*>()(p.data());
144  }
145  };
146 }
147 
148 QDebug operator<<(QDebug debug, const Node& node);
149 
150 #endif // hifi_Node_h
NodeType.
quint8 NodeType_t
An 8-bit value identifying the type of a node - domain server, audio mixer, etc.
Definition: NodeType.h:22