diff options
author | Daria Volvenkova <d.volvenkova@corp.mail.ru> | 2016-11-29 17:02:29 +0300 |
---|---|---|
committer | Daria Volvenkova <d.volvenkova@corp.mail.ru> | 2016-12-01 20:11:29 +0300 |
commit | fb61ac89e62a7e78cf112d1a021c62d369500790 (patch) | |
tree | 61b3129c9a534c9530eba4a1589d385743fac472 /traffic | |
parent | 961d4749e3a622b5027af9fe53441e01741170ff (diff) |
Logic of traffic manager's states.
Diffstat (limited to 'traffic')
-rw-r--r-- | traffic/traffic_info.cpp | 54 | ||||
-rw-r--r-- | traffic/traffic_info.hpp | 14 | ||||
-rw-r--r-- | traffic/traffic_tests/traffic_info_test.cpp | 6 |
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(), ()); } } |