Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladiMihaylenko <vxmihaylenko@gmail.com>2017-05-12 20:27:21 +0300
committerr.kuznetsov <r.kuznetsov@corp.mail.ru>2017-05-19 16:42:18 +0300
commitcdf8dd1e4c3e07dddb89b1ab70a9276d6cb215fa (patch)
tree9d95fcc8239d8c11d30c1c34854d652dc8d61a06
parentaafc39e22a28c9254e60d0e30ffb39071726f832 (diff)
Added lead url parsing.
-rw-r--r--defines.hpp1
-rw-r--r--map/map_tests/mwm_url_tests.cpp33
-rw-r--r--map/mwm_url.cpp165
-rw-r--r--map/mwm_url.hpp10
-rw-r--r--platform/CMakeLists.txt2
-rw-r--r--platform/platform.pro2
-rw-r--r--platform/settings.cpp108
-rw-r--r--platform/settings.hpp51
-rw-r--r--platform/string_storage_base.cpp111
-rw-r--r--platform/string_storage_base.hpp24
-rw-r--r--xcode/platform/platform.xcodeproj/project.pbxproj16
11 files changed, 381 insertions, 142 deletions
diff --git a/defines.hpp b/defines.hpp
index 45dce1ea18..6651afeed3 100644
--- a/defines.hpp
+++ b/defines.hpp
@@ -67,6 +67,7 @@
#define WORLD_COASTS_OBSOLETE_FILE_NAME "WorldCoasts_obsolete"
#define SETTINGS_FILE_NAME "settings.ini"
+#define MARKETING_SETTINGS_FILE_NAME "marketing_settings.ini"
#define SEARCH_CATEGORIES_FILE_NAME "categories.txt"
diff --git a/map/map_tests/mwm_url_tests.cpp b/map/map_tests/mwm_url_tests.cpp
index 2bbf03fec8..3a5600e202 100644
--- a/map/map_tests/mwm_url_tests.cpp
+++ b/map/map_tests/mwm_url_tests.cpp
@@ -5,6 +5,8 @@
#include "drape_frontend/visual_params.hpp"
+#include "platform/settings.hpp"
+
#include "coding/uri.hpp"
#include "base/string_format.hpp"
@@ -156,6 +158,37 @@ UNIT_TEST(SearchApiInvalidUrl)
TEST(!IsValid(f, "mapsme://search?Query=fff"), ("The parser is case sensitive"));
}
+UNIT_TEST(LeadApiSmoke)
+{
+ string const uriString = "mapsme://lead?utm_source=a&utm_medium=b&utm_campaign=c&utm_content=d&utm_term=e";
+ TEST(Uri(uriString).IsValid(), ());
+ ApiTest test(uriString);
+ TEST(test.IsValid(), ());
+
+ auto checkEqual = [](string const & key, string const & value)
+ {
+ string result;
+ TEST(marketing::Settings::Get(key, result), ());
+ TEST_EQUAL(result, value, ());
+ };
+
+ checkEqual("utm_source", "a");
+ checkEqual("utm_medium", "b");
+ checkEqual("utm_campaign", "c");
+ checkEqual("utm_content", "d");
+ checkEqual("utm_term", "e");
+}
+
+UNIT_TEST(LeadApiInvalid)
+{
+ Framework f;
+ TEST(!IsValid(f, "mapsme://lead?"), ("From, type and name parameters are necessary"));
+ TEST(!IsValid(f, "mapsme://lead?utm_source&utm_medium&utm_campaign"), ("Parameters can't be empty"));
+ TEST(IsValid(f, "mapsme://lead?utm_source=a&utm_medium=b&utm_campaign=c"), ("These parameters are enough"));
+ TEST(IsValid(f, "mapsme://lead?utm_source=a&utm_medium=b&utm_campaign=c&smh=smh"), ("If there is an excess parameter just ignore it"));
+ TEST(!IsValid(f, "mapsme://lead?utm_source=a&UTM_MEDIUM=b&utm_campaign=c&smh=smh"), ("The parser is case sensitive"));
+}
+
UNIT_TEST(MapApiInvalidUrl)
{
Framework fm;
diff --git a/map/mwm_url.cpp b/map/mwm_url.cpp
index c7d829e9b4..04b280de7e 100644
--- a/map/mwm_url.cpp
+++ b/map/mwm_url.cpp
@@ -8,6 +8,8 @@
#include "drape_frontend/visual_params.hpp"
+#include "platform/settings.hpp"
+
#include "coding/uri.hpp"
#include "base/logging.hpp"
@@ -20,36 +22,87 @@
namespace url_scheme
{
-namespace
+namespace lead
{
-string const kLatLon = "ll";
-string const kQuery = "query";
-string const kCenterLatLon = "cll";
-string const kLocale = "locale";
-string const kSearchOnMap = "map";
-string const kSourceLatLon = "sll";
-string const kDestLatLon = "dll";
-string const kZoomLevel = "z";
-string const kName = "n";
-string const kSourceName = "saddr";
-string const kDestName = "daddr";
-string const kId = "id";
-string const kStyle = "s";
-string const kBackUrl = "backurl";
-string const kVersion = "v";
-string const kAppName = "appname";
-string const kBalloonAction = "balloonaction";
-string const kRouteType = "type";
-string const kRouteTypeVehicle = "vehicle";
-string const kRouteTypePedestrian = "pedestrian";
-string const kRouteTypeBicycle = "bicycle";
+char const * kFrom = "utm_source";
+char const * kType = "utm_medium";
+char const * kName = "utm_campaign";
+char const * kContent = "utm_content";
+char const * kKeyword = "utm_term";
+
+struct CampaignDescription
+{
+ string m_from;
+ string m_type;
+ string m_name;
+ string m_content;
+ string m_keyword;
+
+ void Write() const
+ {
+ if (!IsValid())
+ {
+ LOG(LERROR, ("Invalid campaign description!"));
+ return;
+ }
+
+ marketing::Settings::Set(kFrom, m_from);
+ marketing::Settings::Set(kType, m_type);
+ marketing::Settings::Set(kName, m_name);
+
+ if (!m_content.empty())
+ marketing::Settings::Set(kContent, m_content);
+ if (!m_keyword.empty())
+ marketing::Settings::Set(kKeyword, m_keyword);
+ }
+
+ bool IsValid() const { return !m_from.empty() && !m_type.empty() && !m_name.empty(); }
+};
+} // namespace lead
+
+namespace map
+{
+char const * kLatLon = "ll";
+char const * kZoomLevel = "z";
+char const * kName = "n";
+char const * kId = "id";
+char const * kStyle = "s";
+char const * kBackUrl = "backurl";
+char const * kVersion = "v";
+char const * kAppName = "appname";
+char const * kBalloonAction = "balloonaction";
+} // namespace map
+
+namespace route
+{
+char const * kSourceLatLon = "sll";
+char const * kDestLatLon = "dll";
+char const * kSourceName = "saddr";
+char const * kDestName = "daddr";
+char const * kRouteType = "type";
+char const * kRouteTypeVehicle = "vehicle";
+char const * kRouteTypePedestrian = "pedestrian";
+char const * kRouteTypeBicycle = "bicycle";
+} // namespace route
+
+namespace search
+{
+char const * kQuery = "query";
+char const * kCenterLatLon = "cll";
+char const * kLocale = "locale";
+char const * kSearchOnMap = "map";
+} // namespace search
+
+namespace
+{
enum class ApiURLType
{
Incorrect,
Map,
Route,
- Search
+ Search,
+ Lead
};
std::array<std::string, 3> const kAvailableSchemes = {{"mapswithme", "mwm", "mapsme"}};
@@ -66,6 +119,8 @@ ApiURLType URLType(Uri const & uri)
return ApiURLType::Route;
if (path == "search")
return ApiURLType::Search;
+ if (path == "lead")
+ return ApiURLType::Lead;
return ApiURLType::Incorrect;
}
@@ -125,7 +180,11 @@ ParsedMapApi::ParsingResult ParsedMapApi::Parse(Uri const & uri)
case ApiURLType::Map:
{
vector<ApiPoint> points;
- if (!uri.ForEachKeyValue(bind(&ParsedMapApi::AddKeyValue, this, _1, _2, ref(points))))
+ auto const result = uri.ForEachKeyValue([&points, this](string const & key, string const & value)
+ {
+ return AddKeyValue(key, value, points);
+ });
+ if (!result)
return ParsingResult::Incorrect;
if (points.empty())
@@ -147,8 +206,14 @@ ParsedMapApi::ParsingResult ParsedMapApi::Parse(Uri const & uri)
case ApiURLType::Route:
{
m_routePoints.clear();
+ using namespace route;
vector<string> pattern{kSourceLatLon, kSourceName, kDestLatLon, kDestName, kRouteType};
- if (!uri.ForEachKeyValue(bind(&ParsedMapApi::RouteKeyValue, this, _1, _2, ref(pattern))))
+ auto const result = uri.ForEachKeyValue([&pattern, this](string const & key, string const & value)
+ {
+ return RouteKeyValue(key, value, pattern);
+ });
+
+ if (!result)
return ParsingResult::Incorrect;
if (pattern.size() != 0)
@@ -163,17 +228,41 @@ ParsedMapApi::ParsingResult ParsedMapApi::Parse(Uri const & uri)
return ParsingResult::Route;
}
case ApiURLType::Search:
+ {
SearchRequest request;
- if (!uri.ForEachKeyValue(bind(&ParsedMapApi::SearchKeyValue, this, _1, _2, ref(request))))
+ auto const result = uri.ForEachKeyValue([&request, this](string const & key, string const & value)
+ {
+ return SearchKeyValue(key, value, request);
+ });
+ if (!result)
return ParsingResult::Incorrect;
m_request = request;
return request.m_query.empty() ? ParsingResult::Incorrect : ParsingResult::Search;
+ }
+ case ApiURLType::Lead:
+ {
+ lead::CampaignDescription description;
+ auto result = uri.ForEachKeyValue([&description, this](string const & key, string const & value)
+ {
+ return LeadKeyValue(key, value, description);
+ });
+ if (!result)
+ return ParsingResult::Incorrect;
+
+ if (!description.IsValid())
+ return ParsingResult::Incorrect;
+
+ description.Write();
+ return ParsingResult::Lead;
+ }
}
}
bool ParsedMapApi::RouteKeyValue(string const & key, string const & value, vector<string> & pattern)
{
+ using namespace route;
+
if (pattern.empty() || key != pattern.front())
return false;
@@ -212,6 +301,8 @@ bool ParsedMapApi::RouteKeyValue(string const & key, string const & value, vecto
bool ParsedMapApi::AddKeyValue(string const & key, string const & value, vector<ApiPoint> & points)
{
+ using namespace map;
+
if (key == kLatLon)
{
double lat = 0.0;
@@ -289,6 +380,8 @@ bool ParsedMapApi::AddKeyValue(string const & key, string const & value, vector<
bool ParsedMapApi::SearchKeyValue(string const & key, string const & value, SearchRequest & request) const
{
+ using namespace search;
+
if (key == kQuery)
{
if (value.empty())
@@ -318,6 +411,26 @@ bool ParsedMapApi::SearchKeyValue(string const & key, string const & value, Sear
return true;
}
+bool ParsedMapApi::LeadKeyValue(string const & key, string const & value, lead::CampaignDescription & description) const
+{
+ using namespace lead;
+
+ if (key == kFrom)
+ description.m_from = value;
+ else if (key == kType)
+ description.m_type = value;
+ else if (key == kName)
+ description.m_name = value;
+ else if (key == kContent)
+ description.m_content = value;
+ else if (key == kKeyword)
+ description.m_keyword = value;
+ /*
+ We have to support parsing the uri which contains unregistred parameters.
+ */
+ return true;
+}
+
void ParsedMapApi::Reset()
{
m_globalBackUrl.clear();
diff --git a/map/mwm_url.hpp b/map/mwm_url.hpp
index 4d3fac63ed..a656988306 100644
--- a/map/mwm_url.hpp
+++ b/map/mwm_url.hpp
@@ -37,6 +37,12 @@ struct SearchRequest
bool m_isSearchOnMap = false;
};
+
+namespace lead
+{
+struct CampaignDescription;
+}
+
class Uri;
/// Handles [mapswithme|mwm|mapsme]://map|route|search?params - everything related to displaying info on a map
@@ -48,7 +54,8 @@ public:
Incorrect,
Map,
Route,
- Search
+ Search,
+ Lead
};
ParsedMapApi() = default;
@@ -74,6 +81,7 @@ private:
bool AddKeyValue(string const & key, string const & value, vector<ApiPoint> & points);
bool RouteKeyValue(string const & key, string const & value, vector<string> & pattern);
bool SearchKeyValue(string const & key, string const & value, SearchRequest & request) const;
+ bool LeadKeyValue(string const & key, string const & value, lead::CampaignDescription & description) const;
BookmarkManager * m_bmManager = nullptr;
vector<RoutePoint> m_routePoints;
diff --git a/platform/CMakeLists.txt b/platform/CMakeLists.txt
index d80c6c7f1c..be3145947c 100644
--- a/platform/CMakeLists.txt
+++ b/platform/CMakeLists.txt
@@ -44,6 +44,8 @@ set(
settings.cpp
settings.hpp
socket.hpp
+ string_storage_base.cpp
+ string_storage_base.hpp
)
if(${PLATFORM_IPHONE})
diff --git a/platform/platform.pro b/platform/platform.pro
index aecbb744f5..c355e58bbf 100644
--- a/platform/platform.pro
+++ b/platform/platform.pro
@@ -92,6 +92,7 @@ HEADERS += \
servers_list.hpp \
settings.hpp \
socket.hpp \
+ string_storage_base.hpp \
SOURCES += \
chunks_download_strategy.cpp \
@@ -111,3 +112,4 @@ SOURCES += \
preferred_languages.cpp \
servers_list.cpp \
settings.cpp \
+ string_storage_base.cpp \
diff --git a/platform/settings.cpp b/platform/settings.cpp
index cbeccacf11..adc510b714 100644
--- a/platform/settings.cpp
+++ b/platform/settings.cpp
@@ -17,67 +17,12 @@
#include "std/iostream.hpp"
#include "std/sstream.hpp"
-namespace
-{
-constexpr char kDelimChar = '=';
-} // namespace
-
namespace settings
{
char const * kLocationStateMode = "LastLocationStateMode";
char const * kMeasurementUnits = "Units";
-StringStorage::StringStorage()
-{
- try
- {
- string settingsPath = GetPlatform().SettingsPathForFile(SETTINGS_FILE_NAME);
- LOG(LINFO, ("Settings path:", settingsPath));
- ReaderStreamBuf buffer(make_unique<FileReader>(settingsPath));
- istream stream(&buffer);
-
- string line;
- while (getline(stream, line))
- {
- if (line.empty())
- continue;
-
- size_t const delimPos = line.find(kDelimChar);
- if (delimPos == string::npos)
- continue;
-
- string const key = line.substr(0, delimPos);
- string const value = line.substr(delimPos + 1);
- if (!key.empty() && !value.empty())
- m_values[key] = value;
- }
- }
- catch (RootException const & ex)
- {
- LOG(LWARNING, ("Loading settings:", ex.Msg()));
- }
-}
-
-void StringStorage::Save() const
-{
- try
- {
- FileWriter file(GetPlatform().SettingsPathForFile(SETTINGS_FILE_NAME));
- for (auto const & value : m_values)
- {
- string line(value.first);
- line += kDelimChar;
- line += value.second;
- line += '\n';
- file.Write(line.data(), line.size());
- }
- }
- catch (RootException const & ex)
- {
- // Ignore all settings saving exceptions.
- LOG(LWARNING, ("Saving settings:", ex.Msg()));
- }
-}
+StringStorage::StringStorage() : StringStorageBase(GetPlatform().SettingsPathForFile(SETTINGS_FILE_NAME)) {}
StringStorage & StringStorage::Instance()
{
@@ -85,45 +30,6 @@ StringStorage & StringStorage::Instance()
return inst;
}
-void StringStorage::Clear()
-{
- lock_guard<mutex> guard(m_mutex);
- m_values.clear();
- Save();
-}
-
-bool StringStorage::GetValue(string const & key, string & outValue) const
-{
- lock_guard<mutex> guard(m_mutex);
-
- auto const found = m_values.find(key);
- if (found == m_values.end())
- return false;
-
- outValue = found->second;
- return true;
-}
-
-void StringStorage::SetValue(string const & key, string && value)
-{
- lock_guard<mutex> guard(m_mutex);
-
- m_values[key] = move(value);
- Save();
-}
-
-void StringStorage::DeleteKeyAndValue(string const & key)
-{
- lock_guard<mutex> guard(m_mutex);
-
- auto const found = m_values.find(key);
- if (found != m_values.end())
- {
- m_values.erase(found);
- Save();
- }
-}
-
////////////////////////////////////////////////////////////////////////////////////////////
template <>
@@ -434,3 +340,15 @@ bool IsFirstLaunchForDate(int date)
return false;
}
} // namespace settings
+
+namespace marketing
+{
+Settings::Settings() : platform::StringStorageBase(GetPlatform().SettingsPathForFile(MARKETING_SETTINGS_FILE_NAME)) {}
+
+// static
+Settings & Settings::Instance()
+{
+ static Settings instance;
+ return instance;
+}
+} // namespace marketing
diff --git a/platform/settings.hpp b/platform/settings.hpp
index 7cb718f1ed..adb924861b 100644
--- a/platform/settings.hpp
+++ b/platform/settings.hpp
@@ -1,5 +1,7 @@
#pragma once
+#include "platform/string_storage_base.hpp"
+
#include "base/macros.hpp"
#include "std/string.hpp"
@@ -18,36 +20,25 @@ bool FromString(string const & str, T & outValue);
template <class T>
string ToString(T const & value);
-class StringStorage
+class StringStorage : public platform::StringStorageBase
{
- typedef map<string, string> ContainerT;
- ContainerT m_values;
-
- mutable mutex m_mutex;
-
- StringStorage();
- void Save() const;
-
public:
static StringStorage & Instance();
-
- void Clear();
- bool GetValue(string const & key, string & outValue) const;
- void SetValue(string const & key, string && value);
- void DeleteKeyAndValue(string const & key);
+private:
+ StringStorage();
};
/// Retrieve setting
/// @return false if setting is absent
-template <class ValueT>
-WARN_UNUSED_RESULT bool Get(string const & key, ValueT & outValue)
+template <class Value>
+WARN_UNUSED_RESULT bool Get(string const & key, Value & outValue)
{
string strVal;
return StringStorage::Instance().GetValue(key, strVal) && FromString(strVal, outValue);
}
/// Automatically saves setting to external file
-template <class ValueT>
-void Set(string const & key, ValueT const & value)
+template <class Value>
+void Set(string const & key, Value const & value)
{
StringStorage::Instance().SetValue(key, ToString(value));
}
@@ -59,3 +50,27 @@ inline void Clear() { StringStorage::Instance().Clear(); }
/// @param[in] date Current date in format yymmdd.
bool IsFirstLaunchForDate(int date);
}
+
+namespace marketing
+{
+class Settings : public platform::StringStorageBase
+{
+public:
+ template <class Value>
+ static void Set(string const & key, Value const & value)
+ {
+ Instance().SetValue(key, settings::ToString(value));
+ }
+
+ template <class Value>
+ WARN_UNUSED_RESULT static bool Get(string const & key, Value & outValue)
+ {
+ string strVal;
+ return Instance().GetValue(key, strVal) && settings::FromString(strVal, outValue);
+ }
+
+private:
+ static Settings & Instance();
+ Settings();
+};
+} // namespace marketing
diff --git a/platform/string_storage_base.cpp b/platform/string_storage_base.cpp
new file mode 100644
index 0000000000..e6075f5104
--- /dev/null
+++ b/platform/string_storage_base.cpp
@@ -0,0 +1,111 @@
+#include "string_storage_base.hpp"
+
+#include "coding/reader_streambuf.hpp"
+#include "coding/file_reader.hpp"
+#include "coding/file_writer.hpp"
+
+#include "base/logging.hpp"
+#include "base/exception.hpp"
+#include "base/stl_add.hpp"
+
+#include <istream>
+
+using namespace std;
+
+namespace
+{
+constexpr char kDelimChar = '=';
+} // namespace
+
+namespace platform
+{
+StringStorageBase::StringStorageBase(string const & path) : m_path(path)
+{
+ try
+ {
+ LOG(LINFO, ("Settings path:", m_path));
+ ReaderStreamBuf buffer(make_unique<FileReader>(m_path));
+ istream stream(&buffer);
+
+ string line;
+ while (getline(stream, line))
+ {
+ if (line.empty())
+ continue;
+
+ size_t const delimPos = line.find(kDelimChar);
+ if (delimPos == string::npos)
+ continue;
+
+ string const key = line.substr(0, delimPos);
+ string const value = line.substr(delimPos + 1);
+ if (!key.empty() && !value.empty())
+ m_values[key] = value;
+ }
+ }
+ catch (RootException const & ex)
+ {
+ LOG(LWARNING, ("Loading settings:", ex.Msg()));
+ }
+}
+
+void StringStorageBase::Save() const
+{
+ try
+ {
+ FileWriter file(m_path);
+ for (auto const & value : m_values)
+ {
+ string line(value.first);
+ line += kDelimChar;
+ line += value.second;
+ line += '\n';
+ file.Write(line.data(), line.size());
+ }
+ }
+ catch (RootException const & ex)
+ {
+ // Ignore all settings saving exceptions.
+ LOG(LWARNING, ("Saving settings:", ex.Msg()));
+ }
+}
+
+void StringStorageBase::Clear()
+{
+ lock_guard<mutex> guard(m_mutex);
+ m_values.clear();
+ Save();
+}
+
+bool StringStorageBase::GetValue(string const & key, string & outValue) const
+{
+ lock_guard<mutex> guard(m_mutex);
+
+ auto const found = m_values.find(key);
+ if (found == m_values.end())
+ return false;
+
+ outValue = found->second;
+ return true;
+}
+
+void StringStorageBase::SetValue(string const & key, string && value)
+{
+ lock_guard<mutex> guard(m_mutex);
+
+ m_values[key] = move(value);
+ Save();
+}
+
+void StringStorageBase::DeleteKeyAndValue(string const & key)
+{
+ lock_guard<mutex> guard(m_mutex);
+
+ auto const found = m_values.find(key);
+ if (found != m_values.end())
+ {
+ m_values.erase(found);
+ Save();
+ }
+}
+} // namespace platform
diff --git a/platform/string_storage_base.hpp b/platform/string_storage_base.hpp
new file mode 100644
index 0000000000..11948632b0
--- /dev/null
+++ b/platform/string_storage_base.hpp
@@ -0,0 +1,24 @@
+#pragma once
+
+#include <map>
+#include <mutex>
+#include <string>
+
+namespace platform
+{
+class StringStorageBase
+{
+ using Container = std::map<std::string, std::string>;
+ Container m_values;
+ mutable std::mutex m_mutex;
+ std::string const m_path;
+
+public:
+ StringStorageBase(std::string const & path);
+ void Save() const;
+ void Clear();
+ bool GetValue(std::string const & key, std::string & outValue) const;
+ void SetValue(std::string const & key, std::string && value);
+ void DeleteKeyAndValue(std::string const & key);
+};
+} // namespace platform
diff --git a/xcode/platform/platform.xcodeproj/project.pbxproj b/xcode/platform/platform.xcodeproj/project.pbxproj
index 84729dc48b..2d2404f72f 100644
--- a/xcode/platform/platform.xcodeproj/project.pbxproj
+++ b/xcode/platform/platform.xcodeproj/project.pbxproj
@@ -89,7 +89,6 @@
678338A81C6DE5E300FD6263 /* libplatform.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 675343781A3F5CF500A0A8C3 /* libplatform.a */; };
678338AD1C6DF51D00FD6263 /* classificator.txt in Resources */ = {isa = PBXBuildFile; fileRef = 678338AB1C6DF50700FD6263 /* classificator.txt */; };
678338AE1C6DF51D00FD6263 /* minsk-pass.mwm in Resources */ = {isa = PBXBuildFile; fileRef = 678338AC1C6DF50700FD6263 /* minsk-pass.mwm */; };
- 678338AF1C6DF51D00FD6263 /* resources-ldpi_legacy in Resources */ = {isa = PBXBuildFile; fileRef = 678338AA1C6DF4F200FD6263 /* resources-ldpi_legacy */; };
678338B21C6E016F00FD6263 /* WorldCoasts.mwm in Resources */ = {isa = PBXBuildFile; fileRef = 678338B11C6E016700FD6263 /* WorldCoasts.mwm */; };
678338B31C6E017200FD6263 /* World.mwm in Resources */ = {isa = PBXBuildFile; fileRef = 678338B01C6E016700FD6263 /* World.mwm */; };
67A2526A1BB40E100063F8A8 /* platform_qt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6753439C1A3F5D5A00A0A8C3 /* platform_qt.cpp */; };
@@ -98,6 +97,11 @@
67AB92DD1B7B3D7300AB5194 /* mwm_version.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 67AB92DB1B7B3D7300AB5194 /* mwm_version.hpp */; };
67AB92EA1B7B3E9100AB5194 /* get_text_by_id.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 67AB92E81B7B3E9100AB5194 /* get_text_by_id.cpp */; };
67AB92EB1B7B3E9100AB5194 /* get_text_by_id.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 67AB92E91B7B3E9100AB5194 /* get_text_by_id.hpp */; };
+ F6DF73581EC9EAE700D8BA0B /* string_storage_base.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F6DF73561EC9EAE700D8BA0B /* string_storage_base.cpp */; };
+ F6DF73591EC9EAE700D8BA0B /* string_storage_base.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F6DF73561EC9EAE700D8BA0B /* string_storage_base.cpp */; };
+ F6DF735A1EC9EAE700D8BA0B /* string_storage_base.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F6DF73561EC9EAE700D8BA0B /* string_storage_base.cpp */; };
+ F6DF735B1EC9EAE700D8BA0B /* string_storage_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F6DF73571EC9EAE700D8BA0B /* string_storage_base.hpp */; };
+ F6DF735C1EC9EAE700D8BA0B /* string_storage_base.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F6DF73571EC9EAE700D8BA0B /* string_storage_base.hpp */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@@ -197,6 +201,8 @@
67AB92DB1B7B3D7300AB5194 /* mwm_version.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mwm_version.hpp; sourceTree = "<group>"; };
67AB92E81B7B3E9100AB5194 /* get_text_by_id.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = get_text_by_id.cpp; sourceTree = "<group>"; };
67AB92E91B7B3E9100AB5194 /* get_text_by_id.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = get_text_by_id.hpp; sourceTree = "<group>"; };
+ F6DF73561EC9EAE700D8BA0B /* string_storage_base.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = string_storage_base.cpp; sourceTree = "<group>"; };
+ F6DF73571EC9EAE700D8BA0B /* string_storage_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = string_storage_base.hpp; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -372,6 +378,8 @@
675343A71A3F5D5A00A0A8C3 /* servers_list.hpp */,
675343A81A3F5D5A00A0A8C3 /* settings.cpp */,
675343A91A3F5D5A00A0A8C3 /* settings.hpp */,
+ F6DF73561EC9EAE700D8BA0B /* string_storage_base.cpp */,
+ F6DF73571EC9EAE700D8BA0B /* string_storage_base.hpp */,
675343AE1A3F5D5A00A0A8C3 /* wifi_info_windows.cpp */,
675343AF1A3F5D5A00A0A8C3 /* wifi_info.hpp */,
675343B01A3F5D5A00A0A8C3 /* wifi_location_service.cpp */,
@@ -403,6 +411,7 @@
files = (
675341271C58C61D002CF0D9 /* scoped_dir.hpp in Headers */,
675341281C58C61D002CF0D9 /* scoped_mwm.hpp in Headers */,
+ F6DF735C1EC9EAE700D8BA0B /* string_storage_base.hpp in Headers */,
675341261C58C616002CF0D9 /* scoped_file.hpp in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -437,6 +446,7 @@
675343CF1A3F5D5A00A0A8C3 /* preferred_languages.hpp in Headers */,
3D30587D1D8320E4004AC712 /* http_client.hpp in Headers */,
56EB1EDD1C6B6E6C0022D831 /* file_logging.hpp in Headers */,
+ F6DF735B1EC9EAE700D8BA0B /* string_storage_base.hpp in Headers */,
6741250D1B4C00CC00A3E828 /* local_country_file_utils.hpp in Headers */,
675343DA1A3F5D5A00A0A8C3 /* wifi_info.hpp in Headers */,
671C62071AE9014C00076BD0 /* measurement_utils.hpp in Headers */,
@@ -545,7 +555,6 @@
678338AD1C6DF51D00FD6263 /* classificator.txt in Resources */,
678338AE1C6DF51D00FD6263 /* minsk-pass.mwm in Resources */,
671182F31C80AC4200CB8177 /* WorldCoasts_obsolete.mwm in Resources */,
- 678338AF1C6DF51D00FD6263 /* resources-ldpi_legacy in Resources */,
678338B21C6E016F00FD6263 /* WorldCoasts.mwm in Resources */,
678338B31C6E017200FD6263 /* World.mwm in Resources */,
);
@@ -559,6 +568,7 @@
buildActionMask = 2147483647;
files = (
675341251C58C60F002CF0D9 /* scoped_mwm.cpp in Sources */,
+ F6DF73591EC9EAE700D8BA0B /* string_storage_base.cpp in Sources */,
675341231C58C60F002CF0D9 /* scoped_dir.cpp in Sources */,
675341241C58C60F002CF0D9 /* scoped_file.cpp in Sources */,
);
@@ -581,6 +591,7 @@
675343D91A3F5D5A00A0A8C3 /* wifi_info_windows.cpp in Sources */,
56EB1EDE1C6B6E6C0022D831 /* mwm_traits.cpp in Sources */,
3D30587F1D880910004AC712 /* http_client_apple.mm in Sources */,
+ F6DF73581EC9EAE700D8BA0B /* string_storage_base.cpp in Sources */,
67247FFD1C60BD6500EDE56A /* writable_dir_changer.cpp in Sources */,
34513AFB1DCB37C100471BDA /* marketing_service.cpp in Sources */,
6741250C1B4C00CC00A3E828 /* local_country_file_utils.cpp in Sources */,
@@ -615,6 +626,7 @@
6783389D1C6DE59200FD6263 /* measurement_tests.cpp in Sources */,
678338971C6DE59200FD6263 /* country_file_tests.cpp in Sources */,
678338951C6DE59200FD6263 /* testingmain.cpp in Sources */,
+ F6DF735A1EC9EAE700D8BA0B /* string_storage_base.cpp in Sources */,
6783389B1C6DE59200FD6263 /* local_country_file_tests.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;