File indexing completed on 2024-05-12 05:22:24
0001 /* 0002 SPDX-FileCopyrightText: 2012 Jan Grulich <grulja@gmail.com> 0003 0004 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0005 */ 0006 0007 #include "latitudeservice.h" 0008 #include "location.h" 0009 0010 #include <QJsonDocument> 0011 #include <QUrlQuery> 0012 #include <QVariant> 0013 #include <QVariantMap> 0014 0015 namespace KGAPI2 0016 { 0017 0018 namespace LatitudeService 0019 { 0020 0021 namespace Private 0022 { 0023 LocationPtr parseLocation(const QVariantMap &map); 0024 0025 static const QUrl GoogleApisUrl(QStringLiteral("https://www.googleapis.com")); 0026 static const QString LocationBasePath(QStringLiteral("/latitude/v1/location")); 0027 static const QString CurrentLocationBasePath(QStringLiteral("/latitude/v1/currentLocation")); 0028 } 0029 0030 LocationPtr JSONToLocation(const QByteArray &jsonData) 0031 { 0032 QJsonDocument document = QJsonDocument::fromJson(jsonData); 0033 if (document.isNull()) { 0034 return LocationPtr(); 0035 } 0036 const QVariantMap data = document.toVariant().toMap(); 0037 const QVariantMap info = data.value(QStringLiteral("data")).toMap(); 0038 0039 return Private::parseLocation(info); 0040 } 0041 0042 QByteArray locationToJSON(const LocationPtr &location) 0043 { 0044 QVariantMap map; 0045 QVariantMap output; 0046 0047 map.insert(QStringLiteral("kind"), QStringLiteral("latitude#location")); 0048 map.insert(QStringLiteral("latitude"), QString::number(location->latitude())); 0049 map.insert(QStringLiteral("longitude"), QString::number(location->longitude())); 0050 0051 if (location->timestamp() != 0) { 0052 map.insert(QStringLiteral("timestampMs"), location->timestamp()); 0053 } 0054 if (location->accuracy() != -1) { 0055 map.insert(QStringLiteral("accuracy"), location->accuracy()); 0056 } 0057 if (location->speed() != -1) { 0058 map.insert(QStringLiteral("speed"), location->speed()); 0059 } 0060 if (location->heading() != -1) { 0061 map.insert(QStringLiteral("heading"), location->heading()); 0062 } 0063 0064 map.insert(QStringLiteral("altitude"), location->altitude()); 0065 0066 if (location->altitudeAccuracy() != 0) { 0067 map.insert(QStringLiteral("altitudeAccuracy"), location->altitudeAccuracy()); 0068 } 0069 0070 output.insert(QStringLiteral("data"), map); 0071 0072 QJsonDocument document = QJsonDocument::fromVariant(output); 0073 return document.toJson(QJsonDocument::Compact); 0074 } 0075 0076 ObjectsList parseLocationJSONFeed(const QByteArray &jsonFeed, FeedData &feedData) 0077 { 0078 Q_UNUSED(feedData) 0079 0080 ObjectsList output; 0081 0082 QJsonDocument document = QJsonDocument::fromJson(jsonFeed); 0083 const QVariantMap map = document.toVariant().toMap(); 0084 const QVariantMap data = map.value(QStringLiteral("data")).toMap(); 0085 const QVariantList items = data.value(QStringLiteral("items")).toList(); 0086 output.reserve(items.size()); 0087 for (const QVariant &c : items) { 0088 QVariantMap location = c.toMap(); 0089 output << Private::parseLocation(location).dynamicCast<Object>(); 0090 } 0091 0092 return output; 0093 } 0094 0095 LocationPtr Private::parseLocation(const QVariantMap &map) 0096 { 0097 LocationPtr location(new Location); 0098 0099 if (map.contains(QStringLiteral("timestampMs"))) { 0100 location->setTimestamp(map.value(QStringLiteral("timestampMs")).toULongLong()); 0101 } 0102 if (map.contains(QStringLiteral("latitude"))) { 0103 location->setLatitude(map.value(QStringLiteral("latitude")).toFloat()); 0104 } 0105 if (map.contains(QStringLiteral("longitude"))) { 0106 location->setLongitude(map.value(QStringLiteral("longitude")).toFloat()); 0107 } 0108 if (map.contains(QStringLiteral("accuracy"))) { 0109 location->setAccuracy(map.value(QStringLiteral("accuracy")).toInt()); 0110 } 0111 if (map.contains(QStringLiteral("speed"))) { 0112 location->setSpeed(map.value(QStringLiteral("speed")).toInt()); 0113 } 0114 if (map.contains(QStringLiteral("heading"))) { 0115 location->setHeading(map.value(QStringLiteral("heading")).toInt()); 0116 } 0117 if (map.contains(QStringLiteral("altitude"))) { 0118 location->setAltitude(map.value(QStringLiteral("altitude")).toInt()); 0119 } 0120 if (map.contains(QStringLiteral("altitudeAccuracy"))) { 0121 location->setAltitudeAccuracy(map.value(QStringLiteral("altitudeAccuracy")).toInt()); 0122 } 0123 0124 return location; 0125 } 0126 0127 QString APIVersion() 0128 { 0129 return QStringLiteral("1"); 0130 } 0131 0132 QUrl retrieveCurrentLocationUrl(const Latitude::Granularity granularity) 0133 { 0134 QUrl url(Private::GoogleApisUrl); 0135 url.setPath(Private::CurrentLocationBasePath); 0136 QUrlQuery query(url); 0137 if (granularity == Latitude::City) { 0138 query.addQueryItem(QStringLiteral("granularity"), QStringLiteral("city")); 0139 } else if (granularity == Latitude::Best) { 0140 query.addQueryItem(QStringLiteral("granularity"), QStringLiteral("best")); 0141 } 0142 url.setQuery(query); 0143 0144 return url; 0145 } 0146 0147 QUrl deleteCurrentLocationUrl() 0148 { 0149 QUrl url(Private::GoogleApisUrl); 0150 url.setPath(Private::CurrentLocationBasePath); 0151 return url; 0152 } 0153 0154 QUrl insertCurrentLocationUrl() 0155 { 0156 QUrl url(Private::GoogleApisUrl); 0157 url.setPath(Private::CurrentLocationBasePath); 0158 return url; 0159 } 0160 0161 QUrl locationHistoryUrl(const Latitude::Granularity granularity, const int maxResults, const qlonglong maxTime, const qlonglong minTime) 0162 { 0163 QUrl url(Private::GoogleApisUrl); 0164 url.setPath(Private::LocationBasePath); 0165 QUrlQuery query(url); 0166 if (granularity == Latitude::City) { 0167 query.addQueryItem(QStringLiteral("granularity"), QStringLiteral("city")); 0168 } else if (granularity == Latitude::Best) { 0169 query.addQueryItem(QStringLiteral("granularity"), QStringLiteral("best")); 0170 } 0171 0172 if (maxResults > 0) { 0173 query.addQueryItem(QStringLiteral("max-results"), QString::number(maxResults)); 0174 } 0175 0176 if ((maxTime > 0) && (maxTime >= minTime)) { 0177 query.addQueryItem(QStringLiteral("max-time"), QString::number(maxTime)); 0178 } 0179 0180 if ((minTime > 0) && (minTime <= maxTime)) { 0181 query.addQueryItem(QStringLiteral("min-time"), QString::number(minTime)); 0182 } 0183 url.setQuery(query); 0184 0185 return url; 0186 } 0187 0188 QUrl retrieveLocationUrl(const qlonglong id, const Latitude::Granularity granularity) 0189 { 0190 QUrl url(Private::GoogleApisUrl); 0191 url.setPath(Private::LocationBasePath % QLatin1Char('/') % QString::number(id)); 0192 QUrlQuery query(url); 0193 if (granularity == Latitude::City) { 0194 query.addQueryItem(QStringLiteral("granularity"), QStringLiteral("city")); 0195 } else if (granularity == Latitude::Best) { 0196 query.addQueryItem(QStringLiteral("granularity"), QStringLiteral("best")); 0197 } 0198 url.setQuery(query); 0199 0200 return url; 0201 } 0202 0203 QUrl insertLocationUrl() 0204 { 0205 QUrl url(Private::GoogleApisUrl); 0206 url.setPath(Private::LocationBasePath); 0207 return url; 0208 } 0209 0210 QUrl deleteLocationUrl(const qlonglong id) 0211 { 0212 Q_UNUSED(id) 0213 QUrl url(Private::GoogleApisUrl); 0214 url.setPath(Private::LocationBasePath); 0215 return url; 0216 } 0217 0218 } // namespace LatitudeService 0219 0220 } // namespace KGAPI2