1 #include "server_response_containers.h"
2 
3 #include "server_game.h"
4 
5 #include <google/protobuf/descriptor.h>
6 
GameEventStorageItem(const::google::protobuf::Message & _event,int _playerId,EventRecipients _recipients)7 GameEventStorageItem::GameEventStorageItem(const ::google::protobuf::Message &_event,
8                                            int _playerId,
9                                            EventRecipients _recipients)
10     : event(new GameEvent), recipients(_recipients)
11 {
12     event->GetReflection()->MutableMessage(event, _event.GetDescriptor()->FindExtensionByName("ext"))->CopyFrom(_event);
13     event->set_player_id(_playerId);
14 }
15 
~GameEventStorageItem()16 GameEventStorageItem::~GameEventStorageItem()
17 {
18     delete event;
19 }
20 
GameEventStorage()21 GameEventStorage::GameEventStorage() : gameEventContext(0), privatePlayerId(0)
22 {
23 }
24 
~GameEventStorage()25 GameEventStorage::~GameEventStorage()
26 {
27     delete gameEventContext;
28     for (int i = 0; i < gameEventList.size(); ++i)
29         delete gameEventList[i];
30 }
31 
setGameEventContext(const::google::protobuf::Message & _gameEventContext)32 void GameEventStorage::setGameEventContext(const ::google::protobuf::Message &_gameEventContext)
33 {
34     delete gameEventContext;
35     gameEventContext = new GameEventContext;
36     gameEventContext->GetReflection()
37         ->MutableMessage(gameEventContext, _gameEventContext.GetDescriptor()->FindExtensionByName("ext"))
38         ->CopyFrom(_gameEventContext);
39 }
40 
enqueueGameEvent(const::google::protobuf::Message & event,int playerId,GameEventStorageItem::EventRecipients recipients,int _privatePlayerId)41 void GameEventStorage::enqueueGameEvent(const ::google::protobuf::Message &event,
42                                         int playerId,
43                                         GameEventStorageItem::EventRecipients recipients,
44                                         int _privatePlayerId)
45 {
46     gameEventList.append(new GameEventStorageItem(event, playerId, recipients));
47     if (_privatePlayerId != -1)
48         privatePlayerId = _privatePlayerId;
49 }
50 
sendToGame(Server_Game * game)51 void GameEventStorage::sendToGame(Server_Game *game)
52 {
53     if (gameEventList.isEmpty())
54         return;
55 
56     GameEventContainer *contPrivate = new GameEventContainer;
57     GameEventContainer *contOthers = new GameEventContainer;
58     if (forcedByJudge != -1) {
59         contPrivate->set_forced_by_judge(forcedByJudge);
60         contOthers->set_forced_by_judge(forcedByJudge);
61     }
62     for (int i = 0; i < gameEventList.size(); ++i) {
63         const GameEvent &event = gameEventList[i]->getGameEvent();
64         const GameEventStorageItem::EventRecipients recipients = gameEventList[i]->getRecipients();
65         if (recipients.testFlag(GameEventStorageItem::SendToPrivate))
66             contPrivate->add_event_list()->CopyFrom(event);
67         if (recipients.testFlag(GameEventStorageItem::SendToOthers))
68             contOthers->add_event_list()->CopyFrom(event);
69     }
70     if (gameEventContext) {
71         contPrivate->mutable_context()->CopyFrom(*gameEventContext);
72         contOthers->mutable_context()->CopyFrom(*gameEventContext);
73     }
74     game->sendGameEventContainer(contPrivate, GameEventStorageItem::SendToPrivate, privatePlayerId);
75     game->sendGameEventContainer(contOthers, GameEventStorageItem::SendToOthers, privatePlayerId);
76 }
77 
ResponseContainer(int _cmdId)78 ResponseContainer::ResponseContainer(int _cmdId) : cmdId(_cmdId), responseExtension(0)
79 {
80 }
81 
~ResponseContainer()82 ResponseContainer::~ResponseContainer()
83 {
84     delete responseExtension;
85     for (int i = 0; i < preResponseQueue.size(); ++i)
86         delete preResponseQueue[i].second;
87     for (int i = 0; i < postResponseQueue.size(); ++i)
88         delete postResponseQueue[i].second;
89 }
90