00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <coms/ComsMessageHandler.h>
00022 #include <common/Defines.h>
00023 #include <common/Logger.h>
00024
00025 ComsMessageConnectionHandlerI::~ComsMessageConnectionHandlerI()
00026 {
00027 }
00028
00029 ComsMessageHandlerI::~ComsMessageHandlerI()
00030 {
00031 }
00032
00033 ComsMessageHandlerSentI::~ComsMessageHandlerSentI()
00034 {
00035 }
00036
00037 ComsMessageHandler::ComsMessageHandler(const char *instanceName) :
00038 instanceName_(instanceName),
00039 connectionHandler_(0), comsMessageLogging_(false)
00040 {
00041 }
00042
00043 ComsMessageHandler::~ComsMessageHandler()
00044 {
00045 }
00046
00047 void ComsMessageHandler::setConnectionHandler(
00048 ComsMessageConnectionHandlerI *handler)
00049 {
00050 connectionHandler_ = handler;
00051 }
00052
00053 void ComsMessageHandler::addHandler(const char *messageType,
00054 ComsMessageHandlerI *handler)
00055 {
00056 std::map<std::string, ComsMessageHandlerI *>::iterator itor =
00057 recvHandlerMap_.find(messageType);
00058 DIALOG_ASSERT(itor == recvHandlerMap_.end());
00059
00060 recvHandlerMap_[messageType] = handler;
00061 }
00062
00063 void ComsMessageHandler::addSentHandler(const char *messageType,
00064 ComsMessageHandlerSentI *handler)
00065 {
00066 std::map<std::string, ComsMessageHandlerSentI *>::iterator itor =
00067 sentHandlerMap_.find(messageType);
00068 DIALOG_ASSERT(itor == sentHandlerMap_.end());
00069
00070 sentHandlerMap_[messageType] = handler;
00071 }
00072
00073 void ComsMessageHandler::processMessage(NetMessage &message)
00074 {
00075 switch(message.getMessageType())
00076 {
00077 case NetMessage::BufferMessage:
00078 if (connectionHandler_)
00079 connectionHandler_->messageRecv(message.getDestinationId());
00080 processReceiveMessage(message);
00081 break;
00082 case NetMessage::SentMessage:
00083 if (connectionHandler_)
00084 connectionHandler_->messageSent(message.getDestinationId());
00085 processSentMessage(message);
00086 break;
00087 case NetMessage::DisconnectMessage:
00088 if (comsMessageLogging_)
00089 {
00090 Logger::log(S3D::formatStringBuffer("ComsMessage::Disconnected(%i, %i)",
00091 message.getDestinationId(), message.getFlags()));
00092 }
00093
00094 if (connectionHandler_)
00095 connectionHandler_->clientDisconnected(message);
00096 break;
00097 case NetMessage::ConnectMessage:
00098 if (comsMessageLogging_)
00099 {
00100 Logger::log(S3D::formatStringBuffer("ComsMessage::Connected(%i)",
00101 message.getDestinationId()));
00102 }
00103
00104 if (connectionHandler_)
00105 connectionHandler_->clientConnected(message);
00106 break;
00107 default:
00108 if (connectionHandler_)
00109 connectionHandler_->clientError(message,
00110 "Failed to recognise message type");
00111 break;
00112 }
00113 }
00114
00115 void ComsMessageHandler::processReceiveMessage(NetMessage &message)
00116 {
00117 unsigned int bufferUsed = message.getBuffer().getBufferUsed();
00118 if (!message.getBuffer().uncompressBuffer())
00119 {
00120 if (connectionHandler_)
00121 connectionHandler_->clientError(message,
00122 "Failed to uncompress RECV message type");
00123 }
00124 NetBufferReader reader(message.getBuffer());
00125
00126 std::string messageType;
00127 if (!reader.getFromBuffer(messageType))
00128 {
00129 if (connectionHandler_)
00130 connectionHandler_->clientError(message,
00131 "Failed to decode RECV message type");
00132 return;
00133 }
00134
00135 if (comsMessageLogging_)
00136 {
00137 Logger::log(S3D::formatStringBuffer("%s::process(%s, %i, %u)",
00138 instanceName_.c_str(),
00139 messageType.c_str(), message.getDestinationId(),
00140 bufferUsed));
00141 }
00142
00143 std::map<std::string, ComsMessageHandlerI *>::iterator itor =
00144 recvHandlerMap_.find(messageType);
00145 if (itor == recvHandlerMap_.end())
00146 {
00147 char buffer[1024];
00148 snprintf(buffer, 1024, "Failed to find RECV message type handler \"%s\"",
00149 messageType.c_str());
00150
00151 if (connectionHandler_)
00152 connectionHandler_->clientError(message,
00153 buffer);
00154 return;
00155 }
00156
00157 ComsMessageHandlerI *handler = (*itor).second;
00158 const char *messageTypeStr = messageType.c_str();
00159 if (!handler->processMessage(
00160 message, messageTypeStr, reader))
00161 {
00162 char buffer[1024];
00163 snprintf(buffer, 1024, "Failed to handle RECV message type \"%s\"",
00164 messageType.c_str());
00165
00166 if (connectionHandler_)
00167 connectionHandler_->clientError(message,
00168 buffer);
00169 return;
00170 }
00171
00172 if (comsMessageLogging_)
00173 {
00174 Logger::log(S3D::formatStringBuffer("%s::processFinished(%s, %i)",
00175 instanceName_.c_str(),
00176 messageType.c_str(), message.getDestinationId()));
00177 }
00178 }
00179
00180 void ComsMessageHandler::processSentMessage(NetMessage &message)
00181 {
00182 if (sentHandlerMap_.empty()) return;
00183
00184 message.getBuffer().uncompressBuffer();
00185 NetBufferReader reader(message.getBuffer());
00186
00187 std::string messageType;
00188 if (!reader.getFromBuffer(messageType))
00189 {
00190 if (connectionHandler_)
00191 connectionHandler_->clientError(message,
00192 "Failed to decode SENT message type");
00193 return;
00194 }
00195
00196 if (comsMessageLogging_)
00197 {
00198 Logger::log(S3D::formatStringBuffer("%s::processSentMessage(%s, %i)",
00199 instanceName_.c_str(),
00200 messageType.c_str(), message.getDestinationId()));
00201 }
00202
00203 std::map<std::string, ComsMessageHandlerSentI *>::iterator itor =
00204 sentHandlerMap_.find(messageType);
00205 if (itor == sentHandlerMap_.end()) return;
00206
00207 ComsMessageHandlerSentI *handler = (*itor).second;
00208 const char *messageTypeStr = messageType.c_str();
00209 if (!handler->processSentMessage(message.getDestinationId(),
00210 messageTypeStr, reader))
00211 {
00212 char buffer[1024];
00213 snprintf(buffer, 1024, "Failed to handle SENT message type \"%s\"",
00214 messageType.c_str());
00215
00216 if (connectionHandler_)
00217 connectionHandler_->clientError(message,
00218 buffer);
00219 return;
00220 }
00221 }