Line data Source code
1 : #include <utility>
2 :
3 : #include "communication/NetworkEvent.hpp"
4 : #include "communication/NetworkEventDispatcher.hpp"
5 : #include "communication/NetworkMessage.hpp"
6 : #include "communication/NetworkPackets.hpp"
7 :
8 : #include "core/math/Glm.hpp"
9 :
10 : #include "spdlog/spdlog.h"
11 :
12 : namespace Soldank
13 : {
14 8 : NetworkEventDispatcher::NetworkEventDispatcher(
15 8 : const std::vector<std::shared_ptr<INetworkEventHandler>>& network_event_handlers)
16 8 : : network_event_handlers_(network_event_handlers)
17 : {
18 8 : }
19 :
20 8 : NetworkEventDispatcher::TDispatchResult NetworkEventDispatcher::ProcessNetworkMessage(
21 : const ConnectionMetadata& connection_metadata,
22 : const NetworkMessage& network_message)
23 : {
24 8 : auto network_event_or_error = network_message.GetNetworkEvent();
25 8 : if (!network_event_or_error.has_value()) {
26 1 : return { NetworkEventDispatchResult::ParseError, network_event_or_error.error() };
27 : }
28 :
29 7 : auto network_event = *network_event_or_error;
30 :
31 12 : for (const auto& network_event_handler : network_event_handlers_) {
32 11 : if (!network_event_handler->ShouldHandleNetworkEvent(network_event)) {
33 5 : continue;
34 : }
35 :
36 : auto parse_error_or_nothing =
37 6 : network_event_handler->ValidateNetworkMessage(network_message);
38 6 : if (parse_error_or_nothing.has_value()) {
39 2 : return { NetworkEventDispatchResult::ParseError, parse_error_or_nothing.value() };
40 : }
41 :
42 4 : auto handler_result = network_event_handler->HandleNetworkMessage(
43 4 : connection_metadata.connection_id, network_message);
44 4 : switch (handler_result) {
45 2 : case NetworkEventHandlerResult::Success:
46 2 : return { NetworkEventDispatchResult::Success, handler_result };
47 2 : case NetworkEventHandlerResult::Failure:
48 2 : return { NetworkEventDispatchResult::HandlerFailure, handler_result };
49 : }
50 : }
51 :
52 1 : return { NetworkEventDispatchResult::ParseError, ParseError::InvalidNetworkEvent };
53 : }
54 :
55 0 : void NetworkEventDispatcher::AddNetworkEventHandler(
56 : const std::shared_ptr<INetworkEventHandler>& network_event_handler)
57 : {
58 0 : network_event_handlers_.push_back(network_event_handler);
59 0 : }
60 : } // namespace Soldank
|