F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
SerializableFile.cpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title SerializableFile.cpp
3 // \author dinkel
4 // \brief cpp file for SerializableFile
5 //
6 // \copyright
7 // Copyright 2009-2016, by the California Institute of Technology.
8 // ALL RIGHTS RESERVED. United States Government Sponsorship
9 // acknowledged.
10 //
11 // ======================================================================
12 
14 #include "Fw/Types/Assert.hpp"
15 #include "Os/File.hpp"
16 
17 namespace Fw {
18 
20  : m_allocator(allocator),
21  m_recoverable(false), // for compiler; not used
22  m_actualSize(maxSerializedSize),
23  m_buffer(static_cast<U8*>(this->m_allocator->allocate(0, m_actualSize, m_recoverable)), m_actualSize) {
24  // assert if allocator returns smaller size
25  FW_ASSERT(maxSerializedSize == m_actualSize, static_cast<FwAssertArgType>(maxSerializedSize),
26  static_cast<FwAssertArgType>(m_actualSize));
27  FW_ASSERT(nullptr != m_buffer.getBuffAddr());
28 }
29 
31  this->m_allocator->deallocate(0, this->m_buffer.getBuffAddr());
32 }
33 
34 SerializableFile::Status SerializableFile::load(const char* fileName, Serializable& serializable) {
35  Os::File file;
36  Os::File::Status status;
37  status = file.open(fileName, Os::File::OPEN_READ);
38  if (Os::File::OP_OK != status) {
39  return FILE_OPEN_ERROR;
40  }
41 
42  FwSizeType length = this->m_buffer.getCapacity();
43  status = file.read(this->m_buffer.getBuffAddr(), length, Os::File::WaitType::NO_WAIT);
44  if (Os::File::OP_OK != status) {
45  file.close();
46  return FILE_READ_ERROR;
47  }
48  file.close();
49 
50  this->reset();
51  SerializeStatus serStatus;
52  serStatus = this->m_buffer.setBuffLen(length);
53  FW_ASSERT(FW_SERIALIZE_OK == serStatus, serStatus);
54  serStatus = serializable.deserializeFrom(this->m_buffer);
55  if (FW_SERIALIZE_OK != serStatus) {
56  return DESERIALIZATION_ERROR;
57  }
58 
60 }
61 
62 SerializableFile::Status SerializableFile::save(const char* fileName, Serializable& serializable) {
63  this->reset();
64  SerializeStatus serStatus = serializable.serializeTo(this->m_buffer);
65  FW_ASSERT(FW_SERIALIZE_OK == serStatus, serStatus);
66 
67  Os::File file;
68  Os::File::Status status;
69  status = file.open(fileName, Os::File::OPEN_WRITE);
70  if (Os::File::OP_OK != status) {
71  return FILE_OPEN_ERROR;
72  }
73 
74  FwSizeType length = this->m_buffer.getSize();
75  status = file.write(this->m_buffer.getBuffAddr(), length);
76  if ((Os::File::OP_OK != status) || (length != this->m_buffer.getSize())) {
77  file.close();
78  return FILE_WRITE_ERROR;
79  }
80 
81  file.close();
82 
84 }
85 
86 void SerializableFile::reset() {
87  this->m_buffer.resetSer();
88  this->m_buffer.resetDeser();
89 }
90 } // namespace Fw
Serialization/Deserialization operation was successful.
Status load(const char *fileName, Serializable &serializable)
PlatformSizeType FwSizeType
virtual SerializeStatus serializeTo(SerialBufferBase &buffer, Endianness mode=Endianness::BIG) const =0
Serialize the contents of this object to a buffer.
Serializable::SizeType getSize() const override
Get current buffer size.
virtual SerializeStatus deserializeFrom(SerialBufferBase &buffer, Endianness mode=Endianness::BIG)=0
Deserialize the contents of this object from a buffer.
Open file for writing.
Definition: File.hpp:33
Os::FileInterface::Status open(const char *path, Mode mode)
open file with supplied path and mode
SerializeStatus
forward declaration for string
Status save(const char *fileName, Serializable &serializable)
void resetDeser() override
Reset deserialization pointer to beginning of buffer.
void resetSer() override
Reset serialization pointer to beginning of buffer.
void close() override
close the file, if not opened then do nothing
Definition: File.cpp:70
Status write(const U8 *buffer, FwSizeType &size)
write data to this file from the supplied buffer bounded by size
Definition: File.cpp:187
FwSizeType getCapacity() const
Get buffer capacity.
SerializableFile(MemAllocator *allocator, FwSizeType maxSerializedSize)
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:53
Status read(U8 *buffer, FwSizeType &size)
read data from this file into supplied buffer bounded by size
Definition: File.cpp:168
Memory Allocation base class.
Operation was successful.
Definition: File.hpp:40
Open file for reading.
Definition: File.hpp:31
U8 * getBuffAddr()
Get buffer address for data filling (non-const version)
virtual void deallocate(const FwEnumStoreType identifier, void *ptr)=0
SerializeStatus setBuffLen(Serializable::SizeType length) override
Set buffer length manually.
Implementation of malloc based allocator.
#define FW_ASSERT(...)
Definition: Assert.hpp:14