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:
authorDaria Volvenkova <d.volvenkova@corp.mail.ru>2016-11-29 17:02:29 +0300
committerDaria Volvenkova <d.volvenkova@corp.mail.ru>2016-12-01 20:11:29 +0300
commitfb61ac89e62a7e78cf112d1a021c62d369500790 (patch)
tree61b3129c9a534c9530eba4a1589d385743fac472 /traffic
parent961d4749e3a622b5027af9fe53441e01741170ff (diff)
Logic of traffic manager's states.
Diffstat (limited to 'traffic')
-rw-r--r--traffic/traffic_info.cpp54
-rw-r--r--traffic/traffic_info.hpp14
-rw-r--r--traffic/traffic_tests/traffic_info_test.cpp6
3 files changed, 60 insertions, 14 deletions
diff --git a/traffic/traffic_info.cpp b/traffic/traffic_info.cpp
index ff62864e68..a7e56bceab 100644
--- a/traffic/traffic_info.cpp
+++ b/traffic/traffic_info.cpp
@@ -22,18 +22,25 @@ namespace traffic
{
namespace
{
-bool ReadRemoteFile(string const & url, vector<uint8_t> & result)
+bool ReadRemoteFile(string const & url, string & result, int & errorCode)
{
platform::HttpClient request(url);
- if (!request.RunHttpRequest() || request.ErrorCode() != 200)
+ if (!request.RunHttpRequest())
{
- LOG(LINFO, ("Traffic request", url, "failed. HTTP Error:", request.ErrorCode()));
+ LOG(LINFO, ("Couldn't run traffic request", url));
+ errorCode = -1;
return false;
}
- string const & response = request.ServerResponse();
- result.resize(response.size());
- for (size_t i = 0; i < response.size(); ++i)
- result[i] = static_cast<uint8_t>(response[i]);
+
+ errorCode = request.ErrorCode();
+ result = request.ServerResponse();
+
+ if (errorCode != 200)
+ {
+ LOG(LINFO, ("Traffic request", url, "failed. HTTP Error:", errorCode));
+ return false;
+ }
+
return true;
}
@@ -60,7 +67,10 @@ TrafficInfo::RoadSegmentId::RoadSegmentId(uint32_t fid, uint16_t idx, uint8_t di
}
// TrafficInfo --------------------------------------------------------------------------------
-TrafficInfo::TrafficInfo(MwmSet::MwmId const & mwmId) : m_mwmId(mwmId) {}
+TrafficInfo::TrafficInfo(MwmSet::MwmId const & mwmId, int64_t const & currentDataVersion)
+ : m_mwmId(mwmId)
+ , m_currentDataVersion(currentDataVersion)
+{}
bool TrafficInfo::ReceiveTrafficData()
{
@@ -73,9 +83,32 @@ bool TrafficInfo::ReceiveTrafficData()
if (url.empty())
return false;
- vector<uint8_t> contents;
- if (!ReadRemoteFile(url, contents))
+ string result;
+ int errorCode;
+ if (!ReadRemoteFile(url, result, errorCode))
+ {
+ if (errorCode == 404)
+ {
+ int64_t version = atoi(result.c_str());
+
+ if (version > info->GetVersion() && version <= m_currentDataVersion)
+ m_availabilityStatus = Availability::ExpiredMwm;
+ else if (version > m_currentDataVersion)
+ m_availabilityStatus = Availability::ExpiredApp;
+ else
+ m_availabilityStatus = Availability::NoData;
+ }
+ else
+ {
+ m_availabilityStatus = Availability::Unknown;
+ }
return false;
+ }
+
+ vector<uint8_t> contents;
+ contents.resize(result.size());
+ for (size_t i = 0; i < result.size(); ++i)
+ contents[i] = static_cast<uint8_t>(result[i]);
Coloring coloring;
try
@@ -89,6 +122,7 @@ bool TrafficInfo::ReceiveTrafficData()
return false;
}
m_coloring.swap(coloring);
+ m_availabilityStatus = Availability::IsAvailable;
return true;
}
diff --git a/traffic/traffic_info.hpp b/traffic/traffic_info.hpp
index b1b5a419c3..92de4f6b2a 100644
--- a/traffic/traffic_info.hpp
+++ b/traffic/traffic_info.hpp
@@ -16,6 +16,15 @@ namespace traffic
class TrafficInfo
{
public:
+ enum class Availability
+ {
+ IsAvailable,
+ NoData,
+ ExpiredMwm,
+ ExpiredApp,
+ Unknown
+ };
+
struct RoadSegmentId
{
// m_dir can be kForwardDirection or kReverseDirection.
@@ -56,7 +65,7 @@ public:
TrafficInfo() = default;
- TrafficInfo(MwmSet::MwmId const & mwmId);
+ TrafficInfo(MwmSet::MwmId const & mwmId, int64_t const & currentDataVersion);
// Fetches the latest traffic data from the server and updates the coloring.
// Construct the url by passing an MwmId.
@@ -68,6 +77,7 @@ public:
MwmSet::MwmId const & GetMwmId() const { return m_mwmId; }
Coloring const & GetColoring() const { return m_coloring; }
+ Availability GetAvailability() const { return m_availabilityStatus; }
static void SerializeTrafficData(Coloring const & coloring, vector<uint8_t> & result);
@@ -77,5 +87,7 @@ private:
// The mapping from feature segments to speed groups (see speed_groups.hpp).
Coloring m_coloring;
MwmSet::MwmId m_mwmId;
+ Availability m_availabilityStatus = Availability::Unknown;
+ int64_t m_currentDataVersion = 0;
};
} // namespace traffic
diff --git a/traffic/traffic_tests/traffic_info_test.cpp b/traffic/traffic_tests/traffic_info_test.cpp
index 84d1bcf0cd..5b19f599ec 100644
--- a/traffic/traffic_tests/traffic_info_test.cpp
+++ b/traffic/traffic_tests/traffic_info_test.cpp
@@ -50,21 +50,21 @@ UNIT_TEST(TrafficInfo_RemoteFile)
TestMwmSet mwmSet;
auto const & r =
mwmSet.Register(platform::LocalCountryFile::MakeForTesting("traffic_data_test"));
- TrafficInfo trafficInfo(r.first);
+ TrafficInfo trafficInfo(r.first, r.first.GetInfo()->GetVersion());
TEST(trafficInfo.ReceiveTrafficData(), ());
}
{
TestMwmSet mwmSet;
auto const & r =
mwmSet.Register(platform::LocalCountryFile::MakeForTesting("traffic_data_test2"));
- TrafficInfo trafficInfo(r.first);
+ TrafficInfo trafficInfo(r.first, r.first.GetInfo()->GetVersion());
TEST(!trafficInfo.ReceiveTrafficData(), ());
}
{
TestMwmSet mwmSet;
auto const & r =
mwmSet.Register(platform::LocalCountryFile::MakeForTesting("traffic_data_test", 101010));
- TrafficInfo trafficInfo(r.first);
+ TrafficInfo trafficInfo(r.first, r.first.GetInfo()->GetVersion());
TEST(trafficInfo.ReceiveTrafficData(), ());
}
}