SingleTrackerRequestSession.cpp

Go to the documentation of this file.
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 #include "Qt.h"
00024 #include "SingleTrackerRequestSession.h"
00025 #include "TrackerRequestUrlCreator.h"
00026 #include "TrackerResponseParser.h"
00027 #include "Imports.cpp"
00028 
00030 
00042 SingleTrackerRequestSession::SingleTrackerRequestSession (
00043                     HttpRequestSession *httpRequestSession,
00044                     Uri announceUrl,
00045                     TrackerRequestSessionStatus *trackerRequestSessionStatus)
00046     : httpRequestSession_ (httpRequestSession),
00047       announceUrl_ (announceUrl),
00048       status_ (trackerRequestSessionStatus),
00049       state_ (Closed)
00050 {
00051 }
00052 
00054 
00057 SingleTrackerRequestSession::~SingleTrackerRequestSession()
00058 {
00059 }
00060 
00062 
00068 void SingleTrackerRequestSession::open()
00069 {
00070     Q_ASSERT (state_ == Closed);
00071 
00072     httpRequestSession_->open (announceUrl_);
00073 }
00074 
00076 
00085 void SingleTrackerRequestSession::sendRequest (
00086                                         const TrackerRequest &trackerRequest)
00087 {
00088     Q_ASSERT (state_ == Established);
00089 
00090     httpRequestSession_->get (TrackerRequestUrlCreator::createRequestUrl (
00091         trackerRequest));
00092     state_ = RequestSent;
00093 }
00094 
00096 
00104 void SingleTrackerRequestSession::close()
00105 {
00106     if (state_ != Closed && state_ != Closing) {
00107         state_ = Closing;
00108         status_->trackerRequestSessionClosing (this);
00109         httpRequestSession_->close();
00110     }
00111 }
00112 
00114 
00119 void SingleTrackerRequestSession::abort()
00120 {
00121     if (state_ != Closed) {
00122         httpRequestSession_->abort();
00123         state_ = Closed;
00124         status_->trackerRequestSessionClosed (this);
00125     }
00126 }
00127 
00129 
00133 void SingleTrackerRequestSession::httpRequestSessionEstablished()
00134 {
00135     Q_ASSERT (state_ == Closed);
00136 
00137     state_ = Established;
00138     status_->trackerRequestSessionEstablished (this);
00139 }
00140 
00142 
00149 void SingleTrackerRequestSession::httpRequestSessionError (
00150                                                     const QString &errorMessage)
00151 {
00152     status_->trackerRequestSessionError (this,
00153         createHttpRequestSessionErrorMessage (errorMessage));
00154 }
00155 
00157 
00169 void SingleTrackerRequestSession::httpRequestSessionResponseHeaderRecieved (
00170                                         const ResponseHeader &responseHeader)
00171 {
00172     Q_ASSERT (state_ == RequestSent);
00173 
00174     if (!httpRequestSucceeded (responseHeader)) {
00175         status_->trackerRequestSessionError (this, createHttpErrorMessage (
00176             responseHeader));
00177         state_ = Established;
00178         return;
00179     }
00180 
00181     state_ = ResponseHeaderRecieved;
00182 }
00183 
00185 
00198 void SingleTrackerRequestSession::httpRequestSessionResponseBodyRecieved (
00199                                             const QByteArray &rawResponseBody)
00200 {
00201     Q_ASSERT (state_ == ResponseHeaderRecieved);
00202 
00203     TrackerResponse trackerResponse;
00204     bool parsedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00205         rawResponseBody, trackerResponse);
00206     if (!parsedOk) {
00207         status_->trackerRequestSessionError (this, createTrackerErrorMessage (
00208             "Tracker response could not be parsed"));
00209         return;
00210     } else if (!trackerResponse.failureReason().isEmpty()) {
00211         status_->trackerRequestSessionError (this, createTrackerErrorMessage (
00212             trackerResponse.failureReason()));
00213         return;
00214     }
00215 
00216     state_ = Established;
00217     status_->trackerRequestSessionResponseRecieved (this, trackerResponse);
00218 }
00219 
00221 
00225 void SingleTrackerRequestSession::httpRequestSessionClosing()
00226 {
00227     Q_ASSERT (state_ != Closing && state_ != Closed);
00228 
00229     state_ = Closing;
00230 }
00231 
00233 
00238 void SingleTrackerRequestSession::httpRequestSessionClosed()
00239 {
00240     state_ = Closed;
00241     status_->trackerRequestSessionClosed (this);
00242 }
00243 
00245 
00248 bool SingleTrackerRequestSession::httpRequestSucceeded (
00249                                         const ResponseHeader &responseHeader)
00250 {
00251     return responseHeader.statusCode() >= FirstSuccessfulHttpStatusCode &&
00252         responseHeader.statusCode() < FirstHttpStatusCodePastSuccessfulCodes;
00253 }
00254 
00256 
00260 QString SingleTrackerRequestSession::createHttpRequestSessionErrorMessage (
00261     const QString &errorMessage)
00262 {
00263     return QString ("HTTP request session error: ") + errorMessage;
00264 }
00265 
00267 
00271 QString SingleTrackerRequestSession::createHttpErrorMessage (
00272                                         const ResponseHeader &responseHeader)
00273 {
00274     return QString ("HTTP error: ") + QString (QByteArray::number (
00275         responseHeader.statusCode()) + " " + responseHeader.reasonPhrase());
00276 }
00277 
00279 
00283 QString SingleTrackerRequestSession::createTrackerErrorMessage (
00284                                 const QString &failureReason)
00285 {
00286     return QString ("Tracker error: ") + failureReason;
00287 }
00288 
00289 // Static constants definitions
00290 const int SingleTrackerRequestSession::FirstSuccessfulHttpStatusCode          = 200;
00291 const int SingleTrackerRequestSession::FirstHttpStatusCodePastSuccessfulCodes = 300;