-
Notifications
You must be signed in to change notification settings - Fork 5
/
poMessageCenter.cpp
96 lines (76 loc) · 3.28 KB
/
poMessageCenter.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "poMessageCenter.h"
#include "poObject.h"
typedef struct {
poObject* sender;
std::string message;
poDictionary dict;
} poMessage;
typedef struct {
poObject* sender;
poObject* subscriber;
} poMessageSubscriber;
namespace poMessageCenter {
namespace {
std::map<std::string, std::vector<poMessageSubscriber* > > subscribers;
std::vector<poMessage* > messageQueue;
}
//------------------------------------------------------------------
void update() {
std::vector<poMessage*> copy(messageQueue.begin(), messageQueue.end());
messageQueue.clear();
//Go through queue, broadcasting messages
std::vector<poMessage*>::iterator it = copy.begin();
while(it != copy.end()) {
poMessage* m = *it;
//Go through subscribers for this message, checking to see if they need to be alerted
for (std::vector<poMessageSubscriber* >::iterator sIter = subscribers[m->message].begin(); sIter != subscribers[m->message].end(); ++sIter) {
poMessageSubscriber* thisSubscriber = (*sIter);
if(thisSubscriber->sender == NULL || thisSubscriber->sender == m->sender) {
(*sIter)->subscriber->messageHandler(m->message, m->dict);
}
}
delete m;
// it = copy.erase(it);
++it;
}
}
//------------------------------------------------------------------
void addSubscriber(std::string msg, poObject* subscriber, poObject* sender) {
subscribers[msg].push_back(new poMessageSubscriber());
subscribers[msg].back()->sender = sender;
subscribers[msg].back()->subscriber = subscriber;
}
//------------------------------------------------------------------
void removeSubscriber(std::string msg, poObject* subscriber) {
if(subscribers.find(msg) != subscribers.end()) {
if(!subscribers[msg].empty()) {
//Find the subscriber and delete it
for(std::vector<poMessageSubscriber* >::iterator sIter = subscribers[msg].begin(); sIter != subscribers[msg].end(); ++sIter) {
poMessageSubscriber* thisSubscriber = (*sIter);
if(thisSubscriber->subscriber == subscriber) {
delete (*sIter);
subscribers[msg].erase(sIter);
}
}
}
}
}
//------------------------------------------------------------------
void removeAllSubscribers(std::string msg) {
if(subscribers.find(msg) != subscribers.end()) {
subscribers[msg].clear();
std::map<std::string, std::vector<poMessageSubscriber* > >::iterator it;
it = subscribers.find(msg);
subscribers.erase(it);
}
}
//------------------------------------------------------------------
void broadcastMessage(std::string msg, poObject* sender, const poDictionary& dict) {
if(subscribers.find(msg) != subscribers.end()) {
messageQueue.push_back(new poMessage());
messageQueue.back()->sender = sender;
messageQueue.back()->message = msg;
messageQueue.back()->dict = dict;
}
}
}