diff options
author | Thiago Marcos P. Santos <thiago@mapbox.com> | 2016-07-08 17:19:54 +0300 |
---|---|---|
committer | Thiago Marcos P. Santos <thiago@mapbox.com> | 2016-07-11 17:01:32 +0300 |
commit | 5ad22bd672c84328c1274f7413959642d2a92576 (patch) | |
tree | 9a408da03da152f94d5ded4f009c747f9ac24a29 | |
parent | abeee2087c151ccc492b2aff60b54dc6f8ec9fd1 (diff) | |
download | qtlocation-mapboxgl-5ad22bd672c84328c1274f7413959642d2a92576.tar.gz |
[Qt] Implement a GeoJSON coverter from QByteArray
-rw-r--r-- | platform/qt/platform.gyp | 4 | ||||
-rw-r--r-- | platform/qt/src/qt_conversion.hpp | 2 | ||||
-rw-r--r-- | platform/qt/src/qt_geojson.hpp | 45 |
3 files changed, 48 insertions, 3 deletions
diff --git a/platform/qt/platform.gyp b/platform/qt/platform.gyp index 7968dbc3ad..33bd5779a1 100644 --- a/platform/qt/platform.gyp +++ b/platform/qt/platform.gyp @@ -74,6 +74,8 @@ 'variables': { 'cflags': [ '<@(boost_cflags)', + '<@(geojson_cflags)', + '<@(libjpeg-turbo_cflags)', '<@(nunicode_cflags)', '<@(opengl_cflags)', '<@(qt_core_cflags)', @@ -93,6 +95,8 @@ '<@(zlib_ldflags)', ], 'libraries': [ + '<@(geojson_static_libs)', + '<@(libjpeg-turbo_static_libs)', '<@(nunicode_static_libs)', '<@(sqlite_static_libs)', '<@(zlib_static_libs)', diff --git a/platform/qt/src/qt_conversion.hpp b/platform/qt/src/qt_conversion.hpp index ebcbdbdc04..dc20aa4753 100644 --- a/platform/qt/src/qt_conversion.hpp +++ b/platform/qt/src/qt_conversion.hpp @@ -28,7 +28,7 @@ inline QVariant arrayMember(const QVariant& value, std::size_t i) { } inline bool isObject(const QVariant& value) { - return value.canConvert(QVariant::Map); + return value.canConvert(QVariant::Map) || value.type() == QVariant::ByteArray; } inline optional<QVariant> objectMember(const QVariant& value, const char* key) { diff --git a/platform/qt/src/qt_geojson.hpp b/platform/qt/src/qt_geojson.hpp index cc0b15a6cd..ff7ee2eada 100644 --- a/platform/qt/src/qt_geojson.hpp +++ b/platform/qt/src/qt_geojson.hpp @@ -1,12 +1,53 @@ +#pragma once + +#include <mapbox/geojson.hpp> #include <mbgl/style/conversion/geojson.hpp> +#include <mbgl/util/rapidjson.hpp> + +#include <sstream> +#include <string> + +#include <QByteArray> +#include <QVariant> namespace mbgl { namespace style { namespace conversion { template <> -Result<GeoJSON> convertGeoJSON(const QVariant&) { - return Error { "not implemented" }; +Result<GeoJSON> convertGeoJSON(const QVariant& value) { + if (value.type() != QVariant::ByteArray) { + return Error { "JSON data must be in QByteArray" }; + } + + auto data = value.toByteArray(); + + rapidjson::GenericDocument<rapidjson::UTF8<>, rapidjson::CrtAllocator> d; + if (data.endsWith(char(0))) { + d.Parse<0>(value.toByteArray().data()); + } else { + d.Parse<0>(value.toByteArray().constData()); + } + + // Needed to keep the error message alive + // when we go out of this scope. + static std::string error; + + if (d.HasParseError()) { + std::stringstream message; + message << d.GetErrorOffset() << " - " << rapidjson::GetParseError_En(d.GetParseError()); + + error = message.str(); + return Error { error.c_str() }; + } + + conversion::Result<GeoJSON> geoJSON = conversion::convertGeoJSON<JSValue>(d); + if (!geoJSON) { + error = geoJSON.error().message; + return Error { error.c_str() }; + } + + return geoJSON; } } // namespace conversion |