From 5e067eea61ea1a3b8300525e2a10486279c2fe17 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Thu, 30 Aug 2012 15:11:14 -0400 Subject: [PATCH] CamelIMAPXServer: Add a "store" construct-only property. Keep a private weak reference to a CamelIMAPXStore and access it with camel_imapx_server_ref_store(). --- camel/camel-imapx-conn-manager.c | 5 +- camel/camel-imapx-server.c | 276 +++++++++++++++++++++----------- camel/camel-imapx-server.h | 10 +- camel/camel-imapx-store.c | 2 +- docs/reference/camel/camel-sections.txt | 1 + 5 files changed, 192 insertions(+), 102 deletions(-) diff --git a/camel/camel-imapx-conn-manager.c b/camel/camel-imapx-conn-manager.c index 51f7758..7a75a87 100644 --- a/camel/camel-imapx-conn-manager.c +++ b/camel/camel-imapx-conn-manager.c @@ -573,19 +573,18 @@ imapx_create_new_connection_unlocked (CamelIMAPXConnManager *con_man, { CamelIMAPXServer *is = NULL; CamelIMAPXStore *imapx_store; - CamelStore *store = con_man->priv->store; ConnectionInfo *cinfo = NULL; gboolean success; /* Caller must be holding CON_WRITE_LOCK. */ - imapx_store = CAMEL_IMAPX_STORE (store); + imapx_store = CAMEL_IMAPX_STORE (con_man->priv->store); /* Check if we got cancelled while we were waiting. */ if (g_cancellable_set_error_if_cancelled (cancellable, error)) return NULL; - is = camel_imapx_server_new (store); + is = camel_imapx_server_new (imapx_store); /* XXX As part of the connect operation the CamelIMAPXServer will * have to call camel_session_authenticate_sync(), but it has diff --git a/camel/camel-imapx-server.c b/camel/camel-imapx-server.c index 88ce604..817c7ea 100644 --- a/camel/camel-imapx-server.c +++ b/camel/camel-imapx-server.c @@ -292,6 +292,8 @@ static const CamelIMAPXUntaggedRespHandlerDesc _untagged_descr[] = { }; struct _CamelIMAPXServerPrivate { + GWeakRef store; + CamelIMAPXServerUntaggedContext *context; GHashTable *untagged_handlers; @@ -301,7 +303,8 @@ struct _CamelIMAPXServerPrivate { enum { PROP_0, - PROP_STREAM + PROP_STREAM, + PROP_STORE }; enum { @@ -1437,8 +1440,8 @@ imapx_untagged_namespace (CamelIMAPXServer *is, GError **error) { CamelIMAPXNamespaceList *nsl = NULL; - CamelIMAPXStore *imapx_store = NULL; CamelIMAPXStoreNamespace *ns = NULL; + CamelIMAPXStore *store; g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); /* cancellable may be NULL */ @@ -1448,21 +1451,23 @@ imapx_untagged_namespace (CamelIMAPXServer *is, if (nsl == NULL) return FALSE; - imapx_store = (CamelIMAPXStore *) is->store; + store = camel_imapx_server_ref_store (is); - if (imapx_store->summary->namespaces) - camel_imapx_namespace_list_clear (imapx_store->summary->namespaces); - imapx_store->summary->namespaces = nsl; - camel_store_summary_touch ((CamelStoreSummary *) imapx_store->summary); + if (store->summary->namespaces) + camel_imapx_namespace_list_clear (store->summary->namespaces); + store->summary->namespaces = nsl; + camel_store_summary_touch (CAMEL_STORE_SUMMARY (store->summary)); - /* TODO Need to remove imapx_store->dir_sep to support multiple namespaces */ + /* TODO Need to remove store->dir_sep to support multiple namespaces */ ns = nsl->personal; if (ns) { - imapx_store->dir_sep = ns->sep; - if (!imapx_store->dir_sep) - imapx_store->dir_sep = '/'; + store->dir_sep = ns->sep; + if (!store->dir_sep) + store->dir_sep = '/'; } + g_object_unref (store); + return TRUE; } @@ -1826,18 +1831,21 @@ imapx_untagged_status (CamelIMAPXServer *is, GCancellable *cancellable, GError **error) { + CamelIMAPXStore *store; struct _state_info *sinfo = NULL; g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); /* cancellable may be NULL */ g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + store = camel_imapx_server_ref_store (is); + sinfo = imapx_parse_status_info (stream, cancellable, error); if (sinfo) { - CamelIMAPXStoreSummary *s = ((CamelIMAPXStore *) is->store)->summary; + CamelIMAPXStoreSummary *s = store->summary; CamelIMAPXStoreNamespace *ns; - CamelIMAPXFolder *ifolder = NULL;; + CamelFolder *folder = NULL; ns = camel_imapx_store_summary_namespace_find_full (s, sinfo->name); if (ns) { @@ -1846,19 +1854,22 @@ imapx_untagged_status (CamelIMAPXServer *is, path_name = camel_imapx_store_summary_full_to_path (s, sinfo->name, ns->sep); c (is->tagprefix, "Got folder path '%s' for full '%s'\n", path_name, sinfo->name); if (path_name) { - ifolder = (gpointer) camel_store_get_folder_sync (is->store, path_name, 0, cancellable, error); + folder = camel_store_get_folder_sync ( + CAMEL_STORE (store), + path_name, 0, cancellable, error); g_free (path_name); } } - if (ifolder) { - CamelFolder *cfolder = CAMEL_FOLDER (ifolder); + if (folder != NULL) { + CamelIMAPXFolder *ifolder; + ifolder = CAMEL_IMAPX_FOLDER (folder); ifolder->unread_on_server = sinfo->unseen; ifolder->exists_on_server = sinfo->messages; ifolder->modseq_on_server = sinfo->highestmodseq; ifolder->uidnext_on_server = sinfo->uidnext; ifolder->uidvalidity_on_server = sinfo->uidvalidity; - if (sinfo->uidvalidity && sinfo->uidvalidity != ((CamelIMAPXSummary *) cfolder->summary)->validity) + if (sinfo->uidvalidity && sinfo->uidvalidity != ((CamelIMAPXSummary *) folder->summary)->validity) invalidate_local_cache (ifolder, sinfo->uidvalidity); } else { c (is->tagprefix, "Received STATUS for unknown folder '%s'\n", sinfo->name); @@ -1868,6 +1879,8 @@ imapx_untagged_status (CamelIMAPXServer *is, g_free (sinfo); } + g_object_unref (store); + return TRUE; } @@ -1992,14 +2005,12 @@ imapx_untagged (CamelIMAPXServer *is, GCancellable *cancellable, GError **error) { - CamelService *service = NULL; - CamelSettings *settings = NULL; + CamelIMAPXStore *store; + CamelSettings *settings; guchar *p = NULL, c; const gchar *token = NULL; gboolean ok = FALSE; - service = CAMEL_SERVICE (is->store); - /* If is->priv->context is not NULL here, it basically means * that imapx_untagged() got called concurrently for the same * CamelIMAPXServer instance. Should this ever happen, then @@ -2008,13 +2019,15 @@ imapx_untagged (CamelIMAPXServer *is, g_return_val_if_fail (is->priv->context == NULL, FALSE); is->priv->context = g_new0 (CamelIMAPXServerUntaggedContext, 1); - settings = camel_service_ref_settings (service); + store = camel_imapx_server_ref_store (is); + settings = camel_service_ref_settings (CAMEL_SERVICE (store)); is->priv->context->lsub = FALSE; is->priv->context->fetch_order = camel_imapx_settings_get_fetch_order ( CAMEL_IMAPX_SETTINGS (settings)); g_object_unref (settings); + g_object_unref (store); e (is->tagprefix, "got untagged response\n"); is->priv->context->id = 0; @@ -3163,7 +3176,7 @@ connect_to_server_process (CamelIMAPXServer *is, CamelSettings *settings; CamelStream *cmd_stream; CamelStream *imapx_stream; - CamelService *service; + CamelIMAPXStore *store; CamelURL url; gint ret, i = 0; gchar *buf; @@ -3177,19 +3190,17 @@ connect_to_server_process (CamelIMAPXServer *is, memset (&url, 0, sizeof (CamelURL)); - service = CAMEL_SERVICE (is->store); - password = camel_service_get_password (service); - provider = camel_service_get_provider (service); + store = camel_imapx_server_ref_store (is); - settings = camel_service_ref_settings (service); + password = camel_service_get_password (CAMEL_SERVICE (store)); + provider = camel_service_get_provider (CAMEL_SERVICE (store)); + settings = camel_service_ref_settings (CAMEL_SERVICE (store)); 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); @@ -3209,6 +3220,9 @@ connect_to_server_process (CamelIMAPXServer *is, child_env[i++] = g_strdup_printf ("URLPASSWD=%s", password); child_env[i] = NULL; + g_object_unref (settings); + g_object_unref (store); + /* Now do %h, %u, etc. substitution in cmd */ buf = cmd_copy = g_strdup (cmd); @@ -3302,8 +3316,8 @@ imapx_connect_to_server (CamelIMAPXServer *is, CamelStream *tcp_stream = NULL; CamelStream *imapx_stream = NULL; CamelSockOptData sockopt; + CamelIMAPXStore *store; CamelSettings *settings; - CamelService *service; guint len; guchar *token; gint tok; @@ -3317,9 +3331,9 @@ imapx_connect_to_server (CamelIMAPXServer *is, gchar *shell_command = NULL; #endif - service = CAMEL_SERVICE (is->store); + store = camel_imapx_server_ref_store (is); - settings = camel_service_ref_settings (service); + settings = camel_service_ref_settings (CAMEL_SERVICE (store)); network_settings = CAMEL_NETWORK_SETTINGS (settings); host = camel_network_settings_dup_host (network_settings); @@ -3353,7 +3367,7 @@ imapx_connect_to_server (CamelIMAPXServer *is, #endif tcp_stream = camel_network_service_connect_sync ( - CAMEL_NETWORK_SERVICE (is->store), cancellable, error); + CAMEL_NETWORK_SERVICE (store), cancellable, error); if (tcp_stream == NULL) { success = FALSE; @@ -3531,6 +3545,8 @@ exit: g_free (host); + g_object_unref (store); + return success; } @@ -3541,10 +3557,11 @@ camel_imapx_server_authenticate (CamelIMAPXServer *is, GError **error) { CamelNetworkSettings *network_settings; + CamelIMAPXStore *store; + CamelService *service; CamelSettings *settings; CamelAuthenticationResult result; CamelIMAPXCommand *ic; - CamelService *service; CamelSasl *sasl = NULL; gchar *host; gchar *user; @@ -3553,8 +3570,9 @@ camel_imapx_server_authenticate (CamelIMAPXServer *is, CAMEL_IS_IMAPX_SERVER (is), CAMEL_AUTHENTICATION_REJECTED); - service = CAMEL_SERVICE (is->store); + store = camel_imapx_server_ref_store (is); + service = CAMEL_SERVICE (store); settings = camel_service_ref_settings (service); network_settings = CAMEL_NETWORK_SETTINGS (settings); @@ -3646,6 +3664,8 @@ exit: g_free (host); g_free (user); + g_object_unref (store); + return result; } @@ -3657,12 +3677,16 @@ imapx_reconnect (CamelIMAPXServer *is, CamelIMAPXCommand *ic; CamelService *service; CamelSession *session; + CamelIMAPXStore *store; CamelSettings *settings; gchar *mechanism; gboolean use_idle; gboolean use_qresync; + gboolean success = FALSE; - service = CAMEL_SERVICE (is->store); + store = camel_imapx_server_ref_store (is); + + service = CAMEL_SERVICE (store); session = camel_service_get_session (service); settings = camel_service_ref_settings (service); @@ -3734,10 +3758,9 @@ imapx_reconnect (CamelIMAPXServer *is, } else is->use_qresync = FALSE; - if (((CamelIMAPXStore *) is->store)->summary->namespaces == NULL) { + if (store->summary->namespaces == NULL) { CamelIMAPXNamespaceList *nsl = NULL; CamelIMAPXStoreNamespace *ns = NULL; - CamelIMAPXStore *imapx_store = (CamelIMAPXStore *) is->store; /* set a default namespace */ nsl = g_malloc0 (sizeof (CamelIMAPXNamespaceList)); @@ -3747,16 +3770,17 @@ imapx_reconnect (CamelIMAPXServer *is, ns->full_name = g_strdup (""); ns->sep = '/'; nsl->personal = ns; - imapx_store->summary->namespaces = nsl; + + store->summary->namespaces = nsl; /* FIXME needs to be identified from list response */ - imapx_store->dir_sep = ns->sep; + store->dir_sep = ns->sep; } is->state = IMAPX_INITIALISED; - g_free (mechanism); + success = TRUE; - return TRUE; + goto exit; exception: @@ -3767,9 +3791,12 @@ exception: is->cinfo = NULL; } +exit: g_free (mechanism); - return FALSE; + g_object_unref (store); + + return success; } /* ********************************************************************** */ @@ -4286,8 +4313,8 @@ imapx_command_step_fetch_done (CamelIMAPXServer *is, RefreshInfoData *data; gint i; gboolean success = TRUE; + CamelIMAPXStore *store; CamelSettings *settings; - CamelService *service; guint batch_count; gboolean mobile_mode; @@ -4302,9 +4329,8 @@ imapx_command_step_fetch_done (CamelIMAPXServer *is, ifolder = (CamelIMAPXFolder *) job->folder; isum = (CamelIMAPXSummary *) job->folder->summary; - service = CAMEL_SERVICE (is->store); - - settings = camel_service_ref_settings (service); + store = camel_imapx_server_ref_store (is); + settings = camel_service_ref_settings (CAMEL_SERVICE (store)); batch_count = camel_imapx_settings_get_batch_fetch_count ( CAMEL_IMAPX_SETTINGS (settings)); @@ -4312,6 +4338,7 @@ imapx_command_step_fetch_done (CamelIMAPXServer *is, CAMEL_IMAPX_SETTINGS (settings)); g_object_unref (settings); + g_object_unref (store); i = data->index; @@ -4432,7 +4459,7 @@ imapx_job_scan_changes_done (CamelIMAPXServer *is, GError **error) { CamelIMAPXJob *job; - CamelService *service; + CamelIMAPXStore *store; CamelSettings *settings; RefreshInfoData *data; guint uidset_size; @@ -4447,9 +4474,8 @@ imapx_job_scan_changes_done (CamelIMAPXServer *is, data->scan_changes = FALSE; - service = CAMEL_SERVICE (is->store); - - settings = camel_service_ref_settings (service); + store = camel_imapx_server_ref_store (is); + settings = camel_service_ref_settings (CAMEL_SERVICE (store)); uidset_size = camel_imapx_settings_get_batch_fetch_count ( CAMEL_IMAPX_SETTINGS (settings)); @@ -4457,6 +4483,7 @@ imapx_job_scan_changes_done (CamelIMAPXServer *is, CAMEL_IMAPX_SETTINGS (settings)); g_object_unref (settings); + g_object_unref (store); if (camel_imapx_command_set_error_if_failed (ic, error)) { g_prefix_error ( @@ -4616,19 +4643,19 @@ imapx_job_scan_changes_start (CamelIMAPXJob *job, { CamelIMAPXCommand *ic; RefreshInfoData *data; - CamelService *service; + CamelIMAPXStore *store; CamelSettings *settings; gboolean mobile_mode; gchar *uid = NULL; - service = CAMEL_SERVICE (is->store); - - settings = camel_service_ref_settings (service); + store = camel_imapx_server_ref_store (is); + settings = camel_service_ref_settings (CAMEL_SERVICE (store)); mobile_mode = camel_imapx_settings_get_mobile_mode ( CAMEL_IMAPX_SETTINGS (settings)); g_object_unref (settings); + g_object_unref (store); if (mobile_mode) uid = imapx_get_uid_from_index (job->folder->summary, 0); @@ -4751,7 +4778,7 @@ imapx_job_fetch_new_messages_start (CamelIMAPXJob *job, CamelIMAPXCommand *ic; CamelFolder *folder = job->folder; CamelIMAPXFolder *ifolder = (CamelIMAPXFolder *) folder; - CamelService *service; + CamelIMAPXStore *store; CamelSettings *settings; CamelSortType fetch_order; RefreshInfoData *data; @@ -4762,9 +4789,8 @@ imapx_job_fetch_new_messages_start (CamelIMAPXJob *job, data = camel_imapx_job_get_data (job); g_return_if_fail (data != NULL); - service = CAMEL_SERVICE (is->store); - - settings = camel_service_ref_settings (service); + store = camel_imapx_server_ref_store (is); + settings = camel_service_ref_settings (CAMEL_SERVICE (store)); fetch_order = camel_imapx_settings_get_fetch_order ( CAMEL_IMAPX_SETTINGS (settings)); @@ -4773,6 +4799,7 @@ imapx_job_fetch_new_messages_start (CamelIMAPXJob *job, CAMEL_IMAPX_SETTINGS (settings)); g_object_unref (settings); + g_object_unref (store); total = camel_folder_summary_count (folder->summary); diff = ifolder->exists_on_server - total; @@ -4833,7 +4860,7 @@ imapx_job_fetch_messages_start (CamelIMAPXJob *job, CamelFetchType ftype; gint fetch_limit; CamelSortType fetch_order; - CamelService *service; + CamelIMAPXStore *store; CamelSettings *settings; guint uidset_size; RefreshInfoData *data; @@ -4841,9 +4868,8 @@ imapx_job_fetch_messages_start (CamelIMAPXJob *job, data = camel_imapx_job_get_data (job); g_return_if_fail (data != NULL); - service = CAMEL_SERVICE (is->store); - - settings = camel_service_ref_settings (service); + store = camel_imapx_server_ref_store (is); + settings = camel_service_ref_settings (CAMEL_SERVICE (store)); fetch_order = camel_imapx_settings_get_fetch_order ( CAMEL_IMAPX_SETTINGS (settings)); @@ -4857,6 +4883,7 @@ imapx_job_fetch_messages_start (CamelIMAPXJob *job, CAMEL_IMAPX_SETTINGS (settings)); g_object_unref (settings); + g_object_unref (store); if (ftype == CAMEL_FETCH_NEW_MESSAGES || (ftype == CAMEL_FETCH_OLD_MESSAGES && total <=0 )) { @@ -4967,18 +4994,18 @@ imapx_job_refresh_info_start (CamelIMAPXJob *job, gboolean need_rescan = FALSE; gboolean is_selected = FALSE; gboolean can_qresync = FALSE; - CamelService *service; + CamelIMAPXStore *store; CamelSettings *settings; gboolean mobile_mode; - service = CAMEL_SERVICE (is->store); - - settings = camel_service_ref_settings (service); + store = camel_imapx_server_ref_store (is); + settings = camel_service_ref_settings (CAMEL_SERVICE (store)); mobile_mode = camel_imapx_settings_get_mobile_mode ( CAMEL_IMAPX_SETTINGS (settings)); g_object_unref (settings); + g_object_unref (store); full_name = camel_folder_get_full_name (folder); @@ -5384,15 +5411,17 @@ imapx_job_manage_subscription_start (CamelIMAPXJob *job, CamelIMAPXServer *is) { CamelIMAPXCommand *ic; + CamelIMAPXStore *store; ManageSubscriptionsData *data; gchar *encoded_fname = NULL; data = camel_imapx_job_get_data (job); g_return_if_fail (data != NULL); - encoded_fname = imapx_encode_folder_name ( - (CamelIMAPXStore *) is->store, - data->folder_name); + store = camel_imapx_server_ref_store (is); + + encoded_fname = imapx_encode_folder_name (store, data->folder_name); + if (data->subscribe) ic = camel_imapx_command_new ( is, "SUBSCRIBE", NULL, @@ -5408,6 +5437,8 @@ imapx_job_manage_subscription_start (CamelIMAPXJob *job, imapx_command_queue (is, ic); g_free (encoded_fname); + + g_object_unref (store); } /* ********************************************************************** */ @@ -5490,18 +5521,23 @@ imapx_job_delete_folder_start (CamelIMAPXJob *job, CamelIMAPXServer *is) { CamelIMAPXCommand *ic; + CamelIMAPXStore *store; DeleteFolderData *data; gchar *encoded_fname = NULL; data = camel_imapx_job_get_data (job); g_return_if_fail (data != NULL); - encoded_fname = imapx_encode_folder_name ((CamelIMAPXStore *) is->store, data->folder_name); + store = camel_imapx_server_ref_store (is); + + encoded_fname = imapx_encode_folder_name (store, data->folder_name); job->folder = camel_store_get_folder_sync ( - is->store, "INBOX", 0, job->cancellable, &job->error); + CAMEL_STORE (store), "INBOX", 0, + job->cancellable, &job->error); - /* make sure to-be-deleted folder is not selected by selecting INBOX for this operation */ + /* Make sure the to-be-deleted folder is not + * selected by selecting INBOX for this operation. */ ic = camel_imapx_command_new ( is, "DELETE", job->folder, "DELETE %s", encoded_fname); @@ -5511,6 +5547,8 @@ imapx_job_delete_folder_start (CamelIMAPXJob *job, imapx_command_queue (is, ic); g_free (encoded_fname); + + g_object_unref (store); } /* ********************************************************************** */ @@ -5544,17 +5582,21 @@ imapx_job_rename_folder_start (CamelIMAPXJob *job, CamelIMAPXServer *is) { CamelIMAPXCommand *ic; + CamelIMAPXStore *store; RenameFolderData *data; gchar *en_ofname = NULL, *en_nfname = NULL; data = camel_imapx_job_get_data (job); g_return_if_fail (data != NULL); + store = camel_imapx_server_ref_store (is); + job->folder = camel_store_get_folder_sync ( - is->store, "INBOX", 0, job->cancellable, &job->error); + CAMEL_STORE (store), "INBOX", 0, + job->cancellable, &job->error); - en_ofname = imapx_encode_folder_name ((CamelIMAPXStore *) is->store, data->old_folder_name); - en_nfname = imapx_encode_folder_name ((CamelIMAPXStore *) is->store, data->new_folder_name); + en_ofname = imapx_encode_folder_name (store, data->old_folder_name); + en_nfname = imapx_encode_folder_name (store, data->new_folder_name); ic = camel_imapx_command_new ( is, "RENAME", job->folder, @@ -5566,6 +5608,8 @@ imapx_job_rename_folder_start (CamelIMAPXJob *job, g_free (en_ofname); g_free (en_nfname); + + g_object_unref (store); } /* ********************************************************************** */ @@ -5648,8 +5692,8 @@ imapx_command_sync_changes_done (CamelIMAPXServer *is, CamelStore *parent_store; SyncChangesData *data; const gchar *full_name; - CamelService *service; CamelSettings *settings; + CamelIMAPXStore *store; gboolean mobile_mode; gboolean success = TRUE; @@ -5659,14 +5703,14 @@ imapx_command_sync_changes_done (CamelIMAPXServer *is, data = camel_imapx_job_get_data (job); g_return_val_if_fail (data != NULL, FALSE); - service = CAMEL_SERVICE (is->store); - - settings = camel_service_ref_settings (service); + store = camel_imapx_server_ref_store (is); + settings = camel_service_ref_settings (CAMEL_SERVICE (store)); mobile_mode = camel_imapx_settings_get_mobile_mode ( CAMEL_IMAPX_SETTINGS (settings)); g_object_unref (settings); + g_object_unref (store); job->commands--; @@ -6057,6 +6101,32 @@ join_helper (gpointer thread) } static void +imapx_server_set_store (CamelIMAPXServer *server, + CamelIMAPXStore *store) +{ + g_return_if_fail (CAMEL_IS_IMAPX_STORE (store)); + + g_weak_ref_set (&server->priv->store, store); +} + +static void +imapx_server_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_STORE: + imapx_server_set_store ( + CAMEL_IMAPX_SERVER (object), + g_value_get_object (value)); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void imapx_server_get_property (GObject *object, guint property_id, GValue *value, @@ -6069,6 +6139,13 @@ imapx_server_get_property (GObject *object, camel_imapx_server_ref_stream ( CAMEL_IMAPX_SERVER (object))); return; + + case PROP_STORE: + g_value_take_object ( + value, + camel_imapx_server_ref_store ( + CAMEL_IMAPX_SERVER (object))); + return; } G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -6104,10 +6181,7 @@ imapx_server_dispose (GObject *object) imapx_disconnect (server); - if (server->session != NULL) { - g_object_unref (server->session); - server->session = NULL; - } + g_weak_ref_set (&server->priv->store, NULL); /* Chain up to parent's dispose() method. */ G_OBJECT_CLASS (camel_imapx_server_parent_class)->dispose (object); @@ -6165,6 +6239,7 @@ camel_imapx_server_class_init (CamelIMAPXServerClass *class) g_type_class_add_private (class, sizeof (CamelIMAPXServerPrivate)); object_class = G_OBJECT_CLASS (class); + object_class->set_property = imapx_server_set_property; object_class->get_property = imapx_server_get_property; object_class->finalize = imapx_server_finalize; object_class->dispose = imapx_server_dispose; @@ -6184,6 +6259,18 @@ camel_imapx_server_class_init (CamelIMAPXServerClass *class) G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property ( + object_class, + PROP_STORE, + g_param_spec_object ( + "store", + "Store", + "IMAPX store for this server", + CAMEL_TYPE_IMAPX_STORE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + /** * CamelIMAPXServer::select_changed * @server: the #CamelIMAPXServer which emitted the signal @@ -6245,20 +6332,21 @@ camel_imapx_server_init (CamelIMAPXServer *is) } CamelIMAPXServer * -camel_imapx_server_new (CamelStore *store) +camel_imapx_server_new (CamelIMAPXStore *store) { - CamelService *service; - CamelSession *session; - CamelIMAPXServer *is; + g_return_val_if_fail (CAMEL_IS_IMAPX_STORE (store), NULL); - service = CAMEL_SERVICE (store); - session = camel_service_get_session (service); + return g_object_new ( + CAMEL_TYPE_IMAPX_SERVER, + "store", store, NULL); +} - is = g_object_new (CAMEL_TYPE_IMAPX_SERVER, NULL); - is->session = g_object_ref (session); - is->store = store; +CamelIMAPXStore * +camel_imapx_server_ref_store (CamelIMAPXServer *server) +{ + g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), NULL); - return is; + return g_weak_ref_get (&server->priv->store); } CamelIMAPXStream * diff --git a/camel/camel-imapx-server.h b/camel/camel-imapx-server.h index 631374c..06ef2ba 100644 --- a/camel/camel-imapx-server.h +++ b/camel/camel-imapx-server.h @@ -55,6 +55,9 @@ G_BEGIN_DECLS +/* Avoid a circular reference. */ +struct _CamelIMAPXStore; + typedef struct _CamelIMAPXServer CamelIMAPXServer; typedef struct _CamelIMAPXServerClass CamelIMAPXServerClass; typedef struct _CamelIMAPXServerPrivate CamelIMAPXServerPrivate; @@ -104,9 +107,6 @@ struct _CamelIMAPXServer { CamelObject parent; CamelIMAPXServerPrivate *priv; - CamelStore *store; - CamelSession *session; - /* Info about the current connection */ struct _capability_info *cinfo; gboolean is_process_stream; @@ -180,7 +180,9 @@ struct _CamelIMAPXServerClass { GType camel_imapx_server_get_type (void); CamelIMAPXServer * - camel_imapx_server_new (CamelStore *store); + camel_imapx_server_new (struct _CamelIMAPXStore *store); +struct _CamelIMAPXStore * + camel_imapx_server_ref_store (CamelIMAPXServer *is); CamelIMAPXStream * camel_imapx_server_ref_stream (CamelIMAPXServer *is); gboolean camel_imapx_server_connect (CamelIMAPXServer *is, diff --git a/camel/camel-imapx-store.c b/camel/camel-imapx-store.c index 93ba88a..02f56fa 100644 --- a/camel/camel-imapx-store.c +++ b/camel/camel-imapx-store.c @@ -277,7 +277,7 @@ imapx_query_auth_types_sync (CamelService *service, return NULL; } - server = camel_imapx_server_new (CAMEL_STORE (istore)); + server = camel_imapx_server_new (istore); stream = camel_imapx_server_ref_stream (server); if (stream != NULL) { diff --git a/docs/reference/camel/camel-sections.txt b/docs/reference/camel/camel-sections.txt index 098b94a..8357693 100644 --- a/docs/reference/camel/camel-sections.txt +++ b/docs/reference/camel/camel-sections.txt @@ -832,6 +832,7 @@ uidset_state CamelIMAPXServer CamelIMAPXServer camel_imapx_server_new +camel_imapx_server_ref_store camel_imapx_server_ref_stream camel_imapx_server_connect camel_imapx_server_authenticate -- 2.7.4