EventThread.cpp 1.8 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
 * Copyright 2015 Institut Laue-Langevin
 *
 * Licensed under the EUPL, Version 1.1 only (the "License");
 * You may not use this work except in compliance with the Licence.
 * You may obtain a copy of the Licence at:
 *
 * http://joinup.ec.europa.eu/software/page/eupl
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the Licence is distributed on an "AS IS" basis,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the Licence for the specific language governing permissions and
 * limitations under the Licence.
 */

#include "EventThread.h"
#include "Server.h"
#include "EventStreamSocket.h"
20
21
22
#include "EventListener.h"

using namespace std;
23
24
25
26
27
28
29
30
31
32

namespace cameo {

EventThread::EventThread(Server * server, std::unique_ptr<EventStreamSocket>& socket) :
	m_server(server) {
	m_socket = std::move(socket);
}

EventThread::~EventThread() {

33
34
35
	if (m_thread != nullptr) {
		m_thread->join();
	}
36
37
}

38
void EventThread::start() {
39

40
	m_thread.reset(new thread([this] {
41

42
43
		while (true) {
			unique_ptr<Event> event = m_socket->receive();
44

45
46
47
48
			if (event.get() == nullptr) {
				// The stream is canceled.
				return;
			}
49

50
51
52
			// Forward the event to the listeners.
			auto eventListeners = m_server->getEventListeners();
			for (EventListener * listener : eventListeners) {
53

54
55
56
				// If the application name is null, all the status are pushed, otherwise, filter on the name.
				if (listener->getName() == ""
					|| listener->getName() == event->getName()) {
57
58
59
60
61
62

					// Clone the event is necessary because the event is passed to different listeners working in different threads.
					unique_ptr<Event> clonedEvent(event->clone());

					// Push the cloned event.
					listener->pushEvent(clonedEvent);
63
64
65
66
				}
			}
		}
	}));
67
68
}

69
70
void EventThread::cancel() {
	m_socket->cancel();
71
72
73
}

}