| Line | Source Code | Coverage |
|---|
| 1 | /**************************************************************************** | - |
| 2 | ** | - |
| 3 | ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). | - |
| 4 | ** Contact: http://www.qt-project.org/legal | - |
| 5 | ** | - |
| 6 | ** This file is part of the QtNetwork module of the Qt Toolkit. | - |
| 7 | ** | - |
| 8 | ** $QT_BEGIN_LICENSE:LGPL$ | - |
| 9 | ** Commercial License Usage | - |
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in | - |
| 11 | ** accordance with the commercial license agreement provided with the | - |
| 12 | ** Software or, alternatively, in accordance with the terms contained in | - |
| 13 | ** a written agreement between you and Digia. For licensing terms and | - |
| 14 | ** conditions see http://qt.digia.com/licensing. For further information | - |
| 15 | ** use the contact form at http://qt.digia.com/contact-us. | - |
| 16 | ** | - |
| 17 | ** GNU Lesser General Public License Usage | - |
| 18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - |
| 19 | ** General Public License version 2.1 as published by the Free Software | - |
| 20 | ** Foundation and appearing in the file LICENSE.LGPL included in the | - |
| 21 | ** packaging of this file. Please review the following information to | - |
| 22 | ** ensure the GNU Lesser General Public License version 2.1 requirements | - |
| 23 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | - |
| 24 | ** | - |
| 25 | ** In addition, as a special exception, Digia gives you certain additional | - |
| 26 | ** rights. These rights are described in the Digia Qt LGPL Exception | - |
| 27 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | - |
| 28 | ** | - |
| 29 | ** GNU General Public License Usage | - |
| 30 | ** Alternatively, this file may be used under the terms of the GNU | - |
| 31 | ** General Public License version 3.0 as published by the Free Software | - |
| 32 | ** Foundation and appearing in the file LICENSE.GPL included in the | - |
| 33 | ** packaging of this file. Please review the following information to | - |
| 34 | ** ensure the GNU General Public License version 3.0 requirements will be | - |
| 35 | ** met: http://www.gnu.org/copyleft/gpl.html. | - |
| 36 | ** | - |
| 37 | ** | - |
| 38 | ** $QT_END_LICENSE$ | - |
| 39 | ** | - |
| 40 | ****************************************************************************/ | - |
| 41 | | - |
| 42 | #include "qnetworkaccessftpbackend_p.h" | - |
| 43 | #include "qnetworkaccessmanager_p.h" | - |
| 44 | #include "QtNetwork/qauthenticator.h" | - |
| 45 | #include "private/qnoncontiguousbytedevice_p.h" | - |
| 46 | | - |
| 47 | #ifndef QT_NO_FTP | - |
| 48 | | - |
| 49 | QT_BEGIN_NAMESPACE | - |
| 50 | | - |
| 51 | enum { | - |
| 52 | DefaultFtpPort = 21 | - |
| 53 | }; | - |
| 54 | | - |
| 55 | static QByteArray makeCacheKey(const QUrl &url) | - |
| 56 | { | - |
| 57 | QUrl copy = url; executed (the execution status of this line is deduced): QUrl copy = url; | - |
| 58 | copy.setPort(url.port(DefaultFtpPort)); executed (the execution status of this line is deduced): copy.setPort(url.port(DefaultFtpPort)); | - |
| 59 | return "ftp-connection:" + executed: return "ftp-connection:" + copy.toEncoded(QUrl::RemovePassword | QUrl::RemovePath | QUrl::RemoveQuery | QUrl::RemoveFragment);Execution Count:76 | 76 |
| 60 | copy.toEncoded(QUrl::RemovePassword | QUrl::RemovePath | QUrl::RemoveQuery | executed: return "ftp-connection:" + copy.toEncoded(QUrl::RemovePassword | QUrl::RemovePath | QUrl::RemoveQuery | QUrl::RemoveFragment);Execution Count:76 | 76 |
| 61 | QUrl::RemoveFragment); executed: return "ftp-connection:" + copy.toEncoded(QUrl::RemovePassword | QUrl::RemovePath | QUrl::RemoveQuery | QUrl::RemoveFragment);Execution Count:76 | 76 |
| 62 | } | - |
| 63 | | - |
| 64 | QNetworkAccessBackend * | - |
| 65 | QNetworkAccessFtpBackendFactory::create(QNetworkAccessManager::Operation op, | - |
| 66 | const QNetworkRequest &request) const | - |
| 67 | { | - |
| 68 | // is it an operation we know of? | - |
| 69 | switch (op) { | - |
| 70 | case QNetworkAccessManager::GetOperation: | - |
| 71 | case QNetworkAccessManager::PutOperation: | - |
| 72 | break; executed: break;Execution Count:89 | 89 |
| 73 | | - |
| 74 | default: | - |
| 75 | // no, we can't handle this operation | - |
| 76 | return 0; never executed: return 0; | 0 |
| 77 | } | - |
| 78 | | - |
| 79 | QUrl url = request.url(); executed (the execution status of this line is deduced): QUrl url = request.url(); | - |
| 80 | if (url.scheme().compare(QLatin1String("ftp"), Qt::CaseInsensitive) == 0) evaluated: url.scheme().compare(QLatin1String("ftp"), Qt::CaseInsensitive) == 0| yes Evaluation Count:42 | yes Evaluation Count:47 |
| 42-47 |
| 81 | return new QNetworkAccessFtpBackend; executed: return new QNetworkAccessFtpBackend;Execution Count:42 | 42 |
| 82 | return 0; executed: return 0;Execution Count:47 | 47 |
| 83 | } | - |
| 84 | | - |
| 85 | class QNetworkAccessCachedFtpConnection: public QFtp, public QNetworkAccessCache::CacheableObject | - |
| 86 | { | - |
| 87 | // Q_OBJECT | - |
| 88 | public: | - |
| 89 | QNetworkAccessCachedFtpConnection() | - |
| 90 | { | - |
| 91 | setExpires(true); executed (the execution status of this line is deduced): setExpires(true); | - |
| 92 | setShareable(false); executed (the execution status of this line is deduced): setShareable(false); | - |
| 93 | } executed: }Execution Count:37 | 37 |
| 94 | | - |
| 95 | void dispose() | - |
| 96 | { | - |
| 97 | connect(this, SIGNAL(done(bool)), this, SLOT(deleteLater())); executed (the execution status of this line is deduced): connect(this, "2""done(bool)", this, "1""deleteLater()"); | - |
| 98 | close(); executed (the execution status of this line is deduced): close(); | - |
| 99 | } executed: }Execution Count:37 | 37 |
| 100 | }; | - |
| 101 | | - |
| 102 | QNetworkAccessFtpBackend::QNetworkAccessFtpBackend() | - |
| 103 | : ftp(0), uploadDevice(0), totalBytes(0), helpId(-1), sizeId(-1), mdtmId(-1), | - |
| 104 | supportsSize(false), supportsMdtm(false), state(Idle) | - |
| 105 | { | - |
| 106 | } executed: }Execution Count:42 | 42 |
| 107 | | - |
| 108 | QNetworkAccessFtpBackend::~QNetworkAccessFtpBackend() | - |
| 109 | { | - |
| 110 | //if backend destroyed while in use, then abort (this is the code path from QNetworkReply::abort) | - |
| 111 | if (ftp && state != Disconnecting) evaluated: ftp| yes Evaluation Count:1 | yes Evaluation Count:41 |
partially evaluated: state != Disconnecting| no Evaluation Count:0 | yes Evaluation Count:1 |
| 0-41 |
| 112 | ftp->abort(); never executed: ftp->abort(); | 0 |
| 113 | disconnectFromFtp(); executed (the execution status of this line is deduced): disconnectFromFtp(); | - |
| 114 | } executed: }Execution Count:42 | 42 |
| 115 | | - |
| 116 | void QNetworkAccessFtpBackend::open() | - |
| 117 | { | - |
| 118 | #ifndef QT_NO_NETWORKPROXY | - |
| 119 | QNetworkProxy proxy; executed (the execution status of this line is deduced): QNetworkProxy proxy; | - |
| 120 | foreach (const QNetworkProxy &p, proxyList()) { executed (the execution status of this line is deduced): for (QForeachContainer<__typeof__(proxyList())> _container_(proxyList()); !_container_.brk && _container_.i != _container_.e; __extension__ ({ ++_container_.brk; ++_container_.i; })) for (const QNetworkProxy &p = *_container_.i;; __extension__ ({--_container_.brk; break;})) { | - |
| 121 | // use the first FTP proxy | - |
| 122 | // or no proxy at all | - |
| 123 | if (p.type() == QNetworkProxy::FtpCachingProxy evaluated: p.type() == QNetworkProxy::FtpCachingProxy| yes Evaluation Count:2 | yes Evaluation Count:42 |
| 2-42 |
| 124 | || p.type() == QNetworkProxy::NoProxy) { evaluated: p.type() == QNetworkProxy::NoProxy| yes Evaluation Count:37 | yes Evaluation Count:5 |
| 5-37 |
| 125 | proxy = p; executed (the execution status of this line is deduced): proxy = p; | - |
| 126 | break; executed: break;Execution Count:39 | 39 |
| 127 | } | - |
| 128 | } executed: }Execution Count:5 | 5 |
| 129 | | - |
| 130 | // did we find an FTP proxy or a NoProxy? | - |
| 131 | if (proxy.type() == QNetworkProxy::DefaultProxy) { evaluated: proxy.type() == QNetworkProxy::DefaultProxy| yes Evaluation Count:3 | yes Evaluation Count:39 |
| 3-39 |
| 132 | // unsuitable proxies | - |
| 133 | error(QNetworkReply::ProxyNotFoundError, executed (the execution status of this line is deduced): error(QNetworkReply::ProxyNotFoundError, | - |
| 134 | tr("No suitable proxy found")); executed (the execution status of this line is deduced): tr("No suitable proxy found")); | - |
| 135 | finished(); executed (the execution status of this line is deduced): finished(); | - |
| 136 | return; executed: return;Execution Count:3 | 3 |
| 137 | } | - |
| 138 | | - |
| 139 | #endif | - |
| 140 | | - |
| 141 | QUrl url = this->url(); executed (the execution status of this line is deduced): QUrl url = this->url(); | - |
| 142 | if (url.path().isEmpty()) { evaluated: url.path().isEmpty()| yes Evaluation Count:1 | yes Evaluation Count:38 |
| 1-38 |
| 143 | url.setPath(QLatin1String("/")); executed (the execution status of this line is deduced): url.setPath(QLatin1String("/")); | - |
| 144 | setUrl(url); executed (the execution status of this line is deduced): setUrl(url); | - |
| 145 | } executed: }Execution Count:1 | 1 |
| 146 | if (url.path().endsWith(QLatin1Char('/'))) { evaluated: url.path().endsWith(QLatin1Char('/'))| yes Evaluation Count:1 | yes Evaluation Count:38 |
| 1-38 |
| 147 | error(QNetworkReply::ContentOperationNotPermittedError, executed (the execution status of this line is deduced): error(QNetworkReply::ContentOperationNotPermittedError, | - |
| 148 | tr("Cannot open %1: is a directory").arg(url.toString())); executed (the execution status of this line is deduced): tr("Cannot open %1: is a directory").arg(url.toString())); | - |
| 149 | finished(); executed (the execution status of this line is deduced): finished(); | - |
| 150 | return; executed: return;Execution Count:1 | 1 |
| 151 | } | - |
| 152 | state = LoggingIn; executed (the execution status of this line is deduced): state = LoggingIn; | - |
| 153 | | - |
| 154 | QNetworkAccessCache* objectCache = QNetworkAccessManagerPrivate::getObjectCache(this); executed (the execution status of this line is deduced): QNetworkAccessCache* objectCache = QNetworkAccessManagerPrivate::getObjectCache(this); | - |
| 155 | QByteArray cacheKey = makeCacheKey(url); executed (the execution status of this line is deduced): QByteArray cacheKey = makeCacheKey(url); | - |
| 156 | if (!objectCache->requestEntry(cacheKey, this, evaluated: !objectCache->requestEntry(cacheKey, this, "1""ftpConnectionReady(QNetworkAccessCache::CacheableObject*)")| yes Evaluation Count:37 | yes Evaluation Count:1 |
| 1-37 |
| 157 | SLOT(ftpConnectionReady(QNetworkAccessCache::CacheableObject*)))) { evaluated: !objectCache->requestEntry(cacheKey, this, "1""ftpConnectionReady(QNetworkAccessCache::CacheableObject*)")| yes Evaluation Count:37 | yes Evaluation Count:1 |
| 1-37 |
| 158 | ftp = new QNetworkAccessCachedFtpConnection; executed (the execution status of this line is deduced): ftp = new QNetworkAccessCachedFtpConnection; | - |
| 159 | #ifndef QT_NO_BEARERMANAGEMENT | - |
| 160 | //copy network session down to the QFtp | - |
| 161 | ftp->setProperty("_q_networksession", property("_q_networksession")); executed (the execution status of this line is deduced): ftp->setProperty("_q_networksession", property("_q_networksession")); | - |
| 162 | #endif | - |
| 163 | #ifndef QT_NO_NETWORKPROXY | - |
| 164 | if (proxy.type() == QNetworkProxy::FtpCachingProxy) evaluated: proxy.type() == QNetworkProxy::FtpCachingProxy| yes Evaluation Count:2 | yes Evaluation Count:35 |
| 2-35 |
| 165 | ftp->setProxy(proxy.hostName(), proxy.port()); executed: ftp->setProxy(proxy.hostName(), proxy.port());Execution Count:2 | 2 |
| 166 | #endif | - |
| 167 | ftp->connectToHost(url.host(), url.port(DefaultFtpPort)); executed (the execution status of this line is deduced): ftp->connectToHost(url.host(), url.port(DefaultFtpPort)); | - |
| 168 | ftp->login(url.userName(), url.password()); executed (the execution status of this line is deduced): ftp->login(url.userName(), url.password()); | - |
| 169 | | - |
| 170 | objectCache->addEntry(cacheKey, ftp); executed (the execution status of this line is deduced): objectCache->addEntry(cacheKey, ftp); | - |
| 171 | ftpConnectionReady(ftp); executed (the execution status of this line is deduced): ftpConnectionReady(ftp); | - |
| 172 | } executed: }Execution Count:37 | 37 |
| 173 | | - |
| 174 | // Put operation | - |
| 175 | if (operation() == QNetworkAccessManager::PutOperation) { evaluated: operation() == QNetworkAccessManager::PutOperation| yes Evaluation Count:11 | yes Evaluation Count:27 |
| 11-27 |
| 176 | uploadDevice = QNonContiguousByteDeviceFactory::wrap(createUploadByteDevice()); executed (the execution status of this line is deduced): uploadDevice = QNonContiguousByteDeviceFactory::wrap(createUploadByteDevice()); | - |
| 177 | uploadDevice->setParent(this); executed (the execution status of this line is deduced): uploadDevice->setParent(this); | - |
| 178 | } executed: }Execution Count:11 | 11 |
| 179 | } executed: }Execution Count:38 | 38 |
| 180 | | - |
| 181 | void QNetworkAccessFtpBackend::closeDownstreamChannel() | - |
| 182 | { | - |
| 183 | state = Disconnecting; executed (the execution status of this line is deduced): state = Disconnecting; | - |
| 184 | if (operation() == QNetworkAccessManager::GetOperation) partially evaluated: operation() == QNetworkAccessManager::GetOperation| yes Evaluation Count:1 | no Evaluation Count:0 |
| 0-1 |
| 185 | ftp->abort(); executed: ftp->abort();Execution Count:1 | 1 |
| 186 | } executed: }Execution Count:1 | 1 |
| 187 | | - |
| 188 | void QNetworkAccessFtpBackend::downstreamReadyWrite() | - |
| 189 | { | - |
| 190 | if (state == Transferring && ftp && ftp->bytesAvailable()) evaluated: state == Transferring| yes Evaluation Count:787 | yes Evaluation Count:27 |
partially evaluated: ftp| yes Evaluation Count:787 | no Evaluation Count:0 |
partially evaluated: ftp->bytesAvailable()| no Evaluation Count:0 | yes Evaluation Count:787 |
| 0-787 |
| 191 | ftpReadyRead(); never executed: ftpReadyRead(); | 0 |
| 192 | } executed: }Execution Count:814 | 814 |
| 193 | | - |
| 194 | void QNetworkAccessFtpBackend::ftpConnectionReady(QNetworkAccessCache::CacheableObject *o) | - |
| 195 | { | - |
| 196 | ftp = static_cast<QNetworkAccessCachedFtpConnection *>(o); executed (the execution status of this line is deduced): ftp = static_cast<QNetworkAccessCachedFtpConnection *>(o); | - |
| 197 | connect(ftp, SIGNAL(done(bool)), SLOT(ftpDone())); executed (the execution status of this line is deduced): connect(ftp, "2""done(bool)", "1""ftpDone()"); | - |
| 198 | connect(ftp, SIGNAL(rawCommandReply(int,QString)), SLOT(ftpRawCommandReply(int,QString))); executed (the execution status of this line is deduced): connect(ftp, "2""rawCommandReply(int,QString)", "1""ftpRawCommandReply(int,QString)"); | - |
| 199 | connect(ftp, SIGNAL(readyRead()), SLOT(ftpReadyRead())); executed (the execution status of this line is deduced): connect(ftp, "2""readyRead()", "1""ftpReadyRead()"); | - |
| 200 | | - |
| 201 | // is the login process done already? | - |
| 202 | if (ftp->state() == QFtp::LoggedIn) evaluated: ftp->state() == QFtp::LoggedIn| yes Evaluation Count:1 | yes Evaluation Count:37 |
| 1-37 |
| 203 | ftpDone(); executed: ftpDone();Execution Count:1 | 1 |
| 204 | | - |
| 205 | // no, defer the actual operation until after we've logged in | - |
| 206 | } executed: }Execution Count:38 | 38 |
| 207 | | - |
| 208 | void QNetworkAccessFtpBackend::disconnectFromFtp() | - |
| 209 | { | - |
| 210 | state = Disconnecting; executed (the execution status of this line is deduced): state = Disconnecting; | - |
| 211 | | - |
| 212 | if (ftp) { evaluated: ftp| yes Evaluation Count:36 | yes Evaluation Count:41 |
| 36-41 |
| 213 | disconnect(ftp, 0, this, 0); executed (the execution status of this line is deduced): disconnect(ftp, 0, this, 0); | - |
| 214 | | - |
| 215 | QByteArray key = makeCacheKey(url()); executed (the execution status of this line is deduced): QByteArray key = makeCacheKey(url()); | - |
| 216 | QNetworkAccessManagerPrivate::getObjectCache(this)->releaseEntry(key); executed (the execution status of this line is deduced): QNetworkAccessManagerPrivate::getObjectCache(this)->releaseEntry(key); | - |
| 217 | | - |
| 218 | ftp = 0; executed (the execution status of this line is deduced): ftp = 0; | - |
| 219 | } executed: }Execution Count:36 | 36 |
| 220 | } executed: }Execution Count:77 | 77 |
| 221 | | - |
| 222 | void QNetworkAccessFtpBackend::ftpDone() | - |
| 223 | { | - |
| 224 | // the last command we sent is done | - |
| 225 | if (state == LoggingIn && ftp->state() != QFtp::LoggedIn) { evaluated: state == LoggingIn| yes Evaluation Count:38 | yes Evaluation Count:104 |
evaluated: ftp->state() != QFtp::LoggedIn| yes Evaluation Count:2 | yes Evaluation Count:36 |
| 2-104 |
| 226 | if (ftp->state() == QFtp::Connected) { evaluated: ftp->state() == QFtp::Connected| yes Evaluation Count:1 | yes Evaluation Count:1 |
| 1 |
| 227 | // the login did not succeed | - |
| 228 | QUrl newUrl = url(); executed (the execution status of this line is deduced): QUrl newUrl = url(); | - |
| 229 | QString userInfo = newUrl.userInfo(); executed (the execution status of this line is deduced): QString userInfo = newUrl.userInfo(); | - |
| 230 | newUrl.setUserInfo(QString()); executed (the execution status of this line is deduced): newUrl.setUserInfo(QString()); | - |
| 231 | setUrl(newUrl); executed (the execution status of this line is deduced): setUrl(newUrl); | - |
| 232 | | - |
| 233 | QAuthenticator auth; executed (the execution status of this line is deduced): QAuthenticator auth; | - |
| 234 | authenticationRequired(&auth); executed (the execution status of this line is deduced): authenticationRequired(&auth); | - |
| 235 | | - |
| 236 | if (!auth.isNull()) { partially evaluated: !auth.isNull()| no Evaluation Count:0 | yes Evaluation Count:1 |
| 0-1 |
| 237 | // try again: | - |
| 238 | newUrl.setUserName(auth.user()); never executed (the execution status of this line is deduced): newUrl.setUserName(auth.user()); | - |
| 239 | ftp->login(auth.user(), auth.password()); never executed (the execution status of this line is deduced): ftp->login(auth.user(), auth.password()); | - |
| 240 | return; | 0 |
| 241 | } | - |
| 242 | | - |
| 243 | // Re insert the user info so that we can remove the cache entry. | - |
| 244 | newUrl.setUserInfo(userInfo); executed (the execution status of this line is deduced): newUrl.setUserInfo(userInfo); | - |
| 245 | setUrl(newUrl); executed (the execution status of this line is deduced): setUrl(newUrl); | - |
| 246 | | - |
| 247 | error(QNetworkReply::AuthenticationRequiredError, executed (the execution status of this line is deduced): error(QNetworkReply::AuthenticationRequiredError, | - |
| 248 | tr("Logging in to %1 failed: authentication required") executed (the execution status of this line is deduced): tr("Logging in to %1 failed: authentication required") | - |
| 249 | .arg(url().host())); executed (the execution status of this line is deduced): .arg(url().host())); | - |
| 250 | } else { executed: }Execution Count:1 | 1 |
| 251 | // we did not connect | - |
| 252 | QNetworkReply::NetworkError code; executed (the execution status of this line is deduced): QNetworkReply::NetworkError code; | - |
| 253 | switch (ftp->error()) { | - |
| 254 | case QFtp::HostNotFound: | - |
| 255 | code = QNetworkReply::HostNotFoundError; executed (the execution status of this line is deduced): code = QNetworkReply::HostNotFoundError; | - |
| 256 | break; executed: break;Execution Count:1 | 1 |
| 257 | | - |
| 258 | case QFtp::ConnectionRefused: | - |
| 259 | code = QNetworkReply::ConnectionRefusedError; never executed (the execution status of this line is deduced): code = QNetworkReply::ConnectionRefusedError; | - |
| 260 | break; | 0 |
| 261 | | - |
| 262 | default: | - |
| 263 | code = QNetworkReply::ProtocolFailure; never executed (the execution status of this line is deduced): code = QNetworkReply::ProtocolFailure; | - |
| 264 | break; | 0 |
| 265 | } | - |
| 266 | | - |
| 267 | error(code, ftp->errorString()); executed (the execution status of this line is deduced): error(code, ftp->errorString()); | - |
| 268 | } executed: }Execution Count:1 | 1 |
| 269 | | - |
| 270 | // we're not connected, so remove the cache entry: | - |
| 271 | QByteArray key = makeCacheKey(url()); executed (the execution status of this line is deduced): QByteArray key = makeCacheKey(url()); | - |
| 272 | QNetworkAccessManagerPrivate::getObjectCache(this)->removeEntry(key); executed (the execution status of this line is deduced): QNetworkAccessManagerPrivate::getObjectCache(this)->removeEntry(key); | - |
| 273 | | - |
| 274 | disconnect(ftp, 0, this, 0); executed (the execution status of this line is deduced): disconnect(ftp, 0, this, 0); | - |
| 275 | ftp->dispose(); executed (the execution status of this line is deduced): ftp->dispose(); | - |
| 276 | ftp = 0; executed (the execution status of this line is deduced): ftp = 0; | - |
| 277 | | - |
| 278 | state = Disconnecting; executed (the execution status of this line is deduced): state = Disconnecting; | - |
| 279 | finished(); executed (the execution status of this line is deduced): finished(); | - |
| 280 | return; executed: return;Execution Count:2 | 2 |
| 281 | } | - |
| 282 | | - |
| 283 | // check for errors: | - |
| 284 | if (ftp->error() != QFtp::NoError) { evaluated: ftp->error() != QFtp::NoError| yes Evaluation Count:4 | yes Evaluation Count:136 |
| 4-136 |
| 285 | QString msg; executed (the execution status of this line is deduced): QString msg; | - |
| 286 | if (operation() == QNetworkAccessManager::GetOperation) partially evaluated: operation() == QNetworkAccessManager::GetOperation| yes Evaluation Count:4 | no Evaluation Count:0 |
| 0-4 |
| 287 | msg = tr("Error while downloading %1: %2"); executed: msg = tr("Error while downloading %1: %2");Execution Count:4 | 4 |
| 288 | else | - |
| 289 | msg = tr("Error while uploading %1: %2"); never executed: msg = tr("Error while uploading %1: %2"); | 0 |
| 290 | msg = msg.arg(url().toString(), ftp->errorString()); executed (the execution status of this line is deduced): msg = msg.arg(url().toString(), ftp->errorString()); | - |
| 291 | | - |
| 292 | if (state == Statting) evaluated: state == Statting| yes Evaluation Count:3 | yes Evaluation Count:1 |
| 1-3 |
| 293 | // file probably doesn't exist | - |
| 294 | error(QNetworkReply::ContentNotFoundError, msg); executed: error(QNetworkReply::ContentNotFoundError, msg);Execution Count:3 | 3 |
| 295 | else | - |
| 296 | error(QNetworkReply::ContentAccessDenied, msg); executed: error(QNetworkReply::ContentAccessDenied, msg);Execution Count:1 | 1 |
| 297 | | - |
| 298 | disconnectFromFtp(); executed (the execution status of this line is deduced): disconnectFromFtp(); | - |
| 299 | finished(); executed (the execution status of this line is deduced): finished(); | - |
| 300 | } executed: }Execution Count:4 | 4 |
| 301 | | - |
| 302 | if (state == LoggingIn) { evaluated: state == LoggingIn| yes Evaluation Count:36 | yes Evaluation Count:104 |
| 36-104 |
| 303 | state = CheckingFeatures; executed (the execution status of this line is deduced): state = CheckingFeatures; | - |
| 304 | if (operation() == QNetworkAccessManager::GetOperation) { evaluated: operation() == QNetworkAccessManager::GetOperation| yes Evaluation Count:25 | yes Evaluation Count:11 |
| 11-25 |
| 305 | // send help command to find out if server supports "SIZE" and "MDTM" | - |
| 306 | QString command = url().path(); executed (the execution status of this line is deduced): QString command = url().path(); | - |
| 307 | command.prepend(QLatin1String("%1 ")); executed (the execution status of this line is deduced): command.prepend(QLatin1String("%1 ")); | - |
| 308 | helpId = ftp->rawCommand(QLatin1String("HELP")); // get supported commands executed (the execution status of this line is deduced): helpId = ftp->rawCommand(QLatin1String("HELP")); | - |
| 309 | } else { executed: }Execution Count:25 | 25 |
| 310 | ftpDone(); executed (the execution status of this line is deduced): ftpDone(); | - |
| 311 | } executed: }Execution Count:11 | 11 |
| 312 | } else if (state == CheckingFeatures) { evaluated: state == CheckingFeatures| yes Evaluation Count:36 | yes Evaluation Count:68 |
| 36-68 |
| 313 | state = Statting; executed (the execution status of this line is deduced): state = Statting; | - |
| 314 | if (operation() == QNetworkAccessManager::GetOperation) { evaluated: operation() == QNetworkAccessManager::GetOperation| yes Evaluation Count:25 | yes Evaluation Count:11 |
| 11-25 |
| 315 | // logged in successfully, send the stat requests (if supported) | - |
| 316 | QString command = url().path(); executed (the execution status of this line is deduced): QString command = url().path(); | - |
| 317 | command.prepend(QLatin1String("%1 ")); executed (the execution status of this line is deduced): command.prepend(QLatin1String("%1 ")); | - |
| 318 | if (supportsSize) { partially evaluated: supportsSize| yes Evaluation Count:25 | no Evaluation Count:0 |
| 0-25 |
| 319 | ftp->rawCommand(QLatin1String("TYPE I")); executed (the execution status of this line is deduced): ftp->rawCommand(QLatin1String("TYPE I")); | - |
| 320 | sizeId = ftp->rawCommand(command.arg(QLatin1String("SIZE"))); // get size executed (the execution status of this line is deduced): sizeId = ftp->rawCommand(command.arg(QLatin1String("SIZE"))); | - |
| 321 | } executed: }Execution Count:25 | 25 |
| 322 | if (supportsMdtm) partially evaluated: supportsMdtm| yes Evaluation Count:25 | no Evaluation Count:0 |
| 0-25 |
| 323 | mdtmId = ftp->rawCommand(command.arg(QLatin1String("MDTM"))); // get modified time executed: mdtmId = ftp->rawCommand(command.arg(QLatin1String("MDTM")));Execution Count:25 | 25 |
| 324 | if (!supportsSize && !supportsMdtm) partially evaluated: !supportsSize| no Evaluation Count:0 | yes Evaluation Count:25 |
never evaluated: !supportsMdtm | 0-25 |
| 325 | ftpDone(); // no commands sent, move to the next state never executed: ftpDone(); | 0 |
| 326 | } else { executed: }Execution Count:25 | 25 |
| 327 | ftpDone(); executed (the execution status of this line is deduced): ftpDone(); | - |
| 328 | } executed: }Execution Count:11 | 11 |
| 329 | } else if (state == Statting) { evaluated: state == Statting| yes Evaluation Count:33 | yes Evaluation Count:35 |
| 33-35 |
| 330 | // statted successfully, send the actual request | - |
| 331 | emit metaDataChanged(); executed (the execution status of this line is deduced): metaDataChanged(); | - |
| 332 | state = Transferring; executed (the execution status of this line is deduced): state = Transferring; | - |
| 333 | | - |
| 334 | QFtp::TransferType type = QFtp::Binary; executed (the execution status of this line is deduced): QFtp::TransferType type = QFtp::Binary; | - |
| 335 | if (operation() == QNetworkAccessManager::GetOperation) { evaluated: operation() == QNetworkAccessManager::GetOperation| yes Evaluation Count:22 | yes Evaluation Count:11 |
| 11-22 |
| 336 | setCachingEnabled(true); executed (the execution status of this line is deduced): setCachingEnabled(true); | - |
| 337 | ftp->get(url().path(), 0, type); executed (the execution status of this line is deduced): ftp->get(url().path(), 0, type); | - |
| 338 | } else { executed: }Execution Count:22 | 22 |
| 339 | ftp->put(uploadDevice, url().path(), type); executed (the execution status of this line is deduced): ftp->put(uploadDevice, url().path(), type); | - |
| 340 | } executed: }Execution Count:11 | 11 |
| 341 | | - |
| 342 | } else if (state == Transferring) { evaluated: state == Transferring| yes Evaluation Count:31 | yes Evaluation Count:4 |
| 4-31 |
| 343 | // upload or download finished | - |
| 344 | disconnectFromFtp(); executed (the execution status of this line is deduced): disconnectFromFtp(); | - |
| 345 | finished(); executed (the execution status of this line is deduced): finished(); | - |
| 346 | } executed: }Execution Count:31 | 31 |
| 347 | } | - |
| 348 | | - |
| 349 | void QNetworkAccessFtpBackend::ftpReadyRead() | - |
| 350 | { | - |
| 351 | QByteArray data = ftp->readAll(); executed (the execution status of this line is deduced): QByteArray data = ftp->readAll(); | - |
| 352 | QByteDataBuffer list; executed (the execution status of this line is deduced): QByteDataBuffer list; | - |
| 353 | list.append(data); executed (the execution status of this line is deduced): list.append(data); | - |
| 354 | data.clear(); // important because of implicit sharing! executed (the execution status of this line is deduced): data.clear(); | - |
| 355 | writeDownstreamData(list); executed (the execution status of this line is deduced): writeDownstreamData(list); | - |
| 356 | } executed: }Execution Count:788 | 788 |
| 357 | | - |
| 358 | void QNetworkAccessFtpBackend::ftpRawCommandReply(int code, const QString &text) | - |
| 359 | { | - |
| 360 | //qDebug() << "FTP reply:" << code << text; | - |
| 361 | int id = ftp->currentId(); executed (the execution status of this line is deduced): int id = ftp->currentId(); | - |
| 362 | | - |
| 363 | if ((id == helpId) && ((code == 200) || (code == 214))) { // supported commands evaluated: (id == helpId)| yes Evaluation Count:25 | yes Evaluation Count:72 |
partially evaluated: (code == 200)| no Evaluation Count:0 | yes Evaluation Count:25 |
partially evaluated: (code == 214)| yes Evaluation Count:25 | no Evaluation Count:0 |
| 0-72 |
| 364 | // the "FEAT" ftp command would be nice here, but it is not part of the | - |
| 365 | // initial FTP RFC 959, neither ar "SIZE" nor "MDTM" (they are all specified | - |
| 366 | // in RFC 3659) | - |
| 367 | if (text.contains(QLatin1String("SIZE"), Qt::CaseSensitive)) partially evaluated: text.contains(QLatin1String("SIZE"), Qt::CaseSensitive)| yes Evaluation Count:25 | no Evaluation Count:0 |
| 0-25 |
| 368 | supportsSize = true; executed: supportsSize = true;Execution Count:25 | 25 |
| 369 | if (text.contains(QLatin1String("MDTM"), Qt::CaseSensitive)) partially evaluated: text.contains(QLatin1String("MDTM"), Qt::CaseSensitive)| yes Evaluation Count:25 | no Evaluation Count:0 |
| 0-25 |
| 370 | supportsMdtm = true; executed: supportsMdtm = true;Execution Count:25 | 25 |
| 371 | } else if (code == 213) { // file status executed: }Execution Count:25 evaluated: code == 213| yes Evaluation Count:44 | yes Evaluation Count:28 |
| 25-44 |
| 372 | if (id == sizeId) { evaluated: id == sizeId| yes Evaluation Count:22 | yes Evaluation Count:22 |
| 22 |
| 373 | // reply to the size command | - |
| 374 | setHeader(QNetworkRequest::ContentLengthHeader, text.toLongLong()); executed (the execution status of this line is deduced): setHeader(QNetworkRequest::ContentLengthHeader, text.toLongLong()); | - |
| 375 | #ifndef QT_NO_DATESTRING | - |
| 376 | } else if (id == mdtmId) { executed: }Execution Count:22 partially evaluated: id == mdtmId| yes Evaluation Count:22 | no Evaluation Count:0 |
| 0-22 |
| 377 | QDateTime dt = QDateTime::fromString(text, QLatin1String("yyyyMMddHHmmss")); executed (the execution status of this line is deduced): QDateTime dt = QDateTime::fromString(text, QLatin1String("yyyyMMddHHmmss")); | - |
| 378 | setHeader(QNetworkRequest::LastModifiedHeader, dt); executed (the execution status of this line is deduced): setHeader(QNetworkRequest::LastModifiedHeader, dt); | - |
| 379 | #endif | - |
| 380 | } executed: }Execution Count:22 | 22 |
| 381 | } | - |
| 382 | } | - |
| 383 | | - |
| 384 | QT_END_NAMESPACE | - |
| 385 | | - |
| 386 | #endif // QT_NO_FTP | - |
| 387 | | - |
| | |