mirror of
https://github.com/QuasarApp/DocsSite.git
synced 2025-05-02 06:39:34 +00:00
fix work of async image provider
This commit is contained in:
parent
b42d042a10
commit
6305b2973f
Site/BaseFront/Front/src
@ -7,21 +7,14 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "correnthostimageprovider.h"
|
#include "correnthostimageprovider.h"
|
||||||
|
#include <cassert>
|
||||||
#include <quasarapp.h>
|
#include <quasarapp.h>
|
||||||
|
#include <fetchapi.h>
|
||||||
#ifdef Q_OS_WASM
|
|
||||||
#include <emscripten/fetch.h>
|
|
||||||
#include <string>
|
|
||||||
#else
|
|
||||||
#include <QNetworkAccessManager>
|
|
||||||
#include <QNetworkRequest>
|
|
||||||
#include <QNetworkReply>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace BaseFront {
|
namespace BaseFront {
|
||||||
|
|
||||||
CorrentHostImageProvider::CorrentHostImageProvider() {
|
CorrentHostImageProvider::CorrentHostImageProvider() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CorrentHostImageProvider::~CorrentHostImageProvider() {
|
CorrentHostImageProvider::~CorrentHostImageProvider() {
|
||||||
@ -31,7 +24,6 @@ QQuickImageResponse *CorrentHostImageProvider::requestImageResponse(
|
|||||||
const QString &id, const QSize &requestedSize) {
|
const QString &id, const QSize &requestedSize) {
|
||||||
|
|
||||||
AsyncImageResponse *response = new AsyncImageResponse(id, requestedSize);
|
AsyncImageResponse *response = new AsyncImageResponse(id, requestedSize);
|
||||||
|
|
||||||
response->run();
|
response->run();
|
||||||
|
|
||||||
return response;
|
return response;
|
||||||
@ -39,97 +31,37 @@ QQuickImageResponse *CorrentHostImageProvider::requestImageResponse(
|
|||||||
|
|
||||||
AsyncImageResponse::AsyncImageResponse(const QString &id, const QSize &requestedSize)
|
AsyncImageResponse::AsyncImageResponse(const QString &id, const QSize &requestedSize)
|
||||||
:
|
:
|
||||||
#ifndef Q_OS_WASM
|
m_fetch(new FetchAPI()),
|
||||||
m_manager(new QNetworkAccessManager),
|
|
||||||
#endif
|
|
||||||
m_id(id),
|
m_id(id),
|
||||||
m_requestedSize(requestedSize) {
|
m_requestedSize(requestedSize) {
|
||||||
|
|
||||||
setAutoDelete(false);
|
setAutoDelete(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
AsyncImageResponse::~AsyncImageResponse() {
|
AsyncImageResponse::~AsyncImageResponse() {
|
||||||
#ifndef Q_OS_WASM
|
delete m_fetch;
|
||||||
delete m_manager;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QQuickTextureFactory *AsyncImageResponse::textureFactory() const {
|
QQuickTextureFactory *AsyncImageResponse::textureFactory() const {
|
||||||
|
|
||||||
return QQuickTextureFactory::textureFactoryForImage(m_image);
|
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() {
|
void AsyncImageResponse::run() {
|
||||||
|
|
||||||
#ifdef Q_OS_WASM
|
m_fetch->Get(m_id);
|
||||||
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;
|
|
||||||
|
|
||||||
auto stdString = m_id.toStdString();
|
auto handleSuccessful = [this](const QString&, const QByteArray& data) {
|
||||||
|
|
||||||
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();
|
|
||||||
m_image = QImage::fromData(data);
|
m_image = QImage::fromData(data);
|
||||||
|
|
||||||
if (m_requestedSize.isValid())
|
|
||||||
m_image = m_image.scaled(m_requestedSize);
|
|
||||||
|
|
||||||
emit finished();
|
emit finished();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
connect(m_manager, &QNetworkAccessManager::finished, handleRequest);
|
auto handleFail = [this](const QString&, const QString&) {
|
||||||
#endif
|
cancel();
|
||||||
|
};
|
||||||
|
|
||||||
|
connect(m_fetch, &FetchAPI::sigFinished, handleSuccessful);
|
||||||
|
connect(m_fetch, &FetchAPI::sigError, handleFail);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
class QNetworkAccessManager;
|
class QNetworkAccessManager;
|
||||||
|
|
||||||
namespace BaseFront {
|
namespace BaseFront {
|
||||||
|
class FetchAPI;
|
||||||
|
|
||||||
class BASEFRONT_LIBRARYSHARED_EXPORT AsyncImageResponse : public QQuickImageResponse, public QRunnable
|
class BASEFRONT_LIBRARYSHARED_EXPORT AsyncImageResponse : public QQuickImageResponse, public QRunnable
|
||||||
{
|
{
|
||||||
@ -25,10 +26,9 @@ public:
|
|||||||
QQuickTextureFactory *textureFactory() const override;
|
QQuickTextureFactory *textureFactory() const override;
|
||||||
|
|
||||||
void run() override;
|
void run() override;
|
||||||
#ifndef Q_OS_WASM
|
|
||||||
private:
|
FetchAPI *m_fetch = nullptr;
|
||||||
QNetworkAccessManager *m_manager = nullptr;
|
|
||||||
#endif
|
|
||||||
QString m_id;
|
QString m_id;
|
||||||
QImage m_image;
|
QImage m_image;
|
||||||
QSize m_requestedSize;
|
QSize m_requestedSize;
|
||||||
|
@ -15,10 +15,10 @@ namespace BaseFront {
|
|||||||
#ifdef Q_OS_WASM
|
#ifdef Q_OS_WASM
|
||||||
void downloadSucceeded(emscripten_fetch_t *fetch) {
|
void downloadSucceeded(emscripten_fetch_t *fetch) {
|
||||||
auto fetchAPI = static_cast<FetchAPI*>(fetch->userData);
|
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);
|
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.
|
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.
|
emscripten_fetch_close(fetch); // Also free data on failure.
|
||||||
|
|
||||||
auto fetchAPI = static_cast<FetchAPI*>(fetch->userData);
|
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").
|
QString("Downloading %0 failed, HTTP failure status code: %1.\n").
|
||||||
arg(fetch->url).arg(fetch->status));
|
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