1 /*
2  *  This file is part of Dune Legacy.
3  *
4  *  Dune Legacy is free software: you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation, either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  Dune Legacy is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with Dune Legacy.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef METASERVERCOMMANDS_H
19 #define METASERVERCOMMANDS_H
20 
21 #include <SDL.h>
22 #include <string>
23 
24 
25 #define METASERVERCOMMAND_ADD       1
26 #define METASERVERCOMMAND_UPDATE    2
27 #define METASERVERCOMMAND_REMOVE    3
28 #define METASERVERCOMMAND_LIST      4
29 #define METASERVERCOMMAND_EXIT      5
30 
31 
32 
33 class MetaServerCommand {
34 public:
MetaServerCommand(int type)35     explicit MetaServerCommand(int type) : type(type) {
36     }
37 
~MetaServerCommand()38     virtual ~MetaServerCommand() {
39     }
40 
41     virtual bool operator==(const MetaServerCommand& metaServerCommand) const {
42         return (type == metaServerCommand.type);
43     }
44 
45     int type;
46 };
47 
48 class MetaServerAdd : public MetaServerCommand {
49 public:
MetaServerAdd(const std::string & serverName,int serverPort,const std::string & secret,const std::string & mapName,Uint8 numPlayers,Uint8 maxPlayers)50     MetaServerAdd(const std::string& serverName, int serverPort, const std::string& secret, const std::string& mapName, Uint8 numPlayers, Uint8 maxPlayers)
51      : MetaServerCommand(METASERVERCOMMAND_ADD), serverName(serverName), serverPort(serverPort), secret(secret),
52        mapName(mapName), numPlayers(numPlayers), maxPlayers(maxPlayers) {
53     }
54 
55     bool operator==(const MetaServerCommand& metaServerCommand) const {
56         const MetaServerAdd* pMetaServerAdd = dynamic_cast<const MetaServerAdd*>(&metaServerCommand);
57 
58         if(pMetaServerAdd == nullptr) {
59             return false;
60         } else {
61 
62             return ((serverName == pMetaServerAdd->serverName)
63                      && (serverPort == pMetaServerAdd->serverPort)
64                      && (secret == pMetaServerAdd->secret)
65                      && (mapName == pMetaServerAdd->mapName)
66                      && (numPlayers == pMetaServerAdd->numPlayers)
67                      && (maxPlayers == pMetaServerAdd->maxPlayers));
68         }
69     }
70 
71     std::string serverName;
72     int serverPort;
73     std::string secret;
74     std::string mapName;
75     Uint8 numPlayers;
76     Uint8 maxPlayers;
77 };
78 
79 class MetaServerUpdate : public MetaServerCommand {
80 public:
MetaServerUpdate(const std::string & serverName,int serverPort,const std::string & secret,const std::string & mapName,Uint8 numPlayers,Uint8 maxPlayers)81     MetaServerUpdate(const std::string& serverName, int serverPort, const std::string& secret, const std::string& mapName, Uint8 numPlayers, Uint8 maxPlayers)
82      : MetaServerCommand(METASERVERCOMMAND_UPDATE), serverName(serverName), serverPort(serverPort), secret(secret),
83        mapName(mapName), numPlayers(numPlayers), maxPlayers(maxPlayers) {
84     }
85 
86     bool operator==(const MetaServerCommand& metaServerCommand) const {
87         const MetaServerUpdate* pMetaServerUpdate = dynamic_cast<const MetaServerUpdate*>(&metaServerCommand);
88 
89         if(pMetaServerUpdate == nullptr) {
90             return false;
91         } else {
92 
93             return ((serverName == pMetaServerUpdate->serverName)
94                      && (serverPort == pMetaServerUpdate->serverPort)
95                      && (secret == pMetaServerUpdate->secret)
96                      && (mapName == pMetaServerUpdate->mapName)
97                      && (numPlayers == pMetaServerUpdate->numPlayers)
98                      && (maxPlayers == pMetaServerUpdate->maxPlayers));
99         }
100     }
101 
102     std::string serverName;
103     int serverPort;
104     std::string secret;
105     std::string mapName;
106     Uint8 numPlayers;
107     Uint8 maxPlayers;
108 };
109 
110 class MetaServerRemove : public MetaServerCommand {
111 public:
MetaServerRemove(int serverPort,const std::string & secret)112     MetaServerRemove(int serverPort, const std::string& secret)
113      : MetaServerCommand(METASERVERCOMMAND_REMOVE), serverPort(serverPort), secret(secret) {
114     }
115 
116     bool operator==(const MetaServerCommand& metaServerCommand) const {
117         const MetaServerRemove* pMetaServerRemove = dynamic_cast<const MetaServerRemove*>(&metaServerCommand);
118 
119         if(pMetaServerRemove == nullptr) {
120             return false;
121         } else {
122 
123             return ((serverPort == pMetaServerRemove->serverPort)
124                      && (secret == pMetaServerRemove->secret));
125         }
126     }
127 
128     int serverPort;
129     std::string secret;
130 };
131 
132 class MetaServerList : public MetaServerCommand {
133 public:
MetaServerList()134     MetaServerList()
135      : MetaServerCommand(METASERVERCOMMAND_LIST) {
136     }
137 };
138 
139 class MetaServerExit : public MetaServerCommand {
140 public:
MetaServerExit()141     MetaServerExit()
142      : MetaServerCommand(METASERVERCOMMAND_EXIT) {
143     }
144 };
145 
146 #endif // METASERVERCOMMANDS_H
147