Pong.h

Go to the documentation of this file.
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