From 57e4609bc7d9b59f524aa1f8a91859dc196d6ada Mon Sep 17 00:00:00 2001 From: vng Date: Fri, 21 Mar 2014 12:45:58 +0300 Subject: [PATCH] Fixed "geo" url scheme parsing - support Instagram format. --- .../maps/DownloadResourcesActivity.java | 15 ++- map/geourl_process.cpp | 100 +++++++++--------- map/map_tests/geourl_test.cpp | 12 ++- 3 files changed, 73 insertions(+), 54 deletions(-) diff --git a/android/src/com/mapswithme/maps/DownloadResourcesActivity.java b/android/src/com/mapswithme/maps/DownloadResourcesActivity.java index 33ca65dd74..23557dda4a 100644 --- a/android/src/com/mapswithme/maps/DownloadResourcesActivity.java +++ b/android/src/com/mapswithme/maps/DownloadResourcesActivity.java @@ -618,7 +618,10 @@ public class DownloadResourcesActivity extends MapsWithMeBaseActivity @Override public boolean processIntent(Intent intent) { - mMapTaskToForward = new OpenUrlTask(intent.getData().toString()); + final String url = intent.getData().toString(); + Log.i(TAG, "Query = " + url); + + mMapTaskToForward = new OpenUrlTask(url); return true; } } @@ -634,7 +637,10 @@ public class DownloadResourcesActivity extends MapsWithMeBaseActivity @Override public boolean processIntent(Intent intent) { - mMapTaskToForward = new OpenUrlTask(intent.getData().toString()); + final String url = intent.getData().toString(); + Log.i(TAG, "Query = " + url); + + mMapTaskToForward = new OpenUrlTask(url); return true; } } @@ -660,6 +666,8 @@ public class DownloadResourcesActivity extends MapsWithMeBaseActivity final Uri data = intent.getData(); if (data != null) { + Log.i(TAG, "Query = " + data.toString()); + final String ge0Url = "ge0:/" + data.getPath(); mMapTaskToForward = new OpenUrlTask(ge0Url); return true; @@ -728,6 +736,8 @@ public class DownloadResourcesActivity extends MapsWithMeBaseActivity final Uri data = intent.getData(); if (data != null) { + Log.i(TAG, "Query = " + data.toString()); + final Pattern pattern = Pattern.compile("(-?\\d+\\.?,?)+"); String ll = extractCoordinates(data.getQueryParameter("ll"), pattern); @@ -748,7 +758,6 @@ public class DownloadResourcesActivity extends MapsWithMeBaseActivity public static String EXTRA_COUNTRY_INDEX = ".extra.index"; private class OpenCountryTaskProcessor implements IntentProcessor { - @Override public boolean isIntentSupported(Intent intent) { diff --git a/map/geourl_process.cpp b/map/geourl_process.cpp index ea219a5fb1..4c12728e87 100644 --- a/map/geourl_process.cpp +++ b/map/geourl_process.cpp @@ -23,23 +23,16 @@ namespace url_scheme { Info & m_info; - enum TMode { START, LAT, LON, ZOOM, FINISH }; + enum TMode { START, LAT, LON, ZOOM, TOKEN }; TMode m_mode; - static void ToDouble(string const & token, double & d) - { - double temp; - if (strings::to_double(token, temp)) - d = temp; - } - bool CheckKeyword(string const & token) { - if (token == "lat" || token == "point") + if (token == "lat" || token == "point" || token == "q") m_mode = LAT; else if (token == "lon") m_mode = LON; - else if (token == "zoom") + else if (token == "zoom" || token == "z") m_mode = ZOOM; else return false; @@ -47,72 +40,79 @@ namespace url_scheme return true; } + void CorrectZoomBounds(double & x) + { + if (x < 0.0) + x = 0.0; + int const upperScale = scales::GetUpperScale(); + if (x > upperScale) + x = upperScale; + } + public: DoGeoParse(Info & info) : m_info(info), m_mode(START) { } - void operator()(string const & token) + bool operator()(string const & token) { + // Check correct scheme and initialize mode. + if (m_mode == START) + { + if (token != "geo") + return false; + else + { + m_mode = LAT; + return true; + } + } + + // Check for any keyword. + if (CheckKeyword(token)) + return true; + else if (m_mode == TOKEN) + return false; + + // Expect double value. + double x; + if (!strings::to_double(token, x)) + return false; + + // Assign value to the expected field. switch (m_mode) { - case START: - // Only geo scheme is supported by this parser - if (token != "geo") - m_mode = FINISH; - else - m_mode = LAT; - break; - case LAT: - if (!CheckKeyword(token)) - { - ToDouble(token, m_info.m_lat); - m_mode = LON; - } + m_info.m_lat = x; + m_mode = LON; break; case LON: - if (!CheckKeyword(token)) - { - ToDouble(token, m_info.m_lon); - m_mode = ZOOM; - } + m_info.m_lon = x; + m_mode = TOKEN; break; case ZOOM: - if (!CheckKeyword(token)) - { - ToDouble(token, m_info.m_zoom); - - // validate zoom bounds - if (m_info.m_zoom < 0.0) - m_info.m_zoom = 0.0; - int const upperScale = scales::GetUpperScale(); - if (m_info.m_zoom > upperScale) - m_info.m_zoom = upperScale; - - m_mode = FINISH; - } + CorrectZoomBounds(x); + m_info.m_zoom = x; + m_mode = TOKEN; break; default: - break; + ASSERT(false, ()); + return false; } - } - bool IsEnd() const { return m_mode == FINISH; } + return true; + } }; void ParseGeoURL(string const & s, Info & info) { DoGeoParse parser(info); - strings::SimpleTokenizer iter(s, ":/?&=,"); + strings::SimpleTokenizer iter(s, ":/?&=, \t"); - while (iter && !parser.IsEnd()) - { - parser(*iter); + while (iter && parser(*iter)) ++iter; - } } } diff --git a/map/map_tests/geourl_test.cpp b/map/map_tests/geourl_test.cpp index 8f25f38aa3..5ca0756da8 100644 --- a/map/map_tests/geourl_test.cpp +++ b/map/map_tests/geourl_test.cpp @@ -2,6 +2,7 @@ #include "../geourl_process.hpp" + using namespace url_scheme; UNIT_TEST(ProcessURL_Smoke) @@ -26,5 +27,14 @@ UNIT_TEST(ProcessURL_Smoke) info.Reset(); ParseGeoURL("mapswithme:123.33,32.22/showmethemagic", info); TEST(!info.IsValid(), ()); - +} + +UNIT_TEST(ProcessURL_Instagram) +{ + Info info; + ParseGeoURL("geo:0,0?z=14&q=54.683486138,25.289361259 (Forto%20dvaras)", info); + TEST(info.IsValid(), ()); + TEST_ALMOST_EQUAL(info.m_lat, 54.683486138, ()); + TEST_ALMOST_EQUAL(info.m_lon, 25.289361259, ()); + TEST_ALMOST_EQUAL(info.m_zoom, 14.0, ()); }