[traffic] Invalidate per MWM on download (untested)

Signed-off-by: mvglasow <michael -at- vonglasow.com>
This commit is contained in:
mvglasow
2025-06-24 21:55:17 +03:00
parent f02b1538e7
commit 23922f1c2b
3 changed files with 65 additions and 1 deletions

View File

@@ -290,6 +290,58 @@ void TrafficManager::Invalidate()
UpdateMyPosition(m_currentPosition.first);
}
void TrafficManager::Invalidate(MwmSet::MwmId const & mwmId)
{
auto const mwmRect = mwmId.GetInfo()->m_bordersRect; // m2::RectD
traffxml::TraffFeed invalidated;
{
std::lock_guard<std::mutex> lock(m_mutex);
for (auto it = m_messageCache.begin(); it != m_messageCache.end(); )
{
if (!it->second.m_location)
continue;
bool isInvalid = false;
// invalidate if decoded location uses a previous version of the MWM
for (auto const & [decodedMwmId, coloring] : it->second.m_decoded)
if (decodedMwmId.GetInfo()->GetCountryName() == mwmId.GetInfo()->GetCountryName())
isInvalid = true;
// invalidate if bounding rect of reference points intersects with bounding rect of MWM
if (!isInvalid)
{
m2::RectD locationRect;
for (auto const & point : {it->second.m_location.value().m_from,
it->second.m_location.value().m_via,
it->second.m_location.value().m_at,
it->second.m_location.value().m_to})
if (point)
locationRect.Add(mercator::FromLatLon(point.value().m_coordinates));
isInvalid = locationRect.IsIntersect(mwmRect);
}
if (isInvalid)
{
traffxml::TraffMessage message(it->second);
message.m_decoded.clear();
invalidated.push_back(message);
it = m_messageCache.erase(it);
}
else
++it;
}
if (!invalidated.empty())
{
m_feedQueue.insert(m_feedQueue.begin(), invalidated);
m_condition.notify_one();
}
}
}
void TrafficManager::UpdateActiveMwms(m2::RectD const & rect,
std::vector<MwmSet::MwmId> & lastMwmsByRect,
std::set<MwmSet::MwmId> & activeMwms)