diff options
author | Leandro Pereira <leandro@hardinfo.org> | 2020-05-09 18:30:48 -0700 |
---|---|---|
committer | Leandro Pereira <leandro@hardinfo.org> | 2020-05-09 18:38:26 -0700 |
commit | 2dbe79d105e7898ee2594e2038052150436eb207 (patch) | |
tree | 82a37242f7c0022989fc3d5f3ca12c035e2697b4 | |
parent | 605f2846ff85de6ed0c2a63e14a341c3c4604a15 (diff) |
Update SyncManager to use the new API
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | hardinfo/vendor.c | 6 | ||||
-rw-r--r-- | includes/syncmanager.h | 8 | ||||
-rw-r--r-- | modules/benchmark.c | 15 | ||||
-rw-r--r-- | modules/devices.c | 34 | ||||
-rw-r--r-- | shell/syncmanager.c | 277 |
6 files changed, 79 insertions, 263 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index cb80bb9d..7401513c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 2.6) cmake_policy(VERSION 2.6) set(HARDINFO_VERSION "0.6-alpha") -option(HARDINFO_NOSYNC "Disable database sync via libsoup" 1) +option(HARDINFO_NOSYNC "Disable database sync via libsoup" 0) option(HARDINFO_GTK3 "Attempt to build for GTK3 (0/off for GTK2)" 0) set(OVRARCH "" CACHE STRING "Override HARDINFO_ARCH value") set(OVRCPUINFO "" CACHE STRING "Specify a different file for /proc/cpuinfo") diff --git a/hardinfo/vendor.c b/hardinfo/vendor.c index ff560390..9cf84fa5 100644 --- a/hardinfo/vendor.c +++ b/hardinfo/vendor.c @@ -252,10 +252,8 @@ void vendor_init(void) { gchar *path; static SyncEntry se = { - .fancy_name = "Update vendor list", - .name = "RecvVendorList", - .save_to = "vendor.ids", - .get_data = NULL + .name = N_("Update vendor list"), + .file_name = "vendor.ids", }; /* already initialized */ diff --git a/includes/syncmanager.h b/includes/syncmanager.h index 24fbe6ce..7a99f462 100644 --- a/includes/syncmanager.h +++ b/includes/syncmanager.h @@ -24,12 +24,10 @@ typedef struct _SyncEntry SyncEntry; struct _SyncEntry { - gchar *name; - gchar *fancy_name; - gchar *save_to; + const gchar *name; + const gchar *file_name; - gchar *(*get_data)(void); - void (*callback)(SyncEntry *entry, const gchar *response); + gchar *(*generate_contents_for_upload)(gsize *size); gboolean selected; }; diff --git a/modules/benchmark.c b/modules/benchmark.c index c0f3ff16..6b71bae9 100644 --- a/modules/benchmark.c +++ b/modules/benchmark.c @@ -780,7 +780,7 @@ const ModuleAbout *hi_module_get_about(void) return &ma; } -static gchar *get_benchmark_results() +static gchar *get_benchmark_results(gsize *len) { void (*scan_callback)(gboolean); JsonBuilder *builder; @@ -862,7 +862,7 @@ static gchar *get_benchmark_results() json_generator_set_root(generator, json_builder_get_root(builder)); json_generator_set_pretty(generator, TRUE); - out = json_generator_to_data(generator, NULL); + out = json_generator_to_data(generator, len); g_object_unref(generator); g_object_unref(builder); @@ -931,14 +931,13 @@ void hi_module_init(void) { static SyncEntry se[] = { { - .fancy_name = N_("Send benchmark results"), - .name = "SendBenchmarkResults", - .get_data = get_benchmark_results, + .name = N_("Send benchmark results"), + .file_name = "benchmark.json", + .generate_contents_for_upload = get_benchmark_results, }, { - .fancy_name = N_("Receive benchmark results"), - .name = "RecvBenchmarkResults", - .save_to = "benchmark.conf", + .name = N_("Receive benchmark results"), + .file_name = "benchmark.json", }, }; diff --git a/modules/devices.c b/modules/devices.c index 7eae11b9..05d3bf8a 100644 --- a/modules/devices.c +++ b/modules/devices.c @@ -830,29 +830,21 @@ guchar hi_module_get_weight(void) void hi_module_init(void) { - if (!g_file_test("/usr/share/misc/pci.ids", G_FILE_TEST_EXISTS)) { - static SyncEntry se = { - .fancy_name = N_("Update PCI ID listing"), - .name = "GetPCIIds", - .save_to = "pci.ids", - .get_data = NULL - }; - - sync_manager_add_entry(&se); - } + static SyncEntry pci_ids = { + .name = N_("Update PCI ID listing"), + .file_name = "pci.ids", + }; + + sync_manager_add_entry(&pci_ids); #if defined(ARCH_x86) || defined(ARCH_x86_64) - { - static SyncEntry se = { - .fancy_name = N_("Update CPU feature database"), - .name = "RecvCPUFlags", - .save_to = "cpuflags.conf", - .get_data = NULL - }; - - sync_manager_add_entry(&se); - } -#endif /* defined(ARCH_x86) */ + static SyncEntry cpuflags_conf = { + .name = N_("Update CPU feature database"), + .file_name = "cpuflags.conf", + }; + + sync_manager_add_entry(&cpuflags_conf); +#endif /* defined(ARCH_x86) */ init_cups(); sensors_init(); diff --git a/shell/syncmanager.c b/shell/syncmanager.c index 03ee4253..a144bd1d 100644 --- a/shell/syncmanager.c +++ b/shell/syncmanager.c @@ -36,9 +36,6 @@ struct _SyncNetArea { }; struct _SyncNetAction { - gchar *name; - gboolean (*do_action)(SyncDialog *sd, gpointer sna); - SyncEntry *entry; GError *error; }; @@ -63,8 +60,7 @@ static SoupSession *session = NULL; static GMainLoop *loop; static GQuark err_quark; -#define XMLRPC_SERVER_URI "https://xmlrpc.hardinfo.org/" -#define XMLRPC_SERVER_API_VERSION 1 +#define API_SERVER_URI "https://api.hardinfo.org/" #define LABEL_SYNC_DEFAULT \ _("<big><b>Synchronize with Central Database</b></big>\n" \ @@ -105,7 +101,7 @@ gint sync_manager_count_entries(void) void sync_manager_add_entry(SyncEntry *entry) { #ifdef HAS_LIBSOUP - DEBUG("registering syncmanager entry ''%s''", entry->fancy_name); + DEBUG("registering syncmanager entry ''%s''", entry->name); entry->selected = TRUE; entries = g_slist_append(entries, entry); @@ -151,201 +147,6 @@ void sync_manager_show(GtkWidget *parent) } #ifdef HAS_LIBSOUP -static gint _soup_get_xmlrpc_value_int(SoupMessage *msg, SyncNetAction *sna) -{ - gint int_value = -1; - - sna->error = NULL; - - if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) { - SNA_ERROR(1, _("%s (error #%d)"), msg->reason_phrase, msg->status_code); - goto bad; - } - - GVariant *value = soup_xmlrpc_parse_response( - msg->response_body->data, msg->response_body->length, "h", NULL); - if (!value) { - SNA_ERROR(2, _("Could not parse XML-RPC response")); - goto bad; - } - - int_value = g_variant_get_int32(value); - g_variant_unref(value); - -bad: - return int_value; -} - -static gchar *_soup_get_xmlrpc_value_string(SoupMessage *msg, - SyncNetAction *sna) -{ - gchar *string = NULL; - - sna->error = NULL; - - if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) { - SNA_ERROR(1, _("%s (error #%d)"), msg->reason_phrase, msg->status_code); - goto bad; - } - - GVariant *value = soup_xmlrpc_parse_response( - msg->response_body->data, msg->response_body->length, "s", NULL); - if (!value) { - SNA_ERROR(2, _("Could not parse XML-RPC response")); - goto bad; - } - - string = g_strdup(g_variant_get_string(value, NULL)); - g_variant_unref(value); - -bad: - return string; -} - -static gboolean _soup_xmlrpc_call(gchar *method, - SyncNetAction *sna, - SoupSessionCallback callback) -{ - SoupMessage *msg; - - sna->error = NULL; - - msg = soup_xmlrpc_message_new(XMLRPC_SERVER_URI, method, NULL, NULL); - if (!msg) - return FALSE; - - DEBUG("calling xmlrpc method %s", method); - - soup_session_queue_message(session, msg, callback, sna); - g_main_run(loop); - - return TRUE; -} - -static gboolean _soup_xmlrpc_call_with_parameters(gchar *method, - SyncNetAction *sna, - SoupSessionCallback callback, - ...) -{ - SoupMessage *msg; - GVariantBuilder builder; - GVariant *parameters; - gchar *argument, *body; - va_list ap; - - sna->error = NULL; - - msg = soup_message_new("POST", XMLRPC_SERVER_URI); - - DEBUG("calling xmlrpc method %s", method); - if (!msg) - return FALSE; - - g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY); - va_start(ap, callback); - while ((argument = va_arg(ap, gchar *))) { - g_variant_builder_add(&builder, "s", argument); - DEBUG("with parameter: %s", argument); - } - va_end(ap); - parameters = g_variant_builder_end(&builder); - g_variant_builder_unref(&builder); - - body = soup_xmlrpc_build_request(method, parameters, NULL); - g_variant_unref(parameters); - if (body) { - soup_message_set_request(msg, "text/xml", SOUP_MEMORY_TAKE, body, - strlen(body)); - - soup_session_queue_message(session, msg, callback, sna); - g_main_run(loop); - - return TRUE; - } - - return FALSE; -} - -static void _action_check_api_version_got_response(SoupSession *session, - SoupMessage *msg, - gpointer user_data) -{ - SyncNetAction *sna = (SyncNetAction *)user_data; - gint version = _soup_get_xmlrpc_value_int(msg, sna); - - if (version != XMLRPC_SERVER_API_VERSION) { - SNA_ERROR(5, - _("Server says it supports API version %d, but " - "this version of HardInfo only supports API " - "version %d."), - version, XMLRPC_SERVER_API_VERSION); - } - - g_main_quit(loop); -} - -static gboolean _action_check_api_version(SyncDialog *sd, gpointer user_data) -{ - SyncNetAction *sna = (SyncNetAction *)user_data; - - if (!_soup_xmlrpc_call("server.getAPIVersion", sna, - _action_check_api_version_got_response)) - return FALSE; - - return sna->error ? FALSE : TRUE; -} - -static void _action_call_function_got_response(SoupSession *session, - SoupMessage *msg, - gpointer user_data) -{ - SyncNetAction *sna = (SyncNetAction *)user_data; - gchar *string; - - if ((string = _soup_get_xmlrpc_value_string(msg, sna)) && - sna->entry->save_to) { - DEBUG("received string: %s\n", string); - gchar *filename = g_build_filename(g_get_user_config_dir(), "hardinfo", - sna->entry->save_to, NULL); - - DEBUG("saving to %s", filename); - - g_file_set_contents(filename, string, -1, NULL); - g_free(filename); - } - - if (sna->entry->callback) { - sna->entry->callback(sna->entry, string); - } - - g_free(string); - g_main_quit(loop); -} - -static gboolean _action_call_function(SyncDialog *sd, gpointer user_data) -{ - SyncNetAction *sna = (SyncNetAction *)user_data; - - if (sna->entry) { - gchar *str_data = NULL; - - if (sna->entry->get_data) - str_data = sna->entry->get_data(); - - if (!_soup_xmlrpc_call_with_parameters( - "sync.callFunctionEx", sna, _action_call_function_got_response, - VERSION, ARCH, sna->entry->name, str_data, NULL)) { - g_free(str_data); - - return FALSE; - } - - g_free(str_data); - } - - return sna->error ? FALSE : TRUE; -} - static gboolean _cancel_sync(GtkWidget *widget, gpointer data) { SyncDialog *sd = (SyncDialog *)data; @@ -367,25 +168,18 @@ static SyncNetAction *sync_manager_get_selected_actions(gint *n) gint i; GSList *entry; SyncNetAction *actions; - SyncNetAction action_check_api = {_("Contacting HardInfo Central Database"), - _action_check_api_version}, - action_clean_up = {_("Cleaning up"), NULL}; - actions = g_new0(SyncNetAction, 2 + g_slist_length(entries)); + actions = g_new0(SyncNetAction, g_slist_length(entries)); - for (entry = entries, i = 1; entry; entry = entry->next) { + for (entry = entries, i = 0; entry; entry = entry->next) { SyncEntry *e = (SyncEntry *)entry->data; if (e->selected) { - SyncNetAction sna = {e->fancy_name, _action_call_function, e}; - + SyncNetAction sna = {.entry = e}; actions[i++] = sna; } } - actions[0] = action_check_api; - actions[i++] = action_clean_up; - *n = i; return actions; } @@ -440,6 +234,42 @@ static void sync_dialog_start_sync(SyncDialog *sd) g_main_loop_unref(loop); } +static gboolean send_request_for_net_action(SyncNetAction *sna) +{ + gchar *uri; + SoupMessage *msg; + guint response_code; + + uri = g_strdup_printf("%s/%s", API_SERVER_URI, sna->entry->file_name); + + if (sna->entry->generate_contents_for_upload == NULL) { + msg = soup_message_new("GET", uri); + } else { + gsize size; + gchar *contents = sna->entry->generate_contents_for_upload(&size); + + msg = soup_message_new("POST", uri); + soup_message_set_request(msg, "application/octet-stream", + SOUP_MEMORY_TAKE, contents, size); + } + + response_code = soup_session_send_message(session, msg); + + if (sna->entry->file_name != NULL && msg->response_body->length) { + gchar *filename = g_build_filename(g_get_user_config_dir(), "hardinfo", + sna->entry->file_name, NULL); + + g_file_set_contents(filename, msg->response_body->data, + msg->response_body->length, NULL); + g_free(filename); + } + + g_object_unref(msg); + g_free(uri); + + return response_code == 200; +} + static void sync_dialog_netarea_start_actions(SyncDialog *sd, SyncNetAction sna[], gint n) { @@ -459,7 +289,7 @@ sync_dialog_netarea_start_actions(SyncDialog *sd, SyncNetAction sna[], gint n) hbox = gtk_hbox_new(FALSE, 5); - labels[i] = gtk_label_new(sna[i].name); + labels[i] = gtk_label_new(sna[i].entry->name); status_labels[i] = gtk_label_new(empty_str); gtk_label_set_use_markup(GTK_LABEL(labels[i]), TRUE); @@ -482,7 +312,8 @@ sync_dialog_netarea_start_actions(SyncDialog *sd, SyncNetAction sna[], gint n) gchar *markup; if (sd->flag_cancel) { - markup = g_strdup_printf("<s>%s</s> <i>%s</i>", sna[i].name, + markup = g_strdup_printf("<s>%s</s> <i>%s</i>", + _(sna[i].entry->name), _("(canceled)")); gtk_label_set_markup(GTK_LABEL(labels[i]), markup); g_free(markup); @@ -491,15 +322,15 @@ sync_dialog_netarea_start_actions(SyncDialog *sd, SyncNetAction sna[], gint n) break; } - markup = g_strdup_printf("<b>%s</b>", sna[i].name); + markup = g_strdup_printf("<b>%s</b>", _(sna[i].entry->name)); gtk_label_set_markup(GTK_LABEL(labels[i]), markup); g_free(markup); gtk_label_set_markup(GTK_LABEL(status_labels[i]), curr_str); - if (sna[i].do_action && !sna[i].do_action(sd, &sna[i])) { - markup = g_strdup_printf("<b><s>%s</s></b> <i>%s</i>", sna[i].name, - _("(failed)")); + if (sna[i].entry && !send_request_for_net_action(&sna[i])) { + markup = g_strdup_printf("<b><s>%s</s></b> <i>%s</i>", + sna[i].entry->name, _("(failed)")); gtk_label_set_markup(GTK_LABEL(labels[i]), markup); g_free(markup); @@ -514,7 +345,7 @@ sync_dialog_netarea_start_actions(SyncDialog *sd, SyncNetAction sna[], gint n) "if this problem persists. (Use the " "Help\342\206\222Report" " bug option.)\n\nDetails: %s"), - sna[i].name, sna[i].error->message); + _(sna[i].entry->name), sna[i].error->message); } g_error_free(sna[i].error); @@ -524,13 +355,13 @@ sync_dialog_netarea_start_actions(SyncDialog *sd, SyncNetAction sna[], gint n) "if this problem persists. (Use the " "Help\342\206\222Report" " bug option.)"), - sna[i].name); + _(sna[i].entry->name)); } break; } gtk_label_set_markup(GTK_LABEL(status_labels[i]), done_str); - gtk_label_set_markup(GTK_LABEL(labels[i]), sna[i].name); + gtk_label_set_markup(GTK_LABEL(labels[i]), _(sna[i].entry->name)); } g_free(labels); @@ -570,8 +401,7 @@ static void sync_dialog_netarea_show(SyncDialog *sd) gtk_window_reshow_with_initial_size(GTK_WINDOW(sd->dialog)); } -#if 0 -static void sync_dialog_netarea_hide(SyncDialog * sd) +static void sync_dialog_netarea_hide(SyncDialog *sd) { g_return_if_fail(sd && sd->sna); @@ -581,7 +411,6 @@ static void sync_dialog_netarea_hide(SyncDialog * sd) gtk_label_set_markup(GTK_LABEL(sd->label), LABEL_SYNC_DEFAULT); gtk_window_reshow_with_initial_size(GTK_WINDOW(sd->dialog)); } -#endif static void populate_store(GtkListStore *store) { @@ -598,7 +427,7 @@ static void populate_store(GtkListStore *store) e->selected = TRUE; gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, 0, TRUE, 1, e->fancy_name, 2, e, -1); + gtk_list_store_set(store, &iter, 0, TRUE, 1, e->name, 2, e, -1); } } |