00001 /* 00002 00003 Copyright (C) 2006-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 PROTOCOLS__BIT_TORRENT__TRACKERS__SINGLE_TRACKER_REQUEST_SESSION_H 00024 #define PROTOCOLS__BIT_TORRENT__TRACKERS__SINGLE_TRACKER_REQUEST_SESSION_H 00025 00026 #include "Imports.h" 00027 #include "HttpRequestSession.h" 00028 #include "TrackerRequest.h" 00029 #include "TrackerRequestSession.h" 00030 00031 namespace Protocols { 00032 namespace BitTorrent { 00033 namespace Trackers { 00034 00036 00043 class SingleTrackerRequestSession : public TrackerRequestSession 00044 { 00045 CALITKO_TESTABLE 00046 REFERENCE_OBJECT (SingleTrackerRequestSession) 00047 00048 public: 00049 SingleTrackerRequestSession (HttpRequestSession *, 00050 Uri, 00051 TrackerRequestSessionStatus *); 00052 ~SingleTrackerRequestSession(); 00053 00054 void open(); 00055 void sendRequest (const TrackerRequest &); 00056 void close(); 00057 void abort(); 00058 00059 // Implementation for the HttpRequestSessionStatus interface: 00060 void httpRequestSessionEstablished(); 00061 void httpRequestSessionError (const QString &); 00062 void httpRequestSessionResponseHeaderRecieved (const ResponseHeader &); 00063 void httpRequestSessionResponseBodyRecieved (const QByteArray &); 00064 void httpRequestSessionClosing(); 00065 void httpRequestSessionClosed(); 00066 00067 private: 00069 enum State 00070 { 00071 Established, 00072 RequestSent, 00073 ResponseHeaderRecieved, 00074 Closing, 00075 Closed 00076 }; 00077 00078 static bool httpRequestSucceeded (const ResponseHeader &); 00079 static QString createHttpRequestSessionErrorMessage ( 00080 const QString &); 00081 static QString createHttpErrorMessage (const ResponseHeader &); 00082 static QString createTrackerErrorMessage (const QString &); 00083 00084 static const int FirstSuccessfulHttpStatusCode; 00085 static const int FirstHttpStatusCodePastSuccessfulCodes; 00086 00087 private: 00088 HttpRequestSession *httpRequestSession_; 00089 const Uri announceUrl_; 00090 TrackerRequestSessionStatus *status_; 00091 State state_; 00092 }; 00093 00094 } // namespace Trackers 00095 } // namespace BitTorrent 00096 } // namespace Protocols 00097 00098 #endif // PROTOCOLS__BIT_TORRENT__TRACKERS__SINGLE_TRACKER_REQUEST_SESSION_H