[api] [map] Moved the ge0 parser from map/ to api/.

This commit is contained in:
Maxim Pimenov 2020-01-28 16:48:31 +03:00 committed by Maksim Andrianov
parent 42c2c32b0b
commit 96b20d9a37
11 changed files with 85 additions and 96 deletions

View file

@ -4,6 +4,8 @@ set(
SRC
ge0_generator.cpp
ge0_generator.hpp
ge0_parser.cpp
ge0_parser.hpp
)
omim_add_library(${PROJECT_NAME} ${SRC})

View file

@ -3,6 +3,7 @@ project(api_tests)
set(
SRC
ge0_generator_tests.cpp
ge0_parser_tests.cpp
)
omim_add_test(${PROJECT_NAME} ${SRC})

View file

@ -1,21 +1,24 @@
#include "testing/testing.hpp"
#include "map/ge0_parser.hpp"
#include "map/mwm_url.hpp"
#include "api/ge0_generator.hpp"
#include "api/ge0_parser.hpp"
#include "base/macros.hpp"
#include <algorithm>
#include <string>
using namespace std;
using url_scheme::Ge0Parser;
using url_scheme::ApiPoint;
namespace
{
double const kZoomEps = 1e-10;
} // namespace
namespace ge0
{
class Ge0ParserForTest : public Ge0Parser
{
public:
@ -28,46 +31,44 @@ double GetLatEpsilon(size_t coordBytes)
{
// Should be / 2.0 but probably because of accumulates loss of precision, 1.77 works but 2.0
// doesn't.
double infelicity = 1 << ((ge0::kMaxPointBytes - coordBytes) * 3);
return infelicity / ((1 << ge0::kMaxCoordBits) - 1) * 180 / 1.77;
double infelicity = 1 << ((kMaxPointBytes - coordBytes) * 3);
return infelicity / ((1 << kMaxCoordBits) - 1) * 180 / 1.77;
}
double GetLonEpsilon(size_t coordBytes)
{
// Should be / 2.0 but probably because of accumulates loss of precision, 1.77 works but 2.0
// doesn't.
double infelicity = 1 << ((ge0::kMaxPointBytes - coordBytes) * 3);
return (infelicity / ((1 << ge0::kMaxCoordBits) - 1)) * 360 / 1.77;
double infelicity = 1 << ((kMaxPointBytes - coordBytes) * 3);
return (infelicity / ((1 << kMaxCoordBits) - 1)) * 360 / 1.77;
}
void TestSuccess(char const * s, double lat, double lon, double zoom, char const * name)
{
Ge0Parser parser;
ApiPoint apiPoint;
double parsedLat;
double parsedLon;
string parsedName;
double parsedZoomLevel;
bool const result = parser.Parse(s, apiPoint, parsedZoomLevel);
bool const result = parser.Parse(s, parsedLat, parsedLon, parsedName, parsedZoomLevel);
TEST(result, (s, zoom, lat, lon, name));
TEST_EQUAL(apiPoint.m_name, string(name), (s));
TEST_EQUAL(apiPoint.m_id, string(), (s));
TEST_EQUAL(parsedName, string(name), (s));
double const latEps = GetLatEpsilon(9);
double const lonEps = GetLonEpsilon(9);
TEST(fabs(apiPoint.m_lat - lat) <= latEps, (s, zoom, lat, lon, name));
TEST(fabs(apiPoint.m_lon - lon) <= lonEps, (s, zoom, lat, lon, name));
TEST(fabs(apiPoint.m_lat - lat) <= latEps, (s, zoom, lat, lon, name));
TEST(fabs(apiPoint.m_lon - lon) <= lonEps, (s, zoom, lat, lon, name));
TEST_ALMOST_EQUAL_ULPS(parsedZoomLevel, zoom, (s, zoom, lat, lon, name));
double const lonEps = GetLonEpsilon(9);
TEST_ALMOST_EQUAL_ABS(parsedLat, lat, latEps, (s, zoom, lat, lon, name));
TEST_ALMOST_EQUAL_ABS(parsedLon, lon, lonEps, (s, zoom, lat, lon, name));
TEST_ALMOST_EQUAL_ABS(parsedZoomLevel, zoom, kZoomEps, (s, zoom, lat, lon, name));
}
void TestFailure(char const * s)
{
Ge0Parser parser;
ApiPoint apiPoint;
double zoomLevel;
bool const result = parser.Parse(s, apiPoint, zoomLevel);
TEST_EQUAL(result, false, (s));
string name;
double lat, lon, zoomLevel;
bool const result = parser.Parse(s, lat, lon, name, zoomLevel);
TEST(!result, (s));
}
bool ConvergenceTest(double lat, double lon, double latEps, double lonEps)
@ -84,7 +85,6 @@ bool ConvergenceTest(double lat, double lon, double latEps, double lonEps)
return true;
return false;
}
} // namespace
UNIT_TEST(Base64DecodingWorksForAValidChar)
{
@ -215,23 +215,21 @@ UNIT_TEST(NameDecoding)
"d0%bd%d0%b8%d1%8e%3F";
Ge0Parser parser;
ApiPoint apiPoint;
double parsedLat;
double parsedLon;
string parsedName;
double parsedZoomLevel;
bool const result = parser.Parse(url.c_str(), apiPoint, parsedZoomLevel);
bool const result = parser.Parse(url.c_str(), parsedLat, parsedLon, parsedName, parsedZoomLevel);
TEST(result, (url, zoom, lat, lon, name));
// Name would be valid but is too long.
TEST_NOT_EQUAL(apiPoint.m_name, string(name), (url));
TEST_EQUAL(apiPoint.m_id, string(), (url));
TEST_NOT_EQUAL(parsedName, string(name), (url));
double const latEps = GetLatEpsilon(9);
double const lonEps = GetLonEpsilon(9);
TEST(fabs(apiPoint.m_lat - lat) <= latEps, (url, zoom, lat, lon, name));
TEST(fabs(apiPoint.m_lon - lon) <= lonEps, (url, zoom, lat, lon, name));
TEST(fabs(apiPoint.m_lat - lat) <= latEps, (url, zoom, lat, lon, name));
TEST(fabs(apiPoint.m_lon - lon) <= lonEps, (url, zoom, lat, lon, name));
TEST_ALMOST_EQUAL_ULPS(parsedZoomLevel, zoom, (url, zoom, lat, lon, name));
TEST_ALMOST_EQUAL_ABS(parsedLat, lat, latEps, (url, zoom, lat, lon, name));
TEST_ALMOST_EQUAL_ABS(parsedLon, lon, lonEps, (url, zoom, lat, lon, name));
TEST_ALMOST_EQUAL_ABS(parsedZoomLevel, zoom, kZoomEps, (url, zoom, lat, lon, name));
}
}
@ -293,3 +291,4 @@ UNIT_TEST(ClippedName)
TestSuccess("ge0://AwAAAAAAAA/" , 0, 0, 4, "");
TestSuccess("ge0://AwAAAAAAAA" , 0, 0, 4, "");
}
} // namespace ge0

View file

@ -1,6 +1,4 @@
#include "map/ge0_parser.hpp"
#include "map/mwm_url.hpp"
#include "api/ge0_parser.hpp"
#include "geometry/mercator.hpp"
@ -15,7 +13,7 @@
using namespace std;
namespace url_scheme
namespace ge0
{
Ge0Parser::Ge0Parser()
{
@ -23,12 +21,12 @@ Ge0Parser::Ge0Parser()
m_base64ReverseCharTable[i] = 255;
for (uint8_t i = 0; i < 64; ++i)
{
char c = ge0::Base64Char(i);
char c = Base64Char(i);
m_base64ReverseCharTable[static_cast<uint8_t>(c)] = i;
}
}
bool Ge0Parser::Parse(string const & url, url_scheme::ApiPoint & outPoint, double & outZoomLevel)
bool Ge0Parser::Parse(string const & url, double & outLat, double & outLon, std::string & outName, double & outZoomLevel)
{
// URL format:
//
@ -52,14 +50,14 @@ bool Ge0Parser::Parse(string const & url, url_scheme::ApiPoint & outPoint, doubl
return false;
outZoomLevel = DecodeZoom(zoomI);
DecodeLatLon(url.substr(LATLON_POSITION, LATLON_LENGTH), outPoint.m_lat, outPoint.m_lon);
DecodeLatLon(url.substr(LATLON_POSITION, LATLON_LENGTH), outLat, outLon);
ASSERT(mercator::ValidLon(outPoint.m_lon), (outPoint.m_lon));
ASSERT(mercator::ValidLat(outPoint.m_lat), (outPoint.m_lat));
ASSERT(mercator::ValidLon(outLon), (outLon));
ASSERT(mercator::ValidLat(outLat), (outLat));
if (url.size() >= NAME_POSITON_IN_URL)
{
outPoint.m_name = DecodeName(
outName = DecodeName(
url.substr(NAME_POSITON_IN_URL, min(url.size() - NAME_POSITON_IN_URL, MAX_NAME_LENGTH)));
}
return true;
@ -80,13 +78,13 @@ void Ge0Parser::DecodeLatLon(string const & url, double & lat, double & lon)
{
int latInt = 0, lonInt = 0;
DecodeLatLonToInt(url, latInt, lonInt, url.size());
lat = DecodeLatFromInt(latInt, (1 << ge0::kMaxCoordBits) - 1);
lon = DecodeLonFromInt(lonInt, (1 << ge0::kMaxCoordBits) - 1);
lat = DecodeLatFromInt(latInt, (1 << kMaxCoordBits) - 1);
lon = DecodeLonFromInt(lonInt, (1 << kMaxCoordBits) - 1);
}
void Ge0Parser::DecodeLatLonToInt(string const & url, int & lat, int & lon, size_t const bytes)
{
int shift = ge0::kMaxCoordBits - 3;
int shift = kMaxCoordBits - 3;
for (size_t i = 0; i < bytes; ++i, shift -= 3)
{
const uint8_t a = DecodeBase64Char(url[i]);
@ -95,7 +93,7 @@ void Ge0Parser::DecodeLatLonToInt(string const & url, int & lat, int & lon, size
lat |= lat1 << shift;
lon |= lon1 << shift;
}
const double middleOfSquare = 1 << (3 * (ge0::kMaxPointBytes - bytes) - 1);
const double middleOfSquare = 1 << (3 * (kMaxPointBytes - bytes) - 1);
lat += middleOfSquare;
lon += middleOfSquare;
}
@ -151,5 +149,4 @@ bool Ge0Parser::IsHexChar(char const a)
{
return ((a >= '0' && a <= '9') || (a >= 'A' && a <= 'F') || (a >= 'a' && a <= 'f'));
}
} // namespace url_scheme
} // namespace ge0

View file

@ -1,20 +1,17 @@
#pragma once
#include "base/base.hpp"
#include <cstddef>
#include <cstdint>
#include <string>
namespace url_scheme
namespace ge0
{
struct ApiPoint;
class Ge0Parser
{
public:
Ge0Parser();
bool Parse(std::string const & url, url_scheme::ApiPoint & outPoint, double & outZoomLevel);
bool Parse(std::string const & url, double & outLat, double & outLon, std::string & outName, double & outZoomLevel);
protected:
uint8_t DecodeBase64Char(char const c);
@ -31,4 +28,4 @@ protected:
private:
uint8_t m_base64ReverseCharTable[256];
};
} // namespace url_api
} // namespace ge0

View file

@ -59,8 +59,6 @@ set(
framework_light.cpp
framework_light.hpp
framework_light_delegate.hpp
ge0_parser.cpp
ge0_parser.hpp
geourl_process.cpp
geourl_process.hpp
gps_track_collection.cpp

View file

@ -4,7 +4,6 @@
#include "map/chart_generator.hpp"
#include "map/displayed_categories_modifiers.hpp"
#include "map/everywhere_search_params.hpp"
#include "map/ge0_parser.hpp"
#include "map/geourl_process.hpp"
#include "map/gps_tracker.hpp"
#include "map/notifications/notification_manager_delegate.hpp"
@ -16,6 +15,8 @@
#include "map/utils.hpp"
#include "map/viewport_search_params.hpp"
#include "api/ge0_parser.hpp"
#include "generator/borders.hpp"
#include "routing/city_roads.hpp"
@ -436,7 +437,7 @@ Framework::Framework(FrameworkParams const & params)
m_bmManager->InitRegionAddressGetter(m_featuresFetcher.GetDataSource(), *m_infoGetter);
m_ParsedMapApi.SetBookmarkManager(m_bmManager.get());
m_parsedMapApi.SetBookmarkManager(m_bmManager.get());
m_routingManager.SetBookmarkManager(m_bmManager.get());
m_searchMarks.SetBookmarkManager(m_bmManager.get());
@ -2135,34 +2136,29 @@ bool Framework::ShowMapForURL(string const & url)
enum ResultT { FAILED, NEED_CLICK, NO_NEED_CLICK };
ResultT result = FAILED;
using namespace url_scheme;
using namespace strings;
if (StartsWith(url, "ge0"))
if (strings::StartsWith(url, "ge0"))
{
Ge0Parser parser;
double zoom;
ApiPoint pt;
ge0::Ge0Parser parser;
double lat, lon, zoom;
if (parser.Parse(url, pt, zoom))
if (parser.Parse(url, lat, lon, name, zoom))
{
point = mercator::FromLatLon(pt.m_lat, pt.m_lon);
point = mercator::FromLatLon(lat, lon);
rect = df::GetRectForDrawScale(zoom, point);
name = pt.m_name;
result = NEED_CLICK;
}
}
else if (m_ParsedMapApi.IsValid())
else if (m_parsedMapApi.IsValid())
{
if (!m_ParsedMapApi.GetViewportRect(rect))
if (!m_parsedMapApi.GetViewportRect(rect))
rect = df::GetWorldRect();
apiMark = m_ParsedMapApi.GetSinglePoint();
apiMark = m_parsedMapApi.GetSinglePoint();
result = apiMark ? NEED_CLICK : NO_NEED_CLICK;
}
else // Actually, we can parse any geo url scheme with correct coordinates.
{
Info info;
url_scheme::Info info;
ParseGeoURL(url, info);
if (info.IsValid())
{
@ -2216,23 +2212,23 @@ url_scheme::ParsedMapApi::ParsingResult Framework::ParseAndSetApiURL(string cons
editSession.SetIsVisible(UserMark::Type::API, true);
}
return m_ParsedMapApi.SetUriAndParse(url);
return m_parsedMapApi.SetUriAndParse(url);
}
Framework::ParsedRoutingData Framework::GetParsedRoutingData() const
{
return Framework::ParsedRoutingData(m_ParsedMapApi.GetRoutePoints(),
routing::FromString(m_ParsedMapApi.GetRoutingType()));
return Framework::ParsedRoutingData(m_parsedMapApi.GetRoutePoints(),
routing::FromString(m_parsedMapApi.GetRoutingType()));
}
url_scheme::SearchRequest Framework::GetParsedSearchRequest() const
{
return m_ParsedMapApi.GetSearchRequest();
return m_parsedMapApi.GetSearchRequest();
}
url_scheme::Subscription Framework::GetParsedSubscription() const
{
return m_ParsedMapApi.GetSubscription();
return m_parsedMapApi.GetSubscription();
}
FeatureID Framework::GetFeatureAtPoint(m2::PointD const & mercator,
@ -2681,7 +2677,7 @@ string Framework::CodeGe0url(double lat, double lon, double zoomLevel, string co
string Framework::GenerateApiBackUrl(ApiMarkPoint const & point) const
{
string res = m_ParsedMapApi.GetGlobalBackUrl();
string res = m_parsedMapApi.GetGlobalBackUrl();
if (!res.empty())
{
ms::LatLon const ll = point.GetLatLon();

View file

@ -726,10 +726,10 @@ public:
/// @name Api
std::string GenerateApiBackUrl(ApiMarkPoint const & point) const;
url_scheme::ParsedMapApi const & GetApiDataHolder() const { return m_ParsedMapApi; }
url_scheme::ParsedMapApi const & GetApiDataHolder() const { return m_parsedMapApi; }
private:
url_scheme::ParsedMapApi m_ParsedMapApi;
url_scheme::ParsedMapApi m_parsedMapApi;
public:
/// @name Data versions

View file

@ -15,7 +15,6 @@ set(
extrapolator_tests.cpp
feature_getters_tests.cpp
framework_light_tests.cpp
ge0_parser_tests.cpp
geourl_test.cpp
gps_track_collection_test.cpp
gps_track_storage_test.cpp

View file

@ -20,6 +20,9 @@
391A146623E0FC9A00A448F4 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 391A146523E0FC9A00A448F4 /* libz.tbd */; };
391A146823E0FC9E00A448F4 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 391A146723E0FC9E00A448F4 /* Security.framework */; };
391A146A23E0FCB700A448F4 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 391A146923E0FCB700A448F4 /* CoreLocation.framework */; };
39F3D51E23E196110037D487 /* ge0_parser.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 39F3D51C23E196110037D487 /* ge0_parser.hpp */; };
39F3D51F23E196110037D487 /* ge0_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39F3D51D23E196110037D487 /* ge0_parser.cpp */; };
39F3D52123E196240037D487 /* ge0_parser_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 39F3D52023E196240037D487 /* ge0_parser_tests.cpp */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@ -38,6 +41,9 @@
391A146523E0FC9A00A448F4 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
391A146723E0FC9E00A448F4 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
391A146923E0FCB700A448F4 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; };
39F3D51C23E196110037D487 /* ge0_parser.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = ge0_parser.hpp; path = ../../api/ge0_parser.hpp; sourceTree = "<group>"; };
39F3D51D23E196110037D487 /* ge0_parser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ge0_parser.cpp; path = ../../api/ge0_parser.cpp; sourceTree = "<group>"; };
39F3D52023E196240037D487 /* ge0_parser_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ge0_parser_tests.cpp; path = ../../../api/api_tests/ge0_parser_tests.cpp; sourceTree = "<group>"; };
675347171A40577A00A0A8C3 /* libapi.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libapi.a; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
@ -71,6 +77,7 @@
391A145523E0FC4100A448F4 /* api_tests */ = {
isa = PBXGroup;
children = (
39F3D52023E196240037D487 /* ge0_parser_tests.cpp */,
391A145823E0FC5C00A448F4 /* testingmain.cpp */,
391A145623E0FC5200A448F4 /* ge0_generator_tests.cpp */,
);
@ -95,6 +102,8 @@
6753470E1A40577A00A0A8C3 = {
isa = PBXGroup;
children = (
39F3D51D23E196110037D487 /* ge0_parser.cpp */,
39F3D51C23E196110037D487 /* ge0_parser.hpp */,
391A145523E0FC4100A448F4 /* api_tests */,
390F890523E0F1CB00476FCF /* ge0_generator.cpp */,
390F890423E0F1CB00476FCF /* ge0_generator.hpp */,
@ -121,6 +130,7 @@
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
39F3D51E23E196110037D487 /* ge0_parser.hpp in Headers */,
390F890623E0F1CB00476FCF /* ge0_generator.hpp in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -217,6 +227,7 @@
files = (
391A145723E0FC5200A448F4 /* ge0_generator_tests.cpp in Sources */,
391A145923E0FC5C00A448F4 /* testingmain.cpp in Sources */,
39F3D52123E196240037D487 /* ge0_parser_tests.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -225,6 +236,7 @@
buildActionMask = 2147483647;
files = (
390F890723E0F1CB00476FCF /* ge0_generator.cpp in Sources */,
39F3D51F23E196110037D487 /* ge0_parser.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View file

@ -183,8 +183,6 @@
6753464B1A4054E800A0A8C3 /* bookmark.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345DC1A4054E800A0A8C3 /* bookmark.hpp */; };
675346641A4054E800A0A8C3 /* framework.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345F51A4054E800A0A8C3 /* framework.cpp */; };
675346651A4054E800A0A8C3 /* framework.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345F61A4054E800A0A8C3 /* framework.hpp */; };
675346661A4054E800A0A8C3 /* ge0_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345F71A4054E800A0A8C3 /* ge0_parser.cpp */; };
675346671A4054E800A0A8C3 /* ge0_parser.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345F81A4054E800A0A8C3 /* ge0_parser.hpp */; };
6753466A1A4054E800A0A8C3 /* geourl_process.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675345FB1A4054E800A0A8C3 /* geourl_process.cpp */; };
6753466B1A4054E800A0A8C3 /* geourl_process.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 675345FC1A4054E800A0A8C3 /* geourl_process.hpp */; };
675346741A4054E800A0A8C3 /* mwm_url.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 675346051A4054E800A0A8C3 /* mwm_url.cpp */; };
@ -208,7 +206,6 @@
679624B21D1017DB00AE4E3C /* mwm_set_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 679624A51D1017C200AE4E3C /* mwm_set_test.cpp */; };
67F183751BD5041700AB1840 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 67F183741BD5041700AB1840 /* libz.tbd */; };
67F183761BD5045700AB1840 /* bookmarks_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 674A29CB1B26FCFE001A525C /* bookmarks_test.cpp */; };
67F183771BD5045700AB1840 /* ge0_parser_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 674A29CC1B26FCFE001A525C /* ge0_parser_tests.cpp */; };
67F183781BD5045700AB1840 /* geourl_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 674A29CD1B26FCFE001A525C /* geourl_test.cpp */; };
67F183791BD5045700AB1840 /* kmz_unarchive_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 674A29CE1B26FCFE001A525C /* kmz_unarchive_test.cpp */; };
67F1837A1BD5045700AB1840 /* mwm_url_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 674A29CF1B26FCFE001A525C /* mwm_url_tests.cpp */; };
@ -426,7 +423,6 @@
671ED39020D4046D00D4317E /* libeditor_tests_support.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libeditor_tests_support.a; sourceTree = BUILT_PRODUCTS_DIR; };
674231CA1DF984F600913FEB /* libtraffic.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtraffic.a; path = "../../../omim-build/xcode/Debug/libtraffic.a"; sourceTree = "<group>"; };
674A29CB1B26FCFE001A525C /* bookmarks_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bookmarks_test.cpp; sourceTree = "<group>"; };
674A29CC1B26FCFE001A525C /* ge0_parser_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ge0_parser_tests.cpp; sourceTree = "<group>"; };
674A29CD1B26FCFE001A525C /* geourl_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = geourl_test.cpp; sourceTree = "<group>"; };
674A29CE1B26FCFE001A525C /* kmz_unarchive_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = kmz_unarchive_test.cpp; sourceTree = "<group>"; };
674A29CF1B26FCFE001A525C /* mwm_url_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mwm_url_tests.cpp; sourceTree = "<group>"; };
@ -466,8 +462,6 @@
675345DC1A4054E800A0A8C3 /* bookmark.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bookmark.hpp; sourceTree = "<group>"; };
675345F51A4054E800A0A8C3 /* framework.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = framework.cpp; sourceTree = "<group>"; };
675345F61A4054E800A0A8C3 /* framework.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = framework.hpp; sourceTree = "<group>"; };
675345F71A4054E800A0A8C3 /* ge0_parser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ge0_parser.cpp; sourceTree = "<group>"; };
675345F81A4054E800A0A8C3 /* ge0_parser.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ge0_parser.hpp; sourceTree = "<group>"; };
675345FB1A4054E800A0A8C3 /* geourl_process.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = geourl_process.cpp; sourceTree = "<group>"; };
675345FC1A4054E800A0A8C3 /* geourl_process.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = geourl_process.hpp; sourceTree = "<group>"; };
675346051A4054E800A0A8C3 /* mwm_url.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mwm_url.cpp; sourceTree = "<group>"; };
@ -757,7 +751,6 @@
454523AB202A00B9009275C1 /* cloud_tests.cpp */,
679624A11D1017C200AE4E3C /* feature_getters_tests.cpp */,
671ED38820D403B300D4317E /* framework_light_tests.cpp */,
674A29CC1B26FCFE001A525C /* ge0_parser_tests.cpp */,
674A29CD1B26FCFE001A525C /* geourl_test.cpp */,
679624A21D1017C200AE4E3C /* gps_track_collection_test.cpp */,
679624A31D1017C200AE4E3C /* gps_track_storage_test.cpp */,
@ -900,8 +893,6 @@
F6D67CE22063F4980032FD38 /* framework_light.hpp */,
675345F51A4054E800A0A8C3 /* framework.cpp */,
675345F61A4054E800A0A8C3 /* framework.hpp */,
675345F71A4054E800A0A8C3 /* ge0_parser.cpp */,
675345F81A4054E800A0A8C3 /* ge0_parser.hpp */,
675345FB1A4054E800A0A8C3 /* geourl_process.cpp */,
675345FC1A4054E800A0A8C3 /* geourl_process.hpp */,
F6B282FB1C1B03320081957A /* gps_track_collection.cpp */,
@ -1008,7 +999,6 @@
F6B283081C1B03320081957A /* gps_track_storage.hpp in Headers */,
3DD1166B21888AAD007A2ED4 /* notification_manager.hpp in Headers */,
3D4F44BB21345D270005E765 /* tips_api.hpp in Headers */,
675346671A4054E800A0A8C3 /* ge0_parser.hpp in Headers */,
675346A21A4054E800A0A8C3 /* user_mark.hpp in Headers */,
454649F21F2728CE00EF4064 /* local_ads_mark.hpp in Headers */,
39E3C60323312BA800FB0C37 /* features_fetcher.hpp in Headers */,
@ -1201,7 +1191,6 @@
67F183761BD5045700AB1840 /* bookmarks_test.cpp in Sources */,
671ED38B20D403B300D4317E /* booking_availability_cache_test.cpp in Sources */,
BB421D6C1E8C0031005BFA4D /* transliteration_test.cpp in Sources */,
67F183771BD5045700AB1840 /* ge0_parser_tests.cpp in Sources */,
679624B21D1017DB00AE4E3C /* mwm_set_test.cpp in Sources */,
3D4F4582213552AD0005E765 /* tips_tests.cpp in Sources */,
67F183781BD5045700AB1840 /* geourl_test.cpp in Sources */,
@ -1271,7 +1260,6 @@
45201E931CE4AC90008A4842 /* api_mark_point.cpp in Sources */,
451E692A21494C2700764A97 /* purchase.cpp in Sources */,
F6FC3CB61FC323430001D929 /* discovery_manager.cpp in Sources */,
675346661A4054E800A0A8C3 /* ge0_parser.cpp in Sources */,
3D62CBD920FF6C8B00E7BB6E /* discovery_search.cpp in Sources */,
BBA014AD2073C784007402E4 /* bookmark_helpers.cpp in Sources */,
3D4F44BC21345D270005E765 /* tips_api.cpp in Sources */,