diff options
Diffstat (limited to 'shell/syncmanager.c')
-rw-r--r-- | shell/syncmanager.c | 737 |
1 files changed, 339 insertions, 398 deletions
diff --git a/shell/syncmanager.c b/shell/syncmanager.c index db94d474..0f08cf87 100644 --- a/shell/syncmanager.c +++ b/shell/syncmanager.c @@ -1,10 +1,10 @@ /* * HardInfo - Displays System Information - * Copyright (C) 2003-2009 Leandro A. F. Pereira <leandro@hardinfo.org> + * Copyright (C) 2003-2009 L. A. F. Pereira <l@tia.mat.br> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. + * the Free Software Foundation, version 2 or later. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -16,17 +16,20 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "syncmanager.h" -#include "iconcache.h" -#include "hardinfo.h" #include "config.h" +#include "hardinfo.h" +#include "iconcache.h" +#include "syncmanager.h" -#ifdef HAS_LIBSOUP #include <libsoup/soup.h> #include <stdarg.h> #include <string.h> +#ifndef SOUP_CHECK_VERSION + #define SOUP_CHECK_VERSION(a,b,c) 0 +#endif + typedef struct _SyncDialog SyncDialog; typedef struct _SyncNetArea SyncNetArea; typedef struct _SyncNetAction SyncNetAction; @@ -36,9 +39,6 @@ struct _SyncNetArea { }; struct _SyncNetAction { - gchar *name; - gboolean(*do_action) (SyncDialog * sd, gpointer sna); - SyncEntry *entry; GError *error; }; @@ -50,12 +50,13 @@ struct _SyncDialog { GtkWidget *button_sync; GtkWidget *button_cancel; GtkWidget *button_close; + GtkWidget *button_priv_policy; GtkWidget *scroll_box; SyncNetArea *sna; - gboolean flag_cancel:1; + gboolean flag_cancel : 1; }; static GSList *entries = NULL; @@ -63,479 +64,385 @@ 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 +//Note there are personal information involved and very old +//linux systems does not work with HTTPS so use HTTP for now +#define API_SERVER_URI "http://api.hardinfo2.org" -#define LABEL_SYNC_DEFAULT _("<big><b>Synchronize with Central Database</b></big>\n" \ - "The following information may be synchronized " \ - "with the HardInfo central database.") -#define LABEL_SYNC_SYNCING _("<big><b>Synchronizing</b></big>\n" \ - "This may take some time.") +#define LABEL_SYNC_DEFAULT \ + _("<big><b>Synchronize with Central Database</b></big>\n" \ + "The following information may be synchronized\n" \ + "with the HardInfo central database.") +#define LABEL_SYNC_SYNCING \ + _("<big><b>Synchronizing</b></big>\n" \ + "This may take some time.") static SyncDialog *sync_dialog_new(GtkWidget *parent); -static void sync_dialog_destroy(SyncDialog * sd); -static void sync_dialog_start_sync(SyncDialog * sd); +static void sync_dialog_destroy(SyncDialog *sd); +static void sync_dialog_start_sync(SyncDialog *sd); static SyncNetArea *sync_dialog_netarea_new(void); -static void sync_dialog_netarea_destroy(SyncNetArea * sna); -static void sync_dialog_netarea_show(SyncDialog * sd); +static void sync_dialog_netarea_destroy(SyncNetArea *sna); +static void sync_dialog_netarea_show(SyncDialog *sd); #if 0 static void sync_dialog_netarea_hide(SyncDialog * sd); #endif -static void sync_dialog_netarea_start_actions(SyncDialog * sd, - SyncNetAction * sna, gint n); - -#define SNA_ERROR(code,message,...) if (!sna->error) { \ - sna->error = g_error_new(err_quark, code, message, \ - ##__VA_ARGS__); \ - } -#endif /* HAS_LIBSOUP */ +static void +sync_dialog_netarea_start_actions(SyncDialog *sd, SyncNetAction *sna, gint n); +#define SNA_ERROR(code, message, ...) \ + if (!sna->error) { \ + sna->error = g_error_new(err_quark, code, message, ##__VA_ARGS__); \ + } gint sync_manager_count_entries(void) { -#ifdef HAS_LIBSOUP return g_slist_length(entries); -#else - return 0; -#endif } -void sync_manager_add_entry(SyncEntry * entry) +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); -#else - DEBUG("libsoup support is disabled."); -#endif /* HAS_LIBSOUP */ } void sync_manager_clear_entries(void) { -#ifdef HAS_LIBSOUP DEBUG("clearing syncmanager entries"); g_slist_free(entries); entries = NULL; -#else - DEBUG("libsoup support is disabled."); -#endif /* HAS_LIBSOUP */ } void sync_manager_show(GtkWidget *parent) { -#ifndef HAS_LIBSOUP - g_warning - (_("HardInfo was compiled without libsoup support. (Network Updater requires it.)")); -#else /* !HAS_LIBSOUP */ SyncDialog *sd = sync_dialog_new(parent); err_quark = g_quark_from_static_string("syncmanager"); if (gtk_dialog_run(GTK_DIALOG(sd->dialog)) == GTK_RESPONSE_ACCEPT) { - shell_view_set_enabled(FALSE); - shell_status_set_enabled(TRUE); + shell_view_set_enabled(FALSE); + shell_status_set_enabled(TRUE); + shell_set_transient_dialog(GTK_WINDOW(sd->dialog)); - sync_dialog_start_sync(sd); + sync_dialog_start_sync(sd); - shell_status_set_enabled(FALSE); - shell_view_set_enabled(TRUE); + shell_set_transient_dialog(NULL); + shell_status_set_enabled(FALSE); + shell_view_set_enabled(TRUE); } sync_dialog_destroy(sd); -#endif /* HAS_LIBSOUP */ } -#ifdef HAS_LIBSOUP -static gint _soup_get_xmlrpc_value_int(SoupMessage * msg, - SyncNetAction * sna) +static gboolean _cancel_sync(GtkWidget *widget, gpointer data) { - 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); + SyncDialog *sd = (SyncDialog *)data; -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; + if (session) { + soup_session_abort(session); } - 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); + sd->flag_cancel = TRUE; + g_main_loop_quit(loop); - soup_session_queue_message(session, msg, callback, sna); - g_main_run(loop); + gtk_widget_set_sensitive(widget, FALSE); - return TRUE; + return FALSE; } -static gboolean _soup_xmlrpc_call_with_parameters(gchar * method, - SyncNetAction * sna, - SoupSessionCallback - callback, ...) +static SyncNetAction *sync_manager_get_selected_actions(gint *n) { - 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); + gint i; + GSList *entry; + SyncNetAction *actions; - 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)); + actions = g_new0(SyncNetAction, g_slist_length(entries)); - soup_session_queue_message(session, msg, callback, sna); - g_main_run(loop); + for (entry = entries, i = 0; entry; entry = entry->next) { + SyncEntry *e = (SyncEntry *)entry->data; - return TRUE; + if (e->selected) { + SyncNetAction sna = {.entry = e}; + actions[i++] = sna; + } } - return FALSE; + *n = i; + return actions; } -static void _action_check_api_version_got_response(SoupSession * session, - SoupMessage * msg, - gpointer user_data) +#if !SOUP_CHECK_VERSION(3,0,0) +static SoupURI *sync_manager_get_proxy(void) { - SyncNetAction *sna = (SyncNetAction *) user_data; - gint version = _soup_get_xmlrpc_value_int(msg, sna); + const gchar *conf; - 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); + if (!(conf = g_getenv("HTTP_PROXY"))) { + if (!(conf = g_getenv("http_proxy"))) { + return NULL; + } } - 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; + return soup_uri_new(conf); } +#endif -static void _action_call_function_got_response(SoupSession * session, - SoupMessage * msg, - gpointer user_data) +static void ensure_soup_session(void) { - 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_home_dir(), ".hardinfo", - sna->entry->save_to, NULL); - - DEBUG("saving to %s", filename); - - g_file_set_contents(filename, string, -1, NULL); - g_free(filename); - } + if (!session) { +#if SOUP_CHECK_VERSION(3,0,0) + session = soup_session_new_with_options("timeout", 10, NULL); +#else +#if SOUP_CHECK_VERSION(2,42,0) + SoupURI *proxy = sync_manager_get_proxy(); - if (sna->entry->callback) { - sna->entry->callback(sna->entry, string); + session = soup_session_new_with_options( + SOUP_SESSION_TIMEOUT, 10, SOUP_SESSION_PROXY_URI, proxy, NULL); +#else + SoupURI *proxy = sync_manager_get_proxy(); + session = soup_session_async_new_with_options( + SOUP_SESSION_TIMEOUT, 10, SOUP_SESSION_PROXY_URI, proxy, NULL); +#endif +#endif } - - g_free(string); - g_main_quit(loop); } -static gboolean _action_call_function(SyncDialog * sd, gpointer user_data) +static void sync_dialog_start_sync(SyncDialog *sd) { - SyncNetAction *sna = (SyncNetAction *) user_data; - - if (sna->entry) { - gchar *str_data = NULL; - - if (sna->entry->get_data) - str_data = sna->entry->get_data(); + gint nactions; + SyncNetAction *actions; - 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); + ensure_soup_session(); - return FALSE; - } + loop = g_main_loop_new(NULL, FALSE); - g_free(str_data); - } + gtk_widget_hide(sd->button_sync); + gtk_widget_hide(sd->button_priv_policy); + sync_dialog_netarea_show(sd); + g_signal_connect(G_OBJECT(sd->button_cancel), "clicked", + (GCallback)_cancel_sync, sd); - return sna->error ? FALSE : TRUE; -} + actions = sync_manager_get_selected_actions(&nactions); + sync_dialog_netarea_start_actions(sd, actions, nactions); + g_free(actions); -static gboolean _cancel_sync(GtkWidget * widget, gpointer data) -{ - SyncDialog *sd = (SyncDialog *) data; + if (sd->flag_cancel) { + gtk_widget_hide(sd->button_cancel); + gtk_widget_show(sd->button_close); - if (session) { - soup_session_abort(session); + /* wait for the user to close the dialog */ + g_main_loop_run(loop); } - sd->flag_cancel = TRUE; - g_main_quit(loop); - - gtk_widget_set_sensitive(widget, FALSE); - - return FALSE; + g_main_loop_unref(loop); } -static SyncNetAction *sync_manager_get_selected_actions(gint * n) +#if SOUP_CHECK_VERSION(2,42,0) +static void got_response(GObject *source, GAsyncResult *res, gpointer user_data) +#else +static void got_response(SoupSession *source, SoupMessage *res, gpointer user_data) +#endif { - 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)); + SyncNetAction *sna = user_data; + GInputStream *is; +#if SOUP_CHECK_VERSION(2,42,0) +#else + const guint8 *buf=NULL; + gsize len,datawritten; + SoupBuffer *soupmsg=NULL; +#endif - for (entry = entries, i = 1; entry; entry = entry->next) { - SyncEntry *e = (SyncEntry *) entry->data; +#if SOUP_CHECK_VERSION(2,42,0) + is = soup_session_send_finish(session, res, &sna->error); + if (is == NULL) + goto out; + if (sna->error != NULL) + goto out; +#endif - if (e->selected) { - SyncNetAction sna = - { e->fancy_name, _action_call_function, e }; + if (sna->entry->file_name != NULL) { + //check for missing config dirs + g_mkdir(g_get_user_config_dir(), 0766); + g_mkdir(g_build_filename(g_get_user_config_dir(),"hardinfo2",NULL), 0766); + // + gchar *path = g_build_filename(g_get_user_config_dir(), "hardinfo2", + sna->entry->file_name, NULL); + GFile *file = g_file_new_for_path(path); + GFileOutputStream *output = + g_file_replace(file, NULL, FALSE, G_FILE_CREATE_REPLACE_DESTINATION, + NULL, &sna->error); + + if (output != NULL) { +#if SOUP_CHECK_VERSION(2,42,0) + g_output_stream_splice(G_OUTPUT_STREAM(output), is, + G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET, NULL, + &sna->error); +#else + soupmsg=soup_message_body_flatten(res->response_body); + if(soupmsg){ + soup_buffer_get_data(soupmsg,&buf,&len); + DEBUG("got file with len: %u", (unsigned int)len); + if(len>0){ + g_output_stream_write_all(G_OUTPUT_STREAM(output),buf,len,&datawritten,NULL,&sna->error); + soup_buffer_free(soupmsg); + } + } +#endif + } - actions[i++] = sna; - } + g_free(path); + g_object_unref(file); } - actions[0] = action_check_api; - actions[i++] = action_clean_up; - - *n = i; - return actions; +out: + g_main_loop_quit(loop); +#if SOUP_CHECK_VERSION(2,42,0) + g_object_unref(is); +#endif } -static SoupURI *sync_manager_get_proxy(void) +static gboolean send_request_for_net_action(SyncNetAction *sna) { - const gchar *conf; + gchar *uri; + SoupMessage *msg; + guint response_code; - if (!(conf = g_getenv("HTTP_PROXY"))) { - if (!(conf = g_getenv("http_proxy"))) { - return NULL; - } - } + uri = g_strdup_printf("%s/%s", API_SERVER_URI, sna->entry->file_name); - return soup_uri_new(conf); -} + 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); -static void sync_dialog_start_sync(SyncDialog * sd) -{ - gint nactions; - SyncNetAction *actions; + msg = soup_message_new("POST", uri); - if (!session) { - SoupURI *proxy = sync_manager_get_proxy(); - - session = soup_session_new_with_options(SOUP_SESSION_TIMEOUT, 10, - SOUP_SESSION_PROXY_URI, - proxy, NULL); - /* Crashes if we unref the proxy? O_o */ - /*if (proxy) - g_object_unref(proxy); */ +#if SOUP_CHECK_VERSION(3, 0, 0) + GBytes *cont = g_bytes_new_static(contents,size); + soup_message_set_request_body_from_bytes(msg, "application/octet-stream", cont); +#else + soup_message_set_request(msg, "application/octet-stream", + SOUP_MEMORY_TAKE, contents, size); +#endif } - loop = g_main_loop_new(NULL, TRUE); - - gtk_widget_hide(sd->button_sync); - sync_dialog_netarea_show(sd); - g_signal_connect(G_OBJECT(sd->button_cancel), "clicked", - (GCallback) _cancel_sync, sd); - - actions = sync_manager_get_selected_actions(&nactions); - sync_dialog_netarea_start_actions(sd, actions, nactions); - g_free(actions); +#if SOUP_CHECK_VERSION(3, 0, 0) + soup_session_send_async(session, msg, G_PRIORITY_DEFAULT, NULL, got_response, sna); +#else +#if SOUP_CHECK_VERSION(2,42,0) + soup_session_send_async(session, msg, NULL, got_response, sna); +#else + soup_session_queue_message(session, msg, got_response, sna); +#endif +#endif + g_main_loop_run(loop); - if (sd->flag_cancel) { - gtk_widget_hide(sd->button_cancel); - gtk_widget_show(sd->button_close); + g_object_unref(msg); + g_free(uri); - /* wait for the user to close the dialog */ - g_main_run(loop); + if (sna->error != NULL) { + DEBUG("Error while sending request: %s", sna->error->message); + g_error_free(sna->error); + sna->error = NULL; + return FALSE; } - g_main_loop_unref(loop); + return TRUE; } -static void sync_dialog_netarea_start_actions(SyncDialog * sd, - SyncNetAction sna[], gint n) +static void +sync_dialog_netarea_start_actions(SyncDialog *sd, SyncNetAction sna[], gint n) { gint i; GtkWidget **labels; GtkWidget **status_labels; - const gchar *done_str = "\342\234\223"; + const gchar *done_str = "\342\234\223"; const gchar *error_str = "\342\234\227"; - const gchar *curr_str = "\342\226\266"; + const gchar *curr_str = "\342\226\266"; const gchar *empty_str = "\302\240\302\240"; labels = g_new0(GtkWidget *, n); status_labels = g_new0(GtkWidget *, n); for (i = 0; i < n; i++) { - GtkWidget *hbox; + GtkWidget *hbox; - hbox = gtk_hbox_new(FALSE, 5); + hbox = gtk_hbox_new(FALSE, 5); - labels[i] = gtk_label_new(sna[i].name); - status_labels[i] = gtk_label_new(empty_str); + 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); - gtk_label_set_use_markup(GTK_LABEL(status_labels[i]), TRUE); + gtk_label_set_use_markup(GTK_LABEL(labels[i]), TRUE); + gtk_label_set_use_markup(GTK_LABEL(status_labels[i]), TRUE); - gtk_misc_set_alignment(GTK_MISC(labels[i]), 0.0, 0.5); - gtk_misc_set_alignment(GTK_MISC(status_labels[i]), 1.0, 0.5); + gtk_misc_set_alignment(GTK_MISC(labels[i]), 0.0, 0.5); + gtk_misc_set_alignment(GTK_MISC(status_labels[i]), 1.0, 0.5); - gtk_box_pack_start(GTK_BOX(hbox), status_labels[i], FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), labels[i], TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(sd->sna->vbox), hbox, FALSE, FALSE, 3); + gtk_box_pack_start(GTK_BOX(hbox), status_labels[i], FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), labels[i], TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(sd->sna->vbox), hbox, FALSE, FALSE, 3); - gtk_widget_show_all(hbox); + gtk_widget_show_all(hbox); } while (gtk_events_pending()) - gtk_main_iteration(); + gtk_main_iteration(); for (i = 0; i < n; i++) { - gchar *markup; + gchar *markup; - if (sd->flag_cancel) { - markup = - g_strdup_printf("<s>%s</s> <i>%s</i>", - sna[i].name, _("(canceled)")); - gtk_label_set_markup(GTK_LABEL(labels[i]), markup); - g_free(markup); + if (sd->flag_cancel) { + 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); - gtk_label_set_markup(GTK_LABEL(status_labels[i]), error_str); - break; - } + gtk_label_set_markup(GTK_LABEL(status_labels[i]), error_str); + break; + } - markup = g_strdup_printf("<b>%s</b>", sna[i].name); - gtk_label_set_markup(GTK_LABEL(labels[i]), markup); - g_free(markup); + 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)")); - gtk_label_set_markup(GTK_LABEL(labels[i]), markup); - g_free(markup); - - sd->flag_cancel = TRUE; - - gtk_label_set_markup(GTK_LABEL(status_labels[i]), error_str); - if (sna[i].error) { - if (sna[i].error->code != 1) { - /* the user has not cancelled something... */ - g_warning - (_("Failed while performing \"%s\". Please file a bug report " - "if this problem persists. (Use the Help\342\206\222Report" - " bug option.)\n\nDetails: %s"), sna[i].name, - sna[i].error->message); - } - - g_error_free(sna[i].error); - } else { - g_warning - (_("Failed while performing \"%s\". Please file a bug report " - "if this problem persists. (Use the Help\342\206\222Report" - " bug option.)"), sna[i].name); - } - break; - } + 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); + + sd->flag_cancel = TRUE; + + gtk_label_set_markup(GTK_LABEL(status_labels[i]), error_str); + if (sna[i].error) { + if (sna[i].error->code != 1) { + /* the user has not cancelled something... */ + g_warning(_("Failed while performing \"%s\". Please file a " + "bug report " + "if this problem persists. (Use the " + "Help\342\206\222Report" + " bug option.)\n\nDetails: %s"), + _(sna[i].entry->name), sna[i].error->message); + } + + g_error_free(sna[i].error); + } else { + g_warning(_("Failed while performing \"%s\". Please file a bug " + "report " + "if this problem persists. (Use the " + "Help\342\206\222Report" + " bug option.)"), + _(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); @@ -556,14 +463,14 @@ static SyncNetArea *sync_dialog_netarea_new(void) return sna; } -static void sync_dialog_netarea_destroy(SyncNetArea * sna) +static void sync_dialog_netarea_destroy(SyncNetArea *sna) { g_return_if_fail(sna != NULL); g_free(sna); } -static void sync_dialog_netarea_show(SyncDialog * sd) +static void sync_dialog_netarea_show(SyncDialog *sd) { g_return_if_fail(sd && sd->sna); @@ -575,8 +482,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); @@ -586,9 +492,8 @@ 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) +static void populate_store(GtkListStore *store) { GSList *entry; SyncEntry *e; @@ -596,21 +501,20 @@ static void populate_store(GtkListStore * store) gtk_list_store_clear(store); for (entry = entries; entry; entry = entry->next) { - GtkTreeIter iter; + GtkTreeIter iter; - e = (SyncEntry *) entry->data; + e = (SyncEntry *)entry->data; - e->selected = TRUE; + 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_append(store, &iter); + gtk_list_store_set(store, &iter, 0, TRUE, 1, _(e->name), 2, e, -1); } } -static void -sel_toggle(GtkCellRendererToggle * cellrenderertoggle, - gchar * path_str, GtkTreeModel * model) +static void sel_toggle(GtkCellRendererToggle *cellrenderertoggle, + gchar *path_str, + GtkTreeModel *model) { GtkTreeIter iter; GtkTreePath *path = gtk_tree_path_new_from_string(path_str); @@ -626,10 +530,7 @@ sel_toggle(GtkCellRendererToggle * cellrenderertoggle, gtk_tree_path_free(path); } -static void close_clicked(void) -{ - g_main_quit(loop); -} +static void close_clicked(void) { g_main_loop_quit(loop); } static SyncDialog *sync_dialog_new(GtkWidget *parent) { @@ -642,6 +543,7 @@ static SyncDialog *sync_dialog_new(GtkWidget *parent) GtkWidget *button8; GtkWidget *button7; GtkWidget *button6; + GtkWidget *priv_policy_btn; GtkWidget *label; GtkWidget *hbox; @@ -655,15 +557,13 @@ static SyncDialog *sync_dialog_new(GtkWidget *parent) dialog = gtk_dialog_new(); gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent)); - gtk_window_set_title(GTK_WINDOW(dialog), _("Network Updater")); + gtk_window_set_title(GTK_WINDOW(dialog), _("Synchronize")); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); gtk_window_set_icon(GTK_WINDOW(dialog), - icon_cache_get_pixbuf("syncmanager.png")); + icon_cache_get_pixbuf("syncmanager.png")); gtk_window_set_default_size(GTK_WINDOW(dialog), 420, 260); - gtk_window_set_position(GTK_WINDOW(dialog), - GTK_WIN_POS_CENTER_ON_PARENT); - gtk_window_set_type_hint(GTK_WINDOW(dialog), - GDK_WINDOW_TYPE_HINT_DIALOG); + gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT); + gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG); gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); @@ -691,30 +591,24 @@ static SyncDialog *sync_dialog_new(GtkWidget *parent) gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); #endif - gtk_box_pack_start(GTK_BOX(hbox), - icon_cache_get_image("syncmanager.png"), - FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), icon_cache_get_image("syncmanager.png"), + FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); gtk_widget_show_all(hbox); - - gtk_box_pack_start(GTK_BOX(dialog1_vbox), sd->sna->vbox, TRUE, TRUE, - 0); + gtk_box_pack_start(GTK_BOX(dialog1_vbox), sd->sna->vbox, TRUE, TRUE, 0); scrolledwindow2 = gtk_scrolled_window_new(NULL, NULL); gtk_widget_show(scrolledwindow2); - gtk_box_pack_start(GTK_BOX(dialog1_vbox), scrolledwindow2, TRUE, TRUE, - 0); + gtk_box_pack_start(GTK_BOX(dialog1_vbox), scrolledwindow2, TRUE, TRUE, 0); gtk_widget_set_size_request(scrolledwindow2, -1, 200); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow2), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW - (scrolledwindow2), GTK_SHADOW_IN); + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow2), + GTK_SHADOW_IN); store = - gtk_list_store_new(3, G_TYPE_BOOLEAN, G_TYPE_STRING, - G_TYPE_POINTER); + gtk_list_store_new(3, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_POINTER); model = GTK_TREE_MODEL(store); treeview2 = gtk_tree_view_new_with_model(model); @@ -736,6 +630,12 @@ static SyncDialog *sync_dialog_new(GtkWidget *parent) populate_store(store); + priv_policy_btn = gtk_link_button_new_with_label( + "https://github.com/hardinfo2/hardinfo2?tab=readme-ov-file#privacy-policy", + _("Privacy Policy")); + gtk_widget_show(priv_policy_btn); + gtk_box_pack_start(GTK_BOX(dialog1_vbox), priv_policy_btn, FALSE, FALSE, 0); + #if GTK_CHECK_VERSION(2, 14, 0) dialog1_action_area = gtk_dialog_get_action_area(GTK_DIALOG(dialog)); #else @@ -743,12 +643,12 @@ static SyncDialog *sync_dialog_new(GtkWidget *parent) #endif gtk_widget_show(dialog1_action_area); gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog1_action_area), - GTK_BUTTONBOX_END); + GTK_BUTTONBOX_END); button8 = gtk_button_new_with_mnemonic(_("_Cancel")); gtk_widget_show(button8); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button8, - GTK_RESPONSE_CANCEL); + GTK_RESPONSE_CANCEL); #if GTK_CHECK_VERSION(2, 18, 0) gtk_widget_set_can_default(button8, TRUE); #else @@ -757,17 +657,17 @@ static SyncDialog *sync_dialog_new(GtkWidget *parent) button7 = gtk_button_new_with_mnemonic(_("_Synchronize")); gtk_widget_show(button7); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button7, - GTK_RESPONSE_ACCEPT); + GTK_RESPONSE_ACCEPT); #if GTK_CHECK_VERSION(2, 18, 0) gtk_widget_set_can_default(button7, TRUE); #else GTK_WIDGET_SET_FLAGS(button7, GTK_CAN_DEFAULT); #endif button6 = gtk_button_new_from_stock(GTK_STOCK_CLOSE); - g_signal_connect(G_OBJECT(button6), "clicked", - (GCallback) close_clicked, NULL); + g_signal_connect(G_OBJECT(button6), "clicked", (GCallback)close_clicked, + NULL); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button6, - GTK_RESPONSE_ACCEPT); + GTK_RESPONSE_ACCEPT); #if GTK_CHECK_VERSION(2, 18, 0) gtk_widget_set_can_default(button6, TRUE); #else @@ -778,16 +678,57 @@ static SyncDialog *sync_dialog_new(GtkWidget *parent) sd->button_sync = button7; sd->button_cancel = button8; sd->button_close = button6; + sd->button_priv_policy = priv_policy_btn; sd->scroll_box = scrolledwindow2; sd->label = label; return sd; } -static void sync_dialog_destroy(SyncDialog * sd) +static void sync_dialog_destroy(SyncDialog *sd) { gtk_widget_destroy(sd->dialog); sync_dialog_netarea_destroy(sd->sna); g_free(sd); } -#endif /* HAS_LIBSOUP */ + +static gboolean sync_one(gpointer data) +{ + SyncNetAction *sna = data; + + if (sna->entry->generate_contents_for_upload) + goto out; + + DEBUG("Syncronizing: %s", sna->entry->name); + + gchar *msg = g_strdup_printf(_("Synchronizing: %s"), _(sna->entry->name)); + shell_status_update(msg); + shell_status_pulse(); + g_free(msg); + + send_request_for_net_action(sna); + +out: + g_main_loop_unref(loop); + idle_free(sna); + + return FALSE; +} + +void sync_manager_update_on_startup(void) +{ + GSList *entry; + + ensure_soup_session(); + + loop = g_main_loop_new(NULL, FALSE); + + for (entry = entries; entry; entry = entry->next) { + SyncNetAction *action = g_new0(SyncNetAction, 1); + + action->entry = entry->data; + loop = g_main_loop_ref(loop); + + g_idle_add(sync_one, action); + } +} |