From 86cced782efed9518084dc21b54ee7ccec2af877 Mon Sep 17 00:00:00 2001 From: John Maguire Date: Wed, 20 Jun 2012 12:18:51 +0200 Subject: [PATCH] Add geolocator. --- src/CMakeLists.txt | 2 ++ src/internet/geolocator.cpp | 69 +++++++++++++++++++++++++++++++++++++ src/internet/geolocator.h | 42 ++++++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 src/internet/geolocator.cpp create mode 100644 src/internet/geolocator.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 195ad6c30..3436e149f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -158,6 +158,7 @@ set(SOURCES internet/digitallyimportedservicebase.cpp internet/digitallyimportedsettingspage.cpp internet/digitallyimportedurlhandler.cpp + internet/geolocator.cpp internet/groovesharkradio.cpp internet/groovesharksearchplaylisttype.cpp internet/groovesharkservice.cpp @@ -427,6 +428,7 @@ set(HEADERS internet/digitallyimportedclient.h internet/digitallyimportedservicebase.h internet/digitallyimportedsettingspage.h + internet/geolocator.h internet/groovesharkservice.h internet/groovesharksettingspage.h internet/groovesharkurlhandler.h diff --git a/src/internet/geolocator.cpp b/src/internet/geolocator.cpp new file mode 100644 index 000000000..d8d8d09a5 --- /dev/null +++ b/src/internet/geolocator.cpp @@ -0,0 +1,69 @@ +#include "geolocator.h" + +#include + +#include + +#include + +#include "core/closure.h" + +const char* Geolocator::kUrl = "https://data.clementine-player.org/geolocate"; + +using std::numeric_limits; + +Geolocator::LatLng::LatLng() + : lat_e6_(numeric_limits::min()), + lng_e6_(numeric_limits::min()) { +} + +Geolocator::LatLng::LatLng(int lat_e6, int lng_e6) + : lat_e6_(lat_e6), + lng_e6_(lng_e6) { +} + +bool Geolocator::LatLng::IsValid() const { + return lat_e6_ != numeric_limits::min() && + lng_e6_ != numeric_limits::min(); +} + +Geolocator::Geolocator(QObject* parent) + : QObject(parent) { +} + +void Geolocator::Geolocate() { + QNetworkRequest req = QNetworkRequest(QUrl(kUrl)); + QNetworkReply* reply = network_.get(req); + NewClosure(reply, SIGNAL(finished()), this, SLOT(RequestFinished())); +} + +void Geolocator::RequestFinished(QNetworkReply* reply) { + reply->deleteLater(); + if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) != 200) { + emit Finished(LatLng()); + return; + } + + QJson::Parser parser; + bool ok = false; + QVariant result = parser.parse(reply, &ok); + if (!ok) { + emit Finished(LatLng()); + return; + } + + QVariantMap map = result.toMap(); + QString latlng = map["latlng"].toString(); + QStringList split = latlng.split(","); + if (split.length() != 2) { + emit Finished(LatLng()); + return; + } + + double lat = split[0].toDouble(); + double lng = split[1].toDouble(); + + emit Finished( + LatLng(static_cast(lat * 1e6), + static_cast(lng * 1e6))); +} diff --git a/src/internet/geolocator.h b/src/internet/geolocator.h new file mode 100644 index 000000000..340f97ba7 --- /dev/null +++ b/src/internet/geolocator.h @@ -0,0 +1,42 @@ +#ifndef GEOLOCATOR_H +#define GEOLOCATOR_H + +#include + +#include "core/network.h" + +class Geolocator : public QObject { + Q_OBJECT + public: + explicit Geolocator(QObject* parent = 0); + + void Geolocate(); + + class LatLng { + public: + LatLng(); + LatLng(int lat_e6, int lng_e6); + + int lat_e6() const { return lat_e6_; } + int lng_e6() const { return lng_e6_; } + + bool IsValid() const; + + private: + const int lat_e6_; + const int lng_e6_; + }; + + signals: + void Finished(LatLng latlng); + + private slots: + void RequestFinished(QNetworkReply* reply); + + private: + NetworkAccessManager network_; + + static const char* kUrl; +}; + +#endif // GEOLOCATOR_H