ObjectBuffer.h
Go to the documentation of this file.
1 
20 #pragma once
21 
23 #include "../include/IFS/FWFS/Object.h"
24 
25 namespace IFS
26 {
27 namespace FWFS
28 {
33 {
34 public:
35  void write(const void* data, size_t size)
36  {
37  auto n = MemoryDataStream::write(static_cast<const uint8_t*>(data), size);
38  (void)n;
39  assert(n == size);
40  }
41 
42  void write(const String& value)
43  {
44  write(value.c_str(), value.length());
45  }
46 
47  void write(const NameBuffer& value)
48  {
49  write(value.c_str(), value.length);
50  }
51 
52  void write(uint32_t value)
53  {
54  return write(&value, sizeof(value));
55  }
56 
57  void write(const Object& hdr, size_t extra, size_t bodySize)
58  {
59  size_t headerSize = hdr.contentOffset() + extra;
60  if(bodySize != 0) {
61  ensureCapacity(getSize() + headerSize + bodySize);
62  }
63  write(&hdr, headerSize);
64  }
65 
66  void writeRef(Object::Type type, Object::ID objId)
67  {
68  Object hdr;
69  hdr.setType(type, true);
70  hdr.data8.ref.packedOffset = objId;
71  size_t idSize = (objId <= 0xff) ? 1 : (objId <= 0xffff) ? 2 : (objId <= 0xffffff) ? 3 : 4;
72  hdr.data8.setContentSize(idSize);
73  write(hdr, idSize, 0);
74  }
75 
77  {
78  Object hdr;
79  if(size <= 0xff) {
80  hdr.setType(Object::Type::Data8);
81  hdr.data8.setContentSize(size);
82  } else if(size <= 0xffff) {
83  hdr.setType(Object::Type::Data16);
84  hdr.data16.setContentSize(size);
85  } else {
86  hdr.setType(Object::Type::Data24);
87  hdr.data24.setContentSize(size);
88  }
89  write(hdr, 0, 0);
90  return hdr.type();
91  }
92 
93  void writeNamed(Object::Type type, const char* name, uint8_t namelen, TimeStamp mtime)
94  {
95  Object hdr;
96  hdr.setType(type);
97  hdr.data16.named.namelen = namelen;
98  hdr.data16.named.mtime = mtime;
99  write(hdr, hdr.data16.named.nameOffset(), namelen);
100  write(name, namelen);
101  }
102 
103  void fixupSize()
104  {
105  auto objptr = getStreamPointer();
106  Object hdr;
107  memcpy(&hdr, objptr, 4);
108  hdr.setContentSize(available() - hdr.contentOffset());
109  memcpy(const_cast<char*>(objptr), &hdr, 4);
110  }
111 };
112 
113 } // namespace FWFS
114 } // namespace IFS
uint16_t length
OUT: length of name.
Definition: NameBuffer.h:47
void write(const void *data, size_t size)
Definition: ObjectBuffer.h:35
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:641
size_t contentOffset() const
return offset to start of object content
Definition: Object.h:383
The String class.
Definition: WString.h:136
const char * getStreamPointer() const
Get a pointer to the current position.
Definition: MemoryDataStream.h:51
int available() override
Return the total length of the stream.
Definition: MemoryDataStream.h:60
uint32_t ID
Object identifier (offset from start of image)
Definition: Object.h:150
bool ensureCapacity(size_t minCapacity)
Pre-allocate stream to given size.
Type
Definition: Object.h:152
void write(uint32_t value)
Definition: ObjectBuffer.h:52
struct IFS::FWFS::Object::@25::@28 data16
Definition: DirectoryTemplate.h:36
Manage IFS timestamps stored as an unsigned 32-bit value.
Definition: TimeStamp.h:35
Class to manage writing object data into a stream.
Definition: ObjectBuffer.h:32
size_t length(void) const
Obtain the String length in characters, excluding NUL terminator.
Definition: WString.h:237
void write(const NameBuffer &value)
Definition: ObjectBuffer.h:47
size_t write(const uint8_t *buffer, size_t size) override
Write chars to end of stream.
struct IFS::FWFS::Object::@25::@27 data8
Type type() const
Definition: Object.h:187
Object::Type writeDataHeader(size_t size)
Definition: ObjectBuffer.h:76
void setType(Type type, bool isRef=false)
Definition: Object.h:192
void writeRef(Object::Type type, Object::ID objId)
Definition: ObjectBuffer.h:66
struct IFS::FWFS::Object::@25::@29 data24
Object structure.
Definition: Object.h:144
void write(const Object &hdr, size_t extra, size_t bodySize)
Definition: ObjectBuffer.h:57
size_t getSize() const
Definition: MemoryDataStream.h:107
void writeNamed(Object::Type type, const char *name, uint8_t namelen, TimeStamp mtime)
Definition: ObjectBuffer.h:93
void fixupSize()
Definition: ObjectBuffer.h:103
defines a &#39;safe&#39; name buffer
Definition: NameBuffer.h:44
void setContentSize(size_t size)
Definition: Object.h:409
const char * c_str() const
Definition: NameBuffer.h:74
Read/write stream using expandable memory buffer.
Definition: MemoryDataStream.h:26
void write(const String &value)
Definition: ObjectBuffer.h:42