diff --git a/src/gtk-ui/sync-config-widget.c b/src/gtk-ui/sync-config-widget.c index 2647c58e..1b166519 100644 --- a/src/gtk-ui/sync-config-widget.c +++ b/src/gtk-ui/sync-config-widget.c @@ -58,7 +58,17 @@ enum { }; static guint32 signals[LAST_SIGNAL] = {0, }; +typedef struct save_config_data { + SyncConfigWidget *widget; + gboolean delete; + gboolean temporary; + source_widgets *widgets; + char *basename; +} save_config_data; + +static void start_session_for_config_write_cb (SyncevoServer *server, char *path, GError *error, save_config_data *data); static void sync_config_widget_update_label (SyncConfigWidget *self); +static void sync_config_widget_set_name (SyncConfigWidget *self, const char *name); static void remove_child (GtkWidget *widget, GtkContainer *container) @@ -117,13 +127,6 @@ update_source_uri (char *name, g_hash_table_insert (source_configuration, g_strdup ("uri"), g_strdup (uri)); } -typedef struct save_config_data { - SyncConfigWidget *widget; - gboolean delete; - gboolean temporary; - source_widgets *widgets; -} save_config_data; - static source_widgets * source_widgets_ref (source_widgets *widgets) { @@ -206,21 +209,79 @@ set_config_cb (SyncevoSession *session, } +static void +get_config_for_overwrite_prevention_cb (SyncevoSession *session, + SyncevoConfig *config, + GError *error, + save_config_data *data) +{ + static int index = 0; + char *name; + + if (error) { + index = 0; + if (error->code == DBUS_GERROR_REMOTE_EXCEPTION && + dbus_g_error_has_name (error, SYNCEVO_DBUS_ERROR_NO_SUCH_CONFIG)) { + /* Config does not exist (as expected), we can now save */ + syncevo_session_set_config (session, + data->temporary, + data->temporary, + data->widget->config, + (SyncevoSessionGenericCb)set_config_cb, + data); + return; + } + g_warning ("Unexpected error in Session.GetConfig: %s", error->message); + g_error_free (error); + g_object_unref (session); + return; + } + + /* Config exists when we are trying to create a new config... + * Need to start a new session with another name */ + g_object_unref (session); + name = g_strdup_printf ("%s__%d", data->basename, ++index); + sync_config_widget_set_name (data->widget, name); + g_free (name); + + syncevo_server_start_session (data->widget->server, + data->widget->config_name, + (SyncevoServerStartSessionCb)start_session_for_config_write_cb, + data); +} + static void save_config (save_config_data *data, SyncevoSession *session) { + char *is_client; + SyncConfigWidget *w = data->widget; + if (data->delete) { - syncevo_config_free (data->widget->config); - data->widget->config = g_hash_table_new (g_str_hash, g_str_equal); + syncevo_config_free (w->config); + w->config = g_hash_table_new (g_str_hash, g_str_equal); } - syncevo_session_set_config (session, - data->temporary, - data->temporary, - data->widget->config, - (SyncevoSessionGenericCb)set_config_cb, - data); + /* if this is a client peer (a device) and not configured, we + * need to test that we aren't overwriting existing + * configs */ + /* TODO: This might be a good thing to do for any configurations.*/ + syncevo_config_get_value (w->config, NULL, "PeerIsClient", &is_client); + if (is_client && g_strcmp0 ("1", is_client) == 0 && + !w->configured && !data->temporary) { + + syncevo_session_get_config (session, + FALSE, + (SyncevoSessionGetConfigCb)get_config_for_overwrite_prevention_cb, + data); + } else { + syncevo_session_set_config (session, + data->temporary, + data->temporary, + data->widget->config, + (SyncevoSessionGenericCb)set_config_cb, + data); + } } static void @@ -319,7 +380,7 @@ use_clicked_cb (GtkButton *btn, SyncConfigWidget *self) return; } - if (strlen (self->config_name) == 0) { + if (!self->config_name || strlen (self->config_name) == 0) { g_free (self->config_name); self->config_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (self->entry))); } @@ -397,6 +458,7 @@ use_clicked_cb (GtkButton *btn, SyncConfigWidget *self) data->widget = self; data->delete = FALSE; data->temporary = FALSE; + data->basename = g_strdup (self->config_name); syncevo_server_start_session (self->server, self->config_name, (SyncevoServerStartSessionCb)start_session_for_config_write_cb, @@ -453,6 +515,7 @@ reset_delete_clicked_cb (GtkButton *btn, SyncConfigWidget *self) data->widget = self; data->delete = TRUE; data->temporary = FALSE; + syncevo_server_start_session (self->server, self->config_name, (SyncevoServerStartSessionCb)start_session_for_config_write_cb, @@ -712,6 +775,7 @@ init_source (char *name, data->delete = FALSE; data->temporary = TRUE; data->widgets = source_widgets_ref (widgets); + syncevo_server_start_session (self->server, self->config_name, (SyncevoServerStartSessionCb)start_session_for_config_write_cb, @@ -1040,7 +1104,6 @@ device_selection_btn_clicked_cb (GtkButton *btn, SyncConfigWidget *self) gtk_tree_model_get (model, &iter, 1, &config, -1 ); sync_config_widget_set_config (self, config); - sync_config_widget_set_name (self, name); sync_config_widget_update_expander (self); } @@ -1494,8 +1557,6 @@ sync_config_widget_constructor (GType gtype, return G_OBJECT (self); } - sync_config_widget_add_config (self, self->config_name, self->config); - if (g_strcmp0 (self->config_name, "default") == 0) { init_default_config (self); @@ -2109,16 +2170,17 @@ sync_config_widget_get_name (SyncConfigWidget *widget) void sync_config_widget_add_alternative_config (SyncConfigWidget *self, - const char *name, + const char *template_name, SyncevoConfig *config, gboolean configured) { + sync_config_widget_add_config (self, template_name, config); if (configured) { sync_config_widget_set_config (self, config); - sync_config_widget_set_name (self, name); - sync_config_widget_set_configured (self, TRUE); - } else { - sync_config_widget_add_config (self, name, config); + sync_config_widget_set_configured (self, TRUE); } + + sync_config_widget_update_expander (self); + } diff --git a/src/gtk-ui/sync-ui.c b/src/gtk-ui/sync-ui.c index 8b750f34..fb6651ec 100644 --- a/src/gtk-ui/sync-ui.c +++ b/src/gtk-ui/sync-ui.c @@ -2060,26 +2060,23 @@ get_config_for_config_widget_cb (SyncevoServer *server, if (is_peer && g_strcmp0 ("1", is_peer) == 0) { if (url) { SyncConfigWidget *w; - char *fp, *device_name = NULL; + char *fp, *template_name, *device_name = NULL; char **fpv = NULL; - /* NOTE: using device_name here means a new config will be saved with - * device_name (and not the template name). Not sure if this is - * what we really want... */ - - syncevo_config_get_value (config, NULL, "templateName", &device_name); + syncevo_config_get_value (config, NULL, "deviceName", &device_name); if (!device_name) { + device_name = c_data->name; + } + syncevo_config_get_value (config, NULL, "templateName", &template_name); + if (!template_name) { syncevo_config_get_value (config, NULL, "fingerPrint", &fp); if (fp) { fpv = g_strsplit_set (fp, ",;", 2); if (g_strv_length (fpv) > 0) { - device_name = fpv[0]; + template_name = fpv[0]; } } } - if (!device_name) { - device_name = c_data->name; - } /* keep a list of added devices */ w = g_hash_table_lookup (c_data->device_templates, url); @@ -2092,6 +2089,8 @@ get_config_for_config_widget_cb (SyncevoServer *server, c_data->has_configuration, c_data->data); g_hash_table_insert (c_data->device_templates, url, w); + sync_config_widget_add_alternative_config (w, template_name, config, + c_data->has_configuration); } } else { /* TODO: might want to add a new widget, if user has created more @@ -2100,7 +2099,7 @@ get_config_for_config_widget_cb (SyncevoServer *server, /* there is a widget for this device already, add this info there*/ if (c_data->has_configuration || g_strcmp0 ("1", ready) == 0) { - sync_config_widget_add_alternative_config (w, device_name, config, + sync_config_widget_add_alternative_config (w, template_name, config, c_data->has_configuration); } }