SingleTrackerRequestSession.cpp
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 #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
00290 const int SingleTrackerRequestSession::FirstSuccessfulHttpStatusCode = 200;
00291 const int SingleTrackerRequestSession::FirstHttpStatusCodePastSuccessfulCodes = 300;