fog
fog

Reputation:

Problem with QHttp example qt 4.4.3

I'm trying to use QHttp for an update app. But there is a problem for me which I can't solve.

I try to download a file (works perfectly) but if there is no connection to the internet, the file is created but has 0 bytes. My old file is then overwritten with the empty file, which is not so good for the application trying to use the file. What I need is to check if the computer is connected to the internet.

Note: proxy may set. I used this example from Qt's homepage.

Upvotes: 2

Views: 2575

Answers (4)

Gearoid Murphy
Gearoid Murphy

Reputation:

i ran into the same problem, after a bit of poking around, I've isolated the problem down to the project configuration file (.pro), in the broken configuration I was linking the networking library explicitly with the statement : "LIBS += -lQtNetwork". In the working configuration, I used the more formal (and qt compilant) approach of delcaring what Qt components are included in the project, like so: "QT = core gui network xml", adjust accordingly for your sitiation, the netowkring slots did not work on windows when explicitly linked but did work on linux. Using the qt compilant approach works on both platforms.

Upvotes: 0

Marc Mutz - mmutz
Marc Mutz - mmutz

Reputation: 25313

Whenever you write a file that might already exist, you should create a QTemporaryFile first, then, after successful download, rename it to the final name.

Upvotes: 0

Phil Hannent
Phil Hannent

Reputation: 12327

You should switch to the QNetworkAccessManager as Mike Suggested, here is an example of a slot on the finished() signal:

void ApplicationUpdate::replyFinishedhttpGetChangeLog(QNetworkReply* myReply) {

if (myReply->error() != QNetworkReply::NoError)
{
    QByteArray returnedData = myReply->readAll();
    if (returnedData.size() > 0) {
        if( m_fileChangeLog->exists() )
        {
            m_fileChangeLog->close();
            m_fileChangeLog->remove();
        }
        m_fileChangeLog->open(QIODevice::ReadWrite);
        QDataStream out( m_fileChangeLog );
        out.writeRawData(returnedData.data(), returnedData.size());
        m_fileChangeLog->flush();
        m_fileChangeLog->close();
    }
}

}

Upvotes: 1

Mike McQuaid
Mike McQuaid

Reputation: 9814

Firstly, you should probably now be using QNetworkAccessManager rather than QHttp.

Using either of them, you should do a dummy query to a site you pretty much always know will be up (e.g. http://www.google.com/) and use that as a test to see if you have an internet connection.

A better way of doing this would be instead to use QNetworkAccessManager to read into a QByteArray and then check it isn't empty before writing to your file.

Upvotes: 0

Related Questions