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 }