File indexing completed on 2024-05-05 05:40:33

0001 /*************************************************************************
0002  *     Copyright (C) 2011 by Joseph Boudou                               *
0003  *     Copyright (C) 2014 by Renaud Guezennec                            *
0004  *     https://rolisteam.org/                                         *
0005  *                                                                       *
0006  *   rolisteam is free software; you can redistribute it and/or modify   *
0007  *   it under the terms of the GNU General Public License as published   *
0008  *   by the Free Software Foundation; either version 2 of the License,   *
0009  *   or (at your option) any later version.                              *
0010  *                                                                       *
0011  *   This program is distributed in the hope that it will be useful,     *
0012  *   but WITHOUT ANY WARRANTY; without even the implied warranty of      *
0013  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
0014  *   GNU General Public License for more details.                        *
0015  *                                                                       *
0016  *   You should have received a copy of the GNU General Public License   *
0017  *   along with this program; if not, write to the                       *
0018  *   Free Software Foundation, Inc.,                                     *
0019  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.           *
0020  *************************************************************************/
0021 
0022 #include <QCoreApplication>
0023 #include <QTimer>
0024 
0025 #include "network/receiveevent.h"
0026 
0027 #include "network/networkmessagereader.h"
0028 
0029 /****************
0030  * ReceiveEvent *
0031  ****************/
0032 
0033 const int ReceiveEvent::Type= QEvent::registerEventType();
0034 QMap<quint16, QObject*> ReceiveEvent::s_receiverMap;
0035 QMultiMap<NetMsg::Category, NetWorkReceiver*> ReceiveEvent::ms_netWorkReceiverMap;
0036 
0037 quint16 makeKey(quint8 categorie, quint8 action)
0038 {
0039     return static_cast<quint16>(categorie + action * 256);
0040 }
0041 
0042 ReceiveEvent::ReceiveEvent(const NetworkMessageHeader& header, const char* buffer, NetworkLink* link)
0043     : QEvent(static_cast<QEvent::Type>(ReceiveEvent::Type)), m_data(header, buffer), m_link(link), m_repost(0)
0044 {
0045 }
0046 
0047 ReceiveEvent::ReceiveEvent(const ReceiveEvent& other)
0048     : QEvent(static_cast<QEvent::Type>(ReceiveEvent::Type))
0049     , m_data(other.m_data)
0050     , m_link(other.m_link)
0051     , m_repost(static_cast<quint8>(other.m_repost + 1))
0052 {
0053 }
0054 
0055 ReceiveEvent::~ReceiveEvent() {}
0056 
0057 void ReceiveEvent::postToReceiver()
0058 {
0059     quint16 key= makeKey(m_data.category(), m_data.action());
0060     if(s_receiverMap.contains(key))
0061         QCoreApplication::postEvent(s_receiverMap.value(key), this, Qt::LowEventPriority);
0062 }
0063 
0064 void ReceiveEvent::repostLater() const
0065 {
0066     if(m_repost < 25)
0067         new DelayReceiveEvent(*this);
0068 }
0069 
0070 NetworkLink* ReceiveEvent::link() const
0071 {
0072     return m_link;
0073 }
0074 
0075 NetworkMessageReader& ReceiveEvent::data()
0076 {
0077     return m_data;
0078 }
0079 
0080 bool ReceiveEvent::hasReceiverFor(quint8 categorie, quint8 action)
0081 {
0082     return s_receiverMap.contains(makeKey(categorie, action));
0083 }
0084 
0085 void ReceiveEvent::registerReceiver(NetMsg::Category categorie, NetMsg::Action action, QObject* receiver)
0086 {
0087     quint16 key= makeKey(categorie, action);
0088     if(s_receiverMap.contains(key))
0089     {
0090         qFatal("A receiver is already registered for (%d,%d)", categorie, action);
0091     }
0092 
0093     s_receiverMap.insert(key, receiver);
0094 }
0095 void ReceiveEvent::registerNetworkReceiver(NetMsg::Category categorie, NetWorkReceiver* receiver)
0096 {
0097     ms_netWorkReceiverMap.insert(categorie, receiver);
0098 }
0099 
0100 void ReceiveEvent::removeNetworkReceiver(NetMsg::Category categorie, NetWorkReceiver* receiver)
0101 {
0102     auto it= ms_netWorkReceiverMap.find(categorie);
0103     while(it != ms_netWorkReceiverMap.end())
0104     {
0105         if(it.value() == receiver)
0106         {
0107             it= ms_netWorkReceiverMap.erase(it);
0108         }
0109         else
0110         {
0111             ++it;
0112         }
0113     }
0114 }
0115 bool ReceiveEvent::hasNetworkReceiverFor(NetMsg::Category categorie)
0116 {
0117     return ms_netWorkReceiverMap.contains(categorie);
0118 }
0119 
0120 QList<NetWorkReceiver*> ReceiveEvent::getNetWorkReceiverFor(NetMsg::Category categorie)
0121 {
0122     return ms_netWorkReceiverMap.values(categorie);
0123 }
0124 
0125 /*********************
0126  * DelayReceiveEvent *
0127  *********************/
0128 
0129 DelayReceiveEvent::DelayReceiveEvent(const ReceiveEvent& event)
0130 {
0131     m_event= new ReceiveEvent(event);
0132     QTimer::singleShot(200, this, SLOT(postEvent()));
0133 }
0134 
0135 DelayReceiveEvent::~DelayReceiveEvent() {}
0136 
0137 void DelayReceiveEvent::postEvent()
0138 {
0139     m_event->postToReceiver();
0140     deleteLater();
0141 }