FileMeta.h
Go to the documentation of this file.
1 
22 #pragma once
23 
24 #include "../Access.h"
25 #include "../FileAttributes.h"
26 #include "../Compression.h"
27 
28 namespace IFS
29 {
30 namespace SPIFFS
31 {
35 struct FileMeta {
37  static constexpr uint32_t Magic{0xE3457A77};
38 
39  // Magic
40  uint32_t magic;
41  // Modification time
43  // FileAttributes - default indicates content has changed
45  // Security
47  // Compression
48  struct __attribute__((packed)) {
49  Compression::Type type;
50  uint32_t originalSize;
52 
53  void init()
54  {
55  *this = FileMeta{};
56  magic = Magic;
57  mtime = fsGetTimeUTC();
58  acl.readAccess = UserRole::Admin;
59  acl.writeAccess = UserRole::Admin;
60  }
61 };
62 
63 #define FILEMETA_SIZE 16
64 static_assert(sizeof(FileMeta) == FILEMETA_SIZE, "FileMeta wrong size");
65 
66 #if SPIFFS_OBJ_META_LEN >= FILEMETA_SIZE
67 #define SPIFFS_STORE_META
68 #define SPIFFS_USER_METALEN (SPIFFS_OBJ_META_LEN - FILEMETA_SIZE)
69 #else
70 #define SPIFFS_USER_METALEN 0
71 #endif
72 
75  uint8_t user[SPIFFS_USER_METALEN];
76 
77  enum class Flag {
78  dirty,
79  };
81 
82  void init()
83  {
84  meta.init();
85  memset(user, 0xFF, sizeof(user));
86  }
87 
88  template <typename T> void assign(const T& data)
89  {
90  static_assert(sizeof(data) == offsetof(SpiffsMetaBuffer, flags), "SPIFFS metadata assign() size incorrect");
91  memcpy(reinterpret_cast<void*>(this), data, sizeof(data));
92 
93  // If metadata uninitialised, then initialise it now
94  if(meta.magic != FileMeta::Magic) {
95  meta.init();
96  flags[Flag::dirty] = true;
97  }
98  }
99 
100  void copyTo(Stat& stat)
101  {
102  stat.acl = meta.acl;
103  stat.attr = meta.attr;
104  stat.mtime = meta.mtime;
105  stat.compression = Compression{meta.compression.type, meta.compression.originalSize};
106  }
107 
108  void setAcl(const ACL& newAcl)
109  {
110  if(meta.acl != newAcl) {
111  meta.acl = newAcl;
112  flags[Flag::dirty] = true;
113  }
114  }
115 
116  void setFileTime(time_t t)
117  {
118  if(meta.mtime != t) {
119  meta.mtime = t;
120  flags[Flag::dirty] = true;
121  }
122  }
123 
125  {
126  if(meta.compression.type != c.type || meta.compression.originalSize != c.originalSize) {
127  meta.compression.type = c.type;
128  meta.compression.originalSize = c.originalSize;
129  meta.attr[FileAttribute::Compressed] = (c.type != Compression::Type::None);
130  flags[Flag::dirty] = true;
131  }
132  }
133 
134  void setattr(FileAttributes newAttr)
135  {
136  if(meta.attr != newAttr) {
137  meta.attr = newAttr;
138  flags[Flag::dirty] = true;
139  }
140  }
141 };
142 
143 } // namespace SPIFFS
144 } // namespace IFS
void assign(const T &data)
Definition: FileMeta.h:88
#define FILEMETA_SIZE
Definition: FileMeta.h:63
Type
Definition: Compression.h:39
struct __attribute__((packed))
Definition: FileMeta.h:48
Flag
Definition: FileMeta.h:77
FileAttributes attr
Definition: Stat.h:57
void setAcl(const ACL &newAcl)
Definition: FileMeta.h:108
Compression compression
Definition: Stat.h:56
FileMeta meta
Definition: FileMeta.h:74
BitSet< uint8_t, Flag > flags
Definition: FileMeta.h:80
uint32_t originalSize
Definition: Compression.h:46
FileAttributes attr
Definition: FileMeta.h:44
void init()
Definition: FileMeta.h:82
ACL acl
Access Control.
Definition: Stat.h:58
TimeStamp mtime
Definition: FileMeta.h:42
void setCompression(const Compression &c)
Definition: FileMeta.h:124
Definition: DirectoryTemplate.h:36
Manage IFS timestamps stored as an unsigned 32-bit value.
Definition: TimeStamp.h:35
void setattr(FileAttributes newAttr)
Definition: FileMeta.h:134
Definition: FileMeta.h:73
#define SPIFFS_USER_METALEN
Definition: FileMeta.h:70
File Status structure.
Definition: Stat.h:51
time_t fsGetTimeUTC()
Get current timestamp in UTC.
UserRole readAccess
Definition: Access.h:36
compression
Definition: FileMeta.h:51
void init()
Definition: FileMeta.h:53
Type type
Definition: Compression.h:45
void copyTo(Stat &stat)
Definition: FileMeta.h:100
Definition: Access.h:34
uint32_t magic
Definition: FileMeta.h:40
Content of SPIFFS metadata area.
Definition: FileMeta.h:35
ACL acl
Definition: FileMeta.h:46
TimeStamp mtime
File modification time.
Definition: Stat.h:59
void setFileTime(time_t t)
Definition: FileMeta.h:116
static constexpr uint32_t Magic
This number is made up, but serves to identify that metadata is valid.
Definition: FileMeta.h:37
UserRole writeAccess
Definition: Access.h:37
A compression descriptor.
Definition: Compression.h:38