From ae6c852cdceb2990e2dffcf02d3fe521eb0be8bd Mon Sep 17 00:00:00 2001
From: Akira Ohgaki <akiraohgaki@gmail.com>
Date: Wed, 17 Aug 2016 12:45:23 +0900
Subject: [PATCH] Add core/network class

---
 src/core/network.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++++
 src/core/network.h   | 39 ++++++++++++++++++++++++++
 2 files changed, 104 insertions(+)
 create mode 100644 src/core/network.cpp
 create mode 100644 src/core/network.h

diff --git a/src/core/network.cpp b/src/core/network.cpp
new file mode 100644
index 0000000..6d040d2
--- /dev/null
+++ b/src/core/network.cpp
@@ -0,0 +1,65 @@
+#include <QEventLoop>
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+
+#include "network.h"
+
+namespace Core {
+
+Network::Network(const bool &async, QObject *parent) :
+    QObject(parent), _async(async)
+{
+    _manager = new QNetworkAccessManager();
+    connect(_manager, &QNetworkAccessManager::finished,
+            this, &Network::_finished);
+    if (!_async) {
+        _eventLoop = new QEventLoop();
+        connect(_manager, &QNetworkAccessManager::finished,
+                _eventLoop, &QEventLoop::quit);
+    }
+}
+
+Network::~Network()
+{
+    _manager->deleteLater();
+    if (!_async) {
+        delete _eventLoop;
+    }
+}
+
+QNetworkReply *Network::head(const QUrl &uri)
+{
+    QNetworkReply *reply = _manager->head(QNetworkRequest(uri));
+    if (!_async) {
+        _eventLoop->exec();
+    }
+    return reply;
+}
+
+QNetworkReply *Network::get(const QUrl &uri)
+{
+    QNetworkReply *reply = _manager->get(QNetworkRequest(uri));
+    connect(reply, &QNetworkReply::downloadProgress,
+            this, &Network::_downloadProgress);
+    if (!_async) {
+        _eventLoop->exec();
+    }
+    return reply;
+}
+
+/**
+ * Private slots
+ */
+
+void Network::_finished(QNetworkReply *reply)
+{
+    emit finished(reply);
+}
+
+void Network::_downloadProgress(const qint64 &received, const qint64 &total)
+{
+    emit downloadProgress(received, total);
+}
+
+} // namespace Core
diff --git a/src/core/network.h b/src/core/network.h
new file mode 100644
index 0000000..374310c
--- /dev/null
+++ b/src/core/network.h
@@ -0,0 +1,39 @@
+#ifndef CORE_NETWORK_H
+#define CORE_NETWORK_H
+
+#include <QObject>
+
+class QEventLoop;
+class QNetworkAccessManager;
+class QNetworkReply;
+
+namespace Core {
+
+class Network : public QObject
+{
+    Q_OBJECT
+
+private:
+    bool _async;
+    QNetworkAccessManager *_manager;
+    QEventLoop *_eventLoop;
+
+public:
+    explicit Network(const bool &async = true, QObject *parent = 0);
+    ~Network();
+
+    QNetworkReply *head(const QUrl &uri);
+    QNetworkReply *get(const QUrl &uri);
+
+private slots:
+    void _finished(QNetworkReply *reply);
+    void _downloadProgress(const qint64 &received, const qint64 &total);
+
+signals:
+    void finished(QNetworkReply *reply);
+    void downloadProgress(const qint64 &received, const qint64 &total);
+};
+
+} // namespace Core
+
+#endif // CORE_NETWORK_H
-- 
GitLab