summaryrefslogtreecommitdiff
path: root/libebackend/e-source-registry-server.c
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2015-06-18 17:50:27 +0200
committerMilan Crha <mcrha@redhat.com>2015-06-18 17:50:27 +0200
commit3738cdcd1b26625ce1a005d0c24b8814c593a7a0 (patch)
tree4886ddd116948c89c42dbc5a0d41b3b40d0d4109 /libebackend/e-source-registry-server.c
parentaa9e2ca6e454f6a42b5e86d403bb4ef38705892e (diff)
downloadevolution-data-server-3738cdcd1b26625ce1a005d0c24b8814c593a7a0.tar.gz
source_registry_server_monitor_changed_cb: Reuse existing source
When available, reuse existing source, thus all the changes are not done on an object which is immediately freed.
Diffstat (limited to 'libebackend/e-source-registry-server.c')
-rw-r--r--libebackend/e-source-registry-server.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/libebackend/e-source-registry-server.c b/libebackend/e-source-registry-server.c
index 85c0ca6da..61aa39ab4 100644
--- a/libebackend/e-source-registry-server.c
+++ b/libebackend/e-source-registry-server.c
@@ -424,9 +424,20 @@ source_registry_server_monitor_changed_cb (GFileMonitor *monitor,
if (event_type == G_FILE_MONITOR_EVENT_CREATED) {
ESource *source;
GError *error = NULL;
+ gchar *uid;
+
+ uid = e_server_side_source_uid_from_file (file, NULL);
+ if (!uid)
+ return;
- /* it can return NULL source for hidden files */
- source = e_server_side_source_new (server, file, &error);
+ source = e_source_registry_server_ref_source (server, uid);
+
+ g_free (uid);
+
+ if (!source) {
+ /* it can return NULL source for hidden files */
+ source = e_server_side_source_new (server, file, &error);
+ }
if (!error && source) {
/* File monitors are only placed on directories
@@ -438,12 +449,13 @@ source_registry_server_monitor_changed_cb (GFileMonitor *monitor,
E_SERVER_SIDE_SOURCE (source), TRUE);
e_source_registry_server_add_source (server, source);
- g_object_unref (source);
} else if (error) {
e_source_registry_server_load_error (
server, file, error);
g_error_free (error);
}
+
+ g_clear_object (&source);
}
if (event_type == G_FILE_MONITOR_EVENT_DELETED) {