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:
authorSergey Magidovich <mgsergio@mapswithme.com>2016-05-26 18:06:31 +0300
committerSergey Magidovich <mgsergio@mapswithme.com>2016-06-02 11:51:57 +0300
commit27444c4d8cf1b59a879f928ebe5d92179ef8e7e9 (patch)
tree8a004327f74242be9be237387e94263c737a260a /indexer/osm_editor.cpp
parentc5b15e1af26d0d5b989fa47ffea32ced368787ac (diff)
Make features as deleted when place doesn't exist is sent.
Diffstat (limited to 'indexer/osm_editor.cpp')
-rw-r--r--indexer/osm_editor.cpp38
1 files changed, 34 insertions, 4 deletions
diff --git a/indexer/osm_editor.cpp b/indexer/osm_editor.cpp
index 9d7a9ee6f0..fa646a62b5 100644
--- a/indexer/osm_editor.cpp
+++ b/indexer/osm_editor.cpp
@@ -55,6 +55,7 @@ constexpr char const * kXmlMwmNode = "mwm";
constexpr char const * kDeleteSection = "delete";
constexpr char const * kModifySection = "modify";
constexpr char const * kCreateSection = "create";
+constexpr char const * kObsoleteSection = "obsolete";
/// We store edited streets in OSM-compatible way.
constexpr char const * kAddrStreetTag = "addr:street";
@@ -165,13 +166,14 @@ void Editor::LoadMapEdits()
}
}
- array<pair<FeatureStatus, char const *>, 3> const sections =
+ array<pair<FeatureStatus, char const *>, 4> const sections =
{{
{FeatureStatus::Deleted, kDeleteSection},
{FeatureStatus::Modified, kModifySection},
+ {FeatureStatus::Obsolete, kObsoleteSection},
{FeatureStatus::Created, kCreateSection}
}};
- int deleted = 0, modified = 0, created = 0;
+ int deleted = 0, obsolete = 0, modified = 0, created = 0;
bool needRewriteEdits = false;
@@ -230,6 +232,7 @@ void Editor::LoadMapEdits()
{
case FeatureStatus::Deleted: ++deleted; break;
case FeatureStatus::Modified: ++modified; break;
+ case FeatureStatus::Obsolete: ++obsolete; break;
case FeatureStatus::Created: ++created; break;
case FeatureStatus::Untouched: ASSERT(false, ()); continue;
}
@@ -253,7 +256,8 @@ void Editor::LoadMapEdits()
// Save edits with new indexes and mwm version to avoid another migration on next startup.
if (needRewriteEdits)
Save(GetEditorFilePath());
- LOG(LINFO, ("Loaded", modified, "modified,", created, "created and", deleted, "deleted features."));
+ LOG(LINFO, ("Loaded", modified, "modified,",
+ created, "created,", deleted, "deleted and", obsolete, "obsolete features."));
}
bool Editor::Save(string const & fullFilePath) const
@@ -280,6 +284,7 @@ bool Editor::Save(string const & fullFilePath) const
xml_node deleted = mwmNode.append_child(kDeleteSection);
xml_node modified = mwmNode.append_child(kModifySection);
xml_node created = mwmNode.append_child(kCreateSection);
+ xml_node obsolete = mwmNode.append_child(kObsoleteSection);
for (auto const & index : mwm.second)
{
FeatureTypeInfo const & fti = index.second;
@@ -303,6 +308,7 @@ bool Editor::Save(string const & fullFilePath) const
case FeatureStatus::Deleted: VERIFY(xf.AttachToParentNode(deleted), ()); break;
case FeatureStatus::Modified: VERIFY(xf.AttachToParentNode(modified), ()); break;
case FeatureStatus::Created: VERIFY(xf.AttachToParentNode(created), ()); break;
+ case FeatureStatus::Obsolete: VERIFY(xf.AttachToParentNode(obsolete), ()); break;
case FeatureStatus::Untouched: CHECK(false, ("Not edited features shouldn't be here."));
}
}
@@ -404,6 +410,8 @@ Editor::SaveResult Editor::SaveEditedFeature(EditableMapObject const & emo)
FeatureTypeInfo fti;
auto const featureStatus = GetFeatureStatus(fid.m_mwmId, fid.m_index);
+ ASSERT_NOT_EQUAL(featureStatus, FeatureStatus::Obsolete, ("Obsolete feature cannot be modified"));
+
bool const wasCreatedByUser = IsCreatedFeature(fid);
if (wasCreatedByUser && featureStatus == FeatureStatus::Untouched)
{
@@ -571,6 +579,9 @@ EditableProperties Editor::GetEditableProperties(FeatureType const & feature) co
if (!version::IsSingleMwm(feature.GetID().m_mwmId.GetInfo()->m_version.GetVersion()))
return {};
+ if (GetFeatureStatus(feature.GetID()) == FeatureStatus::Obsolete)
+ return {};
+
// TODO(mgsergio): Check if feature is in the area where editing is disabled in the config.
auto editableProperties = GetEditablePropertiesForTypes(feature::TypesHolder(feature));
@@ -675,7 +686,7 @@ void Editor::UploadChanges(string const & key, string const & secret, TChangeset
switch (fti.m_status)
{
case FeatureStatus::Untouched: CHECK(false, ("It's impossible.")); continue;
-
+ case FeatureStatus::Obsolete: continue; // Obsolete features will be deleted by OSMers.
case FeatureStatus::Created:
{
XMLFeature feature = fti.m_feature.ToXML(true);
@@ -893,6 +904,23 @@ void Editor::Invalidate()
m_invalidateFn();
}
+void Editor::MarkFeatureAsObsolete(FeatureID const & fid)
+{
+ auto const featureStatus = GetFeatureStatus(fid);
+ ASSERT(featureStatus == FeatureStatus::Untouched ||
+ featureStatus == FeatureStatus::Modified,
+ ("Created or deleted features can't be obsolete"));
+
+ auto & fti = m_features[fid.m_mwmId][fid.m_index];
+ // If a feature was modified we can drop all changes since it's now obsolete.
+ fti.m_feature = *m_getOriginalFeatureFn(fid);
+ fti.m_status = FeatureStatus::Obsolete;
+ fti.m_modificationTimestamp = time(nullptr);
+
+ Save(GetEditorFilePath());
+ Invalidate();
+}
+
Editor::Stats Editor::GetStats() const
{
Stats stats;
@@ -966,6 +994,7 @@ void Editor::CreateNote(ms::LatLon const & latLon, FeatureID const & fid,
sstr << kPlaceDoesNotExistMessage;
if (!note.empty())
sstr << " User comments: \"" << note << '\"';
+ MarkFeatureAsObsolete(fid);
break;
case NoteProblemType::General:
sstr << note;
@@ -988,6 +1017,7 @@ string DebugPrint(Editor::FeatureStatus fs)
{
case Editor::FeatureStatus::Untouched: return "Untouched";
case Editor::FeatureStatus::Deleted: return "Deleted";
+ case Editor::FeatureStatus::Obsolete: return "Obsolete";
case Editor::FeatureStatus::Modified: return "Modified";
case Editor::FeatureStatus::Created: return "Created";
};