File indexing completed on 2024-12-08 07:19:11
0001 /* 0002 SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "locationrequest.h" 0008 #include "datatypes/datatypes_p.h" 0009 #include "datatypes/json_p.h" 0010 #include "datatypes/locationutil_p.h" 0011 0012 #include <QCryptographicHash> 0013 #include <QDebug> 0014 #include <QMetaEnum> 0015 #include <QSharedData> 0016 #include <QStringList> 0017 0018 #include <cmath> 0019 0020 using namespace KPublicTransport; 0021 0022 namespace KPublicTransport { 0023 class LocationRequestPrivate : public QSharedData { 0024 public: 0025 Location location; 0026 QStringList backendIds; 0027 int maximumDistance = 1000; 0028 int maximumResults = 10; 0029 Location::Types types = Location::Stop | Location::RentedVehicleStation; 0030 }; 0031 } 0032 0033 KPUBLICTRANSPORT_MAKE_GADGET(LocationRequest) 0034 KPUBLICTRANSPORT_MAKE_PROPERTY(LocationRequest, int, maximumDistance, setMaximumDistance) 0035 KPUBLICTRANSPORT_MAKE_PROPERTY(LocationRequest, int, maximumResults, setMaximumResults) 0036 KPUBLICTRANSPORT_MAKE_PROPERTY(LocationRequest, Location::Types, types, setTypes) 0037 0038 LocationRequest::LocationRequest(const Location &locaction) 0039 : d(new LocationRequestPrivate) 0040 { 0041 d->location = locaction; 0042 } 0043 0044 bool LocationRequest::isValid() const 0045 { 0046 return hasCoordinate() || !d->location.name().isEmpty(); 0047 } 0048 0049 Location LocationRequest::location() const 0050 { 0051 return d->location; 0052 } 0053 0054 void LocationRequest::setLocation(const Location &location) 0055 { 0056 d.detach(); 0057 d->location = location; 0058 } 0059 0060 float LocationRequest::latitude() const 0061 { 0062 return d->location.latitude(); 0063 } 0064 0065 void LocationRequest::setLatitude(float lat) 0066 { 0067 d.detach(); 0068 d->location.setLatitude(lat); 0069 } 0070 0071 float LocationRequest::longitude() const 0072 { 0073 return d->location.longitude(); 0074 } 0075 0076 void LocationRequest::setLongitude(float lon) 0077 { 0078 d.detach(); 0079 d->location.setLongitude(lon); 0080 } 0081 0082 void LocationRequest::setCoordinate(float lat, float lon) 0083 { 0084 d.detach(); 0085 d->location.setCoordinate(lat, lon); 0086 } 0087 0088 bool LocationRequest::hasCoordinate() const 0089 { 0090 return d->location.hasCoordinate(); 0091 } 0092 0093 QString LocationRequest::name() const 0094 { 0095 if (d->location.name().isEmpty()) { 0096 return QString(d->location.locality() + QLatin1Char(' ') + d->location.streetAddress()).trimmed(); 0097 } 0098 return d->location.name(); 0099 } 0100 0101 void LocationRequest::setName(const QString &name) 0102 { 0103 d.detach(); 0104 d->location.setName(name); 0105 } 0106 0107 QString LocationRequest::cacheKey() const 0108 { 0109 QCryptographicHash hash(QCryptographicHash::Sha1); 0110 hash.addData(LocationUtil::cacheKey(d->location).toUtf8()); 0111 const auto me = QMetaEnum::fromType<Location::Types>(); 0112 hash.addData(me.valueToKeys(types())); 0113 hash.addData(QByteArray::number(maximumDistance())); 0114 hash.addData(QByteArray::number(maximumResults())); 0115 return QString::fromUtf8(hash.result().toHex()); 0116 } 0117 0118 QJsonObject LocationRequest::toJson(const LocationRequest &req) 0119 { 0120 auto obj = Json::toJson(req); 0121 obj.insert(QLatin1String("location"), Location::toJson(req.location())); 0122 return obj; 0123 } 0124 0125 QStringList LocationRequest::backendIds() const 0126 { 0127 return d->backendIds; 0128 } 0129 0130 void LocationRequest::setBackendIds(const QStringList &backendIds) 0131 { 0132 d.detach(); 0133 d->backendIds = backendIds; 0134 } 0135 0136 #include "moc_locationrequest.cpp"