aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeandro Pereira <leandro@hardinfo.org>2020-05-09 18:30:48 -0700
committerLeandro Pereira <leandro@hardinfo.org>2020-05-09 18:38:26 -0700
commit2dbe79d105e7898ee2594e2038052150436eb207 (patch)
tree82a37242f7c0022989fc3d5f3ca12c035e2697b4
parent605f2846ff85de6ed0c2a63e14a341c3c4604a15 (diff)
Update SyncManager to use the new API
-rw-r--r--CMakeLists.txt2
-rw-r--r--hardinfo/vendor.c6
-rw-r--r--includes/syncmanager.h8
-rw-r--r--modules/benchmark.c15
-rw-r--r--modules/devices.c34
-rw-r--r--shell/syncmanager.c277
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);
}
}