Diarkis C++Client Library API Document
DiarkisInterfaceBase.h
Go to the documentation of this file.
1 // © 2019-2024 Diarkis Inc. All rights reserved.
2 
3 #pragma once
4 
5 #include <condition_variable>
6 #include <functional>
7 
9 #include "DiarkisFieldBase.h"
10 #include "DiarkisGroupBase.h"
11 #include "DiarkisMatchMakerBase.h"
12 #include "DiarkisP2PBase.h"
13 #include "DiarkisRoomBase.h"
14 #include "DiarkisRpcBase.h"
15 #include "DiarkisSessionBase.h"
16 #include "DiarkisTcpBase.h"
17 #include "DiarkisUdpBase.h"
18 #include "diarkis/common.h"
19 
21 #include "diarkis/system/Thread.h"
22 #include "logging/LoggerFactory.h"
24 
25 #define ENABLE_LOGGER 1
26 
34 {
41 };
42 
50 {
51  public:
59  {
60  NotRunning,
61  Running,
62  Finish
63  };
64 
65  public:
76  DiarkisInterfaceBase(const char* userId, bool bInitBaseClass = true);
77 
84  DiarkisInterfaceBase(const std::string& userId, bool bInitBaseClass = true);
85 
92  virtual ~DiarkisInterfaceBase();
93 
108  static bool DiarkisInit(const char* logDirName, LogOutType out = DEBUG_OUT, bool bLog = true, std::shared_ptr<ILoggerBackend> customLogger = nullptr);
109 
116  static bool DiarkisInit(const std::string& logDirName,
117  LogOutType out = DEBUG_OUT,
118  bool bLog = true,
119  std::shared_ptr<ILoggerBackend> customLogger = nullptr);
120 
127  static bool DiarkisDestroy();
128 
135  void UpdateComponents();
136 
143  bool ConnectTcp(void);
144 
151  virtual bool SetupTcp(void);
152 
161  bool ConnectTcp(const char* tcpEndpoint);
162 
169  bool ConnectTcp(const std::string& tcpEndpoint);
170 
177  bool ConnectUdp(void);
178 
197  bool GetEndpoint(const char* host, const char* clientKey, const char* serverType, char* endpoint, size_t endpointBuf);
198 
205  bool GetEndpoint(const std::string& host, const std::string& clientKey, const std::string& type, Diarkis::StdString& endpoint);
206 
213  virtual bool SetupUdp(void);
214 
227  bool ConnectUdp(const char* udpEndpoint, const char* type, struct AuthInfo* auth);
228 
235  bool ConnectUdp(const char* udpEndpoint);
236 
243  bool ConnectUdp(const std::string& udpEndpoint);
244 
263  bool ConnectUdpAsync(const char* udpEndpoint);
264 
271  bool ConnectUdpAsync(const std::string& udpEndpoint);
272 
285  bool ConnectUdpDualModeAsync(const char* udpEndpoint);
286 
293  bool ConnectUdpDualModeAsync(const std::string& udpEndpoint);
294 
303  void GetAuthInfo(struct AuthInfo* auth);
304 
313  virtual void SetupP2P(void);
314 
321  void CloseP2P(void);
322 
331  virtual void SetupRoom(bool bRetry = false);
332 
345  virtual void SetupSession(bool bRetry = false);
346 
353  virtual void SetupRpc();
354 
363  virtual void SetupField(void);
364 
377  virtual void SetupGroup(bool bRetry);
378 
387  virtual void SetupMatchMaker(void);
388 
397  virtual void SetupDirectMessage(void);
398 
414  virtual void SetupProfile(uint32_t interval, uint32_t buffer, bool p2pRandomStart = true);
415 
422  void SetHost(const char* host);
423 
430  void SetHost(const std::string& host);
431 
438  Diarkis::StdString GetHost() const;
439 
446  const Diarkis::StdString& GetClientKey() const;
447 
454  void SetClientKey(const char* clientKey);
455 
462  void SetClientKey(const std::string& clientKey);
463 
470  const Diarkis::StdString& GetUid() const;
471 
478  Diarkis::StdString GetSid() const;
479 
486  void SetSid(const char* sid);
487 
494  void SetSid(const std::string& sid);
495 
502  std::shared_ptr<LoggerFactory> GetLoggerFactory();
503 
510  std::shared_ptr<ILoggerBackend> GetConsoleLoggerBackend();
511 
518  std::shared_ptr<ILoggerBackend> GetDebugLoggerBackend();
519 
526  std::shared_ptr<DiarkisUdpBase> GetUdpBase();
527 
534  std::shared_ptr<DiarkisTcpBase> GetTcpBase();
535 
542  std::shared_ptr<DiarkisP2PBase> GetP2PBase();
543 
550  std::shared_ptr<DiarkisRoomBase> GetRoomBase();
551 
558  std::shared_ptr<DiarkisSessionBase> GetSessionBase();
559 
566  std::shared_ptr<DiarkisGroupBase> GetGroupBase();
567 
574  std::shared_ptr<DiarkisFieldBase> GetFieldBase();
575 
582  std::shared_ptr<DiarkisMatchMakerBase> GetMatchMakerBase();
583 
590  std::shared_ptr<DiarkisRpcBase> GetRpcBase();
591 
598  std::shared_ptr<DiarkisDirectMessageBase> GetDirectMessageBase();
599 
606  std::shared_ptr<Diarkis::Network::IDiarkisProfile> GetProfile();
607 
614  void Stop();
615 
622  void Disconnect();
623 
625  // UDP
627 
633  void SendPing(void);
634 
641  void SendEcho(void);
642 
649  bool IsOffline(void);
650 
652  // P2P
654 
660  void StartP2P(void);
661 
668  uint16_t GetP2PConnectedNum(void);
669 
671  // Room
673 
701  void CreateRoom(uint16_t maxMembers, bool allowEmpty, bool join, uint16_t ttl, uint32_t interval);
702 
731  void RandomJoinRoom(uint16_t maxMembers, uint16_t ttl, uint32_t interval, bool allowEmpty);
732 
745  void JoinRoom();
746 
761  void JoinRoom(const char* roomID);
762 
769  void JoinRoom(const std::string& roomID);
770 
789  void SendMessageToRoom(const char** memberIDs, size_t memberIDsCount, const uint8_t* payload, size_t payloadSize, bool reliable);
790 
797  void SendMessageToRoom(const std::vector<std::string>& memberIDs, const std::vector<uint8_t>& payload, bool reliable);
798 
811  void SendLeaveRoom();
812 
827  void FindByTypeRoom(uint32_t roomType, uint32_t limit);
828 
843  void RegisterRoom(uint32_t roomType, const char* roomName, const char* roomMetadata);
844 
851  void RegisterRoom(uint32_t roomType, const std::string& roomName, const std::string& roomMetadata);
852 
867  void SendMigrateRoom(void);
868 
877  void SendGetOwnerID(void);
878 
887  void SendGetMemberIDs(void);
888 
895  Diarkis::StdString GetRoomID();
896 
898  // Group
900 
922  void SendCreateGroup(bool allowEmpty, bool join, uint16_t ttl);
923 
940  void SendJoinGroup(const char* groupID, const char* message);
941 
948  void SendJoinGroup(const std::string& groupID, const std::string& message);
949 
968  void SendRandomJoinGroup(uint16_t ttl, const char* message, uint32_t interval = 200);
969 
976  void SendRandomJoinGroup(uint16_t ttl, const std::string& message, uint32_t interval = 200);
977 
990  void SendLeaveGroup(const char* groupID, const char* message);
991 
998  void SendLeaveGroup(const std::string& groupID, const std::string& message);
999 
1006  Diarkis::StdString GetGroupID();
1007 
1014  void ClearUdpBuffer();
1015 
1048  bool RequestEndpointAsync(const char* host,
1049  const char* clientKey,
1050  const char* type,
1051  DiarkisThreadPolicy policy,
1052  int priority,
1053  uint32_t affinityMask,
1054  uint32_t stackSize);
1055 
1062  bool RequestEndpointAsync(const std::string& host,
1063  const std::string& clientKey,
1064  const std::string& type,
1065  DiarkisThreadPolicy policy,
1066  int priority,
1067  uint32_t affinityMask,
1068  uint32_t stackSize);
1069 
1078  AsyncGetEndpointStatus GetEndpointAsyncStatus() const;
1079 
1090  bool GetAsyncEndpointResult(Diarkis::StdString& endpoint) const;
1091 
1092  protected:
1099  void InitAndStartup(bool bInitBaseClass);
1100 
1107  static void CreateLogFolder();
1108 
1115  static Diarkis::System::Result RuntimeLoop(void* owner);
1116 
1123  void SchedulerAddNotifyEvent();
1124 
1131  static void InitializeLoggerEnvironment();
1132 
1139  static bool IsLogOutputTypeFile();
1140 
1142  {
1143  RuntimeThreadData() : isRunning_(false), runtimeThread_(nullptr), noWait_(false) {}
1144 
1151  void Stop();
1152 
1159  std::atomic<bool> isRunning_;
1160 
1167  std::shared_ptr<Diarkis::System::DiarkisThread> runtimeThread_;
1168 
1175  std::mutex sync_mutex_;
1176 
1183  std::condition_variable sync_condition_;
1184 
1191  bool noWait_;
1192  };
1193 
1201 
1203  {
1210  void AddInstance(DiarkisInterfaceBase* ptr);
1211 
1218  void RemoveInstance(DiarkisInterfaceBase* ptr);
1219 
1228  void Update(bool forceUpdate);
1229 
1236  std::mutex mutex_;
1237 
1245  };
1246 
1254 
1261  static std::shared_ptr<LoggerFactory> globalLoggerFactory_;
1262 
1269  void TerminateGetEndpointAsyncThread();
1270 
1277  std::shared_ptr<DiarkisTcpBase> tcpBase_;
1278 
1285  std::shared_ptr<DiarkisUdpBase> udpBase_;
1286 
1293  std::shared_ptr<DiarkisP2PBase> p2pBase_;
1294 
1301  std::shared_ptr<DiarkisRoomBase> roomBase_;
1302 
1309  std::shared_ptr<DiarkisSessionBase> sessionBase_;
1310 
1317  std::shared_ptr<DiarkisGroupBase> groupBase_;
1318 
1325  std::shared_ptr<DiarkisFieldBase> fieldBase_;
1326 
1333  std::shared_ptr<DiarkisMatchMakerBase> matchMakerBase_;
1334 
1341  std::shared_ptr<DiarkisRpcBase> rpcBase_;
1342 
1349  std::shared_ptr<DiarkisDirectMessageBase> dmBase_;
1350 
1357  std::shared_ptr<Diarkis::Network::IDiarkisProfile> profile_;
1358 
1366 
1374 
1382 
1390 
1398 
1406 
1413  static std::shared_ptr<Diarkis::StdString> logDir_;
1414 
1421  std::shared_ptr<IDiarkisLogger> logger_;
1422 
1429  std::shared_ptr<LoggerFactory> loggerFactory_;
1430 
1437  static std::shared_ptr<ThreadedLoggerBackend> threadLoggerBackend_;
1438 
1445  static std::shared_ptr<ILoggerBackend> consoleLoggerBackend_;
1446 
1453  static std::shared_ptr<ILoggerBackend> debugLoggerBackend_;
1454 
1461  static std::shared_ptr<ILoggerBackend> fileLoggerBackend_;
1462 
1469  static std::shared_ptr<ILoggerBackend> customLoggerBackend_;
1470 
1477  static std::shared_ptr<ILoggerBackend> aggregatedLoggerBackend_;
1478 
1486 
1493  static bool bOutputLog_;
1494 
1502  {
1506  };
1507 
1514  mutable std::mutex connectioninfoMutex_;
1515 
1522  mutable std::mutex asyncGetEndpointMutex_;
1523 
1531 
1539 
1547 
1555 
1563 
1570  std::shared_ptr<Diarkis::System::DiarkisThread> getEndpointAsyncThread_;
1571 
1578  static Diarkis::System::Result GetEndpointAsync(void* owner);
1579 
1586  std::atomic<bool> internalSchedulerUpdated_;
1587 };
profile.h
DiarkisInterfaceBase::AsyncGetEndpointStatus
AsyncGetEndpointStatus
Running status of the process of getting the endpoint asynchronously.
Definition: DiarkisInterfaceBase.h:58
DiarkisInterfaceBase::getEndpointAsyncThread_
std::shared_ptr< Diarkis::System::DiarkisThread > getEndpointAsyncThread_
The thread used by the process of getting the endpoint asynchronously.
Definition: DiarkisInterfaceBase.h:1570
DiarkisInterfaceBase::tcpBase_
std::shared_ptr< DiarkisTcpBase > tcpBase_
Pointer to DiarkisTcpBase class.
Definition: DiarkisInterfaceBase.h:1277
DEBUG_AND_FILE_OUT
@ DEBUG_AND_FILE_OUT
Definition: DiarkisInterfaceBase.h:39
DiarkisInterfaceBase::authInfo_
AuthInfo authInfo_
Authentication information.
Definition: DiarkisInterfaceBase.h:1405
DiarkisInterfaceBase::p2pBase_
std::shared_ptr< DiarkisP2PBase > p2pBase_
Pointer to DiarkisP2PBase class.
Definition: DiarkisInterfaceBase.h:1293
DiarkisInterfaceBase::ActiveInstanceList::instances_
Diarkis::StdUniquePtr< Diarkis::StdVector< DiarkisInterfaceBase * > > instances_
A list of the instances that are currently executing the update process.
Definition: DiarkisInterfaceBase.h:1244
DiarkisInterfaceBase::roomBase_
std::shared_ptr< DiarkisRoomBase > roomBase_
Pointer to DiarkisRoomBase class.
Definition: DiarkisInterfaceBase.h:1301
DiarkisInterfaceBase::rpcBase_
std::shared_ptr< DiarkisRpcBase > rpcBase_
Pointer to DiarkisRpcBase class.
Definition: DiarkisInterfaceBase.h:1341
DiarkisInterfaceBase::aggregatedLoggerBackend_
static std::shared_ptr< ILoggerBackend > aggregatedLoggerBackend_
A logger interface that is used in the LoggerFactory.
Definition: DiarkisInterfaceBase.h:1477
DiarkisInterfaceBase::asyncGetEndpointStatus_
AsyncGetEndpointStatus asyncGetEndpointStatus_
The progress of the process of getting the endpoint asynchronously.
Definition: DiarkisInterfaceBase.h:1538
DiarkisP2PBase.h
CONSOLE_OUT
@ CONSOLE_OUT
Definition: DiarkisInterfaceBase.h:38
DiarkisInterfaceBase::host_
Diarkis::StdString host_
Address of the HTTP server to connect to.
Definition: DiarkisInterfaceBase.h:1365
DiarkisInterfaceBase::sid_
Diarkis::StdString sid_
Session ID.
Definition: DiarkisInterfaceBase.h:1397
DiarkisInterfaceBase::AsyncGetEndpointArgs::serverType
Diarkis::StdString serverType
Definition: DiarkisInterfaceBase.h:1505
DiarkisInterfaceBase::ActiveInstanceList::mutex_
std::mutex mutex_
A mutex object for the list.
Definition: DiarkisInterfaceBase.h:1236
Diarkis::StdString
Definition: common.h:432
DiarkisInterfaceBase::fieldBase_
std::shared_ptr< DiarkisFieldBase > fieldBase_
Pointer to DiarkisFieldBase class.
Definition: DiarkisInterfaceBase.h:1325
DiarkisInterfaceBase::logDir_
static std::shared_ptr< Diarkis::StdString > logDir_
Log output directory name.
Definition: DiarkisInterfaceBase.h:1413
DiarkisInterfaceBase::ActiveInstanceList
Definition: DiarkisInterfaceBase.h:1202
DiarkisInterfaceBase::loggerFactory_
std::shared_ptr< LoggerFactory > loggerFactory_
Pointer to LoggerFactory.
Definition: DiarkisInterfaceBase.h:1429
DiarkisInterfaceBase::asyncAuthResult_
AuthInfo asyncAuthResult_
The result of the process of getting the endpoint asynchronously.
Definition: DiarkisInterfaceBase.h:1562
DiarkisInterfaceBase::RuntimeThreadData::isRunning_
std::atomic< bool > isRunning_
Runtime loop exit flag.
Definition: DiarkisInterfaceBase.h:1159
DiarkisInterfaceBase::AsyncGetEndpointArgs::clientKey
Diarkis::StdString clientKey
Definition: DiarkisInterfaceBase.h:1504
Diarkis::System::Result
Contains information about a specific result value. Can be compared against another Result structure....
Definition: result.h:37
Diarkis::StdUniquePtr
std::unique_ptr< T, Diarkis::DiarkisAllocatorDeleter< T > > StdUniquePtr
Definition: common.h:384
DiarkisInterfaceBase::matchMakerBase_
std::shared_ptr< DiarkisMatchMakerBase > matchMakerBase_
Pointer to DiarkisMatchMakerBase class.
Definition: DiarkisInterfaceBase.h:1333
DiarkisInterfaceBase::activeInstances_
static ActiveInstanceList activeInstances_
A list of active instances.
Definition: DiarkisInterfaceBase.h:1253
DiarkisDirectMessageBase.h
DiarkisInterfaceBase::sessionBase_
std::shared_ptr< DiarkisSessionBase > sessionBase_
Pointer to DiarkisSessionBase class.
Definition: DiarkisInterfaceBase.h:1309
DiarkisInterfaceBase::uid_
const Diarkis::StdString uid_
My user ID.
Definition: DiarkisInterfaceBase.h:1381
DiarkisInterfaceBase::logger_
std::shared_ptr< IDiarkisLogger > logger_
Pointer to logger class.
Definition: DiarkisInterfaceBase.h:1421
DiarkisInterfaceBase::fileLoggerBackend_
static std::shared_ptr< ILoggerBackend > fileLoggerBackend_
Logger for file output.
Definition: DiarkisInterfaceBase.h:1461
FILE_OUT
@ FILE_OUT
Definition: DiarkisInterfaceBase.h:36
DiarkisInterfaceBase::RuntimeThreadData::noWait_
bool noWait_
Whether it need to enter the wait by using the condition variable.
Definition: DiarkisInterfaceBase.h:1191
DiarkisInterfaceBase::RuntimeThreadData::sync_condition_
std::condition_variable sync_condition_
A condition_variable that will be used for controlling the process launch timing.
Definition: DiarkisInterfaceBase.h:1183
DiarkisRoomBase.h
DiarkisInterfaceBase::globalLoggerFactory_
static std::shared_ptr< LoggerFactory > globalLoggerFactory_
A LoggerFactory that will be used for logging of the global process of the DiarkisInterfaceBase.
Definition: DiarkisInterfaceBase.h:1261
DiarkisRpcBase.h
DiarkisInterfaceBase::serverType_
Diarkis::StdString serverType_
Server type.
Definition: DiarkisInterfaceBase.h:1389
DiarkisUdpBase.h
DiarkisInterfaceBase::asyncEndpointResult_
Diarkis::StdString asyncEndpointResult_
The result of the process of getting the endpoint asynchronously.
Definition: DiarkisInterfaceBase.h:1554
DiarkisSessionBase.h
DEBUG_OUT
@ DEBUG_OUT
Definition: DiarkisInterfaceBase.h:35
DiarkisInterfaceBase::asyncGetEndpointArgs_
AsyncGetEndpointArgs asyncGetEndpointArgs_
The arguments passing to the asynchronous getting the endpoint process.
Definition: DiarkisInterfaceBase.h:1530
DiarkisInterfaceBase::profile_
std::shared_ptr< Diarkis::Network::IDiarkisProfile > profile_
Pointer to IDiarkisProfile class.
Definition: DiarkisInterfaceBase.h:1357
DiarkisInterfaceBase::logOutType_
static LogOutType logOutType_
Type of debug output.
Definition: DiarkisInterfaceBase.h:1485
AuthInfo
Definition: common.h:65
DiarkisInterfaceBase::connectioninfoMutex_
std::mutex connectioninfoMutex_
The mutex for the variables that are modified in the GetEndpoint method.
Definition: DiarkisInterfaceBase.h:1514
DiarkisInterfaceBase::AsyncGetEndpointArgs::host
Diarkis::StdString host
Definition: DiarkisInterfaceBase.h:1503
LogOutType
LogOutType
Type of log output.
Definition: DiarkisInterfaceBase.h:33
DiarkisInterfaceBase::internalSchedulerUpdated_
std::atomic< bool > internalSchedulerUpdated_
A flag enabled if the scheduler is updated.
Definition: DiarkisInterfaceBase.h:1586
FILE_OUT_TO_SPECIFIC_PATH
@ FILE_OUT_TO_SPECIFIC_PATH
Definition: DiarkisInterfaceBase.h:37
Thread.h
DiarkisInterfaceBase::bOutputLog_
static bool bOutputLog_
Whether to log output or not.
Definition: DiarkisInterfaceBase.h:1493
DiarkisInterfaceBase
Base class for interfaces that manipulate the Diarkis library.
Definition: DiarkisInterfaceBase.h:49
DiarkisGroupBase.h
DiarkisInterfaceBase::threadLoggerBackend_
static std::shared_ptr< ThreadedLoggerBackend > threadLoggerBackend_
Threaded loggers for collective output.
Definition: DiarkisInterfaceBase.h:1437
common.h
DiarkisInterfaceBase::clientKey_
Diarkis::StdString clientKey_
Client key of the HTTP server to connect to.
Definition: DiarkisInterfaceBase.h:1373
CUSTOM
@ CUSTOM
Definition: DiarkisInterfaceBase.h:40
DiarkisInterfaceBase::dmBase_
std::shared_ptr< DiarkisDirectMessageBase > dmBase_
Pointer to DiarkisDirectMessageBase class.
Definition: DiarkisInterfaceBase.h:1349
Diarkis::System::DiarkisThreadPolicy
DiarkisThreadPolicy
Thread scheduling policy.
Definition: Thread.h:44
DiarkisInterfaceBase::RuntimeThreadData::runtimeThread_
std::shared_ptr< Diarkis::System::DiarkisThread > runtimeThread_
Runtime loop thread.
Definition: DiarkisInterfaceBase.h:1167
DiarkisInterfaceBase::RuntimeThreadData::RuntimeThreadData
RuntimeThreadData()
Definition: DiarkisInterfaceBase.h:1143
DiarkisInterfaceBase::asyncGetEndpointMutex_
std::mutex asyncGetEndpointMutex_
The mutex for the whole process of getting the endpoint asynchronously.
Definition: DiarkisInterfaceBase.h:1522
DiarkisInterfaceBase::udpBase_
std::shared_ptr< DiarkisUdpBase > udpBase_
Pointer to DiarkisUdpBase class.
Definition: DiarkisInterfaceBase.h:1285
DiarkisInterfaceBase::asyncGetEndpointResult_
bool asyncGetEndpointResult_
The result of the process of getting the endpoint asynchronously.
Definition: DiarkisInterfaceBase.h:1546
DiarkisInterfaceBase::customLoggerBackend_
static std::shared_ptr< ILoggerBackend > customLoggerBackend_
Custom logger.
Definition: DiarkisInterfaceBase.h:1469
DiarkisInterfaceBase::groupBase_
std::shared_ptr< DiarkisGroupBase > groupBase_
Pointer to DiarkisGroupBase class.
Definition: DiarkisInterfaceBase.h:1317
DiarkisTcpBase.h
DiarkisInterfaceBase::debugLoggerBackend_
static std::shared_ptr< ILoggerBackend > debugLoggerBackend_
Logger for debug output.
Definition: DiarkisInterfaceBase.h:1453
DIARKIS_API
#define DIARKIS_API
Definition: common.h:47
DiarkisFieldBase.h
DiarkisInterfaceBase::AsyncGetEndpointArgs
The arguments passing to the asynchronous getting the endpoint process.
Definition: DiarkisInterfaceBase.h:1501
DiarkisMatchMakerBase.h
DiarkisInterfaceBase::runtimeThreadData_
static RuntimeThreadData runtimeThreadData_
A data of the runtime thread.
Definition: DiarkisInterfaceBase.h:1200
ConsoleLoggerBackend.h
DiarkisInterfaceBase::RuntimeThreadData::sync_mutex_
std::mutex sync_mutex_
A mutex object that will be used by the condition_variable.
Definition: DiarkisInterfaceBase.h:1175
DiarkisInterfaceBase::RuntimeThreadData
Definition: DiarkisInterfaceBase.h:1141
DiarkisInterfaceBase::consoleLoggerBackend_
static std::shared_ptr< ILoggerBackend > consoleLoggerBackend_
Logger for console output.
Definition: DiarkisInterfaceBase.h:1445