Merge from development branch heightmap to main.
[scorched3d.git] / src / common / coms / ComsMessageHandler.cpp
blobd95204a39d7dbaa3c8318165b798f6e4eee10e39
1 ////////////////////////////////////////////////////////////////////////////////
2 // Scorched3D (c) 2000-2003
3 //
4 // This file is part of Scorched3D.
5 //
6 // Scorched3D is free software; you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation; either version 2 of the License, or
9 // (at your option) any later version.
11 // Scorched3D is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with Scorched3D; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 ////////////////////////////////////////////////////////////////////////////////
21 #include <coms/ComsMessageHandler.h>
22 #include <common/Defines.h>
23 #include <common/Logger.h>
25 ComsMessageConnectionHandlerI::~ComsMessageConnectionHandlerI()
29 ComsMessageHandlerI::~ComsMessageHandlerI()
33 ComsMessageHandlerSentI::~ComsMessageHandlerSentI()
37 ComsMessageHandler::ComsMessageHandler(const char *instanceName) :
38 instanceName_(instanceName),
39 connectionHandler_(0), comsMessageLogging_(false)
43 ComsMessageHandler::~ComsMessageHandler()
47 void ComsMessageHandler::setConnectionHandler(
48 ComsMessageConnectionHandlerI *handler)
50 connectionHandler_ = handler;
53 void ComsMessageHandler::addHandler(const char *messageType,
54 ComsMessageHandlerI *handler)
56 std::map<std::string, ComsMessageHandlerI *>::iterator itor =
57 recvHandlerMap_.find(messageType);
58 DIALOG_ASSERT(itor == recvHandlerMap_.end());
60 recvHandlerMap_[messageType] = handler;
63 void ComsMessageHandler::addSentHandler(const char *messageType,
64 ComsMessageHandlerSentI *handler)
66 std::map<std::string, ComsMessageHandlerSentI *>::iterator itor =
67 sentHandlerMap_.find(messageType);
68 DIALOG_ASSERT(itor == sentHandlerMap_.end());
70 sentHandlerMap_[messageType] = handler;
73 void ComsMessageHandler::processMessage(NetMessage &message)
75 switch(message.getMessageType())
77 case NetMessage::BufferMessage:
78 if (connectionHandler_)
79 connectionHandler_->messageRecv(message.getDestinationId());
80 processReceiveMessage(message);
81 break;
82 case NetMessage::SentMessage:
83 if (connectionHandler_)
84 connectionHandler_->messageSent(message.getDestinationId());
85 processSentMessage(message);
86 break;
87 case NetMessage::DisconnectMessage:
88 if (comsMessageLogging_)
90 Logger::log(S3D::formatStringBuffer("ComsMessage::Disconnected(%i, %i)",
91 message.getDestinationId(), message.getFlags()));
94 if (connectionHandler_)
95 connectionHandler_->clientDisconnected(message);
96 break;
97 case NetMessage::ConnectMessage:
98 if (comsMessageLogging_)
100 Logger::log(S3D::formatStringBuffer("ComsMessage::Connected(%i)",
101 message.getDestinationId()));
104 if (connectionHandler_)
105 connectionHandler_->clientConnected(message);
106 break;
107 default:
108 if (connectionHandler_)
109 connectionHandler_->clientError(message,
110 "Failed to recognise message type");
111 break;
115 void ComsMessageHandler::processReceiveMessage(NetMessage &message)
117 unsigned int bufferUsed = message.getBuffer().getBufferUsed();
118 if (!message.getBuffer().uncompressBuffer())
120 if (connectionHandler_)
121 connectionHandler_->clientError(message,
122 "Failed to uncompress RECV message type");
124 NetBufferReader reader(message.getBuffer());
126 std::string messageType;
127 if (!reader.getFromBuffer(messageType))
129 if (connectionHandler_)
130 connectionHandler_->clientError(message,
131 "Failed to decode RECV message type");
132 return;
135 if (comsMessageLogging_)
137 Logger::log(S3D::formatStringBuffer("%s::process(%s, %i, %u)",
138 instanceName_.c_str(),
139 messageType.c_str(), message.getDestinationId(),
140 bufferUsed));
143 std::map<std::string, ComsMessageHandlerI *>::iterator itor =
144 recvHandlerMap_.find(messageType);
145 if (itor == recvHandlerMap_.end())
147 char buffer[1024];
148 snprintf(buffer, 1024, "Failed to find RECV message type handler \"%s\"",
149 messageType.c_str());
151 if (connectionHandler_)
152 connectionHandler_->clientError(message,
153 buffer);
154 return;
157 ComsMessageHandlerI *handler = (*itor).second;
158 const char *messageTypeStr = messageType.c_str();
159 if (!handler->processMessage(
160 message, messageTypeStr, reader))
162 char buffer[1024];
163 snprintf(buffer, 1024, "Failed to handle RECV message type \"%s\"",
164 messageType.c_str());
166 if (connectionHandler_)
167 connectionHandler_->clientError(message,
168 buffer);
169 return;
172 if (comsMessageLogging_)
174 Logger::log(S3D::formatStringBuffer("%s::processFinished(%s, %i)",
175 instanceName_.c_str(),
176 messageType.c_str(), message.getDestinationId()));
180 void ComsMessageHandler::processSentMessage(NetMessage &message)
182 if (sentHandlerMap_.empty()) return;
184 message.getBuffer().uncompressBuffer();
185 NetBufferReader reader(message.getBuffer());
187 std::string messageType;
188 if (!reader.getFromBuffer(messageType))
190 if (connectionHandler_)
191 connectionHandler_->clientError(message,
192 "Failed to decode SENT message type");
193 return;
196 if (comsMessageLogging_)
198 Logger::log(S3D::formatStringBuffer("%s::processSentMessage(%s, %i)",
199 instanceName_.c_str(),
200 messageType.c_str(), message.getDestinationId()));
203 std::map<std::string, ComsMessageHandlerSentI *>::iterator itor =
204 sentHandlerMap_.find(messageType);
205 if (itor == sentHandlerMap_.end()) return;
207 ComsMessageHandlerSentI *handler = (*itor).second;
208 const char *messageTypeStr = messageType.c_str();
209 if (!handler->processSentMessage(message.getDestinationId(),
210 messageTypeStr, reader))
212 char buffer[1024];
213 snprintf(buffer, 1024, "Failed to handle SENT message type \"%s\"",
214 messageType.c_str());
216 if (connectionHandler_)
217 connectionHandler_->clientError(message,
218 buffer);
219 return;