ACF $AcfVersion:0$
TDeviceBasedSerializerComp.h
Go to the documentation of this file.
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ACF-Commercial
2#pragma once
3
4
5// ACF includes
9
10
11namespace ifile
12{
13
14
20template <class ReadArchive, class WriteArchive>
22{
23public:
25
26 I_BEGIN_COMPONENT(TDeviceBasedSerializerComp);
27 I_ASSIGN(m_versionInfoCompPtr, "VersionInfo", "Provide information about archive versions", false, "VersionInfo");
28 I_END_COMPONENT;
29
30 // reimplemented (ifile::IDeviceBasedPersistence)
31 virtual bool IsDeviceOperationSupported(const istd::IChangeable& dataObject, const QIODevice& device, int deviceOperation) const override;
34 QIODevice& device,
35 ibase::IProgressManager* progressManagerPtr = nullptr) const override;
37 const istd::IChangeable& data,
38 QIODevice& device,
39 ibase::IProgressManager* progressManagerPtr = nullptr) const override;
40
41 // Wrapper classes for archives
42 class ReadArchiveEx: public ReadArchive
43 {
44 public:
45 typedef ReadArchive BaseClass;
46
47 ReadArchiveEx(QIODevice& device, const istd::ILogger* loggerPtr)
48 : ReadArchive(device),
49 m_loggerPtr(loggerPtr)
50 {
51 }
52
53 virtual bool SendLogMessage(
55 int id,
56 const QString& message,
57 const QString& messageSource,
58 int flags = 0) const
59 {
60 if (m_loggerPtr != nullptr){
61 QString correctedMessage = message;
62 QString correctedMessageSource = messageSource;
63
64 BaseClass::DecorateMessage(category, id, flags, correctedMessage, correctedMessageSource);
65
66 return m_loggerPtr->SendLogMessage(istd::IInformationProvider::IC_INFO, id, correctedMessage, correctedMessageSource, flags);
67 }
68
69 return false;
70 }
71
72 protected:
73 // reimplemented (istd::ILogger)
74 virtual bool IsLogConsumed(
76 const int* flagsPtr = nullptr) const override
77 {
79
80 return (m_loggerPtr != nullptr) && m_loggerPtr->IsLogConsumed(&slaveCategory, flagsPtr);
81 }
82
83 private:
84 const istd::ILogger* m_loggerPtr;
85 };
86
87 class WriteArchiveEx: public WriteArchive
88 {
89 public:
90 typedef WriteArchive BaseClass;
91
92 WriteArchiveEx(QIODevice& device, const iser::IVersionInfo* infoPtr, const istd::ILogger* loggerPtr)
93 : WriteArchive(device, infoPtr),
94 m_loggerPtr(loggerPtr)
95 {
96 }
97
98 virtual bool SendLogMessage(
100 int id,
101 const QString& message,
102 const QString& messageSource,
103 int flags = 0) const
104 {
105 if (m_loggerPtr != nullptr){
106 QString correctedMessage = message;
107 QString correctedMessageSource = messageSource;
108
109 BaseClass::DecorateMessage(category, id, flags, correctedMessage, correctedMessageSource);
110
111 return m_loggerPtr->SendLogMessage(category, id, correctedMessage, correctedMessageSource, flags);
112 }
113
114 return false;
115 }
116
117 protected:
118 // reimplemented (istd::ILogger)
119 virtual bool IsLogConsumed(
121 const int* flagsPtr = nullptr) const override
122 {
124
125 return (m_loggerPtr != nullptr) && m_loggerPtr->IsLogConsumed(&slaveCategory, flagsPtr);
126 }
127
128 private:
129 const istd::ILogger* m_loggerPtr;
130 };
131
132protected:
136 virtual const iser::IVersionInfo* GetVersionInfo() const;
137
141 bool CheckMinimalVersion(const iser::ISerializable& object, const iser::IVersionInfo& versionInfo) const;
142
146 virtual void OnReadError(const ReadArchive& archive, const istd::IChangeable& data) const;
147private:
148 I_REF(iser::IVersionInfo, m_versionInfoCompPtr);
149};
150
151
152// public methods
153
154// reimplemented (ifile::IFilePersistence)
155
156template <class ReadArchive, class WriteArchive>
158 const istd::IChangeable& /*dataObject*/,
159 const QIODevice& /*device*/,
160 int /*deviceOperation*/) const
161{
162 return true;
163}
164
165
166template <class ReadArchive, class WriteArchive>
168 istd::IChangeable& data,
169 QIODevice& device,
170 ibase::IProgressManager* /*progressManagerPtr*/) const
171{
172 if (IsDeviceOperationSupported(data, device, ReadOperation)){
173 ReadArchiveEx archive(device, this);
174
175 Q_ASSERT(!archive.IsStoring());
176
177 iser::ISerializable* serializablePtr = dynamic_cast<iser::ISerializable*>(&data);
178 if (serializablePtr == nullptr){
179 serializablePtr = CompCastPtr<iser::ISerializable>(&data);
180 }
181
182 Q_ASSERT(serializablePtr != nullptr);
183
184 if (serializablePtr->Serialize(archive)){
185 return Successful;
186 }
187 else{
188 OnReadError(archive, data);
189 }
190 }
191
192 return Failed;
193}
194
195
196template <class ReadArchive, class WriteArchive>
198 const istd::IChangeable& data,
199 QIODevice& device,
200 ibase::IProgressManager* /*progressManagerPtr*/) const
201{
202 if (IsDeviceOperationSupported(data, device, WriteOperation)){
203 WriteArchiveEx archive(device, GetVersionInfo(), this);
204 Q_ASSERT(archive.IsStoring());
205
206 const iser::ISerializable* serializablePtr = dynamic_cast<const iser::ISerializable*>(&data);
207 if(serializablePtr == nullptr){
208 serializablePtr = CompCastPtr<iser::ISerializable>(&data);
209 }
210 Q_ASSERT(serializablePtr != nullptr);
211
212 if (!CheckMinimalVersion(*serializablePtr, archive.GetVersionInfo())){
213 SendWarningMessage(UnsupportedArchiveVersion, QObject::tr("Archive version is not supported, possible lost of data"));
214 }
215
216 if ((const_cast<iser::ISerializable*>(serializablePtr))->Serialize(archive)){
217 return Successful;
218 }
219 else{
220 SendInfoMessage(WriteOperationFailed, QObject::tr("Cannot serialize object"));
221 }
222 }
223
224 return Failed;
225}
226
227
228// protected methods
229
230template <class ReadArchive, class WriteArchive>
232{
233 return m_versionInfoCompPtr.GetPtr();
234}
235
236
237
238template <class ReadArchive, class WriteArchive>
240{
242
243 for (iser::IVersionInfo::VersionIds::const_iterator iter = ids.begin();
244 iter != ids.end();
245 ++iter) {
246 int id = *iter;
247
248 quint32 objectMinimalVersion = object.GetMinimalVersion(id);
249
250 quint32 versionNumber;
251 if (versionInfo.GetVersionNumber(id, versionNumber)) {
252 if (versionNumber < objectMinimalVersion) {
253 return false;
254 }
255 }
256 }
257
258 return true;
259}
260
261
262template <class ReadArchive, class WriteArchive>
264 const ReadArchive& /*archive*/,
265 const istd::IChangeable& /*data*/) const
266{
267 SendWarningMessage(ReadOperationFailed, QString(QObject::tr("Cannot load object")) );
268}
269
270
271} // namespace ifile
272
273
Consume information about progress of some process.
Interface providing reading and writing data objects via I/O-devices.
OperationState
Result of device-related operation.
virtual bool SendLogMessage(istd::IInformationProvider::InformationCategory category, int id, const QString &message, const QString &messageSource, int flags=0) const
ReadArchiveEx(QIODevice &device, const istd::ILogger *loggerPtr)
virtual bool IsLogConsumed(const istd::IInformationProvider::InformationCategory *, const int *flagsPtr=nullptr) const override
virtual bool IsLogConsumed(const istd::IInformationProvider::InformationCategory *, const int *flagsPtr=nullptr) const override
virtual bool SendLogMessage(istd::IInformationProvider::InformationCategory category, int id, const QString &message, const QString &messageSource, int flags=0) const
WriteArchiveEx(QIODevice &device, const iser::IVersionInfo *infoPtr, const istd::ILogger *loggerPtr)
Template implementation of file serializer using loading and storing archive implementation.
virtual const iser::IVersionInfo * GetVersionInfo() const
Get working version info.
virtual ifile::IDeviceBasedPersistence::OperationState WriteToDevice(const istd::IChangeable &data, QIODevice &device, ibase::IProgressManager *progressManagerPtr=nullptr) const override
This function writes data data to the given I/O-device device.
virtual ifile::IDeviceBasedPersistence::OperationState ReadFromDevice(istd::IChangeable &data, QIODevice &device, ibase::IProgressManager *progressManagerPtr=nullptr) const override
This function loads data data from the given I/O-device device.
bool CheckMinimalVersion(const iser::ISerializable &object, const iser::IVersionInfo &versionInfo) const
Check if the minimal version of some serializable object is supported by version info.
virtual bool IsDeviceOperationSupported(const istd::IChangeable &dataObject, const QIODevice &device, int deviceOperation) const override
Returns true if object dataObject can be processed via defined I/O-device.
virtual void OnReadError(const ReadArchive &archive, const istd::IChangeable &data) const
Called if read error is occurred.
Template wrapper adding comprehensive logging functionality to components.
virtual void DecorateMessage(istd::IInformationProvider::InformationCategory category, int id, int flags, QString &message, QString &messageSource) const override
Decorate message before sending.
Common class for all classes which objects can be archived or restored from archive.
virtual bool Serialize(IArchive &archive)=0
Load or store state of this object as a archive stream.
Provides access to version information.
virtual bool GetVersionNumber(int versionId, quint32 &result) const =0
Get version of archived stream for specific versioning type.
QSet< int > VersionIds
virtual VersionIds GetVersionIds() const =0
Get list of version ID's.
Common interface for data model objects, which can be changed.
Definition IChangeable.h:28
InformationCategory
Category of information.
@ IC_INFO
Normal information level.
Common interface for classes sending some log info.
Definition ILogger.h:23
virtual bool SendLogMessage(IInformationProvider::InformationCategory category, int id, const QString &message, const QString &messageSource, int flags=0) const
Send any message to log.
Definition ILogger.h:72
virtual bool IsLogConsumed(const IInformationProvider::InformationCategory *categoryPtr=NULL, const int *flagsPtr=NULL) const
Check if any log message is consumed.
Definition ILogger.h:64
Contains interfaces and implementations of file system related components.