supla-device
Loading...
Searching...
No Matches
definition_cache.h
1// SPDX-FileCopyrightText: AC SOFTWARE SP. Z O.O.
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#ifndef SRC_SUPLA_SUPLET_DEFINITION_CACHE_H_
5#define SRC_SUPLA_SUPLET_DEFINITION_CACHE_H_
6
7#include <stddef.h>
8#include <stdint.h>
9#include <supla/suplet/config.h>
10
11namespace Supla {
12
13class Config;
14
15namespace Suplet {
16
18 public:
19 virtual ~Sha256Provider() {
20 }
21 virtual bool calculate(const uint8_t *data,
22 size_t dataSize,
23 uint8_t *output,
24 size_t outputSize) = 0;
25};
26
27#if !defined(SUPLA_TEST) && (defined(ESP32) || defined(SUPLA_DEVICE_ESP32))
28class DefaultSha256Provider : public Sha256Provider {
29 public:
30 bool calculate(const uint8_t *data,
31 size_t dataSize,
32 uint8_t *output,
33 size_t outputSize) override;
34};
35#endif
36
38 uint32_t definitionId = 0;
39 uint16_t definitionVersion = 0;
40 uint16_t jsonSize = 0;
41 uint8_t sha256[32] = {};
42};
43
45 uint8_t slot = 255;
46 uint8_t variant = 0;
47};
48
50 public:
51 DefinitionCache(Supla::Config *config, Sha256Provider *sha256Provider);
52
53 bool save(uint32_t definitionId,
54 uint16_t definitionVersion,
55 const char *json,
56 const uint8_t *expectedSha256);
57 bool load(uint32_t definitionId,
58 uint16_t definitionVersion,
59 char *json,
60 size_t jsonSize,
61 CachedDefinitionInfo *info = nullptr) const;
62 bool contains(uint32_t definitionId, uint16_t definitionVersion) const;
63 bool erase(uint32_t definitionId, uint16_t definitionVersion);
64 bool getInfo(uint8_t index, CachedDefinitionInfo *info) const;
65 bool getInfoAndRepair(uint8_t index, CachedDefinitionInfo *info) const;
66 bool beginStagedSave(uint32_t definitionId,
67 uint16_t definitionVersion,
68 uint16_t jsonSize,
69 const uint8_t *sha256,
70 DefinitionCacheHandle *handle);
71 bool writeStagedChunk(DefinitionCacheHandle handle,
72 uint16_t chunkIndex,
73 const uint8_t *data,
74 uint16_t size);
75 bool loadStaged(DefinitionCacheHandle handle,
76 uint32_t definitionId,
77 uint16_t definitionVersion,
78 char *json,
79 size_t jsonSize,
80 CachedDefinitionInfo *info = nullptr) const;
81 bool commitStaged(DefinitionCacheHandle handle,
82 uint32_t definitionId,
83 uint16_t definitionVersion,
84 uint16_t jsonSize,
85 const uint8_t *sha256);
86 bool abortStaged(DefinitionCacheHandle handle);
87
88 private:
89 bool calculateAndVerify(const char *json,
90 uint16_t jsonSize,
91 const uint8_t *expectedSha256,
92 uint8_t *calculatedSha256) const;
93 bool readActiveHeader(uint8_t index,
95 uint8_t *activeVariant = nullptr,
96 uint16_t *chunkCount = nullptr,
97 uint16_t *chunkSize = nullptr) const;
98 bool loadAndRepairActiveHeader(uint8_t index,
100 uint8_t *activeVariant = nullptr,
101 uint16_t *chunkCount = nullptr,
102 uint16_t *chunkSize = nullptr) const;
103 bool loadHeader(uint8_t index,
104 uint8_t variant,
106 uint16_t *chunkCount = nullptr,
107 uint16_t *chunkSize = nullptr) const;
108 bool saveSlot(uint8_t index,
109 uint32_t definitionId,
110 uint16_t definitionVersion,
111 const char *json,
112 uint16_t jsonSize,
113 const uint8_t *sha256);
114 bool saveHeader(uint8_t index,
115 uint8_t variant,
116 const CachedDefinitionInfo &info,
117 uint16_t chunkCount,
118 uint16_t chunkSize);
119 bool loadPayload(uint8_t slot,
120 uint8_t variant,
121 const CachedDefinitionInfo &info,
122 uint16_t chunkCount,
123 uint16_t chunkSize,
124 char *json,
125 size_t jsonSize) const;
126 bool eraseChunks(uint8_t index, uint8_t variant);
127 bool eraseVariant(uint8_t index, uint8_t variant);
128 bool eraseLegacySlot(uint8_t index);
129 bool eraseSlot(uint8_t index);
130 bool setActiveVariant(uint8_t index, uint8_t variant);
131 bool variantExists(uint8_t index, uint8_t variant) const;
132 bool slotExists(uint8_t index) const;
133 int findSlot(uint32_t definitionId,
134 uint16_t definitionVersion,
135 bool repair) const;
136 int findFreeSlot() const;
137 static uint8_t otherVariant(uint8_t variant);
138 static bool isValidVariant(uint8_t variant);
139 static bool isValidHandle(DefinitionCacheHandle handle);
140 static bool makeActKey(uint8_t index, char *output, size_t outputSize);
141 static bool makeHeaderKey(uint8_t index,
142 uint8_t variant,
143 char *output,
144 size_t outputSize);
145 static bool makeChunkKey(uint8_t index,
146 uint8_t variant,
147 uint16_t chunkIndex,
148 char *output,
149 size_t outputSize);
150 static bool makeLegacyHeaderKey(uint8_t index,
151 char *output,
152 size_t outputSize);
153 static bool makeLegacyChunkKey(uint8_t index,
154 uint16_t chunkIndex,
155 char *output,
156 size_t outputSize);
157
158 Supla::Config *config = nullptr;
159 Sha256Provider *sha256Provider = nullptr;
160};
161
162} // namespace Suplet
163} // namespace Supla
164
165#endif // SRC_SUPLA_SUPLET_DEFINITION_CACHE_H_
Definition config.h:44
Definition definition_cache.h:49
Definition definition_cache.h:17
Definition definition_cache.h:37
Definition definition_cache.h:44