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