Revision control
++ // Copyright (C) 2025 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
++
++ #include <QtCore/qmetaobject.h>
++ #include <qgeomapreplyohosmapkit.h>
++ #include <qohosmapkitcommon.h>
++
++ QT_BEGIN_NAMESPACE
++
++ namespace {
++
++ const char pngSignature[] = "\x89PNG\r\n\x1a\n";
++
++ class QGeoMapReplyOhosMapKit : public QGeoTiledMapReply
++ {
++ public:
++ explicit QGeoMapReplyOhosMapKit(
++ QNetworkReply *reply, const QGeoTileSpec &spec, QObject *parent);
++
++ private:
++ void onNetworkReplyFinished();
++ void onNetworkReplyError(QNetworkReply::NetworkError error);
++ };
++
++ QGeoMapReplyOhosMapKit::QGeoMapReplyOhosMapKit(
++ QNetworkReply *reply, const QGeoTileSpec &spec, QObject *parent)
++ : QGeoTiledMapReply(spec, parent)
++ {
++ if (reply == nullptr) {
++ setError(QGeoTiledMapReply::UnknownError, OhosMapKit::msgNullReply());
++ return;
++ }
++
++ connect(reply, &QNetworkReply::finished, this, &QGeoMapReplyOhosMapKit::onNetworkReplyFinished);
++ connect(reply, &QNetworkReply::errorOccurred, this, &QGeoMapReplyOhosMapKit::onNetworkReplyError);
++ connect(this, &QGeoTiledMapReply::aborted, reply, &QNetworkReply::abort);
++ connect(this, &QObject::destroyed, reply, &QObject::deleteLater);
++ }
++
++ void QGeoMapReplyOhosMapKit::onNetworkReplyFinished()
++ {
++ auto *reply = static_cast<QNetworkReply *>(sender());
++ reply->deleteLater();
++
++ if (reply->error() != QNetworkReply::NoError) {
++ setError(
++ QGeoTiledMapReply::CommunicationError,
++ OhosMapKit::msgReplyError(reply->errorString()));
++ return;
++ }
++
++ const auto imageData = reply->readAll();
++
++ if (imageData.startsWith(pngSignature)) {
++ setMapImageFormat(QStringLiteral("png"));
++ setMapImageData(imageData);
++ setFinished(true);
++ } else {
++ setError(QGeoTiledMapReply::ParseError, tr("Invalid format of tile data"));
++ }
++ }
++
++ void QGeoMapReplyOhosMapKit::onNetworkReplyError(QNetworkReply::NetworkError error)
++ {
++ auto *reply = static_cast<QNetworkReply *>(sender());
++ reply->deleteLater();
++ if (error == QNetworkReply::OperationCanceledError)
++ setFinished(true);
++ else
++ setError(QGeoTiledMapReply::CommunicationError, reply->errorString());
++ }
++
++ }
++
++ QGeoTiledMapReply *makeGeoTiledMapReplyOhosMapKit(
++ QNetworkReply *reply, const QGeoTileSpec &spec, QObject *parent)
++ {
++ return new QGeoMapReplyOhosMapKit(reply, spec, parent);
++ }
++
++ QT_END_NAMESPACE