[evolution] Adapt to CamelSession API changes.



commit 6be2668e483cfc7a2e75ae2efcd9675388d08601
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sun Aug 12 08:58:50 2012 -0400

    Adapt to CamelSession API changes.
    
    These functions now return new references:
    
      camel_session_add_service()
      camel_session_list_services()
    
    These functions have been renamed and also return new references:
    
      camel_session_get_service()        -> camel_session_ref_service()
      camel_session_get_service_by_url() -> camel_session_ref_service_by_url()

 libemail-engine/e-mail-folder-utils.c    |   18 +++++--
 libemail-engine/e-mail-session-utils.c   |   21 ++++++--
 libemail-engine/e-mail-session.c         |   84 +++++++++++++++++++-----------
 libemail-engine/mail-ops.c               |    6 ++-
 libemail-engine/mail-vfolder.c           |   19 +++++--
 mail/e-mail-account-store.c              |    6 ++-
 mail/e-mail-backend.c                    |   38 ++++++++-----
 mail/e-mail-config-auth-check.c          |    3 +-
 mail/e-mail-config-defaults-page.c       |   28 +++++++---
 mail/em-filter-source-element.c          |    4 +-
 mail/em-folder-tree.c                    |   25 ++++-----
 mail/em-subscription-editor.c            |    5 ++-
 mail/em-utils.c                          |    2 +-
 mail/mail-send-recv.c                    |   24 ++++++---
 modules/mail/e-mail-shell-backend.c      |   15 ++++--
 modules/mail/e-mail-shell-view-actions.c |    2 +-
 modules/mail/e-mail-shell-view.c         |   14 +++--
 shell/e-convert-local-mail.c             |   14 ++++-
 18 files changed, 220 insertions(+), 108 deletions(-)
---
diff --git a/libemail-engine/e-mail-folder-utils.c b/libemail-engine/e-mail-folder-utils.c
index 07613ec..78e5434 100644
--- a/libemail-engine/e-mail-folder-utils.c
+++ b/libemail-engine/e-mail-folder-utils.c
@@ -309,7 +309,7 @@ mail_folder_expunge_pop3_stores (CamelFolder *folder,
 		if (!enabled || g_strcmp0 (backend_name, "pop") != 0)
 			continue;
 
-		service = camel_session_get_service (
+		service = camel_session_ref_service (
 			CAMEL_SESSION (session), source_uid);
 
 		service_uid = camel_service_get_uid (service);
@@ -321,14 +321,17 @@ mail_folder_expunge_pop3_stores (CamelFolder *folder,
 			"keep-on-server", &keep_on_server,
 			NULL);
 
-		if (!keep_on_server || !delete_expunged)
+		if (!keep_on_server || !delete_expunged) {
+			g_object_unref (service);
 			continue;
+		}
 
 		folder = camel_store_get_inbox_folder_sync (
 			CAMEL_STORE (service), cancellable, error);
 
 		/* Abort the loop on error. */
 		if (folder == NULL) {
+			g_object_unref (service);
 			success = FALSE;
 			break;
 		}
@@ -336,6 +339,7 @@ mail_folder_expunge_pop3_stores (CamelFolder *folder,
 		uids = camel_folder_get_uids (folder);
 
 		if (uids == NULL) {
+			g_object_unref (service);
 			g_object_unref (folder);
 			continue;
 		}
@@ -359,6 +363,7 @@ mail_folder_expunge_pop3_stores (CamelFolder *folder,
 				folder, TRUE, cancellable, error);
 
 		g_object_unref (folder);
+		g_object_unref (service);
 
 		/* Abort the loop on error. */
 		if (!success)
@@ -1801,7 +1806,7 @@ e_mail_folder_uri_parse (CamelSession *session,
 				uid = g_strconcat (
 					url->user, "@", url->host, NULL);
 
-			service = camel_session_get_service (session, uid);
+			service = camel_session_ref_service (session, uid);
 			g_free (uid);
 		}
 
@@ -1845,7 +1850,7 @@ e_mail_folder_uri_parse (CamelSession *session,
 		}
 
 		if (uid != NULL) {
-			service = camel_session_get_service (session, uid);
+			service = camel_session_ref_service (session, uid);
 			g_free (uid);
 		}
 
@@ -1858,7 +1863,7 @@ e_mail_folder_uri_parse (CamelSession *session,
 	 * To determine which it is, you have to check the provider
 	 * flags for CAMEL_URL_FRAGMENT_IS_PATH. */
 	} else {
-		service = camel_session_get_service_by_url (
+		service = camel_session_ref_service_by_url (
 			session, url, CAMEL_PROVIDER_STORE);
 
 		if (CAMEL_IS_STORE (service)) {
@@ -1891,6 +1896,9 @@ e_mail_folder_uri_parse (CamelSession *session,
 			folder_uri);
 	}
 
+	if (service != NULL)
+		g_object_unref (service);
+
 	g_free (folder_name);
 
 	camel_url_free (url);
diff --git a/libemail-engine/e-mail-session-utils.c b/libemail-engine/e-mail-session-utils.c
index 2ac4170..0694ea6 100644
--- a/libemail-engine/e-mail-session-utils.c
+++ b/libemail-engine/e-mail-session-utils.c
@@ -410,15 +410,25 @@ mail_session_send_to_thread (GSimpleAsyncResult *simple,
 		CamelService *service;
 		gboolean did_connect = FALSE;
 
-		service = camel_session_get_service (
+		service = camel_session_ref_service (
 			CAMEL_SESSION (session), context->transport_uid);
 
+		if (service == NULL) {
+			g_simple_async_result_set_error (
+				simple, CAMEL_SERVICE_ERROR,
+				CAMEL_SERVICE_ERROR_URL_INVALID,
+				_("No mail service found with UID '%s'"),
+				context->transport_uid);
+			return;
+		}
+
 		if (!CAMEL_IS_TRANSPORT (service)) {
-			g_simple_async_result_set_error (simple,
-				CAMEL_SERVICE_ERROR,
+			g_simple_async_result_set_error (
+				simple, CAMEL_SERVICE_ERROR,
 				CAMEL_SERVICE_ERROR_URL_INVALID,
-				_("Cannot get transport for account '%s'"),
+				_("UID '%s' is not a mail transport"),
 				context->transport_uid);
+			g_object_unref (service);
 			return;
 		}
 
@@ -431,6 +441,7 @@ mail_session_send_to_thread (GSimpleAsyncResult *simple,
 
 			if (error != NULL) {
 				g_simple_async_result_take_error (simple, error);
+				g_object_unref (service);
 				return;
 			}
 		}
@@ -450,6 +461,8 @@ mail_session_send_to_thread (GSimpleAsyncResult *simple,
 				service, error == NULL,
 				cancellable, error ? NULL : &error);
 
+		g_object_unref (service);
+
 		if (error != NULL) {
 			g_simple_async_result_take_error (simple, error);
 			return;
diff --git a/libemail-engine/e-mail-session.c b/libemail-engine/e-mail-session.c
index 2bd9e34..c7853f9 100644
--- a/libemail-engine/e-mail-session.c
+++ b/libemail-engine/e-mail-session.c
@@ -78,8 +78,8 @@ struct _EMailSessionPrivate {
 	gulong source_disabled_handler_id;
 	gulong default_mail_account_handler_id;
 
-	CamelStore *local_store;
-	CamelStore *vfolder_store;
+	CamelService *local_store;
+	CamelService *vfolder_store;
 
 	FILE *filter_logfile;
 	GHashTable *junk_filters;
@@ -445,10 +445,12 @@ mail_session_refresh_cb (ESource *source,
 	const gchar *uid;
 
 	uid = e_source_get_uid (source);
-	service = camel_session_get_service (session, uid);
-	g_return_if_fail (CAMEL_IS_SERVICE (service));
+	service = camel_session_ref_service (session, uid);
+	g_return_if_fail (service != NULL);
 
 	g_signal_emit (session, signals[REFRESH_SERVICE], 0, service);
+
+	g_object_unref (service);
 }
 
 static gboolean
@@ -478,6 +480,7 @@ mail_session_add_from_source (EMailSession *session,
                               ESource *source)
 {
 	ESourceBackend *extension;
+	CamelService *service;
 	const gchar *uid;
 	const gchar *backend_name;
 	const gchar *display_name;
@@ -512,12 +515,15 @@ mail_session_add_from_source (EMailSession *session,
 	if (mail_session_check_goa_mail_disabled (session, source))
 		return;
 
-	/* Our own CamelSession.add_service() method will handle the
-	 * resulting CamelService, so we don't need the return value. */
-	camel_session_add_service (
+	service = camel_session_add_service (
 		CAMEL_SESSION (session), uid,
 		backend_name, type, &error);
 
+	/* Our own CamelSession.add_service() method will handle the
+	 * new CamelService, so we only need to unreference it here. */
+	if (service != NULL)
+		g_object_unref (service);
+
 	if (error != NULL) {
 		g_warning (
 			"Failed to add service '%s' (%s): %s",
@@ -578,10 +584,12 @@ mail_session_source_removed_cb (ESourceRegistry *registry,
 	camel_session = CAMEL_SESSION (session);
 
 	uid = e_source_get_uid (source);
-	service = camel_session_get_service (camel_session, uid);
+	service = camel_session_ref_service (camel_session, uid);
 
-	if (CAMEL_IS_SERVICE (service))
+	if (service != NULL) {
 		camel_session_remove_service (camel_session, service);
+		g_object_unref (service);
+	}
 }
 
 static void
@@ -676,8 +684,9 @@ mail_session_configure_local_store (EMailSession *session)
 	camel_session = CAMEL_SESSION (session);
 
 	uid = E_MAIL_SESSION_LOCAL_UID;
-	service = camel_session_get_service (camel_session, uid);
-	g_return_if_fail (CAMEL_IS_SERVICE (service));
+	service = camel_session_ref_service (camel_session, uid);
+	session->priv->local_store = service;  /* takes ownership */
+	g_return_if_fail (service != NULL);
 
 	settings = camel_service_get_settings (service);
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
@@ -721,8 +730,6 @@ mail_session_configure_local_store (EMailSession *session)
 			g_error_free (error);
 		}
 	}
-
-	session->priv->local_store = g_object_ref (service);
 }
 
 static void
@@ -735,8 +742,9 @@ mail_session_configure_vfolder_store (EMailSession *session)
 	camel_session = CAMEL_SESSION (session);
 
 	uid = E_MAIL_SESSION_VFOLDER_UID;
-	service = camel_session_get_service (camel_session, uid);
-	g_return_if_fail (CAMEL_IS_SERVICE (service));
+	service = camel_session_ref_service (camel_session, uid);
+	session->priv->vfolder_store = service;  /* takes ownership */
+	g_return_if_fail (service != NULL);
 
 	camel_service_connect_sync (service, NULL, NULL);
 
@@ -744,8 +752,6 @@ mail_session_configure_vfolder_store (EMailSession *session)
 	 *     but it requires an EMailBackend, which we don't have access
 	 *     to from here, so it has to be called from elsewhere.  Kinda
 	 *     thinking about reworking that... */
-
-	session->priv->vfolder_store = g_object_ref (service);
 }
 
 static void
@@ -1944,7 +1950,7 @@ e_mail_session_get_local_store (EMailSession *session)
 {
 	g_return_val_if_fail (E_IS_MAIL_SESSION (session), NULL);
 
-	return session->priv->local_store;
+	return CAMEL_STORE (session->priv->local_store);
 }
 
 CamelFolder *
@@ -2037,21 +2043,30 @@ e_mail_session_get_inbox_sync (EMailSession *session,
                                GError **error)
 {
 	CamelService *service;
+	CamelFolder *folder = NULL;
 
 	g_return_val_if_fail (E_IS_MAIL_SESSION (session), NULL);
 	g_return_val_if_fail (service_uid != NULL, NULL);
 
-	service = camel_session_get_service (
+	service = camel_session_ref_service (
 		CAMEL_SESSION (session), service_uid);
 
-	if (!CAMEL_IS_STORE (service))
+	if (service == NULL)
 		return NULL;
 
+	if (!CAMEL_IS_STORE (service))
+		goto exit;
+
 	if (!camel_service_connect_sync (service, cancellable, error))
-		return NULL;
+		goto exit;
 
-	return camel_store_get_inbox_folder_sync (
+	folder = camel_store_get_inbox_folder_sync (
 		CAMEL_STORE (service), cancellable, error);
+
+exit:
+	g_object_unref (service);
+
+	return folder;
 }
 
 void
@@ -2136,21 +2151,30 @@ e_mail_session_get_trash_sync (EMailSession *session,
                                GError **error)
 {
 	CamelService *service;
+	CamelFolder *folder = NULL;
 
 	g_return_val_if_fail (E_IS_MAIL_SESSION (session), NULL);
 	g_return_val_if_fail (service_uid != NULL, NULL);
 
-	service = camel_session_get_service (
+	service = camel_session_ref_service (
 		CAMEL_SESSION (session), service_uid);
 
-	if (!CAMEL_IS_STORE (service))
+	if (service == NULL)
 		return NULL;
 
+	if (!CAMEL_IS_STORE (service))
+		goto exit;
+
 	if (!camel_service_connect_sync (service, cancellable, error))
-		return NULL;
+		goto exit;
 
-	return camel_store_get_trash_folder_sync (
+	folder = camel_store_get_trash_folder_sync (
 		CAMEL_STORE (service), cancellable, error);
+
+exit:
+	g_object_unref (service);
+
+	return folder;
 }
 
 void
@@ -2377,12 +2401,12 @@ e_binding_transform_source_to_service (GBinding *binding,
 		return FALSE;
 
 	uid = e_source_get_uid (source);
-	service = camel_session_get_service (session, uid);
+	service = camel_session_ref_service (session, uid);
 
-	if (!CAMEL_IS_SERVICE (service))
+	if (service == NULL)
 		return FALSE;
 
-	g_value_set_object (target_value, service);
+	g_value_take_object (target_value, service);
 
 	return TRUE;
 }
@@ -2433,7 +2457,7 @@ e_mail_session_get_vfolder_store (EMailSession *session)
 {
 	g_return_val_if_fail (E_IS_MAIL_SESSION (session), NULL);
 
-	return session->priv->vfolder_store;
+	return CAMEL_STORE (session->priv->vfolder_store);
 }
 
 EMVFolderContext *
diff --git a/libemail-engine/mail-ops.c b/libemail-engine/mail-ops.c
index 58a90ea..7120826 100644
--- a/libemail-engine/mail-ops.c
+++ b/libemail-engine/mail-ops.c
@@ -610,7 +610,7 @@ mail_send_message (struct _send_queue_msg *m,
 	if (sent_folder_uri == NULL && tmp != NULL)
 		sent_folder_uri = g_strstrip (g_strdup (tmp));
 
-	service = camel_session_get_service (
+	service = camel_session_ref_service (
 		CAMEL_SESSION (m->session), transport_uid);
 	if (service != NULL)
 		provider = camel_service_get_provider (service);
@@ -825,6 +825,10 @@ exit:
 	}
 	if (info)
 		camel_message_info_free (info);
+
+	if (service != NULL)
+		g_object_unref (service);
+
 	g_object_unref (recipients);
 	g_object_unref (from);
 	g_free (sent_folder_uri);
diff --git a/libemail-engine/mail-vfolder.c b/libemail-engine/mail-vfolder.c
index 233e6a0..3d695d6 100644
--- a/libemail-engine/mail-vfolder.c
+++ b/libemail-engine/mail-vfolder.c
@@ -811,9 +811,9 @@ rule_changed (EFilterRule *rule,
 	full_name = camel_folder_get_full_name (folder);
 	session = get_session (folder);
 
-	service = camel_session_get_service (
+	service = camel_session_ref_service (
 		CAMEL_SESSION (session), E_MAIL_SESSION_VFOLDER_UID);
-	g_return_if_fail (CAMEL_IS_SERVICE (service));
+	g_return_if_fail (service != NULL);
 
 	/* If the folder has changed name, then
 	 * add it, then remove the old manually. */
@@ -846,6 +846,9 @@ rule_changed (EFilterRule *rule,
 		g_free (oldname);
 	}
 
+	g_object_unref (service);
+	service = NULL;
+
 	d(printf("Filter rule changed? for folder '%s'!!\n", folder->name));
 
 	camel_vee_folder_set_auto_update (CAMEL_VEE_FOLDER (folder),
@@ -910,9 +913,9 @@ context_rule_added (ERuleContext *ctx,
 
 	d(printf("rule added: %s\n", rule->name));
 
-	service = camel_session_get_service (
+	service = camel_session_ref_service (
 		CAMEL_SESSION (session), E_MAIL_SESSION_VFOLDER_UID);
-	g_return_if_fail (CAMEL_IS_SERVICE (service));
+	g_return_if_fail (service != NULL);
 
 	/* this always runs quickly */
 	/* FIXME Not passing a GCancellable or GError. */
@@ -929,6 +932,8 @@ context_rule_added (ERuleContext *ctx,
 
 		rule_changed (rule, folder);
 	}
+
+	g_object_unref (service);
 }
 
 static void
@@ -941,9 +946,9 @@ context_rule_removed (ERuleContext *ctx,
 
 	d(printf("rule removed; %s\n", rule->name));
 
-	service = camel_session_get_service (
+	service = camel_session_ref_service (
 		CAMEL_SESSION (session), E_MAIL_SESSION_VFOLDER_UID);
-	g_return_if_fail (CAMEL_IS_SERVICE (service));
+	g_return_if_fail (service != NULL);
 
 	/* TODO: remove from folder info cache? */
 
@@ -960,6 +965,8 @@ context_rule_removed (ERuleContext *ctx,
 	/* this must be unref'd after its deleted */
 	if (folder)
 		g_object_unref ((CamelFolder *) folder);
+
+	g_object_unref (service);
 }
 
 static void
diff --git a/mail/e-mail-account-store.c b/mail/e-mail-account-store.c
index b7228e2..a78034a 100644
--- a/mail/e-mail-account-store.c
+++ b/mail/e-mail-account-store.c
@@ -1528,7 +1528,7 @@ e_mail_account_store_load_sort_order (EMailAccountStore *store,
 	for (ii = 0; ii < length; ii++) {
 		CamelService *service;
 
-		service = camel_session_get_service (
+		service = camel_session_ref_service (
 			CAMEL_SESSION (session), service_uids[ii]);
 		if (service != NULL)
 			g_queue_push_tail (&service_queue, service);
@@ -1536,7 +1536,9 @@ e_mail_account_store_load_sort_order (EMailAccountStore *store,
 
 	e_mail_account_store_reorder_services (store, &service_queue);
 
-	g_queue_clear (&service_queue);
+	while (!g_queue_is_empty (&service_queue))
+		g_object_unref (g_queue_pop_head (&service_queue));
+
 	g_strfreev (service_uids);
 
 	g_key_file_free (key_file);
diff --git a/mail/e-mail-backend.c b/mail/e-mail-backend.c
index e706d55..e0a0275 100644
--- a/mail/e-mail-backend.c
+++ b/mail/e-mail-backend.c
@@ -166,18 +166,22 @@ mail_backend_prepare_for_offline_cb (EShell *shell,
 		const gchar *uid;
 
 		uid = e_source_get_uid (source);
-		service = camel_session_get_service (
+		service = camel_session_ref_service (
 			CAMEL_SESSION (session), uid);
 
-		if (!CAMEL_IS_STORE (service))
+		if (service == NULL)
 			continue;
 
 		/* FIXME Not passing a GCancellable. */
-		e_mail_store_go_offline (
-			CAMEL_STORE (service), G_PRIORITY_DEFAULT,
-			NULL, (GAsyncReadyCallback)
-			mail_backend_store_operation_done_cb,
-			g_object_ref (activity));
+		if (CAMEL_IS_STORE (service))
+			e_mail_store_go_offline (
+				CAMEL_STORE (service),
+				G_PRIORITY_DEFAULT,
+				NULL, (GAsyncReadyCallback)
+				mail_backend_store_operation_done_cb,
+				g_object_ref (activity));
+
+		g_object_unref (service);
 	}
 
 	g_list_free_full (list, (GDestroyNotify) g_object_unref);
@@ -210,18 +214,22 @@ mail_backend_prepare_for_online_cb (EShell *shell,
 			continue;
 
 		uid = e_source_get_uid (source);
-		service = camel_session_get_service (
+		service = camel_session_ref_service (
 			CAMEL_SESSION (session), uid);
 
-		if (!CAMEL_IS_STORE (service))
+		if (service == NULL)
 			continue;
 
 		/* FIXME Not passing a GCancellable. */
-		e_mail_store_go_online (
-			CAMEL_STORE (service), G_PRIORITY_DEFAULT,
-			NULL, (GAsyncReadyCallback)
-			mail_backend_store_operation_done_cb,
-			g_object_ref (activity));
+		if (CAMEL_IS_STORE (service))
+			e_mail_store_go_online (
+				CAMEL_STORE (service),
+				G_PRIORITY_DEFAULT,
+				NULL, (GAsyncReadyCallback)
+				mail_backend_store_operation_done_cb,
+				g_object_ref (activity));
+
+		g_object_unref (service);
 	}
 
 	g_list_free_full (list, (GDestroyNotify) g_object_unref);
@@ -331,7 +339,7 @@ mail_backend_prepare_for_quit_cb (EShell *shell,
 			g_object_ref (activity));
 	}
 
-	g_list_free (list);
+	g_list_free_full (list, (GDestroyNotify) g_object_unref);
 
 	/* Now we poll until all activities are actually cancelled or finished.
 	 * Reffing the activity delays quitting; the reference count
diff --git a/mail/e-mail-config-auth-check.c b/mail/e-mail-config-auth-check.c
index 990ce61..9d12ab2 100644
--- a/mail/e-mail-config-auth-check.c
+++ b/mail/e-mail-config-auth-check.c
@@ -146,7 +146,6 @@ mail_config_auth_check_update (EMailConfigAuthCheck *auth_check)
 		"user-cache-dir", temp_dir,
 		NULL);
 
-	/* This returns a BORROWED reference to the CamelService. */
 	service = camel_session_add_service (
 		session, "fake-uid",
 		backend_class->backend_name,
@@ -182,6 +181,8 @@ mail_config_auth_check_update (EMailConfigAuthCheck *auth_check)
 	camel_service_query_auth_types (
 		service, G_PRIORITY_DEFAULT, cancellable,
 		mail_config_auth_check_update_done_cb, async_context);
+
+	g_object_unref (service);
 }
 
 static void
diff --git a/mail/e-mail-config-defaults-page.c b/mail/e-mail-config-defaults-page.c
index ae4f140..9d54fb5 100644
--- a/mail/e-mail-config-defaults-page.c
+++ b/mail/e-mail-config-defaults-page.c
@@ -93,7 +93,7 @@ mail_config_defaults_page_maybe_get_settings (EMailConfigDefaultsPage *page)
 }
 
 static CamelStore *
-mail_config_defaults_page_get_store (EMailConfigDefaultsPage *page)
+mail_config_defaults_page_ref_store (EMailConfigDefaultsPage *page)
 {
 	ESource *source;
 	EMailSession *session;
@@ -104,9 +104,17 @@ mail_config_defaults_page_get_store (EMailConfigDefaultsPage *page)
 	source = e_mail_config_defaults_page_get_account_source (page);
 
 	uid = e_source_get_uid (source);
-	service = camel_session_get_service (CAMEL_SESSION (session), uid);
+	service = camel_session_ref_service (CAMEL_SESSION (session), uid);
 
-	return CAMEL_IS_STORE (service) ? CAMEL_STORE (service) : NULL;
+	if (service == NULL)
+		return NULL;
+
+	if (!CAMEL_IS_STORE (service)) {
+		g_object_unref (service);
+		return NULL;
+	}
+
+	return CAMEL_STORE (service);
 }
 
 static gboolean
@@ -185,8 +193,8 @@ mail_config_defaults_page_folder_name_to_uri (GBinding *binding,
 	gchar *folder_uri = NULL;
 
 	page = E_MAIL_CONFIG_DEFAULTS_PAGE (data);
-	store = mail_config_defaults_page_get_store (page);
-	g_return_val_if_fail (CAMEL_IS_STORE (store), FALSE);
+	store = mail_config_defaults_page_ref_store (page);
+	g_return_val_if_fail (store != NULL, FALSE);
 
 	folder_name = g_value_get_string (source_value);
 
@@ -197,6 +205,8 @@ mail_config_defaults_page_folder_name_to_uri (GBinding *binding,
 
 	g_free (folder_uri);
 
+	g_object_unref (store);
+
 	return TRUE;
 }
 
@@ -286,9 +296,6 @@ mail_config_defaults_page_add_real_folder (EMailConfigDefaultsPage *page,
 	CamelStore *store;
 	GObjectClass *class;
 
-	store = mail_config_defaults_page_get_store (page);
-	g_return_val_if_fail (CAMEL_IS_STORE (store), NULL);
-
 	session = e_mail_config_defaults_page_get_session (page);
 	settings = mail_config_defaults_page_maybe_get_settings (page);
 
@@ -306,6 +313,9 @@ mail_config_defaults_page_add_real_folder (EMailConfigDefaultsPage *page,
 	if (g_object_class_find_property (class, use_property_name) == NULL)
 		return NULL;
 
+	store = mail_config_defaults_page_ref_store (page);
+	g_return_val_if_fail (store != NULL, NULL);
+
 	/* We're good to go. */
 
 	box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
@@ -352,6 +362,8 @@ mail_config_defaults_page_add_real_folder (EMailConfigDefaultsPage *page,
 		G_CALLBACK (mail_config_defaults_page_restore_real_folder),
 		check_button);
 
+	g_object_unref (store);
+
 	return box;
 }
 
diff --git a/mail/em-filter-source-element.c b/mail/em-filter-source-element.c
index fbc2aed..2d5be7f 100644
--- a/mail/em-filter-source-element.c
+++ b/mail/em-filter-source-element.c
@@ -207,7 +207,7 @@ filter_source_element_xml_decode (EFilterElement *fe,
 			xmlFree (content);
 
 			if (url != NULL) {
-				service = camel_session_get_service_by_url (
+				service = camel_session_ref_service_by_url (
 					CAMEL_SESSION (session),
 					url, CAMEL_PROVIDER_STORE);
 				camel_url_free (url);
@@ -218,6 +218,8 @@ filter_source_element_xml_decode (EFilterElement *fe,
 
 				uid = camel_service_get_uid (service);
 				active_id = g_strdup (uid);
+
+				g_object_unref (service);
 			}
 
 			break;
diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c
index fd5ac58..ddcfc65 100644
--- a/mail/em-folder-tree.c
+++ b/mail/em-folder-tree.c
@@ -491,7 +491,7 @@ static void
 folder_tree_expand_node (const gchar *key,
                          EMFolderTree *folder_tree)
 {
-	struct _EMFolderTreeModelStoreInfo *si;
+	struct _EMFolderTreeModelStoreInfo *si = NULL;
 	GtkTreeRowReference *row;
 	GtkTreeView *tree_view;
 	GtkTreeModel *model;
@@ -517,21 +517,18 @@ folder_tree_expand_node (const gchar *key,
 
 	session = em_folder_tree_get_session (folder_tree);
 
-	service = camel_session_get_service (CAMEL_SESSION (session), uid);
-
-	if (!CAMEL_IS_STORE (service))
-		return;
+	service = camel_session_ref_service (CAMEL_SESSION (session), uid);
 
-	g_object_ref (service);
+	if (CAMEL_IS_STORE (service))
+		si = em_folder_tree_model_lookup_store_info (
+			EM_FOLDER_TREE_MODEL (model),
+			CAMEL_STORE (service));
 
-	si = em_folder_tree_model_lookup_store_info (
-		EM_FOLDER_TREE_MODEL (model), CAMEL_STORE (service));
-	if (si == NULL) {
+	if (service != NULL)
 		g_object_unref (service);
-		return;
-	}
 
-	g_object_unref (service);
+	if (si == NULL)
+		return;
 
 	if (p != NULL && p[1]) {
 		if (!(row = g_hash_table_lookup (si->full_hash, p + 1)))
@@ -3516,12 +3513,14 @@ em_folder_tree_restore_state (EMFolderTree *folder_tree,
 			CamelService *service;
 			const gchar *uid = group_name + 6;
 
-			service = camel_session_get_service (
+			service = camel_session_ref_service (
 				CAMEL_SESSION (session), uid);
 			if (CAMEL_IS_STORE (service)) {
 				store = g_object_ref (service);
 				success = TRUE;
 			}
+			if (service != NULL)
+				g_object_unref (service);
 			expanded = TRUE;
 
 		} else if (g_str_has_prefix (group_name, "Folder ")) {
diff --git a/mail/em-subscription-editor.c b/mail/em-subscription-editor.c
index 8221115..1ee5269 100644
--- a/mail/em-subscription-editor.c
+++ b/mail/em-subscription-editor.c
@@ -1564,13 +1564,16 @@ subscription_editor_constructed (GObject *object)
 
 		source = e_source_registry_ref_default_mail_account (registry);
 
-		service = camel_session_get_service (
+		service = camel_session_ref_service (
 			CAMEL_SESSION (session),
 			e_source_get_uid (source));
 
 		if (CAMEL_IS_SUBSCRIBABLE (service))
 			editor->priv->initial_store = g_object_ref (service);
 
+		if (service != NULL)
+			g_object_unref (service);
+
 		g_object_unref (source);
 	}
 
diff --git a/mail/em-utils.c b/mail/em-utils.c
index 3bfeaff..17ecdbc 100644
--- a/mail/em-utils.c
+++ b/mail/em-utils.c
@@ -1377,7 +1377,7 @@ em_utils_empty_trash (GtkWidget *parent,
 			mail_empty_trash (CAMEL_STORE (service));
 	}
 
-	g_list_free (list);
+	g_list_free_full (list, (GDestroyNotify) g_object_unref);
 }
 
 /* ********************************************************************** */
diff --git a/mail/mail-send-recv.c b/mail/mail-send-recv.c
index 0d2cc10..d2190a2 100644
--- a/mail/mail-send-recv.c
+++ b/mail/mail-send-recv.c
@@ -339,7 +339,7 @@ set_transport_service (struct _send_info *info,
 
 	g_static_mutex_lock (&status_lock);
 
-	service = camel_session_get_service (info->session, transport_uid);
+	service = camel_session_ref_service (info->session, transport_uid);
 
 	if (CAMEL_IS_TRANSPORT (service)) {
 		if (info->service != NULL)
@@ -347,6 +347,9 @@ set_transport_service (struct _send_info *info,
 		info->service = g_object_ref (service);
 	}
 
+	if (service != NULL)
+		g_object_unref (service);
+
 	g_static_mutex_unlock (&status_lock);
 }
 
@@ -1136,7 +1139,7 @@ receive_update_got_store (CamelStore *store,
 }
 
 static CamelService *
-get_default_transport (EMailSession *session)
+ref_default_transport (EMailSession *session)
 {
 	ESource *source;
 	ESourceRegistry *registry;
@@ -1171,7 +1174,7 @@ get_default_transport (EMailSession *session)
 		return NULL;
 
 	uid = e_source_get_uid (source);
-	service = camel_session_get_service (CAMEL_SESSION (session), uid);
+	service = camel_session_ref_service (CAMEL_SESSION (session), uid);
 
 	g_object_unref (source);
 
@@ -1198,7 +1201,7 @@ send_receive (GtkWindow *parent,
 	if (!camel_session_get_online (CAMEL_SESSION (session)))
 		return send_recv_dialog;
 
-	transport = get_default_transport (session);
+	transport = ref_default_transport (session);
 
 	local_outbox =
 		e_mail_session_get_local_folder (
@@ -1207,6 +1210,9 @@ send_receive (GtkWindow *parent,
 	data = build_dialog (
 		parent, session, local_outbox, transport, allow_send);
 
+	if (transport != NULL)
+		g_object_unref (transport);
+
 	for (scan = data->infos; scan != NULL; scan = scan->next) {
 		struct _send_info *info = scan->data;
 
@@ -1357,7 +1363,7 @@ mail_send (EMailSession *session)
 
 	g_return_if_fail (E_IS_MAIL_SESSION (session));
 
-	service = get_default_transport (session);
+	service = ref_default_transport (session);
 	if (service == NULL)
 		return;
 
@@ -1366,15 +1372,17 @@ mail_send (EMailSession *session)
 	if (info != NULL) {
 		info->again++;
 		d(printf("send of %s still in progress\n", transport->url));
+		g_object_unref (service);
 		return;
 	}
 
 	d(printf("starting non-interactive send of '%s'\n", transport->url));
 
 	type = get_receive_type (service);
-
-	if (type == SEND_INVALID)
+	if (type == SEND_INVALID) {
+		g_object_unref (service);
 		return;
+	}
 
 	info = g_malloc0 (sizeof (*info));
 	info->type = SEND_SEND;
@@ -1405,4 +1413,6 @@ mail_send (EMailSession *session)
 		receive_get_folder, info,
 		receive_status, info,
 		send_done, info);
+
+	g_object_unref (service);
 }
diff --git a/modules/mail/e-mail-shell-backend.c b/modules/mail/e-mail-shell-backend.c
index 8b00ccf..7472a50 100644
--- a/modules/mail/e-mail-shell-backend.c
+++ b/modules/mail/e-mail-shell-backend.c
@@ -314,7 +314,7 @@ mail_shell_backend_mail_sync (EMailShellBackend *mail_shell_backend)
 			mail_shell_backend);
 	}
 
-	g_list_free (list);
+	g_list_free_full (list, (GDestroyNotify) g_object_unref);
 
 exit:
 	return TRUE;
@@ -481,8 +481,8 @@ mail_shell_backend_changes_committed_cb (EMailConfigWindow *window,
 	original_source = e_mail_config_window_get_original_source (window);
 
 	uid = e_source_get_uid (original_source);
-	service = camel_session_get_service (CAMEL_SESSION (session), uid);
-	g_return_if_fail (CAMEL_IS_STORE (service));
+	service = camel_session_ref_service (CAMEL_SESSION (session), uid);
+	g_return_if_fail (service != NULL);
 
 	shell_backend = E_SHELL_BACKEND (mail_shell_backend);
 
@@ -511,6 +511,8 @@ mail_shell_backend_changes_committed_cb (EMailConfigWindow *window,
 		mail_shell_backend_disconnect_done_cb, activity);
 
 	g_object_unref (cancellable);
+
+	g_object_unref (service);
 }
 
 static void
@@ -589,11 +591,16 @@ mail_shell_backend_constructed (GObject *object)
 		500);
 
 	mail_session = e_mail_backend_get_session (E_MAIL_BACKEND (object));
-	vstore = camel_session_get_service (CAMEL_SESSION (mail_session), E_MAIL_SESSION_VFOLDER_UID);
+	vstore = camel_session_ref_service (
+		CAMEL_SESSION (mail_session), E_MAIL_SESSION_VFOLDER_UID);
+	g_return_if_fail (vstore != NULL);
+
 	g_object_bind_property (
 		shell_settings, "mail-enable-unmatched-search-folder",
 		vstore, "unmatched-enabled",
 		G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
+
+	g_object_unref (vstore);
 }
 
 static void
diff --git a/modules/mail/e-mail-shell-view-actions.c b/modules/mail/e-mail-shell-view-actions.c
index f51286b..48f9d74 100644
--- a/modules/mail/e-mail-shell-view-actions.c
+++ b/modules/mail/e-mail-shell-view-actions.c
@@ -244,7 +244,7 @@ action_mail_download_cb (GtkAction *action,
 			action_mail_download_finished_cb, activity);
 	}
 
-	g_list_free (list);
+	g_list_free_full (list, (GDestroyNotify) g_object_unref);
 }
 
 static void
diff --git a/modules/mail/e-mail-shell-view.c b/modules/mail/e-mail-shell-view.c
index 1db444e..ebbbcef 100644
--- a/modules/mail/e-mail-shell-view.c
+++ b/modules/mail/e-mail-shell-view.c
@@ -605,15 +605,16 @@ all_accounts:
 	/* Create a new search folder. */
 
 	/* FIXME Complete lack of error checking here. */
-	service = camel_session_get_service (
+	service = camel_session_ref_service (
 		CAMEL_SESSION (session), E_MAIL_SESSION_VFOLDER_UID);
 	camel_service_connect_sync (service, NULL, NULL);
 
 	search_folder = (CamelVeeFolder *) camel_vee_folder_new (
-		CAMEL_STORE (service), _("All Account Search"),
-		0);
+		CAMEL_STORE (service), _("All Account Search"), 0);
 	priv->search_account_all = search_folder;
 
+	g_object_unref (service);
+
 	camel_vee_folder_set_expression (search_folder, query);
 
  all_accounts_setup:
@@ -701,15 +702,16 @@ current_account:
 	/* Create a new search folder. */
 
 	/* FIXME Complete lack of error checking here. */
-	service = camel_session_get_service (
+	service = camel_session_ref_service (
 		CAMEL_SESSION (session), E_MAIL_SESSION_VFOLDER_UID);
 	camel_service_connect_sync (service, NULL, NULL);
 
 	search_folder = (CamelVeeFolder *) camel_vee_folder_new (
-		CAMEL_STORE (service), _("Account Search"),
-		0);
+		CAMEL_STORE (service), _("Account Search"), 0);
 	priv->search_account_current = search_folder;
 
+	g_object_unref (service);
+
 	camel_vee_folder_set_expression (search_folder, query);
 
  current_accout_setup:
diff --git a/shell/e-convert-local-mail.c b/shell/e-convert-local-mail.c
index 02d7e09..16736c9 100644
--- a/shell/e-convert-local-mail.c
+++ b/shell/e-convert-local-mail.c
@@ -183,8 +183,8 @@ migrate_mbox_to_maildir (EShell *shell,
 	ESourceRegistry *registry;
 	ESourceExtension *extension;
 	const gchar *extension_name;
-	CamelService *mbox_service;
-	CamelService *maildir_service;
+	CamelService *mbox_service = NULL;
+	CamelService *maildir_service = NULL;
 	CamelSettings *settings;
 	const gchar *data_dir;
 	const gchar *mbox_uid;
@@ -227,11 +227,18 @@ migrate_mbox_to_maildir (EShell *shell,
 			CAMEL_PROVIDER_STORE, &error);
 
 	if (error != NULL) {
+		if (mbox_service != NULL)
+			g_object_unref (mbox_service);
+		if (maildir_service != NULL)
+			g_object_unref (maildir_service);
 		g_warning ("%s: %s", G_STRFUNC, error->message);
 		g_error_free (error);
 		return FALSE;
 	}
 
+	g_return_val_if_fail (CAMEL_IS_STORE (mbox_service), FALSE);
+	g_return_val_if_fail (CAMEL_IS_STORE (maildir_service), FALSE);
+
 	camel_service_set_settings (mbox_service, settings);
 
 	settings = camel_service_get_settings (maildir_service);
@@ -249,6 +256,9 @@ migrate_mbox_to_maildir (EShell *shell,
 	while (!ms.complete)
 		g_main_context_iteration (NULL, TRUE);
 
+	g_object_unref (mbox_service);
+	g_object_unref (maildir_service);
+
 	return TRUE;
 }
 



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