Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
OptionsFile.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
5#include "Stroika/Foundation/Streams/MemoryStream.h"
6
8
9 /*
10 ********************************************************************************
11 ************************** DataExchange::OptionsFile ***************************
12 ********************************************************************************
13 */
14 template <typename T>
15 optional<T> OptionsFile::Read ()
16 {
17 optional<VariantValue> tmp = Read<VariantValue> ();
18 if (not tmp.has_value ()) {
19 return {};
20 }
21 try {
22 return fMapper_.ToObject<T> (*tmp);
23 }
24 catch (const BadFormatException& /*bf*/) {
25 fLogger_ (LoggerMessage (LoggerMessage::Msg::eFailedToParseReadFileBadFormat, GetReadFilePath_ ()));
26 return nullopt;
27 }
28 catch (...) {
29 // if this fails, its probably because somehow the data in the config file was bad.
30 // So at least log that, and continue without reading anything (as if empty file)
31 fLogger_ (LoggerMessage (LoggerMessage::Msg::eFailedToParseReadFile, GetReadFilePath_ ()));
32 return nullopt;
33 }
34 }
35 template <typename T>
36 T OptionsFile::Read (const T& defaultObj, ReadFlags readFlags)
37 {
38 optional<T> eltRead = Read<T> ();
39 optional<T> elt2Write; // only if needed
40
41 LoggerMessage::Msg msgAugment = LoggerMessage::Msg::eWritingConfigFile_SoDefaultsEditable;
42 if (not eltRead.has_value ()) {
43 if (readFlags == ReadFlags::eWriteIfChanged) {
44 elt2Write = defaultObj;
45 msgAugment = LoggerMessage::Msg::eWritingConfigFile_SoDefaultsEditable;
46 }
47 }
48 else {
49 if (readFlags == ReadFlags::eWriteIfChanged) {
50 if (not elt2Write.has_value ()) {
51 // if filename differs - upgrading
52 if (GetReadFilePath_ () != GetWriteFilePath_ ()) {
53 elt2Write = eltRead;
54 msgAugment = LoggerMessage::Msg::eWritingConfigFile_BecauseUpgraded;
55 }
56 }
57 if (not elt2Write.has_value ()) {
58 try {
59 // See if re-persisting the item would change it.
60 // This is useful if your data model adds or removes fields. It updates the file contents written to the
61 // upgraded/latest form.
62 Memory::BLOB oldData = ReadRaw (); // @todo could have saved from previous Read<T>
63 Memory::BLOB newData;
64 {
65 Streams::MemoryStream::Ptr<byte> outStream = Streams::MemoryStream::New<byte> ();
66 fWriter_.Write (fMapper_.FromObject (*eltRead), outStream);
67 // not sure needed? outStream.Flush();
68 newData = outStream.As<Memory::BLOB> ();
69 }
70 if (oldData != newData) {
71 elt2Write = eltRead;
72 msgAugment = LoggerMessage::Msg::eWritingConfigFile_BecauseSomethingChanged;
73 }
74 }
75 catch (...) {
76 fLogger_ (LoggerMessage (LoggerMessage::Msg::eFailedToCompareReadFile, GetReadFilePath_ ()));
77 }
78 }
79 }
80 }
81 if (elt2Write.has_value ()) {
82 fLogger_ (LoggerMessage (msgAugment, GetWriteFilePath_ ()));
83 try {
84 Write (*elt2Write);
85 }
86 catch (...) {
87 fLogger_ (LoggerMessage (LoggerMessage::Msg::eFailedToWriteInUseValues, GetWriteFilePath_ ()));
88 }
89 return *elt2Write;
90 }
91 else if (eltRead.has_value ()) {
92 return *eltRead;
93 }
94 else {
95 return defaultObj;
96 }
97 }
98 template <typename T>
99 void OptionsFile::Write (const T& optionsObject)
100 {
101 Write<VariantValue> (fMapper_.FromObject<T> (optionsObject));
102 }
103
104}
nonvirtual VariantValue FromObject(const T &from) const
nonvirtual T ToObject(const VariantValue &v) const
nonvirtual void Write(const T &optionsObject)
nonvirtual void Write(const VariantValue &v, const Streams::OutputStream::Ptr< byte > &out) const
Definition Writer.inl:30