diff options
Diffstat (limited to 'src/location/places/provider/qplacejsonrecommendationparser.cpp')
-rw-r--r-- | src/location/places/provider/qplacejsonrecommendationparser.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/location/places/provider/qplacejsonrecommendationparser.cpp b/src/location/places/provider/qplacejsonrecommendationparser.cpp new file mode 100644 index 00000000..c8199144 --- /dev/null +++ b/src/location/places/provider/qplacejsonrecommendationparser.cpp @@ -0,0 +1,82 @@ +#include "qplacejsonrecommendationparser.h" + +#include <QtScript/QScriptEngine> +#include <QtScript/QScriptValue> +#include <QtScript/QScriptValueIterator> + +#include "qplacejsondetailsparser.h" +#include "../qplace.h" + +#if defined(QT_PLACES_LOGGING) + #include <QDebug> +#endif + +static const char *recommendations_element = "recommendations"; +static const char *recommendations_nearby_element = "nearby"; +static const char *recommendations_distance_element = "distance"; +static const char *recommendations_place_element = "place"; + +using namespace QT_PLACES_NAMESPACE; + +QPlaceJSonRecommendationParser::QPlaceJSonRecommendationParser(QObject *parent) : + QObject(parent), + engine(NULL) +{ +} + +QPlaceJSonRecommendationParser::~QPlaceJSonRecommendationParser() +{ +} + +QList<QPlaceSearchResult> QPlaceJSonRecommendationParser::results() +{ + return searchResults; +} + +void QPlaceJSonRecommendationParser::processData(const QString &data) +{ + if (!engine) { + engine = new QScriptEngine(this); + } + searchResults.clear(); + + QScriptValue sv = engine->evaluate("(" + data + ")"); + if (sv.isValid()) { + sv = sv.property(recommendations_element); + if (sv.isValid()) { + QScriptValueIterator it(sv.property(recommendations_nearby_element)); + while (it.hasNext()) { + it.next(); + // array contains count as last element + if (it.name() != "length") { + processResultElement(it.value()); + } + } + emit finished(NoError, QString()); + return; + } + } + emit finished(ParsingError, QString("JSON data are invalid")); +} + +void QPlaceJSonRecommendationParser::processResultElement(const QScriptValue &value) +{ + QPlaceSearchResult result; + result.setType(QPlaceSearchResult::Place); + + // Processing properties + QScriptValue distance = value.property(recommendations_distance_element); + if (distance.isValid() && !distance.toString().isEmpty()) { + bool isConverted; + double distanceValue = distance.toString().toDouble(&isConverted); + if (isConverted) { + result.setDistance(distanceValue); + } + } + QScriptValue place = value.property(recommendations_place_element); + if (place.isValid()) { + QPlace newPlace = QPlaceJSonDetailsParser::buildPlace(place); + result.setPlace(newPlace); + searchResults.append(result); + } +} |