diff options
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/syncmanager.c | 277 | 
1 files changed, 53 insertions, 224 deletions
| 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);      }  } | 
