summaryrefslogtreecommitdiff
path: root/src/plugins/geoservices/nokia
diff options
context:
space:
mode:
authorabcd <amos.choy@nokia.com>2012-05-15 18:56:11 +1000
committerQt by Nokia <qt-info@nokia.com>2012-05-25 03:01:15 +0200
commit6596ef821a3514384bff0b888e682ef29a5806e4 (patch)
tree67089aa3d4011cd8c9236e97d67b2add2aeb4f7d /src/plugins/geoservices/nokia
parent7178b9bd014d793a18b1ec1f7b2ff6df4b9e6e7f (diff)
downloadqtlocation-6596ef821a3514384bff0b888e682ef29a5806e4.tar.gz
Refactor to allow specification for nokia icons only
There is an plugin parmeter called places.icons.custom that defines whether custom 3rd party icons or nokia icons are presented to the user for the jsondb plugin. For the nokia plugins, nokia icons can be subdivded into two types. The first is explictly set icons, the second is icons generated from the categories. In both cases the base icon is identified by the nokiaIcon key and a base icon value. However in the case of a generated icon there is a nokiaIconGenerated key that is set to true. When saving a place to the jsondb plugin, if the icon is generated, the icon data is not saved to jsondb. The category data however always is. When the place is retrieved from jsondb, the base icon will be generated from the category data. If an icon is not generated, then the base icon is saved to jsondb under the "nokiaIcon" field. When the place is retried from jsondb, this field will be used to provide the base icon. Change-Id: I9100011c519185719cdd7b62e12c2386f7f0f8d7 Reviewed-by: Aaron McCarthy <aaron.mccarthy@nokia.com>
Diffstat (limited to 'src/plugins/geoservices/nokia')
-rw-r--r--src/plugins/geoservices/nokia/placesv2/jsonparserhelpers.cpp56
-rw-r--r--src/plugins/geoservices/nokia/placesv2/jsonparserhelpers.h15
-rw-r--r--src/plugins/geoservices/nokia/placesv2/qplacecontentreplyimpl.cpp12
-rw-r--r--src/plugins/geoservices/nokia/placesv2/qplacecontentreplyimpl.h4
-rw-r--r--src/plugins/geoservices/nokia/placesv2/qplacedetailsreplyimpl.cpp21
-rw-r--r--src/plugins/geoservices/nokia/placesv2/qplacerecommendationreplyimpl.cpp14
-rw-r--r--src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.cpp9
-rw-r--r--src/plugins/geoservices/nokia/qplacemanagerengine_nokiav2.cpp251
-rw-r--r--src/plugins/geoservices/nokia/qplacemanagerengine_nokiav2.h7
9 files changed, 276 insertions, 113 deletions
diff --git a/src/plugins/geoservices/nokia/placesv2/jsonparserhelpers.cpp b/src/plugins/geoservices/nokia/placesv2/jsonparserhelpers.cpp
index 0382716d..b606b86b 100644
--- a/src/plugins/geoservices/nokia/placesv2/jsonparserhelpers.cpp
+++ b/src/plugins/geoservices/nokia/placesv2/jsonparserhelpers.cpp
@@ -62,18 +62,16 @@ QGeoCoordinate parseCoordinate(const QJsonArray &coordinateArray)
return QGeoCoordinate(coordinateArray.at(0).toDouble(), coordinateArray.at(1).toDouble());
}
-QPlaceSupplier parseSupplier(const QJsonObject &supplierObject)
+QPlaceSupplier parseSupplier(const QJsonObject &supplierObject,
+ const QPlaceManagerEngineNokiaV2 *engine)
{
+ Q_ASSERT(engine);
+
QPlaceSupplier supplier;
supplier.setName(supplierObject.value(QLatin1String("title")).toString());
supplier.setUrl(supplierObject.value(QLatin1String("href")).toString());
- QVariantMap parameters;
- parameters.insert(QPlaceIcon::SingleUrl,
- QUrl(supplierObject.value(QLatin1String("icon")).toString()));
- QPlaceIcon icon;
- icon.setParameters(parameters);
- supplier.setIcon(icon);
+ supplier.setIcon(engine->icon(supplierObject.value(QLatin1String("icon")).toString()));
return supplier;
}
@@ -91,15 +89,8 @@ QPlaceCategory parseCategory(const QJsonObject &categoryObject,
const QString hrefPath(href.path());
category.setCategoryId(hrefPath.mid(hrefPath.lastIndexOf(QLatin1Char('/')) + 1));
- QString iconPath = engine->iconPath(
- categoryObject.value(QLatin1String("icon")).toString());
- QVariantMap parameters;
- parameters.insert(QPlaceIcon::SingleUrl,
- QUrl(iconPath));
- QPlaceIcon icon;
- icon.setParameters(parameters);
- category.setIcon(icon);
+ category.setIcon(engine->icon(categoryObject.value(QLatin1String("icon")).toString()));
return category;
}
@@ -133,19 +124,26 @@ QList<QPlaceContactDetail> parseContactDetails(const QJsonArray &contacts)
return contactDetails;
}
-QPlaceImage parseImage(const QJsonObject &imageObject)
+QPlaceImage parseImage(const QJsonObject &imageObject,
+ const QPlaceManagerEngineNokiaV2 *engine)
{
+ Q_ASSERT(engine);
+
QPlaceImage image;
image.setAttribution(imageObject.value(QLatin1String("attribution")).toString());
image.setUrl(imageObject.value(QLatin1String("src")).toString());
- image.setSupplier(parseSupplier(imageObject.value(QLatin1String("supplier")).toObject()));
+ image.setSupplier(parseSupplier(imageObject.value(QLatin1String("supplier")).toObject(),
+ engine));
return image;
}
-QPlaceReview parseReview(const QJsonObject &reviewObject)
+QPlaceReview parseReview(const QJsonObject &reviewObject,
+ const QPlaceManagerEngineNokiaV2 *engine)
{
+ Q_ASSERT(engine);
+
QPlaceReview review;
review.setDateTime(QDateTime::fromString(reviewObject.value(QLatin1String("date")).toString()));
@@ -169,7 +167,8 @@ QPlaceReview parseReview(const QJsonObject &reviewObject)
review.setLanguage(reviewObject.value(QLatin1String("language")).toString());
- review.setSupplier(parseSupplier(reviewObject.value(QLatin1String("supplier")).toObject()));
+ review.setSupplier(parseSupplier(reviewObject.value(QLatin1String("supplier")).toObject(),
+ engine));
//if (reviewObject.contains(QLatin1String("via"))) {
// QJsonObject viaObject = reviewObject.value(QLatin1String("via")).toObject();
@@ -178,8 +177,11 @@ QPlaceReview parseReview(const QJsonObject &reviewObject)
return review;
}
-QPlaceEditorial parseEditorial(const QJsonObject &editorialObject)
+QPlaceEditorial parseEditorial(const QJsonObject &editorialObject,
+ const QPlaceManagerEngineNokiaV2 *engine)
{
+ Q_ASSERT(engine);
+
QPlaceEditorial editorial;
editorial.setAttribution(editorialObject.value(QLatin1String("attribution")).toString());
@@ -188,7 +190,8 @@ QPlaceEditorial parseEditorial(const QJsonObject &editorialObject)
// QJsonObject viaObject = editorialObject.value(QLatin1String("via")).toObject();
//}
- editorial.setSupplier(parseSupplier(editorialObject.value(QLatin1String("supplier")).toObject()));
+ editorial.setSupplier(parseSupplier(editorialObject.value(QLatin1String("supplier")).toObject(),
+ engine));
editorial.setLanguage(editorialObject.value(QLatin1String("language")).toString());
editorial.setText(editorialObject.value(QLatin1String("description")).toString());
@@ -196,8 +199,11 @@ QPlaceEditorial parseEditorial(const QJsonObject &editorialObject)
}
void parseCollection(QPlaceContent::Type type, const QJsonObject &object,
- QPlaceContent::Collection *collection, int *totalCount)
+ QPlaceContent::Collection *collection, int *totalCount,
+ const QPlaceManagerEngineNokiaV2 *engine)
{
+ Q_ASSERT(engine);
+
if (totalCount)
*totalCount = object.value(QLatin1String("available")).toDouble();
@@ -212,13 +218,13 @@ void parseCollection(QPlaceContent::Type type, const QJsonObject &object,
switch (type) {
case QPlaceContent::ImageType:
- collection->insert(offset + i, parseImage(itemObject));
+ collection->insert(offset + i, parseImage(itemObject, engine));
break;
case QPlaceContent::ReviewType:
- collection->insert(offset + i, parseReview(itemObject));
+ collection->insert(offset + i, parseReview(itemObject, engine));
break;
case QPlaceContent::EditorialType:
- collection->insert(offset + i, parseEditorial(itemObject));
+ collection->insert(offset + i, parseEditorial(itemObject, engine));
break;
case QPlaceContent::NoType:
break;
diff --git a/src/plugins/geoservices/nokia/placesv2/jsonparserhelpers.h b/src/plugins/geoservices/nokia/placesv2/jsonparserhelpers.h
index c50831b6..4ab2789e 100644
--- a/src/plugins/geoservices/nokia/placesv2/jsonparserhelpers.h
+++ b/src/plugins/geoservices/nokia/placesv2/jsonparserhelpers.h
@@ -57,19 +57,24 @@ class QPlaceCategory;
class QPlaceManagerEngineNokiaV2;
QGeoCoordinate parseCoordinate(const QJsonArray &coordinateArray);
-QPlaceSupplier parseSupplier(const QJsonObject &supplierObject);
+QPlaceSupplier parseSupplier(const QJsonObject &supplierObject,
+ const QPlaceManagerEngineNokiaV2 *engine);
QPlaceCategory parseCategory(const QJsonObject &categoryObject,
const QPlaceManagerEngineNokiaV2 *engine);
QList<QPlaceCategory> parseCategories(const QJsonArray &categoryArray,
const QPlaceManagerEngineNokiaV2 *engine);
QList<QPlaceContactDetail> parseContactDetails(const QJsonArray &contacts);
-QPlaceImage parseImage(const QJsonObject &imageObject);
-QPlaceReview parseReview(const QJsonObject &reviewObject);
-QPlaceEditorial parseEditorial(const QJsonObject &editorialObject);
+QPlaceImage parseImage(const QJsonObject &imageObject,
+ const QPlaceManagerEngineNokiaV2 *engine);
+QPlaceReview parseReview(const QJsonObject &reviewObject,
+ const QPlaceManagerEngineNokiaV2 *engine);
+QPlaceEditorial parseEditorial(const QJsonObject &editorialObject,
+ const QPlaceManagerEngineNokiaV2 *engine);
void parseCollection(QPlaceContent::Type type, const QJsonObject &object,
- QPlaceContent::Collection *collection, int *totalCount);
+ QPlaceContent::Collection *collection, int *totalCount,
+ const QPlaceManagerEngineNokiaV2 *engine);
QT_END_NAMESPACE
diff --git a/src/plugins/geoservices/nokia/placesv2/qplacecontentreplyimpl.cpp b/src/plugins/geoservices/nokia/placesv2/qplacecontentreplyimpl.cpp
index 9eaddc84..2266ae56 100644
--- a/src/plugins/geoservices/nokia/placesv2/qplacecontentreplyimpl.cpp
+++ b/src/plugins/geoservices/nokia/placesv2/qplacecontentreplyimpl.cpp
@@ -46,8 +46,9 @@
**
****************************************************************************/
-#include "qplacecontentreplyimpl.h"
#include "jsonparserhelpers.h"
+#include "qplacecontentreplyimpl.h"
+#include "../qplacemanagerengine_nokiav2.h"
#include <QtCore/QJsonDocument>
#include <QtCore/QJsonObject>
@@ -55,10 +56,11 @@
QT_BEGIN_NAMESPACE
QPlaceContentReplyImpl::QPlaceContentReplyImpl(const QPlaceContentRequest &request,
- QNetworkReply *reply, QObject *parent)
-: QPlaceContentReply(parent), m_reply(reply)
-
+ QNetworkReply *reply,
+ QPlaceManagerEngineNokiaV2 *engine)
+ : QPlaceContentReply(engine), m_reply(reply), m_engine(engine)
{
+ Q_ASSERT(engine);
setRequest(request);
if (!m_reply)
@@ -101,7 +103,7 @@ void QPlaceContentReplyImpl::replyFinished()
QPlaceContent::Collection collection;
int totalCount;
- parseCollection(request().contentType(), object, &collection, &totalCount);
+ parseCollection(request().contentType(), object, &collection, &totalCount, m_engine);
setTotalCount(totalCount);
setContent(collection);
diff --git a/src/plugins/geoservices/nokia/placesv2/qplacecontentreplyimpl.h b/src/plugins/geoservices/nokia/placesv2/qplacecontentreplyimpl.h
index b9d08537..a79db196 100644
--- a/src/plugins/geoservices/nokia/placesv2/qplacecontentreplyimpl.h
+++ b/src/plugins/geoservices/nokia/placesv2/qplacecontentreplyimpl.h
@@ -55,6 +55,7 @@
QT_BEGIN_NAMESPACE
class QPlaceManager;
+class QPlaceManagerEngineNokiaV2;
class QPlaceContentReplyImpl : public QPlaceContentReply
{
@@ -62,7 +63,7 @@ class QPlaceContentReplyImpl : public QPlaceContentReply
public:
QPlaceContentReplyImpl(const QPlaceContentRequest &request, QNetworkReply *reply,
- QObject *parent = 0);
+ QPlaceManagerEngineNokiaV2 *engine);
~QPlaceContentReplyImpl();
void abort();
@@ -74,6 +75,7 @@ private slots:
private:
QNetworkReply *m_reply;
+ QPlaceManagerEngineNokiaV2 *m_engine;
};
QT_END_NAMESPACE
diff --git a/src/plugins/geoservices/nokia/placesv2/qplacedetailsreplyimpl.cpp b/src/plugins/geoservices/nokia/placesv2/qplacedetailsreplyimpl.cpp
index b0cbd2a0..0f76b891 100644
--- a/src/plugins/geoservices/nokia/placesv2/qplacedetailsreplyimpl.cpp
+++ b/src/plugins/geoservices/nokia/placesv2/qplacedetailsreplyimpl.cpp
@@ -217,13 +217,8 @@ void QPlaceDetailsReplyImpl::replyFinished()
place.setCategories(parseCategories(object.value(QLatin1String("categories")).toArray(),
m_engine));
- QString iconPath = m_engine->iconPath(
- object.value(QLatin1String("icon")).toString());
- QVariantMap parameters;
- parameters.insert(QPlaceIcon::SingleUrl, QUrl(iconPath));
- QPlaceIcon icon;
- icon.setParameters(parameters);
- place.setIcon(icon);
+ place.setIcon(m_engine->icon(object.value(QLatin1String("icon")).toString(),
+ place.categories()));
if (object.contains(QLatin1String("contacts"))) {
QJsonObject contactsObject = object.value(QLatin1String("contacts")).toObject();
@@ -252,8 +247,10 @@ void QPlaceDetailsReplyImpl::replyFinished()
if (object.contains(QLatin1String("attribution")))
place.setAttribution(object.value(QLatin1String("attribution")).toString());
- if (object.contains(QLatin1String("supplier")))
- place.setSupplier(parseSupplier(object.value(QLatin1String("supplier")).toObject()));
+ if (object.contains(QLatin1String("supplier"))) {
+ place.setSupplier(parseSupplier(object.value(QLatin1String("supplier")).toObject(),
+ m_engine));
+ }
if (object.contains(QLatin1String("ratings"))) {
QJsonObject ratingsObject = object.value(QLatin1String("ratings")).toObject();
@@ -295,7 +292,7 @@ void QPlaceDetailsReplyImpl::replyFinished()
parseCollection(QPlaceContent::ImageType,
mediaObject.value(QLatin1String("images")).toObject(),
- &collection, &totalCount);
+ &collection, &totalCount, m_engine);
place.setTotalContentCount(QPlaceContent::ImageType, totalCount);
place.setContent(QPlaceContent::ImageType, collection);
@@ -306,7 +303,7 @@ void QPlaceDetailsReplyImpl::replyFinished()
parseCollection(QPlaceContent::EditorialType,
mediaObject.value(QLatin1String("editorials")).toObject(),
- &collection, &totalCount);
+ &collection, &totalCount, m_engine);
place.setTotalContentCount(QPlaceContent::EditorialType, totalCount);
place.setContent(QPlaceContent::EditorialType, collection);
@@ -317,7 +314,7 @@ void QPlaceDetailsReplyImpl::replyFinished()
parseCollection(QPlaceContent::ReviewType,
mediaObject.value(QLatin1String("reviews")).toObject(),
- &collection, &totalCount);
+ &collection, &totalCount, m_engine);
place.setTotalContentCount(QPlaceContent::ReviewType, totalCount);
place.setContent(QPlaceContent::ReviewType, collection);
diff --git a/src/plugins/geoservices/nokia/placesv2/qplacerecommendationreplyimpl.cpp b/src/plugins/geoservices/nokia/placesv2/qplacerecommendationreplyimpl.cpp
index 4a1e4677..3f24f937 100644
--- a/src/plugins/geoservices/nokia/placesv2/qplacerecommendationreplyimpl.cpp
+++ b/src/plugins/geoservices/nokia/placesv2/qplacerecommendationreplyimpl.cpp
@@ -135,17 +135,11 @@ void QPlaceRecommendationReplyImpl::replyFinished()
place.setName(item.value(QLatin1String("title")).toString());
- QString iconPath = m_engine->iconPath(
- item.value(QLatin1String("icon")).toString());
- QVariantMap parameters;
- parameters.insert(QPlaceIcon::SingleUrl,
- QUrl(iconPath));
- QPlaceIcon icon;
- icon.setParameters(parameters);
- place.setIcon(icon);
-
place.setCategories(parseCategories(item.value(QLatin1String("categories")).toArray(),
- m_engine));
+ m_engine));
+
+ place.setIcon(m_engine->icon(item.value(QLatin1String("icon")).toString(),
+ place.categories()));
//QJsonArray having = item.value(QLatin1String("having")).toArray();
diff --git a/src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.cpp b/src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.cpp
index 550b70c2..3c29cdc1 100644
--- a/src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.cpp
+++ b/src/plugins/geoservices/nokia/placesv2/qplacesearchreplyimpl.cpp
@@ -145,14 +145,7 @@ void QPlaceSearchReplyImpl::replyFinished()
place.setName(item.value(QLatin1String("title")).toString());
- QVariantMap parameters;
- QString iconPath = m_engine->iconPath(
- item.value(QLatin1String("icon")).toString());
- parameters.insert(QPlaceIcon::SingleUrl,
- QUrl(iconPath));
- QPlaceIcon icon;
- icon.setParameters(parameters);
- place.setIcon(icon);
+ place.setIcon(m_engine->icon(item.value(QLatin1String("icon")).toString()));
place.setCategory(parseCategory(item.value(QLatin1String("category")).toObject(),
m_engine));
diff --git a/src/plugins/geoservices/nokia/qplacemanagerengine_nokiav2.cpp b/src/plugins/geoservices/nokia/qplacemanagerengine_nokiav2.cpp
index 7174b8e9..849f2b8c 100644
--- a/src/plugins/geoservices/nokia/qplacemanagerengine_nokiav2.cpp
+++ b/src/plugins/geoservices/nokia/qplacemanagerengine_nokiav2.cpp
@@ -60,6 +60,7 @@
#include "uri_constants.h"
#include <QtCore/QFile>
+#include <QtCore/QJsonArray>
#include <QtCore/QJsonDocument>
#include <QtCore/QJsonObject>
#include <QtCore/QStandardPaths>
@@ -89,6 +90,111 @@ static const int FIXED_CATEGORIES_indices[] = {
115, -1
};
+static const char * const NokiaIcon = "nokiaIcon";
+static const char * const IconPrefix = "iconPrefix";
+static const char * const NokiaIconGenerated = "nokiaIconGenerated";
+
+static const char * const IconThemeKey = "places.icons.theme";
+static const char * const LocalDataPathKey = "places.local_data_path";
+
+class CategoryParser
+{
+public:
+ CategoryParser();
+ bool parse(const QString &fileName);
+
+ QPlaceCategoryTree tree() const { return m_tree; }
+ QHash<QString, QUrl> restIdToIconHash() const { return m_restIdToIconHash; }
+
+ QString errorString() const;
+
+private:
+ void processCategory(int level, const QString &id,
+ const QString &parentId = QString());
+
+ QJsonObject m_exploreObject;
+ QPlaceCategoryTree m_tree;
+ QString m_errorString;
+
+ QHash<QString, QUrl> m_restIdToIconHash;
+};
+
+CategoryParser::CategoryParser()
+{
+}
+
+bool CategoryParser::parse(const QString &fileName)
+{
+ m_exploreObject = QJsonObject();
+ m_tree.clear();
+ m_errorString.clear();
+
+ QFile mappingFile(fileName);
+
+ if (mappingFile.open(QIODevice::ReadOnly)) {
+ QJsonDocument document = QJsonDocument::fromJson(mappingFile.readAll());
+ if (document.isObject()) {
+ QJsonObject docObject = document.object();
+ if (docObject.contains(QLatin1String("offline_explore"))) {
+ m_exploreObject = docObject.value(QLatin1String("offline_explore"))
+ .toObject();
+ if (m_exploreObject.contains(QLatin1String("ROOT"))) {
+ processCategory(0, QString());
+ return true;
+ }
+ } else {
+ m_errorString = fileName + QLatin1String("does not contain the "
+ "offline_explore property");
+ return false;
+ }
+ } else {
+ m_errorString = fileName + QLatin1String("is not an json object");
+ return false;
+ }
+ }
+ m_errorString = QString::fromLatin1("Unable to open ") + fileName;
+ return false;
+}
+
+void CategoryParser::processCategory(int level, const QString &id, const QString &parentId)
+{
+ //We are basing the tree on a DAG from the input file, however we are simplyfing
+ //this into a 2 level tree, and a given category only has one parent
+ //
+ // A->B->Z
+ // A->C->Z
+ // Z in this case is not in the tree because it is 3 levels deep.
+ //
+ // X->Z
+ // Y->Z
+ // Only one of these is shown in the tree since Z can only have one parent
+ // the choice made between X and Y is arbitrary.
+ const int maxLevel = 2;
+ PlaceCategoryNode node;
+ node.category.setCategoryId(id);
+ node.parentId = parentId;
+
+ m_tree.insert(node.category.categoryId(), node);
+ //this is simply to mark the node as being visited.
+ //a proper assignment to the tree happens at the end of function
+
+ QJsonObject categoryJson = m_exploreObject.value(id.isEmpty()
+ ? QLatin1String("ROOT") : id).toObject();
+ QJsonArray children = categoryJson.value(QLatin1String("children")).toArray();
+
+ if (level + 1 <= maxLevel && !categoryJson.contains(QLatin1String("final"))) {
+ for (int i = 0; i < children.count(); ++i) {
+ QString childId = children.at(i).toString();
+ if (!m_tree.contains(childId)) {
+ node.childIds.append(childId);
+ processCategory(level + 1, childId, id);
+ }
+ }
+ }
+
+ m_tree.insert(node.category.categoryId(), node);
+}
+
QPlaceManagerEngineNokiaV2::QPlaceManagerEngineNokiaV2(
QGeoNetworkAccessManager *networkManager,
const QMap<QString, QVariant> &parameters,
@@ -106,12 +212,12 @@ QPlaceManagerEngineNokiaV2::QPlaceManagerEngineNokiaV2(
m_appId = parameters.value(QLatin1String("app_id")).toString();
m_appCode = parameters.value(QLatin1String("token")).toString();
- m_theme = parameters.value("places.theme", QString()).toString();
+ m_theme = parameters.value(IconThemeKey, QString()).toString();
if (m_theme == QLatin1String("default"))
m_theme.clear();
- m_localDataPath = parameters.value(QLatin1String("local_data_path"), QString()).toString();
+ m_localDataPath = parameters.value(LocalDataPathKey, QString()).toString();
if (m_localDataPath.isEmpty()) {
QStringList dataLocations = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
@@ -474,20 +580,39 @@ QPlaceReply *QPlaceManagerEngineNokiaV2::initializeCategories()
if (m_categoryReply)
return m_categoryReply.data();
- for (int i = 0; FIXED_CATEGORIES_indices[i] != -1; ++i) {
- const QString id = QString::fromLatin1(FIXED_CATEGORIES_string +
- FIXED_CATEGORIES_indices[i]);
+ m_tempTree.clear();
+ CategoryParser parser;
- QUrl requestUrl(QString::fromLatin1("http://")
- + m_uriProvider->getCurrentHost()
- + QLatin1String("/v1/categories/places/") + id);
- QNetworkReply *networkReply = sendRequest(requestUrl);
- connect(networkReply, SIGNAL(finished()), this, SLOT(categoryReplyFinished()));
- connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
- this, SLOT(categoryReplyError()));
+ if (!parser.parse(m_localDataPath + QLatin1String("/offline/offline-mapping.json"))) {
+ PlaceCategoryNode rootNode;
- m_categoryRequests.insert(id, networkReply);
- }
+ for (int i = 0; FIXED_CATEGORIES_indices[i] != -1; ++i) {
+ const QString id = QString::fromLatin1(FIXED_CATEGORIES_string +
+ FIXED_CATEGORIES_indices[i]);
+ m_tempTree.insert(id, PlaceCategoryNode());
+ rootNode.childIds.append(id);
+ }
+
+ m_tempTree.insert(QString(), rootNode);
+ } else {
+ m_tempTree = parser.tree();
+ }
+
+ //request all categories in the tree from the server
+ //because we don't want the root node, we remove it from the list
+ QStringList ids = m_tempTree.keys();
+ ids.removeAll(QString());
+ foreach (const QString &id, ids) {
+ QUrl requestUrl(QString::fromLatin1("http://")
+ + m_uriProvider->getCurrentHost()
+ + QLatin1String("/v1/categories/places/") + id);
+ QNetworkReply *networkReply = sendRequest(requestUrl);
+ connect(networkReply, SIGNAL(finished()), this, SLOT(categoryReplyFinished()));
+ connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)),
+ this, SLOT(categoryReplyError()));
+
+ m_categoryRequests.insert(id, networkReply);
+ }
QPlaceCategoriesReplyImpl *reply = new QPlaceCategoriesReplyImpl(this);
connect(reply, SIGNAL(finished()), this, SLOT(replyFinished()));
@@ -531,29 +656,68 @@ void QPlaceManagerEngineNokiaV2::setLocales(const QList<QLocale> &locales)
m_locales = locales;
}
-QString QPlaceManagerEngineNokiaV2::iconPath(const QString &remotePath) const
+QPlaceIcon QPlaceManagerEngineNokiaV2::icon(const QString &remotePath,
+ const QList<QPlaceCategory> &categories) const
{
- if (remotePath.isEmpty())
- return QString();
+ QPlaceIcon icon;
+ QVariantMap params;
+
+ QRegExp rx("(.*)(/icons/categories/.*)");
+
+ QString iconPrefix;
+ QString nokiaIcon;
+ if (rx.indexIn(remotePath) != -1 && !rx.cap(1).isEmpty() && !rx.cap(2).isEmpty()) {
+ iconPrefix = rx.cap(1);
+ nokiaIcon = rx.cap(2);
+
+ if (QFile::exists(m_localDataPath + nokiaIcon))
+ iconPrefix = QString::fromLatin1("file://") + m_localDataPath;
- QString remoteIcon = remotePath
- + (!m_theme.isEmpty() ? QLatin1Char('.') + m_theme : QString());
+ params.insert(NokiaIcon, nokiaIcon);
+ params.insert(IconPrefix, iconPrefix);
- if (!remotePath.contains(QLatin1String("/icons/categories/"))
- || m_localDataPath.isEmpty()) {
- return remoteIcon;
+ foreach (const QPlaceCategory &category, categories) {
+ if (category.icon().parameters().value(NokiaIcon) == nokiaIcon) {
+ params.insert(NokiaIconGenerated, true);
+ break;
+ }
+ }
+ } else {
+ QString path = remotePath + (!m_theme.isEmpty()
+ ? QLatin1Char('.') + m_theme : QString());
+ params.insert(QPlaceIcon::SingleUrl, QUrl(path));
+
+ if (!nokiaIcon.isEmpty()) {
+ params.insert(NokiaIcon, nokiaIcon);
+ params.insert(IconPrefix, iconPrefix);
+ params.insert(NokiaIconGenerated, true);
+ }
}
- QString localIcon = remotePath.mid(remotePath.lastIndexOf(QLatin1Char('/')) + 1);
- localIcon.prepend(m_localDataPath + QLatin1String("/icons/categories/"));
+ icon.setParameters(params);
+ return icon;
+}
- if (!m_theme.isEmpty())
- localIcon.append(QLatin1Char('.') + m_theme);
+QUrl QPlaceManagerEngineNokiaV2::constructIconUrl(const QPlaceIcon &icon,
+ const QSize &size) const
+{
+ QVariantMap params = icon.parameters();
+ QString nokiaIcon = params.value(NokiaIcon).toString();
+
+ if (!nokiaIcon.isEmpty()) {
+ nokiaIcon.append(!m_theme.isEmpty() ?
+ QLatin1Char('.') + m_theme : QString());
+
+ if (params.contains(IconPrefix)) {
+ return QUrl(params.value(IconPrefix).toString() +
+ nokiaIcon);
+ } else {
+ return QUrl(QString::fromLatin1("file://") + m_localDataPath
+ + nokiaIcon);
+ }
+ }
- if (QFile::exists(localIcon))
- return QString::fromLatin1("file://") + localIcon;
- else
- return remoteIcon;
+ return QUrl();
}
void QPlaceManagerEngineNokiaV2::replyFinished()
@@ -589,29 +753,24 @@ void QPlaceManagerEngineNokiaV2::categoryReplyFinished()
QJsonObject category = document.object();
- PlaceCategoryNode node;
- node.category.setCategoryId(category.value(QLatin1String("categoryId")).toString());
- node.category.setName(category.value(QLatin1String("name")).toString());
-
- QString iconPath = QPlaceManagerEngineNokiaV2::iconPath(
- category.value(QLatin1String("icon")).toString());
- QVariantMap parameters;
- parameters.insert(QPlaceIcon::SingleUrl,
- QUrl(iconPath));
- QPlaceIcon icon;
- icon.setParameters(parameters);
- node.category.setIcon(icon);
+ QString categoryId = category.value(QLatin1String("categoryId")).toString();
+ if (m_tempTree.contains(categoryId)) {
+ PlaceCategoryNode node = m_tempTree.value(categoryId);
+ node.category.setName(category.value(QLatin1String("name")).toString());
+ node.category.setCategoryId(categoryId);
+ node.category.setIcon(icon(category.value(QLatin1String("icon")).toString()));
- m_categoryTree.insert(node.category.categoryId(), node);
-
- m_categoryTree[QString()].childIds.append(node.category.categoryId());
+ m_tempTree.insert(categoryId, node);
+ }
}
m_categoryRequests.remove(m_categoryRequests.key(reply));
reply->deleteLater();
- if (m_categoryRequests.isEmpty() && m_categoryReply)
+ if (m_categoryRequests.isEmpty() && m_categoryReply) {
+ m_categoryTree = m_tempTree;
m_categoryReply.data()->emitFinished();
+ }
}
void QPlaceManagerEngineNokiaV2::categoryReplyError()
diff --git a/src/plugins/geoservices/nokia/qplacemanagerengine_nokiav2.h b/src/plugins/geoservices/nokia/qplacemanagerengine_nokiav2.h
index 2002af39..64c71ff6 100644
--- a/src/plugins/geoservices/nokia/qplacemanagerengine_nokiav2.h
+++ b/src/plugins/geoservices/nokia/qplacemanagerengine_nokiav2.h
@@ -107,7 +107,10 @@ public:
QList<QLocale> locales() const;
void setLocales(const QList<QLocale> &locales);
- QString iconPath(const QString &remotePath) const;
+ QPlaceIcon icon(const QString &remotePath,
+ const QList<QPlaceCategory> &categories = QList<QPlaceCategory>()) const;
+
+ QUrl constructIconUrl(const QPlaceIcon &icon, const QSize &size) const;
private:
QNetworkReply *sendRequest(const QUrl &url);
@@ -126,6 +129,8 @@ private:
QList<QLocale> m_locales;
QPlaceCategoryTree m_categoryTree;
+ QPlaceCategoryTree m_tempTree;
+ QHash<QString, QString> m_restIdToIconHash;
QWeakPointer<QPlaceCategoriesReplyImpl> m_categoryReply;
QHash<QString, QNetworkReply *> m_categoryRequests;