summaryrefslogtreecommitdiffstats
path: root/src/musicbrainz/network.cpp
blob: e1e12dc1bbf604cf2c89572d66b1024826c70e9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*****************************************************************************
 *  Copyright © 2012 John Maguire <john.maguire@gmail.com>                   *
 *                   David Sansome <me@davidsansome.com>                     *
 *  This work is free. You can redistribute it and/or modify it under the    *
 *  terms of the Do What The Fuck You Want To Public License, Version 2,     *
 *  as published by Sam Hocevar.                                             *
 *  See http://www.wtfpl.net/ for more details.                              *
 *****************************************************************************/

#include <QCoreApplication>
#include <QDir>
#include <QNetworkAccessManager>
#include <QNetworkDiskCache>
#include <QNetworkReply>

#include "musicbrainz/network.h"

NetworkAccessManager::NetworkAccessManager(QObject* parent)
                    : QNetworkAccessManager(parent) {
}

QNetworkReply* NetworkAccessManager::createRequest(Operation op,
                                                   const QNetworkRequest& request,
                                                   QIODevice* outgoingData) {
    QNetworkRequest new_request(request);
    new_request.setRawHeader("User-Agent", QString("%1 %2").arg(
        QCoreApplication::applicationName(),
        QCoreApplication::applicationVersion()).toUtf8());

    if (op == QNetworkAccessManager::PostOperation &&
        !new_request.header(QNetworkRequest::ContentTypeHeader).isValid()) {
        new_request.setHeader(QNetworkRequest::ContentTypeHeader,
                            "application/x-www-form-urlencoded");
    }

    // Prefer the cache unless the caller has changed the setting already
    if (request.attribute(QNetworkRequest::CacheLoadControlAttribute).toInt()
        == QNetworkRequest::PreferNetwork) {
        new_request.setAttribute(QNetworkRequest::CacheLoadControlAttribute,
                                QNetworkRequest::PreferCache);
    }

    return QNetworkAccessManager::createRequest(op, new_request, outgoingData);
}


NetworkTimeouts::NetworkTimeouts(int timeout_msec, QObject* parent)
                : QObject(parent),
                  m_timeout_msec(timeout_msec) {
}

void NetworkTimeouts::addReply(QNetworkReply* reply) {
    if (m_timers.contains(reply))
        return;

    connect(reply, SIGNAL(destroyed()), SLOT(replyFinished()));
    connect(reply, SIGNAL(finished()), SLOT(replyFinished()));
    m_timers[reply] = startTimer(m_timeout_msec);
}

void NetworkTimeouts::replyFinished() {
    QNetworkReply* reply = reinterpret_cast<QNetworkReply*>(sender());
    if (m_timers.contains(reply)) {
        killTimer(m_timers.take(reply));
    }
}

void NetworkTimeouts::timerEvent(QTimerEvent* e) {
    QNetworkReply* reply = m_timers.key(e->timerId());
    if (reply) {
      reply->abort();
    }
}