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 QUERYHITS_H 00024 #define QUERYHITS_H 00025 00026 #include "Packet.h" 00027 #include "VendorCode.h" 00028 #include "Extensions/ExtensionBlock.h" 00029 #include "Extensions/GgepBlock.h" 00030 00031 // Open containing namespaces: 00032 namespace Gnutella { 00033 namespace Packets { 00035 00037 00126 class QueryHits : public Packet 00127 { 00128 public: 00129 typedef Extensions::ExtensionBlock ResultData; 00130 00131 struct Result 00132 { 00133 Result() : fileIndex (0), fileSize (0), fullFileName(), resultData(), 00134 fileNameSize (0) {} 00135 00136 quint32 fileIndex; 00137 quint32 fileSize; 00138 QString fullFileName; 00139 ResultData resultData; 00140 00141 quint16 fileNameSize; 00142 00143 QString fileExtension() const; 00144 QString fileName() const; 00145 quint32 sizeOfFile() const; 00146 }; 00147 00148 static QueryHits & castFrom (Packet & packet) { return dynamic_cast <QueryHits &> (packet); } 00149 static const QueryHits & castFrom (const Packet & packet) { return dynamic_cast <const QueryHits &> (packet); } 00150 00151 QueryHits (const QByteArray &rawHeader, const QByteArray &rawPayload); 00152 QueryHits (); 00153 ~QueryHits(); 00154 00155 QueryHits* copy() const { return new QueryHits (*this); } 00156 00157 QString name() const { return QString ("QueryHits"); } 00158 00159 // uchar numberOfHits() const { return p.numberOfHits; } 00160 uchar numberOfHits() const { return p.resultSet.size(); } 00161 quint16 port () const { return p.port; } 00162 QHostAddress ipAddress() const { return p.ipAddress; } 00163 quint32 speed() const { return p.speed; } 00164 const Result & result (int &index) const; 00165 // QueryHitsData queryHitsData; //!< The optional query hits data payload field. 00166 const QUuid & serventId() const { return p.serventId; } 00167 00168 00169 void setPort (quint16 port); 00170 void setIpAddress (const QHostAddress &ipAddress); 00171 void setSpeed (quint32 speed); 00172 void setServentId (const QUuid &serventId); 00173 //void setQueryHitsData (QByteArray &data); 00174 void appendResult (Result &result); 00175 00176 protected: 00177 bool prepareReadPayload (const QByteArray &rawPayload); 00178 bool prepareReadQueryHitsData (const QByteArray &rawQueryHitsData); 00179 void readPayload (QDataStream &stream); 00180 void readQueryHitsData (QDataStream &stream); 00181 int prepareWritePayload() const; 00182 int prepareWriteQueryHitsData() const; 00183 void writePayload (QDataStream &stream) const; 00184 void writeQueryHitsData (QDataStream &stream) const; 00185 00186 private: 00187 00188 struct QueryHitsData 00189 { 00190 QueryHitsData(); 00191 00192 VendorCode vendorCode; 00193 mutable uchar openAreaSize; 00194 uchar openAreaFlags1; 00195 mutable uchar openAreaFlags2; 00196 mutable quint16 xmlLength; 00197 uchar privateVendorFlag; 00198 Extensions::GgepBlock ggepBlock; 00199 QByteArray xmlData; 00200 }; 00201 00202 typedef QList<Result> ResultSet; 00203 struct Data 00204 { 00205 uchar numberOfHits; 00206 quint16 port; 00207 QHostAddress ipAddress; 00208 quint32 speed; 00209 ResultSet resultSet; 00210 QueryHitsData queryHitsData; 00211 QUuid serventId; 00212 } p; 00213 }; 00214 00215 // Close containing namespaces: 00216 } // namespace Packets 00217 } // namespace Gnutella 00219 00220 #endif // QUERYHITS_H