diff options
author | Arsentiy Milchakov <a.milchakov@corp.mail.ru> | 2016-08-01 16:47:55 +0300 |
---|---|---|
committer | Arsentiy Milchakov <a.milchakov@corp.mail.ru> | 2016-08-09 14:31:23 +0300 |
commit | 73994023b9a409878496c9a3ca4aee959c532eb4 (patch) | |
tree | 6ac5c981ed8e033226740f4888686a76216296c8 /editor | |
parent | 649832fdc7f26414e62c5d5a4ca4cbc9cadde731 (diff) |
first group of tests for editor
Diffstat (limited to 'editor')
-rw-r--r-- | editor/editor.pro | 2 | ||||
-rw-r--r-- | editor/editor_storage.cpp | 71 | ||||
-rw-r--r-- | editor/editor_storage.hpp | 43 |
3 files changed, 116 insertions, 0 deletions
diff --git a/editor/editor.pro b/editor/editor.pro index 79be0528bc..40cc940436 100644 --- a/editor/editor.pro +++ b/editor/editor.pro @@ -19,6 +19,7 @@ SOURCES += \ ui2oh.cpp \ user_stats.cpp \ xml_feature.cpp \ + editor_storage.cpp HEADERS += \ changeset_wrapper.hpp \ @@ -32,3 +33,4 @@ HEADERS += \ user_stats.hpp \ xml_feature.hpp \ yes_no_unknown.hpp \ + editor_storage.hpp diff --git a/editor/editor_storage.cpp b/editor/editor_storage.cpp new file mode 100644 index 0000000000..96dc771b32 --- /dev/null +++ b/editor/editor_storage.cpp @@ -0,0 +1,71 @@ +#include "editor/editor_storage.hpp" + +#include "platform/platform.hpp" + +#include "coding/internal/file_data.hpp" + +#include "base/logging.hpp" + +#include "std/string.hpp" + +#include "3party/pugixml/src/pugixml.hpp" + +using namespace pugi; + +namespace +{ +constexpr char const * kEditorXMLFileName = "edits.xml"; +string GetEditorFilePath() { return GetPlatform().WritablePathForFile(kEditorXMLFileName); } +} // namespace + +namespace editor +{ +bool StorageLocal::Save(xml_document const & doc) +{ + auto const editorFilePath = GetEditorFilePath(); + return my::WriteToTempAndRenameToFile(editorFilePath, [&doc](string const & fileName) { + return doc.save_file(fileName.data(), " "); + }); +} + +bool StorageLocal::Load(xml_document & doc) +{ + auto const editorFilePath = GetEditorFilePath(); + auto const result = doc.load_file(editorFilePath.c_str()); + // Note: status_file_not_found is ok if user has never made any edits. + if (result != status_ok && result != status_file_not_found) + { + LOG(LERROR, ("Can't load map edits from disk:", editorFilePath)); + return false; + } + + return true; +} + +void StorageLocal::Reset() +{ + my::DeleteFileX(GetEditorFilePath()); +} + + +StorageMemory::StorageMemory() + : m_doc(make_unique <xml_document> ()) +{} + +bool StorageMemory::Save(xml_document const & doc) +{ + m_doc->reset(doc); + return true; +} + +bool StorageMemory::Load(xml_document & doc) +{ + doc.reset(*m_doc); + return true; +} + +void StorageMemory::Reset() +{ + m_doc->reset(); +} +} // namespace editor diff --git a/editor/editor_storage.hpp b/editor/editor_storage.hpp new file mode 100644 index 0000000000..d712b6b53c --- /dev/null +++ b/editor/editor_storage.hpp @@ -0,0 +1,43 @@ +#pragma once + +#include "std/unique_ptr.hpp" + +namespace pugi +{ +class xml_document; +} + +namespace editor +{ +// Editor storage interface. +class StorageBase +{ +public: + virtual ~StorageBase() {} + virtual bool Save(pugi::xml_document const & doc) = 0; + virtual bool Load(pugi::xml_document & doc) = 0; + virtual void Reset() = 0; +}; + +// Class which save/load edits to/from local file. +class StorageLocal : public StorageBase +{ +public: + bool Save(pugi::xml_document const & doc) override; + bool Load(pugi::xml_document & doc) override; + void Reset() override; +}; + +// Class which save/load edits to/from xml_document class instance. +class StorageMemory : public StorageBase +{ +public: + StorageMemory(); + bool Save(pugi::xml_document const & doc) override; + bool Load(pugi::xml_document & doc) override; + void Reset() override; + +private: + unique_ptr<pugi::xml_document> m_doc; +}; +} |