aboutsummaryrefslogtreecommitdiff
path: root/shell/syncmanager.c
diff options
context:
space:
mode:
Diffstat (limited to 'shell/syncmanager.c')
-rw-r--r--shell/syncmanager.c737
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);
+ }
+}