knxdisplay/main/webserver/ConfigHandlers.cpp
2026-01-23 16:46:09 +01:00

79 lines
2.2 KiB
C++

#include "WebServer.hpp"
#include "../WidgetManager.hpp"
#include "esp_log.h"
#include <cstring>
static const char* TAG = "WebServer";
esp_err_t WebServer::getConfigHandler(httpd_req_t* req) {
char* buf = new char[8192];
if (buf == nullptr) {
httpd_resp_send_err(req, HTTPD_500_INTERNAL_SERVER_ERROR, "Out of memory");
return ESP_FAIL;
}
WidgetManager::instance().getConfigJson(buf, 8192);
httpd_resp_set_type(req, "application/json");
httpd_resp_send(req, buf, strlen(buf));
delete[] buf;
return ESP_OK;
}
esp_err_t WebServer::postConfigHandler(httpd_req_t* req) {
int total_len = req->content_len;
if (total_len > 8192) {
httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST, "Content too large");
return ESP_FAIL;
}
char* buf = new char[total_len + 1];
if (buf == nullptr) {
httpd_resp_send_err(req, HTTPD_500_INTERNAL_SERVER_ERROR, "Out of memory");
return ESP_FAIL;
}
int received = 0;
while (received < total_len) {
int ret = httpd_req_recv(req, buf + received, total_len - received);
if (ret <= 0) {
delete[] buf;
httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST, "Receive failed");
return ESP_FAIL;
}
received += ret;
}
buf[received] = '\0';
bool success = WidgetManager::instance().updateConfigFromJson(buf);
delete[] buf;
cJSON* json = cJSON_CreateObject();
if (success) {
cJSON_AddStringToObject(json, "status", "ok");
} else {
cJSON_AddStringToObject(json, "status", "error");
cJSON_AddStringToObject(json, "message", "Invalid JSON");
}
return sendJsonObject(req, json);
}
esp_err_t WebServer::postSaveHandler(httpd_req_t* req) {
ESP_LOGI(TAG, "Saving and applying configuration");
WidgetManager::instance().saveAndApply();
cJSON* json = cJSON_CreateObject();
cJSON_AddStringToObject(json, "status", "ok");
return sendJsonObject(req, json);
}
esp_err_t WebServer::postResetHandler(httpd_req_t* req) {
ESP_LOGI(TAG, "Resetting to defaults");
WidgetManager::instance().resetToDefaults();
cJSON* json = cJSON_CreateObject();
cJSON_AddStringToObject(json, "status", "ok");
return sendJsonObject(req, json);
}