[evolution-data-server] Rename camel_service_get_settings().



commit 444dd5e097ecfe63e2a70f9c813e80e47d8c99e5
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sun Aug 12 13:52:58 2012 -0400

    Rename camel_service_get_settings().
    
    Applying lessons learned from ESourceRegistry.
    
    Rename camel_service_get_settings() to camel_service_ref_settings()
    and have it return a new reference.
    
    When returning a pointer to a reference-counted object in a multi-
    threaded environment, always increase the object's reference count
    before returning so as to transfer a new reference to the caller.
    
    Otherwise it introduces a potential race where the reference-counted
    object may lose its last reference and be freed while the caller is
    still using the object.  Even if the caller immediately increments
    the object's reference count, it's still a potential race.
    
    Transferring a new reference to the caller means the caller must
    unreference the object when finished with it so the object will be
    properly freed when it's no longer needed.

 camel/camel-disco-folder.c                   |    5 +-
 camel/camel-disco-store.c                    |   10 +++-
 camel/camel-imapx-conn-manager.c             |    5 +-
 camel/camel-imapx-folder.c                   |    5 +-
 camel/camel-imapx-server.c                   |   65 ++++++++++++++++----
 camel/camel-imapx-store.c                    |   36 +++++++++--
 camel/camel-imapx-utils.c                    |    6 ++-
 camel/camel-network-service.c                |    4 +-
 camel/camel-offline-folder.c                 |    5 +-
 camel/camel-offline-store.c                  |   10 +++-
 camel/camel-sasl-cram-md5.c                  |    5 +-
 camel/camel-sasl-digest-md5.c                |    5 +-
 camel/camel-sasl-gssapi.c                    |    5 +-
 camel/camel-sasl-login.c                     |    5 +-
 camel/camel-sasl-ntlm.c                      |   10 +++-
 camel/camel-sasl-plain.c                     |    5 +-
 camel/camel-service.c                        |   45 ++++++++++----
 camel/camel-service.h                        |    2 +-
 camel/providers/imap/camel-imap-command.c    |    5 +-
 camel/providers/imap/camel-imap-folder.c     |   46 ++++++++++----
 camel/providers/imap/camel-imap-store.c      |   84 +++++++++++++++++++-------
 camel/providers/imap/camel-imap-wrapper.c    |    5 +-
 camel/providers/local/camel-local-folder.c   |   20 ++++---
 camel/providers/local/camel-local-store.c    |   34 ++++++++--
 camel/providers/local/camel-maildir-folder.c |    5 +-
 camel/providers/local/camel-maildir-store.c  |   47 ++++++++++++---
 camel/providers/local/camel-mbox-store.c     |   11 +++-
 camel/providers/local/camel-mh-store.c       |   25 ++++++--
 camel/providers/local/camel-spool-folder.c   |    5 +-
 camel/providers/local/camel-spool-store.c    |   25 ++++++--
 camel/providers/nntp/camel-nntp-folder.c     |    5 +-
 camel/providers/nntp/camel-nntp-store.c      |   34 ++++++++--
 camel/providers/nntp/camel-nntp-summary.c    |   10 +++-
 camel/providers/pop3/camel-pop3-folder.c     |   42 ++++++++-----
 camel/providers/pop3/camel-pop3-store.c      |   36 ++++++++----
 camel/providers/smtp/camel-smtp-transport.c  |   12 +++-
 docs/reference/camel/camel-sections.txt      |    2 +-
 37 files changed, 520 insertions(+), 166 deletions(-)
---
diff --git a/camel/camel-disco-folder.c b/camel/camel-disco-folder.c
index 9f54f68..368854f 100644
--- a/camel/camel-disco-folder.c
+++ b/camel/camel-disco-folder.c
@@ -113,14 +113,17 @@ cdf_folder_changed (CamelFolder *folder,
 
 	service = CAMEL_SERVICE (parent_store);
 	session = camel_service_get_session (service);
-	settings = camel_service_get_settings (service);
 
 	sync_folder = camel_disco_folder_get_offline_sync (
 		CAMEL_DISCO_FOLDER (folder));
 
+	settings = camel_service_ref_settings (service);
+
 	sync_store = camel_offline_settings_get_stay_synchronized (
 		CAMEL_OFFLINE_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	if (changes->uid_added->len > 0 && (sync_folder || sync_store)) {
 		struct _cdf_sync_data *data;
 
diff --git a/camel/camel-disco-store.c b/camel/camel-disco-store.c
index 54df118..f13ca90 100644
--- a/camel/camel-disco-store.c
+++ b/camel/camel-disco-store.c
@@ -284,15 +284,18 @@ disco_store_set_status (CamelDiscoStore *disco_store,
 	store = CAMEL_STORE (disco_store);
 	service = CAMEL_SERVICE (disco_store);
 	session = camel_service_get_session (service);
-	settings = camel_service_get_settings (service);
 
 	network_available = camel_session_get_network_available (session);
 	store_is_online = (disco_store->status == CAMEL_DISCO_STORE_ONLINE);
 	going_offline = (status == CAMEL_DISCO_STORE_OFFLINE);
 
+	settings = camel_service_ref_settings (service);
+
 	sync_store = camel_offline_settings_get_stay_synchronized (
 		CAMEL_OFFLINE_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	if (network_available) {
 		if (store_is_online && going_offline && store->folders != NULL) {
 			GPtrArray *folders;
@@ -485,7 +488,6 @@ camel_disco_store_prepare_for_offline (CamelDiscoStore *disco_store,
 	store = CAMEL_STORE (disco_store);
 	service = CAMEL_SERVICE (disco_store);
 	session = camel_service_get_session (service);
-	settings = camel_service_get_settings (service);
 
 	/* We can't prepare for offline if we're already offline. */
 	if (!camel_session_get_network_available (session))
@@ -494,9 +496,13 @@ camel_disco_store_prepare_for_offline (CamelDiscoStore *disco_store,
 	/* Sync the folder fully if we've been told to
 	 * sync offline for this store or this folder. */
 
+	settings = camel_service_ref_settings (service);
+
 	sync_store = camel_offline_settings_get_stay_synchronized (
 		CAMEL_OFFLINE_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	store_is_online = (disco_store->status == CAMEL_DISCO_STORE_ONLINE);
 
 	if (store_is_online && store->folders != NULL) {
diff --git a/camel/camel-imapx-conn-manager.c b/camel/camel-imapx-conn-manager.c
index 1a721f6..916ef78 100644
--- a/camel/camel-imapx-conn-manager.c
+++ b/camel/camel-imapx-conn-manager.c
@@ -492,12 +492,15 @@ imapx_find_connection_unlocked (CamelIMAPXConnManager *con_man,
 	/* Caller must be holding CON_WRITE_LOCK. */
 
 	service = CAMEL_SERVICE (con_man->priv->store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	concurrent_connections =
 		camel_imapx_settings_get_concurrent_connections (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	/* XXX Have a dedicated connection for INBOX ? */
 
 	list = con_man->priv->connections;
diff --git a/camel/camel-imapx-folder.c b/camel/camel-imapx-folder.c
index ab78c46..089ff01 100644
--- a/camel/camel-imapx-folder.c
+++ b/camel/camel-imapx-folder.c
@@ -69,7 +69,8 @@ camel_imapx_folder_new (CamelStore *store,
 	d("opening imap folder '%s'\n", folder_dir);
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	g_object_get (
 		settings,
@@ -79,6 +80,8 @@ camel_imapx_folder_new (CamelStore *store,
 		"filter-junk-inbox", &filter_junk_inbox,
 		NULL);
 
+	g_object_unref (settings);
+
 	short_name = strrchr (folder_name, '/');
 	if (short_name)
 		short_name++;
diff --git a/camel/camel-imapx-server.c b/camel/camel-imapx-server.c
index ead3166..bf5561e 100644
--- a/camel/camel-imapx-server.c
+++ b/camel/camel-imapx-server.c
@@ -1928,7 +1928,6 @@ imapx_untagged (CamelIMAPXServer *is,
 	gboolean ok = FALSE;
 
 	service = CAMEL_SERVICE (is->store);
-	settings = camel_service_get_settings (service);
 	priv = CAMEL_IMAPX_SERVER_GET_PRIVATE (is);
 
 	/* If priv->context is not NULL here, it basically means that
@@ -1939,10 +1938,14 @@ imapx_untagged (CamelIMAPXServer *is,
 	g_return_val_if_fail (priv->context == NULL, FALSE);
 	priv->context = g_new0 (CamelIMAPXServerUntaggedContext, 1);
 
+	settings = camel_service_ref_settings (service);
+
 	priv->context->lsub = FALSE;
 	priv->context->fetch_order = camel_imapx_settings_get_fetch_order (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	e(is->tagprefix, "got untagged response\n");
 	priv->context->id = 0;
 	priv->context->tok = camel_imapx_stream_token (is->stream,
@@ -3075,13 +3078,16 @@ connect_to_server_process (CamelIMAPXServer *is,
 	service = CAMEL_SERVICE (is->store);
 	password = camel_service_get_password (service);
 	provider = camel_service_get_provider (service);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 	port = camel_network_settings_get_port (network_settings);
 	user = camel_network_settings_dup_user (network_settings);
 
+	g_object_unref (settings);
+
 	/* Put full details in the environment, in case the connection
 	 * program needs them */
 	camel_url_set_protocol (&url, provider->protocol);
@@ -3200,7 +3206,8 @@ imapx_connect_to_server (CamelIMAPXServer *is,
 #endif
 
 	service = CAMEL_SERVICE (is->store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
@@ -3213,7 +3220,11 @@ imapx_connect_to_server (CamelIMAPXServer *is,
 	if (use_shell_command)
 		shell_command = camel_imapx_settings_dup_shell_command (
 			CAMEL_IMAPX_SETTINGS (settings));
+#endif
 
+	g_object_unref (settings);
+
+#ifndef G_OS_WIN32
 	if (shell_command != NULL) {
 		gboolean success;
 
@@ -3407,12 +3418,15 @@ camel_imapx_server_authenticate (CamelIMAPXServer *is,
 		CAMEL_AUTHENTICATION_REJECTED);
 
 	service = CAMEL_SERVICE (is->store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 	user = camel_network_settings_dup_user (network_settings);
 
+	g_object_unref (settings);
+
 	if (mechanism != NULL) {
 		if (!g_hash_table_lookup (is->cinfo->auth_types, mechanism)) {
 			g_set_error (
@@ -3514,7 +3528,8 @@ imapx_reconnect (CamelIMAPXServer *is,
 
 	service = CAMEL_SERVICE (is->store);
 	session = camel_service_get_session (service);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	mechanism = camel_network_settings_dup_auth_mechanism (
 		CAMEL_NETWORK_SETTINGS (settings));
@@ -3525,6 +3540,8 @@ imapx_reconnect (CamelIMAPXServer *is,
 	use_qresync = camel_imapx_settings_get_use_qresync (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	if (!imapx_connect_to_server (is, cancellable, error))
 		goto exception;
 
@@ -4150,13 +4167,16 @@ imapx_command_step_fetch_done (CamelIMAPXServer *is,
 	isum = (CamelIMAPXSummary *) job->folder->summary;
 
 	service = CAMEL_SERVICE (is->store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	batch_count = camel_imapx_settings_get_batch_fetch_count (
 		CAMEL_IMAPX_SETTINGS (settings));
 	mobile_mode = camel_imapx_settings_get_mobile_mode (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	i = data->index;
 
 	//printf("%s: Mobile mode: %d Fetch Count %d\n", camel_folder_get_display_name (job->folder), mobile_mode, batch_count);
@@ -4292,13 +4312,16 @@ imapx_job_scan_changes_done (CamelIMAPXServer *is,
 	data->scan_changes = FALSE;
 
 	service = CAMEL_SERVICE (is->store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	uidset_size = camel_imapx_settings_get_batch_fetch_count (
 		CAMEL_IMAPX_SETTINGS (settings));
 	mobile_mode = camel_imapx_settings_get_mobile_mode (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	if (camel_imapx_command_set_error_if_failed (ic, error)) {
 		g_prefix_error (
 			error, "%s: ",
@@ -4463,10 +4486,14 @@ imapx_job_scan_changes_start (CamelIMAPXJob *job,
 	gchar *uid = NULL;
 
 	service = CAMEL_SERVICE (is->store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
+
 	mobile_mode = camel_imapx_settings_get_mobile_mode (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	if (mobile_mode)
 		uid = imapx_get_uid_from_index (job->folder->summary, 0);
 
@@ -4600,7 +4627,8 @@ imapx_job_fetch_new_messages_start (CamelIMAPXJob *job,
 	g_return_if_fail (data != NULL);
 
 	service = CAMEL_SERVICE (is->store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	fetch_order = camel_imapx_settings_get_fetch_order (
 		CAMEL_IMAPX_SETTINGS (settings));
@@ -4608,6 +4636,8 @@ imapx_job_fetch_new_messages_start (CamelIMAPXJob *job,
 	uidset_size = camel_imapx_settings_get_batch_fetch_count (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	total = camel_folder_summary_count (folder->summary);
 	diff = ifolder->exists_on_server - total;
 
@@ -4676,7 +4706,8 @@ imapx_job_fetch_messages_start (CamelIMAPXJob *job,
 	g_return_if_fail (data != NULL);
 
 	service = CAMEL_SERVICE (is->store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	fetch_order = camel_imapx_settings_get_fetch_order (
 		CAMEL_IMAPX_SETTINGS (settings));
@@ -4689,6 +4720,8 @@ imapx_job_fetch_messages_start (CamelIMAPXJob *job,
 	uidset_size = camel_imapx_settings_get_batch_fetch_count (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	if (ftype == CAMEL_FETCH_NEW_MESSAGES ||
 		(ftype ==  CAMEL_FETCH_OLD_MESSAGES && total <=0 )) {
 
@@ -4803,10 +4836,14 @@ imapx_job_refresh_info_start (CamelIMAPXJob *job,
 	gboolean mobile_mode;
 
 	service = CAMEL_SERVICE (is->store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
+
 	mobile_mode = camel_imapx_settings_get_mobile_mode (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	full_name = camel_folder_get_full_name (folder);
 
 	/* Sync changes first, else unread count will not
@@ -5487,10 +5524,14 @@ imapx_command_sync_changes_done (CamelIMAPXServer *is,
 	g_return_val_if_fail (data != NULL, FALSE);
 
 	service = CAMEL_SERVICE (is->store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
+
 	mobile_mode = camel_imapx_settings_get_mobile_mode (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	job->commands--;
 
 	full_name = camel_folder_get_full_name (job->folder);
diff --git a/camel/camel-imapx-store.c b/camel/camel-imapx-store.c
index 2875649..f482217 100644
--- a/camel/camel-imapx-store.c
+++ b/camel/camel-imapx-store.c
@@ -144,12 +144,14 @@ imapx_get_name (CamelService *service,
 	gchar *user;
 	gchar *name;
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 	user = camel_network_settings_dup_user (network_settings);
 
+	g_object_unref (settings);
+
 	if (brief)
 		name = g_strdup_printf (
 			_("IMAP server %s"), host);
@@ -390,10 +392,13 @@ fill_fi (CamelStore *store,
 	CamelSettings *settings;
 	gboolean mobile_mode;
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
+
 	mobile_mode = camel_imapx_settings_get_mobile_mode (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	folder = camel_object_bag_peek (store->folders, fi->full_name);
 	if (folder) {
 		CamelIMAPXSummary *ims;
@@ -686,7 +691,8 @@ get_folder_info_offline (CamelStore *store,
 	gint i;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	use_namespace = camel_imapx_settings_get_use_namespace (
 		CAMEL_IMAPX_SETTINGS (settings));
@@ -694,6 +700,8 @@ get_folder_info_offline (CamelStore *store,
 	use_subscriptions = camel_imapx_settings_get_use_subscriptions (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	/* FIXME: obey other flags */
 
 	folders = g_ptr_array_new ();
@@ -707,10 +715,15 @@ get_folder_info_offline (CamelStore *store,
 	if (top[0] == 0) {
 		gchar *namespace = NULL;
 
-		if (use_namespace)
+		if (use_namespace) {
+			settings = camel_service_ref_settings (service);
+
 			namespace = camel_imapx_settings_dup_namespace (
 				CAMEL_IMAPX_SETTINGS (settings));
 
+			g_object_unref (settings);
+		}
+
 		if (namespace != NULL) {
 			name = g_strdup (imapx_store->summary->namespaces->personal->full_name);
 			top = imapx_store->summary->namespaces->personal->path;
@@ -1121,7 +1134,8 @@ imapx_can_refresh_folder (CamelStore *store,
 	store_class = CAMEL_STORE_CLASS (camel_imapx_store_parent_class);
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	check_all = camel_imapx_settings_get_check_all (
 		CAMEL_IMAPX_SETTINGS (settings));
@@ -1129,6 +1143,8 @@ imapx_can_refresh_folder (CamelStore *store,
 	check_subscribed = camel_imapx_settings_get_check_subscribed (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	subscribed = ((info->flags & CAMEL_FOLDER_SUBSCRIBED) != 0);
 
 	res = store_class->can_refresh_folder (store, info, &local_error) ||
@@ -1194,11 +1210,14 @@ imapx_store_get_folder_info_sync (CamelStore *store,
 
 	service = CAMEL_SERVICE (store);
 	session = camel_service_get_session (service);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	use_subscriptions = camel_imapx_settings_get_use_subscriptions (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	if (top == NULL)
 		top = "";
 
@@ -1485,12 +1504,15 @@ imapx_store_rename_folder_sync (CamelStore *store,
 	gboolean success = FALSE;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
 	user_cache_dir = camel_service_get_user_cache_dir (service);
 
+	settings = camel_service_ref_settings (service);
+
 	use_subscriptions = camel_imapx_settings_get_use_subscriptions (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	if (!camel_offline_store_get_online (CAMEL_OFFLINE_STORE (store))) {
 		g_set_error (
 			error, CAMEL_SERVICE_ERROR,
diff --git a/camel/camel-imapx-utils.c b/camel/camel-imapx-utils.c
index 9fc871a..408f760 100644
--- a/camel/camel-imapx-utils.c
+++ b/camel/camel-imapx-utils.c
@@ -318,10 +318,14 @@ imapx_update_store_summary (CamelFolder *folder)
 	full_name = camel_folder_get_full_name (folder);
 	parent_store = camel_folder_get_parent_store (folder);
 	service = CAMEL_SERVICE (parent_store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
+
 	mobile_mode = camel_imapx_settings_get_mobile_mode (
 		CAMEL_IMAPX_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	si = camel_store_summary_path ((CamelStoreSummary *) ((CamelIMAPXStore *) parent_store)->summary, full_name);
 	if (si) {
 		guint32 unread, total;
diff --git a/camel/camel-network-service.c b/camel/camel-network-service.c
index b600c3f..2396c85 100644
--- a/camel/camel-network-service.c
+++ b/camel/camel-network-service.c
@@ -53,7 +53,7 @@ network_service_connect_sync (CamelNetworkService *service,
 	gint status;
 
 	session = camel_service_get_session (CAMEL_SERVICE (service));
-	settings = camel_service_get_settings (CAMEL_SERVICE (service));
+	settings = camel_service_ref_settings (CAMEL_SERVICE (service));
 	g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
@@ -61,6 +61,8 @@ network_service_connect_sync (CamelNetworkService *service,
 	host = camel_network_settings_dup_host (network_settings);
 	port = camel_network_settings_get_port (network_settings);
 
+	g_object_unref (settings);
+
 	service_name = camel_network_service_get_service_name (service, method);
 	default_port = camel_network_service_get_default_port (service, method);
 
diff --git a/camel/camel-offline-folder.c b/camel/camel-offline-folder.c
index e092117..0a4af88 100644
--- a/camel/camel-offline-folder.c
+++ b/camel/camel-offline-folder.c
@@ -135,11 +135,14 @@ offline_folder_changed (CamelFolder *folder,
 
 	service = CAMEL_SERVICE (parent_store);
 	session = camel_service_get_session (service);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	sync_store = camel_offline_settings_get_stay_synchronized (
 		CAMEL_OFFLINE_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	sync_folder = camel_offline_folder_get_offline_sync (
 		CAMEL_OFFLINE_FOLDER (folder));
 
diff --git a/camel/camel-offline-store.c b/camel/camel-offline-store.c
index a3b94e0..f54df73 100644
--- a/camel/camel-offline-store.c
+++ b/camel/camel-offline-store.c
@@ -125,14 +125,17 @@ camel_offline_store_set_online_sync (CamelOfflineStore *store,
 
 	service = CAMEL_SERVICE (store);
 	session = camel_service_get_session (service);
-	settings = camel_service_get_settings (service);
 
 	network_available = camel_session_get_network_available (session);
 	store_is_online = camel_offline_store_get_online (store);
 
+	settings = camel_service_ref_settings (service);
+
 	sync_store = camel_offline_settings_get_stay_synchronized (
 		CAMEL_OFFLINE_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	/* Returning to online mode is the simpler case. */
 	if (!store_is_online) {
 		store->priv->online = online;
@@ -201,14 +204,17 @@ camel_offline_store_prepare_for_offline_sync (CamelOfflineStore *store,
 
 	service = CAMEL_SERVICE (store);
 	session = camel_service_get_session (service);
-	settings = camel_service_get_settings (service);
 
 	network_available = camel_session_get_network_available (session);
 	store_is_online = camel_offline_store_get_online (store);
 
+	settings = camel_service_ref_settings (service);
+
 	sync_store = camel_offline_settings_get_stay_synchronized (
 		CAMEL_OFFLINE_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	if (network_available && store_is_online) {
 		GPtrArray *folders;
 		guint ii;
diff --git a/camel/camel-sasl-cram-md5.c b/camel/camel-sasl-cram-md5.c
index ebe4402..d409b97 100644
--- a/camel/camel-sasl-cram-md5.c
+++ b/camel/camel-sasl-cram-md5.c
@@ -84,11 +84,14 @@ sasl_cram_md5_challenge_sync (CamelSasl *sasl,
 
 	service = camel_sasl_get_service (sasl);
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 	g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	user = camel_network_settings_dup_user (network_settings);
+
+	g_object_unref (settings);
+
 	g_return_val_if_fail (user != NULL, NULL);
 
 	password = camel_service_get_password (service);
diff --git a/camel/camel-sasl-digest-md5.c b/camel/camel-sasl-digest-md5.c
index cb48b28..4114b9f 100644
--- a/camel/camel-sasl-digest-md5.c
+++ b/camel/camel-sasl-digest-md5.c
@@ -827,12 +827,15 @@ sasl_digest_md5_challenge_sync (CamelSasl *sasl,
 	service = camel_sasl_get_service (sasl);
 	service_name = camel_sasl_get_service_name (sasl);
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 	g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 	user = camel_network_settings_dup_user (network_settings);
+
+	g_object_unref (settings);
+
 	g_return_val_if_fail (user != NULL, NULL);
 
 	if (host == NULL)
diff --git a/camel/camel-sasl-gssapi.c b/camel/camel-sasl-gssapi.c
index 62c8885..75745e2 100644
--- a/camel/camel-sasl-gssapi.c
+++ b/camel/camel-sasl-gssapi.c
@@ -292,12 +292,15 @@ sasl_gssapi_challenge_sync (CamelSasl *sasl,
 	service = camel_sasl_get_service (sasl);
 	service_name = camel_sasl_get_service_name (sasl);
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 	g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 	user = camel_network_settings_dup_user (network_settings);
+
+	g_object_unref (settings);
+
 	g_return_val_if_fail (user != NULL, NULL);
 
 	if (host == NULL)
diff --git a/camel/camel-sasl-login.c b/camel/camel-sasl-login.c
index a80b302..78510d4 100644
--- a/camel/camel-sasl-login.c
+++ b/camel/camel-sasl-login.c
@@ -79,11 +79,14 @@ sasl_login_challenge_sync (CamelSasl *sasl,
 
 	service = camel_sasl_get_service (sasl);
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 	g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	user = camel_network_settings_dup_user (network_settings);
+
+	g_object_unref (settings);
+
 	g_return_val_if_fail (user != NULL, NULL);
 
 	password = camel_service_get_password (service);
diff --git a/camel/camel-sasl-ntlm.c b/camel/camel-sasl-ntlm.c
index 4012b04..1b3ef79 100644
--- a/camel/camel-sasl-ntlm.c
+++ b/camel/camel-sasl-ntlm.c
@@ -703,11 +703,14 @@ sasl_ntlm_challenge_sync (CamelSasl *sasl,
 
 	service = camel_sasl_get_service (sasl);
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 	g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	user = camel_network_settings_dup_user (network_settings);
+
+	g_object_unref (settings);
+
 	g_return_val_if_fail (user != NULL, NULL);
 
 	password = camel_service_get_password (service);
@@ -890,11 +893,14 @@ sasl_ntlm_try_empty_password_sync (CamelSasl *sasl,
 
 	service = camel_sasl_get_service (sasl);
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 	g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), FALSE);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	user = camel_network_settings_dup_user (network_settings);
+
+	g_object_unref (settings);
+
 	g_return_val_if_fail (user != NULL, FALSE);
 
 	cp = strchr (user, '\\');
diff --git a/camel/camel-sasl-plain.c b/camel/camel-sasl-plain.c
index 1f04e48..2340642 100644
--- a/camel/camel-sasl-plain.c
+++ b/camel/camel-sasl-plain.c
@@ -67,11 +67,14 @@ sasl_plain_challenge_sync (CamelSasl *sasl,
 
 	service = camel_sasl_get_service (sasl);
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 	g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	user = camel_network_settings_dup_user (network_settings);
+
+	g_object_unref (settings);
+
 	g_return_val_if_fail (user != NULL, NULL);
 
 	password = camel_service_get_password (service);
diff --git a/camel/camel-service.c b/camel/camel-service.c
index a0350f2..b069c4d 100644
--- a/camel/camel-service.c
+++ b/camel/camel-service.c
@@ -58,6 +58,8 @@ struct _CamelServicePrivate {
 	gpointer session;  /* weak pointer */
 
 	CamelSettings *settings;
+	GMutex *settings_lock;
+
 	CamelProvider *provider;
 
 	gchar *display_name;
@@ -617,8 +619,8 @@ service_get_property (GObject *object,
 			return;
 
 		case PROP_SETTINGS:
-			g_value_set_object (
-				value, camel_service_get_settings (
+			g_value_take_object (
+				value, camel_service_ref_settings (
 				CAMEL_SERVICE (object)));
 			return;
 
@@ -665,6 +667,8 @@ service_finalize (GObject *object)
 		CAMEL_SERVICE_GET_CLASS (object)->disconnect_sync (
 			CAMEL_SERVICE (object), TRUE, NULL, NULL);
 
+	g_mutex_free (priv->settings_lock);
+
 	g_free (priv->display_name);
 	g_free (priv->user_data_dir);
 	g_free (priv->user_cache_dir);
@@ -1133,6 +1137,7 @@ camel_service_init (CamelService *service)
 {
 	service->priv = CAMEL_SERVICE_GET_PRIVATE (service);
 
+	service->priv->settings_lock = g_mutex_new ();
 	service->priv->connection_lock = g_mutex_new ();
 	service->priv->status = CAMEL_SERVICE_DISCONNECTED;
 }
@@ -1204,10 +1209,10 @@ camel_service_new_camel_url (CamelService *service)
 	g_return_val_if_fail (CAMEL_IS_SERVICE (service), NULL);
 
 	provider = camel_service_get_provider (service);
-	settings = camel_service_get_settings (service);
-
 	g_return_val_if_fail (provider != NULL, NULL);
 
+	settings = camel_service_ref_settings (service);
+
 	/* Allocate as camel_url_new_with_base() does. */
 	url = g_new0 (CamelURL, 1);
 
@@ -1237,6 +1242,8 @@ camel_service_new_camel_url (CamelService *service)
 	g_free (user);
 	g_free (path);
 
+	g_object_unref (settings);
+
 	return url;
 }
 
@@ -1461,24 +1468,35 @@ camel_service_get_session (CamelService *service)
 }
 
 /**
- * camel_service_get_settings:
+ * camel_service_ref_settings:
  * @service: a #CamelService
  *
  * Returns the #CamelSettings instance associated with the service.
  *
+ * The returned #CamelSettings is referenced for thread-safety and must
+ * be unreferenced with g_object_unref() when finished with it.
+ *
  * Returns: the #CamelSettings
  *
- * Since: 3.2
+ * Since: 3.6
  **/
 CamelSettings *
-camel_service_get_settings (CamelService *service)
+camel_service_ref_settings (CamelService *service)
 {
+	CamelSettings *settings;
+
 	g_return_val_if_fail (CAMEL_IS_SERVICE (service), NULL);
 
 	/* Every service should have a settings object. */
-	g_warn_if_fail (service->priv->settings != NULL);
+	g_return_val_if_fail (service->priv->settings != NULL, NULL);
+
+	g_mutex_lock (service->priv->settings_lock);
+
+	settings = g_object_ref (service->priv->settings);
+
+	g_mutex_unlock (service->priv->settings_lock);
 
-	return service->priv->settings;
+	return settings;
 }
 
 /**
@@ -1502,9 +1520,6 @@ camel_service_set_settings (CamelService *service,
 
 	g_return_if_fail (CAMEL_IS_SERVICE (service));
 
-	if (settings && service->priv->settings == settings)
-		return;
-
 	class = CAMEL_SERVICE_GET_CLASS (service);
 
 	if (settings != NULL) {
@@ -1522,10 +1537,14 @@ camel_service_set_settings (CamelService *service,
 		settings = g_object_new (class->settings_type, NULL);
 	}
 
+	g_mutex_lock (service->priv->settings_lock);
+
 	if (service->priv->settings != NULL)
 		g_object_unref (service->priv->settings);
 
-	service->priv->settings = settings;
+	service->priv->settings = settings;  /* takes ownership */
+
+	g_mutex_unlock (service->priv->settings_lock);
 
 	g_object_notify (G_OBJECT (service), "settings");
 }
diff --git a/camel/camel-service.h b/camel/camel-service.h
index 3d17795..f3714aa 100644
--- a/camel/camel-service.h
+++ b/camel/camel-service.h
@@ -185,7 +185,7 @@ gchar *		camel_service_get_name		(CamelService *service,
 CamelProvider *	camel_service_get_provider	(CamelService *service);
 struct _CamelSession *
 		camel_service_get_session	(CamelService *service);
-CamelSettings *	camel_service_get_settings	(CamelService *service);
+CamelSettings *	camel_service_ref_settings	(CamelService *service);
 void		camel_service_set_settings	(CamelService *service,
 						 CamelSettings *settings);
 const gchar *	camel_service_get_uid		(CamelService *service);
diff --git a/camel/providers/imap/camel-imap-command.c b/camel/providers/imap/camel-imap-command.c
index 5f11957..9815f85 100644
--- a/camel/providers/imap/camel-imap-command.c
+++ b/camel/providers/imap/camel-imap-command.c
@@ -356,12 +356,15 @@ camel_imap_command_response (CamelImapStore *store,
 
 	service = CAMEL_SERVICE (store);
 	session = camel_service_get_session (service);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 	user = camel_network_settings_dup_user (network_settings);
 
+	g_object_unref (settings);
+
 	if (camel_imap_store_readline (store, &respbuf, cancellable, error) < 0) {
 		g_static_rec_mutex_unlock (&store->command_and_response_lock);
 		type = CAMEL_IMAP_RESPONSE_ERROR;
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
index fc30f31..427a6db 100644
--- a/camel/providers/imap/camel-imap-folder.c
+++ b/camel/providers/imap/camel-imap-folder.c
@@ -285,25 +285,31 @@ imap_folder_constructed (GObject *object)
 	CamelFolder *folder;
 	CamelStore *parent_store;
 	const gchar *full_name;
-	const gchar *host;
-	const gchar *user;
 	gchar *description;
+	gchar *host;
+	gchar *user;
 
 	folder = CAMEL_FOLDER (object);
 	full_name = camel_folder_get_full_name (folder);
 	parent_store = camel_folder_get_parent_store (folder);
 
 	service = CAMEL_SERVICE (parent_store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
-	user = camel_network_settings_get_user (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
+
+	g_object_unref (settings);
 
 	description = g_strdup_printf (
 		"%s %s:%s", user, host, full_name);
 	camel_folder_set_description (folder, description);
 	g_free (description);
+
+	g_free (host);
+	g_free (user);
 }
 
 static void
@@ -479,7 +485,7 @@ camel_imap_folder_new (CamelStore *parent,
 	}
 
 	service = CAMEL_SERVICE (parent);
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 
 	g_object_get (
 		settings,
@@ -539,6 +545,8 @@ camel_imap_folder_new (CamelStore *parent,
 		g_free (trash_path);
 	}
 
+	g_object_unref (settings);
+
 	imap_folder->search = camel_imap_search_new (folder_dir);
 
 	camel_store_summary_connect_folder_summary (
@@ -1568,11 +1576,14 @@ is_google_account (CamelStore *store)
 	g_return_val_if_fail (CAMEL_IS_STORE (store), FALSE);
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 
+	g_object_unref (settings);
+
 	is_google =
 		(host != NULL) && (
 		host_ends_with (host, "gmail.com") ||
@@ -1635,7 +1646,6 @@ imap_synchronize_sync (CamelFolder *folder,
 	is_gmail = is_google_account (parent_store);
 
 	service = CAMEL_SERVICE (parent_store);
-	settings = camel_service_get_settings (service);
 
 	if (folder->permanent_flags == 0 || !camel_offline_store_get_online (CAMEL_OFFLINE_STORE (store))) {
 		if (expunge) {
@@ -1656,6 +1666,8 @@ imap_synchronize_sync (CamelFolder *folder,
 	camel_folder_sort_uids (folder, summary);
 	max = summary->len;
 
+	settings = camel_service_ref_settings (service);
+
 	/* deleted_uids is NULL when not using real trash */
 	folder_path = camel_imap_settings_dup_real_trash_path (
 		CAMEL_IMAP_SETTINGS (settings));
@@ -1670,9 +1682,6 @@ imap_synchronize_sync (CamelFolder *folder,
 	}
 	g_free (folder_path);
 
-	if (real_trash)
-		deleted_uids = g_ptr_array_new ();
-
 	/* junked_uids is NULL when not using real junk */
 	folder_path = camel_imap_settings_dup_real_junk_path (
 		CAMEL_IMAP_SETTINGS (settings));
@@ -1688,6 +1697,11 @@ imap_synchronize_sync (CamelFolder *folder,
 	}
 	g_free (folder_path);
 
+	g_object_unref (settings);
+
+	if (real_trash)
+		deleted_uids = g_ptr_array_new ();
+
 	if (real_junk)
 		junked_uids = g_ptr_array_new ();
 
@@ -2827,11 +2841,14 @@ do_copy (CamelFolder *source,
 		return FALSE;
 
 	service = CAMEL_SERVICE (parent_store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	trash_path = camel_imap_settings_dup_real_trash_path (
 		CAMEL_IMAP_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	mark_moved = is_google_account (parent_store) && trash_path != NULL;
 
 	full_name = camel_folder_get_full_name (destination);
@@ -3955,17 +3972,20 @@ imap_update_summary (CamelFolder *folder,
 	parent_store = camel_folder_get_parent_store (folder);
 	store = CAMEL_IMAP_STORE (parent_store);
 	service = CAMEL_SERVICE (parent_store);
-	settings = camel_service_get_settings (service);
 
 	if (!camel_imap_store_connected (store, error))
 		return FALSE;
 
+	settings = camel_service_ref_settings (service);
+
 	fetch_headers = camel_imap_settings_get_fetch_headers (
 		CAMEL_IMAP_SETTINGS (settings));
 
 	extra_headers = camel_imap_settings_dup_fetch_headers_extra (
 		CAMEL_IMAP_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	if (store->server_level >= IMAP_LEVEL_IMAP4REV1) {
 		if (fetch_headers == CAMEL_FETCH_HEADERS_ALL)
 			header_spec = g_string_new ("HEADER");
diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c
index 5d95e5c..1ce6bb8 100644
--- a/camel/providers/imap/camel-imap-store.c
+++ b/camel/providers/imap/camel-imap-store.c
@@ -149,7 +149,7 @@ imap_store_update_store_flags (CamelStore *store)
 	 *     to take effect. */
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 	imap_settings = CAMEL_IMAP_SETTINGS (settings);
 
 	real_path = camel_imap_settings_dup_real_junk_path (imap_settings);
@@ -174,6 +174,8 @@ imap_store_update_store_flags (CamelStore *store)
 		store->flags |= CAMEL_STORE_VTRASH;
 
 	g_free (real_path);
+
+	g_object_unref (settings);
 }
 
 static void
@@ -300,12 +302,14 @@ connect_to_server (CamelService *service,
 	if (tcp_stream == NULL)
 		return FALSE;
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 	method = camel_network_settings_get_security_method (network_settings);
 
+	g_object_unref (settings);
+
 	store->ostream = tcp_stream;
 	store->istream = camel_stream_buffer_new (tcp_stream, CAMEL_STREAM_BUFFER_READ);
 
@@ -526,13 +530,16 @@ connect_to_server_process (CamelService *service,
 
 	password = camel_service_get_password (service);
 	provider = camel_service_get_provider (service);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 	port = camel_network_settings_get_port (network_settings);
 	user = camel_network_settings_dup_user (network_settings);
 
+	g_object_unref (settings);
+
 	camel_url_set_protocol (&url, provider->protocol);
 	camel_url_set_host (&url, host);
 	camel_url_set_port (&url, port);
@@ -678,12 +685,15 @@ connect_to_server_wrapper (CamelService *service,
 	gboolean use_shell_command;
 	gboolean success;
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
+
 	shell_command = camel_imap_settings_dup_shell_command (
 		CAMEL_IMAP_SETTINGS (settings));
 	use_shell_command = camel_imap_settings_get_use_shell_command (
 		CAMEL_IMAP_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 #ifndef G_OS_WIN32
 	if (use_shell_command && shell_command != NULL)
 		success = connect_to_server_process (
@@ -713,12 +723,15 @@ imap_auth_loop (CamelService *service,
 	gboolean success = TRUE;
 
 	session = camel_service_get_session (service);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 	mechanism = camel_network_settings_dup_auth_mechanism (network_settings);
 
+	g_object_unref (settings);
+
 	if (store->preauthed) {
 		if (camel_verbose_debug)
 			fprintf(stderr, "Server %s has preauthenticated us.\n",
@@ -799,12 +812,14 @@ imap_store_get_name (CamelService *service,
 	gchar *user;
 	gchar *name;
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 	user = camel_network_settings_dup_user (network_settings);
 
+	g_object_unref (settings);
+
 	if (brief)
 		name = g_strdup_printf (
 			_("IMAP server %s"), host);
@@ -832,9 +847,6 @@ imap_store_connect_sync (CamelService *service,
 	const gchar *namespace;
 	GError *local_error = NULL;
 
-	settings = camel_service_get_settings (service);
-	imap_settings = CAMEL_IMAP_SETTINGS (settings);
-
 	if (!camel_offline_store_get_online (CAMEL_OFFLINE_STORE (store)))
 		return TRUE;
 
@@ -849,6 +861,9 @@ imap_store_connect_sync (CamelService *service,
 		return FALSE;
 	}
 
+	settings = camel_service_ref_settings (service);
+	imap_settings = CAMEL_IMAP_SETTINGS (settings);
+
 	/* Get namespace and hierarchy separator */
 	if (store->capabilities & IMAP_CAPABILITY_NAMESPACE) {
 		struct _namespaces *namespaces;
@@ -1014,6 +1029,8 @@ imap_store_connect_sync (CamelService *service,
 	}
 
 done:
+	g_object_unref (settings);
+
 	/* save any changes we had */
 	camel_store_summary_save ((CamelStoreSummary *) store->summary);
 
@@ -1041,9 +1058,6 @@ imap_store_disconnect_sync (CamelService *service,
 	CamelSettings *settings;
 	CamelImapSettings *imap_settings;
 
-	settings = camel_service_get_settings (service);
-	imap_settings = CAMEL_IMAP_SETTINGS (settings);
-
 	if (camel_offline_store_get_online (CAMEL_OFFLINE_STORE (store)) && clean) {
 		CamelImapResponse *response;
 
@@ -1078,9 +1092,14 @@ imap_store_disconnect_sync (CamelService *service,
 
 	g_hash_table_remove_all (store->known_alerts);
 
+	settings = camel_service_ref_settings (service);
+	imap_settings = CAMEL_IMAP_SETTINGS (settings);
+
 	if (camel_imap_settings_get_use_namespace (imap_settings))
 		camel_imap_settings_set_namespace (imap_settings, NULL);
 
+	g_object_unref (settings);
+
 	return TRUE;
 }
 
@@ -1106,11 +1125,14 @@ imap_store_authenticate_sync (CamelService *service,
 		gchar *user;
 
 		password = camel_service_get_password (service);
-		settings = camel_service_get_settings (service);
+
+		settings = camel_service_ref_settings (service);
 
 		network_settings = CAMEL_NETWORK_SETTINGS (settings);
 		user = camel_network_settings_dup_user (network_settings);
 
+		g_object_unref (settings);
+
 		if (user == NULL) {
 			g_set_error_literal (
 				error, CAMEL_SERVICE_ERROR,
@@ -1756,9 +1778,10 @@ imap_store_get_trash_folder_sync (CamelStore *store,
 	gchar *trash_path;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
 	user_cache_dir = camel_service_get_user_cache_dir (service);
 
+	settings = camel_service_ref_settings (service);
+
 	trash_path = camel_imap_settings_dup_real_trash_path (
 		CAMEL_IMAP_SETTINGS (settings));
 	if (trash_path != NULL) {
@@ -1770,6 +1793,8 @@ imap_store_get_trash_folder_sync (CamelStore *store,
 	}
 	g_free (trash_path);
 
+	g_object_unref (settings);
+
 	if (folder)
 		return folder;
 
@@ -1804,9 +1829,10 @@ imap_store_get_junk_folder_sync (CamelStore *store,
 	gchar *junk_path;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
 	user_cache_dir = camel_service_get_user_cache_dir (service);
 
+	settings = camel_service_ref_settings (service);
+
 	junk_path = camel_imap_settings_dup_real_junk_path (
 		CAMEL_IMAP_SETTINGS (settings));
 	if (junk_path != NULL) {
@@ -1818,6 +1844,8 @@ imap_store_get_junk_folder_sync (CamelStore *store,
 	}
 	g_free (junk_path);
 
+	g_object_unref (settings);
+
 	if (folder)
 		return folder;
 
@@ -2360,12 +2388,15 @@ imap_store_rename_folder_sync (CamelStore *store,
 	gboolean success = TRUE;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
 	user_cache_dir = camel_service_get_user_cache_dir (service);
 
+	settings = camel_service_ref_settings (service);
+
 	use_subscriptions = camel_imap_settings_get_use_subscriptions (
 		CAMEL_IMAP_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	if (!camel_imap_store_connected (imap_store, error)) {
 		success = FALSE;
 		goto fail;
@@ -2914,11 +2945,14 @@ refresh_refresh (CamelSession *session,
 	gchar *namespace;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	namespace = camel_imap_settings_dup_namespace (
 		CAMEL_IMAP_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	camel_operation_push_message (cancellable,
 		_("Retrieving list of folders at '%s'"),
 		camel_service_get_display_name (service));
@@ -3059,7 +3093,8 @@ get_folder_info_offline (CamelStore *store,
 		printf("get folder info offline\n");
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	use_subscriptions = camel_imap_settings_get_use_subscriptions (
 		CAMEL_IMAP_SETTINGS (settings));
@@ -3067,13 +3102,15 @@ get_folder_info_offline (CamelStore *store,
 	junk_path = camel_imap_settings_dup_real_junk_path (
 		CAMEL_IMAP_SETTINGS (settings));
 
+	trash_path = camel_imap_settings_dup_real_trash_path (
+		CAMEL_IMAP_SETTINGS (settings));
+
+	g_object_unref (settings);
+
 	/* So we can safely compare strings. */
 	if (junk_path == NULL)
 		junk_path = g_strdup ("");
 
-	trash_path = camel_imap_settings_dup_real_trash_path (
-		CAMEL_IMAP_SETTINGS (settings));
-
 	/* So we can safely compare strings. */
 	if (trash_path == NULL)
 		trash_path = g_strdup ("");
@@ -3309,7 +3346,8 @@ imap_can_refresh_folder (CamelStore *store,
 	GError *local_error = NULL;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	check_all = camel_imap_settings_get_check_all (
 		CAMEL_IMAP_SETTINGS (settings));
@@ -3317,6 +3355,8 @@ imap_can_refresh_folder (CamelStore *store,
 	check_subscribed = camel_imap_settings_get_check_subscribed (
 		CAMEL_IMAP_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	subscribed = ((info->flags & CAMEL_FOLDER_SUBSCRIBED) != 0);
 
 	res = CAMEL_STORE_CLASS (camel_imap_store_parent_class)->
diff --git a/camel/providers/imap/camel-imap-wrapper.c b/camel/providers/imap/camel-imap-wrapper.c
index 6e0c78b..defd169 100644
--- a/camel/providers/imap/camel-imap-wrapper.c
+++ b/camel/providers/imap/camel-imap-wrapper.c
@@ -177,7 +177,8 @@ camel_imap_wrapper_new (CamelImapFolder *imap_folder,
 	store = camel_folder_get_parent_store (CAMEL_FOLDER (imap_folder));
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	sync_offline =
 		camel_offline_settings_get_stay_synchronized (
@@ -185,6 +186,8 @@ camel_imap_wrapper_new (CamelImapFolder *imap_folder,
 		camel_offline_folder_get_offline_sync (
 			CAMEL_OFFLINE_FOLDER (imap_folder));
 
+	g_object_unref (settings);
+
 	imap_wrapper = g_object_new (CAMEL_TYPE_IMAP_WRAPPER, NULL);
 	camel_data_wrapper_set_mime_type_field (CAMEL_DATA_WRAPPER (imap_wrapper), type);
 	((CamelDataWrapper *) imap_wrapper)->offline = !sync_offline;
diff --git a/camel/providers/local/camel-local-folder.c b/camel/providers/local/camel-local-folder.c
index a90edd7..037c0d1 100644
--- a/camel/providers/local/camel-local-folder.c
+++ b/camel/providers/local/camel-local-folder.c
@@ -161,9 +161,9 @@ local_folder_constructed (GObject *object)
 	CamelFolder *folder;
 	CamelStore *parent_store;
 	const gchar *full_name;
-	const gchar *root_path;
 	const gchar *tmp;
 	gchar *description;
+	gchar *root_path;
 	gchar *path;
 
 	folder = CAMEL_FOLDER (object);
@@ -172,10 +172,13 @@ local_folder_constructed (GObject *object)
 
 	service = CAMEL_SERVICE (parent_store);
 	provider = camel_service_get_provider (service);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	root_path = camel_local_settings_get_path (local_settings);
+	root_path = camel_local_settings_dup_path (local_settings);
+
+	g_object_unref (settings);
 
 	if (root_path == NULL)
 		return;
@@ -222,6 +225,7 @@ local_folder_constructed (GObject *object)
 	camel_folder_set_description (folder, description);
 
 	g_free (description);
+	g_free (root_path);
 	g_free (path);
 }
 
@@ -540,7 +544,6 @@ camel_local_folder_construct (CamelLocalFolder *lf,
 	CamelLocalStore *ls;
 	CamelStore *parent_store;
 	const gchar *full_name;
-	const gchar *path;
 	gboolean need_summary_check;
 
 	folder = CAMEL_FOLDER (lf);
@@ -548,16 +551,17 @@ camel_local_folder_construct (CamelLocalFolder *lf,
 	parent_store = camel_folder_get_parent_store (folder);
 
 	service = CAMEL_SERVICE (parent_store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	lf->base_path = camel_local_settings_dup_path (local_settings);
+
+	g_object_unref (settings);
 
 	ls = CAMEL_LOCAL_STORE (parent_store);
 	need_summary_check = camel_local_store_get_need_summary_check (ls);
 
-	lf->base_path = g_strdup (path);
-
 	lf->folder_path = camel_local_store_get_full_path (ls, full_name);
 	lf->index_path = camel_local_store_get_meta_path(ls, full_name, ".ibex");
 	statepath = camel_local_store_get_meta_path(ls, full_name, ".cmeta");
diff --git a/camel/providers/local/camel-local-store.c b/camel/providers/local/camel-local-store.c
index 48421a8..033d8e5 100644
--- a/camel/providers/local/camel-local-store.c
+++ b/camel/providers/local/camel-local-store.c
@@ -167,11 +167,13 @@ local_store_get_name (CamelService *service,
 	gchar *path;
 	gchar *name;
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	if (brief)
 		name = g_strdup (path);
 	else
@@ -206,11 +208,14 @@ local_store_get_folder_sync (CamelStore *store,
 	gchar *path;
 
 	service = CAMEL_SERVICE (store);
-	settings= camel_service_get_settings (service);
+
+	settings= camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	if (!g_path_is_absolute (path)) {
 		g_set_error (
 			error, CAMEL_STORE_ERROR,
@@ -361,11 +366,14 @@ local_store_create_folder_sync (CamelStore *store,
 	struct stat st;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	/* This is a pretty hacky version of create folder, but should basically work */
 
 	if (!g_path_is_absolute (path)) {
@@ -430,11 +438,14 @@ local_store_delete_folder_sync (CamelStore *store,
 	gboolean success = TRUE;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	/* remove metadata only */
 	name = g_build_filename (path, folder_name, NULL);
 	str = g_strdup_printf ("%s.ibex", name);
@@ -512,11 +523,14 @@ local_store_rename_folder_sync (CamelStore *store,
 	gboolean success = TRUE;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	old_basename = g_strdup_printf ("%s.ibex", old);
 	new_basename = g_strdup_printf ("%s.ibex", new);
 
@@ -606,11 +620,14 @@ local_store_get_full_path (CamelLocalStore *ls,
 	gchar *path;
 
 	service = CAMEL_SERVICE (ls);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	filename = g_build_filename (path, full_name, NULL);
 
 	g_free (path);
@@ -631,11 +648,14 @@ local_store_get_meta_path (CamelLocalStore *ls,
 	gchar *path;
 
 	service = CAMEL_SERVICE (ls);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	basename = g_strconcat (full_name, ext, NULL);
 	filename = g_build_filename (path, basename, NULL);
 	g_free (basename);
diff --git a/camel/providers/local/camel-maildir-folder.c b/camel/providers/local/camel-maildir-folder.c
index 22a7b6e..2f573c8 100644
--- a/camel/providers/local/camel-maildir-folder.c
+++ b/camel/providers/local/camel-maildir-folder.c
@@ -482,11 +482,14 @@ camel_maildir_folder_new (CamelStore *parent_store,
 		NULL);
 
 	service = CAMEL_SERVICE (parent_store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	filter_inbox = camel_store_settings_get_filter_inbox (
 		CAMEL_STORE_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	if (filter_inbox && strcmp (full_name, ".") == 0)
 		folder->folder_flags |= CAMEL_FOLDER_FILTER_RECENT;
 
diff --git a/camel/providers/local/camel-maildir-store.c b/camel/providers/local/camel-maildir-store.c
index db00da6..d589941 100644
--- a/camel/providers/local/camel-maildir-store.c
+++ b/camel/providers/local/camel-maildir-store.c
@@ -89,11 +89,14 @@ maildir_store_create_folder_sync (CamelStore *store,
 	/* This is a pretty hacky version of create folder, but should basically work */
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	if (!g_path_is_absolute (path)) {
 		g_set_error (
 			error, CAMEL_STORE_ERROR,
@@ -176,11 +179,14 @@ maildir_store_get_folder_sync (CamelStore *store,
 	CamelFolder *folder = NULL;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	folder_name = md_canon_name (folder_name);
 	dir_name = maildir_full_name_to_dir_name (folder_name);
 
@@ -303,11 +309,14 @@ maildir_store_delete_folder_sync (CamelStore *store,
 	}
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	/* maildir++ directory names start with a '.' */
 	dir_name = maildir_full_name_to_dir_name (folder_name);
 	name = g_build_filename (path, dir_name, NULL);
@@ -410,11 +419,14 @@ fill_fi (CamelStore *store,
 		gchar *root;
 
 		service = CAMEL_SERVICE (store);
-		settings = camel_service_get_settings (service);
+
+		settings = camel_service_ref_settings (service);
 
 		local_settings = CAMEL_LOCAL_SETTINGS (settings);
 		root = camel_local_settings_dup_path (local_settings);
 
+		g_object_unref (settings);
+
 		/* This should be fast enough not to have to test for INFO_FAST */
 		dir_name = maildir_full_name_to_dir_name (fi->full_name);
 
@@ -457,10 +469,14 @@ scan_fi (CamelStore *store,
 	struct stat st;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
+
+	g_object_unref (settings);
+
 	g_return_val_if_fail (path != NULL, NULL);
 
 	fi = camel_folder_info_new ();
@@ -551,10 +567,14 @@ scan_dirs (CamelStore *store,
 	gchar *path;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
+
+	g_object_unref (settings);
+
 	g_return_val_if_fail (path != NULL, -1);
 
 	folders = g_ptr_array_new ();
@@ -849,11 +869,14 @@ maildir_get_full_path (CamelLocalStore *ls,
 	gchar *path;
 
 	service = CAMEL_SERVICE (ls);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	dir_name = maildir_full_name_to_dir_name (full_name);
 	filename = g_build_filename (path, dir_name, NULL);
 	g_free (dir_name);
@@ -877,11 +900,14 @@ maildir_get_meta_path (CamelLocalStore *ls,
 	gchar *tmp;
 
 	service = CAMEL_SERVICE (ls);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	dir_name = maildir_full_name_to_dir_name (full_name);
 	tmp = g_build_filename (path, dir_name, NULL);
 	filename = g_strconcat (tmp, ext, NULL);
@@ -938,11 +964,14 @@ scan_old_dir_info (CamelStore *store,
 	gint res = -1;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	visited = g_hash_table_new (scan_hash, scan_equal);
 
 	sn = g_malloc0 (sizeof (*sn));
diff --git a/camel/providers/local/camel-mbox-store.c b/camel/providers/local/camel-mbox-store.c
index e7ab514..4e400a4 100644
--- a/camel/providers/local/camel-mbox-store.c
+++ b/camel/providers/local/camel-mbox-store.c
@@ -541,11 +541,14 @@ mbox_store_create_folder_sync (CamelStore *store,
 	struct stat st;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	root_path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	local_store = CAMEL_LOCAL_STORE (store);
 
 	if (!g_path_is_absolute (root_path)) {
@@ -909,10 +912,14 @@ mbox_store_get_full_path (CamelLocalStore *ls,
 	const gchar *cp;
 
 	service = CAMEL_SERVICE (ls);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	root_path = camel_local_settings_dup_path (local_settings);
+
+	g_object_unref (settings);
+
 	g_return_val_if_fail (root_path != NULL, NULL);
 
 	full_path = g_string_new (root_path);
diff --git a/camel/providers/local/camel-mh-store.c b/camel/providers/local/camel-mh-store.c
index acdb963..27f7328 100644
--- a/camel/providers/local/camel-mh-store.c
+++ b/camel/providers/local/camel-mh-store.c
@@ -209,11 +209,14 @@ fill_fi (CamelStore *store,
 		gchar *path;
 
 		service = CAMEL_SERVICE (store);
-		settings = camel_service_get_settings (service);
+
+		settings = camel_service_ref_settings (service);
 
 		local_settings = CAMEL_LOCAL_SETTINGS (settings);
 		path = camel_local_settings_dup_path (local_settings);
 
+		g_object_unref (settings);
+
 		/* This should be fast enough not to have to test for INFO_FAST */
 
 		/* We could: if we have no folder, and FAST isn't specified,
@@ -498,7 +501,8 @@ mh_store_get_folder_sync (CamelStore *store,
 		return NULL;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
@@ -506,6 +510,8 @@ mh_store_get_folder_sync (CamelStore *store,
 	use_dot_folders = camel_mh_settings_get_use_dot_folders (
 		CAMEL_MH_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	name = g_build_filename (path, folder_name, NULL);
 
 	if (g_stat (name, &st) == -1) {
@@ -585,7 +591,8 @@ mh_store_get_folder_info_sync (CamelStore *store,
 	gchar *path;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
@@ -593,6 +600,8 @@ mh_store_get_folder_info_sync (CamelStore *store,
 	use_dot_folders = camel_mh_settings_get_use_dot_folders (
 		CAMEL_MH_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	/* use .folders if we are supposed to */
 	if (use_dot_folders) {
 		folders_scan (
@@ -653,7 +662,8 @@ mh_store_delete_folder_sync (CamelStore *store,
 	gchar *path;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
@@ -661,6 +671,8 @@ mh_store_delete_folder_sync (CamelStore *store,
 	use_dot_folders = camel_mh_settings_get_use_dot_folders (
 		CAMEL_MH_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	/* remove folder directory - will fail if not empty */
 	name = g_build_filename (path, folder_name, NULL);
 	if (rmdir (name) == -1) {
@@ -705,7 +717,8 @@ mh_store_rename_folder_sync (CamelStore *store,
 	gchar *path;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
@@ -713,6 +726,8 @@ mh_store_rename_folder_sync (CamelStore *store,
 	use_dot_folders = camel_mh_settings_get_use_dot_folders (
 		CAMEL_MH_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	/* Chain up to parent's rename_folder() method. */
 	store_class = CAMEL_STORE_CLASS (camel_mh_store_parent_class);
 	success = store_class->rename_folder_sync (
diff --git a/camel/providers/local/camel-spool-folder.c b/camel/providers/local/camel-spool-folder.c
index 1c085e4..16089c7 100644
--- a/camel/providers/local/camel-spool-folder.c
+++ b/camel/providers/local/camel-spool-folder.c
@@ -145,7 +145,8 @@ camel_spool_folder_new (CamelStore *parent_store,
 	gchar *basename;
 
 	service = CAMEL_SERVICE (parent_store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	filter_inbox = camel_store_settings_get_filter_inbox (
 		CAMEL_STORE_SETTINGS (settings));
@@ -153,6 +154,8 @@ camel_spool_folder_new (CamelStore *parent_store,
 	use_xstatus_headers = camel_spool_settings_get_use_xstatus_headers (
 		CAMEL_SPOOL_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	basename = g_path_get_basename (full_name);
 
 	folder = g_object_new (
diff --git a/camel/providers/local/camel-spool-store.c b/camel/providers/local/camel-spool-store.c
index 29d7cc9..7b53997 100644
--- a/camel/providers/local/camel-spool-store.c
+++ b/camel/providers/local/camel-spool-store.c
@@ -72,11 +72,14 @@ spool_store_get_type (CamelSpoolStore *spool_store,
 	gchar *path;
 
 	service = CAMEL_SERVICE (spool_store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	/* Check the path for validity while we have the opportunity. */
 
 	if (path == NULL || *path != '/') {
@@ -346,11 +349,14 @@ get_folder_info_elm (CamelStore *store,
 	gchar *path;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	visited = g_hash_table_new (inode_hash, inode_equal);
 
 	if (scan_dir (
@@ -402,11 +408,14 @@ spool_store_get_name (CamelService *service,
 	gchar *path;
 
 	spool_store = CAMEL_SPOOL_STORE (service);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	if (brief)
 		return path;
 
@@ -466,11 +475,14 @@ spool_store_get_folder_sync (CamelStore *store,
 		return NULL;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	/* we only support an 'INBOX' in mbox mode */
 	if (type == CAMEL_SPOOL_STORE_MBOX) {
 		if (strcmp(folder_name, "INBOX") != 0) {
@@ -632,11 +644,14 @@ spool_store_get_full_path (CamelLocalStore *local_store,
 	gchar *path;
 
 	service = CAMEL_SERVICE (local_store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
 	path = camel_local_settings_dup_path (local_settings);
 
+	g_object_unref (settings);
+
 	spool_store = CAMEL_SPOOL_STORE (local_store);
 
 	switch (spool_store_get_type (spool_store, NULL)) {
diff --git a/camel/providers/nntp/camel-nntp-folder.c b/camel/providers/nntp/camel-nntp-folder.c
index f7f792c..3d775f8 100644
--- a/camel/providers/nntp/camel-nntp-folder.c
+++ b/camel/providers/nntp/camel-nntp-folder.c
@@ -768,14 +768,17 @@ camel_nntp_folder_new (CamelStore *parent,
 	gboolean filter_all;
 
 	service = CAMEL_SERVICE (parent);
-	settings = camel_service_get_settings (service);
 	user_cache_dir = camel_service_get_user_cache_dir (service);
 
+	settings = camel_service_ref_settings (service);
+
 	g_object_get (
 		settings,
 		"filter-all", &filter_all,
 		NULL);
 
+	g_object_unref (settings);
+
 	folder = g_object_new (
 		CAMEL_TYPE_NNTP_FOLDER,
 		"display-name", folder_name,
diff --git a/camel/providers/nntp/camel-nntp-store.c b/camel/providers/nntp/camel-nntp-store.c
index 0974dcb..4d2827e 100644
--- a/camel/providers/nntp/camel-nntp-store.c
+++ b/camel/providers/nntp/camel-nntp-store.c
@@ -261,13 +261,16 @@ connect_to_server (CamelService *service,
 	gchar *user;
 
 	session = camel_service_get_session (service);
-	settings = camel_service_get_settings (service);
 	user_cache_dir = camel_service_get_user_cache_dir (service);
 
+	settings = camel_service_ref_settings (service);
+
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 	user = camel_network_settings_dup_user (network_settings);
 
+	g_object_unref (settings);
+
 	tcp_stream = camel_network_service_connect_sync (
 		CAMEL_NETWORK_SERVICE (service), cancellable, error);
 
@@ -447,11 +450,13 @@ nntp_store_get_name (CamelService *service,
 	gchar *host;
 	gchar *name;
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 
+	g_object_unref (settings);
+
 	if (brief)
 		name = g_strdup_printf ("%s", host);
 	else
@@ -482,11 +487,14 @@ nntp_store_authenticate_sync (CamelService *service,
 	store = CAMEL_NNTP_STORE (service);
 
 	password = camel_service_get_password (service);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	user = camel_network_settings_dup_user (network_settings);
 
+	g_object_unref (settings);
+
 	if (user == NULL) {
 		g_set_error_literal (
 			error, CAMEL_SERVICE_ERROR,
@@ -709,11 +717,14 @@ nntp_store_get_subscribed_folder_info (CamelNNTPStore *store,
 		return NULL;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	short_folder_names = camel_nntp_settings_get_short_folder_names (
 		CAMEL_NNTP_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	for (i = 0; i < camel_store_summary_count ((CamelStoreSummary *) store->summary); i++) {
 		si = camel_store_summary_index ((CamelStoreSummary *) store->summary, i);
 		if (si == NULL)
@@ -862,12 +873,15 @@ nntp_store_get_cached_folder_info (CamelNNTPStore *store,
 	gint toplen = strlen (top);
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	folder_hierarchy_relative =
 		camel_nntp_settings_get_folder_hierarchy_relative (
 		CAMEL_NNTP_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	known = g_hash_table_new (g_str_hash, g_str_equal);
 
 	for (i = 0; (si = camel_store_summary_index ((CamelStoreSummary *) store->summary, i)); i++) {
@@ -1358,11 +1372,14 @@ nntp_store_subscribe_folder_sync (CamelSubscribable *subscribable,
 	gboolean success = TRUE;
 
 	service = CAMEL_SERVICE (subscribable);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	short_folder_names = camel_nntp_settings_get_short_folder_names (
 		CAMEL_NNTP_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	si = camel_store_summary_path (CAMEL_STORE_SUMMARY (nntp_store->summary), folder_name);
 	if (!si) {
 		g_set_error (
@@ -1402,11 +1419,14 @@ nntp_store_unsubscribe_folder_sync (CamelSubscribable *subscribable,
 	gboolean success = TRUE;
 
 	service = CAMEL_SERVICE (subscribable);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	short_folder_names = camel_nntp_settings_get_short_folder_names (
 		CAMEL_NNTP_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	fitem = camel_store_summary_path (CAMEL_STORE_SUMMARY (nntp_store->summary), folder_name);
 
 	if (!fitem) {
diff --git a/camel/providers/nntp/camel-nntp-summary.c b/camel/providers/nntp/camel-nntp-summary.c
index fa7c9ad..a2189b3 100644
--- a/camel/providers/nntp/camel-nntp-summary.c
+++ b/camel/providers/nntp/camel-nntp-summary.c
@@ -186,11 +186,14 @@ add_range_xover (CamelNNTPSummary *cns,
 		(camel_folder_summary_get_folder (s)->folder_flags & CAMEL_FOLDER_FILTER_RECENT) != 0;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 
+	g_object_unref (settings);
+
 	camel_operation_push_message (
 		cancellable, _("%s: Scanning new messages"), host);
 
@@ -313,11 +316,14 @@ add_range_head (CamelNNTPSummary *cns,
 	mp = camel_mime_parser_new ();
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 
+	g_object_unref (settings);
+
 	camel_operation_push_message (
 		cancellable, _("%s: Scanning new messages"), host);
 
diff --git a/camel/providers/pop3/camel-pop3-folder.c b/camel/providers/pop3/camel-pop3-folder.c
index e50f3f4..a469746 100644
--- a/camel/providers/pop3/camel-pop3-folder.c
+++ b/camel/providers/pop3/camel-pop3-folder.c
@@ -164,9 +164,13 @@ cmd_list (CamelPOP3Engine *pe,
 	pop3_store = CAMEL_POP3_STORE (parent_store);
 	pop3_folder = (CamelPOP3Folder *) folder;
 	service = (CamelService *) parent_store;
-	settings = camel_service_get_settings (service);
 
-	batch_fetch_count = camel_pop3_settings_get_batch_fetch_count (CAMEL_POP3_SETTINGS (settings));
+	settings = camel_service_ref_settings (service);
+
+	batch_fetch_count = camel_pop3_settings_get_batch_fetch_count (
+		CAMEL_POP3_SETTINGS (settings));
+
+	g_object_unref (settings);
 
 	do {
 		ret = camel_pop3_stream_line (stream, &line, &len, cancellable, NULL);
@@ -188,14 +192,6 @@ cmd_list (CamelPOP3Engine *pe,
 	if (pop3_folder->mobile_mode && pop3_folder->uids->len) {
 		gint y = 0;
 		gboolean save_uid = FALSE;
-		CamelNetworkSettings *network_settings;
-		const gchar *host;
-
-		network_settings = CAMEL_NETWORK_SETTINGS (settings);
-		host = camel_network_settings_get_host (network_settings);
-
-		d(printf("*********** Mobile mode *************\n"));
-		d(printf("Total Count: %s: %d\n", host, pop3_folder->uids->len));
 
 		/* Preserve the first message's ID */
 		fi = pop3_folder->uids->pdata[0];
@@ -502,13 +498,16 @@ pop3_folder_get_message_sync (CamelFolder *folder,
 	pop3_store = CAMEL_POP3_STORE (parent_store);
 
 	service = CAMEL_SERVICE (parent_store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	g_object_get (
 		settings,
 		"auto-fetch", &auto_fetch,
 		NULL);
 
+	g_object_unref (settings);
+
 	fi = g_hash_table_lookup (pop3_folder->uids_fi, uid);
 	if (fi == NULL) {
 		g_set_error (
@@ -758,9 +757,13 @@ pop3_fetch_messages_sync (CamelFolder *folder,
 
 	parent_store = camel_folder_get_parent_store (folder);
 	service = (CamelService *) parent_store;
-	settings = camel_service_get_settings (service);
 
-	batch_fetch_count = camel_pop3_settings_get_batch_fetch_count (CAMEL_POP3_SETTINGS (settings));
+	settings = camel_service_ref_settings (service);
+
+	batch_fetch_count = camel_pop3_settings_get_batch_fetch_count (
+		CAMEL_POP3_SETTINGS (settings));
+
+	g_object_unref (settings);
 
 	old_len = pop3_folder->uids->len;
 
@@ -808,9 +811,10 @@ pop3_folder_synchronize_sync (CamelFolder *folder,
 	pop3_store = CAMEL_POP3_STORE (parent_store);
 
 	service = CAMEL_SERVICE (parent_store);
-	settings = camel_service_get_settings (service);
 	is_online = camel_service_get_connection_status (service) == CAMEL_SERVICE_CONNECTED;
 
+	settings = camel_service_ref_settings (service);
+
 	g_object_get (
 		settings,
 		"delete-after-days", &delete_after_days,
@@ -818,6 +822,8 @@ pop3_folder_synchronize_sync (CamelFolder *folder,
 		"keep-on-server", &keep_on_server,
 		NULL);
 
+	g_object_unref (settings);
+
 	if (is_online && delete_after_days > 0 && !expunge) {
 		camel_operation_push_message (
 			cancellable, _("Expunging old messages"));
@@ -924,7 +930,6 @@ camel_pop3_folder_new (CamelStore *parent,
 	CamelPOP3Folder *pop3_folder;
 
 	service = CAMEL_SERVICE (parent);
-	settings = camel_service_get_settings (service);
 
 	d(printf("opening pop3 INBOX folder\n"));
 
@@ -933,8 +938,13 @@ camel_pop3_folder_new (CamelStore *parent,
 		"full-name", "inbox", "display-name", "inbox",
 		"parent-store", parent, NULL);
 
+	settings = camel_service_ref_settings (service);
+
 	pop3_folder = (CamelPOP3Folder *) folder;
-	pop3_folder->mobile_mode = camel_pop3_settings_get_mobile_mode (CAMEL_POP3_SETTINGS (settings));
+	pop3_folder->mobile_mode = camel_pop3_settings_get_mobile_mode (
+		CAMEL_POP3_SETTINGS (settings));
+
+	g_object_unref (settings);
 
 	pop3_folder->fetch_more = 0;
 	if (pop3_folder->mobile_mode) {
diff --git a/camel/providers/pop3/camel-pop3-store.c b/camel/providers/pop3/camel-pop3-store.c
index c764f2d..354f174 100644
--- a/camel/providers/pop3/camel-pop3-store.c
+++ b/camel/providers/pop3/camel-pop3-store.c
@@ -103,10 +103,16 @@ connect_to_server (CamelService *service,
 	guint32 flags = 0;
 	gint ret;
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
+	method = camel_network_settings_get_security_method (network_settings);
+
+	disable_extensions = camel_pop3_settings_get_disable_extensions (
+		CAMEL_POP3_SETTINGS (settings));
+
+	g_object_unref (settings);
 
 	tcp_stream = camel_network_service_connect_sync (
 		CAMEL_NETWORK_SERVICE (service), cancellable, error);
@@ -124,9 +130,6 @@ connect_to_server (CamelService *service,
 		goto exit;
 	}
 
-	disable_extensions = camel_pop3_settings_get_disable_extensions (
-		CAMEL_POP3_SETTINGS (settings));
-
 	if (disable_extensions)
 		flags |= CAMEL_POP3_ENGINE_DISABLE_EXTENSIONS;
 
@@ -140,8 +143,6 @@ connect_to_server (CamelService *service,
 		goto exit;
 	}
 
-	g_object_get (settings, "security-method", &method, NULL);
-
 	if (method != CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT) {
 		g_object_unref (tcp_stream);
 		goto exit;
@@ -236,11 +237,14 @@ try_sasl (CamelPOP3Store *store,
 	gint ret;
 
 	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 
+	g_object_unref (settings);
+
 	sasl = camel_sasl_new ("pop", mechanism, service);
 	if (sasl == NULL) {
 		g_set_error (
@@ -349,12 +353,14 @@ pop3_store_get_name (CamelService *service,
 	gchar *user;
 	gchar *name;
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 	user = camel_network_settings_dup_user (network_settings);
 
+	g_object_unref (settings);
+
 	if (brief)
 		name = g_strdup_printf (
 			_("POP3 server %s"), host);
@@ -381,12 +387,15 @@ pop3_store_connect_sync (CamelService *service,
 	gchar *mechanism;
 
 	session = camel_service_get_session (service);
-	settings = camel_service_get_settings (service);
 	user_data_dir = camel_service_get_user_data_dir (service);
 
+	settings = camel_service_ref_settings (service);
+
 	mechanism = camel_network_settings_dup_auth_mechanism (
 		CAMEL_NETWORK_SETTINGS (settings));
 
+	g_object_unref (settings);
+
 	if (!camel_session_get_online (session)) {
 		g_set_error (
 			error, CAMEL_SERVICE_ERROR,
@@ -479,12 +488,15 @@ pop3_store_authenticate_sync (CamelService *service,
 	gint status;
 
 	password = camel_service_get_password (service);
-	settings = camel_service_get_settings (service);
+
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 	user = camel_network_settings_dup_user (network_settings);
 
+	g_object_unref (settings);
+
 	if (mechanism == NULL) {
 		if (password == NULL) {
 			g_set_error_literal (
@@ -637,11 +649,13 @@ pop3_store_query_auth_types_sync (CamelService *service,
 		return NULL;
 	}
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 
+	g_object_unref (settings);
+
 	if (connect_to_server (service, cancellable, NULL)) {
 		types = g_list_concat (types, g_list_copy (store->engine->auth));
 		pop3_store_disconnect_sync (service, TRUE, cancellable, NULL);
diff --git a/camel/providers/smtp/camel-smtp-transport.c b/camel/providers/smtp/camel-smtp-transport.c
index 8903681..d2e15e8 100644
--- a/camel/providers/smtp/camel-smtp-transport.c
+++ b/camel/providers/smtp/camel-smtp-transport.c
@@ -117,12 +117,14 @@ connect_to_server (CamelService *service,
 	transport->flags = 0;
 	transport->authtypes = NULL;
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 	method = camel_network_settings_get_security_method (network_settings);
 
+	g_object_unref (settings);
+
 	tcp_stream = camel_network_service_connect_sync (
 		CAMEL_NETWORK_SERVICE (service), cancellable, error);
 
@@ -284,11 +286,13 @@ smtp_transport_get_name (CamelService *service,
 	gchar *host;
 	gchar *name;
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 
+	g_object_unref (settings);
+
 	if (brief)
 		name = g_strdup_printf (
 			_("SMTP server %s"), host);
@@ -314,12 +318,14 @@ smtp_transport_connect_sync (CamelService *service,
 	gboolean auth_required;
 	gboolean success = TRUE;
 
-	settings = camel_service_get_settings (service);
+	settings = camel_service_ref_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	host = camel_network_settings_dup_host (network_settings);
 	mechanism = camel_network_settings_dup_auth_mechanism (network_settings);
 
+	g_object_unref (settings);
+
 	/* We (probably) need to check popb4smtp before we connect ... */
 	if (g_strcmp0 (mechanism, "POPB4SMTP") == 0) {
 		GByteArray *chal;
diff --git a/docs/reference/camel/camel-sections.txt b/docs/reference/camel/camel-sections.txt
index 6cc85a6..16f62a4 100644
--- a/docs/reference/camel/camel-sections.txt
+++ b/docs/reference/camel/camel-sections.txt
@@ -2254,7 +2254,7 @@ camel_service_get_user_cache_dir
 camel_service_get_name
 camel_service_get_provider
 camel_service_get_session
-camel_service_get_settings
+camel_service_ref_settings
 camel_service_set_settings
 camel_service_get_uid
 camel_service_connect_sync



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]