summaryrefslogtreecommitdiff
path: root/src/location/places/provider/qplacejsonmediaparser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/location/places/provider/qplacejsonmediaparser.cpp')
-rw-r--r--src/location/places/provider/qplacejsonmediaparser.cpp115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/location/places/provider/qplacejsonmediaparser.cpp b/src/location/places/provider/qplacejsonmediaparser.cpp
new file mode 100644
index 00000000..90b3ba0b
--- /dev/null
+++ b/src/location/places/provider/qplacejsonmediaparser.cpp
@@ -0,0 +1,115 @@
+#include "qplacejsonmediaparser.h"
+
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptValue>
+#include <QtScript/QScriptValueIterator>
+
+#include "../qplacemediaobject.h"
+#include "../qplacesupplier.h"
+#include "qplacesuppliersrepository.h"
+
+#if defined(QT_PLACE_LIBRARY)
+ #include <QDebug>
+#endif
+
+static const char *media_objects_element = "images";
+static const char *media_element = "image";
+static const char *media_count = "totalNumberOfImages";
+static const char *media_url = "url";
+static const char *media_provider_id = "provider";
+static const char *media_provider_name = "providerDisplayName";
+
+using namespace QT_PLACES_NAMESPACE;
+
+QPlaceJSonMediaParser::QPlaceJSonMediaParser(QObject *parent) :
+ QObject(parent),
+ engine(NULL),
+ allMedia(0)
+{
+}
+
+QPlaceJSonMediaParser::~QPlaceJSonMediaParser()
+{
+}
+
+QList<QPlaceMediaObject> QPlaceJSonMediaParser::resultMedia()
+{
+ return media;
+}
+
+uint QPlaceJSonMediaParser::allMediaCount()
+{
+ return allMedia;
+}
+
+QPlaceMediaObject QPlaceJSonMediaParser::buildMediaObject(const QScriptValue &media)
+{
+ QPlaceMediaObject newMedia;
+ QScriptValue value = media.property(media_url);
+ if (value.isValid() && !value.toString().isEmpty()) {
+ newMedia.setUrl(value.toString());
+ newMedia.setId(value.toString());
+ }
+
+ QString name, id, icon;
+ value = media.property(media_provider_name);
+ if (value.isValid() && !value.toString().isEmpty()) {
+ name = value.toString();
+ }
+ value = media.property(media_provider_id);
+ if (value.isValid() && !value.toString().isEmpty()) {
+ id = value.toString();
+ }
+ if (!name.isEmpty() || !id.isEmpty()) {
+ QPlaceSupplier sup;
+ sup.setName(name);
+ sup.setSupplierId(id);
+ newMedia.setSupplier(QPlaceSuppliersRepository::instance()->addSupplier(sup));
+ }
+
+ return newMedia;
+}
+
+void QPlaceJSonMediaParser::processData(const QString &data)
+{
+ if (!engine) {
+ engine = new QScriptEngine(this);
+ }
+ media.clear();
+
+ QScriptValue sv = engine->evaluate("(" + data + ")");
+ if (sv.isValid()) {
+ sv = sv.property(media_objects_element);
+ if (sv.isValid()) {
+ processMedia(sv);
+ emit finished(NoError, QString());
+ } else {
+ emit finished(ParsingError, QString("JSON data are invalid"));
+ }
+ } else {
+ emit finished(ParsingError, QString("JSON data are invalid"));
+ }
+}
+
+void QPlaceJSonMediaParser::processMedia(const QScriptValue &mediaElement)
+{
+ QScriptValue value = mediaElement.property(media_element);
+ if (value.isValid()) {
+ if (value.isArray()) {
+ QScriptValueIterator it(value);
+ while (it.hasNext()) {
+ it.next();
+ // array contains count as last element
+ if (it.name() != "length") {
+ media.append(buildMediaObject(it.value()));
+ }
+ }
+ } else {
+ media.append(buildMediaObject(value));
+ }
+ }
+ value = mediaElement.property(media_count);
+ if (value.isValid()) {
+ allMedia = value.toUInt32();
+ }
+}