Diarkis C++Client Library API Document
DiarkisP2PBase.h
Go to the documentation of this file.
1 // © 2019-2024 Diarkis Inc. All rights reserved.
2 
3 #pragma once
4 
5 #include <functional>
6 #include "diarkis/common.h"
7 #include "diarkis/modules/p2p.h"
8 #include "logging/LoggerFactory.h"
9 #include "protocol.h"
10 
11 using namespace Diarkis::Modules;
12 
19 class Peer
20 {
21  public:
22  Peer(std::shared_ptr<IDiarkisP2P> p2p);
23  ~Peer();
24  void RegisterReadyEvent(std::function<void(void*, const DiarkisReadyEventArgs&)> lambda);
25  void RegisterFailEvent(std::function<void(void*, const DiarkisFailEventArgs&)> lambda);
26  void RegisterDisconnectEvent(std::function<void(void*, const DiarkisP2PDisconnectEventArgs&)> lambda);
27  void RegisterMessageEvent(std::function<void(void*, const DiarkisMessageEventArgs&)> lambda);
28  void RegisterExceptionEvent(std::function<void(void*, const DiarkisExceptionEventArgs&)> lambda);
29  void RegisterSchedulerAddNotifyEvent(std::function<void(void*, void*)> lambda);
30  std::shared_ptr<IDiarkisP2P> GetDiarkisP2P() const { return diarkisP2P_; }
31 
32  private:
33  std::shared_ptr<IDiarkisP2P> diarkisP2P_;
34  Diarkis::StdVector<std::function<void()>> eventUnsubscriptions_;
35  std::mutex eventMutex_;
36 };
37 
45 {
46  public:
54 
61  virtual ~DiarkisP2PBase();
62 
77  virtual void SetupP2P(const std::shared_ptr<IDiarkisUdp>& udp, const std::shared_ptr<LoggerFactory>& loggerFactory, const char* uid);
78 
99  virtual void ConnectClient(const char* uid, const char** address, size_t addressCount, size_t timeoutInMilliseconds = 5000, bool bBuffering = true);
100 
107  virtual void ConnectClient(const std::string& uid, const std::vector<std::string>& address, size_t timeoutInMilliseconds = 5000, bool bBuffering = true);
108 
129  virtual void
130  SetEncryptionKeys(bool bEncryption, const uint8_t* key, size_t keySize, const uint8_t* iv, size_t ivSize, const uint8_t* mkey, size_t mkeySize);
131 
138  virtual void SetEncryptionKeys(bool bEncryption, const std::vector<uint8_t>& key, const std::vector<uint8_t>& iv, const std::vector<uint8_t>& mkey);
139 
158  virtual uint16_t SendUnicast(const uint8_t* payload, size_t payloadSize, RudpType type, const char* uid);
159 
166  virtual uint16_t SendUnicast(const uint8_t* payload, size_t payloadSize, RudpType type, const std::string& uid);
167 
174  virtual uint16_t SendUnicast(const std::vector<uint8_t>& payload, RudpType type, const std::string& uid);
175 
196  virtual uint16_t SendMulticast(const uint8_t* payload, size_t payloadSize, RudpType type, const char** uids, size_t uidsLen);
197 
204  virtual uint16_t SendMulticast(const uint8_t* payload, size_t payloadSize, RudpType type, const std::vector<std::string>& uid);
205 
212  virtual uint16_t SendMulticast(const std::vector<uint8_t>& payload, RudpType type, const std::vector<std::string>& uid);
213 
230  virtual uint16_t SendBroadcast(const uint8_t* payload, size_t payloadSize, RudpType type);
231 
238  virtual uint16_t SendBroadcast(const std::vector<uint8_t>& payload, RudpType type);
239 
248  void Disconnect();
249 
262  bool Disconnect(const char* uid);
263 
270  void Update();
271 
278  void SetSchedulerAddNotifyEvent(std::function<void()> notifyEventFunc);
279 
286  uint16_t GetConnectedNum();
287 
294  void GetPeerUids(Diarkis::StdVector<Diarkis::StdString>& output);
295 
296 #if defined(DIARKIS_DEBUG_FEATURES)
297 
311  void SetDebugP2PFailMode(bool enable);
312 
327  void SetDebugP2PFailUIDs(const char** UIDList, size_t UIDListSize);
328 
335  void SetDebugP2PFailUIDs(const std::vector<std::string>& UIDList);
336 
345  void ClearDebugP2PFailUIDs();
346 #endif
347 
348  protected:
355  virtual void OnP2PReady(const DiarkisReadyEventArgs& args);
356 
365  virtual void OnP2PFail(const DiarkisFailEventArgs& args);
366 
373  virtual void OnP2PDisconnect(const DiarkisP2PDisconnectEventArgs& args);
374 
381  virtual void OnP2PMessage(const DiarkisMessageEventArgs& args);
382 
391  virtual void OnP2PException(const DiarkisExceptionEventArgs& args);
392 
403  void RegisterPeer(const Diarkis::StdString& uid, const std::shared_ptr<Peer>& p2p);
404 
415  uint64_t UnregisterPeer(const Diarkis::StdString& uid);
416 
424 
431  std::recursive_mutex p2pListMutex_;
432 
439  std::shared_ptr<IDiarkisUdp> udp_;
440 
447  std::shared_ptr<LoggerFactory> loggerFactory_;
448 
455  std::shared_ptr<IDiarkisLogger> logger_;
456 
463  std::function<void()> schedulerAddNotifyEventFunc_;
464 
472 
480 
481 #if defined(DIARKIS_DEBUG_FEATURES)
482 
488  std::atomic<bool> debugP2PFailMode_;
489 
496  Diarkis::StdVector<Diarkis::StdString> debugP2PFailUIDs_;
497  std::mutex debugP2PFailUIDsMutex_;
498 #endif
499 };
DiarkisP2PBase::udp_
std::shared_ptr< IDiarkisUdp > udp_
Pointer to the IDiarkisUdp class.
Definition: DiarkisP2PBase.h:439
DiarkisP2PBase::p2pList_
Diarkis::StdUnorderedMap< Diarkis::StdString, std::shared_ptr< Peer > > p2pList_
List of P2P connections. key:UID, value:pointer to IDiarkisP2P.
Definition: DiarkisP2PBase.h:423
DiarkisP2PBase::schedulerAddNotifyEventFunc_
std::function< void()> schedulerAddNotifyEventFunc_
Callback function called when P2P-related events are added.
Definition: DiarkisP2PBase.h:463
DiarkisP2PBase::myUid_
Diarkis::StdString myUid_
My user ID.
Definition: DiarkisP2PBase.h:479
p2p.h
Diarkis::StdString
Definition: common.h:432
Diarkis::StdUnorderedMap
std::unordered_map< Key, Value, StdStringHash< Key >, std::equal_to< Key >, Diarkis::DiarkisStdAllocator< std::pair< const Key, Value > >> StdUnorderedMap
Definition: common.h:535
DiarkisP2PBase::loggerFactory_
std::shared_ptr< LoggerFactory > loggerFactory_
Pointer to logger class.
Definition: DiarkisP2PBase.h:447
DiarkisP2PBase
Base class that wraps the IDiarkisP2P class for easy use of P2P functionality.
Definition: DiarkisP2PBase.h:44
DiarkisP2PBase::p2pListMutex_
std::recursive_mutex p2pListMutex_
P2P list Mutex.
Definition: DiarkisP2PBase.h:431
protocol.h
Diarkis::Modules
Definition: directMessage.h:16
Diarkis::StdVector
Definition: common.h:406
DiarkisP2PBase::ownGlobalAddress_
Diarkis::StdString ownGlobalAddress_
My Global IP address.
Definition: DiarkisP2PBase.h:471
Diarkis::DiarkisFailEventArgs
Arguments of the callback event called when a P2P connection fails.
Definition: eventArgs.h:354
Peer
Structure for managing peer connection status.
Definition: DiarkisP2PBase.h:19
common.h
Diarkis::DiarkisExceptionEventArgs
Arguments of the callback event called when sending or receiving fails in P2P.
Definition: eventArgs.h:499
Diarkis::DiarkisReadyEventArgs
Arguments of the callback event called when a P2P connection is completed.
Definition: eventArgs.h:298
Diarkis::DiarkisP2PDisconnectEventArgs
Arguments of the callback event called when a P2P is disconnected.
Definition: eventArgs.h:402
Peer::GetDiarkisP2P
std::shared_ptr< IDiarkisP2P > GetDiarkisP2P() const
Definition: DiarkisP2PBase.h:30
RudpType
RudpType
Type of P2P RUDP functionality.
Definition: p2p.h:21
Diarkis::DiarkisMessageEventArgs
Arguments of the callback event called when a message is received by P2P.
Definition: eventArgs.h:450
DIARKIS_API
#define DIARKIS_API
Definition: common.h:47
DiarkisP2PBase::logger_
std::shared_ptr< IDiarkisLogger > logger_
Pointer to logger class.
Definition: DiarkisP2PBase.h:455