diff options
Diffstat (limited to 'hardinfo2')
-rw-r--r-- | hardinfo2/syncmanager.c | 173 | ||||
-rw-r--r-- | hardinfo2/syncmanager.h | 32 | ||||
-rw-r--r-- | hardinfo2/util.c | 11 |
3 files changed, 181 insertions, 35 deletions
diff --git a/hardinfo2/syncmanager.c b/hardinfo2/syncmanager.c index e514847c..241afeb7 100644 --- a/hardinfo2/syncmanager.c +++ b/hardinfo2/syncmanager.c @@ -1,3 +1,21 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + #include "syncmanager.h" #include "iconcache.h" #include "hardinfo.h" @@ -7,6 +25,8 @@ #include <libsoup/soup-xmlrpc-message.h> #include <libsoup/soup-xmlrpc-response.h> +#include <stdarg.h> + typedef struct _SyncDialog SyncDialog; typedef struct _SyncNetArea SyncNetArea; typedef struct _SyncNetAction SyncNetAction; @@ -41,7 +61,7 @@ static GSList *entries = NULL; static SoupSession *session = NULL; static GQuark err_quark; -#define XMLRPC_SERVER_URI "http://hardinfo.berlios.de/xmlrpc/" +#define XMLRPC_SERVER_URI "http://condor/xmlrpc/" #define XMLRPC_SERVER_API_VERSION 1 #define LABEL_SYNC_DEFAULT "<big><b>Synchronize with Central Database</b></big>\n" \ @@ -63,6 +83,12 @@ static void sync_dialog_netarea_hide(SyncDialog *sd); 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__); \ + } + + void sync_manager_add_entry(SyncEntry *entry) { entries = g_slist_prepend(entries, entry); @@ -89,20 +115,19 @@ static SoupXmlrpcValue *_soup_get_xmlrpc_value(SoupMessage *msg, SyncNetAction * sna->error = NULL; if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) { - sna->error = g_error_new(err_quark, 1, "%s (error #%d)", - msg->reason_phrase, msg->status_code); + SNA_ERROR(1, "%s (error #%d)", msg->reason_phrase, msg->status_code); goto bad; } - + response = soup_xmlrpc_message_parse_response(SOUP_XMLRPC_MESSAGE(msg)); if (!response) { - sna->error = g_error_new(err_quark, 2, "Could not parse XMLRPC response"); + SNA_ERROR(2, "Could not parse XML-RPC response"); goto bad; } value = soup_xmlrpc_response_get_value(response); if (!value) { - sna->error = g_error_new(err_quark, 3, "No response value in XMLRPC response"); + SNA_ERROR(3, "No response value in XML-RPC response"); } bad: @@ -116,22 +141,15 @@ static long _soup_get_xmlrpc_value_int(SoupMessage *msg, SyncNetAction *sna) value = _soup_get_xmlrpc_value(msg, sna); if (!value) { - if (!sna->error) - sna->error = GINT_TO_POINTER(1); - goto very_bad; + SNA_ERROR(4, "Could not extract result from XML-RPC response"); + goto bad; } if (!soup_xmlrpc_value_get_int(value, &int_value)) { - if (!sna->error) - sna->error = g_error_new(err_quark, 4, - "Could not extract result from XMLRPC response"); - - goto bad; + SNA_ERROR(4, "Could not extract result from XML-RPC response"); } - + bad: - /* FIXME: free value? */ -very_bad: return int_value; } @@ -158,16 +176,48 @@ static gboolean _soup_xmlrpc_call(gchar *method, SyncNetAction *sna, return TRUE; } +static gboolean _soup_xmlrpc_call_with_parameters(gchar *method, SyncNetAction *sna, + SoupMessageCallbackFn callback, + ...) +{ + SoupXmlrpcMessage *msg; + gchar *argument; + va_list ap; + + sna->error = NULL; + + msg = soup_xmlrpc_message_new(XMLRPC_SERVER_URI); + if (!msg) + return FALSE; + + soup_xmlrpc_message_start_call(msg, method); + + va_start(ap, callback); + while ((argument = va_arg(ap, gchar *))) { + soup_xmlrpc_message_start_param(msg); + soup_xmlrpc_message_write_string(msg, argument); + soup_xmlrpc_message_end_param(msg); + } + va_end(ap); + + soup_xmlrpc_message_end_call(msg); + soup_xmlrpc_message_persist(msg); + + soup_session_queue_message(session, SOUP_MESSAGE(msg), callback, sna); + gtk_main(); + + return TRUE; +} + static void _action_check_api_version_got_response(SoupMessage *msg, gpointer user_data) { SyncNetAction *sna = (SyncNetAction *) user_data; long version = _soup_get_xmlrpc_value_int(msg, sna); if (version != XMLRPC_SERVER_API_VERSION) { - if (!sna->error) - sna->error = g_error_new(err_quark, 5, "Server says it supports API version %ld, but " \ - "this version of HardInfo only supports API " \ - "version %d.", version, XMLRPC_SERVER_API_VERSION); + SNA_ERROR(5, "Server says it supports API version %ld, but " \ + "this version of HardInfo only supports API " \ + "version %d.", version, XMLRPC_SERVER_API_VERSION); } gtk_main_quit(); @@ -204,6 +254,79 @@ static gboolean _action_get_benchmarks(SyncDialog *sd, gpointer user_data) return sna->error ? FALSE : TRUE; } +static long sync_manager_get_user_id() +{ + GKeyFile *kf; + gchar *syncconf = g_build_filename(g_get_home_dir(), + ".hardinfo", "sync.conf", NULL); + gint user_id = -1; + + kf = g_key_file_new(); + if (kf && g_key_file_load_from_file(kf, syncconf, 0, NULL)) { + user_id = g_key_file_get_integer(kf, "syncmanager", "userid", NULL); + g_key_file_free(kf); + } + + g_free(syncconf); + + return user_id; +} + +static void sync_manager_set_user_id(long user_id) +{ + GKeyFile *kf; + gchar *syncconf = g_build_filename(g_get_home_dir(), + ".hardinfo", "sync.conf", NULL); + + kf = g_key_file_new(); + if (kf) { + gchar *data; + + g_key_file_set_integer(kf, "syncmanager", "userid", user_id); + + data = g_key_file_to_data(kf, NULL, NULL); + g_file_set_contents(syncconf, data, -1, NULL); + + g_free(data); + g_key_file_free(kf); + } + + g_free(syncconf); +} + +static void _action_send_benchmarks_got_response(SoupMessage *msg, gpointer user_data) +{ + SyncNetAction *sna = (SyncNetAction *) user_data; + + sync_manager_set_user_id(_soup_get_xmlrpc_value_int(msg, sna)); + + gtk_main_quit(); +} + +static gboolean _action_send_benchmarks(SyncDialog *sd, gpointer user_data) +{ + SyncNetAction *sna = (SyncNetAction *) user_data; + long user_id = sync_manager_get_user_id(); + + gchar *temp = user_id == -1 ? NULL : g_strdup_printf("%ld", user_id); + + if (!_soup_xmlrpc_call_with_parameters("benchmark.addResult", sna, + _action_send_benchmarks_got_response, + "CPU SHA1", + "Athlon XP 3200+", + "0", + VERSION, + ARCH, + temp, + NULL)) { + g_free(temp); + return FALSE; + } + + g_free(temp); + return sna->error ? FALSE : TRUE; +} + static gboolean _cancel_sync(GtkWidget *widget, gpointer data) { SyncDialog *sd = (SyncDialog *) data; @@ -223,11 +346,12 @@ static void sync_dialog_start_sync(SyncDialog *sd) SyncNetAction actions[] = { { "Contacting HardInfo Central Database", _action_check_api_version }, { "Receiving benchmark results", _action_get_benchmarks }, - { "Sync finished", NULL }, + { "Sending benchmark results", _action_send_benchmarks }, + { "Cleaning up", NULL }, }; if (!session) { - session = soup_session_async_new_with_options(SOUP_SESSION_TIMEOUT, 5, NULL); + session = soup_session_async_new_with_options(SOUP_SESSION_TIMEOUT, 10, NULL); } gtk_widget_hide(sd->button_sync); @@ -311,6 +435,7 @@ static void sync_dialog_netarea_start_actions(SyncDialog *sd, SyncNetAction sna[ "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 " \ @@ -419,6 +544,7 @@ static SyncDialog *sync_dialog_new(void) 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); @@ -457,6 +583,7 @@ static SyncDialog *sync_dialog_new(void) TREE_COL_NAME); */ + dialog1_action_area = GTK_DIALOG(dialog)->action_area; gtk_widget_show(dialog1_action_area); gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog1_action_area), diff --git a/hardinfo2/syncmanager.h b/hardinfo2/syncmanager.h index 19025029..24f0a17d 100644 --- a/hardinfo2/syncmanager.h +++ b/hardinfo2/syncmanager.h @@ -1,3 +1,21 @@ +/* + * HardInfo - Displays System Information + * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@linuxmag.com.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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + #ifndef __SYNCMANAGER_H__ #define __SYNCMANAGER_H__ @@ -5,18 +23,10 @@ typedef struct _SyncEntry SyncEntry; -typedef enum { - SYNC_RECEIVE, - SYNC_SEND, - SYNC_BOTH -} SyncDirection; - struct _SyncEntry { - gchar *name; - gchar *save_to; - SyncDirection direction; - - gchar *(*get_data)(void); + gchar *name; + gchar *save_to; + gchar *(*get_data)(void); }; void sync_manager_add_entry(SyncEntry *entry); diff --git a/hardinfo2/util.c b/hardinfo2/util.c index e526d125..52839308 100644 --- a/hardinfo2/util.c +++ b/hardinfo2/util.c @@ -26,6 +26,9 @@ #include <binreloc.h> +#include <sys/stat.h> +#include <sys/types.h> + #define KiB 1024 #define MiB 1048576 #define GiB 1073741824 @@ -350,7 +353,13 @@ void parameters_init(int *argc, char ***argv, ProgramParameters * param) param->autoload_deps = autoload_deps; if (report_format && g_str_equal(report_format, "html")) - param->report_format = REPORT_FORMAT_HTML; + param->report_format = REPORT_FORMAT_HTML; + + gchar *confdir = g_build_filename(g_get_home_dir(), ".hardinfo", NULL); + if (!g_file_test(confdir, G_FILE_TEST_EXISTS)) { + mkdir(confdir, 0744); + } + g_free(confdir); } gboolean ui_init(int *argc, char ***argv) |