]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - LinuxGUI/Ventoy2Disk/Web/ventoy_http.c
Update languages.json (#1435)
[Ventoy.git] / LinuxGUI / Ventoy2Disk / Web / ventoy_http.c
index e7329d8a351593bff942a6c65265957758446157..31131578f74c6b3d581dddddb62fe8a54de9b3b3 100644 (file)
@@ -31,6 +31,7 @@
 #include <sys/types.h>
 #include <sys/mount.h>
 #include <linux/fs.h>
+#include <linux/limits.h>
 #include <dirent.h>
 #include <pthread.h>
 #include <ventoy_define.h>
 #include <ventoy_http.h>
 #include "fat_filelib.h"
 
+static char *g_pub_out_buf = NULL;
+static int g_pub_out_max = 0;
+
 static pthread_mutex_t g_api_mutex;
 static char g_cur_language[128];
 static int  g_cur_part_style = 0;
+static int  g_cur_show_all = 0;
 static char g_cur_server_token[64];
 static struct mg_context *g_ventoy_http_ctx = NULL;
 
@@ -52,8 +57,8 @@ static uint8_t *g_grub_stg1_raw_img = NULL;
 
 static char g_cur_process_diskname[64];
 static char g_cur_process_type[64];
-static int g_cur_process_result = 0;
-static PROGRESS_POINT g_current_progress = PT_FINISH;
+static volatile int g_cur_process_result = 0;
+static volatile PROGRESS_POINT g_current_progress = PT_FINISH;
 
 static int ventoy_load_mbr_template(void)
 {
@@ -156,13 +161,15 @@ static int ventoy_http_save_cfg(void)
 {
     FILE *fp;
 
-    fp = fopen("./Ventoy2Disk.ini", "w");
+    fp = fopen(g_ini_file, "w");
     if (!fp)
     {
+        vlog("Failed to open %s code:%d\n", g_ini_file, errno);
         return 0;
     }
 
-    fprintf(fp, "[Ventoy]\nLanguage=%s\nPartStyle=%d\n", g_cur_language, g_cur_part_style);
+    fprintf(fp, "[Ventoy]\nLanguage=%s\nPartStyle=%d\nShowAllDevice=%d\n", 
+        g_cur_language, g_cur_part_style, g_cur_show_all);
 
     fclose(fp);
     return 0;
@@ -175,7 +182,7 @@ static int ventoy_http_load_cfg(void)
     char line[256];
     FILE *fp;
 
-    fp = fopen("./Ventoy2Disk.ini", "r");
+    fp = fopen(g_ini_file, "r");
     if (!fp)
     {
         return 0;
@@ -205,6 +212,10 @@ static int ventoy_http_load_cfg(void)
         {
             g_cur_part_style = (int)strtol(line + strlen("PartStyle="), NULL, 10);
         }
+        else if (strncmp(line, "ShowAllDevice=", strlen("ShowAllDevice=")) == 0)
+        {
+            g_cur_show_all = (int)strtol(line + strlen("ShowAllDevice="), NULL, 10);
+        }
     }
 
     fclose(fp);
@@ -214,23 +225,47 @@ static int ventoy_http_load_cfg(void)
 
 static int ventoy_json_result(struct mg_connection *conn, const char *err)
 {
-    mg_printf(conn, 
-              "HTTP/1.1 200 OK \r\n"
-              "Content-Type: application/json\r\n"
-              "Content-Length: %d\r\n"
-              "\r\n%s",
-              (int)strlen(err), err);
+    if (conn)
+    {
+        mg_printf(conn, 
+                  "HTTP/1.1 200 OK \r\n"
+                  "Content-Type: application/json\r\n"
+                  "Content-Length: %d\r\n"
+                  "\r\n%s",
+                  (int)strlen(err), err);
+    }
+    else
+    {
+        memcpy(g_pub_out_buf, err, (int)strlen(err) + 1);
+    }
+
     return 0;
 }
 
 static int ventoy_json_buffer(struct mg_connection *conn, const char *json_buf, int json_len)
 {
-    mg_printf(conn, 
-              "HTTP/1.1 200 OK \r\n"
-              "Content-Type: application/json\r\n"
-              "Content-Length: %d\r\n"
-              "\r\n%s",
-              json_len, json_buf);
+    if (conn)
+    {
+        mg_printf(conn, 
+                  "HTTP/1.1 200 OK \r\n"
+                  "Content-Type: application/json\r\n"
+                  "Content-Length: %d\r\n"
+                  "\r\n%s",
+                  json_len, json_buf);    
+    }
+    else
+    {
+        if (json_len >= g_pub_out_max)
+        {
+            vlog("json buffer overflow\n");
+        }
+        else
+        {
+            memcpy(g_pub_out_buf, json_buf, json_len);
+            g_pub_out_buf[json_len] = 0;
+        }
+    }
+
     return 0;
 }
 
@@ -1369,6 +1404,41 @@ static int ventoy_json_handler(struct mg_connection *conn, VTOY_JSON *json)
     return 0;
 }
 
+int ventoy_func_handler(const char *jsonstr, char *jsonbuf, int buflen)
+{
+    int i;
+    const char *method = NULL;
+    VTOY_JSON *json = NULL;
+
+    g_pub_out_buf = jsonbuf;
+    g_pub_out_max = buflen;
+
+    json = vtoy_json_create();
+    if (JSON_SUCCESS == vtoy_json_parse(json, jsonstr))
+    {
+        pthread_mutex_lock(&g_api_mutex);
+
+        method = vtoy_json_get_string_ex(json->pstChild, "method");
+        for (i = 0; i < (int)(sizeof(g_ventoy_json_cb) / sizeof(g_ventoy_json_cb[0])); i++)
+        {
+            if (method && strcmp(method, g_ventoy_json_cb[i].method) == 0)
+            {
+                g_ventoy_json_cb[i].callback(NULL, json->pstChild);
+                break;
+            }
+        }
+
+        pthread_mutex_unlock(&g_api_mutex);
+    }
+    else
+    {
+        ventoy_json_result(NULL, VTOY_JSON_INVALID_RET);
+    }
+
+    vtoy_json_destroy(json);
+    return 0;
+}
+
 static int ventoy_request_handler(struct mg_connection *conn)
 {
     int post_data_len;
@@ -1431,7 +1501,7 @@ int ventoy_http_start(const char *ip, const char *port)
     {
            "listening_ports",    "24680",
         "document_root",      "WebUI",
-        "error_log_file",     VTOY_LOG_FILE,
+        "error_log_file",     g_log_file,
            "request_timeout_ms", "10000",
             NULL
     };
@@ -1481,3 +1551,77 @@ void ventoy_http_exit(void)
     g_efi_part_raw_img = NULL;    
 }
 
+
+const char * ventoy_code_get_cur_language(void)
+{
+    return g_cur_language;
+}
+
+int ventoy_code_get_cur_part_style(void)
+{
+    return g_cur_part_style;
+}
+
+void ventoy_code_set_cur_part_style(int style)
+{
+    pthread_mutex_lock(&g_api_mutex);
+    
+    g_cur_part_style = style;
+    ventoy_http_save_cfg();
+
+    pthread_mutex_unlock(&g_api_mutex);
+}
+
+int ventoy_code_get_cur_show_all(void)
+{
+    return g_cur_show_all;
+}
+
+void ventoy_code_set_cur_show_all(int show_all)
+{
+    pthread_mutex_lock(&g_api_mutex);
+    
+    g_cur_show_all = show_all;
+    ventoy_http_save_cfg();
+
+    pthread_mutex_unlock(&g_api_mutex);
+}
+
+void ventoy_code_set_cur_language(const char *lang)
+{
+    pthread_mutex_lock(&g_api_mutex);
+    
+    scnprintf(g_cur_language, "%s", lang);
+    ventoy_http_save_cfg();
+    
+    pthread_mutex_unlock(&g_api_mutex);
+}
+
+void ventoy_code_refresh_device(void)
+{
+    if (g_current_progress == PT_FINISH)
+    {
+        g_disk_num = 0;
+        ventoy_disk_enumerate_all();
+    }
+}
+
+int ventoy_code_is_busy(void)
+{
+    return (g_current_progress == PT_FINISH) ? 0 : 1;
+}
+
+int ventoy_code_get_percent(void)
+{
+    return g_current_progress * 100 / PT_FINISH;
+}
+
+int ventoy_code_get_result(void)
+{
+    return g_cur_process_result;
+}
+
+void ventoy_code_save_cfg(void)
+{
+    ventoy_http_save_cfg();
+}