|
2 | 2 | #include <helpers/TxtDataHelpers.h> |
3 | 3 | #include <SHA256.h> |
4 | 4 |
|
| 5 | +// helper class for region map exporter, we emulate Stream with a safe buffer writer. |
| 6 | + |
| 7 | +class BufStream : public Stream { |
| 8 | +public: |
| 9 | + BufStream(char *buf, size_t max) |
| 10 | + : _buf(buf), _max(max), _pos(0) { |
| 11 | + if (_max > 0) _buf[0] = 0; |
| 12 | + } |
| 13 | + |
| 14 | + size_t write(uint8_t c) override { |
| 15 | + if (_pos + 1 >= _max) return 0; |
| 16 | + _buf[_pos++] = c; |
| 17 | + _buf[_pos] = 0; |
| 18 | + return 1; |
| 19 | + } |
| 20 | + |
| 21 | + size_t write(const uint8_t *buffer, size_t size) override { |
| 22 | + size_t written = 0; |
| 23 | + while (written < size) { |
| 24 | + if (!write(buffer[written])) break; |
| 25 | + written++; |
| 26 | + } |
| 27 | + return written; |
| 28 | + } |
| 29 | + |
| 30 | + int available() override { return 0; } |
| 31 | + int read() override { return -1; } |
| 32 | + int peek() override { return -1; } |
| 33 | + void flush() override {} |
| 34 | + |
| 35 | + size_t length() const { return _pos; } |
| 36 | + |
| 37 | +private: |
| 38 | + char *_buf; |
| 39 | + size_t _max; |
| 40 | + size_t _pos; |
| 41 | +}; |
| 42 | + |
| 43 | + |
5 | 44 | RegionMap::RegionMap(TransportKeyStore& store) : _store(&store) { |
6 | 45 | next_id = 1; num_regions = 0; home_id = 0; |
7 | 46 | wildcard.id = wildcard.parent = 0; |
@@ -249,25 +288,40 @@ void RegionMap::exportTo(Stream& out) const { |
249 | 288 | printChildRegions(0, &wildcard, out); // recursive |
250 | 289 | } |
251 | 290 |
|
252 | | -int RegionMap::exportNamesTo(char *dest, int max_len, uint8_t mask) { |
| 291 | +size_t RegionMap::exportTo(char *dest, size_t max_len) const { |
| 292 | + if (!dest || max_len == 0) return 0; |
| 293 | + |
| 294 | + BufStream bs(dest, max_len); |
| 295 | + exportTo(bs); // ← reuse existing logic |
| 296 | + return bs.length(); |
| 297 | +} |
| 298 | + |
| 299 | +int RegionMap::exportNamesTo(char *dest, int max_len, uint8_t mask, bool invert) { |
253 | 300 | char *dp = dest; |
254 | | - if ((wildcard.flags & mask) == 0) { |
| 301 | + |
| 302 | + // Check wildcard region |
| 303 | + bool wildcard_matches = invert ? (wildcard.flags & mask) : !(wildcard.flags & mask); |
| 304 | + if (wildcard_matches) { |
255 | 305 | *dp++ = '*'; |
256 | 306 | *dp++ = ','; |
257 | 307 | } |
258 | 308 |
|
259 | | - for (int i = 0; i < num_regions; i++) { |
| 309 | + for (int i = 0; i < num_regions; i++) { |
260 | 310 | auto region = ®ions[i]; |
261 | | - if ((region->flags & mask) == 0) { // region allowed? (per 'mask' param) |
262 | | - const char* name = skip_hash(region->name); |
263 | | - int len = strlen(name); |
| 311 | + |
| 312 | + // Check if region matches the filter criteria |
| 313 | + bool region_matches = invert ? (region->flags & mask) : !(region->flags & mask); |
| 314 | + |
| 315 | + if (region_matches) { |
| 316 | + int len = strlen(skip_hash(region->name)); |
264 | 317 | if ((dp - dest) + len + 2 < max_len) { // only append if name will fit |
265 | | - memcpy(dp, name, len); |
| 318 | + memcpy(dp, skip_hash(region->name), len); |
266 | 319 | dp += len; |
267 | 320 | *dp++ = ','; |
268 | 321 | } |
269 | 322 | } |
270 | 323 | } |
| 324 | + |
271 | 325 | if (dp > dest) { dp--; } // don't include trailing comma |
272 | 326 |
|
273 | 327 | *dp = 0; // set null terminator |
|
0 commit comments