mirror of
https://github.com/QuasarApp/DocsSite.git
synced 2025-04-26 20:14:32 +00:00
fix work of async image provider
This commit is contained in:
parent
b42d042a10
commit
6305b2973f
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
|
||||
|
@ -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 {
|
||||
|
||||
}
|
||||
}
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user