fix work of async image provider

This commit is contained in:
Andrei Yankovich 2020-09-30 17:56:37 +03:00
parent b42d042a10
commit 6305b2973f
5 changed files with 23 additions and 151 deletions

View File

@ -7,21 +7,14 @@
#include "correnthostimageprovider.h"
#include <cassert>
#include <quasarapp.h>
#ifdef Q_OS_WASM
#include <emscripten/fetch.h>
#include <string>
#else
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#endif
#include <fetchapi.h>
namespace BaseFront {
CorrentHostImageProvider::CorrentHostImageProvider() {
}
CorrentHostImageProvider::~CorrentHostImageProvider() {
@ -31,7 +24,6 @@ QQuickImageResponse *CorrentHostImageProvider::requestImageResponse(
const QString &id, const QSize &requestedSize) {
AsyncImageResponse *response = new AsyncImageResponse(id, requestedSize);
response->run();
return response;
@ -39,97 +31,37 @@ QQuickImageResponse *CorrentHostImageProvider::requestImageResponse(
AsyncImageResponse::AsyncImageResponse(const QString &id, const QSize &requestedSize)
:
#ifndef Q_OS_WASM
m_manager(new QNetworkAccessManager),
#endif
m_fetch(new FetchAPI()),
m_id(id),
m_requestedSize(requestedSize) {
m_requestedSize(requestedSize) {
setAutoDelete(false);
}
AsyncImageResponse::~AsyncImageResponse() {
#ifndef Q_OS_WASM
delete m_manager;
#endif
delete m_fetch;
}
QQuickTextureFactory *AsyncImageResponse::textureFactory() const {
return QQuickTextureFactory::textureFactoryForImage(m_image);
}
#ifdef Q_OS_WASM
void downloadSucceeded(emscripten_fetch_t *fetch) {
auto resp = static_cast<AsyncImageResponse*>(fetch->userData);
resp->m_image = QImage::fromData(reinterpret_cast<const unsigned char*>(fetch->data),
fetch->numBytes);
QuasarAppUtils::Params::log(QString("Downloading %0 sucsess, HTTP sucsess status code: %1.\n").
arg(fetch->url).arg(fetch->status),
QuasarAppUtils::Info);
qDebug() << resp;
if (resp->m_requestedSize.isValid())
resp->m_image = resp->m_image.scaled(resp->m_requestedSize);
resp->finished();
emscripten_fetch_close(fetch); // Free data associated with the fetch.
};
void downloadFailed(emscripten_fetch_t *fetch) {
QuasarAppUtils::Params::log(QString("Downloading %0 failed, HTTP failure status code: %1.\n").
arg(fetch->url).arg(fetch->status),
QuasarAppUtils::Error);
emscripten_fetch_close(fetch); // Also free data on failure.
auto resp = static_cast<AsyncImageResponse*>(fetch->userData);
resp->cancel();
};
#endif
void AsyncImageResponse::run() {
#ifdef Q_OS_WASM
emscripten_fetch_attr_t attr;
emscripten_fetch_attr_init(&attr);
attr.userData = this;
strcpy(attr.requestMethod, "GET");
attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY;
attr.onsuccess = downloadSucceeded;
attr.onerror = downloadFailed;
m_fetch->Get(m_id);
auto stdString = m_id.toStdString();
emscripten_fetch(&attr, stdString.c_str());
#else
QNetworkRequest request;
m_manager->get(request);
auto handleRequest= [this](QNetworkReply *reply) {
if (reply->error() != QNetworkReply::NoError) {
QuasarAppUtils::Params::log(reply->errorString(),
QuasarAppUtils::Error);
cancel();
}
auto data = reply->readAll();
auto handleSuccessful = [this](const QString&, const QByteArray& data) {
m_image = QImage::fromData(data);
if (m_requestedSize.isValid())
m_image = m_image.scaled(m_requestedSize);
emit finished();
};
connect(m_manager, &QNetworkAccessManager::finished, handleRequest);
#endif
auto handleFail = [this](const QString&, const QString&) {
cancel();
};
connect(m_fetch, &FetchAPI::sigFinished, handleSuccessful);
connect(m_fetch, &FetchAPI::sigError, handleFail);
}

View File

@ -16,6 +16,7 @@
class QNetworkAccessManager;
namespace BaseFront {
class FetchAPI;
class BASEFRONT_LIBRARYSHARED_EXPORT AsyncImageResponse : public QQuickImageResponse, public QRunnable
{
@ -25,10 +26,9 @@ public:
QQuickTextureFactory *textureFactory() const override;
void run() override;
#ifndef Q_OS_WASM
private:
QNetworkAccessManager *m_manager = nullptr;
#endif
FetchAPI *m_fetch = nullptr;
QString m_id;
QImage m_image;
QSize m_requestedSize;

View File

@ -15,10 +15,10 @@ namespace BaseFront {
#ifdef Q_OS_WASM
void downloadSucceeded(emscripten_fetch_t *fetch) {
auto fetchAPI = static_cast<FetchAPI*>(fetch->userData);
QByteArray data(reinterpret_cast<const unsigned char*>(fetch->data),
QByteArray data(reinterpret_cast<const char*>(fetch->data),
fetch->numBytes);
emit fetchAPI.sigFinished(QString(%0).arg(fetch->url), data);
emit fetchAPI->sigFinished(QString("%0").arg(fetch->url), data);
emscripten_fetch_close(fetch); // Free data associated with the fetch.
};
@ -32,7 +32,7 @@ void downloadFailed(emscripten_fetch_t *fetch) {
emscripten_fetch_close(fetch); // Also free data on failure.
auto fetchAPI = static_cast<FetchAPI*>(fetch->userData);
emit fetchAPI.sigError(QString(%0).arg(fetch->url),
emit fetchAPI->sigError(QString("%0").arg(fetch->url),
QString("Downloading %0 failed, HTTP failure status code: %1.\n").
arg(fetch->url).arg(fetch->status));

View File

@ -1,27 +0,0 @@
//
// Copyright (C) 2020-2020 QuasarApp.
// Distributed under the lgplv3 software license, see the accompanying
// Everyone is permitted to copy and distribute verbatim copies
// of this license document, but changing it is not allowed.
//
#include "imageservice.h"
#include <fetchapi.h>
namespace BaseFront {
ImageService::ImageService(QObject *parent):
QObject(parent) {
_fetchAPI = new FetchAPI(this);
connect(_fetchAPI, &FetchAPI::sigFinished(), this, &)
}
ImageService::~ImageService() {
delete _fetchAPI;
}
const QImage &ImageService::getImage(const QString &img) const {
}
}

View File

@ -1,33 +0,0 @@
//
// Copyright (C) 2020-2020 QuasarApp.
// Distributed under the lgplv3 software license, see the accompanying
// Everyone is permitted to copy and distribute verbatim copies
// of this license document, but changing it is not allowed.
//
#ifndef IMAGESERVICE_H
#define IMAGESERVICE_H
#include "BaseFront_global.h"
#include <QHash>
#include <QImage>
namespace BaseFront {
class FetchAPI;
class BASEFRONT_LIBRARYSHARED_EXPORT ImageService: public QObject
{
Q_OBJECT
public:
ImageService(QObject* parent = nullptr);
~ImageService();
const QImage& getImage(const QString& img) const;
private slots:
void handle
private:
QHash<QString, QImage> _data;
FetchAPI * _fetchAPI;
};
}
#endif // IMAGESERVICE_H