deserialize_file

This commit is contained in:
folkert van heusden 2024-05-20 19:31:43 +02:00
parent 98ddb215e9
commit 6f20af4b2c
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1
3 changed files with 39 additions and 20 deletions

View file

@ -570,28 +570,11 @@ int main(int argc, char *argv[])
set_boot_loader(b, bootloader); set_boot_loader(b, bootloader);
} }
else { else {
FILE *fh = fopen(deserialize.c_str(), "r"); auto rc = deserialize_file(deserialize);
if (!fh) if (rc.has_value() == false)
error_exit(true, "Failed to open %s", deserialize.c_str()); error_exit(true, "Failed to open %s", deserialize.c_str());
std::string j_in; b = bus::deserialize(rc.value(), cnsl, &event);
char buffer[4096];
for(;;) {
char *rc = fgets(buffer, sizeof buffer, fh);
if (!rc)
break;
j_in += buffer;
}
fclose(fh);
JsonDocument j;
DeserializationError error = deserializeJson(j, j_in);
if (error)
error_exit(true, "State file %s is corrupt: %s", deserialize.c_str(), error.c_str());
b = bus::deserialize(j, cnsl, &event);
myusleep(251000); myusleep(251000);
} }

View file

@ -17,7 +17,9 @@
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif
#include <ArduinoJson.h>
#include <errno.h> #include <errno.h>
#include <optional>
#include <pthread.h> #include <pthread.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdint.h> #include <stdint.h>
@ -269,3 +271,33 @@ std::string get_endpoint_name(const int fd)
return std::string(inet_ntoa(addr.sin_addr)) + "." + format("%d", ntohs(addr.sin_port)); return std::string(inet_ntoa(addr.sin_addr)) + "." + format("%d", ntohs(addr.sin_port));
} }
std::optional<JsonDocument> deserialize_file(const std::string & filename)
{
FILE *fh = fopen(filename.c_str(), "r");
if (!fh) {
DOLOG(warning, false, "Failed to open %s", filename.c_str());
return { };
}
std::string j_in;
char buffer[4096];
for(;;) {
char *rc = fgets(buffer, sizeof buffer, fh);
if (!rc)
break;
j_in += buffer;
}
fclose(fh);
JsonDocument j;
DeserializationError error = deserializeJson(j, j_in);
if (error) {
DOLOG(warning, false, "Failed to de-serialize %s", filename.c_str());
return { };
}
return j;
}

View file

@ -1,6 +1,8 @@
// (C) 2018-2024 by Folkert van Heusden // (C) 2018-2024 by Folkert van Heusden
// Released under MIT license // Released under MIT license
#include <ArduinoJson.h>
#include <optional>
#include <stdint.h> #include <stdint.h>
#include <string> #include <string>
#include <vector> #include <vector>
@ -28,3 +30,5 @@ void update_word(uint16_t *const w, const bool msb, const uint8_t v);
void set_nodelay(const int fd); void set_nodelay(const int fd);
std::string get_endpoint_name(const int fd); std::string get_endpoint_name(const int fd);
std::optional<JsonDocument> deserialize_file(const std::string & filename);