diff --git a/traffic/traffic_info.cpp b/traffic/traffic_info.cpp index 23138ba085..996d5cc57e 100644 --- a/traffic/traffic_info.cpp +++ b/traffic/traffic_info.cpp @@ -138,10 +138,17 @@ void TrafficInfo::SetTrafficKeysForTesting(vector const & keys) bool TrafficInfo::ReceiveTrafficData(string & etag) { vector values; - if (!ReceiveTrafficValues(etag, values)) + switch (ReceiveTrafficValues(etag, values)) + { + case ServerDataStatus::New: + return UpdateTrafficData(values); + case ServerDataStatus::NotChanged: + return true; + case ServerDataStatus::NotFound: + case ServerDataStatus::Error: return false; - - return UpdateTrafficData(values); + } + return false; } SpeedGroup TrafficInfo::GetSpeedGroup(RoadSegmentId const & id) const @@ -398,17 +405,17 @@ bool TrafficInfo::ReceiveTrafficKeys() return true; } -bool TrafficInfo::ReceiveTrafficValues(string & etag, vector & values) +TrafficInfo::ServerDataStatus TrafficInfo::ReceiveTrafficValues(string & etag, vector & values) { auto const & info = m_mwmId.GetInfo(); if (!info) - return false; + return ServerDataStatus::Error; uint64_t const version = info->GetVersion(); string const url = MakeRemoteURL(info->GetCountryName(), version); if (url.empty()) - return false; + return ServerDataStatus::Error; platform::HttpClient request(url); request.LoadHeaders(true); @@ -433,7 +440,7 @@ bool TrafficInfo::ReceiveTrafficValues(string & etag, vector & value alohalytics::TStringMap({{"mwm", info->GetCountryName()}, {"version", strings::to_string(info->GetVersion())}})); - return false; + return ServerDataStatus::Error; } // Update ETag for this MWM. auto const & headers = request.GetHeaders(); @@ -442,7 +449,7 @@ bool TrafficInfo::ReceiveTrafficValues(string & etag, vector & value etag = it->second; m_availability = Availability::IsAvailable; - return true; + return ServerDataStatus::New; } bool TrafficInfo::UpdateTrafficData(vector const & values) @@ -468,7 +475,7 @@ bool TrafficInfo::UpdateTrafficData(vector const & values) return true; } -bool TrafficInfo::ProcessFailure(platform::HttpClient const & request, uint64_t const mwmVersion) +TrafficInfo::ServerDataStatus TrafficInfo::ProcessFailure(platform::HttpClient const & request, uint64_t const mwmVersion) { switch (request.ErrorCode()) { @@ -483,12 +490,12 @@ bool TrafficInfo::ProcessFailure(platform::HttpClient const & request, uint64_t m_availability = Availability::ExpiredApp; else m_availability = Availability::NoData; - return false; + return ServerDataStatus::NotFound; } case 304: /* Not Modified */ { m_availability = Availability::IsAvailable; - return true; + return ServerDataStatus::NotChanged; } } @@ -497,7 +504,7 @@ bool TrafficInfo::ProcessFailure(platform::HttpClient const & request, uint64_t "$TrafficNetworkError", alohalytics::TStringMap({{"code", strings::to_string(request.ErrorCode())}})); - return false; + return ServerDataStatus::Error; } string DebugPrint(TrafficInfo::RoadSegmentId const & id) diff --git a/traffic/traffic_info.hpp b/traffic/traffic_info.hpp index 23cbb268f0..b687ab2a6e 100644 --- a/traffic/traffic_info.hpp +++ b/traffic/traffic_info.hpp @@ -117,22 +117,29 @@ public: static void DeserializeTrafficValues(vector const & data, vector & result); private: + enum class ServerDataStatus + { + New, + NotChanged, + NotFound, + Error, + }; + friend void UnitTest_TrafficInfo_UpdateTrafficData(); // todo(@m) A temporary method. Remove it once the keys are added // to the generator and the data is regenerated. bool ReceiveTrafficKeys(); - // Tries to read the values of the Coloring map from server. - // Returns true and updates m_coloring if the values are read successfully and - // their number is equal to the number of keys. + // Tries to read the values of the Coloring map from server into |values|. + // Returns result of communicating with server as ServerDataStatus. // Otherwise, returns false and does not change m_coloring. - bool ReceiveTrafficValues(string & etag, vector & values); + ServerDataStatus ReceiveTrafficValues(string & etag, vector & values); // Updates the coloring and changes the availability status if needed. bool UpdateTrafficData(vector const & values); - bool ProcessFailure(platform::HttpClient const & request, uint64_t const mwmVersion); + ServerDataStatus ProcessFailure(platform::HttpClient const & request, uint64_t const mwmVersion); // The mapping from feature segments to speed groups (see speed_groups.hpp). Coloring m_coloring;