void QNetworkReplyImplPrivate::_q_startOperation() { // ensure this function is only being called once if (state == Working) { qDebug("QNetworkReplyImpl::_q_startOperation was called more than once"); return; } state = Working; // note: if that method is called directly, it cannot happen that the backend is 0, // because we just checked via a qobject_cast that we got a http backend (see // QNetworkReplyImplPrivate::setup()) if (!backend) { error(QNetworkReplyImpl::ProtocolUnknownError, QCoreApplication::translate("QNetworkReply", "Protocol \"%1\" is unknown").arg(url.scheme())); // not really true!; finished(); return; } #ifndef QT_NO_BEARERMANAGEMENT if (!backend->start()) { // backend failed to start because the session state is not Connected. // QNetworkAccessManager will call reply->backend->start() again for us when the session // state changes. state = WaitingForSession; QNetworkSession *session = manager->d_func()->networkSession; if (session) { Q_Q(QNetworkReplyImpl); QObject::connect(session, SIGNAL(error(QNetworkSession::SessionError)), q, SLOT(_q_networkSessionFailed())); if (!session->isOpen()) session->open(); } else { qWarning("Backend is waiting for QNetworkSession to connect, but there is none!"); } return; } #endif if (state != Finished) { if (operation == QNetworkAccessManager::GetOperation) pendingNotifications.append(NotifyDownstreamReadyWrite); handleNotifications(); } }
void QNetworkReplyImplPrivate::_q_startOperation() { Q_Q(QNetworkReplyImpl); // ensure this function is only being called once if (state == Working || state == Finished) { qDebug("QNetworkReplyImpl::_q_startOperation was called more than once"); return; } state = Working; // note: if that method is called directly, it cannot happen that the backend is 0, // because we just checked via a qobject_cast that we got a http backend (see // QNetworkReplyImplPrivate::setup()) if (!backend) { error(QNetworkReplyImpl::ProtocolUnknownError, QCoreApplication::translate("QNetworkReply", "Protocol \"%1\" is unknown").arg(url.scheme())); // not really true!; finished(); return; } #ifndef QT_NO_BEARERMANAGEMENT // Do not start background requests if they are not allowed by session policy QSharedPointer<QNetworkSession> session(manager->d_func()->getNetworkSession()); QVariant isBackground = backend->request().attribute(QNetworkRequest::BackgroundRequestAttribute, QVariant::fromValue(false)); if (isBackground.toBool() && session && session->usagePolicies().testFlag(QNetworkSession::NoBackgroundTrafficPolicy)) { error(QNetworkReply::BackgroundRequestNotAllowedError, QCoreApplication::translate("QNetworkReply", "Background request not allowed.")); finished(); return; } #endif if (!backend->start()) { #ifndef QT_NO_BEARERMANAGEMENT // backend failed to start because the session state is not Connected. // QNetworkAccessManager will call _q_startOperation again for us when the session // state changes. state = WaitingForSession; if (session) { QObject::connect(session.data(), SIGNAL(error(QNetworkSession::SessionError)), q, SLOT(_q_networkSessionFailed())); if (!session->isOpen()) { session->setSessionProperty(QStringLiteral("ConnectInBackground"), isBackground); session->open(); } } else { qWarning("Backend is waiting for QNetworkSession to connect, but there is none!"); state = Working; error(QNetworkReplyImpl::NetworkSessionFailedError, QCoreApplication::translate("QNetworkReply", "Network session error.")); finished(); } #else qWarning("Backend start failed"); state = Working; error(QNetworkReplyImpl::UnknownNetworkError, QCoreApplication::translate("QNetworkReply", "backend start error.")); finished(); #endif return; } #ifndef QT_NO_BEARERMANAGEMENT if (session) { //get notification of policy changes. QObject::connect(session.data(), SIGNAL(usagePoliciesChanged(QNetworkSession::UsagePolicies)), q, SLOT(_q_networkSessionUsagePoliciesChanged(QNetworkSession::UsagePolicies))); } #endif // Prepare timer for progress notifications downloadProgressSignalChoke.start(); uploadProgressSignalChoke.invalidate(); if (backend && backend->isSynchronous()) { state = Finished; q_func()->setFinished(true); } else { if (state != Finished) { if (operation == QNetworkAccessManager::GetOperation) pendingNotifications.append(NotifyDownstreamReadyWrite); handleNotifications(); } } }