Ggep.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef GGEP_H
00024 #define GGEP_H
00025
00026
00027 namespace Gnutella {
00028 namespace Packets {
00029 namespace Extensions {
00031
00033
00043 class Ggep
00044 {
00045 public:
00046 enum HeaderFlag
00047 {
00048 LastExtension = 0x80,
00049 Encoding = 0x40,
00050 Compression = 0x20,
00051 Reserved = 0x10,
00052 IDLength = 0x0f
00053 };
00054
00055 Q_DECLARE_FLAGS(HeaderFlags, HeaderFlag)
00056
00057
00058
00064 typedef QByteArray GgepId;
00065
00066 static Ggep * fromId (const GgepId &id, int flags, int dataSize);
00067 virtual ~Ggep();
00068 virtual Ggep * copy() const = 0;
00069
00070 void prepareRead (const QByteArray &rawData);
00071 void read (QDataStream &stream);
00072 int prepareWrite() const;
00073 void write (QDataStream &stream) const;
00074
00075
00076 inline bool isFlagSet (HeaderFlag flag) const;
00077 inline void setFlag (HeaderFlag flag);
00078 inline void resetFlag (HeaderFlag flag);
00079
00080 GgepId id() const;
00081
00082 protected:
00083 Ggep (const GgepId &id, int flags = 0, int dataSize = 0);
00084 inline Ggep (const Ggep &other);
00085 Ggep & operator= (const Ggep &other);
00086
00087 inline int dataLength() const;
00088
00089 virtual bool prepareReadData (const QByteArray &rawData) = 0;
00090 virtual void readData (QDataStream &stream) = 0;
00091 virtual int prepareWriteData() const = 0;
00092 virtual void writeData (QDataStream &stream) const = 0;
00093
00094 private:
00095 void invalidateData();
00096
00097 struct Data
00098 {
00099 QBasicAtomic ref;
00100
00101 bool isValid;
00102 HeaderFlags flags;
00103 GgepId id;
00104 };
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 struct Private
00117 {
00118 mutable int dataLength;
00119 mutable QByteArray encodedData;
00120 };
00121
00122 Data *d;
00123 Private p;
00124 };
00125
00126 Q_DECLARE_OPERATORS_FOR_FLAGS(Ggep::HeaderFlags)
00127
00128
00129
00131
00132 inline Ggep::Ggep (const Ggep &other)
00133 : d (other.d), p (other.p)
00134 { d->ref.ref(); }
00135
00136 inline bool Ggep::isFlagSet (HeaderFlag flag) const
00137 { return d->flags & flag; }
00138
00139 inline void Ggep::setFlag (HeaderFlag flag)
00140 { invalidateData(); d->flags |= flag; }
00141
00142 inline void Ggep::resetFlag (HeaderFlag flag)
00143 { invalidateData(); d->flags &= ~flag; }
00144
00145 inline Ggep::GgepId Ggep::id() const
00146 { return d->id; }
00147
00148 inline int Ggep::dataLength() const
00149 { return p.dataLength; }
00150
00151
00152 }
00153 }
00154 }
00156
00157 #endif // _GGEP_H