ComsMessageHandler.cpp

Go to the documentation of this file.
00001 ////////////////////////////////////////////////////////////////////////////////
00002 //    Scorched3D (c) 2000-2009
00003 //
00004 //    This file is part of Scorched3D.
00005 //
00006 //    Scorched3D is free software; you can redistribute it and/or modify
00007 //    it under the terms of the GNU General Public License as published by
00008 //    the Free Software Foundation; either version 2 of the License, or
00009 //    (at your option) any later version.
00010 //
00011 //    Scorched3D is distributed in the hope that it will be useful,
00012 //    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 //    GNU General Public License for more details.
00015 //
00016 //    You should have received a copy of the GNU General Public License
00017 //    along with Scorched3D; if not, write to the Free Software
00018 //    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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 }

Generated on Mon Feb 16 15:14:49 2009 for Scorched3D by  doxygen 1.5.3