Cogs.Core
MessageHub.h
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
30 class COGSFOUNDATION_API MessageHub {
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:
65 MessageQueue messages;
67
68 HubList listeners;
69 HubList senders;
70 Mutex hubsMutex;
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
83 class COGSFOUNDATION_API SendOnlyMessageHub : public MessageHub {
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}
A MessageHub connects to other hubs to form a simple peer-to-peer application-internal networking sys...
Definition: MessageHub.h:30
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
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
A MessageHub that only supports sending messages.
Definition: MessageHub.h:83
virtual void queueMessage(const Message::Ptr &) override
Queue a message for this hub to process.
Definition: MessageHub.h:89
Contains all Cogs related functionality.
Definition: FieldSetter.h:23