00001 /* 00002 00003 Copyright (C) 2005-2007 by Peter Dimov. 00004 00005 This file is part of Calitko (http://www.calitko.org). 00006 00007 Calitko is free software; you can redistribute it and/or modify 00008 it under the terms of the GNU General Public License as published by 00009 the Free Software Foundation; either version 2 of the License, or 00010 (at your option) any later version. 00011 00012 Calitko is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 GNU General Public License for more details. 00016 00017 You should have received a copy of the GNU General Public License 00018 along with Calitko; if not, write to the Free Software 00019 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 00020 00021 */ 00022 00023 #ifndef PONG_H 00024 #define PONG_H 00025 00026 #include "Packet.h" 00027 #include "Extensions/GgepBlock.h" 00028 00029 // Open containing namespaces: 00030 namespace Gnutella { 00031 namespace Packets { 00033 00035 00052 class Pong : public Packet 00053 { 00054 public: 00055 static inline Pong & castFrom (Packet & packet); 00056 static inline const Pong & castFrom (const Packet & packet); 00057 00058 Pong (const QByteArray &rawHeader, const QByteArray &rawPayload); 00059 Pong (quint16 port = 0, const QHostAddress &ipAddress = QHostAddress::Null, quint32 sharedFiles = 0, quint32 sharedKilobytes = 0); 00060 inline Pong (const Pong &other); 00061 Pong & operator= (const Pong &other); 00062 ~Pong(); 00063 00064 inline Pong* copy() const; 00065 00066 QString name() const { return QString ("Pong"); } 00067 00068 inline quint16 port() const; 00069 inline QHostAddress ipAddress() const; 00070 inline quint32 sharedFiles() const; 00071 inline quint32 sharedKilobytes() const; 00072 inline const Extensions::GgepBlock & ggepBlock() const; 00073 00074 inline void setPort (quint16 port); 00075 inline void setIpAddress (const QHostAddress &address); 00076 inline void setSharedFiles (quint32 files); 00077 inline void setSharedKilobytes (quint32 kilobytes); 00078 inline void setGgepBlock (const Extensions::GgepBlock &block); 00079 00080 protected: 00081 00082 void invalidatePayload(); 00083 00084 bool prepareReadPayload (const QByteArray &rawPayload); 00085 void readPayload (QDataStream &stream); 00086 int prepareWritePayload() const; 00087 void writePayload (QDataStream &stream) const; 00088 00089 private: 00090 00092 struct Data 00093 { 00094 QBasicAtomic ref; 00095 00096 quint16 port; 00097 QHostAddress ipAddress; 00098 quint32 sharedFiles; 00099 quint32 sharedKilobytes; 00100 Extensions::GgepBlock ggepBlock; 00101 }; 00102 00103 Data *d; 00104 }; 00105 00107 // inline functions 00109 00110 inline Pong & Pong::castFrom (Packet & packet) 00111 { return dynamic_cast <Pong &> (packet); } 00112 00113 inline const Pong & Pong::castFrom (const Packet & packet) 00114 { return dynamic_cast <const Pong &> (packet); } 00115 00116 inline Pong::Pong (const Pong &other) 00117 : Packet (other), d (other.d) 00118 { d->ref.ref(); } 00119 00120 inline Pong* Pong::copy() const 00121 { return new Pong (*this); } 00122 00123 inline quint16 Pong::port() const 00124 { return d->port; } 00125 00126 inline QHostAddress Pong::ipAddress() const 00127 { return d->ipAddress; } 00128 00129 inline quint32 Pong::sharedFiles() const 00130 { return d->sharedFiles; } 00131 00132 inline quint32 Pong::sharedKilobytes() const 00133 { return d->sharedKilobytes; } 00134 00136 inline const Extensions::GgepBlock & Pong::ggepBlock() const 00137 { return d->ggepBlock; } 00138 00139 inline void Pong::setPort (quint16 port) 00140 { invalidatePayload(); d->port = port; } 00141 00142 inline void Pong::setIpAddress (const QHostAddress &address) 00143 { invalidatePayload(); d->ipAddress = address; } 00144 00145 inline void Pong::setSharedFiles (quint32 files) 00146 { invalidatePayload(); d->sharedFiles = files; } 00147 00148 inline void Pong::setSharedKilobytes (quint32 kilobytes) 00149 { invalidatePayload(); d->sharedKilobytes = kilobytes; } 00150 00151 inline void Pong::setGgepBlock (const Extensions::GgepBlock &block) 00152 { invalidatePayload(); d->ggepBlock = block; } 00153 00154 // Close containing namespaces: 00155 } // namespace Packets 00156 } // namespace Gnutella 00158 00159 #endif // PONG_H