From 444dd5e097ecfe63e2a70f9c813e80e47d8c99e5 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sun, 12 Aug 2012 13:52:58 -0400 Subject: [PATCH] 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 -- 2.7.4