Rename camel_service_get_settings().
authorMatthew Barnes <mbarnes@redhat.com>
Sun, 12 Aug 2012 17:52:58 +0000 (13:52 -0400)
committerMatthew Barnes <mbarnes@redhat.com>
Sun, 12 Aug 2012 17:55:32 +0000 (13:55 -0400)
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.

37 files changed:
camel/camel-disco-folder.c
camel/camel-disco-store.c
camel/camel-imapx-conn-manager.c
camel/camel-imapx-folder.c
camel/camel-imapx-server.c
camel/camel-imapx-store.c
camel/camel-imapx-utils.c
camel/camel-network-service.c
camel/camel-offline-folder.c
camel/camel-offline-store.c
camel/camel-sasl-cram-md5.c
camel/camel-sasl-digest-md5.c
camel/camel-sasl-gssapi.c
camel/camel-sasl-login.c
camel/camel-sasl-ntlm.c
camel/camel-sasl-plain.c
camel/camel-service.c
camel/camel-service.h
camel/providers/imap/camel-imap-command.c
camel/providers/imap/camel-imap-folder.c
camel/providers/imap/camel-imap-store.c
camel/providers/imap/camel-imap-wrapper.c
camel/providers/local/camel-local-folder.c
camel/providers/local/camel-local-store.c
camel/providers/local/camel-maildir-folder.c
camel/providers/local/camel-maildir-store.c
camel/providers/local/camel-mbox-store.c
camel/providers/local/camel-mh-store.c
camel/providers/local/camel-spool-folder.c
camel/providers/local/camel-spool-store.c
camel/providers/nntp/camel-nntp-folder.c
camel/providers/nntp/camel-nntp-store.c
camel/providers/nntp/camel-nntp-summary.c
camel/providers/pop3/camel-pop3-folder.c
camel/providers/pop3/camel-pop3-store.c
camel/providers/smtp/camel-smtp-transport.c
docs/reference/camel/camel-sections.txt

index 9f54f68..368854f 100644 (file)
@@ -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;
 
index 54df118..f13ca90 100644 (file)
@@ -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) {
index 1a721f6..916ef78 100644 (file)
@@ -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;
index ab78c46..089ff01 100644 (file)
@@ -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++;
index ead3166..bf5561e 100644 (file)
@@ -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);
index 2875649..f482217 100644 (file)
@@ -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,
index 9fc871a..408f760 100644 (file)
@@ -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;
index b600c3f..2396c85 100644 (file)
@@ -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);
 
index e092117..0a4af88 100644 (file)
@@ -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));
 
index a3b94e0..f54df73 100644 (file)
@@ -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;
index ebe4402..d409b97 100644 (file)
@@ -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);
index cb48b28..4114b9f 100644 (file)
@@ -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)
index 62c8885..75745e2 100644 (file)
@@ -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)
index a80b302..78510d4 100644 (file)
@@ -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);
index 4012b04..1b3ef79 100644 (file)
@@ -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, '\\');
index 1f04e48..2340642 100644 (file)
@@ -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);
index a0350f2..b069c4d 100644 (file)
@@ -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");
 }
index 3d17795..f3714aa 100644 (file)
@@ -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);
index 5f11957..9815f85 100644 (file)
@@ -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;
index fc30f31..427a6db 100644 (file)
@@ -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");
index 5d95e5c..1ce6bb8 100644 (file)
@@ -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)->
index 6e0c78b..defd169 100644 (file)
@@ -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;
index a90edd7..037c0d1 100644 (file)
@@ -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");
index 48421a8..033d8e5 100644 (file)
@@ -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);
index 22a7b6e..2f573c8 100644 (file)
@@ -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;
 
index db00da6..d589941 100644 (file)
@@ -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));
index e7ab514..4e400a4 100644 (file)
@@ -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);
index acdb963..27f7328 100644 (file)
@@ -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 (
index 1c085e4..16089c7 100644 (file)
@@ -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 (
index 29d7cc9..7b53997 100644 (file)
@@ -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)) {
index f7f792c..3d775f8 100644 (file)
@@ -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,
index 0974dcb..4d2827e 100644 (file)
@@ -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) {
index fa7c9ad..a2189b3 100644 (file)
@@ -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);
 
index e50f3f4..a469746 100644 (file)
@@ -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) {
index c764f2d..354f174 100644 (file)
@@ -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);
index 8903681..d2e15e8 100644 (file)
@@ -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;
index 6cc85a6..16f62a4 100644 (file)
@@ -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