summaryrefslogtreecommitdiff
path: root/libedataserver
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2009-07-17 12:03:03 +0200
committerMilan Crha <mcrha@redhat.com>2009-07-17 12:03:03 +0200
commit1564ac68405fa7cee379df876bf7139307a0e110 (patch)
treeb3cae6cd48c1ac573f89c63565fbaddde6392060 /libedataserver
parent3665f8032930a7ac0447f7235108146c465f3571 (diff)
downloadevolution-data-server-1564ac68405fa7cee379df876bf7139307a0e110.tar.gz
Part of Bug #583374 - Better handle uri changes in ESource
Diffstat (limited to 'libedataserver')
-rw-r--r--libedataserver/e-source.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/libedataserver/e-source.c b/libedataserver/e-source.c
index 5ccd50639..9d340380a 100644
--- a/libedataserver/e-source.c
+++ b/libedataserver/e-source.c
@@ -307,11 +307,18 @@ e_source_update_from_xml_node (ESource *source,
|| source->priv->relative_uri == NULL
|| relative_uri == NULL
|| strcmp ((gchar *)relative_uri, source->priv->relative_uri) != 0) {
+ gchar *abs_uri = NULL;
+
g_free (source->priv->name);
source->priv->name = g_strdup ((gchar *)name);
if (source->priv->group) {
- /* reset the absolute uri to NULL to be regenerated when asked for */
+ abs_uri = e_source_build_absolute_uri (source);
+ }
+
+ if (abs_uri && source->priv->absolute_uri && g_str_equal (abs_uri, source->priv->absolute_uri)) {
+ /* reset the absolute uri to NULL to be regenerated when asked for,
+ but only when it was generated also before */
g_free (source->priv->absolute_uri);
source->priv->absolute_uri = NULL;
} else if (source->priv->absolute_uri &&
@@ -325,6 +332,8 @@ e_source_update_from_xml_node (ESource *source,
g_free (tmp);
}
+ g_free (abs_uri);
+
g_free (source->priv->relative_uri);
source->priv->relative_uri = g_strdup ((gchar *)relative_uri);
@@ -493,26 +502,33 @@ void
e_source_set_relative_uri (ESource *source,
const gchar *relative_uri)
{
- gchar *absolute_uri;
+ gchar *absolute_uri, *old_abs_uri = NULL;
g_return_if_fail (E_IS_SOURCE (source));
if (source->priv->readonly)
return;
- if (source->priv->relative_uri == relative_uri)
+ if (source->priv->relative_uri == relative_uri ||
+ (source->priv->relative_uri && relative_uri && g_str_equal (source->priv->relative_uri, relative_uri)))
return;
+ if (source->priv->group)
+ old_abs_uri = e_source_build_absolute_uri (source);
+
g_free (source->priv->relative_uri);
source->priv->relative_uri = g_strdup (relative_uri);
- /* reset the absolute uri */
+ /* reset the absolute uri, if it's a generated one */
if (source->priv->absolute_uri &&
+ (!old_abs_uri || g_str_equal (source->priv->absolute_uri, old_abs_uri)) &&
(absolute_uri = e_source_build_absolute_uri (source))) {
g_free (source->priv->absolute_uri);
source->priv->absolute_uri = absolute_uri;
}
+ g_free (old_abs_uri);
+
g_signal_emit (source, signals[CHANGED], 0);
}
@@ -522,7 +538,7 @@ e_source_set_absolute_uri (ESource *source,
{
g_return_if_fail (E_IS_SOURCE (source));
- if (!!absolute_uri == !!source->priv->absolute_uri
+ if ((absolute_uri == source->priv->absolute_uri && absolute_uri == NULL)
|| (absolute_uri && source->priv->absolute_uri && !strcmp (source->priv->absolute_uri, absolute_uri)))
return;