diff options
author | Sergey Magidovich <mgsergio@mapswithme.com> | 2016-05-26 18:06:31 +0300 |
---|---|---|
committer | Sergey Magidovich <mgsergio@mapswithme.com> | 2016-06-02 11:51:57 +0300 |
commit | 27444c4d8cf1b59a879f928ebe5d92179ef8e7e9 (patch) | |
tree | 8a004327f74242be9be237387e94263c737a260a /indexer/osm_editor.cpp | |
parent | c5b15e1af26d0d5b989fa47ffea32ced368787ac (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.cpp | 38 |
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"; }; |