Cogs.Foundation
Loading...
Searching...
No Matches
MessageHub.h
Go to the documentation of this file.
1#pragma once
2
3#include "Message.h"
4#include "../Platform/Threads.h"
5
6#include <deque>
7#include <vector>
8
9namespace Cogs {
10 namespace Network {
11
12 // Known hub IDs...
13 constexpr uint32_t cApplicationHubID = 0x7FFF0000;
14 constexpr uint32_t cFirstWindowHubID = 0x7FFF1000;
15
31 public:
32 using MessageQueue = std::deque< Message::Ptr >;
33 using HubList = std::vector< MessageHub* >;
34
35 static constexpr size_t noLimit = 10000000;
36
37 MessageHub(uint32_t ident = 0);
38 virtual ~MessageHub();
39
40 bool addListener(MessageHub* hub, bool bidirectional = false);
41 bool addListener(uint32_t hubid, bool bidirectional = false);
42 bool listenTo(MessageHub* hub, bool bidirectional = false);
43 bool listenTo(uint32_t hubid, bool bidirectional = false);
44 bool removeListener(MessageHub* hub);
45 bool removeListener(uint32_t hubid);
46 void removeAllListeners();
47
48 void disconnectFromSender(uint32_t hubid);
49 void disconnectFromAllSenders();
50
51 virtual void broadcastMessage(const Message::Ptr& message);
52 virtual void sendMessage(const Message::Ptr& message);
53 virtual void queueMessage(const Message::Ptr& message);
54 virtual bool processMessages(size_t limit = noLimit);
55 virtual bool isSendOnly() const { return false; }
56
57 uint32_t getID() const { return id; }
58 size_t getNoOfQueuedMessages();
59 void flushQueuedMessages();
60
61 protected:
62 Message::Ptr getNextMessage();
63
64 private:
67
71 uint32_t id;
72
73 virtual void processMessage(Message& /*message*/) {}
74
75 void addSender(MessageHub* sender);
76 void removeSender(const MessageHub* sender);
77 };
78
84 public:
85 SendOnlyMessageHub(uint32_t ident = 0) : MessageHub(ident) {}
86 virtual bool isSendOnly() const override { return true; }
87
88 private:
89 virtual void queueMessage(const Message::Ptr& /*message*/) override {}
90 };
91 }
92}
#define COGSFOUNDATION_API
Definition: FoundationBase.h:31
A MessageHub connects to other hubs to form a simple peer-to-peer application-internal networking sys...
Definition: MessageHub.h:30
std::deque< Message::Ptr > MessageQueue
Definition: MessageHub.h:32
MessageQueue messages
Messages waiting to be processed by this hub.
Definition: MessageHub.h:65
Mutex hubsMutex
Mutex protecting the above lists.
Definition: MessageHub.h:70
Mutex messagesMutex
Mutex for the above queue.
Definition: MessageHub.h:66
uint32_t id
Our ID.
Definition: MessageHub.h:71
uint32_t getID() const
Definition: MessageHub.h:57
std::vector< MessageHub * > HubList
Definition: MessageHub.h:33
HubList listeners
List of hubs listening to our messages.
Definition: MessageHub.h:68
HubList senders
List of hubs to which we are listening.
Definition: MessageHub.h:69
virtual void processMessage(Message &)
Definition: MessageHub.h:73
virtual bool isSendOnly() const
Definition: MessageHub.h:55
Definition: Message.h:12
std::shared_ptr< Message > Ptr
Definition: Message.h:15
A MessageHub that only supports sending messages.
Definition: MessageHub.h:83
SendOnlyMessageHub(uint32_t ident=0)
Definition: MessageHub.h:85
virtual void queueMessage(const Message::Ptr &) override
Queue a message for this hub to process.
Definition: MessageHub.h:89
virtual bool isSendOnly() const override
Definition: MessageHub.h:86
constexpr uint32_t cFirstWindowHubID
Definition: MessageHub.h:14
constexpr uint32_t cApplicationHubID
Definition: MessageHub.h:13
Main Cogs namespace.
Definition: MortonCode.h:5
std::mutex Mutex
Definition: Threads.h:62