diff --git a/.evolution-data-server.metadata b/.evolution-data-server.metadata index 6154ef2..3874026 100644 --- a/.evolution-data-server.metadata +++ b/.evolution-data-server.metadata @@ -1 +1 @@ -ed72dab73b9c060a3c9c44568a1db8bf3f0d0496 SOURCES/evolution-data-server-3.12.11.tar.xz +35dbf7b64ee2c501533ad98ff25396ae8b6a0472 SOURCES/evolution-data-server-3.22.7.tar.xz diff --git a/.gitignore b/.gitignore index ce7e1be..76f55fd 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/evolution-data-server-3.12.11.tar.xz +SOURCES/evolution-data-server-3.22.7.tar.xz diff --git a/SOURCES/evolution-data-server-3.12.11-async-closures-thread-safety.patch b/SOURCES/evolution-data-server-3.12.11-async-closures-thread-safety.patch deleted file mode 100644 index e2abf75..0000000 --- a/SOURCES/evolution-data-server-3.12.11-async-closures-thread-safety.patch +++ /dev/null @@ -1,184 +0,0 @@ -diff -up evolution-data-server-3.12.11/camel/camel-async-closure.c.async-closures-thread-safety evolution-data-server-3.12.11/camel/camel-async-closure.c ---- evolution-data-server-3.12.11/camel/camel-async-closure.c.async-closures-thread-safety 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/camel-async-closure.c 2015-06-01 21:55:07.711600144 +0200 -@@ -54,6 +54,8 @@ struct _CamelAsyncClosure { - GMainLoop *loop; - GMainContext *context; - GAsyncResult *result; -+ gboolean finished; -+ GMutex lock; - }; - - /** -@@ -73,12 +75,26 @@ camel_async_closure_new (void) - closure = g_slice_new0 (CamelAsyncClosure); - closure->context = g_main_context_new (); - closure->loop = g_main_loop_new (closure->context, FALSE); -+ closure->finished = FALSE; -+ g_mutex_init (&closure->lock); - - g_main_context_push_thread_default (closure->context); - - return closure; - } - -+static gboolean -+camel_async_closure_unlock_mutex_cb (gpointer user_data) -+{ -+ CamelAsyncClosure *closure = user_data; -+ -+ g_return_val_if_fail (closure != NULL, FALSE); -+ -+ g_mutex_unlock (&closure->lock); -+ -+ return FALSE; -+} -+ - /** - * camel_async_closure_wait: - * @closure: a #CamelAsyncClosure -@@ -99,7 +115,22 @@ camel_async_closure_wait (CamelAsyncClos - { - g_return_val_if_fail (closure != NULL, NULL); - -- g_main_loop_run (closure->loop); -+ g_mutex_lock (&closure->lock); -+ if (closure->finished) { -+ g_mutex_unlock (&closure->lock); -+ } else { -+ GSource *idle_source; -+ -+ /* Unlock the closure->lock in the main loop, to ensure thread safety. -+ It should be processed before anything else, otherwise deadlock happens. */ -+ idle_source = g_idle_source_new (); -+ g_source_set_callback (idle_source, camel_async_closure_unlock_mutex_cb, closure, NULL); -+ g_source_set_priority (idle_source, G_PRIORITY_HIGH * 2); -+ g_source_attach (idle_source, closure->context); -+ g_source_unref (idle_source); -+ -+ g_main_loop_run (closure->loop); -+ } - - return closure->result; - } -@@ -122,8 +153,10 @@ camel_async_closure_free (CamelAsyncClos - g_main_loop_unref (closure->loop); - g_main_context_unref (closure->context); - -- if (closure->result != NULL) -- g_object_unref (closure->result); -+ g_mutex_lock (&closure->lock); -+ g_clear_object (&closure->result); -+ g_mutex_unlock (&closure->lock); -+ g_mutex_clear (&closure->lock); - - g_slice_free (CamelAsyncClosure, closure); - } -@@ -153,10 +186,15 @@ camel_async_closure_callback (GObject *s - - real_closure = closure; - -+ g_mutex_lock (&real_closure->lock); -+ - /* Replace any previous result. */ - if (real_closure->result != NULL) - g_object_unref (real_closure->result); - real_closure->result = g_object_ref (result); -+ real_closure->finished = TRUE; -+ -+ g_mutex_unlock (&real_closure->lock); - - g_main_loop_quit (real_closure->loop); - } -diff -up evolution-data-server-3.12.11/libedataserver/e-data-server-util.c.async-closures-thread-safety evolution-data-server-3.12.11/libedataserver/e-data-server-util.c ---- evolution-data-server-3.12.11/libedataserver/e-data-server-util.c.async-closures-thread-safety 2014-11-11 18:40:25.000000000 +0100 -+++ evolution-data-server-3.12.11/libedataserver/e-data-server-util.c 2015-06-01 21:55:07.712600137 +0200 -@@ -1523,6 +1523,8 @@ struct _EAsyncClosure { - GMainLoop *loop; - GMainContext *context; - GAsyncResult *result; -+ gboolean finished; -+ GMutex lock; - }; - - /** -@@ -1542,12 +1544,26 @@ e_async_closure_new (void) - closure = g_slice_new0 (EAsyncClosure); - closure->context = g_main_context_new (); - closure->loop = g_main_loop_new (closure->context, FALSE); -+ closure->finished = FALSE; -+ g_mutex_init (&closure->lock); - - g_main_context_push_thread_default (closure->context); - - return closure; - } - -+static gboolean -+e_async_closure_unlock_mutex_cb (gpointer user_data) -+{ -+ EAsyncClosure *closure = user_data; -+ -+ g_return_val_if_fail (closure != NULL, FALSE); -+ -+ g_mutex_unlock (&closure->lock); -+ -+ return FALSE; -+} -+ - /** - * e_async_closure_wait: - * @closure: an #EAsyncClosure -@@ -1568,7 +1584,22 @@ e_async_closure_wait (EAsyncClosure *clo - { - g_return_val_if_fail (closure != NULL, NULL); - -- g_main_loop_run (closure->loop); -+ g_mutex_lock (&closure->lock); -+ if (closure->finished) { -+ g_mutex_unlock (&closure->lock); -+ } else { -+ GSource *idle_source; -+ -+ /* Unlock the closure->lock in the main loop, to ensure thread safety. -+ It should be processed before anything else, otherwise deadlock happens. */ -+ idle_source = g_idle_source_new (); -+ g_source_set_callback (idle_source, e_async_closure_unlock_mutex_cb, closure, NULL); -+ g_source_set_priority (idle_source, G_PRIORITY_HIGH * 2); -+ g_source_attach (idle_source, closure->context); -+ g_source_unref (idle_source); -+ -+ g_main_loop_run (closure->loop); -+ } - - return closure->result; - } -@@ -1591,8 +1622,10 @@ e_async_closure_free (EAsyncClosure *clo - g_main_loop_unref (closure->loop); - g_main_context_unref (closure->context); - -- if (closure->result != NULL) -- g_object_unref (closure->result); -+ g_mutex_lock (&closure->lock); -+ g_clear_object (&closure->result); -+ g_mutex_unlock (&closure->lock); -+ g_mutex_clear (&closure->lock); - - g_slice_free (EAsyncClosure, closure); - } -@@ -1622,10 +1655,15 @@ e_async_closure_callback (GObject *objec - - real_closure = closure; - -+ g_mutex_lock (&real_closure->lock); -+ - /* Replace any previous result. */ - if (real_closure->result != NULL) - g_object_unref (real_closure->result); - real_closure->result = g_object_ref (result); -+ real_closure->finished = TRUE; -+ -+ g_mutex_unlock (&real_closure->lock); - - g_main_loop_quit (real_closure->loop); - } diff --git a/SOURCES/evolution-data-server-3.12.11-book-sqlite-left-outer-join.patch b/SOURCES/evolution-data-server-3.12.11-book-sqlite-left-outer-join.patch deleted file mode 100644 index 01b050a..0000000 --- a/SOURCES/evolution-data-server-3.12.11-book-sqlite-left-outer-join.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up evolution-data-server-3.12.11/addressbook/libedata-book/e-book-sqlite.c.book-sqlite-left-outer-join evolution-data-server-3.12.11/addressbook/libedata-book/e-book-sqlite.c ---- evolution-data-server-3.12.11/addressbook/libedata-book/e-book-sqlite.c.book-sqlite-left-outer-join 2015-06-19 10:58:15.805862676 +0200 -+++ evolution-data-server-3.12.11/addressbook/libedata-book/e-book-sqlite.c 2015-06-19 10:58:15.826862675 +0200 -@@ -5347,7 +5347,7 @@ ebsql_generate_select (EBookSqlite *ebsq - * WHERE email_list.value LIKE "boogieman%" - */ - ebsql_string_append_printf ( -- string, " JOIN %Q AS %s ON +%s.uid = summary.uid", -+ string, " LEFT OUTER JOIN %Q AS %s ON +%s.uid = summary.uid", - field->aux_table, - field->aux_table_symbolic, - field->aux_table_symbolic); diff --git a/SOURCES/evolution-data-server-3.12.11-caldav-daily-limit-exceeded.patch b/SOURCES/evolution-data-server-3.12.11-caldav-daily-limit-exceeded.patch deleted file mode 100644 index 92c6f28..0000000 --- a/SOURCES/evolution-data-server-3.12.11-caldav-daily-limit-exceeded.patch +++ /dev/null @@ -1,197 +0,0 @@ -diff -up evolution-data-server-3.12.11/calendar/backends/caldav/e-cal-backend-caldav.c.caldav-daily-limit-exceeded evolution-data-server-3.12.11/calendar/backends/caldav/e-cal-backend-caldav.c ---- evolution-data-server-3.12.11/calendar/backends/caldav/e-cal-backend-caldav.c.caldav-daily-limit-exceeded 2016-09-06 11:43:45.023286287 +0200 -+++ evolution-data-server-3.12.11/calendar/backends/caldav/e-cal-backend-caldav.c 2016-09-06 11:45:13.838282462 +0200 -@@ -130,7 +130,7 @@ struct _ECalBackendCalDAVPrivate { - * message than a generic 401 description. */ - GError *bearer_auth_error; - GMutex bearer_auth_error_lock; -- gboolean using_bearer_auth; -+ ESoupAuthBearer *using_bearer_auth; - }; - - /* Forward Declarations */ -@@ -597,7 +597,24 @@ status_code_to_result (SoupMessage *mess - break; - - case SOUP_STATUS_FORBIDDEN: -- g_propagate_error (perror, EDC_ERROR (AuthenticationRequired)); -+ if (cbdav->priv->using_bearer_auth && message->response_body && -+ message->response_body->data && message->response_body->length) { -+ gchar *body = g_strndup (message->response_body->data, message->response_body->length); -+ -+ /* Do not localize this string, it is returned by the server. */ -+ if (body && (e_util_strstrcase (body, "Daily Limit Exceeded") || -+ e_util_strstrcase (body, "https://console.developers.google.com/"))) { -+ /* Special-case this condition and provide this error up to the UI. */ -+ g_propagate_error (perror, -+ e_data_cal_create_error_fmt (OtherError, _("Failed to login to the server: %s"), body)); -+ } else { -+ g_propagate_error (perror, EDC_ERROR (AuthenticationRequired)); -+ } -+ -+ g_free (body); -+ } else { -+ g_propagate_error (perror, EDC_ERROR (AuthenticationRequired)); -+ } - break; - - case SOUP_STATUS_UNAUTHORIZED: -@@ -1044,7 +1061,11 @@ soup_authenticate (SoupSession *session, - extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; - auth_extension = e_source_get_extension (source, extension_name); - -- cbdav->priv->using_bearer_auth = E_IS_SOUP_AUTH_BEARER (auth); -+ if (E_IS_SOUP_AUTH_BEARER (auth)) { -+ g_warn_if_fail ((gpointer) cbdav->priv->using_bearer_auth == (gpointer) auth); -+ g_clear_object (&cbdav->priv->using_bearer_auth); -+ cbdav->priv->using_bearer_auth = g_object_ref (auth); -+ } - - if (retrying || cbdav->priv->force_ask_password) { - cbdav->priv->force_ask_password = !cbdav->priv->using_bearer_auth; -@@ -1070,6 +1091,34 @@ soup_authenticate (SoupSession *session, - /* ************************************************************************* */ - /* direct CalDAV server access functions */ - -+static gboolean -+caldav_backend_setup_bearer_auth (ECalBackendCalDAV *cbdav, -+ ESoupAuthBearer *bearer, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ ESource *source; -+ gchar *access_token = NULL; -+ gint expires_in_seconds = -1; -+ gboolean success; -+ -+ g_return_val_if_fail (E_IS_CAL_BACKEND_CALDAV (cbdav), FALSE); -+ g_return_val_if_fail (E_IS_SOUP_AUTH_BEARER (bearer), FALSE); -+ -+ source = e_backend_get_source (E_BACKEND (cbdav)); -+ -+ success = e_source_get_oauth2_access_token_sync ( -+ source, cancellable, &access_token, -+ &expires_in_seconds, error); -+ -+ if (success) -+ e_soup_auth_bearer_set_access_token (bearer, access_token, expires_in_seconds); -+ -+ g_free (access_token); -+ -+ return success; -+} -+ - static void - redirect_handler (SoupMessage *msg, - gpointer user_data) -@@ -1120,6 +1169,20 @@ send_and_handle_redirection (ECalBackend - if (new_location) - old_uri = soup_uri_to_string (soup_message_get_uri (msg), FALSE); - -+ if (cbdav->priv->using_bearer_auth && e_soup_auth_bearer_is_expired (cbdav->priv->using_bearer_auth)) { -+ GError *local_error = NULL; -+ -+ if (!caldav_backend_setup_bearer_auth (cbdav, cbdav->priv->using_bearer_auth, cancellable, &local_error)) { -+ if (local_error) { -+ soup_message_set_status_full (msg, SOUP_STATUS_BAD_REQUEST, local_error->message); -+ g_propagate_error (error, local_error); -+ } else { -+ soup_message_set_status (msg, SOUP_STATUS_BAD_REQUEST); -+ } -+ return; -+ } -+ } -+ - soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT); - soup_message_add_header_handler (msg, "got_body", "Location", G_CALLBACK (redirect_handler), cbdav->priv->session); - soup_message_headers_append (msg->request_headers, "Connection", "close"); -@@ -5238,6 +5301,7 @@ e_cal_backend_caldav_dispose (GObject *o - - g_clear_object (&priv->store); - g_clear_object (&priv->session); -+ g_clear_object (&priv->using_bearer_auth); - - /* Chain up to parent's dispose() method. */ - G_OBJECT_CLASS (parent_class)->dispose (object); -@@ -5304,8 +5368,6 @@ caldav_backend_initable_init (GInitable - ESourceWebdav *extension; - SoupAuth *soup_auth; - SoupURI *soup_uri; -- gchar *access_token = NULL; -- gint expires_in_seconds = -1; - - extension_name = E_SOURCE_EXTENSION_WEBDAV_BACKEND; - extension = e_source_get_extension (source, extension_name); -@@ -5315,21 +5377,17 @@ caldav_backend_initable_init (GInitable - E_TYPE_SOUP_AUTH_BEARER, - SOUP_AUTH_HOST, soup_uri->host, NULL); - -- success = e_source_get_oauth2_access_token_sync ( -- source, cancellable, &access_token, -- &expires_in_seconds, error); -+ success = caldav_backend_setup_bearer_auth (E_CAL_BACKEND_CALDAV (initable), -+ E_SOUP_AUTH_BEARER (soup_auth), cancellable, error); - - if (success) { -- e_soup_auth_bearer_set_access_token ( -- E_SOUP_AUTH_BEARER (soup_auth), -- access_token, expires_in_seconds); -+ priv->using_bearer_auth = g_object_ref (soup_auth); - - soup_auth_manager_use_auth ( - SOUP_AUTH_MANAGER (feature), - soup_uri, soup_auth); - } - -- g_free (access_token); - g_object_unref (soup_auth); - soup_uri_free (soup_uri); - } -diff -up evolution-data-server-3.12.11/libebackend/e-soup-auth-bearer.c.caldav-daily-limit-exceeded evolution-data-server-3.12.11/libebackend/e-soup-auth-bearer.c ---- evolution-data-server-3.12.11/libebackend/e-soup-auth-bearer.c.caldav-daily-limit-exceeded 2016-09-06 11:44:57.973283145 +0200 -+++ evolution-data-server-3.12.11/libebackend/e-soup-auth-bearer.c 2016-09-06 11:45:13.839282462 +0200 -@@ -52,17 +52,6 @@ G_DEFINE_TYPE ( - e_soup_auth_bearer, - SOUP_TYPE_AUTH) - --static gboolean --e_soup_auth_bearer_is_expired (ESoupAuthBearer *bearer) --{ -- gboolean expired = FALSE; -- -- if (bearer->priv->expiry != EXPIRY_INVALID) -- expired = (bearer->priv->expiry < time (NULL)); -- -- return expired; --} -- - static void - e_soup_auth_bearer_finalize (GObject *object) - { -@@ -193,3 +182,15 @@ e_soup_auth_bearer_set_access_token (ESo - SOUP_AUTH_IS_AUTHENTICATED); - } - -+gboolean -+e_soup_auth_bearer_is_expired (ESoupAuthBearer *bearer) -+{ -+ gboolean expired = TRUE; -+ -+ g_return_val_if_fail (E_IS_SOUP_AUTH_BEARER (bearer), TRUE); -+ -+ if (bearer->priv->expiry != EXPIRY_INVALID) -+ expired = (bearer->priv->expiry < time (NULL)); -+ -+ return expired; -+} -diff -up evolution-data-server-3.12.11/libebackend/e-soup-auth-bearer.h.caldav-daily-limit-exceeded evolution-data-server-3.12.11/libebackend/e-soup-auth-bearer.h ---- evolution-data-server-3.12.11/libebackend/e-soup-auth-bearer.h.caldav-daily-limit-exceeded 2016-09-06 11:45:05.941282802 +0200 -+++ evolution-data-server-3.12.11/libebackend/e-soup-auth-bearer.h 2016-09-06 11:45:13.839282462 +0200 -@@ -71,6 +71,7 @@ void e_soup_auth_bearer_set_access_toke - (ESoupAuthBearer *bearer, - const gchar *access_token, - gint expires_in_seconds); -+gboolean e_soup_auth_bearer_is_expired (ESoupAuthBearer *bearer); - - G_END_DECLS - diff --git a/SOURCES/evolution-data-server-3.12.11-caldav-password-ask-for-oauth.patch b/SOURCES/evolution-data-server-3.12.11-caldav-password-ask-for-oauth.patch deleted file mode 100644 index a2ccb15..0000000 --- a/SOURCES/evolution-data-server-3.12.11-caldav-password-ask-for-oauth.patch +++ /dev/null @@ -1,74 +0,0 @@ -diff -up evolution-data-server-3.12.11/calendar/backends/caldav/e-cal-backend-caldav.c.caldav-password-ask-for-oauth evolution-data-server-3.12.11/calendar/backends/caldav/e-cal-backend-caldav.c ---- evolution-data-server-3.12.11/calendar/backends/caldav/e-cal-backend-caldav.c.caldav-password-ask-for-oauth 2015-08-21 21:19:05.100977813 +0200 -+++ evolution-data-server-3.12.11/calendar/backends/caldav/e-cal-backend-caldav.c 2015-08-21 21:19:23.430977037 +0200 -@@ -130,6 +130,7 @@ struct _ECalBackendCalDAVPrivate { - * message than a generic 401 description. */ - GError *bearer_auth_error; - GMutex bearer_auth_error_lock; -+ gboolean using_bearer_auth; - }; - - /* Forward Declarations */ -@@ -558,6 +559,7 @@ status_code_to_result (SoupMessage *mess - GError **perror) - { - ECalBackendCalDAVPrivate *priv; -+ gchar *uri; - - g_return_val_if_fail (cbdav != NULL, FALSE); - g_return_val_if_fail (message != NULL, FALSE); -@@ -616,14 +618,17 @@ status_code_to_result (SoupMessage *mess - - default: - d (g_debug ("CalDAV:%s: Unhandled status code %d\n", G_STRFUNC, status_code)); -+ uri = soup_uri_to_string (soup_message_get_uri (message), FALSE); - g_propagate_error ( - perror, - e_data_cal_create_error_fmt ( - OtherError, -- _("Unexpected HTTP status code %d returned (%s)"), -+ _("Unexpected HTTP status code %d returned (%s) for URI: %s"), - message->status_code, - message->reason_phrase && *message->reason_phrase ? message->reason_phrase : -- (soup_status_get_phrase (message->status_code) ? soup_status_get_phrase (message->status_code) : _("Unknown error")))); -+ (soup_status_get_phrase (message->status_code) ? soup_status_get_phrase (message->status_code) : _("Unknown error")), -+ uri ? uri : "[null]")); -+ g_free (uri); - break; - } - -@@ -1039,12 +1044,14 @@ soup_authenticate (SoupSession *session, - extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; - auth_extension = e_source_get_extension (source, extension_name); - -+ cbdav->priv->using_bearer_auth = E_IS_SOUP_AUTH_BEARER (auth); -+ - if (retrying || cbdav->priv->force_ask_password) { -- cbdav->priv->force_ask_password = TRUE; -+ cbdav->priv->force_ask_password = !cbdav->priv->using_bearer_auth; - return; - } - -- if (E_IS_SOUP_AUTH_BEARER (auth)) { -+ if (cbdav->priv->using_bearer_auth) { - soup_authenticate_bearer (session, msg, auth, cbdav); - - /* do not send same password twice, but keep it for later use */ -@@ -5190,7 +5197,7 @@ caldav_try_password_sync (ESourceAuthent - - /* Busy lock is already acquired by caldav_do_open(). */ - -- if (cbdav->priv->force_ask_password) { -+ if (cbdav->priv->force_ask_password && !cbdav->priv->using_bearer_auth) { - cbdav->priv->force_ask_password = FALSE; - return E_SOURCE_AUTHENTICATION_REJECTED; - } -@@ -5202,7 +5209,7 @@ caldav_try_password_sync (ESourceAuthent - - if (local_error == NULL) { - result = E_SOURCE_AUTHENTICATION_ACCEPTED; -- } else if (g_error_matches (local_error, E_DATA_CAL_ERROR, AuthenticationFailed)) { -+ } else if (!cbdav->priv->using_bearer_auth && g_error_matches (local_error, E_DATA_CAL_ERROR, AuthenticationFailed)) { - result = E_SOURCE_AUTHENTICATION_REJECTED; - g_clear_error (&local_error); - } else { diff --git a/SOURCES/evolution-data-server-3.12.11-camel-connect-timeout.patch b/SOURCES/evolution-data-server-3.12.11-camel-connect-timeout.patch deleted file mode 100644 index ec4ed43..0000000 --- a/SOURCES/evolution-data-server-3.12.11-camel-connect-timeout.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -up evolution-data-server-3.12.11/camel/camel-network-service.c.camel-connect-timeout evolution-data-server-3.12.11/camel/camel-network-service.c ---- evolution-data-server-3.12.11/camel/camel-network-service.c.camel-connect-timeout 2016-06-17 09:27:10.095179041 +0200 -+++ evolution-data-server-3.12.11/camel/camel-network-service.c 2016-06-17 09:27:10.186179037 +0200 -@@ -634,6 +634,7 @@ network_service_connect_sync (CamelNetwo - g_return_val_if_fail (connectable != NULL, NULL); - - client = g_socket_client_new (); -+ g_socket_client_set_timeout (client, 90); - - g_signal_connect ( - client, "event", diff --git a/SOURCES/evolution-data-server-3.12.11-camel-imapx-folder-removed-on-refresh.patch b/SOURCES/evolution-data-server-3.12.11-camel-imapx-folder-removed-on-refresh.patch deleted file mode 100644 index 861be8c..0000000 --- a/SOURCES/evolution-data-server-3.12.11-camel-imapx-folder-removed-on-refresh.patch +++ /dev/null @@ -1,205 +0,0 @@ -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c.camel-imapx-folder-removed-on-refresh evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c.camel-imapx-folder-removed-on-refresh 2015-07-24 13:52:20.253840769 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c 2015-07-24 13:52:20.266840678 +0200 -@@ -468,7 +468,7 @@ imapx_store_process_mailbox_attributes ( - fi = imapx_store_build_folder_info (store, folder_path, flags); - - /* Figure out which signals to emit, if any. */ -- if (use_subscriptions) { -+ if (use_subscriptions || camel_imapx_namespace_get_category (camel_imapx_mailbox_get_namespace (mailbox)) != CAMEL_IMAPX_NAMESPACE_PERSONAL) { - /* If we are honoring folder subscriptions, then - * subscription changes are equivalent to folder - * creation / deletion as far as we're concerned. */ -@@ -1079,6 +1079,20 @@ get_folder_info_offline (CamelStore *sto - if (!si_is_match) - continue; - -+ if (!use_subscriptions && !(si->flags & CAMEL_STORE_INFO_FOLDER_SUBSCRIBED) && -+ !(flags & CAMEL_STORE_FOLDER_INFO_SUBSCRIPTION_LIST)) { -+ CamelIMAPXMailbox *mailbox; -+ -+ mailbox = camel_imapx_store_ref_mailbox (imapx_store, ((CamelIMAPXStoreInfo *) si)->mailbox_name); -+ if (!mailbox || camel_imapx_namespace_get_category (camel_imapx_mailbox_get_namespace (mailbox)) != CAMEL_IMAPX_NAMESPACE_PERSONAL) { -+ /* Skip unsubscribed mailboxes which are not in the Personal namespace */ -+ g_clear_object (&mailbox); -+ continue; -+ } -+ -+ g_clear_object (&mailbox); -+ } -+ - fi = imapx_store_build_folder_info ( - imapx_store, folder_path, 0); - fi->unread = si->unread; -@@ -1417,6 +1431,58 @@ imapx_store_remove_unknown_mailboxes_cb - } - - static gboolean -+imapx_store_mailbox_is_unknown (CamelIMAPXStore *imapx_store, -+ GPtrArray *store_infos, -+ const CamelIMAPXStoreInfo *to_check) -+{ -+ CamelIMAPXMailbox *mailbox; -+ gboolean is_unknown; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_STORE (imapx_store), FALSE); -+ g_return_val_if_fail (store_infos != NULL, FALSE); -+ -+ if (!to_check || !to_check->mailbox_name || !*to_check->mailbox_name) -+ return FALSE; -+ -+ mailbox = camel_imapx_store_ref_mailbox (imapx_store, to_check->mailbox_name); -+ -+ is_unknown = mailbox && camel_imapx_mailbox_get_state (mailbox) == CAMEL_IMAPX_MAILBOX_STATE_UNKNOWN; -+ -+ if (!mailbox && to_check->separator) { -+ CamelSettings *settings; -+ gboolean use_subscriptions; -+ gchar *mailbox_with_separator; -+ gint ii; -+ -+ settings = camel_service_ref_settings (CAMEL_SERVICE (imapx_store)); -+ use_subscriptions = camel_imapx_settings_get_use_subscriptions (CAMEL_IMAPX_SETTINGS (settings)); -+ g_object_unref (settings); -+ -+ mailbox_with_separator = g_strdup_printf ("%s%c", to_check->mailbox_name, to_check->separator); -+ -+ for (ii = 0; ii < store_infos->len; ii++) { -+ CamelIMAPXStoreInfo *si; -+ -+ si = g_ptr_array_index (store_infos, ii); -+ -+ if (si->mailbox_name && g_str_has_prefix (si->mailbox_name, mailbox_with_separator) && ( -+ !use_subscriptions || (((CamelStoreInfo *) si)->flags & CAMEL_STORE_INFO_FOLDER_SUBSCRIBED) != 0)) { -+ /* This can be a 'virtual' parent folder of some subscribed subfolder */ -+ break; -+ } -+ } -+ -+ is_unknown = ii == store_infos->len; -+ -+ g_free (mailbox_with_separator); -+ } -+ -+ g_clear_object (&mailbox); -+ -+ return is_unknown; -+} -+ -+static gboolean - sync_folders (CamelIMAPXStore *imapx_store, - const gchar *root_folder_path, - CamelStoreGetFolderInfoFlags flags, -@@ -1426,8 +1492,7 @@ sync_folders (CamelIMAPXStore *imapx_sto - { - CamelIMAPXServer *server; - GHashTable *folder_info_results; -- GPtrArray *array; -- guint ii; -+ gboolean update_folder_list; - gboolean success; - - server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, error); -@@ -1445,7 +1510,9 @@ sync_folders (CamelIMAPXStore *imapx_sto - * in imapx_store_process_mailbox_attributes(). */ - g_atomic_int_inc (&imapx_store->priv->syncing_folders); - -- if (!initial_setup && (!root_folder_path || !*root_folder_path)) { -+ update_folder_list = !initial_setup && (!root_folder_path || !*root_folder_path); -+ -+ if (update_folder_list) { - g_mutex_lock (&imapx_store->priv->mailboxes_lock); - g_hash_table_foreach (imapx_store->priv->mailboxes, imapx_store_mark_mailbox_unknown_cb, imapx_store); - g_mutex_unlock (&imapx_store->priv->mailboxes_lock); -@@ -1458,9 +1525,9 @@ sync_folders (CamelIMAPXStore *imapx_sto - } else { - gboolean have_folder_info_for_inbox; - -- /* XXX We only fetch personal mailboxes at this time. */ - success = fetch_folder_info_for_namespace_category ( -- imapx_store, server, CAMEL_IMAPX_NAMESPACE_PERSONAL, flags, -+ imapx_store, server, CAMEL_IMAPX_NAMESPACE_PERSONAL, flags | -+ (update_folder_list ? CAMEL_STORE_FOLDER_INFO_SUBSCRIBED : 0), - folder_info_results, cancellable, error); - - have_folder_info_for_inbox = -@@ -1481,53 +1548,41 @@ sync_folders (CamelIMAPXStore *imapx_sto - if (!success) - goto exit; - -- if (!initial_setup && (!root_folder_path || !*root_folder_path)) { -+ if (update_folder_list) { - g_mutex_lock (&imapx_store->priv->mailboxes_lock); - g_hash_table_foreach_remove (imapx_store->priv->mailboxes, imapx_store_remove_unknown_mailboxes_cb, imapx_store); - g_mutex_unlock (&imapx_store->priv->mailboxes_lock); - } - -- array = camel_store_summary_array (imapx_store->summary); -- -- for (ii = 0; ii < array->len; ii++) { -- CamelStoreInfo *si; -- CamelFolderInfo *fi; -- const gchar *mailbox_name; -- const gchar *si_path; -- gboolean pattern_match; -- -- si = g_ptr_array_index (array, ii); -- si_path = camel_store_info_path (imapx_store->summary, si); -- -- mailbox_name = ((CamelIMAPXStoreInfo *) si)->mailbox_name; -- if (mailbox_name == NULL || *mailbox_name == '\0') -- continue; -- -- pattern_match = -- (root_folder_path == NULL) || -- (*root_folder_path == '\0') || -- (g_str_has_prefix (si_path, root_folder_path)); -- if (!pattern_match) -- continue; -- -- fi = g_hash_table_lookup (folder_info_results, mailbox_name); -- -- if (fi == NULL) { -- gchar *dup_folder_path = g_strdup (si_path); -- -- if (dup_folder_path != NULL) { -- /* Do not unsubscribe from it, it influences UI for non-subscribable folders */ -- imapx_delete_folder_from_cache ( -- imapx_store, dup_folder_path, FALSE); -- g_free (dup_folder_path); -- } else { -- camel_store_summary_remove ( -- imapx_store->summary, si); -+ if (!root_folder_path || !*root_folder_path) { -+ GPtrArray *array; -+ guint ii; -+ -+ /* Finally update store's summary */ -+ array = camel_store_summary_array (imapx_store->summary); -+ for (ii = 0; array && ii < array->len; ii++) { -+ CamelStoreInfo *si; -+ const gchar *si_path; -+ -+ si = g_ptr_array_index (array, ii); -+ si_path = camel_store_info_path (imapx_store->summary, si); -+ -+ if (imapx_store_mailbox_is_unknown (imapx_store, array, (CamelIMAPXStoreInfo *) si)) { -+ gchar *dup_folder_path = g_strdup (si_path); -+ -+ if (dup_folder_path != NULL) { -+ /* Do not unsubscribe from it, it influences UI for non-subscribable folders */ -+ imapx_delete_folder_from_cache (imapx_store, dup_folder_path, FALSE); -+ g_free (dup_folder_path); -+ } else { -+ camel_store_summary_remove (imapx_store->summary, si); -+ } - } - } -+ -+ camel_store_summary_array_free (imapx_store->summary, array); - } - -- camel_store_summary_array_free (imapx_store->summary, array); - camel_store_summary_save (imapx_store->summary); - - exit: diff --git a/SOURCES/evolution-data-server-3.12.11-camel-maildir-migration.patch b/SOURCES/evolution-data-server-3.12.11-camel-maildir-migration.patch deleted file mode 100644 index 667234b..0000000 --- a/SOURCES/evolution-data-server-3.12.11-camel-maildir-migration.patch +++ /dev/null @@ -1,31 +0,0 @@ -diff -up evolution-data-server-3.12.11/camel/providers/local/camel-maildir-store.c.camel-maildir-migration evolution-data-server-3.12.11/camel/providers/local/camel-maildir-store.c ---- evolution-data-server-3.12.11/camel/providers/local/camel-maildir-store.c.camel-maildir-migration 2015-02-06 12:42:25.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/local/camel-maildir-store.c 2015-06-01 13:03:03.912521771 +0200 -@@ -202,11 +202,27 @@ maildir_store_get_folder_sync (CamelStor - CamelLocalSettings *local_settings; - CamelSettings *settings; - CamelService *service; -+ CamelMaildirStore *maildir_store; - gchar *name, *tmp, *cur, *new, *dir_name; - gchar *path; - struct stat st; - CamelFolder *folder = NULL; - -+ g_return_val_if_fail (CAMEL_IS_MAILDIR_STORE (store), NULL); -+ -+ maildir_store = CAMEL_MAILDIR_STORE (store); -+ -+ if (!maildir_store->priv->already_migrated && -+ maildir_store->priv->can_escape_dots) { -+ CamelFolderInfo *folder_info; -+ -+ /* Not interested in any errors here, this is to invoke folder -+ content migration only. */ -+ folder_info = camel_store_get_folder_info_sync (store, NULL, CAMEL_STORE_FOLDER_INFO_RECURSIVE, cancellable, NULL); -+ if (folder_info) -+ camel_folder_info_free (folder_info); -+ } -+ - service = CAMEL_SERVICE (store); - - settings = camel_service_ref_settings (service); diff --git a/SOURCES/evolution-data-server-3.12.11-camel-session-no-gtask.patch b/SOURCES/evolution-data-server-3.12.11-camel-session-no-gtask.patch deleted file mode 100644 index c42765f..0000000 --- a/SOURCES/evolution-data-server-3.12.11-camel-session-no-gtask.patch +++ /dev/null @@ -1,136 +0,0 @@ -diff -up evolution-data-server-3.12.11/camel/camel-session.c.camel-session-no-gtask evolution-data-server-3.12.11/camel/camel-session.c ---- evolution-data-server-3.12.11/camel/camel-session.c.camel-session-no-gtask 2014-06-06 16:08:31.000000000 +0200 -+++ evolution-data-server-3.12.11/camel/camel-session.c 2016-03-07 14:07:00.120347982 +0100 -@@ -96,6 +96,8 @@ struct _JobData { - CamelSessionCallback callback; - gpointer user_data; - GDestroyNotify notify; -+ GMainContext *main_context; -+ GError *error; - }; - - enum { -@@ -154,6 +156,10 @@ job_data_free (JobData *job_data) - { - g_object_unref (job_data->session); - g_object_unref (job_data->cancellable); -+ g_clear_error (&job_data->error); -+ -+ if (job_data->main_context) -+ g_main_context_unref (job_data->main_context); - - if (job_data->notify != NULL) - job_data->notify (job_data->user_data); -@@ -161,74 +167,65 @@ job_data_free (JobData *job_data) - g_slice_free (JobData, job_data); - } - --static void --session_finish_job_cb (GObject *source_object, -- GAsyncResult *result, -- gpointer unused) -+static gboolean -+session_finish_job_cb (gpointer user_data) - { -- GCancellable *cancellable; -- GError *local_error = NULL; -+ JobData *job_data = (JobData *) user_data; - -- cancellable = g_task_get_cancellable (G_TASK (result)); -- -- /* XXX Ignore the return value, this is just -- * to extract the GError if there is one. */ -- g_task_propagate_boolean (G_TASK (result), &local_error); -+ g_return_val_if_fail (job_data != NULL, FALSE); - - g_signal_emit ( -- CAMEL_SESSION (source_object), -+ job_data->session, - signals[JOB_FINISHED], 0, -- cancellable, local_error); -+ job_data->cancellable, job_data->error); - -- g_clear_error (&local_error); -+ return FALSE; - } - - static void --session_do_job_cb (GTask *task, -- gpointer source_object, -- gpointer task_data, -- GCancellable *cancellable) -+session_job_thread (gpointer data, -+ gpointer user_data) - { -- JobData *job_data; -- GError *local_error = NULL; -+ JobData *job_data = (JobData *) data; -+ GSource *source; - -- job_data = (JobData *) task_data; -+ g_return_if_fail (job_data != NULL); - - job_data->callback ( -- CAMEL_SESSION (source_object), -- cancellable, -+ job_data->session, -+ job_data->cancellable, - job_data->user_data, -- &local_error); -+ &job_data->error); - -- if (local_error != NULL) { -- g_task_return_error (task, local_error); -- } else { -- g_task_return_boolean (task, TRUE); -- } -+ source = g_idle_source_new (); -+ g_source_set_priority (source, G_PRIORITY_DEFAULT); -+ g_source_set_callback (source, session_finish_job_cb, job_data, (GDestroyNotify) job_data_free); -+ g_source_attach (source, job_data->main_context); -+ g_source_unref (source); - } - - static gboolean - session_start_job_cb (gpointer user_data) - { -+ static GThreadPool *job_pool = NULL; -+ static GMutex job_pool_mutex; - JobData *job_data = user_data; -- GTask *task; - - g_signal_emit ( - job_data->session, - signals[JOB_STARTED], 0, - job_data->cancellable); - -- task = g_task_new ( -- job_data->session, -- job_data->cancellable, -- session_finish_job_cb, NULL); -+ g_mutex_lock (&job_pool_mutex); -+ -+ if (!job_pool) -+ job_pool = g_thread_pool_new (session_job_thread, NULL, 20, FALSE, NULL); - -- g_task_set_task_data ( -- task, job_data, (GDestroyNotify) job_data_free); -+ job_data->main_context = g_main_context_ref_thread_default (); - -- g_task_run_in_thread (task, session_do_job_cb); -+ g_thread_pool_push (job_pool, job_data, NULL); - -- g_object_unref (task); -+ g_mutex_unlock (&job_pool_mutex); - - return FALSE; - } -@@ -1450,6 +1447,8 @@ camel_session_submit_job (CamelSession * - job_data->callback = callback; - job_data->user_data = user_data; - job_data->notify = notify; -+ job_data->main_context = NULL; -+ job_data->error = NULL; - - camel_session_idle_add ( - session, JOB_PRIORITY, diff --git a/SOURCES/evolution-data-server-3.12.11-camel-tohtml-extra-cr.patch b/SOURCES/evolution-data-server-3.12.11-camel-tohtml-extra-cr.patch deleted file mode 100644 index c430674..0000000 --- a/SOURCES/evolution-data-server-3.12.11-camel-tohtml-extra-cr.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff -up evolution-data-server-3.12.11/camel/camel-mime-filter-tohtml.c.camel-tohtml-extra-cr evolution-data-server-3.12.11/camel/camel-mime-filter-tohtml.c ---- evolution-data-server-3.12.11/camel/camel-mime-filter-tohtml.c.camel-tohtml-extra-cr 2014-09-01 10:07:00.000000000 +0200 -+++ evolution-data-server-3.12.11/camel/camel-mime-filter-tohtml.c 2015-05-26 14:52:34.607271983 +0200 -@@ -225,9 +225,14 @@ writeln (CamelMimeFilter *mime_filter, - } - /* otherwise, FALL THROUGH */ - default: -- if (u >= 20 && u <0x80) -+ if (u == '\r' && inptr >= inend) { -+ /* This constructs \r\n sequence at the end of the line, thus pass it in -+ only if not converting the new-line breaks */ -+ if (!(priv->flags & CAMEL_MIME_FILTER_TOHTML_CONVERT_NL)) -+ *outptr++ = u; -+ } else if (u >= 20 && u <0x80) { - *outptr++ = u; -- else { -+ } else { - if (priv->flags & CAMEL_MIME_FILTER_TOHTML_ESCAPE_8BIT) - *outptr++ = '?'; - else diff --git a/SOURCES/evolution-data-server-3.12.11-camel-vfoler-message-delete-freeze.patch b/SOURCES/evolution-data-server-3.12.11-camel-vfoler-message-delete-freeze.patch deleted file mode 100644 index 7797d34..0000000 --- a/SOURCES/evolution-data-server-3.12.11-camel-vfoler-message-delete-freeze.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -up evolution-data-server-3.12.11/camel/camel-vee-summary.c.camel-vfoler-message-delete-freeze evolution-data-server-3.12.11/camel/camel-vee-summary.c ---- evolution-data-server-3.12.11/camel/camel-vee-summary.c.camel-vfoler-message-delete-freeze 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/camel-vee-summary.c 2015-09-07 15:02:12.699393738 +0200 -@@ -256,9 +256,7 @@ vee_info_set_flags (CamelMessageInfo *mi - if (ignore_changes) - camel_vee_folder_ignore_next_changed_event (vf, camel_folder_summary_get_folder (rmi->summary)); - -- camel_folder_freeze (camel_folder_summary_get_folder (rmi->summary)); - res = camel_message_info_set_flags (rmi, flags, set); -- camel_folder_thaw (camel_folder_summary_get_folder (rmi->summary)); - - if (res) { - /* update flags on itself too */ diff --git a/SOURCES/evolution-data-server-3.12.11-coverity-scan.patch b/SOURCES/evolution-data-server-3.12.11-coverity-scan.patch deleted file mode 100644 index 1fa6617..0000000 --- a/SOURCES/evolution-data-server-3.12.11-coverity-scan.patch +++ /dev/null @@ -1,277 +0,0 @@ -diff -up evolution-data-server-3.12.11/addressbook/backends/google/e-book-backend-google.c.coverity-scan evolution-data-server-3.12.11/addressbook/backends/google/e-book-backend-google.c ---- evolution-data-server-3.12.11/addressbook/backends/google/e-book-backend-google.c.coverity-scan 2015-05-28 19:51:23.209249835 +0200 -+++ evolution-data-server-3.12.11/addressbook/backends/google/e-book-backend-google.c 2015-05-28 19:51:29.810208047 +0200 -@@ -545,21 +545,15 @@ process_contact_finish (EBookBackend *ba - GDataEntry *entry) - { - EContact *new_contact; -- gboolean was_cached; - - g_debug (G_STRFUNC); - -- was_cached = cache_has_contact (backend, gdata_entry_get_id (entry)); - new_contact = cache_add_contact (backend, entry); - - if (!new_contact) - return; - -- if (was_cached == TRUE) { -- e_book_backend_notify_update (backend, new_contact); -- } else { -- e_book_backend_notify_update (backend, new_contact); -- } -+ e_book_backend_notify_update (backend, new_contact); - - g_object_unref (new_contact); - } -diff -up evolution-data-server-3.12.11/addressbook/libebook-contacts/e-vcard.c.coverity-scan evolution-data-server-3.12.11/addressbook/libebook-contacts/e-vcard.c ---- evolution-data-server-3.12.11/addressbook/libebook-contacts/e-vcard.c.coverity-scan 2014-04-23 14:37:03.000000000 +0200 -+++ evolution-data-server-3.12.11/addressbook/libebook-contacts/e-vcard.c 2015-05-28 19:50:57.068415329 +0200 -@@ -1337,7 +1337,7 @@ e_vcard_to_string_vcard_30 (EVCard *evc) - gchar *value = v->data; - gchar *pval = value; - gboolean quotes = FALSE; -- while (*pval) { -+ while (pval && *pval) { - if (!g_unichar_isalnum (g_utf8_get_char (pval))) { - quotes = TRUE; - break; -diff -up evolution-data-server-3.12.11/addressbook/libedata-book/e-book-sqlite.c.coverity-scan evolution-data-server-3.12.11/addressbook/libedata-book/e-book-sqlite.c ---- evolution-data-server-3.12.11/addressbook/libedata-book/e-book-sqlite.c.coverity-scan 2015-05-28 19:50:57.061415373 +0200 -+++ evolution-data-server-3.12.11/addressbook/libedata-book/e-book-sqlite.c 2015-05-28 19:50:57.069415323 +0200 -@@ -2749,7 +2749,7 @@ ebsql_init_legacy_keys (EBookSqlite *ebs - } - - /* Repeat for 'sync_data' */ -- success = ebsql_exec_printf ( -+ success = success && ebsql_exec_printf ( - ebsql, "SELECT sync_data FROM folders WHERE folder_id = %Q", - get_string_cb, &sync_data, NULL, error, ebsql->priv->folderid); - -@@ -5265,6 +5265,7 @@ ebsql_generate_constraints (EBookSqlite - g_warn_if_fail (test->field != NULL); - - /* Generate the field test */ -+ /* coverity[var_deref_op] */ - generate_test_func (ebsql, string, test); - } - -diff -up evolution-data-server-3.12.11/addressbook/libedata-book/e-data-book-cursor.c.coverity-scan evolution-data-server-3.12.11/addressbook/libedata-book/e-data-book-cursor.c ---- evolution-data-server-3.12.11/addressbook/libedata-book/e-data-book-cursor.c.coverity-scan 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/addressbook/libedata-book/e-data-book-cursor.c 2015-05-28 19:50:57.069415323 +0200 -@@ -499,9 +499,13 @@ calculate_step_position (EDataBookCursor - gint results) - { - EDataBookCursorPrivate *priv = cursor->priv; -- gint new_position = priv->position; -+ gint new_position; - gint offset = results; - -+ g_return_if_fail (origin == E_BOOK_CURSOR_ORIGIN_CURRENT || -+ origin == E_BOOK_CURSOR_ORIGIN_BEGIN || -+ origin == E_BOOK_CURSOR_ORIGIN_END); -+ - /* If we didnt get as many contacts as asked for, it indicates that - * we've reached the end of the list (or beginning)... in this case - * we add 1 to the offset -diff -up evolution-data-server-3.12.11/calendar/libedata-cal/e-cal-backend-intervaltree.c.coverity-scan evolution-data-server-3.12.11/calendar/libedata-cal/e-cal-backend-intervaltree.c ---- evolution-data-server-3.12.11/calendar/libedata-cal/e-cal-backend-intervaltree.c.coverity-scan 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/calendar/libedata-cal/e-cal-backend-intervaltree.c 2015-05-28 19:50:57.069415323 +0200 -@@ -229,7 +229,7 @@ static void - fixup_min_max_fields (EIntervalTree *tree, - EIntervalNode *node) - { -- while (node != tree->priv->root) { -+ while (node && node != tree->priv->root) { - node->max = MAX (node->end, MAX (node->left->max, node->right->max)); - node->min = MIN (node->start, node->left->min); - -@@ -320,6 +320,9 @@ intervaltree_fixup_deletion (EIntervalTr - EIntervalNode *w; - - while ((!x->red) && (root != x)) { -+ if (!x->parent) -+ break; -+ - if (x == x->parent->left) { - w = x->parent->right; - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c.coverity-scan evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c.coverity-scan 2015-05-28 19:50:57.065415348 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c 2015-05-28 19:50:57.070415316 +0200 -@@ -1244,6 +1244,7 @@ imapx_command_start (CamelIMAPXServer *i - GCancellable *cancellable = NULL; - gboolean cp_continuation; - gboolean cp_literal_plus; -+ gboolean success; - GList *head; - gchar *string; - GError *local_error = NULL; -@@ -1309,13 +1310,13 @@ imapx_command_start (CamelIMAPXServer *i - string = g_strdup_printf ( - "%c%05u %s\r\n", is->tagprefix, ic->tag, cp->data); - g_mutex_lock (&is->priv->stream_lock); -- g_output_stream_write_all ( -+ success = g_output_stream_write_all ( - output_stream, string, strlen (string), - NULL, cancellable, &local_error); - g_mutex_unlock (&is->priv->stream_lock); - g_free (string); - -- if (local_error != NULL) -+ if (local_error != NULL || !success) - goto fail; - - while (is->literal == ic && cp_literal_plus) { -@@ -1345,7 +1346,7 @@ fail: - if (ic->complete != NULL) - ic->complete (is, ic); - -- g_error_free (local_error); -+ g_clear_error (&local_error); - - exit: - g_clear_object (&input_stream); -@@ -4307,7 +4308,9 @@ imapx_server_set_streams (CamelIMAPXServ - static void - imapx_server_child_process_setup (gpointer user_data) - { -+#ifdef TIOCNOTTY - gint fd; -+#endif /* TIOCNOTTY */ - - setsid (); - -@@ -4586,6 +4589,7 @@ connected: - - input_stream = camel_imapx_server_ref_input_stream (is); - -+ token = NULL; - tok = camel_imapx_input_stream_token ( - CAMEL_IMAPX_INPUT_STREAM (input_stream), - &token, &len, cancellable, error); -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store-summary.c.coverity-scan evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store-summary.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store-summary.c.coverity-scan 2014-05-22 08:45:46.000000000 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store-summary.c 2015-05-28 19:50:57.071415310 +0200 -@@ -187,6 +187,7 @@ imapx_store_summary_store_info_load (Cam - - if (camel_file_util_decode_string (in, &mailbox_name) == -1) { - camel_store_summary_info_unref (summary, si); -+ g_free (separator); - return NULL; - } - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-utils.c.coverity-scan evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-utils.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-utils.c.coverity-scan 2014-11-21 12:38:16.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-utils.c 2015-05-28 19:50:57.071415310 +0200 -@@ -841,8 +841,17 @@ imapx_parse_ext_optional (CamelIMAPXInpu - dinfo = g_malloc0 (sizeof (*dinfo)); - dinfo->refcount = 1; - /* should be string */ -- camel_imapx_input_stream_astring ( -- stream, &token, cancellable, NULL); -+ if (!camel_imapx_input_stream_astring (stream, &token, cancellable, &local_error)) { -+ camel_content_disposition_unref (dinfo); -+ if (!local_error) -+ g_set_error ( -+ &local_error, -+ CAMEL_IMAPX_ERROR, 1, -+ "expecting string"); -+ g_propagate_error (error, local_error); -+ -+ return NULL; -+ } - - dinfo->disposition = g_strdup ((gchar *) token); - imapx_parse_param_list ( -@@ -1039,14 +1048,20 @@ imapx_parse_address_list (CamelIMAPXInpu - addr = camel_header_address_new (); - addr->type = CAMEL_HEADER_ADDRESS_NAME; - camel_imapx_input_stream_nstring (stream, &token, cancellable, &local_error); -- if (local_error) -+ if (local_error) { -+ camel_header_address_unref (addr); - goto error; -+ } - - addr->name = g_strdup ((gchar *) token); - /* we ignore the route, nobody uses it in the real world */ - camel_imapx_input_stream_nstring (stream, &token, cancellable, &local_error); -- if (local_error) -+ if (local_error) { -+ camel_header_address_unref (addr); - goto error; -+ } -+ -+ mbox = NULL; - - /* [RFC-822] group syntax is indicated by a special - * form of address structure in which the host name -@@ -1057,18 +1072,23 @@ imapx_parse_address_list (CamelIMAPXInpu - * mailbox name field holds the group name phrase. */ - - camel_imapx_input_stream_nstring (stream, (guchar **) &mbox, cancellable, &local_error); -- if (local_error) -+ if (local_error) { -+ camel_header_address_unref (addr); - goto error; -+ } - - mbox = g_strdup (mbox); - - camel_imapx_input_stream_nstring (stream, &host, cancellable, &local_error); -- if (local_error) -+ if (local_error) { -+ camel_header_address_unref (addr); - goto error; -+ } - - if (host == NULL) { - if (mbox == NULL) { - group = NULL; -+ camel_header_address_unref (addr); - } else { - g_free (addr->name); - addr->name = mbox; -@@ -1319,10 +1339,7 @@ imapx_parse_body (CamelIMAPXInputStream - stream, tok, token, len); - } while (tok == '('); - -- camel_imapx_input_stream_astring ( -- stream, &token, cancellable, &local_error); -- -- if (local_error) -+ if (!camel_imapx_input_stream_astring (stream, &token, cancellable, &local_error) || local_error) - goto error; - - cinfo->type = camel_content_type_new ( -diff -up evolution-data-server-3.12.11/camel/providers/pop3/camel-pop3-store.c.coverity-scan evolution-data-server-3.12.11/camel/providers/pop3/camel-pop3-store.c ---- evolution-data-server-3.12.11/camel/providers/pop3/camel-pop3-store.c.coverity-scan 2014-11-21 12:38:16.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/pop3/camel-pop3-store.c 2015-05-28 19:50:57.071415310 +0200 -@@ -343,10 +343,10 @@ try_sasl (CamelPOP3Store *store, - if (strncmp ((gchar *) line, "+ ", 2) != 0 - || camel_sasl_get_authenticated (sasl) - || (resp = (guchar *) camel_sasl_challenge_base64_sync (sasl, (const gchar *) line + 2, cancellable, &local_error)) == NULL) { -- camel_stream_write_string ( -- CAMEL_STREAM (pop3_stream), "*\r\n", cancellable, NULL); -- /* coverity[unchecked_value] */ -- camel_pop3_stream_line (pop3_stream, &line, &len, cancellable, NULL); -+ if (camel_stream_write_string (CAMEL_STREAM (pop3_stream), "*\r\n", cancellable, NULL)) { -+ /* coverity[unchecked_value] */ -+ camel_pop3_stream_line (pop3_stream, &line, &len, cancellable, NULL); -+ } - - if (local_error) { - g_propagate_error (error, local_error); -diff -up evolution-data-server-3.12.11/tests/test-server-utils/e-test-server-utils.c.coverity-scan evolution-data-server-3.12.11/tests/test-server-utils/e-test-server-utils.c ---- evolution-data-server-3.12.11/tests/test-server-utils/e-test-server-utils.c.coverity-scan 2014-06-01 21:10:19.000000000 +0200 -+++ evolution-data-server-3.12.11/tests/test-server-utils/e-test-server-utils.c 2015-05-28 19:50:57.071415310 +0200 -@@ -375,7 +375,7 @@ e_test_server_utils_source_added (ESourc - - if (!pair->closure->use_async_connect && - !pair->fixture->service.book_client) -- g_error ("Unable to create the test book: %s", error->message); -+ g_error ("Unable to create the test book: %s", error ? error->message : "Unknown error"); - - break; - diff --git a/SOURCES/evolution-data-server-3.12.11-foreign-key-constraint-failed.patch b/SOURCES/evolution-data-server-3.12.11-foreign-key-constraint-failed.patch deleted file mode 100644 index e155f7d..0000000 --- a/SOURCES/evolution-data-server-3.12.11-foreign-key-constraint-failed.patch +++ /dev/null @@ -1,96 +0,0 @@ -diff --git a/addressbook/libedata-book/e-book-sqlite.c b/addressbook/libedata-book/e-book-sqlite.c -index e3770fe..64449db 100644 ---- a/addressbook/libedata-book/e-book-sqlite.c -+++ b/addressbook/libedata-book/e-book-sqlite.c -@@ -246,7 +246,7 @@ ebsql_init_debug (void) - } \ - } G_STMT_END - --#define FOLDER_VERSION 8 -+#define FOLDER_VERSION 9 - #define INSERT_MULTI_STMT_BYTES 128 - #define COLUMN_DEFINITION_BYTES 32 - #define GENERATED_QUERY_BYTES 1024 -@@ -2075,7 +2075,7 @@ format_multivalues (EBookSqlite *ebsql) - } - } - -- return g_string_free (string, FALSE); -+ return g_string_free (string, string->len == 0); - } - - /* Called with the lock held and inside a transaction */ -@@ -2109,6 +2109,23 @@ ebsql_add_folder (EBookSqlite *ebsql, - return success; - } - -+static gboolean -+ebsql_email_list_exists (EBookSqlite *ebsql) -+{ -+ gint n_tables = 0; -+ gboolean success; -+ -+ success = ebsql_exec_printf ( -+ ebsql, "SELECT count(*) FROM sqlite_master WHERE type='table' AND name='%q_email_list';", -+ get_count_cb, &n_tables, NULL, NULL, -+ ebsql->priv->folderid); -+ -+ if (!success) -+ return FALSE; -+ -+ return n_tables == 1; -+} -+ - /* Called with the lock held and inside a transaction */ - static gboolean - ebsql_introspect_summary (EBookSqlite *ebsql, -@@ -2225,6 +2242,19 @@ ebsql_introspect_summary (EBookSqlite *ebsql, - if (!success) - goto introspect_summary_finish; - -+ if (!multivalues || !*multivalues) { -+ g_free (multivalues); -+ multivalues = NULL; -+ -+ /* The migration from a previous version didn't store this default multivalue -+ reference, thus the next backend open (not the immediate one after migration), -+ didn't know about this table, which has a FOREIGN KEY constraint, thus an item -+ delete caused a 'FOREIGN KEY constraint failed' error. -+ */ -+ if (ebsql_email_list_exists (ebsql)) -+ multivalues = g_strdup ("email;prefix"); -+ } -+ - if (multivalues) { - gchar **fields = g_strsplit (multivalues, ":", 0); - -@@ -2524,6 +2554,20 @@ ebsql_init_aux_tables (EBookSqlite *ebsql, - field->aux_table)); - } - -+ if (success) { -+ gchar *multivalues; -+ -+ multivalues = format_multivalues (ebsql); -+ -+ success = ebsql_exec_printf ( -+ ebsql, -+ "UPDATE folders SET multivalues=%Q WHERE folder_id=%Q", -+ NULL, NULL, NULL, error, -+ multivalues, ebsql->priv->folderid); -+ -+ g_free (multivalues); -+ } -+ - EBSQL_NOTE ( - SCHEMA, - g_printerr ( -@@ -2770,7 +2814,7 @@ ebsql_init_locale (EBookSqlite *ebsql, - /* Check if we need to relocalize */ - if (success) { - /* Need to relocalize the whole thing if the schema has been upgraded to version 7 */ -- if (previous_schema >= 1 && previous_schema < 7) -+ if (previous_schema >= 1 && previous_schema < 9) - relocalize_needed = TRUE; - - /* We may need to relocalize for a country code change */ diff --git a/SOURCES/evolution-data-server-3.12.11-glib2-rebase-fix.patch b/SOURCES/evolution-data-server-3.12.11-glib2-rebase-fix.patch deleted file mode 100644 index b2f9ac4..0000000 --- a/SOURCES/evolution-data-server-3.12.11-glib2-rebase-fix.patch +++ /dev/null @@ -1,232 +0,0 @@ -diff -up evolution-data-server-3.12.11/libedataserver/e-source-camel.c.glib2-rebase-fix evolution-data-server-3.12.11/libedataserver/e-source-camel.c ---- evolution-data-server-3.12.11/libedataserver/e-source-camel.c.glib2-rebase-fix 2014-07-17 12:13:22.000000000 +0200 -+++ evolution-data-server-3.12.11/libedataserver/e-source-camel.c 2016-04-07 22:45:29.954493016 +0200 -@@ -126,12 +126,7 @@ G_DEFINE_ABSTRACT_TYPE ( - e_source_camel, - E_TYPE_SOURCE_EXTENSION) - --/* XXX A function like this belongs in GObject. I may yet propose it, -- * GParamSpecClass still has some reserved slots. This fiddles with -- * GParamSpec fields that are supposed to be private to GObject, but -- * I have no other choice. -- * -- * XXX Historical note, originally I tried (ab)using override properties -+/* XXX Historical note, originally I tried (ab)using override properties - * in ESourceCamel, which redirected to the equivalent CamelSettings - * property. Seemed to work at first, and I was proud of my clever - * hack, but it turns out g_object_class_list_properties() excludes -@@ -140,54 +135,158 @@ G_DEFINE_ABSTRACT_TYPE ( - static GParamSpec * - param_spec_clone (GParamSpec *pspec) - { -- GParamSpec *clone; -- GTypeQuery query; -- -- /* Query the instance size. */ -- g_type_query (G_PARAM_SPEC_TYPE (pspec), &query); -- -- /* Start with a memcpy()'d buffer. */ -- clone = g_slice_alloc0 (query.instance_size); -- memcpy (clone, pspec, query.instance_size); -- -- /* This sort of mimics g_param_spec_init(). */ -- --#define PARAM_FLOATING_FLAG 0x2 /* from gparam.c */ -- g_datalist_set_flags (&clone->qdata, PARAM_FLOATING_FLAG); -- clone->ref_count = 1; -- -- /* Clear the owner_type. */ -- clone->owner_type = G_TYPE_INVALID; -- -- /* Clear the param_id. */ -- clone->param_id = 0; -- -- /* This sort of mimics g_param_spec_internal(). */ -- -- /* Param name should already be canonicalized and interned. */ -- -- /* Always copy the nickname. */ -- clone->flags &= ~G_PARAM_STATIC_NICK; -- clone->_nick = g_strdup (g_param_spec_get_nick (pspec)); -- -- /* Always copy the blurb. */ -- clone->flags &= ~G_PARAM_STATIC_BLURB; -- clone->_blurb = g_strdup (g_param_spec_get_blurb (pspec)); -- -- /* Handle special cases. */ -- -- if (G_IS_PARAM_SPEC_STRING (clone)) { -- GParamSpecString *clone_s; -- -- clone_s = (GParamSpecString *) clone; -- clone_s->default_value = g_strdup (clone_s->default_value); -+ GParamSpec *clone = NULL; -+ GParamFlags flags; -+ const gchar *name, *nick, *blurb; -+ -+ name = g_param_spec_get_name (pspec); -+ nick = g_param_spec_get_nick (pspec); -+ blurb = g_param_spec_get_blurb (pspec); -+ flags = (pspec->flags & ~(G_PARAM_STATIC_STRINGS)); -+ -+ if (G_IS_PARAM_SPEC_BOOLEAN (pspec)) { -+ GParamSpecBoolean *pspec_boolean = G_PARAM_SPEC_BOOLEAN (pspec); -+ -+ clone = g_param_spec_boolean (name, nick, blurb, -+ pspec_boolean->default_value, -+ flags); -+ } else if (G_IS_PARAM_SPEC_CHAR (pspec)) { -+ GParamSpecChar *pspec_char = G_PARAM_SPEC_CHAR (pspec); -+ -+ clone = g_param_spec_char (name, nick, blurb, -+ pspec_char->minimum, -+ pspec_char->maximum, -+ pspec_char->default_value, -+ flags); -+ } else if (G_IS_PARAM_SPEC_UCHAR (pspec)) { -+ GParamSpecUChar *pspec_uchar = G_PARAM_SPEC_UCHAR (pspec); -+ -+ clone = g_param_spec_uchar (name, nick, blurb, -+ pspec_uchar->minimum, -+ pspec_uchar->maximum, -+ pspec_uchar->default_value, -+ flags); -+ } else if (G_IS_PARAM_SPEC_INT (pspec)) { -+ GParamSpecInt *pspec_int = G_PARAM_SPEC_INT (pspec); -+ -+ clone = g_param_spec_int (name, nick, blurb, -+ pspec_int->minimum, -+ pspec_int->maximum, -+ pspec_int->default_value, -+ flags); -+ } else if (G_IS_PARAM_SPEC_UINT (pspec)) { -+ GParamSpecUInt *pspec_uint = G_PARAM_SPEC_UINT (pspec); -+ -+ clone = g_param_spec_uint (name, nick, blurb, -+ pspec_uint->minimum, -+ pspec_uint->maximum, -+ pspec_uint->default_value, -+ flags); -+ } else if (G_IS_PARAM_SPEC_LONG (pspec)) { -+ GParamSpecLong *pspec_long = G_PARAM_SPEC_LONG (pspec); -+ -+ clone = g_param_spec_long (name, nick, blurb, -+ pspec_long->minimum, -+ pspec_long->maximum, -+ pspec_long->default_value, -+ flags); -+ } else if (G_IS_PARAM_SPEC_ULONG (pspec)) { -+ GParamSpecULong *pspec_ulong = G_PARAM_SPEC_ULONG (pspec); -+ -+ clone = g_param_spec_ulong (name, nick, blurb, -+ pspec_ulong->minimum, -+ pspec_ulong->maximum, -+ pspec_ulong->default_value, -+ flags); -+ } else if (G_IS_PARAM_SPEC_INT64 (pspec)) { -+ GParamSpecInt64 *pspec_int64 = G_PARAM_SPEC_INT64 (pspec); -+ -+ clone = g_param_spec_int64 (name, nick, blurb, -+ pspec_int64->minimum, -+ pspec_int64->maximum, -+ pspec_int64->default_value, -+ flags); -+ } else if (G_IS_PARAM_SPEC_UINT64 (pspec)) { -+ GParamSpecUInt64 *pspec_uint64 = G_PARAM_SPEC_UINT64 (pspec); -+ -+ clone = g_param_spec_uint64 (name, nick, blurb, -+ pspec_uint64->minimum, -+ pspec_uint64->maximum, -+ pspec_uint64->default_value, -+ flags); -+ } else if (G_IS_PARAM_SPEC_FLOAT (pspec)) { -+ GParamSpecFloat *pspec_float = G_PARAM_SPEC_FLOAT (pspec); -+ -+ clone = g_param_spec_float (name, nick, blurb, -+ pspec_float->minimum, -+ pspec_float->maximum, -+ pspec_float->default_value, -+ flags); -+ } else if (G_IS_PARAM_SPEC_DOUBLE (pspec)) { -+ GParamSpecDouble *pspec_double = G_PARAM_SPEC_DOUBLE (pspec); -+ -+ clone = g_param_spec_double (name, nick, blurb, -+ pspec_double->minimum, -+ pspec_double->maximum, -+ pspec_double->default_value, -+ flags); -+ } else if (G_IS_PARAM_SPEC_ENUM (pspec)) { -+ GParamSpecEnum *pspec_enum = G_PARAM_SPEC_ENUM (pspec); -+ -+ clone = g_param_spec_enum (name, nick, blurb, -+ pspec->value_type, -+ pspec_enum->default_value, -+ flags); -+ } else if (G_IS_PARAM_SPEC_FLAGS (pspec)) { -+ GParamSpecFlags *pspec_flags = G_PARAM_SPEC_FLAGS (pspec); -+ -+ clone = g_param_spec_flags (name, nick, blurb, -+ pspec->value_type, -+ pspec_flags->default_value, -+ flags); -+ } else if (G_IS_PARAM_SPEC_STRING (pspec)) { -+ GParamSpecString *pspec_string = G_PARAM_SPEC_STRING (pspec); -+ -+ clone = g_param_spec_string (name, nick, blurb, -+ pspec_string->default_value, -+ flags); -+ } else if (G_IS_PARAM_SPEC_PARAM (pspec)) { -+ clone = g_param_spec_param (name, nick, blurb, -+ pspec->value_type, -+ flags); -+ } else if (G_IS_PARAM_SPEC_BOXED (pspec)) { -+ clone = g_param_spec_boxed (name, nick, blurb, -+ pspec->value_type, -+ flags); -+ } else if (G_IS_PARAM_SPEC_POINTER (pspec)) { -+ clone = g_param_spec_pointer (name, nick, blurb, flags); -+ } else if (G_IS_PARAM_SPEC_OBJECT (pspec)) { -+ clone = g_param_spec_object (name, nick, blurb, -+ pspec->value_type, -+ flags); -+ } else if (G_IS_PARAM_SPEC_UNICHAR (pspec)) { -+ GParamSpecUnichar *pspec_unichar = G_PARAM_SPEC_UNICHAR (pspec); -+ -+ clone = g_param_spec_unichar (name, nick, blurb, -+ pspec_unichar->default_value, -+ flags); -+ } else if (G_IS_PARAM_SPEC_GTYPE (pspec)) { -+ GParamSpecGType *pspec_gtype = G_PARAM_SPEC_GTYPE (pspec); -+ -+ clone = g_param_spec_gtype (name, nick, blurb, -+ pspec_gtype->is_a_type, -+ flags); -+ } else if (G_IS_PARAM_SPEC_VARIANT (pspec)) { -+ GParamSpecVariant *pspec_variant = G_PARAM_SPEC_VARIANT (pspec); -+ -+ clone = g_param_spec_variant (name, nick, blurb, -+ pspec_variant->type, -+ pspec_variant->default_value, -+ flags); -+ } else { -+ g_warn_if_reached (); - } - -- /* Some types we don't handle but shouldn't need to. */ -- g_warn_if_fail (!G_IS_PARAM_SPEC_VALUE_ARRAY (clone)); -- g_warn_if_fail (!G_IS_PARAM_SPEC_OVERRIDE (clone)); -- g_warn_if_fail (!G_IS_PARAM_SPEC_VARIANT (clone)); -- - return clone; - } - -@@ -279,6 +378,9 @@ subclass_class_init (gpointer g_class, - continue; - - pspec = param_spec_clone (properties[ii]); -+ if (!pspec) -+ continue; -+ - pspec->flags |= E_SOURCE_PARAM_SETTING; - - /* Clear the G_PARAM_CONSTRUCT flag. We apply default diff --git a/SOURCES/evolution-data-server-3.12.11-goa-google-calendar-auth-method.patch b/SOURCES/evolution-data-server-3.12.11-goa-google-calendar-auth-method.patch deleted file mode 100644 index 46fcbcb..0000000 --- a/SOURCES/evolution-data-server-3.12.11-goa-google-calendar-auth-method.patch +++ /dev/null @@ -1,126 +0,0 @@ -diff -up evolution-data-server-3.12.11/modules/google-backend/module-google-backend.c.goa-google-calendar-auth-method evolution-data-server-3.12.11/modules/google-backend/module-google-backend.c ---- evolution-data-server-3.12.11/modules/google-backend/module-google-backend.c.goa-google-calendar-auth-method 2016-04-13 13:51:48.862364981 +0200 -+++ evolution-data-server-3.12.11/modules/google-backend/module-google-backend.c 2016-04-13 13:51:48.956364978 +0200 -@@ -104,13 +104,16 @@ G_DEFINE_DYNAMIC_TYPE ( - E_TYPE_COLLECTION_BACKEND_FACTORY) - - static void --google_backend_calendar_update_auth_method (ESource *source) -+google_backend_calendar_update_auth_method (ESource *child_source, -+ ESource *master_source) - { - EOAuth2Support *oauth2_support; - ESourceAuthentication *auth_extension; - const gchar *method; - -- oauth2_support = e_server_side_source_ref_oauth2_support (E_SERVER_SIDE_SOURCE (source)); -+ oauth2_support = e_server_side_source_ref_oauth2_support (E_SERVER_SIDE_SOURCE (child_source)); -+ if (!oauth2_support && master_source) -+ oauth2_support = e_server_side_source_ref_oauth2_support (E_SERVER_SIDE_SOURCE (master_source)); - - /* The host name and WebDAV resource path depend on the - * authentication method used, so update those here too. */ -@@ -121,25 +124,35 @@ google_backend_calendar_update_auth_meth - method = "plain/password"; - } - -- auth_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_AUTHENTICATION); -+ auth_extension = e_source_get_extension (child_source, E_SOURCE_EXTENSION_AUTHENTICATION); - e_source_authentication_set_method (auth_extension, method); - - g_clear_object (&oauth2_support); - } - - static void --google_backend_contacts_update_auth_method (ESource *source) -+google_backend_calendar_update_auth_method_cb (ESource *child_source, -+ GParamSpec *param, -+ EBackend *backend) -+{ -+ google_backend_calendar_update_auth_method (child_source, e_backend_get_source (backend)); -+} -+ -+static void -+google_backend_contacts_update_auth_method (ESource *child_source, -+ ESource *master_source) - { - EOAuth2Support *oauth2_support; - ESourceAuthentication *extension; - const gchar *extension_name; - const gchar *method; - -- oauth2_support = e_server_side_source_ref_oauth2_support ( -- E_SERVER_SIDE_SOURCE (source)); -+ oauth2_support = e_server_side_source_ref_oauth2_support (E_SERVER_SIDE_SOURCE (child_source)); -+ if (!oauth2_support && master_source) -+ oauth2_support = e_server_side_source_ref_oauth2_support (E_SERVER_SIDE_SOURCE (master_source)); - - extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; -- extension = e_source_get_extension (source, extension_name); -+ extension = e_source_get_extension (child_source, extension_name); - method = (oauth2_support != NULL) ? "OAuth2" : "ClientLogin"; - e_source_authentication_set_method (extension, method); - -@@ -147,6 +160,14 @@ google_backend_contacts_update_auth_meth - } - - static void -+google_backend_contacts_update_auth_method_cb (ESource *child_source, -+ GParamSpec *param, -+ EBackend *backend) -+{ -+ google_backend_contacts_update_auth_method (child_source, e_backend_get_source (backend)); -+} -+ -+static void - google_add_uid_to_hashtable (gpointer source, - gpointer known_sources) - { -@@ -267,6 +288,8 @@ google_add_found_source (ECollectionBack - child_webdav = e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND); - resource = e_source_get_extension (source, E_SOURCE_EXTENSION_RESOURCE); - -+ google_backend_calendar_update_auth_method (source, master_source); -+ - e_source_authentication_set_user (child_auth, e_source_collection_get_identity (collection_extension)); - e_source_webdav_set_soup_uri (child_webdav, uri); - e_source_resource_set_identity (resource, identity); -@@ -463,6 +486,8 @@ google_populate_thread (gpointer data) - else - calendar_url = "https://www.google.com/calendar/dav/"; - -+ google_backend_calendar_update_auth_method (source, NULL); -+ - if (e_source_collection_get_calendar_enabled (collection_extension) && calendar_url && - e_webdav_discover_sources_sync (collection, calendar_url, - &discovered_sources, NULL, NULL, &local_error)) { -@@ -669,11 +694,11 @@ google_backend_child_added (ECollectionB - * Many-to-one property bindinds tend not to work so well. */ - extension_name = E_SOURCE_EXTENSION_CALENDAR; - if (e_source_has_extension (child_source, extension_name)) { -- google_backend_calendar_update_auth_method (child_source); -+ google_backend_calendar_update_auth_method (child_source, collection_source); - g_signal_connect ( - child_source, "notify::oauth2-support", -- G_CALLBACK (google_backend_calendar_update_auth_method), -- NULL); -+ G_CALLBACK (google_backend_calendar_update_auth_method_cb), -+ backend); - } - - /* Keep the contacts authentication method up-to-date. -@@ -683,11 +708,11 @@ google_backend_child_added (ECollectionB - * Many-to-one property bindings tend not to work so well. */ - extension_name = E_SOURCE_EXTENSION_ADDRESS_BOOK; - if (e_source_has_extension (child_source, extension_name)) { -- google_backend_contacts_update_auth_method (child_source); -+ google_backend_contacts_update_auth_method (child_source, collection_source); - g_signal_connect ( - child_source, "notify::oauth2-support", -- G_CALLBACK (google_backend_contacts_update_auth_method), -- NULL); -+ G_CALLBACK (google_backend_contacts_update_auth_method_cb), -+ backend); - } - } - diff --git a/SOURCES/evolution-data-server-3.12.11-goa-preserve-ews-host.patch b/SOURCES/evolution-data-server-3.12.11-goa-preserve-ews-host.patch deleted file mode 100644 index 25cc9b6..0000000 --- a/SOURCES/evolution-data-server-3.12.11-goa-preserve-ews-host.patch +++ /dev/null @@ -1,64 +0,0 @@ -diff -up evolution-data-server-3.12.11/modules/gnome-online-accounts/module-gnome-online-accounts.c.goa-preserve-ews-host evolution-data-server-3.12.11/modules/gnome-online-accounts/module-gnome-online-accounts.c ---- evolution-data-server-3.12.11/modules/gnome-online-accounts/module-gnome-online-accounts.c.goa-preserve-ews-host 2015-06-09 19:10:07.444489836 +0200 -+++ evolution-data-server-3.12.11/modules/gnome-online-accounts/module-gnome-online-accounts.c 2015-06-09 19:10:07.473489834 +0200 -@@ -265,24 +265,6 @@ gnome_online_accounts_new_source (EGnome - } - - static void --replace_host (gchar **url, -- const gchar *host) --{ -- SoupURI *uri; -- -- uri = soup_uri_new (*url); -- if (!uri) -- return; -- -- soup_uri_set_host (uri, host); -- -- g_free (*url); -- *url = soup_uri_to_string (uri, FALSE); -- -- soup_uri_free (uri); --} -- --static void - gnome_online_accounts_config_exchange (EGnomeOnlineAccounts *extension, - ESource *source, - GoaObject *goa_object) -@@ -347,17 +329,14 @@ gnome_online_accounts_config_exchange (E - if (source_extension != NULL) { - GoaAccount *goa_account; - CamelSettings *settings; -- gchar *host, *user, *email; -+ SoupURI *suri; -+ gchar *user, *email; - - goa_account = goa_object_peek_account (goa_object); -- host = goa_exchange_dup_host (goa_exchange); - user = goa_account_dup_identity (goa_account); - email = goa_account_dup_presentation_identity (goa_account); - -- if (host && *host) { -- replace_host (&as_url, host); -- replace_host (&oab_url, host); -- } -+ suri = soup_uri_new (as_url); - - g_object_set ( - source_extension, -@@ -371,12 +350,12 @@ gnome_online_accounts_config_exchange (E - - g_object_set ( - settings, -- "host", host, -+ "host", soup_uri_get_host (suri), - "user", user, - "email", email, - NULL); - -- g_free (host); -+ soup_uri_free (suri); - g_free (user); - g_free (email); - } else { diff --git a/SOURCES/evolution-data-server-3.12.11-goa-source-change-removed.patch b/SOURCES/evolution-data-server-3.12.11-goa-source-change-removed.patch deleted file mode 100644 index 3d4169a..0000000 --- a/SOURCES/evolution-data-server-3.12.11-goa-source-change-removed.patch +++ /dev/null @@ -1,395 +0,0 @@ -diff -up evolution-data-server-3.12.11/libebackend/e-source-registry-server.c.goa-source-change-removed evolution-data-server-3.12.11/libebackend/e-source-registry-server.c ---- evolution-data-server-3.12.11/libebackend/e-source-registry-server.c.goa-source-change-removed 2014-11-11 18:40:25.000000000 +0100 -+++ evolution-data-server-3.12.11/libebackend/e-source-registry-server.c 2015-08-17 16:55:07.401935846 +0200 -@@ -87,6 +87,10 @@ struct _ESourceRegistryServerPrivate { - GHashTable *waiting_auths; - - guint authentication_count; -+ -+ GMutex file_monitor_lock; -+ GHashTable *file_monitor_events; /* gchar *uid ~> FileEventData * */ -+ GSource *file_monitor_source; - }; - - struct _AuthRequest { -@@ -899,51 +903,121 @@ source_registry_server_reload_cb (EDBusS - return TRUE; - } - -+typedef struct _FileEventData { -+ GFile *file; -+ GFileMonitorEvent event_type; -+} FileEventData; -+ -+static FileEventData * -+file_event_data_new (GFile *file, -+ GFileMonitorEvent event_type) -+{ -+ FileEventData *fed; -+ -+ fed = g_new0 (FileEventData, 1); -+ fed->file = g_object_ref (file); -+ fed->event_type = event_type; -+ -+ return fed; -+} -+ - static void --source_registry_server_monitor_changed_cb (GFileMonitor *monitor, -- GFile *file, -- GFile *other_file, -- GFileMonitorEvent event_type, -- ESourceRegistryServer *server) -+file_event_data_free (gpointer ptr) - { -+ FileEventData *fed = ptr; -+ -+ if (fed) { -+ g_clear_object (&fed->file); -+ g_free (fed); -+ } -+} -+ -+static void -+source_registry_server_process_file_monitor_event (gpointer key, -+ gpointer value, -+ gpointer user_data) -+{ -+ const gchar *uid = key; -+ const FileEventData *fed = value; -+ ESourceRegistryServer *server = user_data; -+ GFileMonitorEvent event_type; -+ -+ g_return_if_fail (uid != NULL); -+ g_return_if_fail (fed != NULL); -+ -+ event_type = fed->event_type; -+ -+ if (e_source_registry_debug_enabled ()) { -+ e_source_registry_debug_print ("Processing file monitor event %s (%u) for UID: %s\n", -+ event_type == G_FILE_MONITOR_EVENT_CHANGED ? "CHANGED" : -+ event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT ? "CHANGES_DONE_HINT" : -+ event_type == G_FILE_MONITOR_EVENT_DELETED ? "DELETED" : -+ event_type == G_FILE_MONITOR_EVENT_CREATED ? "CREATED" : -+ event_type == G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED ? "ATTRIBUTE_CHANGED" : -+ event_type == G_FILE_MONITOR_EVENT_PRE_UNMOUNT ? "PRE_UNMOUNT" : -+ event_type == G_FILE_MONITOR_EVENT_UNMOUNTED ? "UNMOUNTED" : -+ event_type == G_FILE_MONITOR_EVENT_MOVED ? "MOVED" : "???", -+ event_type, -+ uid); -+ } -+ -+ if (event_type == G_FILE_MONITOR_EVENT_CHANGED || -+ event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT) { -+ ESource *source; -+ GError *error = NULL; -+ -+ source = e_source_registry_server_ref_source (server, uid); -+ -+ /* If the source does not exist, create it; parsing may have -+ * failed when the file was originally created. This can happen -+ * if the file is created (empty), then e-source-registry-server -+ * detects it, then it’s populated and made valid. -+ * -+ * Otherwise, reload the file since it has changed. */ -+ if (source == NULL) { -+ event_type = G_FILE_MONITOR_EVENT_CREATED; -+ } else if (!e_server_side_source_load (E_SERVER_SIDE_SOURCE (source), NULL, &error)) { -+ g_warning ("Error reloading source ‘%s’: %s", uid, error->message); -+ -+ g_error_free (error); -+ g_object_unref (source); -+ -+ return; -+ } -+ -+ g_object_unref (source); -+ } -+ - if (event_type == G_FILE_MONITOR_EVENT_CREATED) { - ESource *source; - GError *error = NULL; - -- /* it can return NULL source for hidden files */ -- source = e_server_side_source_new (server, file, &error); -+ source = e_source_registry_server_ref_source (server, uid); -+ -+ if (!source) { -+ /* it can return NULL source for hidden files */ -+ source = e_server_side_source_new (server, fed->file, &error); -+ } - - if (!error && source) { - /* File monitors are only placed on directories - * where data sources are writable and removable, - * so it should be safe to assume these flags. */ -- e_server_side_source_set_writable ( -- E_SERVER_SIDE_SOURCE (source), TRUE); -- e_server_side_source_set_removable ( -- E_SERVER_SIDE_SOURCE (source), TRUE); -+ e_server_side_source_set_writable (E_SERVER_SIDE_SOURCE (source), TRUE); -+ e_server_side_source_set_removable (E_SERVER_SIDE_SOURCE (source), TRUE); - - e_source_registry_server_add_source (server, source); -- g_object_unref (source); - } else if (error) { -- e_source_registry_server_load_error ( -- server, file, error); -+ e_source_registry_server_load_error (server, fed->file, error); - g_error_free (error); - } - } - - if (event_type == G_FILE_MONITOR_EVENT_DELETED) { - ESource *source; -- gchar *uid; -- -- uid = e_server_side_source_uid_from_file (file, NULL); -- -- if (uid == NULL) -- return; - - source = e_source_registry_server_ref_source (server, uid); - -- g_free (uid); -- - if (source == NULL) - return; - -@@ -958,6 +1032,87 @@ source_registry_server_monitor_changed_c - } - - static gboolean -+source_registry_server_process_file_monitor_events_cb (gpointer user_data) -+{ -+ ESourceRegistryServer *server = user_data; -+ GHashTable *events; -+ -+ if (g_source_is_destroyed (g_main_current_source ())) -+ return FALSE; -+ -+ g_return_val_if_fail (E_IS_SOURCE_REGISTRY_SERVER (server), FALSE); -+ -+ g_mutex_lock (&server->priv->file_monitor_lock); -+ events = server->priv->file_monitor_events; -+ server->priv->file_monitor_events = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, file_event_data_free); -+ g_mutex_unlock (&server->priv->file_monitor_lock); -+ -+ g_hash_table_foreach (events, source_registry_server_process_file_monitor_event, server); -+ g_hash_table_destroy (events); -+ -+ return FALSE; -+} -+ -+static void -+source_registry_server_monitor_changed_cb (GFileMonitor *monitor, -+ GFile *file, -+ GFile *other_file, -+ GFileMonitorEvent event_type, -+ ESourceRegistryServer *server) -+{ -+ if (e_source_registry_debug_enabled ()) { -+ gchar *uri; -+ -+ uri = g_file_get_uri (file); -+ e_source_registry_debug_print ("Handling file monitor event %s (%u) for URI: %s\n", -+ event_type == G_FILE_MONITOR_EVENT_CHANGED ? "CHANGED" : -+ event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT ? "CHANGES_DONE_HINT" : -+ event_type == G_FILE_MONITOR_EVENT_DELETED ? "DELETED" : -+ event_type == G_FILE_MONITOR_EVENT_CREATED ? "CREATED" : -+ event_type == G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED ? "ATTRIBUTE_CHANGED" : -+ event_type == G_FILE_MONITOR_EVENT_PRE_UNMOUNT ? "PRE_UNMOUNT" : -+ event_type == G_FILE_MONITOR_EVENT_UNMOUNTED ? "UNMOUNTED" : -+ event_type == G_FILE_MONITOR_EVENT_MOVED ? "MOVED" : "???", -+ event_type, -+ uri); -+ g_free (uri); -+ } -+ -+ if (event_type == G_FILE_MONITOR_EVENT_CHANGED || -+ event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT || -+ event_type == G_FILE_MONITOR_EVENT_CREATED || -+ event_type == G_FILE_MONITOR_EVENT_DELETED) { -+ gchar *uid; -+ -+ uid = e_server_side_source_uid_from_file (file, NULL); -+ -+ if (uid == NULL) -+ return; -+ -+ g_mutex_lock (&server->priv->file_monitor_lock); -+ /* This overwrites any previous events, aka the last wins -+ (overwrite can be DELETE + CREATE, which handles it correctly). */ -+ g_hash_table_insert (server->priv->file_monitor_events, uid, file_event_data_new (file, event_type)); -+ -+ if (server->priv->file_monitor_source) { -+ g_source_destroy (server->priv->file_monitor_source); -+ g_source_unref (server->priv->file_monitor_source); -+ } -+ -+ server->priv->file_monitor_source = g_timeout_source_new_seconds (3); -+ g_source_set_callback ( -+ server->priv->file_monitor_source, -+ source_registry_server_process_file_monitor_events_cb, -+ server, NULL); -+ g_source_attach ( -+ server->priv->file_monitor_source, -+ server->priv->main_context); -+ -+ g_mutex_unlock (&server->priv->file_monitor_lock); -+ } -+} -+ -+static gboolean - source_registry_server_traverse_cb (GNode *node, - GQueue *queue) - { -@@ -1047,6 +1202,14 @@ source_registry_server_dispose (GObject - - priv = E_SOURCE_REGISTRY_SERVER_GET_PRIVATE (object); - -+ g_mutex_lock (&priv->file_monitor_lock); -+ if (priv->file_monitor_source) { -+ g_source_destroy (priv->file_monitor_source); -+ g_source_unref (priv->file_monitor_source); -+ priv->file_monitor_source = NULL; -+ } -+ g_mutex_unlock (&priv->file_monitor_lock); -+ - if (priv->main_context != NULL) { - g_main_context_unref (priv->main_context); - priv->main_context = NULL; -@@ -1065,6 +1228,7 @@ source_registry_server_dispose (GObject - g_hash_table_remove_all (priv->sources); - g_hash_table_remove_all (priv->orphans); - g_hash_table_remove_all (priv->monitors); -+ g_hash_table_remove_all (priv->file_monitor_events); - - g_hash_table_remove_all (priv->running_auths); - g_hash_table_remove_all (priv->waiting_auths); -@@ -1084,9 +1248,11 @@ source_registry_server_finalize (GObject - g_hash_table_destroy (priv->sources); - g_hash_table_destroy (priv->orphans); - g_hash_table_destroy (priv->monitors); -+ g_hash_table_destroy (priv->file_monitor_events); - - g_mutex_clear (&priv->sources_lock); - g_mutex_clear (&priv->orphans_lock); -+ g_mutex_clear (&priv->file_monitor_lock); - - g_mutex_clear (&priv->auth_lock); - g_hash_table_destroy (priv->running_auths); -@@ -1444,8 +1444,10 @@ e_source_registry_server_init (ESourceRegistryServ - g_mutex_init (&server->priv->sources_lock); - g_mutex_init (&server->priv->orphans_lock); - g_mutex_init (&server->priv->auth_lock); -+ g_mutex_init (&server->priv->file_monitor_lock); - server->priv->waiting_auths = waiting_auths; - server->priv->running_auths = running_auths; -+ server->priv->file_monitor_events = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, file_event_data_free); - - g_signal_connect ( - source_manager, "handle-allow-auth-prompt-all", -diff -up evolution-data-server-3.12.11/libedataserver/e-source.c.goa-source-change-removed evolution-data-server-3.12.11/libedataserver/e-source.c ---- evolution-data-server-3.12.11/libedataserver/e-source.c.goa-source-change-removed 2015-08-17 16:55:07.344936312 +0200 -+++ evolution-data-server-3.12.11/libedataserver/e-source.c 2015-08-17 16:55:07.402935838 +0200 -@@ -126,9 +126,6 @@ struct _ESourcePrivate { - GSource *changed; - GMutex changed_lock; - -- GSource *data_change; -- GMutex data_change_lock; -- - GMutex property_lock; - - gchar *display_name; -@@ -790,26 +787,13 @@ source_parse_dbus_data (ESource *source, - return TRUE; - } - --static gboolean --source_idle_data_change_cb (gpointer user_data) -+static void -+source_notify_dbus_data_cb (EDBusSource *dbus_source, -+ GParamSpec *pspec, -+ ESource *source) - { -- ESource *source = E_SOURCE (user_data); - GError *local_error = NULL; - -- /* If the ESource is still initializing itself in a different -- * thread, skip the signal emission and try again on the next -- * main loop iteration. This is a busy wait but it should be -- * a very short wait. */ -- if (!source->priv->initialized) -- return TRUE; -- -- g_mutex_lock (&source->priv->data_change_lock); -- if (source->priv->data_change != NULL) { -- g_source_unref (source->priv->data_change); -- source->priv->data_change = NULL; -- } -- g_mutex_unlock (&source->priv->data_change_lock); -- - g_rec_mutex_lock (&source->priv->lock); - - /* Since the source data came from a GKeyFile structure on the -@@ -823,27 +807,6 @@ source_idle_data_change_cb (gpointer use - } - - g_rec_mutex_unlock (&source->priv->lock); -- -- return FALSE; --} -- --static void --source_notify_dbus_data_cb (EDBusSource *dbus_source, -- GParamSpec *pspec, -- ESource *source) --{ -- g_mutex_lock (&source->priv->data_change_lock); -- if (source->priv->data_change == NULL) { -- source->priv->data_change = g_idle_source_new (); -- g_source_set_callback ( -- source->priv->data_change, -- source_idle_data_change_cb, -- source, NULL); -- g_source_attach ( -- source->priv->data_change, -- source->priv->main_context); -- } -- g_mutex_unlock (&source->priv->data_change_lock); - } - - static gboolean -@@ -1066,14 +1029,6 @@ source_dispose (GObject *object) - } - g_mutex_unlock (&priv->changed_lock); - -- g_mutex_lock (&priv->data_change_lock); -- if (priv->data_change != NULL) { -- g_source_destroy (priv->data_change); -- g_source_unref (priv->data_change); -- priv->data_change = NULL; -- } -- g_mutex_unlock (&priv->data_change_lock); -- - g_hash_table_remove_all (priv->extensions); - - /* Chain up to parent's dispose() method. */ -@@ -1088,7 +1043,6 @@ source_finalize (GObject *object) - priv = E_SOURCE_GET_PRIVATE (object); - - g_mutex_clear (&priv->changed_lock); -- g_mutex_clear (&priv->data_change_lock); - g_mutex_clear (&priv->property_lock); - - g_free (priv->display_name); -@@ -2092,7 +2046,6 @@ e_source_init (ESource *source) - - source->priv = E_SOURCE_GET_PRIVATE (source); - g_mutex_init (&source->priv->changed_lock); -- g_mutex_init (&source->priv->data_change_lock); - g_mutex_init (&source->priv->property_lock); - source->priv->key_file = g_key_file_new (); - source->priv->extensions = extensions; diff --git a/SOURCES/evolution-data-server-3.12.11-goa-sources-auth-method.patch b/SOURCES/evolution-data-server-3.12.11-goa-sources-auth-method.patch deleted file mode 100644 index 3dee0e9..0000000 --- a/SOURCES/evolution-data-server-3.12.11-goa-sources-auth-method.patch +++ /dev/null @@ -1,75 +0,0 @@ -diff -up evolution-data-server-3.12.11/modules/google-backend/module-google-backend.c.goa-sources-auth-method evolution-data-server-3.12.11/modules/google-backend/module-google-backend.c ---- evolution-data-server-3.12.11/modules/google-backend/module-google-backend.c.goa-sources-auth-method 2015-06-12 10:43:57.533099647 +0200 -+++ evolution-data-server-3.12.11/modules/google-backend/module-google-backend.c 2015-06-12 10:43:57.539099593 +0200 -@@ -618,6 +618,10 @@ google_backend_child_added (ECollectionB - const gchar *extension_name; - gboolean is_mail = FALSE; - -+ /* Chain up to parent's child_added() method. */ -+ E_COLLECTION_BACKEND_CLASS (e_google_backend_parent_class)-> -+ child_added (backend, child_source); -+ - collection_source = e_backend_get_source (E_BACKEND (backend)); - - extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT; -@@ -685,10 +689,6 @@ google_backend_child_added (ECollectionB - G_CALLBACK (google_backend_contacts_update_auth_method), - NULL); - } -- -- /* Chain up to parent's child_added() method. */ -- E_COLLECTION_BACKEND_CLASS (e_google_backend_parent_class)-> -- child_added (backend, child_source); - } - - static void -diff -up evolution-data-server-3.12.11/modules/outlook-backend/module-outlook-backend.c.goa-sources-auth-method evolution-data-server-3.12.11/modules/outlook-backend/module-outlook-backend.c ---- evolution-data-server-3.12.11/modules/outlook-backend/module-outlook-backend.c.goa-sources-auth-method 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/modules/outlook-backend/module-outlook-backend.c 2015-06-12 10:43:57.539099593 +0200 -@@ -96,6 +96,10 @@ outlook_backend_child_added (ECollection - const gchar *extension_name; - gboolean is_mail = FALSE; - -+ /* Chain up to parent's child_added() method. */ -+ E_COLLECTION_BACKEND_CLASS (e_outlook_backend_parent_class)-> -+ child_added (backend, child_source); -+ - collection_source = e_backend_get_source (E_BACKEND (backend)); - - extension_name = E_SOURCE_EXTENSION_MAIL_ACCOUNT; -@@ -135,10 +139,6 @@ outlook_backend_child_added (ECollection - auth_child_extension, - collection_identity); - } -- -- /* Chain up to parent's child_added() method. */ -- E_COLLECTION_BACKEND_CLASS (e_outlook_backend_parent_class)-> -- child_added (backend, child_source); - } - - static void -diff -up evolution-data-server-3.12.11/modules/yahoo-backend/module-yahoo-backend.c.goa-sources-auth-method evolution-data-server-3.12.11/modules/yahoo-backend/module-yahoo-backend.c ---- evolution-data-server-3.12.11/modules/yahoo-backend/module-yahoo-backend.c.goa-sources-auth-method 2014-06-06 16:08:31.000000000 +0200 -+++ evolution-data-server-3.12.11/modules/yahoo-backend/module-yahoo-backend.c 2015-06-12 10:43:57.539099593 +0200 -@@ -282,6 +282,10 @@ yahoo_backend_child_added (ECollectionBa - const gchar *extension_name; - gboolean is_mail = FALSE; - -+ /* Chain up to parent's child_added() method. */ -+ E_COLLECTION_BACKEND_CLASS (e_yahoo_backend_parent_class)-> -+ child_added (backend, child_source); -+ - yahoo_backend = E_YAHOO_BACKEND (backend); - collection_source = e_backend_get_source (E_BACKEND (backend)); - -@@ -330,10 +334,6 @@ yahoo_backend_child_added (ECollectionBa - auth_child_extension, - collection_identity); - } -- -- /* Chain up to parent's child_added() method. */ -- E_COLLECTION_BACKEND_CLASS (e_yahoo_backend_parent_class)-> -- child_added (backend, child_source); - } - - static void diff --git a/SOURCES/evolution-data-server-3.12.11-google-calendar-discover.patch b/SOURCES/evolution-data-server-3.12.11-google-calendar-discover.patch deleted file mode 100644 index c98d13a..0000000 --- a/SOURCES/evolution-data-server-3.12.11-google-calendar-discover.patch +++ /dev/null @@ -1,2686 +0,0 @@ -diff -up evolution-data-server-3.12.11/libebackend/e-collection-backend.c.google-calendar-discover evolution-data-server-3.12.11/libebackend/e-collection-backend.c ---- evolution-data-server-3.12.11/libebackend/e-collection-backend.c.google-calendar-discover 2014-11-11 18:40:25.000000000 +0100 -+++ evolution-data-server-3.12.11/libebackend/e-collection-backend.c 2015-07-07 16:23:23.649982529 +0200 -@@ -72,6 +72,9 @@ struct _ECollectionBackendPrivate { - gulong source_added_handler_id; - gulong source_removed_handler_id; - gulong notify_enabled_handler_id; -+ gulong notify_collection_handler_id; -+ -+ guint scheduled_populate_idle_id; - }; - - enum { -@@ -509,6 +512,8 @@ collection_backend_populate_idle_cb (gpo - - backend = E_COLLECTION_BACKEND (user_data); - -+ backend->priv->scheduled_populate_idle_id = 0; -+ - class = E_COLLECTION_BACKEND_GET_CLASS (backend); - g_return_val_if_fail (class->populate != NULL, FALSE); - -@@ -518,6 +523,40 @@ collection_backend_populate_idle_cb (gpo - } - - static void -+collection_backend_schedule_populate_idle (ECollectionBackend *backend) -+{ -+ g_return_if_fail (E_IS_COLLECTION_BACKEND (backend)); -+ -+ if (!backend->priv->scheduled_populate_idle_id) -+ backend->priv->scheduled_populate_idle_id = g_idle_add_full ( -+ G_PRIORITY_LOW, -+ collection_backend_populate_idle_cb, -+ g_object_ref (backend), -+ (GDestroyNotify) g_object_unref); -+} -+ -+static void -+collection_backend_notify_collection_cb (ESourceCollection *collection_extension, -+ GParamSpec *param, -+ ECollectionBackend *collection_backend) -+{ -+ ESource *source; -+ -+ g_return_if_fail (E_IS_SOURCE_COLLECTION (collection_extension)); -+ g_return_if_fail (param != NULL); -+ g_return_if_fail (E_IS_COLLECTION_BACKEND (collection_backend)); -+ -+ source = e_backend_get_source (E_BACKEND (collection_backend)); -+ if (!e_source_get_enabled (source) || ( -+ g_strcmp0 (g_param_spec_get_name (param), "calendar-enabled") != 0 && -+ g_strcmp0 (g_param_spec_get_name (param), "contacts-enabled") != 0 && -+ g_strcmp0 (g_param_spec_get_name (param), "mail-enabled") != 0)) -+ return; -+ -+ collection_backend_schedule_populate_idle (collection_backend); -+} -+ -+static void - collection_backend_update_proxy_resolver (ECollectionBackend *backend) - { - GProxyResolver *proxy_resolver = NULL; -@@ -662,6 +701,20 @@ collection_backend_dispose (GObject *obj - priv->notify_enabled_handler_id = 0; - } - -+ if (priv->notify_collection_handler_id) { -+ ESource *source = e_backend_get_source (E_BACKEND (object)); -+ -+ if (source) { -+ ESourceCollection *collection_extension; -+ -+ collection_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_COLLECTION); -+ -+ g_signal_handler_disconnect (collection_extension, priv->notify_collection_handler_id); -+ } -+ -+ priv->notify_collection_handler_id = 0; -+ } -+ - g_mutex_lock (&priv->children_lock); - g_hash_table_remove_all (priv->children); - g_mutex_unlock (&priv->children_lock); -@@ -777,14 +830,17 @@ collection_backend_constructed (GObject - backend->priv->notify_enabled_handler_id = g_signal_connect (source, "notify::enabled", - G_CALLBACK (collection_backend_source_enabled_cb), backend); - -+ if (e_source_has_extension (source, E_SOURCE_EXTENSION_COLLECTION)) { -+ ESourceCollection *collection_extension; -+ -+ collection_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_COLLECTION); -+ backend->priv->notify_collection_handler_id = g_signal_connect (collection_extension, "notify", -+ G_CALLBACK (collection_backend_notify_collection_cb), backend); -+ } -+ - /* Populate the newly-added collection from an idle callback - * so persistent child sources have a chance to be added first. */ -- -- g_idle_add_full ( -- G_PRIORITY_LOW, -- collection_backend_populate_idle_cb, -- g_object_ref (backend), -- (GDestroyNotify) g_object_unref); -+ collection_backend_schedule_populate_idle (backend); - } - - static gboolean -diff -up evolution-data-server-3.12.11/libedataserver/e-source.c.google-calendar-discover evolution-data-server-3.12.11/libedataserver/e-source.c ---- evolution-data-server-3.12.11/libedataserver/e-source.c.google-calendar-discover 2014-10-13 07:52:42.000000000 +0200 -+++ evolution-data-server-3.12.11/libedataserver/e-source.c 2015-07-07 16:23:23.649982529 +0200 -@@ -738,6 +738,9 @@ source_parse_dbus_data (ESource *source, - gchar *data; - gboolean success; - -+ if (!source->priv->dbus_object) -+ return FALSE; -+ - dbus_object = E_DBUS_OBJECT (source->priv->dbus_object); - - dbus_source = e_dbus_object_get_source (dbus_object); -diff -up evolution-data-server-3.12.11/libedataserver/e-source-webdav.c.google-calendar-discover evolution-data-server-3.12.11/libedataserver/e-source-webdav.c ---- evolution-data-server-3.12.11/libedataserver/e-source-webdav.c.google-calendar-discover 2014-08-27 14:08:27.000000000 +0200 -+++ evolution-data-server-3.12.11/libedataserver/e-source-webdav.c 2015-07-07 16:23:23.649982529 +0200 -@@ -172,9 +172,14 @@ source_webdav_update_properties_from_sou - extension, - "host", soup_uri->host, - "port", soup_uri->port, -- "user", soup_uri->user, - NULL); - -+ if (soup_uri->user && *soup_uri->user) -+ g_object_set ( -+ extension, -+ "user", soup_uri->user, -+ NULL); -+ - extension_name = E_SOURCE_EXTENSION_SECURITY; - extension = e_source_get_extension (source, extension_name); - -diff -up evolution-data-server-3.12.11/modules/gnome-online-accounts/module-gnome-online-accounts.c.google-calendar-discover evolution-data-server-3.12.11/modules/gnome-online-accounts/module-gnome-online-accounts.c ---- evolution-data-server-3.12.11/modules/gnome-online-accounts/module-gnome-online-accounts.c.google-calendar-discover 2014-07-18 14:54:31.000000000 +0200 -+++ evolution-data-server-3.12.11/modules/gnome-online-accounts/module-gnome-online-accounts.c 2015-07-07 16:23:23.650982526 +0200 -@@ -169,11 +169,41 @@ gnome_online_accounts_object_is_non_null - GValue *target_value, - gpointer unused) - { -+ GoaObject *goa_object = GOA_OBJECT (g_binding_get_source (binding)); -+ ESourceExtension *source_extension = E_SOURCE_EXTENSION (g_binding_get_target (binding)); -+ ESource *source; -+ ESourceGoa *goa_extension; - gpointer v_object; - - v_object = g_value_get_object (source_value); - g_value_set_boolean (target_value, v_object != NULL); - -+ g_return_val_if_fail (goa_object != NULL, TRUE); -+ g_return_val_if_fail (source_extension != NULL, TRUE); -+ -+ source = e_source_extension_get_source (source_extension); -+ goa_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_GOA); -+ -+ if (g_strcmp0 (g_binding_get_source_property (binding), "calendar") == 0) { -+ gchar *uri = NULL; -+ -+ if (v_object && GOA_IS_CALENDAR (v_object)) -+ uri = goa_calendar_dup_uri (v_object); -+ -+ e_source_goa_set_calendar_url (goa_extension, uri); -+ -+ g_free (uri); -+ } else if (g_strcmp0 (g_binding_get_source_property (binding), "contacts") == 0) { -+ gchar *uri = NULL; -+ -+ if (v_object && GOA_IS_CONTACTS (v_object)) -+ uri = goa_contacts_dup_uri (v_object); -+ -+ e_source_goa_set_contacts_url (goa_extension, uri); -+ -+ g_free (uri); -+ } -+ - return TRUE; - } - -diff -up evolution-data-server-3.12.11/modules/google-backend/e-webdav-discover.c.google-calendar-discover evolution-data-server-3.12.11/modules/google-backend/e-webdav-discover.c ---- evolution-data-server-3.12.11/modules/google-backend/e-webdav-discover.c.google-calendar-discover 2015-07-07 16:23:23.650982526 +0200 -+++ evolution-data-server-3.12.11/modules/google-backend/e-webdav-discover.c 2015-07-07 16:23:23.650982526 +0200 -@@ -0,0 +1,1887 @@ -+/* -+ * Copyright (C) 2015 Red Hat, Inc. (www.redhat.com) -+ * -+ * This library is free software: you can redistribute it and/or modify it -+ * under the terms of the GNU Lesser General Public License as published by -+ * the Free Software Foundation. -+ * -+ * This library is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License -+ * for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public License -+ * along with this library. If not, see . -+ * -+ */ -+ -+#ifdef HAVE_CONFIG_H -+#include -+#endif -+ -+#include -+ -+#include -+ -+#include -+#include -+#include -+ -+#include -+ -+#include "e-webdav-discover.h" -+ -+typedef struct _EWebdavAuthenticator EWebdavAuthenticator; -+typedef struct _EWebdavAuthenticatorClass EWebdavAuthenticatorClass; -+ -+struct _EWebdavAuthenticator { -+ GObject parent; -+ -+ ECollectionBackend *collection; -+ gchar *username; -+ GString *password; -+}; -+ -+struct _EWebdavAuthenticatorClass { -+ GObjectClass parent_class; -+}; -+ -+static ESourceAuthenticationResult -+webdav_authenticator_try_password_sync (ESourceAuthenticator *auth, -+ const GString *password, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ EWebdavAuthenticator *authenticator = (EWebdavAuthenticator *) auth; -+ -+ if (authenticator->password) -+ g_string_free (authenticator->password, TRUE); -+ authenticator->password = g_string_new (password->str); -+ -+ return E_SOURCE_AUTHENTICATION_ACCEPTED; -+} -+ -+#define E_TYPE_WEBDAV_AUTHENTICATOR (e_webdav_authenticator_get_type ()) -+ -+GType e_webdav_authenticator_get_type -+ (void) G_GNUC_CONST; -+static void e_webdav_authenticator_authenticator_init -+ (ESourceAuthenticatorInterface *iface); -+ -+G_DEFINE_TYPE_EXTENDED ( -+ EWebdavAuthenticator, -+ e_webdav_authenticator, -+ G_TYPE_OBJECT, 0, -+ G_IMPLEMENT_INTERFACE ( -+ E_TYPE_SOURCE_AUTHENTICATOR, -+ e_webdav_authenticator_authenticator_init)) -+ -+static void -+webdav_authenticator_finalize (GObject *object) -+{ -+ EWebdavAuthenticator *authenticator = (EWebdavAuthenticator *) object; -+ -+ g_free (authenticator->username); -+ if (authenticator->password) -+ g_string_free (authenticator->password, TRUE); -+ -+ G_OBJECT_CLASS (e_webdav_authenticator_parent_class)->finalize (object); -+} -+ -+static void -+e_webdav_authenticator_class_init (EWebdavAuthenticatorClass *class) -+{ -+ GObjectClass *object_class; -+ -+ object_class = G_OBJECT_CLASS (class); -+ object_class->finalize = webdav_authenticator_finalize; -+} -+ -+static void -+e_webdav_authenticator_authenticator_init (ESourceAuthenticatorInterface *iface) -+{ -+ iface->try_password_sync = webdav_authenticator_try_password_sync; -+} -+ -+static void -+e_webdav_authenticator_init (EWebdavAuthenticator *authenticator) -+{ -+} -+ -+#define XC(string) ((xmlChar *) string) -+ -+/* Standard Namespaces */ -+#define NS_WEBDAV "DAV:" -+#define NS_CALDAV "urn:ietf:params:xml:ns:caldav" -+#define NS_CARDDAV "urn:ietf:params:xml:ns:carddav" -+ -+/* Application-Specific Namespaces */ -+#define NS_ICAL "http://apple.com/ns/ical/" -+ -+/* Mainly for readability. */ -+enum { -+ DEPTH_0 = 0, -+ DEPTH_1 = 1 -+}; -+ -+typedef struct _EWebDAVDiscoverContext { -+ ECollectionBackend *collection; -+ gchar *url_use_path; -+ GSList *out_discovered_sources; -+ GSList *out_calendar_user_addresses; -+} EWebDAVDiscoverContext; -+ -+static EWebDAVDiscoverContext * -+e_webdav_discover_context_new (ECollectionBackend *collection, -+ const gchar *url_use_path) -+{ -+ EWebDAVDiscoverContext *context; -+ -+ context = g_new0 (EWebDAVDiscoverContext, 1); -+ context->collection = g_object_ref (collection); -+ context->url_use_path = g_strdup (url_use_path); -+ context->out_discovered_sources = NULL; -+ context->out_calendar_user_addresses = NULL; -+ -+ return context; -+} -+ -+static void -+e_webdav_discover_context_free (gpointer ptr) -+{ -+ EWebDAVDiscoverContext *context = ptr; -+ -+ if (!context) -+ return; -+ -+ g_clear_object (&context->collection); -+ g_free (context->url_use_path); -+ e_webdav_discover_free_discovered_sources (context->out_discovered_sources); -+ g_slist_free_full (context->out_calendar_user_addresses, g_free); -+ g_free (context); -+} -+ -+static gchar * -+e_webdav_discover_make_href_full_uri (SoupURI *base_uri, -+ const gchar *href) -+{ -+ SoupURI *soup_uri; -+ gchar *full_uri; -+ -+ if (!base_uri || !href) -+ return g_strdup (href); -+ -+ if (strstr (href, "://")) -+ return g_strdup (href); -+ -+ soup_uri = soup_uri_copy (base_uri); -+ soup_uri_set_path (soup_uri, href); -+ soup_uri_set_user (soup_uri, NULL); -+ soup_uri_set_password (soup_uri, NULL); -+ -+ full_uri = soup_uri_to_string (soup_uri, FALSE); -+ -+ soup_uri_free (soup_uri); -+ -+ return full_uri; -+} -+ -+static void -+e_webdav_discover_redirect (SoupMessage *message, -+ SoupSession *session) -+{ -+ SoupURI *soup_uri; -+ const gchar *location; -+ -+ if (!SOUP_STATUS_IS_REDIRECTION (message->status_code)) -+ return; -+ -+ location = soup_message_headers_get_list (message->response_headers, "Location"); -+ -+ if (location == NULL) -+ return; -+ -+ soup_uri = soup_uri_new_with_base (soup_message_get_uri (message), location); -+ -+ if (soup_uri == NULL) { -+ soup_message_set_status_full ( -+ message, SOUP_STATUS_MALFORMED, -+ "Invalid Redirect URL"); -+ return; -+ } -+ -+ soup_message_set_uri (message, soup_uri); -+ soup_session_requeue_message (session, message); -+ -+ soup_uri_free (soup_uri); -+} -+ -+static gconstpointer -+compat_libxml_output_buffer_get_content (xmlOutputBufferPtr buf, -+ gsize *out_len) -+{ -+#ifdef LIBXML2_NEW_BUFFER -+ *out_len = xmlOutputBufferGetSize (buf); -+ return xmlOutputBufferGetContent (buf); -+#else -+ *out_len = buf->buffer->use; -+ return buf->buffer->content; -+#endif -+} -+ -+static G_GNUC_NULL_TERMINATED SoupMessage * -+e_webdav_discover_new_propfind (SoupSession *session, -+ SoupURI *soup_uri, -+ gint depth, -+ ...) -+{ -+ GHashTable *namespaces; -+ SoupMessage *message; -+ xmlDocPtr doc; -+ xmlNodePtr root; -+ xmlNodePtr node; -+ xmlNsPtr ns; -+ xmlOutputBufferPtr output; -+ gconstpointer content; -+ gsize length; -+ gpointer key; -+ va_list va; -+ -+ /* Construct the XML content. */ -+ -+ doc = xmlNewDoc (XC ("1.0")); -+ node = xmlNewDocNode (doc, NULL, XC ("propfind"), NULL); -+ -+ /* Build a hash table of namespace URIs to xmlNs structs. */ -+ namespaces = g_hash_table_new (NULL, NULL); -+ -+ ns = xmlNewNs (node, XC (NS_CALDAV), XC ("C")); -+ g_hash_table_insert (namespaces, (gpointer) NS_CALDAV, ns); -+ -+ ns = xmlNewNs (node, XC (NS_CARDDAV), XC ("A")); -+ g_hash_table_insert (namespaces, (gpointer) NS_CARDDAV, ns); -+ -+ ns = xmlNewNs (node, XC (NS_ICAL), XC ("IC")); -+ g_hash_table_insert (namespaces, (gpointer) NS_ICAL, ns); -+ -+ /* Add WebDAV last since we use it below. */ -+ ns = xmlNewNs (node, XC (NS_WEBDAV), XC ("D")); -+ g_hash_table_insert (namespaces, (gpointer) NS_WEBDAV, ns); -+ -+ xmlSetNs (node, ns); -+ xmlDocSetRootElement (doc, node); -+ -+ node = xmlNewTextChild (node, ns, XC ("prop"), NULL); -+ -+ va_start (va, depth); -+ while ((key = va_arg (va, gpointer)) != NULL) { -+ xmlChar *name; -+ -+ ns = g_hash_table_lookup (namespaces, key); -+ name = va_arg (va, xmlChar *); -+ -+ if (ns != NULL && name != NULL) -+ xmlNewTextChild (node, ns, name, NULL); -+ else -+ g_warn_if_reached (); -+ } -+ va_end (va); -+ -+ g_hash_table_destroy (namespaces); -+ -+ /* Construct the SoupMessage. */ -+ -+ message = soup_message_new_from_uri (SOUP_METHOD_PROPFIND, soup_uri); -+ -+ soup_message_set_flags (message, SOUP_MESSAGE_NO_REDIRECT); -+ -+ soup_message_headers_append ( -+ message->request_headers, -+ "User-Agent", "Evolution/" VERSION); -+ -+ soup_message_headers_append ( -+ message->request_headers, -+ "Connection", "close"); -+ -+ soup_message_headers_append ( -+ message->request_headers, -+ "Depth", (depth == 0) ? "0" : "1"); -+ -+ output = xmlAllocOutputBuffer (NULL); -+ -+ root = xmlDocGetRootElement (doc); -+ xmlNodeDumpOutput (output, doc, root, 0, 1, NULL); -+ xmlOutputBufferFlush (output); -+ -+ content = compat_libxml_output_buffer_get_content (output, &length); -+ -+ soup_message_set_request ( -+ message, "application/xml", SOUP_MEMORY_COPY, -+ content, length); -+ -+ xmlOutputBufferClose (output); -+ xmlFreeDoc (doc); -+ -+ soup_message_add_header_handler ( -+ message, "got-body", "Location", -+ G_CALLBACK (e_webdav_discover_redirect), session); -+ -+ return message; -+} -+ -+static xmlXPathObjectPtr -+e_webdav_discover_get_xpath (xmlXPathContextPtr xp_ctx, -+ const gchar *path_format, -+ ...) -+{ -+ xmlXPathObjectPtr xp_obj; -+ va_list va; -+ gchar *path; -+ -+ va_start (va, path_format); -+ path = g_strdup_vprintf (path_format, va); -+ va_end (va); -+ -+ xp_obj = xmlXPathEvalExpression (XC (path), xp_ctx); -+ -+ g_free (path); -+ -+ if (xp_obj == NULL) -+ return NULL; -+ -+ if (xp_obj->type != XPATH_NODESET) { -+ xmlXPathFreeObject (xp_obj); -+ return NULL; -+ } -+ -+ if (xmlXPathNodeSetGetLength (xp_obj->nodesetval) == 0) { -+ xmlXPathFreeObject (xp_obj); -+ return NULL; -+ } -+ -+ return xp_obj; -+} -+ -+static gchar * -+e_webdav_discover_get_xpath_string (xmlXPathContextPtr xp_ctx, -+ const gchar *path_format, -+ ...) -+{ -+ xmlXPathObjectPtr xp_obj; -+ va_list va; -+ gchar *path; -+ gchar *expression; -+ gchar *string = NULL; -+ -+ va_start (va, path_format); -+ path = g_strdup_vprintf (path_format, va); -+ va_end (va); -+ -+ expression = g_strdup_printf ("string(%s)", path); -+ xp_obj = xmlXPathEvalExpression (XC (expression), xp_ctx); -+ g_free (expression); -+ -+ g_free (path); -+ -+ if (xp_obj == NULL) -+ return NULL; -+ -+ if (xp_obj->type == XPATH_STRING) -+ string = g_strdup ((gchar *) xp_obj->stringval); -+ -+ /* If the string is empty, return NULL. */ -+ if (string != NULL && *string == '\0') { -+ g_free (string); -+ string = NULL; -+ } -+ -+ xmlXPathFreeObject (xp_obj); -+ -+ return string; -+} -+ -+static void -+e_webdav_discover_authenticate_cb (SoupSession *session, -+ SoupMessage *msg, -+ SoupAuth *auth, -+ gboolean retrying, -+ gpointer user_data) -+{ -+ EWebdavAuthenticator *authenticator = user_data; -+ ESource *source; -+ -+ g_return_if_fail (authenticator != NULL); -+ -+ if (retrying && E_IS_SOUP_AUTH_BEARER (auth)) -+ return; -+ -+ source = e_backend_get_source (E_BACKEND (authenticator->collection)); -+ -+ if (E_IS_SOUP_AUTH_BEARER (auth)) { -+ gchar *access_token = NULL; -+ gint expires_in_seconds = -1; -+ GError *local_error = NULL; -+ -+ e_source_get_oauth2_access_token_sync ( -+ source, NULL, &access_token, -+ &expires_in_seconds, &local_error); -+ -+ e_soup_auth_bearer_set_access_token ( -+ E_SOUP_AUTH_BEARER (auth), -+ access_token, expires_in_seconds); -+ -+ if (local_error != NULL) { -+ soup_message_set_status_full (msg, SOUP_STATUS_FORBIDDEN, local_error->message); -+ -+ g_error_free (local_error); -+ } -+ -+ g_free (access_token); -+ -+ } else { -+ if (retrying || !authenticator->password) { -+ ESourceRegistryServer *server; -+ EAuthenticationSession *auth_session; -+ -+ server = e_collection_backend_ref_server ( -+ authenticator->collection); -+ -+ auth_session = e_source_registry_server_new_auth_session ( -+ server, -+ E_SOURCE_AUTHENTICATOR (authenticator), -+ e_source_get_uid (source)); -+ if (!e_source_registry_server_authenticate_sync (server, auth_session, NULL, NULL)) { -+ if (authenticator->password) -+ g_string_free (authenticator->password, TRUE); -+ authenticator->password = NULL; -+ } -+ -+ g_object_unref (auth_session); -+ g_object_unref (server); -+ } -+ -+ if (authenticator->username && authenticator->password) -+ soup_auth_authenticate ( -+ auth, authenticator->username, -+ authenticator->password->str); -+ } -+} -+ -+static gboolean -+e_webdav_discover_check_successful (SoupMessage *message, -+ GError **error) -+{ -+ GIOErrorEnum error_code; -+ -+ g_return_val_if_fail (message != NULL, FALSE); -+ -+ /* Loosely copied from the GVFS DAV backend. */ -+ -+ if (SOUP_STATUS_IS_SUCCESSFUL (message->status_code)) -+ return TRUE; -+ -+ switch (message->status_code) { -+ case SOUP_STATUS_CANCELLED: -+ error_code = G_IO_ERROR_CANCELLED; -+ break; -+ case SOUP_STATUS_NOT_FOUND: -+ error_code = G_IO_ERROR_NOT_FOUND; -+ break; -+ case SOUP_STATUS_UNAUTHORIZED: -+ case SOUP_STATUS_PAYMENT_REQUIRED: -+ case SOUP_STATUS_FORBIDDEN: -+ error_code = G_IO_ERROR_PERMISSION_DENIED; -+ break; -+ case SOUP_STATUS_REQUEST_TIMEOUT: -+ error_code = G_IO_ERROR_TIMED_OUT; -+ break; -+ case SOUP_STATUS_CANT_RESOLVE: -+ error_code = G_IO_ERROR_HOST_NOT_FOUND; -+ break; -+ case SOUP_STATUS_NOT_IMPLEMENTED: -+ error_code = G_IO_ERROR_NOT_SUPPORTED; -+ break; -+ case SOUP_STATUS_INSUFFICIENT_STORAGE: -+ error_code = G_IO_ERROR_NO_SPACE; -+ break; -+ case SOUP_STATUS_SSL_FAILED: -+ g_set_error ( -+ error, SOUP_HTTP_ERROR, message->status_code, -+ "HTTP Error: %s", message->reason_phrase); -+ return FALSE; -+ default: -+ error_code = G_IO_ERROR_FAILED; -+ break; -+ } -+ -+ g_set_error ( -+ error, G_IO_ERROR, error_code, -+ "HTTP Error: %s", message->reason_phrase); -+ -+ return FALSE; -+} -+ -+static xmlDocPtr -+e_webdav_discover_parse_xml (SoupMessage *message, -+ const gchar *expected_name, -+ GError **error) -+{ -+ xmlDocPtr doc; -+ xmlNodePtr root; -+ -+ if (!e_webdav_discover_check_successful (message, error)) -+ return NULL; -+ -+ doc = xmlReadMemory ( -+ message->response_body->data, -+ message->response_body->length, -+ "response.xml", NULL, -+ XML_PARSE_NONET | -+ XML_PARSE_NOWARNING | -+ XML_PARSE_NOCDATA | -+ XML_PARSE_COMPACT); -+ -+ if (doc == NULL) { -+ g_set_error_literal ( -+ error, G_IO_ERROR, G_IO_ERROR_FAILED, -+ "Could not parse response"); -+ return NULL; -+ } -+ -+ root = xmlDocGetRootElement (doc); -+ -+ if (root == NULL || root->children == NULL) { -+ g_set_error_literal ( -+ error, G_IO_ERROR, G_IO_ERROR_FAILED, -+ "Empty response"); -+ xmlFreeDoc (doc); -+ return NULL; -+ } -+ -+ if (g_strcmp0 ((gchar *) root->name, expected_name) != 0) { -+ g_set_error_literal ( -+ error, G_IO_ERROR, G_IO_ERROR_FAILED, -+ "Unexpected reply from server"); -+ xmlFreeDoc (doc); -+ return NULL; -+ } -+ -+ return doc; -+} -+ -+static void -+e_webdav_discover_process_user_address_set (xmlXPathContextPtr xp_ctx, -+ GSList **out_calendar_user_addresses) -+{ -+ xmlXPathObjectPtr xp_obj; -+ gint ii, length; -+ -+ if (!out_calendar_user_addresses) -+ return; -+ -+ xp_obj = e_webdav_discover_get_xpath ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response" -+ "/D:propstat" -+ "/D:prop" -+ "/C:calendar-user-address-set"); -+ -+ if (xp_obj == NULL) -+ return; -+ -+ length = xmlXPathNodeSetGetLength (xp_obj->nodesetval); -+ -+ for (ii = 0; ii < length; ii++) { -+ GSList *duplicate; -+ const gchar *address; -+ gchar *href; -+ -+ href = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response" -+ "/D:propstat" -+ "/D:prop" -+ "/C:calendar-user-address-set" -+ "/D:href[%d]", ii + 1); -+ -+ if (href == NULL) -+ continue; -+ -+ if (!g_str_has_prefix (href, "mailto:")) { -+ g_free (href); -+ continue; -+ } -+ -+ /* strlen("mailto:") == 7 */ -+ address = href + 7; -+ -+ /* Avoid duplicates. */ -+ duplicate = g_slist_find_custom ( -+ *out_calendar_user_addresses, -+ address, (GCompareFunc) g_ascii_strcasecmp); -+ -+ if (duplicate != NULL) { -+ g_free (href); -+ continue; -+ } -+ -+ *out_calendar_user_addresses = g_slist_prepend ( -+ *out_calendar_user_addresses, g_strdup (address)); -+ -+ g_free (href); -+ } -+ -+ xmlXPathFreeObject (xp_obj); -+} -+ -+static guint32 -+e_webdav_discover_get_supported_component_set (xmlXPathContextPtr xp_ctx, -+ gint index) -+{ -+ xmlXPathObjectPtr xp_obj; -+ guint32 set = 0; -+ gint ii, length; -+ -+ xp_obj = e_webdav_discover_get_xpath ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response[%d]" -+ "/D:propstat" -+ "/D:prop" -+ "/C:supported-calendar-component-set" -+ "/C:comp", index); -+ -+ /* If the property is not present, assume all component -+ * types are supported. (RFC 4791, Section 5.2.3) */ -+ if (xp_obj == NULL) -+ return E_WEBDAV_DISCOVER_SUPPORTS_EVENTS | -+ E_WEBDAV_DISCOVER_SUPPORTS_MEMOS | -+ E_WEBDAV_DISCOVER_SUPPORTS_TASKS; -+ -+ length = xmlXPathNodeSetGetLength (xp_obj->nodesetval); -+ -+ for (ii = 0; ii < length; ii++) { -+ gchar *name; -+ -+ name = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response[%d]" -+ "/D:propstat" -+ "/D:prop" -+ "/C:supported-calendar-component-set" -+ "/C:comp[%d]" -+ "/@name", index, ii + 1); -+ -+ if (name == NULL) -+ continue; -+ -+ if (g_ascii_strcasecmp (name, "VEVENT") == 0) -+ set |= E_WEBDAV_DISCOVER_SUPPORTS_EVENTS; -+ else if (g_ascii_strcasecmp (name, "VJOURNAL") == 0) -+ set |= E_WEBDAV_DISCOVER_SUPPORTS_MEMOS; -+ else if (g_ascii_strcasecmp (name, "VTODO") == 0) -+ set |= E_WEBDAV_DISCOVER_SUPPORTS_TASKS; -+ -+ g_free (name); -+ } -+ -+ xmlXPathFreeObject (xp_obj); -+ -+ return set; -+} -+ -+static void -+e_webdav_discover_process_calendar_response (SoupMessage *message, -+ xmlXPathContextPtr xp_ctx, -+ gint index, -+ GSList **out_discovered_sources) -+{ -+ xmlXPathObjectPtr xp_obj; -+ guint32 comp_set; -+ gchar *color_spec; -+ gchar *display_name; -+ gchar *description; -+ gchar *href_encoded; -+ gchar *status_line; -+ guint status; -+ gboolean success; -+ EWebDAVDiscoveredSource *discovered_source; -+ -+ if (!out_discovered_sources) -+ return; -+ -+ status_line = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response[%d]" -+ "/D:propstat" -+ "/D:status", -+ index); -+ -+ if (status_line == NULL) -+ return; -+ -+ success = soup_headers_parse_status_line ( -+ status_line, NULL, &status, NULL); -+ -+ g_free (status_line); -+ -+ if (!success || status != SOUP_STATUS_OK) -+ return; -+ -+ comp_set = e_webdav_discover_get_supported_component_set (xp_ctx, index); -+ if (comp_set == E_WEBDAV_DISCOVER_SUPPORTS_NONE) -+ return; -+ -+ href_encoded = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response[%d]" -+ "/D:href", -+ index); -+ -+ if (href_encoded == NULL) -+ return; -+ -+ /* Make sure the resource is a calendar. */ -+ -+ xp_obj = e_webdav_discover_get_xpath ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response[%d]" -+ "/D:propstat" -+ "/D:prop" -+ "/D:resourcetype" -+ "/C:calendar", -+ index); -+ -+ if (xp_obj == NULL) { -+ g_free (href_encoded); -+ return; -+ } -+ -+ xmlXPathFreeObject (xp_obj); -+ -+ /* Get the display name or fall back to the href. */ -+ -+ display_name = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response[%d]" -+ "/D:propstat" -+ "/D:prop" -+ "/D:displayname", -+ index); -+ -+ if (display_name == NULL) { -+ gchar *href_decoded = soup_uri_decode (href_encoded); -+ -+ if (href_decoded) { -+ gchar *cp; -+ -+ /* Use the last non-empty path segment. */ -+ while ((cp = strrchr (href_decoded, '/')) != NULL) { -+ if (*(cp + 1) == '\0') -+ *cp = '\0'; -+ else { -+ display_name = g_strdup (cp + 1); -+ break; -+ } -+ } -+ } -+ -+ g_free (href_decoded); -+ } -+ -+ description = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response[%d]" -+ "/D:propstat" -+ "/D:prop" -+ "/C:calendar-description", -+ index); -+ -+ /* Get the color specification string. */ -+ -+ color_spec = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response[%d]" -+ "/D:propstat" -+ "/D:prop" -+ "/IC:calendar-color", -+ index); -+ -+ discovered_source = g_new0 (EWebDAVDiscoveredSource, 1); -+ discovered_source->href = e_webdav_discover_make_href_full_uri (soup_message_get_uri (message), href_encoded); -+ discovered_source->supports = comp_set; -+ discovered_source->display_name = g_strdup (display_name); -+ discovered_source->description = g_strdup (description); -+ discovered_source->color = g_strdup (color_spec); -+ -+ *out_discovered_sources = g_slist_prepend (*out_discovered_sources, discovered_source); -+ -+ g_free (href_encoded); -+ g_free (display_name); -+ g_free (description); -+ g_free (color_spec); -+} -+ -+static gboolean -+e_webdav_discover_get_calendar_collection_details (SoupSession *session, -+ SoupMessage *message, -+ const gchar *path_or_uri, -+ ESource *source, -+ GSList **out_discovered_sources, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ xmlDocPtr doc; -+ xmlXPathContextPtr xp_ctx; -+ xmlXPathObjectPtr xp_obj; -+ SoupURI *soup_uri; -+ -+ if (g_cancellable_is_cancelled (cancellable)) -+ return FALSE; -+ -+ soup_uri = soup_uri_new (path_or_uri); -+ if (!soup_uri || -+ !soup_uri_get_scheme (soup_uri) || -+ !soup_uri_get_host (soup_uri) || -+ !soup_uri_get_path (soup_uri) || -+ !*soup_uri_get_scheme (soup_uri) || -+ !*soup_uri_get_host (soup_uri) || -+ !*soup_uri_get_path (soup_uri)) { -+ /* it's a path only, not full uri */ -+ if (soup_uri) -+ soup_uri_free (soup_uri); -+ soup_uri = soup_uri_copy (soup_message_get_uri (message)); -+ soup_uri_set_path (soup_uri, path_or_uri); -+ } -+ -+ message = e_webdav_discover_new_propfind ( -+ session, soup_uri, DEPTH_1, -+ NS_WEBDAV, XC ("displayname"), -+ NS_WEBDAV, XC ("resourcetype"), -+ NS_CALDAV, XC ("calendar-description"), -+ NS_CALDAV, XC ("supported-calendar-component-set"), -+ NS_CALDAV, XC ("calendar-user-address-set"), -+ NS_ICAL, XC ("calendar-color"), -+ NULL); -+ -+ /* This takes ownership of the message. */ -+ soup_session_send_message (session, message); -+ -+ soup_uri_free (soup_uri); -+ -+ doc = e_webdav_discover_parse_xml (message, "multistatus", error); -+ if (!doc) -+ return FALSE; -+ -+ xp_ctx = xmlXPathNewContext (doc); -+ xmlXPathRegisterNs (xp_ctx, XC ("D"), XC (NS_WEBDAV)); -+ xmlXPathRegisterNs (xp_ctx, XC ("C"), XC (NS_CALDAV)); -+ xmlXPathRegisterNs (xp_ctx, XC ("A"), XC (NS_CARDDAV)); -+ xmlXPathRegisterNs (xp_ctx, XC ("IC"), XC (NS_ICAL)); -+ -+ xp_obj = e_webdav_discover_get_xpath ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response"); -+ -+ if (xp_obj != NULL) { -+ gint length, ii; -+ -+ length = xmlXPathNodeSetGetLength (xp_obj->nodesetval); -+ -+ for (ii = 0; ii < length; ii++) -+ e_webdav_discover_process_calendar_response ( -+ message, xp_ctx, ii + 1, out_discovered_sources); -+ -+ xmlXPathFreeObject (xp_obj); -+ } -+ -+ xmlXPathFreeContext (xp_ctx); -+ xmlFreeDoc (doc); -+ -+ return TRUE; -+} -+ -+static gboolean -+e_webdav_discover_process_calendar_home_set (SoupSession *session, -+ SoupMessage *message, -+ ESource *source, -+ GSList **out_discovered_sources, -+ GSList **out_calendar_user_addresses, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ SoupURI *soup_uri; -+ xmlDocPtr doc; -+ xmlXPathContextPtr xp_ctx; -+ xmlXPathObjectPtr xp_obj; -+ gchar *calendar_home_set; -+ gboolean success; -+ -+ g_return_val_if_fail (SOUP_IS_SESSION (session), FALSE); -+ g_return_val_if_fail (SOUP_IS_MESSAGE (message), FALSE); -+ g_return_val_if_fail (out_discovered_sources != NULL, FALSE); -+ g_return_val_if_fail (E_IS_SOURCE (source), FALSE); -+ -+ if (g_cancellable_is_cancelled (cancellable)) -+ return FALSE; -+ -+ doc = e_webdav_discover_parse_xml (message, "multistatus", error); -+ -+ if (!doc) -+ return FALSE; -+ -+ xp_ctx = xmlXPathNewContext (doc); -+ xmlXPathRegisterNs (xp_ctx, XC ("D"), XC (NS_WEBDAV)); -+ xmlXPathRegisterNs (xp_ctx, XC ("C"), XC (NS_CALDAV)); -+ xmlXPathRegisterNs (xp_ctx, XC ("A"), XC (NS_CARDDAV)); -+ -+ /* Record any "C:calendar-user-address-set" properties. */ -+ e_webdav_discover_process_user_address_set (xp_ctx, out_calendar_user_addresses); -+ -+ /* Try to find the calendar home URL using the -+ * following properties in order of preference: -+ * -+ * "C:calendar-home-set" -+ * "D:current-user-principal" -+ * "D:principal-URL" -+ * -+ * If the second or third URL preference is used, rerun -+ * the PROPFIND method on that URL at Depth=1 in hopes -+ * of getting a proper "C:calendar-home-set" property. -+ */ -+ -+ /* FIXME There can be multiple "D:href" elements for a -+ * "C:calendar-home-set". We're only processing -+ * the first one. Need to iterate over them. */ -+ -+ calendar_home_set = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response" -+ "/D:propstat" -+ "/D:prop" -+ "/C:calendar-home-set" -+ "/D:href"); -+ -+ if (calendar_home_set != NULL) -+ goto get_collection_details; -+ -+ g_free (calendar_home_set); -+ -+ calendar_home_set = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response" -+ "/D:propstat" -+ "/D:prop" -+ "/D:current-user-principal" -+ "/D:href"); -+ -+ if (calendar_home_set != NULL) -+ goto retry_propfind; -+ -+ g_free (calendar_home_set); -+ -+ calendar_home_set = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response" -+ "/D:propstat" -+ "/D:prop" -+ "/D:principal-URL" -+ "/D:href"); -+ -+ if (calendar_home_set != NULL) -+ goto retry_propfind; -+ -+ g_free (calendar_home_set); -+ calendar_home_set = NULL; -+ -+ /* None of the aforementioned properties are present. If the -+ * user-supplied CalDAV URL is a calendar resource, use that. */ -+ -+ xp_obj = e_webdav_discover_get_xpath ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response" -+ "/D:propstat" -+ "/D:prop" -+ "/D:resourcetype" -+ "/C:calendar"); -+ -+ if (xp_obj != NULL) { -+ soup_uri = soup_message_get_uri (message); -+ -+ if (soup_uri->path != NULL && *soup_uri->path != '\0') { -+ gchar *slash; -+ -+ soup_uri = soup_uri_copy (soup_uri); -+ -+ slash = strrchr (soup_uri->path, '/'); -+ while (slash != NULL && slash != soup_uri->path) { -+ -+ if (slash[1] != '\0') { -+ slash[1] = '\0'; -+ calendar_home_set = -+ g_strdup (soup_uri->path); -+ break; -+ } -+ -+ slash[0] = '\0'; -+ slash = strrchr (soup_uri->path, '/'); -+ } -+ -+ soup_uri_free (soup_uri); -+ } -+ -+ xmlXPathFreeObject (xp_obj); -+ } -+ -+ if (calendar_home_set == NULL || *calendar_home_set == '\0') { -+ g_free (calendar_home_set); -+ xmlXPathFreeContext (xp_ctx); -+ xmlFreeDoc (doc); -+ return TRUE; -+ } -+ -+ get_collection_details: -+ -+ xmlXPathFreeContext (xp_ctx); -+ xmlFreeDoc (doc); -+ -+ if (!e_webdav_discover_get_calendar_collection_details ( -+ session, message, calendar_home_set, source, -+ out_discovered_sources, cancellable, error)) { -+ g_free (calendar_home_set); -+ return FALSE; -+ } -+ -+ g_free (calendar_home_set); -+ -+ return TRUE; -+ -+ retry_propfind: -+ -+ xmlXPathFreeContext (xp_ctx); -+ xmlFreeDoc (doc); -+ -+ soup_uri = soup_uri_copy (soup_message_get_uri (message)); -+ soup_uri_set_path (soup_uri, calendar_home_set); -+ -+ /* Note that we omit "D:resourcetype", "D:current-user-principal" -+ * and "D:principal-URL" in order to short-circuit the recursion. */ -+ message = e_webdav_discover_new_propfind ( -+ session, soup_uri, DEPTH_1, -+ NS_CALDAV, XC ("calendar-home-set"), -+ NS_CALDAV, XC ("calendar-user-address-set"), -+ NULL); -+ -+ /* This takes ownership of the message. */ -+ soup_session_send_message (session, message); -+ -+ soup_uri_free (soup_uri); -+ -+ g_free (calendar_home_set); -+ -+ success = e_webdav_discover_process_calendar_home_set (session, message, source, -+ out_discovered_sources, out_calendar_user_addresses, -+ cancellable, error); -+ -+ g_object_unref (message); -+ -+ return success; -+} -+ -+static void -+e_webdav_discover_process_addressbook_response (SoupMessage *message, -+ xmlXPathContextPtr xp_ctx, -+ gint index, -+ GSList **out_discovered_sources) -+{ -+ xmlXPathObjectPtr xp_obj; -+ gchar *display_name; -+ gchar *description; -+ gchar *href_encoded; -+ gchar *status_line; -+ guint status; -+ gboolean success; -+ EWebDAVDiscoveredSource *discovered_source; -+ -+ if (!out_discovered_sources) -+ return; -+ -+ status_line = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response[%d]" -+ "/D:propstat" -+ "/D:status", -+ index); -+ -+ if (status_line == NULL) -+ return; -+ -+ success = soup_headers_parse_status_line ( -+ status_line, NULL, &status, NULL); -+ -+ g_free (status_line); -+ -+ if (!success || status != SOUP_STATUS_OK) -+ return; -+ -+ href_encoded = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response[%d]" -+ "/D:href", -+ index); -+ -+ if (href_encoded == NULL) -+ return; -+ -+ /* Make sure the resource is an addressbook. */ -+ -+ xp_obj = e_webdav_discover_get_xpath ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response[%d]" -+ "/D:propstat" -+ "/D:prop" -+ "/D:resourcetype" -+ "/A:addressbook", -+ index); -+ -+ if (xp_obj == NULL) { -+ g_free (href_encoded); -+ return; -+ } -+ -+ xmlXPathFreeObject (xp_obj); -+ -+ /* Get the display name or fall back to the href. */ -+ -+ display_name = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response[%d]" -+ "/D:propstat" -+ "/D:prop" -+ "/D:displayname", -+ index); -+ -+ if (display_name == NULL) { -+ gchar *href_decoded = soup_uri_decode (href_encoded); -+ -+ if (href_decoded) { -+ gchar *cp; -+ -+ /* Use the last non-empty path segment. */ -+ while ((cp = strrchr (href_decoded, '/')) != NULL) { -+ if (*(cp + 1) == '\0') -+ *cp = '\0'; -+ else { -+ display_name = g_strdup (cp + 1); -+ break; -+ } -+ } -+ } -+ -+ g_free (href_decoded); -+ } -+ -+ description = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response[%d]" -+ "/D:propstat" -+ "/D:prop" -+ "/A:addressbook-description", -+ index); -+ -+ discovered_source = g_new0 (EWebDAVDiscoveredSource, 1); -+ discovered_source->href = e_webdav_discover_make_href_full_uri (soup_message_get_uri (message), href_encoded); -+ discovered_source->supports = E_WEBDAV_DISCOVER_SUPPORTS_CONTACTS; -+ discovered_source->display_name = g_strdup (display_name); -+ discovered_source->description = g_strdup (description); -+ discovered_source->color = NULL; -+ -+ *out_discovered_sources = g_slist_prepend (*out_discovered_sources, discovered_source); -+ -+ g_free (href_encoded); -+ g_free (display_name); -+ g_free (description); -+} -+ -+static gboolean -+e_webdav_discover_get_addressbook_collection_details (SoupSession *session, -+ SoupMessage *message, -+ const gchar *path_or_uri, -+ ESource *source, -+ GSList **out_discovered_sources, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ xmlDocPtr doc; -+ xmlXPathContextPtr xp_ctx; -+ xmlXPathObjectPtr xp_obj; -+ SoupURI *soup_uri; -+ -+ if (g_cancellable_is_cancelled (cancellable)) -+ return FALSE; -+ -+ soup_uri = soup_uri_new (path_or_uri); -+ if (!soup_uri || -+ !soup_uri_get_scheme (soup_uri) || -+ !soup_uri_get_host (soup_uri) || -+ !soup_uri_get_path (soup_uri) || -+ !*soup_uri_get_scheme (soup_uri) || -+ !*soup_uri_get_host (soup_uri) || -+ !*soup_uri_get_path (soup_uri)) { -+ /* it's a path only, not full uri */ -+ if (soup_uri) -+ soup_uri_free (soup_uri); -+ soup_uri = soup_uri_copy (soup_message_get_uri (message)); -+ soup_uri_set_path (soup_uri, path_or_uri); -+ } -+ -+ message = e_webdav_discover_new_propfind ( -+ session, soup_uri, DEPTH_1, -+ NS_WEBDAV, XC ("displayname"), -+ NS_WEBDAV, XC ("resourcetype"), -+ NS_CARDDAV, XC ("addressbook-description"), -+ NULL); -+ -+ /* This takes ownership of the message. */ -+ soup_session_send_message (session, message); -+ -+ soup_uri_free (soup_uri); -+ -+ doc = e_webdav_discover_parse_xml (message, "multistatus", error); -+ if (!doc) -+ return FALSE; -+ -+ xp_ctx = xmlXPathNewContext (doc); -+ xmlXPathRegisterNs (xp_ctx, XC ("D"), XC (NS_WEBDAV)); -+ xmlXPathRegisterNs (xp_ctx, XC ("C"), XC (NS_CALDAV)); -+ xmlXPathRegisterNs (xp_ctx, XC ("A"), XC (NS_CARDDAV)); -+ xmlXPathRegisterNs (xp_ctx, XC ("IC"), XC (NS_ICAL)); -+ -+ xp_obj = e_webdav_discover_get_xpath ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response"); -+ -+ if (xp_obj != NULL) { -+ gint length, ii; -+ -+ length = xmlXPathNodeSetGetLength (xp_obj->nodesetval); -+ -+ for (ii = 0; ii < length; ii++) -+ e_webdav_discover_process_addressbook_response ( -+ message, xp_ctx, ii + 1, out_discovered_sources); -+ -+ xmlXPathFreeObject (xp_obj); -+ } -+ -+ xmlXPathFreeContext (xp_ctx); -+ xmlFreeDoc (doc); -+ -+ return TRUE; -+} -+ -+static gboolean -+e_webdav_discover_process_addressbook_home_set (SoupSession *session, -+ SoupMessage *message, -+ ESource *source, -+ GSList **out_discovered_sources, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ SoupURI *soup_uri; -+ xmlDocPtr doc; -+ xmlXPathContextPtr xp_ctx; -+ xmlXPathObjectPtr xp_obj; -+ gchar *addressbook_home_set; -+ gboolean success; -+ -+ g_return_val_if_fail (SOUP_IS_SESSION (session), FALSE); -+ g_return_val_if_fail (SOUP_IS_MESSAGE (message), FALSE); -+ g_return_val_if_fail (out_discovered_sources != NULL, FALSE); -+ g_return_val_if_fail (E_IS_SOURCE (source), FALSE); -+ -+ if (g_cancellable_is_cancelled (cancellable)) -+ return FALSE; -+ -+ doc = e_webdav_discover_parse_xml (message, "multistatus", error); -+ -+ if (!doc) -+ return FALSE; -+ -+ xp_ctx = xmlXPathNewContext (doc); -+ xmlXPathRegisterNs (xp_ctx, XC ("D"), XC (NS_WEBDAV)); -+ xmlXPathRegisterNs (xp_ctx, XC ("C"), XC (NS_CALDAV)); -+ xmlXPathRegisterNs (xp_ctx, XC ("A"), XC (NS_CARDDAV)); -+ -+ /* Try to find the addressbook home URL using the -+ * following properties in order of preference: -+ * -+ * "A:addressbook-home-set" -+ * "D:current-user-principal" -+ * "D:principal-URL" -+ * -+ * If the second or third URL preference is used, rerun -+ * the PROPFIND method on that URL at Depth=1 in hopes -+ * of getting a proper "A:addressbook-home-set" property. -+ */ -+ -+ /* FIXME There can be multiple "D:href" elements for a -+ * "A:addressbook-home-set". We're only processing -+ * the first one. Need to iterate over them. */ -+ -+ addressbook_home_set = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response" -+ "/D:propstat" -+ "/D:prop" -+ "/A:addressbook-home-set" -+ "/D:href"); -+ -+ if (addressbook_home_set != NULL) -+ goto get_collection_details; -+ -+ g_free (addressbook_home_set); -+ -+ addressbook_home_set = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response" -+ "/D:propstat" -+ "/D:prop" -+ "/D:current-user-principal" -+ "/D:href"); -+ -+ if (addressbook_home_set != NULL) -+ goto retry_propfind; -+ -+ g_free (addressbook_home_set); -+ -+ addressbook_home_set = e_webdav_discover_get_xpath_string ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response" -+ "/D:propstat" -+ "/D:prop" -+ "/D:principal-URL" -+ "/D:href"); -+ -+ if (addressbook_home_set != NULL) -+ goto retry_propfind; -+ -+ g_free (addressbook_home_set); -+ addressbook_home_set = NULL; -+ -+ /* None of the aforementioned properties are present. If the -+ * user-supplied CardDAV URL is an addressbook resource, use that. */ -+ -+ xp_obj = e_webdav_discover_get_xpath ( -+ xp_ctx, -+ "/D:multistatus" -+ "/D:response" -+ "/D:propstat" -+ "/D:prop" -+ "/D:resourcetype" -+ "/A:addressbook"); -+ -+ if (xp_obj != NULL) { -+ soup_uri = soup_message_get_uri (message); -+ -+ if (soup_uri->path != NULL && *soup_uri->path != '\0') { -+ gchar *slash; -+ -+ soup_uri = soup_uri_copy (soup_uri); -+ -+ slash = strrchr (soup_uri->path, '/'); -+ while (slash != NULL && slash != soup_uri->path) { -+ -+ if (slash[1] != '\0') { -+ slash[1] = '\0'; -+ addressbook_home_set = -+ g_strdup (soup_uri->path); -+ break; -+ } -+ -+ slash[0] = '\0'; -+ slash = strrchr (soup_uri->path, '/'); -+ } -+ -+ soup_uri_free (soup_uri); -+ } -+ -+ xmlXPathFreeObject (xp_obj); -+ } -+ -+ if (addressbook_home_set == NULL || *addressbook_home_set == '\0') { -+ g_free (addressbook_home_set); -+ xmlXPathFreeContext (xp_ctx); -+ xmlFreeDoc (doc); -+ return TRUE; -+ } -+ -+ get_collection_details: -+ -+ xmlXPathFreeContext (xp_ctx); -+ xmlFreeDoc (doc); -+ -+ if (!e_webdav_discover_get_addressbook_collection_details ( -+ session, message, addressbook_home_set, source, -+ out_discovered_sources, cancellable, error)) { -+ g_free (addressbook_home_set); -+ return FALSE; -+ } -+ -+ g_free (addressbook_home_set); -+ -+ return TRUE; -+ -+ retry_propfind: -+ -+ xmlXPathFreeContext (xp_ctx); -+ xmlFreeDoc (doc); -+ -+ soup_uri = soup_uri_copy (soup_message_get_uri (message)); -+ soup_uri_set_path (soup_uri, addressbook_home_set); -+ -+ /* Note that we omit "D:resourcetype", "D:current-user-principal" -+ * and "D:principal-URL" in order to short-circuit the recursion. */ -+ message = e_webdav_discover_new_propfind ( -+ session, soup_uri, DEPTH_1, -+ NS_CARDDAV, XC ("addressbook-home-set"), -+ NULL); -+ -+ /* This takes ownership of the message. */ -+ soup_session_send_message (session, message); -+ -+ soup_uri_free (soup_uri); -+ -+ g_free (addressbook_home_set); -+ -+ success = e_webdav_discover_process_addressbook_home_set (session, message, source, -+ out_discovered_sources, cancellable, error); -+ -+ g_object_unref (message); -+ -+ return success; -+} -+ -+static ETrustPromptResponse -+trust_prompt_sync (const ENamedParameters *parameters, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ EUserPrompter *prompter; -+ gint response; -+ -+ g_return_val_if_fail ( -+ parameters != NULL, E_TRUST_PROMPT_RESPONSE_UNKNOWN); -+ -+ prompter = e_user_prompter_new (); -+ g_return_val_if_fail ( -+ prompter != NULL, E_TRUST_PROMPT_RESPONSE_UNKNOWN); -+ -+ response = e_user_prompter_extension_prompt_sync ( -+ prompter, "ETrustPrompt::trust-prompt", -+ parameters, NULL, cancellable, error); -+ -+ g_object_unref (prompter); -+ -+ if (response == 0) -+ return E_TRUST_PROMPT_RESPONSE_REJECT; -+ if (response == 1) -+ return E_TRUST_PROMPT_RESPONSE_ACCEPT; -+ if (response == 2) -+ return E_TRUST_PROMPT_RESPONSE_ACCEPT_TEMPORARILY; -+ if (response == -1) -+ return E_TRUST_PROMPT_RESPONSE_REJECT_TEMPORARILY; -+ -+ return E_TRUST_PROMPT_RESPONSE_UNKNOWN; -+} -+ -+static void -+e_webdav_discover_source_free (gpointer ptr) -+{ -+ EWebDAVDiscoveredSource *discovered_source = ptr; -+ -+ if (discovered_source) { -+ g_free (discovered_source->href); -+ g_free (discovered_source->display_name); -+ g_free (discovered_source->description); -+ g_free (discovered_source->color); -+ g_free (discovered_source); -+ } -+} -+ -+void -+e_webdav_discover_free_discovered_sources (GSList *discovered_sources) -+{ -+ g_slist_free_full (discovered_sources, e_webdav_discover_source_free); -+} -+ -+static void -+e_webdav_discover_sources_thread (GTask *task, -+ gpointer source_object, -+ gpointer task_data, -+ GCancellable *cancellable) -+{ -+ EWebDAVDiscoverContext *context = task_data; -+ gboolean success; -+ GError *local_error = NULL; -+ -+ g_return_if_fail (context != NULL); -+ g_return_if_fail (E_IS_COLLECTION_BACKEND (source_object)); -+ -+ success = e_webdav_discover_sources_sync (E_COLLECTION_BACKEND (source_object), -+ context->url_use_path, &context->out_discovered_sources, -+ &context->out_calendar_user_addresses, cancellable, &local_error); -+ -+ if (local_error != NULL) { -+ g_task_return_error (task, local_error); -+ } else { -+ g_task_return_boolean (task, success); -+ } -+} -+ -+void -+e_webdav_discover_sources (ECollectionBackend *collection, -+ const gchar *url_use_path, -+ GCancellable *cancellable, -+ GAsyncReadyCallback callback, -+ gpointer user_data) -+{ -+ EWebDAVDiscoverContext *context; -+ GTask *task; -+ -+ g_return_if_fail (E_IS_COLLECTION_BACKEND (collection)); -+ -+ context = e_webdav_discover_context_new (collection, url_use_path); -+ -+ task = g_task_new (collection, cancellable, callback, user_data); -+ g_task_set_source_tag (task, e_webdav_discover_sources); -+ g_task_set_task_data (task, context, e_webdav_discover_context_free); -+ -+ g_task_run_in_thread (task, e_webdav_discover_sources_thread); -+ -+ g_object_unref (task); -+} -+ -+gboolean -+e_webdav_discover_sources_finish (ECollectionBackend *collection, -+ GAsyncResult *result, -+ GSList **out_discovered_sources, -+ GSList **out_calendar_user_addresses, -+ GError **error) -+{ -+ EWebDAVDiscoverContext *context; -+ -+ g_return_val_if_fail (E_IS_COLLECTION_BACKEND (collection), FALSE); -+ g_return_val_if_fail (g_task_is_valid (result, collection), FALSE); -+ -+ g_return_val_if_fail ( -+ g_async_result_is_tagged ( -+ result, e_webdav_discover_sources), FALSE); -+ -+ if (!g_task_propagate_boolean (G_TASK (result), error)) -+ return FALSE; -+ -+ context = g_task_get_task_data (G_TASK (result)); -+ g_return_val_if_fail (context != NULL, FALSE); -+ -+ if (out_discovered_sources) { -+ *out_discovered_sources = context->out_discovered_sources; -+ context->out_discovered_sources = NULL; -+ } -+ -+ if (out_calendar_user_addresses) { -+ *out_calendar_user_addresses = context->out_calendar_user_addresses; -+ context->out_calendar_user_addresses = NULL; -+ } -+ -+ return TRUE; -+} -+ -+static void -+e_webdav_discover_cancelled_cb (GCancellable *cancellable, -+ SoupSession *session) -+{ -+ soup_session_abort (session); -+} -+ -+gboolean -+e_webdav_discover_sources_sync (ECollectionBackend *collection, -+ const gchar *url_use_path, -+ GSList **out_discovered_sources, -+ GSList **out_calendar_user_addresses, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ ESourceWebdav *webdav_extension; -+ ESourceCollection *collection_extension; -+ ESource *source; -+ EWebdavAuthenticator *authenticator; -+ SoupSession *session; -+ SoupMessage *message; -+ SoupURI *soup_uri; -+ gulong cancelled_handler_id = 0, authenticate_handler_id; -+ gboolean success; -+ -+ g_return_val_if_fail (E_IS_COLLECTION_BACKEND (collection), FALSE); -+ -+ source = e_backend_get_source (E_BACKEND (collection)); -+ collection_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_COLLECTION); -+ -+ if (url_use_path && (g_ascii_strncasecmp (url_use_path, "http://", 7) == 0 || -+ g_ascii_strncasecmp (url_use_path, "https://", 8) == 0)) { -+ soup_uri = soup_uri_new (url_use_path); -+ url_use_path = NULL; -+ } else { -+ g_return_val_if_fail (e_source_has_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND), FALSE); -+ -+ webdav_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND); -+ soup_uri = e_source_webdav_dup_soup_uri (webdav_extension); -+ } -+ -+ g_return_val_if_fail (soup_uri != NULL, FALSE); -+ -+ if (url_use_path) { -+ GString *new_path; -+ -+ /* Absolute path overrides whole path, while relative path is only appended. */ -+ if (*url_use_path == '/') { -+ new_path = g_string_new (url_use_path); -+ } else { -+ const gchar *current_path; -+ -+ current_path = soup_uri_get_path (soup_uri); -+ new_path = g_string_new (current_path ? current_path : ""); -+ if (!new_path->len || new_path->str[new_path->len - 1] != '/') -+ g_string_append_c (new_path, '/'); -+ g_string_append (new_path, url_use_path); -+ } -+ -+ if (!new_path->len || new_path->str[new_path->len - 1] != '/') -+ g_string_append_c (new_path, '/'); -+ -+ soup_uri_set_path (soup_uri, new_path->str); -+ -+ g_string_free (new_path, TRUE); -+ } -+ -+ session = soup_session_new (); -+ message = e_webdav_discover_new_propfind ( -+ session, soup_uri, DEPTH_0, -+ NS_WEBDAV, XC ("resourcetype"), -+ NS_WEBDAV, XC ("current-user-principal"), -+ NS_WEBDAV, XC ("principal-URL"), -+ NS_CALDAV, XC ("calendar-home-set"), -+ NS_CALDAV, XC ("calendar-user-address-set"), -+ NS_CARDDAV, XC ("addressbook-home-set"), -+ NS_CARDDAV, XC ("principal-address"), -+ NULL); -+ -+ if (!message) { -+ soup_uri_free (soup_uri); -+ g_object_unref (session); -+ return FALSE; -+ } -+ -+ if (g_getenv ("WEBDAV_DEBUG") != NULL) { -+ SoupLogger *logger; -+ -+ logger = soup_logger_new (SOUP_LOGGER_LOG_BODY, 100 * 1024 * 1024); -+ soup_session_add_feature (session, SOUP_SESSION_FEATURE (logger)); -+ g_object_unref (logger); -+ } -+ -+ if (e_source_has_extension (source, E_SOURCE_EXTENSION_AUTHENTICATION) || e_source_has_extension (source, E_SOURCE_EXTENSION_GOA)) { -+ SoupSessionFeature *feature; -+ ESourceAuthentication *auth_extension; -+ gchar *auth_method; -+ -+ feature = soup_session_get_feature (session, SOUP_TYPE_AUTH_MANAGER); -+ soup_session_feature_add_feature (feature, E_TYPE_SOUP_AUTH_BEARER); -+ -+ success = TRUE; -+ -+ auth_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_AUTHENTICATION); -+ auth_method = e_source_authentication_dup_method (auth_extension); -+ -+ if (g_strcmp0 (auth_method, "OAuth2") == 0 || e_source_has_extension (source, E_SOURCE_EXTENSION_GOA)) { -+ SoupAuth *soup_auth; -+ gchar *access_token = NULL; -+ gint expires_in_seconds = -1; -+ -+ soup_auth = g_object_new (E_TYPE_SOUP_AUTH_BEARER, SOUP_AUTH_HOST, soup_uri->host, NULL); -+ -+ success = e_source_get_oauth2_access_token_sync ( -+ source, cancellable, &access_token, -+ &expires_in_seconds, error); -+ -+ if (success) { -+ e_soup_auth_bearer_set_access_token ( -+ E_SOUP_AUTH_BEARER (soup_auth), -+ access_token, expires_in_seconds); -+ -+ soup_auth_manager_use_auth ( -+ SOUP_AUTH_MANAGER (feature), -+ soup_uri, soup_auth); -+ } -+ -+ g_free (access_token); -+ g_object_unref (soup_auth); -+ } -+ -+ g_free (auth_method); -+ -+ if (!success) { -+ soup_uri_free (soup_uri); -+ g_object_unref (message); -+ g_object_unref (session); -+ return FALSE; -+ } -+ } -+ -+ authenticator = g_object_new (E_TYPE_WEBDAV_AUTHENTICATOR, NULL); -+ authenticator->collection = collection; -+ authenticator->username = e_source_collection_dup_identity (collection_extension); -+ -+ authenticate_handler_id = g_signal_connect (session, "authenticate", -+ G_CALLBACK (e_webdav_discover_authenticate_cb), authenticator); -+ -+ if (cancellable) -+ cancelled_handler_id = g_cancellable_connect (cancellable, G_CALLBACK (e_webdav_discover_cancelled_cb), session, NULL); -+ -+ if (!g_cancellable_set_error_if_cancelled (cancellable, error)) { -+ GSList *calendars = NULL, *addressbooks = NULL; -+ -+ if (soup_session_send_message (session, message) == SOUP_STATUS_SSL_FAILED) { -+ ETrustPromptResponse response; -+ ENamedParameters *parameters; -+ ESourceWebdav *extension; -+ ESource *source; -+ -+ source = e_backend_get_source (E_BACKEND (collection)); -+ extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND); -+ parameters = e_named_parameters_new (); -+ -+ /* this is the master source, thus there is no parent_source */ -+ response = e_source_webdav_prepare_ssl_trust_prompt_with_parent (extension, message, NULL, parameters); -+ if (response == E_TRUST_PROMPT_RESPONSE_UNKNOWN) { -+ response = trust_prompt_sync (parameters, NULL, NULL); -+ if (response != E_TRUST_PROMPT_RESPONSE_UNKNOWN) -+ e_source_webdav_store_ssl_trust_prompt (extension, message, response); -+ } -+ -+ e_named_parameters_free (parameters); -+ -+ if (response == E_TRUST_PROMPT_RESPONSE_ACCEPT || -+ response == E_TRUST_PROMPT_RESPONSE_ACCEPT_TEMPORARILY) { -+ g_object_set (session, SOUP_SESSION_SSL_STRICT, FALSE, NULL); -+ -+ soup_session_send_message (session, message); -+ } -+ } -+ -+ success = e_webdav_discover_process_calendar_home_set (session, message, source, -+ &calendars, out_calendar_user_addresses, cancellable, error); -+ if (success) -+ success = e_webdav_discover_process_addressbook_home_set (session, message, source, -+ &addressbooks, cancellable, error); -+ -+ if (success && !calendars && !g_cancellable_is_cancelled (cancellable)) { -+ g_clear_object (&message); -+ -+ soup_uri_set_path (soup_uri, "/.well-known/caldav"); -+ -+ message = e_webdav_discover_new_propfind ( -+ session, soup_uri, DEPTH_0, -+ NS_WEBDAV, XC ("resourcetype"), -+ NS_WEBDAV, XC ("current-user-principal"), -+ NS_WEBDAV, XC ("principal-URL"), -+ NS_CALDAV, XC ("calendar-home-set"), -+ NS_CALDAV, XC ("calendar-user-address-set"), -+ NULL); -+ -+ if (message) { -+ soup_session_send_message (session, message); -+ -+ /* Ignore errors here */ -+ e_webdav_discover_process_calendar_home_set (session, message, source, -+ &calendars, out_calendar_user_addresses, cancellable, NULL); -+ } -+ } -+ -+ if (success && !addressbooks && !g_cancellable_is_cancelled (cancellable)) { -+ g_clear_object (&message); -+ -+ soup_uri_set_path (soup_uri, "/.well-known/carddav"); -+ -+ message = e_webdav_discover_new_propfind ( -+ session, soup_uri, DEPTH_0, -+ NS_WEBDAV, XC ("resourcetype"), -+ NS_WEBDAV, XC ("current-user-principal"), -+ NS_WEBDAV, XC ("principal-URL"), -+ NS_CARDDAV, XC ("addressbook-home-set"), -+ NS_CARDDAV, XC ("principal-address"), -+ NULL); -+ -+ if (message) { -+ soup_session_send_message (session, message); -+ -+ /* Ignore errors here */ -+ e_webdav_discover_process_addressbook_home_set (session, message, source, -+ &addressbooks, cancellable, NULL); -+ } -+ } -+ -+ if (out_discovered_sources) { -+ if (calendars) -+ *out_discovered_sources = g_slist_concat (*out_discovered_sources, calendars); -+ if (addressbooks) -+ *out_discovered_sources = g_slist_concat (*out_discovered_sources, addressbooks); -+ } else { -+ e_webdav_discover_free_discovered_sources (calendars); -+ e_webdav_discover_free_discovered_sources (addressbooks); -+ } -+ -+ if (out_calendar_user_addresses && *out_calendar_user_addresses) -+ *out_calendar_user_addresses = g_slist_reverse (*out_calendar_user_addresses); -+ -+ if (out_discovered_sources && *out_discovered_sources) -+ *out_discovered_sources = g_slist_reverse (*out_discovered_sources); -+ } else { -+ success = FALSE; -+ } -+ -+ if (cancellable && cancelled_handler_id) -+ g_cancellable_disconnect (cancellable, cancelled_handler_id); -+ -+ if (authenticate_handler_id) -+ g_signal_handler_disconnect (session, authenticate_handler_id); -+ -+ g_clear_object (&authenticator); -+ soup_uri_free (soup_uri); -+ g_clear_object (&message); -+ g_object_unref (session); -+ -+ return success; -+} -diff -up evolution-data-server-3.12.11/modules/google-backend/e-webdav-discover.h.google-calendar-discover evolution-data-server-3.12.11/modules/google-backend/e-webdav-discover.h ---- evolution-data-server-3.12.11/modules/google-backend/e-webdav-discover.h.google-calendar-discover 2015-07-07 16:23:23.651982522 +0200 -+++ evolution-data-server-3.12.11/modules/google-backend/e-webdav-discover.h 2015-07-07 16:23:23.650982526 +0200 -@@ -0,0 +1,68 @@ -+/* -+ * Copyright (C) 2015 Red Hat, Inc. (www.redhat.com) -+ * -+ * This library is free software: you can redistribute it and/or modify it -+ * under the terms of the GNU Lesser General Public License as published by -+ * the Free Software Foundation. -+ * -+ * This library is distributed in the hope that it will be useful, but -+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License -+ * for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public License -+ * along with this library. If not, see . -+ * -+ */ -+ -+#ifndef E_WEBDAV_DISCOVER_H -+#define E_WEBDAV_DISCOVER_H -+ -+#include -+ -+#include -+#include -+ -+G_BEGIN_DECLS -+ -+typedef enum { -+ E_WEBDAV_DISCOVER_SUPPORTS_NONE = 0, -+ E_WEBDAV_DISCOVER_SUPPORTS_CONTACTS = 1 << 0, -+ E_WEBDAV_DISCOVER_SUPPORTS_EVENTS = 1 << 1, -+ E_WEBDAV_DISCOVER_SUPPORTS_MEMOS = 1 << 2, -+ E_WEBDAV_DISCOVER_SUPPORTS_TASKS = 1 << 3 -+} EWebDAVDiscoverSupports; -+ -+typedef struct _EWebDAVDiscoveredSource { -+ gchar *href; -+ guint32 supports; -+ gchar *display_name; -+ gchar *description; -+ gchar *color; -+} EWebDAVDiscoveredSource; -+ -+void e_webdav_discover_free_discovered_sources -+ (GSList *discovered_sources); -+ -+void e_webdav_discover_sources (ECollectionBackend *collection, -+ const gchar *url_use_path, -+ GCancellable *cancellable, -+ GAsyncReadyCallback callback, -+ gpointer user_data); -+ -+gboolean e_webdav_discover_sources_finish (ECollectionBackend *collection, -+ GAsyncResult *result, -+ GSList **out_discovered_sources, -+ GSList **out_calendar_user_addresses, -+ GError **error); -+ -+gboolean e_webdav_discover_sources_sync (ECollectionBackend *collection, -+ const gchar *url_use_path, -+ GSList **out_discovered_sources, -+ GSList **out_calendar_user_addresses, -+ GCancellable *cancellable, -+ GError **error); -+ -+G_END_DECLS -+ -+#endif /* E_WEBDAV_DISCOVER_H */ -diff -up evolution-data-server-3.12.11/modules/google-backend/Makefile.am.google-calendar-discover evolution-data-server-3.12.11/modules/google-backend/Makefile.am ---- evolution-data-server-3.12.11/modules/google-backend/Makefile.am.google-calendar-discover 2014-09-01 11:17:11.000000000 +0200 -+++ evolution-data-server-3.12.11/modules/google-backend/Makefile.am 2015-07-07 16:23:23.651982522 +0200 -@@ -12,6 +12,8 @@ module_google_backend_la_CPPFLAGS = \ - $(NULL) - - module_google_backend_la_SOURCES = \ -+ e-webdav-discover.h \ -+ e-webdav-discover.c \ - module-google-backend.c \ - $(NULL) - -diff -up evolution-data-server-3.12.11/modules/google-backend/module-google-backend.c.google-calendar-discover evolution-data-server-3.12.11/modules/google-backend/module-google-backend.c ---- evolution-data-server-3.12.11/modules/google-backend/module-google-backend.c.google-calendar-discover 2014-09-01 11:17:12.000000000 +0200 -+++ evolution-data-server-3.12.11/modules/google-backend/module-google-backend.c 2015-07-07 16:23:46.916848261 +0200 -@@ -24,6 +24,8 @@ - #include - #endif - -+#include "e-webdav-discover.h" -+ - /* This macro was introduced in libgdata 0.11, - * but we currently only require libgdata 0.10. */ - #ifndef GDATA_CHECK_VERSION -@@ -52,18 +54,6 @@ - #define GOOGLE_SMTP_PORT 587 - #define GOOGLE_SMTP_SECURITY_METHOD METHOD (STARTTLS_ON_STANDARD_PORT) - --/* Calendar Configuration Details */ --#define GOOGLE_CALENDAR_BACKEND_NAME "caldav" --#define GOOGLE_CALENDAR_RESOURCE_ID "Calendar" -- --/* CalDAV v1 Configuration Details */ --#define GOOGLE_CALDAV_V1_HOST "www.google.com" --#define GOOGLE_CALDAV_V1_PATH "/calendar/dav/%s/events" -- --/* CalDAV v2 Configuration Details */ --#define GOOGLE_CALDAV_V2_HOST "apidata.googleusercontent.com" --#define GOOGLE_CALDAV_V2_PATH "/caldav/v2/%s/events" -- - /* Contacts Configuration Details */ - #define GOOGLE_CONTACTS_BACKEND_NAME "google" - #define GOOGLE_CONTACTS_HOST "www.google.com" -@@ -118,44 +108,22 @@ google_backend_calendar_update_auth_meth - { - EOAuth2Support *oauth2_support; - ESourceAuthentication *auth_extension; -- ESourceWebdav *webdav_extension; -- const gchar *extension_name; -- const gchar *host; - const gchar *method; -- const gchar *path_format; -- gchar *path; -- gchar *user; - -- oauth2_support = e_server_side_source_ref_oauth2_support ( -- E_SERVER_SIDE_SOURCE (source)); -+ oauth2_support = e_server_side_source_ref_oauth2_support (E_SERVER_SIDE_SOURCE (source)); - - /* The host name and WebDAV resource path depend on the - * authentication method used, so update those here too. */ - - if (oauth2_support != NULL) { - method = "OAuth2"; -- host = GOOGLE_CALDAV_V2_HOST; -- path_format = GOOGLE_CALDAV_V2_PATH; - } else { - method = "plain/password"; -- host = GOOGLE_CALDAV_V1_HOST; -- path_format = GOOGLE_CALDAV_V1_PATH; - } - -- extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; -- auth_extension = e_source_get_extension (source, extension_name); -- e_source_authentication_set_host (auth_extension, host); -+ auth_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_AUTHENTICATION); - e_source_authentication_set_method (auth_extension, method); - -- extension_name = E_SOURCE_EXTENSION_WEBDAV_BACKEND; -- webdav_extension = e_source_get_extension (source, extension_name); -- -- user = e_source_authentication_dup_user (auth_extension); -- path = g_strdup_printf (path_format, (user != NULL) ? user : ""); -- e_source_webdav_set_resource_path (webdav_extension, path); -- g_free (path); -- g_free (user); -- - g_clear_object (&oauth2_support); - } - -@@ -179,80 +147,174 @@ google_backend_contacts_update_auth_meth - } - - static void --google_backend_add_calendar (ECollectionBackend *backend) -+google_add_uid_to_hashtable (gpointer source, -+ gpointer known_sources) - { -+ ESourceResource *resource; -+ gchar *uid, *rid; -+ -+ if (!e_source_has_extension (source, E_SOURCE_EXTENSION_RESOURCE)) -+ return; -+ -+ resource = e_source_get_extension (source, E_SOURCE_EXTENSION_RESOURCE); -+ -+ uid = e_source_dup_uid (source); -+ if (!uid || !*uid) { -+ g_free (uid); -+ return; -+ } -+ -+ rid = e_source_resource_dup_identity (resource); -+ if (!rid || !*rid) { -+ g_free (rid); -+ g_free (uid); -+ return; -+ } -+ -+ g_hash_table_insert (known_sources, rid, uid); -+} -+ -+static void -+google_remove_unknown_sources_cb (gpointer resource_id, -+ gpointer uid, -+ gpointer user_data) -+{ -+ ESourceRegistryServer *server = user_data; - ESource *source; -- ESource *collection_source; -- ESourceRegistryServer *server; -- ESourceExtension *extension; -- ESourceCollection *collection_extension; -- const gchar *backend_name; -- const gchar *extension_name; -- const gchar *resource_id; - -- /* FIXME As a future enhancement, we should query Google -- * for a list of user calendars and add them to the -- * collection with matching display names and colors. */ -+ source = e_source_registry_server_ref_source (server, uid); - -- /* NOTE: Host name and WebDAV resource path are set in -- * google_backend_calendar_update_auth_method(), -- * since they depend on the auth method used. */ -+ if (source) { -+ e_source_remove_sync (source, NULL, NULL); -+ g_object_unref (source); -+ } -+} - -- collection_source = e_backend_get_source (E_BACKEND (backend)); -+static void -+google_add_found_source (ECollectionBackend *collection, -+ EWebDAVDiscoverSupports source_type, -+ SoupURI *uri, -+ const gchar *display_name, -+ const gchar *color, -+ GHashTable *known_sources) -+{ -+ ESourceRegistryServer *server; -+ ESourceBackend *backend; -+ ESource *source = NULL; -+ const gchar *backend_name = NULL; -+ const gchar *provider = NULL; -+ const gchar *identity_prefix = NULL; -+ const gchar *source_uid; -+ gboolean is_new; -+ gchar *url; -+ gchar *identity; -+ -+ g_return_if_fail (collection != NULL); -+ g_return_if_fail (uri != NULL); -+ g_return_if_fail (display_name != NULL); -+ g_return_if_fail (known_sources != NULL); -+ -+ switch (source_type) { -+ case E_WEBDAV_DISCOVER_SUPPORTS_CONTACTS: -+ backend_name = E_SOURCE_EXTENSION_ADDRESS_BOOK; -+ provider = "webdav"; -+ identity_prefix = "contacts"; -+ break; -+ case E_WEBDAV_DISCOVER_SUPPORTS_EVENTS: -+ backend_name = E_SOURCE_EXTENSION_CALENDAR; -+ provider = "caldav"; -+ identity_prefix = "events"; -+ break; -+ case E_WEBDAV_DISCOVER_SUPPORTS_MEMOS: -+ backend_name = E_SOURCE_EXTENSION_MEMO_LIST; -+ provider = "caldav"; -+ identity_prefix = "memos"; -+ break; -+ case E_WEBDAV_DISCOVER_SUPPORTS_TASKS: -+ backend_name = E_SOURCE_EXTENSION_TASK_LIST; -+ provider = "caldav"; -+ identity_prefix = "tasks"; -+ break; -+ default: -+ g_warn_if_reached (); -+ return; -+ } - -- resource_id = GOOGLE_CALENDAR_RESOURCE_ID; -- source = e_collection_backend_new_child (backend, resource_id); -- e_source_set_display_name (source, _("Calendar")); -+ g_return_if_fail (backend_name != NULL); - -- collection_extension = e_source_get_extension ( -- collection_source, E_SOURCE_EXTENSION_COLLECTION); -+ server = e_collection_backend_ref_server (collection); - -- /* Configure the calendar source. */ -+ url = soup_uri_to_string (uri, FALSE); -+ identity = g_strconcat (identity_prefix, "::", url, NULL); -+ source_uid = g_hash_table_lookup (known_sources, identity); -+ is_new = !source_uid; -+ if (is_new) { -+ ESource *master_source; -+ -+ source = e_collection_backend_new_child (collection, identity); -+ g_warn_if_fail (source != NULL); -+ -+ if (source) { -+ ESourceCollection *collection_extension; -+ ESourceAuthentication *child_auth; -+ ESourceResource *resource; -+ ESourceWebdav *master_webdav, *child_webdav; -+ -+ master_source = e_backend_get_source (E_BACKEND (collection)); -+ master_webdav = e_source_get_extension (master_source, E_SOURCE_EXTENSION_WEBDAV_BACKEND); -+ collection_extension = e_source_get_extension (master_source, E_SOURCE_EXTENSION_COLLECTION); -+ child_auth = e_source_get_extension (source, E_SOURCE_EXTENSION_AUTHENTICATION); -+ child_webdav = e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND); -+ resource = e_source_get_extension (source, E_SOURCE_EXTENSION_RESOURCE); -+ -+ e_source_authentication_set_user (child_auth, e_source_collection_get_identity (collection_extension)); -+ e_source_webdav_set_soup_uri (child_webdav, uri); -+ e_source_resource_set_identity (resource, identity); -+ -+ /* inherit ssl trust options */ -+ e_source_webdav_set_ssl_trust (child_webdav, e_source_webdav_get_ssl_trust (master_webdav)); -+ } -+ } else { -+ source = e_source_registry_server_ref_source (server, source_uid); -+ g_warn_if_fail (source != NULL); - -- backend_name = GOOGLE_CALENDAR_BACKEND_NAME; -+ g_hash_table_remove (known_sources, identity); -+ } - -- extension_name = E_SOURCE_EXTENSION_CALENDAR; -- extension = e_source_get_extension (source, extension_name); -+ g_free (identity); -+ g_free (url); - -- e_source_backend_set_backend_name ( -- E_SOURCE_BACKEND (extension), backend_name); -+ /* these properties are synchronized always */ -+ if (source) { -+ gint rr, gg, bb; - -- extension_name = E_SOURCE_EXTENSION_AUTHENTICATION; -- extension = e_source_get_extension (source, extension_name); -+ backend = e_source_get_extension (source, backend_name); -+ e_source_backend_set_backend_name (backend, provider); - -- g_object_bind_property ( -- collection_extension, "identity", -- extension, "user", -- G_BINDING_SYNC_CREATE); -+ e_source_set_display_name (source, display_name); -+ e_source_set_enabled (source, TRUE); - -- /* Make sure the WebDAV resource path is up-to-date, since -- * it's built from the "user" property that we just set. */ -- google_backend_calendar_update_auth_method (source); -+ /* Also check whether the color format is as expected; it cannot -+ be used gdk_rgba_parse here, because it required gdk/gtk. */ -+ if (is_new && source_type != E_WEBDAV_DISCOVER_SUPPORTS_CONTACTS && color && -+ sscanf (color, "#%02x%02x%02x", &rr, &gg, &bb) == 3) { -+ gchar *safe_color; - -- extension_name = E_SOURCE_EXTENSION_SECURITY; -- extension = e_source_get_extension (source, extension_name); -+ /* In case an #RRGGBBAA is returned */ -+ safe_color = g_strdup_printf ("#%02x%02x%02x", rr, gg, bb); - -- e_source_security_set_secure ( -- E_SOURCE_SECURITY (extension), TRUE); -+ e_source_selectable_set_color (E_SOURCE_SELECTABLE (backend), safe_color); - -- extension_name = E_SOURCE_EXTENSION_ALARMS; -- extension = e_source_get_extension (source, extension_name); -- if (!e_source_alarms_get_last_notified (E_SOURCE_ALARMS (extension))) { -- GTimeVal today_tv; -- gchar *today; -- -- g_get_current_time (&today_tv); -- today = g_time_val_to_iso8601 (&today_tv); -- e_source_alarms_set_last_notified ( -- E_SOURCE_ALARMS (extension), today); -- g_free (today); -+ g_free (safe_color); -+ } -+ -+ if (is_new) -+ e_source_registry_server_add_source (server, source); -+ -+ g_object_unref (source); - } - -- server = e_collection_backend_ref_server (backend); -- e_source_registry_server_add_source (server, source); - g_object_unref (server); -- -- g_object_unref (source); - } - - #if GDATA_CHECK_VERSION(0,15,1) -@@ -365,26 +427,140 @@ google_backend_add_contacts (ECollection - g_object_unref (source); - } - -+static gpointer -+google_populate_thread (gpointer data) -+{ -+ ECollectionBackend *collection = data; -+ ESourceCollection *collection_extension; -+ ESourceGoa *goa_extension = NULL; -+ ESource *source; -+ GHashTable *known_sources; -+ GList *sources; -+ GSList *discovered_sources = NULL; -+ const gchar *calendar_url; -+ gboolean any_success = FALSE; -+ GError *local_error = NULL; -+ -+ g_return_val_if_fail (collection != NULL, E_SOURCE_AUTHENTICATION_ERROR); -+ -+ source = e_backend_get_source (E_BACKEND (collection)); -+ collection_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_COLLECTION); -+ if (e_source_has_extension (source, E_SOURCE_EXTENSION_GOA)) -+ goa_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_GOA); -+ -+ g_return_val_if_fail (e_source_collection_get_calendar_enabled (collection_extension) || -+ e_source_collection_get_contacts_enabled (collection_extension), E_SOURCE_AUTHENTICATION_ERROR); -+ -+ /* resource-id => source's UID */ -+ known_sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); -+ -+ sources = e_collection_backend_list_calendar_sources (collection); -+ g_list_foreach (sources, google_add_uid_to_hashtable, known_sources); -+ g_list_free_full (sources, g_object_unref); -+ -+ if (goa_extension) -+ calendar_url = e_source_goa_get_calendar_url (goa_extension); -+ else -+ calendar_url = "https://www.google.com/calendar/dav/"; -+ -+ if (e_source_collection_get_calendar_enabled (collection_extension) && calendar_url && -+ e_webdav_discover_sources_sync (collection, calendar_url, -+ &discovered_sources, NULL, NULL, &local_error)) { -+ EWebDAVDiscoverSupports source_types[] = { -+ E_WEBDAV_DISCOVER_SUPPORTS_EVENTS, -+ E_WEBDAV_DISCOVER_SUPPORTS_MEMOS, -+ E_WEBDAV_DISCOVER_SUPPORTS_TASKS -+ }; -+ GSList *link; -+ gint ii; -+ -+ for (link = discovered_sources; link; link = g_slist_next (link)) { -+ EWebDAVDiscoveredSource *discovered_source = link->data; -+ SoupURI *soup_uri; -+ -+ if (!discovered_source || !discovered_source->href || !discovered_source->display_name) -+ continue; -+ -+ soup_uri = soup_uri_new (discovered_source->href); -+ if (!soup_uri) -+ continue; -+ -+ for (ii = 0; ii < G_N_ELEMENTS (source_types); ii++) { -+ if ((discovered_source->supports & source_types[ii]) == source_types[ii]) -+ google_add_found_source (collection, source_types[ii], soup_uri, -+ discovered_source->display_name, discovered_source->color, known_sources); -+ } -+ -+ soup_uri_free (soup_uri); -+ } -+ -+ any_success = TRUE; -+ } -+ -+ if (any_success) { -+ ESourceRegistryServer *server; -+ -+ server = e_collection_backend_ref_server (collection); -+ -+ g_hash_table_foreach (known_sources, google_remove_unknown_sources_cb, server); -+ -+ g_object_unref (server); -+ } -+ -+ g_hash_table_destroy (known_sources); -+ -+ if (local_error) { -+ g_print ("%s: Failed with: %s\n", G_STRFUNC, local_error->message); -+ g_error_free (local_error); -+ } -+ -+ return NULL; -+} -+ - static void - google_backend_populate (ECollectionBackend *backend) - { - GList *list, *link; -- gboolean have_calendar = FALSE, have_tasks = FALSE; -+ gboolean have_tasks = FALSE; -+ ESourceRegistryServer *server; -+ ESourceCollection *collection_extension; -+ ESource *source; - -- list = e_collection_backend_list_calendar_sources (backend); -+ server = e_collection_backend_ref_server (backend); -+ list = e_collection_backend_claim_all_resources (backend); - for (link = list; link; link = g_list_next (link)) { - ESource *source = link->data; -+ ESource *child = NULL; - -- have_calendar = have_calendar || e_source_has_extension (source, E_SOURCE_EXTENSION_CALENDAR); -- have_tasks = have_tasks || e_source_has_extension (source, E_SOURCE_EXTENSION_TASK_LIST); -+ if (e_source_has_extension (source, E_SOURCE_EXTENSION_RESOURCE)) { -+ ESourceResource *resource; - -- if (have_calendar && have_tasks) -- break; -+ resource = e_source_get_extension (source, E_SOURCE_EXTENSION_RESOURCE); -+ child = e_collection_backend_new_child (backend, e_source_resource_get_identity (resource)); -+#if GDATA_CHECK_VERSION(0,15,1) -+ } else if (e_source_has_extension (source, E_SOURCE_EXTENSION_TASK_LIST)) { -+ child = e_collection_backend_new_child (backend, GOOGLE_TASKS_RESOURCE_ID); -+#endif -+ } else if (e_source_has_extension (source, E_SOURCE_EXTENSION_ADDRESS_BOOK)) { -+ child = e_collection_backend_new_child (backend, GOOGLE_CONTACTS_RESOURCE_ID); -+ } -+ -+ if (child) { -+ e_source_registry_server_add_source (server, source); -+ g_object_unref (child); -+ } - } -- g_list_free_full (list, (GDestroyNotify) g_object_unref); - -- if (!have_calendar) -- google_backend_add_calendar (backend); -+ g_list_free_full (list, g_object_unref); -+ g_object_unref (server); -+ -+ list = e_collection_backend_list_calendar_sources (backend); -+ for (link = list; link && !have_tasks; link = g_list_next (link)) { -+ ESource *source = link->data; -+ -+ have_tasks = have_tasks || e_source_has_extension (source, E_SOURCE_EXTENSION_TASK_LIST); -+ } -+ g_list_free_full (list, (GDestroyNotify) g_object_unref); - - #if GDATA_CHECK_VERSION(0,15,1) - if (!have_tasks) -@@ -397,8 +573,17 @@ google_backend_populate (ECollectionBack - g_list_free_full (list, (GDestroyNotify) g_object_unref); - - /* Chain up to parent's populate() method. */ -- E_COLLECTION_BACKEND_CLASS (e_google_backend_parent_class)-> -- populate (backend); -+ E_COLLECTION_BACKEND_CLASS (e_google_backend_parent_class)->populate (backend); -+ -+ source = e_backend_get_source (E_BACKEND (backend)); -+ collection_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_COLLECTION); -+ -+ if (e_source_collection_get_calendar_enabled (collection_extension)) { -+ GThread *thread; -+ -+ thread = g_thread_new (NULL, google_populate_thread, g_object_ref (backend)); -+ g_thread_unref (thread); -+ } - } - - static gchar * -@@ -412,7 +597,7 @@ google_backend_dup_resource_id (ECollect - - extension_name = E_SOURCE_EXTENSION_CALENDAR; - if (e_source_has_extension (child_source, extension_name)) -- return g_strdup (GOOGLE_CALENDAR_RESOURCE_ID); -+ return E_COLLECTION_BACKEND_CLASS (e_google_backend_parent_class)->dup_resource_id (backend, child_source); - - extension_name = E_SOURCE_EXTENSION_TASK_LIST; - if (e_source_has_extension (child_source, extension_name)) -diff -up evolution-data-server-3.12.11/modules/owncloud-backend/module-owncloud-backend.c.google-calendar-discover evolution-data-server-3.12.11/modules/owncloud-backend/module-owncloud-backend.c ---- evolution-data-server-3.12.11/modules/owncloud-backend/module-owncloud-backend.c.google-calendar-discover 2014-05-22 08:45:46.000000000 +0200 -+++ evolution-data-server-3.12.11/modules/owncloud-backend/module-owncloud-backend.c 2015-07-07 16:23:23.652982519 +0200 -@@ -81,7 +81,7 @@ owncloud_remove_unknown_sources_cb (gpoi - source = e_source_registry_server_ref_source (server, uid); - - if (source) { -- e_source_registry_server_remove_source (server, source); -+ e_source_remove_sync (source, NULL, NULL); - g_object_unref (source); - } - } -@@ -181,9 +181,11 @@ owncloud_source_found_cb (ECollectionBac - e_source_backend_set_backend_name (backend, provider); - - e_source_set_display_name (source, display_name); -+ e_source_set_enabled (source, TRUE); -+ - /* Also check whether the color format is as expected; it cannot - be used gdk_rgba_parse here, because it required gdk/gtk. */ -- if (source_type != OwnCloud_Source_Contacts && color && -+ if (is_new && source_type != OwnCloud_Source_Contacts && color && - sscanf (color, "#%02x%02x%02x", &rr, &gg, &bb) == 3) - e_source_selectable_set_color (E_SOURCE_SELECTABLE (backend), color); - -diff -up evolution-data-server-3.12.11/modules/owncloud-backend/owncloud-utils.c.google-calendar-discover evolution-data-server-3.12.11/modules/owncloud-backend/owncloud-utils.c ---- evolution-data-server-3.12.11/modules/owncloud-backend/owncloud-utils.c.google-calendar-discover 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/modules/owncloud-backend/owncloud-utils.c 2015-07-07 16:23:23.653982516 +0200 -@@ -632,6 +632,11 @@ owncloud_utils_search_server (ECollectio - - source = e_backend_get_source (E_BACKEND (collection)); - collection_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_COLLECTION); -+ -+ /* Ignore the request for non-GOA ownCloud sources */ -+ if (!e_source_has_extension (source, E_SOURCE_EXTENSION_GOA)) -+ return FALSE; -+ - goa_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_GOA); - - authenticator = g_object_new (E_TYPE_OWNCLOUD_AUTHENTICATOR, NULL); diff --git a/SOURCES/evolution-data-server-3.12.11-imapx-disable-and-hide-qresync.patch b/SOURCES/evolution-data-server-3.12.11-imapx-disable-and-hide-qresync.patch deleted file mode 100644 index 4a6e78c..0000000 --- a/SOURCES/evolution-data-server-3.12.11-imapx-disable-and-hide-qresync.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-provider.c.disable-and-hide-qresync evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-provider.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-provider.c.disable-and-hide-qresync 2016-05-18 18:14:23.267083514 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-provider.c 2016-05-18 18:15:01.458081843 +0200 -@@ -40,8 +40,8 @@ CamelProviderConfEntry imapx_conf_entrie - N_("C_heck for new messages in all folders"), "1" }, - { CAMEL_PROVIDER_CONF_CHECKBOX, "check-subscribed", NULL, - N_("Ch_eck for new messages in subscribed folders"), "0" }, -- { CAMEL_PROVIDER_CONF_CHECKBOX, "use-qresync", NULL, -- N_("Use _Quick Resync if the server supports it"), "0" }, -+ /*{ CAMEL_PROVIDER_CONF_CHECKBOX, "use-qresync", NULL, -+ N_("Use _Quick Resync if the server supports it"), "0" },*/ - { CAMEL_PROVIDER_CONF_CHECKBOX, "use-idle", NULL, - N_("_Listen for server change notifications"), "0" }, - { CAMEL_PROVIDER_CONF_SECTION_END }, -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c.disable-and-hide-qresync evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c.disable-and-hide-qresync 2016-05-18 18:14:39.322082812 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c 2016-05-18 18:16:51.393077034 +0200 -@@ -3151,7 +3151,7 @@ imapx_reconnect (CamelIMAPXServer *is, - mechanism = camel_network_settings_dup_auth_mechanism ( - CAMEL_NETWORK_SETTINGS (settings)); - -- use_qresync = camel_imapx_settings_get_use_qresync (CAMEL_IMAPX_SETTINGS (settings)); -+ use_qresync = FALSE; /* camel_imapx_settings_get_use_qresync (CAMEL_IMAPX_SETTINGS (settings)); */ - use_idle = camel_imapx_settings_get_use_idle (CAMEL_IMAPX_SETTINGS (settings)); - - g_object_unref (settings); diff --git a/SOURCES/evolution-data-server-3.12.11-imapx-empty-cache-file-temp-workaround.patch b/SOURCES/evolution-data-server-3.12.11-imapx-empty-cache-file-temp-workaround.patch deleted file mode 100644 index 64f5759..0000000 --- a/SOURCES/evolution-data-server-3.12.11-imapx-empty-cache-file-temp-workaround.patch +++ /dev/null @@ -1,193 +0,0 @@ -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c.imapx-empty-cache-file-temp-workaround evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c.imapx-empty-cache-file-temp-workaround 2014-06-16 15:00:03.000000000 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c 2015-05-26 15:02:30.395243456 +0200 -@@ -182,6 +182,7 @@ camel_imapx_job_wait (CamelIMAPXJob *job - { - CamelIMAPXRealJob *real_job; - GCancellable *cancellable; -+ gulong cancel_id = 0; - gboolean success = TRUE; - - g_return_val_if_fail (CAMEL_IS_IMAPX_JOB (job), FALSE); -@@ -189,13 +190,23 @@ camel_imapx_job_wait (CamelIMAPXJob *job - real_job = (CamelIMAPXRealJob *) job; - cancellable = camel_imapx_job_get_cancellable (job); - -+ if (G_IS_CANCELLABLE (cancellable)) -+ cancel_id = g_cancellable_connect ( -+ cancellable, -+ G_CALLBACK (imapx_job_cancelled_cb), -+ camel_imapx_job_ref (job), -+ (GDestroyNotify) camel_imapx_job_unref); -+ - g_mutex_lock (&real_job->done_mutex); -- while (!real_job->done_flag) -+ while (!real_job->done_flag && !g_cancellable_is_cancelled (cancellable)) - g_cond_wait ( - &real_job->done_cond, - &real_job->done_mutex); - g_mutex_unlock (&real_job->done_mutex); - -+ if (cancel_id > 0) -+ g_cancellable_disconnect (cancellable, cancel_id); -+ - /* Cancellation takes priority over other errors. */ - if (g_cancellable_set_error_if_cancelled (cancellable, error)) { - success = FALSE; -@@ -233,7 +244,6 @@ camel_imapx_job_run (CamelIMAPXJob *job, - GError **error) - { - GCancellable *cancellable; -- gulong cancel_id = 0; - gboolean success; - - g_return_val_if_fail (CAMEL_IS_IMAPX_JOB (job), FALSE); -@@ -245,21 +255,11 @@ camel_imapx_job_run (CamelIMAPXJob *job, - if (g_cancellable_set_error_if_cancelled (cancellable, error)) - return FALSE; - -- if (G_IS_CANCELLABLE (cancellable)) -- cancel_id = g_cancellable_connect ( -- cancellable, -- G_CALLBACK (imapx_job_cancelled_cb), -- camel_imapx_job_ref (job), -- (GDestroyNotify) camel_imapx_job_unref); -- - success = job->start (job, is, cancellable, error); - - if (success && !job->noreply) - success = camel_imapx_job_wait (job, error); - -- if (cancel_id > 0) -- g_cancellable_disconnect (cancellable, cancel_id); -- - return success; - } - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c.imapx-empty-cache-file-temp-workaround evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c.imapx-empty-cache-file-temp-workaround 2015-05-26 15:02:30.390243457 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c 2015-05-26 15:02:46.146242702 +0200 -@@ -57,8 +57,8 @@ - #define c(...) camel_imapx_debug(command, __VA_ARGS__) - #define e(...) camel_imapx_debug(extra, __VA_ARGS__) - --#define QUEUE_LOCK(x) (g_rec_mutex_lock(&(x)->queue_lock)) --#define QUEUE_UNLOCK(x) (g_rec_mutex_unlock(&(x)->queue_lock)) -+#define QUEUE_LOCK(x) g_rec_mutex_lock (&(x)->queue_lock) -+#define QUEUE_UNLOCK(x) g_rec_mutex_unlock (&(x)->queue_lock) - - /* Try pipelining fetch requests, 'in bits' */ - #define MULTI_SIZE (32768 * 8) -@@ -5172,23 +5172,54 @@ imapx_command_fetch_message_done (CamelI - g_free (tmp_filename); - } - -- /* Delete the 'tmp' file only if the operation wasn't cancelled. It's because -+ /* Delete the 'tmp' file only if the operation succeeded. It's because - cancelled operations end before they are properly finished (IMAP-protocol speaking), - thus if any other GET_MESSAGE operation was waiting for this job, then it - realized that the message was not downloaded and opened its own "tmp" file, but - of the same name, thus this remove would drop file which could be used - by a different GET_MESSAGE job. */ -- if (!g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) -+ if (!local_error && !g_cancellable_is_cancelled (cancellable)) - camel_data_cache_remove (data->message_cache, "tmp", data->uid, NULL); - - /* Avoid possible use-after-free when the imapx_unregister_job() can - also free the 'job' structure. */ -+ camel_imapx_job_ref (job); -+ -+ imapx_unregister_job (is, job); -+ - if (local_error != NULL) { -- camel_imapx_job_take_error (job, local_error); -- local_error = NULL; -+ CamelIMAPXJob *pending_job; -+ -+ /* Give a chance to other threads. */ -+ g_thread_yield (); -+ -+ pending_job = imapx_server_ref_job (is, mailbox, IMAPX_JOB_GET_MESSAGE, data->uid); -+ if (pending_job != NULL) { -+ GIOStream *cache_stream; -+ -+ /* Wait for the job to finish. */ -+ camel_imapx_job_wait (pending_job, NULL); -+ camel_imapx_job_unref (pending_job); -+ -+ /* Disregard errors here. If we failed to retrieve the -+ * message from cache (implying the job we were waiting -+ * on failed or got cancelled), we'll just re-fetch it. */ -+ cache_stream = camel_data_cache_get (data->message_cache, "cur", data->uid, NULL); -+ if (cache_stream != NULL) { -+ g_clear_error (&local_error); -+ -+ g_clear_object (&data->stream); -+ data->stream = cache_stream; -+ } -+ } -+ -+ if (local_error) { -+ camel_imapx_job_take_error (job, local_error); -+ local_error = NULL; -+ } - } - -- imapx_unregister_job (is, job); -+ camel_imapx_job_unref (job); - - exit: - if (local_error != NULL) -@@ -8344,9 +8375,7 @@ imapx_server_get_message (CamelIMAPXServ - GetMessageData *data; - gboolean registered; - -- job = imapx_server_ref_job (is, mailbox, IMAPX_JOB_GET_MESSAGE, message_uid); -- -- if (job != NULL) { -+ while (job = imapx_server_ref_job (is, mailbox, IMAPX_JOB_GET_MESSAGE, message_uid), job != NULL) { - /* Promote the existing GET_MESSAGE - * job's priority if ours is higher. */ - if (pri > job->pri) -@@ -8362,14 +8391,26 @@ imapx_server_get_message (CamelIMAPXServ - cache_stream = camel_data_cache_get ( - message_cache, "cur", message_uid, NULL); - if (cache_stream != NULL) { -- stream = camel_stream_new (cache_stream); -+ /* Return new file stream, instead of a DataCache's to not fight -+ on its content and position with other jobs, if any. */ -+ gchar *filename = camel_data_cache_get_filename (message_cache, "cur", message_uid); -+ stream = camel_stream_fs_new_with_name (filename, O_RDONLY, 0, NULL); -+ g_free (filename); - g_object_unref (cache_stream); -- return stream; -+ -+ if (stream) -+ return stream; - } - } - - QUEUE_LOCK (is); - -+ if (g_cancellable_set_error_if_cancelled (cancellable, error)) { -+ QUEUE_UNLOCK (is); -+ -+ return NULL; -+ } -+ - mi = camel_folder_summary_get (summary, message_uid); - if (mi == NULL) { - g_set_error ( -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.h.imapx-empty-cache-file-temp-workaround evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.h -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c.imapx-empty-cache-file-temp-workaround evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c.imapx-empty-cache-file-temp-workaround 2014-12-02 16:07:54.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c 2015-05-26 15:02:46.148242702 +0200 -@@ -704,7 +704,6 @@ imapx_store_finalize (GObject *object) - priv = CAMEL_IMAPX_STORE_GET_PRIVATE (object); - - g_mutex_clear (&priv->get_finfo_lock); -- - g_mutex_clear (&priv->server_lock); - - g_hash_table_destroy (priv->quota_info); -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.h.imapx-empty-cache-file-temp-workaround evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.h diff --git a/SOURCES/evolution-data-server-3.12.11-imapx-expunge-processing.patch b/SOURCES/evolution-data-server-3.12.11-imapx-expunge-processing.patch deleted file mode 100644 index 275fdc4..0000000 --- a/SOURCES/evolution-data-server-3.12.11-imapx-expunge-processing.patch +++ /dev/null @@ -1,40 +0,0 @@ -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c.imapx-expunge-processing evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c.imapx-expunge-processing 2015-01-05 16:33:18.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c 2015-05-21 12:11:37.466409336 +0200 -@@ -1930,6 +1930,13 @@ imapx_untagged_expunge (CamelIMAPXServer - if (job != NULL) - return TRUE; - -+ job = imapx_match_active_job (is, IMAPX_JOB_COPY_MESSAGE, NULL); -+ /* Ignore EXPUNGE responses when not running a COPY(MOVE)_MESSAGE job */ -+ if (!job) { -+ c (is->tagprefix, "ignoring untagged expunge: %lu\n", is->priv->context->id); -+ return TRUE; -+ } -+ - c (is->tagprefix, "expunged: %lu\n", is->priv->context->id); - - g_mutex_lock (&is->priv->select_lock); -@@ -5476,6 +5483,14 @@ imapx_job_copy_messages_start (CamelIMAP - return imapx_command_copy_messages_step_start (is, job, 0, error); - } - -+static gboolean -+imapx_job_copy_messages_matches (CamelIMAPXJob *job, -+ CamelIMAPXMailbox *mailbox, -+ const gchar *uid) -+{ -+ return camel_imapx_job_has_mailbox (job, mailbox); -+} -+ - /* ********************************************************************** */ - - static void -@@ -8518,6 +8533,7 @@ camel_imapx_server_copy_message (CamelIM - job->pri = IMAPX_PRIORITY_COPY_MESSAGE; - job->type = IMAPX_JOB_COPY_MESSAGE; - job->start = imapx_job_copy_messages_start; -+ job->matches = imapx_job_copy_messages_matches; - - camel_imapx_job_set_mailbox (job, mailbox); - diff --git a/SOURCES/evolution-data-server-3.12.11-imapx-msg-download-indefinite-wait.patch b/SOURCES/evolution-data-server-3.12.11-imapx-msg-download-indefinite-wait.patch deleted file mode 100644 index c250551..0000000 --- a/SOURCES/evolution-data-server-3.12.11-imapx-msg-download-indefinite-wait.patch +++ /dev/null @@ -1,271 +0,0 @@ -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c.imapx-msg-download-indefinite-wait evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c.imapx-msg-download-indefinite-wait 2015-06-01 21:47:39.859412175 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c 2015-06-01 21:48:23.891134658 +0200 -@@ -46,6 +46,8 @@ struct _CamelIMAPXRealJob { - - CamelIMAPXMailbox *mailbox; - GMutex mailbox_lock; -+ -+ CamelIMAPXMailbox *guard_mailbox_update; /* uses the mailbox_lock */ - }; - - static void -@@ -124,6 +126,13 @@ camel_imapx_job_unref (CamelIMAPXJob *jo - if (real_job->destroy_data != NULL) - real_job->destroy_data (real_job->data); - -+ g_mutex_lock (&real_job->mailbox_lock); -+ if (real_job->guard_mailbox_update) { -+ camel_imapx_mailbox_unlock_update (real_job->guard_mailbox_update); -+ g_clear_object (&real_job->guard_mailbox_update); -+ } -+ g_mutex_unlock (&real_job->mailbox_lock); -+ - g_clear_object (&real_job->mailbox); - g_mutex_clear (&real_job->mailbox_lock); - -@@ -232,6 +241,13 @@ camel_imapx_job_done (CamelIMAPXJob *job - - real_job = (CamelIMAPXRealJob *) job; - -+ g_mutex_lock (&real_job->mailbox_lock); -+ if (real_job->guard_mailbox_update) { -+ camel_imapx_mailbox_unlock_update (real_job->guard_mailbox_update); -+ g_clear_object (&real_job->guard_mailbox_update); -+ } -+ g_mutex_unlock (&real_job->mailbox_lock); -+ - g_mutex_lock (&real_job->done_mutex); - real_job->done_flag = TRUE; - g_cond_broadcast (&real_job->done_cond); -@@ -263,6 +279,36 @@ camel_imapx_job_run (CamelIMAPXJob *job, - return success; - } - -+void -+camel_imapx_job_guard_mailbox_update (CamelIMAPXJob *job, -+ CamelIMAPXMailbox *mailbox) -+{ -+ CamelIMAPXRealJob *real_job; -+ -+ g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+ -+ if (mailbox) -+ g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); -+ -+ real_job = (CamelIMAPXRealJob *) job; -+ -+ g_mutex_lock (&real_job->mailbox_lock); -+ -+ if (mailbox != real_job->guard_mailbox_update) { -+ if (real_job->guard_mailbox_update) { -+ camel_imapx_mailbox_unlock_update (real_job->guard_mailbox_update); -+ g_clear_object (&real_job->guard_mailbox_update); -+ } -+ -+ if (mailbox) { -+ real_job->guard_mailbox_update = g_object_ref (mailbox); -+ camel_imapx_mailbox_lock_update (real_job->guard_mailbox_update); -+ } -+ } -+ -+ g_mutex_unlock (&real_job->mailbox_lock); -+} -+ - gboolean - camel_imapx_job_matches (CamelIMAPXJob *job, - CamelIMAPXMailbox *mailbox, -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.h.imapx-msg-download-indefinite-wait evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.h.imapx-msg-download-indefinite-wait 2015-06-01 21:47:45.811374376 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.h 2015-06-01 21:48:23.891134658 +0200 -@@ -64,6 +64,9 @@ void camel_imapx_job_done (CamelIMAPXJ - gboolean camel_imapx_job_run (CamelIMAPXJob *job, - CamelIMAPXServer *is, - GError **error); -+void camel_imapx_job_guard_mailbox_update -+ (CamelIMAPXJob *job, -+ CamelIMAPXMailbox *mailbox); - gboolean camel_imapx_job_matches (CamelIMAPXJob *job, - CamelIMAPXMailbox *mailbox, - const gchar *uid); -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.c.imapx-msg-download-indefinite-wait evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.c.imapx-msg-download-indefinite-wait 2015-06-01 21:48:14.947190662 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.c 2015-06-01 21:48:23.892134652 +0200 -@@ -51,7 +51,9 @@ struct _CamelIMAPXMailboxPrivate { - CamelIMAPXMailboxState state; - - GMutex property_lock; -- GRecMutex update_lock; -+ GMutex update_lock; -+ GCond update_cond; -+ gboolean update_is_locked; - - /* Protected by the "property_lock". */ - GHashTable *attributes; -@@ -98,7 +100,8 @@ imapx_mailbox_finalize (GObject *object) - g_free (priv->name); - - g_mutex_clear (&priv->property_lock); -- g_rec_mutex_clear (&priv->update_lock); -+ g_mutex_clear (&priv->update_lock); -+ g_cond_clear (&priv->update_cond); - g_hash_table_destroy (priv->attributes); - g_sequence_free (priv->message_map); - g_strfreev (priv->quota_roots); -@@ -125,7 +128,9 @@ camel_imapx_mailbox_init (CamelIMAPXMail - mailbox->priv = CAMEL_IMAPX_MAILBOX_GET_PRIVATE (mailbox); - - g_mutex_init (&mailbox->priv->property_lock); -- g_rec_mutex_init (&mailbox->priv->update_lock); -+ g_mutex_init (&mailbox->priv->update_lock); -+ g_cond_init (&mailbox->priv->update_cond); -+ mailbox->priv->update_is_locked = FALSE; - mailbox->priv->message_map = g_sequence_new (NULL); - mailbox->priv->permanentflags = ~0; - mailbox->priv->state = CAMEL_IMAPX_MAILBOX_STATE_CREATED; -@@ -1198,7 +1203,15 @@ camel_imapx_mailbox_lock_update (CamelIM - { - g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); - -- g_rec_mutex_lock (&mailbox->priv->update_lock); -+ g_mutex_lock (&mailbox->priv->update_lock); -+ -+ while (mailbox->priv->update_is_locked) { -+ g_cond_wait (&mailbox->priv->update_cond, &mailbox->priv->update_lock); -+ } -+ -+ mailbox->priv->update_is_locked = TRUE; -+ -+ g_mutex_unlock (&mailbox->priv->update_lock); - } - - /* Prevents running FETCH and STORE at the same time for the given mailbox */ -@@ -1207,5 +1220,12 @@ camel_imapx_mailbox_unlock_update (Camel - { - g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); - -- g_rec_mutex_unlock (&mailbox->priv->update_lock); -+ g_mutex_lock (&mailbox->priv->update_lock); -+ -+ if (mailbox->priv->update_is_locked) { -+ mailbox->priv->update_is_locked = FALSE; -+ g_cond_signal (&mailbox->priv->update_cond); -+ } -+ -+ g_mutex_unlock (&mailbox->priv->update_lock); - } -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c.imapx-msg-download-indefinite-wait evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c.imapx-msg-download-indefinite-wait 2015-06-01 21:47:18.219550493 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c 2015-06-01 21:48:23.895134633 +0200 -@@ -1031,8 +1031,7 @@ static void - imapx_unregister_job (CamelIMAPXServer *is, - CamelIMAPXJob *job) - { -- if (!job->noreply) -- camel_imapx_job_done (job); -+ camel_imapx_job_done (job); - - QUEUE_LOCK (is); - -@@ -1051,10 +1050,17 @@ imapx_submit_job (CamelIMAPXServer *is, - CamelIMAPXJob *job, - GError **error) - { -+ gboolean success; -+ - if (!imapx_register_job (is, job, error)) - return FALSE; - -- return camel_imapx_job_run (job, is, error); -+ success = camel_imapx_job_run (job, is, error); -+ -+ if (!success) -+ imapx_unregister_job (is, job); -+ -+ return success; - } - - static CamelFolder * -@@ -7699,6 +7705,27 @@ imapx_abort_all_commands (CamelIMAPXServ - } - - camel_imapx_command_queue_free (queue); -+ -+ QUEUE_LOCK (is); -+ -+ /* Abort also any pending jobs which are not in the command queues yet */ -+ if (!g_queue_is_empty (&is->jobs)) { -+ GList *jobs, *iter; -+ -+ jobs = g_list_copy (g_queue_peek_head_link (&is->jobs)); -+ g_list_foreach (jobs, (GFunc) camel_imapx_job_ref, NULL); -+ -+ for (iter = jobs; iter != NULL; iter = g_list_next (iter)) { -+ CamelIMAPXJob *job = iter->data; -+ -+ camel_imapx_job_take_error (job, g_error_copy (error)); -+ camel_imapx_job_done (job); -+ } -+ -+ g_list_free_full (jobs, (GDestroyNotify) camel_imapx_job_unref); -+ } -+ -+ QUEUE_UNLOCK (is); - } - - /* ********************************************************************** */ -@@ -8461,6 +8488,8 @@ imapx_server_get_message (CamelIMAPXServ - - if (registered && camel_imapx_job_run (job, is, error)) - stream = camel_stream_new (data->stream); -+ else if (registered) -+ imapx_unregister_job (is, job); - - camel_imapx_job_unref (job); - -@@ -8820,16 +8849,15 @@ camel_imapx_server_refresh_info (CamelIM - QUEUE_UNLOCK (is); - - if (registered) -- camel_imapx_mailbox_lock_update (mailbox); -+ camel_imapx_job_guard_mailbox_update (job, mailbox); - - if (registered && camel_imapx_job_run (job, is, error)) { - changes = data->changes; - data->changes = NULL; -+ } else if (registered) { -+ imapx_unregister_job (is, job); - } - -- if (registered) -- camel_imapx_mailbox_unlock_update (mailbox); -- - camel_imapx_job_unref (job); - - return changes; -@@ -9158,12 +9186,12 @@ imapx_server_sync_changes (CamelIMAPXSer - QUEUE_UNLOCK (is); - - if (job_type == IMAPX_JOB_SYNC_CHANGES && registered) -- camel_imapx_mailbox_lock_update (mailbox); -+ camel_imapx_job_guard_mailbox_update (job, mailbox); - - success = registered && camel_imapx_job_run (job, is, error); - -- if (job_type == IMAPX_JOB_SYNC_CHANGES && registered) -- camel_imapx_mailbox_unlock_update (mailbox); -+ if (!success && registered) -+ imapx_unregister_job (is, job); - - camel_imapx_job_unref (job); - -@@ -9226,6 +9254,9 @@ camel_imapx_server_expunge (CamelIMAPXSe - - success = registered && camel_imapx_job_run (job, is, error); - -+ if (!success && registered) -+ imapx_unregister_job (is, job); -+ - camel_imapx_job_unref (job); - - return success; diff --git a/SOURCES/evolution-data-server-3.12.11-imapx-update-to-upstream.patch b/SOURCES/evolution-data-server-3.12.11-imapx-update-to-upstream.patch deleted file mode 100644 index 25d16b5..0000000 --- a/SOURCES/evolution-data-server-3.12.11-imapx-update-to-upstream.patch +++ /dev/null @@ -1,23756 +0,0 @@ -diff -up evolution-data-server-3.12.11/camel/camel-enums.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/camel-enums.h ---- evolution-data-server-3.12.11/camel/camel-enums.h.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/camel-enums.h 2016-08-15 13:52:41.939976331 +0200 -@@ -410,7 +410,8 @@ typedef enum { /*< flags >*/ - CAMEL_STORE_REAL_JUNK_FOLDER = 1 << 4, - CAMEL_STORE_CAN_EDIT_FOLDERS = 1 << 5, - CAMEL_STORE_USE_CACHE_DIR = 1 << 6, -- CAMEL_STORE_CAN_DELETE_FOLDERS_AT_ONCE = 1 << 7 -+ CAMEL_STORE_CAN_DELETE_FOLDERS_AT_ONCE = 1 << 7, -+ CAMEL_STORE_SUPPORTS_INITIAL_SETUP = 1 << 8 - } CamelStoreFlags; - - /** -diff -up evolution-data-server-3.12.11/camel/camel-offline-store.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/camel-offline-store.c ---- evolution-data-server-3.12.11/camel/camel-offline-store.c.imapx-update-to-upstream 2014-10-31 15:25:33.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/camel-offline-store.c 2016-08-15 13:52:41.939976331 +0200 -@@ -181,7 +181,7 @@ camel_offline_store_set_online_sync (Cam - - g_return_val_if_fail (CAMEL_IS_OFFLINE_STORE (store), FALSE); - -- if (store->priv->online == online) -+ if (camel_offline_store_get_online (store) == online) - return TRUE; - - service = CAMEL_SERVICE (store); -diff -up evolution-data-server-3.12.11/camel/camel-operation.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/camel-operation.c ---- evolution-data-server-3.12.11/camel/camel-operation.c.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/camel-operation.c 2016-08-15 13:52:41.939976331 +0200 -@@ -49,6 +49,9 @@ struct _CamelOperationPrivate { - - enum { - STATUS, -+ PUSH_MESSAGE, -+ POP_MESSAGE, -+ PROGRESS, - LAST_SIGNAL - }; - -@@ -173,6 +176,32 @@ camel_operation_class_init (CamelOperati - G_TYPE_NONE, 2, - G_TYPE_STRING, - G_TYPE_INT); -+ -+ signals[PUSH_MESSAGE] = g_signal_new ( -+ "push-message", -+ G_TYPE_FROM_CLASS (class), -+ G_SIGNAL_RUN_LAST, -+ 0, -+ NULL, NULL, NULL, -+ G_TYPE_NONE, 1, -+ G_TYPE_STRING); -+ -+ signals[POP_MESSAGE] = g_signal_new ( -+ "pop-message", -+ G_TYPE_FROM_CLASS (class), -+ G_SIGNAL_RUN_LAST, -+ 0, -+ NULL, NULL, NULL, -+ G_TYPE_NONE, 0); -+ -+ signals[PROGRESS] = g_signal_new ( -+ "progress", -+ G_TYPE_FROM_CLASS (class), -+ G_SIGNAL_RUN_LAST, -+ 0, -+ NULL, NULL, NULL, -+ G_TYPE_NONE, 1, -+ G_TYPE_INT); - } - - static void -@@ -249,6 +278,7 @@ camel_operation_push_message (GCancellab - { - CamelOperation *operation; - StatusNode *node; -+ gchar *message; - va_list ap; - - if (cancellable == NULL) -@@ -259,14 +289,18 @@ camel_operation_push_message (GCancellab - - g_return_if_fail (CAMEL_IS_OPERATION (cancellable)); - -+ va_start (ap, format); -+ message = g_strdup_vprintf (format, ap); -+ va_end (ap); -+ -+ g_signal_emit (cancellable, signals[PUSH_MESSAGE], 0, message); -+ - LOCK (); - - operation = CAMEL_OPERATION (cancellable); - -- va_start (ap, format); -- - node = status_node_new (); -- node->message = g_strdup_vprintf (format, ap); -+ node->message = message; /* takes ownership */ - node->operation = g_object_ref (operation); - - if (g_queue_is_empty (&operation->priv->status_stack)) { -@@ -288,8 +322,6 @@ camel_operation_push_message (GCancellab - - g_queue_push_head (&operation->priv->status_stack, node); - -- va_end (ap); -- - UNLOCK (); - } - -@@ -317,6 +349,8 @@ camel_operation_pop_message (GCancellabl - - g_return_if_fail (CAMEL_IS_OPERATION (cancellable)); - -+ g_signal_emit (cancellable, signals[POP_MESSAGE], 0); -+ - LOCK (); - - operation = CAMEL_OPERATION (cancellable); -@@ -376,6 +410,8 @@ camel_operation_progress (GCancellable * - - g_return_if_fail (CAMEL_IS_OPERATION (cancellable)); - -+ g_signal_emit (cancellable, signals[PROGRESS], 0, percent); -+ - LOCK (); - - operation = CAMEL_OPERATION (cancellable); -diff -up evolution-data-server-3.12.11/camel/camel-store.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/camel-store.c ---- evolution-data-server-3.12.11/camel/camel-store.c.imapx-update-to-upstream 2014-11-03 13:58:08.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/camel-store.c 2016-08-15 13:52:41.940976331 +0200 -@@ -64,6 +64,7 @@ struct _AsyncContext { - gchar *folder_name_2; - gboolean expunge; - guint32 flags; -+ GHashTable *save_setup; - }; - - struct _SignalClosure { -@@ -96,6 +97,11 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE ( - static void - async_context_free (AsyncContext *async_context) - { -+ if (async_context->save_setup) { -+ g_hash_table_destroy (async_context->save_setup); -+ async_context->save_setup = NULL; -+ } -+ - g_free (async_context->folder_name_1); - g_free (async_context->folder_name_2); - -@@ -501,6 +507,15 @@ store_synchronize_sync (CamelStore *stor - } - - static gboolean -+store_initial_setup_sync (CamelStore *store, -+ GHashTable *out_save_setup, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ return TRUE; -+} -+ -+static gboolean - store_initable_init (GInitable *initable, - GCancellable *cancellable, - GError **error) -@@ -570,6 +585,7 @@ camel_store_class_init (CamelStoreClass - class->get_junk_folder_sync = store_get_junk_folder_sync; - class->get_trash_folder_sync = store_get_trash_folder_sync; - class->synchronize_sync = store_synchronize_sync; -+ class->initial_setup_sync = store_initial_setup_sync; - - signals[FOLDER_CREATED] = g_signal_new ( - "folder-created", -@@ -2897,3 +2913,171 @@ camel_store_synchronize_finish (CamelSto - return g_task_propagate_boolean (G_TASK (result), error); - } - -+/** -+ * camel_store_initial_setup_sync: -+ * @store: a #CamelStore -+ * @out_save_setup: (out) (transfer container) (element-type utf8 utf8): setup values to save -+ * @cancellable: optional #GCancellable object, or %NULL -+ * @error: return location for a #GError, or %NULL -+ * -+ * Runs initial setup for the @store. It's meant to preset some -+ * values the first time the account connects to the server after -+ * it had been created. The function should return %TRUE even if -+ * it didn't populate anything. The default implementation does -+ * just that. -+ * -+ * The save_setup result, if not %NULL, should be freed using -+ * g_hash_table_destroy(). It's not an error to have it %NULL, -+ * it only means the @store doesn't have anything to save. -+ * Both the key and the value in the hash are newly allocated -+ * UTF-8 strings, owned by the hash table. -+ * -+ * The @store advertises support of this function by including -+ * CAMEL_STORE_SUPPORTS_INITIAL_SETUP in CamelStore::flags. -+ * -+ * Returns: %TRUE on success, %FALSE on error -+ * -+ * Since: 3.12.11-25 (3.20) -+ **/ -+gboolean -+camel_store_initial_setup_sync (CamelStore *store, -+ GHashTable **out_save_setup, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ GHashTable *save_setup; -+ CamelStoreClass *class; -+ gboolean success; -+ -+ g_return_val_if_fail (CAMEL_IS_STORE (store), FALSE); -+ g_return_val_if_fail (out_save_setup != NULL, FALSE); -+ -+ *out_save_setup = NULL; -+ -+ class = CAMEL_STORE_GET_CLASS (store); -+ g_return_val_if_fail (class->initial_setup_sync != NULL, FALSE); -+ -+ save_setup = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); -+ -+ success = class->initial_setup_sync (store, save_setup, cancellable, error); -+ -+ if (!success || !g_hash_table_size (save_setup)) { -+ g_hash_table_destroy (save_setup); -+ save_setup = NULL; -+ } -+ -+ CAMEL_CHECK_GERROR (store, initial_setup_sync, success, error); -+ -+ *out_save_setup = save_setup; -+ -+ return success; -+} -+ -+static void -+store_initial_setup_thread (GTask *task, -+ gpointer source_object, -+ gpointer task_data, -+ GCancellable *cancellable) -+{ -+ gboolean success; -+ AsyncContext *async_context; -+ GError *local_error = NULL; -+ -+ async_context = (AsyncContext *) task_data; -+ -+ success = camel_store_initial_setup_sync ( -+ CAMEL_STORE (source_object), -+ &async_context->save_setup, -+ cancellable, &local_error); -+ -+ if (local_error != NULL) { -+ g_task_return_error (task, local_error); -+ } else { -+ g_task_return_boolean (task, success); -+ } -+} -+ -+/** -+ * camel_store_initial_setup: -+ * @store: a #CamelStore -+ * @io_priority: the I/O priority of the request -+ * @cancellable: optional #GCancellable object, or %NULL -+ * @callback: a #GAsyncReadyCallback to call when the request is satisfied -+ * @user_data: data to pass to the callback function -+ * -+ * Runs initial setup for the @store asynchronously. -+ * -+ * When the operation is finished, @callback will be called. You can then -+ * call camel_store_initial_setup_finish() to get the result of the operation. -+ * -+ * The @store advertises support of this function by including -+ * CAMEL_STORE_SUPPORTS_INITIAL_SETUP in CamelStore::flags. -+ * -+ * Since: 3.12.11-25 (3.20) -+ **/ -+void -+camel_store_initial_setup (CamelStore *store, -+ gint io_priority, -+ GCancellable *cancellable, -+ GAsyncReadyCallback callback, -+ gpointer user_data) -+{ -+ GTask *task; -+ AsyncContext *async_context; -+ -+ g_return_if_fail (CAMEL_IS_STORE (store)); -+ -+ async_context = g_slice_new0 (AsyncContext); -+ -+ task = g_task_new (store, cancellable, callback, user_data); -+ g_task_set_source_tag (task, camel_store_initial_setup); -+ g_task_set_priority (task, io_priority); -+ -+ g_task_set_task_data ( -+ task, async_context, -+ (GDestroyNotify) async_context_free); -+ -+ g_task_run_in_thread (task, store_initial_setup_thread); -+ -+ g_object_unref (task); -+} -+ -+/** -+ * camel_store_initial_setup_finish: -+ * @store: a #CamelStore -+ * @result: a #GAsyncResult -+ * @out_save_setup: (out) (transfer container) (element-type utf8 utf8): setup values to save -+ * @error: return location for a #GError, or %NULL -+ * -+ * Finishes the operation started with camel_store_initial_setup(). -+ * -+ * The save_setup result, if not %NULL, should be freed using -+ * g_hash_table_destroy(). It's not an error to have it %NULL, -+ * it only means the @store doesn't have anything to save. -+ * -+ * Returns: %TRUE on success, %FALSE on error -+ * -+ * Since: 3.12.11-25 (3.20) -+ **/ -+gboolean -+camel_store_initial_setup_finish (CamelStore *store, -+ GAsyncResult *result, -+ GHashTable **out_save_setup, -+ GError **error) -+{ -+ AsyncContext *async_context; -+ -+ g_return_val_if_fail (CAMEL_IS_STORE (store), FALSE); -+ g_return_val_if_fail (out_save_setup != NULL, FALSE); -+ g_return_val_if_fail (g_task_is_valid (result, store), FALSE); -+ -+ g_return_val_if_fail ( -+ g_async_result_is_tagged ( -+ result, camel_store_initial_setup), FALSE); -+ -+ async_context = g_task_get_task_data (G_TASK (result)); -+ *out_save_setup = async_context->save_setup; -+ async_context->save_setup = NULL; -+ -+ return g_task_propagate_boolean (G_TASK (result), error); -+} -diff -up evolution-data-server-3.12.11/camel/camel-store.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/camel-store.h ---- evolution-data-server-3.12.11/camel/camel-store.h.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/camel-store.h 2016-08-15 13:52:41.940976331 +0200 -@@ -63,6 +63,32 @@ - #define CAMEL_STORE_ERROR \ - (camel_store_error_quark ()) - -+/** -+ * --@CAMEL_STORE_SETUP_ARCHIVE_FOLDER: Name of an Archive folder key-- -+ * @CAMEL_STORE_SETUP_DRAFTS_FOLDER: Name of a Drafts folder key -+ * @CAMEL_STORE_SETUP_SENT_FOLDER: Name of a Sent folder key -+ * @CAMEL_STORE_SETUP_TEMPLATES_FOLDER: Name of a Templates folder key -+ * -+ * Key names to a hash table with values to preset for the account used -+ * as in the camel_store_initial_setup_sync() function. -+ * -+ * The key name consists of up to four parts: Source:Extension:Property[:Type] -+ * Source can be 'Collection', 'Account', 'Submission', 'Transport', 'Backend'. -+ * Extension is any extension name; it's up to the key creator to make sure -+ * the extension belongs to that particular Source. -+ * Property is a property name in the Extension. -+ * Type is an optional letter describing the type of the value; if not set, then -+ * string is used. Available values are: 'b' for boolean, 'i' for integer, -+ * 's' for string, 'f' for folder full path. -+ * All the part values are case sensitive. -+ * -+ * Since: 3.12.11-25 (3.20) -+ **/ -+/* #define CAMEL_STORE_SETUP_ARCHIVE_FOLDER "Account:Mail Account:archive-folder:f" */ -+#define CAMEL_STORE_SETUP_DRAFTS_FOLDER "Submission:Mail Composition:drafts-folder:f" -+#define CAMEL_STORE_SETUP_SENT_FOLDER "Submission:Mail Submission:sent-folder:f" -+#define CAMEL_STORE_SETUP_TEMPLATES_FOLDER "Submission:Mail Composition:templates-folder:f" -+ - G_BEGIN_DECLS - - /** -@@ -178,9 +204,13 @@ struct _CamelStoreClass { - gboolean expunge, - GCancellable *cancellable, - GError **error); -+ gboolean (*initial_setup_sync) (CamelStore *store, -+ GHashTable *save_setup, -+ GCancellable *cancellable, -+ GError **error); - - /* Reserved slots for methods. */ -- gpointer reserved_for_methods[21]; -+ gpointer reserved_for_methods[20]; - - /* Signals */ - void (*folder_created) (CamelStore *store, -@@ -357,6 +387,20 @@ void camel_store_synchronize (CamelSto - gboolean camel_store_synchronize_finish (CamelStore *store, - GAsyncResult *result, - GError **error); -+gboolean camel_store_initial_setup_sync (CamelStore *store, -+ GHashTable **out_save_setup, -+ GCancellable *cancellable, -+ GError **error); -+void camel_store_initial_setup (CamelStore *store, -+ gint io_priority, -+ GCancellable *cancellable, -+ GAsyncReadyCallback callback, -+ gpointer user_data); -+gboolean camel_store_initial_setup_finish -+ (CamelStore *store, -+ GAsyncResult *result, -+ GHashTable **out_save_setup, -+ GError **error); - - G_END_DECLS - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-command.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-command.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-command.c.imapx-update-to-upstream 2014-06-16 14:57:07.000000000 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-command.c 2016-08-15 13:52:41.940976331 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-command.c - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -@@ -36,21 +36,11 @@ struct _CamelIMAPXRealCommand { - - volatile gint ref_count; - -- CamelIMAPXJob *job; -- - /* For building the part. */ - GString *buffer; - -- /* Mailbox to select before running command. */ -- GWeakRef mailbox; -- - /* For network/parse errors. */ - GError *error; -- -- /* Used for running some commands synchronously. */ -- GCond done_sync_cond; -- GMutex done_sync_mutex; -- gboolean done_sync_flag; - }; - - /* Safe to cast to a GQueue. */ -@@ -60,8 +50,7 @@ struct _CamelIMAPXCommandQueue { - - CamelIMAPXCommand * - camel_imapx_command_new (CamelIMAPXServer *is, -- const gchar *name, -- CamelIMAPXMailbox *mailbox, -+ guint32 job_kind, - const gchar *format, - ...) - { -@@ -74,14 +63,13 @@ camel_imapx_command_new (CamelIMAPXServe - /* Initialize private bits. */ - real_ic->ref_count = 1; - real_ic->buffer = g_string_sized_new (512); -- g_weak_ref_init (&real_ic->mailbox, mailbox); -- g_cond_init (&real_ic->done_sync_cond); -- g_mutex_init (&real_ic->done_sync_mutex); - - /* Initialize public bits. */ - real_ic->public.is = is; - real_ic->public.tag = tag++; -- real_ic->public.name = name; -+ real_ic->public.job_kind = job_kind; -+ real_ic->public.status = NULL; -+ real_ic->public.completed = FALSE; - g_queue_init (&real_ic->public.parts); - - if (format != NULL && *format != '\0') { -@@ -141,22 +129,10 @@ camel_imapx_command_unref (CamelIMAPXCom - - /* Free the private stuff. */ - -- if (real_ic->job != NULL) -- camel_imapx_job_unref (real_ic->job); -- - g_string_free (real_ic->buffer, TRUE); - -- g_weak_ref_clear (&real_ic->mailbox); -- - g_clear_error (&real_ic->error); - -- g_cond_clear (&real_ic->done_sync_cond); -- g_mutex_clear (&real_ic->done_sync_mutex); -- -- /* Do NOT try to free the GError. If set it should have been -- * propagated to the CamelIMAPXJob, so it's either NULL or the -- * CamelIMAPXJob owns it now. */ -- - /* Fill the memory with a bit pattern before releasing - * it back to the slab allocator, so we can more easily - * identify dangling CamelIMAPXCommand pointers. */ -@@ -180,64 +156,6 @@ camel_imapx_command_check (CamelIMAPXCom - return (real_ic != NULL && real_ic->ref_count > 0); - } - --gint --camel_imapx_command_compare (CamelIMAPXCommand *ic1, -- CamelIMAPXCommand *ic2) --{ -- g_return_val_if_fail (CAMEL_IS_IMAPX_COMMAND (ic1), 0); -- g_return_val_if_fail (CAMEL_IS_IMAPX_COMMAND (ic2), 0); -- -- if (ic1->pri == ic2->pri) -- return 0; -- -- return (ic1->pri < ic2->pri) ? -1 : 1; --} -- --CamelIMAPXJob * --camel_imapx_command_get_job (CamelIMAPXCommand *ic) --{ -- CamelIMAPXRealCommand *real_ic; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_COMMAND (ic), NULL); -- -- real_ic = (CamelIMAPXRealCommand *) ic; -- -- return real_ic->job; --} -- --void --camel_imapx_command_set_job (CamelIMAPXCommand *ic, -- CamelIMAPXJob *job) --{ -- CamelIMAPXRealCommand *real_ic; -- -- g_return_if_fail (CAMEL_IS_IMAPX_COMMAND (ic)); -- -- real_ic = (CamelIMAPXRealCommand *) ic; -- -- if (job != NULL) { -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -- camel_imapx_job_ref (job); -- } -- -- if (real_ic->job != NULL) -- camel_imapx_job_unref (real_ic->job); -- -- real_ic->job = job; --} -- --CamelIMAPXMailbox * --camel_imapx_command_ref_mailbox (CamelIMAPXCommand *ic) --{ -- CamelIMAPXRealCommand *real_ic; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_COMMAND (ic), NULL); -- -- real_ic = (CamelIMAPXRealCommand *) ic; -- -- return g_weak_ref_get (&real_ic->mailbox); --} -- - void - camel_imapx_command_add (CamelIMAPXCommand *ic, - const gchar *format, -@@ -280,7 +198,7 @@ camel_imapx_command_addv (CamelIMAPXComm - - g_return_if_fail (CAMEL_IS_IMAPX_COMMAND (ic)); - -- c (ic->is->tagprefix, "adding command, format = '%s'\n", format); -+ c (camel_imapx_server_get_tagprefix (ic->is), "adding command, format = '%s'\n", format); - - buffer = ((CamelIMAPXRealCommand *) ic)->buffer; - -@@ -330,12 +248,12 @@ camel_imapx_command_addv (CamelIMAPXComm - break; - case 'D': /* datawrapper */ - D = va_arg (ap, CamelDataWrapper *); -- c (ic->is->tagprefix, "got data wrapper '%p'\n", D); -+ c (camel_imapx_server_get_tagprefix (ic->is), "got data wrapper '%p'\n", D); - camel_imapx_command_add_part (ic, CAMEL_IMAPX_COMMAND_DATAWRAPPER, D); - break; - case 'P': /* filename path */ - P = va_arg (ap, gchar *); -- c (ic->is->tagprefix, "got file path '%s'\n", P); -+ c (camel_imapx_server_get_tagprefix (ic->is), "got file path '%s'\n", P); - camel_imapx_command_add_part (ic, CAMEL_IMAPX_COMMAND_FILE, P); - break; - case 't': /* token */ -@@ -344,7 +262,7 @@ camel_imapx_command_addv (CamelIMAPXComm - break; - case 's': /* simple string */ - s = va_arg (ap, gchar *); -- c (ic->is->tagprefix, "got string '%s'\n", g_str_has_prefix (format, "LOGIN") ? "***" : s); -+ c (camel_imapx_server_get_tagprefix (ic->is), "got string '%s'\n", g_str_has_prefix (format, "LOGIN") ? "***" : s); - output_string: - if (s && *s) { - guchar mask = imapx_is_mask (s); -@@ -400,19 +318,19 @@ camel_imapx_command_addv (CamelIMAPXComm - case 'u': - if (llong == 1) { - l = va_arg (ap, glong); -- c (ic->is->tagprefix, "got glong '%d'\n", (gint) l); -+ c (camel_imapx_server_get_tagprefix (ic->is), "got glong '%d'\n", (gint) l); - memcpy (literal_format, start, p - start); - literal_format[p - start] = 0; - g_string_append_printf (buffer, literal_format, l); - } else if (llong == 2) { - guint64 i64 = va_arg (ap, guint64); -- c (ic->is->tagprefix, "got guint64 '%d'\n", (gint) i64); -+ c (camel_imapx_server_get_tagprefix (ic->is), "got guint64 '%d'\n", (gint) i64); - memcpy (literal_format, start, p - start); - literal_format[p - start] = 0; - g_string_append_printf (buffer, literal_format, i64); - } else { - d = va_arg (ap, gint); -- c (ic->is->tagprefix, "got gint '%d'\n", d); -+ c (camel_imapx_server_get_tagprefix (ic->is), "got gint '%d'\n", d); - memcpy (literal_format, start, p - start); - literal_format[p - start] = 0; - g_string_append_printf (buffer, literal_format, d); -@@ -426,7 +344,7 @@ camel_imapx_command_addv (CamelIMAPXComm - case '\\': /* only for \\ really, we dont support \n\r etc at all */ - c = *p; - if (c) { -- g_assert (c == '\\'); -+ g_warn_if_fail (c == '\\'); - g_string_append_len (buffer, ps, p - ps); - p++; - ps = p; -@@ -472,6 +390,8 @@ camel_imapx_command_add_part (CamelIMAPX - /* we presume we'll need to get additional data only if we're not authenticated yet */ - g_object_ref (ob); - mechanism = camel_sasl_get_mechanism (CAMEL_SASL (ob)); -+ if (g_strcmp0 (mechanism, "Google") == 0) -+ mechanism = "XOAUTH2"; - g_string_append (buffer, mechanism); - if (!camel_sasl_get_authenticated ((CamelSasl *) ob)) - type |= CAMEL_IMAPX_COMMAND_CONTINUATION; -@@ -502,7 +422,7 @@ camel_imapx_command_add_part (CamelIMAPX - if (type & CAMEL_IMAPX_COMMAND_LITERAL_PLUS) { - g_string_append_c (buffer, '{'); - g_string_append_printf (buffer, "%u", ob_size); -- if (CAMEL_IMAPX_HAVE_CAPABILITY (ic->is->cinfo, LITERALPLUS)) { -+ if (camel_imapx_server_have_capability (ic->is, IMAPX_CAPABILITY_LITERALPLUS)) { - g_string_append_c (buffer, '+'); - } else { - type &= ~CAMEL_IMAPX_COMMAND_LITERAL_PLUS; -@@ -533,282 +453,12 @@ camel_imapx_command_close (CamelIMAPXCom - buffer = ((CamelIMAPXRealCommand *) ic)->buffer; - - if (buffer->len > 5 && g_ascii_strncasecmp (buffer->str, "LOGIN", 5) == 0) { -- c (ic->is->tagprefix, "completing command buffer is [%d] 'LOGIN...'\n", (gint) buffer->len); -+ c (camel_imapx_server_get_tagprefix (ic->is), "completing command buffer is [%d] 'LOGIN...'\n", (gint) buffer->len); - } else { -- c (ic->is->tagprefix, "completing command buffer is [%d] '%.*s'\n", (gint) buffer->len, (gint) buffer->len, buffer->str); -+ c (camel_imapx_server_get_tagprefix (ic->is), "completing command buffer is [%d] '%.*s'\n", (gint) buffer->len, (gint) buffer->len, buffer->str); - } - if (buffer->len > 0) - camel_imapx_command_add_part (ic, CAMEL_IMAPX_COMMAND_SIMPLE, NULL); - - g_string_set_size (buffer, 0); - } -- --void --camel_imapx_command_wait (CamelIMAPXCommand *ic) --{ -- CamelIMAPXRealCommand *real_ic; -- -- g_return_if_fail (CAMEL_IS_IMAPX_COMMAND (ic)); -- -- real_ic = (CamelIMAPXRealCommand *) ic; -- -- g_mutex_lock (&real_ic->done_sync_mutex); -- while (!real_ic->done_sync_flag) -- g_cond_wait ( -- &real_ic->done_sync_cond, -- &real_ic->done_sync_mutex); -- g_mutex_unlock (&real_ic->done_sync_mutex); --} -- --void --camel_imapx_command_done (CamelIMAPXCommand *ic) --{ -- CamelIMAPXRealCommand *real_ic; -- -- g_return_if_fail (CAMEL_IS_IMAPX_COMMAND (ic)); -- -- real_ic = (CamelIMAPXRealCommand *) ic; -- -- g_mutex_lock (&real_ic->done_sync_mutex); -- real_ic->done_sync_flag = TRUE; -- g_cond_broadcast (&real_ic->done_sync_cond); -- g_mutex_unlock (&real_ic->done_sync_mutex); --} -- --/** -- * camel_imapx_command_failed: -- * @ic: a #CamelIMAPXCommand -- * @error: the error which caused the failure -- * -- * Copies @error to be returned in camel_imapx_command_set_error_if_failed(). -- * Call this function if a networking or parsing error occurred to force all -- * active IMAP commands to abort processing. -- * -- * Since: 3.10 -- **/ --void --camel_imapx_command_failed (CamelIMAPXCommand *ic, -- const GError *error) --{ -- CamelIMAPXRealCommand *real_ic; -- -- g_return_if_fail (CAMEL_IS_IMAPX_COMMAND (ic)); -- g_return_if_fail (error != NULL); -- -- real_ic = (CamelIMAPXRealCommand *) ic; -- -- /* Do not overwrite errors, the first passed in wins */ -- if (real_ic->error != NULL) -- return; -- -- real_ic->error = g_error_copy (error); --} -- --gboolean --camel_imapx_command_set_error_if_failed (CamelIMAPXCommand *ic, -- GError **error) --{ -- CamelIMAPXRealCommand *real_ic; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_COMMAND (ic), FALSE); -- -- real_ic = (CamelIMAPXRealCommand *) ic; -- -- /* Check for a networking or parsing error. */ -- if (real_ic->error != NULL) { -- g_propagate_error (error, real_ic->error); -- real_ic->error = NULL; -- return TRUE; -- } -- -- /* Check if the IMAP server rejected the command. */ -- if (ic->status != NULL && ic->status->result != IMAPX_OK) { -- -- /* FIXME Map IMAP response codes to more -- * meaningful GError domains/codes. -- * -- * switch (ic->status->condition) { -- * case IMAPX_AUTHENTICATIONFAILED: -- * g_set_error (...); -- * break; -- * ... -- * } -- */ -- -- if (ic->status->text != NULL) -- g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -- "%s", ic->status->text); -- else -- g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -- "%s", _("Unknown error")); -- return TRUE; -- } -- -- if (real_ic->job) -- return camel_imapx_job_set_error_if_failed (real_ic->job, error); -- -- return FALSE; --} -- --CamelIMAPXCommandQueue * --camel_imapx_command_queue_new (void) --{ -- /* An initialized GQueue is simply zero-filled, -- * so we can skip calling g_queue_init() here. */ -- return g_slice_new0 (CamelIMAPXCommandQueue); --} -- --void --camel_imapx_command_queue_free (CamelIMAPXCommandQueue *queue) --{ -- CamelIMAPXCommand *ic; -- -- g_return_if_fail (queue != NULL); -- -- while ((ic = g_queue_pop_head ((GQueue *) queue)) != NULL) -- camel_imapx_command_unref (ic); -- -- g_slice_free (CamelIMAPXCommandQueue, queue); --} -- --void --camel_imapx_command_queue_transfer (CamelIMAPXCommandQueue *from, -- CamelIMAPXCommandQueue *to) --{ -- GList *link; -- -- g_return_if_fail (from != NULL); -- g_return_if_fail (to != NULL); -- -- while ((link = g_queue_pop_head_link ((GQueue *) from)) != NULL) -- g_queue_push_tail_link ((GQueue *) to, link); --} -- --void --camel_imapx_command_queue_push_tail (CamelIMAPXCommandQueue *queue, -- CamelIMAPXCommand *ic) --{ -- g_return_if_fail (queue != NULL); -- g_return_if_fail (CAMEL_IS_IMAPX_COMMAND (ic)); -- -- camel_imapx_command_ref (ic); -- -- g_queue_push_tail ((GQueue *) queue, ic); --} -- --void --camel_imapx_command_queue_insert_sorted (CamelIMAPXCommandQueue *queue, -- CamelIMAPXCommand *ic) --{ -- g_return_if_fail (queue != NULL); -- g_return_if_fail (CAMEL_IS_IMAPX_COMMAND (ic)); -- -- camel_imapx_command_ref (ic); -- -- g_queue_insert_sorted ( -- (GQueue *) queue, ic, (GCompareDataFunc) -- camel_imapx_command_compare, NULL); --} -- --gboolean --camel_imapx_command_queue_is_empty (CamelIMAPXCommandQueue *queue) --{ -- g_return_val_if_fail (queue != NULL, TRUE); -- -- return g_queue_is_empty ((GQueue *) queue); --} -- --guint --camel_imapx_command_queue_get_length (CamelIMAPXCommandQueue *queue) --{ -- g_return_val_if_fail (queue != NULL, 0); -- -- return g_queue_get_length ((GQueue *) queue); --} -- --CamelIMAPXCommand * --camel_imapx_command_queue_peek_head (CamelIMAPXCommandQueue *queue) --{ -- g_return_val_if_fail (queue != NULL, NULL); -- -- return g_queue_peek_head ((GQueue *) queue); --} -- --GList * --camel_imapx_command_queue_peek_head_link (CamelIMAPXCommandQueue *queue) --{ -- g_return_val_if_fail (queue != NULL, NULL); -- -- return g_queue_peek_head_link ((GQueue *) queue); --} -- --gboolean --camel_imapx_command_queue_remove (CamelIMAPXCommandQueue *queue, -- CamelIMAPXCommand *ic) --{ -- g_return_val_if_fail (queue != NULL, FALSE); -- g_return_val_if_fail (CAMEL_IS_IMAPX_COMMAND (ic), FALSE); -- -- if (g_queue_remove ((GQueue *) queue, ic)) { -- camel_imapx_command_unref (ic); -- return TRUE; -- } -- -- return FALSE; --} -- --void --camel_imapx_command_queue_delete_link (CamelIMAPXCommandQueue *queue, -- GList *link) --{ -- g_return_if_fail (queue != NULL); -- g_return_if_fail (link != NULL); -- -- /* Verify the link is actually in the queue. */ -- if (g_queue_link_index ((GQueue *) queue, link) == -1) { -- g_warning ("%s: Link not found in queue", G_STRFUNC); -- return; -- } -- -- camel_imapx_command_unref ((CamelIMAPXCommand *) link->data); -- g_queue_delete_link ((GQueue *) queue, link); --} -- --/** -- * camel_imapx_command_queue_ref_by_tag: -- * @queue: a #CamelIMAPXCommandQueue -- * @tag: a #CamelIMAPXCommand tag -- * -- * Returns the #CamelIMAPXCommand in @queue with a matching @tag, or %NULL -- * if no match is found. -- * -- * The returned #CamelIMAPXCommand is referenced for thread-safety and should -- * be unreferenced with camel_imapx_command_unref() when finished with it. -- * -- * Since: 3.10 -- **/ --CamelIMAPXCommand * --camel_imapx_command_queue_ref_by_tag (CamelIMAPXCommandQueue *queue, -- guint32 tag) --{ -- CamelIMAPXCommand *match = NULL; -- GList *head, *link; -- -- g_return_val_if_fail (queue != NULL, NULL); -- -- head = camel_imapx_command_queue_peek_head_link (queue); -- -- for (link = head; link != NULL; link = g_list_next (link)) { -- CamelIMAPXCommand *command = link->data; -- -- if (command->tag == tag) { -- match = camel_imapx_command_ref (command); -- break; -- } -- } -- -- return match; --} -- -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-command.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-command.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-command.h.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-command.h 2016-08-15 13:52:41.943976330 +0200 -@@ -1,24 +1,23 @@ - /* - * camel-imapx-command.h - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - - #ifndef CAMEL_IMAPX_COMMAND_H - #define CAMEL_IMAPX_COMMAND_H - --#include "camel-imapx-mailbox.h" - #include "camel-imapx-utils.h" - - #define CAMEL_IS_IMAPX_COMMAND(command) \ -@@ -27,7 +26,6 @@ - G_BEGIN_DECLS - - /* Avoid a circular reference. */ --struct _CamelIMAPXJob; - struct _CamelIMAPXServer; - - typedef struct _CamelIMAPXCommand CamelIMAPXCommand; -@@ -66,39 +64,27 @@ struct _CamelIMAPXCommand { - struct _CamelIMAPXServer *is; - gint pri; - -- /* Command name/type (e.g. FETCH) */ -- const gchar *name; -+ guint32 job_kind; /* CamelIMAPXJobKind */ - -- /* Status for command, indicates it is complete if != NULL. */ -+ /* Status for command. */ - struct _status_info *status; - - guint32 tag; -+ gboolean completed; - - GQueue parts; - GList *current_part; -- -- /* Responsible for free'ing the command. */ -- CamelIMAPXCommandFunc complete; - }; - - CamelIMAPXCommand * - camel_imapx_command_new (struct _CamelIMAPXServer *is, -- const gchar *name, -- CamelIMAPXMailbox *mailbox, -+ guint32 job_kind, - const gchar *format, - ...); - CamelIMAPXCommand * - camel_imapx_command_ref (CamelIMAPXCommand *ic); - void camel_imapx_command_unref (CamelIMAPXCommand *ic); - gboolean camel_imapx_command_check (CamelIMAPXCommand *ic); --gint camel_imapx_command_compare (CamelIMAPXCommand *ic1, -- CamelIMAPXCommand *ic2); --struct _CamelIMAPXJob * -- camel_imapx_command_get_job (CamelIMAPXCommand *ic); --void camel_imapx_command_set_job (CamelIMAPXCommand *ic, -- struct _CamelIMAPXJob *job); --CamelIMAPXMailbox * -- camel_imapx_command_ref_mailbox (CamelIMAPXCommand *ic); - void camel_imapx_command_add (CamelIMAPXCommand *ic, - const gchar *format, - ...); -@@ -109,51 +95,6 @@ void camel_imapx_command_add_part (Came - CamelIMAPXCommandPartType type, - gpointer data); - void camel_imapx_command_close (CamelIMAPXCommand *ic); --void camel_imapx_command_wait (CamelIMAPXCommand *ic); --void camel_imapx_command_done (CamelIMAPXCommand *ic); --void camel_imapx_command_failed (CamelIMAPXCommand *ic, -- const GError *error); --gboolean camel_imapx_command_set_error_if_failed -- (CamelIMAPXCommand *ic, -- GError **error); -- --/* These are simple GQueue wrappers for CamelIMAPXCommands. -- * They help make sure reference counting is done properly. -- * Add more wrappers as needed, don't circumvent them. */ -- --typedef struct _CamelIMAPXCommandQueue CamelIMAPXCommandQueue; -- --CamelIMAPXCommandQueue * -- camel_imapx_command_queue_new (void); --void camel_imapx_command_queue_free (CamelIMAPXCommandQueue *queue); --void camel_imapx_command_queue_transfer -- (CamelIMAPXCommandQueue *from, -- CamelIMAPXCommandQueue *to); --void camel_imapx_command_queue_push_tail -- (CamelIMAPXCommandQueue *queue, -- CamelIMAPXCommand *ic); --void camel_imapx_command_queue_insert_sorted -- (CamelIMAPXCommandQueue *queue, -- CamelIMAPXCommand *ic); --gboolean camel_imapx_command_queue_is_empty -- (CamelIMAPXCommandQueue *queue); --guint camel_imapx_command_queue_get_length -- (CamelIMAPXCommandQueue *queue); --CamelIMAPXCommand * -- camel_imapx_command_queue_peek_head -- (CamelIMAPXCommandQueue *queue); --GList * camel_imapx_command_queue_peek_head_link -- (CamelIMAPXCommandQueue *queue); --gboolean camel_imapx_command_queue_remove -- (CamelIMAPXCommandQueue *queue, -- CamelIMAPXCommand *ic); --void camel_imapx_command_queue_delete_link -- (CamelIMAPXCommandQueue *queue, -- GList *link); --CamelIMAPXCommand * -- camel_imapx_command_queue_ref_by_tag -- (CamelIMAPXCommandQueue *queue, -- guint32 tag); - - G_END_DECLS - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-conn-manager.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-conn-manager.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-conn-manager.c.imapx-update-to-upstream 2014-11-07 08:34:58.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-conn-manager.c 2016-08-15 13:52:41.945976330 +0200 -@@ -18,7 +18,16 @@ - * Authors: Chenthill Palanisamy - */ - -+#ifdef HAVE_CONFIG_H -+#include -+#endif -+ -+#include -+#include -+ - #include "camel-imapx-conn-manager.h" -+#include "camel-imapx-folder.h" -+#include "camel-imapx-job.h" - #include "camel-imapx-settings.h" - #include "camel-imapx-store.h" - #include "camel-imapx-utils.h" -@@ -34,6 +43,9 @@ - #define CON_WRITE_UNLOCK(x) \ - (g_rw_lock_writer_unlock (&(x)->priv->rw_lock)) - -+#define JOB_QUEUE_LOCK(x) g_rec_mutex_lock (&(x)->priv->job_queue_lock) -+#define JOB_QUEUE_UNLOCK(x) g_rec_mutex_unlock (&(x)->priv->job_queue_lock) -+ - #define CAMEL_IMAPX_CONN_MANAGER_GET_PRIVATE(obj) \ - (G_TYPE_INSTANCE_GET_PRIVATE \ - ((obj), CAMEL_TYPE_IMAPX_CONN_MANAGER, CamelIMAPXConnManagerPrivate)) -@@ -41,23 +53,32 @@ - typedef struct _ConnectionInfo ConnectionInfo; - - struct _CamelIMAPXConnManagerPrivate { -- /* XXX Might be easier for this to be a hash table, -- * with CamelIMAPXServer pointers as the keys. */ -- GList *connections; -+ GList *connections; /* ConnectionInfo * */ - GWeakRef store; - GRWLock rw_lock; - guint limit_max_connections; - - GMutex pending_connections_lock; - GSList *pending_connections; /* GCancellable * */ -+ -+ gchar last_tagprefix; -+ -+ GRecMutex job_queue_lock; -+ GSList *job_queue; /* CamelIMAPXJob * */ -+ -+ GMutex busy_connections_lock; -+ GCond busy_connections_cond; -+ -+ GMutex busy_mailboxes_lock; /* used for both busy_mailboxes and idle_mailboxes */ -+ GHashTable *busy_mailboxes; /* CamelIMAPXMailbox ~> gint */ -+ GHashTable *idle_mailboxes; /* CamelIMAPXMailbox ~> gint */ - }; - - struct _ConnectionInfo { - GMutex lock; - CamelIMAPXServer *is; -- GHashTable *folder_names; -- gchar *selected_folder; -- GError *shutdown_error; -+ gboolean busy; -+ gulong refresh_mailbox_handler_id; - volatile gint ref_count; - }; - -@@ -66,42 +87,101 @@ enum { - PROP_STORE - }; - -+enum { -+ CONNECTION_CREATED, -+ LAST_SIGNAL -+}; -+ -+static guint signals[LAST_SIGNAL]; -+ - G_DEFINE_TYPE ( - CamelIMAPXConnManager, - camel_imapx_conn_manager, - G_TYPE_OBJECT) - -+static gboolean -+imapx_conn_manager_copy_message_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ CamelIMAPXMailbox *destination, -+ GPtrArray *uids, -+ gboolean delete_originals, -+ gboolean remove_deleted_flags, -+ gboolean skip_sync_changes, -+ GCancellable *cancellable, -+ GError **error); -+ -+typedef struct _MailboxRefreshData { -+ CamelIMAPXConnManager *conn_man; -+ CamelIMAPXMailbox *mailbox; -+} MailboxRefreshData; -+ - static void --imapx_conn_shutdown (CamelIMAPXServer *is, -- const GError *error, -- CamelIMAPXConnManager *con_man); -+mailbox_refresh_data_free (MailboxRefreshData *data) -+{ -+ if (data) { -+ g_clear_object (&data->conn_man); -+ g_clear_object (&data->mailbox); -+ g_free (data); -+ } -+} -+ -+static gpointer -+imapx_conn_manager_idle_mailbox_refresh_thread (gpointer user_data) -+{ -+ MailboxRefreshData *data = user_data; -+ GError *local_error = NULL; -+ -+ g_return_val_if_fail (data != NULL, NULL); -+ -+ /* passing NULL cancellable means to use only the job's abort cancellable */ -+ if (!camel_imapx_conn_manager_refresh_info_sync (data->conn_man, data->mailbox, NULL, &local_error)) { -+ c ('*', "%s: Failed to refresh mailbox '%s': %s\n", G_STRFUNC, -+ camel_imapx_mailbox_get_name (data->mailbox), -+ local_error ? local_error->message : "Unknown error"); -+ } -+ -+ mailbox_refresh_data_free (data); -+ g_clear_error (&local_error); -+ -+ return NULL; -+} - - static void --imapx_conn_update_select (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- CamelIMAPXConnManager *con_man); --static void --imapx_conn_mailbox_closed (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- CamelIMAPXConnManager *con_man); -+imapx_conn_manager_refresh_mailbox_cb (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ CamelIMAPXConnManager *conn_man) -+{ -+ MailboxRefreshData *data; -+ GThread *thread; -+ GError *local_error = NULL; -+ -+ g_return_if_fail (CAMEL_IS_IMAPX_SERVER (is)); -+ g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); -+ g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man)); -+ -+ data = g_new0 (MailboxRefreshData, 1); -+ data->conn_man = g_object_ref (conn_man); -+ data->mailbox = g_object_ref (mailbox); -+ -+ thread = g_thread_try_new (NULL, imapx_conn_manager_idle_mailbox_refresh_thread, data, &local_error); -+ if (!thread) { -+ g_warning ("%s: Failed to create IDLE mailbox refresh thread: %s", G_STRFUNC, local_error ? local_error->message : "Unknown error"); -+ mailbox_refresh_data_free (data); -+ } else { -+ g_thread_unref (thread); -+ } -+ -+ g_clear_error (&local_error); -+} - - static ConnectionInfo * - connection_info_new (CamelIMAPXServer *is) - { - ConnectionInfo *cinfo; -- GHashTable *folder_names; -- -- folder_names = g_hash_table_new_full ( -- (GHashFunc) g_str_hash, -- (GEqualFunc) g_str_equal, -- (GDestroyNotify) g_free, -- (GDestroyNotify) NULL); - - cinfo = g_slice_new0 (ConnectionInfo); - g_mutex_init (&cinfo->lock); - cinfo->is = g_object_ref (is); -- cinfo->folder_names = folder_names; -- cinfo->shutdown_error = NULL; - cinfo->ref_count = 1; - - return cinfo; -@@ -125,247 +205,348 @@ connection_info_unref (ConnectionInfo *c - g_return_if_fail (cinfo->ref_count > 0); - - if (g_atomic_int_dec_and_test (&cinfo->ref_count)) { -- camel_imapx_server_shutdown (cinfo->is, cinfo->shutdown_error); -- g_signal_handlers_disconnect_matched (cinfo->is, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, imapx_conn_shutdown, NULL); -- g_signal_handlers_disconnect_matched (cinfo->is, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, imapx_conn_update_select, NULL); -- g_signal_handlers_disconnect_matched (cinfo->is, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, imapx_conn_mailbox_closed, NULL); -+ if (cinfo->refresh_mailbox_handler_id) -+ g_signal_handler_disconnect (cinfo->is, cinfo->refresh_mailbox_handler_id); - - g_mutex_clear (&cinfo->lock); - g_object_unref (cinfo->is); -- g_hash_table_destroy (cinfo->folder_names); -- g_free (cinfo->selected_folder); -- g_clear_error (&cinfo->shutdown_error); - - g_slice_free (ConnectionInfo, cinfo); - } - } - --static void --connection_info_cancel_and_unref (ConnectionInfo *cinfo) --{ -- g_return_if_fail (cinfo != NULL); -- g_return_if_fail (cinfo->ref_count > 0); -- -- g_signal_handlers_disconnect_matched (cinfo->is, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, imapx_conn_shutdown, NULL); -- g_signal_handlers_disconnect_matched (cinfo->is, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, imapx_conn_update_select, NULL); -- g_signal_handlers_disconnect_matched (cinfo->is, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, imapx_conn_mailbox_closed, NULL); -- camel_imapx_server_shutdown (cinfo->is, cinfo->shutdown_error); -- connection_info_unref (cinfo); --} -- - static gboolean --connection_info_is_available (ConnectionInfo *cinfo) -+connection_info_try_reserve (ConnectionInfo *cinfo) - { -- gboolean available; -+ gboolean reserved = FALSE; - - g_return_val_if_fail (cinfo != NULL, FALSE); - - g_mutex_lock (&cinfo->lock); - -- /* Available means it's not tracking any folder names or no jobs are running. */ -- available = (g_hash_table_size (cinfo->folder_names) == 0) || -- camel_imapx_server_get_command_count (cinfo->is) == 0; -+ if (!cinfo->busy) { -+ cinfo->busy = TRUE; -+ reserved = TRUE; -+ } - - g_mutex_unlock (&cinfo->lock); - -- return available; -+ return reserved; - } - - static gboolean --connection_info_has_folder_name (ConnectionInfo *cinfo, -- const gchar *folder_name) -+connection_info_get_busy (ConnectionInfo *cinfo) - { -- gpointer value; -+ gboolean busy; - - g_return_val_if_fail (cinfo != NULL, FALSE); - -- if (folder_name == NULL) -- return FALSE; -- - g_mutex_lock (&cinfo->lock); - -- value = g_hash_table_lookup (cinfo->folder_names, folder_name); -+ busy = cinfo->busy; - - g_mutex_unlock (&cinfo->lock); - -- return (value != NULL); -+ return busy; - } - - static void --connection_info_insert_folder_name (ConnectionInfo *cinfo, -- const gchar *folder_name) -+connection_info_set_busy (ConnectionInfo *cinfo, -+ gboolean busy) - { - g_return_if_fail (cinfo != NULL); -- g_return_if_fail (folder_name != NULL); - - g_mutex_lock (&cinfo->lock); - -- g_hash_table_insert ( -- cinfo->folder_names, -- g_strdup (folder_name), -- GINT_TO_POINTER (1)); -+ cinfo->busy = busy; - - g_mutex_unlock (&cinfo->lock); - } - - static void --connection_info_remove_folder_name (ConnectionInfo *cinfo, -- const gchar *folder_name) -+imapx_conn_manager_signal_busy_connections (CamelIMAPXConnManager *conn_man) - { -- g_return_if_fail (cinfo != NULL); -- g_return_if_fail (folder_name != NULL); -+ g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man)); - -- g_mutex_lock (&cinfo->lock); -+ g_mutex_lock (&conn_man->priv->busy_connections_lock); -+ g_cond_broadcast (&conn_man->priv->busy_connections_cond); -+ g_mutex_unlock (&conn_man->priv->busy_connections_lock); -+} -+ -+static void -+imapx_conn_manager_unmark_busy (CamelIMAPXConnManager *conn_man, -+ ConnectionInfo *cinfo) -+{ -+ g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man)); -+ g_return_if_fail (cinfo != NULL); -+ g_return_if_fail (connection_info_get_busy (cinfo)); - -- g_hash_table_remove (cinfo->folder_names, folder_name); -+ connection_info_set_busy (cinfo, FALSE); - -- g_mutex_unlock (&cinfo->lock); -+ imapx_conn_manager_signal_busy_connections (conn_man); - } - --static gchar * --connection_info_dup_selected_folder (ConnectionInfo *cinfo) -+static gboolean -+imapx_conn_manager_remove_info (CamelIMAPXConnManager *conn_man, -+ ConnectionInfo *cinfo) - { -- gchar *selected_folder; -+ GList *list, *link; -+ gboolean removed = FALSE; - -- g_return_val_if_fail (cinfo != NULL, NULL); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ g_return_val_if_fail (cinfo != NULL, FALSE); - -- g_mutex_lock (&cinfo->lock); -+ CON_WRITE_LOCK (conn_man); - -- selected_folder = g_strdup (cinfo->selected_folder); -+ list = conn_man->priv->connections; -+ link = g_list_find (list, cinfo); - -- g_mutex_unlock (&cinfo->lock); -+ if (link != NULL) { -+ list = g_list_delete_link (list, link); -+ connection_info_unref (cinfo); -+ removed = TRUE; -+ } -+ -+ conn_man->priv->connections = list; -+ -+ CON_WRITE_UNLOCK (conn_man); -+ -+ if (removed) -+ imapx_conn_manager_signal_busy_connections (conn_man); - -- return selected_folder; -+ return removed; - } - - static void --connection_info_set_selected_folder (ConnectionInfo *cinfo, -- const gchar *selected_folder) -+imapx_conn_manager_cancel_pending_connections (CamelIMAPXConnManager *conn_man) - { -- g_return_if_fail (cinfo != NULL); -+ GSList *link; - -- g_mutex_lock (&cinfo->lock); -+ g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man)); - -- g_free (cinfo->selected_folder); -- cinfo->selected_folder = g_strdup (selected_folder); -+ g_mutex_lock (&conn_man->priv->pending_connections_lock); -+ for (link = conn_man->priv->pending_connections; link; link = g_slist_next (link)) { -+ GCancellable *cancellable = link->data; - -- g_mutex_unlock (&cinfo->lock); -+ if (cancellable) -+ g_cancellable_cancel (cancellable); -+ } -+ g_mutex_unlock (&conn_man->priv->pending_connections_lock); - } - - static void --connection_info_set_shutdown_error (ConnectionInfo *cinfo, -- const GError *shutdown_error) -+imapx_conn_manager_abort_jobs (CamelIMAPXConnManager *conn_man) - { -- g_return_if_fail (cinfo != NULL); -+ GSList *link; - -- g_mutex_lock (&cinfo->lock); -+ g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man)); - -- if (cinfo->shutdown_error != shutdown_error) { -- g_clear_error (&cinfo->shutdown_error); -- if (shutdown_error) -- cinfo->shutdown_error = g_error_copy (shutdown_error); -+ JOB_QUEUE_LOCK (conn_man); -+ -+ for (link = conn_man->priv->job_queue; link; link = g_slist_next (link)) { -+ CamelIMAPXJob *job = link->data; -+ -+ if (job) -+ camel_imapx_job_abort (job); - } - -- g_mutex_unlock (&cinfo->lock); -+ JOB_QUEUE_UNLOCK (conn_man); - } - --static GList * --imapx_conn_manager_list_info (CamelIMAPXConnManager *con_man) -+static CamelFolder * -+imapx_conn_manager_ref_folder_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) - { -- GList *list; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (con_man), NULL); -+ CamelIMAPXStore *store; -+ CamelFolder *folder; -+ gchar *folder_path; - -- CON_READ_LOCK (con_man); -+ store = camel_imapx_conn_manager_ref_store (conn_man); -+ folder_path = camel_imapx_mailbox_dup_folder_path (mailbox); - -- list = g_list_copy (con_man->priv->connections); -- g_list_foreach (list, (GFunc) connection_info_ref, NULL); -+ folder = camel_store_get_folder_sync (CAMEL_STORE (store), folder_path, 0, cancellable, NULL); -+ if (folder) -+ camel_imapx_folder_set_mailbox (CAMEL_IMAPX_FOLDER (folder), mailbox); - -- CON_READ_UNLOCK (con_man); -+ g_free (folder_path); -+ g_clear_object (&store); - -- return list; -+ return folder; - } - --static ConnectionInfo * --imapx_conn_manager_lookup_info (CamelIMAPXConnManager *con_man, -- CamelIMAPXServer *is) -+static void -+imapx_conn_manager_inc_mailbox_hash (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GHashTable *mailboxes_hash) - { -- ConnectionInfo *cinfo = NULL; -- GList *list, *link; -+ gint count; - -- g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (con_man), NULL); -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); -+ g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man)); -+ g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); -+ g_return_if_fail (mailboxes_hash != NULL); - -- CON_READ_LOCK (con_man); -+ g_mutex_lock (&conn_man->priv->busy_mailboxes_lock); - -- list = con_man->priv->connections; -+ count = GPOINTER_TO_INT (g_hash_table_lookup (mailboxes_hash, mailbox)); -+ count++; - -- for (link = list; link != NULL; link = g_list_next (link)) { -- ConnectionInfo *candidate = link->data; -+ g_hash_table_insert (mailboxes_hash, g_object_ref (mailbox), GINT_TO_POINTER (count)); - -- if (candidate->is == is) { -- cinfo = connection_info_ref (candidate); -- break; -- } -+ g_mutex_unlock (&conn_man->priv->busy_mailboxes_lock); -+} -+ -+static void -+imapx_conn_manager_dec_mailbox_hash (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GHashTable *mailboxes_hash) -+{ -+ gint count; -+ -+ g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man)); -+ g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); -+ g_return_if_fail (mailboxes_hash != NULL); -+ -+ g_mutex_lock (&conn_man->priv->busy_mailboxes_lock); -+ -+ count = GPOINTER_TO_INT (g_hash_table_lookup (mailboxes_hash, mailbox)); -+ if (!count) { -+ g_mutex_unlock (&conn_man->priv->busy_mailboxes_lock); -+ return; - } - -- CON_READ_UNLOCK (con_man); -+ count--; - -- return cinfo; -+ if (count) -+ g_hash_table_insert (mailboxes_hash, g_object_ref (mailbox), GINT_TO_POINTER (count)); -+ else -+ g_hash_table_remove (mailboxes_hash, mailbox); -+ -+ g_mutex_unlock (&conn_man->priv->busy_mailboxes_lock); - } - - static gboolean --imapx_conn_manager_remove_info (CamelIMAPXConnManager *con_man, -- ConnectionInfo *cinfo) -+imapx_conn_manager_is_mailbox_hash (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GHashTable *mailboxes_hash) - { -- GList *list, *link; -- gboolean removed = FALSE; -+ gint count; - -- g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (con_man), FALSE); -- g_return_val_if_fail (cinfo != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ g_return_val_if_fail (mailboxes_hash != NULL, FALSE); - -- CON_WRITE_LOCK (con_man); -+ g_mutex_lock (&conn_man->priv->busy_mailboxes_lock); - -- list = con_man->priv->connections; -- link = g_list_find (list, cinfo); -+ count = GPOINTER_TO_INT (g_hash_table_lookup (mailboxes_hash, mailbox)); - -- if (link != NULL) { -- list = g_list_delete_link (list, link); -- connection_info_unref (cinfo); -- removed = TRUE; -- } -+ g_mutex_unlock (&conn_man->priv->busy_mailboxes_lock); -+ -+ return count > 0; -+} - -- con_man->priv->connections = list; -+static void -+imapx_conn_manager_clear_mailboxes_hashes (CamelIMAPXConnManager *conn_man) -+{ -+ g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man)); - -- CON_WRITE_UNLOCK (con_man); -+ g_mutex_lock (&conn_man->priv->busy_mailboxes_lock); - -- return removed; -+ g_hash_table_remove_all (conn_man->priv->busy_mailboxes); -+ g_hash_table_remove_all (conn_man->priv->idle_mailboxes); -+ -+ g_mutex_unlock (&conn_man->priv->busy_mailboxes_lock); - } - - static void --imax_conn_manager_cancel_pending_connections (CamelIMAPXConnManager *con_man) -+imapx_conn_manager_inc_mailbox_busy (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox) - { -- GSList *link; -+ g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man)); -+ g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); - -- g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (con_man)); -+ imapx_conn_manager_inc_mailbox_hash (conn_man, mailbox, conn_man->priv->busy_mailboxes); -+} - -- g_mutex_lock (&con_man->priv->pending_connections_lock); -- for (link = con_man->priv->pending_connections; link; link = g_slist_next (link)) { -- GCancellable *cancellable = link->data; -+static void -+imapx_conn_manager_dec_mailbox_busy (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox) -+{ -+ g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man)); -+ g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); - -- if (cancellable) -- g_cancellable_cancel (cancellable); -- } -- g_mutex_unlock (&con_man->priv->pending_connections_lock); -+ imapx_conn_manager_dec_mailbox_hash (conn_man, mailbox, conn_man->priv->busy_mailboxes); -+} -+ -+static gboolean -+imapx_conn_manager_is_mailbox_busy (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox) -+{ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ -+ return imapx_conn_manager_is_mailbox_hash (conn_man, mailbox, conn_man->priv->busy_mailboxes); -+} -+ -+static void -+imapx_conn_manager_inc_mailbox_idle (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox) -+{ -+ g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man)); -+ g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); -+ -+ imapx_conn_manager_inc_mailbox_hash (conn_man, mailbox, conn_man->priv->idle_mailboxes); -+} -+ -+static void -+imapx_conn_manager_dec_mailbox_idle (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox) -+{ -+ g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man)); -+ g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); -+ -+ imapx_conn_manager_dec_mailbox_hash (conn_man, mailbox, conn_man->priv->idle_mailboxes); -+} -+ -+static gboolean -+imapx_conn_manager_is_mailbox_idle (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox) -+{ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ -+ return imapx_conn_manager_is_mailbox_hash (conn_man, mailbox, conn_man->priv->idle_mailboxes); -+} -+ -+static gboolean -+imapx_conn_manager_has_inbox_idle (CamelIMAPXConnManager *conn_man) -+{ -+ CamelIMAPXStore *imapx_store; -+ CamelIMAPXMailbox *inbox_mailbox; -+ gboolean is_idle; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ -+ imapx_store = camel_imapx_conn_manager_ref_store (conn_man); -+ inbox_mailbox = imapx_store ? camel_imapx_store_ref_mailbox (imapx_store, "INBOX") : NULL; -+ -+ g_clear_object (&imapx_store); -+ -+ is_idle = inbox_mailbox && imapx_conn_manager_is_mailbox_idle (conn_man, inbox_mailbox); -+ -+ g_clear_object (&inbox_mailbox); -+ -+ return is_idle; - } - - static void --imapx_conn_manager_set_store (CamelIMAPXConnManager *con_man, -+imapx_conn_manager_set_store (CamelIMAPXConnManager *conn_man, - CamelStore *store) - { - g_return_if_fail (CAMEL_IS_STORE (store)); - -- g_weak_ref_set (&con_man->priv->store, store); -+ g_weak_ref_set (&conn_man->priv->store, store); - } - - static void -@@ -406,18 +587,24 @@ imapx_conn_manager_get_property (GObject - static void - imapx_conn_manager_dispose (GObject *object) - { -- CamelIMAPXConnManagerPrivate *priv; -+ CamelIMAPXConnManager *conn_man; - -- priv = CAMEL_IMAPX_CONN_MANAGER_GET_PRIVATE (object); -+ conn_man = CAMEL_IMAPX_CONN_MANAGER (object); -+ -+ imapx_conn_manager_cancel_pending_connections (conn_man); -+ imapx_conn_manager_abort_jobs (conn_man); - - g_list_free_full ( -- priv->connections, -+ conn_man->priv->connections, - (GDestroyNotify) connection_info_unref); -- priv->connections = NULL; -+ conn_man->priv->connections = NULL; - -- imax_conn_manager_cancel_pending_connections (CAMEL_IMAPX_CONN_MANAGER (object)); -+ g_weak_ref_set (&conn_man->priv->store, NULL); - -- g_weak_ref_set (&priv->store, NULL); -+ g_mutex_lock (&conn_man->priv->busy_mailboxes_lock); -+ g_hash_table_remove_all (conn_man->priv->busy_mailboxes); -+ g_hash_table_remove_all (conn_man->priv->idle_mailboxes); -+ g_mutex_unlock (&conn_man->priv->busy_mailboxes_lock); - - /* Chain up to parent's dispose() method. */ - G_OBJECT_CLASS (camel_imapx_conn_manager_parent_class)->dispose (object); -@@ -431,10 +618,17 @@ imapx_conn_manager_finalize (GObject *ob - priv = CAMEL_IMAPX_CONN_MANAGER_GET_PRIVATE (object); - - g_warn_if_fail (priv->pending_connections == NULL); -+ g_warn_if_fail (priv->job_queue == NULL); - - g_rw_lock_clear (&priv->rw_lock); -+ g_rec_mutex_clear (&priv->job_queue_lock); - g_mutex_clear (&priv->pending_connections_lock); -+ g_mutex_clear (&priv->busy_connections_lock); -+ g_cond_clear (&priv->busy_connections_cond); - g_weak_ref_clear (&priv->store); -+ g_mutex_clear (&priv->busy_mailboxes_lock); -+ g_hash_table_destroy (priv->busy_mailboxes); -+ g_hash_table_destroy (priv->idle_mailboxes); - - /* Chain up to parent's finalize() method. */ - G_OBJECT_CLASS (camel_imapx_conn_manager_parent_class)->finalize (object); -@@ -459,546 +653,2147 @@ camel_imapx_conn_manager_class_init (Cam - g_param_spec_object ( - "store", - "Store", -- "The CamelStore to which we belong", -- CAMEL_TYPE_STORE, -+ "The CamelIMAPXStore to which we belong", -+ CAMEL_TYPE_IMAPX_STORE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS)); --} -- --static void --camel_imapx_conn_manager_init (CamelIMAPXConnManager *con_man) --{ -- con_man->priv = CAMEL_IMAPX_CONN_MANAGER_GET_PRIVATE (con_man); - -- g_rw_lock_init (&con_man->priv->rw_lock); -- g_mutex_init (&con_man->priv->pending_connections_lock); -- g_weak_ref_init (&con_man->priv->store, NULL); -+ signals[CONNECTION_CREATED] = g_signal_new ( -+ "connection-created", -+ G_OBJECT_CLASS_TYPE (class), -+ G_SIGNAL_RUN_FIRST, -+ G_STRUCT_OFFSET (CamelIMAPXConnManagerClass, connection_created), -+ NULL, NULL, NULL, -+ G_TYPE_NONE, 1, -+ CAMEL_TYPE_IMAPX_SERVER); - } - - static void --imapx_conn_shutdown (CamelIMAPXServer *is, -- const GError *error, -- CamelIMAPXConnManager *con_man) -+camel_imapx_conn_manager_init (CamelIMAPXConnManager *conn_man) - { -- ConnectionInfo *cinfo; -- -- /* Returns a new ConnectionInfo reference. */ -- cinfo = imapx_conn_manager_lookup_info (con_man, is); -+ conn_man->priv = CAMEL_IMAPX_CONN_MANAGER_GET_PRIVATE (conn_man); - -- if (cinfo != NULL) { -- imapx_conn_manager_remove_info (con_man, cinfo); -- connection_info_unref (cinfo); -- } -- -- /* If one connection ends with this error, then it means all -- other opened connections also may end with the same error, -- thus better to kill them all from the list of connections. -- */ -- if (g_error_matches (error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- camel_imapx_conn_manager_close_connections (con_man, error); -- } -+ g_rw_lock_init (&conn_man->priv->rw_lock); -+ g_rec_mutex_init (&conn_man->priv->job_queue_lock); -+ g_mutex_init (&conn_man->priv->pending_connections_lock); -+ g_mutex_init (&conn_man->priv->busy_connections_lock); -+ g_cond_init (&conn_man->priv->busy_connections_cond); -+ g_weak_ref_init (&conn_man->priv->store, NULL); -+ g_mutex_init (&conn_man->priv->busy_mailboxes_lock); -+ -+ conn_man->priv->last_tagprefix = 'A' - 1; -+ conn_man->priv->busy_mailboxes = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL); -+ conn_man->priv->idle_mailboxes = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL); - } - --static void --imapx_conn_update_select (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- CamelIMAPXConnManager *con_man) -+static gchar -+imapx_conn_manager_get_next_free_tagprefix_unlocked (CamelIMAPXConnManager *conn_man) - { -- ConnectionInfo *cinfo; -- gchar *old_selected_folder, *selected_folder = NULL; -+ gchar adept; -+ gint ii; -+ GList *iter; - -- /* Returns a new ConnectionInfo reference. */ -- cinfo = imapx_conn_manager_lookup_info (con_man, is); -+ adept = conn_man->priv->last_tagprefix + 1; - -- if (cinfo == NULL) -- return; -+ /* the 'Z' is dedicated to auth types query */ -+ if (adept >= 'Z') -+ adept = 'A'; -+ else if (adept < 'A') -+ adept = 'A'; -+ -+ for (ii = 0; ii < 26; ii++) { -+ for (iter = conn_man->priv->connections; iter; iter = g_list_next (iter)) { -+ ConnectionInfo *cinfo = iter->data; - -- old_selected_folder = connection_info_dup_selected_folder (cinfo); -+ if (!cinfo || !cinfo->is) -+ continue; - -- if (old_selected_folder != NULL) { -- if (!camel_imapx_server_folder_name_in_jobs (is, old_selected_folder)) { -- connection_info_remove_folder_name (cinfo, old_selected_folder); -- c (is->tagprefix, "Removed folder %s from connection folder list - select changed \n", old_selected_folder); -+ if (camel_imapx_server_get_tagprefix (cinfo->is) == adept) -+ break; - } - -- g_free (old_selected_folder); -+ /* Read all current active connections and none has the same tag prefix */ -+ if (!iter) -+ break; -+ -+ adept++; -+ if (adept >= 'Z') -+ adept = 'A'; - } - -- if (mailbox) -- selected_folder = camel_imapx_mailbox_dup_folder_path (mailbox); -- connection_info_set_selected_folder (cinfo, selected_folder); -- g_free (selected_folder); -+ g_return_val_if_fail (adept >= 'A' && adept < 'Z', 'Z'); - -- connection_info_unref (cinfo); --} -+ conn_man->priv->last_tagprefix = adept; - --static void --imapx_conn_mailbox_closed (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- CamelIMAPXConnManager *con_man) --{ -- imapx_conn_update_select (is, NULL, con_man); -+ return adept; - } - --/* This should find a connection if the slots are full, returns NULL if there are slots available for a new connection for a folder */ --static CamelIMAPXServer * --imapx_find_connection_unlocked (CamelIMAPXConnManager *con_man, -- const gchar *folder_name, -- gboolean for_expensive_job) -+static ConnectionInfo * -+imapx_create_new_connection_unlocked (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelStore *store; -- CamelSettings *settings; - CamelIMAPXServer *is = NULL; -+ CamelIMAPXStore *imapx_store; - ConnectionInfo *cinfo = NULL; -- GList *list, *link; -- guint concurrent_connections, opened_connections, expensive_connections = 0; -- guint min_jobs = G_MAXUINT; -+ gboolean success; - - /* Caller must be holding CON_WRITE_LOCK. */ - -- store = camel_imapx_conn_manager_ref_store (con_man); -- g_return_val_if_fail (store != NULL, NULL); -+ /* Check if we got cancelled while we were waiting. */ -+ if (g_cancellable_set_error_if_cancelled (cancellable, error)) -+ return NULL; - -- settings = camel_service_ref_settings (CAMEL_SERVICE (store)); -+ imapx_store = camel_imapx_conn_manager_ref_store (conn_man); -+ g_return_val_if_fail (imapx_store != NULL, NULL); - -- concurrent_connections = -- camel_imapx_settings_get_concurrent_connections ( -- CAMEL_IMAPX_SETTINGS (settings)); -- -- if (con_man->priv->limit_max_connections > 0 && -- con_man->priv->limit_max_connections < concurrent_connections) -- concurrent_connections = con_man->priv->limit_max_connections; -+ is = camel_imapx_server_new (imapx_store); -+ camel_imapx_server_set_tagprefix (is, imapx_conn_manager_get_next_free_tagprefix_unlocked (conn_man)); - -- g_object_unref (settings); -+ g_signal_emit (conn_man, signals[CONNECTION_CREATED], 0, is); - -- /* XXX Have a dedicated connection for INBOX ? */ -+ /* XXX As part of the connect operation the CamelIMAPXServer will -+ * have to call camel_session_authenticate_sync(), but it has -+ * no way to pass itself through in that call so the service -+ * knows which CamelIMAPXServer is trying to authenticate. -+ * -+ * IMAPX is the only provider that does multiple connections -+ * like this, so I didn't want to pollute the CamelSession and -+ * CamelService authentication APIs with an extra argument. -+ * Instead we do this little hack so the service knows which -+ * CamelIMAPXServer to act on in its authenticate_sync() method. -+ * -+ * Because we're holding the CAMEL_SERVICE_REC_CONNECT_LOCK -+ * we should not have multiple IMAPX connections trying to -+ * authenticate at once, so this should be thread-safe. -+ */ -+ camel_imapx_store_set_connecting_server (imapx_store, is, conn_man->priv->connections != NULL); -+ success = camel_imapx_server_connect_sync (is, cancellable, error); -+ camel_imapx_store_set_connecting_server (imapx_store, NULL, FALSE); - -- opened_connections = g_list_length (con_man->priv->connections); -- list = con_man->priv->connections; -+ if (!success) -+ goto exit; - -- /* If a folder was not given, find the least-busy connection. */ -- if (folder_name == NULL) { -- goto least_busy; -- } -+ cinfo = connection_info_new (is); - -- /* First try to find a connection already handling this folder. */ -- for (link = list; link != NULL; link = g_list_next (link)) { -- ConnectionInfo *candidate = link->data; -+ cinfo->refresh_mailbox_handler_id = g_signal_connect ( -+ is, "refresh-mailbox", G_CALLBACK (imapx_conn_manager_refresh_mailbox_cb), conn_man); - -- if (camel_imapx_server_has_expensive_command (candidate->is)) -- expensive_connections++; -+ /* Takes ownership of the ConnectionInfo. */ -+ conn_man->priv->connections = g_list_append (conn_man->priv->connections, cinfo); - -- if (connection_info_has_folder_name (candidate, folder_name) && camel_imapx_server_is_connected (candidate->is) && -- (opened_connections >= concurrent_connections || for_expensive_job || !camel_imapx_server_has_expensive_command (candidate->is))) { -- if (cinfo) { -- /* group expensive jobs into one connection */ -- if (for_expensive_job && camel_imapx_server_has_expensive_command (cinfo->is)) -- continue; -+ c (camel_imapx_server_get_tagprefix (is), "Created new connection %p (server:%p) for %s; total connections %d\n", -+ cinfo, cinfo->is, -+ mailbox ? camel_imapx_mailbox_get_name (mailbox) : "[null]", -+ g_list_length (conn_man->priv->connections)); - -- if (!for_expensive_job && camel_imapx_server_get_command_count (cinfo->is) < camel_imapx_server_get_command_count (candidate->is)) -- continue; -+exit: -+ g_object_unref (imapx_store); -+ g_clear_object (&is); - -- connection_info_unref (cinfo); -- } -+ return cinfo; -+} - -- cinfo = connection_info_ref (candidate); -- if (for_expensive_job && camel_imapx_server_has_expensive_command (cinfo->is)) -- goto exit; -- } -- } -+static gint -+imapx_conn_manager_get_max_connections (CamelIMAPXConnManager *conn_man) -+{ -+ CamelIMAPXStore *imapx_store; -+ CamelSettings *settings; -+ gint max_connections; - -- least_busy: -- if (for_expensive_job) { -- /* allow only half connections being with expensive operations */ -- if (expensive_connections > 0 && -- expensive_connections < concurrent_connections / 2 && -- opened_connections < concurrent_connections) -- goto exit; -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), -1); - -- /* cinfo here doesn't have any expensive command, thus ignore it */ -- if (cinfo) { -- connection_info_unref (cinfo); -- cinfo = NULL; -- } -+ imapx_store = camel_imapx_conn_manager_ref_store (conn_man); -+ if (!imapx_store) -+ return -1; - -- /* Pick the connection with the least number of jobs in progress among those with expensive jobs. */ -- for (link = list; link != NULL; link = g_list_next (link)) { -- ConnectionInfo *candidate = link->data; -- guint jobs; -+ settings = camel_service_ref_settings (CAMEL_SERVICE (imapx_store)); - -- if (!camel_imapx_server_is_connected (candidate->is) || -- !camel_imapx_server_has_expensive_command (candidate->is)) -- continue; -+ max_connections = camel_imapx_settings_get_concurrent_connections (CAMEL_IMAPX_SETTINGS (settings)); - -- jobs = camel_imapx_server_get_command_count (candidate->is); -+ if (conn_man->priv->limit_max_connections > 0 && -+ conn_man->priv->limit_max_connections < max_connections) -+ max_connections = conn_man->priv->limit_max_connections; - -- if (cinfo == NULL) { -- cinfo = connection_info_ref (candidate); -- min_jobs = jobs; -- -- } else if (jobs < min_jobs) { -- connection_info_unref (cinfo); -- cinfo = connection_info_ref (candidate); -- min_jobs = jobs; -- } -- } -+ g_object_unref (settings); -+ g_object_unref (imapx_store); - -- if (cinfo) -- goto exit; -- } -+ return max_connections > 0 ? max_connections : 1; -+} - -- /* Next try to find a connection not handling any folders. */ -- for (link = list; link != NULL; link = g_list_next (link)) { -- ConnectionInfo *candidate = link->data; -+static void -+imapx_conn_manager_connection_wait_cancelled_cb (GCancellable *cancellable, -+ CamelIMAPXConnManager *conn_man) -+{ -+ g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man)); - -- if (camel_imapx_server_is_connected (candidate->is) && -- connection_info_is_available (candidate)) { -- if (cinfo) -- connection_info_unref (cinfo); -- cinfo = connection_info_ref (candidate); -- goto exit; -- } -- } -+ imapx_conn_manager_signal_busy_connections (conn_man); -+} - -- /* open a new connection, if there is a room for it */ -- if (opened_connections < concurrent_connections && (!for_expensive_job || opened_connections < concurrent_connections / 2)) { -- if (cinfo && camel_imapx_server_get_command_count (cinfo->is) != 0) { -- connection_info_unref (cinfo); -- cinfo = NULL; -- } -- goto exit; -- } else { -- if (cinfo) -- min_jobs = camel_imapx_server_get_command_count (cinfo->is); -- } -+static ConnectionInfo * -+camel_imapx_conn_manager_ref_connection (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ gboolean *out_is_new_connection, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ ConnectionInfo *cinfo = NULL; -+ CamelIMAPXStore *imapx_store; -+ CamelSession *session; -+ GError *local_error = NULL; - -- /* Pick the connection with the least number of jobs in progress. */ -- for (link = list; link != NULL; link = g_list_next (link)) { -- ConnectionInfo *candidate = link->data; -- gint n_commands; -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), NULL); - -- if (!camel_imapx_server_is_connected (candidate->is)) -- continue; -+ if (out_is_new_connection) -+ *out_is_new_connection = FALSE; - -- n_commands = camel_imapx_server_get_command_count (candidate->is); -+ imapx_store = camel_imapx_conn_manager_ref_store (conn_man); -+ if (!imapx_store) -+ return NULL; - -- if (cinfo == NULL) { -- cinfo = connection_info_ref (candidate); -- min_jobs = n_commands; -+ session = camel_service_ref_session (CAMEL_SERVICE (imapx_store)); - -- } else if (n_commands < min_jobs) { -- connection_info_unref (cinfo); -- cinfo = connection_info_ref (candidate); -- min_jobs = n_commands; -+ if (camel_offline_store_get_online (CAMEL_OFFLINE_STORE (imapx_store)) && -+ session && camel_session_get_online (session)) { -+ -+ g_mutex_lock (&conn_man->priv->pending_connections_lock); -+ if (cancellable) { -+ g_object_ref (cancellable); -+ } else { -+ cancellable = g_cancellable_new (); -+ } -+ conn_man->priv->pending_connections = g_slist_prepend (conn_man->priv->pending_connections, cancellable); -+ g_mutex_unlock (&conn_man->priv->pending_connections_lock); -+ -+ /* Hold the writer lock while we requisition a CamelIMAPXServer -+ * to prevent other threads from adding or removing connections. */ -+ CON_READ_LOCK (conn_man); -+ -+ /* Check if we've got cancelled while waiting for the lock. */ -+ while (!cinfo && !g_cancellable_set_error_if_cancelled (cancellable, &local_error)) { -+ gint opened_connections, max_connections; -+ GList *link; -+ -+ for (link = conn_man->priv->connections; link; link = g_list_next (link)) { -+ ConnectionInfo *candidate = link->data; -+ -+ if (candidate && connection_info_try_reserve (candidate)) { -+ cinfo = connection_info_ref (candidate); -+ break; -+ } -+ } -+ -+ if (cinfo) -+ break; -+ -+ opened_connections = g_list_length (conn_man->priv->connections); -+ max_connections = imapx_conn_manager_get_max_connections (conn_man); -+ -+ if (max_connections <= 0) -+ break; -+ -+ if (!cinfo && opened_connections < max_connections) { -+ GError *local_error_2 = NULL; -+ -+ CON_READ_UNLOCK (conn_man); -+ CON_WRITE_LOCK (conn_man); -+ cinfo = imapx_create_new_connection_unlocked (conn_man, mailbox, cancellable, &local_error_2); -+ if (cinfo) -+ connection_info_set_busy (cinfo, TRUE); -+ CON_WRITE_UNLOCK (conn_man); -+ CON_READ_LOCK (conn_man); -+ -+ if (!cinfo) { -+ gboolean limit_connections = -+ g_error_matches (local_error_2, CAMEL_IMAPX_SERVER_ERROR, -+ CAMEL_IMAPX_SERVER_ERROR_CONCURRENT_CONNECT_FAILED) && -+ conn_man->priv->connections; -+ -+ c ('*', "Failed to open a new connection, while having %d opened, with error: %s; will limit connections: %s\n", -+ g_list_length (conn_man->priv->connections), -+ local_error_2 ? local_error_2->message : "Unknown error", -+ limit_connections ? "yes" : "no"); -+ -+ if (limit_connections) { -+ /* limit to one-less than current connection count - be nice to the server */ -+ conn_man->priv->limit_max_connections = g_list_length (conn_man->priv->connections) - 1; -+ if (!conn_man->priv->limit_max_connections) -+ conn_man->priv->limit_max_connections = 1; -+ -+ g_clear_error (&local_error_2); -+ } else { -+ if (local_error_2) -+ g_propagate_error (&local_error, local_error_2); -+ break; -+ } -+ } else { -+ connection_info_ref (cinfo); -+ -+ if (out_is_new_connection) -+ *out_is_new_connection = TRUE; -+ } -+ } -+ -+ if (!cinfo) { -+ gulong handler_id; -+ -+ CON_READ_UNLOCK (conn_man); -+ -+ handler_id = g_cancellable_connect (cancellable, G_CALLBACK (imapx_conn_manager_connection_wait_cancelled_cb), conn_man, NULL); -+ -+ g_mutex_lock (&conn_man->priv->busy_connections_lock); -+ g_cond_wait (&conn_man->priv->busy_connections_cond, &conn_man->priv->busy_connections_lock); -+ g_mutex_unlock (&conn_man->priv->busy_connections_lock); -+ -+ if (handler_id) -+ g_cancellable_disconnect (cancellable, handler_id); -+ -+ CON_READ_LOCK (conn_man); -+ } -+ } -+ -+ CON_READ_UNLOCK (conn_man); -+ -+ g_mutex_lock (&conn_man->priv->pending_connections_lock); -+ conn_man->priv->pending_connections = g_slist_remove (conn_man->priv->pending_connections, cancellable); -+ g_object_unref (cancellable); -+ g_mutex_unlock (&conn_man->priv->pending_connections_lock); -+ } -+ -+ g_clear_object (&imapx_store); -+ g_clear_object (&session); -+ -+ if (!cinfo && (!local_error || local_error->domain == G_RESOLVER_ERROR)) { -+ if (local_error) { -+ g_set_error ( -+ error, CAMEL_SERVICE_ERROR, -+ CAMEL_SERVICE_ERROR_UNAVAILABLE, -+ _("You must be working online to complete this operation (%s)"), -+ local_error->message); -+ -+ g_clear_error (&local_error); -+ } else { -+ g_set_error_literal ( -+ &local_error, CAMEL_SERVICE_ERROR, -+ CAMEL_SERVICE_ERROR_UNAVAILABLE, -+ _("You must be working online to complete this operation")); -+ } -+ } -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ -+ return cinfo; -+} -+ -+/****************************/ -+ -+CamelIMAPXConnManager * -+camel_imapx_conn_manager_new (CamelStore *store) -+{ -+ g_return_val_if_fail (CAMEL_IS_STORE (store), NULL); -+ -+ return g_object_new ( -+ CAMEL_TYPE_IMAPX_CONN_MANAGER, "store", store, NULL); -+} -+ -+CamelIMAPXStore * -+camel_imapx_conn_manager_ref_store (CamelIMAPXConnManager *conn_man) -+{ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), NULL); -+ -+ return g_weak_ref_get (&conn_man->priv->store); -+} -+ -+gboolean -+camel_imapx_conn_manager_connect_sync (CamelIMAPXConnManager *conn_man, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ ConnectionInfo *cinfo; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ -+ CON_READ_LOCK (conn_man); -+ if (conn_man->priv->connections) { -+ CON_READ_UNLOCK (conn_man); -+ return TRUE; -+ } -+ CON_READ_UNLOCK (conn_man); -+ -+ imapx_conn_manager_clear_mailboxes_hashes (conn_man); -+ -+ cinfo = camel_imapx_conn_manager_ref_connection (conn_man, NULL, NULL, cancellable, error); -+ if (cinfo) { -+ imapx_conn_manager_unmark_busy (conn_man, cinfo); -+ connection_info_unref (cinfo); -+ } -+ -+ return cinfo != NULL; -+} -+ -+gboolean -+camel_imapx_conn_manager_disconnect_sync (CamelIMAPXConnManager *conn_man, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ GList *link, *connections; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ -+ /* Do this before acquiring the write lock, because any pending -+ connection holds the write lock, thus makes this request starve. */ -+ imapx_conn_manager_cancel_pending_connections (conn_man); -+ imapx_conn_manager_abort_jobs (conn_man); -+ -+ CON_WRITE_LOCK (conn_man); -+ -+ c ('*', "Disconnecting all %d connections\n", g_list_length (conn_man->priv->connections)); -+ -+ connections = conn_man->priv->connections; -+ conn_man->priv->connections = NULL; -+ -+ CON_WRITE_UNLOCK (conn_man); -+ -+ for (link = connections; link; link = g_list_next (link)) { -+ ConnectionInfo *cinfo = link->data; -+ GError *local_error = NULL; -+ -+ if (!cinfo) -+ continue; -+ -+ if (!camel_imapx_server_disconnect_sync (cinfo->is, cancellable, &local_error)) { -+ c (camel_imapx_server_get_tagprefix (cinfo->is), " Failed to disconnect from the server: %s\n", -+ local_error ? local_error->message : "Unknown error"); -+ } -+ -+ connection_info_unref (cinfo); -+ g_clear_error (&local_error); -+ } -+ -+ g_list_free (connections); -+ -+ imapx_conn_manager_clear_mailboxes_hashes (conn_man); -+ -+ return TRUE; -+} -+ -+static gboolean -+imapx_conn_manager_should_wait_for (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXJob *new_job, -+ CamelIMAPXJob *queued_job) -+{ -+ guint32 job_kind; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ g_return_val_if_fail (queued_job != NULL, FALSE); -+ -+ if (camel_imapx_job_get_kind (new_job) == CAMEL_IMAPX_JOB_GET_MESSAGE) -+ return FALSE; -+ -+ job_kind = camel_imapx_job_get_kind (queued_job); -+ -+ /* List jobs with high priority. */ -+ return job_kind == CAMEL_IMAPX_JOB_GET_MESSAGE || -+ job_kind == CAMEL_IMAPX_JOB_COPY_MESSAGE || -+ job_kind == CAMEL_IMAPX_JOB_MOVE_MESSAGE || -+ job_kind == CAMEL_IMAPX_JOB_EXPUNGE; -+} -+ -+gboolean -+camel_imapx_conn_manager_run_job_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXJob *job, -+ CamelIMAPXJobMatchesFunc finish_before_job, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ GSList *link; -+ ConnectionInfo *cinfo; -+ gboolean success = FALSE, is_new_connection = FALSE; -+ GError *local_error = NULL; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ g_return_val_if_fail (job != NULL, FALSE); -+ -+ JOB_QUEUE_LOCK (conn_man); -+ -+ if (g_cancellable_set_error_if_cancelled (cancellable, error)) { -+ JOB_QUEUE_UNLOCK (conn_man); -+ return FALSE; -+ } -+ -+ link = conn_man->priv->job_queue; -+ while (link) { -+ CamelIMAPXJob *queued_job = link->data; -+ gboolean matches; -+ -+ g_warn_if_fail (queued_job != NULL); -+ g_warn_if_fail (queued_job != job); -+ -+ if (!queued_job) { -+ link = g_slist_next (link); -+ continue; -+ } -+ -+ matches = camel_imapx_job_matches (job, queued_job); -+ if (matches || (finish_before_job && finish_before_job (job, queued_job)) || -+ imapx_conn_manager_should_wait_for (conn_man, job, queued_job)) { -+ camel_imapx_job_ref (queued_job); -+ -+ JOB_QUEUE_UNLOCK (conn_man); -+ -+ camel_imapx_job_wait_sync (queued_job, cancellable); -+ -+ if (g_cancellable_set_error_if_cancelled (cancellable, error)) { -+ camel_imapx_job_unref (queued_job); -+ return FALSE; -+ } -+ -+ if (matches) { -+ gpointer result = NULL; -+ GDestroyNotify destroy_result = NULL; -+ -+ /* Do not inherit cancelled errors, just try again */ -+ if (!camel_imapx_job_was_cancelled (queued_job) && -+ camel_imapx_job_copy_result (queued_job, &success, &result, &local_error, &destroy_result)) { -+ camel_imapx_job_set_result (job, success, result, local_error, destroy_result); -+ camel_imapx_job_unref (queued_job); -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ -+ return success; -+ } -+ } -+ -+ JOB_QUEUE_LOCK (conn_man); -+ -+ camel_imapx_job_unref (queued_job); -+ -+ /* The queue could change, start from the beginning. */ -+ link = conn_man->priv->job_queue; -+ } else { -+ link = g_slist_next (link); -+ } -+ } -+ -+ conn_man->priv->job_queue = g_slist_prepend (conn_man->priv->job_queue, job); -+ -+ JOB_QUEUE_UNLOCK (conn_man); -+ -+ do { -+ g_clear_error (&local_error); -+ -+ cinfo = camel_imapx_conn_manager_ref_connection (conn_man, camel_imapx_job_get_mailbox (job), &is_new_connection, cancellable, error); -+ if (cinfo) { -+ CamelIMAPXMailbox *job_mailbox; -+ -+ job_mailbox = camel_imapx_job_get_mailbox (job); -+ -+ if (job_mailbox) -+ imapx_conn_manager_inc_mailbox_busy (conn_man, job_mailbox); -+ -+ if (camel_imapx_server_is_in_idle (cinfo->is)) { -+ CamelIMAPXMailbox *idle_mailbox; -+ -+ idle_mailbox = camel_imapx_server_ref_idle_mailbox (cinfo->is); -+ if (idle_mailbox) -+ imapx_conn_manager_dec_mailbox_idle (conn_man, idle_mailbox); -+ g_clear_object (&idle_mailbox); -+ } -+ -+ success = camel_imapx_server_stop_idle_sync (cinfo->is, cancellable, &local_error); -+ -+ if (success && camel_imapx_server_can_use_idle (cinfo->is)) { -+ GList *link, *connection_infos, *disconnected_infos = NULL; -+ -+ CON_READ_LOCK (conn_man); -+ connection_infos = g_list_copy (conn_man->priv->connections); -+ g_list_foreach (connection_infos, (GFunc) connection_info_ref, NULL); -+ CON_READ_UNLOCK (conn_man); -+ -+ /* Stop IDLE on all connections serving the same mailbox, -+ to avoid notifications for changes done by itself */ -+ for (link = connection_infos; link && !g_cancellable_is_cancelled (cancellable); link = g_list_next (link)) { -+ ConnectionInfo *other_cinfo = link->data; -+ CamelIMAPXMailbox *other_mailbox; -+ -+ if (!other_cinfo || other_cinfo == cinfo || connection_info_get_busy (other_cinfo) || -+ !camel_imapx_server_is_in_idle (other_cinfo->is)) -+ continue; -+ -+ other_mailbox = camel_imapx_server_ref_idle_mailbox (other_cinfo->is); -+ if (job_mailbox == other_mailbox) { -+ if (!camel_imapx_server_stop_idle_sync (other_cinfo->is, cancellable, &local_error)) { -+ c (camel_imapx_server_get_tagprefix (other_cinfo->is), -+ "Failed to stop IDLE call (will be removed) on connection %p (server:%p) due to error: %s\n", -+ other_cinfo, other_cinfo->is, local_error ? local_error->message : "Unknown error"); -+ -+ camel_imapx_server_disconnect_sync (other_cinfo->is, cancellable, NULL); -+ -+ disconnected_infos = g_list_prepend (disconnected_infos, connection_info_ref (other_cinfo)); -+ } else { -+ imapx_conn_manager_dec_mailbox_idle (conn_man, other_mailbox); -+ } -+ -+ g_clear_error (&local_error); -+ } -+ -+ g_clear_object (&other_mailbox); -+ } -+ -+ for (link = disconnected_infos; link; link = g_list_next (link)) { -+ ConnectionInfo *other_cinfo = link->data; -+ -+ imapx_conn_manager_remove_info (conn_man, other_cinfo); -+ } -+ -+ g_list_free_full (disconnected_infos, (GDestroyNotify) connection_info_unref); -+ g_list_free_full (connection_infos, (GDestroyNotify) connection_info_unref); -+ } -+ -+ if (success) -+ success = camel_imapx_job_run_sync (job, cinfo->is, cancellable, &local_error); -+ -+ if (job_mailbox) -+ imapx_conn_manager_dec_mailbox_busy (conn_man, job_mailbox); -+ -+ if (success) { -+ CamelIMAPXMailbox *idle_mailbox = NULL; -+ -+ if (!imapx_conn_manager_has_inbox_idle (conn_man)) { -+ CamelIMAPXStore *imapx_store; -+ -+ imapx_store = camel_imapx_conn_manager_ref_store (conn_man); -+ idle_mailbox = imapx_store ? camel_imapx_store_ref_mailbox (imapx_store, "INBOX") : NULL; -+ -+ g_clear_object (&imapx_store); -+ } -+ -+ if (!idle_mailbox) -+ idle_mailbox = camel_imapx_server_ref_selected (cinfo->is); -+ -+ /* Can start IDLE on the connection only if the IDLE folder is not busy -+ and not in IDLE already, to avoid multiple IDLE notifications on the same mailbox */ -+ if (idle_mailbox && camel_imapx_server_can_use_idle (cinfo->is) && -+ !imapx_conn_manager_is_mailbox_busy (conn_man, idle_mailbox) && -+ !imapx_conn_manager_is_mailbox_idle (conn_man, idle_mailbox)) { -+ camel_imapx_server_schedule_idle_sync (cinfo->is, idle_mailbox, cancellable, NULL); -+ -+ if (camel_imapx_server_is_in_idle (cinfo->is)) { -+ g_clear_object (&idle_mailbox); -+ -+ idle_mailbox = camel_imapx_server_ref_idle_mailbox (cinfo->is); -+ if (idle_mailbox) -+ imapx_conn_manager_inc_mailbox_idle (conn_man, idle_mailbox); -+ } -+ } -+ -+ g_clear_object (&idle_mailbox); -+ -+ imapx_conn_manager_unmark_busy (conn_man, cinfo); -+ } else if (!local_error || ((local_error->domain == G_IO_ERROR || local_error->domain == G_TLS_ERROR || local_error->domain == CAMEL_IMAPX_ERROR || -+ g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) && -+ !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED))) { -+ c (camel_imapx_server_get_tagprefix (cinfo->is), "Removed connection %p (server:%p) due to error: %s\n", -+ cinfo, cinfo->is, local_error ? local_error->message : "Unknown error"); -+ -+ camel_imapx_server_disconnect_sync (cinfo->is, cancellable, NULL); -+ imapx_conn_manager_remove_info (conn_man, cinfo); -+ -+ if (!local_error || -+ g_error_matches (local_error, G_TLS_ERROR, G_TLS_ERROR_MISC) || -+ g_error_matches (local_error, G_TLS_ERROR, G_TLS_ERROR_EOF) || -+ g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CLOSED)) { -+ GError *tmp = local_error; -+ -+ local_error = NULL; -+ -+ /* This message won't get into UI. */ -+ g_set_error (&local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT, -+ "Reconnect after failure: %s", tmp ? tmp->message : "Unknown error"); -+ -+ g_clear_error (&tmp); -+ } -+ } else { -+ c (camel_imapx_server_get_tagprefix (cinfo->is), "Unmark connection %p (server:%p) busy after failure, error: %s\n", -+ cinfo, cinfo->is, local_error ? local_error->message : "Unknown error"); -+ -+ imapx_conn_manager_unmark_busy (conn_man, cinfo); -+ } -+ -+ connection_info_unref (cinfo); -+ } -+ -+ /* If there's a reconnect required for a new connection, then there happened -+ something really wrong, thus rather give up. */ -+ } while (!success && !is_new_connection && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)); -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ -+ JOB_QUEUE_LOCK (conn_man); -+ conn_man->priv->job_queue = g_slist_remove (conn_man->priv->job_queue, job); -+ JOB_QUEUE_UNLOCK (conn_man); -+ -+ camel_imapx_job_done (job); -+ -+ return success; -+} -+ -+static gboolean -+imapx_conn_manager_nothing_matches (CamelIMAPXJob *job, -+ CamelIMAPXJob *other_job) -+{ -+ /* For jobs where none can match. */ -+ return FALSE; -+} -+ -+static gboolean -+imapx_conn_manager_matches_sync_changes_or_refresh_info (CamelIMAPXJob *job, -+ CamelIMAPXJob *other_job) -+{ -+ CamelIMAPXJobKind other_job_kind; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (other_job != NULL, FALSE); -+ g_return_val_if_fail (job != other_job, FALSE); -+ -+ if (camel_imapx_job_get_mailbox (job) != camel_imapx_job_get_mailbox (other_job)) -+ return FALSE; -+ -+ other_job_kind = camel_imapx_job_get_kind (other_job); -+ -+ return other_job_kind == CAMEL_IMAPX_JOB_SYNC_CHANGES || -+ other_job_kind == CAMEL_IMAPX_JOB_REFRESH_INFO; -+} -+ -+struct ListJobData { -+ gchar *pattern; -+ CamelStoreGetFolderInfoFlags flags; -+}; -+ -+static void -+list_job_data_free (gpointer ptr) -+{ -+ struct ListJobData *job_data = ptr; -+ -+ if (job_data) { -+ g_free (job_data->pattern); -+ g_free (job_data); -+ } -+} -+ -+static gboolean -+imapx_conn_manager_list_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ struct ListJobData *job_data; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); -+ -+ job_data = camel_imapx_job_get_user_data (job); -+ g_return_val_if_fail (job_data != NULL, FALSE); -+ -+ return camel_imapx_server_list_sync (server, job_data->pattern, job_data->flags, cancellable, error); -+} -+ -+static gboolean -+imapx_conn_manager_list_matches (CamelIMAPXJob *job, -+ CamelIMAPXJob *other_job) -+{ -+ struct ListJobData *job_data, *other_job_data; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (other_job != NULL, FALSE); -+ -+ if (camel_imapx_job_get_kind (job) != CAMEL_IMAPX_JOB_LIST || -+ camel_imapx_job_get_kind (job) != camel_imapx_job_get_kind (other_job)) -+ return FALSE; -+ -+ job_data = camel_imapx_job_get_user_data (job); -+ other_job_data = camel_imapx_job_get_user_data (other_job); -+ -+ if (!job_data || !other_job_data) -+ return FALSE; -+ -+ return job_data->flags == other_job_data->flags && -+ g_strcmp0 (job_data->pattern, other_job_data->pattern) == 0; -+} -+ -+gboolean -+camel_imapx_conn_manager_list_sync (CamelIMAPXConnManager *conn_man, -+ const gchar *pattern, -+ CamelStoreGetFolderInfoFlags flags, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXJob *job; -+ struct ListJobData *job_data; -+ gboolean success = FALSE; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_LIST, NULL, -+ imapx_conn_manager_list_run_sync, -+ imapx_conn_manager_list_matches, -+ NULL); -+ -+ job_data = g_new0 (struct ListJobData, 1); -+ job_data->pattern = g_strdup (pattern); -+ job_data->flags = flags; -+ -+ camel_imapx_job_set_user_data (job, job_data, list_job_data_free); -+ -+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job, NULL, cancellable, error); -+ if (success) -+ camel_imapx_job_copy_result (job, &success, NULL, error, NULL); -+ -+ camel_imapx_job_unref (job); -+ -+ return success; -+} -+ -+static gboolean -+imapx_conn_manager_refresh_info_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXMailbox *mailbox; -+ gboolean success; -+ GError *local_error = NULL; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); -+ -+ mailbox = camel_imapx_job_get_mailbox (job); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ -+ success = camel_imapx_server_refresh_info_sync (server, mailbox, cancellable, &local_error); -+ -+ camel_imapx_job_set_result (job, success, NULL, local_error, NULL); -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ -+ return success; -+} -+ -+gboolean -+camel_imapx_conn_manager_refresh_info_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXJob *job; -+ gboolean success; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ -+ if (!camel_imapx_conn_manager_sync_changes_sync (conn_man, mailbox, cancellable, error)) -+ return FALSE; -+ -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_REFRESH_INFO, mailbox, -+ imapx_conn_manager_refresh_info_run_sync, NULL, NULL); -+ -+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job, -+ imapx_conn_manager_matches_sync_changes_or_refresh_info, -+ cancellable, error); -+ -+ camel_imapx_job_unref (job); -+ -+ return success; -+} -+ -+static gboolean -+imapx_conn_manager_move_to_real_junk_sync (CamelIMAPXConnManager *conn_man, -+ CamelFolder *folder, -+ GCancellable *cancellable, -+ gboolean *out_need_to_expunge, -+ GError **error) -+{ -+ CamelIMAPXFolder *imapx_folder; -+ CamelIMAPXMailbox *mailbox; -+ CamelIMAPXSettings *settings; -+ GPtrArray *uids_to_copy; -+ gchar *real_junk_path = NULL; -+ gboolean success = TRUE; -+ -+ *out_need_to_expunge = FALSE; -+ -+ /* Caller already obtained the mailbox from the folder, -+ * so the folder should still have it readily available. */ -+ imapx_folder = CAMEL_IMAPX_FOLDER (folder); -+ mailbox = camel_imapx_folder_ref_mailbox (imapx_folder); -+ g_return_val_if_fail (mailbox != NULL, FALSE); -+ -+ uids_to_copy = g_ptr_array_new_with_free_func ( -+ (GDestroyNotify) camel_pstring_free); -+ -+ settings = CAMEL_IMAPX_SETTINGS (camel_service_ref_settings (CAMEL_SERVICE (camel_folder_get_parent_store (folder)))); -+ if (camel_imapx_settings_get_use_real_junk_path (settings)) { -+ real_junk_path = camel_imapx_settings_dup_real_junk_path (settings); -+ camel_imapx_folder_claim_move_to_real_junk_uids (imapx_folder, uids_to_copy); -+ } -+ g_object_unref (settings); -+ -+ if (uids_to_copy->len > 0) { -+ CamelIMAPXStore *imapx_store; -+ CamelIMAPXMailbox *destination = NULL; -+ -+ imapx_store = camel_imapx_conn_manager_ref_store (conn_man); -+ -+ if (real_junk_path != NULL) { -+ folder = camel_store_get_folder_sync ( -+ CAMEL_STORE (imapx_store), -+ real_junk_path, 0, -+ cancellable, error); -+ } else { -+ g_set_error ( -+ error, CAMEL_FOLDER_ERROR, -+ CAMEL_FOLDER_ERROR_INVALID_PATH, -+ _("No destination folder specified")); -+ folder = NULL; -+ } -+ -+ if (folder != NULL) { -+ destination = camel_imapx_folder_list_mailbox ( -+ CAMEL_IMAPX_FOLDER (folder), -+ cancellable, error); -+ g_object_unref (folder); -+ } -+ -+ /* Avoid duplicating messages in the Junk folder. */ -+ if (destination == mailbox) { -+ success = TRUE; -+ } else if (destination != NULL) { -+ success = imapx_conn_manager_copy_message_sync ( -+ conn_man, mailbox, destination, -+ uids_to_copy, TRUE, FALSE, TRUE, -+ cancellable, error); -+ *out_need_to_expunge = success; -+ } else { -+ success = FALSE; -+ } -+ -+ if (!success) { -+ g_prefix_error ( -+ error, "%s: ", -+ _("Unable to move junk messages")); - } -+ -+ g_clear_object (&destination); -+ g_clear_object (&imapx_store); -+ } -+ -+ g_ptr_array_unref (uids_to_copy); -+ g_free (real_junk_path); -+ -+ g_clear_object (&mailbox); -+ -+ return success; -+} -+ -+static gboolean -+imapx_conn_manager_move_to_real_trash_sync (CamelIMAPXConnManager *conn_man, -+ CamelFolder *folder, -+ GCancellable *cancellable, -+ gboolean *out_need_to_expunge, -+ GError **error) -+{ -+ CamelIMAPXFolder *imapx_folder; -+ CamelIMAPXMailbox *mailbox, *destination = NULL; -+ CamelIMAPXSettings *settings; -+ CamelIMAPXStore *imapx_store; -+ GPtrArray *uids_to_copy; -+ gchar *real_trash_path = NULL; -+ guint32 folder_deleted_count = 0; -+ gboolean success = TRUE; -+ -+ *out_need_to_expunge = FALSE; -+ -+ /* Caller already obtained the mailbox from the folder, -+ * so the folder should still have it readily available. */ -+ imapx_folder = CAMEL_IMAPX_FOLDER (folder); -+ mailbox = camel_imapx_folder_ref_mailbox (imapx_folder); -+ g_return_val_if_fail (mailbox != NULL, FALSE); -+ -+ uids_to_copy = g_ptr_array_new_with_free_func ( -+ (GDestroyNotify) camel_pstring_free); -+ -+ settings = CAMEL_IMAPX_SETTINGS (camel_service_ref_settings (CAMEL_SERVICE (camel_folder_get_parent_store (folder)))); -+ if (camel_imapx_settings_get_use_real_trash_path (settings)) { -+ real_trash_path = camel_imapx_settings_dup_real_trash_path (settings); -+ camel_imapx_folder_claim_move_to_real_trash_uids (CAMEL_IMAPX_FOLDER (folder), uids_to_copy); -+ } -+ g_object_unref (settings); -+ -+ imapx_store = camel_imapx_conn_manager_ref_store (conn_man); -+ -+ if (real_trash_path != NULL) { -+ folder = camel_store_get_folder_sync ( -+ CAMEL_STORE (imapx_store), -+ real_trash_path, 0, -+ cancellable, error); -+ } else { -+ if (uids_to_copy->len > 0) { -+ g_set_error ( -+ error, CAMEL_FOLDER_ERROR, -+ CAMEL_FOLDER_ERROR_INVALID_PATH, -+ _("No destination folder specified")); -+ } -+ -+ folder = NULL; -+ } -+ -+ if (folder != NULL) { -+ destination = camel_imapx_folder_list_mailbox ( -+ CAMEL_IMAPX_FOLDER (folder), -+ cancellable, error); -+ folder_deleted_count = camel_folder_summary_get_deleted_count (folder->summary); -+ g_object_unref (folder); -+ } -+ -+ /* Avoid duplicating messages in the Trash folder. */ -+ if (destination == mailbox) { -+ success = TRUE; -+ /* Deleted messages in the real Trash folder will be permanently deleted immediately. */ -+ *out_need_to_expunge = folder_deleted_count > 0 || uids_to_copy->len > 0; -+ } else if (destination != NULL) { -+ if (uids_to_copy->len > 0) { -+ success = imapx_conn_manager_copy_message_sync ( -+ conn_man, mailbox, destination, -+ uids_to_copy, TRUE, TRUE, TRUE, -+ cancellable, error); -+ *out_need_to_expunge = success; -+ } -+ } else if (uids_to_copy->len > 0) { -+ success = FALSE; -+ } -+ -+ if (!success) { -+ g_prefix_error ( -+ error, "%s: ", -+ _("Unable to move deleted messages")); -+ } -+ -+ g_ptr_array_unref (uids_to_copy); -+ g_free (real_trash_path); -+ -+ g_clear_object (&imapx_store); -+ g_clear_object (&destination); -+ g_clear_object (&mailbox); -+ -+ return success; -+} -+ -+static gboolean -+imapx_conn_manager_expunge_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ gboolean skip_sync_changes, -+ GCancellable *cancellable, -+ GError **error); -+ -+static gboolean -+imapx_conn_manager_sync_changes_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXMailbox *mailbox; -+ GError *local_error = NULL; -+ gboolean can_influence_flags, success; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); -+ -+ mailbox = camel_imapx_job_get_mailbox (job); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ -+ can_influence_flags = GPOINTER_TO_INT (camel_imapx_job_get_user_data (job)) == 1; -+ -+ success = camel_imapx_server_sync_changes_sync (server, mailbox, can_influence_flags, cancellable, &local_error); -+ -+ camel_imapx_job_set_result (job, success, NULL, local_error, NULL); -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ -+ return success; -+} -+ -+static gboolean -+imapx_conn_manager_sync_changes_matches (CamelIMAPXJob *job, -+ CamelIMAPXJob *other_job) -+{ -+ gboolean job_can_influence_flags, other_job_can_influence_flags; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (other_job != NULL, FALSE); -+ -+ if (camel_imapx_job_get_kind (job) != CAMEL_IMAPX_JOB_SYNC_CHANGES || -+ camel_imapx_job_get_kind (job) != camel_imapx_job_get_kind (other_job)) -+ return FALSE; -+ -+ job_can_influence_flags = GPOINTER_TO_INT (camel_imapx_job_get_user_data (job)) == 1; -+ other_job_can_influence_flags = GPOINTER_TO_INT (camel_imapx_job_get_user_data (other_job)) == 1; -+ -+ return job_can_influence_flags == other_job_can_influence_flags; -+} -+ -+gboolean -+camel_imapx_conn_manager_sync_changes_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXJob *job; -+ CamelFolder *folder = NULL; -+ gboolean need_to_expunge = FALSE, expunge = FALSE; -+ gboolean success; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_SYNC_CHANGES, mailbox, -+ imapx_conn_manager_sync_changes_run_sync, -+ imapx_conn_manager_sync_changes_matches, NULL); -+ -+ /* Skip store of the \Deleted flag */ -+ camel_imapx_job_set_user_data (job, GINT_TO_POINTER (1), NULL); -+ -+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job, -+ imapx_conn_manager_matches_sync_changes_or_refresh_info, -+ cancellable, error); -+ -+ camel_imapx_job_unref (job); -+ -+ if (success) { -+ folder = imapx_conn_manager_ref_folder_sync (conn_man, mailbox, cancellable, error); -+ if (!folder) -+ success = FALSE; -+ } -+ -+ if (success) { -+ success = imapx_conn_manager_move_to_real_junk_sync ( -+ conn_man, folder, cancellable, -+ &need_to_expunge, error); -+ expunge |= need_to_expunge; -+ } -+ -+ if (success) { -+ success = imapx_conn_manager_move_to_real_trash_sync ( -+ conn_man, folder, cancellable, -+ &need_to_expunge, error); -+ expunge |= need_to_expunge; -+ } -+ -+ if (success && expunge) { -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_SYNC_CHANGES, mailbox, -+ imapx_conn_manager_sync_changes_run_sync, -+ imapx_conn_manager_sync_changes_matches, NULL); -+ -+ /* Store also the \Deleted flag */ -+ camel_imapx_job_set_user_data (job, GINT_TO_POINTER (0), NULL); -+ -+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job, -+ imapx_conn_manager_matches_sync_changes_or_refresh_info, -+ cancellable, error); -+ -+ camel_imapx_job_unref (job); -+ -+ success = imapx_conn_manager_expunge_sync (conn_man, mailbox, TRUE, cancellable, error); -+ } -+ -+ g_clear_object (&folder); -+ -+ return success; -+} -+ -+static gboolean -+imapx_conn_manager_expunge_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXMailbox *mailbox; -+ GError *local_error = NULL; -+ gboolean success; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); -+ -+ mailbox = camel_imapx_job_get_mailbox (job); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ -+ success = camel_imapx_server_expunge_sync (server, mailbox, cancellable, &local_error); -+ -+ camel_imapx_job_set_result (job, success, NULL, local_error, NULL); -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ -+ return success; -+} -+ -+static gboolean -+imapx_conn_manager_expunge_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ gboolean skip_sync_changes, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXJob *job; -+ gboolean success; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ -+ if (!skip_sync_changes && !camel_imapx_conn_manager_sync_changes_sync (conn_man, mailbox, cancellable, error)) -+ return FALSE; -+ -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_EXPUNGE, mailbox, -+ imapx_conn_manager_expunge_run_sync, NULL, NULL); -+ -+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job, NULL, cancellable, error); -+ -+ camel_imapx_job_unref (job); -+ -+ return success; -+} -+ -+gboolean -+camel_imapx_conn_manager_expunge_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ return imapx_conn_manager_expunge_sync (conn_man, mailbox, FALSE, cancellable, error); -+} -+ -+struct GetMessageJobData { -+ CamelFolderSummary *summary; -+ CamelDataCache *message_cache; -+ gchar *message_uid; -+}; -+ -+static void -+get_message_job_data_free (gpointer ptr) -+{ -+ struct GetMessageJobData *job_data = ptr; -+ -+ if (job_data) { -+ g_clear_object (&job_data->summary); -+ g_clear_object (&job_data->message_cache); -+ g_free (job_data->message_uid); -+ g_free (job_data); -+ } -+} -+ -+static gboolean -+imapx_conn_manager_get_message_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ struct GetMessageJobData *job_data; -+ CamelIMAPXMailbox *mailbox; -+ CamelStream *result; -+ GError *local_error = NULL; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); -+ -+ mailbox = camel_imapx_job_get_mailbox (job); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ -+ job_data = camel_imapx_job_get_user_data (job); -+ g_return_val_if_fail (job_data != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_FOLDER_SUMMARY (job_data->summary), FALSE); -+ g_return_val_if_fail (CAMEL_IS_DATA_CACHE (job_data->message_cache), FALSE); -+ g_return_val_if_fail (job_data->message_uid != NULL, FALSE); -+ -+ result = camel_imapx_server_get_message_sync ( -+ server, mailbox, job_data->summary, job_data->message_cache, job_data->message_uid, -+ cancellable, &local_error); -+ -+ camel_imapx_job_set_result (job, result != NULL, result, local_error, result ? g_object_unref : NULL); -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ -+ return result != NULL; -+} -+ -+static gboolean -+imapx_conn_manager_get_message_matches (CamelIMAPXJob *job, -+ CamelIMAPXJob *other_job) -+{ -+ struct GetMessageJobData *job_data, *other_job_data; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (other_job != NULL, FALSE); -+ -+ if (camel_imapx_job_get_kind (job) != CAMEL_IMAPX_JOB_GET_MESSAGE || -+ camel_imapx_job_get_kind (job) != camel_imapx_job_get_kind (other_job)) -+ return FALSE; -+ -+ job_data = camel_imapx_job_get_user_data (job); -+ other_job_data = camel_imapx_job_get_user_data (other_job); -+ -+ if (!job_data || !other_job_data) -+ return FALSE; -+ -+ return g_strcmp0 (job_data->message_uid, other_job_data->message_uid) == 0; -+} -+ -+static void -+imapx_conn_manager_get_message_copy_result (CamelIMAPXJob *job, -+ gconstpointer set_result, -+ gpointer *out_result) -+{ -+ if (!set_result || !*out_result) -+ return; -+ -+ *out_result = g_object_ref ((gpointer) set_result); -+} -+ -+CamelStream * -+camel_imapx_conn_manager_get_message_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ CamelFolderSummary *summary, -+ CamelDataCache *message_cache, -+ const gchar *message_uid, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXJob *job; -+ struct GetMessageJobData *job_data; -+ CamelStream *result; -+ gpointer result_data = NULL; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), NULL); -+ -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_GET_MESSAGE, mailbox, -+ imapx_conn_manager_get_message_run_sync, -+ imapx_conn_manager_get_message_matches, -+ imapx_conn_manager_get_message_copy_result); -+ -+ job_data = g_new0 (struct GetMessageJobData, 1); -+ job_data->summary = g_object_ref (summary); -+ job_data->message_cache = g_object_ref (message_cache); -+ job_data->message_uid = g_strdup (message_uid); -+ -+ camel_imapx_job_set_user_data (job, job_data, get_message_job_data_free); -+ -+ if (camel_imapx_conn_manager_run_job_sync (conn_man, job, NULL, cancellable, error) && -+ camel_imapx_job_take_result_data (job, &result_data)) { -+ result = result_data; -+ } else { -+ result = NULL; -+ } -+ -+ camel_imapx_job_unref (job); -+ -+ return result; -+} -+ -+struct CopyMessageJobData { -+ CamelIMAPXMailbox *destination; -+ GPtrArray *uids; -+ gboolean delete_originals; -+ gboolean remove_deleted_flags; -+}; -+ -+static void -+copy_message_job_data_free (gpointer ptr) -+{ -+ struct CopyMessageJobData *job_data = ptr; -+ -+ if (job_data) { -+ g_clear_object (&job_data->destination); -+ g_ptr_array_free (job_data->uids, TRUE); -+ g_free (job_data); -+ } -+} -+ -+static gboolean -+imapx_conn_manager_copy_message_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ struct CopyMessageJobData *job_data; -+ CamelIMAPXMailbox *mailbox; -+ GError *local_error = NULL; -+ gboolean success; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); -+ -+ mailbox = camel_imapx_job_get_mailbox (job); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ -+ job_data = camel_imapx_job_get_user_data (job); -+ g_return_val_if_fail (job_data != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (job_data->destination), FALSE); -+ g_return_val_if_fail (job_data->uids != NULL, FALSE); -+ -+ success = camel_imapx_server_copy_message_sync ( -+ server, mailbox, job_data->destination, job_data->uids, job_data->delete_originals, -+ job_data->remove_deleted_flags, cancellable, &local_error); -+ -+ camel_imapx_job_set_result (job, success, NULL, local_error, NULL); -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ -+ return success; -+} -+ -+static gboolean -+imapx_conn_manager_copy_message_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ CamelIMAPXMailbox *destination, -+ GPtrArray *uids, -+ gboolean delete_originals, -+ gboolean remove_deleted_flags, -+ gboolean skip_sync_changes, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXJob *job; -+ struct CopyMessageJobData *job_data; -+ gboolean success; -+ gint ii; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ -+ if (!skip_sync_changes && !camel_imapx_conn_manager_sync_changes_sync (conn_man, mailbox, cancellable, error)) -+ return FALSE; -+ -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_COPY_MESSAGE, mailbox, -+ imapx_conn_manager_copy_message_run_sync, -+ imapx_conn_manager_nothing_matches, -+ NULL); -+ -+ job_data = g_new0 (struct CopyMessageJobData, 1); -+ job_data->destination = g_object_ref (destination); -+ job_data->uids = g_ptr_array_new_full (uids->len, (GDestroyNotify) camel_pstring_free); -+ job_data->delete_originals = delete_originals; -+ job_data->remove_deleted_flags = remove_deleted_flags; -+ -+ for (ii = 0; ii < uids->len; ii++) { -+ g_ptr_array_add (job_data->uids, (gpointer) camel_pstring_strdup (uids->pdata[ii])); - } - --exit: -- if (cinfo != NULL && folder_name != NULL) -- connection_info_insert_folder_name (cinfo, folder_name); -+ camel_imapx_job_set_user_data (job, job_data, copy_message_job_data_free); -+ -+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job, NULL, cancellable, error); -+ -+ camel_imapx_job_unref (job); - -- if (camel_debug_flag (conman)) { -- printf ("%s: for-expensive:%d will return:%p cmd-count:%d has-expensive:%d found:%d; connections opened:%d max:%d\n", G_STRFUNC, for_expensive_job, cinfo, cinfo ? camel_imapx_server_get_command_count (cinfo->is) : -2, cinfo ? camel_imapx_server_has_expensive_command (cinfo->is) : -2, expensive_connections, g_list_length (list), concurrent_connections); -- for (link = list; link != NULL; link = g_list_next (link)) { -- ConnectionInfo *candidate = link->data; -+ if (success) { -+ CamelFolder *dest; - -- printf (" cmds:%d has-expensive:%d avail:%d cinfo:%p server:%p\n", camel_imapx_server_get_command_count (candidate->is), camel_imapx_server_has_expensive_command (candidate->is), connection_info_is_available (candidate), candidate, candidate->is); -+ dest = imapx_conn_manager_ref_folder_sync (conn_man, destination, cancellable, NULL); -+ -+ /* Update destination folder only if it's not frozen, -+ * to avoid updating for each "move" action on a single -+ * message while filtering. */ -+ if (dest && !camel_folder_is_frozen (dest)) { -+ /* Ignore errors here */ -+ camel_imapx_conn_manager_refresh_info_sync (conn_man, destination, cancellable, NULL); - } -- } - -- if (cinfo != NULL) { -- is = g_object_ref (cinfo->is); -- connection_info_unref (cinfo); -+ g_clear_object (&dest); - } - -- g_object_unref (store); -+ return success; -+} - -- return is; -+gboolean -+camel_imapx_conn_manager_copy_message_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ CamelIMAPXMailbox *destination, -+ GPtrArray *uids, -+ gboolean delete_originals, -+ gboolean remove_deleted_flags, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ return imapx_conn_manager_copy_message_sync (conn_man, mailbox, destination, uids, -+ delete_originals, remove_deleted_flags, FALSE, cancellable, error); - } - --static gchar --imapx_conn_manager_get_next_free_tagprefix_unlocked (CamelIMAPXConnManager *con_man) -+struct AppendMessageJobData { -+ CamelFolderSummary *summary; -+ CamelDataCache *message_cache; -+ CamelMimeMessage *message; -+ const CamelMessageInfo *mi; -+}; -+ -+static void -+append_message_job_data_free (gpointer ptr) - { -- gchar adept; -- GList *iter; -+ struct AppendMessageJobData *job_data = ptr; - -- /* the 'Z' is dedicated to auth types query */ -- adept = 'A'; -- while (adept < 'Z') { -- for (iter = con_man->priv->connections; iter; iter = g_list_next (iter)) { -- ConnectionInfo *cinfo = iter->data; -+ if (job_data) { -+ g_clear_object (&job_data->summary); -+ g_clear_object (&job_data->message_cache); -+ g_clear_object (&job_data->message); -+ g_free (job_data); -+ } -+} - -- if (!cinfo || !cinfo->is) -- continue; -+static gboolean -+imapx_conn_manager_append_message_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ struct AppendMessageJobData *job_data; -+ CamelIMAPXMailbox *mailbox; -+ gchar *appended_uid = NULL; -+ GError *local_error = NULL; -+ gboolean success; - -- if (cinfo->is->tagprefix == adept) -- break; -- } -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); - -- /* Read all current active connections and none has the same tag prefix */ -- if (!iter) -- break; -+ mailbox = camel_imapx_job_get_mailbox (job); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); - -- adept++; -+ job_data = camel_imapx_job_get_user_data (job); -+ g_return_val_if_fail (job_data != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_FOLDER_SUMMARY (job_data->summary), FALSE); -+ g_return_val_if_fail (CAMEL_IS_DATA_CACHE (job_data->message_cache), FALSE); -+ g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (job_data->message), FALSE); -+ -+ success = camel_imapx_server_append_message_sync (server, mailbox, job_data->summary, job_data->message_cache, -+ job_data->message, job_data->mi, &appended_uid, cancellable, &local_error); -+ -+ camel_imapx_job_set_result (job, success, appended_uid, local_error, appended_uid ? g_free : NULL); -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ -+ return success; -+} -+ -+gboolean -+camel_imapx_conn_manager_append_message_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ CamelFolderSummary *summary, -+ CamelDataCache *message_cache, -+ CamelMimeMessage *message, -+ const CamelMessageInfo *mi, -+ gchar **append_uid, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXJob *job; -+ struct AppendMessageJobData *job_data; -+ gboolean success; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_APPEND_MESSAGE, mailbox, -+ imapx_conn_manager_append_message_run_sync, -+ imapx_conn_manager_nothing_matches, -+ NULL); -+ -+ job_data = g_new0 (struct AppendMessageJobData, 1); -+ job_data->summary = g_object_ref (summary); -+ job_data->message_cache = g_object_ref (message_cache); -+ job_data->message = g_object_ref (message); -+ job_data->mi = mi; -+ -+ camel_imapx_job_set_user_data (job, job_data, append_message_job_data_free); -+ -+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job, NULL, cancellable, error); -+ if (success) { -+ gpointer result_data = NULL; -+ -+ success = camel_imapx_job_take_result_data (job, &result_data); -+ if (success && append_uid) -+ *append_uid = result_data; -+ else -+ g_free (result_data); - } - -- g_return_val_if_fail (adept >= 'A' && adept < 'Z', 'Z'); -+ camel_imapx_job_unref (job); - -- return adept; -+ return success; - } - --static CamelIMAPXServer * --imapx_create_new_connection_unlocked (CamelIMAPXConnManager *con_man, -- const gchar *folder_name, -- GCancellable *cancellable, -- GError **error) -+static gboolean -+imapx_conn_manager_sync_message_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ struct GetMessageJobData *job_data; -+ CamelIMAPXMailbox *mailbox; -+ GError *local_error = NULL; -+ gboolean success; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); -+ -+ mailbox = camel_imapx_job_get_mailbox (job); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ -+ job_data = camel_imapx_job_get_user_data (job); -+ g_return_val_if_fail (job_data != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_FOLDER_SUMMARY (job_data->summary), FALSE); -+ g_return_val_if_fail (CAMEL_IS_DATA_CACHE (job_data->message_cache), FALSE); -+ g_return_val_if_fail (job_data->message_uid != NULL, FALSE); -+ -+ success = camel_imapx_server_sync_message_sync ( -+ server, mailbox, job_data->summary, job_data->message_cache, job_data->message_uid, -+ cancellable, &local_error); -+ -+ camel_imapx_job_set_result (job, success, NULL, local_error, NULL); -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ -+ return success; -+} -+ -+gboolean -+camel_imapx_conn_manager_sync_message_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ CamelFolderSummary *summary, -+ CamelDataCache *message_cache, -+ const gchar *message_uid, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelStore *store; -- CamelIMAPXServer *is = NULL; -- CamelIMAPXStore *imapx_store; -- ConnectionInfo *cinfo = NULL; -+ CamelIMAPXJob *job; -+ struct GetMessageJobData *job_data; - gboolean success; - -- /* Caller must be holding CON_WRITE_LOCK. */ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); - -- /* Check if we got cancelled while we were waiting. */ -- if (g_cancellable_set_error_if_cancelled (cancellable, error)) -- return NULL; -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_SYNC_MESSAGE, mailbox, -+ imapx_conn_manager_sync_message_run_sync, -+ imapx_conn_manager_get_message_matches, -+ NULL); - -- store = camel_imapx_conn_manager_ref_store (con_man); -- g_return_val_if_fail (store != NULL, NULL); -+ job_data = g_new0 (struct GetMessageJobData, 1); -+ job_data->summary = g_object_ref (summary); -+ job_data->message_cache = g_object_ref (message_cache); -+ job_data->message_uid = g_strdup (message_uid); - -- imapx_store = CAMEL_IMAPX_STORE (store); -+ camel_imapx_job_set_user_data (job, job_data, get_message_job_data_free); - -- is = camel_imapx_server_new (imapx_store); -- is->tagprefix = imapx_conn_manager_get_next_free_tagprefix_unlocked (con_man); -+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job, NULL, cancellable, error); - -- /* XXX As part of the connect operation the CamelIMAPXServer will -- * have to call camel_session_authenticate_sync(), but it has -- * no way to pass itself through in that call so the service -- * knows which CamelIMAPXServer is trying to authenticate. -- * -- * IMAPX is the only provider that does multiple connections -- * like this, so I didn't want to pollute the CamelSession and -- * CamelService authentication APIs with an extra argument. -- * Instead we do this little hack so the service knows which -- * CamelIMAPXServer to act on in its authenticate_sync() method. -- * -- * Because we're holding the CAMEL_SERVICE_REC_CONNECT_LOCK -- * we should not have multiple IMAPX connections trying to -- * authenticate at once, so this should be thread-safe. -- */ -- camel_imapx_store_set_connecting_server (imapx_store, is, con_man->priv->connections != NULL); -- success = camel_imapx_server_connect (is, cancellable, error); -- camel_imapx_store_set_connecting_server (imapx_store, NULL, FALSE); -+ camel_imapx_job_unref (job); - -- if (!success) { -- g_clear_object (&is); -- goto exit; -- } -+ return success; -+} - -- g_signal_connect ( -- is, "shutdown", -- G_CALLBACK (imapx_conn_shutdown), con_man); -- -- g_signal_connect ( -- is, "mailbox-select", -- G_CALLBACK (imapx_conn_update_select), con_man); -- g_signal_connect ( -- is, "mailbox-closed", -- G_CALLBACK (imapx_conn_mailbox_closed), con_man); -+static gboolean -+imapx_conn_manager_create_mailbox_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ const gchar *mailbox_name; -+ GError *local_error = NULL; -+ gboolean success; - -- cinfo = connection_info_new (is); -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); - -- if (folder_name != NULL) -- connection_info_insert_folder_name (cinfo, folder_name); -+ mailbox_name = camel_imapx_job_get_user_data (job); -+ g_return_val_if_fail (mailbox_name != NULL, FALSE); - -- /* Takes ownership of the ConnectionInfo. */ -- con_man->priv->connections = g_list_prepend ( -- con_man->priv->connections, cinfo); -+ success = camel_imapx_server_create_mailbox_sync (server, mailbox_name, cancellable, &local_error); - -- c (is->tagprefix, "Created new connection %p (server:%p) for %s; total connections %d\n", cinfo, cinfo->is, folder_name, g_list_length (con_man->priv->connections)); -+ camel_imapx_job_set_result (job, success, NULL, local_error, NULL); - --exit: -- g_object_unref (store); -+ if (local_error) -+ g_propagate_error (error, local_error); - -- return is; -+ return success; - } - --/****************************/ -+gboolean -+camel_imapx_conn_manager_create_mailbox_sync (CamelIMAPXConnManager *conn_man, -+ const gchar *mailbox_name, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXJob *job; -+ gboolean success; - --CamelIMAPXConnManager * --camel_imapx_conn_manager_new (CamelStore *store) -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_CREATE_MAILBOX, NULL, -+ imapx_conn_manager_create_mailbox_run_sync, -+ imapx_conn_manager_nothing_matches, -+ NULL); -+ -+ camel_imapx_job_set_user_data (job, g_strdup (mailbox_name), g_free); -+ -+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job, NULL, cancellable, error); -+ -+ camel_imapx_job_unref (job); -+ -+ return success; -+} -+ -+static gboolean -+imapx_conn_manager_delete_mailbox_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) - { -- g_return_val_if_fail (CAMEL_IS_STORE (store), NULL); -+ CamelIMAPXMailbox *mailbox; -+ GError *local_error = NULL; -+ gboolean success; - -- return g_object_new ( -- CAMEL_TYPE_IMAPX_CONN_MANAGER, "store", store, NULL); -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); -+ -+ mailbox = camel_imapx_job_get_mailbox (job); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ -+ success = camel_imapx_server_delete_mailbox_sync (server, mailbox, cancellable, &local_error); -+ -+ camel_imapx_job_set_result (job, success, NULL, local_error, NULL); -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ -+ return success; -+} -+ -+gboolean -+camel_imapx_conn_manager_delete_mailbox_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXJob *job; -+ gboolean success; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_DELETE_MAILBOX, mailbox, -+ imapx_conn_manager_delete_mailbox_run_sync, -+ imapx_conn_manager_nothing_matches, -+ NULL); -+ -+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job, NULL, cancellable, error); -+ -+ camel_imapx_job_unref (job); -+ -+ return success; -+} -+ -+static gboolean -+imapx_conn_manager_rename_mailbox_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXMailbox *mailbox; -+ const gchar *new_mailbox_name; -+ GError *local_error = NULL; -+ gboolean success; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); -+ -+ mailbox = camel_imapx_job_get_mailbox (job); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ -+ new_mailbox_name = camel_imapx_job_get_user_data (job); -+ g_return_val_if_fail (new_mailbox_name != NULL, FALSE); -+ -+ success = camel_imapx_server_rename_mailbox_sync (server, mailbox, new_mailbox_name, cancellable, &local_error); -+ -+ camel_imapx_job_set_result (job, success, NULL, local_error, NULL); -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ -+ return success; - } - --CamelStore * --camel_imapx_conn_manager_ref_store (CamelIMAPXConnManager *con_man) -+gboolean -+camel_imapx_conn_manager_rename_mailbox_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ const gchar *new_mailbox_name, -+ GCancellable *cancellable, -+ GError **error) - { -- g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (con_man), NULL); -+ CamelIMAPXJob *job; -+ gboolean success; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_RENAME_MAILBOX, mailbox, -+ imapx_conn_manager_rename_mailbox_run_sync, -+ imapx_conn_manager_nothing_matches, -+ NULL); -+ -+ camel_imapx_job_set_user_data (job, g_strdup (new_mailbox_name), g_free); - -- return g_weak_ref_get (&con_man->priv->store); -+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job, NULL, cancellable, error); -+ -+ camel_imapx_job_unref (job); -+ -+ return success; - } - --CamelIMAPXServer * --camel_imapx_conn_manager_get_connection (CamelIMAPXConnManager *con_man, -- const gchar *folder_name, -- gboolean for_expensive_job, -- GCancellable *cancellable, -- GError **error) -+static gboolean -+imapx_conn_manager_subscribe_mailbox_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelIMAPXServer *is = NULL; -+ CamelIMAPXMailbox *mailbox; -+ GError *local_error = NULL; -+ gboolean success; - -- g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (con_man), NULL); -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); - -- g_mutex_lock (&con_man->priv->pending_connections_lock); -- if (cancellable) { -- g_object_ref (cancellable); -- } else { -- cancellable = g_cancellable_new (); -- } -- con_man->priv->pending_connections = g_slist_prepend (con_man->priv->pending_connections, cancellable); -- g_mutex_unlock (&con_man->priv->pending_connections_lock); -+ mailbox = camel_imapx_job_get_mailbox (job); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); - -- /* Hold the writer lock while we requisition a CamelIMAPXServer -- * to prevent other threads from adding or removing connections. */ -- CON_WRITE_LOCK (con_man); -- -- /* Check if we've got cancelled while waiting for the lock. */ -- if (!g_cancellable_set_error_if_cancelled (cancellable, error)) { -- is = imapx_find_connection_unlocked (con_man, folder_name, for_expensive_job); -- if (is == NULL) { -- GError *local_error = NULL; -- -- is = imapx_create_new_connection_unlocked (con_man, folder_name, cancellable, &local_error); -- -- if (!is) { -- gboolean limit_connections = -- g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, -- CAMEL_IMAPX_SERVER_ERROR_CONCURRENT_CONNECT_FAILED) && -- con_man->priv->connections; -- -- c ('*', "Failed to open a new connection, while having %d opened, with error: %s; will limit connections: %s\n", -- g_list_length (con_man->priv->connections), -- local_error ? local_error->message : "Unknown error", -- limit_connections ? "yes" : "no"); -- -- if (limit_connections) { -- /* limit to one-less than current connection count - be nice to the server */ -- con_man->priv->limit_max_connections = g_list_length (con_man->priv->connections) - 1; -- if (!con_man->priv->limit_max_connections) -- con_man->priv->limit_max_connections = 1; -- -- g_clear_error (&local_error); -- is = imapx_find_connection_unlocked (con_man, folder_name, for_expensive_job); -- } else if (local_error) { -- g_propagate_error (error, local_error); -- } -- } -- } -- } -+ success = camel_imapx_server_subscribe_mailbox_sync (server, mailbox, cancellable, &local_error); - -- CON_WRITE_UNLOCK (con_man); -+ camel_imapx_job_set_result (job, success, NULL, local_error, NULL); - -- g_mutex_lock (&con_man->priv->pending_connections_lock); -- con_man->priv->pending_connections = g_slist_remove (con_man->priv->pending_connections, cancellable); -- g_object_unref (cancellable); -- g_mutex_unlock (&con_man->priv->pending_connections_lock); -+ if (local_error) -+ g_propagate_error (error, local_error); - -- return is; -+ return success; - } - --GList * --camel_imapx_conn_manager_get_connections (CamelIMAPXConnManager *con_man) -+gboolean -+camel_imapx_conn_manager_subscribe_mailbox_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) - { -- GList *list, *link; -+ CamelIMAPXJob *job; -+ gboolean success; - -- g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (con_man), NULL); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); - -- list = imapx_conn_manager_list_info (con_man); -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_SUBSCRIBE_MAILBOX, mailbox, -+ imapx_conn_manager_subscribe_mailbox_run_sync, NULL, NULL); - -- /* Swap ConnectionInfo for CamelIMAPXServer in each link. */ -- for (link = list; link != NULL; link = g_list_next (link)) { -- ConnectionInfo *cinfo = link->data; -- link->data = g_object_ref (cinfo->is); -- connection_info_unref (cinfo); -+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job, NULL, cancellable, error); -+ -+ camel_imapx_job_unref (job); -+ -+ return success; -+} -+ -+static gboolean -+imapx_conn_manager_unsubscribe_mailbox_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXMailbox *mailbox; -+ GError *local_error = NULL; -+ gboolean success; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); -+ -+ mailbox = camel_imapx_job_get_mailbox (job); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ -+ success = camel_imapx_server_unsubscribe_mailbox_sync (server, mailbox, cancellable, &local_error); -+ -+ camel_imapx_job_set_result (job, success, NULL, local_error, NULL); -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ -+ return success; -+} -+ -+gboolean -+camel_imapx_conn_manager_unsubscribe_mailbox_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXJob *job; -+ gboolean success; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_UNSUBSCRIBE_MAILBOX, mailbox, -+ imapx_conn_manager_unsubscribe_mailbox_run_sync, NULL, NULL); -+ -+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job, NULL, cancellable, error); -+ -+ camel_imapx_job_unref (job); -+ -+ return success; -+} -+ -+static gboolean -+imapx_conn_manager_update_quota_info_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXMailbox *mailbox; -+ GError *local_error = NULL; -+ gboolean success; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); -+ -+ mailbox = camel_imapx_job_get_mailbox (job); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ -+ success = camel_imapx_server_update_quota_info_sync (server, mailbox, cancellable, &local_error); -+ -+ camel_imapx_job_set_result (job, success, NULL, local_error, NULL); -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ -+ return success; -+} -+ -+gboolean -+camel_imapx_conn_manager_update_quota_info_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXJob *job; -+ gboolean success; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), FALSE); -+ -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_UPDATE_QUOTA_INFO, mailbox, -+ imapx_conn_manager_update_quota_info_run_sync, NULL, NULL); -+ -+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job, NULL, cancellable, error); -+ -+ camel_imapx_job_unref (job); -+ -+ return success; -+} -+ -+static gchar ** -+imapx_copy_strv (const gchar * const *words) -+{ -+ gchar **copy; -+ gint ii; -+ -+ if (!words || !*words) -+ return NULL; -+ -+ copy = g_new0 (gchar *, g_strv_length ((gchar **) words) + 1); -+ -+ for (ii = 0; words[ii]; ii++) { -+ copy[ii] = g_strdup (words[ii]); - } - -- return list; -+ copy[ii] = NULL; -+ -+ return copy; - } - --/* Used for handling operations that fails to execute and that needs to removed from folder list */ --void --camel_imapx_conn_manager_update_con_info (CamelIMAPXConnManager *con_man, -- CamelIMAPXServer *is, -- const gchar *folder_name) -+static gboolean -+imapx_equal_strv (const gchar * const *words1, -+ const gchar * const *words2) - { -- ConnectionInfo *cinfo; -+ gint ii; - -- g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (con_man)); -+ if (words1 == words2) -+ return TRUE; - -- /* Returns a new ConnectionInfo reference. */ -- cinfo = imapx_conn_manager_lookup_info (con_man, is); -+ if (!words1 || !words2) -+ return FALSE; - -- if (cinfo == NULL) -- return; -+ for (ii = 0; words1[ii] && words2[ii]; ii++) { -+ if (g_strcmp0 (words1[ii], words2[ii]) != 0) -+ return FALSE; -+ } -+ -+ return !words1[ii] && !words2[ii]; -+} -+ -+struct UidSearchJobData { -+ gchar *criteria_prefix; -+ gchar *search_key; -+ gchar **words; -+}; -+ -+static void -+uid_search_job_data_free (gpointer ptr) -+{ -+ struct UidSearchJobData *job_data = ptr; - -- if (camel_imapx_server_folder_name_in_jobs (is, folder_name)) { -- connection_info_remove_folder_name (cinfo, folder_name); -- c (is->tagprefix, "Removed folder %s from connection folder list - op done \n", folder_name); -+ if (ptr) { -+ g_free (job_data->criteria_prefix); -+ g_free (job_data->search_key); -+ g_strfreev (job_data->words); -+ g_free (job_data); - } -+} -+ -+static gboolean -+imapx_conn_manager_uid_search_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ struct UidSearchJobData *job_data; -+ CamelIMAPXMailbox *mailbox; -+ GPtrArray *uids = NULL; -+ GError *local_error = NULL; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); -+ -+ mailbox = camel_imapx_job_get_mailbox (job); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ -+ job_data = camel_imapx_job_get_user_data (job); -+ g_return_val_if_fail (job_data != NULL, FALSE); -+ -+ uids = camel_imapx_server_uid_search_sync (server, mailbox, job_data->criteria_prefix, -+ job_data->search_key, (const gchar * const *) job_data->words, cancellable, &local_error); -+ -+ camel_imapx_job_set_result (job, uids != NULL, uids, local_error, uids ? (GDestroyNotify) g_ptr_array_free : NULL); -+ -+ if (local_error) -+ g_propagate_error (error, local_error); - -- connection_info_unref (cinfo); -+ return uids != NULL; - } - --void --camel_imapx_conn_manager_close_connections (CamelIMAPXConnManager *con_man, -- const GError *error) -+static gboolean -+imapx_conn_manager_uid_search_matches (CamelIMAPXJob *job, -+ CamelIMAPXJob *other_job) - { -- GList *iter, *connections; -+ struct UidSearchJobData *job_data, *other_job_data; - -- g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (con_man)); -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (other_job != NULL, FALSE); - -- /* Do this before acquiring the write lock, because any pending -- connection holds the write lock, thus makes this request starve. */ -- imax_conn_manager_cancel_pending_connections (con_man); -+ if (camel_imapx_job_get_kind (job) != CAMEL_IMAPX_JOB_UID_SEARCH || -+ camel_imapx_job_get_kind (job) != camel_imapx_job_get_kind (other_job)) -+ return FALSE; -+ -+ job_data = camel_imapx_job_get_user_data (job); -+ other_job_data = camel_imapx_job_get_user_data (other_job); -+ -+ if (!job_data || !other_job_data) -+ return job_data == other_job_data; -+ -+ return g_strcmp0 (job_data->criteria_prefix, other_job_data->criteria_prefix) == 0 && -+ g_strcmp0 (job_data->search_key, other_job_data->search_key) == 0 && -+ imapx_equal_strv ((const gchar * const *) job_data->words, (const gchar * const *) other_job_data->words); -+} -+ -+GPtrArray * -+camel_imapx_conn_manager_uid_search_sync (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ const gchar *criteria_prefix, -+ const gchar *search_key, -+ const gchar * const *words, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ struct UidSearchJobData *job_data; -+ GPtrArray *uids = NULL; -+ CamelIMAPXJob *job; -+ gboolean success; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), NULL); - -- CON_WRITE_LOCK (con_man); -+ job_data = g_new0 (struct UidSearchJobData, 1); -+ job_data->criteria_prefix = g_strdup (criteria_prefix); -+ job_data->search_key = g_strdup (search_key); -+ job_data->words = imapx_copy_strv (words); - -- c('*', "Closing all %d connections, with propagated error: %s\n", g_list_length (con_man->priv->connections), error ? error->message : "none"); -+ job = camel_imapx_job_new (CAMEL_IMAPX_JOB_UID_SEARCH, mailbox, -+ imapx_conn_manager_uid_search_run_sync, -+ imapx_conn_manager_uid_search_matches, -+ NULL); - -- connections = con_man->priv->connections; -- con_man->priv->connections = NULL; -+ camel_imapx_job_set_user_data (job, job_data, uid_search_job_data_free); - -- CON_WRITE_UNLOCK (con_man); -+ success = camel_imapx_conn_manager_run_job_sync (conn_man, job, NULL, cancellable, error); -+ if (success) { -+ gpointer result_data = NULL; - -- for (iter = connections; iter; iter = g_list_next (iter)) { -- connection_info_set_shutdown_error (iter->data, error); -+ success = camel_imapx_job_take_result_data (job, &result_data); -+ if (success) -+ uids = result_data; - } - -- g_list_free_full (connections, (GDestroyNotify) connection_info_cancel_and_unref); -+ camel_imapx_job_unref (job); -+ -+ return uids; - } - - /* for debugging purposes only */ - void --camel_imapx_conn_manager_dump_queue_status (CamelIMAPXConnManager *con_man) -+camel_imapx_conn_manager_dump_queue_status (CamelIMAPXConnManager *conn_man) - { -- GList *list, *link; -+ GList *llink; -+ GSList *slink; - -- g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (con_man)); -+ g_return_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man)); - -- list = imapx_conn_manager_list_info (con_man); -+ CON_READ_LOCK (conn_man); - -- for (link = list; link != NULL; link = g_list_next (link)) { -- ConnectionInfo *cinfo = link->data; -- camel_imapx_server_dump_queue_status (cinfo->is); -- connection_info_unref (cinfo); -+ printf ("%s: opened connections:%d\n", G_STRFUNC, g_list_length (conn_man->priv->connections)); -+ -+ for (llink = conn_man->priv->connections; llink != NULL; llink = g_list_next (llink)) { -+ ConnectionInfo *cinfo = llink->data; -+ CamelIMAPXCommand *cmd = NULL; -+ -+ if (cinfo) -+ cmd = cinfo->is ? camel_imapx_server_ref_current_command (cinfo->is) : NULL; -+ -+ printf (" connection:%p server:[%c] %p busy:%d command:%s\n", cinfo, -+ cinfo && cinfo->is ? camel_imapx_server_get_tagprefix (cinfo->is) : '?', -+ cinfo ? cinfo->is : NULL, cinfo ? cinfo->busy : FALSE, -+ cmd ? camel_imapx_job_get_kind_name (cmd->job_kind) : "[null]"); -+ -+ if (cmd) -+ camel_imapx_command_unref (cmd); -+ } -+ -+ CON_READ_UNLOCK (conn_man); -+ -+ JOB_QUEUE_LOCK (conn_man); -+ -+ printf ("Queued jobs:%d\n", g_slist_length (conn_man->priv->job_queue)); -+ for (slink = conn_man->priv->job_queue; slink; slink = g_slist_next (slink)) { -+ CamelIMAPXJob *job = slink->data; -+ -+ printf (" job:%p kind:%s mailbox:%s\n", job, -+ job ? camel_imapx_job_get_kind_name (camel_imapx_job_get_kind (job)) : "[null]", -+ job && camel_imapx_job_get_mailbox (job) ? camel_imapx_mailbox_get_name (camel_imapx_job_get_mailbox (job)) : "[null]"); - } - -- g_list_free (list); -+ JOB_QUEUE_UNLOCK (conn_man); - } -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-conn-manager.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-conn-manager.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-conn-manager.h.imapx-update-to-upstream 2014-11-07 08:34:49.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-conn-manager.h 2016-08-15 13:52:41.949976330 +0200 -@@ -21,6 +21,8 @@ - #ifndef _CAMEL_IMAPX_CONN_MANAGER_H - #define _CAMEL_IMAPX_CONN_MANAGER_H - -+#include "camel-imapx-job.h" -+#include "camel-imapx-mailbox.h" - #include "camel-imapx-server.h" - - G_BEGIN_DECLS -@@ -44,6 +46,8 @@ G_BEGIN_DECLS - (G_TYPE_INSTANCE_GET_CLASS \ - ((obj), CAMEL_TYPE_IMAPX_CONN_MANAGER, CamelIMAPXConnManagerClass)) - -+struct _CamelIMAPXStore; -+ - typedef struct _CamelIMAPXConnManager CamelIMAPXConnManager; - typedef struct _CamelIMAPXConnManagerClass CamelIMAPXConnManagerClass; - typedef struct _CamelIMAPXConnManagerPrivate CamelIMAPXConnManagerPrivate; -@@ -56,33 +60,131 @@ struct _CamelIMAPXConnManager { - - struct _CamelIMAPXConnManagerClass { - GObjectClass parent_class; -+ -+ /* Signals */ -+ void (* connection_created) (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXServer *server); - }; - - GType camel_imapx_conn_manager_get_type (void); - CamelIMAPXConnManager * - camel_imapx_conn_manager_new (CamelStore *store); --CamelStore * camel_imapx_conn_manager_ref_store -- (CamelIMAPXConnManager *con_man); --CamelIMAPXServer * -- camel_imapx_conn_manager_get_connection -- (CamelIMAPXConnManager *con_man, -- const gchar *folder_name, -- gboolean for_expensive_job, -- GCancellable *cancellable, -- GError **error); --void camel_imapx_conn_manager_close_connections -- (CamelIMAPXConnManager *con_man, -- const GError *error); --GList * camel_imapx_conn_manager_get_connections -- (CamelIMAPXConnManager *con_man); --void camel_imapx_conn_manager_update_con_info -- (CamelIMAPXConnManager *con_man, -- CamelIMAPXServer *server, -- const gchar *folder_name); -+struct _CamelIMAPXStore * -+ camel_imapx_conn_manager_ref_store -+ (CamelIMAPXConnManager *conn_man); -+gboolean camel_imapx_conn_manager_connect_sync -+ (CamelIMAPXConnManager *conn_man, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_conn_manager_disconnect_sync -+ (CamelIMAPXConnManager *conn_man, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_conn_manager_run_job_sync -+ (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXJob *job, -+ CamelIMAPXJobMatchesFunc finish_before_job, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_conn_manager_list_sync -+ (CamelIMAPXConnManager *conn_man, -+ const gchar *pattern, -+ CamelStoreGetFolderInfoFlags flags, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_conn_manager_refresh_info_sync -+ (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_conn_manager_sync_changes_sync -+ (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_conn_manager_expunge_sync -+ (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error); -+CamelStream * camel_imapx_conn_manager_get_message_sync -+ (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ CamelFolderSummary *summary, -+ CamelDataCache *message_cache, -+ const gchar *message_uid, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_conn_manager_copy_message_sync -+ (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ CamelIMAPXMailbox *destination, -+ GPtrArray *uids, -+ gboolean delete_originals, -+ gboolean remove_deleted_flags, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_conn_manager_append_message_sync -+ (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ CamelFolderSummary *summary, -+ CamelDataCache *message_cache, -+ CamelMimeMessage *message, -+ const CamelMessageInfo *mi, -+ gchar **append_uid, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_conn_manager_sync_message_sync -+ (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ CamelFolderSummary *summary, -+ CamelDataCache *message_cache, -+ const gchar *message_uid, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_conn_manager_create_mailbox_sync -+ (CamelIMAPXConnManager *conn_man, -+ const gchar *mailbox_name, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_conn_manager_delete_mailbox_sync -+ (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_conn_manager_rename_mailbox_sync -+ (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ const gchar *new_mailbox_name, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_conn_manager_subscribe_mailbox_sync -+ (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_conn_manager_unsubscribe_mailbox_sync -+ (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_conn_manager_update_quota_info_sync -+ (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error); -+GPtrArray * camel_imapx_conn_manager_uid_search_sync -+ (CamelIMAPXConnManager *conn_man, -+ CamelIMAPXMailbox *mailbox, -+ const gchar *criteria_prefix, -+ const gchar *search_key, -+ const gchar * const *words, -+ GCancellable *cancellable, -+ GError **error); - - /* for debugging purposes only */ - void camel_imapx_conn_manager_dump_queue_status -- (CamelIMAPXConnManager *con_man); -+ (CamelIMAPXConnManager *conn_man); - G_END_DECLS - - #endif /* _CAMEL_IMAPX_SERVER_H */ -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-folder.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-folder.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-folder.c.imapx-update-to-upstream 2014-09-02 17:58:14.000000000 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-folder.c 2016-08-15 13:52:41.950976330 +0200 -@@ -1,21 +1,21 @@ - /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ --/* camel-imap-folder.c : class for a imap folder */ --/* -- * Authors: Michael Zucchi -+/* camel-imap-folder.c : class for a imap folder - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * -- * This library is free software; you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . -+ * -+ * Authors: Michael Zucchi - */ - - #ifdef HAVE_CONFIG_H -@@ -42,6 +42,8 @@ - (G_TYPE_INSTANCE_GET_PRIVATE \ - ((obj), CAMEL_TYPE_IMAPX_FOLDER, CamelIMAPXFolderPrivate)) - -+extern gint camel_application_is_exiting; -+ - struct _CamelIMAPXFolderPrivate { - GMutex property_lock; - GWeakRef mailbox; -@@ -49,6 +51,8 @@ struct _CamelIMAPXFolderPrivate { - GMutex move_to_hash_table_lock; - GHashTable *move_to_real_junk_uids; - GHashTable *move_to_real_trash_uids; -+ -+ gboolean check_folder; - }; - - /* The custom property ID is a CamelArg artifact. -@@ -56,16 +60,17 @@ struct _CamelIMAPXFolderPrivate { - enum { - PROP_0, - PROP_MAILBOX, -- PROP_APPLY_FILTERS = 0x2501 -+ PROP_APPLY_FILTERS = 0x2501, -+ PROP_CHECK_FOLDER = 0x2502 - }; - - G_DEFINE_TYPE (CamelIMAPXFolder, camel_imapx_folder, CAMEL_TYPE_OFFLINE_FOLDER) - - static gboolean imapx_folder_get_apply_filters (CamelIMAPXFolder *folder); - --static void --imapx_folder_claim_move_to_real_junk_uids (CamelIMAPXFolder *folder, -- GPtrArray *out_uids_to_copy) -+void -+camel_imapx_folder_claim_move_to_real_junk_uids (CamelIMAPXFolder *folder, -+ GPtrArray *out_uids_to_copy) - { - GList *keys; - -@@ -82,9 +87,9 @@ imapx_folder_claim_move_to_real_junk_uid - } - } - --static void --imapx_folder_claim_move_to_real_trash_uids (CamelIMAPXFolder *folder, -- GPtrArray *out_uids_to_copy) -+void -+camel_imapx_folder_claim_move_to_real_trash_uids (CamelIMAPXFolder *folder, -+ GPtrArray *out_uids_to_copy) - { - GList *keys; - -@@ -138,6 +143,12 @@ imapx_folder_set_property (GObject *obje - g_value_get_boolean (value)); - return; - -+ case PROP_CHECK_FOLDER: -+ camel_imapx_folder_set_check_folder ( -+ CAMEL_IMAPX_FOLDER (object), -+ g_value_get_boolean (value)); -+ return; -+ - case PROP_MAILBOX: - camel_imapx_folder_set_mailbox ( - CAMEL_IMAPX_FOLDER (object), -@@ -162,6 +173,13 @@ imapx_folder_get_property (GObject *obje - CAMEL_IMAPX_FOLDER (object))); - return; - -+ case PROP_CHECK_FOLDER: -+ g_value_set_boolean ( -+ value, -+ camel_imapx_folder_get_check_folder ( -+ CAMEL_IMAPX_FOLDER (object))); -+ return; -+ - case PROP_MAILBOX: - g_value_take_object ( - value, -@@ -409,60 +427,31 @@ imapx_append_message_sync (CamelFolder * - { - CamelStore *store; - CamelIMAPXStore *imapx_store; -- CamelIMAPXServer *imapx_server; -+ CamelIMAPXConnManager *conn_man; - CamelIMAPXMailbox *mailbox = NULL; -- const gchar *folder_name; -- GError *local_error = NULL; - gboolean success = FALSE; - - if (appended_uid != NULL) - *appended_uid = NULL; - - store = camel_folder_get_parent_store (folder); -- folder_name = camel_folder_get_full_name (folder); - - imapx_store = CAMEL_IMAPX_STORE (store); -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, FALSE, cancellable, error); -- -- if (imapx_server == NULL) -- goto exit; -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); - - mailbox = camel_imapx_folder_list_mailbox ( - CAMEL_IMAPX_FOLDER (folder), cancellable, error); - -- if (mailbox == NULL) { -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -+ if (mailbox == NULL) - goto exit; -- } - -- success = camel_imapx_server_append_message ( -- imapx_server, mailbox, folder->summary, -+ success = camel_imapx_conn_manager_append_message_sync ( -+ conn_man, mailbox, folder->summary, - CAMEL_IMAPX_FOLDER (folder)->cache, message, -- info, appended_uid, cancellable, &local_error); -- -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, FALSE, cancellable, &local_error); -- if (imapx_server) { -- success = camel_imapx_server_append_message ( -- imapx_server, mailbox, folder->summary, -- CAMEL_IMAPX_FOLDER (folder)->cache, message, -- info, appended_uid, cancellable, &local_error); -- -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- } -- } -- -- if (local_error) -- g_propagate_error (error, local_error); -+ info, appended_uid, cancellable, error); - - exit: - g_clear_object (&mailbox); -- g_clear_object (&imapx_server); - - return success; - } -@@ -474,28 +463,21 @@ imapx_expunge_sync (CamelFolder *folder, - { - CamelStore *store; - CamelIMAPXStore *imapx_store; -- CamelIMAPXServer *imapx_server; -+ CamelIMAPXConnManager *conn_man; - CamelIMAPXMailbox *mailbox = NULL; - GError *local_error = NULL; -- const gchar *folder_name; - gboolean success = FALSE; - - store = camel_folder_get_parent_store (folder); -- folder_name = camel_folder_get_full_name (folder); - - imapx_store = CAMEL_IMAPX_STORE (store); -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, FALSE, cancellable, error); -- -- if (imapx_server == NULL) -- goto exit; -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); - - mailbox = camel_imapx_folder_list_mailbox ( - CAMEL_IMAPX_FOLDER (folder), cancellable, error); - -- if (mailbox == NULL) { -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -+ if (mailbox == NULL) - goto exit; -- } - - if ((store->flags & CAMEL_STORE_VTRASH) == 0) { - CamelFolder *trash; -@@ -533,28 +515,10 @@ imapx_expunge_sync (CamelFolder *folder, - g_clear_error (&local_error); - } - -- success = camel_imapx_server_expunge (imapx_server, mailbox, cancellable, &local_error); -- -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, FALSE, cancellable, &local_error); -- if (imapx_server) { -- success = camel_imapx_server_expunge (imapx_server, mailbox, cancellable, &local_error); -- -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- } -- } -- -- if (local_error) -- g_propagate_error (error, local_error); -+ success = camel_imapx_conn_manager_expunge_sync (conn_man, mailbox, cancellable, error); - - exit: - g_clear_object (&mailbox); -- g_clear_object (&imapx_server); - - return success; - } -@@ -612,7 +576,6 @@ imapx_get_message_sync (CamelFolder *fol - GIOStream *base_stream; - const gchar *path = NULL; - gboolean offline_message = FALSE; -- GError *local_error = NULL; - - imapx_folder = CAMEL_IMAPX_FOLDER (folder); - store = camel_folder_get_parent_store (folder); -@@ -630,9 +593,8 @@ imapx_get_message_sync (CamelFolder *fol - stream = camel_stream_new (base_stream); - g_object_unref (base_stream); - } else { -- CamelIMAPXServer *imapx_server; -+ CamelIMAPXConnManager *conn_man; - CamelIMAPXMailbox *mailbox; -- const gchar *folder_name; - - if (offline_message) { - g_set_error ( -@@ -642,49 +604,20 @@ imapx_get_message_sync (CamelFolder *fol - return NULL; - } - -- folder_name = camel_folder_get_full_name (folder); -- imapx_server = camel_imapx_store_ref_server ( -- CAMEL_IMAPX_STORE (store), folder_name, FALSE, cancellable, error); -- -- if (imapx_server == NULL) -- return NULL; -+ conn_man = camel_imapx_store_get_conn_manager (CAMEL_IMAPX_STORE (store)); - - mailbox = camel_imapx_folder_list_mailbox ( - CAMEL_IMAPX_FOLDER (folder), cancellable, error); - -- if (mailbox == NULL) { -- camel_imapx_store_folder_op_done (CAMEL_IMAPX_STORE (store), imapx_server, folder_name); -- g_object_unref (imapx_server); -+ if (mailbox == NULL) - return NULL; -- } - -- stream = camel_imapx_server_get_message ( -- imapx_server, mailbox, folder->summary, -+ stream = camel_imapx_conn_manager_get_message_sync ( -+ conn_man, mailbox, folder->summary, - CAMEL_IMAPX_FOLDER (folder)->cache, uid, -- cancellable, &local_error); -- -- camel_imapx_store_folder_op_done (CAMEL_IMAPX_STORE (store), imapx_server, folder_name); -- -- while (!stream && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (CAMEL_IMAPX_STORE (store), folder_name, FALSE, cancellable, &local_error); -- if (imapx_server) { -- stream = camel_imapx_server_get_message ( -- imapx_server, mailbox, folder->summary, -- CAMEL_IMAPX_FOLDER (folder)->cache, uid, -- cancellable, &local_error); -- -- camel_imapx_store_folder_op_done (CAMEL_IMAPX_STORE (store), imapx_server, folder_name); -- } -- } -- -- if (local_error) -- g_propagate_error (error, local_error); -+ cancellable, error); - - g_clear_object (&mailbox); -- g_clear_object (&imapx_server); - } - - if (stream != NULL) { -@@ -734,48 +667,23 @@ imapx_get_quota_info_sync (CamelFolder * - { - CamelStore *store; - CamelIMAPXStore *imapx_store; -- CamelIMAPXServer *imapx_server; -+ CamelIMAPXConnManager *conn_man; - CamelIMAPXMailbox *mailbox = NULL; - CamelFolderQuotaInfo *quota_info = NULL; -- const gchar *folder_name; - gchar **quota_roots; - gboolean success = FALSE; -- GError *local_error = NULL; - - store = camel_folder_get_parent_store (folder); -- folder_name = camel_folder_get_full_name (folder); - - imapx_store = CAMEL_IMAPX_STORE (store); -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, FALSE, cancellable, error); -- -- if (imapx_server == NULL) -- goto exit; -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); - - mailbox = camel_imapx_folder_list_mailbox ( - CAMEL_IMAPX_FOLDER (folder), cancellable, error); -- if (mailbox == NULL) { -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -+ if (mailbox == NULL) - goto exit; -- } -- -- success = camel_imapx_server_update_quota_info (imapx_server, mailbox, cancellable, &local_error); -- -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, FALSE, cancellable, &local_error); -- if (imapx_server) { -- success = camel_imapx_server_update_quota_info (imapx_server, mailbox, cancellable, &local_error); - -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- } -- } -- -- if (local_error) -- g_propagate_error (error, local_error); -+ success = camel_imapx_conn_manager_update_quota_info_sync (conn_man, mailbox, cancellable, error); - - if (!success) - goto exit; -@@ -798,7 +706,6 @@ imapx_get_quota_info_sync (CamelFolder * - - exit: - g_clear_object (&mailbox); -- g_clear_object (&imapx_server); - - return quota_info; - } -@@ -821,12 +728,9 @@ imapx_refresh_info_sync (CamelFolder *fo - { - CamelStore *store; - CamelIMAPXStore *imapx_store; -- CamelIMAPXServer *imapx_server; -+ CamelIMAPXConnManager *conn_man; - CamelIMAPXMailbox *mailbox = NULL; -- CamelFolderChangeInfo *changes; -- gchar *folder_name; - gboolean success = FALSE; -- GError *local_error = NULL; - - store = camel_folder_get_parent_store (folder); - -@@ -834,235 +738,14 @@ imapx_refresh_info_sync (CamelFolder *fo - if (!camel_offline_store_get_online (CAMEL_OFFLINE_STORE (store))) - return TRUE; - -- folder_name = g_strdup (camel_folder_get_full_name (folder)); - imapx_store = CAMEL_IMAPX_STORE (store); -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, TRUE, cancellable, error); -- -- if (imapx_server == NULL) -- goto exit; -- -- mailbox = camel_imapx_folder_list_mailbox ( -- CAMEL_IMAPX_FOLDER (folder), cancellable, error); -- -- if (mailbox == NULL) { -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- goto exit; -- } -- -- changes = camel_imapx_server_refresh_info (imapx_server, mailbox, cancellable, &local_error); -- -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, TRUE, cancellable, &local_error); -- if (imapx_server) { -- changes = camel_imapx_server_refresh_info (imapx_server, mailbox, cancellable, &local_error); -- -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- } -- } -- -- if (local_error) -- g_propagate_error (error, local_error); -- -- if (changes != NULL) { -- if (camel_folder_change_info_changed (changes)) -- camel_folder_changed (folder, changes); -- camel_folder_change_info_free (changes); -- success = TRUE; -- } -- --exit: -- g_clear_object (&mailbox); -- g_clear_object (&imapx_server); -- g_free (folder_name); -- -- return success; --} -- --/* Helper for imapx_synchronize_sync() */ --static gboolean --imapx_move_to_real_junk (CamelIMAPXServer *imapx_server, -- CamelFolder *folder, -- GCancellable *cancellable, -- gboolean *out_need_to_expunge, -- GError **error) --{ -- CamelIMAPXFolder *imapx_folder; -- CamelIMAPXMailbox *mailbox; -- CamelIMAPXSettings *settings; -- GPtrArray *uids_to_copy; -- gchar *real_junk_path = NULL; -- gboolean success = TRUE; -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); - -- *out_need_to_expunge = FALSE; -+ mailbox = camel_imapx_folder_list_mailbox (CAMEL_IMAPX_FOLDER (folder), cancellable, error); - -- /* Caller already obtained the mailbox from the folder, -- * so the folder should still have it readily available. */ -- imapx_folder = CAMEL_IMAPX_FOLDER (folder); -- mailbox = camel_imapx_folder_ref_mailbox (imapx_folder); -- g_return_val_if_fail (mailbox != NULL, FALSE); -- -- uids_to_copy = g_ptr_array_new_with_free_func ( -- (GDestroyNotify) camel_pstring_free); -- -- settings = camel_imapx_server_ref_settings (imapx_server); -- if (camel_imapx_settings_get_use_real_junk_path (settings)) { -- real_junk_path = -- camel_imapx_settings_dup_real_junk_path (settings); -- imapx_folder_claim_move_to_real_junk_uids ( -- imapx_folder, uids_to_copy); -+ if (mailbox) { -+ success = camel_imapx_conn_manager_refresh_info_sync (conn_man, mailbox, cancellable, error); - } -- g_object_unref (settings); -- -- if (uids_to_copy->len > 0) { -- CamelIMAPXStore *imapx_store; -- CamelIMAPXMailbox *destination = NULL; -- -- imapx_store = camel_imapx_server_ref_store (imapx_server); -- -- if (real_junk_path != NULL) { -- folder = camel_store_get_folder_sync ( -- CAMEL_STORE (imapx_store), -- real_junk_path, 0, -- cancellable, error); -- } else { -- g_set_error ( -- error, CAMEL_FOLDER_ERROR, -- CAMEL_FOLDER_ERROR_INVALID_PATH, -- _("No destination folder specified")); -- folder = NULL; -- } -- -- if (folder != NULL) { -- destination = camel_imapx_folder_list_mailbox ( -- CAMEL_IMAPX_FOLDER (folder), -- cancellable, error); -- g_object_unref (folder); -- } -- -- /* Avoid duplicating messages in the Junk folder. */ -- if (destination == mailbox) { -- success = TRUE; -- } else if (destination != NULL) { -- success = camel_imapx_server_copy_message ( -- imapx_server, -- mailbox, destination, -- uids_to_copy, TRUE, -- cancellable, error); -- *out_need_to_expunge = success; -- } else { -- success = FALSE; -- } -- -- if (!success) { -- g_prefix_error ( -- error, "%s: ", -- _("Unable to move junk messages")); -- } -- -- g_clear_object (&destination); -- g_clear_object (&imapx_store); -- } -- -- g_ptr_array_unref (uids_to_copy); -- g_free (real_junk_path); -- -- g_clear_object (&mailbox); -- -- return success; --} -- --/* Helper for imapx_synchronize_sync() */ --static gboolean --imapx_move_to_real_trash (CamelIMAPXServer *imapx_server, -- CamelFolder *folder, -- GCancellable *cancellable, -- gboolean *out_need_to_expunge, -- GError **error) --{ -- CamelIMAPXFolder *imapx_folder; -- CamelIMAPXMailbox *mailbox; -- CamelIMAPXSettings *settings; -- GPtrArray *uids_to_copy; -- gchar *real_trash_path = NULL; -- gboolean success = TRUE; -- -- *out_need_to_expunge = FALSE; -- -- /* Caller already obtained the mailbox from the folder, -- * so the folder should still have it readily available. */ -- imapx_folder = CAMEL_IMAPX_FOLDER (folder); -- mailbox = camel_imapx_folder_ref_mailbox (imapx_folder); -- g_return_val_if_fail (mailbox != NULL, FALSE); -- -- uids_to_copy = g_ptr_array_new_with_free_func ( -- (GDestroyNotify) camel_pstring_free); -- -- settings = camel_imapx_server_ref_settings (imapx_server); -- if (camel_imapx_settings_get_use_real_trash_path (settings)) { -- real_trash_path = -- camel_imapx_settings_dup_real_trash_path (settings); -- imapx_folder_claim_move_to_real_trash_uids ( -- CAMEL_IMAPX_FOLDER (folder), uids_to_copy); -- } -- g_object_unref (settings); -- -- if (uids_to_copy->len > 0) { -- CamelIMAPXStore *imapx_store; -- CamelIMAPXMailbox *destination = NULL; -- -- imapx_store = camel_imapx_server_ref_store (imapx_server); -- -- if (real_trash_path != NULL) { -- folder = camel_store_get_folder_sync ( -- CAMEL_STORE (imapx_store), -- real_trash_path, 0, -- cancellable, error); -- } else { -- g_set_error ( -- error, CAMEL_FOLDER_ERROR, -- CAMEL_FOLDER_ERROR_INVALID_PATH, -- _("No destination folder specified")); -- folder = NULL; -- } -- -- if (folder != NULL) { -- destination = camel_imapx_folder_list_mailbox ( -- CAMEL_IMAPX_FOLDER (folder), -- cancellable, error); -- g_object_unref (folder); -- } -- -- /* Avoid duplicating messages in the Trash folder. */ -- if (destination == mailbox) { -- success = TRUE; -- } else if (destination != NULL) { -- success = camel_imapx_server_copy_message ( -- imapx_server, -- mailbox, destination, -- uids_to_copy, TRUE, -- cancellable, error); -- *out_need_to_expunge = success; -- } else { -- success = FALSE; -- } -- -- if (!success) { -- g_prefix_error ( -- error, "%s: ", -- _("Unable to move deleted messages")); -- } -- -- g_clear_object (&destination); -- g_clear_object (&imapx_store); -- } -- -- g_ptr_array_unref (uids_to_copy); -- g_free (real_trash_path); - - g_clear_object (&mailbox); - -@@ -1077,91 +760,33 @@ imapx_synchronize_sync (CamelFolder *fol - { - CamelStore *store; - CamelIMAPXStore *imapx_store; -- CamelIMAPXServer *imapx_server; -+ CamelIMAPXConnManager *conn_man; - CamelIMAPXMailbox *mailbox = NULL; -- const gchar *folder_name; -- gboolean need_to_expunge; - gboolean success = FALSE; -- GError *local_error = NULL; - - store = camel_folder_get_parent_store (folder); -- folder_name = camel_folder_get_full_name (folder); - - /* Not connected, thus skip the operation */ - if (!camel_offline_store_get_online (CAMEL_OFFLINE_STORE (store))) - return TRUE; - - imapx_store = CAMEL_IMAPX_STORE (store); -- /* while it can be expensive job, do not treat it as such, to avoid a blockage -- by really expensive jobs */ -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, FALSE, cancellable, error); -- -- if (imapx_server == NULL) -- goto exit; -- -- mailbox = camel_imapx_folder_list_mailbox ( -- CAMEL_IMAPX_FOLDER (folder), cancellable, error); -- if (mailbox == NULL) { -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- goto exit; -- } -- -- success = camel_imapx_server_sync_changes (imapx_server, mailbox, cancellable, &local_error); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, FALSE, cancellable, &local_error); -- if (imapx_server) { -- success = camel_imapx_server_sync_changes (imapx_server, mailbox, cancellable, &local_error); -- } -- } -- -- if (success) { -- success = imapx_move_to_real_junk ( -- imapx_server, folder, cancellable, -- &need_to_expunge, error); -- expunge |= need_to_expunge; -- } -- -- if (success) { -- success = imapx_move_to_real_trash ( -- imapx_server, folder, cancellable, -- &need_to_expunge, error); -- expunge |= need_to_expunge; -- } -- -- /* Sync twice - make sure deleted flags are written out, -- * then sync again incase expunge changed anything */ -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); - -- if (success && expunge) { -- success = camel_imapx_server_expunge (imapx_server, mailbox, cancellable, &local_error); -+ mailbox = camel_imapx_folder_list_mailbox (CAMEL_IMAPX_FOLDER (folder), cancellable, error); - -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, FALSE, cancellable, &local_error); -- if (imapx_server) { -- success = camel_imapx_server_expunge (imapx_server, mailbox, cancellable, &local_error); -- } -+ /* Do not update mailboxes on exit which were not entered yet */ -+ if (mailbox == NULL || (camel_application_is_exiting && -+ camel_imapx_mailbox_get_permanentflags (mailbox) == ~0)) { -+ success = mailbox != NULL; -+ } else { -+ success = camel_imapx_conn_manager_sync_changes_sync (conn_man, mailbox, cancellable, error); -+ if (success && expunge && camel_folder_summary_get_deleted_count (folder->summary) > 0) { -+ success = camel_imapx_conn_manager_expunge_sync (conn_man, mailbox, cancellable, error); - } - } - -- if (local_error) -- g_propagate_error (error, local_error); -- -- if (imapx_server) -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- --exit: - g_clear_object (&mailbox); -- g_clear_object (&imapx_server); - - return success; - } -@@ -1174,57 +799,28 @@ imapx_synchronize_message_sync (CamelFol - { - CamelStore *store; - CamelIMAPXStore *imapx_store; -- CamelIMAPXServer *imapx_server; -+ CamelIMAPXConnManager *conn_man; - CamelIMAPXMailbox *mailbox = NULL; -- const gchar *folder_name; - gboolean success = FALSE; -- GError *local_error = NULL; - - store = camel_folder_get_parent_store (folder); -- folder_name = camel_folder_get_full_name (folder); - - imapx_store = CAMEL_IMAPX_STORE (store); -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, FALSE, cancellable, error); -- -- if (imapx_server == NULL) -- goto exit; -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); - - mailbox = camel_imapx_folder_list_mailbox ( - CAMEL_IMAPX_FOLDER (folder), cancellable, error); - -- if (mailbox == NULL) { -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -+ if (mailbox == NULL) - goto exit; -- } - -- success = camel_imapx_server_sync_message ( -- imapx_server, mailbox, folder->summary, -+ success = camel_imapx_conn_manager_sync_message_sync ( -+ conn_man, mailbox, folder->summary, - CAMEL_IMAPX_FOLDER (folder)->cache, uid, -- cancellable, &local_error); -- -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, FALSE, cancellable, &local_error); -- if (imapx_server) { -- success = camel_imapx_server_sync_message ( -- imapx_server, mailbox, folder->summary, -- CAMEL_IMAPX_FOLDER (folder)->cache, uid, -- cancellable, &local_error); -- -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- } -- } -- -- if (local_error) -- g_propagate_error (error, local_error); -+ cancellable, error); - - exit: - g_clear_object (&mailbox); -- g_clear_object (&imapx_server); - - return success; - } -@@ -1240,73 +836,68 @@ imapx_transfer_messages_to_sync (CamelFo - { - CamelStore *store; - CamelIMAPXStore *imapx_store; -- CamelIMAPXServer *imapx_server; -+ CamelIMAPXConnManager *conn_man; - CamelIMAPXMailbox *src_mailbox = NULL; - CamelIMAPXMailbox *dst_mailbox = NULL; -- const gchar *folder_name; - gboolean success = FALSE; -- GError *local_error = NULL; - - store = camel_folder_get_parent_store (source); -- folder_name = camel_folder_get_full_name (source); - - imapx_store = CAMEL_IMAPX_STORE (store); -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, FALSE, cancellable, error); -- -- if (imapx_server == NULL) -- goto exit; -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); - - src_mailbox = camel_imapx_folder_list_mailbox ( - CAMEL_IMAPX_FOLDER (source), cancellable, error); - -- if (src_mailbox == NULL) { -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -+ if (src_mailbox == NULL) - goto exit; -- } - - dst_mailbox = camel_imapx_folder_list_mailbox ( - CAMEL_IMAPX_FOLDER (dest), cancellable, error); - -- if (dst_mailbox == NULL) { -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -+ if (dst_mailbox == NULL) - goto exit; -- } - -- success = camel_imapx_server_copy_message ( -- imapx_server, src_mailbox, dst_mailbox, uids, -- delete_originals, cancellable, &local_error); -+ success = camel_imapx_conn_manager_copy_message_sync ( -+ conn_man, src_mailbox, dst_mailbox, uids, -+ delete_originals, FALSE, cancellable, error); - -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -+exit: -+ g_clear_object (&src_mailbox); -+ g_clear_object (&dst_mailbox); - -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -+ return success; -+} - -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, FALSE, cancellable, &local_error); -- if (imapx_server) { -- success = camel_imapx_server_copy_message ( -- imapx_server, src_mailbox, dst_mailbox, uids, -- delete_originals, cancellable, &local_error); -+static void -+imapx_folder_changed (CamelFolder *folder, -+ CamelFolderChangeInfo *info) -+{ -+ g_return_if_fail (CAMEL_IS_IMAPX_FOLDER (folder)); - -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- } -- } -+ if (info && info->uid_removed && info->uid_removed->len) { -+ CamelIMAPXFolder *imapx_folder; -+ guint ii; - -- if (local_error) -- g_propagate_error (error, local_error); -+ imapx_folder = CAMEL_IMAPX_FOLDER (folder); - -- /* Update destination folder only if it's not frozen, -- * to avoid updating for each "move" action on a single -- * message while filtering. */ -- if (!camel_folder_is_frozen (dest)) -- imapx_refresh_info_sync (dest, cancellable, NULL); -+ g_mutex_lock (&imapx_folder->priv->move_to_hash_table_lock); - --exit: -- g_clear_object (&src_mailbox); -- g_clear_object (&dst_mailbox); -- g_clear_object (&imapx_server); -+ for (ii = 0; ii < info->uid_removed->len; ii++) { -+ const gchar *message_uid = info->uid_removed->pdata[ii]; - -- return success; -+ if (!message_uid) -+ continue; -+ -+ g_hash_table_remove (imapx_folder->priv->move_to_real_trash_uids, message_uid); -+ g_hash_table_remove (imapx_folder->priv->move_to_real_junk_uids, message_uid); -+ } -+ -+ g_mutex_unlock (&imapx_folder->priv->move_to_hash_table_lock); -+ } -+ -+ /* Chain up to parent's method. */ -+ CAMEL_FOLDER_CLASS (camel_imapx_folder_parent_class)->changed (folder, info); - } - - static void -@@ -1364,6 +955,7 @@ camel_imapx_folder_class_init (CamelIMAP - folder_class->synchronize_sync = imapx_synchronize_sync; - folder_class->synchronize_message_sync = imapx_synchronize_message_sync; - folder_class->transfer_messages_to_sync = imapx_transfer_messages_to_sync; -+ folder_class->changed = imapx_folder_changed; - - g_object_class_install_property ( - object_class, -@@ -1378,6 +970,17 @@ camel_imapx_folder_class_init (CamelIMAP - - g_object_class_install_property ( - object_class, -+ PROP_CHECK_FOLDER, -+ g_param_spec_boolean ( -+ "check-folder", -+ "Check Folder", -+ _("Always check for _new mail in this folder"), -+ FALSE, -+ G_PARAM_READWRITE | -+ CAMEL_PARAM_PERSISTENT)); -+ -+ g_object_class_install_property ( -+ object_class, - PROP_MAILBOX, - g_param_spec_object ( - "mailbox", -@@ -1396,14 +999,14 @@ camel_imapx_folder_init (CamelIMAPXFolde - GHashTable *move_to_real_trash_uids; - - move_to_real_junk_uids = g_hash_table_new_full ( -- (GHashFunc) g_direct_hash, -- (GEqualFunc) g_direct_equal, -+ (GHashFunc) g_str_hash, -+ (GEqualFunc) g_str_equal, - (GDestroyNotify) camel_pstring_free, - (GDestroyNotify) NULL); - - move_to_real_trash_uids = g_hash_table_new_full ( -- (GHashFunc) g_direct_hash, -- (GEqualFunc) g_direct_equal, -+ (GHashFunc) g_str_hash, -+ (GEqualFunc) g_str_equal, - (GDestroyNotify) camel_pstring_free, - (GDestroyNotify) NULL); - -@@ -1449,6 +1052,7 @@ camel_imapx_folder_new (CamelStore *stor - gboolean filter_inbox; - gboolean filter_junk; - gboolean filter_junk_inbox; -+ gboolean store_offline_sync = FALSE; - - d ("opening imap folder '%s'\n", folder_dir); - -@@ -1462,6 +1066,7 @@ camel_imapx_folder_new (CamelStore *stor - "filter-inbox", &filter_inbox, - "filter-junk", &filter_junk, - "filter-junk-inbox", &filter_junk_inbox, -+ "stay-synchronized", &store_offline_sync, - NULL); - - g_object_unref (settings); -@@ -1496,16 +1101,22 @@ camel_imapx_folder_new (CamelStore *stor - return NULL; - } - -- /* Ensure cache will never expire, otherwise -- * it causes redownload of messages. */ -- camel_data_cache_set_expire_age (imapx_folder->cache, -1); -- camel_data_cache_set_expire_access (imapx_folder->cache, -1); -- - state_file = g_build_filename (folder_dir, "cmeta", NULL); - camel_object_set_state_filename (CAMEL_OBJECT (folder), state_file); - g_free (state_file); - camel_object_state_read (CAMEL_OBJECT (folder)); - -+ if (store_offline_sync || camel_offline_folder_get_offline_sync (CAMEL_OFFLINE_FOLDER (folder))) { -+ /* Ensure cache will never expire, otherwise -+ * it causes redownload of messages. */ -+ camel_data_cache_set_expire_age (imapx_folder->cache, -1); -+ camel_data_cache_set_expire_access (imapx_folder->cache, -1); -+ } else { -+ /* Set cache expiration for one week. */ -+ camel_data_cache_set_expire_age (imapx_folder->cache, 60 * 60 * 24 * 7); -+ camel_data_cache_set_expire_access (imapx_folder->cache, 60 * 60 * 24 * 7); -+ } -+ - imapx_folder->search = camel_imapx_search_new (CAMEL_IMAPX_STORE (store)); - - if (filter_all) -@@ -1615,7 +1226,7 @@ camel_imapx_folder_list_mailbox (CamelIM - GError **error) - { - CamelIMAPXStore *imapx_store; -- CamelIMAPXServer *server = NULL; -+ CamelIMAPXConnManager *conn_man; - CamelIMAPXMailbox *mailbox; - CamelStore *parent_store; - CamelStoreInfo *store_info; -@@ -1624,7 +1235,6 @@ camel_imapx_folder_list_mailbox (CamelIM - gchar *mailbox_name = NULL; - gchar *pattern; - gboolean success; -- GError *local_error = NULL; - - g_return_val_if_fail (CAMEL_IS_IMAPX_FOLDER (folder), FALSE); - -@@ -1661,36 +1271,14 @@ camel_imapx_folder_list_mailbox (CamelIM - goto exit; - } - -- server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, error); -- if (server == NULL) -- goto exit; -- -- mailbox = camel_imapx_store_ref_mailbox (imapx_store, mailbox_name); -- if (mailbox != NULL) { -- camel_imapx_folder_set_mailbox (folder, mailbox); -- goto exit; -- } -- - /* Last resort is to issue a LIST command. Maintainer should - * monitor IMAP logs to make sure this is rarely if ever used. */ - - pattern = camel_utf8_utf7 (mailbox_name); - - /* This creates a mailbox instance from the LIST response. */ -- success = camel_imapx_server_list (server, pattern, 0, cancellable, &local_error); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&server); -- -- server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, &local_error); -- if (server) { -- success = camel_imapx_server_list (server, pattern, 0, cancellable, &local_error); -- } -- } -- -- if (local_error) -- g_propagate_error (error, local_error); -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); -+ success = camel_imapx_conn_manager_list_sync (conn_man, pattern, 0, cancellable, error); - - g_free (pattern); - -@@ -1711,8 +1299,6 @@ camel_imapx_folder_list_mailbox (CamelIM - } - - exit: -- g_clear_object (&server); -- - g_free (folder_path); - g_free (mailbox_name); - -@@ -1778,6 +1364,7 @@ camel_imapx_folder_add_move_to_real_junk - { - g_return_if_fail (CAMEL_IS_IMAPX_FOLDER (folder)); - g_return_if_fail (message_uid != NULL); -+ g_return_if_fail (camel_folder_summary_check_uid (CAMEL_FOLDER (folder)->summary, message_uid)); - - g_mutex_lock (&folder->priv->move_to_hash_table_lock); - -@@ -1808,6 +1395,7 @@ camel_imapx_folder_add_move_to_real_tras - { - g_return_if_fail (CAMEL_IS_IMAPX_FOLDER (folder)); - g_return_if_fail (message_uid != NULL); -+ g_return_if_fail (camel_folder_summary_check_uid (CAMEL_FOLDER (folder)->summary, message_uid)); - - g_mutex_lock (&folder->priv->move_to_hash_table_lock); - -@@ -1867,3 +1455,26 @@ camel_imapx_folder_invalidate_local_cach - camel_folder_summary_free_array (array); - } - -+gboolean -+camel_imapx_folder_get_check_folder (CamelIMAPXFolder *folder) -+{ -+ g_return_val_if_fail (folder != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_FOLDER (folder), FALSE); -+ -+ return folder->priv->check_folder; -+} -+ -+void -+camel_imapx_folder_set_check_folder (CamelIMAPXFolder *folder, -+ gboolean check_folder) -+{ -+ g_return_if_fail (folder != NULL); -+ g_return_if_fail (CAMEL_IS_IMAPX_FOLDER (folder)); -+ -+ if (folder->priv->check_folder == check_folder) -+ return; -+ -+ folder->priv->check_folder = check_folder; -+ -+ g_object_notify (G_OBJECT (folder), "check-folder"); -+} -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-folder.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-folder.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-folder.h.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-folder.h 2016-08-15 13:52:41.950976330 +0200 -@@ -1,22 +1,21 @@ - /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ --/* camel-imap-folder.h : Class for a IMAP folder */ -- --/* -- * Authors: Michael Zucchi -+/* camel-imap-folder.h : Class for a IMAP folder - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * -- * This library is free software; you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . -+ * -+ * Authors: Michael Zucchi - */ - - #ifndef CAMEL_IMAPX_FOLDER_H -@@ -92,6 +91,17 @@ void camel_imapx_folder_add_move_to_rea - void camel_imapx_folder_invalidate_local_cache - (CamelIMAPXFolder *folder, - guint64 new_uidvalidity); -+gboolean camel_imapx_folder_get_check_folder -+ (CamelIMAPXFolder *folder); -+void camel_imapx_folder_set_check_folder -+ (CamelIMAPXFolder *folder, -+ gboolean check_folder); -+void camel_imapx_folder_claim_move_to_real_junk_uids -+ (CamelIMAPXFolder *folder, -+ GPtrArray *out_uids_to_copy); -+void camel_imapx_folder_claim_move_to_real_trash_uids -+ (CamelIMAPXFolder *folder, -+ GPtrArray *out_uids_to_copy); - - G_END_DECLS - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-input-stream.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-input-stream.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-input-stream.c.imapx-update-to-upstream 2014-07-22 12:03:27.000000000 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-input-stream.c 2016-08-15 13:52:41.951976330 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-input-stream.h - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -@@ -67,9 +67,17 @@ imapx_input_stream_fill (CamelIMAPXInput - GInputStream *base_stream; - gint left = 0; - -+ if (g_cancellable_is_cancelled (cancellable)) -+ return -1; -+ - base_stream = g_filter_input_stream_get_base_stream ( - G_FILTER_INPUT_STREAM (is)); - -+ if (error && *error) { -+ g_warning ("%s: Avoiding GIO call with a filled error '%s'", G_STRFUNC, (*error)->message); -+ error = NULL; -+ } -+ - left = is->priv->end - is->priv->ptr; - memcpy (is->priv->buf, is->priv->ptr, left); - is->priv->end = is->priv->buf + left; -@@ -136,6 +144,11 @@ imapx_input_stream_read (GInputStream *s - memcpy (buffer, priv->ptr, max); - priv->ptr += max; - } else { -+ if (error && *error) { -+ g_warning ("%s: Avoiding GIO call with a filled error '%s'", G_STRFUNC, (*error)->message); -+ error = NULL; -+ } -+ - max = MIN (priv->literal, count); - max = g_input_stream_read ( - base_stream, buffer, max, cancellable, error); -@@ -202,6 +215,11 @@ imapx_input_stream_read_nonblocking (GPo - - pollable_stream = G_POLLABLE_INPUT_STREAM (base_stream); - -+ if (error && *error) { -+ g_warning ("%s: Avoiding GIO call with a filled error '%s'", G_STRFUNC, (*error)->message); -+ error = NULL; -+ } -+ - /* XXX The function takes a GCancellable but the class method - * does not. Should be okay to pass NULL here since this - * is just a pass-through. */ -@@ -344,7 +362,7 @@ camel_imapx_input_stream_atom (CamelIMAP - - default: - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "expecting atom"); - return FALSE; - } -@@ -451,7 +469,7 @@ camel_imapx_input_stream_astring (CamelI - - default: - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "expecting astring"); - return FALSE; - } -@@ -511,7 +529,7 @@ camel_imapx_input_stream_nstring (CamelI - - default: - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "expecting nstring"); - return FALSE; - } -@@ -579,7 +597,7 @@ camel_imapx_input_stream_nstring_bytes ( - - default: - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "nstring: token not string"); - return FALSE; - } -@@ -611,7 +629,7 @@ camel_imapx_input_stream_number (CamelIM - - default: - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "expecting number"); - return FALSE; - } -@@ -692,7 +710,10 @@ camel_imapx_input_stream_token (CamelIMA - return is->priv->unget_tok; - } - -- if (is->priv->literal > 0) -+ *data = NULL; -+ *len = 0; -+ -+ if (is->priv->literal > 0 && !g_cancellable_is_cancelled (cancellable)) - g_warning ( - "stream_token called with literal %d", - is->priv->literal); -@@ -859,7 +880,7 @@ protocol_error: - else - is->priv->ptr = p; - -- g_set_error (error, CAMEL_IMAPX_ERROR, 1, "protocol error"); -+ g_set_error (error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, "protocol error"); - - return IMAPX_TOK_ERROR; - } -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-input-stream.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-input-stream.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-input-stream.h.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-input-stream.h 2016-08-15 13:52:41.951976330 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-input-stream.h - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -@@ -49,6 +49,11 @@ typedef struct _CamelIMAPXInputStreamCla - typedef struct _CamelIMAPXInputStreamPrivate CamelIMAPXInputStreamPrivate; - - typedef enum { -+ CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED = 1, -+ CAMEL_IMAPX_ERROR_IGNORE /* may ignore such errors */ -+} CamelIMAPXError; -+ -+typedef enum { - IMAPX_TOK_ERROR = -1, - IMAPX_TOK_TOKEN = 256, - IMAPX_TOK_STRING, -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c.imapx-update-to-upstream 2016-08-15 13:52:41.891976333 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c 2016-08-15 13:52:41.952976330 +0200 -@@ -1,495 +1,545 @@ - /* - * camel-imapx-job.c - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ -- --#include "camel-imapx-job.h" -+#ifdef HAVE_CONFIG_H -+#include -+#endif - - #include - --#include "camel-imapx-folder.h" -- --typedef struct _CamelIMAPXRealJob CamelIMAPXRealJob; -+#include "camel-imapx-job.h" - --/* CamelIMAPXJob + some private bits */ --struct _CamelIMAPXRealJob { -- CamelIMAPXJob public; -+G_LOCK_DEFINE_STATIC (get_kind_name_funcs); -+static GSList *get_kind_name_funcs = NULL; - -- volatile gint ref_count; -+const gchar * -+camel_imapx_job_get_kind_name (guint32 job_kind) -+{ -+ GSList *link; - -- GCancellable *cancellable; -+ switch ((CamelIMAPXJobKind) job_kind) { -+ case CAMEL_IMAPX_JOB_UNKNOWN: -+ return "UNKNOWN"; -+ case CAMEL_IMAPX_JOB_CAPABILITY: -+ return "CAPABILITY"; -+ case CAMEL_IMAPX_JOB_STARTTLS: -+ return "STARTTLS"; -+ case CAMEL_IMAPX_JOB_AUTHENTICATE: -+ return "AUTHENTICATE"; -+ case CAMEL_IMAPX_JOB_LOGIN: -+ return "LOGIN"; -+ case CAMEL_IMAPX_JOB_NAMESPACE: -+ return "NAMESPACE"; -+ case CAMEL_IMAPX_JOB_SELECT: -+ return "SELECT"; -+ case CAMEL_IMAPX_JOB_STATUS: -+ return "STATUS"; -+ case CAMEL_IMAPX_JOB_ENABLE: -+ return "ENABLE"; -+ case CAMEL_IMAPX_JOB_NOTIFY: -+ return "NOTIFY"; -+ case CAMEL_IMAPX_JOB_GET_MESSAGE: -+ return "GET_MESSAGE"; -+ case CAMEL_IMAPX_JOB_SYNC_MESSAGE: -+ return "SYNC_MESSAGE"; -+ case CAMEL_IMAPX_JOB_APPEND_MESSAGE: -+ return "APPEND_MESSAGE"; -+ case CAMEL_IMAPX_JOB_COPY_MESSAGE: -+ return "COPY_MESSAGE"; -+ case CAMEL_IMAPX_JOB_MOVE_MESSAGE: -+ return "MOVE_MESSAGE"; -+ case CAMEL_IMAPX_JOB_FETCH_NEW_MESSAGES: -+ return "FETCH_NEW_MESSAGES"; -+ case CAMEL_IMAPX_JOB_REFRESH_INFO: -+ return "REFRESH_INFO"; -+ case CAMEL_IMAPX_JOB_SYNC_CHANGES: -+ return "SYNC_CHANGES"; -+ case CAMEL_IMAPX_JOB_EXPUNGE: -+ return "EXPUNGE"; -+ case CAMEL_IMAPX_JOB_NOOP: -+ return "NOOP"; -+ case CAMEL_IMAPX_JOB_IDLE: -+ return "IDLE"; -+ case CAMEL_IMAPX_JOB_DONE: -+ return "DONE"; -+ case CAMEL_IMAPX_JOB_LIST: -+ return "LIST"; -+ case CAMEL_IMAPX_JOB_LSUB: -+ return "LSUB"; -+ case CAMEL_IMAPX_JOB_CREATE_MAILBOX: -+ return "CREATE_MAILBOX"; -+ case CAMEL_IMAPX_JOB_DELETE_MAILBOX: -+ return "DELETE_MAILBOX"; -+ case CAMEL_IMAPX_JOB_RENAME_MAILBOX: -+ return "RENAME_MAILBOX"; -+ case CAMEL_IMAPX_JOB_SUBSCRIBE_MAILBOX: -+ return "SUBSCRIBE_MAILBOX"; -+ case CAMEL_IMAPX_JOB_UNSUBSCRIBE_MAILBOX: -+ return "UNSUBSCRIBE_MAILBOX"; -+ case CAMEL_IMAPX_JOB_UPDATE_QUOTA_INFO: -+ return "UPDATE_QUOTA_INFO"; -+ case CAMEL_IMAPX_JOB_UID_SEARCH: -+ return "UID_SEARCH"; -+ case CAMEL_IMAPX_JOB_LAST: -+ break; -+ } - -- /* This is set by camel_imapx_job_take_error(), -- * and propagated through camel_imapx_job_wait(). */ -- GError *error; -+ G_LOCK (get_kind_name_funcs); - -- /* Used for running some jobs synchronously. */ -- GCond done_cond; -- GMutex done_mutex; -- gboolean done_flag; -+ for (link = get_kind_name_funcs; link; link = g_slist_next (link)) { -+ CamelIMAPXJobGetKindNameFunc get_kind_name = link->data; - -- /* Extra job-specific data. */ -- gpointer data; -- GDestroyNotify destroy_data; -+ if (get_kind_name) { -+ const gchar *name = get_kind_name (job_kind); - -- CamelIMAPXMailbox *mailbox; -- GMutex mailbox_lock; -+ if (name) { -+ G_UNLOCK (get_kind_name_funcs); -+ return name; -+ } -+ } -+ } - -- CamelIMAPXMailbox *guard_mailbox_update; /* uses the mailbox_lock */ --}; -+ G_UNLOCK (get_kind_name_funcs); - --static void --imapx_job_cancelled_cb (GCancellable *cancellable, -- CamelIMAPXJob *job) --{ -- /* Unblock camel_imapx_run_job() immediately. -- * -- * If camel_imapx_job_done() is called sometime later, -- * the GCond will broadcast but no one will be listening. */ -+ if (job_kind == CAMEL_IMAPX_JOB_LAST) -+ return "LAST"; - -- camel_imapx_job_done (job); -+ return "???"; - } - --CamelIMAPXJob * --camel_imapx_job_new (GCancellable *cancellable) -+void -+camel_imapx_job_register_get_kind_name_func (CamelIMAPXJobGetKindNameFunc get_kind_name) - { -- CamelIMAPXRealJob *real_job; -- -- real_job = g_slice_new0 (CamelIMAPXRealJob); -- -- /* Initialize private bits. */ -- real_job->ref_count = 1; -- g_cond_init (&real_job->done_cond); -- g_mutex_init (&real_job->done_mutex); -+ g_return_if_fail (get_kind_name != NULL); - -- if (cancellable != NULL) -- g_object_ref (cancellable); -- real_job->cancellable = cancellable; -+ G_LOCK (get_kind_name_funcs); - -- g_mutex_init (&real_job->mailbox_lock); -+ if (!g_slist_find (get_kind_name_funcs, get_kind_name)) -+ get_kind_name_funcs = g_slist_prepend (get_kind_name_funcs, get_kind_name); - -- return (CamelIMAPXJob *) real_job; -+ G_UNLOCK (get_kind_name_funcs); - } - --CamelIMAPXJob * --camel_imapx_job_ref (CamelIMAPXJob *job) -+void -+camel_imapx_job_unregister_get_kind_name_func (CamelIMAPXJobGetKindNameFunc get_kind_name) - { -- CamelIMAPXRealJob *real_job; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_JOB (job), NULL); -+ g_return_if_fail (get_kind_name != NULL); - -- real_job = (CamelIMAPXRealJob *) job; -+ G_LOCK (get_kind_name_funcs); - -- g_atomic_int_inc (&real_job->ref_count); -+ g_warn_if_fail (g_slist_find (get_kind_name_funcs, get_kind_name)); -+ get_kind_name_funcs = g_slist_remove (get_kind_name_funcs, get_kind_name); - -- return job; -+ G_UNLOCK (get_kind_name_funcs); - } - --void --camel_imapx_job_unref (CamelIMAPXJob *job) --{ -- CamelIMAPXRealJob *real_job; -+struct _CamelIMAPXJob { -+ volatile gint ref_count; - -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+ guint32 job_kind; -+ CamelIMAPXMailbox *mailbox; - -- real_job = (CamelIMAPXRealJob *) job; -+ CamelIMAPXJobRunSyncFunc run_sync; -+ CamelIMAPXJobMatchesFunc matches; -+ CamelIMAPXJobCopyResultFunc copy_result; - -- if (g_atomic_int_dec_and_test (&real_job->ref_count)) { -+ /* Extra job-specific data. */ -+ gpointer user_data; -+ GDestroyNotify destroy_user_data; - -- /* Free the public stuff. */ -+ gboolean result_is_set; -+ gboolean result_success; -+ gpointer result_data; -+ GError *result_error; -+ GDestroyNotify destroy_result_data; - -- if (real_job->public.pop_operation_msg) -- camel_operation_pop_message (real_job->cancellable); -+ GCond done_cond; -+ GMutex done_mutex; -+ gboolean is_done; - -- /* Free the private stuff. */ -+ GCancellable *abort_cancellable; -+}; - -- if (real_job->cancellable != NULL) -- g_object_unref (real_job->cancellable); -+CamelIMAPXJob * -+camel_imapx_job_new (guint32 job_kind, -+ CamelIMAPXMailbox *mailbox, -+ CamelIMAPXJobRunSyncFunc run_sync, -+ CamelIMAPXJobMatchesFunc matches, -+ CamelIMAPXJobCopyResultFunc copy_result) -+{ -+ CamelIMAPXJob *job; -+ -+ g_return_val_if_fail (run_sync != NULL, NULL); -+ -+ job = g_new0 (CamelIMAPXJob, 1); -+ job->ref_count = 1; -+ job->job_kind = job_kind; -+ job->mailbox = mailbox ? g_object_ref (mailbox) : NULL; -+ job->run_sync = run_sync; -+ job->matches = matches; -+ job->copy_result = copy_result; -+ job->abort_cancellable = camel_operation_new (); -+ job->is_done = FALSE; - -- g_clear_error (&real_job->error); -+ g_cond_init (&job->done_cond); -+ g_mutex_init (&job->done_mutex); - -- g_cond_clear (&real_job->done_cond); -- g_mutex_clear (&real_job->done_mutex); -+ return job; -+} - -- if (real_job->destroy_data != NULL) -- real_job->destroy_data (real_job->data); -+CamelIMAPXJob * -+camel_imapx_job_ref (CamelIMAPXJob *job) -+{ -+ g_return_val_if_fail (job != NULL, NULL); - -- g_mutex_lock (&real_job->mailbox_lock); -- if (real_job->guard_mailbox_update) { -- camel_imapx_mailbox_unlock_update (real_job->guard_mailbox_update); -- g_clear_object (&real_job->guard_mailbox_update); -- } -- g_mutex_unlock (&real_job->mailbox_lock); -+ g_atomic_int_inc (&job->ref_count); - -- g_clear_object (&real_job->mailbox); -- g_mutex_clear (&real_job->mailbox_lock); -+ return job; -+} - -- /* Fill the memory with a bit pattern before releasing -- * it back to the slab allocator, so we can more easily -- * identify dangling CamelIMAPXJob pointers. */ -- memset (real_job, 0xaa, sizeof (CamelIMAPXRealJob)); -+void -+camel_imapx_job_unref (CamelIMAPXJob *job) -+{ -+ g_return_if_fail (job != NULL); - -- /* But leave the reference count set to zero, so -- * CAMEL_IS_IMAPX_JOB can identify it as bad. */ -- real_job->ref_count = 0; -+ if (g_atomic_int_dec_and_test (&job->ref_count)) { -+ if (job->destroy_user_data) -+ job->destroy_user_data (job->user_data); - -- g_slice_free (CamelIMAPXRealJob, real_job); -- } --} -+ if (job->result_is_set && job->destroy_result_data) -+ job->destroy_result_data (job->result_data); - --gboolean --camel_imapx_job_check (CamelIMAPXJob *job) --{ -- CamelIMAPXRealJob *real_job; -+ g_clear_object (&job->mailbox); -+ g_clear_object (&job->abort_cancellable); -+ g_clear_error (&job->result_error); -+ -+ g_cond_clear (&job->done_cond); -+ g_mutex_clear (&job->done_mutex); - -- real_job = (CamelIMAPXRealJob *) job; -+ job->ref_count = 0xdeadbeef; - -- return (real_job != NULL && real_job->ref_count > 0); -+ g_free (job); -+ } - } - --void --camel_imapx_job_cancel (CamelIMAPXJob *job) -+guint32 -+camel_imapx_job_get_kind (CamelIMAPXJob *job) - { -- CamelIMAPXRealJob *real_job; -+ g_return_val_if_fail (job != NULL, CAMEL_IMAPX_JOB_UNKNOWN); - -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+ return job->job_kind; -+} - -- real_job = (CamelIMAPXRealJob *) job; -+CamelIMAPXMailbox * -+camel_imapx_job_get_mailbox (CamelIMAPXJob *job) -+{ -+ g_return_val_if_fail (job != NULL, NULL); - -- g_cancellable_cancel (real_job->cancellable); -+ return job->mailbox; - } - --/** -- * camel_imapx_job_wait: -- * @job: a #CamelIMAPXJob -- * @error: return location for a #GError, or %NULL -- * -- * Blocks until @job completes by way of camel_imapx_job_done(). If @job -- * completed successfully, the function returns %TRUE. If @job was given -- * a #GError by way of camel_imapx_job_take_error(), or its #GCancellable -- * was cancelled, the function sets @error and returns %FALSE. -- * -- * Returns: whether @job completed successfully -- * -- * Since: 3.10 -- **/ --gboolean --camel_imapx_job_wait (CamelIMAPXJob *job, -- GError **error) -+gpointer -+camel_imapx_job_get_user_data (CamelIMAPXJob *job) - { -- CamelIMAPXRealJob *real_job; -- GCancellable *cancellable; -- gulong cancel_id = 0; -- gboolean success = TRUE; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_JOB (job), FALSE); -- -- real_job = (CamelIMAPXRealJob *) job; -- cancellable = camel_imapx_job_get_cancellable (job); -- -- if (G_IS_CANCELLABLE (cancellable)) -- cancel_id = g_cancellable_connect ( -- cancellable, -- G_CALLBACK (imapx_job_cancelled_cb), -- camel_imapx_job_ref (job), -- (GDestroyNotify) camel_imapx_job_unref); -- -- g_mutex_lock (&real_job->done_mutex); -- while (!real_job->done_flag && !g_cancellable_is_cancelled (cancellable)) -- g_cond_wait ( -- &real_job->done_cond, -- &real_job->done_mutex); -- g_mutex_unlock (&real_job->done_mutex); -- -- if (cancel_id > 0) -- g_cancellable_disconnect (cancellable, cancel_id); -- -- /* Cancellation takes priority over other errors. */ -- if (g_cancellable_set_error_if_cancelled (cancellable, error)) { -- success = FALSE; -- } else if (real_job->error != NULL) { -- /* Copy the error, don't propagate it. -- * We want our GError to remain intact. */ -- if (error != NULL) { -- g_warn_if_fail (*error == NULL); -- *error = g_error_copy (real_job->error); -- } -- success = FALSE; -- } -+ g_return_val_if_fail (job != NULL, NULL); - -- return success; -+ return job->user_data; - } - - void --camel_imapx_job_done (CamelIMAPXJob *job) -+camel_imapx_job_set_user_data (CamelIMAPXJob *job, -+ gpointer user_data, -+ GDestroyNotify destroy_user_data) - { -- CamelIMAPXRealJob *real_job; -- -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+ g_return_if_fail (job != NULL); - -- real_job = (CamelIMAPXRealJob *) job; -- -- g_mutex_lock (&real_job->mailbox_lock); -- if (real_job->guard_mailbox_update) { -- camel_imapx_mailbox_unlock_update (real_job->guard_mailbox_update); -- g_clear_object (&real_job->guard_mailbox_update); -- } -- g_mutex_unlock (&real_job->mailbox_lock); -+ if (job->destroy_user_data) -+ job->destroy_user_data (job->user_data); - -- g_mutex_lock (&real_job->done_mutex); -- real_job->done_flag = TRUE; -- g_cond_broadcast (&real_job->done_cond); -- g_mutex_unlock (&real_job->done_mutex); -+ job->user_data = user_data; -+ job->destroy_user_data = destroy_user_data; - } - - gboolean --camel_imapx_job_run (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GError **error) -+camel_imapx_job_was_cancelled (CamelIMAPXJob *job) - { -- GCancellable *cancellable; -- gboolean success; -+ g_return_val_if_fail (job != NULL, FALSE); - -- g_return_val_if_fail (CAMEL_IS_IMAPX_JOB (job), FALSE); -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- g_return_val_if_fail (job->start != NULL, FALSE); -- -- cancellable = ((CamelIMAPXRealJob *) job)->cancellable; -- -- if (g_cancellable_set_error_if_cancelled (cancellable, error)) -+ if (!job->result_is_set) - return FALSE; - -- success = job->start (job, is, cancellable, error); -- -- if (success && !job->noreply) -- success = camel_imapx_job_wait (job, error); -- -- return success; -+ return g_error_matches (job->result_error, G_IO_ERROR, G_IO_ERROR_CANCELLED); - } - - void --camel_imapx_job_guard_mailbox_update (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox) --{ -- CamelIMAPXRealJob *real_job; -- -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -- -- if (mailbox) -- g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); -- -- real_job = (CamelIMAPXRealJob *) job; -- -- g_mutex_lock (&real_job->mailbox_lock); -- -- if (mailbox != real_job->guard_mailbox_update) { -- if (real_job->guard_mailbox_update) { -- camel_imapx_mailbox_unlock_update (real_job->guard_mailbox_update); -- g_clear_object (&real_job->guard_mailbox_update); -- } -- -- if (mailbox) { -- real_job->guard_mailbox_update = g_object_ref (mailbox); -- camel_imapx_mailbox_lock_update (real_job->guard_mailbox_update); -- } -+camel_imapx_job_set_result (CamelIMAPXJob *job, -+ gboolean success, -+ gpointer result, -+ const GError *error, -+ GDestroyNotify destroy_result) -+{ -+ g_return_if_fail (job != NULL); -+ -+ if (job->result_is_set) { -+ if (job->destroy_result_data) -+ job->destroy_result_data (job->result_data); -+ g_clear_error (&job->result_error); - } - -- g_mutex_unlock (&real_job->mailbox_lock); -+ job->result_is_set = TRUE; -+ job->result_success = success; -+ job->result_data = result; -+ job->destroy_result_data = destroy_result; -+ -+ if (error) -+ job->result_error = g_error_copy (error); - } - -+/* This doesn't return whether the job succeeded, but whether the result -+ was set for the job, thus some result copied. All out-arguments are optional. */ - gboolean --camel_imapx_job_matches (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox, -- const gchar *uid) -+camel_imapx_job_copy_result (CamelIMAPXJob *job, -+ gboolean *out_success, -+ gpointer *out_result, -+ GError **out_error, -+ GDestroyNotify *out_destroy_result) - { -- /* XXX CamelIMAPXMailbox can be NULL. I'm less sure about -- * the message UID but let's assume that can be NULL too. */ -+ g_return_val_if_fail (job != NULL, FALSE); - -- g_return_val_if_fail (CAMEL_IS_IMAPX_JOB (job), FALSE); -+ if (!job->result_is_set) -+ return FALSE; - -- if (mailbox != NULL) -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ if (out_success) -+ *out_success = job->result_success; - -- if (job->matches == NULL) -- return FALSE; -+ if (out_result) { -+ *out_result = NULL; - -- return job->matches (job, mailbox, uid); --} -+ if (job->copy_result) { -+ job->copy_result (job, job->result_data, out_result); -+ } else if (job->result_data) { -+ g_warn_if_reached (); -+ } -+ } - --gpointer --camel_imapx_job_get_data (CamelIMAPXJob *job) --{ -- CamelIMAPXRealJob *real_job; -+ if (out_error) { -+ g_warn_if_fail (*out_error == NULL); - -- g_return_val_if_fail (CAMEL_IS_IMAPX_JOB (job), NULL); -+ if (job->result_error) -+ *out_error = g_error_copy (job->result_error); -+ } - -- real_job = (CamelIMAPXRealJob *) job; -+ if (out_destroy_result) -+ *out_destroy_result = job->destroy_result_data; - -- return real_job->data; -+ return TRUE; - } - --void --camel_imapx_job_set_data (CamelIMAPXJob *job, -- gpointer data, -- GDestroyNotify destroy_data) -+/* Similar to camel_imapx_job_copy_result() except it gives result data -+ to the caller and unsets (not frees) the data in the job. */ -+gboolean -+camel_imapx_job_take_result_data (CamelIMAPXJob *job, -+ gpointer *out_result) - { -- CamelIMAPXRealJob *real_job; -+ g_return_val_if_fail (job != NULL, FALSE); - -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+ if (!job->result_is_set) -+ return FALSE; -+ -+ if (out_result) { -+ *out_result = job->result_data; -+ } else if (job->destroy_result_data) { -+ job->destroy_result_data (job->result_data); -+ } - -- real_job = (CamelIMAPXRealJob *) job; -+ job->result_data = NULL; -+ g_clear_error (&job->result_error); - -- if (real_job->destroy_data != NULL) -- real_job->destroy_data (real_job->data); -+ job->result_is_set = FALSE; - -- real_job->data = data; -- real_job->destroy_data = destroy_data; -+ return TRUE; - } - - gboolean --camel_imapx_job_has_mailbox (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox) -+camel_imapx_job_matches (CamelIMAPXJob *job, -+ CamelIMAPXJob *other_job) - { -- CamelIMAPXRealJob *real_job; -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (other_job != NULL, FALSE); - -- g_return_val_if_fail (CAMEL_IS_IMAPX_JOB (job), FALSE); -- -- if (mailbox != NULL) -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ if (job->job_kind != other_job->job_kind) -+ return FALSE; - -- real_job = (CamelIMAPXRealJob *) job; -+ if (job->mailbox != other_job->mailbox) -+ return FALSE; - -- /* Not necessary to lock the mutex since -- * we're just comparing memory addresses. */ -+ if (job->matches) -+ return job->matches (job, other_job); - -- return (mailbox == real_job->mailbox); -+ return TRUE; - } - --CamelIMAPXMailbox * --camel_imapx_job_ref_mailbox (CamelIMAPXJob *job) -+static void -+imapx_job_cancelled_cb (GCancellable *cancellable, -+ CamelIMAPXJob *job) - { -- CamelIMAPXRealJob *real_job; -- CamelIMAPXMailbox *mailbox = NULL; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_JOB (job), NULL); -- -- real_job = (CamelIMAPXRealJob *) job; -+ camel_imapx_job_abort (job); -+} - -- g_mutex_lock (&real_job->mailbox_lock); -+static void -+imapx_job_push_message_cb (CamelOperation *operation, -+ const gchar *message, -+ GCancellable *job_cancellable) -+{ -+ g_return_if_fail (CAMEL_IS_OPERATION (operation)); -+ g_return_if_fail (CAMEL_IS_OPERATION (job_cancellable)); - -- if (real_job->mailbox != NULL) -- mailbox = g_object_ref (real_job->mailbox); -+ camel_operation_push_message (job_cancellable, "%s", message); -+} - -- g_mutex_unlock (&real_job->mailbox_lock); -+static void -+imapx_job_pop_message_cb (CamelOperation *operation, -+ GCancellable *job_cancellable) -+{ -+ g_return_if_fail (CAMEL_IS_OPERATION (operation)); -+ g_return_if_fail (CAMEL_IS_OPERATION (job_cancellable)); - -- return mailbox; -+ camel_operation_pop_message (job_cancellable); - } - --void --camel_imapx_job_set_mailbox (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox) -+static void -+imapx_job_progress_cb (CamelOperation *operation, -+ gint percent, -+ GCancellable *job_cancellable) - { -- CamelIMAPXRealJob *real_job; -+ g_return_if_fail (CAMEL_IS_OPERATION (operation)); -+ g_return_if_fail (CAMEL_IS_OPERATION (job_cancellable)); -+ -+ camel_operation_progress (job_cancellable, percent); -+} - -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+gboolean -+camel_imapx_job_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ GError *local_error = NULL; -+ gboolean success = FALSE; -+ -+ g_return_val_if_fail (job != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), FALSE); -+ g_return_val_if_fail (job->run_sync != NULL, FALSE); -+ -+ g_mutex_lock (&job->done_mutex); -+ job->is_done = FALSE; -+ g_mutex_unlock (&job->done_mutex); -+ -+ g_cancellable_reset (job->abort_cancellable); -+ -+ if (!g_cancellable_set_error_if_cancelled (cancellable, error)) { -+ gulong cancelled_handler_id = 0; -+ gulong push_message_handler_id = 0; -+ gulong pop_message_handler_id = 0; -+ gulong progress_handler_id = 0; -+ -+ /* Proxy signals between job's cancellable and the abort_cancellable */ -+ if (cancellable) -+ cancelled_handler_id = g_cancellable_connect (cancellable, -+ G_CALLBACK (imapx_job_cancelled_cb), job, NULL); -+ -+ if (CAMEL_IS_OPERATION (cancellable)) { -+ push_message_handler_id = g_signal_connect (job->abort_cancellable, "push-message", -+ G_CALLBACK (imapx_job_push_message_cb), cancellable); -+ pop_message_handler_id = g_signal_connect (job->abort_cancellable, "pop-message", -+ G_CALLBACK (imapx_job_pop_message_cb), cancellable); -+ progress_handler_id = g_signal_connect (job->abort_cancellable, "progress", -+ G_CALLBACK (imapx_job_progress_cb), cancellable); -+ } - -- real_job = (CamelIMAPXRealJob *) job; -+ success = job->run_sync (job, server, job->abort_cancellable, &local_error); - -- if (mailbox != NULL) { -- g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); -- g_object_ref (mailbox); -+ if (push_message_handler_id) -+ g_signal_handler_disconnect (job->abort_cancellable, push_message_handler_id); -+ if (pop_message_handler_id) -+ g_signal_handler_disconnect (job->abort_cancellable, pop_message_handler_id); -+ if (progress_handler_id) -+ g_signal_handler_disconnect (job->abort_cancellable, progress_handler_id); -+ if (cancelled_handler_id) -+ g_cancellable_disconnect (cancellable, cancelled_handler_id); - } - -- g_mutex_lock (&real_job->mailbox_lock); -- -- g_clear_object (&real_job->mailbox); -- real_job->mailbox = mailbox; -+ if (local_error) -+ g_propagate_error (error, local_error); - -- g_mutex_unlock (&real_job->mailbox_lock); -+ return success; - } - --GCancellable * --camel_imapx_job_get_cancellable (CamelIMAPXJob *job) -+void -+camel_imapx_job_done (CamelIMAPXJob *job) - { -- CamelIMAPXRealJob *real_job; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_JOB (job), NULL); -- -- real_job = (CamelIMAPXRealJob *) job; -+ g_return_if_fail (job != NULL); - -- return real_job->cancellable; -+ g_mutex_lock (&job->done_mutex); -+ job->is_done = TRUE; -+ g_cond_broadcast (&job->done_cond); -+ g_mutex_unlock (&job->done_mutex); - } - --/** -- * camel_imapx_job_take_error: -- * @job: a #CamelIMAPXJob -- * @error: a #GError -- * -- * Takes over the caller's ownership of @error, so the caller does not -- * need to free it any more. Call this when a #CamelIMAPXCommand fails -- * and the @job is to be aborted. -- * -- * The @error will be returned to callers of camel_imapx_job_wait() or -- * camel_imapx_job_run(). -- * -- * Since: 3.10 -- **/ - void --camel_imapx_job_take_error (CamelIMAPXJob *job, -- GError *error) -+camel_imapx_job_abort (CamelIMAPXJob *job) - { -- CamelIMAPXRealJob *real_job; -+ g_return_if_fail (job != NULL); - -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -- g_return_if_fail (error != NULL); -+ g_cancellable_cancel (job->abort_cancellable); -+} - -- real_job = (CamelIMAPXRealJob *) job; -- g_return_if_fail (real_job->error != error); -+static void -+camel_imapx_job_wait_cancelled_cb (GCancellable *cancellable, -+ gpointer user_data) -+{ -+ CamelIMAPXJob *job = user_data; - -- g_clear_error (&real_job->error); -+ g_return_if_fail (job != NULL); - -- real_job->error = error; /* takes ownership */ -+ g_mutex_lock (&job->done_mutex); -+ g_cond_broadcast (&job->done_cond); -+ g_mutex_unlock (&job->done_mutex); - } - --/** -- * camel_imapx_job_set_error_if_failed: -- * @job: a #CamelIMAPXJob -- * @error: a location for a #GError -- * -- * Sets @error to a new GError instance and returns TRUE, if the job has set -- * an error or when it was cancelled. -- * -- * Returns: Whether the job failed. -- * -- * Since: 3.12.4 -- **/ --gboolean --camel_imapx_job_set_error_if_failed (CamelIMAPXJob *job, -- GError **error) -+void -+camel_imapx_job_wait_sync (CamelIMAPXJob *job, -+ GCancellable *cancellable) - { -- CamelIMAPXRealJob *real_job; -+ gulong handler_id = 0; -+ -+ g_return_if_fail (job != NULL); - -- g_return_val_if_fail (CAMEL_IS_IMAPX_JOB (job), TRUE); -- g_return_val_if_fail (error != NULL, TRUE); -+ if (g_cancellable_is_cancelled (cancellable)) -+ return; - -- real_job = (CamelIMAPXRealJob *) job; -+ if (cancellable) -+ handler_id = g_cancellable_connect (cancellable, G_CALLBACK (camel_imapx_job_wait_cancelled_cb), job, NULL); - -- if (real_job->error) { -- g_propagate_error (error, g_error_copy (real_job->error)); -- return TRUE; -+ g_mutex_lock (&job->done_mutex); -+ while (!job->is_done && !g_cancellable_is_cancelled (cancellable)) { -+ g_cond_wait (&job->done_cond, &job->done_mutex); - } -+ g_mutex_unlock (&job->done_mutex); - -- return g_cancellable_set_error_if_cancelled (real_job->cancellable, error); -+ if (handler_id) -+ g_cancellable_disconnect (cancellable, handler_id); - } -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.h.imapx-update-to-upstream 2016-08-15 13:52:41.892976333 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.h 2016-08-15 13:52:41.952976330 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-job.h - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -@@ -20,72 +20,103 @@ - - #include "camel-imapx-server.h" - --#define CAMEL_IS_IMAPX_JOB(job) \ -- (camel_imapx_job_check (job)) -- - G_BEGIN_DECLS - - typedef struct _CamelIMAPXJob CamelIMAPXJob; - --struct _uidset_state { -- gint entries, uids; -- gint total, limit; -- guint32 start; -- guint32 last; --}; -- --struct _CamelIMAPXJob { -- /* Whether to pop a status message off the -- * GCancellable when the job is finalized. */ -- gboolean pop_operation_msg; -- -- gboolean (*start) (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error); -- gboolean (*matches) (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox, -- const gchar *uid); -+struct _CamelIMAPXJob; - -- guint noreply:1; /* dont wait for reply */ -- guint32 type; /* operation type */ -- gint pri; /* the command priority */ -- volatile gint commands; /* counts how many commands are outstanding */ --}; -+typedef enum { -+ CAMEL_IMAPX_JOB_UNKNOWN = 0, -+ CAMEL_IMAPX_JOB_CAPABILITY, -+ CAMEL_IMAPX_JOB_STARTTLS, -+ CAMEL_IMAPX_JOB_AUTHENTICATE, -+ CAMEL_IMAPX_JOB_LOGIN, -+ CAMEL_IMAPX_JOB_NAMESPACE, -+ CAMEL_IMAPX_JOB_SELECT, -+ CAMEL_IMAPX_JOB_STATUS, -+ CAMEL_IMAPX_JOB_ENABLE, -+ CAMEL_IMAPX_JOB_NOTIFY, -+ CAMEL_IMAPX_JOB_GET_MESSAGE, -+ CAMEL_IMAPX_JOB_SYNC_MESSAGE, -+ CAMEL_IMAPX_JOB_APPEND_MESSAGE, -+ CAMEL_IMAPX_JOB_COPY_MESSAGE, -+ CAMEL_IMAPX_JOB_MOVE_MESSAGE, -+ CAMEL_IMAPX_JOB_FETCH_NEW_MESSAGES, -+ CAMEL_IMAPX_JOB_REFRESH_INFO, -+ CAMEL_IMAPX_JOB_SYNC_CHANGES, -+ CAMEL_IMAPX_JOB_EXPUNGE, -+ CAMEL_IMAPX_JOB_NOOP, -+ CAMEL_IMAPX_JOB_IDLE, -+ CAMEL_IMAPX_JOB_DONE, -+ CAMEL_IMAPX_JOB_LIST, -+ CAMEL_IMAPX_JOB_LSUB, -+ CAMEL_IMAPX_JOB_CREATE_MAILBOX, -+ CAMEL_IMAPX_JOB_DELETE_MAILBOX, -+ CAMEL_IMAPX_JOB_RENAME_MAILBOX, -+ CAMEL_IMAPX_JOB_SUBSCRIBE_MAILBOX, -+ CAMEL_IMAPX_JOB_UNSUBSCRIBE_MAILBOX, -+ CAMEL_IMAPX_JOB_UPDATE_QUOTA_INFO, -+ CAMEL_IMAPX_JOB_UID_SEARCH, -+ CAMEL_IMAPX_JOB_LAST -+} CamelIMAPXJobKind; -+ -+typedef const gchar * (* CamelIMAPXJobGetKindNameFunc)(guint32 job_kind); -+ -+const gchar * camel_imapx_job_get_kind_name (guint32 job_kind); -+void camel_imapx_job_register_get_kind_name_func -+ (CamelIMAPXJobGetKindNameFunc get_kind_name); -+void camel_imapx_job_unregister_get_kind_name_func -+ (CamelIMAPXJobGetKindNameFunc get_kind_name); -+ -+typedef gboolean (* CamelIMAPXJobRunSyncFunc) (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, -+ GError **error); -+typedef gboolean (* CamelIMAPXJobMatchesFunc) (CamelIMAPXJob *job, -+ CamelIMAPXJob *other_job); -+typedef void (* CamelIMAPXJobCopyResultFunc) (CamelIMAPXJob *job, -+ gconstpointer set_result, -+ gpointer *out_result); - --CamelIMAPXJob * camel_imapx_job_new (GCancellable *cancellable); -+CamelIMAPXJob * camel_imapx_job_new (guint32 job_kind, -+ CamelIMAPXMailbox *mailbox, -+ CamelIMAPXJobRunSyncFunc run_sync, -+ CamelIMAPXJobMatchesFunc matches, -+ CamelIMAPXJobCopyResultFunc copy_result); - CamelIMAPXJob * camel_imapx_job_ref (CamelIMAPXJob *job); - void camel_imapx_job_unref (CamelIMAPXJob *job); --gboolean camel_imapx_job_check (CamelIMAPXJob *job); --void camel_imapx_job_cancel (CamelIMAPXJob *job); --gboolean camel_imapx_job_wait (CamelIMAPXJob *job, -- GError **error); --void camel_imapx_job_done (CamelIMAPXJob *job); --gboolean camel_imapx_job_run (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GError **error); --void camel_imapx_job_guard_mailbox_update -- (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox); --gboolean camel_imapx_job_matches (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox, -- const gchar *uid); --gpointer camel_imapx_job_get_data (CamelIMAPXJob *job); --void camel_imapx_job_set_data (CamelIMAPXJob *job, -- gpointer data, -- GDestroyNotify destroy_data); --gboolean camel_imapx_job_has_mailbox (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox); -+guint32 camel_imapx_job_get_kind (CamelIMAPXJob *job); - CamelIMAPXMailbox * -- camel_imapx_job_ref_mailbox (CamelIMAPXJob *job); --void camel_imapx_job_set_mailbox (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox); --GCancellable * camel_imapx_job_get_cancellable (CamelIMAPXJob *job); --void camel_imapx_job_take_error (CamelIMAPXJob *job, -- GError *error); --gboolean camel_imapx_job_set_error_if_failed -+ camel_imapx_job_get_mailbox (CamelIMAPXJob *job); -+gpointer camel_imapx_job_get_user_data (CamelIMAPXJob *job); -+void camel_imapx_job_set_user_data (CamelIMAPXJob *job, -+ gpointer user_data, -+ GDestroyNotify destroy_user_data); -+gboolean camel_imapx_job_was_cancelled (CamelIMAPXJob *job); -+void camel_imapx_job_set_result (CamelIMAPXJob *job, -+ gboolean success, -+ gpointer result, -+ const GError *error, -+ GDestroyNotify destroy_result); -+gboolean camel_imapx_job_copy_result (CamelIMAPXJob *job, -+ gboolean *out_success, -+ gpointer *out_result, -+ GError **out_error, -+ GDestroyNotify *out_destroy_result); -+gboolean camel_imapx_job_take_result_data - (CamelIMAPXJob *job, -+ gpointer *out_result); -+gboolean camel_imapx_job_matches (CamelIMAPXJob *job, -+ CamelIMAPXJob *other_job); -+gboolean camel_imapx_job_run_sync (CamelIMAPXJob *job, -+ CamelIMAPXServer *server, -+ GCancellable *cancellable, - GError **error); -+void camel_imapx_job_done (CamelIMAPXJob *job); -+void camel_imapx_job_abort (CamelIMAPXJob *job); -+void camel_imapx_job_wait_sync (CamelIMAPXJob *job, -+ GCancellable *cancellable); - - G_END_DECLS - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-list-response.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-list-response.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-list-response.c.imapx-update-to-upstream 2014-05-22 08:45:46.000000000 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-list-response.c 2016-08-15 13:52:41.952976330 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-list-response.c - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -@@ -147,7 +147,7 @@ imapx_list_response_parse_childinfo (Cam - goto fail; - if (tok != '(') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "list childinfo: expecting ')'"); - goto fail; - } -@@ -197,7 +197,7 @@ imapx_list_response_parse_oldname (Camel - goto fail; - if (tok != '(') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "list oldname: expecting ')'"); - goto fail; - } -@@ -214,7 +214,7 @@ imapx_list_response_parse_oldname (Camel - goto fail; - if (tok != ')') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "list oldname: expecting ')'"); - goto fail; - } -@@ -325,7 +325,7 @@ camel_imapx_list_response_new (CamelIMAP - goto fail; - if (tok != '(') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "list: expecting '('"); - goto fail; - } -@@ -343,7 +343,7 @@ camel_imapx_list_response_new (CamelIMAP - goto fail; - if (tok != ')') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "list: expecting ')'"); - goto fail; - } -@@ -414,7 +414,7 @@ extended_item_repeat: - - } else { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "list: expecting '(' or NEWLINE"); - goto fail; - } -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-list-response.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-list-response.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-list-response.h.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-list-response.h 2016-08-15 13:52:41.953976330 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-list-response.h - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-logger.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-logger.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-logger.c.imapx-update-to-upstream 2014-05-22 08:45:46.000000000 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-logger.c 2016-08-15 13:52:41.953976330 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-logger.c - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-logger.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-logger.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-logger.h.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-logger.h 2016-08-15 13:52:41.953976330 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-logger.h - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.c.imapx-update-to-upstream 2016-08-15 13:52:41.892976333 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.c 2016-08-15 14:38:22.156860220 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-mailbox.c - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -@@ -48,12 +48,13 @@ struct _CamelIMAPXMailboxPrivate { - guint64 highestmodseq; - guint32 permanentflags; - -+ volatile gint change_stamp; -+ - CamelIMAPXMailboxState state; - - GMutex property_lock; - GMutex update_lock; -- GCond update_cond; -- gboolean update_is_locked; -+ gint update_count; - - /* Protected by the "property_lock". */ - GHashTable *attributes; -@@ -101,7 +102,6 @@ imapx_mailbox_finalize (GObject *object) - - g_mutex_clear (&priv->property_lock); - g_mutex_clear (&priv->update_lock); -- g_cond_clear (&priv->update_cond); - g_hash_table_destroy (priv->attributes); - g_sequence_free (priv->message_map); - g_strfreev (priv->quota_roots); -@@ -129,11 +129,11 @@ camel_imapx_mailbox_init (CamelIMAPXMail - - g_mutex_init (&mailbox->priv->property_lock); - g_mutex_init (&mailbox->priv->update_lock); -- g_cond_init (&mailbox->priv->update_cond); -- mailbox->priv->update_is_locked = FALSE; - mailbox->priv->message_map = g_sequence_new (NULL); - mailbox->priv->permanentflags = ~0; - mailbox->priv->state = CAMEL_IMAPX_MAILBOX_STATE_CREATED; -+ mailbox->priv->update_count = 0; -+ mailbox->priv->change_stamp = 0; - } - - /** -@@ -256,7 +256,7 @@ camel_imapx_mailbox_clone (CamelIMAPXMai - * - * Returns: Current (update) state of the mailbox. - * -- * Since: 3.12.9 -+ * Since: 3.16 - **/ - CamelIMAPXMailboxState - camel_imapx_mailbox_get_state (CamelIMAPXMailbox *mailbox) -@@ -275,7 +275,7 @@ camel_imapx_mailbox_get_state (CamelIMAP - * structure updates, to identify newly created, updated, renamed - * or removed mailboxes. - * -- * Since: 3.12.9 -+ * Since: 3.16 - **/ - void - camel_imapx_mailbox_set_state (CamelIMAPXMailbox *mailbox, -@@ -497,7 +497,12 @@ camel_imapx_mailbox_set_messages (CamelI - { - g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); - -+ if (mailbox->priv->messages == messages) -+ return; -+ - mailbox->priv->messages = messages; -+ -+ g_atomic_int_add (&mailbox->priv->change_stamp, 1); - } - - /** -@@ -539,7 +544,12 @@ camel_imapx_mailbox_set_recent (CamelIMA - { - g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); - -+ if (mailbox->priv->recent == recent) -+ return; -+ - mailbox->priv->recent = recent; -+ -+ g_atomic_int_add (&mailbox->priv->change_stamp, 1); - } - - /** -@@ -583,7 +593,12 @@ camel_imapx_mailbox_set_unseen (CamelIMA - { - g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); - -+ if (mailbox->priv->unseen == unseen) -+ return; -+ - mailbox->priv->unseen = unseen; -+ -+ g_atomic_int_add (&mailbox->priv->change_stamp, 1); - } - - /** -@@ -625,7 +640,12 @@ camel_imapx_mailbox_set_uidnext (CamelIM - { - g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); - -+ if (mailbox->priv->uidnext == uidnext) -+ return; -+ - mailbox->priv->uidnext = uidnext; -+ -+ g_atomic_int_add (&mailbox->priv->change_stamp, 1); - } - - /** -@@ -667,7 +687,12 @@ camel_imapx_mailbox_set_uidvalidity (Cam - { - g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); - -+ if (mailbox->priv->uidvalidity == uidvalidity) -+ return; -+ - mailbox->priv->uidvalidity = uidvalidity; -+ -+ g_atomic_int_add (&mailbox->priv->change_stamp, 1); - } - - /** -@@ -713,7 +738,12 @@ camel_imapx_mailbox_set_highestmodseq (C - { - g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); - -+ if (mailbox->priv->highestmodseq == highestmodseq) -+ return; -+ - mailbox->priv->highestmodseq = highestmodseq; -+ -+ g_atomic_int_add (&mailbox->priv->change_stamp, 1); - } - - /** -@@ -723,7 +753,7 @@ camel_imapx_mailbox_set_highestmodseq (C - * Returns: PERMANENTFLAGS response for the mailbox, or ~0, if the mailbox - * was not selected yet. - * -- * Since: 3.12.8 -+ * Since: 3.16 - **/ - guint32 - camel_imapx_mailbox_get_permanentflags (CamelIMAPXMailbox *mailbox) -@@ -740,7 +770,7 @@ camel_imapx_mailbox_get_permanentflags ( - * - * Updates the last know value for PERMANENTFLAGS for this mailbox. - * -- * Since: 3.12.8 -+ * Since: 3.16 - **/ - void - camel_imapx_mailbox_set_permanentflags (CamelIMAPXMailbox *mailbox, -@@ -748,6 +778,11 @@ camel_imapx_mailbox_set_permanentflags ( - { - g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); - -+ if ((permanentflags & CAMEL_MESSAGE_USER) != 0) { -+ permanentflags |= CAMEL_MESSAGE_JUNK; -+ permanentflags |= CAMEL_MESSAGE_NOTJUNK; -+ } -+ - mailbox->priv->permanentflags = permanentflags; - } - -@@ -1179,53 +1214,49 @@ camel_imapx_mailbox_handle_status_respon - g_return_if_fail (CAMEL_IS_IMAPX_STATUS_RESPONSE (response)); - - if (camel_imapx_status_response_get_messages (response, &value32)) -- mailbox->priv->messages = value32; -+ camel_imapx_mailbox_set_messages (mailbox, value32); - - if (camel_imapx_status_response_get_recent (response, &value32)) -- mailbox->priv->recent = value32; -+ camel_imapx_mailbox_set_recent (mailbox, value32); - - if (camel_imapx_status_response_get_unseen (response, &value32)) -- mailbox->priv->unseen = value32; -+ camel_imapx_mailbox_set_unseen (mailbox, value32); - - if (camel_imapx_status_response_get_uidnext (response, &value32)) -- mailbox->priv->uidnext = value32; -+ camel_imapx_mailbox_set_uidnext (mailbox, value32); - - if (camel_imapx_status_response_get_uidvalidity (response, &value32)) -- mailbox->priv->uidvalidity = value32; -+ camel_imapx_mailbox_set_uidvalidity (mailbox, value32); - - if (camel_imapx_status_response_get_highestmodseq (response, &value64)) -- mailbox->priv->highestmodseq = value64; -+ camel_imapx_mailbox_set_highestmodseq (mailbox, value64); - } - --/* Prevents running FETCH and STORE at the same time for the given mailbox */ --void --camel_imapx_mailbox_lock_update (CamelIMAPXMailbox *mailbox) -+gint -+camel_imapx_mailbox_get_update_count (CamelIMAPXMailbox *mailbox) - { -- g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); -+ gint res; - - g_mutex_lock (&mailbox->priv->update_lock); -- -- while (mailbox->priv->update_is_locked) { -- g_cond_wait (&mailbox->priv->update_cond, &mailbox->priv->update_lock); -- } -- -- mailbox->priv->update_is_locked = TRUE; -- -+ res = mailbox->priv->update_count; - g_mutex_unlock (&mailbox->priv->update_lock); -+ -+ return res; - } - --/* Prevents running FETCH and STORE at the same time for the given mailbox */ - void --camel_imapx_mailbox_unlock_update (CamelIMAPXMailbox *mailbox) -+camel_imapx_mailbox_inc_update_count (CamelIMAPXMailbox *mailbox, -+ gint inc) - { -- g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); -- - g_mutex_lock (&mailbox->priv->update_lock); -+ mailbox->priv->update_count += inc; -+ g_mutex_unlock (&mailbox->priv->update_lock); -+} - -- if (mailbox->priv->update_is_locked) { -- mailbox->priv->update_is_locked = FALSE; -- g_cond_signal (&mailbox->priv->update_cond); -- } -+gint -+camel_imapx_mailbox_get_change_stamp (CamelIMAPXMailbox *mailbox) -+{ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), 0); - -- g_mutex_unlock (&mailbox->priv->update_lock); -+ return mailbox->priv->change_stamp; - } -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.h.imapx-update-to-upstream 2014-11-20 17:14:49.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.h 2016-08-15 14:38:22.157860220 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-mailbox.h - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -@@ -175,9 +175,12 @@ void camel_imapx_mailbox_handle_status_ - (CamelIMAPXMailbox *mailbox, - CamelIMAPXStatusResponse *response); - --void camel_imapx_mailbox_lock_update -+gint camel_imapx_mailbox_get_update_count - (CamelIMAPXMailbox *mailbox); --void camel_imapx_mailbox_unlock_update -+void camel_imapx_mailbox_inc_update_count -+ (CamelIMAPXMailbox *mailbox, -+ gint inc); -+gint camel_imapx_mailbox_get_change_stamp - (CamelIMAPXMailbox *mailbox); - - G_END_DECLS -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace.c.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace.c 2016-08-15 13:52:41.957976330 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-namespace.c - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace.h.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace.h 2016-08-15 13:52:41.957976330 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-namespace.h - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace-response.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace-response.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace-response.c.imapx-update-to-upstream 2014-12-02 16:08:21.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace-response.c 2016-08-15 13:52:41.958976330 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-namespace-response.c - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -@@ -117,7 +117,7 @@ imapx_namespace_response_parse_namespace - } - if (tok != '(') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "namespace: expecting NIL or '('"); - return FALSE; - } -@@ -129,7 +129,7 @@ repeat: - return FALSE; - if (tok != '(') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "namespace: expecting '('"); - return FALSE; - } -@@ -140,7 +140,7 @@ repeat: - return FALSE; - if (tok != IMAPX_TOK_STRING) { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "namespace: expecting string"); - return FALSE; - } -@@ -169,7 +169,7 @@ repeat: - return FALSE; - if (tok != ')') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "namespace: expecting ')'"); - return FALSE; - } -@@ -184,7 +184,7 @@ repeat: - } - if (tok != ')') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "namespace: expecting '(' or ')'"); - return FALSE; - } -@@ -331,7 +331,7 @@ camel_imapx_namespace_response_list (Cam - * Adds a @namespace into the list of namespaces. It adds its own - * reference on the @namespace. - * -- * Since: 3.12.9 -+ * Since: 3.16 - **/ - void - camel_imapx_namespace_response_add (CamelIMAPXNamespaceResponse *response, -@@ -351,7 +351,7 @@ camel_imapx_namespace_response_add (Came - * Removes @namespace from the list of namespaces in the @response. - * If no such namespace exists then does nothing. - * -- * Since: 3.12.9 -+ * Since: 3.16 - **/ - void - camel_imapx_namespace_response_remove (CamelIMAPXNamespaceResponse *response, -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace-response.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace-response.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace-response.h.imapx-update-to-upstream 2014-12-02 16:07:55.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-namespace-response.h 2016-08-15 13:52:41.958976330 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-namespace-response.h - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-provider.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-provider.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-provider.c.imapx-update-to-upstream 2014-05-22 08:45:46.000000000 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-provider.c 2016-08-15 13:52:41.958976330 +0200 -@@ -1,23 +1,23 @@ - /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ --/* camel-pop3-provider.c: pop3 provider registration code */ --/* -- * Authors : -- * Dan Winship -- * Michael Zucchi -+/* camel-pop3-provider.c: pop3 provider registration code - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * -- * This library is free software; you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . -+ * -+ * Authors : -+ * Dan Winship -+ * Michael Zucchi - */ - - #ifdef HAVE_CONFIG_H -@@ -69,16 +69,16 @@ CamelProviderConfEntry imapx_conf_entrie - { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-junk", NULL, - N_("Check new messages for _Junk contents"), "0" }, - { CAMEL_PROVIDER_CONF_CHECKBOX, "filter-junk-inbox", "filter-junk", -- N_("Only check for Junk messages in the IN_BOX folder"), "0" }, -+ N_("Only check for Junk messages in the In_box folder"), "0" }, - { CAMEL_PROVIDER_CONF_CHECKBOX, "stay-synchronized", NULL, -- N_("Automatically synchroni_ze remote mail locally"), "0" }, -+ N_("Synchroni_ze remote mail locally in all folders"), "0" }, - { CAMEL_PROVIDER_CONF_SECTION_END }, - { CAMEL_PROVIDER_CONF_END } - }; - - CamelProviderPortEntry imapx_port_entries[] = { - { 143, N_("Default IMAP port"), FALSE }, -- { 993, N_("IMAP over SSL"), TRUE }, -+ { 993, N_("IMAP over TLS"), TRUE }, - { 0, NULL, 0 } - }; - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-search.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-search.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-search.c.imapx-update-to-upstream 2014-06-06 16:08:31.000000000 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-search.c 2016-08-15 13:52:41.958976330 +0200 -@@ -1,22 +1,27 @@ - /* - * camel-imapx-search.c - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -+#ifdef HAVE_CONFIG_H -+#include -+#endif -+ - #include "camel-imapx-search.h" - -+#include - #include - #include - -@@ -154,7 +159,9 @@ static CamelSExpResult * - imapx_search_process_criteria (CamelSExp *sexp, - CamelFolderSearch *search, - CamelIMAPXStore *imapx_store, -- const GString *criteria, -+ const GString *criteria_prefix, -+ const gchar *search_key, -+ const GPtrArray *words, - const gchar *from_function) - { - CamelSExpResult *result; -@@ -173,33 +180,17 @@ imapx_search_process_criteria (CamelSExp - - if (mailbox != NULL) { - CamelIMAPXStore *imapx_store; -- CamelIMAPXServer *imapx_server; -- const gchar *folder_name; -+ CamelIMAPXConnManager *conn_man; - - imapx_store = camel_imapx_search_ref_store (imapx_search); - - /* there should always be one, held by one of the callers of this function */ - g_warn_if_fail (imapx_store != NULL); - -- folder_name = camel_folder_get_full_name (search->folder); -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, TRUE, imapx_search->priv->cancellable, &local_error); -- if (imapx_server) { -- uids = camel_imapx_server_uid_search (imapx_server, mailbox, criteria->str, imapx_search->priv->cancellable, &local_error); -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- -- while (!uids && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, folder_name, TRUE, imapx_search->priv->cancellable, &local_error); -- if (imapx_server) { -- uids = camel_imapx_server_uid_search (imapx_server, mailbox, criteria->str, imapx_search->priv->cancellable, &local_error); -- camel_imapx_store_folder_op_done (imapx_store, imapx_server, folder_name); -- } -- } -- } -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); -+ uids = camel_imapx_conn_manager_uid_search_sync (conn_man, mailbox, criteria_prefix->str, search_key, -+ words ? (const gchar * const *) words->pdata : NULL, imapx_search->priv->cancellable, &local_error); - -- g_clear_object (&imapx_server); - g_clear_object (&imapx_store); - g_object_unref (mailbox); - } -@@ -296,6 +287,58 @@ imapx_search_match_all (CamelSExp *sexp, - return result; - } - -+static GPtrArray * -+imapx_search_gather_words (CamelSExpResult **argv, -+ gint from_index, -+ gint argc) -+{ -+ GPtrArray *ptrs; -+ GHashTable *words_hash; -+ GHashTableIter iter; -+ gpointer key, value; -+ gint ii, jj; -+ -+ g_return_val_if_fail (argv != 0, NULL); -+ -+ words_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); -+ -+ for (ii = from_index; ii < argc; ii++) { -+ struct _camel_search_words *words; -+ -+ if (argv[ii]->type != CAMEL_SEXP_RES_STRING) -+ continue; -+ -+ /* Handle multiple search words within a single term. */ -+ words = camel_search_words_split ((const guchar *) argv[ii]->value.string); -+ -+ for (jj = 0; jj < words->len; jj++) { -+ const gchar *word = words->words[jj]->word; -+ -+ g_hash_table_insert (words_hash, g_strdup (word), NULL); -+ } -+ -+ camel_search_words_free (words); -+ } -+ -+ ptrs = g_ptr_array_new_full (g_hash_table_size (words_hash), g_free); -+ -+ g_hash_table_iter_init (&iter, words_hash); -+ while (g_hash_table_iter_next (&iter, &key, &value)) { -+ g_ptr_array_add (ptrs, g_strdup (key)); -+ } -+ -+ if (ptrs->len == 0) { -+ g_ptr_array_free (ptrs, TRUE); -+ ptrs = NULL; -+ } else { -+ g_ptr_array_add (ptrs, NULL); -+ } -+ -+ g_hash_table_destroy (words_hash); -+ -+ return ptrs; -+} -+ - static CamelSExpResult * - imapx_search_body_contains (CamelSExp *sexp, - gint argc, -@@ -306,7 +349,7 @@ imapx_search_body_contains (CamelSExp *s - CamelIMAPXStore *imapx_store; - CamelSExpResult *result; - GString *criteria; -- gint ii, jj; -+ GPtrArray *words; - - /* Always do body-search server-side */ - if (imapx_search->priv->local_data_search) { -@@ -343,39 +386,12 @@ imapx_search_body_contains (CamelSExp *s - g_string_append_printf (criteria, "UID %s", uid); - } - -- for (ii = 0; ii < argc; ii++) { -- struct _camel_search_words *words; -- const guchar *term; -- -- if (argv[ii]->type != CAMEL_SEXP_RES_STRING) -- continue; -- -- /* Handle multiple search words within a single term. */ -- term = (const guchar *) argv[ii]->value.string; -- words = camel_search_words_split (term); -- -- for (jj = 0; jj < words->len; jj++) { -- gchar *cp; -- -- if (criteria->len > 0) -- g_string_append_c (criteria, ' '); -- -- g_string_append (criteria, "BODY \""); -- -- cp = words->words[jj]->word; -- for (; *cp != '\0'; cp++) { -- if (*cp == '\\' || *cp == '"') -- g_string_append_c (criteria, '\\'); -- g_string_append_c (criteria, *cp); -- } -- -- g_string_append_c (criteria, '"'); -- } -- } -+ words = imapx_search_gather_words (argv, 0, argc); - -- result = imapx_search_process_criteria (sexp, search, imapx_store, criteria, G_STRFUNC); -+ result = imapx_search_process_criteria (sexp, search, imapx_store, criteria, "BODY", words, G_STRFUNC); - - g_string_free (criteria, TRUE); -+ g_ptr_array_free (words, TRUE); - g_object_unref (imapx_store); - - return result; -@@ -401,7 +417,8 @@ imapx_search_header_contains (CamelSExp - CamelSExpResult *result; - const gchar *headername, *command = NULL; - GString *criteria; -- gint ii, jj; -+ gchar *search_key = NULL; -+ GPtrArray *words; - - /* Match nothing if empty argv or empty summary. */ - if (argc <= 1 || -@@ -458,45 +475,17 @@ imapx_search_header_contains (CamelSExp - else if (g_ascii_strcasecmp (headername, "Subject") == 0) - command = "SUBJECT"; - -- for (ii = 1; ii < argc; ii++) { -- struct _camel_search_words *words; -- const guchar *term; -- -- if (argv[ii]->type != CAMEL_SEXP_RES_STRING) -- continue; -- -- /* Handle multiple search words within a single term. */ -- term = (const guchar *) argv[ii]->value.string; -- words = camel_search_words_split (term); -- -- for (jj = 0; jj < words->len; jj++) { -- gchar *cp; -- -- if (criteria->len > 0) -- g_string_append_c (criteria, ' '); -+ words = imapx_search_gather_words (argv, 1, argc); - -- if (command) -- g_string_append (criteria, command); -- else -- g_string_append_printf (criteria, "HEADER \"%s\"", headername); -- -- g_string_append (criteria, " \""); -- -- cp = words->words[jj]->word; -- for (; *cp != '\0'; cp++) { -- if (*cp == '\\' || *cp == '"') -- g_string_append_c (criteria, '\\'); -- g_string_append_c (criteria, *cp); -- } -- -- g_string_append_c (criteria, '"'); -- } -- } -+ if (!command) -+ search_key = g_strdup_printf ("HEADER \"%s\"", headername); - -- result = imapx_search_process_criteria (sexp, search, imapx_store, criteria, G_STRFUNC); -+ result = imapx_search_process_criteria (sexp, search, imapx_store, criteria, command ? command : search_key, words, G_STRFUNC); - - g_string_free (criteria, TRUE); -+ g_ptr_array_free (words, TRUE); - g_object_unref (imapx_store); -+ g_free (search_key); - - return result; - } -@@ -578,7 +567,7 @@ imapx_search_header_exists (CamelSExp *s - g_string_append_printf (criteria, "HEADER \"%s\" \"\"", headername); - } - -- result = imapx_search_process_criteria (sexp, search, imapx_store, criteria, G_STRFUNC); -+ result = imapx_search_process_criteria (sexp, search, imapx_store, criteria, NULL, NULL, G_STRFUNC); - - g_string_free (criteria, TRUE); - g_object_unref (imapx_store); -@@ -629,7 +618,7 @@ camel_imapx_search_init (CamelIMAPXSearc - - /** - * camel_imapx_search_new: -- * imapx_store: a #CamelIMAPXStore to which the search belongs -+ * @imapx_store: a #CamelIMAPXStore to which the search belongs - * - * Returns a new #CamelIMAPXSearch instance. - * -@@ -716,7 +705,7 @@ camel_imapx_search_set_store (CamelIMAPX - * for the whole run of the search and reset them both to NULL after - * the search is finished. - * -- * Since: 3.14 -+ * Since: 3.16 - **/ - void - camel_imapx_search_set_cancellable_and_error (CamelIMAPXSearch *search, -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-search.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-search.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-search.h.imapx-update-to-upstream 2014-05-22 08:45:46.000000000 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-search.h 2016-08-15 13:52:41.959976330 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-search.h - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c.imapx-update-to-upstream 2016-08-15 13:52:41.893976333 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c 2016-08-15 14:38:22.158860220 +0200 -@@ -2,30 +2,24 @@ - /* - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * -- * This library is free software; you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . -+ * - */ - - #ifdef HAVE_CONFIG_H - #include - #endif - --/* XXX Disable deprecation warnings until we require GLib 2.40. -- * -- * This silences warnings for using GSubprocess functions, which are -- * only available as of GLib 2.39. But we do so conditionally, with -- * GLIB_CHECK_VERSION macros. */ --#define GLIB_DISABLE_DEPRECATION_WARNINGS -- - #include - #include - #include -@@ -35,10 +29,14 @@ - #include - #include - -+#include -+ - #ifndef G_OS_WIN32 - #include - #endif /* G_OS_WIN32 */ - -+#include -+ - #include "camel-imapx-server.h" - - #include "camel-imapx-folder.h" -@@ -57,21 +55,22 @@ - #define c(...) camel_imapx_debug(command, __VA_ARGS__) - #define e(...) camel_imapx_debug(extra, __VA_ARGS__) - --#define QUEUE_LOCK(x) g_rec_mutex_lock (&(x)->queue_lock) --#define QUEUE_UNLOCK(x) g_rec_mutex_unlock (&(x)->queue_lock) -+#define COMMAND_LOCK(x) g_rec_mutex_lock (&(x)->priv->command_lock) -+#define COMMAND_UNLOCK(x) g_rec_mutex_unlock (&(x)->priv->command_lock) - - /* Try pipelining fetch requests, 'in bits' */ - #define MULTI_SIZE (32768 * 8) - --/* How many outstanding commands do we allow before we just queue them? */ --#define MAX_COMMANDS (10) -- - #define MAX_COMMAND_LEN 1000 - - /* Ping the server after a period of inactivity to avoid being logged off. - * Using a 29 minute inactivity timeout as recommended in RFC 2177 (IDLE). */ - #define INACTIVITY_TIMEOUT_SECONDS (29 * 60) - -+/* Number of seconds to remain in PENDING state waiting for other commands -+ to be queued, before actually sending IDLE */ -+#define IMAPX_IDLE_WAIT_SECONDS 2 -+ - #ifdef G_OS_WIN32 - #ifdef gmtime_r - #undef gmtime_r -@@ -83,92 +82,6 @@ - - G_DEFINE_QUARK (camel-imapx-server-error-quark, camel_imapx_server_error) - --extern gint camel_application_is_exiting; -- --/* Job-specific structs */ --typedef struct _GetMessageData GetMessageData; --typedef struct _RefreshInfoData RefreshInfoData; --typedef struct _SyncChangesData SyncChangesData; --typedef struct _AppendMessageData AppendMessageData; --typedef struct _CopyMessagesData CopyMessagesData; --typedef struct _ListData ListData; --typedef struct _MailboxData MailboxData; --typedef struct _SearchData SearchData; -- --struct _GetMessageData { -- /* in: uid requested */ -- gchar *uid; -- CamelDataCache *message_cache; -- /* in/out: message content stream output */ -- GIOStream *stream; -- /* working variables */ -- gsize body_offset; -- gsize fetch_offset; -- gsize size; -- gboolean use_multi_fetch; --}; -- --struct _RefreshInfoData { -- /* array of refresh info's */ -- GArray *infos; -- /* used for building uidset stuff */ -- gint index; -- gint last_index; -- CamelFetchType fetch_type; -- gboolean update_unseen; -- gboolean scan_changes; -- struct _uidset_state uidset; -- /* changes during refresh */ -- CamelFolderChangeInfo *changes; --}; -- --struct _SyncChangesData { -- CamelFolder *folder; -- GPtrArray *changed_uids; -- gboolean own_allocated_changed_uids; -- guint32 on_set; -- guint32 off_set; -- GArray *on_user; /* imapx_flag_change */ -- GArray *off_user; -- gint unread_change; -- -- /* Remove recently set DELETED flags before synchronizing. -- * This is only set when using a real Trash folder and NOT -- * about to expunge the folder. */ -- gboolean remove_deleted_flags; --}; -- --struct _AppendMessageData { -- gchar *path; -- CamelMessageInfo *info; -- gchar *appended_uid; -- time_t date_time; /* message's date/time, in UTC */ --}; -- --struct _CopyMessagesData { -- CamelIMAPXMailbox *destination; -- GPtrArray *uids; -- gboolean delete_originals; -- gboolean use_move_command; -- gint index; -- gint last_index; -- struct _uidset_state uidset; --}; -- --struct _ListData { -- gchar *pattern; --}; -- --struct _MailboxData { -- CamelIMAPXMailbox *mailbox; -- gchar *mailbox_name; --}; -- --struct _SearchData { -- gchar *criteria; -- GArray *results; --}; -- - /* untagged response handling */ - - /* May need to turn this into separate, -@@ -314,29 +227,16 @@ static const CamelIMAPXUntaggedRespHandl - }; - - typedef enum { -- IMAPX_IDLE_OFF, -- IMAPX_IDLE_PENDING, /* Queue is idle; waiting to send IDLE command -- soon if nothing more interesting happens */ -- IMAPX_IDLE_ISSUED, /* Sent IDLE command; waiting for response */ -- IMAPX_IDLE_STARTED, /* IDLE continuation received; IDLE active */ -- IMAPX_IDLE_CANCEL, /* Cancelled from ISSUED state; need to send -- DONE as soon as we receive continuation */ -- IMAPX_IDLE_WAIT_DONE /* DONE was issued, waiting for a confirmation response */ --} CamelIMAPXIdleState; -- --#define IMAPX_IDLE_DWELL_TIME 2 /* Number of seconds to remain in PENDING -- state waiting for other commands to be -- queued, before actually sending IDLE */ -- --typedef enum { -- IMAPX_IDLE_STOP_NOOP, -- IMAPX_IDLE_STOP_WAIT_DONE, -- IMAPX_IDLE_STOP_SUCCESS, -- IMAPX_IDLE_STOP_ERROR --} CamelIMAPXIdleStopResult; -+ IMAPX_IDLE_STATE_OFF, /* no IDLE running at all */ -+ IMAPX_IDLE_STATE_SCHEDULED, /* IDLE scheduled, but still waiting */ -+ IMAPX_IDLE_STATE_PREPARING, /* IDLE command going to be processed */ -+ IMAPX_IDLE_STATE_RUNNING, /* IDLE command had been processed, server responded */ -+ IMAPX_IDLE_STATE_STOPPING /* DONE had been issued, waiting for completion */ -+} IMAPXIdleState; - - struct _CamelIMAPXServerPrivate { - GWeakRef store; -+ GCancellable *cancellable; /* the main connection cancellable, it's cancelled on disconnect */ - - CamelIMAPXServerUntaggedContext *context; - GHashTable *untagged_handlers; -@@ -345,27 +245,19 @@ struct _CamelIMAPXServerPrivate { - GInputStream *input_stream; - GOutputStream *output_stream; - GIOStream *connection; --#if GLIB_CHECK_VERSION(2,39,0) - GSubprocess *subprocess; --#endif - GMutex stream_lock; - -- GThread *parser_thread; -- GMainLoop *parser_main_loop; -- GMainContext *parser_main_context; -- GWeakRef parser_cancellable; -- -- GMutex shutdown_error_lock; -- GError *shutdown_error; -- - GSource *inactivity_timeout; - GMutex inactivity_timeout_lock; - - /* Info on currently selected folder. */ - GMutex select_lock; - GWeakRef select_mailbox; -- GWeakRef select_closing; - GWeakRef select_pending; -+ gint last_selected_mailbox_change_stamp; -+ -+ GMutex changes_lock; - CamelFolderChangeInfo *changes; - - /* Data items to request in STATUS commands: -@@ -392,17 +284,38 @@ struct _CamelIMAPXServerPrivate { - gchar inbox_separator; - - /* IDLE support */ -- GRecMutex idle_lock; -- GThread *idle_thread; -- GMainLoop *idle_main_loop; -- GMainContext *idle_main_context; -+ GMutex idle_lock; -+ GCond idle_cond; -+ IMAPXIdleState idle_state; - GSource *idle_pending; -- CamelIMAPXIdleState idle_state; -+ CamelIMAPXMailbox *idle_mailbox; -+ GCancellable *idle_cancellable; -+ guint idle_stamp; -+ -+ gboolean is_cyrus; -+ -+ /* Info about the current connection; guarded by priv->stream_lock */ -+ struct _capability_info *cinfo; - -- GMutex jobs_prop_lock; -- GHashTable *jobs_prop_folder_paths; -- gint jobs_prop_command_count; /* without IDLE command */ -- gint jobs_prop_expensive_command_count; -+ GRecMutex command_lock; -+ -+ gchar tagprefix; -+ guint32 state; -+ -+ gboolean use_qresync; -+ -+ CamelIMAPXCommand *current_command; -+ CamelIMAPXCommand *continuation_command; -+ -+ /* operation data */ -+ GIOStream *get_message_stream; -+ -+ CamelIMAPXMailbox *fetch_changes_mailbox; /* not referenced */ -+ CamelFolder *fetch_changes_folder; /* not referenced */ -+ GHashTable *fetch_changes_infos; /* gchar *uid ~> FetchChangesInfo-s */ -+ gint64 fetch_changes_last_progress; /* when was called last progress */ -+ -+ struct _status_info *copyuid_status; - }; - - enum { -@@ -411,25 +324,12 @@ enum { - }; - - enum { -- MAILBOX_SELECT, -- MAILBOX_CLOSED, -- SHUTDOWN, -+ REFRESH_MAILBOX, - LAST_SIGNAL - }; - - static guint signals[LAST_SIGNAL]; - --static void imapx_uidset_init (struct _uidset_state *ss, -- gint total, -- gint limit); --static gint imapx_uidset_done (struct _uidset_state *ss, -- CamelIMAPXCommand *ic); --static gint imapx_uidset_add (struct _uidset_state *ss, -- CamelIMAPXCommand *ic, -- const gchar *uid); -- --static gboolean imapx_command_idle_stop (CamelIMAPXServer *is, -- GError **error); - static gboolean imapx_continuation (CamelIMAPXServer *is, - GInputStream *input_stream, - GOutputStream *output_stream, -@@ -437,11 +337,6 @@ static gboolean imapx_continuation (Cam - GCancellable *cancellable, - GError **error); - static void imapx_disconnect (CamelIMAPXServer *is); --static gboolean imapx_is_command_queue_empty (CamelIMAPXServer *is); --static gint imapx_uid_cmp (gconstpointer ap, -- gconstpointer bp, -- gpointer data); --static void imapx_command_start_next (CamelIMAPXServer *is); - - /* states for the connection? */ - enum { -@@ -453,105 +348,64 @@ enum { - IMAPX_SELECTED - }; - --struct _refresh_info { -- gchar *uid; -- gboolean exists; -- guint32 server_flags; -- CamelFlag *server_user_flags; --}; -- --enum { -- IMAPX_JOB_GET_MESSAGE = 1 << 0, -- IMAPX_JOB_APPEND_MESSAGE = 1 << 1, -- IMAPX_JOB_COPY_MESSAGE = 1 << 2, -- IMAPX_JOB_FETCH_NEW_MESSAGES = 1 << 3, -- IMAPX_JOB_REFRESH_INFO = 1 << 4, -- IMAPX_JOB_SYNC_CHANGES = 1 << 5, -- IMAPX_JOB_EXPUNGE = 1 << 6, -- IMAPX_JOB_NOOP = 1 << 7, -- IMAPX_JOB_IDLE = 1 << 8, -- IMAPX_JOB_LIST = 1 << 9, -- IMAPX_JOB_CREATE_MAILBOX = 1 << 10, -- IMAPX_JOB_DELETE_MAILBOX = 1 << 11, -- IMAPX_JOB_RENAME_MAILBOX = 1 << 12, -- IMAPX_JOB_SUBSCRIBE_MAILBOX = 1 << 13, -- IMAPX_JOB_UNSUBSCRIBE_MAILBOX = 1 << 14, -- IMAPX_JOB_UPDATE_QUOTA_INFO = 1 << 15, -- IMAPX_JOB_UID_SEARCH = 1 << 16 --}; -- --/* Mailbox management operations have highest priority -- * since we know for sure that they are user triggered. */ --enum { -- IMAPX_PRIORITY_MAILBOX_MGMT = 200, -- IMAPX_PRIORITY_SYNC_CHANGES = 150, -- IMAPX_PRIORITY_EXPUNGE = 150, -- IMAPX_PRIORITY_SEARCH = 150, -- IMAPX_PRIORITY_GET_MESSAGE = 100, -- IMAPX_PRIORITY_REFRESH_INFO = 0, -- IMAPX_PRIORITY_NOOP = 0, -- IMAPX_PRIORITY_NEW_MESSAGES = 0, -- IMAPX_PRIORITY_APPEND_MESSAGE = -60, -- IMAPX_PRIORITY_COPY_MESSAGE = -60, -- IMAPX_PRIORITY_LIST = -80, -- IMAPX_PRIORITY_IDLE = -100, -- IMAPX_PRIORITY_SYNC_MESSAGE = -120, -- IMAPX_PRIORITY_UPDATE_QUOTA_INFO = -80 --}; -- - struct _imapx_flag_change { - GPtrArray *infos; - gchar *name; - }; - --static CamelIMAPXJob * -- imapx_match_active_job (CamelIMAPXServer *is, -- guint32 type, -- const gchar *uid); --static gboolean imapx_job_fetch_new_messages_start -- (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error); - static gint imapx_refresh_info_uid_cmp (gconstpointer ap, - gconstpointer bp, - gboolean ascending); - static gint imapx_uids_array_cmp (gconstpointer ap, - gconstpointer bp); --static gboolean imapx_server_sync_changes (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- guint32 job_type, -- gint pri, -- GCancellable *cancellable, -- GError **error); - static void imapx_sync_free_user (GArray *user_set); - --static gboolean imapx_command_copy_messages_step_start -- (CamelIMAPXServer *is, -- CamelIMAPXJob *job, -- gint index, -- GError **error); --static gboolean imapx_job_noop_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error); -+G_DEFINE_TYPE (CamelIMAPXServer, camel_imapx_server, G_TYPE_OBJECT) - --static gboolean imapx_in_idle (CamelIMAPXServer *is); --static gboolean imapx_use_idle (CamelIMAPXServer *is); --static void imapx_start_idle (CamelIMAPXServer *is); --static CamelIMAPXIdleStopResult -- imapx_stop_idle (CamelIMAPXServer *is, -- GError **error); --static gboolean camel_imapx_server_idle (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- GCancellable *cancellable, -- GError **error); -+/** -+ * camel_binding_bind_property: -+ * -+ * Thread safe variant of g_object_bind_property(). See its documentation -+ * for more information on arguments and return value. -+ * -+ * Returns: (transfer none): -+ * -+ * Since: 3.16 -+ **/ -+static GBinding * -+camel_binding_bind_property (gpointer source, -+ const gchar *source_property, -+ gpointer target, -+ const gchar *target_property, -+ GBindingFlags flags) -+{ -+ static GRecMutex camel_binding_lock; -+ GBinding *binding; - --static void imapx_maybe_select (CamelIMAPXServer *is, -- CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox); -+ g_rec_mutex_lock (&camel_binding_lock); - --G_DEFINE_TYPE (CamelIMAPXServer, camel_imapx_server, G_TYPE_OBJECT) -+ binding = g_object_bind_property (source, source_property, target, target_property, flags); -+ -+ g_rec_mutex_unlock (&camel_binding_lock); -+ -+ return binding; -+} -+ -+typedef struct _FetchChangesInfo { -+ guint32 server_flags; -+ CamelFlag *server_user_flags; -+} FetchChangesInfo; -+ -+static void -+fetch_changes_info_free (gpointer ptr) -+{ -+ FetchChangesInfo *nfo = ptr; -+ -+ if (nfo) { -+ camel_flag_list_free (&nfo->server_user_flags); -+ g_free (nfo); -+ } -+} - - static GWeakRef * - imapx_weak_ref_new (gpointer object) -@@ -579,169 +433,6 @@ imapx_weak_ref_free (GWeakRef *weak_ref) - g_slice_free (GWeakRef, weak_ref); - } - --static void --imapx_server_set_shutdown_error (CamelIMAPXServer *imapx_server, -- const GError *error) --{ -- g_mutex_lock (&imapx_server->priv->shutdown_error_lock); -- -- if (error != imapx_server->priv->shutdown_error) { -- g_clear_error (&imapx_server->priv->shutdown_error); -- if (error) -- imapx_server->priv->shutdown_error = g_error_copy (error); -- } -- -- g_mutex_unlock (&imapx_server->priv->shutdown_error_lock); --} -- --static GError * --imapx_server_dup_shutdown_error (CamelIMAPXServer *imapx_server) --{ -- GError *error = NULL; -- -- g_mutex_lock (&imapx_server->priv->shutdown_error_lock); -- -- if (imapx_server->priv->shutdown_error) -- error = g_error_copy (imapx_server->priv->shutdown_error); -- -- g_mutex_unlock (&imapx_server->priv->shutdown_error_lock); -- -- return error; --} -- --static void --imapx_server_command_added (CamelIMAPXServer *imapx_server, -- CamelIMAPXCommand *command) --{ -- CamelIMAPXJob *job; -- -- g_return_if_fail (command != NULL); -- -- g_mutex_lock (&imapx_server->priv->jobs_prop_lock); -- -- job = camel_imapx_command_get_job (command); -- -- if (job) { -- /* without IDLE commands */ -- if (!(job->type & IMAPX_JOB_IDLE)) -- imapx_server->priv->jobs_prop_command_count++; -- -- if ((job->type & (IMAPX_JOB_FETCH_NEW_MESSAGES | IMAPX_JOB_REFRESH_INFO)) != 0) -- imapx_server->priv->jobs_prop_expensive_command_count++; -- } -- -- g_mutex_unlock (&imapx_server->priv->jobs_prop_lock); --} -- --static void --imapx_server_command_removed (CamelIMAPXServer *imapx_server, -- CamelIMAPXCommand *command) --{ -- CamelIMAPXJob *job; -- -- g_return_if_fail (command != NULL); -- -- g_mutex_lock (&imapx_server->priv->jobs_prop_lock); -- -- job = camel_imapx_command_get_job (command); -- -- if (job) { -- /* without IDLE commands */ -- if (!(job->type & IMAPX_JOB_IDLE)) { -- imapx_server->priv->jobs_prop_command_count--; -- g_warn_if_fail (imapx_server->priv->jobs_prop_command_count >= 0); -- } -- -- if ((job->type & (IMAPX_JOB_FETCH_NEW_MESSAGES | IMAPX_JOB_REFRESH_INFO)) != 0) { -- imapx_server->priv->jobs_prop_expensive_command_count--; -- g_warn_if_fail (imapx_server->priv->jobs_prop_expensive_command_count >= 0); -- } -- } -- -- g_mutex_unlock (&imapx_server->priv->jobs_prop_lock); --} -- --static void --imapx_server_add_job_mailbox (CamelIMAPXServer *imapx_server, -- CamelIMAPXMailbox *mailbox) --{ -- gchar *folder_path; -- gint n_stored; -- -- g_return_if_fail (mailbox != NULL); -- -- g_mutex_lock (&imapx_server->priv->jobs_prop_lock); -- -- folder_path = camel_imapx_mailbox_dup_folder_path (mailbox); -- -- n_stored = GPOINTER_TO_INT (g_hash_table_lookup (imapx_server->priv->jobs_prop_folder_paths, folder_path)); -- /* takes ownership of folder_path */ -- g_hash_table_insert (imapx_server->priv->jobs_prop_folder_paths, folder_path, GINT_TO_POINTER (n_stored + 1)); -- -- g_mutex_unlock (&imapx_server->priv->jobs_prop_lock); --} -- --static void --imapx_server_remove_job_mailbox (CamelIMAPXServer *imapx_server, -- CamelIMAPXMailbox *mailbox) --{ -- gchar *folder_path; -- gint n_stored; -- -- g_return_if_fail (mailbox != NULL); -- -- g_mutex_lock (&imapx_server->priv->jobs_prop_lock); -- -- folder_path = camel_imapx_mailbox_dup_folder_path (mailbox); -- -- n_stored = GPOINTER_TO_INT (g_hash_table_lookup (imapx_server->priv->jobs_prop_folder_paths, folder_path)); -- if (!camel_imapx_mailbox_is_inbox (camel_imapx_mailbox_get_name (mailbox))) -- g_warn_if_fail (n_stored >= 1); -- -- n_stored--; -- if (n_stored > 0) { -- /* takes ownership of folder_path */ -- g_hash_table_insert (imapx_server->priv->jobs_prop_folder_paths, folder_path, GINT_TO_POINTER (n_stored)); -- } else { -- g_hash_table_remove (imapx_server->priv->jobs_prop_folder_paths, folder_path); -- g_free (folder_path); -- } -- -- g_mutex_unlock (&imapx_server->priv->jobs_prop_lock); --} -- --static void --imapx_server_job_added (CamelIMAPXServer *imapx_server, -- CamelIMAPXJob *job) --{ -- CamelIMAPXMailbox *mailbox; -- -- g_return_if_fail (job != NULL); -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- -- if (mailbox != NULL) { -- imapx_server_add_job_mailbox (imapx_server, mailbox); -- g_object_unref (mailbox); -- } --} -- --static void --imapx_server_job_removed (CamelIMAPXServer *imapx_server, -- CamelIMAPXJob *job) --{ -- CamelIMAPXMailbox *mailbox; -- -- g_return_if_fail (job != NULL); -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- -- if (mailbox != NULL) { -- imapx_server_remove_job_mailbox (imapx_server, mailbox); -- g_object_unref (mailbox); -- } --} -- - static const CamelIMAPXUntaggedRespHandlerDesc * - replace_untagged_descriptor (GHashTable *untagged_handlers, - const gchar *key, -@@ -799,125 +490,19 @@ create_initial_untagged_handler_table (v - return uh; - } - --static void --get_message_data_free (GetMessageData *data) --{ -- g_free (data->uid); -- -- g_clear_object (&data->message_cache); -- g_clear_object (&data->stream); -- -- g_slice_free (GetMessageData, data); --} -- --static void --refresh_info_data_infos_free (RefreshInfoData *data) --{ -- gint ii; -- -- if (!data || !data->infos) -- return; -- -- for (ii = 0; ii < data->infos->len; ii++) { -- struct _refresh_info *r = &g_array_index (data->infos, struct _refresh_info, ii); -- -- camel_flag_list_free (&r->server_user_flags); -- g_free (r->uid); -- } -- -- g_array_free (data->infos, TRUE); -- data->infos = NULL; --} -- --static void --refresh_info_data_free (RefreshInfoData *data) --{ -- if (data->changes != NULL) -- camel_folder_change_info_free (data->changes); -- -- refresh_info_data_infos_free (data); -- -- g_slice_free (RefreshInfoData, data); --} -- --static void --sync_changes_data_free (SyncChangesData *data) --{ -- if (data->folder != NULL) { -- if (!data->own_allocated_changed_uids) -- camel_folder_free_uids (data->folder, data->changed_uids); -- g_object_unref (data->folder); -- } -- -- if (data->own_allocated_changed_uids && data->changed_uids) { -- g_ptr_array_foreach (data->changed_uids, (GFunc) camel_pstring_free, NULL); -- g_ptr_array_free (data->changed_uids, TRUE); -- } -- -- imapx_sync_free_user (data->on_user); -- imapx_sync_free_user (data->off_user); -- -- g_slice_free (SyncChangesData, data); --} -- --static void --append_message_data_free (AppendMessageData *data) --{ -- g_free (data->path); -- g_free (data->appended_uid); -- -- camel_message_info_unref (data->info); -- -- g_slice_free (AppendMessageData, data); --} -- --static void --copy_messages_data_free (CopyMessagesData *data) --{ -- g_clear_object (&data->destination); -- -- if (data->uids != NULL) { -- g_ptr_array_foreach (data->uids, (GFunc) g_free, NULL); -- g_ptr_array_free (data->uids, TRUE); -- } -- -- g_slice_free (CopyMessagesData, data); --} -- --static void --list_data_free (ListData *data) --{ -- g_free (data->pattern); -- -- g_slice_free (ListData, data); --} -- --static void --mailbox_data_free (MailboxData *data) --{ -- g_clear_object (&data->mailbox); -- g_free (data->mailbox_name); -- -- g_slice_free (MailboxData, data); --} -- --static void --search_data_free (SearchData *data) --{ -- g_free (data->criteria); -- -- if (data->results != NULL) -- g_array_unref (data->results); -- -- g_slice_free (SearchData, data); --} -+struct _uidset_state { -+ gint entries, uids; -+ gint total, limit; -+ guint32 start; -+ guint32 last; -+}; - - /* - this creates a uid (or sequence number) set directly into a command, - if total is set, then we break it up into total uids. (i.e. command time) - if limit is set, then we break it up into limit entries (i.e. command length) - */ --void -+static void - imapx_uidset_init (struct _uidset_state *ss, - gint total, - gint limit) -@@ -930,14 +515,19 @@ imapx_uidset_init (struct _uidset_state - ss->limit = limit; - } - --gboolean -+static gboolean - imapx_uidset_done (struct _uidset_state *ss, - CamelIMAPXCommand *ic) - { - gint ret = FALSE; - -- if (ss->last != 0 && ss->last != ss->start) { -- camel_imapx_command_add (ic, ":%d", ss->last); -+ if (ss->last != 0) { -+ if (ss->entries > 0) -+ camel_imapx_command_add (ic, ","); -+ if (ss->last == ss->start) -+ camel_imapx_command_add (ic, "%d", ss->last); -+ else -+ camel_imapx_command_add (ic, "%d:%d", ss->start, ss->last); - } - - ret = ss->last != 0; -@@ -950,7 +540,7 @@ imapx_uidset_done (struct _uidset_state - return ret; - } - --gint -+static gint - imapx_uidset_add (struct _uidset_state *ss, - CamelIMAPXCommand *ic, - const gchar *uid) -@@ -963,33 +553,41 @@ imapx_uidset_add (struct _uidset_state * - - ss->uids++; - -- e (ic->is->tagprefix, "uidset add '%s'\n", uid); -+ e (ic->is->priv->tagprefix, "uidset add '%s'\n", uid); - - if (ss->last == 0) { -- e (ic->is->tagprefix, " start\n"); -- camel_imapx_command_add (ic, "%d", uidn); -- ss->entries++; -+ e (ic->is->priv->tagprefix, " start\n"); - ss->start = uidn; -+ ss->last = uidn; - } else { -- if (ss->last != uidn - 1) { -- if (ss->last == ss->start) { -- e (ic->is->tagprefix, " ,next\n"); -- camel_imapx_command_add (ic, ",%d", uidn); -- ss->entries++; -- } else { -- e (ic->is->tagprefix, " :range\n"); -- camel_imapx_command_add (ic, ":%d,%d", ss->last, uidn); -- ss->entries+=2; -- } -+ if (ss->start - 1 == uidn) { - ss->start = uidn; -+ } else { -+ if (ss->last != uidn - 1) { -+ if (ss->last == ss->start) { -+ e (ic->is->priv->tagprefix, " ,next\n"); -+ if (ss->entries > 0) -+ camel_imapx_command_add (ic, ","); -+ camel_imapx_command_add (ic, "%d", ss->start); -+ ss->entries++; -+ } else { -+ e (ic->is->priv->tagprefix, " :range\n"); -+ if (ss->entries > 0) -+ camel_imapx_command_add (ic, ","); -+ camel_imapx_command_add (ic, "%d:%d", ss->start, ss->last); -+ ss->entries += 2; -+ } -+ ss->start = uidn; -+ } -+ -+ ss->last = uidn; - } - } - -- ss->last = uidn; -- - if ((ss->limit && ss->entries >= ss->limit) -+ || (ss->limit && ss->uids >= ss->limit) - || (ss->total && ss->uids >= ss->total)) { -- e (ic->is->tagprefix, " done, %d entries, %d uids\n", ss->entries, ss->uids); -+ e (ic->is->priv->tagprefix, " done, %d entries, %d uids\n", ss->entries, ss->uids); - if (!imapx_uidset_done (ss, ic)) - return -1; - return 1; -@@ -998,74 +596,9 @@ imapx_uidset_add (struct _uidset_state * - return 0; - } - --static gboolean --imapx_register_job (CamelIMAPXServer *is, -- CamelIMAPXJob *job, -- GError **error) --{ -- if (is->state >= IMAPX_INITIALISED) { -- QUEUE_LOCK (is); -- g_queue_push_head (&is->jobs, camel_imapx_job_ref (job)); -- imapx_server_job_added (is, job); -- QUEUE_UNLOCK (is); -- -- } else if (is->state <= IMAPX_SHUTDOWN) { -- e (is->tagprefix, "Server is shutdown/disconnected, try reconnect."); -- g_set_error (error, -- CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT, -- _("Not authenticated")); -- return FALSE; -- } else { -- e (is->tagprefix, "Not connected yet, maybe user cancelled jobs earlier?"); -- g_set_error ( -- error, CAMEL_SERVICE_ERROR, -- CAMEL_SERVICE_ERROR_NOT_CONNECTED, -- _("Not authenticated")); -- return FALSE; -- } -- -- return TRUE; --} -- --static void --imapx_unregister_job (CamelIMAPXServer *is, -- CamelIMAPXJob *job) --{ -- camel_imapx_job_done (job); -- -- QUEUE_LOCK (is); -- -- if (g_queue_remove (&is->jobs, job)) { -- imapx_server_job_removed (is, job); -- camel_imapx_job_unref (job); -- } -- -- imapx_command_start_next (is); -- -- QUEUE_UNLOCK (is); --} -- --static gboolean --imapx_submit_job (CamelIMAPXServer *is, -- CamelIMAPXJob *job, -- GError **error) --{ -- gboolean success; -- -- if (!imapx_register_job (is, job, error)) -- return FALSE; -- -- success = camel_imapx_job_run (job, is, error); -- -- if (!success) -- imapx_unregister_job (is, job); -- -- return success; --} -- --static CamelFolder * --imapx_server_ref_folder (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox) -+static CamelFolder * -+imapx_server_ref_folder (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox) - { - CamelFolder *folder; - CamelIMAPXStore *store; -@@ -1106,19 +639,19 @@ imapx_server_stash_command_arguments (Ca - /* Stash some reusable capability-based command arguments. */ - - buffer = g_string_new ("MESSAGES UNSEEN UIDVALIDITY UIDNEXT"); -- if (CAMEL_IMAPX_HAVE_CAPABILITY (is->cinfo, CONDSTORE)) -+ if (CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, CONDSTORE)) - g_string_append (buffer, " HIGHESTMODSEQ"); - g_free (is->priv->status_data_items); - is->priv->status_data_items = g_string_free (buffer, FALSE); - - g_free (is->priv->list_return_opts); -- if (CAMEL_IMAPX_HAVE_CAPABILITY (is->cinfo, LIST_EXTENDED)) { -+ if (!is->priv->is_cyrus && CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, LIST_EXTENDED)) { - buffer = g_string_new ("CHILDREN SUBSCRIBED"); -- if (CAMEL_IMAPX_HAVE_CAPABILITY (is->cinfo, LIST_STATUS)) -+ if (CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, LIST_STATUS)) - g_string_append_printf ( - buffer, " STATUS (%s)", - is->priv->status_data_items); -- if (CAMEL_IMAPX_HAVE_CAPABILITY (is->cinfo, SPECIAL_USE)) -+ if (CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, SPECIAL_USE)) - g_string_append_printf (buffer, " SPECIAL-USE"); - is->priv->list_return_opts = g_string_free (buffer, FALSE); - } else { -@@ -1126,73 +659,57 @@ imapx_server_stash_command_arguments (Ca - } - } - --static gboolean --imapx_server_inactivity_timeout_cb (gpointer data) -+static gpointer -+imapx_server_inactivity_thread (gpointer user_data) - { -- CamelIMAPXServer *is; -- gboolean result = G_SOURCE_REMOVE; -- -- is = g_weak_ref_get (data); -- -- if (is == NULL) -- return result; -- -- /* IDLE command may still be active, and any other active -- * commands would have reset this timeout. So just check -- * for any queued-but-not-yet-active commands. */ -- -- if (!camel_imapx_command_queue_is_empty (is->queue)) { -- /* Do nothing. */ -+ CamelIMAPXServer *is = user_data; -+ GError *local_error = NULL; - -- } else if (imapx_in_idle (is)) { -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); - -+ if (camel_imapx_server_is_in_idle (is)) { - /* Stop and restart the IDLE command. */ -- switch (imapx_stop_idle (is, NULL)) { -- case IMAPX_IDLE_STOP_SUCCESS: -- imapx_start_idle (is); -- result = G_SOURCE_CONTINUE; -- break; -- -- case IMAPX_IDLE_STOP_WAIT_DONE: -- case IMAPX_IDLE_STOP_NOOP: -- result = G_SOURCE_CONTINUE; -- break; -- -- default: -- break; -- } -- -+ if (!camel_imapx_server_schedule_idle_sync (is, NULL, is->priv->cancellable, &local_error) && -+ !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) -+ camel_imapx_debug (io, camel_imapx_server_get_tagprefix (is), -+ "%s: Failed to restart IDLE: %s\n", G_STRFUNC, local_error ? local_error->message : "Unknown error"); - } else { -- CamelIMAPXJob *job; -- GCancellable *cancellable; -- GError *local_error = NULL; -- -- /* Submit a NOOP job but indicate we don't need a -- * reply when finished. So this should NOT block. */ -+ if (!camel_imapx_server_noop_sync (is, NULL, is->priv->cancellable, &local_error) && -+ !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) -+ camel_imapx_debug (io, camel_imapx_server_get_tagprefix (is), -+ "%s: Failed to issue NOOP: %s\n", G_STRFUNC, local_error ? local_error->message : "Unknown error"); -+ } - -- cancellable = g_weak_ref_get (&is->priv->parser_cancellable); -+ g_clear_error (&local_error); -+ g_object_unref (is); - -- job = camel_imapx_job_new (cancellable); -- job->type = IMAPX_JOB_NOOP; -- job->start = imapx_job_noop_start; -- job->pri = IMAPX_PRIORITY_NOOP; -- job->noreply = TRUE; -+ return NULL; -+} - -- imapx_submit_job (is, job, &local_error); -+static gboolean -+imapx_server_inactivity_timeout_cb (gpointer data) -+{ -+ CamelIMAPXServer *is; -+ GThread *thread; -+ GError *local_error = NULL; - -- if (local_error != NULL) { -- g_warning ("%s: %s", G_STRFUNC, local_error->message); -- g_error_free (local_error); -- } -+ is = g_weak_ref_get (data); - -- camel_imapx_job_unref (job); -+ if (is == NULL) -+ return G_SOURCE_REMOVE; - -- g_clear_object (&cancellable); -+ thread = g_thread_try_new (NULL, imapx_server_inactivity_thread, g_object_ref (is), &local_error); -+ if (!thread) { -+ g_warning ("%s: Failed to start inactivity thread: %s", G_STRFUNC, local_error ? local_error->message : "Unknown error"); -+ g_object_unref (is); -+ } else { -+ g_thread_unref (thread); - } - -+ g_clear_error (&local_error); - g_object_unref (is); - -- return result; -+ return G_SOURCE_REMOVE; - } - - static void -@@ -1212,9 +729,7 @@ imapx_server_reset_inactivity_timer (Cam - imapx_server_inactivity_timeout_cb, - imapx_weak_ref_new (is), - (GDestroyNotify) imapx_weak_ref_free); -- g_source_attach ( -- is->priv->inactivity_timeout, -- is->priv->parser_main_context); -+ g_source_attach (is->priv->inactivity_timeout, NULL); - - g_mutex_unlock (&is->priv->inactivity_timeout_lock); - } -@@ -1226,8 +741,21 @@ imapx_server_set_connection_timeout (GIO - GSocket *socket; - gint previous_timeout = -1; - -- if (!G_IS_SOCKET_CONNECTION (connection)) -+ if (G_IS_TLS_CONNECTION (connection)) { -+ GIOStream *base_io_stream = NULL; -+ -+ g_object_get (G_OBJECT (connection), "base-io-stream", &base_io_stream, NULL); -+ -+ connection = base_io_stream; -+ } else if (connection) { -+ /* Connection can be NULL, when a custom command (GSubProcess) is used instead */ -+ g_object_ref (connection); -+ } -+ -+ if (!G_IS_SOCKET_CONNECTION (connection)) { -+ g_clear_object (&connection); - return previous_timeout; -+ } - - socket = g_socket_connection_get_socket (G_SOCKET_CONNECTION (connection)); - if (socket) { -@@ -1235,758 +763,170 @@ imapx_server_set_connection_timeout (GIO - g_socket_set_timeout (socket, timeout_seconds); - } - -+ g_clear_object (&connection); -+ - return previous_timeout; - } - --/* Must hold QUEUE_LOCK */ - static void --imapx_command_start (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) -+imapx_expunge_uid_from_summary (CamelIMAPXServer *is, -+ const gchar *uid, -+ gboolean unsolicited) - { -- CamelIMAPXCommandPart *cp; -- CamelIMAPXJob *job; -- GInputStream *input_stream = NULL; -- GOutputStream *output_stream = NULL; -- GCancellable *cancellable = NULL; -- gboolean cp_continuation; -- gboolean cp_literal_plus; -- gboolean success; -- GList *head; -- gchar *string; -- GError *local_error = NULL; -- -- camel_imapx_command_close (ic); -- -- head = g_queue_peek_head_link (&ic->parts); -- g_return_if_fail (head != NULL); -- cp = (CamelIMAPXCommandPart *) head->data; -- ic->current_part = head; -- -- cp_continuation = ((cp->type & CAMEL_IMAPX_COMMAND_CONTINUATION) != 0); -- cp_literal_plus = ((cp->type & CAMEL_IMAPX_COMMAND_LITERAL_PLUS) != 0); -- -- /* TODO: If we support literal+ we should be able to write the whole command out -- * at this point .... >here< */ -+ CamelFolder *folder; -+ CamelIMAPXMailbox *mailbox; -+ guint32 messages; - -- if (cp_continuation || cp_literal_plus) -- is->literal = ic; -+ mailbox = camel_imapx_server_ref_pending_or_selected (is); - -- camel_imapx_command_queue_push_tail (is->active, ic); -- imapx_server_command_added (is, ic); -+ g_return_if_fail (mailbox != NULL); - -- job = camel_imapx_command_get_job (ic); -- if (job && g_cancellable_set_error_if_cancelled (camel_imapx_job_get_cancellable (job), &local_error)) { -- camel_imapx_job_take_error (job, local_error); -- local_error = NULL; -+ folder = imapx_server_ref_folder (is, mailbox); -+ g_return_if_fail (folder != NULL); - -- camel_imapx_command_queue_remove (is->active, ic); -- imapx_server_command_removed (is, ic); -+ messages = camel_imapx_mailbox_get_messages (mailbox); - -- if (ic->complete != NULL) -- ic->complete (is, ic); -+ if (unsolicited && messages > 0) -+ camel_imapx_mailbox_set_messages (mailbox, messages - 1); - -- if (is->literal == ic) -- is->literal = NULL; -+ g_return_if_fail (is->priv->changes != NULL); - -- goto exit; -- } -+ camel_folder_summary_remove_uid (folder->summary, uid); - -+ g_mutex_lock (&is->priv->changes_lock); - -- input_stream = camel_imapx_server_ref_input_stream (is); -- output_stream = camel_imapx_server_ref_output_stream (is); -- cancellable = g_weak_ref_get (&is->priv->parser_cancellable); -+ camel_folder_change_info_remove_uid (is->priv->changes, uid); - -- if (output_stream == NULL) { -- local_error = g_error_new_literal ( -- CAMEL_IMAPX_ERROR, 1, -- "Cannot issue command, no stream available"); -- goto fail; -- } -+ if (camel_imapx_server_is_in_idle (is)) { -+ CamelFolderChangeInfo *changes; - -- c ( -- is->tagprefix, -- "Starting command (active=%d,%s) %c%05u %s\r\n", -- camel_imapx_command_queue_get_length (is->active), -- is->literal ? " literal" : "", -- is->tagprefix, -- ic->tag, -- cp->data && g_str_has_prefix (cp->data, "LOGIN") ? -- "LOGIN..." : cp->data); -+ changes = is->priv->changes; -+ is->priv->changes = camel_folder_change_info_new (); - -- string = g_strdup_printf ( -- "%c%05u %s\r\n", is->tagprefix, ic->tag, cp->data); -- g_mutex_lock (&is->priv->stream_lock); -- success = g_output_stream_write_all ( -- output_stream, string, strlen (string), -- NULL, cancellable, &local_error); -- g_mutex_unlock (&is->priv->stream_lock); -- g_free (string); -+ g_mutex_unlock (&is->priv->changes_lock); - -- if (local_error != NULL || !success) -- goto fail; -+ camel_folder_summary_save_to_db (folder->summary, NULL); -+ imapx_update_store_summary (folder); -+ camel_folder_changed (folder, changes); - -- while (is->literal == ic && cp_literal_plus) { -- /* Sent LITERAL+ continuation immediately */ -- imapx_continuation ( -- is, input_stream, output_stream, -- TRUE, cancellable, &local_error); -- if (local_error != NULL) -- goto fail; -+ camel_folder_change_info_free (changes); -+ } else { -+ g_mutex_unlock (&is->priv->changes_lock); - } - -- imapx_server_reset_inactivity_timer (is); -+ g_object_unref (folder); -+ g_object_unref (mailbox); -+} - -- goto exit; -+/* untagged response handler functions */ - --fail: -- camel_imapx_command_queue_remove (is->active, ic); -- imapx_server_command_removed (is, ic); -- -- /* Break the parser thread out of its loop so it disconnects. */ -- g_main_loop_quit (is->priv->parser_main_loop); -- g_cancellable_cancel (cancellable); -+static gboolean -+imapx_untagged_capability (CamelIMAPXServer *is, -+ GInputStream *input_stream, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ struct _capability_info *cinfo; - -- /* Hand the error off to the command that we failed to start. */ -- camel_imapx_command_failed (ic, local_error); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); - -- if (ic->complete != NULL) -- ic->complete (is, ic); -+ g_mutex_lock (&is->priv->stream_lock); - -- g_clear_error (&local_error); -+ if (is->priv->cinfo != NULL) { -+ imapx_free_capability (is->priv->cinfo); -+ is->priv->cinfo = NULL; -+ } - --exit: -- g_clear_object (&input_stream); -- g_clear_object (&output_stream); -- g_clear_object (&cancellable); --} -+ g_mutex_unlock (&is->priv->stream_lock); - --static gboolean --imapx_is_duplicate_fetch_or_refresh (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- guint32 job_types; -+ cinfo = imapx_parse_capability (CAMEL_IMAPX_INPUT_STREAM (input_stream), cancellable, error); - -- /* Job types to match. */ -- job_types = -- IMAPX_JOB_FETCH_NEW_MESSAGES | -- IMAPX_JOB_REFRESH_INFO; -+ if (!cinfo) -+ return FALSE; - -- job = camel_imapx_command_get_job (ic); -+ g_mutex_lock (&is->priv->stream_lock); - -- if (job == NULL) -- return FALSE; -+ if (is->priv->cinfo != NULL) -+ imapx_free_capability (is->priv->cinfo); -+ is->priv->cinfo = cinfo; - -- if ((job->type & job_types) == 0) -- return FALSE; -+ c (is->priv->tagprefix, "got capability flags %08x\n", is->priv->cinfo->capa); - -- if (imapx_match_active_job (is, job_types, NULL) == NULL) -- return FALSE; -+ imapx_server_stash_command_arguments (is); - -- c (is->tagprefix, "Not yet sending duplicate fetch/refresh %s command\n", ic->name); -+ g_mutex_unlock (&is->priv->stream_lock); - - return TRUE; - } - --/* See if we can start another task yet. -- * -- * If we're waiting for a literal, we cannot proceed. -- * -- * If we're about to change the folder we're -- * looking at from user-direction, we dont proceed. -- * -- * If we have a folder selected, first see if any -- * jobs are waiting on it, but only if they are -- * at least as high priority as anything we -- * have running. -- * -- * If we dont, select the first folder required, -- * then queue all the outstanding jobs on it, that -- * are at least as high priority as the first. -- * -- * must have QUEUE lock */ -- --static void --imapx_command_start_next (CamelIMAPXServer *is) -+static gboolean -+imapx_untagged_expunge (CamelIMAPXServer *is, -+ GInputStream *input_stream, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelIMAPXCommand *first_ic; - CamelIMAPXMailbox *mailbox; -- gint min_pri = -128; -- -- c (is->tagprefix, "** Starting next command\n"); -- if (is->literal) { -- c ( -- is->tagprefix, -- "* no; waiting for literal '%s'\n", -- is->literal->name); -- return; -- } -- -- g_mutex_lock (&is->priv->select_lock); -- mailbox = g_weak_ref_get (&is->priv->select_pending); -- g_mutex_unlock (&is->priv->select_lock); -- if (mailbox != NULL) { -- CamelIMAPXCommand *start_ic = NULL; -- GList *head, *link; -- -- c ( -- is->tagprefix, -- "-- Checking job queue for non-mailbox jobs\n"); -- -- head = camel_imapx_command_queue_peek_head_link (is->queue); -+ gulong expunge = 0; - -- /* Tag which commands in the queue to start. */ -- for (link = head; link != NULL && !start_ic; link = g_list_next (link)) { -- CamelIMAPXCommand *ic = link->data; -- CamelIMAPXMailbox *ic_mailbox; -- -- if (ic->pri < min_pri) -- break; -- -- c ( -- is->tagprefix, -- "-- %3d '%s'?\n", -- (gint) ic->pri, ic->name); -- -- ic_mailbox = camel_imapx_command_ref_mailbox (ic); -- -- if (ic_mailbox == NULL) { -- c ( -- is->tagprefix, -- "--> starting '%s'\n", -- ic->name); -- min_pri = ic->pri; -- -- /* Each command must be removed from 'is->queue' before -- * starting it, so we temporarily reference the command -- * to avoid accidentally finalizing it. */ -- start_ic = camel_imapx_command_ref (ic); -- } -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); - -- g_clear_object (&ic_mailbox); -- } -+ expunge = is->priv->context->id; - -- if (!start_ic) -- c ( -- is->tagprefix, -- "* no, waiting for pending select '%s'\n", -- camel_imapx_mailbox_get_name (mailbox)); -- -- /* Start the tagged command */ -- if (start_ic) { -- camel_imapx_command_queue_remove (is->queue, start_ic); -- imapx_server_command_removed (is, start_ic); -- imapx_command_start (is, start_ic); -- camel_imapx_command_unref (start_ic); -- } -+ COMMAND_LOCK (is); - -- g_clear_object (&mailbox); -+ /* Ignore EXPUNGE responses when not running a COPY(MOVE)_MESSAGE job */ -+ if (!is->priv->current_command || (is->priv->current_command->job_kind != CAMEL_IMAPX_JOB_COPY_MESSAGE && -+ is->priv->current_command->job_kind != CAMEL_IMAPX_JOB_MOVE_MESSAGE)) { -+ COMMAND_UNLOCK (is); - -- return; -+ c (is->priv->tagprefix, "ignoring untagged expunge: %lu\n", expunge); -+ return TRUE; - } - -- if (is->state == IMAPX_SELECTED) { -- gboolean stop_idle; -- gboolean start_idle; -- -- stop_idle = -- imapx_in_idle (is) && -- !camel_imapx_command_queue_is_empty (is->queue); -- -- start_idle = -- imapx_use_idle (is) && -- !imapx_in_idle (is) && -- imapx_is_command_queue_empty (is); -- -- if (stop_idle) { -- switch (imapx_stop_idle (is, NULL)) { -- /* Proceed with the next queued command. */ -- case IMAPX_IDLE_STOP_NOOP: -- break; -- -- case IMAPX_IDLE_STOP_WAIT_DONE: -- case IMAPX_IDLE_STOP_SUCCESS: -- c ( -- is->tagprefix, -- "waiting for idle to stop \n"); -- /* if there are more pending commands, -- * then they should be processed too */ -- return; -+ COMMAND_UNLOCK (is); - -- case IMAPX_IDLE_STOP_ERROR: -- return; -- } -- -- } else if (start_idle) { -- imapx_start_idle (is); -- c (is->tagprefix, "starting idle \n"); -- return; -- } -- } -+ c (is->priv->tagprefix, "expunged: %lu\n", expunge); - -- if (camel_imapx_command_queue_is_empty (is->queue)) { -- c (is->tagprefix, "* no, no jobs\n"); -- return; -- } -+ mailbox = camel_imapx_server_ref_pending_or_selected (is); - -- /* See if any queued jobs on this select first */ -- g_mutex_lock (&is->priv->select_lock); -- mailbox = g_weak_ref_get (&is->priv->select_mailbox); -- g_mutex_unlock (&is->priv->select_lock); - if (mailbox != NULL) { -- CamelIMAPXCommand *start_ic = NULL; -- GList *head, *link; -+ CamelFolder *folder; -+ gchar *uid; - -- c ( -- is->tagprefix, -- "- we're selected on '%s', current jobs?\n", -- camel_imapx_mailbox_get_name (mailbox)); -+ folder = imapx_server_ref_folder (is, mailbox); -+ g_return_val_if_fail (folder != NULL, FALSE); - -- head = camel_imapx_command_queue_peek_head_link (is->active); -+ uid = camel_imapx_dup_uid_from_summary_index (folder, expunge - 1); - -- /* Find the highest priority in the active queue. */ -- for (link = head; link != NULL; link = g_list_next (link)) { -- CamelIMAPXCommand *ic = link->data; -+ if (uid != NULL) -+ imapx_expunge_uid_from_summary (is, uid, TRUE); - -- min_pri = MAX (min_pri, ic->pri); -- c ( -- is->tagprefix, -- "- %3d '%s'\n", -- (gint) ic->pri, ic->name); -- } -+ g_object_unref (folder); -+ g_free (uid); -+ } - -- if (camel_imapx_command_queue_get_length (is->active) >= MAX_COMMANDS) { -- c ( -- is->tagprefix, -- "** too many jobs busy, " -- "waiting for results for now\n"); -- g_object_unref (mailbox); -- return; -- } -+ g_clear_object (&mailbox); - -- c (is->tagprefix, "-- Checking job queue\n"); -+ return TRUE; -+} - -- head = camel_imapx_command_queue_peek_head_link (is->queue); -+static gboolean -+imapx_untagged_vanished (CamelIMAPXServer *is, -+ GInputStream *input_stream, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelFolder *folder; -+ CamelIMAPXMailbox *mailbox; -+ GArray *uids; -+ GList *uid_list = NULL; -+ gboolean unsolicited = TRUE; -+ guint ii = 0; -+ guint len = 0; -+ guchar *token = NULL; -+ gint tok = 0; - -- /* Tag which commands in the queue to start. */ -- for (link = head; link != NULL && !start_ic; link = g_list_next (link)) { -- CamelIMAPXCommand *ic = link->data; -- CamelIMAPXMailbox *ic_mailbox; -- gboolean okay_to_start; -- -- if (is->literal != NULL) -- break; -- -- if (ic->pri < min_pri) -- break; -- -- c ( -- is->tagprefix, -- "-- %3d '%s'?\n", -- (gint) ic->pri, ic->name); -- -- ic_mailbox = camel_imapx_command_ref_mailbox (ic); -- -- okay_to_start = -- (ic_mailbox == NULL) || -- (ic_mailbox == mailbox && -- !imapx_is_duplicate_fetch_or_refresh (is, ic)); -- -- if (okay_to_start) { -- c ( -- is->tagprefix, -- "--> starting '%s'\n", -- ic->name); -- min_pri = ic->pri; -- /* Each command must be removed from 'is->queue' before -- * starting it, so we temporarily reference the command -- * to avoid accidentally finalizing it. */ -- start_ic = camel_imapx_command_ref (ic); -- } else { -- /* This job isn't for the selected mailbox, -- * but we don't want to consider jobs with -- * lower priority than this, even if they -- * are for the selected mailbox. */ -- min_pri = ic->pri; -- } -- -- g_clear_object (&ic_mailbox); -- } -- -- g_clear_object (&mailbox); -- -- /* Start the tagged command */ -- if (start_ic) { -- camel_imapx_command_queue_remove (is->queue, start_ic); -- imapx_server_command_removed (is, start_ic); -- imapx_command_start (is, start_ic); -- camel_imapx_command_unref (start_ic); -- -- return; -- } -- } -- -- /* This won't be NULL because we checked for an empty queue above. */ -- first_ic = camel_imapx_command_queue_peek_head (is->queue); -- -- /* If we need to select a mailbox for the first command, do -- * so now. It will re-call us if it completes successfully. */ -- mailbox = camel_imapx_command_ref_mailbox (first_ic); -- if (mailbox != NULL) { -- CamelIMAPXJob *job; -- -- c ( -- is->tagprefix, -- "Selecting mailbox '%s' for command '%s'(%p)\n", -- camel_imapx_mailbox_get_name (mailbox), -- first_ic->name, first_ic); -- -- /* Associate the SELECT command with the CamelIMAPXJob -- * that triggered it. Then if the SELECT command fails -- * we have some destination to propagate the GError to. */ -- job = camel_imapx_command_get_job (first_ic); -- imapx_maybe_select (is, job, mailbox); -- -- g_clear_object (&mailbox); -- -- } else { -- CamelIMAPXCommand *start_ic = NULL; -- GList *head, *link; -- -- min_pri = first_ic->pri; -- -- g_mutex_lock (&is->priv->select_lock); -- mailbox = g_weak_ref_get (&is->priv->select_mailbox); -- g_mutex_unlock (&is->priv->select_lock); -- -- head = camel_imapx_command_queue_peek_head_link (is->queue); -- -- /* Tag which commands in the queue to start. */ -- for (link = head; link != NULL && !start_ic; link = g_list_next (link)) { -- CamelIMAPXCommand *ic = link->data; -- CamelIMAPXMailbox *ic_mailbox; -- gboolean okay_to_start; -- -- if (is->literal != NULL) -- break; -- -- if (ic->pri < min_pri) -- break; -- -- ic_mailbox = camel_imapx_command_ref_mailbox (ic); -- -- okay_to_start = -- (ic_mailbox == NULL) || -- (ic_mailbox == mailbox && -- !imapx_is_duplicate_fetch_or_refresh (is, ic)); -- -- if (okay_to_start) { -- c ( -- is->tagprefix, -- "* queueing job %3d '%s'\n", -- (gint) ic->pri, ic->name); -- min_pri = ic->pri; -- /* Each command must be removed from 'is->queue' before -- * starting it, so we temporarily reference the command -- * to avoid accidentally finalizing it. */ -- start_ic = camel_imapx_command_ref (ic); -- } -- -- g_clear_object (&ic_mailbox); -- } -- -- g_clear_object (&mailbox); -- -- /* Start the tagged command */ -- if (start_ic) { -- camel_imapx_command_queue_remove (is->queue, start_ic); -- imapx_server_command_removed (is, start_ic); -- imapx_command_start (is, start_ic); -- camel_imapx_command_unref (start_ic); -- } -- } --} -- --static gboolean --imapx_is_command_queue_empty (CamelIMAPXServer *is) --{ -- if (!camel_imapx_command_queue_is_empty (is->queue)) -- return FALSE; -- -- if (!camel_imapx_command_queue_is_empty (is->active)) -- return FALSE; -- -- return TRUE; --} -- --static void --imapx_command_queue (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- -- /* We enqueue in priority order, new messages have -- * higher priority than older messages with the same priority */ -- -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -- -- camel_imapx_command_close (ic); -- -- c ( -- is->tagprefix, -- "enqueue job '%.*s'\n", -- ((CamelIMAPXCommandPart *) ic->parts.head->data)->data_size, -- ((CamelIMAPXCommandPart *) ic->parts.head->data)->data); -- -- QUEUE_LOCK (is); -- -- if (is->state == IMAPX_SHUTDOWN) { -- GError *local_error = NULL; -- -- c (is->tagprefix, "refuse to queue job on disconnected server\n"); -- -- local_error = g_error_new ( -- CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT, -- "%s", _("Server disconnected")); -- camel_imapx_command_failed (ic, local_error); -- g_error_free (local_error); -- -- QUEUE_UNLOCK (is); -- -- if (ic->complete != NULL) -- ic->complete (is, ic); -- -- return; -- } -- -- camel_imapx_command_queue_insert_sorted (is->queue, ic); -- imapx_server_command_added (is, ic); -- -- imapx_command_start_next (is); -- -- QUEUE_UNLOCK (is); --} -- --/* Must not have QUEUE lock */ --static CamelIMAPXJob * --imapx_match_active_job (CamelIMAPXServer *is, -- guint32 type, -- const gchar *uid) --{ -- CamelIMAPXJob *match = NULL; -- GList *head, *link; -- -- QUEUE_LOCK (is); -- -- head = camel_imapx_command_queue_peek_head_link (is->active); -- -- for (link = head; link != NULL; link = g_list_next (link)) { -- CamelIMAPXCommand *ic = link->data; -- CamelIMAPXMailbox *mailbox; -- CamelIMAPXJob *job; -- gboolean job_matches; -- -- job = camel_imapx_command_get_job (ic); -- -- if (job == NULL) -- continue; -- -- if (!(job->type & type)) -- continue; -- -- g_mutex_lock (&is->priv->select_lock); -- mailbox = g_weak_ref_get (&is->priv->select_mailbox); -- g_mutex_unlock (&is->priv->select_lock); -- -- job_matches = camel_imapx_job_matches (job, mailbox, uid); -- g_clear_object (&mailbox); -- -- if (job_matches) { -- match = job; -- break; -- } -- } -- -- QUEUE_UNLOCK (is); -- -- return match; --} -- --/* Do *not* call this when the queue_lock is held, it can cause -- deadlock when searching between multiple servers */ --static CamelIMAPXJob * --imapx_server_ref_job (CamelIMAPXServer *imapx_server, -- CamelIMAPXMailbox *mailbox, -- guint32 job_type, -- const gchar *uid) --{ -- CamelIMAPXStore *imapx_store; -- CamelIMAPXJob *job; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (imapx_server), NULL); -- -- /* first try its own queue */ -- job = camel_imapx_server_ref_job (imapx_server, mailbox, job_type, uid); -- if (job) -- return job; -- -- /* then try queue for all the opened servers */ -- imapx_store = camel_imapx_server_ref_store (imapx_server); -- if (!imapx_store) -- return NULL; -- -- job = camel_imapx_store_ref_job (imapx_store, mailbox, job_type, uid); -- -- g_object_unref (imapx_store); -- -- return job; --} -- --static void --imapx_expunge_uid_from_summary (CamelIMAPXServer *is, -- gchar *uid, -- gboolean unsolicited) --{ -- CamelFolder *folder; -- CamelIMAPXMailbox *mailbox; -- CamelMessageInfo *mi; -- guint32 messages; -- -- g_mutex_lock (&is->priv->select_lock); -- mailbox = g_weak_ref_get (&is->priv->select_mailbox); -- g_mutex_unlock (&is->priv->select_lock); -- -- g_return_if_fail (mailbox != NULL); -- -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_if_fail (folder != NULL); -- -- messages = camel_imapx_mailbox_get_messages (mailbox); -- -- if (unsolicited && messages > 0) -- camel_imapx_mailbox_set_messages (mailbox, messages - 1); -- -- if (is->priv->changes == NULL) -- is->priv->changes = camel_folder_change_info_new (); -- -- mi = camel_folder_summary_peek_loaded (folder->summary, uid); -- if (mi) { -- camel_folder_summary_remove (folder->summary, mi); -- camel_message_info_unref (mi); -- } else { -- camel_folder_summary_remove_uid (folder->summary, uid); -- } -- -- camel_folder_change_info_remove_uid (is->priv->changes, uid); -- -- if (imapx_in_idle (is)) { -- camel_folder_summary_save_to_db (folder->summary, NULL); -- imapx_update_store_summary (folder); -- camel_folder_changed (folder, is->priv->changes); -- -- camel_folder_change_info_clear (is->priv->changes); -- } -- -- g_object_unref (folder); -- g_object_unref (mailbox); --} -- --/* untagged response handler functions */ -- --static gboolean --imapx_untagged_capability (CamelIMAPXServer *is, -- GInputStream *input_stream, -- GCancellable *cancellable, -- GError **error) --{ -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- -- if (is->cinfo != NULL) -- imapx_free_capability (is->cinfo); -- -- is->cinfo = imapx_parse_capability ( -- CAMEL_IMAPX_INPUT_STREAM (input_stream), cancellable, error); -- -- if (is->cinfo == NULL) -- return FALSE; -- -- c (is->tagprefix, "got capability flags %08x\n", is->cinfo->capa); -- -- imapx_server_stash_command_arguments (is); -- -- return TRUE; --} -- --static gboolean --imapx_untagged_expunge (CamelIMAPXServer *is, -- GInputStream *input_stream, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXMailbox *mailbox; -- CamelIMAPXJob *job = NULL; -- guint32 expunge = 0; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- -- expunge = is->priv->context->id; -- job = imapx_match_active_job (is, IMAPX_JOB_EXPUNGE, NULL); -- -- /* If there is a job running, let it handle the deletion */ -- if (job != NULL) -- return TRUE; -- -- job = imapx_match_active_job (is, IMAPX_JOB_COPY_MESSAGE, NULL); -- /* Ignore EXPUNGE responses when not running a COPY(MOVE)_MESSAGE job */ -- if (!job) { -- c (is->tagprefix, "ignoring untagged expunge: %lu\n", is->priv->context->id); -- return TRUE; -- } -- -- c (is->tagprefix, "expunged: %lu\n", is->priv->context->id); -- -- g_mutex_lock (&is->priv->select_lock); -- mailbox = g_weak_ref_get (&is->priv->select_mailbox); -- g_mutex_unlock (&is->priv->select_lock); -- -- if (mailbox != NULL) { -- CamelFolder *folder; -- gchar *uid; -- -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_val_if_fail (folder != NULL, FALSE); -- -- uid = camel_imapx_dup_uid_from_summary_index ( -- folder, expunge - 1); -- -- if (uid != NULL) -- imapx_expunge_uid_from_summary (is, uid, TRUE); -- -- g_object_unref (folder); -- g_object_unref (mailbox); -- } -- -- return TRUE; --} -- --static gboolean --imapx_untagged_vanished (CamelIMAPXServer *is, -- GInputStream *input_stream, -- GCancellable *cancellable, -- GError **error) --{ -- CamelFolder *folder; -- CamelIMAPXMailbox *mailbox; -- GArray *uids; -- GList *uid_list = NULL; -- gboolean unsolicited = TRUE; -- guint ii = 0; -- guint len = 0; -- guchar *token = NULL; -- gint tok = 0; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); - - tok = camel_imapx_input_stream_token ( - CAMEL_IMAPX_INPUT_STREAM (input_stream), -@@ -2014,9 +954,7 @@ imapx_untagged_vanished (CamelIMAPXServe - if (uids == NULL) - return FALSE; - -- g_mutex_lock (&is->priv->select_lock); -- mailbox = g_weak_ref_get (&is->priv->select_mailbox); -- g_mutex_unlock (&is->priv->select_lock); -+ mailbox = camel_imapx_server_ref_pending_or_selected (is); - - g_return_val_if_fail (mailbox != NULL, FALSE); - -@@ -2030,7 +968,7 @@ imapx_untagged_vanished (CamelIMAPXServe - - if (messages < uids->len) { - c ( -- is->tagprefix, -+ is->priv->tagprefix, - "Error: mailbox messages (%u) is " - "fewer than vanished %u\n", - messages, uids->len); -@@ -2042,8 +980,9 @@ imapx_untagged_vanished (CamelIMAPXServe - camel_imapx_mailbox_set_messages (mailbox, messages); - } - -- if (is->priv->changes == NULL) -- is->priv->changes = camel_folder_change_info_new (); -+ g_return_val_if_fail (is->priv->changes != NULL, FALSE); -+ -+ g_mutex_lock (&is->priv->changes_lock); - - for (ii = 0; ii < uids->len; ii++) { - guint32 uid; -@@ -2051,23 +990,44 @@ imapx_untagged_vanished (CamelIMAPXServe - - uid = g_array_index (uids, guint32, ii); - -- e (is->tagprefix, "vanished: %u\n", uid); -+ e (is->priv->tagprefix, "vanished: %u\n", uid); - - str = g_strdup_printf ("%u", uid); - uid_list = g_list_prepend (uid_list, str); - camel_folder_change_info_remove_uid (is->priv->changes, str); - } - -+ g_mutex_unlock (&is->priv->changes_lock); -+ - uid_list = g_list_reverse (uid_list); - camel_folder_summary_remove_uids (folder->summary, uid_list); - - /* If the response is truly unsolicited (e.g. via NOTIFY) - * then go ahead and emit the change notification now. */ -- if (camel_imapx_command_queue_is_empty (is->queue)) { -- camel_folder_summary_save_to_db (folder->summary, NULL); -- imapx_update_store_summary (folder); -- camel_folder_changed (folder, is->priv->changes); -- camel_folder_change_info_clear (is->priv->changes); -+ COMMAND_LOCK (is); -+ if (!is->priv->current_command) { -+ COMMAND_UNLOCK (is); -+ -+ g_mutex_lock (&is->priv->changes_lock); -+ if (is->priv->changes->uid_removed && -+ is->priv->changes->uid_removed->len >= 100) { -+ CamelFolderChangeInfo *changes; -+ -+ changes = is->priv->changes; -+ is->priv->changes = camel_folder_change_info_new (); -+ -+ g_mutex_unlock (&is->priv->changes_lock); -+ -+ camel_folder_summary_save_to_db (folder->summary, NULL); -+ imapx_update_store_summary (folder); -+ -+ camel_folder_changed (folder, changes); -+ camel_folder_change_info_free (changes); -+ } else { -+ g_mutex_unlock (&is->priv->changes_lock); -+ } -+ } else { -+ COMMAND_UNLOCK (is); - } - - g_list_free_full (uid_list, (GDestroyNotify) g_free); -@@ -2118,7 +1078,7 @@ imapx_untagged_exists (CamelIMAPXServer - - g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); - -- mailbox = camel_imapx_server_ref_selected (is); -+ mailbox = camel_imapx_server_ref_pending_or_selected (is); - - if (mailbox == NULL) { - g_warning ("%s: No mailbox available", G_STRFUNC); -@@ -2127,21 +1087,22 @@ imapx_untagged_exists (CamelIMAPXServer - - exists = (guint32) is->priv->context->id; - -+ c (is->priv->tagprefix, "%s: updating mailbox '%s' messages: %d ~> %d\n", G_STRFUNC, -+ camel_imapx_mailbox_get_name (mailbox), -+ camel_imapx_mailbox_get_messages (mailbox), -+ exists); -+ - camel_imapx_mailbox_set_messages (mailbox, exists); - - folder = imapx_server_ref_folder (is, mailbox); - g_return_val_if_fail (folder != NULL, FALSE); - -- if (imapx_in_idle (is)) { -+ if (camel_imapx_server_is_in_idle (is)) { - guint count; - - count = camel_folder_summary_count (folder->summary); -- if (count < exists) { -- CamelIMAPXIdleStopResult stop_result; -- -- stop_result = imapx_stop_idle (is, error); -- success = (stop_result != IMAPX_IDLE_STOP_ERROR); -- } -+ if (count < exists) -+ g_signal_emit (is, signals[REFRESH_MAILBOX], 0, mailbox); - } - - g_object_unref (folder); -@@ -2165,7 +1126,7 @@ imapx_untagged_flags (CamelIMAPXServer * - CAMEL_IMAPX_INPUT_STREAM (input_stream), - &flags, NULL, cancellable, error); - -- c (is->tagprefix, "flags: %08x\n", flags); -+ c (is->priv->tagprefix, "flags: %08x\n", flags); - - return success; - } -@@ -2204,72 +1165,50 @@ imapx_untagged_fetch (CamelIMAPXServer * - } - - if ((finfo->got & (FETCH_BODY | FETCH_UID)) == (FETCH_BODY | FETCH_UID)) { -- CamelIMAPXJob *job; -- GetMessageData *data; -- -- job = imapx_match_active_job ( -- is, IMAPX_JOB_GET_MESSAGE, finfo->uid); -- if (job == NULL) { -- g_warn_if_reached (); -- return FALSE; -- } -- -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -+ GOutputStream *output_stream; -+ gconstpointer body_data; -+ gsize body_size; - -- /* This must've been a get-message request, -- * fill out the body stream, in the right spot. */ -+ g_return_val_if_fail (is->priv->get_message_stream != NULL, FALSE); - -- if (job != NULL) { -- GOutputStream *output_stream; -- gconstpointer body_data; -- gsize body_size; -+ /* Fill out the body stream, in the right spot. */ - -- if (data->use_multi_fetch) { -- data->body_offset = finfo->offset; -- g_seekable_seek ( -- G_SEEKABLE (data->stream), -- finfo->offset, G_SEEK_SET, -- NULL, NULL); -- } -+ g_seekable_seek ( -+ G_SEEKABLE (is->priv->get_message_stream), -+ finfo->offset, G_SEEK_SET, -+ NULL, NULL); - -- output_stream = -- g_io_stream_get_output_stream (data->stream); -+ output_stream = g_io_stream_get_output_stream (is->priv->get_message_stream); - -- body_data = g_bytes_get_data (finfo->body, &body_size); -+ body_data = g_bytes_get_data (finfo->body, &body_size); - -- /* Sometimes the server, like Microsoft Exchange, reports larger message -- size than it actually is, which results in no data being read from -- the server for that particular offset. */ -- if (body_size) { -- g_mutex_lock (&is->priv->stream_lock); -- if (!g_output_stream_write_all ( -- output_stream, body_data, body_size, -- NULL, cancellable, error)) { -- g_mutex_unlock (&is->priv->stream_lock); -- g_prefix_error ( -- error, "%s: ", -- _("Error writing to cache stream")); -- return FALSE; -- } -+ /* Sometimes the server, like Microsoft Exchange, reports larger message -+ size than it actually is, which results in no data being read from -+ the server for that particular offset. */ -+ if (body_size) { -+ g_mutex_lock (&is->priv->stream_lock); -+ if (!g_output_stream_write_all ( -+ output_stream, body_data, body_size, -+ NULL, cancellable, error)) { - g_mutex_unlock (&is->priv->stream_lock); -+ g_prefix_error ( -+ error, "%s: ", -+ _("Error writing to cache stream")); -+ imapx_free_fetch (finfo); -+ return FALSE; - } -+ g_mutex_unlock (&is->priv->stream_lock); - } - } - - if ((finfo->got & FETCH_FLAGS) && !(finfo->got & FETCH_HEADER)) { -- CamelIMAPXJob *job; - CamelIMAPXMailbox *select_mailbox; - CamelIMAPXMailbox *select_pending; -- RefreshInfoData *data = NULL; - -- job = imapx_match_active_job ( -- is, IMAPX_JOB_FETCH_NEW_MESSAGES | -- IMAPX_JOB_REFRESH_INFO, NULL); -- -- if (job != NULL) { -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -+ if (is->priv->fetch_changes_mailbox) { -+ g_return_val_if_fail (is->priv->fetch_changes_mailbox != NULL, FALSE); -+ g_return_val_if_fail (is->priv->fetch_changes_folder != NULL, FALSE); -+ g_return_val_if_fail (is->priv->fetch_changes_infos != NULL, FALSE); - } - - g_mutex_lock (&is->priv->select_lock); -@@ -2280,27 +1219,49 @@ imapx_untagged_fetch (CamelIMAPXServer * - /* This is either a refresh_info job, check to see if it is - * and update if so, otherwise it must've been an unsolicited - * response, so update the summary to match. */ -- if (data && (finfo->got & FETCH_UID) && data->scan_changes) { -- struct _refresh_info r; -+ if ((finfo->got & FETCH_UID) != 0 && is->priv->fetch_changes_folder && is->priv->fetch_changes_infos) { -+ FetchChangesInfo *nfo; -+ gint64 monotonic_time; -+ gint n_messages; -+ -+ nfo = g_hash_table_lookup (is->priv->fetch_changes_infos, finfo->uid); -+ if (!nfo) { -+ nfo = g_new0 (FetchChangesInfo, 1); -+ -+ g_hash_table_insert (is->priv->fetch_changes_infos, (gpointer) camel_pstring_strdup (finfo->uid), nfo); -+ } - -- r.uid = finfo->uid; -- finfo->uid = NULL; -- r.server_flags = finfo->flags; -- r.server_user_flags = finfo->user_flags; -+ nfo->server_flags = finfo->flags; -+ nfo->server_user_flags = finfo->user_flags; - finfo->user_flags = NULL; -- r.exists = FALSE; -- g_array_append_val (data->infos, r); - -+ monotonic_time = g_get_monotonic_time (); -+ n_messages = camel_imapx_mailbox_get_messages (is->priv->fetch_changes_mailbox); -+ -+ if (n_messages > 0 && is->priv->fetch_changes_last_progress + G_USEC_PER_SEC / 2 < monotonic_time && -+ is->priv->context && is->priv->context->id <= n_messages) { -+ COMMAND_LOCK (is); -+ -+ if (is->priv->current_command) { -+ COMMAND_UNLOCK (is); -+ -+ is->priv->fetch_changes_last_progress = monotonic_time; -+ -+ camel_operation_progress (cancellable, 100 * is->priv->context->id -+ / camel_imapx_mailbox_get_messages (is->priv->fetch_changes_mailbox)); -+ } else { -+ COMMAND_UNLOCK (is); -+ } -+ } - } else if (select_mailbox != NULL) { - CamelFolder *select_folder; - CamelMessageInfo *mi = NULL; - gboolean changed = FALSE; - gchar *uid = NULL; - -- c (is->tagprefix, "flag changed: %lu\n", is->priv->context->id); -+ c (is->priv->tagprefix, "flag changed: %lu\n", is->priv->context->id); - -- select_folder = -- imapx_server_ref_folder (is, select_mailbox); -+ select_folder = imapx_server_ref_folder (is, select_mailbox); - g_return_val_if_fail (select_folder != NULL, FALSE); - - if (finfo->got & FETCH_UID) { -@@ -2313,8 +1274,7 @@ imapx_untagged_fetch (CamelIMAPXServer * - } - - if (uid) { -- mi = camel_folder_summary_get ( -- select_folder->summary, uid); -+ mi = camel_folder_summary_get (select_folder->summary, uid); - if (mi) { - /* It's unsolicited _unless_ select_pending (i.e. during - * a QRESYNC SELECT */ -@@ -2327,29 +1287,30 @@ imapx_untagged_fetch (CamelIMAPXServer * - } else { - /* This (UID + FLAGS for previously unknown message) might - * happen during a SELECT (QRESYNC). We should use it. */ -- c (is->tagprefix, "flags changed for unknown uid %s\n.", uid); -+ c (is->priv->tagprefix, "flags changed for unknown uid %s\n.", uid); - } - finfo->user_flags = NULL; - } - - if (changed) { -- if (is->priv->changes == NULL) -- is->priv->changes = -- camel_folder_change_info_new (); -+ g_return_val_if_fail (is->priv->changes != NULL, FALSE); - -- camel_folder_change_info_change_uid ( -- is->priv->changes, uid); -+ g_mutex_lock (&is->priv->changes_lock); -+ camel_folder_change_info_change_uid (is->priv->changes, uid); -+ g_mutex_unlock (&is->priv->changes_lock); - } - g_free (uid); - -- if (changed && imapx_in_idle (is)) { -- camel_folder_summary_save_to_db ( -- select_folder->summary, NULL); -+ if (changed && camel_imapx_server_is_in_idle (is)) { -+ camel_folder_summary_save_to_db (select_folder->summary, NULL); - imapx_update_store_summary (select_folder); -- camel_folder_changed ( -- select_folder, is->priv->changes); -- camel_folder_change_info_clear ( -- is->priv->changes); -+ -+ g_mutex_lock (&is->priv->changes_lock); -+ -+ camel_folder_changed (select_folder, is->priv->changes); -+ camel_folder_change_info_clear (is->priv->changes); -+ -+ g_mutex_unlock (&is->priv->changes_lock); - } - - if (mi) -@@ -2363,145 +1324,123 @@ imapx_untagged_fetch (CamelIMAPXServer * - } - - if ((finfo->got & (FETCH_HEADER | FETCH_UID)) == (FETCH_HEADER | FETCH_UID)) { -- CamelIMAPXJob *job; -+ CamelIMAPXMailbox *mailbox; -+ CamelFolder *folder; -+ CamelMimeParser *mp; -+ CamelMessageInfo *mi; -+ guint32 messages; -+ guint32 unseen; -+ guint32 uidnext; - - /* This must be a refresh info job as well, but it has - * asked for new messages to be added to the index. */ - -- job = imapx_match_active_job ( -- is, IMAPX_JOB_FETCH_NEW_MESSAGES | -- IMAPX_JOB_REFRESH_INFO, NULL); -- -- if (job != NULL) { -- CamelIMAPXMailbox *mailbox; -- CamelFolder *folder; -- CamelMimeParser *mp; -- CamelMessageInfo *mi; -- guint32 messages; -- guint32 unseen; -- guint32 uidnext; -+ if (is->priv->fetch_changes_mailbox) { -+ g_return_val_if_fail (is->priv->fetch_changes_mailbox != NULL, FALSE); -+ g_return_val_if_fail (is->priv->fetch_changes_folder != NULL, FALSE); -+ g_return_val_if_fail (is->priv->fetch_changes_infos != NULL, FALSE); -+ -+ folder = g_object_ref (is->priv->fetch_changes_folder); -+ mailbox = g_object_ref (is->priv->fetch_changes_mailbox); -+ } else { -+ mailbox = camel_imapx_server_ref_selected (is); -+ folder = mailbox ? imapx_server_ref_folder (is, mailbox) : NULL; -+ } - -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_val_if_fail (mailbox != NULL, FALSE); -+ if (!mailbox || !folder || (!(finfo->got & FETCH_FLAGS) && !is->priv->fetch_changes_infos)) { -+ g_clear_object (&mailbox); -+ g_clear_object (&folder); -+ imapx_free_fetch (finfo); - -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_val_if_fail (folder != NULL, FALSE); -+ return TRUE; -+ } -+ -+ messages = camel_imapx_mailbox_get_messages (mailbox); -+ unseen = camel_imapx_mailbox_get_unseen (mailbox); -+ uidnext = camel_imapx_mailbox_get_uidnext (mailbox); -+ -+ /* Do we want to save these headers for later too? Do we care? */ -+ -+ mp = camel_mime_parser_new (); -+ camel_mime_parser_init_with_bytes (mp, finfo->header); -+ mi = camel_folder_summary_info_new_from_parser (folder->summary, mp); -+ g_object_unref (mp); -+ -+ if (mi != NULL) { -+ guint32 server_flags; -+ CamelFlag *server_user_flags; -+ CamelMessageInfoBase *binfo; -+ gboolean free_user_flags = FALSE; - -- messages = camel_imapx_mailbox_get_messages (mailbox); -- unseen = camel_imapx_mailbox_get_unseen (mailbox); -- uidnext = camel_imapx_mailbox_get_uidnext (mailbox); -- -- /* Do we want to save these headers for later too? Do we care? */ -- -- mp = camel_mime_parser_new (); -- camel_mime_parser_init_with_bytes (mp, finfo->header); -- mi = camel_folder_summary_info_new_from_parser (folder->summary, mp); -- g_object_unref (mp); -- -- if (mi != NULL) { -- guint32 server_flags; -- CamelFlag *server_user_flags; -- CamelMessageInfoBase *binfo; -- gboolean free_user_flags = FALSE; -- -- mi->uid = camel_pstring_strdup (finfo->uid); -- -- if (!(finfo->got & FETCH_FLAGS)) { -- RefreshInfoData *data; -- struct _refresh_info *r = NULL; -- gint min, max, mid; -- gboolean found = FALSE; -- -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -- -- min = data->last_index; -- max = data->index - 1; -- -- /* array is sorted, so use a binary search */ -- do { -- gint cmp = 0; -- -- mid = (min + max) / 2; -- r = &g_array_index (data->infos, struct _refresh_info, mid); -- cmp = imapx_refresh_info_uid_cmp ( -- finfo->uid, -- r->uid, -- is->priv->context->fetch_order == CAMEL_SORT_ASCENDING); -- -- if (cmp > 0) -- min = mid + 1; -- else if (cmp < 0) -- max = mid - 1; -- else -- found = TRUE; -+ mi->uid = camel_pstring_strdup (finfo->uid); - -- } while (!found && min <= max); -+ if (!(finfo->got & FETCH_FLAGS) && is->priv->fetch_changes_infos) { -+ FetchChangesInfo *nfo; - -- g_return_val_if_fail (found, FALSE); -+ nfo = g_hash_table_lookup (is->priv->fetch_changes_infos, finfo->uid); -+ g_return_val_if_fail (nfo != NULL, FALSE); - -- server_flags = r->server_flags; -- server_user_flags = r->server_user_flags; -+ server_flags = nfo->server_flags; -+ server_user_flags = nfo->server_user_flags; -+ } else { -+ server_flags = finfo->flags; -+ server_user_flags = finfo->user_flags; -+ /* free user_flags ? */ -+ finfo->user_flags = NULL; -+ free_user_flags = TRUE; -+ } -+ -+ /* If the message is a really new one -- equal or higher than what -+ * we know as UIDNEXT for the folder, then it came in since we last -+ * fetched UIDNEXT and UNREAD count. We'll update UIDNEXT in the -+ * command completion, but update UNREAD count now according to the -+ * message SEEN flag */ -+ if (!(server_flags & CAMEL_MESSAGE_SEEN)) { -+ guint64 uidl; -+ -+ uidl = strtoull (mi->uid, NULL, 10); -+ -+ if (uidl >= uidnext) { -+ c (is->priv->tagprefix, "Updating unseen count for new message %s\n", mi->uid); -+ camel_imapx_mailbox_set_unseen (mailbox, unseen + 1); - } else { -- server_flags = finfo->flags; -- server_user_flags = finfo->user_flags; -- /* free user_flags ? */ -- finfo->user_flags = NULL; -- free_user_flags = TRUE; -+ c (is->priv->tagprefix, "Not updating unseen count for new message %s\n", mi->uid); - } -+ } - -- /* If the message is a really new one -- equal or higher than what -- * we know as UIDNEXT for the folder, then it came in since we last -- * fetched UIDNEXT and UNREAD count. We'll update UIDNEXT in the -- * command completion, but update UNREAD count now according to the -- * message SEEN flag */ -- if (!(server_flags & CAMEL_MESSAGE_SEEN)) { -- guint64 uidl; -- -- uidl = strtoull (mi->uid, NULL, 10); -- -- if (uidl >= uidnext) { -- c (is->tagprefix, "Updating unseen count for new message %s\n", mi->uid); -- camel_imapx_mailbox_set_unseen (mailbox, unseen + 1); -- } else { -- c (is->tagprefix, "Not updating unseen count for new message %s\n", mi->uid); -- } -- } -+ binfo = (CamelMessageInfoBase *) mi; -+ binfo->size = finfo->size; - -- binfo = (CamelMessageInfoBase *) mi; -- binfo->size = finfo->size; -+ camel_folder_summary_lock (folder->summary); - -- camel_folder_summary_lock (folder->summary); -+ if (!camel_folder_summary_check_uid (folder->summary, mi->uid)) { -+ imapx_set_message_info_flags_for_new_message (mi, server_flags, server_user_flags, FALSE, NULL, camel_imapx_mailbox_get_permanentflags (mailbox)); -+ camel_folder_summary_add (folder->summary, mi); - -- if (!camel_folder_summary_check_uid (folder->summary, mi->uid)) { -- RefreshInfoData *data; -+ g_mutex_lock (&is->priv->changes_lock); - -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -+ camel_folder_change_info_add_uid (is->priv->changes, mi->uid); -+ camel_folder_change_info_recent_uid (is->priv->changes, mi->uid); - -- imapx_set_message_info_flags_for_new_message (mi, server_flags, server_user_flags, FALSE, NULL, camel_imapx_mailbox_get_permanentflags (mailbox)); -- camel_folder_summary_add (folder->summary, mi); -- camel_folder_change_info_add_uid (data->changes, mi->uid); -+ g_mutex_unlock (&is->priv->changes_lock); - -- camel_folder_change_info_recent_uid (data->changes, mi->uid); -+ if (messages > 0) { -+ gint cnt = (camel_folder_summary_count (folder->summary) * 100) / messages; - -- if (messages > 0) { -- gint cnt = (camel_folder_summary_count (folder->summary) * 100) / messages; -- camel_operation_progress (cancellable, cnt ? cnt : 1); -- } -- } else { -- camel_message_info_unref (mi); -+ camel_operation_progress (cancellable, cnt ? cnt : 1); - } -- -- camel_folder_summary_unlock (folder->summary); -- -- if (free_user_flags && server_user_flags) -- camel_flag_list_free (&server_user_flags); -+ } else { -+ camel_message_info_unref (mi); - } - -- g_object_unref (folder); -- g_object_unref (mailbox); -+ camel_folder_summary_unlock (folder->summary); -+ -+ if (free_user_flags && server_user_flags) -+ camel_flag_list_free (&server_user_flags); - } -+ -+ g_clear_object (&mailbox); -+ g_clear_object (&folder); - } - - imapx_free_fetch (finfo); -@@ -2670,7 +1609,7 @@ imapx_untagged_recent (CamelIMAPXServer - - g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); - -- mailbox = camel_imapx_server_ref_selected (is); -+ mailbox = camel_imapx_server_ref_pending_or_selected (is); - - if (mailbox == NULL) { - g_warning ("%s: No mailbox available", G_STRFUNC); -@@ -2679,6 +1618,11 @@ imapx_untagged_recent (CamelIMAPXServer - - recent = (guint32) is->priv->context->id; - -+ c (is->priv->tagprefix, "%s: updating mailbox '%s' recent: %d ~> %d\n", G_STRFUNC, -+ camel_imapx_mailbox_get_name (mailbox), -+ camel_imapx_mailbox_get_recent (mailbox), -+ recent); -+ - camel_imapx_mailbox_set_recent (mailbox, recent); - - g_object_unref (mailbox); -@@ -2798,7 +1742,9 @@ imapx_untagged_bye (CamelIMAPXServer *is - /* XXX It's weird to be setting an error on success, - * but it's to indicate the server hung up on us. */ - if (success) { -- c (is->tagprefix, "BYE: %s\n", token); -+ g_strstrip ((gchar *) token); -+ -+ c (is->priv->tagprefix, "BYE: %s\n", token); - g_set_error ( - error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT, - "IMAP server said BYE: %s", token); -@@ -2806,7 +1752,7 @@ imapx_untagged_bye (CamelIMAPXServer *is - - g_free (token); - -- is->state = IMAPX_SHUTDOWN; -+ is->priv->state = IMAPX_SHUTDOWN; - - return FALSE; - } -@@ -2819,9 +1765,9 @@ imapx_untagged_preauth (CamelIMAPXServer - { - g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); - -- c (is->tagprefix, "preauthenticated\n"); -- if (is->state < IMAPX_AUTHENTICATED) -- is->state = IMAPX_AUTHENTICATED; -+ c (is->priv->tagprefix, "preauthenticated\n"); -+ if (is->priv->state < IMAPX_AUTHENTICATED) -+ is->priv->state = IMAPX_AUTHENTICATED; - - return TRUE; - } -@@ -2851,15 +1797,7 @@ imapx_untagged_ok_no_bad (CamelIMAPXServ - overwritten with a value from a different mailbox, thus the offline - cache will persist, instead of being vanished. - */ -- g_mutex_lock (&is->priv->select_lock); -- -- mailbox = g_weak_ref_get (&is->priv->select_pending); -- if (!mailbox) -- mailbox = g_weak_ref_get (&is->priv->select_mailbox); -- if (!mailbox) -- mailbox = g_weak_ref_get (&is->priv->select_closing); -- -- g_mutex_unlock (&is->priv->select_lock); -+ mailbox = camel_imapx_server_ref_pending_or_selected (is); - - is->priv->context->sinfo = imapx_parse_status ( - CAMEL_IMAPX_INPUT_STREAM (input_stream), -@@ -2873,43 +1811,34 @@ imapx_untagged_ok_no_bad (CamelIMAPXServ - switch (is->priv->context->sinfo->condition) { - case IMAPX_CLOSED: - c ( -- is->tagprefix, -+ is->priv->tagprefix, - "previously selected mailbox is now closed\n"); - { - CamelIMAPXMailbox *select_mailbox; -- CamelIMAPXMailbox *select_closing; - CamelIMAPXMailbox *select_pending; - - g_mutex_lock (&is->priv->select_lock); - -- select_mailbox = -- g_weak_ref_get (&is->priv->select_mailbox); -- select_closing = -- g_weak_ref_get (&is->priv->select_closing); -- select_pending = -- g_weak_ref_get (&is->priv->select_pending); -- -- if (select_mailbox == NULL) -- g_weak_ref_set ( -- &is->priv->select_mailbox, -- select_pending); -+ select_mailbox = g_weak_ref_get (&is->priv->select_mailbox); -+ select_pending = g_weak_ref_get (&is->priv->select_pending); - -- g_weak_ref_set (&is->priv->select_closing, NULL); -+ if (select_mailbox == NULL) { -+ g_weak_ref_set (&is->priv->select_mailbox, select_pending); - -- g_mutex_unlock (&is->priv->select_lock); -+ if (select_pending) -+ is->priv->last_selected_mailbox_change_stamp = camel_imapx_mailbox_get_change_stamp (select_pending); -+ else -+ is->priv->last_selected_mailbox_change_stamp = 0; -+ } - -- if (select_closing != NULL) -- g_signal_emit ( -- is, signals[MAILBOX_CLOSED], 0, -- select_closing); -+ g_mutex_unlock (&is->priv->select_lock); - - g_clear_object (&select_mailbox); -- g_clear_object (&select_closing); - g_clear_object (&select_pending); - } - break; - case IMAPX_ALERT: -- c (is->tagprefix, "ALERT!: %s\n", is->priv->context->sinfo->text); -+ c (is->priv->tagprefix, "ALERT!: %s\n", is->priv->context->sinfo->text); - { - const gchar *alert_message; - gboolean emit_alert = FALSE; -@@ -2938,12 +1867,15 @@ imapx_untagged_ok_no_bad (CamelIMAPXServ - service = CAMEL_SERVICE (store); - session = camel_service_ref_session (service); - -- camel_session_user_alert ( -- session, service, -- CAMEL_SESSION_ALERT_WARNING, -- alert_message); -+ if (session) { -+ camel_session_user_alert ( -+ session, service, -+ CAMEL_SESSION_ALERT_WARNING, -+ alert_message); -+ -+ g_object_unref (session); -+ } - -- g_object_unref (session); - g_object_unref (store); - } - -@@ -2951,24 +1883,48 @@ imapx_untagged_ok_no_bad (CamelIMAPXServ - } - break; - case IMAPX_PARSE: -- c (is->tagprefix, "PARSE: %s\n", is->priv->context->sinfo->text); -+ c (is->priv->tagprefix, "PARSE: %s\n", is->priv->context->sinfo->text); - break; - case IMAPX_CAPABILITY: - if (is->priv->context->sinfo->u.cinfo) { -- struct _capability_info *cinfo = is->cinfo; -- is->cinfo = is->priv->context->sinfo->u.cinfo; -+ struct _capability_info *cinfo; -+ -+ g_mutex_lock (&is->priv->stream_lock); -+ -+ cinfo = is->priv->cinfo; -+ is->priv->cinfo = is->priv->context->sinfo->u.cinfo; - is->priv->context->sinfo->u.cinfo = NULL; - if (cinfo) - imapx_free_capability (cinfo); -- c (is->tagprefix, "got capability flags %08x\n", is->cinfo ? is->cinfo->capa : 0xFFFFFFFF); -+ c (is->priv->tagprefix, "got capability flags %08x\n", is->priv->cinfo ? is->priv->cinfo->capa : 0xFFFFFFFF); -+ -+ if (is->priv->context->sinfo->text) { -+ guint32 list_extended = imapx_lookup_capability ("LIST-EXTENDED"); -+ -+ is->priv->is_cyrus = is->priv->is_cyrus || camel_strstrcase (is->priv->context->sinfo->text, "cyrus"); -+ if (is->priv->is_cyrus && is->priv->cinfo && (is->priv->cinfo->capa & list_extended) != 0) { -+ /* Disable LIST-EXTENDED for cyrus servers */ -+ c (is->priv->tagprefix, "Disabling LIST-EXTENDED extension for a Cyrus server\n"); -+ is->priv->cinfo->capa &= ~list_extended; -+ } -+ } -+ - imapx_server_stash_command_arguments (is); -+ -+ g_mutex_unlock (&is->priv->stream_lock); - } - break; -+ case IMAPX_COPYUID: -+ imapx_free_status (is->priv->copyuid_status); -+ is->priv->copyuid_status = is->priv->context->sinfo; -+ is->priv->context->sinfo = NULL; -+ break; - default: - break; - } - - imapx_free_status (is->priv->context->sinfo); -+ is->priv->context->sinfo = NULL; - - return TRUE; - } -@@ -3001,7 +1957,7 @@ imapx_untagged (CamelIMAPXServer *is, - is->priv->context->lsub = FALSE; - is->priv->context->fetch_order = fetch_order; - -- e (is->tagprefix, "got untagged response\n"); -+ e (is->priv->tagprefix, "got untagged response\n"); - is->priv->context->id = 0; - is->priv->context->tok = camel_imapx_input_stream_token ( - CAMEL_IMAPX_INPUT_STREAM (input_stream), -@@ -3025,12 +1981,12 @@ imapx_untagged (CamelIMAPXServer *is, - - if (is->priv->context->tok == '\n') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "truncated server response"); - goto exit; - } - -- e (is->tagprefix, "Have token '%s' id %lu\n", is->priv->context->token, is->priv->context->id); -+ e (is->priv->tagprefix, "Have token '%s' id %lu\n", is->priv->context->token, is->priv->context->id); - p = is->priv->context->token; - while ((c = *p)) - *p++ = g_ascii_toupper ((gchar) c); -@@ -3042,12 +1998,12 @@ imapx_untagged (CamelIMAPXServer *is, - desc = g_hash_table_lookup (is->priv->untagged_handlers, token); - if (desc == NULL) { - /* unknown response, just ignore it */ -- c (is->tagprefix, "unknown token: %s\n", is->priv->context->token); -+ c (is->priv->tagprefix, "unknown token: %s\n", is->priv->context->token); - break; - } - if (desc->handler == NULL) { - /* no handler function, ignore token */ -- c (is->tagprefix, "no handler for token: %s\n", is->priv->context->token); -+ c (is->priv->tagprefix, "no handler for token: %s\n", is->priv->context->token); - break; - } - -@@ -3085,6 +2041,61 @@ exit: - return success; - } - -+static gssize -+imapx_server_write_file_with_progress (GOutputStream *output_stream, -+ GInputStream *input_stream, -+ goffset file_size, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ gssize n_read; -+ gsize bytes_copied, n_written; -+ gchar buffer[8192]; -+ goffset file_offset; -+ gboolean res; -+ -+ g_return_val_if_fail (G_IS_OUTPUT_STREAM (output_stream), -1); -+ g_return_val_if_fail (G_IS_INPUT_STREAM (input_stream), -1); -+ -+ if (g_cancellable_set_error_if_cancelled (cancellable, error)) -+ return FALSE; -+ -+ file_offset = 0; -+ bytes_copied = 0; -+ res = TRUE; -+ do { -+ n_read = g_input_stream_read (input_stream, buffer, sizeof (buffer), cancellable, error); -+ if (n_read == -1) { -+ res = FALSE; -+ break; -+ } -+ -+ if (n_read == 0) -+ break; -+ -+ if (!g_output_stream_write_all (output_stream, buffer, n_read, &n_written, cancellable, error) || n_written == -1) { -+ res = FALSE; -+ break; -+ } -+ -+ file_offset += n_read; -+ -+ if (file_size > 0) { -+ gdouble divd = (gdouble) file_offset / (gdouble) file_size; -+ camel_operation_progress (cancellable, (gint) (100 * divd)); -+ } -+ -+ bytes_copied += n_written; -+ if (bytes_copied > G_MAXSSIZE) -+ bytes_copied = G_MAXSSIZE; -+ } while (res); -+ -+ if (res) -+ return bytes_copied; -+ -+ return -1; -+} -+ - /* handle any continuation requests - * either data continuations, or auth continuation */ - static gboolean -@@ -3095,7 +2106,7 @@ imapx_continuation (CamelIMAPXServer *is - GCancellable *cancellable, - GError **error) - { -- CamelIMAPXCommand *ic, *newliteral = NULL; -+ CamelIMAPXCommand *ic, *newic = NULL; - CamelIMAPXCommandPart *cp; - GList *link; - gssize n_bytes_written; -@@ -3105,7 +2116,7 @@ imapx_continuation (CamelIMAPXServer *is - * can write while we have it ... so we dont need any - * ohter lock here. All other writes go through - * queue-lock */ -- if (imapx_in_idle (is)) { -+ if (camel_imapx_server_is_in_idle (is)) { - success = camel_imapx_input_stream_skip ( - CAMEL_IMAPX_INPUT_STREAM (input_stream), - cancellable, error); -@@ -3113,57 +2124,38 @@ imapx_continuation (CamelIMAPXServer *is - if (!success) - return FALSE; - -- c (is->tagprefix, "Got continuation response for IDLE \n"); -- g_rec_mutex_lock (&is->priv->idle_lock); -- /* We might have actually sent the DONE already! */ -- if (is->priv->idle_state == IMAPX_IDLE_ISSUED) { -- is->priv->idle_state = IMAPX_IDLE_STARTED; -- } else if (is->priv->idle_state == IMAPX_IDLE_CANCEL) { -- /* IDLE got cancelled after we sent the command, while -- * we were waiting for this continuation. Send DONE -- * immediately. */ -- if (!imapx_command_idle_stop (is, error)) { -- g_rec_mutex_unlock (&is->priv->idle_lock); -- return FALSE; -- } -- is->priv->idle_state = IMAPX_IDLE_WAIT_DONE; -- } else if (is->priv->idle_state == IMAPX_IDLE_WAIT_DONE) { -- /* Do nothing, just wait */ -- } else { -- c ( -- is->tagprefix, "idle starts in wrong state %d\n", -- is->priv->idle_state); -- } -- g_rec_mutex_unlock (&is->priv->idle_lock); -+ c (is->priv->tagprefix, "Got continuation response for IDLE \n"); - -- QUEUE_LOCK (is); -- is->literal = NULL; -- imapx_command_start_next (is); -- QUEUE_UNLOCK (is); -+ g_mutex_lock (&is->priv->idle_lock); -+ is->priv->idle_state = IMAPX_IDLE_STATE_RUNNING; -+ g_cond_broadcast (&is->priv->idle_cond); -+ g_mutex_unlock (&is->priv->idle_lock); - - return TRUE; - } - -- ic = is->literal; -+ ic = is->priv->continuation_command; - if (!litplus) { - if (ic == NULL) { -- c (is->tagprefix, "got continuation response with no outstanding continuation requests?\n"); -+ c (is->priv->tagprefix, "got continuation response with no outstanding continuation requests?\n"); - return camel_imapx_input_stream_skip ( - CAMEL_IMAPX_INPUT_STREAM (input_stream), - cancellable, error); - } -- c (is->tagprefix, "got continuation response for data\n"); -+ c (is->priv->tagprefix, "got continuation response for data\n"); - } else { -- c (is->tagprefix, "sending LITERAL+ continuation\n"); -+ c (is->priv->tagprefix, "sending LITERAL+ continuation\n"); -+ g_return_val_if_fail (ic != NULL, FALSE); - } - -- link = ic->current_part; -+ /* coverity[deadcode] */ -+ link = ic ? ic->current_part : NULL; - g_return_val_if_fail (link != NULL, FALSE); - cp = (CamelIMAPXCommandPart *) link->data; - - switch (cp->type & CAMEL_IMAPX_COMMAND_MASK) { - case CAMEL_IMAPX_COMMAND_DATAWRAPPER: -- c (is->tagprefix, "writing data wrapper to literal\n"); -+ c (is->priv->tagprefix, "writing data wrapper to literal\n"); - n_bytes_written = - camel_data_wrapper_write_to_output_stream_sync ( - CAMEL_DATA_WRAPPER (cp->ob), -@@ -3188,7 +2180,7 @@ imapx_continuation (CamelIMAPXServer *is - g_free (token); - if (resp == NULL) - return FALSE; -- c (is->tagprefix, "got auth continuation, feeding token '%s' back to auth mech\n", resp); -+ c (is->priv->tagprefix, "got auth continuation, feeding token '%s' back to auth mech\n", resp); - - g_mutex_lock (&is->priv->stream_lock); - n_bytes_written = g_output_stream_write_all ( -@@ -3202,15 +2194,17 @@ imapx_continuation (CamelIMAPXServer *is - - /* we want to keep getting called until we get a status reponse from the server - * ignore what sasl tells us */ -- newliteral = ic; -+ newic = ic; - /* We already ate the end of the input stream line */ - goto noskip; - break; } - case CAMEL_IMAPX_COMMAND_FILE: { - GFile *file; -+ GFileInfo *file_info; - GFileInputStream *file_input_stream; -+ goffset file_size = 0; - -- c (is->tagprefix, "writing file '%s' to literal\n", (gchar *) cp->ob); -+ c (is->priv->tagprefix, "writing file '%s' to literal\n", (gchar *) cp->ob); - - file = g_file_new_for_path (cp->ob); - file_input_stream = g_file_read (file, cancellable, error); -@@ -3219,14 +2213,22 @@ imapx_continuation (CamelIMAPXServer *is - if (file_input_stream == NULL) - return FALSE; - -+ file_info = g_file_input_stream_query_info (file_input_stream, -+ G_FILE_ATTRIBUTE_STANDARD_SIZE, cancellable, NULL); -+ if (file_info) { -+ file_size = g_file_info_get_size (file_info); -+ g_object_unref (file_info); -+ } -+ - g_mutex_lock (&is->priv->stream_lock); -- n_bytes_written = g_output_stream_splice ( -- output_stream, -- G_INPUT_STREAM (file_input_stream), -- G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE, -- cancellable, error); -+ -+ n_bytes_written = imapx_server_write_file_with_progress ( -+ output_stream, G_INPUT_STREAM (file_input_stream), -+ file_size, cancellable, error); -+ - g_mutex_unlock (&is->priv->stream_lock); - -+ g_input_stream_close (G_INPUT_STREAM (file_input_stream), cancellable, NULL); - g_object_unref (file_input_stream); - - if (n_bytes_written < 0) -@@ -3244,9 +2246,8 @@ imapx_continuation (CamelIMAPXServer *is - break; - default: - /* should we just ignore? */ -- is->literal = NULL; - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "continuation response for non-continuation request"); - return FALSE; - } -@@ -3266,7 +2267,7 @@ noskip: - ic->current_part = link; - cp = (CamelIMAPXCommandPart *) link->data; - -- c (is->tagprefix, "next part of command \"%c%05u: %s\"\n", is->tagprefix, ic->tag, cp->data); -+ c (is->priv->tagprefix, "next part of command \"%c%05u: %s\"\n", is->priv->tagprefix, ic->tag, cp->data); - - g_mutex_lock (&is->priv->stream_lock); - n_bytes_written = g_output_stream_write_all ( -@@ -3277,12 +2278,12 @@ noskip: - return FALSE; - - if (cp->type & (CAMEL_IMAPX_COMMAND_CONTINUATION | CAMEL_IMAPX_COMMAND_LITERAL_PLUS)) { -- newliteral = ic; -+ newic = ic; - } else { -- g_assert (g_list_next (link) == NULL); -+ g_warn_if_fail (g_list_next (link) == NULL); - } - } else { -- c (is->tagprefix, "%p: queueing continuation\n", ic); -+ c (is->priv->tagprefix, "%p: queueing continuation\n", ic); - } - - g_mutex_lock (&is->priv->stream_lock); -@@ -3292,12 +2293,7 @@ noskip: - if (n_bytes_written < 0) - return FALSE; - -- QUEUE_LOCK (is); -- is->literal = newliteral; -- -- if (!litplus) -- imapx_command_start_next (is); -- QUEUE_UNLOCK (is); -+ is->priv->continuation_command = newic; - - return TRUE; - } -@@ -3318,80 +2314,74 @@ imapx_completion (CamelIMAPXServer *is, - - /* Given "A0001 ...", 'A' = tag prefix, '0001' = tag. */ - -- if (token[0] != is->tagprefix) { -+ if (token[0] != is->priv->tagprefix) { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "Server sent unexpected response: %s", token); - return FALSE; - } - - tag = strtoul ((gchar *) token + 1, NULL, 10); - -- QUEUE_LOCK (is); -+ COMMAND_LOCK (is); - -- if (is->literal != NULL && is->literal->tag == tag) -- ic = camel_imapx_command_ref (is->literal); -+ if (is->priv->current_command != NULL && is->priv->current_command->tag == tag) -+ ic = camel_imapx_command_ref (is->priv->current_command); - else -- ic = camel_imapx_command_queue_ref_by_tag (is->active, tag); -+ ic = NULL; - -- QUEUE_UNLOCK (is); -+ COMMAND_UNLOCK (is); - - if (ic == NULL) { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "got response tag unexpectedly: %s", token); - return FALSE; - } - -- c (is->tagprefix, "Got completion response for command %05u '%s'\n", ic->tag, ic->name); -+ c (is->priv->tagprefix, "Got completion response for command %05u '%s'\n", ic->tag, camel_imapx_job_get_kind_name (ic->job_kind)); -+ -+ g_mutex_lock (&is->priv->changes_lock); - - if (camel_folder_change_info_changed (is->priv->changes)) { -- CamelFolder *folder; -+ CamelFolder *folder = NULL; - CamelIMAPXMailbox *mailbox; -+ CamelFolderChangeInfo *changes; - -- g_mutex_lock (&is->priv->select_lock); -- mailbox = g_weak_ref_get (&is->priv->select_mailbox); -- g_mutex_unlock (&is->priv->select_lock); -+ changes = is->priv->changes; -+ is->priv->changes = camel_folder_change_info_new (); - -- g_return_val_if_fail (mailbox != NULL, FALSE); -+ g_mutex_unlock (&is->priv->changes_lock); - -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_val_if_fail (folder != NULL, FALSE); -+ mailbox = camel_imapx_server_ref_selected (is); - -- camel_folder_summary_save_to_db (folder->summary, NULL); -+ g_warn_if_fail (mailbox != NULL); - -- imapx_update_store_summary (folder); -- camel_folder_changed (folder, is->priv->changes); -- camel_folder_change_info_clear (is->priv->changes); -+ if (mailbox) { -+ folder = imapx_server_ref_folder (is, mailbox); -+ g_return_val_if_fail (folder != NULL, FALSE); - -- g_object_unref (folder); -- g_object_unref (mailbox); -- } -+ camel_folder_summary_save_to_db (folder->summary, NULL); - -- QUEUE_LOCK (is); -+ imapx_update_store_summary (folder); -+ camel_folder_changed (folder, changes); -+ } - -- /* Move the command from the active queue to the done queue. -- * We're holding our own reference to the command so there's -- * no risk of accidentally finalizing it here. */ -- camel_imapx_command_queue_remove (is->active, ic); -- imapx_server_command_removed (is, ic); -- camel_imapx_command_queue_push_tail (is->done, ic); -+ camel_folder_change_info_free (changes); - -- if (is->literal == ic) -- is->literal = NULL; -+ g_clear_object (&folder); -+ g_clear_object (&mailbox); -+ } else { -+ g_mutex_unlock (&is->priv->changes_lock); -+ } - - if (g_list_next (ic->current_part) != NULL) { -- QUEUE_UNLOCK (is); - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -- "command still has unsent parts? %s", ic->name); -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, -+ "command still has unsent parts? %s", camel_imapx_job_get_kind_name (ic->job_kind)); - goto exit; - } - -- camel_imapx_command_queue_remove (is->done, ic); -- -- QUEUE_UNLOCK (is); -- - mailbox = camel_imapx_server_ref_selected (is); - - ic->status = imapx_parse_status ( -@@ -3403,16 +2393,22 @@ imapx_completion (CamelIMAPXServer *is, - if (ic->status == NULL) - goto exit; - -- if (ic->complete != NULL) -- ic->complete (is, ic); -+ if (ic->status->condition == IMAPX_CAPABILITY) { -+ guint32 list_extended = imapx_lookup_capability ("LIST-EXTENDED"); -+ -+ is->priv->is_cyrus = is->priv->is_cyrus || (ic->status->text && camel_strstrcase (ic->status->text, "cyrus")); -+ if (is->priv->is_cyrus && ic->status->u.cinfo && (ic->status->u.cinfo->capa & list_extended) != 0) { -+ /* Disable LIST-EXTENDED for cyrus servers */ -+ c (is->priv->tagprefix, "Disabling LIST-EXTENDED extension for a Cyrus server\n"); -+ ic->status->u.cinfo->capa &= ~list_extended; -+ } -+ } - - success = TRUE; - - exit: -- QUEUE_LOCK (is); -- imapx_command_start_next (is); -- QUEUE_UNLOCK (is); - -+ ic->completed = TRUE; - camel_imapx_command_unref (ic); - - return success; -@@ -3421,23 +2417,19 @@ exit: - static gboolean - imapx_step (CamelIMAPXServer *is, - GInputStream *input_stream, -+ GOutputStream *output_stream, - GCancellable *cancellable, - GError **error) - { -- GOutputStream *output_stream; - guint len; - guchar *token; - gint tok; - gboolean success = FALSE; - -- // poll ? wait for other stuff? loop? - tok = camel_imapx_input_stream_token ( - CAMEL_IMAPX_INPUT_STREAM (input_stream), - &token, &len, cancellable, error); - -- output_stream = camel_imapx_server_ref_output_stream (is); -- g_return_val_if_fail (output_stream != NULL, FALSE); -- - switch (tok) { - case IMAPX_TOK_ERROR: - /* GError is already set. */ -@@ -3458,6171 +2450,4070 @@ imapx_step (CamelIMAPXServer *is, - break; - default: - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "unexpected server response:"); - break; - } - -- g_clear_object (&output_stream); -- - return success; - } - --/* Used to run 1 command synchronously, -- * use for capa, login, and namespaces only. */ --static gboolean --imapx_command_run (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic, -- GCancellable *cancellable, -- GError **error) -+static void -+imapx_server_set_streams (CamelIMAPXServer *is, -+ GInputStream *input_stream, -+ GOutputStream *output_stream) - { -- GInputStream *input_stream; -- gboolean success = TRUE; -- -- input_stream = camel_imapx_server_ref_input_stream (is); -- g_return_val_if_fail (input_stream != NULL, FALSE); -- -- camel_imapx_command_close (ic); -- -- QUEUE_LOCK (is); -- imapx_command_start (is, ic); -- QUEUE_UNLOCK (is); -- -- while (success && ic->status == NULL) -- success = imapx_step (is, input_stream, cancellable, error); -- -- if (is->literal == ic) -- is->literal = NULL; -- -- QUEUE_LOCK (is); -- camel_imapx_command_queue_remove (is->active, ic); -- imapx_server_command_removed (is, ic); -- QUEUE_UNLOCK (is); -- -- g_object_unref (input_stream); -+ GConverter *logger; - -- return success; --} -+ if (input_stream != NULL) { -+ GInputStream *temp_stream; - --static void --imapx_command_complete (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- camel_imapx_command_done (ic); -- camel_imapx_command_unref (ic); --} -+ /* The logger produces debugging output. */ -+ logger = camel_imapx_logger_new (is->priv->tagprefix); -+ input_stream = g_converter_input_stream_new ( -+ input_stream, logger); -+ g_clear_object (&logger); - --static void --imapx_command_cancelled (GCancellable *cancellable, -- CamelIMAPXCommand *ic) --{ -- /* Unblock imapx_command_run_sync() immediately. -- * -- * If camel_imapx_command_done() is called sometime later, -- * the GCond will broadcast but no one will be listening. */ -+ /* Buffer the input stream for parsing. */ -+ temp_stream = camel_imapx_input_stream_new (input_stream); -+ camel_binding_bind_property ( -+ temp_stream, "close-base-stream", -+ input_stream, "close-base-stream", -+ G_BINDING_SYNC_CREATE); -+ g_object_unref (input_stream); -+ input_stream = temp_stream; -+ } - -- camel_imapx_command_done (ic); --} -+ if (output_stream != NULL) { -+ /* The logger produces debugging output. */ -+ logger = camel_imapx_logger_new (is->priv->tagprefix); -+ output_stream = g_converter_output_stream_new ( -+ output_stream, logger); -+ g_clear_object (&logger); -+ } - --/* The caller should free the command as well */ --static gboolean --imapx_command_run_sync (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic, -- GCancellable *cancellable, -- GError **error) --{ -- guint cancel_id = 0; -- gboolean success = TRUE; -+ g_mutex_lock (&is->priv->stream_lock); - -- /* FIXME The only caller of this function currently does not set -- * a "complete" callback function, so we can get away with -- * referencing the command here and dropping the reference -- * in imapx_command_complete(). The queueing/dequeueing -- * of these things is too complex for my little mind, so -- * we may have to revisit the reference counting if this -- * function gets another caller. */ -- -- g_warn_if_fail (ic->complete == NULL); -- ic->complete = imapx_command_complete; -- -- if (G_IS_CANCELLABLE (cancellable)) -- cancel_id = g_cancellable_connect ( -- cancellable, -- G_CALLBACK (imapx_command_cancelled), -- camel_imapx_command_ref (ic), -- (GDestroyNotify) camel_imapx_command_unref); -- -- /* Unref'ed in imapx_command_complete(). */ -- camel_imapx_command_ref (ic); -+ /* Don't close the base streams so STARTTLS works correctly. */ - -- imapx_command_queue (is, ic); -+ if (G_IS_FILTER_INPUT_STREAM (is->priv->input_stream)) { -+ g_filter_input_stream_set_close_base_stream ( -+ G_FILTER_INPUT_STREAM (is->priv->input_stream), -+ FALSE); -+ } - -- camel_imapx_command_wait (ic); -+ if (G_IS_FILTER_OUTPUT_STREAM (is->priv->output_stream)) { -+ g_filter_output_stream_set_close_base_stream ( -+ G_FILTER_OUTPUT_STREAM (is->priv->output_stream), -+ FALSE); -+ } - -- if (cancel_id > 0) -- g_cancellable_disconnect (cancellable, cancel_id); -+ g_clear_object (&is->priv->input_stream); -+ is->priv->input_stream = input_stream; - -- if (camel_imapx_command_set_error_if_failed (ic, error)) -- return FALSE; -+ g_clear_object (&is->priv->output_stream); -+ is->priv->output_stream = output_stream; - -- return success; -+ g_mutex_unlock (&is->priv->stream_lock); - } - --static gboolean --imapx_ensure_mailbox_permanentflags (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- GCancellable *cancellable, -- GError **error) -+#ifdef G_OS_UNIX -+static void -+imapx_server_child_process_setup (gpointer user_data) - { -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+#ifdef TIOCNOTTY -+ gint fd; -+#endif - -- if (camel_imapx_mailbox_get_permanentflags (mailbox) != ~0) -- return TRUE; -+ setsid (); - -- /* This will also invoke SELECT command, which updates PERMANENTFLAGS -- for the mailbox. There might be possible to use EXAMINE for it, -- but some servers do not return the same set of flags as with SELECT. -- It's a little hack on top of the IMAPx implementation. */ -- return camel_imapx_server_noop (is, mailbox, cancellable, error); -+#ifdef TIOCNOTTY -+ /* Detach from the controlling tty if we have one. Otherwise, -+ * SSH might do something stupid like trying to use it instead -+ * of running $SSH_ASKPASS. */ -+ if ((fd = open ("/dev/tty", O_RDONLY)) != -1) { -+ ioctl (fd, TIOCNOTTY, NULL); -+ close (fd); -+ } -+#endif /* TIOCNOTTY */ - } -+#endif /* G_OS_UNIX */ - --/* ********************************************************************** */ --// IDLE support -- --/*TODO handle negative cases sanely */ - static gboolean --imapx_command_idle_stop (CamelIMAPXServer *is, -- GError **error) --{ -- GOutputStream *output_stream; -- GCancellable *cancellable; -- gboolean success; -+connect_to_server_process (CamelIMAPXServer *is, -+ const gchar *cmd, -+ GError **error) -+{ -+ GSubprocessLauncher *launcher; -+ GSubprocess *subprocess = NULL; -+ CamelNetworkSettings *network_settings; -+ CamelProvider *provider; -+ CamelSettings *settings; -+ CamelIMAPXStore *store; -+ CamelURL url; -+ gchar **argv = NULL; -+ gchar *buf; -+ gchar *cmd_copy; -+ gchar *full_cmd; -+ const gchar *password; -+ gchar *host; -+ gchar *user; -+ guint16 port; - -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ memset (&url, 0, sizeof (CamelURL)); - -- output_stream = camel_imapx_server_ref_output_stream (is); -- g_return_val_if_fail (output_stream != NULL, FALSE); -+ launcher = g_subprocess_launcher_new ( -+ G_SUBPROCESS_FLAGS_STDIN_PIPE | -+ G_SUBPROCESS_FLAGS_STDOUT_PIPE | -+ G_SUBPROCESS_FLAGS_STDERR_SILENCE); - -- cancellable = g_weak_ref_get (&is->priv->parser_cancellable); -+#ifdef G_OS_UNIX -+ g_subprocess_launcher_set_child_setup ( -+ launcher, imapx_server_child_process_setup, -+ NULL, (GDestroyNotify) NULL); -+#endif - -- g_mutex_lock (&is->priv->stream_lock); -- success = g_output_stream_write_all ( -- output_stream, "DONE\r\n", 6, NULL, cancellable, error); -- g_mutex_unlock (&is->priv->stream_lock); -+ store = camel_imapx_server_ref_store (is); - -- if (!success) { -- g_prefix_error (error, "Unable to issue DONE: "); -- c (is->tagprefix, "Failed to issue DONE to terminate IDLE\n"); -- is->state = IMAPX_SHUTDOWN; -- g_main_loop_quit (is->priv->parser_main_loop); -- } -+ password = camel_service_get_password (CAMEL_SERVICE (store)); -+ provider = camel_service_get_provider (CAMEL_SERVICE (store)); -+ settings = camel_service_ref_settings (CAMEL_SERVICE (store)); - -- g_clear_object (&cancellable); -- g_clear_object (&output_stream); -+ 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); - -- return success; --} -+ /* Put full details in the environment, in case the connection -+ * program needs them */ -+ camel_url_set_protocol (&url, provider->protocol); -+ camel_url_set_host (&url, host); -+ camel_url_set_port (&url, port); -+ camel_url_set_user (&url, user); -+ buf = camel_url_to_string (&url, 0); - --static void --imapx_command_idle_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- GError *local_error = NULL; -+ g_subprocess_launcher_setenv (launcher, "URL", buf, TRUE); -+ g_subprocess_launcher_setenv (launcher, "URLHOST", host, TRUE); - -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+ if (port > 0) { -+ gchar *port_string; - -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error performing IDLE")); -- camel_imapx_job_take_error (job, local_error); -+ port_string = g_strdup_printf ("%u", port); -+ g_subprocess_launcher_setenv ( -+ launcher, "URLPORT", port_string, TRUE); -+ g_free (port_string); - } - -- g_rec_mutex_lock (&is->priv->idle_lock); -- is->priv->idle_state = IMAPX_IDLE_OFF; -- g_rec_mutex_unlock (&is->priv->idle_lock); -+ if (user != NULL) { -+ g_subprocess_launcher_setenv ( -+ launcher, "URLPORT", user, TRUE); -+ } - -- imapx_unregister_job (is, job); --} -+ if (password != NULL) { -+ g_subprocess_launcher_setenv ( -+ launcher, "URLPASSWD", password, TRUE); -+ } - --static gboolean --imapx_job_idle_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXCommand *ic; -- CamelIMAPXCommandPart *cp; -- CamelIMAPXMailbox *mailbox; -- gboolean success = TRUE; -+ g_free (buf); - -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_val_if_fail (mailbox != NULL, FALSE); -+ g_object_unref (settings); -+ g_object_unref (store); - -- ic = camel_imapx_command_new ( -- is, "IDLE", mailbox, "IDLE"); -- camel_imapx_command_set_job (ic, job); -- ic->pri = job->pri; -- ic->complete = imapx_command_idle_done; -+ /* Now do %h, %u, etc. substitution in cmd */ -+ buf = cmd_copy = g_strdup (cmd); - -- camel_imapx_command_close (ic); -- cp = g_queue_peek_head (&ic->parts); -- cp->type |= CAMEL_IMAPX_COMMAND_CONTINUATION; -+ full_cmd = g_strdup (""); - -- QUEUE_LOCK (is); -- g_rec_mutex_lock (&is->priv->idle_lock); -- /* Don't issue it if the idle was cancelled already */ -- if (is->priv->idle_state == IMAPX_IDLE_PENDING) { -- is->priv->idle_state = IMAPX_IDLE_ISSUED; -+ for (;;) { -+ gchar *pc; -+ gchar *tmp; -+ const gchar *var; -+ gint len; - -- if (camel_imapx_command_queue_is_empty (is->active)) { -- imapx_command_start (is, ic); -- } else { -- c (is->tagprefix, "finally cancelling IDLE, other command was quicker\n"); -- is->priv->idle_state = IMAPX_IDLE_OFF; -- imapx_unregister_job (is, job); -+ pc = strchr (buf, '%'); -+ ignore: -+ if (!pc) { -+ tmp = g_strdup_printf ("%s%s", full_cmd, buf); -+ g_free (full_cmd); -+ full_cmd = tmp; -+ break; - } -- } else { -- imapx_unregister_job (is, job); -- } -- g_rec_mutex_unlock (&is->priv->idle_lock); -- QUEUE_UNLOCK (is); - -- camel_imapx_command_unref (ic); -+ len = pc - buf; - -- g_object_unref (mailbox); -+ var = NULL; - -- return success; --} -+ switch (pc[1]) { -+ case 'h': -+ var = host; -+ break; -+ case 'u': -+ var = user; -+ break; -+ } -+ if (!var) { -+ /* If there wasn't a valid %-code, with an actual -+ * variable to insert, pretend we didn't see the % */ -+ pc = strchr (pc + 1, '%'); -+ goto ignore; -+ } -+ tmp = g_strdup_printf ("%s%.*s%s", full_cmd, len, buf, var); -+ g_free (full_cmd); -+ full_cmd = tmp; -+ buf = pc + 2; -+ } - --static gboolean --camel_imapx_server_idle (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXJob *job; -- gint previous_connection_timeout; -- gboolean success; -+ g_free (cmd_copy); - -- job = camel_imapx_job_new (cancellable); -- job->type = IMAPX_JOB_IDLE; -- job->start = imapx_job_idle_start; -+ g_free (host); -+ g_free (user); - -- camel_imapx_job_set_mailbox (job, mailbox); -+ if (g_shell_parse_argv (full_cmd, NULL, &argv, error)) { -+ subprocess = g_subprocess_launcher_spawnv ( -+ launcher, (const gchar * const *) argv, error); -+ g_strfreev (argv); -+ } - -- previous_connection_timeout = imapx_server_set_connection_timeout (is->priv->connection, 0); -+ g_free (full_cmd); -+ g_object_unref (launcher); - -- success = imapx_submit_job (is, job, error); -+ if (subprocess != NULL) { -+ GInputStream *input_stream; -+ GOutputStream *output_stream; - -- if (previous_connection_timeout >= 0) -- imapx_server_set_connection_timeout (is->priv->connection, previous_connection_timeout); -+ g_mutex_lock (&is->priv->stream_lock); -+ g_warn_if_fail (is->priv->subprocess == NULL); -+ is->priv->subprocess = g_object_ref (subprocess); -+ g_mutex_unlock (&is->priv->stream_lock); - -- camel_imapx_job_unref (job); -+ input_stream = g_subprocess_get_stdout_pipe (subprocess); -+ output_stream = g_subprocess_get_stdin_pipe (subprocess); - -- return success; --} -+ imapx_server_set_streams (is, input_stream, output_stream); - --static gboolean --imapx_job_fetch_new_messages_matches (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox, -- const gchar *uid) --{ -- return camel_imapx_job_has_mailbox (job, mailbox); -+ g_object_unref (subprocess); -+ } -+ -+ return TRUE; - } - - static gboolean --imapx_server_fetch_new_messages (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- gboolean async, -- gboolean update_unseen, -- GCancellable *cancellable, -- GError **error) -+imapx_connect_to_server (CamelIMAPXServer *is, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelIMAPXJob *job; -- RefreshInfoData *data; -- gboolean success; -+ CamelNetworkSettings *network_settings; -+ CamelNetworkSecurityMethod method; -+ CamelIMAPXStore *store; -+ CamelSettings *settings; -+ GIOStream *connection = NULL; -+ GIOStream *tls_stream; -+ GSocket *socket; -+ guint len; -+ guchar *token; -+ gint tok; -+ CamelIMAPXCommand *ic; -+ gchar *shell_command = NULL; -+ gboolean use_shell_command; -+ gboolean success = TRUE; -+ gchar *host; - -- data = g_slice_new0 (RefreshInfoData); -- data->changes = camel_folder_change_info_new (); -- data->update_unseen = update_unseen; -+ store = camel_imapx_server_ref_store (is); - -- job = camel_imapx_job_new (cancellable); -- job->type = IMAPX_JOB_FETCH_NEW_MESSAGES; -- job->start = imapx_job_fetch_new_messages_start; -- job->matches = imapx_job_fetch_new_messages_matches; -- job->noreply = async; -+ settings = camel_service_ref_settings (CAMEL_SERVICE (store)); - -- camel_imapx_job_set_mailbox (job, mailbox); -+ network_settings = CAMEL_NETWORK_SETTINGS (settings); -+ host = camel_network_settings_dup_host (network_settings); -+ method = camel_network_settings_get_security_method (network_settings); - -- camel_imapx_job_set_data ( -- job, data, (GDestroyNotify) refresh_info_data_free); -+ use_shell_command = camel_imapx_settings_get_use_shell_command ( -+ CAMEL_IMAPX_SETTINGS (settings)); - -- success = imapx_submit_job (is, job, error); -+ if (use_shell_command) -+ shell_command = camel_imapx_settings_dup_shell_command ( -+ CAMEL_IMAPX_SETTINGS (settings)); - -- camel_imapx_job_unref (job); -+ g_object_unref (settings); - -- return success; --} -+ if (shell_command != NULL) { -+ success = connect_to_server_process (is, shell_command, error); - --static gboolean --imapx_call_idle (gpointer data) --{ -- CamelFolder *folder; -- CamelIMAPXServer *is; -- CamelIMAPXMailbox *mailbox; -- GCancellable *cancellable; -- GError *local_error = NULL; -+ g_free (shell_command); - -- is = g_weak_ref_get (data); -+ if (success) -+ goto connected; -+ else -+ goto exit; -+ } - -- if (is == NULL) -- goto exit; -+ connection = camel_network_service_connect_sync ( -+ CAMEL_NETWORK_SERVICE (store), cancellable, error); - -- /* XXX Rename to 'pending_lock'? */ -- g_rec_mutex_lock (&is->priv->idle_lock); -- g_source_unref (is->priv->idle_pending); -- is->priv->idle_pending = NULL; -+ if (connection != NULL) { -+ GInputStream *input_stream; -+ GOutputStream *output_stream; -+ GError *local_error = NULL; - -- if (is->priv->idle_state != IMAPX_IDLE_PENDING) { -- g_rec_mutex_unlock (&is->priv->idle_lock); -- goto exit; -- } -+ /* Disable the Nagle algorithm with TCP_NODELAY, since IMAP -+ * commands should be issued immediately even we've not yet -+ * received a response to a previous command. */ -+ socket = g_socket_connection_get_socket ( -+ G_SOCKET_CONNECTION (connection)); -+ g_socket_set_option ( -+ socket, IPPROTO_TCP, TCP_NODELAY, 1, &local_error); -+ if (local_error != NULL) { -+ /* Failure to set the socket option is non-fatal. */ -+ g_warning ("%s: %s", G_STRFUNC, local_error->message); -+ g_clear_error (&local_error); -+ } - -- g_rec_mutex_unlock (&is->priv->idle_lock); -+ g_mutex_lock (&is->priv->stream_lock); -+ g_warn_if_fail (is->priv->connection == NULL); -+ is->priv->connection = g_object_ref (connection); -+ g_mutex_unlock (&is->priv->stream_lock); - -- g_mutex_lock (&is->priv->select_lock); -- mailbox = g_weak_ref_get (&is->priv->select_mailbox); -- g_mutex_unlock (&is->priv->select_lock); -+ input_stream = g_io_stream_get_input_stream (connection); -+ output_stream = g_io_stream_get_output_stream (connection); - -- if (mailbox == NULL) -- goto exit; -+ imapx_server_set_streams (is, input_stream, output_stream); - -- folder = imapx_server_ref_folder (is, mailbox); -- if (folder == NULL) -+ /* Hang on to the connection reference in case we need to -+ * issue STARTTLS below. */ -+ } else { -+ success = FALSE; - goto exit; -+ } - -- cancellable = g_weak_ref_get (&is->priv->parser_cancellable); -+connected: -+ while (1) { -+ GInputStream *input_stream; - -- /* We block here until the IDLE command completes. */ -- camel_imapx_server_idle (is, mailbox, cancellable, &local_error); -- -- if (local_error == NULL) { -- gboolean have_new_messages; -- gboolean fetch_new_messages; -+ input_stream = camel_imapx_server_ref_input_stream (is); - -- have_new_messages = -- camel_imapx_mailbox_get_messages (mailbox) > -- camel_folder_summary_count (folder->summary); -+ token = NULL; -+ tok = camel_imapx_input_stream_token ( -+ CAMEL_IMAPX_INPUT_STREAM (input_stream), -+ &token, &len, cancellable, error); - -- fetch_new_messages = -- have_new_messages && -- imapx_is_command_queue_empty (is); -+ if (tok < 0) { -+ success = FALSE; - -- if (fetch_new_messages) -- imapx_server_fetch_new_messages ( -- is, mailbox, TRUE, TRUE, -- cancellable, &local_error); -- } -+ } else if (tok == '*') { -+ success = imapx_untagged ( -+ is, input_stream, cancellable, error); - -- /* XXX Need a better way to propagate IDLE errors. */ -- if (local_error != NULL) { -- if (!g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && -- is->state != IMAPX_SHUTDOWN) -- g_warning ("%s: %s", G_STRFUNC, local_error->message); -- g_clear_error (&local_error); -- } -+ if (success) { -+ g_object_unref (input_stream); -+ break; -+ } - -- g_clear_object (&folder); -- g_clear_object (&cancellable); -+ } else { -+ camel_imapx_input_stream_ungettoken ( -+ CAMEL_IMAPX_INPUT_STREAM (input_stream), -+ tok, token, len); - --exit: -- g_clear_object (&is); -+ success = camel_imapx_input_stream_text ( -+ CAMEL_IMAPX_INPUT_STREAM (input_stream), -+ &token, cancellable, error); - -- return G_SOURCE_REMOVE; --} -+ g_free (token); -+ } - --static gpointer --imapx_idle_thread (gpointer data) --{ -- CamelIMAPXServer *is = (CamelIMAPXServer *) data; -- GSource *pending; -+ g_object_unref (input_stream); - -- g_main_context_push_thread_default (is->priv->idle_main_context); -+ if (!success) -+ goto exit; -+ } - -- /* Schedule the first IDLE command after a brief "dwell" -- * delay so any other pending commands get priority. -- * -- * XXX Don't fully understand why this is necessary, but -- * for now just adapting old code and hoping to avoid -- * regressions. -- */ -+ g_mutex_lock (&is->priv->stream_lock); - -- g_rec_mutex_lock (&is->priv->idle_lock); -+ if (!is->priv->cinfo) { -+ g_mutex_unlock (&is->priv->stream_lock); - -- g_warn_if_fail (is->priv->idle_pending == NULL); -- pending = g_timeout_source_new_seconds (IMAPX_IDLE_DWELL_TIME); -- g_source_set_name (pending, "imapx_call_idle"); -- g_source_set_callback ( -- pending, imapx_call_idle, -- imapx_weak_ref_new (is), -- (GDestroyNotify) imapx_weak_ref_free); -- g_source_attach (pending, is->priv->idle_main_context); -- is->priv->idle_pending = g_source_ref (pending); -- g_source_unref (pending); -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_CAPABILITY, "CAPABILITY"); - -- g_rec_mutex_unlock (&is->priv->idle_lock); -+ success = camel_imapx_server_process_command_sync (is, ic, _("Failed to get capabilities"), cancellable, error); - -- g_main_loop_run (is->priv->idle_main_loop); -+ camel_imapx_command_unref (ic); - -- g_main_context_pop_thread_default (is->priv->idle_main_context); -+ if (!success) -+ goto exit; -+ } else { -+ g_mutex_unlock (&is->priv->stream_lock); -+ } - -- g_object_unref (is); -+ if (method == CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT) { - -- return NULL; --} -+ g_mutex_lock (&is->priv->stream_lock); - --static CamelIMAPXIdleStopResult --imapx_stop_idle (CamelIMAPXServer *is, -- GError **error) --{ -- CamelIMAPXIdleStopResult result = IMAPX_IDLE_STOP_NOOP; -- time_t now; -+ if (CAMEL_IMAPX_LACK_CAPABILITY (is->priv->cinfo, STARTTLS)) { -+ g_mutex_unlock (&is->priv->stream_lock); -+ g_set_error ( -+ error, CAMEL_ERROR, -+ CAMEL_ERROR_GENERIC, -+ _("Failed to connect to IMAP server %s in secure mode: %s"), -+ host, _("STARTTLS not supported")); -+ success = FALSE; -+ goto exit; -+ } else { -+ g_mutex_unlock (&is->priv->stream_lock); -+ } - -- time (&now); -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_STARTTLS, "STARTTLS"); - -- g_rec_mutex_lock (&is->priv->idle_lock); -+ success = camel_imapx_server_process_command_sync (is, ic, _("Failed to issue STARTTLS"), cancellable, error); - -- switch (is->priv->idle_state) { -- case IMAPX_IDLE_ISSUED: -- is->priv->idle_state = IMAPX_IDLE_CANCEL; -- result = IMAPX_IDLE_STOP_SUCCESS; -- break; -+ if (success) { -+ g_mutex_lock (&is->priv->stream_lock); - -- case IMAPX_IDLE_CANCEL: -- result = IMAPX_IDLE_STOP_SUCCESS; -- break; -+ /* See if we got new capabilities -+ * in the STARTTLS response. */ -+ imapx_free_capability (is->priv->cinfo); -+ is->priv->cinfo = NULL; -+ if (ic->status->condition == IMAPX_CAPABILITY) { -+ is->priv->cinfo = ic->status->u.cinfo; -+ ic->status->u.cinfo = NULL; -+ c (is->priv->tagprefix, "got capability flags %08x\n", is->priv->cinfo ? is->priv->cinfo->capa : 0xFFFFFFFF); -+ imapx_server_stash_command_arguments (is); -+ } - -- case IMAPX_IDLE_WAIT_DONE: -- result = IMAPX_IDLE_STOP_WAIT_DONE; -- break; -+ g_mutex_unlock (&is->priv->stream_lock); -+ } - -- case IMAPX_IDLE_STARTED: -- if (imapx_command_idle_stop (is, error)) { -- result = IMAPX_IDLE_STOP_WAIT_DONE; -- is->priv->idle_state = IMAPX_IDLE_WAIT_DONE; -- } else { -- result = IMAPX_IDLE_STOP_ERROR; -- is->priv->idle_state = IMAPX_IDLE_OFF; -- goto exit; -- } -- break; -+ camel_imapx_command_unref (ic); - -- case IMAPX_IDLE_PENDING: -- is->priv->idle_state = IMAPX_IDLE_OFF; -- break; -+ if (!success) -+ goto exit; - -- case IMAPX_IDLE_OFF: -- break; -- } -+ tls_stream = camel_network_service_starttls ( -+ CAMEL_NETWORK_SERVICE (store), connection, error); - --exit: -- g_rec_mutex_unlock (&is->priv->idle_lock); -+ if (tls_stream != NULL) { -+ GInputStream *input_stream; -+ GOutputStream *output_stream; - -- return result; --} -+ g_mutex_lock (&is->priv->stream_lock); -+ g_object_unref (is->priv->connection); -+ is->priv->connection = g_object_ref (tls_stream); -+ g_mutex_unlock (&is->priv->stream_lock); - --static void --imapx_start_idle (CamelIMAPXServer *is) --{ -- if (camel_application_is_exiting) -- return; -+ input_stream = -+ g_io_stream_get_input_stream (tls_stream); -+ output_stream = -+ g_io_stream_get_output_stream (tls_stream); - -- g_rec_mutex_lock (&is->priv->idle_lock); -+ imapx_server_set_streams ( -+ is, input_stream, output_stream); - -- if (is->priv->idle_state != IMAPX_IDLE_OFF) { -- g_warn_if_fail (is->priv->idle_state == IMAPX_IDLE_OFF); -- g_rec_mutex_unlock (&is->priv->idle_lock); -- return; -- } -+ g_object_unref (tls_stream); -+ } else { -+ g_prefix_error ( -+ error, -+ _("Failed to connect to IMAP server %s in secure mode: "), -+ host); -+ success = FALSE; -+ goto exit; -+ } - -- is->priv->idle_state = IMAPX_IDLE_PENDING; -+ /* Get new capabilities if they weren't already given */ -+ g_mutex_lock (&is->priv->stream_lock); -+ if (is->priv->cinfo == NULL) { -+ g_mutex_unlock (&is->priv->stream_lock); -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_CAPABILITY, "CAPABILITY"); -+ success = camel_imapx_server_process_command_sync (is, ic, _("Failed to get capabilities"), cancellable, error); -+ camel_imapx_command_unref (ic); - -- if (is->priv->idle_thread == NULL) { -- is->priv->idle_thread = g_thread_new ( -- NULL, imapx_idle_thread, g_object_ref (is)); -- -- } else if (is->priv->idle_pending == NULL) { -- GSource *pending; -- -- pending = g_idle_source_new (); -- g_source_set_name (pending, "imapx_call_idle"); -- g_source_set_callback ( -- pending, imapx_call_idle, -- imapx_weak_ref_new (is), -- (GDestroyNotify) imapx_weak_ref_free); -- g_source_attach (pending, is->priv->idle_main_context); -- is->priv->idle_pending = g_source_ref (pending); -- g_source_unref (pending); -+ if (!success) -+ goto exit; -+ } else { -+ g_mutex_unlock (&is->priv->stream_lock); -+ } - } - -- g_rec_mutex_unlock (&is->priv->idle_lock); --} -+exit: -+ if (!success) { -+ g_mutex_lock (&is->priv->stream_lock); - --static gboolean --imapx_in_idle (CamelIMAPXServer *is) --{ -- gboolean in_idle = FALSE; -+ g_clear_object (&is->priv->input_stream); -+ g_clear_object (&is->priv->output_stream); -+ g_clear_object (&is->priv->connection); -+ g_clear_object (&is->priv->subprocess); -+ -+ if (is->priv->cinfo != NULL) { -+ imapx_free_capability (is->priv->cinfo); -+ is->priv->cinfo = NULL; -+ } - -- g_rec_mutex_lock (&is->priv->idle_lock); -+ g_mutex_unlock (&is->priv->stream_lock); -+ } - -- if (is->priv->idle_thread != NULL) -- in_idle = (is->priv->idle_state > IMAPX_IDLE_OFF); -+ g_free (host); - -- g_rec_mutex_unlock (&is->priv->idle_lock); -+ g_clear_object (&connection); -+ g_clear_object (&store); - -- return in_idle; -+ return success; - } - --static gboolean --imapx_use_idle (CamelIMAPXServer *is) -+gboolean -+camel_imapx_server_is_connected (CamelIMAPXServer *imapx_server) - { -- gboolean use_idle = FALSE; -- -- /* No need for IDLE if the server supports NOTIFY. */ -- if (CAMEL_IMAPX_HAVE_CAPABILITY (is->cinfo, NOTIFY)) -- return FALSE; -- -- if (CAMEL_IMAPX_HAVE_CAPABILITY (is->cinfo, IDLE)) { -- CamelIMAPXSettings *settings; -- -- settings = camel_imapx_server_ref_settings (is); -- use_idle = camel_imapx_settings_get_use_idle (settings); -- g_object_unref (settings); -- } -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (imapx_server), FALSE); - -- return use_idle; -+ return imapx_server->priv->state >= IMAPX_CONNECTED; - } - --// end IDLE --/* ********************************************************************** */ --static void --imapx_command_select_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) -+CamelAuthenticationResult -+camel_imapx_server_authenticate_sync (CamelIMAPXServer *is, -+ const gchar *mechanism, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelIMAPXJob *job; -- CamelIMAPXMailbox *select_closing; -- CamelIMAPXMailbox *select_pending; -- GError *local_error = NULL; -- -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -- -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- CamelIMAPXCommandQueue *failed; -- GQueue trash = G_QUEUE_INIT; -- GList *list, *link; -- gboolean noperm_error; -- -- c (is->tagprefix, "Select failed: %s\n", local_error ? local_error->message : "Unknown error"); -+ CamelNetworkSettings *network_settings; -+ CamelIMAPXStore *store; -+ CamelService *service; -+ CamelSettings *settings; -+ CamelAuthenticationResult result; -+ CamelIMAPXCommand *ic; -+ CamelSasl *sasl = NULL; -+ gchar *host; -+ gchar *user; - -- g_mutex_lock (&is->priv->select_lock); -- select_closing = g_weak_ref_get (&is->priv->select_closing); -- select_pending = g_weak_ref_get (&is->priv->select_pending); -- g_weak_ref_set (&is->priv->select_mailbox, NULL); -- g_weak_ref_set (&is->priv->select_closing, NULL); -- g_weak_ref_set (&is->priv->select_pending, NULL); -- is->state = IMAPX_INITIALISED; -- g_mutex_unlock (&is->priv->select_lock); -+ g_return_val_if_fail ( -+ CAMEL_IS_IMAPX_SERVER (is), -+ CAMEL_AUTHENTICATION_ERROR); - -- failed = camel_imapx_command_queue_new (); -+ store = camel_imapx_server_ref_store (is); - -- QUEUE_LOCK (is); -+ service = CAMEL_SERVICE (store); -+ settings = camel_service_ref_settings (service); - -- noperm_error = select_pending != NULL && ic->status && ic->status->result == IMAPX_NO && -- (ic->status->condition == IMAPX_NOPERM || ic->status->condition == IMAPX_UNKNOWN); -+ network_settings = CAMEL_NETWORK_SETTINGS (settings); -+ host = camel_network_settings_dup_host (network_settings); -+ user = camel_network_settings_dup_user (network_settings); - -- if (select_pending != NULL) { -- GList *head = camel_imapx_command_queue_peek_head_link (is->queue); -- -- for (link = head; link != NULL; link = g_list_next (link)) { -- CamelIMAPXCommand *cw = link->data; -- CamelIMAPXMailbox *cw_mailbox; -- -- cw_mailbox = camel_imapx_command_ref_mailbox (cw); -- -- if (cw_mailbox == select_pending) { -- c ( -- is->tagprefix, -- "Cancelling command '%s'(%p) " -- "for mailbox '%s'\n", -- cw->name, cw, -- camel_imapx_mailbox_get_name (cw_mailbox)); -- g_queue_push_tail (&trash, link); -- } -+ g_object_unref (settings); - -- g_clear_object (&cw_mailbox); -- } -- } -+ if (mechanism != NULL) { -+ g_mutex_lock (&is->priv->stream_lock); - -- if (noperm_error) { -- /* This avoids another SELECT try on this mailbox; -- the mailbox can be write-only in this case. */ -- if (camel_imapx_mailbox_get_permanentflags (select_pending) == ~0) -- camel_imapx_mailbox_set_permanentflags (select_pending, 0); -+ if (is->priv->cinfo && !g_hash_table_lookup (is->priv->cinfo->auth_types, mechanism) && ( -+ !g_str_equal (mechanism, "Google") || !g_hash_table_lookup (is->priv->cinfo->auth_types, "XOAUTH2"))) { -+ g_mutex_unlock (&is->priv->stream_lock); -+ g_set_error ( -+ error, CAMEL_SERVICE_ERROR, -+ CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE, -+ _("IMAP server %s does not support %s " -+ "authentication"), host, mechanism); -+ result = CAMEL_AUTHENTICATION_ERROR; -+ goto exit; -+ } else { -+ g_mutex_unlock (&is->priv->stream_lock); - } - -- while ((link = g_queue_pop_head (&trash)) != NULL) { -- CamelIMAPXCommand *cw = link->data; -- camel_imapx_command_ref (cw); -- camel_imapx_command_queue_delete_link (is->queue, link); -- imapx_server_command_removed (is, cw); -- camel_imapx_command_queue_push_tail (failed, cw); -- camel_imapx_command_unref (cw); -+ sasl = camel_sasl_new ("imap", mechanism, service); -+ if (sasl == NULL) { -+ g_set_error ( -+ error, CAMEL_SERVICE_ERROR, -+ CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE, -+ _("No support for %s authentication"), -+ mechanism); -+ result = CAMEL_AUTHENTICATION_ERROR; -+ goto exit; - } -+ } - -- QUEUE_UNLOCK (is); -- -- list = camel_imapx_command_queue_peek_head_link (failed); -- -- for (link = list; link != NULL; link = g_list_next (link)) { -- CamelIMAPXCommand *cw = link->data; -- CamelIMAPXJob *failed_job; -- -- failed_job = camel_imapx_command_get_job (cw); -- -- if (!CAMEL_IS_IMAPX_JOB (failed_job)) { -- g_warn_if_reached (); -- continue; -- } -+ if (sasl != NULL) { -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_AUTHENTICATE, "AUTHENTICATE %A", sasl); -+ } else { -+ const gchar *password; - -- if (!noperm_error) -- camel_imapx_job_cancel (failed_job); -+ password = camel_service_get_password (service); - -- if (ic->status) -- cw->status = imapx_copy_status (ic->status); -+ if (user == NULL) { -+ g_set_error_literal ( -+ error, CAMEL_SERVICE_ERROR, -+ CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE, -+ _("Cannot authenticate without a username")); -+ result = CAMEL_AUTHENTICATION_ERROR; -+ goto exit; -+ } - -- cw->complete (is, cw); -+ if (password == NULL) { -+ g_set_error_literal ( -+ error, CAMEL_SERVICE_ERROR, -+ CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE, -+ _("Authentication password not available")); -+ result = CAMEL_AUTHENTICATION_ERROR; -+ goto exit; - } - -- camel_imapx_command_queue_free (failed); -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_LOGIN, "LOGIN %s %s", user, password); -+ } - -- camel_imapx_job_take_error (job, local_error); -- imapx_unregister_job (is, job); -+ if (!camel_imapx_server_process_command_sync (is, ic, _("Failed to authenticate"), cancellable, error) && ( -+ !ic->status || ic->status->result != IMAPX_NO)) -+ result = CAMEL_AUTHENTICATION_ERROR; -+ else if (ic->status->result == IMAPX_OK) -+ result = CAMEL_AUTHENTICATION_ACCEPTED; -+ else if (ic->status->result == IMAPX_NO) { -+ g_clear_error (error); - -- } else { -- CamelFolder *folder; -- CamelIMAPXSummary *imapx_summary; -- guint32 uidnext; -- -- c (is->tagprefix, "Select ok!\n"); -- -- g_mutex_lock (&is->priv->select_lock); -- select_closing = g_weak_ref_get (&is->priv->select_closing); -- select_pending = g_weak_ref_get (&is->priv->select_pending); -- g_weak_ref_set (&is->priv->select_mailbox, select_pending); -- g_weak_ref_set (&is->priv->select_closing, NULL); -- g_weak_ref_set (&is->priv->select_pending, NULL); -- is->state = IMAPX_SELECTED; -- g_mutex_unlock (&is->priv->select_lock); -+ if (camel_imapx_store_is_connecting_concurrent_connection (store)) { -+ /* At least one connection succeeded, probably max connection limit -+ set on the server had been reached, thus use special error code -+ for it, to instruct the connection manager to decrease the limit -+ and use already created connection. */ -+ g_set_error_literal ( -+ error, CAMEL_IMAPX_SERVER_ERROR, -+ CAMEL_IMAPX_SERVER_ERROR_CONCURRENT_CONNECT_FAILED, -+ ic->status->text ? ic->status->text : _("Unknown error")); -+ result = CAMEL_AUTHENTICATION_ERROR; -+ } else if (sasl) { -+ CamelSaslClass *sasl_class; - -- /* We should have a strong reference -- * on the newly-selected CamelFolder. */ -- folder = imapx_server_ref_folder (is, select_pending); -- g_return_if_fail (folder != NULL); -- -- uidnext = camel_imapx_mailbox_get_uidnext (select_pending); -- imapx_summary = CAMEL_IMAPX_SUMMARY (folder->summary); -- -- if (imapx_summary->uidnext < uidnext) { -- /* We don't want to fetch new messages if the command we selected this -- * folder for is *already* fetching all messages (i.e. scan_changes). -- * Bug #667725. */ -- CamelIMAPXJob *job = imapx_server_ref_job ( -- is, select_pending, -- IMAPX_JOB_REFRESH_INFO, NULL); -- if (job) { -- camel_imapx_job_unref (job); -- c ( -- is->tagprefix, -- "Will not fetch_new_messages when already refreshing information\n"); -+ sasl_class = CAMEL_SASL_GET_CLASS (sasl); -+ if (sasl_class && sasl_class->auth_type && !sasl_class->auth_type->need_password) { -+ g_set_error_literal ( -+ error, CAMEL_SERVICE_ERROR, -+ CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE, -+ ic->status->text ? ic->status->text : _("Unknown error")); -+ result = CAMEL_AUTHENTICATION_ERROR; - } else { -- imapx_server_fetch_new_messages (is, select_pending, TRUE, TRUE, NULL, NULL); -+ result = CAMEL_AUTHENTICATION_REJECTED; - } -+ } else { -+ result = CAMEL_AUTHENTICATION_REJECTED; - } -+ } else { -+ g_set_error_literal ( -+ error, CAMEL_SERVICE_ERROR, -+ CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE, -+ ic->status->text ? ic->status->text : _("Unknown error")); -+ result = CAMEL_AUTHENTICATION_ERROR; -+ } - --#if 0 /* see comment for disabled bits in imapx_job_refresh_info_start() */ -- /* This should trigger a new messages scan */ -- if (is->exists != folder->summary->root_view->total_count) -- g_warning ( -- "exists is %d our summary is %d and summary exists is %d\n", is->exists, -- folder->summary->root_view->total_count, -- ((CamelIMAPXSummary *) folder->summary)->exists); --#endif -+ /* Forget old capabilities after login. */ -+ if (result == CAMEL_AUTHENTICATION_ACCEPTED) { -+ g_mutex_lock (&is->priv->stream_lock); - -- g_clear_object (&folder); -+ if (is->priv->cinfo) { -+ imapx_free_capability (is->priv->cinfo); -+ is->priv->cinfo = NULL; -+ } -+ -+ if (ic->status->condition == IMAPX_CAPABILITY) { -+ is->priv->cinfo = ic->status->u.cinfo; -+ ic->status->u.cinfo = NULL; -+ c (is->priv->tagprefix, "got capability flags %08x\n", is->priv->cinfo ? is->priv->cinfo->capa : 0xFFFFFFFF); -+ imapx_server_stash_command_arguments (is); -+ } -+ -+ g_mutex_unlock (&is->priv->stream_lock); - } - -- if (select_closing != NULL) -- g_signal_emit (is, signals[MAILBOX_CLOSED], 0, select_closing); -+ camel_imapx_command_unref (ic); -+ -+ if (sasl != NULL) -+ g_object_unref (sasl); -+ -+exit: -+ g_free (host); -+ g_free (user); -+ -+ g_object_unref (store); - -- g_clear_object (&select_closing); -- g_clear_object (&select_pending); -+ return result; - } - --/* Should have a queue lock. TODO Change the way select is written */ --static void --imapx_maybe_select (CamelIMAPXServer *is, -- CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox) -+static gboolean -+imapx_reconnect (CamelIMAPXServer *is, -+ GCancellable *cancellable, -+ GError **error) - { - CamelIMAPXCommand *ic; -- CamelIMAPXMailbox *select_mailbox; -- CamelIMAPXMailbox *select_pending; -- gboolean nothing_to_do = FALSE; -- -- /* Select is complicated by the fact we may have commands -- * active on the server for a different selection. -- * -- * So this waits for any commands to complete, selects the -- * new mailbox, and halts the queuing of any new commands. -- * It is assumed whomever called us is about to issue a -- * high-priority command anyway. */ -+ CamelService *service; -+ CamelSession *session; -+ CamelIMAPXStore *store; -+ CamelSettings *settings; -+ gchar *mechanism; -+ gboolean use_qresync; -+ gboolean use_idle; -+ gboolean success = FALSE; - -- g_mutex_lock (&is->priv->select_lock); -+ store = camel_imapx_server_ref_store (is); - -- select_mailbox = g_weak_ref_get (&is->priv->select_mailbox); -- select_pending = g_weak_ref_get (&is->priv->select_pending); -+ service = CAMEL_SERVICE (store); -+ session = camel_service_ref_session (service); -+ if (!session) { -+ g_set_error_literal ( -+ error, CAMEL_SERVICE_ERROR, -+ CAMEL_SERVICE_ERROR_UNAVAILABLE, -+ _("You must be working online to complete this operation")); -+ g_object_unref (store); -+ return FALSE; -+ } - -- if (select_pending != NULL) { -- nothing_to_do = TRUE; -- } else if (select_mailbox == mailbox) { -- nothing_to_do = TRUE; -- } else if (!camel_imapx_command_queue_is_empty (is->active)) { -- nothing_to_do = TRUE; -- } else { -- g_weak_ref_set (&is->priv->select_pending, mailbox); -+ settings = camel_service_ref_settings (service); - -- if (select_mailbox != NULL) { -- g_weak_ref_set (&is->priv->select_mailbox, NULL); -- } else { -- /* If no mailbox was selected, we won't get a -- * [CLOSED] status so just point select_mailbox -- * at the newly-selected mailbox immediately. */ -- g_weak_ref_set (&is->priv->select_mailbox, mailbox); -- } -+ mechanism = camel_network_settings_dup_auth_mechanism ( -+ CAMEL_NETWORK_SETTINGS (settings)); - -- g_weak_ref_set (&is->priv->select_closing, select_mailbox); -+ use_qresync = camel_imapx_settings_get_use_qresync (CAMEL_IMAPX_SETTINGS (settings)); -+ use_idle = camel_imapx_settings_get_use_idle (CAMEL_IMAPX_SETTINGS (settings)); - -- /* Hrm, what about reconnecting? */ -- is->state = IMAPX_INITIALISED; -- } -+ g_object_unref (settings); - -- g_clear_object (&select_mailbox); -- g_clear_object (&select_pending); -+ if (!imapx_connect_to_server (is, cancellable, error)) -+ goto exception; - -- g_mutex_unlock (&is->priv->select_lock); -+ if (is->priv->state == IMAPX_AUTHENTICATED) -+ goto preauthed; - -- if (nothing_to_do) -- return; -+ if (!camel_session_authenticate_sync ( -+ session, service, mechanism, cancellable, error)) -+ goto exception; - -- g_signal_emit (is, signals[MAILBOX_SELECT], 0, mailbox); -+ /* After login we re-capa unless the server already told us. */ -+ g_mutex_lock (&is->priv->stream_lock); -+ if (is->priv->cinfo == NULL) { -+ GError *local_error = NULL; - -- ic = camel_imapx_command_new ( -- is, "SELECT", NULL, "SELECT %M", mailbox); -+ g_mutex_unlock (&is->priv->stream_lock); - -- if (is->use_qresync) { -- CamelFolder *folder; -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_CAPABILITY, "CAPABILITY"); -+ camel_imapx_server_process_command_sync (is, ic, _("Failed to get capabilities"), cancellable, &local_error); -+ camel_imapx_command_unref (ic); - -- folder = imapx_server_ref_folder (is, mailbox); -- camel_imapx_command_add_qresync_parameter (ic, folder); -- g_clear_object (&folder); -+ if (local_error != NULL) { -+ g_propagate_error (error, local_error); -+ goto exception; -+ } -+ } else { -+ g_mutex_unlock (&is->priv->stream_lock); - } - -- ic->complete = imapx_command_select_done; -- camel_imapx_command_set_job (ic, job); -- -- imapx_command_start (is, ic); -+ is->priv->state = IMAPX_AUTHENTICATED; - -- camel_imapx_command_unref (ic); --} -+preauthed: -+ /* Fetch namespaces (if supported). */ -+ g_mutex_lock (&is->priv->stream_lock); -+ if (CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, NAMESPACE)) { -+ GError *local_error = NULL; - --static void --imapx_server_set_streams (CamelIMAPXServer *is, -- GInputStream *input_stream, -- GOutputStream *output_stream) --{ -- GConverter *logger; -+ g_mutex_unlock (&is->priv->stream_lock); - -- if (input_stream != NULL) { -- GInputStream *temp_stream; -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_NAMESPACE, "NAMESPACE"); -+ camel_imapx_server_process_command_sync (is, ic, _("Failed to issue NAMESPACE"), cancellable, &local_error); -+ camel_imapx_command_unref (ic); - -- /* The logger produces debugging output. */ -- logger = camel_imapx_logger_new (is->tagprefix); -- input_stream = g_converter_input_stream_new ( -- input_stream, logger); -- g_clear_object (&logger); -+ if (local_error != NULL) { -+ g_propagate_error (error, local_error); -+ goto exception; -+ } - -- /* Buffer the input stream for parsing. */ -- temp_stream = camel_imapx_input_stream_new (input_stream); -- g_object_bind_property ( -- temp_stream, "close-base-stream", -- input_stream, "close-base-stream", -- G_BINDING_SYNC_CREATE); -- g_object_unref (input_stream); -- input_stream = temp_stream; -+ g_mutex_lock (&is->priv->stream_lock); - } - -- if (output_stream != NULL) { -- /* The logger produces debugging output. */ -- logger = camel_imapx_logger_new (is->tagprefix); -- output_stream = g_converter_output_stream_new ( -- output_stream, logger); -- g_clear_object (&logger); -- } -+ /* Enable quick mailbox resynchronization (if supported). */ -+ if (use_qresync && CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, QRESYNC)) { -+ GError *local_error = NULL; - -- g_mutex_lock (&is->priv->stream_lock); -+ g_mutex_unlock (&is->priv->stream_lock); - -- /* Don't close the base streams so STARTTLS works correctly. */ -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_ENABLE, "ENABLE CONDSTORE QRESYNC"); -+ camel_imapx_server_process_command_sync (is, ic, _("Failed to enable QResync"), cancellable, &local_error); -+ camel_imapx_command_unref (ic); - -- if (G_IS_FILTER_INPUT_STREAM (is->priv->input_stream)) { -- g_filter_input_stream_set_close_base_stream ( -- G_FILTER_INPUT_STREAM (is->priv->input_stream), -- FALSE); -- } -+ if (local_error != NULL) { -+ g_propagate_error (error, local_error); -+ goto exception; -+ } - -- if (G_IS_FILTER_OUTPUT_STREAM (is->priv->output_stream)) { -- g_filter_output_stream_set_close_base_stream ( -- G_FILTER_OUTPUT_STREAM (is->priv->output_stream), -- FALSE); -- } -+ g_mutex_lock (&is->priv->stream_lock); - -- g_clear_object (&is->priv->input_stream); -- is->priv->input_stream = input_stream; -+ is->priv->use_qresync = TRUE; -+ } else { -+ is->priv->use_qresync = FALSE; -+ } - -- g_clear_object (&is->priv->output_stream); -- is->priv->output_stream = output_stream; -+ /* Set NOTIFY options after enabling QRESYNC (if supported). */ -+ if (use_idle && CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, NOTIFY)) { -+ GError *local_error = NULL; - -- g_mutex_unlock (&is->priv->stream_lock); --} -+ g_mutex_unlock (&is->priv->stream_lock); - --#if GLIB_CHECK_VERSION(2,39,0) --#ifdef G_OS_UNIX --static void --imapx_server_child_process_setup (gpointer user_data) --{ --#ifdef TIOCNOTTY -- gint fd; --#endif /* TIOCNOTTY */ -+ /* XXX The list of FETCH attributes is negotiable. */ -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_NOTIFY, "NOTIFY SET " -+ "(selected " -+ "(MessageNew (UID RFC822.SIZE RFC822.HEADER FLAGS)" -+ " MessageExpunge" -+ " FlagChange)) " -+ "(personal " -+ "(MessageNew" -+ " MessageExpunge" -+ " MailboxName" -+ " SubscriptionChange))"); -+ camel_imapx_server_process_command_sync (is, ic, _("Failed to issue NOTIFY"), cancellable, &local_error); -+ camel_imapx_command_unref (ic); - -- setsid (); -+ if (local_error != NULL) { -+ g_propagate_error (error, local_error); -+ goto exception; -+ } - --#ifdef TIOCNOTTY -- /* Detach from the controlling tty if we have one. Otherwise, -- * SSH might do something stupid like trying to use it instead -- * of running $SSH_ASKPASS. */ -- if ((fd = open ("/dev/tty", O_RDONLY)) != -1) { -- ioctl (fd, TIOCNOTTY, NULL); -- close (fd); -+ g_mutex_lock (&is->priv->stream_lock); - } --#endif /* TIOCNOTTY */ --} --#endif /* G_OS_UNIX */ --#endif - --static gboolean --connect_to_server_process (CamelIMAPXServer *is, -- const gchar *cmd, -- GError **error) --{ --#if GLIB_CHECK_VERSION(2,39,0) -- GSubprocessLauncher *launcher; -- GSubprocess *subprocess = NULL; -- CamelNetworkSettings *network_settings; -- CamelProvider *provider; -- CamelSettings *settings; -- CamelIMAPXStore *store; -- CamelURL url; -- gchar **argv = NULL; -- gchar *buf; -- gchar *cmd_copy; -- gchar *full_cmd; -- const gchar *password; -- gchar *host; -- gchar *user; -- guint16 port; -+ g_mutex_unlock (&is->priv->stream_lock); - -- memset (&url, 0, sizeof (CamelURL)); -+ is->priv->state = IMAPX_INITIALISED; - -- launcher = g_subprocess_launcher_new ( -- G_SUBPROCESS_FLAGS_STDIN_PIPE | -- G_SUBPROCESS_FLAGS_STDOUT_PIPE | -- G_SUBPROCESS_FLAGS_STDERR_SILENCE); -+ success = TRUE; - --#ifdef G_OS_UNIX -- g_subprocess_launcher_set_child_setup ( -- launcher, imapx_server_child_process_setup, -- NULL, (GDestroyNotify) NULL); --#endif -+ goto exit; - -- store = camel_imapx_server_ref_store (is); -+exception: -+ imapx_disconnect (is); - -- password = camel_service_get_password (CAMEL_SERVICE (store)); -- provider = camel_service_get_provider (CAMEL_SERVICE (store)); -- settings = camel_service_ref_settings (CAMEL_SERVICE (store)); -+exit: -+ g_free (mechanism); - -- 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 (session); -+ g_object_unref (store); - -- /* Put full details in the environment, in case the connection -- * program needs them */ -- camel_url_set_protocol (&url, provider->protocol); -- camel_url_set_host (&url, host); -- camel_url_set_port (&url, port); -- camel_url_set_user (&url, user); -- buf = camel_url_to_string (&url, 0); -- -- g_subprocess_launcher_setenv (launcher, "URL", buf, TRUE); -- g_subprocess_launcher_setenv (launcher, "URLHOST", host, TRUE); -- -- if (port > 0) { -- gchar *port_string; -- -- port_string = g_strdup_printf ("%u", port); -- g_subprocess_launcher_setenv ( -- launcher, "URLPORT", port_string, TRUE); -- g_free (port_string); -- } -- -- if (user != NULL) { -- g_subprocess_launcher_setenv ( -- launcher, "URLPORT", user, TRUE); -- } -- -- if (password != NULL) { -- g_subprocess_launcher_setenv ( -- launcher, "URLPASSWD", password, TRUE); -- } -- -- g_free (buf); -- -- g_object_unref (settings); -- g_object_unref (store); -- -- /* Now do %h, %u, etc. substitution in cmd */ -- buf = cmd_copy = g_strdup (cmd); -- -- full_cmd = g_strdup (""); -- -- for (;;) { -- gchar *pc; -- gchar *tmp; -- const gchar *var; -- gint len; -- -- pc = strchr (buf, '%'); -- ignore: -- if (!pc) { -- tmp = g_strdup_printf ("%s%s", full_cmd, buf); -- g_free (full_cmd); -- full_cmd = tmp; -- break; -- } -- -- len = pc - buf; -- -- var = NULL; -- -- switch (pc[1]) { -- case 'h': -- var = host; -- break; -- case 'u': -- var = user; -- break; -- } -- if (!var) { -- /* If there wasn't a valid %-code, with an actual -- * variable to insert, pretend we didn't see the % */ -- pc = strchr (pc + 1, '%'); -- goto ignore; -- } -- tmp = g_strdup_printf ("%s%.*s%s", full_cmd, len, buf, var); -- g_free (full_cmd); -- full_cmd = tmp; -- buf = pc + 2; -- } -- -- g_free (cmd_copy); -- -- g_free (host); -- g_free (user); -- -- if (g_shell_parse_argv (full_cmd, NULL, &argv, error)) { -- subprocess = g_subprocess_launcher_spawnv ( -- launcher, (const gchar * const *) argv, error); -- g_strfreev (argv); -- } -- -- g_free (full_cmd); -- g_object_unref (launcher); -- -- if (subprocess != NULL) { -- GInputStream *input_stream; -- GOutputStream *output_stream; -- -- g_mutex_lock (&is->priv->stream_lock); -- g_warn_if_fail (is->priv->subprocess == NULL); -- is->priv->subprocess = g_object_ref (subprocess); -- g_mutex_unlock (&is->priv->stream_lock); -- -- input_stream = g_subprocess_get_stdout_pipe (subprocess); -- output_stream = g_subprocess_get_stdin_pipe (subprocess); -- -- imapx_server_set_streams (is, input_stream, output_stream); -- -- g_object_unref (subprocess); -- } -- -- return TRUE; -- --#else /* GLIB_CHECK_VERSION(2,39,0) */ -- -- g_set_error_literal ( -- error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, -- "GLib 2.39 or later is required to connect " -- "to an IMAP server through a shell command"); -- -- return FALSE; --#endif --} -- --gboolean --imapx_connect_to_server (CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) --{ -- CamelNetworkSettings *network_settings; -- CamelNetworkSecurityMethod method; -- CamelIMAPXStore *store; -- CamelSettings *settings; -- GIOStream *connection = NULL; -- GIOStream *tls_stream; -- GSocket *socket; -- guint len; -- guchar *token; -- gint tok; -- CamelIMAPXCommand *ic; -- gchar *shell_command = NULL; -- gboolean use_shell_command; -- gboolean success = TRUE; -- gchar *host; -- GError *local_error = NULL; -- -- store = camel_imapx_server_ref_store (is); -- -- settings = camel_service_ref_settings (CAMEL_SERVICE (store)); -- -- network_settings = CAMEL_NETWORK_SETTINGS (settings); -- host = camel_network_settings_dup_host (network_settings); -- method = camel_network_settings_get_security_method (network_settings); -- -- use_shell_command = camel_imapx_settings_get_use_shell_command ( -- CAMEL_IMAPX_SETTINGS (settings)); -- -- if (use_shell_command) -- shell_command = camel_imapx_settings_dup_shell_command ( -- CAMEL_IMAPX_SETTINGS (settings)); -- -- g_object_unref (settings); -- -- if (shell_command != NULL) { -- success = connect_to_server_process (is, shell_command, error); -- -- g_free (shell_command); -- -- if (success) -- goto connected; -- else -- goto exit; -- } -- -- connection = camel_network_service_connect_sync ( -- CAMEL_NETWORK_SERVICE (store), cancellable, error); -- -- if (connection != NULL) { -- GInputStream *input_stream; -- GOutputStream *output_stream; -- -- /* Disable the Nagle algorithm with TCP_NODELAY, since IMAP -- * commands should be issued immediately even we've not yet -- * received a response to a previous command. */ -- socket = g_socket_connection_get_socket ( -- G_SOCKET_CONNECTION (connection)); -- g_socket_set_option ( -- socket, IPPROTO_TCP, TCP_NODELAY, 1, &local_error); -- if (local_error != NULL) { -- /* Failure to set the socket option is non-fatal. */ -- g_warning ("%s: %s", G_STRFUNC, local_error->message); -- g_clear_error (&local_error); -- } -- -- g_mutex_lock (&is->priv->stream_lock); -- g_warn_if_fail (is->priv->connection == NULL); -- is->priv->connection = g_object_ref (connection); -- g_mutex_unlock (&is->priv->stream_lock); -- -- input_stream = g_io_stream_get_input_stream (connection); -- output_stream = g_io_stream_get_output_stream (connection); -- -- imapx_server_set_streams (is, input_stream, output_stream); -- -- /* Hang on to the connection reference in case we need to -- * issue STARTTLS below. */ -- } else { -- success = FALSE; -- goto exit; -- } -- --connected: -- while (1) { -- GInputStream *input_stream; -- -- input_stream = camel_imapx_server_ref_input_stream (is); -- -- token = NULL; -- tok = camel_imapx_input_stream_token ( -- CAMEL_IMAPX_INPUT_STREAM (input_stream), -- &token, &len, cancellable, error); -- -- if (tok < 0) { -- success = FALSE; -- -- } else if (tok == '*') { -- success = imapx_untagged ( -- is, input_stream, cancellable, error); -- -- if (success) { -- g_object_unref (input_stream); -- break; -- } -- -- } else { -- camel_imapx_input_stream_ungettoken ( -- CAMEL_IMAPX_INPUT_STREAM (input_stream), -- tok, token, len); -- -- success = camel_imapx_input_stream_text ( -- CAMEL_IMAPX_INPUT_STREAM (input_stream), -- &token, cancellable, error); -- -- g_free (token); -- } -- -- g_object_unref (input_stream); -- -- if (!success) -- goto exit; -- } -- -- if (!is->cinfo) { -- ic = camel_imapx_command_new ( -- is, "CAPABILITY", NULL, "CAPABILITY"); -- -- success = imapx_command_run (is, ic, cancellable, error); -- -- /* Server reported error. */ -- if (success && ic->status->result != IMAPX_OK) { -- g_set_error ( -- error, CAMEL_ERROR, -- CAMEL_ERROR_GENERIC, -- "%s", ic->status->text); -- success = FALSE; -- } -- -- camel_imapx_command_unref (ic); -- -- if (!success) -- goto exit; -- } -- -- if (method == CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT) { -- -- if (CAMEL_IMAPX_LACK_CAPABILITY (is->cinfo, STARTTLS)) { -- g_set_error ( -- &local_error, CAMEL_ERROR, -- CAMEL_ERROR_GENERIC, -- _("Failed to connect to IMAP server %s in secure mode: %s"), -- host, _("STARTTLS not supported")); -- goto exit; -- } -- -- ic = camel_imapx_command_new ( -- is, "STARTTLS", NULL, "STARTTLS"); -- -- success = imapx_command_run (is, ic, cancellable, error); -- -- /* Server reported error. */ -- if (success && ic->status->result != IMAPX_OK) { -- g_set_error ( -- error, CAMEL_ERROR, -- CAMEL_ERROR_GENERIC, -- "%s", ic->status->text); -- success = FALSE; -- } -- -- if (success) { -- /* See if we got new capabilities -- * in the STARTTLS response. */ -- imapx_free_capability (is->cinfo); -- is->cinfo = NULL; -- if (ic->status->condition == IMAPX_CAPABILITY) { -- is->cinfo = ic->status->u.cinfo; -- ic->status->u.cinfo = NULL; -- c (is->tagprefix, "got capability flags %08x\n", is->cinfo ? is->cinfo->capa : 0xFFFFFFFF); -- imapx_server_stash_command_arguments (is); -- } -- } -- -- camel_imapx_command_unref (ic); -- -- if (!success) -- goto exit; -- -- tls_stream = camel_network_service_starttls ( -- CAMEL_NETWORK_SERVICE (store), connection, error); -- -- if (tls_stream != NULL) { -- GInputStream *input_stream; -- GOutputStream *output_stream; -- -- g_mutex_lock (&is->priv->stream_lock); -- g_object_unref (is->priv->connection); -- is->priv->connection = g_object_ref (tls_stream); -- g_mutex_unlock (&is->priv->stream_lock); -- -- input_stream = -- g_io_stream_get_input_stream (tls_stream); -- output_stream = -- g_io_stream_get_output_stream (tls_stream); -- -- imapx_server_set_streams ( -- is, input_stream, output_stream); -- -- g_object_unref (tls_stream); -- } else { -- g_prefix_error ( -- error, -- _("Failed to connect to IMAP server %s in secure mode: "), -- host); -- success = FALSE; -- goto exit; -- } -- -- /* Get new capabilities if they weren't already given */ -- if (is->cinfo == NULL) { -- ic = camel_imapx_command_new ( -- is, "CAPABILITY", NULL, "CAPABILITY"); -- success = imapx_command_run (is, ic, cancellable, error); -- camel_imapx_command_unref (ic); -- -- if (!success) -- goto exit; -- } -- } -- --exit: -- if (!success) { -- g_mutex_lock (&is->priv->stream_lock); -- -- g_clear_object (&is->priv->input_stream); -- g_clear_object (&is->priv->output_stream); -- g_clear_object (&is->priv->connection); --#if GLIB_CHECK_VERSION(2,39,0) -- g_clear_object (&is->priv->subprocess); --#endif -- -- if (is->cinfo != NULL) { -- imapx_free_capability (is->cinfo); -- is->cinfo = NULL; -- } -- -- g_mutex_unlock (&is->priv->stream_lock); -- } -- -- g_free (host); -- -- g_clear_object (&connection); -- g_clear_object (&store); -- -- return success; --} -- --gboolean --camel_imapx_server_is_connected (CamelIMAPXServer *imapx_server) --{ -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (imapx_server), FALSE); -- -- return imapx_server->state >= IMAPX_CONNECTED; --} -- --CamelAuthenticationResult --camel_imapx_server_authenticate (CamelIMAPXServer *is, -- const gchar *mechanism, -- GCancellable *cancellable, -- GError **error) --{ -- CamelNetworkSettings *network_settings; -- CamelIMAPXStore *store; -- CamelService *service; -- CamelSettings *settings; -- CamelAuthenticationResult result; -- CamelIMAPXCommand *ic; -- CamelSasl *sasl = NULL; -- gchar *host; -- gchar *user; -- -- g_return_val_if_fail ( -- CAMEL_IS_IMAPX_SERVER (is), -- CAMEL_AUTHENTICATION_ERROR); -- -- store = camel_imapx_server_ref_store (is); -- -- service = CAMEL_SERVICE (store); -- 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 (is->cinfo && !g_hash_table_lookup (is->cinfo->auth_types, mechanism)) { -- g_set_error ( -- error, CAMEL_SERVICE_ERROR, -- CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE, -- _("IMAP server %s does not support %s " -- "authentication"), host, mechanism); -- result = CAMEL_AUTHENTICATION_ERROR; -- goto exit; -- } -- -- sasl = camel_sasl_new ("imap", mechanism, service); -- if (sasl == NULL) { -- g_set_error ( -- error, CAMEL_SERVICE_ERROR, -- CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE, -- _("No support for %s authentication"), -- mechanism); -- result = CAMEL_AUTHENTICATION_ERROR; -- goto exit; -- } -- } -- -- if (sasl != NULL) { -- ic = camel_imapx_command_new ( -- is, "AUTHENTICATE", NULL, "AUTHENTICATE %A", sasl); -- } else { -- const gchar *password; -- -- password = camel_service_get_password (service); -- -- if (user == NULL) { -- g_set_error_literal ( -- error, CAMEL_SERVICE_ERROR, -- CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE, -- _("Cannot authenticate without a username")); -- result = CAMEL_AUTHENTICATION_ERROR; -- goto exit; -- } -- -- if (password == NULL) { -- g_set_error_literal ( -- error, CAMEL_SERVICE_ERROR, -- CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE, -- _("Authentication password not available")); -- result = CAMEL_AUTHENTICATION_ERROR; -- goto exit; -- } -- -- ic = camel_imapx_command_new ( -- is, "LOGIN", NULL, "LOGIN %s %s", user, password); -- } -- -- if (!imapx_command_run (is, ic, cancellable, error)) -- result = CAMEL_AUTHENTICATION_ERROR; -- else if (ic->status->result == IMAPX_OK) -- result = CAMEL_AUTHENTICATION_ACCEPTED; -- else if (ic->status->result == IMAPX_NO) { -- if (camel_imapx_store_is_connecting_concurrent_connection (store)) { -- /* At least one connection succeeded, probably max connection limit -- set on the server had been reached, thus use special error code -- for it, to instruct the connection manager to decrease the limit -- and use already created connection. */ -- g_set_error_literal ( -- error, CAMEL_IMAPX_SERVER_ERROR, -- CAMEL_IMAPX_SERVER_ERROR_CONCURRENT_CONNECT_FAILED, -- ic->status->text ? ic->status->text : _("Unknown error")); -- result = CAMEL_AUTHENTICATION_ERROR; -- } else { -- result = CAMEL_AUTHENTICATION_REJECTED; -- } -- } else { -- g_set_error_literal ( -- error, CAMEL_SERVICE_ERROR, -- CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE, -- ic->status->text ? ic->status->text : _("Unknown error")); -- result = CAMEL_AUTHENTICATION_ERROR; -- } -- -- /* Forget old capabilities after login. */ -- if (result == CAMEL_AUTHENTICATION_ACCEPTED) { -- if (is->cinfo) { -- imapx_free_capability (is->cinfo); -- is->cinfo = NULL; -- } -- -- if (ic->status->condition == IMAPX_CAPABILITY) { -- is->cinfo = ic->status->u.cinfo; -- ic->status->u.cinfo = NULL; -- c (is->tagprefix, "got capability flags %08x\n", is->cinfo ? is->cinfo->capa : 0xFFFFFFFF); -- imapx_server_stash_command_arguments (is); -- } -- } -- -- camel_imapx_command_unref (ic); -- -- if (sasl != NULL) -- g_object_unref (sasl); -- --exit: -- g_free (host); -- g_free (user); -- -- g_object_unref (store); -- -- return result; --} -- --static gboolean --imapx_reconnect (CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXCommand *ic; -- CamelService *service; -- CamelSession *session; -- CamelIMAPXStore *store; -- CamelSettings *settings; -- gchar *mechanism; -- gboolean use_qresync; -- gboolean success = FALSE; -- -- store = camel_imapx_server_ref_store (is); -- -- service = CAMEL_SERVICE (store); -- session = camel_service_ref_session (service); -- -- settings = camel_service_ref_settings (service); -- -- mechanism = camel_network_settings_dup_auth_mechanism ( -- CAMEL_NETWORK_SETTINGS (settings)); -- -- 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; -- -- if (is->state == IMAPX_AUTHENTICATED) -- goto preauthed; -- -- if (!camel_session_authenticate_sync ( -- session, service, mechanism, cancellable, error)) -- goto exception; -- -- /* After login we re-capa unless the server already told us. */ -- if (is->cinfo == NULL) { -- GError *local_error = NULL; -- -- ic = camel_imapx_command_new ( -- is, "CAPABILITY", NULL, "CAPABILITY"); -- imapx_command_run (is, ic, cancellable, &local_error); -- camel_imapx_command_unref (ic); -- -- if (local_error != NULL) { -- g_propagate_error (error, local_error); -- goto exception; -- } -- } -- -- is->state = IMAPX_AUTHENTICATED; -- --preauthed: -- /* Fetch namespaces (if supported). */ -- if (CAMEL_IMAPX_HAVE_CAPABILITY (is->cinfo, NAMESPACE)) { -- GError *local_error = NULL; -- -- ic = camel_imapx_command_new ( -- is, "NAMESPACE", NULL, "NAMESPACE"); -- imapx_command_run (is, ic, cancellable, &local_error); -- camel_imapx_command_unref (ic); -- -- if (local_error != NULL) { -- g_propagate_error (error, local_error); -- goto exception; -- } -- } -- -- /* Enable quick mailbox resynchronization (if supported). */ -- if (use_qresync && CAMEL_IMAPX_HAVE_CAPABILITY (is->cinfo, QRESYNC)) { -- GError *local_error = NULL; -- -- ic = camel_imapx_command_new ( -- is, "ENABLE", NULL, "ENABLE CONDSTORE QRESYNC"); -- imapx_command_run (is, ic, cancellable, &local_error); -- camel_imapx_command_unref (ic); -- -- if (local_error != NULL) { -- g_propagate_error (error, local_error); -- goto exception; -- } -- -- is->use_qresync = TRUE; -- } else { -- is->use_qresync = FALSE; -- } -- -- /* Set NOTIFY options after enabling QRESYNC (if supported). */ -- if (CAMEL_IMAPX_HAVE_CAPABILITY (is->cinfo, NOTIFY)) { -- GError *local_error = NULL; -- -- /* XXX The list of FETCH attributes is negotiable. */ -- ic = camel_imapx_command_new ( -- is, "NOTIFY", NULL, "NOTIFY SET " -- "(selected " -- "(MessageNew (UID RFC822.SIZE RFC822.HEADER FLAGS)" -- " MessageExpunge" -- " FlagChange)) " -- "(personal " -- "(MessageNew" -- " MessageExpunge" -- " MailboxName" -- " SubscriptionChange))"); -- imapx_command_run (is, ic, cancellable, &local_error); -- camel_imapx_command_unref (ic); -- -- if (local_error != NULL) { -- g_propagate_error (error, local_error); -- goto exception; -- } -- } -- -- is->state = IMAPX_INITIALISED; -- -- success = TRUE; -- -- goto exit; -- --exception: -- imapx_disconnect (is); -- -- if (is->cinfo) { -- imapx_free_capability (is->cinfo); -- is->cinfo = NULL; -- } -- --exit: -- g_free (mechanism); -- -- g_object_unref (session); -- g_object_unref (store); -- -- return success; --} -- --/* ********************************************************************** */ -- --static void --imapx_command_fetch_message_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- GetMessageData *data; -- CamelIMAPXMailbox *mailbox; -- GCancellable *cancellable; -- GError *local_error = NULL; -- -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -- -- /* This is only for pushing status messages. */ -- cancellable = camel_imapx_job_get_cancellable (job); -- -- data = camel_imapx_job_get_data (job); -- g_return_if_fail (data != NULL); -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_if_fail (mailbox != NULL); -- -- /* We either have more to fetch (partial mode?), we are complete, -- * or we failed. Failure is handled in the fetch code, so -- * we just return the job, or keep it alive with more requests */ -- -- g_atomic_int_add (&job->commands, -1); -- -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error fetching message")); -- -- } else if (data->use_multi_fetch) { -- gsize really_fetched = g_seekable_tell (G_SEEKABLE (data->stream)); -- /* Don't automatically stop when we reach the reported message -- * size -- some crappy servers (like Microsoft Exchange) have -- * a tendency to lie about it. Keep going (one request at a -- * time) until the data actually stop coming. */ -- if (data->fetch_offset < data->size || -- data->fetch_offset == really_fetched) { -- CamelIMAPXCommand *new_ic; -- -- camel_operation_progress ( -- cancellable, -- (data->fetch_offset *100) / data->size); -- -- new_ic = camel_imapx_command_new ( -- is, "FETCH", mailbox, -- "UID FETCH %t (BODY.PEEK[]", -- data->uid); -- camel_imapx_command_add (new_ic, "<%u.%u>", data->fetch_offset, MULTI_SIZE); -- camel_imapx_command_add (new_ic, ")"); -- new_ic->complete = imapx_command_fetch_message_done; -- camel_imapx_command_set_job (new_ic, job); -- new_ic->pri = job->pri - 1; -- data->fetch_offset += MULTI_SIZE; -- g_atomic_int_add (&job->commands, 1); -- -- imapx_command_queue (is, new_ic); -- -- camel_imapx_command_unref (new_ic); -- -- goto exit; -- } -- } -- -- /* If we have more messages to fetch, skip the rest. */ -- if (g_atomic_int_get (&job->commands) > 0) { -- /* Make sure no command will starve in a queue */ -- QUEUE_LOCK (is); -- imapx_command_start_next (is); -- QUEUE_UNLOCK (is); -- -- goto exit; -- } -- -- /* No more messages to fetch, let's wrap things up. */ -- -- if (local_error == NULL) { -- g_io_stream_close (data->stream, cancellable, &local_error); -- g_prefix_error ( -- &local_error, "%s: ", -- _("Failed to close the tmp stream")); -- } -- -- if (local_error == NULL && -- g_cancellable_set_error_if_cancelled (cancellable, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error fetching message")); -- } -- -- if (local_error == NULL) { -- gchar *cur_filename; -- gchar *tmp_filename; -- gchar *dirname; -- -- cur_filename = camel_data_cache_get_filename ( -- data->message_cache, "cur", data->uid); -- -- tmp_filename = camel_data_cache_get_filename ( -- data->message_cache, "tmp", data->uid); -- -- dirname = g_path_get_dirname (cur_filename); -- g_mkdir_with_parents (dirname, 0700); -- g_free (dirname); -- -- if (g_rename (tmp_filename, cur_filename) == 0) { -- /* Exchange the "tmp" stream for the "cur" stream. */ -- g_clear_object (&data->stream); -- data->stream = camel_data_cache_get ( -- data->message_cache, "cur", -- data->uid, &local_error); -- } else { -- g_set_error ( -- &local_error, G_FILE_ERROR, -- g_file_error_from_errno (errno), -- "%s: %s", -- _("Failed to copy the tmp file"), -- g_strerror (errno)); -- } -- -- g_free (cur_filename); -- g_free (tmp_filename); -- } -- -- /* Delete the 'tmp' file only if the operation succeeded. It's because -- cancelled operations end before they are properly finished (IMAP-protocol speaking), -- thus if any other GET_MESSAGE operation was waiting for this job, then it -- realized that the message was not downloaded and opened its own "tmp" file, but -- of the same name, thus this remove would drop file which could be used -- by a different GET_MESSAGE job. */ -- if (!local_error && !g_cancellable_is_cancelled (cancellable)) -- camel_data_cache_remove (data->message_cache, "tmp", data->uid, NULL); -- -- /* Avoid possible use-after-free when the imapx_unregister_job() can -- also free the 'job' structure. */ -- camel_imapx_job_ref (job); -- -- imapx_unregister_job (is, job); -- -- if (local_error != NULL) { -- CamelIMAPXJob *pending_job; -- -- /* Give a chance to other threads. */ -- g_thread_yield (); -- -- pending_job = imapx_server_ref_job (is, mailbox, IMAPX_JOB_GET_MESSAGE, data->uid); -- if (pending_job != NULL) { -- GIOStream *cache_stream; -- -- /* Wait for the job to finish. */ -- camel_imapx_job_wait (pending_job, NULL); -- camel_imapx_job_unref (pending_job); -- -- /* Disregard errors here. If we failed to retrieve the -- * message from cache (implying the job we were waiting -- * on failed or got cancelled), we'll just re-fetch it. */ -- cache_stream = camel_data_cache_get (data->message_cache, "cur", data->uid, NULL); -- if (cache_stream != NULL) { -- g_clear_error (&local_error); -- -- g_clear_object (&data->stream); -- data->stream = cache_stream; -- } -- } -- -- if (local_error) { -- camel_imapx_job_take_error (job, local_error); -- local_error = NULL; -- } -- } -- -- camel_imapx_job_unref (job); -- --exit: -- if (local_error != NULL) -- camel_imapx_job_take_error (job, local_error); -- -- g_object_unref (mailbox); --} -- --static gboolean --imapx_job_get_message_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXCommand *ic; -- CamelIMAPXMailbox *mailbox; -- GetMessageData *data; -- gint i; -- gboolean success = TRUE; -- -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_val_if_fail (mailbox != NULL, FALSE); -- -- if (data->use_multi_fetch) { -- for (i = 0; i < 3 && data->fetch_offset < data->size; i++) { -- ic = camel_imapx_command_new ( -- is, "FETCH", mailbox, -- "UID FETCH %t (BODY.PEEK[]", -- data->uid); -- camel_imapx_command_add (ic, "<%u.%u>", data->fetch_offset, MULTI_SIZE); -- camel_imapx_command_add (ic, ")"); -- ic->complete = imapx_command_fetch_message_done; -- camel_imapx_command_set_job (ic, job); -- ic->pri = job->pri; -- data->fetch_offset += MULTI_SIZE; -- g_atomic_int_add (&job->commands, 1); -- -- imapx_command_queue (is, ic); -- -- camel_imapx_command_unref (ic); -- } -- } else { -- ic = camel_imapx_command_new ( -- is, "FETCH", mailbox, -- "UID FETCH %t (BODY.PEEK[])", -- data->uid); -- ic->complete = imapx_command_fetch_message_done; -- camel_imapx_command_set_job (ic, job); -- ic->pri = job->pri; -- g_atomic_int_add (&job->commands, 1); -- -- imapx_command_queue (is, ic); -- -- camel_imapx_command_unref (ic); -- } -- -- g_object_unref (mailbox); -- -- return success; --} -- --static gboolean --imapx_job_get_message_matches (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox, -- const gchar *uid) --{ -- GetMessageData *data; -- -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -- -- if (!camel_imapx_job_has_mailbox (job, mailbox)) -- return FALSE; -- -- if (g_strcmp0 (uid, data->uid) != 0) -- return FALSE; -- -- return TRUE; --} -- --/* ********************************************************************** */ -- --static void --imapx_command_copy_messages_step_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- CamelFolder *folder; -- CamelIMAPXMailbox *mailbox; -- CopyMessagesData *data; -- GPtrArray *uids; -- gint i; -- GError *local_error = NULL; -- -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -- -- data = camel_imapx_job_get_data (job); -- g_return_if_fail (data != NULL); -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_if_fail (mailbox != NULL); -- -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_if_fail (folder != NULL); -- -- uids = data->uids; -- i = data->index; -- -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- if (data->use_move_command) -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error moving messages")); -- else -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error copying messages")); -- camel_imapx_job_take_error (job, local_error); -- goto exit; -- } -- -- if (ic->status && ic->status->u.copyuid.uids && ic->status->u.copyuid.copied_uids && -- ic->status->u.copyuid.uids->len == ic->status->u.copyuid.copied_uids->len) { -- CamelFolder *destination; -- -- destination = imapx_server_ref_folder (is, data->destination); -- if (destination) { -- CamelMessageInfo *source_info, *destination_info; -- CamelFolderChangeInfo *changes; -- gint ii; -- -- changes = camel_folder_change_info_new (); -- -- for (ii = 0; ii < ic->status->u.copyuid.uids->len; ii++) { -- gchar *uid; -- gboolean is_new = FALSE; -- -- uid = g_strdup_printf ("%d", g_array_index (ic->status->u.copyuid.uids, guint32, ii)); -- source_info = camel_folder_summary_get (folder->summary, uid); -- g_free (uid); -- -- if (!source_info) -- continue; -- -- uid = g_strdup_printf ("%d", g_array_index (ic->status->u.copyuid.copied_uids, guint32, ii)); -- destination_info = camel_folder_summary_get (folder->summary, uid); -- -- if (!destination_info) { -- is_new = TRUE; -- destination_info = camel_message_info_clone (source_info); -- destination_info->summary = destination->summary; -- camel_pstring_free (destination_info->uid); -- destination_info->uid = camel_pstring_strdup (uid); -- } -- -- g_free (uid); -- -- imapx_set_message_info_flags_for_new_message ( -- destination_info, -- ((CamelMessageInfoBase *) source_info)->flags, -- ((CamelMessageInfoBase *) source_info)->user_flags, -- TRUE, -- ((CamelMessageInfoBase *) source_info)->user_tags, -- camel_imapx_mailbox_get_permanentflags (data->destination)); -- if (is_new) -- camel_folder_summary_add (destination->summary, destination_info); -- camel_folder_change_info_add_uid (changes, destination_info->uid); -- -- camel_message_info_unref (source_info); -- if (!is_new) -- camel_message_info_unref (destination_info); -- } -- -- if (camel_folder_change_info_changed (changes)) { -- camel_folder_summary_touch (destination->summary); -- camel_folder_summary_save_to_db (destination->summary, NULL); -- camel_folder_changed (destination, changes); -- } -- -- camel_folder_change_info_free (changes); -- g_object_unref (destination); -- } -- } -- -- if (data->delete_originals) { -- gint j; -- -- for (j = data->last_index; j < i; j++) -- camel_folder_delete_message (folder, uids->pdata[j]); -- } -- -- if (i < uids->len) { -- imapx_command_copy_messages_step_start ( -- is, job, i, &local_error); -- -- if (local_error != NULL) -- camel_imapx_job_take_error (job, local_error); -- } -- --exit: -- g_object_unref (folder); -- g_object_unref (mailbox); -- -- imapx_unregister_job (is, job); --} -- --static gboolean --imapx_command_copy_messages_step_start (CamelIMAPXServer *is, -- CamelIMAPXJob *job, -- gint index, -- GError **error) --{ -- CamelIMAPXMailbox *mailbox; -- CamelIMAPXCommand *ic; -- CopyMessagesData *data; -- GPtrArray *uids; -- gint i = index; -- gboolean success = TRUE; -- -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_val_if_fail (mailbox != NULL, FALSE); -- -- uids = data->uids; -- -- if (data->use_move_command) -- ic = camel_imapx_command_new (is, "MOVE", mailbox, "UID MOVE "); -- else -- ic = camel_imapx_command_new (is, "COPY", mailbox, "UID COPY "); -- ic->complete = imapx_command_copy_messages_step_done; -- camel_imapx_command_set_job (ic, job); -- ic->pri = job->pri; -- data->last_index = i; -- -- g_object_unref (mailbox); -- -- for (; i < uids->len; i++) { -- gint res; -- const gchar *uid = (gchar *) g_ptr_array_index (uids, i); -- -- res = imapx_uidset_add (&data->uidset, ic, uid); -- if (res == 1) { -- camel_imapx_command_add (ic, " %M", data->destination); -- data->index = i + 1; -- imapx_command_queue (is, ic); -- goto exit; -- } -- } -- -- data->index = i; -- if (imapx_uidset_done (&data->uidset, ic)) { -- camel_imapx_command_add (ic, " %M", data->destination); -- imapx_command_queue (is, ic); -- goto exit; -- } -- --exit: -- camel_imapx_command_unref (ic); -- -- return success; --} -- --static gboolean --imapx_job_copy_messages_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXMailbox *mailbox; -- CopyMessagesData *data; -- gboolean success; -- -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_val_if_fail (mailbox != NULL, FALSE); -- -- success = imapx_server_sync_changes ( -- is, mailbox, job->type, job->pri, cancellable, error); -- if (!success) -- imapx_unregister_job (is, job); -- -- /* XXX Should we still do this even if a failure occurred? */ -- g_ptr_array_sort (data->uids, (GCompareFunc) imapx_uids_array_cmp); -- imapx_uidset_init (&data->uidset, 0, MAX_COMMAND_LEN); -- -- g_object_unref (mailbox); -- -- return imapx_command_copy_messages_step_start (is, job, 0, error); --} -- --static gboolean --imapx_job_copy_messages_matches (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox, -- const gchar *uid) --{ -- return camel_imapx_job_has_mailbox (job, mailbox); --} -- --/* ********************************************************************** */ -- --static void --imapx_command_append_message_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- CamelIMAPXFolder *ifolder; -- CamelIMAPXMailbox *mailbox; -- CamelFolder *folder; -- CamelMessageInfo *mi; -- AppendMessageData *data; -- gchar *cur, *old_uid; -- guint32 uidvalidity; -- GError *local_error = NULL; -- -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -- -- data = camel_imapx_job_get_data (job); -- g_return_if_fail (data != NULL); -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_if_fail (mailbox != NULL); -- -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_if_fail (folder != NULL); -- -- uidvalidity = camel_imapx_mailbox_get_uidvalidity (mailbox); -- -- ifolder = CAMEL_IMAPX_FOLDER (folder); -- -- /* Append done. If we the server supports UIDPLUS we will get -- * an APPENDUID response with the new uid. This lets us move the -- * message we have directly to the cache and also create a correctly -- * numbered MessageInfo, without losing any information. Otherwise -- * we have to wait for the server to let us know it was appended. */ -- -- mi = camel_message_info_clone (data->info); -- old_uid = g_strdup (data->info->uid); -- -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error appending message")); -- camel_imapx_job_take_error (job, local_error); -- -- } else if (ic->status && ic->status->condition == IMAPX_APPENDUID) { -- c (is->tagprefix, "Got appenduid %d %d\n", (gint) ic->status->u.appenduid.uidvalidity, (gint) ic->status->u.appenduid.uid); -- if (ic->status->u.appenduid.uidvalidity == uidvalidity) { -- CamelFolderChangeInfo *changes; -- -- data->appended_uid = g_strdup_printf ("%u", (guint) ic->status->u.appenduid.uid); -- mi->uid = camel_pstring_add (data->appended_uid, FALSE); -- -- cur = camel_data_cache_get_filename (ifolder->cache, "cur", mi->uid); -- if (g_rename (data->path, cur) == -1 && errno != ENOENT) { -- g_warning ("%s: Failed to rename '%s' to '%s': %s", G_STRFUNC, data->path, cur, g_strerror (errno)); -- } -- -- imapx_set_message_info_flags_for_new_message ( -- mi, -- ((CamelMessageInfoBase *) data->info)->flags, -- ((CamelMessageInfoBase *) data->info)->user_flags, -- TRUE, -- ((CamelMessageInfoBase *) data->info)->user_tags, -- camel_imapx_mailbox_get_permanentflags (mailbox)); -- camel_folder_summary_add (folder->summary, mi); -- changes = camel_folder_change_info_new (); -- camel_folder_change_info_add_uid (changes, mi->uid); -- camel_folder_changed (folder, changes); -- camel_folder_change_info_free (changes); -- -- g_free (cur); -- } else { -- c (is->tagprefix, "but uidvalidity changed \n"); -- } -- } -- -- camel_data_cache_remove (ifolder->cache, "new", old_uid, NULL); -- g_free (old_uid); -- -- g_object_unref (folder); -- g_object_unref (mailbox); -- -- imapx_unregister_job (is, job); --} -- --static const gchar * --get_month_str (gint month) --{ -- static const gchar tm_months[][4] = { -- "Jan", "Feb", "Mar", "Apr", "May", "Jun", -- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -- }; -- -- if (month < 1 || month > 12) -- return NULL; -- -- return tm_months[month - 1]; --} -- --static gboolean --imapx_job_append_message_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXMailbox *mailbox; -- CamelIMAPXCommand *ic; -- AppendMessageData *data; -- -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_val_if_fail (mailbox != NULL, FALSE); -- -- if (data->date_time > 0) { -- gchar *date_time; -- struct tm stm; -- -- gmtime_r (&data->date_time, &stm); -- -- /* Store always in UTC */ -- date_time = g_strdup_printf ( -- "\"%02d-%s-%04d %02d:%02d:%02d +0000\"", -- stm.tm_mday, -- get_month_str (stm.tm_mon + 1), -- stm.tm_year + 1900, -- stm.tm_hour, -- stm.tm_min, -- stm.tm_sec); -- -- ic = camel_imapx_command_new ( -- is, "APPEND", NULL, -- "APPEND %M %F %t %P", mailbox, -- ((CamelMessageInfoBase *) data->info)->flags, -- ((CamelMessageInfoBase *) data->info)->user_flags, -- date_time, -- data->path); -- -- g_free (date_time); -- } else { -- ic = camel_imapx_command_new ( -- is, "APPEND", NULL, -- "APPEND %M %F %P", mailbox, -- ((CamelMessageInfoBase *) data->info)->flags, -- ((CamelMessageInfoBase *) data->info)->user_flags, -- data->path); -- } -- -- ic->complete = imapx_command_append_message_done; -- camel_imapx_command_set_job (ic, job); -- ic->pri = job->pri; -- g_atomic_int_add (&job->commands, 1); -- -- imapx_command_queue (is, ic); -- -- camel_imapx_command_unref (ic); -- -- g_object_unref (mailbox); -- -- return TRUE; --} -- --/* ********************************************************************** */ -- --static gint --imapx_refresh_info_uid_cmp (gconstpointer ap, -- gconstpointer bp, -- gboolean ascending) --{ -- guint av, bv; -- -- av = g_ascii_strtoull ((const gchar *) ap, NULL, 10); -- bv = g_ascii_strtoull ((const gchar *) bp, NULL, 10); -- -- if (av < bv) -- return ascending ? -1 : 1; -- else if (av > bv) -- return ascending ? 1 : -1; -- else -- return 0; --} -- --static gint --imapx_uids_array_cmp (gconstpointer ap, -- gconstpointer bp) --{ -- const gchar **a = (const gchar **) ap; -- const gchar **b = (const gchar **) bp; -- -- return imapx_refresh_info_uid_cmp (*a, *b, TRUE); --} -- --static gint --imapx_refresh_info_cmp (gconstpointer ap, -- gconstpointer bp) --{ -- const struct _refresh_info *a = ap; -- const struct _refresh_info *b = bp; -- -- return imapx_refresh_info_uid_cmp (a->uid, b->uid, TRUE); --} -- --static gint --imapx_refresh_info_cmp_descending (gconstpointer ap, -- gconstpointer bp) --{ -- const struct _refresh_info *a = ap; -- const struct _refresh_info *b = bp; -- -- return imapx_refresh_info_uid_cmp (a->uid, b->uid, FALSE); -- --} -- --/* skips over non-server uids (pending appends) */ --static guint --imapx_index_next (GPtrArray *uids, -- CamelFolderSummary *s, -- guint index) --{ -- -- while (index < uids->len) { -- CamelMessageInfo *info; -- -- index++; -- if (index >= uids->len) -- break; -- -- info = camel_folder_summary_get (s, g_ptr_array_index (uids, index)); -- if (!info) -- continue; -- -- if (info && (strchr (camel_message_info_uid (info), '-') != NULL)) { -- camel_message_info_unref (info); -- e ('?', "Ignoring offline uid '%s'\n", camel_message_info_uid (info)); -- } else { -- camel_message_info_unref (info); -- break; -- } -- } -- -- return index; --} -- --static void --imapx_command_step_fetch_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXMailbox *mailbox; -- CamelIMAPXSummary *isum; -- CamelIMAPXJob *job; -- CamelFolder *folder; -- RefreshInfoData *data; -- gint i; -- GError *local_error = NULL; -- -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -- -- data = camel_imapx_job_get_data (job); -- g_return_if_fail (data != NULL); -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_if_fail (mailbox != NULL); -- -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_if_fail (folder != NULL); -- -- data->scan_changes = FALSE; -- -- isum = CAMEL_IMAPX_SUMMARY (folder->summary); -- -- i = data->index; -- -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error fetching message headers")); -- camel_imapx_job_take_error (job, local_error); -- goto exit; -- } -- -- if (camel_folder_change_info_changed (data->changes)) { -- imapx_update_store_summary (folder); -- camel_folder_summary_save_to_db (folder->summary, NULL); -- camel_folder_changed (folder, data->changes); -- } -- -- camel_folder_change_info_clear (data->changes); -- -- if (i < data->infos->len) { -- ic = camel_imapx_command_new ( -- is, "FETCH", mailbox, "UID FETCH "); -- ic->complete = imapx_command_step_fetch_done; -- camel_imapx_command_set_job (ic, job); -- ic->pri = job->pri - 1; -- -- data->last_index = i; -- -- for (; i < data->infos->len; i++) { -- gint res; -- struct _refresh_info *r = &g_array_index (data->infos, struct _refresh_info, i); -- -- if (!r->exists) { -- res = imapx_uidset_add (&data->uidset, ic, r->uid); -- if (res == 1) { -- camel_imapx_command_add (ic, " (RFC822.SIZE RFC822.HEADER)"); -- data->index = i + 1; -- -- imapx_command_queue (is, ic); -- -- camel_imapx_command_unref (ic); -- -- g_object_unref (folder); -- g_object_unref (mailbox); -- -- return; -- } -- } -- } -- -- data->index = data->infos->len; -- if (imapx_uidset_done (&data->uidset, ic)) { -- camel_imapx_command_add (ic, " (RFC822.SIZE RFC822.HEADER)"); -- -- imapx_command_queue (is, ic); -- -- camel_imapx_command_unref (ic); -- -- g_object_unref (folder); -- g_object_unref (mailbox); -- -- return; -- } -- -- /* XXX What fate for our newly-created but unsubmitted -- * CamelIMAPXCommand if we get here? I guess just -- * discard it and move on? Also warn so I know if -- * we're actually taking this branch for real. */ -- camel_imapx_command_unref (ic); -- g_warn_if_reached (); -- } -- -- if (camel_folder_summary_count (folder->summary)) { -- gchar *uid; -- guint32 uidl; -- guint32 uidnext; -- -- uid = camel_imapx_dup_uid_from_summary_index ( -- folder, -- camel_folder_summary_count (folder->summary) - 1); -- if (uid) { -- uidl = (guint32) strtoull (uid, NULL, 10); -- g_free (uid); -- -- uidl++; -- -- uidnext = camel_imapx_mailbox_get_uidnext (mailbox); -- -- if (uidl > uidnext) { -- c ( -- is->tagprefix, -- "Updating uidnext for '%s' to %ul\n", -- camel_imapx_mailbox_get_name (mailbox), -- uidl); -- camel_imapx_mailbox_set_uidnext (mailbox, uidl); -- } -- } -- } -- -- isum->uidnext = camel_imapx_mailbox_get_uidnext (mailbox); -- --exit: -- refresh_info_data_infos_free (data); -- -- g_object_unref (folder); -- g_object_unref (mailbox); -- -- imapx_unregister_job (is, job); -+ return success; - } - --static gint --imapx_uid_cmp (gconstpointer ap, -- gconstpointer bp, -- gpointer data) --{ -- const gchar *a = ap, *b = bp; -- gchar *ae, *be; -- gulong av, bv; -- -- av = strtoul (a, &ae, 10); -- bv = strtoul (b, &be, 10); -- -- if (av < bv) -- return -1; -- else if (av > bv) -- return 1; -- -- if (*ae == '-') -- ae++; -- if (*be == '-') -- be++; -+/* ********************************************************************** */ - -- return strcmp (ae, be); --} -+/* FIXME: this is basically a copy of the same in camel-imapx-utils.c */ -+static struct { -+ const gchar *name; -+ guint32 flag; -+} flags_table[] = { -+ { "\\ANSWERED", CAMEL_MESSAGE_ANSWERED }, -+ { "\\DELETED", CAMEL_MESSAGE_DELETED }, -+ { "\\DRAFT", CAMEL_MESSAGE_DRAFT }, -+ { "\\FLAGGED", CAMEL_MESSAGE_FLAGGED }, -+ { "\\SEEN", CAMEL_MESSAGE_SEEN }, -+ { "\\RECENT", CAMEL_IMAPX_MESSAGE_RECENT }, -+ { "JUNK", CAMEL_MESSAGE_JUNK }, -+ { "NOTJUNK", CAMEL_MESSAGE_NOTJUNK } -+}; - - static void --imapx_job_scan_changes_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- CamelIMAPXMailbox *mailbox; -- CamelIMAPXSettings *settings; -- CamelFolder *folder; -- RefreshInfoData *data; -- GCancellable *cancellable; -- guint uidset_size; -- guint32 unseen; -- GError *local_error = NULL; -- -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -- -- /* This is only for pushing status messages. */ -- cancellable = camel_imapx_job_get_cancellable (job); -- -- data = camel_imapx_job_get_data (job); -- g_return_if_fail (data != NULL); -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_if_fail (mailbox != NULL); -- -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_if_fail (folder != NULL); -- -- data->scan_changes = FALSE; -- -- settings = camel_imapx_server_ref_settings (is); -- uidset_size = camel_imapx_settings_get_batch_fetch_count (settings); -- g_object_unref (settings); -- -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error retrieving message")); -- camel_imapx_job_take_error (job, local_error); -- -- } else { -- GCompareDataFunc uid_cmp = imapx_uid_cmp; -- CamelMessageInfo *s_minfo = NULL; -- CamelIMAPXMessageInfo *info; -- CamelFolderSummary *s = folder->summary; -- GList *removed = NULL, *l; -- gboolean fetch_new = FALSE; -- gint i; -- guint j = 0; -- GPtrArray *uids; -- -- /* Actually we wanted to do this after the SELECT but before the -- * FETCH command was issued. But this should suffice. */ -- ((CamelIMAPXSummary *) s)->uidnext = -- camel_imapx_mailbox_get_uidnext (mailbox); -- ((CamelIMAPXSummary *) s)->modseq = -- camel_imapx_mailbox_get_highestmodseq (mailbox); -- -- /* Here we do the typical sort/iterate/merge loop. -- * If the server flags dont match what we had, we modify our -- * flags to pick up what the server now has - but we merge -- * not overwrite */ -- -- /* FIXME: We also have to check the offline directory for -- * anything missing in our summary, and also queue up jobs -- * for all outstanding messages to be uploaded */ -- -- camel_folder_summary_lock (s); -- -- /* obtain a copy to be thread safe */ -- uids = camel_folder_summary_get_array (s); -- -- qsort (data->infos->data, data->infos->len, sizeof (struct _refresh_info), imapx_refresh_info_cmp); -- g_ptr_array_sort (uids, (GCompareFunc) imapx_uids_array_cmp); -- -- if (uids->len) -- s_minfo = camel_folder_summary_get (s, g_ptr_array_index (uids, 0)); -- -- for (i = 0; i < data->infos->len; i++) { -- struct _refresh_info *r = &g_array_index (data->infos, struct _refresh_info, i); -- -- while (s_minfo && uid_cmp (camel_message_info_uid (s_minfo), r->uid, s) < 0) { -- const gchar *uid = camel_message_info_uid (s_minfo); -- -- camel_folder_change_info_remove_uid (data->changes, uid); -- removed = g_list_prepend (removed, (gpointer ) g_strdup (uid)); -- camel_message_info_unref (s_minfo); -- s_minfo = NULL; -- -- j = imapx_index_next (uids, s, j); -- if (j < uids->len) -- s_minfo = camel_folder_summary_get (s, g_ptr_array_index (uids, j)); -- } -- -- info = NULL; -- if (s_minfo && uid_cmp (s_minfo->uid, r->uid, s) == 0) { -- info = (CamelIMAPXMessageInfo *) s_minfo; -- -- if (imapx_update_message_info_flags ( -- (CamelMessageInfo *) info, -- r->server_flags, -- r->server_user_flags, -- camel_imapx_mailbox_get_permanentflags (mailbox), -- folder, FALSE)) -- camel_folder_change_info_change_uid ( -- data->changes, -- camel_message_info_uid (s_minfo)); -- r->exists = TRUE; -- } else -- fetch_new = TRUE; -- -- if (s_minfo) { -- camel_message_info_unref (s_minfo); -- s_minfo = NULL; -- } -- -- if (j >= uids->len) -- break; -- -- j = imapx_index_next (uids, s, j); -- if (j < uids->len) -- s_minfo = camel_folder_summary_get (s, g_ptr_array_index (uids, j)); -- } -- -- if (s_minfo) -- camel_message_info_unref (s_minfo); -- -- while (j < uids->len) { -- s_minfo = camel_folder_summary_get (s, g_ptr_array_index (uids, j)); -- -- if (!s_minfo) { -- j++; -- continue; -- } -- -- e (is->tagprefix, "Message %s vanished\n", s_minfo->uid); -- removed = g_list_prepend (removed, (gpointer) g_strdup (s_minfo->uid)); -- camel_message_info_unref (s_minfo); -- j++; -- } -- -- for (l = removed; l != NULL; l = g_list_next (l)) { -- gchar *uid = (gchar *) l->data; -- -- camel_folder_change_info_remove_uid (data->changes, uid); -- } -- -- if (removed != NULL) { -- camel_folder_summary_remove_uids (s, removed); -- camel_folder_summary_touch (s); -- -- g_list_free_full (removed, (GDestroyNotify) g_free); -- } -- -- camel_folder_summary_save_to_db (s, NULL); -- imapx_update_store_summary (folder); -- -- camel_folder_summary_unlock (s); -- -- if (camel_folder_change_info_changed (data->changes)) -- camel_folder_changed (folder, data->changes); -- camel_folder_change_info_clear (data->changes); -- -- camel_folder_summary_free_array (uids); -- -- /* If we have any new messages, download their headers, but only a few (100?) at a time */ -- if (fetch_new) { -- job->pop_operation_msg = TRUE; -- -- camel_operation_push_message ( -- cancellable, -- _("Fetching summary information for new messages in '%s'"), -- camel_folder_get_display_name (folder)); -- -- imapx_uidset_init (&data->uidset, uidset_size, 0); -- /* These are new messages which arrived since we last knew the unseen count; -- * update it as they arrive. */ -- data->update_unseen = TRUE; -- -- g_object_unref (folder); -- g_object_unref (mailbox); -- -- return imapx_command_step_fetch_done (is, ic); -- } -- } -- -- refresh_info_data_infos_free (data); -- -- /* There's no sane way to get the server-side unseen count -- * on the select mailbox, so just work it out from the flags. */ -- unseen = camel_folder_summary_get_unread_count (folder->summary); -- camel_imapx_mailbox_set_unseen (mailbox, unseen); -- -- g_object_unref (folder); -- g_object_unref (mailbox); -- -- imapx_unregister_job (is, job); --} -- --static gboolean --imapx_job_scan_changes_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) -+imapx_server_set_store (CamelIMAPXServer *server, -+ CamelIMAPXStore *store) - { -- CamelFolder *folder; -- CamelIMAPXCommand *ic; -- CamelIMAPXMailbox *mailbox; -- RefreshInfoData *data; -- -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_val_if_fail (mailbox != NULL, FALSE); -- -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_val_if_fail (folder != NULL, FALSE); -- -- job->pop_operation_msg = TRUE; -- -- camel_operation_push_message ( -- cancellable, -- _("Scanning for changed messages in '%s'"), -- camel_folder_get_display_name (folder)); -- -- ic = camel_imapx_command_new ( -- is, "FETCH", mailbox, -- "UID FETCH 1:* (UID FLAGS)"); -- camel_imapx_command_set_job (ic, job); -- ic->complete = imapx_job_scan_changes_done; -- -- data->scan_changes = TRUE; -- ic->pri = job->pri; -- refresh_info_data_infos_free (data); -- data->infos = g_array_new (0, 0, sizeof (struct _refresh_info)); -- -- imapx_command_queue (is, ic); -- -- camel_imapx_command_unref (ic); -- -- g_object_unref (folder); -- g_object_unref (mailbox); -+ g_return_if_fail (CAMEL_IS_IMAPX_STORE (store)); - -- return TRUE; -+ g_weak_ref_set (&server->priv->store, store); - } - - static void --imapx_command_fetch_new_messages_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) -+imapx_server_set_property (GObject *object, -+ guint property_id, -+ const GValue *value, -+ GParamSpec *pspec) - { -- CamelIMAPXJob *job; -- CamelIMAPXSummary *isum; -- CamelIMAPXMailbox *mailbox; -- CamelFolder *folder; -- RefreshInfoData *data; -- GError *local_error = NULL; -- -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -- -- data = camel_imapx_job_get_data (job); -- g_return_if_fail (data != NULL); -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_if_fail (mailbox != NULL); -- -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_if_fail (folder != NULL); -- -- isum = CAMEL_IMAPX_SUMMARY (folder->summary); -- -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error fetching new messages")); -- camel_imapx_job_take_error (job, local_error); -- goto exit; -- } -- -- if (camel_folder_change_info_changed (data->changes)) { -- camel_folder_summary_save_to_db (folder->summary, NULL); -- imapx_update_store_summary (folder); -- camel_folder_changed (folder, data->changes); -- camel_folder_change_info_clear (data->changes); -- } -- -- if (camel_folder_summary_count (folder->summary)) { -- gchar *uid; -- guint32 uidl; -- guint32 uidnext; -- -- uid = camel_imapx_dup_uid_from_summary_index ( -- folder, -- camel_folder_summary_count (folder->summary) - 1); -- if (uid) { -- uidl = (guint32) strtoull (uid, NULL, 10); -- g_free (uid); -- -- uidl++; -- -- uidnext = camel_imapx_mailbox_get_uidnext (mailbox); -- -- if (uidl > uidnext) { -- c ( -- is->tagprefix, -- "Updating uidnext for '%s' to %ul\n", -- camel_imapx_mailbox_get_name (mailbox), -- uidl); -- camel_imapx_mailbox_set_uidnext (mailbox, uidl); -- } -- } -+ switch (property_id) { -+ case PROP_STORE: -+ imapx_server_set_store ( -+ CAMEL_IMAPX_SERVER (object), -+ g_value_get_object (value)); -+ return; - } - -- isum->uidnext = camel_imapx_mailbox_get_uidnext (mailbox); -- --exit: -- g_object_unref (folder); -- g_object_unref (mailbox); -- -- imapx_unregister_job (is, job); -+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - } - - static void --imapx_command_fetch_new_uids_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- RefreshInfoData *data; -- -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -- -- data = camel_imapx_job_get_data (job); -- g_return_if_fail (data != NULL); -- -- data->scan_changes = FALSE; -- -- qsort ( -- data->infos->data, -- data->infos->len, -- sizeof (struct _refresh_info), -- imapx_refresh_info_cmp_descending); -- -- imapx_command_step_fetch_done (is, ic); --} -- --static gboolean --imapx_job_fetch_new_messages_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) -+imapx_server_get_property (GObject *object, -+ guint property_id, -+ GValue *value, -+ GParamSpec *pspec) - { -- CamelIMAPXCommand *ic; -- CamelFolder *folder; -- CamelIMAPXMailbox *mailbox; -- CamelIMAPXSettings *settings; -- CamelSortType fetch_order; -- RefreshInfoData *data; -- guint32 total, diff; -- guint32 messages; -- guint uidset_size; -- gchar *uid = NULL; -- -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_val_if_fail (mailbox != NULL, FALSE); -- -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_val_if_fail (folder != NULL, FALSE); -- -- settings = camel_imapx_server_ref_settings (is); -- fetch_order = camel_imapx_settings_get_fetch_order (settings); -- uidset_size = camel_imapx_settings_get_batch_fetch_count (settings); -- g_object_unref (settings); -- -- messages = camel_imapx_mailbox_get_messages (mailbox); -+ switch (property_id) { -+ case PROP_STORE: -+ g_value_take_object ( -+ value, -+ camel_imapx_server_ref_store ( -+ CAMEL_IMAPX_SERVER (object))); -+ return; -+ } - -- total = camel_folder_summary_count (folder->summary); -- diff = messages - total; -+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -+} - -- if (total > 0) { -- guint64 uidl; -- uid = camel_imapx_dup_uid_from_summary_index (folder, total - 1); -- if (uid) { -- uidl = strtoull (uid, NULL, 10); -- g_free (uid); -- uid = g_strdup_printf ("%" G_GUINT64_FORMAT, uidl + 1); -- } else { -- uid = g_strdup ("1"); -- } -- } else -- uid = g_strdup ("1"); -+static void -+imapx_server_dispose (GObject *object) -+{ -+ CamelIMAPXServer *server = CAMEL_IMAPX_SERVER (object); - -- job->pop_operation_msg = TRUE; -+ g_cancellable_cancel (server->priv->cancellable); - -- camel_operation_push_message ( -- cancellable, -- _("Fetching summary information for new messages in '%s'"), -- camel_folder_get_display_name (folder)); -+ imapx_disconnect (server); - -- if (diff > uidset_size || fetch_order == CAMEL_SORT_DESCENDING) { -- ic = camel_imapx_command_new ( -- is, "FETCH", mailbox, -- "UID FETCH %s:* (UID FLAGS)", uid); -- imapx_uidset_init (&data->uidset, uidset_size, 0); -- refresh_info_data_infos_free (data); -- data->infos = g_array_new (0, 0, sizeof (struct _refresh_info)); -- ic->pri = job->pri; -+ g_weak_ref_set (&server->priv->store, NULL); - -- data->scan_changes = TRUE; -+ g_clear_object (&server->priv->subprocess); - -- if (fetch_order == CAMEL_SORT_DESCENDING) -- ic->complete = imapx_command_fetch_new_uids_done; -- else -- ic->complete = imapx_command_step_fetch_done; -- } else { -- ic = camel_imapx_command_new ( -- is, "FETCH", mailbox, -- "UID FETCH %s:* (RFC822.SIZE RFC822.HEADER FLAGS)", uid); -- ic->pri = job->pri; -- ic->complete = imapx_command_fetch_new_messages_done; -+ g_mutex_lock (&server->priv->idle_lock); -+ g_clear_object (&server->priv->idle_cancellable); -+ g_clear_object (&server->priv->idle_mailbox); -+ if (server->priv->idle_pending) { -+ g_source_destroy (server->priv->idle_pending); -+ g_source_unref (server->priv->idle_pending); -+ server->priv->idle_pending = NULL; - } -+ g_mutex_unlock (&server->priv->idle_lock); - -- camel_imapx_command_set_job (ic, job); -- -- imapx_command_queue (is, ic); -- -- camel_imapx_command_unref (ic); -- -- g_free (uid); -- -- g_object_unref (folder); -- g_object_unref (mailbox); -+ g_clear_object (&server->priv->subprocess); - -- return TRUE; -+ /* Chain up to parent's dispose() method. */ -+ G_OBJECT_CLASS (camel_imapx_server_parent_class)->dispose (object); - } - --static gboolean --imapx_job_refresh_info_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) -+static void -+imapx_server_finalize (GObject *object) - { -- CamelIMAPXSummary *isum; -- CamelFolder *folder; -- CamelIMAPXMailbox *mailbox; -- const gchar *full_name; -- gboolean need_rescan = FALSE; -- gboolean is_selected = FALSE; -- gboolean can_qresync = FALSE; -- gboolean success; -- guint32 messages; -- guint32 unseen; -- guint32 uidnext; -- guint32 uidvalidity; -- guint64 highestmodseq; -- guint32 total; -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_val_if_fail (mailbox != NULL, FALSE); -- -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_val_if_fail (folder != NULL, FALSE); -+ CamelIMAPXServer *is = CAMEL_IMAPX_SERVER (object); - -- isum = CAMEL_IMAPX_SUMMARY (folder->summary); -+ g_mutex_clear (&is->priv->stream_lock); -+ g_mutex_clear (&is->priv->select_lock); -+ g_mutex_clear (&is->priv->changes_lock); - -- full_name = camel_folder_get_full_name (folder); -+ camel_folder_change_info_free (is->priv->changes); -+ imapx_free_status (is->priv->copyuid_status); - -- /* Sync changes first, else unread count will not -- * match. Need to think about better ways for this */ -- success = imapx_server_sync_changes ( -- is, mailbox, job->type, job->pri, cancellable, error); -- if (!success) -- goto done; -+ g_free (is->priv->context); -+ g_hash_table_destroy (is->priv->untagged_handlers); - -- messages = camel_imapx_mailbox_get_messages (mailbox); -- unseen = camel_imapx_mailbox_get_unseen (mailbox); -- uidnext = camel_imapx_mailbox_get_uidnext (mailbox); -- uidvalidity = camel_imapx_mailbox_get_uidvalidity (mailbox); -- highestmodseq = camel_imapx_mailbox_get_highestmodseq (mailbox); -+ if (is->priv->inactivity_timeout != NULL) -+ g_source_unref (is->priv->inactivity_timeout); -+ g_mutex_clear (&is->priv->inactivity_timeout_lock); - --#if 0 /* There are issues with this still; continue with the buggy -- * behaviour where we issue STATUS on the current folder, for now. */ -- if (is->priv->select_folder == folder) -- is_selected = TRUE; --#endif -- total = camel_folder_summary_count (folder->summary); -+ g_free (is->priv->status_data_items); -+ g_free (is->priv->list_return_opts); - -- if (uidvalidity > 0 && uidvalidity != isum->validity) -- need_rescan = TRUE; -+ if (is->priv->search_results != NULL) -+ g_array_unref (is->priv->search_results); -+ g_mutex_clear (&is->priv->search_results_lock); - -- /* We don't have valid unread count or modseq for currently-selected server -- * (unless we want to re-SELECT it). We fake unread count when fetching -- * message flags, but don't depend on modseq for the selected folder */ -- if (total != messages || -- isum->uidnext != uidnext || -- camel_folder_summary_get_unread_count (folder->summary) != unseen || -- (!is_selected && isum->modseq != highestmodseq)) -- need_rescan = TRUE; -- -- /* This is probably the first check of this folder after startup; -- * use STATUS to check whether the cached summary is valid, rather -- * than blindly updating. Only for servers which support CONDSTORE -- * though. */ -- if (isum->modseq > 0 && highestmodseq == 0) -- need_rescan = FALSE; -+ g_hash_table_destroy (is->priv->known_alerts); -+ g_mutex_clear (&is->priv->known_alerts_lock); - -- /* If we don't think there's anything to do, poke it to check */ -- if (!need_rescan) { -- CamelIMAPXCommand *ic; -+ g_mutex_clear (&is->priv->idle_lock); -+ g_cond_clear (&is->priv->idle_cond); - -- #if 0 /* see comment for disabled bits above */ -- if (is_selected) { -- /* We may not issue STATUS on the current folder. Use SELECT or NOOP instead. */ -- if (0 /* server needs SELECT not just NOOP */) { -- if (imapx_in_idle (is)) -- if (!imapx_stop_idle (is, error)) -- goto done; -- /* This doesn't work -- this is an immediate command, not queued */ -- imapx_maybe_select (is, folder) -- } else { -- /* Or maybe just NOOP, unless we're in IDLE in which case do nothing */ -- if (!imapx_in_idle (is)) { -- if (!camel_imapx_server_noop (is, folder, cancellable, error)) -- goto done; -- } -- } -- } else -- #endif -- { -- ic = camel_imapx_command_new ( -- is, "STATUS", NULL, "STATUS %M (%t)", -- mailbox, is->priv->status_data_items); -+ g_rec_mutex_clear (&is->priv->command_lock); - -- camel_imapx_command_set_job (ic, job); -- ic->pri = job->pri; -+ g_weak_ref_clear (&is->priv->store); -+ g_weak_ref_clear (&is->priv->select_mailbox); -+ g_weak_ref_clear (&is->priv->select_pending); -+ g_clear_object (&is->priv->cancellable); - -- success = imapx_command_run_sync ( -- is, ic, cancellable, error); -+ /* Chain up to parent's finalize() method. */ -+ G_OBJECT_CLASS (camel_imapx_server_parent_class)->finalize (object); -+} - -- camel_imapx_command_unref (ic); -+static void -+imapx_server_constructed (GObject *object) -+{ -+ CamelIMAPXServer *server; - -- if (!success) { -- g_prefix_error ( -- error, "%s: ", -- _("Error refreshing folder")); -- goto done; -- } -- } -+ /* Chain up to parent's method. */ -+ G_OBJECT_CLASS (camel_imapx_server_parent_class)->constructed (object); - -- /* Recalulate need_rescan */ -+ server = CAMEL_IMAPX_SERVER (object); -+ server->priv->tagprefix = 'Z'; -+} - -- messages = camel_imapx_mailbox_get_messages (mailbox); -- unseen = camel_imapx_mailbox_get_unseen (mailbox); -- uidnext = camel_imapx_mailbox_get_uidnext (mailbox); -- highestmodseq = camel_imapx_mailbox_get_highestmodseq (mailbox); -+static void -+camel_imapx_server_class_init (CamelIMAPXServerClass *class) -+{ -+ GObjectClass *object_class; - -- if (total != messages || -- isum->uidnext != uidnext || -- camel_folder_summary_get_unread_count (folder->summary) != unseen || -- (!is_selected && isum->modseq != highestmodseq)) -- need_rescan = TRUE; -- } -+ g_type_class_add_private (class, sizeof (CamelIMAPXServerPrivate)); - -- messages = camel_imapx_mailbox_get_messages (mailbox); -- unseen = camel_imapx_mailbox_get_unseen (mailbox); -- uidnext = camel_imapx_mailbox_get_uidnext (mailbox); -- uidvalidity = camel_imapx_mailbox_get_uidvalidity (mailbox); -- highestmodseq = camel_imapx_mailbox_get_highestmodseq (mailbox); -+ 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; -+ object_class->constructed = imapx_server_constructed; - -- if (is->use_qresync && isum->modseq > 0 && uidvalidity > 0) -- can_qresync = TRUE; -+ 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)); - -- e ( -- is->tagprefix, -- "folder %s is %sselected, " -- "total %u / %u, unread %u / %u, modseq %" -- G_GUINT64_FORMAT " / %" G_GUINT64_FORMAT -- ", uidnext %u / %u: will %srescan\n", -- full_name, -- is_selected ? "" : "not ", -- total, -- messages, -- camel_folder_summary_get_unread_count (folder->summary), -- unseen, -- isum->modseq, -- highestmodseq, -- isum->uidnext, -- uidnext, -- need_rescan ? "" : "not "); -- -- /* Fetch new messages first, so that they appear to the user ASAP */ -- if (messages > total || uidnext > isum->uidnext) { -- if (!total) -- need_rescan = FALSE; -+ signals[REFRESH_MAILBOX] = g_signal_new ( -+ "refresh-mailbox", -+ G_OBJECT_CLASS_TYPE (class), -+ G_SIGNAL_RUN_LAST, -+ G_STRUCT_OFFSET (CamelIMAPXServerClass, refresh_mailbox), -+ NULL, NULL, NULL, -+ G_TYPE_NONE, 1, -+ CAMEL_TYPE_IMAPX_MAILBOX); -+} - -- success = imapx_server_fetch_new_messages ( -- is, mailbox, FALSE, FALSE, cancellable, error); -- if (!success) -- goto done; -+static void -+camel_imapx_server_init (CamelIMAPXServer *is) -+{ -+ is->priv = CAMEL_IMAPX_SERVER_GET_PRIVATE (is); - -- /* If QRESYNC-capable we'll have got all flags changes in SELECT */ -- if (can_qresync) -- goto qresync_done; -- } -+ is->priv->untagged_handlers = create_initial_untagged_handler_table (); - -- if (!need_rescan) -- goto done; -+ g_mutex_init (&is->priv->stream_lock); -+ g_mutex_init (&is->priv->inactivity_timeout_lock); -+ g_mutex_init (&is->priv->select_lock); -+ g_mutex_init (&is->priv->changes_lock); -+ g_mutex_init (&is->priv->search_results_lock); -+ g_mutex_init (&is->priv->known_alerts_lock); - -- if (can_qresync) { -- /* Actually we only want to select it; no need for the NOOP */ -- success = camel_imapx_server_noop ( -- is, mailbox, cancellable, error); -- if (!success) -- goto done; -- qresync_done: -- messages = camel_imapx_mailbox_get_messages (mailbox); -- unseen = camel_imapx_mailbox_get_unseen (mailbox); -- highestmodseq = camel_imapx_mailbox_get_highestmodseq (mailbox); -+ g_weak_ref_init (&is->priv->store, NULL); -+ g_weak_ref_init (&is->priv->select_mailbox, NULL); -+ g_weak_ref_init (&is->priv->select_pending, NULL); - -- isum->modseq = highestmodseq; -- total = camel_folder_summary_count (folder->summary); -- if (total != messages || -- camel_folder_summary_get_unread_count (folder->summary) != unseen || -- (isum->modseq != highestmodseq)) { -- c ( -- is->tagprefix, -- "Eep, after QRESYNC we're out of sync. " -- "total %u / %u, unread %u / %u, modseq %" -- G_GUINT64_FORMAT " / %" G_GUINT64_FORMAT "\n", -- total, messages, -- camel_folder_summary_get_unread_count (folder->summary), -- unseen, -- isum->modseq, -- highestmodseq); -- } else { -- c ( -- is->tagprefix, -- "OK, after QRESYNC we're still in sync. " -- "total %u / %u, unread %u / %u, modseq %" -- G_GUINT64_FORMAT " / %" G_GUINT64_FORMAT "\n", -- total, messages, -- camel_folder_summary_get_unread_count (folder->summary), -- unseen, -- isum->modseq, -- highestmodseq); -- goto done; -- } -- } -+ is->priv->cancellable = g_cancellable_new (); - -- g_object_unref (folder); -- g_object_unref (mailbox); -+ is->priv->state = IMAPX_DISCONNECTED; -+ is->priv->is_cyrus = FALSE; -+ is->priv->copyuid_status = NULL; - -- return imapx_job_scan_changes_start (job, is, cancellable, error); -+ is->priv->changes = camel_folder_change_info_new (); - --done: -- g_object_unref (folder); -- g_object_unref (mailbox); -+ is->priv->known_alerts = g_hash_table_new_full ( -+ (GHashFunc) g_str_hash, -+ (GEqualFunc) g_str_equal, -+ (GDestroyNotify) g_free, -+ (GDestroyNotify) NULL); - -- imapx_unregister_job (is, job); -+ /* Initialize IDLE members. */ -+ g_mutex_init (&is->priv->idle_lock); -+ g_cond_init (&is->priv->idle_cond); -+ is->priv->idle_state = IMAPX_IDLE_STATE_OFF; -+ is->priv->idle_stamp = 0; - -- return success; -+ g_rec_mutex_init (&is->priv->command_lock); - } - --static gboolean --imapx_job_refresh_info_matches (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox, -- const gchar *uid) -+CamelIMAPXServer * -+camel_imapx_server_new (CamelIMAPXStore *store) - { -- return camel_imapx_job_has_mailbox (job, mailbox); --} -+ g_return_val_if_fail (CAMEL_IS_IMAPX_STORE (store), NULL); - --/* ********************************************************************** */ -+ return g_object_new ( -+ CAMEL_TYPE_IMAPX_SERVER, -+ "store", store, NULL); -+} - --static void --imapx_command_expunge_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) -+CamelIMAPXStore * -+camel_imapx_server_ref_store (CamelIMAPXServer *server) - { -- CamelIMAPXJob *job; -- CamelIMAPXMailbox *mailbox; -- CamelFolder *folder; -- GError *local_error = NULL; -- -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_if_fail (mailbox != NULL); -- -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_if_fail (folder != NULL); -- -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error expunging message")); -- camel_imapx_job_take_error (job, local_error); -- -- } else { -- GPtrArray *uids; -- CamelStore *parent_store; -- const gchar *full_name; -- -- full_name = camel_folder_get_full_name (folder); -- parent_store = camel_folder_get_parent_store (folder); -- -- camel_folder_summary_lock (folder->summary); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), NULL); - -- camel_folder_summary_save_to_db (folder->summary, NULL); -- uids = camel_db_get_folder_deleted_uids (parent_store->cdb_r, full_name, NULL); -+ return g_weak_ref_get (&server->priv->store); -+} - -- if (uids && uids->len) { -- CamelFolderChangeInfo *changes; -- GList *removed = NULL; -- gint i; -+CamelIMAPXSettings * -+camel_imapx_server_ref_settings (CamelIMAPXServer *server) -+{ -+ CamelIMAPXStore *store; -+ CamelSettings *settings; - -- changes = camel_folder_change_info_new (); -- for (i = 0; i < uids->len; i++) { -- gchar *uid = uids->pdata[i]; -- CamelMessageInfo *mi; -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), NULL); - -- mi = camel_folder_summary_peek_loaded (folder->summary, uid); -- if (mi) { -- camel_folder_summary_remove (folder->summary, mi); -- camel_message_info_unref (mi); -- } else { -- camel_folder_summary_remove_uid (folder->summary, uid); -- } -+ store = camel_imapx_server_ref_store (server); -+ settings = camel_service_ref_settings (CAMEL_SERVICE (store)); -+ g_object_unref (store); - -- camel_folder_change_info_remove_uid (changes, uids->pdata[i]); -- removed = g_list_prepend (removed, (gpointer) uids->pdata[i]); -- } -+ return CAMEL_IMAPX_SETTINGS (settings); -+} - -- camel_folder_summary_save_to_db (folder->summary, NULL); -- camel_folder_changed (folder, changes); -- camel_folder_change_info_free (changes); -+/** -+ * camel_imapx_server_ref_input_stream: -+ * @is: a #CamelIMAPXServer -+ * -+ * Returns the #GInputStream for @is, which is owned by either a -+ * #GTcpConnection or a #GSubprocess. If the #CamelIMAPXServer is not -+ * yet connected or has lost its connection, the function returns %NULL. -+ * -+ * The returned #GInputStream is referenced for thread-safety and must -+ * be unreferenced with g_object_unref() when finished with it. -+ * -+ * Returns: a #GInputStream, or %NULL -+ * -+ * Since: 3.12 -+ **/ -+GInputStream * -+camel_imapx_server_ref_input_stream (CamelIMAPXServer *is) -+{ -+ GInputStream *input_stream = NULL; - -- g_list_free (removed); -- g_ptr_array_foreach (uids, (GFunc) camel_pstring_free, NULL); -- } -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); - -- if (uids) -- g_ptr_array_free (uids, TRUE); -+ g_mutex_lock (&is->priv->stream_lock); - -- camel_folder_summary_unlock (folder->summary); -- } -+ if (is->priv->input_stream != NULL) -+ input_stream = g_object_ref (is->priv->input_stream); - -- g_object_unref (folder); -- g_object_unref (mailbox); -+ g_mutex_unlock (&is->priv->stream_lock); - -- imapx_unregister_job (is, job); -+ return input_stream; - } - --static gboolean --imapx_job_expunge_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) -+/** -+ * camel_imapx_server_ref_output_stream: -+ * @is: a #CamelIMAPXServer -+ * -+ * Returns the #GOutputStream for @is, which is owned by either a -+ * #GTcpConnection or a #GSubprocess. If the #CamelIMAPXServer is not -+ * yet connected or has lost its connection, the function returns %NULL. -+ * -+ * The returned #GOutputStream is referenced for thread-safety and must -+ * be unreferenced with g_object_unref() when finished with it. -+ * -+ * Returns: a #GOutputStream, or %NULL -+ * -+ * Since: 3.12 -+ **/ -+GOutputStream * -+camel_imapx_server_ref_output_stream (CamelIMAPXServer *is) - { -- CamelIMAPXCommand *ic; -- CamelIMAPXMailbox *mailbox; -- gboolean success; -- -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_val_if_fail (mailbox != NULL, FALSE); -- -- success = imapx_server_sync_changes ( -- is, mailbox, job->type, job->pri, cancellable, error); -+ GOutputStream *output_stream = NULL; - -- if (success) { -- /* TODO handle UIDPLUS capability */ -- ic = camel_imapx_command_new ( -- is, "EXPUNGE", mailbox, "EXPUNGE"); -- camel_imapx_command_set_job (ic, job); -- ic->pri = job->pri; -- ic->complete = imapx_command_expunge_done; -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); - -- imapx_command_queue (is, ic); -+ g_mutex_lock (&is->priv->stream_lock); - -- camel_imapx_command_unref (ic); -- } -+ if (is->priv->output_stream != NULL) -+ output_stream = g_object_ref (is->priv->output_stream); - -- g_object_unref (mailbox); -+ g_mutex_unlock (&is->priv->stream_lock); - -- return success; -+ return output_stream; - } - --static gboolean --imapx_job_expunge_matches (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox, -- const gchar *uid) -+/** -+ * camel_imapx_server_ref_selected: -+ * @is: a #CamelIMAPXServer -+ * -+ * Returns the #CamelIMAPXMailbox representing the currently selected -+ * mailbox (or mailbox being selected if a SELECT -+ * command is in progress) on the IMAP server, or %NULL if no mailbox -+ * is currently selected or being selected on the server. -+ * -+ * The returned #CamelIMAPXMailbox is reference for thread-safety and -+ * should be unreferenced with g_object_unref() when finished with it. -+ * -+ * Returns: a #CamelIMAPXMailbox, or %NULL -+ * -+ * Since: 3.12 -+ **/ -+CamelIMAPXMailbox * -+camel_imapx_server_ref_selected (CamelIMAPXServer *is) - { -- return camel_imapx_job_has_mailbox (job, mailbox); --} -+ CamelIMAPXMailbox *mailbox; - --/* ********************************************************************** */ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); - --static void --imapx_command_list_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- GError *local_error = NULL; -+ g_mutex_lock (&is->priv->select_lock); - -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+ mailbox = g_weak_ref_get (&is->priv->select_mailbox); -+ if (mailbox == NULL) -+ mailbox = g_weak_ref_get (&is->priv->select_pending); - -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error fetching folders")); -- camel_imapx_job_take_error (job, local_error); -- } -+ g_mutex_unlock (&is->priv->select_lock); - -- e (is->tagprefix, "==== list or lsub completed ==== \n"); -- imapx_unregister_job (is, job); -+ return mailbox; - } - --static void --imapx_command_list_lsub (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) -+/* Some untagged responses updated pending SELECT mailbox, not the currently -+ selected or closing one, thus use this function instead. */ -+CamelIMAPXMailbox * -+camel_imapx_server_ref_pending_or_selected (CamelIMAPXServer *is) - { -- CamelIMAPXJob *job; -- ListData *data; -- GError *local_error = NULL; -- -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+ CamelIMAPXMailbox *mailbox; - -- data = camel_imapx_job_get_data (job); -- g_return_if_fail (data != NULL); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); - -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error fetching folders")); -- camel_imapx_job_take_error (job, local_error); -- imapx_unregister_job (is, job); -+ g_mutex_lock (&is->priv->select_lock); - -- } else { -- ic = camel_imapx_command_new ( -- is, "LIST", NULL, -- "LSUB \"\" %s", -- data->pattern); -- -- ic->pri = job->pri; -- camel_imapx_command_set_job (ic, job); -- ic->complete = imapx_command_list_done; -+ mailbox = g_weak_ref_get (&is->priv->select_pending); -+ if (mailbox == NULL) -+ mailbox = g_weak_ref_get (&is->priv->select_mailbox); - -- imapx_command_queue (is, ic); -+ g_mutex_unlock (&is->priv->select_lock); - -- camel_imapx_command_unref (ic); -- } -+ return mailbox; - } - --static gboolean --imapx_job_list_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) -+gboolean -+camel_imapx_server_mailbox_selected (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox) - { -- CamelIMAPXCommand *ic; -- ListData *data; -- -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -- -- if (is->priv->list_return_opts != NULL) { -- ic = camel_imapx_command_new ( -- is, "LIST", NULL, -- "LIST \"\" %s RETURN (%t)", -- data->pattern, -- is->priv->list_return_opts); -- ic->complete = imapx_command_list_done; -- } else { -- ic = camel_imapx_command_new ( -- is, "LIST", NULL, -- "LIST \"\" %s", -- data->pattern); -- ic->complete = imapx_command_list_lsub; -- } -- -- ic->pri = job->pri; -- camel_imapx_command_set_job (ic, job); -- -- imapx_command_queue (is, ic); -+ CamelIMAPXMailbox *selected_mailbox; -+ gboolean res; - -- camel_imapx_command_unref (ic); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); - -- return TRUE; --} -+ g_mutex_lock (&is->priv->select_lock); -+ selected_mailbox = g_weak_ref_get (&is->priv->select_mailbox); -+ res = selected_mailbox == mailbox; -+ g_clear_object (&selected_mailbox); -+ g_mutex_unlock (&is->priv->select_lock); - --static gboolean --imapx_job_list_matches (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox, -- const gchar *uid) --{ -- return TRUE; /* matches everything */ -+ return res; - } - --/* ********************************************************************** */ -- --static void --imapx_command_create_mailbox_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) -+gboolean -+camel_imapx_server_ensure_selected_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelIMAPXJob *job; -- GError *local_error = NULL; -+ CamelIMAPXCommand *ic; -+ CamelIMAPXMailbox *selected_mailbox; -+ gboolean success; - -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); - -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error creating folder")); -- camel_imapx_job_take_error (job, local_error); -- } -+ if (g_cancellable_set_error_if_cancelled (cancellable, error)) -+ return FALSE; - -- imapx_unregister_job (is, job); --} -+ g_mutex_lock (&is->priv->select_lock); -+ selected_mailbox = g_weak_ref_get (&is->priv->select_mailbox); -+ if (selected_mailbox == mailbox) { -+ gboolean request_noop; -+ gint change_stamp; - --static gboolean --imapx_job_create_mailbox_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXCommand *ic; -- MailboxData *data; -+ change_stamp = selected_mailbox ? camel_imapx_mailbox_get_change_stamp (selected_mailbox) : 0; -+ request_noop = selected_mailbox && is->priv->last_selected_mailbox_change_stamp != change_stamp; - -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -+ if (request_noop) -+ is->priv->last_selected_mailbox_change_stamp = change_stamp; - -- ic = camel_imapx_command_new ( -- is, "CREATE", NULL, "CREATE %m", -- data->mailbox_name); -- ic->pri = job->pri; -- camel_imapx_command_set_job (ic, job); -- ic->complete = imapx_command_create_mailbox_done; -+ g_mutex_unlock (&is->priv->select_lock); -+ g_clear_object (&selected_mailbox); - -- imapx_command_queue (is, ic); -+ if (request_noop) { -+ c (is->priv->tagprefix, "%s: Selected mailbox '%s' changed, do NOOP instead\n", G_STRFUNC, camel_imapx_mailbox_get_name (mailbox)); - -- camel_imapx_command_unref (ic); -+ return camel_imapx_server_noop_sync (is, mailbox, cancellable, error); -+ } - -- return TRUE; --} -+ return TRUE; -+ } - --/* ********************************************************************** */ -+ g_clear_object (&selected_mailbox); - --static void --imapx_command_delete_mailbox_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- MailboxData *data; -- GError *local_error = NULL; -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_SELECT, "SELECT %M", mailbox); - -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+ if (is->priv->use_qresync) { -+ CamelFolder *folder; - -- data = camel_imapx_job_get_data (job); -- g_return_if_fail (data != NULL); -+ folder = imapx_server_ref_folder (is, mailbox); -+ camel_imapx_command_add_qresync_parameter (ic, folder); -+ g_clear_object (&folder); -+ } - -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error deleting folder")); -- camel_imapx_job_take_error (job, local_error); -+ g_weak_ref_set (&is->priv->select_pending, mailbox); -+ g_mutex_unlock (&is->priv->select_lock); - -- } else { -- CamelIMAPXStore *imapx_store; -+ success = camel_imapx_server_process_command_sync (is, ic, _("Failed to select mailbox"), cancellable, error); - -- /* Perform the same processing as imapx_untagged_list() -- * would if the server notified us of a deleted mailbox. */ -+ camel_imapx_command_unref (ic); - -- imapx_store = camel_imapx_server_ref_store (is); -+ g_mutex_lock (&is->priv->select_lock); - -- camel_imapx_mailbox_deleted (data->mailbox); -- camel_imapx_store_emit_mailbox_updated (imapx_store, data->mailbox); -+ g_weak_ref_set (&is->priv->select_pending, NULL); - -- g_clear_object (&imapx_store); -+ if (success) { -+ is->priv->state = IMAPX_SELECTED; -+ is->priv->last_selected_mailbox_change_stamp = camel_imapx_mailbox_get_change_stamp (mailbox); -+ g_weak_ref_set (&is->priv->select_mailbox, mailbox); -+ } else { -+ is->priv->state = IMAPX_INITIALISED; -+ is->priv->last_selected_mailbox_change_stamp = 0; -+ g_weak_ref_set (&is->priv->select_mailbox, NULL); - } - -- imapx_unregister_job (is, job); -+ g_mutex_unlock (&is->priv->select_lock); -+ -+ return success; - } - --static gboolean --imapx_job_delete_mailbox_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) -+gboolean -+camel_imapx_server_process_command_sync (CamelIMAPXServer *is, -+ CamelIMAPXCommand *ic, -+ const gchar *error_prefix, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelIMAPXStore *imapx_store; -- CamelIMAPXCommand *ic; -- MailboxData *data; -- CamelIMAPXMailbox *inbox; -- -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -- -- imapx_store = camel_imapx_server_ref_store (is); -- /* Keep going, even if this returns NULL. */ -- inbox = camel_imapx_store_ref_mailbox (imapx_store, "INBOX"); -- g_clear_object (&imapx_store); -+ CamelIMAPXCommandPart *cp; -+ GInputStream *input_stream = NULL; -+ GOutputStream *output_stream = NULL; -+ gboolean cp_literal_plus; -+ GList *head; -+ gchar *string; -+ gboolean success = FALSE; -+ GError *local_error = NULL; - -- /* Make sure the to-be-deleted folder is not -- * selected by selecting INBOX for this operation. */ -- ic = camel_imapx_command_new ( -- is, "DELETE", inbox, -- "DELETE %M", data->mailbox); -- ic->pri = job->pri; -- camel_imapx_command_set_job (ic, job); -- ic->complete = imapx_command_delete_mailbox_done; -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_COMMAND (ic), FALSE); - -- imapx_command_queue (is, ic); -+ camel_imapx_command_close (ic); -+ if (ic->status) { -+ imapx_free_status (ic->status); -+ ic->status = NULL; -+ } -+ ic->completed = FALSE; - -- camel_imapx_command_unref (ic); -+ head = g_queue_peek_head_link (&ic->parts); -+ g_return_val_if_fail (head != NULL, FALSE); -+ cp = (CamelIMAPXCommandPart *) head->data; -+ ic->current_part = head; - -- g_clear_object (&inbox); -+ if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) { -+ if (error_prefix && local_error) -+ g_prefix_error (&local_error, "%s: ", error_prefix); - -- return TRUE; --} -+ if (local_error) -+ g_propagate_error (error, local_error); - --/* ********************************************************************** */ -+ return FALSE; -+ } - --static void --imapx_command_rename_mailbox_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- MailboxData *data; -- GError *local_error = NULL; -+ cp_literal_plus = ((cp->type & CAMEL_IMAPX_COMMAND_LITERAL_PLUS) != 0); - -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+ COMMAND_LOCK (is); - -- data = camel_imapx_job_get_data (job); -- g_return_if_fail (data != NULL); -+ if (is->priv->current_command != NULL) { -+ g_warning ("%s: [%c] %p: Starting command %p (%s) while still processing %p (%s)", G_STRFUNC, -+ is->priv->tagprefix, is, ic, camel_imapx_job_get_kind_name (ic->job_kind), -+ is->priv->current_command, camel_imapx_job_get_kind_name (is->priv->current_command->job_kind)); -+ } - -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error renaming folder")); -- camel_imapx_job_take_error (job, local_error); -+ if (g_cancellable_set_error_if_cancelled (cancellable, &local_error)) { -+ c (is->priv->tagprefix, "%s: command %p (%s) cancelled\n", G_STRFUNC, ic, camel_imapx_job_get_kind_name (ic->job_kind)); - -- } else { -- CamelIMAPXStore *imapx_store; -+ COMMAND_UNLOCK (is); - -- /* Perform the same processing as imapx_untagged_list() -- * would if the server notified us of a renamed mailbox. */ -+ if (error_prefix && local_error) -+ g_prefix_error (&local_error, "%s: ", error_prefix); - -- imapx_store = camel_imapx_server_ref_store (is); -- camel_imapx_store_handle_mailbox_rename (imapx_store, data->mailbox, data->mailbox_name); -+ if (local_error) -+ g_propagate_error (error, local_error); - -- g_clear_object (&imapx_store); -+ return FALSE; - } - -- imapx_unregister_job (is, job); --} -+ c (is->priv->tagprefix, "%s: %p (%s) ~> %p (%s)\n", G_STRFUNC, is->priv->current_command, -+ is->priv->current_command ? camel_imapx_job_get_kind_name (is->priv->current_command->job_kind) : "", -+ ic, camel_imapx_job_get_kind_name (ic->job_kind)); - --static gboolean --imapx_job_rename_mailbox_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXCommand *ic; -- CamelIMAPXStore *imapx_store; -- CamelIMAPXMailbox *inbox; -- MailboxData *data; -+ is->priv->current_command = ic; -+ is->priv->continuation_command = ic; - -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -+ COMMAND_UNLOCK (is); - -- imapx_store = camel_imapx_server_ref_store (is); -- inbox = camel_imapx_store_ref_mailbox (imapx_store, "INBOX"); -- g_clear_object (&imapx_store); -- g_return_val_if_fail (inbox != NULL, FALSE); -+ input_stream = camel_imapx_server_ref_input_stream (is); -+ output_stream = camel_imapx_server_ref_output_stream (is); - -- camel_imapx_job_set_mailbox (job, inbox); -+ if (output_stream == NULL) { -+ local_error = g_error_new_literal ( -+ CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT, -+ _("Cannot issue command, no stream available")); -+ goto exit; -+ } -+ -+ c ( -+ is->priv->tagprefix, -+ "Starting command (%s) %c%05u %s\r\n", -+ is->priv->current_command ? " literal" : "", -+ is->priv->tagprefix, -+ ic->tag, -+ cp->data && g_str_has_prefix (cp->data, "LOGIN") ? -+ "LOGIN..." : cp->data); - -- ic = camel_imapx_command_new ( -- is, "RENAME", inbox, "RENAME %M %m", -- data->mailbox, data->mailbox_name); -- ic->pri = job->pri; -- camel_imapx_command_set_job (ic, job); -- ic->complete = imapx_command_rename_mailbox_done; -+ if (ic->job_kind == CAMEL_IMAPX_JOB_DONE) -+ string = g_strdup_printf ("%s\r\n", cp->data); -+ else -+ string = g_strdup_printf ("%c%05u %s\r\n", is->priv->tagprefix, ic->tag, cp->data); -+ g_mutex_lock (&is->priv->stream_lock); -+ success = g_output_stream_write_all ( -+ output_stream, string, strlen (string), -+ NULL, cancellable, &local_error); -+ g_mutex_unlock (&is->priv->stream_lock); -+ g_free (string); - -- imapx_command_queue (is, ic); -+ if (local_error != NULL || !success) -+ goto exit; - -- camel_imapx_command_unref (ic); -+ while (is->priv->continuation_command == ic && cp_literal_plus) { -+ /* Sent LITERAL+ continuation immediately */ -+ imapx_continuation ( -+ is, input_stream, output_stream, -+ TRUE, cancellable, &local_error); -+ if (local_error != NULL) -+ goto exit; -+ } - -- g_object_unref (inbox); -+ while (success && !ic->completed) -+ success = imapx_step (is, input_stream, output_stream, cancellable, &local_error); - -- return TRUE; --} -+ imapx_server_reset_inactivity_timer (is); - --/* ********************************************************************** */ -+ exit: - --static void --imapx_command_subscribe_mailbox_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- MailboxData *data; -- GError *local_error = NULL; -+ COMMAND_LOCK (is); - -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+ if (is->priv->current_command == ic) { -+ c (is->priv->tagprefix, "%s: %p ~> %p; success:%d local-error:%s result:%s status-text:'%s'\n", G_STRFUNC, -+ is->priv->current_command, NULL, success, local_error ? local_error->message : "[null]", -+ ic->status ? ( -+ ic->status->result == IMAPX_OK ? "OK" : -+ ic->status->result == IMAPX_NO ? "NO" : -+ ic->status->result == IMAPX_BAD ? "BAD" : -+ ic->status->result == IMAPX_PREAUTH ? "PREAUTH" : -+ ic->status->result == IMAPX_BYE ? "BYE" : "???") : "[null]", -+ ic->status ? ic->status->text : "[null]"); - -- data = camel_imapx_job_get_data (job); -- g_return_if_fail (data != NULL); -+ is->priv->current_command = NULL; -+ is->priv->continuation_command = NULL; -+ } else { -+ c (is->priv->tagprefix, "%s: current command:%p doesn't match passed-in command:%p success:%d local-error:%s result:%s status-text:'%s'\n", G_STRFUNC, -+ is->priv->current_command, ic, success, local_error ? local_error->message : "[null]", -+ ic->status ? ( -+ ic->status->result == IMAPX_OK ? "OK" : -+ ic->status->result == IMAPX_NO ? "NO" : -+ ic->status->result == IMAPX_BAD ? "BAD" : -+ ic->status->result == IMAPX_PREAUTH ? "PREAUTH" : -+ ic->status->result == IMAPX_BYE ? "BYE" : "???") : "[null]", -+ ic->status ? ic->status->text : "[null]"); -+ } - -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error subscribing to folder")); -- camel_imapx_job_take_error (job, local_error); -+ COMMAND_UNLOCK (is); - -- } else { -- CamelIMAPXStore *imapx_store; -+ /* Server reported error. */ -+ if (success && ic->status && ic->status->result != IMAPX_OK) { -+ g_set_error ( -+ &local_error, CAMEL_ERROR, -+ CAMEL_ERROR_GENERIC, -+ "%s", ic->status->text); -+ } - -- /* Perform the same processing as imapx_untagged_list() -- * would if the server notified us of a subscription. */ -+ if (local_error) { -+ /* Sadly, G_IO_ERROR_FAILED is also used for 'Connection reset by peer' error; -+ since GLib 2.44 is used G_IO_ERROR_CONNECTION_CLOSED, which is the same as G_IO_ERROR_BROKEN_PIPE */ -+ if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_FAILED) || -+ g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_BROKEN_PIPE) || -+ g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT)) { -+ local_error->domain = CAMEL_IMAPX_SERVER_ERROR; -+ local_error->code = CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT; -+ } - -- imapx_store = camel_imapx_server_ref_store (is); -+ if (error_prefix && local_error) -+ g_prefix_error (&local_error, "%s: ", error_prefix); - -- camel_imapx_mailbox_subscribed (data->mailbox); -- camel_imapx_store_emit_mailbox_updated (imapx_store, data->mailbox); -+ g_propagate_error (error, local_error); - -- g_clear_object (&imapx_store); -+ success = FALSE; - } - -- imapx_unregister_job (is, job); -+ g_clear_object (&input_stream); -+ g_clear_object (&output_stream); -+ -+ return success; - } - --static gboolean --imapx_job_subscribe_mailbox_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) -+static void -+imapx_disconnect (CamelIMAPXServer *is) - { -- CamelIMAPXCommand *ic; -- MailboxData *data; -+ g_cancellable_cancel (is->priv->cancellable); - -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -+ g_mutex_lock (&is->priv->stream_lock); - -- ic = camel_imapx_command_new ( -- is, "SUBSCRIBE", NULL, -- "SUBSCRIBE %M", data->mailbox); -+ if (is->priv->connection) { -+ /* No need to wait for close for too long */ -+ imapx_server_set_connection_timeout (is->priv->connection, 3); -+ } - -- ic->pri = job->pri; -- camel_imapx_command_set_job (ic, job); -- ic->complete = imapx_command_subscribe_mailbox_done; -+ g_clear_object (&is->priv->input_stream); -+ g_clear_object (&is->priv->output_stream); -+ g_clear_object (&is->priv->connection); -+ g_clear_object (&is->priv->subprocess); - -- imapx_command_queue (is, ic); -+ if (is->priv->cinfo) { -+ imapx_free_capability (is->priv->cinfo); -+ is->priv->cinfo = NULL; -+ } - -- camel_imapx_command_unref (ic); -+ g_mutex_unlock (&is->priv->stream_lock); - -- return TRUE; --} -+ g_mutex_lock (&is->priv->select_lock); -+ is->priv->last_selected_mailbox_change_stamp = 0; -+ g_weak_ref_set (&is->priv->select_mailbox, NULL); -+ g_weak_ref_set (&is->priv->select_pending, NULL); -+ g_mutex_unlock (&is->priv->select_lock); - --/* ********************************************************************** */ -+ is->priv->is_cyrus = FALSE; -+ is->priv->state = IMAPX_DISCONNECTED; - --static void --imapx_command_unsubscribe_mailbox_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- MailboxData *data; -- GError *local_error = NULL; -+ g_mutex_lock (&is->priv->idle_lock); -+ is->priv->idle_state = IMAPX_IDLE_STATE_OFF; -+ g_cond_broadcast (&is->priv->idle_cond); -+ g_mutex_unlock (&is->priv->idle_lock); -+} - -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+/* Client commands */ -+gboolean -+camel_imapx_server_connect_sync (CamelIMAPXServer *is, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); - -- data = camel_imapx_job_get_data (job); -- g_return_if_fail (data != NULL); -+ if (is->priv->state == IMAPX_SHUTDOWN) { -+ g_set_error ( -+ error, CAMEL_SERVICE_ERROR, -+ CAMEL_SERVICE_ERROR_UNAVAILABLE, -+ "Shutting down"); -+ return FALSE; -+ } - -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error unsubscribing from folder")); -- camel_imapx_job_take_error (job, local_error); -+ if (is->priv->state >= IMAPX_INITIALISED) -+ return TRUE; - -- } else { -- CamelIMAPXStore *imapx_store; -+ is->priv->is_cyrus = FALSE; - -- /* Perform the same processing as imapx_untagged_list() -- * would if the server notified us of an unsubscription. */ -+ if (!imapx_reconnect (is, cancellable, error)) -+ return FALSE; - -- imapx_store = camel_imapx_server_ref_store (is); -+ g_mutex_lock (&is->priv->stream_lock); - -- camel_imapx_mailbox_unsubscribed (data->mailbox); -- camel_imapx_store_emit_mailbox_updated (imapx_store, data->mailbox); -+ if (CAMEL_IMAPX_LACK_CAPABILITY (is->priv->cinfo, NAMESPACE)) { -+ g_mutex_unlock (&is->priv->stream_lock); - -- g_clear_object (&imapx_store); -+ /* This also creates a needed faux NAMESPACE */ -+ if (!camel_imapx_server_list_sync (is, "INBOX", 0, cancellable, error)) -+ return FALSE; -+ } else { -+ g_mutex_unlock (&is->priv->stream_lock); - } - -- imapx_unregister_job (is, job); -+ return TRUE; - } - --static gboolean --imapx_job_unsubscribe_mailbox_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) -+gboolean -+camel_imapx_server_disconnect_sync (CamelIMAPXServer *is, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelIMAPXCommand *ic; -- MailboxData *data; -+ GCancellable *idle_cancellable; -+ gboolean success = TRUE; - -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); - -- ic = camel_imapx_command_new ( -- is, "UNSUBSCRIBE", NULL, -- "UNSUBSCRIBE %M", data->mailbox); -+ g_mutex_lock (&is->priv->idle_lock); -+ idle_cancellable = is->priv->idle_cancellable; -+ if (idle_cancellable) -+ g_object_ref (idle_cancellable); -+ g_mutex_unlock (&is->priv->idle_lock); -+ -+ if (idle_cancellable) -+ g_cancellable_cancel (idle_cancellable); -+ g_clear_object (&idle_cancellable); - -- ic->pri = job->pri; -- camel_imapx_command_set_job (ic, job); -- ic->complete = imapx_command_unsubscribe_mailbox_done; -+ g_mutex_lock (&is->priv->stream_lock); -+ if (is->priv->connection) { -+ /* No need to wait for close for too long */ -+ imapx_server_set_connection_timeout (is->priv->connection, 3); -+ } -+ g_mutex_unlock (&is->priv->stream_lock); - -- imapx_command_queue (is, ic); -+ /* Ignore errors here. */ -+ camel_imapx_server_stop_idle_sync (is, cancellable, NULL); - -- camel_imapx_command_unref (ic); -+ g_mutex_lock (&is->priv->stream_lock); -+ if (is->priv->connection) -+ success = g_io_stream_close (is->priv->connection, cancellable, error); -+ g_mutex_unlock (&is->priv->stream_lock); - -- return TRUE; --} -+ imapx_disconnect (is); - --/* ********************************************************************** */ -+ return success; -+} - --static void --imapx_command_update_quota_info_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) -+gboolean -+camel_imapx_server_query_auth_types_sync (CamelIMAPXServer *is, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelIMAPXJob *job; -- GError *local_error = NULL; -- -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -- -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error retrieving quota information")); -- camel_imapx_job_take_error (job, local_error); -- } -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); - -- imapx_unregister_job (is, job); -+ return imapx_connect_to_server (is, cancellable, error); - } - --static gboolean --imapx_job_update_quota_info_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) -+CamelStream * -+camel_imapx_server_get_message_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ CamelFolderSummary *summary, -+ CamelDataCache *message_cache, -+ const gchar *message_uid, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelIMAPXCommand *ic; -- CamelIMAPXMailbox *mailbox; -+ CamelMessageInfo *mi; -+ CamelStream *result_stream = NULL; -+ CamelIMAPXSettings *settings; -+ GIOStream *cache_stream; -+ gsize data_size; -+ gboolean use_multi_fetch; -+ gboolean success, retrying = FALSE; -+ GError *local_error = NULL; - -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_val_if_fail (mailbox != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), NULL); -+ g_return_val_if_fail (CAMEL_IS_FOLDER_SUMMARY (summary), NULL); -+ g_return_val_if_fail (CAMEL_IS_DATA_CACHE (message_cache), NULL); -+ g_return_val_if_fail (message_uid != NULL, NULL); - -- ic = camel_imapx_command_new ( -- is, "GETQUOTAROOT", NULL, -- "GETQUOTAROOT %M", mailbox); -- ic->pri = job->pri; -- camel_imapx_command_set_job (ic, job); -- ic->complete = imapx_command_update_quota_info_done; -+ if (!camel_imapx_server_ensure_selected_sync (is, mailbox, cancellable, error)) -+ return NULL; - -- imapx_command_queue (is, ic); -+ mi = camel_folder_summary_get (summary, message_uid); -+ if (mi == NULL) { -+ g_set_error ( -+ error, CAMEL_FOLDER_ERROR, -+ CAMEL_FOLDER_ERROR_INVALID_UID, -+ _("Cannot get message with message ID %s: %s"), -+ message_uid, _("No such message available.")); -+ return NULL; -+ } - -- camel_imapx_command_unref (ic); -+ /* This makes sure that if any file is left on the disk, it is not reused. -+ That can happen when the previous message download had been cancelled -+ or finished with an error. */ -+ camel_data_cache_remove (message_cache, "tmp", message_uid, NULL); - -- g_clear_object (&mailbox); -+ cache_stream = camel_data_cache_add (message_cache, "tmp", message_uid, error); -+ if (cache_stream == NULL) { -+ camel_message_info_unref (mi); -+ return NULL; -+ } - -- return TRUE; --} -+ settings = camel_imapx_server_ref_settings (is); -+ data_size = ((CamelMessageInfoBase *) mi)->size; -+ use_multi_fetch = data_size > MULTI_SIZE && camel_imapx_settings_get_use_multi_fetch (settings); -+ g_object_unref (settings); - --/* ********************************************************************** */ -+ g_warn_if_fail (is->priv->get_message_stream == NULL); - --static void --imapx_command_uid_search_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- SearchData *data; -- GError *local_error = NULL; -+ is->priv->get_message_stream = cache_stream; - -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+ try_again: -+ if (use_multi_fetch) { -+ CamelIMAPXCommand *ic; -+ gsize fetch_offset = 0; - -- data = camel_imapx_job_get_data (job); -- g_return_if_fail (data != NULL); -+ do { -+ camel_operation_progress (cancellable, fetch_offset * 100 / data_size); - -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error (&local_error, "%s: ", _("Search failed")); -- camel_imapx_job_take_error (job, local_error); -- } -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_GET_MESSAGE, "UID FETCH %t (BODY.PEEK[]", message_uid); -+ camel_imapx_command_add (ic, "<%u.%u>", fetch_offset, MULTI_SIZE); -+ camel_imapx_command_add (ic, ")"); -+ fetch_offset += MULTI_SIZE; - -- /* Don't worry about the success state and presence of search -- * results not agreeing here. camel_imapx_server_uid_search() -- * will disregard the search results if an error occurred. */ -- g_mutex_lock (&is->priv->search_results_lock); -- data->results = is->priv->search_results; -- is->priv->search_results = NULL; -- g_mutex_unlock (&is->priv->search_results_lock); -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error fetching message"), cancellable, &local_error); - -- imapx_unregister_job (is, job); --} -+ camel_imapx_command_unref (ic); -+ ic = NULL; - --static gboolean --imapx_job_uid_search_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXCommand *ic; -- CamelIMAPXMailbox *mailbox; -- SearchData *data; -+ if (success) { -+ gsize really_fetched = g_seekable_tell (G_SEEKABLE (is->priv->get_message_stream)); - -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -+ /* Don't automatically stop when we reach the reported message -+ * size -- some crappy servers (like Microsoft Exchange) have -+ * a tendency to lie about it. Keep going (one request at a -+ * time) until the data actually stop coming. */ -+ if (fetch_offset < data_size || -+ fetch_offset == really_fetched) { -+ /* just continue */ -+ } else { -+ break; -+ } -+ } -+ } while (success); -+ } else { -+ CamelIMAPXCommand *ic; - -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_val_if_fail (mailbox != NULL, FALSE); -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_GET_MESSAGE, "UID FETCH %t (BODY.PEEK[])", message_uid); - -- ic = camel_imapx_command_new ( -- is, "UID SEARCH", mailbox, -- "UID SEARCH %t", data->criteria); -- ic->pri = job->pri; -- camel_imapx_command_set_job (ic, job); -- ic->complete = imapx_command_uid_search_done; -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error fetching message"), cancellable, &local_error); - -- imapx_command_queue (is, ic); -+ camel_imapx_command_unref (ic); -+ } - -- camel_imapx_command_unref (ic); -+ if (success && !retrying && !g_seekable_tell (G_SEEKABLE (is->priv->get_message_stream))) { -+ /* Nothing had been read from the server. Maybe this connection -+ doesn't know about the message on the server side yet, thus -+ invoke NOOP and retry. */ -+ CamelIMAPXCommand *ic; - -- g_object_unref (mailbox); -+ retrying = TRUE; - -- return TRUE; --} -+ c (is->priv->tagprefix, "%s: Returned no message data, retrying after NOOP\n", G_STRFUNC); - --/* ********************************************************************** */ -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_NOOP, "NOOP"); - --static void --imapx_command_noop_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- GError *local_error = NULL; -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error performing NOOP"), cancellable, &local_error); - -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+ camel_imapx_command_unref (ic); - -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error performing NOOP")); -- camel_imapx_job_take_error (job, local_error); -+ if (success) -+ goto try_again; - } - -- imapx_unregister_job (is, job); --} -+ is->priv->get_message_stream = NULL; - --static gboolean --imapx_job_noop_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXCommand *ic; -- CamelIMAPXMailbox *mailbox; -+ if (success) { -+ if (local_error == NULL) { -+ g_io_stream_close (cache_stream, cancellable, &local_error); -+ g_prefix_error ( -+ &local_error, "%s: ", -+ _("Failed to close the tmp stream")); -+ } - -- /* This may be NULL. */ -- mailbox = camel_imapx_job_ref_mailbox (job); -+ if (local_error == NULL && -+ g_cancellable_set_error_if_cancelled (cancellable, &local_error)) { -+ g_prefix_error ( -+ &local_error, "%s: ", -+ _("Error fetching message")); -+ } - -- ic = camel_imapx_command_new ( -- is, "NOOP", mailbox, "NOOP"); -+ if (local_error == NULL) { -+ gchar *cur_filename; -+ gchar *tmp_filename; -+ gchar *dirname; - -- camel_imapx_command_set_job (ic, job); -- ic->complete = imapx_command_noop_done; -- if (mailbox != NULL) -- ic->pri = IMAPX_PRIORITY_REFRESH_INFO; -- else -- ic->pri = IMAPX_PRIORITY_NOOP; -+ cur_filename = camel_data_cache_get_filename (message_cache, "cur", message_uid); -+ tmp_filename = camel_data_cache_get_filename (message_cache, "tmp", message_uid); - -- imapx_command_queue (is, ic); -+ dirname = g_path_get_dirname (cur_filename); -+ g_mkdir_with_parents (dirname, 0700); -+ g_free (dirname); - -- camel_imapx_command_unref (ic); -+ if (g_rename (tmp_filename, cur_filename) == 0) { -+ /* Exchange the "tmp" stream for the "cur" stream. */ -+ g_clear_object (&cache_stream); -+ cache_stream = camel_data_cache_get (message_cache, "cur", message_uid, &local_error); -+ } else { -+ g_set_error ( -+ &local_error, G_FILE_ERROR, -+ g_file_error_from_errno (errno), -+ "%s: %s", -+ _("Failed to copy the tmp file"), -+ g_strerror (errno)); -+ } -+ -+ g_free (cur_filename); -+ g_free (tmp_filename); -+ } -+ -+ /* Delete the 'tmp' file only if the operation succeeded. It's because -+ cancelled operations end before they are properly finished (IMAP-protocol speaking), -+ thus if any other GET_MESSAGE operation was waiting for this job, then it -+ realized that the message was not downloaded and opened its own "tmp" file, but -+ of the same name, thus this remove would drop file which could be used -+ by a different GET_MESSAGE job. */ -+ if (!local_error && !g_cancellable_is_cancelled (cancellable)) -+ camel_data_cache_remove (message_cache, "tmp", message_uid, NULL); -+ } - -- g_clear_object (&mailbox); -+ if (!local_error) { -+ result_stream = camel_stream_new (cache_stream); -+ } else { -+ g_propagate_error (error, local_error); -+ } - -- return TRUE; -+ g_clear_object (&cache_stream); -+ -+ return result_stream; - } - --/* ********************************************************************** */ -+gboolean -+camel_imapx_server_sync_message_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ CamelFolderSummary *summary, -+ CamelDataCache *message_cache, -+ const gchar *message_uid, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ gchar *cache_file = NULL; -+ gboolean is_cached; -+ struct stat st; -+ gboolean success = TRUE; - --/* FIXME: this is basically a copy of the same in camel-imapx-utils.c */ --static struct { -- const gchar *name; -- guint32 flag; --} flags_table[] = { -- { "\\ANSWERED", CAMEL_MESSAGE_ANSWERED }, -- { "\\DELETED", CAMEL_MESSAGE_DELETED }, -- { "\\DRAFT", CAMEL_MESSAGE_DRAFT }, -- { "\\FLAGGED", CAMEL_MESSAGE_FLAGGED }, -- { "\\SEEN", CAMEL_MESSAGE_SEEN }, -- { "\\RECENT", CAMEL_IMAPX_MESSAGE_RECENT }, -- { "JUNK", CAMEL_MESSAGE_JUNK }, -- { "NOTJUNK", CAMEL_MESSAGE_NOTJUNK } --}; -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ g_return_val_if_fail (CAMEL_IS_FOLDER_SUMMARY (summary), FALSE); -+ g_return_val_if_fail (CAMEL_IS_DATA_CACHE (message_cache), FALSE); -+ g_return_val_if_fail (message_uid != NULL, FALSE); - --/* -- * flags 00101000 -- * sflags 01001000 -- * ^ 01100000 -- * ~flags 11010111 -- * & 01000000 -- * -- * &flags 00100000 -- */ -+ /* Check if the cache file already exists and is non-empty. */ -+ cache_file = camel_data_cache_get_filename (message_cache, "cur", message_uid); -+ is_cached = (g_stat (cache_file, &st) == 0 && st.st_size > 0); -+ g_free (cache_file); - --static void --imapx_command_sync_changes_done (CamelIMAPXServer *is, -- CamelIMAPXCommand *ic) --{ -- CamelIMAPXJob *job; -- CamelIMAPXMailbox *mailbox; -- CamelFolder *folder; -- CamelStore *parent_store; -- SyncChangesData *data; -- const gchar *full_name; -- GError *local_error = NULL; -+ if (!is_cached) { -+ CamelStream *stream; - -- job = camel_imapx_command_get_job (ic); -- g_return_if_fail (CAMEL_IS_IMAPX_JOB (job)); -+ stream = camel_imapx_server_get_message_sync ( -+ is, mailbox, summary, -+ message_cache, message_uid, -+ cancellable, error); - -- data = camel_imapx_job_get_data (job); -- g_return_if_fail (data != NULL); -+ success = (stream != NULL); - -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_if_fail (mailbox != NULL); -+ g_clear_object (&stream); -+ } - -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_if_fail (folder != NULL); -+ return success; -+} - -- g_atomic_int_add (&job->commands, -1); -+gboolean -+camel_imapx_server_copy_message_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ CamelIMAPXMailbox *destination, -+ GPtrArray *uids, -+ gboolean delete_originals, -+ gboolean remove_deleted_flags, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ GPtrArray *data_uids; -+ gint ii; -+ gboolean use_move_command = FALSE; -+ CamelIMAPXCommand *ic; -+ CamelFolder *folder; -+ GHashTable *source_infos; -+ gboolean remove_junk_flags; -+ gboolean success = TRUE; - -- full_name = camel_folder_get_full_name (folder); -- parent_store = camel_folder_get_parent_store (folder); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (destination), FALSE); -+ g_return_val_if_fail (uids != NULL, FALSE); - -- /* If this worked, we should really just update the changes that we -- * sucessfully stored, so we dont have to worry about sending them -- * again ... -- * But then we'd have to track which uid's we actually updated, so -- * its easier just to refresh all of the ones we got. -- * -- * Not that ... given all the asynchronicity going on, we're guaranteed -- * that what we just set is actually what is on the server now .. but -- * if it isn't, i guess we'll fix up next refresh */ -- -- if (camel_imapx_command_set_error_if_failed (ic, &local_error)) { -- g_prefix_error ( -- &local_error, "%s: ", -- _("Error syncing changes")); -- camel_imapx_job_take_error (job, local_error); -- imapx_unregister_job (is, job); -- goto exit; -+ /* To get permanent flags. That's okay if the "SELECT" fails here, as it can be -+ due to the folder being write-only; just ignore the error and continue. */ -+ camel_imapx_server_ensure_selected_sync (is, destination, cancellable, NULL); - -- /* lock cache ? */ -- } else { -- guint32 unseen, permanentflags; -- gint i; -+ if (g_cancellable_set_error_if_cancelled (cancellable, error)) -+ return FALSE; - -- permanentflags = camel_imapx_mailbox_get_permanentflags (mailbox); -+ if (!camel_imapx_server_ensure_selected_sync (is, mailbox, cancellable, error)) -+ return FALSE; - -- for (i = 0; i < data->changed_uids->len; i++) { -- CamelIMAPXMessageInfo *xinfo = (CamelIMAPXMessageInfo *) camel_folder_summary_get (folder->summary, -- data->changed_uids->pdata[i]); -+ folder = imapx_server_ref_folder (is, mailbox); -+ g_return_val_if_fail (folder != NULL, FALSE); - -- if (!xinfo) -- continue; -+ remove_deleted_flags = remove_deleted_flags || (folder->folder_flags & CAMEL_FOLDER_IS_TRASH) != 0; -+ remove_junk_flags = (folder->folder_flags & CAMEL_FOLDER_IS_JUNK) != 0; - -- xinfo->server_flags = xinfo->info.flags & CAMEL_IMAPX_SERVER_FLAGS; -- if (!data->remove_deleted_flags || -- !(xinfo->info.flags & CAMEL_MESSAGE_DELETED)) { -- xinfo->info.flags &= ~CAMEL_MESSAGE_FOLDER_FLAGGED; -- } else { -- /* to stare back the \Deleted flag */ -- xinfo->server_flags &= ~CAMEL_MESSAGE_DELETED; -- xinfo->info.flags |= CAMEL_MESSAGE_FOLDER_FLAGGED; -- } -- xinfo->info.dirty = TRUE; -- if ((permanentflags & CAMEL_MESSAGE_USER) != 0 || -- camel_flag_list_size (&xinfo->server_user_flags) == 0) -- camel_flag_list_copy (&xinfo->server_user_flags, &xinfo->info.user_flags); -+ /* If we're moving messages, prefer "UID MOVE" if supported. */ -+ if (delete_originals) { -+ g_mutex_lock (&is->priv->stream_lock); - -- camel_folder_summary_touch (folder->summary); -- camel_message_info_unref (xinfo); -+ if (CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, MOVE)) { -+ delete_originals = FALSE; -+ use_move_command = TRUE; - } - -- /* Apply the changes to server-side unread count; it won't tell -- * us of these changes, of course. */ -- unseen = camel_imapx_mailbox_get_unseen (mailbox); -- unseen += data->unread_change; -- camel_imapx_mailbox_set_unseen (mailbox, unseen); -+ g_mutex_unlock (&is->priv->stream_lock); - } - -- if (g_atomic_int_get (&job->commands) == 0) { -- if (folder->summary && (folder->summary->flags & CAMEL_FOLDER_SUMMARY_DIRTY) != 0) { -- CamelStoreInfo *si; -- -- /* ... and store's summary when folder's summary is dirty */ -- si = camel_store_summary_path (CAMEL_IMAPX_STORE (parent_store)->summary, full_name); -- if (si) { -- if (si->total != camel_folder_summary_get_saved_count (folder->summary) || -- si->unread != camel_folder_summary_get_unread_count (folder->summary)) { -- si->total = camel_folder_summary_get_saved_count (folder->summary); -- si->unread = camel_folder_summary_get_unread_count (folder->summary); -- camel_store_summary_touch (CAMEL_IMAPX_STORE (parent_store)->summary); -- } -- -- camel_store_summary_info_unref (CAMEL_IMAPX_STORE (parent_store)->summary, si); -- } -- } -+ source_infos = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, camel_message_info_unref); -+ data_uids = g_ptr_array_new (); - -- camel_folder_summary_save_to_db (folder->summary, NULL); -- camel_store_summary_save (CAMEL_IMAPX_STORE (parent_store)->summary); -+ for (ii = 0; ii < uids->len; ii++) { -+ gchar *uid = (gchar *) camel_pstring_strdup (uids->pdata[ii]); - -- imapx_unregister_job (is, job); -- } else { -- /* Make sure no command will starve in a queue */ -- QUEUE_LOCK (is); -- imapx_command_start_next (is); -- QUEUE_UNLOCK (is); -+ g_ptr_array_add (data_uids, uid); -+ g_hash_table_insert (source_infos, uid, camel_folder_summary_get (folder->summary, uid)); - } - --exit: -- g_object_unref (folder); -- g_object_unref (mailbox); --} -+ g_ptr_array_sort (data_uids, (GCompareFunc) imapx_uids_array_cmp); - --static gboolean --imapx_job_sync_changes_start (CamelIMAPXJob *job, -- CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) --{ -- SyncChangesData *data; -- CamelFolder *folder; -- CamelIMAPXMailbox *mailbox; -- guint32 i, j, permanentflags; -- struct _uidset_state ss; -- GPtrArray *uids; -- gint on; -+ ii = 0; -+ while (ii < data_uids->len && success) { -+ struct _uidset_state uidset; -+ gint last_index = ii; - -- data = camel_imapx_job_get_data (job); -- g_return_val_if_fail (data != NULL, FALSE); -+ imapx_uidset_init (&uidset, 0, MAX_COMMAND_LEN); - -- mailbox = camel_imapx_job_ref_mailbox (job); -- g_return_val_if_fail (mailbox != NULL, FALSE); -+ if (use_move_command) -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_MOVE_MESSAGE, "UID MOVE "); -+ else -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_COPY_MESSAGE, "UID COPY "); - -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_val_if_fail (folder != NULL, FALSE); -+ while (ii < data_uids->len) { -+ const gchar *uid = (gchar *) g_ptr_array_index (data_uids, ii); - -- permanentflags = camel_imapx_mailbox_get_permanentflags (mailbox); -- uids = data->changed_uids; -+ ii++; - -- for (on = 0; on < 2; on++) { -- guint32 orset = on ? data->on_set : data->off_set; -- GArray *user_set = on ? data->on_user : data->off_user; -+ if (imapx_uidset_add (&uidset, ic, uid) == 1) -+ break; -+ } - -- for (j = 0; j < G_N_ELEMENTS (flags_table); j++) { -- guint32 flag = flags_table[j].flag; -- CamelIMAPXCommand *ic = NULL; -+ imapx_uidset_done (&uidset, ic); - -- if ((orset & flag) == 0) -- continue; -+ camel_imapx_command_add (ic, " %M", destination); - -- c (is->tagprefix, "checking/storing %s flags '%s'\n", on?"on":"off", flags_table[j].name); -- imapx_uidset_init (&ss, 0, 100); -- for (i = 0; i < uids->len; i++) { -- CamelIMAPXMessageInfo *info; -- gboolean remove_deleted_flag; -- guint32 flags; -- guint32 sflags; -- gint send; -+ imapx_free_status (is->priv->copyuid_status); -+ is->priv->copyuid_status = NULL; - -- info = (CamelIMAPXMessageInfo *) -- camel_folder_summary_get ( -- folder->summary, -- uids->pdata[i]); -+ success = camel_imapx_server_process_command_sync (is, ic, -+ use_move_command ? _("Error moving messages") : _("Error copying messages"), -+ cancellable, error); - -- if (info == NULL) -- continue; -+ if (success) { -+ struct _status_info *copyuid_status = is->priv->copyuid_status; - -- flags = (info->info.flags & CAMEL_IMAPX_SERVER_FLAGS) & permanentflags; -- sflags = (info->server_flags & CAMEL_IMAPX_SERVER_FLAGS) & permanentflags; -- send = 0; -+ if (ic->status && ic->status->condition == IMAPX_COPYUID) -+ copyuid_status = ic->status; - -- remove_deleted_flag = -- data->remove_deleted_flags && -- (flags & CAMEL_MESSAGE_DELETED); -+ if (copyuid_status && copyuid_status->u.copyuid.uids && -+ copyuid_status->u.copyuid.copied_uids && -+ copyuid_status->u.copyuid.uids->len == copyuid_status->u.copyuid.copied_uids->len) { -+ CamelFolder *destination_folder; -+ -+ destination_folder = imapx_server_ref_folder (is, destination); -+ if (destination_folder) { -+ CamelMessageInfo *source_info, *destination_info; -+ CamelFolderChangeInfo *changes; -+ gint ii; -+ -+ changes = camel_folder_change_info_new (); -+ -+ for (ii = 0; ii < copyuid_status->u.copyuid.uids->len; ii++) { -+ gchar *uid; -+ gboolean is_new = FALSE; -+ -+ uid = g_strdup_printf ("%d", g_array_index (copyuid_status->u.copyuid.uids, guint32, ii)); -+ source_info = g_hash_table_lookup (source_infos, uid); -+ g_free (uid); -+ -+ if (!source_info) -+ continue; -+ -+ uid = g_strdup_printf ("%d", g_array_index (copyuid_status->u.copyuid.copied_uids, guint32, ii)); -+ destination_info = camel_folder_summary_get (folder->summary, uid); -+ -+ if (!destination_info) { -+ is_new = TRUE; -+ destination_info = camel_message_info_clone (source_info); -+ destination_info->summary = destination_folder->summary; -+ camel_pstring_free (destination_info->uid); -+ destination_info->uid = camel_pstring_strdup (uid); -+ } -+ -+ g_free (uid); -+ -+ imapx_set_message_info_flags_for_new_message ( -+ destination_info, -+ ((CamelMessageInfoBase *) source_info)->flags, -+ ((CamelMessageInfoBase *) source_info)->user_flags, -+ TRUE, -+ ((CamelMessageInfoBase *) source_info)->user_tags, -+ camel_imapx_mailbox_get_permanentflags (destination)); -+ if (remove_deleted_flags) -+ camel_message_info_set_flags (destination_info, CAMEL_MESSAGE_DELETED, 0); -+ if (remove_junk_flags) -+ camel_message_info_set_flags (destination_info, CAMEL_MESSAGE_JUNK, 0); -+ if (is_new) -+ camel_folder_summary_add (destination_folder->summary, destination_info); -+ camel_folder_change_info_add_uid (changes, destination_info->uid); - -- if (remove_deleted_flag) { -- /* Remove the DELETED flag so the -- * message appears normally in the -- * real Trash folder when copied. */ -- flags &= ~CAMEL_MESSAGE_DELETED; -- } -+ if (!is_new) -+ camel_message_info_unref (destination_info); -+ } - -- if ( (on && (((flags ^ sflags) & flags) & flag)) -- || (!on && (((flags ^ sflags) & ~flags) & flag))) { -- if (ic == NULL) { -- ic = camel_imapx_command_new ( -- is, "STORE", mailbox, -- "UID STORE "); -- ic->complete = imapx_command_sync_changes_done; -- camel_imapx_command_set_job (ic, job); -- ic->pri = job->pri; -+ if (camel_folder_change_info_changed (changes)) { -+ camel_folder_summary_touch (destination_folder->summary); -+ camel_folder_summary_save_to_db (destination_folder->summary, NULL); -+ camel_folder_changed (destination_folder, changes); - } -- send = imapx_uidset_add (&ss, ic, camel_message_info_uid (info)); -- } -- if (send == 1 || (i == uids->len - 1 && ic && imapx_uidset_done (&ss, ic))) { -- g_atomic_int_add (&job->commands, 1); -- camel_imapx_command_add (ic, " %tFLAGS.SILENT (%t)", on?"+":"-", flags_table[j].name); -- imapx_command_queue (is, ic); -- camel_imapx_command_unref (ic); -- ic = NULL; -- } -- if (flag == CAMEL_MESSAGE_SEEN) { -- /* Remember how the server's unread count will change if this -- * command succeeds */ -- if (on) -- data->unread_change--; -- else -- data->unread_change++; -- } - -- /* The second round and the server doesn't support saving user flags, -- thus store them at least locally */ -- if (on && (permanentflags & CAMEL_MESSAGE_USER) == 0) { -- camel_flag_list_copy (&info->server_user_flags, &info->info.user_flags); -+ camel_folder_change_info_free (changes); -+ g_object_unref (destination_folder); - } -- -- camel_message_info_unref (info); - } - -- g_warn_if_fail (ic == NULL); -- } -+ if (delete_originals || use_move_command) { -+ CamelFolderChangeInfo *changes = NULL; -+ gint jj; - -- if (user_set && (permanentflags & CAMEL_MESSAGE_USER) != 0) { -- CamelIMAPXCommand *ic = NULL; -+ camel_folder_freeze (folder); - -- for (j = 0; j < user_set->len; j++) { -- struct _imapx_flag_change *c = &g_array_index (user_set, struct _imapx_flag_change, j); -+ for (jj = last_index; jj < ii; jj++) { -+ const gchar *uid = uids->pdata[jj]; - -- imapx_uidset_init (&ss, 0, 100); -- for (i = 0; i < c->infos->len; i++) { -- CamelIMAPXMessageInfo *info = c->infos->pdata[i]; -+ if (delete_originals) { -+ camel_folder_delete_message (folder, uid); -+ } else { -+ if (camel_folder_summary_remove_uid (folder->summary, uid)) { -+ if (!changes) -+ changes = camel_folder_change_info_new (); - -- if (ic == NULL) { -- ic = camel_imapx_command_new ( -- is, "STORE", mailbox, -- "UID STORE "); -- ic->complete = imapx_command_sync_changes_done; -- camel_imapx_command_set_job (ic, job); -- ic->pri = job->pri; -+ camel_folder_change_info_remove_uid (changes, uid); -+ } - } -+ } - -- if (imapx_uidset_add (&ss, ic, camel_message_info_uid (info)) == 1 -- || (i == c->infos->len - 1 && imapx_uidset_done (&ss, ic))) { -- g_atomic_int_add (&job->commands, 1); -- camel_imapx_command_add (ic, " %tFLAGS.SILENT (%t)", on?"+":"-", c->name); -- imapx_command_queue (is, ic); -- camel_imapx_command_unref (ic); -- ic = NULL; -- } -+ if (changes && camel_folder_change_info_changed (changes)) { -+ camel_folder_summary_touch (folder->summary); -+ camel_folder_summary_save_to_db (folder->summary, NULL); -+ camel_folder_changed (folder, changes); - } -+ -+ camel_folder_thaw (folder); -+ -+ if (changes) -+ camel_folder_change_info_free (changes); - } - } -- } - -- g_object_unref (folder); -- g_object_unref (mailbox); -+ imapx_free_status (is->priv->copyuid_status); -+ is->priv->copyuid_status = NULL; - -- if (g_atomic_int_get (&job->commands) == 0) { -- imapx_unregister_job (is, job); -- } else { -- /* Make sure no command will starve in a queue */ -- QUEUE_LOCK (is); -- imapx_command_start_next (is); -- QUEUE_UNLOCK (is); -+ camel_imapx_command_unref (ic); - } - -- return TRUE; -+ g_hash_table_destroy (source_infos); -+ g_ptr_array_foreach (data_uids, (GFunc) camel_pstring_free, NULL); -+ g_ptr_array_free (data_uids, TRUE); -+ g_object_unref (folder); -+ -+ return success; - } - --static gboolean --imapx_job_sync_changes_matches (CamelIMAPXJob *job, -- CamelIMAPXMailbox *mailbox, -- const gchar *uid) -+static const gchar * -+get_month_str (gint month) - { -- return camel_imapx_job_has_mailbox (job, mailbox); -+ static const gchar tm_months[][4] = { -+ "Jan", "Feb", "Mar", "Apr", "May", "Jun", -+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -+ }; -+ -+ if (month < 1 || month > 12) -+ return NULL; -+ -+ return tm_months[month - 1]; - } - --static void --imapx_abort_all_commands (CamelIMAPXServer *is, -- const GError *error) -+gboolean -+camel_imapx_server_append_message_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ CamelFolderSummary *summary, -+ CamelDataCache *message_cache, -+ CamelMimeMessage *message, -+ const CamelMessageInfo *mi, -+ gchar **appended_uid, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelIMAPXCommandQueue *queue; -- GList *head, *link; -+ gchar *uid = NULL, *path = NULL; -+ CamelMimeFilter *filter; -+ CamelIMAPXCommand *ic; -+ CamelMessageInfo *info; -+ GIOStream *base_stream; -+ GOutputStream *output_stream; -+ GOutputStream *filter_stream; -+ gint res; -+ time_t date_time; -+ gboolean success; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ g_return_val_if_fail (CAMEL_IS_FOLDER_SUMMARY (summary), FALSE); -+ g_return_val_if_fail (CAMEL_IS_DATA_CACHE (message_cache), FALSE); -+ g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), FALSE); -+ /* CamelMessageInfo can be NULL. */ -+ -+ /* That's okay if the "SELECT" fails here, as it can be due to -+ the folder being write-only; just ignore the error and continue. */ -+ camel_imapx_server_ensure_selected_sync (is, mailbox, cancellable, NULL); - -- /* Transfer all pending and active commands to a separate -- * command queue to complete them without holding QUEUE_LOCK. */ -+ if (g_cancellable_set_error_if_cancelled (cancellable, error)) -+ return FALSE; -+ -+ /* Append just assumes we have no/a dodgy connection. We dump -+ * stuff into the 'new' directory, and let the summary know it's -+ * there. Then we fire off a no-reply job which will asynchronously -+ * upload the message at some point in the future, and fix up the -+ * summary to match */ - -- queue = camel_imapx_command_queue_new (); -+ /* chen cleanup this later */ -+ uid = imapx_get_temp_uid (); -+ base_stream = camel_data_cache_add (message_cache, "new", uid, error); -+ if (base_stream == NULL) { -+ g_prefix_error (error, _("Cannot create spool file: ")); -+ g_free (uid); -+ return FALSE; -+ } - -- imapx_server_set_shutdown_error (is, error); -+ output_stream = g_io_stream_get_output_stream (base_stream); -+ filter = camel_mime_filter_canon_new (CAMEL_MIME_FILTER_CANON_CRLF); -+ filter_stream = camel_filter_output_stream_new (output_stream, filter); - -- QUEUE_LOCK (is); -+ g_filter_output_stream_set_close_base_stream ( -+ G_FILTER_OUTPUT_STREAM (filter_stream), FALSE); - -- camel_imapx_command_queue_transfer (is->queue, queue); -- camel_imapx_command_queue_transfer (is->active, queue); -+ res = camel_data_wrapper_write_to_output_stream_sync ( -+ CAMEL_DATA_WRAPPER (message), -+ filter_stream, cancellable, error); - -- head = camel_imapx_command_queue_peek_head_link (queue); -- for (link = head; link != NULL; link = g_list_next (link)) { -- CamelIMAPXCommand *ic = link->data; -+ g_object_unref (base_stream); -+ g_object_unref (filter_stream); -+ g_object_unref (filter); - -- if (ic) -- imapx_server_command_removed (is, ic); -+ if (res == -1) { -+ g_prefix_error (error, _("Cannot create spool file: ")); -+ camel_data_cache_remove (message_cache, "new", uid, NULL); -+ g_free (uid); -+ return FALSE; - } - -- QUEUE_UNLOCK (is); -+ date_time = camel_mime_message_get_date (message, NULL); -+ path = camel_data_cache_get_filename (message_cache, "new", uid); -+ info = camel_folder_summary_info_new_from_message (summary, message, NULL); -+ info->uid = camel_pstring_strdup (uid); - -- head = camel_imapx_command_queue_peek_head_link (queue); -+ if (mi != NULL) { -+ struct icaltimetype icaltime; -+ CamelMessageInfoBase *base_info = (CamelMessageInfoBase *) info; -+ const CamelFlag *flag; -+ const CamelTag *tag; - -- for (link = head; link != NULL; link = g_list_next (link)) { -- CamelIMAPXCommand *ic = link->data; -+ base_info->flags = camel_message_info_flags (mi); -+ base_info->size = camel_message_info_size (mi); - -- /* Sanity check the CamelIMAPXCommand before proceeding. -- * XXX We are actually getting reports of crashes here... -- * not sure how this is happening but it's happening. */ -- if (ic == NULL) -- continue; -+ flag = camel_message_info_user_flags (mi); -+ while (flag != NULL) { -+ if (*flag->name != '\0') -+ camel_flag_set ( -+ &base_info->user_flags, -+ flag->name, TRUE); -+ flag = flag->next; -+ } -+ -+ tag = camel_message_info_user_tags (mi); -+ while (tag != NULL) { -+ if (*tag->name != '\0') -+ camel_tag_set ( -+ &base_info->user_tags, -+ tag->name, tag->value); -+ tag = tag->next; -+ } -+ -+ if (date_time > 0) { -+ icaltime = icaltime_from_timet (date_time, FALSE); -+ if (!icaltime_is_valid_time (icaltime)) -+ date_time = -1; -+ } -+ -+ if (date_time <= 0) -+ date_time = camel_message_info_date_received (mi); - -- /* Insert an error into the CamelIMAPXCommand to be -- * propagated when the completion callback function -- * calls camel_imapx_command_set_error_if_failed(). */ -- camel_imapx_command_failed (ic, error); -+ if (date_time > 0) { -+ icaltime = icaltime_from_timet (date_time, FALSE); -+ if (!icaltime_is_valid_time (icaltime)) -+ date_time = -1; -+ } -+ } - -- /* Invoke the completion callback function so it can -- * perform any cleanup processing and unregister its -- * CamelIMAPXJob. */ -- ic->complete (is, ic); -+ if (!camel_message_info_size (info)) { -+ CamelStreamNull *sn = (CamelStreamNull *) camel_stream_null_new (); -+ -+ camel_data_wrapper_write_to_stream_sync ( -+ CAMEL_DATA_WRAPPER (message), -+ CAMEL_STREAM (sn), NULL, NULL); -+ ((CamelMessageInfoBase *) info)->size = sn->written; -+ g_object_unref (sn); - } - -- camel_imapx_command_queue_free (queue); -+ g_free (uid); - -- QUEUE_LOCK (is); -+ if (camel_mime_message_has_attachment (message)) -+ ((CamelMessageInfoBase *) info)->flags |= CAMEL_MESSAGE_ATTACHMENTS; - -- /* Abort also any pending jobs which are not in the command queues yet */ -- if (!g_queue_is_empty (&is->jobs)) { -- GList *jobs, *iter; -+ if (date_time > 0) { -+ gchar *date_time_str; -+ struct tm stm; - -- jobs = g_list_copy (g_queue_peek_head_link (&is->jobs)); -- g_list_foreach (jobs, (GFunc) camel_imapx_job_ref, NULL); -+ gmtime_r (&date_time, &stm); - -- for (iter = jobs; iter != NULL; iter = g_list_next (iter)) { -- CamelIMAPXJob *job = iter->data; -+ /* Store always in UTC */ -+ date_time_str = g_strdup_printf ( -+ "\"%02d-%s-%04d %02d:%02d:%02d +0000\"", -+ stm.tm_mday, -+ get_month_str (stm.tm_mon + 1), -+ stm.tm_year + 1900, -+ stm.tm_hour, -+ stm.tm_min, -+ stm.tm_sec); - -- camel_imapx_job_take_error (job, g_error_copy (error)); -- camel_imapx_job_done (job); -- } -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_APPEND_MESSAGE, "APPEND %M %F %t %P", -+ mailbox, -+ ((CamelMessageInfoBase *) info)->flags, -+ ((CamelMessageInfoBase *) info)->user_flags, -+ date_time_str, -+ path); - -- g_list_free_full (jobs, (GDestroyNotify) camel_imapx_job_unref); -+ g_free (date_time_str); -+ } else { -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_APPEND_MESSAGE, "APPEND %M %F %P", -+ mailbox, -+ ((CamelMessageInfoBase *) info)->flags, -+ ((CamelMessageInfoBase *) info)->user_flags, -+ path); - } - -- QUEUE_UNLOCK (is); --} -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error appending message"), cancellable, error); - --/* ********************************************************************** */ -+ if (success) { -+ CamelIMAPXFolder *imapx_folder; -+ CamelFolder *folder; -+ CamelMessageInfo *mi; -+ gchar *cur, *old_uid; -+ guint32 uidvalidity; - --static gboolean --imapx_ready_to_read (GInputStream *input_stream, -- CamelIMAPXServer *is) --{ -- GOutputStream *output_stream; -- GCancellable *cancellable; -- GError *local_error = NULL; -+ folder = imapx_server_ref_folder (is, mailbox); -+ g_return_val_if_fail (folder != NULL, FALSE); - -- /* XXX Don't use the passed in GInputStream because that's -- * the CamelIMAPXInputStream base stream. We need the -- * CamelIMAPXInputStream itself. */ -+ uidvalidity = camel_imapx_mailbox_get_uidvalidity (mailbox); - -- input_stream = camel_imapx_server_ref_input_stream (is); -- output_stream = camel_imapx_server_ref_output_stream (is); -+ imapx_folder = CAMEL_IMAPX_FOLDER (folder); - -- cancellable = g_weak_ref_get (&is->priv->parser_cancellable); -+ /* Append done. If we the server supports UIDPLUS we will get -+ * an APPENDUID response with the new uid. This lets us move the -+ * message we have directly to the cache and also create a correctly -+ * numbered MessageInfo, without losing any information. Otherwise -+ * we have to wait for the server to let us know it was appended. */ -+ -+ mi = camel_message_info_clone (info); -+ old_uid = g_strdup (info->uid); -+ -+ if (ic->status && ic->status->condition == IMAPX_APPENDUID) { -+ c (is->priv->tagprefix, "Got appenduid %d %d\n", (gint) ic->status->u.appenduid.uidvalidity, (gint) ic->status->u.appenduid.uid); -+ if (ic->status->u.appenduid.uidvalidity == uidvalidity) { -+ if (appended_uid) -+ *appended_uid = g_strdup_printf ("%u", (guint) ic->status->u.appenduid.uid); -+ mi->uid = camel_pstring_add (g_strdup_printf ("%u", (guint) ic->status->u.appenduid.uid), TRUE); -+ -+ cur = camel_data_cache_get_filename (imapx_folder->cache, "cur", mi->uid); -+ if (g_rename (path, cur) == -1 && errno != ENOENT) { -+ g_warning ("%s: Failed to rename '%s' to '%s': %s", G_STRFUNC, path, cur, g_strerror (errno)); -+ } - -- while (imapx_step (is, input_stream, cancellable, &local_error)) { -- gint bytes_buffered; -+ imapx_set_message_info_flags_for_new_message ( -+ mi, -+ ((CamelMessageInfoBase *) info)->flags, -+ ((CamelMessageInfoBase *) info)->user_flags, -+ TRUE, -+ ((CamelMessageInfoBase *) info)->user_tags, -+ camel_imapx_mailbox_get_permanentflags (mailbox)); - -- bytes_buffered = camel_imapx_input_stream_buffered ( -- CAMEL_IMAPX_INPUT_STREAM (input_stream)); -- if (bytes_buffered == 0) -- break; -- } -+ camel_folder_summary_add (folder->summary, mi); - -- if (g_cancellable_is_cancelled (cancellable)) { -- gboolean active_queue_is_empty, is_shutdown_request; -+ g_mutex_lock (&is->priv->changes_lock); -+ camel_folder_change_info_add_uid (is->priv->changes, mi->uid); -+ g_mutex_unlock (&is->priv->changes_lock); - -- QUEUE_LOCK (is); -- active_queue_is_empty = -- camel_imapx_command_queue_is_empty (is->active); -- is_shutdown_request = is->state == IMAPX_SHUTDOWN; -- QUEUE_UNLOCK (is); -+ mi = NULL; - -- if (!is_shutdown_request && (active_queue_is_empty || imapx_in_idle (is))) { -- g_cancellable_reset (cancellable); -- g_clear_error (&local_error); -- } else { -- /* Cancelled error should be set. */ -- g_warn_if_fail (local_error != NULL); -+ g_free (cur); -+ } else { -+ c (is->priv->tagprefix, "but uidvalidity changed \n"); -+ } - } -- } - -- g_clear_object (&input_stream); -- g_clear_object (&output_stream); -- g_clear_object (&cancellable); -+ camel_data_cache_remove (imapx_folder->cache, "new", old_uid, NULL); -+ g_free (old_uid); - -- if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT)) { -- QUEUE_LOCK (is); -- if (camel_imapx_command_queue_is_empty (is->active) && is->state != IMAPX_SHUTDOWN) { -- camel_imapx_debug (io, is->tagprefix, "Ignoring timeout error, nothing was waiting (original error: %s)\n", local_error->message); -- g_clear_error (&local_error); -- } -- QUEUE_UNLOCK (is); -+ camel_imapx_command_unref (ic); -+ if (mi) -+ camel_message_info_unref (mi); -+ g_object_unref (folder); - } - -- if (local_error != NULL) { -- camel_imapx_debug (io, is->tagprefix, "Data read failed with error '%s'\n", local_error->message); -- -- /* Sadly, G_IO_ERROR_FAILED is also used for 'Connection reset by peer' error */ -- if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_FAILED) || -- g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT)) { -- local_error->domain = CAMEL_IMAPX_SERVER_ERROR; -- local_error->code = CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT; -- } -- -- imapx_server_set_shutdown_error (is, local_error); -- -- /* Call the signal early, certain thread interleaving can cause the closed connection -- being reused on the following reconnect attempt. There is also re-setting -- the shutdown_error above, because the signal handler in connection manager -- also calls camel_imapx_server_shutdown(), but without the error, while we want -- to have there propagated the "try reconnect" error instead. As there is no -- guarantee that it'll be called, then we also quit the parser's mainloop and -- call the imapx_abort_all_commands() below - just in case. */ -- g_signal_emit (is, signals[SHUTDOWN], 0, local_error); -- -- g_main_loop_quit (is->priv->parser_main_loop); -- imapx_abort_all_commands (is, local_error); -- g_clear_error (&local_error); -- return G_SOURCE_REMOVE; -- } -+ g_free (path); - -- return G_SOURCE_CONTINUE; -+ return success; - } - --/* -- * The main processing (reading) loop. -- * -- * Main area of locking required is command_queue -- * and command_start_next, the 'literal' command, -- * the jobs queue, the active queue, the queue -- * queue. */ --static gpointer --imapx_parser_thread (gpointer user_data) -+gboolean -+camel_imapx_server_noop_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelIMAPXServer *is; -- GInputStream *input_stream; -- GCancellable *cancellable; -- GSource *pollable_source; -- GError *shutdown_error; -- -- is = CAMEL_IMAPX_SERVER (user_data); -- -- /* Do not use CamelOperation here, because it can be cancelled at -- * an application end with camel_operation_cancel_all() call, which -- * is done too early, before any pending jobs are properly finished -- * (it can be IDLE job, or save of folder changes back to the server). -- */ -- cancellable = g_cancellable_new (); -- g_weak_ref_set (&is->priv->parser_cancellable, cancellable); -- -- input_stream = camel_imapx_server_ref_input_stream (is); -- g_return_val_if_fail (input_stream != NULL, NULL); -+ gboolean success = TRUE; - -- g_main_context_push_thread_default (is->priv->parser_main_context); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ /* Mailbox may be NULL. */ - -- pollable_source = g_pollable_input_stream_create_source ( -- G_POLLABLE_INPUT_STREAM (input_stream), cancellable); -- g_source_set_callback ( -- pollable_source, -- (GSourceFunc) imapx_ready_to_read, -- g_object_ref (is), -- (GDestroyNotify) g_object_unref); -- g_source_attach ( -- pollable_source, -- is->priv->parser_main_context); -- g_source_unref (pollable_source); -+ if (mailbox) -+ success = camel_imapx_server_ensure_selected_sync (is, mailbox, cancellable, error); - -- g_clear_object (&cancellable); -- g_clear_object (&input_stream); -+ if (success) { -+ CamelIMAPXCommand *ic; - -- g_main_loop_run (is->priv->parser_main_loop); -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_NOOP, "NOOP"); - -- QUEUE_LOCK (is); -- is->state = IMAPX_SHUTDOWN; -- QUEUE_UNLOCK (is); -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error performing NOOP"), cancellable, error); - -- g_main_context_pop_thread_default (is->priv->parser_main_context); -+ camel_imapx_command_unref (ic); -+ } - -- shutdown_error = imapx_server_dup_shutdown_error (is); -+ return success; -+} - -- g_signal_emit (is, signals[SHUTDOWN], 0, shutdown_error); -+/* ********************************************************************** */ - -- g_clear_error (&shutdown_error); -+static gint -+imapx_refresh_info_uid_cmp (gconstpointer ap, -+ gconstpointer bp, -+ gboolean ascending) -+{ -+ guint av, bv; - -- g_object_unref (is); -+ av = g_ascii_strtoull ((const gchar *) ap, NULL, 10); -+ bv = g_ascii_strtoull ((const gchar *) bp, NULL, 10); - -- return NULL; -+ if (av < bv) -+ return ascending ? -1 : 1; -+ else if (av > bv) -+ return ascending ? 1 : -1; -+ else -+ return 0; - } - --static void --imapx_server_set_store (CamelIMAPXServer *server, -- CamelIMAPXStore *store) -+static gint -+imapx_uids_array_cmp (gconstpointer ap, -+ gconstpointer bp) - { -- g_return_if_fail (CAMEL_IS_IMAPX_STORE (store)); -+ const gchar **a = (const gchar **) ap; -+ const gchar **b = (const gchar **) bp; - -- g_weak_ref_set (&server->priv->store, store); -+ return imapx_refresh_info_uid_cmp (*a, *b, TRUE); - } - --static void --imapx_server_set_property (GObject *object, -- guint property_id, -- const GValue *value, -- GParamSpec *pspec) -+static gint -+imapx_uids_desc_cmp (gconstpointer ap, -+ gconstpointer bp) - { -- switch (property_id) { -- case PROP_STORE: -- imapx_server_set_store ( -- CAMEL_IMAPX_SERVER (object), -- g_value_get_object (value)); -- return; -- } -+ const gchar *a = (const gchar *) ap; -+ const gchar *b = (const gchar *) bp; - -- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -+ return imapx_refresh_info_uid_cmp (a, b, FALSE); - } - - static void --imapx_server_get_property (GObject *object, -- guint property_id, -- GValue *value, -- GParamSpec *pspec) -+imapx_server_process_fetch_changes_infos (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ CamelFolder *folder, -+ GHashTable *infos, -+ GHashTable *known_uids, -+ GSList **out_fetch_summary_uids, -+ guint64 from_uidl, -+ guint64 to_uidl) - { -- switch (property_id) { -- case PROP_STORE: -- g_value_take_object ( -- value, -- camel_imapx_server_ref_store ( -- CAMEL_IMAPX_SERVER (object))); -- return; -- } -+ GHashTableIter iter; -+ gpointer key, value; -+ CamelFolderSummary *summary; - -- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -+ g_return_if_fail (CAMEL_IS_IMAPX_SERVER (is)); -+ g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox)); -+ g_return_if_fail (CAMEL_IS_FOLDER (folder)); -+ g_return_if_fail (infos != NULL); -+ -+ if (out_fetch_summary_uids) -+ g_return_if_fail (*out_fetch_summary_uids == NULL); -+ -+ summary = folder->summary; -+ -+ g_hash_table_iter_init (&iter, infos); -+ while (g_hash_table_iter_next (&iter, &key, &value)) { -+ const gchar *uid = key; -+ FetchChangesInfo *nfo = value; -+ CamelMessageInfo *minfo; -+ -+ if (!uid || !nfo) -+ continue; -+ -+ if (known_uids) -+ g_hash_table_insert (known_uids, (gpointer) camel_pstring_strdup (uid), GINT_TO_POINTER (1)); -+ -+ if (!camel_folder_summary_check_uid (summary, uid) || -+ !(minfo = camel_folder_summary_get (summary, uid))) { -+ if (out_fetch_summary_uids) { -+ *out_fetch_summary_uids = g_slist_prepend (*out_fetch_summary_uids, -+ (gpointer) camel_pstring_strdup (uid)); -+ } -+ -+ continue; -+ } -+ -+ if (imapx_update_message_info_flags ( -+ minfo, -+ nfo->server_flags, -+ nfo->server_user_flags, -+ camel_imapx_mailbox_get_permanentflags (mailbox), -+ folder, FALSE)) { -+ g_mutex_lock (&is->priv->changes_lock); -+ camel_folder_change_info_change_uid (is->priv->changes, camel_message_info_uid (minfo)); -+ g_mutex_unlock (&is->priv->changes_lock); -+ } -+ -+ camel_message_info_unref (minfo); -+ } - } - --static void --imapx_server_dispose (GObject *object) -+static gboolean -+imapx_server_fetch_changes (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ CamelFolder *folder, -+ GHashTable *known_uids, -+ guint64 from_uidl, -+ guint64 to_uidl, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelIMAPXServer *server = CAMEL_IMAPX_SERVER (object); -- gboolean idle_main_loop_is_running; -- gboolean parser_main_loop_is_running; -+ GSList *fetch_summary_uids = NULL; -+ GHashTable *infos; /* uid ~> FetchChangesInfo */ -+ CamelIMAPXCommand *ic; -+ gboolean success; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ -+ if (g_cancellable_set_error_if_cancelled (cancellable, error)) -+ return FALSE; -+ -+ if (!from_uidl) -+ from_uidl = 1; - -- /* Server should be shut down already. Warn if -- * the idle or parser threads are still running. */ -- idle_main_loop_is_running = -- g_main_loop_is_running (server->priv->idle_main_loop); -- parser_main_loop_is_running = -- g_main_loop_is_running (server->priv->parser_main_loop); -- g_warn_if_fail (!idle_main_loop_is_running); -- g_warn_if_fail (!parser_main_loop_is_running); -- -- if (server->priv->parser_thread != NULL) { -- g_thread_unref (server->priv->parser_thread); -- server->priv->parser_thread = NULL; -- } -- -- if (server->priv->idle_thread != NULL) { -- g_thread_unref (server->priv->idle_thread); -- server->priv->idle_thread = NULL; -+ if (to_uidl > 0) { -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_REFRESH_INFO, "UID FETCH %lld:%lld (UID FLAGS)", from_uidl, to_uidl); -+ } else { -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_REFRESH_INFO, "UID FETCH %lld:* (UID FLAGS)", from_uidl); - } - -- imapx_disconnect (server); -+ g_return_val_if_fail (is->priv->fetch_changes_mailbox == NULL, FALSE); -+ g_return_val_if_fail (is->priv->fetch_changes_folder == NULL, FALSE); -+ g_return_val_if_fail (is->priv->fetch_changes_infos == NULL, FALSE); - -- g_weak_ref_set (&server->priv->store, NULL); -+ infos = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) camel_pstring_free, fetch_changes_info_free); - --#if GLIB_CHECK_VERSION(2,39,0) -- g_clear_object (&server->priv->subprocess); --#endif -+ is->priv->fetch_changes_mailbox = mailbox; -+ is->priv->fetch_changes_folder = folder; -+ is->priv->fetch_changes_infos = infos; -+ is->priv->fetch_changes_last_progress = 0; - -- /* Chain up to parent's dispose() method. */ -- G_OBJECT_CLASS (camel_imapx_server_parent_class)->dispose (object); --} -+ camel_operation_push_message (cancellable, -+ _("Scanning for changed messages in '%s'"), -+ camel_folder_get_display_name (folder)); - --static void --imapx_server_finalize (GObject *object) --{ -- CamelIMAPXServer *is = CAMEL_IMAPX_SERVER (object); -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error scanning changes"), cancellable, error); - -- g_mutex_clear (&is->priv->stream_lock); -+ camel_operation_pop_message (cancellable); -+ camel_imapx_command_unref (ic); - -- camel_imapx_command_queue_free (is->queue); -- camel_imapx_command_queue_free (is->active); -- camel_imapx_command_queue_free (is->done); -- -- is->queue = NULL; -- is->active = NULL; -- is->done = NULL; -+ /* It can partly succeed. */ -+ imapx_server_process_fetch_changes_infos (is, mailbox, folder, infos, known_uids, &fetch_summary_uids, from_uidl, to_uidl); - -- g_rec_mutex_clear (&is->queue_lock); -- g_mutex_clear (&is->priv->select_lock); -+ g_hash_table_remove_all (infos); - -- g_main_loop_unref (is->priv->parser_main_loop); -- g_main_context_unref (is->priv->parser_main_context); -+ if (success && fetch_summary_uids) { -+ struct _uidset_state uidset; -+ GSList *link; - -- camel_folder_change_info_free (is->priv->changes); -+ ic = NULL; -+ imapx_uidset_init (&uidset, 0, 100); - -- g_free (is->priv->context); -- g_hash_table_destroy (is->priv->untagged_handlers); -+ camel_operation_push_message (cancellable, -+ _("Fetching summary information for new messages in '%s'"), -+ camel_folder_get_display_name (folder)); - -- if (is->priv->inactivity_timeout != NULL) -- g_source_unref (is->priv->inactivity_timeout); -- g_mutex_clear (&is->priv->inactivity_timeout_lock); -+ fetch_summary_uids = g_slist_sort (fetch_summary_uids, imapx_uids_desc_cmp); - -- g_free (is->priv->status_data_items); -- g_free (is->priv->list_return_opts); -+ for (link = fetch_summary_uids; link; link = g_slist_next (link)) { -+ const gchar *uid = link->data; - -- if (is->priv->search_results != NULL) -- g_array_unref (is->priv->search_results); -- g_mutex_clear (&is->priv->search_results_lock); -+ if (!uid) -+ continue; - -- g_hash_table_destroy (is->priv->known_alerts); -- g_mutex_clear (&is->priv->known_alerts_lock); -+ if (!ic) -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_REFRESH_INFO, "UID FETCH "); - -- g_rec_mutex_clear (&is->priv->idle_lock); -- g_main_loop_unref (is->priv->idle_main_loop); -- g_main_context_unref (is->priv->idle_main_context); -+ if (imapx_uidset_add (&uidset, ic, uid) == 1 || (!link->next && ic && imapx_uidset_done (&uidset, ic))) { -+ camel_imapx_command_add (ic, " (RFC822.SIZE RFC822.HEADER FLAGS)"); - -- g_mutex_clear (&is->priv->jobs_prop_lock); -- g_hash_table_destroy (is->priv->jobs_prop_folder_paths); -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error fetching message info"), cancellable, error); - -- g_mutex_clear (&is->priv->shutdown_error_lock); -- g_clear_error (&is->priv->shutdown_error); -+ camel_imapx_command_unref (ic); -+ ic = NULL; - -- g_weak_ref_clear (&is->priv->store); -- g_weak_ref_clear (&is->priv->parser_cancellable); -- g_weak_ref_clear (&is->priv->select_mailbox); -- g_weak_ref_clear (&is->priv->select_closing); -- g_weak_ref_clear (&is->priv->select_pending); -+ if (!success) -+ break; - -- /* Chain up to parent's finalize() method. */ -- G_OBJECT_CLASS (camel_imapx_server_parent_class)->finalize (object); --} -+ imapx_server_process_fetch_changes_infos (is, mailbox, folder, infos, NULL, NULL, 0, 0); -+ g_hash_table_remove_all (infos); -+ } -+ } - --static void --imapx_server_constructed (GObject *object) --{ -- CamelIMAPXServer *server; -+ camel_operation_pop_message (cancellable); - -- /* Chain up to parent's method. */ -- G_OBJECT_CLASS (camel_imapx_server_parent_class)->constructed (object); -+ imapx_server_process_fetch_changes_infos (is, mailbox, folder, infos, NULL, NULL, 0, 0); -+ } - -- server = CAMEL_IMAPX_SERVER (object); -- server->tagprefix = 'Z'; --} -+ g_return_val_if_fail (is->priv->fetch_changes_mailbox == mailbox, FALSE); -+ g_return_val_if_fail (is->priv->fetch_changes_folder == folder, FALSE); -+ g_return_val_if_fail (is->priv->fetch_changes_infos == infos, FALSE); - --static void --imapx_server_mailbox_select (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox) --{ -- imapx_server_add_job_mailbox (is, mailbox); -+ is->priv->fetch_changes_mailbox = NULL; -+ is->priv->fetch_changes_folder = NULL; -+ is->priv->fetch_changes_infos = NULL; -+ -+ g_slist_free_full (fetch_summary_uids, (GDestroyNotify) camel_pstring_free); -+ g_hash_table_destroy (infos); - -- e ( -- is->tagprefix, -- "%s::mailbox-select (\"%s\")\n", -- G_OBJECT_TYPE_NAME (is), -- camel_imapx_mailbox_get_name (mailbox)); -+ return success; - } - --static void --imapx_server_mailbox_closed (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox) -+gboolean -+camel_imapx_server_refresh_info_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) - { -- imapx_server_remove_job_mailbox (is, mailbox); -+ CamelIMAPXCommand *ic; -+ CamelIMAPXMailbox *selected_mailbox; -+ CamelIMAPXSummary *imapx_summary; -+ CamelFolder *folder; -+ GHashTable *known_uids; -+ guint32 messages; -+ guint32 unseen; -+ guint32 uidnext; -+ guint32 uidvalidity; -+ guint64 highestmodseq; -+ guint32 total; -+ guint64 uidl; -+ gboolean need_rescan; -+ gboolean success; - -- e ( -- is->tagprefix, -- "%s::mailbox-closed (\"%s\")\n", -- G_OBJECT_TYPE_NAME (is), -- camel_imapx_mailbox_get_name (mailbox)); --} -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); - --static void --camel_imapx_server_class_init (CamelIMAPXServerClass *class) --{ -- GObjectClass *object_class; -+ selected_mailbox = camel_imapx_server_ref_pending_or_selected (is); -+ if (selected_mailbox == mailbox) { -+ success = camel_imapx_server_noop_sync (is, mailbox, cancellable, error); -+ } else { -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_STATUS, "STATUS %M (%t)", mailbox, is->priv->status_data_items); - -- g_type_class_add_private (class, sizeof (CamelIMAPXServerPrivate)); -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error running STATUS"), cancellable, error); - -- 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; -- object_class->constructed = imapx_server_constructed; -+ camel_imapx_command_unref (ic); -+ } -+ g_clear_object (&selected_mailbox); - -- class->mailbox_select = imapx_server_mailbox_select; -- class->mailbox_closed = imapx_server_mailbox_closed; -+ if (!success) -+ return FALSE; - -- 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)); -+ folder = imapx_server_ref_folder (is, mailbox); -+ g_return_val_if_fail (folder != NULL, FALSE); - -- signals[MAILBOX_SELECT] = g_signal_new ( -- "mailbox-select", -- G_OBJECT_CLASS_TYPE (class), -- G_SIGNAL_RUN_LAST, -- G_STRUCT_OFFSET (CamelIMAPXServerClass, mailbox_select), -- NULL, NULL, NULL, -- G_TYPE_NONE, 1, -- CAMEL_TYPE_IMAPX_MAILBOX); -+ imapx_summary = CAMEL_IMAPX_SUMMARY (folder->summary); - -- signals[MAILBOX_CLOSED] = g_signal_new ( -- "mailbox-closed", -- G_OBJECT_CLASS_TYPE (class), -- G_SIGNAL_RUN_LAST, -- G_STRUCT_OFFSET (CamelIMAPXServerClass, mailbox_closed), -- NULL, NULL, NULL, -- G_TYPE_NONE, 1, -- CAMEL_TYPE_IMAPX_MAILBOX); -+ messages = camel_imapx_mailbox_get_messages (mailbox); -+ unseen = camel_imapx_mailbox_get_unseen (mailbox); -+ uidnext = camel_imapx_mailbox_get_uidnext (mailbox); -+ uidvalidity = camel_imapx_mailbox_get_uidvalidity (mailbox); -+ highestmodseq = camel_imapx_mailbox_get_highestmodseq (mailbox); -+ total = camel_folder_summary_count (folder->summary); - -- /** -- * CamelIMAPXServer::shutdown -- * @server: the #CamelIMAPXServer which emitted the signal -- * @error: a #GError, which caused the shutdown; can be %NULL -- **/ -- signals[SHUTDOWN] = g_signal_new ( -- "shutdown", -- G_OBJECT_CLASS_TYPE (class), -- G_SIGNAL_RUN_FIRST, -- G_STRUCT_OFFSET (CamelIMAPXServerClass, shutdown), -- NULL, NULL, -- g_cclosure_marshal_VOID__BOXED, -- G_TYPE_NONE, 1, G_TYPE_ERROR); --} -+ need_rescan = -+ (uidvalidity > 0 && uidvalidity != imapx_summary->validity) || -+ total != messages || -+ imapx_summary->uidnext != uidnext || -+ camel_folder_summary_get_unread_count (folder->summary) != unseen || -+ imapx_summary->modseq != highestmodseq; - --static void --camel_imapx_server_init (CamelIMAPXServer *is) --{ -- GMainContext *main_context; -+ if (!need_rescan) { -+ g_object_unref (folder); -+ return TRUE; -+ } - -- is->priv = CAMEL_IMAPX_SERVER_GET_PRIVATE (is); -+ if (!camel_imapx_server_ensure_selected_sync (is, mailbox, cancellable, error)) { -+ g_object_unref (folder); -+ return FALSE; -+ } - -- is->priv->untagged_handlers = create_initial_untagged_handler_table (); -+ if (is->priv->use_qresync && imapx_summary->modseq > 0 && uidvalidity > 0) { -+ imapx_summary->modseq = highestmodseq; -+ if (total != messages || -+ camel_folder_summary_get_unread_count (folder->summary) != unseen || -+ imapx_summary->modseq != highestmodseq) { -+ c ( -+ is->priv->tagprefix, -+ "Eep, after QRESYNC we're out of sync. " -+ "total %u / %u, unread %u / %u, modseq %" -+ G_GUINT64_FORMAT " / %" G_GUINT64_FORMAT "\n", -+ total, messages, -+ camel_folder_summary_get_unread_count (folder->summary), -+ unseen, -+ imapx_summary->modseq, -+ highestmodseq); -+ } else { -+ c ( -+ is->priv->tagprefix, -+ "OK, after QRESYNC we're still in sync. " -+ "total %u / %u, unread %u / %u, modseq %" -+ G_GUINT64_FORMAT " / %" G_GUINT64_FORMAT "\n", -+ total, messages, -+ camel_folder_summary_get_unread_count (folder->summary), -+ unseen, -+ imapx_summary->modseq, -+ highestmodseq); -+ g_object_unref (folder); -+ return TRUE; -+ } -+ } - -- g_mutex_init (&is->priv->stream_lock); -- g_mutex_init (&is->priv->inactivity_timeout_lock); -- g_mutex_init (&is->priv->select_lock); -- g_mutex_init (&is->priv->search_results_lock); -- g_mutex_init (&is->priv->known_alerts_lock); -- g_mutex_init (&is->priv->jobs_prop_lock); -- g_mutex_init (&is->priv->shutdown_error_lock); -+ if (total > 0) { -+ gchar *uid = camel_imapx_dup_uid_from_summary_index (folder, total - 1); -+ if (uid) { -+ uidl = g_ascii_strtoull (uid, NULL, 10); -+ g_free (uid); -+ uidl++; -+ } else { -+ uidl = 1; -+ } -+ } else { -+ uidl = 1; -+ } - -- g_weak_ref_init (&is->priv->store, NULL); -- g_weak_ref_init (&is->priv->parser_cancellable, NULL); -- g_weak_ref_init (&is->priv->select_mailbox, NULL); -- g_weak_ref_init (&is->priv->select_closing, NULL); -- g_weak_ref_init (&is->priv->select_pending, NULL); -+ camel_folder_summary_prepare_fetch_all (folder->summary, NULL); - -- is->priv->jobs_prop_folder_paths = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); -- is->priv->jobs_prop_command_count = 0; -- is->priv->jobs_prop_expensive_command_count = 0; -+ known_uids = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) camel_pstring_free, NULL); - -- is->queue = camel_imapx_command_queue_new (); -- is->active = camel_imapx_command_queue_new (); -- is->done = camel_imapx_command_queue_new (); -+ success = imapx_server_fetch_changes (is, mailbox, folder, known_uids, uidl, 0, cancellable, error); -+ if (success && uidl != 1) -+ success = imapx_server_fetch_changes (is, mailbox, folder, known_uids, 0, uidl, cancellable, error); - -- g_queue_init (&is->jobs); -+ if (success) { -+ CamelFolderChangeInfo *changes; -+ GList *removed = NULL; -+ GPtrArray *array; -+ gint ii; - -- g_rec_mutex_init (&is->queue_lock); -+ camel_folder_summary_lock (folder->summary); - -- is->state = IMAPX_DISCONNECTED; -+ changes = camel_folder_change_info_new (); - -- is->priv->changes = camel_folder_change_info_new (); -+ array = camel_folder_summary_get_array (folder->summary); -+ for (ii = 0; array && ii < array->len; ii++) { -+ const gchar *uid = array->pdata[ii]; - -- is->priv->known_alerts = g_hash_table_new_full ( -- (GHashFunc) g_str_hash, -- (GEqualFunc) g_str_equal, -- (GDestroyNotify) g_free, -- (GDestroyNotify) NULL); -+ if (!uid) -+ continue; - -- /* Initialize parser thread structs. */ -+ if (!g_hash_table_contains (known_uids, uid)) { -+ removed = g_list_prepend (removed, (gpointer) uid); -+ camel_folder_change_info_remove_uid (changes, uid); -+ } -+ } - -- main_context = g_main_context_new (); -+ camel_folder_summary_unlock (folder->summary); - -- is->priv->parser_main_loop = g_main_loop_new (main_context, FALSE); -- is->priv->parser_main_context = g_main_context_ref (main_context); -- is->priv->shutdown_error = NULL; -+ if (removed != NULL) { -+ camel_folder_summary_remove_uids (folder->summary, removed); -+ camel_folder_summary_touch (folder->summary); - -- g_main_context_unref (main_context); -+ /* Shares UIDs with the 'array'. */ -+ g_list_free (removed); -+ } - -- /* Initialize IDLE thread structs. */ -+ if (camel_folder_change_info_changed (changes)) { -+ camel_folder_summary_save_to_db (folder->summary, NULL); -+ imapx_update_store_summary (folder); -+ camel_folder_changed (folder, changes); -+ } - -- main_context = g_main_context_new (); -+ camel_folder_change_info_free (changes); -+ camel_folder_summary_free_array (array); -+ } - -- g_rec_mutex_init (&is->priv->idle_lock); -- is->priv->idle_main_loop = g_main_loop_new (main_context, FALSE); -- is->priv->idle_main_context = g_main_context_ref (main_context); -+ g_hash_table_destroy (known_uids); -+ g_object_unref (folder); - -- g_main_context_unref (main_context); -+ return success; - } - --CamelIMAPXServer * --camel_imapx_server_new (CamelIMAPXStore *store) -+static void -+imapx_sync_free_user (GArray *user_set) - { -- g_return_val_if_fail (CAMEL_IS_IMAPX_STORE (store), NULL); -+ gint i; - -- return g_object_new ( -- CAMEL_TYPE_IMAPX_SERVER, -- "store", store, NULL); --} -+ if (user_set == NULL) -+ return; - --CamelIMAPXStore * --camel_imapx_server_ref_store (CamelIMAPXServer *server) --{ -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), NULL); -+ for (i = 0; i < user_set->len; i++) { -+ struct _imapx_flag_change *flag_change = &g_array_index (user_set, struct _imapx_flag_change, i); -+ GPtrArray *infos = flag_change->infos; -+ gint j; - -- return g_weak_ref_get (&server->priv->store); -+ for (j = 0; j < infos->len; j++) { -+ CamelMessageInfo *info = g_ptr_array_index (infos, j); -+ camel_message_info_unref (info); -+ } -+ -+ g_ptr_array_free (infos, TRUE); -+ g_free (flag_change->name); -+ } -+ g_array_free (user_set, TRUE); - } - --CamelIMAPXSettings * --camel_imapx_server_ref_settings (CamelIMAPXServer *server) -+static void -+imapx_unset_folder_flagged_flag (CamelFolderSummary *summary, -+ GPtrArray *changed_uids, -+ gboolean except_deleted_messages) - { -- CamelIMAPXStore *store; -- CamelSettings *settings; -+ CamelMessageInfo *info; -+ gboolean changed = FALSE; -+ gint ii; - -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (server), NULL); -+ g_return_if_fail (CAMEL_IS_FOLDER_SUMMARY (summary)); -+ g_return_if_fail (changed_uids != NULL); - -- store = camel_imapx_server_ref_store (server); -- settings = camel_service_ref_settings (CAMEL_SERVICE (store)); -- g_object_unref (store); -+ for (ii = 0; ii < changed_uids->len; ii++) { -+ info = camel_folder_summary_get (summary, changed_uids->pdata[ii]); - -- return CAMEL_IMAPX_SETTINGS (settings); -+ if (info) { -+ CamelMessageInfoBase *mi = (CamelMessageInfoBase *) info; -+ -+ /* some infos could be only 'dirty' (needed to save into summary) */ -+ if ((mi->flags & CAMEL_MESSAGE_FOLDER_FLAGGED) != 0 && -+ (!except_deleted_messages || (mi->flags & CAMEL_MESSAGE_DELETED) == 0)) { -+ mi->flags &= ~CAMEL_MESSAGE_FOLDER_FLAGGED; -+ mi->dirty = TRUE; -+ changed = TRUE; -+ } -+ -+ camel_message_info_unref (info); -+ } -+ } -+ -+ if (changed) { -+ camel_folder_summary_touch (summary); -+ camel_folder_summary_save_to_db (summary, NULL); -+ } - } - --/** -- * camel_imapx_server_ref_input_stream: -- * @is: a #CamelIMAPXServer -- * -- * Returns the #GInputStream for @is, which is owned by either a -- * #GTcpConnection or a #GSubprocess. If the #CamelIMAPXServer is not -- * yet connected or has lost its connection, the function returns %NULL. -- * -- * The returned #GInputStream is referenced for thread-safety and must -- * be unreferenced with g_object_unref() when finished with it. -- * -- * Returns: a #GInputStream, or %NULL -- * -- * Since: 3.12 -- **/ --GInputStream * --camel_imapx_server_ref_input_stream (CamelIMAPXServer *is) --{ -- GInputStream *input_stream = NULL; -+static void -+imapx_server_info_changed_cb (CamelIMAPXSummary *summary, -+ CamelMessageInfo *info, -+ gpointer user_data) -+{ -+ GHashTable *changed_meanwhile = user_data; -+ -+ g_return_if_fail (info != NULL); -+ g_return_if_fail (changed_meanwhile != NULL); -+ -+ /* The UID can be NULL in case of a newly fetched message, for example when creating -+ the message info in imapx_untagged_fetch() by camel_folder_summary_info_new_from_parser() */ -+ if (camel_message_info_uid (info)) { -+ g_hash_table_insert (changed_meanwhile, -+ (gpointer) camel_pstring_strdup (camel_message_info_uid (info)), -+ GINT_TO_POINTER (1)); -+ } -+} - -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); -+gboolean -+camel_imapx_server_sync_changes_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ gboolean can_influence_flags, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ guint i, jj, on, on_orset, off_orset; -+ GPtrArray *changed_uids; -+ GArray *on_user = NULL, *off_user = NULL; -+ CamelFolder *folder; -+ CamelIMAPXMessageInfo *info; -+ GHashTable *changed_meanwhile; -+ gulong changed_meanwhile_handler_id; -+ guint32 permanentflags; -+ struct _uidset_state uidset; -+ gint unread_change = 0; -+ gboolean use_real_junk_path = FALSE; -+ gboolean use_real_trash_path = FALSE; -+ gboolean remove_deleted_flags = FALSE; -+ gboolean nothing_to_do; -+ gboolean success; - -- g_mutex_lock (&is->priv->stream_lock); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); - -- if (is->priv->input_stream != NULL) -- input_stream = g_object_ref (is->priv->input_stream); -+ folder = imapx_server_ref_folder (is, mailbox); -+ g_return_val_if_fail (folder != NULL, FALSE); - -- g_mutex_unlock (&is->priv->stream_lock); -+ /* We calculate two masks, a mask of all flags which have been -+ * turned off and a mask of all flags which have been turned -+ * on. If either of these aren't 0, then we have work to do, -+ * and we fire off a job to do it. -+ * -+ * User flags are a bit more tricky, we rely on the user -+ * flags being sorted, and then we create a bunch of lists; -+ * one for each flag being turned off, including each -+ * info being turned off, and one for each flag being turned on. -+ */ -+ changed_uids = camel_folder_summary_get_changed (folder->summary); - -- return input_stream; --} -+ if (changed_uids->len == 0) { -+ camel_folder_free_uids (folder, changed_uids); -+ g_object_unref (folder); -+ return TRUE; -+ } - --/** -- * camel_imapx_server_ref_output_stream: -- * @is: a #CamelIMAPXServer -- * -- * Returns the #GOutputStream for @is, which is owned by either a -- * #GTcpConnection or a #GSubprocess. If the #CamelIMAPXServer is not -- * yet connected or has lost its connection, the function returns %NULL. -- * -- * The returned #GOutputStream is referenced for thread-safety and must -- * be unreferenced with g_object_unref() when finished with it. -- * -- * Returns: a #GOutputStream, or %NULL -- * -- * Since: 3.12 -- **/ --GOutputStream * --camel_imapx_server_ref_output_stream (CamelIMAPXServer *is) --{ -- GOutputStream *output_stream = NULL; -+ changed_meanwhile = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) camel_pstring_free, NULL); -+ changed_meanwhile_handler_id = g_signal_connect (folder->summary, "info-changed", -+ G_CALLBACK (imapx_server_info_changed_cb), changed_meanwhile); - -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); -+ if (can_influence_flags) { -+ CamelIMAPXSettings *settings; - -- g_mutex_lock (&is->priv->stream_lock); -+ settings = camel_imapx_server_ref_settings (is); -+ use_real_junk_path = camel_imapx_settings_get_use_real_junk_path (settings); -+ use_real_trash_path = camel_imapx_settings_get_use_real_trash_path (settings); -+ if (use_real_trash_path) { -+ CamelFolder *trash_folder = NULL; -+ gchar *real_trash_path; -+ -+ real_trash_path = camel_imapx_settings_dup_real_trash_path (settings); -+ if (real_trash_path) -+ trash_folder = camel_store_get_folder_sync ( -+ camel_folder_get_parent_store (folder), -+ real_trash_path, 0, cancellable, NULL); - -- if (is->priv->output_stream != NULL) -- output_stream = g_object_ref (is->priv->output_stream); -+ /* Remove deleted flags in all but the trash folder itself */ -+ remove_deleted_flags = !trash_folder || trash_folder != folder; - -- g_mutex_unlock (&is->priv->stream_lock); -+ use_real_trash_path = trash_folder != NULL; - -- return output_stream; --} -+ g_clear_object (&trash_folder); -+ g_free (real_trash_path); -+ } -+ g_object_unref (settings); -+ } - --/** -- * camel_imapx_server_ref_selected: -- * @is: a #CamelIMAPXServer -- * -- * Returns the #CamelIMAPXMailbox representing the currently selected -- * mailbox (or mailbox being selected if a SELECT -- * command is in progress) on the IMAP server, or %NULL if no mailbox -- * is currently selected or being selected on the server. -- * -- * The returned #CamelIMAPXMailbox is reference for thread-safety and -- * should be unreferenced with g_object_unref() when finished with it. -- * -- * Returns: a #CamelIMAPXMailbox, or %NULL -- * -- * Since: 3.12 -- **/ --CamelIMAPXMailbox * --camel_imapx_server_ref_selected (CamelIMAPXServer *is) --{ -- CamelIMAPXMailbox *mailbox; -+ if (changed_uids->len > 20) -+ camel_folder_summary_prepare_fetch_all (folder->summary, NULL); - -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); -+ off_orset = on_orset = 0; -+ for (i = 0; i < changed_uids->len; i++) { -+ guint32 flags, sflags; -+ CamelFlag *uflags, *suflags; -+ const gchar *uid; -+ guint j = 0; - -- g_mutex_lock (&is->priv->select_lock); -+ uid = g_ptr_array_index (changed_uids, i); - -- mailbox = g_weak_ref_get (&is->priv->select_mailbox); -- if (mailbox == NULL) -- mailbox = g_weak_ref_get (&is->priv->select_closing); -- if (mailbox == NULL) -- mailbox = g_weak_ref_get (&is->priv->select_pending); -+ info = (CamelIMAPXMessageInfo *) -+ camel_folder_summary_get (folder->summary, uid); - -- g_mutex_unlock (&is->priv->select_lock); -+ if (info == NULL) -+ continue; - -- return mailbox; --} -+ if (!(info->info.flags & CAMEL_MESSAGE_FOLDER_FLAGGED)) { -+ camel_message_info_unref (info); -+ continue; -+ } - --static void --imapx_disconnect (CamelIMAPXServer *is) --{ -- g_mutex_lock (&is->priv->stream_lock); -+ flags = info->info.flags & CAMEL_IMAPX_SERVER_FLAGS; -+ sflags = info->server_flags & CAMEL_IMAPX_SERVER_FLAGS; - -- g_clear_object (&is->priv->input_stream); -- g_clear_object (&is->priv->output_stream); -- g_clear_object (&is->priv->connection); --#if GLIB_CHECK_VERSION(2,39,0) -- g_clear_object (&is->priv->subprocess); --#endif -+ if (can_influence_flags) { -+ gboolean move_to_real_junk; -+ gboolean move_to_real_trash; -+ -+ move_to_real_junk = -+ use_real_junk_path && -+ (flags & CAMEL_MESSAGE_JUNK); -+ -+ move_to_real_trash = -+ use_real_trash_path && remove_deleted_flags && -+ (flags & CAMEL_MESSAGE_DELETED); -+ -+ if (move_to_real_junk) -+ camel_imapx_folder_add_move_to_real_junk ( -+ CAMEL_IMAPX_FOLDER (folder), uid); -+ -+ if (move_to_real_trash) -+ camel_imapx_folder_add_move_to_real_trash ( -+ CAMEL_IMAPX_FOLDER (folder), uid); -+ } - -- g_mutex_unlock (&is->priv->stream_lock); -+ if (flags != sflags) { -+ off_orset |= (flags ^ sflags) & ~flags; -+ on_orset |= (flags ^ sflags) & flags; -+ } - -- g_mutex_lock (&is->priv->select_lock); -- g_weak_ref_set (&is->priv->select_mailbox, NULL); -- g_weak_ref_set (&is->priv->select_closing, NULL); -- g_weak_ref_set (&is->priv->select_pending, NULL); -- g_mutex_unlock (&is->priv->select_lock); -+ uflags = info->info.user_flags; -+ suflags = info->server_user_flags; -+ while (uflags || suflags) { -+ gint res; - -- if (is->cinfo) { -- imapx_free_capability (is->cinfo); -- is->cinfo = NULL; -- } -+ if (uflags) { -+ if (suflags) -+ res = strcmp (uflags->name, suflags->name); -+ else if (*uflags->name) -+ res = -1; -+ else { -+ uflags = uflags->next; -+ continue; -+ } -+ } else { -+ res = 1; -+ } - -- is->state = IMAPX_DISCONNECTED; --} -+ if (res == 0) { -+ uflags = uflags->next; -+ suflags = suflags->next; -+ } else { -+ GArray *user_set; -+ CamelFlag *user_flag; -+ struct _imapx_flag_change *change = NULL, add = { 0 }; - --/* Client commands */ --gboolean --camel_imapx_server_connect (CamelIMAPXServer *is, -- GCancellable *cancellable, -- GError **error) --{ -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ if (res < 0) { -+ if (on_user == NULL) -+ on_user = g_array_new (FALSE, FALSE, sizeof (struct _imapx_flag_change)); -+ user_set = on_user; -+ user_flag = uflags; -+ uflags = uflags->next; -+ } else { -+ if (off_user == NULL) -+ off_user = g_array_new (FALSE, FALSE, sizeof (struct _imapx_flag_change)); -+ user_set = off_user; -+ user_flag = suflags; -+ suflags = suflags->next; -+ } - -- if (is->state == IMAPX_SHUTDOWN) { -- g_set_error ( -- error, CAMEL_SERVICE_ERROR, -- CAMEL_SERVICE_ERROR_UNAVAILABLE, -- "Shutting down"); -- return FALSE; -+ /* Could sort this and binary search */ -+ for (j = 0; j < user_set->len; j++) { -+ change = &g_array_index (user_set, struct _imapx_flag_change, j); -+ if (strcmp (change->name, user_flag->name) == 0) -+ goto found; -+ } -+ add.name = g_strdup (user_flag->name); -+ add.infos = g_ptr_array_new (); -+ g_array_append_val (user_set, add); -+ change = &add; -+ found: -+ camel_message_info_ref (info); -+ g_ptr_array_add (change->infos, info); -+ } -+ } -+ -+ camel_message_info_unref (info); - } - -- if (is->state >= IMAPX_INITIALISED) -- return TRUE; -+ nothing_to_do = -+ (on_orset == 0) && -+ (off_orset == 0) && -+ (on_user == NULL) && -+ (off_user == NULL); - -- if (!imapx_reconnect (is, cancellable, error)) -- return FALSE; -+ if (nothing_to_do) { -+ g_signal_handler_disconnect (folder->summary, changed_meanwhile_handler_id); -+ -+ imapx_sync_free_user (on_user); -+ imapx_sync_free_user (off_user); -+ imapx_unset_folder_flagged_flag (folder->summary, changed_uids, remove_deleted_flags); -+ camel_folder_free_uids (folder, changed_uids); -+ g_hash_table_destroy (changed_meanwhile); -+ g_object_unref (folder); -+ return TRUE; -+ } - -- is->priv->parser_thread = g_thread_new ( -- NULL, imapx_parser_thread, g_object_ref (is)); -+ if (!camel_imapx_server_ensure_selected_sync (is, mailbox, cancellable, error)) { -+ g_signal_handler_disconnect (folder->summary, changed_meanwhile_handler_id); - -- if (CAMEL_IMAPX_LACK_CAPABILITY (is->cinfo, NAMESPACE)) { -- /* This also creates a needed faux NAMESPACE */ -- if (!camel_imapx_server_list (is, "INBOX", 0, cancellable, error)) -- return FALSE; -+ imapx_sync_free_user (on_user); -+ imapx_sync_free_user (off_user); -+ camel_folder_free_uids (folder, changed_uids); -+ g_hash_table_destroy (changed_meanwhile); -+ g_object_unref (folder); -+ return FALSE; - } - -- return TRUE; --} -+ permanentflags = camel_imapx_mailbox_get_permanentflags (mailbox); - --static CamelStream * --imapx_server_get_message (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- CamelFolderSummary *summary, -- CamelDataCache *message_cache, -- const gchar *message_uid, -- gint pri, -- GCancellable *cancellable, -- GError **error) --{ -- CamelStream *stream = NULL; -- CamelIMAPXJob *job; -- CamelMessageInfo *mi; -- GIOStream *cache_stream; -- GetMessageData *data; -- gboolean registered; -+ success = TRUE; -+ for (on = 0; on < 2 && success; on++) { -+ guint32 orset = on ? on_orset : off_orset; -+ GArray *user_set = on ? on_user : off_user; - -- while (job = imapx_server_ref_job (is, mailbox, IMAPX_JOB_GET_MESSAGE, message_uid), job != NULL) { -- /* Promote the existing GET_MESSAGE -- * job's priority if ours is higher. */ -- if (pri > job->pri) -- job->pri = pri; -- -- /* Wait for the job to finish. */ -- camel_imapx_job_wait (job, NULL); -- camel_imapx_job_unref (job); -- -- /* Disregard errors here. If we failed to retreive the -- * message from cache (implying the job we were waiting -- * on failed or got cancelled), we'll just re-fetch it. */ -- cache_stream = camel_data_cache_get ( -- message_cache, "cur", message_uid, NULL); -- if (cache_stream != NULL) { -- /* Return new file stream, instead of a DataCache's to not fight -- on its content and position with other jobs, if any. */ -- gchar *filename = camel_data_cache_get_filename (message_cache, "cur", message_uid); -- stream = camel_stream_fs_new_with_name (filename, O_RDONLY, 0, NULL); -- g_free (filename); -- g_object_unref (cache_stream); -- -- if (stream) -- return stream; -- } -- } -+ for (jj = 0; jj < G_N_ELEMENTS (flags_table) && success; jj++) { -+ guint32 flag = flags_table[jj].flag; -+ CamelIMAPXCommand *ic = NULL; - -- QUEUE_LOCK (is); -+ if ((orset & flag) == 0) -+ continue; - -- if (g_cancellable_set_error_if_cancelled (cancellable, error)) { -- QUEUE_UNLOCK (is); -+ c (is->priv->tagprefix, "checking/storing %s flags '%s'\n", on ? "on" : "off", flags_table[jj].name); -+ imapx_uidset_init (&uidset, 0, 100); -+ for (i = 0; i < changed_uids->len && success; i++) { -+ CamelIMAPXMessageInfo *info; -+ gboolean remove_deleted_flag; -+ guint32 flags; -+ guint32 sflags; -+ gint send; - -- return NULL; -- } -+ info = (CamelIMAPXMessageInfo *) -+ camel_folder_summary_get ( -+ folder->summary, -+ changed_uids->pdata[i]); - -- mi = camel_folder_summary_get (summary, message_uid); -- if (mi == NULL) { -- g_set_error ( -- error, CAMEL_FOLDER_ERROR, -- CAMEL_FOLDER_ERROR_INVALID_UID, -- _("Cannot get message with message ID %s: %s"), -- message_uid, _("No such message available.")); -- QUEUE_UNLOCK (is); -- return NULL; -- } -+ if (info == NULL) -+ continue; - -- /* This makes sure that if any file is left on the disk, it is not reused. -- That can happen when the previous message download had been cancelled -- or finished with an error. */ -- camel_data_cache_remove (message_cache, "tmp", message_uid, NULL); -+ flags = (info->info.flags & CAMEL_IMAPX_SERVER_FLAGS) & permanentflags; -+ sflags = (info->server_flags & CAMEL_IMAPX_SERVER_FLAGS) & permanentflags; -+ send = 0; - -- cache_stream = camel_data_cache_add (message_cache, "tmp", message_uid, error); -- if (cache_stream == NULL) { -- QUEUE_UNLOCK (is); -- return NULL; -- } -+ remove_deleted_flag = -+ remove_deleted_flags && -+ (flags & CAMEL_MESSAGE_DELETED); -+ -+ if (remove_deleted_flag) { -+ /* Remove the DELETED flag so the -+ * message appears normally in the -+ * real Trash folder when copied. */ -+ flags &= ~CAMEL_MESSAGE_DELETED; -+ } - -- data = g_slice_new0 (GetMessageData); -- data->uid = g_strdup (message_uid); -- data->message_cache = g_object_ref (message_cache); -- data->stream = g_object_ref (cache_stream); -- data->size = ((CamelMessageInfoBase *) mi)->size; -- if (data->size > MULTI_SIZE) -- data->use_multi_fetch = TRUE; -- -- job = camel_imapx_job_new (cancellable); -- job->pri = pri; -- job->type = IMAPX_JOB_GET_MESSAGE; -- job->start = imapx_job_get_message_start; -- job->matches = imapx_job_get_message_matches; -+ if ( (on && (((flags ^ sflags) & flags) & flag)) -+ || (!on && (((flags ^ sflags) & ~flags) & flag))) { -+ if (ic == NULL) { -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_SYNC_CHANGES, "UID STORE "); -+ } -+ send = imapx_uidset_add (&uidset, ic, camel_message_info_uid (info)); -+ } -+ if (send == 1 || (i == changed_uids->len - 1 && ic && imapx_uidset_done (&uidset, ic))) { -+ camel_imapx_command_add (ic, " %tFLAGS.SILENT (%t)", on ? "+" : "-", flags_table[jj].name); - -- camel_imapx_job_set_mailbox (job, mailbox); -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error syncing changes"), cancellable, error); - -- camel_imapx_job_set_data ( -- job, data, (GDestroyNotify) get_message_data_free); -+ camel_imapx_command_unref (ic); -+ ic = NULL; - -- g_clear_object (&cache_stream); -- camel_message_info_unref (mi); -+ if (!success) -+ break; -+ } -+ if (flag == CAMEL_MESSAGE_SEEN) { -+ /* Remember how the server's unread count will change if this -+ * command succeeds */ -+ if (on) -+ unread_change--; -+ else -+ unread_change++; -+ } - -- registered = imapx_register_job (is, job, error); -+ /* The second round and the server doesn't support saving user flags, -+ thus store them at least locally */ -+ if (on && (permanentflags & CAMEL_MESSAGE_USER) == 0) { -+ camel_flag_list_copy (&info->server_user_flags, &info->info.user_flags); -+ } - -- QUEUE_UNLOCK (is); -+ camel_message_info_unref (info); -+ } - -- if (registered && camel_imapx_job_run (job, is, error)) -- stream = camel_stream_new (data->stream); -- else if (registered) -- imapx_unregister_job (is, job); -+ g_warn_if_fail (ic == NULL); -+ } - -- camel_imapx_job_unref (job); -+ if (user_set && (permanentflags & CAMEL_MESSAGE_USER) != 0 && success) { -+ CamelIMAPXCommand *ic = NULL; - -- return stream; --} -+ for (jj = 0; jj < user_set->len && success; jj++) { -+ struct _imapx_flag_change *c = &g_array_index (user_set, struct _imapx_flag_change, jj); - --CamelStream * --camel_imapx_server_get_message (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- CamelFolderSummary *summary, -- CamelDataCache *message_cache, -- const gchar *message_uid, -- GCancellable *cancellable, -- GError **error) --{ -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), NULL); -- g_return_val_if_fail (CAMEL_IS_FOLDER_SUMMARY (summary), NULL); -- g_return_val_if_fail (CAMEL_IS_DATA_CACHE (message_cache), NULL); -- g_return_val_if_fail (message_uid != NULL, NULL); -+ imapx_uidset_init (&uidset, 0, 100); -+ for (i = 0; i < c->infos->len; i++) { -+ CamelIMAPXMessageInfo *info = c->infos->pdata[i]; - -- return imapx_server_get_message ( -- is, mailbox, summary, -- message_cache, message_uid, -- IMAPX_PRIORITY_GET_MESSAGE, -- cancellable, error); --} -+ if (ic == NULL) -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_SYNC_CHANGES, "UID STORE "); - --gboolean --camel_imapx_server_sync_message (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- CamelFolderSummary *summary, -- CamelDataCache *message_cache, -- const gchar *message_uid, -- GCancellable *cancellable, -- GError **error) --{ -- gchar *cache_file = NULL; -- gboolean is_cached; -- struct stat st; -- gboolean success = TRUE; -+ if (imapx_uidset_add (&uidset, ic, camel_message_info_uid (info)) == 1 -+ || (i == c->infos->len - 1 && imapx_uidset_done (&uidset, ic))) { -+ gchar *utf7; - -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -- g_return_val_if_fail (CAMEL_IS_FOLDER_SUMMARY (summary), FALSE); -- g_return_val_if_fail (CAMEL_IS_DATA_CACHE (message_cache), FALSE); -- g_return_val_if_fail (message_uid != NULL, FALSE); -+ utf7 = camel_utf8_utf7 (c->name); - -- /* Check if the cache file already exists and is non-empty. */ -- cache_file = camel_data_cache_get_filename ( -- message_cache, "cur", message_uid); -- is_cached = (g_stat (cache_file, &st) == 0 && st.st_size > 0); -- g_free (cache_file); -+ camel_imapx_command_add (ic, " %tFLAGS.SILENT (%t)", on ? "+" : "-", utf7 ? utf7 : c->name); - -- if (!is_cached) { -- CamelStream *stream; -+ g_free (utf7); - -- stream = imapx_server_get_message ( -- is, mailbox, summary, -- message_cache, message_uid, -- IMAPX_PRIORITY_SYNC_MESSAGE, -- cancellable, error); -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error syncing changes"), cancellable, error); - -- success = (stream != NULL); -+ camel_imapx_command_unref (ic); -+ ic = NULL; - -- g_clear_object (&stream); -+ if (!success) -+ break; -+ } -+ } -+ } -+ } - } - -- return success; --} -+ g_signal_handler_disconnect (folder->summary, changed_meanwhile_handler_id); -+ -+ if (success) { -+ CamelStore *parent_store; -+ guint32 unseen; -+ -+ parent_store = camel_folder_get_parent_store (folder); - --gboolean --camel_imapx_server_copy_message (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- CamelIMAPXMailbox *destination, -- GPtrArray *uids, -- gboolean delete_originals, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXJob *job; -- CopyMessagesData *data; -- gint ii; -- gboolean success; -+ camel_folder_summary_lock (folder->summary); - -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (destination), FALSE); -- g_return_val_if_fail (uids != NULL, FALSE); -+ for (i = 0; i < changed_uids->len; i++) { -+ CamelIMAPXMessageInfo *xinfo = (CamelIMAPXMessageInfo *) camel_folder_summary_get (folder->summary, -+ changed_uids->pdata[i]); - -- /* That's okay if the "SELECT" fails here, as it can be due to -- the folder being write-only; just ignore the error and continue. */ -- imapx_ensure_mailbox_permanentflags (is, destination, cancellable, NULL); -+ if (!xinfo) -+ continue; - -- if (g_cancellable_set_error_if_cancelled (cancellable, error)) -- return FALSE; -+ xinfo->server_flags = xinfo->info.flags & CAMEL_IMAPX_SERVER_FLAGS; -+ if (!remove_deleted_flags || -+ !(xinfo->info.flags & CAMEL_MESSAGE_DELETED)) { -+ xinfo->info.flags &= ~CAMEL_MESSAGE_FOLDER_FLAGGED; -+ } else { -+ /* to stare back the \Deleted flag */ -+ xinfo->server_flags &= ~CAMEL_MESSAGE_DELETED; -+ xinfo->info.flags |= CAMEL_MESSAGE_FOLDER_FLAGGED; -+ } -+ xinfo->info.dirty = TRUE; -+ if ((permanentflags & CAMEL_MESSAGE_USER) != 0 || -+ camel_flag_list_size (&xinfo->server_user_flags) == 0) -+ camel_flag_list_copy (&xinfo->server_user_flags, &xinfo->info.user_flags); - -- data = g_slice_new0 (CopyMessagesData); -- data->destination = g_object_ref (destination); -- data->uids = g_ptr_array_new (); -- data->delete_originals = delete_originals; -+ if (g_hash_table_lookup (changed_meanwhile, changed_uids->pdata[i])) -+ xinfo->info.flags |= CAMEL_MESSAGE_FOLDER_FLAGGED; - -- /* If we're moving messages, prefer "UID MOVE" if supported. */ -- if (data->delete_originals) { -- if (CAMEL_IMAPX_HAVE_CAPABILITY (is->cinfo, MOVE)) { -- data->delete_originals = FALSE; -- data->use_move_command = TRUE; -+ camel_folder_summary_touch (folder->summary); -+ camel_message_info_unref (xinfo); - } -- } - -- for (ii = 0; ii < uids->len; ii++) -- g_ptr_array_add (data->uids, g_strdup (uids->pdata[ii])); -+ camel_folder_summary_unlock (folder->summary); -+ -+ /* Apply the changes to server-side unread count; it won't tell -+ * us of these changes, of course. */ -+ unseen = camel_imapx_mailbox_get_unseen (mailbox); -+ unseen += unread_change; -+ camel_imapx_mailbox_set_unseen (mailbox, unseen); - -- job = camel_imapx_job_new (cancellable); -- job->pri = IMAPX_PRIORITY_COPY_MESSAGE; -- job->type = IMAPX_JOB_COPY_MESSAGE; -- job->start = imapx_job_copy_messages_start; -- job->matches = imapx_job_copy_messages_matches; -+ if (folder->summary && (folder->summary->flags & CAMEL_FOLDER_SUMMARY_DIRTY) != 0) { -+ CamelStoreInfo *si; - -- camel_imapx_job_set_mailbox (job, mailbox); -+ /* ... and store's summary when folder's summary is dirty */ -+ si = camel_store_summary_path (CAMEL_IMAPX_STORE (parent_store)->summary, camel_folder_get_full_name (folder)); -+ if (si) { -+ if (si->total != camel_folder_summary_get_saved_count (folder->summary) || -+ si->unread != camel_folder_summary_get_unread_count (folder->summary)) { -+ si->total = camel_folder_summary_get_saved_count (folder->summary); -+ si->unread = camel_folder_summary_get_unread_count (folder->summary); -+ camel_store_summary_touch (CAMEL_IMAPX_STORE (parent_store)->summary); -+ } - -- camel_imapx_job_set_data ( -- job, data, (GDestroyNotify) copy_messages_data_free); -+ camel_store_summary_info_unref (CAMEL_IMAPX_STORE (parent_store)->summary, si); -+ } -+ } - -- success = imapx_submit_job (is, job, error); -+ camel_folder_summary_save_to_db (folder->summary, NULL); -+ camel_store_summary_save (CAMEL_IMAPX_STORE (parent_store)->summary); -+ } - -- camel_imapx_job_unref (job); -+ imapx_sync_free_user (on_user); -+ imapx_sync_free_user (off_user); -+ camel_folder_free_uids (folder, changed_uids); -+ g_hash_table_destroy (changed_meanwhile); -+ g_object_unref (folder); - - return success; - } - - gboolean --camel_imapx_server_append_message (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- CamelFolderSummary *summary, -- CamelDataCache *message_cache, -- CamelMimeMessage *message, -- const CamelMessageInfo *mi, -- gchar **appended_uid, -- GCancellable *cancellable, -- GError **error) -+camel_imapx_server_expunge_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) - { -- gchar *uid = NULL, *path = NULL; -- CamelMimeFilter *filter; -- CamelIMAPXJob *job; -- CamelMessageInfo *info; -- GIOStream *base_stream; -- GOutputStream *output_stream; -- GOutputStream *filter_stream; -- AppendMessageData *data; -- gint res; -- time_t date_time; -+ CamelFolder *folder; - gboolean success; - - g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); - g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -- g_return_val_if_fail (CAMEL_IS_FOLDER_SUMMARY (summary), FALSE); -- g_return_val_if_fail (CAMEL_IS_DATA_CACHE (message_cache), FALSE); -- g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), FALSE); -- /* CamelMessageInfo can be NULL. */ - -- /* That's okay if the "SELECT" fails here, as it can be due to -- the folder being write-only; just ignore the error and continue. */ -- imapx_ensure_mailbox_permanentflags (is, mailbox, cancellable, NULL); -+ folder = imapx_server_ref_folder (is, mailbox); -+ g_return_val_if_fail (folder != NULL, FALSE); - -- if (g_cancellable_set_error_if_cancelled (cancellable, error)) -- return FALSE; -+ success = camel_imapx_server_ensure_selected_sync (is, mailbox, cancellable, error); - -- /* Append just assumes we have no/a dodgy connection. We dump -- * stuff into the 'new' directory, and let the summary know it's -- * there. Then we fire off a no-reply job which will asynchronously -- * upload the message at some point in the future, and fix up the -- * summary to match */ -+ if (success) { -+ CamelIMAPXCommand *ic; - -- /* chen cleanup this later */ -- uid = imapx_get_temp_uid (); -- base_stream = camel_data_cache_add (message_cache, "new", uid, error); -- if (base_stream == NULL) { -- g_prefix_error (error, _("Cannot create spool file: ")); -- g_free (uid); -- return FALSE; -- } -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_EXPUNGE, "EXPUNGE"); - -- output_stream = g_io_stream_get_output_stream (base_stream); -- filter = camel_mime_filter_canon_new (CAMEL_MIME_FILTER_CANON_CRLF); -- filter_stream = camel_filter_output_stream_new (output_stream, filter); -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error expunging message"), cancellable, error); -+ if (success) { -+ GPtrArray *uids; -+ CamelStore *parent_store; -+ const gchar *full_name; - -- g_filter_output_stream_set_close_base_stream ( -- G_FILTER_OUTPUT_STREAM (filter_stream), FALSE); -+ full_name = camel_folder_get_full_name (folder); -+ parent_store = camel_folder_get_parent_store (folder); - -- res = camel_data_wrapper_write_to_output_stream_sync ( -- CAMEL_DATA_WRAPPER (message), -- filter_stream, cancellable, error); -+ camel_folder_summary_lock (folder->summary); - -- g_object_unref (base_stream); -- g_object_unref (filter_stream); -- g_object_unref (filter); -+ camel_folder_summary_save_to_db (folder->summary, NULL); -+ uids = camel_db_get_folder_deleted_uids (parent_store->cdb_r, full_name, NULL); - -- if (res == -1) { -- g_prefix_error (error, _("Cannot create spool file: ")); -- camel_data_cache_remove (message_cache, "new", uid, NULL); -- g_free (uid); -- return FALSE; -- } -+ if (uids && uids->len) { -+ CamelFolderChangeInfo *changes; -+ GList *removed = NULL; -+ gint i; -+ -+ changes = camel_folder_change_info_new (); -+ for (i = 0; i < uids->len; i++) { -+ camel_folder_change_info_remove_uid (changes, uids->pdata[i]); -+ removed = g_list_prepend (removed, (gpointer) uids->pdata[i]); -+ } - -- date_time = camel_mime_message_get_date (message, NULL); -- path = camel_data_cache_get_filename (message_cache, "new", uid); -- info = camel_folder_summary_info_new_from_message ( -- summary, message, NULL); -- info->uid = camel_pstring_strdup (uid); -- if (mi != NULL) { -- CamelMessageInfoBase *base_info = (CamelMessageInfoBase *) info; -- const CamelFlag *flag; -- const CamelTag *tag; -+ camel_folder_summary_remove_uids (folder->summary, removed); -+ camel_folder_summary_save_to_db (folder->summary, NULL); - -- base_info->flags = camel_message_info_flags (mi); -- base_info->size = camel_message_info_size (mi); -+ camel_folder_changed (folder, changes); -+ camel_folder_change_info_free (changes); - -- flag = camel_message_info_user_flags (mi); -- while (flag != NULL) { -- if (*flag->name != '\0') -- camel_flag_set ( -- &base_info->user_flags, -- flag->name, TRUE); -- flag = flag->next; -- } -+ g_list_free (removed); -+ g_ptr_array_foreach (uids, (GFunc) camel_pstring_free, NULL); -+ } - -- tag = camel_message_info_user_tags (mi); -- while (tag != NULL) { -- if (*tag->name != '\0') -- camel_tag_set ( -- &base_info->user_tags, -- tag->name, tag->value); -- tag = tag->next; -+ if (uids) -+ g_ptr_array_free (uids, TRUE); -+ -+ camel_folder_summary_unlock (folder->summary); - } - -- if (date_time <= 0) -- date_time = camel_message_info_date_received (mi); -+ camel_imapx_command_unref (ic); - } - -- g_free (uid); -+ g_clear_object (&folder); - -- if (camel_mime_message_has_attachment (message)) -- ((CamelMessageInfoBase *) info)->flags |= CAMEL_MESSAGE_ATTACHMENTS; -+ return success; -+} -+ -+gboolean -+camel_imapx_server_list_sync (CamelIMAPXServer *is, -+ const gchar *pattern, -+ CamelStoreGetFolderInfoFlags flags, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXCommand *ic; -+ gboolean success; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ g_return_val_if_fail (pattern != NULL, FALSE); - -- /* So, we actually just want to let the server loop that -- * messages need appending, i think. This is so the same -- * mechanism is used for normal uploading as well as -- * offline re-syncing when we go back online */ -+ if (is->priv->list_return_opts != NULL) { -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_LIST, "LIST \"\" %s RETURN (%t)", -+ pattern, is->priv->list_return_opts); -+ } else { -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_LIST, "LIST \"\" %s", -+ pattern); -+ } - -- data = g_slice_new0 (AppendMessageData); -- data->info = info; /* takes ownership */ -- data->path = path; /* takes ownership */ -- data->date_time = date_time; -- data->appended_uid = NULL; -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error fetching folders"), cancellable, error); - -- job = camel_imapx_job_new (cancellable); -- job->pri = IMAPX_PRIORITY_APPEND_MESSAGE; -- job->type = IMAPX_JOB_APPEND_MESSAGE; -- job->start = imapx_job_append_message_start; -- job->noreply = FALSE; -+ camel_imapx_command_unref (ic); - -- camel_imapx_job_set_mailbox (job, mailbox); -+ if (!success) -+ return FALSE; - -- camel_imapx_job_set_data ( -- job, data, (GDestroyNotify) append_message_data_free); -+ if (!is->priv->list_return_opts) { -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_LSUB, "LSUB \"\" %s", -+ pattern); - -- success = imapx_submit_job (is, job, error); -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error fetching subscribed folders"), cancellable, error); - -- if (appended_uid != NULL) { -- *appended_uid = data->appended_uid; -- data->appended_uid = NULL; -+ camel_imapx_command_unref (ic); - } - -- camel_imapx_job_unref (job); -- - return success; - } - - gboolean --camel_imapx_server_noop (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- GCancellable *cancellable, -- GError **error) -+camel_imapx_server_create_mailbox_sync (CamelIMAPXServer *is, -+ const gchar *mailbox_name, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelIMAPXJob *job; -+ CamelIMAPXCommand *ic; - gboolean success; - - g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- /* Mailbox may be NULL. */ -- -- job = camel_imapx_job_new (cancellable); -- job->type = IMAPX_JOB_NOOP; -- job->start = imapx_job_noop_start; -- job->pri = IMAPX_PRIORITY_NOOP; -- -- camel_imapx_job_set_mailbox (job, mailbox); -+ g_return_val_if_fail (mailbox_name != NULL, FALSE); - -- success = imapx_submit_job (is, job, error); -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_CREATE_MAILBOX, "CREATE %m", mailbox_name); - -- camel_imapx_job_unref (job); -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error creating folder"), cancellable, error); - -- return success; --} -+ camel_imapx_command_unref (ic); - --CamelFolderChangeInfo * --camel_imapx_server_refresh_info (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXJob *job; -- RefreshInfoData *data; -- CamelFolderChangeInfo *changes = NULL; -- gboolean registered = TRUE; -- const gchar *mailbox_name; -+ if (success) { -+ gchar *utf7_pattern; - -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), NULL); -+ utf7_pattern = camel_utf8_utf7 (mailbox_name); - -- /* Don't run concurrent refreshes on the same mailbox. -- * If a refresh is already in progress, let it finish -- * and return no changes for this refresh request. */ -- job = imapx_server_ref_job (is, mailbox, IMAPX_JOB_REFRESH_INFO, NULL); -+ /* List the new mailbox so we trigger our untagged -+ * LIST handler. This simulates being notified of -+ * a newly-created mailbox, so we can just let the -+ * callback functions handle the bookkeeping. */ -+ success = camel_imapx_server_list_sync (is, utf7_pattern, 0, cancellable, error); - -- if (job != NULL) { -- camel_imapx_job_unref (job); -- return camel_folder_change_info_new (); -+ g_free (utf7_pattern); - } - -- if (!imapx_ensure_mailbox_permanentflags (is, mailbox, cancellable, error)) -- return NULL; -- -- QUEUE_LOCK (is); -+ return success; -+} - -- data = g_slice_new0 (RefreshInfoData); -- data->changes = camel_folder_change_info_new (); -+gboolean -+camel_imapx_server_delete_mailbox_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXCommand *ic; -+ CamelIMAPXMailbox *inbox; -+ CamelIMAPXStore *imapx_store; -+ gboolean success; - -- job = camel_imapx_job_new (cancellable); -- job->type = IMAPX_JOB_REFRESH_INFO; -- job->start = imapx_job_refresh_info_start; -- job->matches = imapx_job_refresh_info_matches; -- job->pri = IMAPX_PRIORITY_REFRESH_INFO; -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); - -- camel_imapx_job_set_mailbox (job, mailbox); -+ /* Avoid camel_imapx_job_set_mailbox() here. We -+ * don't want to select the mailbox to be deleted. */ - -- mailbox_name = camel_imapx_mailbox_get_name (mailbox); -+ imapx_store = camel_imapx_server_ref_store (is); -+ /* Keep going, even if this returns NULL. */ -+ inbox = camel_imapx_store_ref_mailbox (imapx_store, "INBOX"); - -- if (camel_imapx_mailbox_is_inbox (mailbox_name)) -- job->pri += 10; -+ /* Make sure the to-be-deleted folder is not -+ * selected by selecting INBOX for this operation. */ -+ success = camel_imapx_server_ensure_selected_sync (is, inbox, cancellable, error); -+ if (!success) { -+ g_clear_object (&inbox); -+ g_clear_object (&imapx_store); -+ return FALSE; -+ } - -- camel_imapx_job_set_data ( -- job, data, (GDestroyNotify) refresh_info_data_free); -+ /* Just to make sure it'll not disappeare before the end of this function */ -+ g_object_ref (mailbox); - -- registered = imapx_register_job (is, job, error); -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_DELETE_MAILBOX, "DELETE %M", mailbox); - -- QUEUE_UNLOCK (is); -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error deleting folder"), cancellable, error); - -- if (registered) -- camel_imapx_job_guard_mailbox_update (job, mailbox); -+ camel_imapx_command_unref (ic); - -- if (registered && camel_imapx_job_run (job, is, error)) { -- changes = data->changes; -- data->changes = NULL; -- } else if (registered) { -- imapx_unregister_job (is, job); -+ if (success) { -+ camel_imapx_mailbox_deleted (mailbox); -+ camel_imapx_store_emit_mailbox_updated (imapx_store, mailbox); - } - -- camel_imapx_job_unref (job); -+ g_clear_object (&inbox); -+ g_clear_object (&imapx_store); -+ g_clear_object (&mailbox); - -- return changes; -+ return success; - } - --static void --imapx_sync_free_user (GArray *user_set) -+gboolean -+camel_imapx_server_rename_mailbox_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ const gchar *new_mailbox_name, -+ GCancellable *cancellable, -+ GError **error) - { -- gint i; -- -- if (user_set == NULL) -- return; -- -- for (i = 0; i < user_set->len; i++) { -- struct _imapx_flag_change *flag_change = &g_array_index (user_set, struct _imapx_flag_change, i); -- GPtrArray *infos = flag_change->infos; -- gint j; -- -- for (j = 0; j < infos->len; j++) { -- CamelMessageInfo *info = g_ptr_array_index (infos, j); -- camel_message_info_unref (info); -- } -+ CamelIMAPXCommand *ic; -+ CamelIMAPXMailbox *inbox; -+ CamelIMAPXStore *imapx_store; -+ gboolean success; - -- g_ptr_array_free (infos, TRUE); -- g_free (flag_change->name); -- } -- g_array_free (user_set, TRUE); --} -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ g_return_val_if_fail (new_mailbox_name != NULL, FALSE); - --static void --imapx_unset_folder_flagged_flag (CamelFolderSummary *summary, -- GPtrArray *changed_uids, -- gboolean except_deleted_messages) --{ -- CamelMessageInfo *info; -- gboolean changed = FALSE; -- gint ii; -+ imapx_store = camel_imapx_server_ref_store (is); -+ inbox = camel_imapx_store_ref_mailbox (imapx_store, "INBOX"); -+ g_return_val_if_fail (inbox != NULL, FALSE); - -- g_return_if_fail (CAMEL_IS_FOLDER_SUMMARY (summary)); -- g_return_if_fail (changed_uids != NULL); -+ /* We don't want to select the mailbox to be renamed. */ -+ success = camel_imapx_server_ensure_selected_sync (is, inbox, cancellable, error); -+ if (!success) { -+ g_clear_object (&inbox); -+ g_clear_object (&imapx_store); -+ return FALSE; -+ } - -- for (ii = 0; ii < changed_uids->len; ii++) { -- info = camel_folder_summary_get (summary, changed_uids->pdata[ii]); -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_RENAME_MAILBOX, "RENAME %M %m", mailbox, new_mailbox_name); - -- if (info) { -- CamelMessageInfoBase *mi = (CamelMessageInfoBase *) info; -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error renaming folder"), cancellable, error); - -- /* some infos could be only 'dirty' (needed to save into summary) */ -- if ((mi->flags & CAMEL_MESSAGE_FOLDER_FLAGGED) != 0 && -- (!except_deleted_messages || (mi->flags & CAMEL_MESSAGE_DELETED) == 0)) { -- mi->flags &= ~CAMEL_MESSAGE_FOLDER_FLAGGED; -- mi->dirty = TRUE; -- changed = TRUE; -- } -+ camel_imapx_command_unref (ic); - -- camel_message_info_unref (info); -- } -- } -+ if (success) { -+ /* Perform the same processing as imapx_untagged_list() -+ * would if the server notified us of a renamed mailbox. */ - -- if (changed) { -- camel_folder_summary_touch (summary); -- camel_folder_summary_save_to_db (summary, NULL); -+ camel_imapx_store_handle_mailbox_rename (imapx_store, mailbox, new_mailbox_name); - } -+ -+ g_clear_object (&inbox); -+ g_clear_object (&imapx_store); -+ -+ return success; - } - --static gboolean --imapx_server_sync_changes (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- guint32 job_type, -- gint pri, -- GCancellable *cancellable, -- GError **error) -+gboolean -+camel_imapx_server_subscribe_mailbox_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) - { -- guint i, on_orset, off_orset; -- GPtrArray *changed_uids; -- GArray *on_user = NULL, *off_user = NULL; -- CamelFolder *folder; -- CamelIMAPXMessageInfo *info; -- CamelIMAPXJob *job; -- CamelIMAPXSettings *settings; -- SyncChangesData *data; -- gboolean use_real_junk_path; -- gboolean use_real_trash_path; -- gboolean remove_deleted_flags; -- gboolean nothing_to_do; -- gboolean registered; -- gboolean own_allocated_changed_uids = FALSE; -- gboolean success = TRUE; -+ CamelIMAPXCommand *ic; -+ gboolean success; - -- folder = imapx_server_ref_folder (is, mailbox); -- g_return_val_if_fail (folder != NULL, FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); - -- if (!imapx_ensure_mailbox_permanentflags (is, mailbox, cancellable, error)) -- return FALSE; -+ /* We don't want to select the mailbox to be subscribed. */ -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_SUBSCRIBE_MAILBOX, "SUBSCRIBE %M", mailbox); - -- /* We calculate two masks, a mask of all flags which have been -- * turned off and a mask of all flags which have been turned -- * on. If either of these aren't 0, then we have work to do, -- * and we fire off a job to do it. -- * -- * User flags are a bit more tricky, we rely on the user -- * flags being sorted, and then we create a bunch of lists; -- * one for each flag being turned off, including each -- * info being turned off, and one for each flag being turned on. -- */ -- changed_uids = camel_folder_summary_get_changed (folder->summary); -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error subscribing to folder"), cancellable, error); - -- if (changed_uids->len == 0) { -- camel_folder_free_uids (folder, changed_uids); -- g_object_unref (folder); -- return TRUE; -- } -+ camel_imapx_command_unref (ic); - -- settings = camel_imapx_server_ref_settings (is); -- use_real_junk_path = -- camel_imapx_settings_get_use_real_junk_path (settings); -- use_real_trash_path = -- camel_imapx_settings_get_use_real_trash_path (settings); -- g_object_unref (settings); -+ if (success) { -+ CamelIMAPXStore *imapx_store; - -- remove_deleted_flags = use_real_trash_path && (job_type != IMAPX_JOB_EXPUNGE) != 0; -+ /* Perform the same processing as imapx_untagged_list() -+ * would if the server notified us of a subscription. */ - -- off_orset = on_orset = 0; -- for (i = 0; i < changed_uids->len; i++) { -- guint32 flags, sflags; -- CamelFlag *uflags, *suflags; -- const gchar *uid; -- gboolean move_to_real_junk; -- gboolean move_to_real_trash; -- guint j = 0; -+ imapx_store = camel_imapx_server_ref_store (is); - -- uid = g_ptr_array_index (changed_uids, i); -+ camel_imapx_mailbox_subscribed (mailbox); -+ camel_imapx_store_emit_mailbox_updated (imapx_store, mailbox); - -- info = (CamelIMAPXMessageInfo *) -- camel_folder_summary_get (folder->summary, uid); -+ g_clear_object (&imapx_store); -+ } - -- if (info == NULL) -- continue; -+ return success; -+} - -- if (!(info->info.flags & CAMEL_MESSAGE_FOLDER_FLAGGED)) { -- camel_message_info_unref (info); -- continue; -- } -+gboolean -+camel_imapx_server_unsubscribe_mailbox_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXCommand *ic; -+ gboolean success; - -- flags = info->info.flags & CAMEL_IMAPX_SERVER_FLAGS; -- sflags = info->server_flags & CAMEL_IMAPX_SERVER_FLAGS; -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); - -- move_to_real_junk = -- use_real_junk_path && -- (flags & CAMEL_MESSAGE_JUNK); -- -- move_to_real_trash = -- use_real_trash_path && -- (flags & CAMEL_MESSAGE_DELETED); -- -- if (move_to_real_junk) -- camel_imapx_folder_add_move_to_real_junk ( -- CAMEL_IMAPX_FOLDER (folder), uid); -- -- if (move_to_real_trash) -- camel_imapx_folder_add_move_to_real_trash ( -- CAMEL_IMAPX_FOLDER (folder), uid); -+ /* We don't want to select the mailbox to be unsubscribed. */ -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_UNSUBSCRIBE_MAILBOX, "UNSUBSCRIBE %M", mailbox); - -- if (flags != sflags) { -- off_orset |= (flags ^ sflags) & ~flags; -- on_orset |= (flags ^ sflags) & flags; -- } -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error unsubscribing from folder"), cancellable, error); - -- uflags = info->info.user_flags; -- suflags = info->server_user_flags; -- while (uflags || suflags) { -- gint res; -+ camel_imapx_command_unref (ic); - -- if (uflags) { -- if (suflags) -- res = strcmp (uflags->name, suflags->name); -- else if (*uflags->name) -- res = -1; -- else { -- uflags = uflags->next; -- continue; -- } -- } else { -- res = 1; -- } -+ if (success) { -+ CamelIMAPXStore *imapx_store; - -- if (res == 0) { -- uflags = uflags->next; -- suflags = suflags->next; -- } else { -- GArray *user_set; -- CamelFlag *user_flag; -- struct _imapx_flag_change *change = NULL, add = { 0 }; -+ /* Perform the same processing as imapx_untagged_list() -+ * would if the server notified us of an unsubscription. */ - -- if (res < 0) { -- if (on_user == NULL) -- on_user = g_array_new (FALSE, FALSE, sizeof (struct _imapx_flag_change)); -- user_set = on_user; -- user_flag = uflags; -- uflags = uflags->next; -- } else { -- if (off_user == NULL) -- off_user = g_array_new (FALSE, FALSE, sizeof (struct _imapx_flag_change)); -- user_set = off_user; -- user_flag = suflags; -- suflags = suflags->next; -- } -+ imapx_store = camel_imapx_server_ref_store (is); - -- /* Could sort this and binary search */ -- for (j = 0; j < user_set->len; j++) { -- change = &g_array_index (user_set, struct _imapx_flag_change, j); -- if (strcmp (change->name, user_flag->name) == 0) -- goto found; -- } -- add.name = g_strdup (user_flag->name); -- add.infos = g_ptr_array_new (); -- g_array_append_val (user_set, add); -- change = &add; -- found: -- camel_message_info_ref (info); -- g_ptr_array_add (change->infos, info); -- } -- } -+ camel_imapx_mailbox_unsubscribed (mailbox); -+ camel_imapx_store_emit_mailbox_updated (imapx_store, mailbox); - -- camel_message_info_unref (info); -+ g_clear_object (&imapx_store); - } - -- nothing_to_do = -- (on_orset == 0) && -- (off_orset == 0) && -- (on_user == NULL) && -- (off_user == NULL); -+ return success; -+} - -- if (nothing_to_do) { -- imapx_sync_free_user (on_user); -- imapx_sync_free_user (off_user); -- imapx_unset_folder_flagged_flag (folder->summary, changed_uids, remove_deleted_flags); -- camel_folder_free_uids (folder, changed_uids); -- g_object_unref (folder); -- return TRUE; -- } -+gboolean -+camel_imapx_server_update_quota_info_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXCommand *ic; -+ gboolean success; - -- /* TODO above code should go into changes_start */ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); - -- job = imapx_server_ref_job (is, mailbox, IMAPX_JOB_SYNC_CHANGES, NULL); -+ g_mutex_lock (&is->priv->stream_lock); - -- if (job != NULL) { -- GPtrArray *new_changed_uids; -- GHashTable *known_uids; -- GHashTableIter iter; -- gpointer key, value; -- gint ii; -+ if (CAMEL_IMAPX_LACK_CAPABILITY (is->priv->cinfo, QUOTA)) { -+ g_mutex_unlock (&is->priv->stream_lock); - -- known_uids = g_hash_table_new (g_str_hash, g_str_equal); -- data = camel_imapx_job_get_data (job); -+ g_set_error_literal ( -+ error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, -+ _("IMAP server does not support quotas")); -+ return FALSE; -+ } else { -+ g_mutex_unlock (&is->priv->stream_lock); -+ } - -- if (data && data->changed_uids) { -- for (ii = 0; ii < changed_uids->len; ii++) { -- g_hash_table_insert (known_uids, changed_uids->pdata[ii], GINT_TO_POINTER (1)); -- } -+ success = camel_imapx_server_ensure_selected_sync (is, mailbox, cancellable, error); -+ if (!success) -+ return FALSE; - -- for (ii = 0; ii < data->changed_uids->len; ii++) { -- g_hash_table_remove (known_uids, data->changed_uids->pdata[ii]); -- } -- } -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_UPDATE_QUOTA_INFO, "GETQUOTAROOT %M", mailbox); - -- if (g_hash_table_size (known_uids) == 0) { -- /* The pending job stores changes for the same UIDs */ -- if (pri > job->pri) -- job->pri = pri; -- -- camel_imapx_job_unref (job); -- -- imapx_sync_free_user (on_user); -- imapx_sync_free_user (off_user); -- camel_folder_free_uids (folder, changed_uids); -- g_object_unref (folder); -- g_hash_table_destroy (known_uids); -- return TRUE; -- } -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error retrieving quota information"), cancellable, error); - -- new_changed_uids = g_ptr_array_sized_new (g_hash_table_size (known_uids)); -+ camel_imapx_command_unref (ic); - -- /* What left in known_uids are message info changes which are not being -- saved in the pending job */ -+ return success; -+} - -- g_hash_table_iter_init (&iter, known_uids); -- while (g_hash_table_iter_next (&iter, &key, &value)) { -- g_ptr_array_add (new_changed_uids, (gpointer) camel_pstring_strdup (key)); -- } -+GPtrArray * -+camel_imapx_server_uid_search_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ const gchar *criteria_prefix, -+ const gchar *search_key, -+ const gchar * const *words, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ CamelIMAPXCommand *ic; -+ GArray *uid_search_results; -+ GPtrArray *results = NULL; -+ gint ii; -+ gboolean need_charset = FALSE; -+ gboolean success; - -- g_hash_table_destroy (known_uids); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), NULL); -+ g_return_val_if_fail (criteria_prefix != NULL, NULL); - -- camel_folder_free_uids (folder, changed_uids); -- changed_uids = new_changed_uids; -+ success = camel_imapx_server_ensure_selected_sync (is, mailbox, cancellable, error); -+ if (!success) -+ return FALSE; - -- /* Why would anyone define a virtual function for the free on the folder? */ -- own_allocated_changed_uids = TRUE; -+ for (ii = 0; !need_charset && words && words[ii]; ii++) { -+ need_charset = !imapx_util_all_is_ascii (words[ii]); - } - -- QUEUE_LOCK (is); -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_UID_SEARCH, "UID SEARCH"); -+ if (need_charset) -+ camel_imapx_command_add (ic, " CHARSET UTF-8"); -+ if (criteria_prefix && *criteria_prefix) -+ camel_imapx_command_add (ic, " %t", criteria_prefix); - -- data = g_slice_new0 (SyncChangesData); -- data->folder = g_object_ref (folder); -- data->changed_uids = changed_uids; /* takes ownership */ -- data->own_allocated_changed_uids = own_allocated_changed_uids; -- data->on_set = on_orset; -- data->off_set = off_orset; -- data->on_user = on_user; /* takes ownership */ -- data->off_user = off_user; /* takes ownership */ -- data->remove_deleted_flags = remove_deleted_flags; -+ if (search_key && words) { -+ for (ii = 0; words[ii]; ii++) { -+ camel_imapx_command_add (ic, " %t %s", search_key, words[ii]); -+ } -+ } - -- job = camel_imapx_job_new (cancellable); -- job->type = IMAPX_JOB_SYNC_CHANGES; -- job->start = imapx_job_sync_changes_start; -- job->matches = imapx_job_sync_changes_matches; -- job->pri = pri; -+ success = camel_imapx_server_process_command_sync (is, ic, _("Search failed"), cancellable, error); - -- camel_imapx_job_set_mailbox (job, mailbox); -+ camel_imapx_command_unref (ic); - -- camel_imapx_job_set_data ( -- job, data, (GDestroyNotify) sync_changes_data_free); -+ g_mutex_lock (&is->priv->search_results_lock); -+ uid_search_results = is->priv->search_results; -+ is->priv->search_results = NULL; -+ g_mutex_unlock (&is->priv->search_results_lock); - -- registered = imapx_register_job (is, job, error); -+ if (success) { -+ guint ii; - -- QUEUE_UNLOCK (is); -+ /* Convert the numeric UIDs to strings. */ - -- if (job_type == IMAPX_JOB_SYNC_CHANGES && registered) -- camel_imapx_job_guard_mailbox_update (job, mailbox); -+ g_return_val_if_fail (uid_search_results != NULL, NULL); - -- success = registered && camel_imapx_job_run (job, is, error); -+ results = g_ptr_array_new_full (uid_search_results->len, (GDestroyNotify) camel_pstring_free); - -- if (!success && registered) -- imapx_unregister_job (is, job); -+ for (ii = 0; ii < uid_search_results->len; ii++) { -+ const gchar *pooled_uid; -+ guint64 numeric_uid; -+ gchar *alloced_uid; - -- camel_imapx_job_unref (job); -+ numeric_uid = g_array_index (uid_search_results, guint64, ii); -+ alloced_uid = g_strdup_printf ("%" G_GUINT64_FORMAT, numeric_uid); -+ pooled_uid = camel_pstring_add (alloced_uid, TRUE); -+ g_ptr_array_add (results, (gpointer) pooled_uid); -+ } -+ } - -- g_object_unref (folder); -+ if (uid_search_results) -+ g_array_unref (uid_search_results); - -- return success; -+ return results; - } - --gboolean --camel_imapx_server_sync_changes (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- GCancellable *cancellable, -- GError **error) -+typedef struct _IdleThreadData { -+ CamelIMAPXServer *is; -+ GCancellable *idle_cancellable; -+ gint idle_stamp; -+} IdleThreadData; -+ -+static gpointer -+imapx_server_idle_thread (gpointer user_data) - { -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ IdleThreadData *itd = user_data; -+ CamelIMAPXServer *is; -+ CamelIMAPXMailbox *mailbox; -+ CamelIMAPXCommand *ic; -+ CamelIMAPXCommandPart *cp; -+ GCancellable *idle_cancellable; -+ GError *local_error = NULL; -+ gint previous_timeout = -1; -+ gboolean success = FALSE; -+ gboolean rather_disconnect = FALSE; - -- return imapx_server_sync_changes ( -- is, mailbox, -- IMAPX_JOB_SYNC_CHANGES, -- IMAPX_PRIORITY_SYNC_CHANGES, -- cancellable, error); --} -+ g_return_val_if_fail (itd != NULL, NULL); -+ -+ is = itd->is; -+ idle_cancellable = itd->idle_cancellable; - --/* expunge-uids? */ --gboolean --camel_imapx_server_expunge (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXJob *job; -- gboolean registered; -- gboolean success; -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); -+ g_return_val_if_fail (G_IS_CANCELLABLE (idle_cancellable), NULL); - -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ g_mutex_lock (&is->priv->idle_lock); - -- /* Do we really care to wait for this one to finish? */ -- job = imapx_server_ref_job (is, mailbox, IMAPX_JOB_EXPUNGE, NULL); -+ if (g_cancellable_is_cancelled (idle_cancellable) || -+ is->priv->idle_stamp != itd->idle_stamp || -+ is->priv->idle_state != IMAPX_IDLE_STATE_SCHEDULED) { -+ g_cond_broadcast (&is->priv->idle_cond); -+ g_mutex_unlock (&is->priv->idle_lock); -+ -+ g_clear_object (&itd->is); -+ g_clear_object (&itd->idle_cancellable); -+ g_free (itd); - -- if (job != NULL) { -- camel_imapx_job_unref (job); -- return TRUE; -+ return NULL; - } - -- QUEUE_LOCK (is); -+ is->priv->idle_state = IMAPX_IDLE_STATE_PREPARING; -+ g_cond_broadcast (&is->priv->idle_cond); - -- job = camel_imapx_job_new (cancellable); -- job->type = IMAPX_JOB_EXPUNGE; -- job->start = imapx_job_expunge_start; -- job->matches = imapx_job_expunge_matches; -- job->pri = IMAPX_PRIORITY_EXPUNGE; -+ mailbox = is->priv->idle_mailbox; -+ if (mailbox) -+ g_object_ref (mailbox); - -- camel_imapx_job_set_mailbox (job, mailbox); -+ g_mutex_unlock (&is->priv->idle_lock); - -- registered = imapx_register_job (is, job, error); -+ if (!mailbox) -+ mailbox = camel_imapx_server_ref_selected (is); -+ -+ if (!mailbox) -+ goto exit; - -- QUEUE_UNLOCK (is); -+ success = camel_imapx_server_ensure_selected_sync (is, mailbox, idle_cancellable, &local_error); -+ if (!success) { -+ rather_disconnect = TRUE; -+ goto exit; -+ } - -- success = registered && camel_imapx_job_run (job, is, error); -+ ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_IDLE, "IDLE"); -+ camel_imapx_command_close (ic); - -- if (!success && registered) -- imapx_unregister_job (is, job); -+ cp = g_queue_peek_head (&ic->parts); -+ cp->type |= CAMEL_IMAPX_COMMAND_CONTINUATION; - -- camel_imapx_job_unref (job); -+ g_mutex_lock (&is->priv->stream_lock); -+ /* Set the connection timeout to one minute more than the inactivity timeout */ -+ if (is->priv->connection) -+ previous_timeout = imapx_server_set_connection_timeout (is->priv->connection, INACTIVITY_TIMEOUT_SECONDS + 60); -+ g_mutex_unlock (&is->priv->stream_lock); - -- return success; --} -+ g_mutex_lock (&is->priv->idle_lock); -+ if (is->priv->idle_stamp == itd->idle_stamp && -+ is->priv->idle_state == IMAPX_IDLE_STATE_PREPARING) { -+ g_mutex_unlock (&is->priv->idle_lock); - --gboolean --camel_imapx_server_list (CamelIMAPXServer *is, -- const gchar *pattern, -- CamelStoreGetFolderInfoFlags flags, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXJob *job; -- ListData *data; -- gboolean success; -+ /* Blocks, until the DONE is issued or on inactivity timeout, error, ... */ -+ success = camel_imapx_server_process_command_sync (is, ic, _("Error running IDLE"), idle_cancellable, &local_error); - -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- g_return_val_if_fail (pattern != NULL, FALSE); -+ rather_disconnect = rather_disconnect || !success || g_cancellable_is_cancelled (idle_cancellable); -+ } else { -+ g_mutex_unlock (&is->priv->idle_lock); -+ } - -- data = g_slice_new0 (ListData); -- data->pattern = g_strdup (pattern); -+ if (previous_timeout >= 0) { -+ g_mutex_lock (&is->priv->stream_lock); -+ if (is->priv->connection) -+ imapx_server_set_connection_timeout (is->priv->connection, previous_timeout); -+ g_mutex_unlock (&is->priv->stream_lock); -+ } - -- job = camel_imapx_job_new (cancellable); -- job->type = IMAPX_JOB_LIST; -- job->start = imapx_job_list_start; -- job->matches = imapx_job_list_matches; -- job->pri = IMAPX_PRIORITY_LIST; -+ camel_imapx_command_unref (ic); - -- camel_imapx_job_set_data ( -- job, data, (GDestroyNotify) list_data_free); -+ exit: -+ g_mutex_lock (&is->priv->idle_lock); -+ g_clear_object (&is->priv->idle_cancellable); -+ is->priv->idle_state = IMAPX_IDLE_STATE_OFF; -+ g_cond_broadcast (&is->priv->idle_cond); -+ g_mutex_unlock (&is->priv->idle_lock); -+ -+ if (success) -+ c (camel_imapx_server_get_tagprefix (is), "IDLE finished successfully\n"); -+ else if (local_error) -+ c (camel_imapx_server_get_tagprefix (is), "IDLE finished with error: %s%s\n", local_error->message, rather_disconnect ? "; rather disconnect" : ""); -+ else -+ c (camel_imapx_server_get_tagprefix (is), "IDLE finished without error%s\n", rather_disconnect ? "; rather disconnect" : ""); - -- /* sync operation which is triggered by user */ -- if (flags & CAMEL_STORE_FOLDER_INFO_SUBSCRIPTION_LIST) -- job->pri += 300; -+ if (rather_disconnect) { -+ imapx_disconnect (is); -+ } - -- success = imapx_submit_job (is, job, error); -+ g_clear_object (&mailbox); -+ g_clear_error (&local_error); - -- camel_imapx_job_unref (job); -+ g_clear_object (&itd->is); -+ g_clear_object (&itd->idle_cancellable); -+ g_free (itd); - -- return success; -+ return NULL; - } - --gboolean --camel_imapx_server_create_mailbox (CamelIMAPXServer *is, -- const gchar *mailbox_name, -- GCancellable *cancellable, -- GError **error) -+static gboolean -+imapx_server_run_idle_thread_cb (gpointer user_data) - { -- CamelIMAPXJob *job; -- MailboxData *data; -- gboolean success; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- g_return_val_if_fail (mailbox_name != NULL, FALSE); -- -- data = g_slice_new0 (MailboxData); -- data->mailbox_name = g_strdup (mailbox_name); -+ GWeakRef *is_weakref = user_data; -+ CamelIMAPXServer *is; - -- job = camel_imapx_job_new (cancellable); -- job->type = IMAPX_JOB_CREATE_MAILBOX; -- job->start = imapx_job_create_mailbox_start; -- job->pri = IMAPX_PRIORITY_MAILBOX_MGMT; -+ g_return_val_if_fail (is_weakref != NULL, FALSE); - -- camel_imapx_job_set_data ( -- job, data, (GDestroyNotify) mailbox_data_free); -+ is = g_weak_ref_get (is_weakref); -+ if (!is) -+ return FALSE; - -- success = imapx_submit_job (is, job, error); -+ g_mutex_lock (&is->priv->idle_lock); - -- if (success) { -- gchar *utf7_pattern; -+ if (g_main_current_source () == is->priv->idle_pending) { -+ if (!g_source_is_destroyed (g_main_current_source ()) && -+ is->priv->idle_state == IMAPX_IDLE_STATE_SCHEDULED) { -+ IdleThreadData *itd; -+ GThread *thread; -+ GError *local_error = NULL; -+ -+ itd = g_new0 (IdleThreadData, 1); -+ itd->is = g_object_ref (is); -+ itd->idle_cancellable = g_object_ref (is->priv->idle_cancellable); -+ itd->idle_stamp = is->priv->idle_stamp; -+ -+ thread = g_thread_try_new (NULL, imapx_server_idle_thread, itd, &local_error); -+ if (thread) { -+ g_thread_unref (thread); -+ } else { -+ g_warning ("%s: Failed to create IDLE thread: %s", G_STRFUNC, local_error ? local_error->message : "Unknown error"); - -- utf7_pattern = camel_utf8_utf7 (mailbox_name); -+ g_clear_object (&itd->is); -+ g_clear_object (&itd->idle_cancellable); -+ g_free (itd); -+ } - -- /* List the new mailbox so we trigger our untagged -- * LIST handler. This simulates being notified of -- * a newly-created mailbox, so we can just let the -- * callback functions handle the bookkeeping. */ -- success = camel_imapx_server_list ( -- is, utf7_pattern, 0, cancellable, error); -+ g_clear_error (&local_error); -+ } - -- g_free (utf7_pattern); -+ g_source_unref (is->priv->idle_pending); -+ is->priv->idle_pending = NULL; - } - -- camel_imapx_job_unref (job); -+ g_mutex_unlock (&is->priv->idle_lock); - -- return success; -+ return FALSE; - } - - gboolean --camel_imapx_server_delete_mailbox (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- GCancellable *cancellable, -- GError **error) -+camel_imapx_server_can_use_idle (CamelIMAPXServer *is) - { -- CamelIMAPXJob *job; -- MailboxData *data; -- gboolean success; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ gboolean use_idle = FALSE; - -- /* Avoid camel_imapx_job_set_mailbox() here. We -- * don't want to select the mailbox to be deleted. */ -+ g_mutex_lock (&is->priv->stream_lock); - -- data = g_slice_new0 (MailboxData); -- data->mailbox = g_object_ref (mailbox); -+ /* No need for IDLE if the server supports NOTIFY. */ -+ if (CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, NOTIFY)) { -+ g_mutex_unlock (&is->priv->stream_lock); - -- job = camel_imapx_job_new (cancellable); -- job->type = IMAPX_JOB_DELETE_MAILBOX; -- job->start = imapx_job_delete_mailbox_start; -- job->pri = IMAPX_PRIORITY_MAILBOX_MGMT; -+ return FALSE; -+ } - -- camel_imapx_job_set_data ( -- job, data, (GDestroyNotify) mailbox_data_free); -+ if (CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, IDLE)) { -+ CamelIMAPXSettings *settings; - -- success = imapx_submit_job (is, job, error); -+ settings = camel_imapx_server_ref_settings (is); -+ use_idle = camel_imapx_settings_get_use_idle (settings); -+ g_object_unref (settings); -+ } - -- camel_imapx_job_unref (job); -+ g_mutex_unlock (&is->priv->stream_lock); - -- return success; -+ return use_idle; - } - - gboolean --camel_imapx_server_rename_mailbox (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- const gchar *new_mailbox_name, -- GCancellable *cancellable, -- GError **error) -+camel_imapx_server_is_in_idle (CamelIMAPXServer *is) - { -- CamelIMAPXJob *job; -- MailboxData *data; -- gboolean success; -+ gboolean in_idle; - - g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -- g_return_val_if_fail (new_mailbox_name != NULL, FALSE); -- -- /* Avoid camel_imapx_job_set_mailbox() here. We -- * don't want to select the mailbox to be renamed. */ -- -- data = g_slice_new0 (MailboxData); -- data->mailbox = g_object_ref (mailbox); -- data->mailbox_name = g_strdup (new_mailbox_name); -- -- job = camel_imapx_job_new (cancellable); -- job->type = IMAPX_JOB_RENAME_MAILBOX; -- job->start = imapx_job_rename_mailbox_start; -- job->pri = IMAPX_PRIORITY_MAILBOX_MGMT; -- -- camel_imapx_job_set_data ( -- job, data, (GDestroyNotify) mailbox_data_free); - -- success = imapx_submit_job (is, job, error); -+ g_mutex_lock (&is->priv->idle_lock); -+ in_idle = is->priv->idle_state != IMAPX_IDLE_STATE_OFF; -+ g_mutex_unlock (&is->priv->idle_lock); - -- camel_imapx_job_unref (job); -- -- return success; -+ return in_idle; - } - --gboolean --camel_imapx_server_subscribe_mailbox (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- GCancellable *cancellable, -- GError **error) -+CamelIMAPXMailbox * -+camel_imapx_server_ref_idle_mailbox (CamelIMAPXServer *is) - { -- CamelIMAPXJob *job; -- MailboxData *data; -- gboolean success; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -- -- /* Avoid camel_imapx_job_set_mailbox() here. We -- * don't want to select the mailbox to be subscribed. */ -- -- data = g_slice_new0 (MailboxData); -- data->mailbox = g_object_ref (mailbox); -+ CamelIMAPXMailbox *mailbox = NULL; - -- job = camel_imapx_job_new (cancellable); -- job->type = IMAPX_JOB_SUBSCRIBE_MAILBOX; -- job->start = imapx_job_subscribe_mailbox_start; -- job->pri = IMAPX_PRIORITY_MAILBOX_MGMT; -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); - -- camel_imapx_job_set_data ( -- job, data, (GDestroyNotify) mailbox_data_free); -+ g_mutex_lock (&is->priv->idle_lock); - -- success = imapx_submit_job (is, job, error); -+ if (is->priv->idle_state != IMAPX_IDLE_STATE_OFF) { -+ if (is->priv->idle_mailbox) -+ mailbox = g_object_ref (is->priv->idle_mailbox); -+ else -+ mailbox = camel_imapx_server_ref_selected (is); -+ } - -- camel_imapx_job_unref (job); -+ g_mutex_unlock (&is->priv->idle_lock); - -- return success; -+ return mailbox; - } - - gboolean --camel_imapx_server_unsubscribe_mailbox (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- GCancellable *cancellable, -- GError **error) -+camel_imapx_server_schedule_idle_sync (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error) - { -- CamelIMAPXJob *job; -- MailboxData *data; -- gboolean success; -- - g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ if (mailbox) -+ g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); - -- /* Avoid camel_imapx_job_set_mailbox() here. We -- * don't want to select the mailbox to be unsubscribed. */ -- -- data = g_slice_new0 (MailboxData); -- data->mailbox = g_object_ref (mailbox); -+ if (!camel_imapx_server_stop_idle_sync (is, cancellable, error)) -+ return FALSE; - -- job = camel_imapx_job_new (cancellable); -- job->type = IMAPX_JOB_UNSUBSCRIBE_MAILBOX; -- job->start = imapx_job_unsubscribe_mailbox_start; -- job->pri = IMAPX_PRIORITY_MAILBOX_MGMT; -+ if (!camel_imapx_server_can_use_idle (is)) -+ return TRUE; - -- camel_imapx_job_set_data ( -- job, data, (GDestroyNotify) mailbox_data_free); -+ g_mutex_lock (&is->priv->idle_lock); - -- success = imapx_submit_job (is, job, error); -+ if (is->priv->idle_state != IMAPX_IDLE_STATE_OFF) { -+ g_warn_if_fail (is->priv->idle_state == IMAPX_IDLE_STATE_OFF); - -- camel_imapx_job_unref (job); -+ g_mutex_unlock (&is->priv->idle_lock); - -- return success; --} -+ return FALSE; -+ } - --gboolean --camel_imapx_server_update_quota_info (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- GCancellable *cancellable, -- GError **error) --{ -- CamelIMAPXJob *job; -- gboolean success; -+ g_warn_if_fail (is->priv->idle_cancellable == NULL); - -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), FALSE); -+ is->priv->idle_cancellable = g_cancellable_new (); -+ is->priv->idle_stamp++; - -- if (CAMEL_IMAPX_LACK_CAPABILITY (is->cinfo, QUOTA)) { -- g_set_error_literal ( -- error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, -- _("IMAP server does not support quotas")); -- return FALSE; -+ if (is->priv->idle_pending) { -+ g_source_destroy (is->priv->idle_pending); -+ g_source_unref (is->priv->idle_pending); - } - -- job = camel_imapx_job_new (cancellable); -- job->type = IMAPX_JOB_UPDATE_QUOTA_INFO; -- job->start = imapx_job_update_quota_info_start; -- job->pri = IMAPX_PRIORITY_UPDATE_QUOTA_INFO; -- -- camel_imapx_job_set_mailbox (job, mailbox); -+ g_clear_object (&is->priv->idle_mailbox); -+ if (mailbox) -+ is->priv->idle_mailbox = g_object_ref (mailbox); - -- success = imapx_submit_job (is, job, error); -+ is->priv->idle_state = IMAPX_IDLE_STATE_SCHEDULED; -+ is->priv->idle_pending = g_timeout_source_new_seconds (IMAPX_IDLE_WAIT_SECONDS); -+ g_source_set_callback ( -+ is->priv->idle_pending, imapx_server_run_idle_thread_cb, -+ imapx_weak_ref_new (is), (GDestroyNotify) imapx_weak_ref_free); -+ g_source_attach (is->priv->idle_pending, NULL); - -- camel_imapx_job_unref (job); -+ g_mutex_unlock (&is->priv->idle_lock); - -- return success; -+ return TRUE; - } - --GPtrArray * --camel_imapx_server_uid_search (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox, -- const gchar *criteria, -- GCancellable *cancellable, -- GError **error) -+static void -+imapx_server_wait_idle_stop_cancelled_cb (GCancellable *cancellable, -+ gpointer user_data) - { -- CamelIMAPXJob *job; -- SearchData *data; -- GPtrArray *results = NULL; -+ CamelIMAPXServer *is = user_data; - -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); -- g_return_val_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox), NULL); -- g_return_val_if_fail (criteria != NULL, NULL); -- -- data = g_slice_new0 (SearchData); -- data->criteria = g_strdup (criteria); -- -- job = camel_imapx_job_new (cancellable); -- job->type = IMAPX_JOB_UID_SEARCH; -- job->start = imapx_job_uid_search_start; -- job->pri = IMAPX_PRIORITY_SEARCH; -+ g_return_if_fail (CAMEL_IS_IMAPX_SERVER (is)); - -- camel_imapx_job_set_mailbox (job, mailbox); -+ g_mutex_lock (&is->priv->idle_lock); -+ g_cond_broadcast (&is->priv->idle_cond); -+ g_mutex_unlock (&is->priv->idle_lock); -+} - -- camel_imapx_job_set_data ( -- job, data, (GDestroyNotify) search_data_free); -+gboolean -+camel_imapx_server_stop_idle_sync (CamelIMAPXServer *is, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ GCancellable *idle_cancellable; -+ gulong handler_id = 0; -+ gboolean success = TRUE; - -- if (imapx_submit_job (is, job, error)) { -- guint ii; -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); - -- /* Convert the numeric UIDs to strings. */ -+ g_mutex_lock (&is->priv->idle_lock); - -- g_return_val_if_fail (data->results != NULL, NULL); -+ if (is->priv->idle_state == IMAPX_IDLE_STATE_OFF) { -+ g_mutex_unlock (&is->priv->idle_lock); -+ return TRUE; -+ } else if (is->priv->idle_state == IMAPX_IDLE_STATE_SCHEDULED) { -+ if (is->priv->idle_pending) { -+ g_source_destroy (is->priv->idle_pending); -+ g_source_unref (is->priv->idle_pending); -+ is->priv->idle_pending = NULL; -+ } - -- results = g_ptr_array_new_full ( -- data->results->len, -- (GDestroyNotify) camel_pstring_free); -+ is->priv->idle_state = IMAPX_IDLE_STATE_OFF; -+ g_cond_broadcast (&is->priv->idle_cond); -+ } - -- for (ii = 0; ii < data->results->len; ii++) { -- const gchar *pooled_uid; -- guint64 numeric_uid; -- gchar *alloced_uid; -+ idle_cancellable = is->priv->idle_cancellable ? g_object_ref (is->priv->idle_cancellable) : NULL; - -- numeric_uid = g_array_index ( -- data->results, guint64, ii); -- alloced_uid = g_strdup_printf ( -- "%" G_GUINT64_FORMAT, numeric_uid); -- pooled_uid = camel_pstring_add (alloced_uid, TRUE); -- g_ptr_array_add (results, (gpointer) pooled_uid); -- } -- } -+ g_clear_object (&is->priv->idle_cancellable); -+ g_clear_object (&is->priv->idle_mailbox); -+ is->priv->idle_stamp++; - -- camel_imapx_job_unref (job); -+ if (cancellable) { -+ g_mutex_unlock (&is->priv->idle_lock); - -- return results; --} -+ /* Do not hold the idle_lock here, because the callback can be called -+ immediately, which leads to a deadlock inside it. */ -+ handler_id = g_cancellable_connect (cancellable, G_CALLBACK (imapx_server_wait_idle_stop_cancelled_cb), is, NULL); - --gboolean --camel_imapx_server_folder_name_in_jobs (CamelIMAPXServer *imapx_server, -- const gchar *folder_path) --{ -- gboolean res; -+ g_mutex_lock (&is->priv->idle_lock); -+ } - -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (imapx_server), FALSE); -- g_return_val_if_fail (folder_path != NULL, FALSE); -+ while (is->priv->idle_state == IMAPX_IDLE_STATE_PREPARING && -+ !g_cancellable_is_cancelled (cancellable)) { -+ g_cond_wait (&is->priv->idle_cond, &is->priv->idle_lock); -+ } - -- g_mutex_lock (&imapx_server->priv->jobs_prop_lock); -+ if (is->priv->idle_state == IMAPX_IDLE_STATE_RUNNING && -+ !g_cancellable_is_cancelled (cancellable)) { -+ is->priv->idle_state = IMAPX_IDLE_STATE_STOPPING; -+ g_cond_broadcast (&is->priv->idle_cond); -+ g_mutex_unlock (&is->priv->idle_lock); - -- res = GPOINTER_TO_INT (g_hash_table_lookup (imapx_server->priv->jobs_prop_folder_paths, folder_path)) > 0; -+ g_mutex_lock (&is->priv->stream_lock); -+ if (is->priv->output_stream) { -+ gint previous_timeout = -1; - -- g_mutex_unlock (&imapx_server->priv->jobs_prop_lock); -+ /* Set the connection timeout to some short time, no need to wait for it for too long */ -+ if (is->priv->connection) -+ previous_timeout = imapx_server_set_connection_timeout (is->priv->connection, 5); -+ -+ success = g_output_stream_flush (is->priv->output_stream, cancellable, error); -+ success = success && g_output_stream_write_all (is->priv->output_stream, "DONE\r\n", 6, NULL, cancellable, error); -+ success = success && g_output_stream_flush (is->priv->output_stream, cancellable, error); - -- return res; --} -+ if (previous_timeout >= 0 && is->priv->connection) -+ imapx_server_set_connection_timeout (is->priv->connection, previous_timeout); -+ } else { -+ success = FALSE; - --gboolean --camel_imapx_server_has_expensive_command (CamelIMAPXServer *imapx_server) --{ -- gboolean res; -+ /* This message won't get into UI. */ -+ g_set_error_literal (error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT, -+ "Reconnect after couldn't issue DONE command"); -+ } -+ g_mutex_unlock (&is->priv->stream_lock); -+ g_mutex_lock (&is->priv->idle_lock); -+ } - -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (imapx_server), FALSE); -+ while (success && is->priv->idle_state != IMAPX_IDLE_STATE_OFF && -+ !g_cancellable_is_cancelled (cancellable)) { -+ g_cond_wait (&is->priv->idle_cond, &is->priv->idle_lock); -+ } - -- g_mutex_lock (&imapx_server->priv->jobs_prop_lock); -+ g_mutex_unlock (&is->priv->idle_lock); - -- res = imapx_server->priv->jobs_prop_expensive_command_count > 0; -+ if (cancellable && handler_id) -+ g_cancellable_disconnect (cancellable, handler_id); - -- g_mutex_unlock (&imapx_server->priv->jobs_prop_lock); -+ if (success && g_cancellable_is_cancelled (cancellable)) { -+ g_clear_error (error); - -- return res; --} -+ success = FALSE; - --gint --camel_imapx_server_get_command_count (CamelIMAPXServer *imapx_server) --{ -- guint32 res; -+ /* This message won't get into UI. */ -+ g_set_error_literal (error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT, -+ "Reconnect after cancelled IDLE stop command"); -+ } - -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (imapx_server), -1); -+ if (!success) { -+ if (idle_cancellable) -+ g_cancellable_cancel (idle_cancellable); - -- g_mutex_lock (&imapx_server->priv->jobs_prop_lock); -+ g_mutex_lock (&is->priv->idle_lock); -+ is->priv->idle_state = IMAPX_IDLE_STATE_OFF; -+ g_mutex_unlock (&is->priv->idle_lock); - -- res = imapx_server->priv->jobs_prop_command_count; -+ imapx_disconnect (is); -+ } - -- g_mutex_unlock (&imapx_server->priv->jobs_prop_lock); -+ g_clear_object (&idle_cancellable); - -- return res; -+ return success; - } - - /** -@@ -9670,210 +6561,77 @@ camel_imapx_server_register_untagged_han - return previous; - } - --/** -- * camel_imapx_server_is_job_in_queue: -- * @imapx_server: a #CamelIMAPXServer instance -- * @mailbox: a mailbox to search job for -- * @job_type: a job type specifier to search for -- * @uid: optional message UID for which the job might be searched -- * -- * Searches queue of jobs for the particular job. The returned job -- * is referenced for thread safety, unref it with camel_imapx_job_unref(). -- * -- * Returns: %NULL, if such job could not be found, or a referenced job. -- **/ --CamelIMAPXJob * --camel_imapx_server_ref_job (CamelIMAPXServer *imapx_server, -- CamelIMAPXMailbox *mailbox, -- guint32 job_type, -- const gchar *uid) -+/* This function is not thread-safe. */ -+const struct _capability_info * -+camel_imapx_server_get_capability_info (CamelIMAPXServer *is) - { -- GList *head, *link; -- CamelIMAPXJob *job = NULL; -- gboolean found = FALSE; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (imapx_server), NULL); -- -- QUEUE_LOCK (imapx_server); -- -- head = g_queue_peek_head_link (&imapx_server->jobs); -- -- for (link = head; link != NULL; link = g_list_next (link)) { -- job = (CamelIMAPXJob *) link->data; -- -- if (!job || !(job->type & job_type)) -- continue; -- -- if (camel_imapx_job_matches (job, mailbox, uid)) { -- found = TRUE; -- camel_imapx_job_ref (job); -- break; -- } -- } -- -- QUEUE_UNLOCK (imapx_server); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); - -- return found ? job : NULL; -+ return is->priv->cinfo; - } - --/** -- * camel_imapx_server_shutdown: -- * @is: a #CamelIMAPXServer -- * @error: a #GError with which cancel any pending jobs -- * -- * Signals the server to shut down command processing. A #CamelIMAPXStore -- * should call this immediately before unreferencing its server instance. -- * Note, the server instance may linger a short time after this function -- * returns as its own worker threads finish. -- * -- * Since: 3.12 -- **/ --void --camel_imapx_server_shutdown (CamelIMAPXServer *is, -- const GError *error) -+gboolean -+camel_imapx_server_have_capability (CamelIMAPXServer *is, -+ guint32 capability) - { -- GCancellable *cancellable; -- GError *shutdown_error_copy = NULL; -- -- g_return_if_fail (CAMEL_IS_IMAPX_SERVER (is)); -- -- QUEUE_LOCK (is); -- -- is->state = IMAPX_SHUTDOWN; -- -- cancellable = g_weak_ref_get (&is->priv->parser_cancellable); -- -- QUEUE_UNLOCK (is); -- -- if (!error) { -- shutdown_error_copy = imapx_server_dup_shutdown_error (is); -- error = shutdown_error_copy; -- } -- -- if (error) { -- imapx_abort_all_commands (is, error); -- } else { -- GError *local_error = NULL; -+ gboolean have; - -- g_set_error ( -- &local_error, CAMEL_SERVICE_ERROR, -- CAMEL_SERVICE_ERROR_UNAVAILABLE, -- "Shutting down"); -- -- imapx_abort_all_commands (is, local_error); -- -- g_clear_error (&local_error); -- } -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); - -- g_main_loop_quit (is->priv->idle_main_loop); -- g_main_loop_quit (is->priv->parser_main_loop); -+ g_mutex_lock (&is->priv->stream_lock); -+ have = is->priv->cinfo != NULL && (is->priv->cinfo->capa & capability) != 0; -+ g_mutex_unlock (&is->priv->stream_lock); - -- g_cancellable_cancel (cancellable); -- g_clear_object (&cancellable); -- g_clear_error (&shutdown_error_copy); -+ return have; - } - --static const gchar * --imapx_server_get_job_type_name (CamelIMAPXJob *job) -+gboolean -+camel_imapx_server_lack_capability (CamelIMAPXServer *is, -+ guint32 capability) - { -- if (!job) -- return "[null]"; -+ gboolean lack; - -- switch (job->type) { -- case IMAPX_JOB_GET_MESSAGE: -- return "GET_MESSAGE"; -- case IMAPX_JOB_APPEND_MESSAGE: -- return "APPEND_MESSAGE"; -- case IMAPX_JOB_COPY_MESSAGE: -- return "COPY_MESSAGE"; -- case IMAPX_JOB_FETCH_NEW_MESSAGES: -- return "FETCH_NEW_MESSAGES"; -- case IMAPX_JOB_REFRESH_INFO: -- return "REFRESH_INFO"; -- case IMAPX_JOB_SYNC_CHANGES: -- return "SYNC_CHANGES"; -- case IMAPX_JOB_EXPUNGE: -- return "EXPUNGE"; -- case IMAPX_JOB_NOOP: -- return "NOOP"; -- case IMAPX_JOB_IDLE: -- return "IDLE"; -- case IMAPX_JOB_LIST: -- return "LIST"; -- case IMAPX_JOB_CREATE_MAILBOX: -- return "CREATE_MAILBOX"; -- case IMAPX_JOB_DELETE_MAILBOX: -- return "DELETE_MAILBOX"; -- case IMAPX_JOB_RENAME_MAILBOX: -- return "RENAME_MAILBOX"; -- case IMAPX_JOB_SUBSCRIBE_MAILBOX: -- return "SUBSCRIBE_MAILBOX"; -- case IMAPX_JOB_UNSUBSCRIBE_MAILBOX: -- return "UNSUBSCRIBE_MAILBOX"; -- case IMAPX_JOB_UPDATE_QUOTA_INFO: -- return "UPDATE_QUOTA_INFO"; -- case IMAPX_JOB_UID_SEARCH: -- return "UID_SEARCH"; -- } -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE); -+ -+ g_mutex_lock (&is->priv->stream_lock); -+ lack = is->priv->cinfo != NULL && (is->priv->cinfo->capa & capability) == 0; -+ g_mutex_unlock (&is->priv->stream_lock); - -- return "???"; -+ return lack; - } - --static void --imapx_server_dump_one_queue (CamelIMAPXCommandQueue *queue, -- const gchar *queue_name) -+gchar -+camel_imapx_server_get_tagprefix (CamelIMAPXServer *is) - { -- GList *iter; -- gint ii; -- -- g_return_if_fail (queue != NULL); -- g_return_if_fail (queue_name != NULL); -- -- if (camel_imapx_command_queue_is_empty (queue)) -- return; -- -- printf (" Content of '%s':\n", queue_name); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), 0); - -- for (ii = 0, iter = camel_imapx_command_queue_peek_head_link (queue); iter != NULL; iter = g_list_next (iter), ii++) { -- CamelIMAPXCommand *ic = iter->data; -- CamelIMAPXJob *job = camel_imapx_command_get_job (ic); -- -- printf (" [%d] command:%p for job:%p (type:0x%x %s)\n", ii, ic, job, job ? job->type : 0, imapx_server_get_job_type_name (job)); -- } -+ return is->priv->tagprefix; - } - --/* for debugging purposes only */ - void --camel_imapx_server_dump_queue_status (CamelIMAPXServer *imapx_server) -+camel_imapx_server_set_tagprefix (CamelIMAPXServer *is, -+ gchar tagprefix) - { -- g_return_if_fail (CAMEL_IS_IMAPX_SERVER (imapx_server)); -- -- QUEUE_LOCK (imapx_server); -+ g_return_if_fail (CAMEL_IS_IMAPX_SERVER (is)); -+ g_return_if_fail ((tagprefix >= 'A' && tagprefix <= 'Z') || (tagprefix >= 'a' && tagprefix <= 'z')); - -- printf (" Queue status for server %p: jobs:%d queued:%d active:%d done:%d\n", imapx_server, -- g_queue_get_length (&imapx_server->jobs), -- camel_imapx_command_queue_get_length (imapx_server->queue), -- camel_imapx_command_queue_get_length (imapx_server->active), -- camel_imapx_command_queue_get_length (imapx_server->done)); -+ is->priv->tagprefix = tagprefix; -+} - -- if (!g_queue_is_empty (&imapx_server->jobs)) { -- GList *iter; -- gint ii; -+CamelIMAPXCommand * -+camel_imapx_server_ref_current_command (CamelIMAPXServer *is) -+{ -+ CamelIMAPXCommand *command; - -- printf (" Content of 'jobs':\n"); -+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), NULL); - -- for (ii = 0, iter = g_queue_peek_head_link (&imapx_server->jobs); iter != NULL; iter = g_list_next (iter), ii++) { -- CamelIMAPXJob *job = iter->data; -+ COMMAND_LOCK (is); - -- printf (" [%d] job:%p (type:0x%x %s) with pending commands:%d\n", ii, job, job ? job->type : 0, -- imapx_server_get_job_type_name (job), -- job ? g_atomic_int_get (&job->commands) : -1); -- } -- } -+ command = is->priv->current_command; -+ if (command) -+ camel_imapx_command_ref (command); - -- imapx_server_dump_one_queue (imapx_server->queue, "queue"); -- imapx_server_dump_one_queue (imapx_server->active, "active"); -- imapx_server_dump_one_queue (imapx_server->done, "done"); -+ COMMAND_UNLOCK (is); - -- QUEUE_UNLOCK (imapx_server); -+ return command; - } -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.h.imapx-update-to-upstream 2014-11-07 08:34:59.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.h 2016-08-15 13:52:41.974976329 +0200 -@@ -2,17 +2,18 @@ - /* - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * -- * This library is free software; you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . -+ * - */ - - #ifndef CAMEL_IMAPX_SERVER_H -@@ -105,37 +106,14 @@ struct _CamelIMAPXUntaggedRespHandlerDes - struct _CamelIMAPXServer { - GObject parent; - CamelIMAPXServerPrivate *priv; -- -- /* Info about the current connection */ -- struct _capability_info *cinfo; -- -- /* incoming jobs */ -- GQueue jobs; -- -- gchar tagprefix; -- gint state : 4; -- -- /* Current command/work queue. All commands are stored in one list, -- * all the time, so they can be cleaned up in exception cases */ -- GRecMutex queue_lock; -- CamelIMAPXCommand *literal; -- CamelIMAPXCommandQueue *queue; -- CamelIMAPXCommandQueue *active; -- CamelIMAPXCommandQueue *done; -- -- gboolean use_qresync; - }; - - struct _CamelIMAPXServerClass { - GObjectClass parent_class; - - /* Signals */ -- void (*mailbox_select) (CamelIMAPXServer *is, -+ void (*refresh_mailbox) (CamelIMAPXServer *is, - CamelIMAPXMailbox *mailbox); -- void (*mailbox_closed) (CamelIMAPXServer *is, -- CamelIMAPXMailbox *mailbox); -- void (*shutdown) (CamelIMAPXServer *is, -- const GError *error); - }; - - GType camel_imapx_server_get_type (void); -@@ -151,57 +129,100 @@ GOutputStream * camel_imapx_server_ref_o - (CamelIMAPXServer *is); - CamelIMAPXMailbox * - camel_imapx_server_ref_selected (CamelIMAPXServer *is); --gboolean camel_imapx_server_connect (CamelIMAPXServer *is, -+CamelIMAPXMailbox * -+ camel_imapx_server_ref_pending_or_selected -+ (CamelIMAPXServer *is); -+const struct _capability_info * -+ camel_imapx_server_get_capability_info -+ (CamelIMAPXServer *is); -+gboolean camel_imapx_server_have_capability -+ (CamelIMAPXServer *is, -+ guint32 capability); -+gboolean camel_imapx_server_lack_capability -+ (CamelIMAPXServer *is, -+ guint32 capability); -+gchar camel_imapx_server_get_tagprefix -+ (CamelIMAPXServer *is); -+void camel_imapx_server_set_tagprefix -+ (CamelIMAPXServer *is, -+ gchar tagprefix); -+CamelIMAPXCommand * -+ camel_imapx_server_ref_current_command -+ (CamelIMAPXServer *is); -+gboolean camel_imapx_server_connect_sync (CamelIMAPXServer *is, - GCancellable *cancellable, - GError **error); --gboolean imapx_connect_to_server (CamelIMAPXServer *is, -+gboolean camel_imapx_server_disconnect_sync -+ (CamelIMAPXServer *is, - GCancellable *cancellable, - GError **error); - gboolean camel_imapx_server_is_connected (CamelIMAPXServer *imapx_server); - CamelAuthenticationResult -- camel_imapx_server_authenticate (CamelIMAPXServer *is, -+ camel_imapx_server_authenticate_sync -+ (CamelIMAPXServer *is, - const gchar *mechanism, - GCancellable *cancellable, - GError **error); --void camel_imapx_server_shutdown (CamelIMAPXServer *is, -- const GError *error); --gboolean camel_imapx_server_list (CamelIMAPXServer *is, -+gboolean camel_imapx_server_query_auth_types_sync -+ (CamelIMAPXServer *is, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_server_mailbox_selected -+ (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox); -+gboolean camel_imapx_server_ensure_selected_sync -+ (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_server_process_command_sync -+ (CamelIMAPXServer *is, -+ CamelIMAPXCommand *ic, -+ const gchar *error_prefix, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_server_list_sync (CamelIMAPXServer *is, - const gchar *pattern, - CamelStoreGetFolderInfoFlags flags, - GCancellable *cancellable, - GError **error); --CamelFolderChangeInfo * -- camel_imapx_server_refresh_info (CamelIMAPXServer *is, -+gboolean camel_imapx_server_refresh_info_sync -+ (CamelIMAPXServer *is, - CamelIMAPXMailbox *mailbox, - GCancellable *cancellable, - GError **error); --gboolean camel_imapx_server_sync_changes (CamelIMAPXServer *is, -+gboolean camel_imapx_server_sync_changes_sync -+ (CamelIMAPXServer *is, - CamelIMAPXMailbox *mailbox, -+ gboolean can_influence_flags, - GCancellable *cancellable, - GError **error); --gboolean camel_imapx_server_expunge (CamelIMAPXServer *is, -+gboolean camel_imapx_server_expunge_sync (CamelIMAPXServer *is, - CamelIMAPXMailbox *mailbox, - GCancellable *cancellable, - GError **error); --gboolean camel_imapx_server_noop (CamelIMAPXServer *is, -+gboolean camel_imapx_server_noop_sync (CamelIMAPXServer *is, - CamelIMAPXMailbox *mailbox, - GCancellable *cancellable, - GError **error); --CamelStream * camel_imapx_server_get_message (CamelIMAPXServer *is, -+CamelStream * camel_imapx_server_get_message_sync -+ (CamelIMAPXServer *is, - CamelIMAPXMailbox *mailbox, - CamelFolderSummary *summary, - CamelDataCache *message_cache, - const gchar *message_uid, - GCancellable *cancellable, - GError **error); --gboolean camel_imapx_server_copy_message (CamelIMAPXServer *is, -+gboolean camel_imapx_server_copy_message_sync -+ (CamelIMAPXServer *is, - CamelIMAPXMailbox *mailbox, - CamelIMAPXMailbox *destination, - GPtrArray *uids, - gboolean delete_originals, -+ gboolean remove_deleted_flags, - GCancellable *cancellable, - GError **error); --gboolean camel_imapx_server_append_message -+gboolean camel_imapx_server_append_message_sync - (CamelIMAPXServer *is, - CamelIMAPXMailbox *mailbox, - CamelFolderSummary *summary, -@@ -211,70 +232,73 @@ gboolean camel_imapx_server_append_messa - gchar **append_uid, - GCancellable *cancellable, - GError **error); --gboolean camel_imapx_server_sync_message (CamelIMAPXServer *is, -+gboolean camel_imapx_server_sync_message_sync -+ (CamelIMAPXServer *is, - CamelIMAPXMailbox *mailbox, - CamelFolderSummary *summary, - CamelDataCache *message_cache, - const gchar *message_uid, - GCancellable *cancellable, - GError **error); --gboolean camel_imapx_server_create_mailbox -+gboolean camel_imapx_server_create_mailbox_sync - (CamelIMAPXServer *is, - const gchar *mailbox_name, - GCancellable *cancellable, - GError **error); --gboolean camel_imapx_server_delete_mailbox -+gboolean camel_imapx_server_delete_mailbox_sync - (CamelIMAPXServer *is, - CamelIMAPXMailbox *mailbox, - GCancellable *cancellable, - GError **error); --gboolean camel_imapx_server_rename_mailbox -+gboolean camel_imapx_server_rename_mailbox_sync - (CamelIMAPXServer *is, - CamelIMAPXMailbox *mailbox, - const gchar *new_mailbox_name, - GCancellable *cancellable, - GError **error); --gboolean camel_imapx_server_subscribe_mailbox -+gboolean camel_imapx_server_subscribe_mailbox_sync - (CamelIMAPXServer *is, - CamelIMAPXMailbox *mailbox, - GCancellable *cancellable, - GError **error); --gboolean camel_imapx_server_unsubscribe_mailbox -+gboolean camel_imapx_server_unsubscribe_mailbox_sync - (CamelIMAPXServer *is, - CamelIMAPXMailbox *mailbox, - GCancellable *cancellable, - GError **error); --gboolean camel_imapx_server_update_quota_info -+gboolean camel_imapx_server_update_quota_info_sync - (CamelIMAPXServer *is, - CamelIMAPXMailbox *mailbox, - GCancellable *cancellable, - GError **error); --GPtrArray * camel_imapx_server_uid_search (CamelIMAPXServer *is, -+GPtrArray * camel_imapx_server_uid_search_sync -+ (CamelIMAPXServer *is, - CamelIMAPXMailbox *mailbox, -- const gchar *criteria, -+ const gchar *criteria_prefix, -+ const gchar *search_key, -+ const gchar * const *words, - GCancellable *cancellable, - GError **error); --gboolean camel_imapx_server_folder_name_in_jobs -- (CamelIMAPXServer *imapx_server, -- const gchar *folder_path); --gboolean camel_imapx_server_has_expensive_command -- (CamelIMAPXServer *imapx_server); --gint camel_imapx_server_get_command_count -- (CamelIMAPXServer *imapx_server); -+gboolean camel_imapx_server_can_use_idle (CamelIMAPXServer *is); -+gboolean camel_imapx_server_is_in_idle (CamelIMAPXServer *is); -+CamelIMAPXMailbox * -+ camel_imapx_server_ref_idle_mailbox -+ (CamelIMAPXServer *is); -+gboolean camel_imapx_server_schedule_idle_sync -+ (CamelIMAPXServer *is, -+ CamelIMAPXMailbox *mailbox, -+ GCancellable *cancellable, -+ GError **error); -+gboolean camel_imapx_server_stop_idle_sync -+ (CamelIMAPXServer *is, -+ GCancellable *cancellable, -+ GError **error); -+ - const CamelIMAPXUntaggedRespHandlerDesc * - camel_imapx_server_register_untagged_handler - (CamelIMAPXServer *is, - const gchar *untagged_response, - const CamelIMAPXUntaggedRespHandlerDesc *desc); --struct _CamelIMAPXJob * -- camel_imapx_server_ref_job (CamelIMAPXServer *imapx_server, -- CamelIMAPXMailbox *mailbox, -- guint32 job_type, -- const gchar *uid); -- --/* for debugging purposes only */ --void camel_imapx_server_dump_queue_status -- (CamelIMAPXServer *imapx_server); - G_END_DECLS - - #endif /* CAMEL_IMAPX_SERVER_H */ -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-settings.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-settings.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-settings.c.imapx-update-to-upstream 2014-12-02 16:09:44.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-settings.c 2016-08-15 13:52:41.974976329 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-settings.c - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -@@ -31,9 +31,9 @@ struct _CamelIMAPXSettingsPrivate { - gchar *real_trash_path; - gchar *shell_command; - -- guint batch_fetch_count; - guint concurrent_connections; - -+ gboolean use_multi_fetch; - gboolean check_all; - gboolean check_subscribed; - gboolean filter_all; -@@ -55,7 +55,7 @@ struct _CamelIMAPXSettingsPrivate { - enum { - PROP_0, - PROP_AUTH_MECHANISM, -- PROP_BATCH_FETCH_COUNT, -+ PROP_USE_MULTI_FETCH, - PROP_CHECK_ALL, - PROP_CHECK_SUBSCRIBED, - PROP_CONCURRENT_CONNECTIONS, -@@ -102,10 +102,10 @@ imapx_settings_set_property (GObject *ob - g_value_get_string (value)); - return; - -- case PROP_BATCH_FETCH_COUNT: -- camel_imapx_settings_set_batch_fetch_count ( -+ case PROP_USE_MULTI_FETCH: -+ camel_imapx_settings_set_use_multi_fetch ( - CAMEL_IMAPX_SETTINGS (object), -- g_value_get_uint (value)); -+ g_value_get_boolean (value)); - return; - - case PROP_CHECK_ALL: -@@ -270,10 +270,10 @@ imapx_settings_get_property (GObject *ob - CAMEL_NETWORK_SETTINGS (object))); - return; - -- case PROP_BATCH_FETCH_COUNT: -- g_value_set_uint ( -+ case PROP_USE_MULTI_FETCH: -+ g_value_set_boolean ( - value, -- camel_imapx_settings_get_batch_fetch_count ( -+ camel_imapx_settings_get_use_multi_fetch ( - CAMEL_IMAPX_SETTINGS (object))); - return; - -@@ -487,14 +487,12 @@ camel_imapx_settings_class_init (CamelIM - - g_object_class_install_property ( - object_class, -- PROP_BATCH_FETCH_COUNT, -- g_param_spec_uint ( -- "batch-fetch-count", -- "Batch Fetch Count", -- "Number of envelopes to fetch at once", -- 0, -- G_MAXUINT, -- 500, -+ PROP_USE_MULTI_FETCH, -+ g_param_spec_boolean ( -+ "use-multi-fetch", -+ "Use Multi Fetch", -+ "Whether allow downloading of large messages in chunks", -+ FALSE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); -@@ -776,50 +774,46 @@ camel_imapx_settings_init (CamelIMAPXSet - } - - /** -- * camel_imapx_settings_get_batch_fetch_count: -+ * camel_imapx_settings_get_use_multi_fetch: - * @settings: a #CamelIMAPXSettings - * -- * Returns the number of message envelopes to fetch at once. -- * -- * This is a tunable performance parameter and probably should not be -- * exposed in a graphical user interface. -+ * Returns whether large messages can be downloaded in chunks. -+ * The default is %TRUE, but some server can be slower when -+ * the messages are downloaded in parts, rather than in one call. - * -- * Returns: number of message envelopes to fetch at once -+ * Returns: whether large messages can be downloaded in chunks - * -- * Since: 3.2 -+ * Since: 3.20 - **/ - guint --camel_imapx_settings_get_batch_fetch_count (CamelIMAPXSettings *settings) -+camel_imapx_settings_get_use_multi_fetch (CamelIMAPXSettings *settings) - { - g_return_val_if_fail (CAMEL_IS_IMAPX_SETTINGS (settings), 0); - -- return settings->priv->batch_fetch_count; -+ return settings->priv->use_multi_fetch; - } - - /** -- * camel_imapx_settings_set_batch_fetch_count: -+ * camel_imapx_settings_set_use_multi_fetch: - * @settings: a #CamelIMAPXSettings -- * @batch_fetch_count: number of message envelopes to fetch at once -+ * @use_multi_fetch: whether can download large messages in chunks - * -- * Sets the number of message envelopes to fetch at once. -+ * Sets whether can download large messages in chunks. - * -- * This is a tunable performance parameter and probably should not be -- * exposed in a graphical user interface. -- * -- * Since: 3.2 -+ * Since: 3.20 - **/ - void --camel_imapx_settings_set_batch_fetch_count (CamelIMAPXSettings *settings, -- guint batch_fetch_count) -+camel_imapx_settings_set_use_multi_fetch (CamelIMAPXSettings *settings, -+ guint use_multi_fetch) - { - g_return_if_fail (CAMEL_IS_IMAPX_SETTINGS (settings)); - -- if (settings->priv->batch_fetch_count == batch_fetch_count) -+ if (settings->priv->use_multi_fetch == use_multi_fetch) - return; - -- settings->priv->batch_fetch_count = batch_fetch_count; -+ settings->priv->use_multi_fetch = use_multi_fetch; - -- g_object_notify (G_OBJECT (settings), "batch-fetch-count"); -+ g_object_notify (G_OBJECT (settings), "use-multi-fetch"); - } - - /** -@@ -915,7 +909,7 @@ camel_imapx_settings_set_check_subscribe - * - * Returns: the number of concurrent connections to use - * -- * Since: 3.14 -+ * Since: 3.16 - **/ - guint - camel_imapx_settings_get_concurrent_connections (CamelIMAPXSettings *settings) -@@ -937,7 +931,7 @@ camel_imapx_settings_get_concurrent_conn - * @concurrent_connections value will be clamped to these limits if - * necessary. - * -- * Since: 3.14 -+ * Since: 3.16 - **/ - void - camel_imapx_settings_set_concurrent_connections (CamelIMAPXSettings *settings, -@@ -1563,7 +1557,7 @@ camel_imapx_settings_set_use_namespace ( - * - * Returns: whether to ignore namespace for other users - * -- * Since: 3.12.9 -+ * Since: 3.16 - **/ - gboolean - camel_imapx_settings_get_ignore_other_users_namespace (CamelIMAPXSettings *settings) -@@ -1580,7 +1574,7 @@ camel_imapx_settings_get_ignore_other_us - * - * Sets whether to ignore other users namespace. - * -- * Since: 3.12.9 -+ * Since: 3.16 - **/ - void - camel_imapx_settings_set_ignore_other_users_namespace (CamelIMAPXSettings *settings, -@@ -1604,7 +1598,7 @@ camel_imapx_settings_set_ignore_other_us - * - * Returns: whether to ignore namespace for shared folders - * -- * Since: 3.12.9 -+ * Since: 3.16 - **/ - gboolean - camel_imapx_settings_get_ignore_shared_folders_namespace (CamelIMAPXSettings *settings) -@@ -1621,7 +1615,7 @@ camel_imapx_settings_get_ignore_shared_f - * - * Sets whether to ignore shared folders namespace. - * -- * Since: 3.12.9 -+ * Since: 3.16 - **/ - void - camel_imapx_settings_set_ignore_shared_folders_namespace (CamelIMAPXSettings *settings, -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-settings.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-settings.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-settings.h.imapx-update-to-upstream 2014-12-02 16:07:55.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-settings.h 2016-08-15 13:52:41.974976329 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-settings.h - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -@@ -55,11 +55,11 @@ struct _CamelIMAPXSettingsClass { - }; - - GType camel_imapx_settings_get_type (void) G_GNUC_CONST; --guint camel_imapx_settings_get_batch_fetch_count -+guint camel_imapx_settings_get_use_multi_fetch - (CamelIMAPXSettings *settings); --void camel_imapx_settings_set_batch_fetch_count -+void camel_imapx_settings_set_use_multi_fetch - (CamelIMAPXSettings *settings, -- guint batch_fetch_count); -+ guint use_multi_fetch); - gboolean camel_imapx_settings_get_check_all - (CamelIMAPXSettings *settings); - void camel_imapx_settings_set_check_all -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-status-response.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-status-response.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-status-response.c.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-status-response.c 2016-08-15 13:52:41.975976329 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-status-response.c - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -@@ -134,7 +134,7 @@ camel_imapx_status_response_new (CamelIM - goto fail; - if (tok != '(') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "status: expecting '('"); - goto fail; - } -@@ -199,7 +199,7 @@ camel_imapx_status_response_new (CamelIM - - default: - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "unknown status attribute"); - success = FALSE; - break; -@@ -218,7 +218,7 @@ camel_imapx_status_response_new (CamelIM - - if (tok != ')') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "status: expecting ')' or attribute"); - goto fail; - } -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-status-response.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-status-response.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-status-response.h.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-status-response.h 2016-08-15 13:52:41.975976329 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-status-response.h - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c.imapx-update-to-upstream 2016-08-15 13:52:41.918976332 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.c 2016-08-15 13:52:41.977976329 +0200 -@@ -1,21 +1,21 @@ - /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ --/* camel-imap-store.c : class for a imap store */ --/* -- * Authors: Michael Zucchi -+/* camel-imap-store.c : class for a imap store - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * -- * This library is free software; you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . -+ * -+ * Authors: Michael Zucchi - */ - - #ifdef HAVE_CONFIG_H -@@ -59,7 +59,7 @@ - #define e(...) camel_imapx_debug(extra, __VA_ARGS__) - - struct _CamelIMAPXStorePrivate { -- CamelIMAPXConnManager *con_man; -+ CamelIMAPXConnManager *conn_man; - - CamelIMAPXServer *connecting_server; - gboolean is_concurrent_connection; -@@ -88,7 +88,8 @@ struct _CamelIMAPXStorePrivate { - enum { - PROP_0, - PROP_CONNECTABLE, -- PROP_HOST_REACHABLE -+ PROP_HOST_REACHABLE, -+ PROP_CONN_MANAGER - }; - - enum { -@@ -660,6 +661,13 @@ imapx_store_get_property (GObject *objec - camel_network_service_get_host_reachable ( - CAMEL_NETWORK_SERVICE (object))); - return; -+ -+ case PROP_CONN_MANAGER: -+ g_value_set_object ( -+ value, -+ camel_imapx_store_get_conn_manager ( -+ CAMEL_IMAPX_STORE (object))); -+ return; - } - - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -@@ -672,9 +680,9 @@ imapx_store_dispose (GObject *object) - - /* Force disconnect so we don't have it run later, - * after we've cleaned up some stuff. */ -- if (imapx_store->priv->con_man != NULL) { -+ if (imapx_store->priv->conn_man != NULL) { - camel_service_disconnect_sync (CAMEL_SERVICE (imapx_store), FALSE, NULL, NULL); -- g_clear_object (&imapx_store->priv->con_man); -+ g_clear_object (&imapx_store->priv->conn_man); - } - - if (imapx_store->priv->settings_notify_handler_id > 0) { -@@ -771,17 +779,14 @@ imapx_connect_sync (CamelService *servic - GError **error) - { - CamelIMAPXStore *imapx_store; -- CamelIMAPXServer *imapx_server; -- gboolean success; -- -- imapx_store = CAMEL_IMAPX_STORE (service); - -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, error); -- success = imapx_server != NULL; -+ /* Chain up to parent's method. */ -+ if (!CAMEL_SERVICE_CLASS (camel_imapx_store_parent_class)->connect_sync (service, cancellable, error)) -+ return FALSE; - -- g_clear_object (&imapx_server); -+ imapx_store = CAMEL_IMAPX_STORE (service); - -- return success; -+ return camel_imapx_conn_manager_connect_sync (imapx_store->priv->conn_man, cancellable, error); - } - - static gboolean -@@ -794,8 +799,8 @@ imapx_disconnect_sync (CamelService *ser - - priv = CAMEL_IMAPX_STORE_GET_PRIVATE (service); - -- if (priv->con_man != NULL) -- camel_imapx_conn_manager_close_connections (priv->con_man, NULL); -+ if (priv->conn_man != NULL) -+ camel_imapx_conn_manager_disconnect_sync (priv->conn_man, cancellable, error); - - g_mutex_lock (&priv->server_lock); - -@@ -803,7 +808,8 @@ imapx_disconnect_sync (CamelService *ser - - g_mutex_unlock (&priv->server_lock); - -- return TRUE; -+ /* Chain up to parent's method. */ -+ return CAMEL_SERVICE_CLASS (camel_imapx_store_parent_class)->disconnect_sync (service, clean, cancellable, error); - } - - static CamelAuthenticationResult -@@ -818,12 +824,24 @@ imapx_authenticate_sync (CamelService *s - - priv = CAMEL_IMAPX_STORE_GET_PRIVATE (service); - -+ if (g_cancellable_set_error_if_cancelled (cancellable, error)) -+ return CAMEL_AUTHENTICATION_ERROR; -+ - /* This should have been set for us by connect_sync(). */ - g_mutex_lock (&priv->server_lock); -+ if (!priv->connecting_server) { -+ g_mutex_unlock (&priv->server_lock); -+ -+ g_set_error_literal (error, CAMEL_SERVICE_ERROR, CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE, -+ _("No IMAPx connection object provided")); -+ -+ return CAMEL_AUTHENTICATION_ERROR; -+ } -+ - imapx_server = g_object_ref (priv->connecting_server); - g_mutex_unlock (&priv->server_lock); - -- result = camel_imapx_server_authenticate ( -+ result = camel_imapx_server_authenticate_sync ( - imapx_server, mechanism, cancellable, error); - - g_clear_object (&imapx_server); -@@ -851,28 +869,32 @@ imapx_query_auth_types_sync (CamelServic - GList *sasl_types = NULL; - GList *t, *next; - CamelIMAPXServer *server; -+ const struct _capability_info *cinfo; - - imapx_store = CAMEL_IMAPX_STORE (service); - - server = camel_imapx_server_new (imapx_store); -- server->tagprefix = 'Z'; -+ camel_imapx_server_set_tagprefix (server, 'Z'); -+ -+ g_signal_emit_by_name (imapx_store->priv->conn_man, "connection-created", 0, server); - -- if (!imapx_connect_to_server (server, cancellable, error)) -+ if (!camel_imapx_server_query_auth_types_sync (server, cancellable, error)) - goto exit; - -+ cinfo = camel_imapx_server_get_capability_info (server); -+ - sasl_types = camel_sasl_authtype_list (FALSE); - for (t = sasl_types; t; t = next) { - authtype = t->data; - next = t->next; - -- if (!server->cinfo || !g_hash_table_lookup (server->cinfo->auth_types, authtype->authproto)) { -+ if (!cinfo || !g_hash_table_lookup (cinfo->auth_types, authtype->authproto)) { - sasl_types = g_list_remove_link (sasl_types, t); - g_list_free_1 (t); - } - } - -- sasl_types = g_list_prepend ( -- sasl_types, &camel_imapx_password_authtype); -+ sasl_types = g_list_prepend (sasl_types, &camel_imapx_password_authtype); - - exit: - g_object_unref (server); -@@ -1003,6 +1025,7 @@ static CamelFolderInfo * - get_folder_info_offline (CamelStore *store, - const gchar *top, - CamelStoreGetFolderInfoFlags flags, -+ GCancellable *cancellable, - GError **error) - { - CamelIMAPXStore *imapx_store = CAMEL_IMAPX_STORE (store); -@@ -1013,8 +1036,36 @@ get_folder_info_offline (CamelStore *sto - GPtrArray *folders; - GPtrArray *array; - gboolean use_subscriptions; -+ gint top_len; - guint ii; - -+ if (g_strcmp0 (top, CAMEL_VTRASH_NAME) == 0 || -+ g_strcmp0 (top, CAMEL_VJUNK_NAME) == 0) { -+ CamelFolder *vfolder; -+ -+ vfolder = camel_store_get_folder_sync (store, top, 0, cancellable, error); -+ if (!vfolder) -+ return NULL; -+ -+ fi = imapx_store_build_folder_info (imapx_store, top, 0); -+ fi->unread = camel_folder_summary_get_unread_count (vfolder->summary); -+ fi->total = camel_folder_summary_get_saved_count (vfolder->summary); -+ -+ if (g_strcmp0 (top, CAMEL_VTRASH_NAME) == 0) -+ fi->flags = (fi->flags & ~CAMEL_FOLDER_TYPE_MASK) | -+ CAMEL_FOLDER_VIRTUAL | -+ CAMEL_FOLDER_VTRASH | -+ CAMEL_FOLDER_TYPE_TRASH; -+ else -+ fi->flags = (fi->flags & ~CAMEL_FOLDER_TYPE_MASK) | -+ CAMEL_FOLDER_VIRTUAL | -+ CAMEL_FOLDER_TYPE_JUNK; -+ -+ g_object_unref (vfolder); -+ -+ return fi; -+ } -+ - service = CAMEL_SERVICE (store); - - settings = camel_service_ref_settings (service); -@@ -1033,6 +1084,8 @@ get_folder_info_offline (CamelStore *sto - top = ""; - } - -+ top_len = strlen (top); -+ - /* folder_info_build will insert parent nodes as necessary and mark - * them as noselect, which is information we actually don't have at - * the moment. So let it do the right thing by bailing out if it's -@@ -1053,7 +1106,8 @@ get_folder_info_offline (CamelStore *sto - /* Filter by folder path. */ - si_is_match = - (include_inbox && si_is_inbox) || -- g_str_has_prefix (folder_path, top); -+ (g_str_has_prefix (folder_path, top) && (top_len == 0 || -+ !folder_path[top_len] || folder_path[top_len] == '/')); - - if (!si_is_match) - continue; -@@ -1093,8 +1147,7 @@ get_folder_info_offline (CamelStore *sto - g_clear_object (&mailbox); - } - -- fi = imapx_store_build_folder_info ( -- imapx_store, folder_path, 0); -+ fi = imapx_store_build_folder_info (imapx_store, folder_path, 0); - fi->unread = si->unread; - fi->total = si->total; - if ((fi->flags & CAMEL_FOLDER_TYPE_MASK) != 0) -@@ -1118,6 +1171,19 @@ get_folder_info_offline (CamelStore *sto - if (!fi->child) - fi->flags |= CAMEL_FOLDER_NOCHILDREN; - -+ if (fi->unread == -1 && fi->total == -1) { -+ CamelIMAPXMailbox *mailbox; -+ -+ mailbox = camel_imapx_store_ref_mailbox (imapx_store, ((CamelIMAPXStoreInfo *) si)->mailbox_name); -+ -+ if (mailbox) { -+ fi->unread = camel_imapx_mailbox_get_unseen (mailbox); -+ fi->total = camel_imapx_mailbox_get_messages (mailbox); -+ } -+ -+ g_clear_object (&mailbox); -+ } -+ - g_ptr_array_add (folders, fi); - } - -@@ -1155,7 +1221,7 @@ collect_folder_info_for_list (CamelIMAPX - } - - static gboolean --fetch_folder_info_for_pattern (CamelIMAPXServer *server, -+fetch_folder_info_for_pattern (CamelIMAPXConnManager *conn_man, - CamelIMAPXNamespace *namespace, - const gchar *pattern, - CamelStoreGetFolderInfoFlags flags, -@@ -1168,22 +1234,9 @@ fetch_folder_info_for_pattern (CamelIMAP - GError *local_error = NULL; - gboolean success; - -- g_object_ref (server); -- -- imapx_store = camel_imapx_server_ref_store (server); -- -- success = camel_imapx_server_list (server, pattern, flags, cancellable, &local_error); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&server); -- -- server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, &local_error); -- if (server) -- success = camel_imapx_server_list (server, pattern, flags, cancellable, &local_error); -- } -+ imapx_store = camel_imapx_conn_manager_ref_store (conn_man); - -- g_clear_object (&server); -+ success = camel_imapx_conn_manager_list_sync (conn_man, pattern, flags, cancellable, &local_error); - - if (!success) { - g_clear_object (&imapx_store); -@@ -1220,34 +1273,18 @@ fetch_folder_info_for_pattern (CamelIMAP - } - - static gboolean --fetch_folder_info_for_inbox (CamelIMAPXServer *server, -+fetch_folder_info_for_inbox (CamelIMAPXConnManager *conn_man, - CamelStoreGetFolderInfoFlags flags, - GHashTable *folder_info_results, - GCancellable *cancellable, - GError **error) - { - CamelIMAPXStore *imapx_store; -- GError *local_error = NULL; - gboolean success; - -- g_object_ref (server); -- imapx_store = camel_imapx_server_ref_store (server); -- -- success = camel_imapx_server_list (server, "INBOX", flags, cancellable, &local_error); -+ imapx_store = camel_imapx_conn_manager_ref_store (conn_man); - -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&server); -- -- server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, &local_error); -- if (server) -- success = camel_imapx_server_list (server, "INBOX", flags, cancellable, &local_error); -- } -- -- g_clear_object (&server); -- -- if (local_error) -- g_propagate_error (error, local_error); -+ success = camel_imapx_conn_manager_list_sync (conn_man, "INBOX", flags, cancellable, error); - - if (success) { - CamelIMAPXMailbox *mailbox; -@@ -1266,7 +1303,7 @@ fetch_folder_info_for_inbox (CamelIMAPXS - - static gboolean - fetch_folder_info_for_namespace_category (CamelIMAPXStore *imapx_store, -- CamelIMAPXServer *server, -+ CamelIMAPXConnManager *conn_man, - CamelIMAPXNamespaceCategory category, - CamelStoreGetFolderInfoFlags flags, - GHashTable *folder_info_results, -@@ -1298,7 +1335,7 @@ fetch_folder_info_for_namespace_category - pattern = g_strdup_printf ("%s*", ns_prefix); - - success = fetch_folder_info_for_pattern ( -- server, namespace, pattern, flags, -+ conn_man, namespace, pattern, flags, - folder_info_results, cancellable, error); - - g_free (pattern); -@@ -1316,7 +1353,7 @@ fetch_folder_info_for_namespace_category - - static gboolean - fetch_folder_info_from_folder_path (CamelIMAPXStore *imapx_store, -- CamelIMAPXServer *server, -+ CamelIMAPXConnManager *conn_man, - const gchar *folder_path, - CamelStoreGetFolderInfoFlags flags, - GHashTable *folder_info_results, -@@ -1354,7 +1391,7 @@ fetch_folder_info_from_folder_path (Came - pattern = g_strdup_printf ("%s*", utf7_mailbox_name); - - success = fetch_folder_info_for_pattern ( -- server, namespace, pattern, flags, -+ conn_man, namespace, pattern, flags, - folder_info_results, cancellable, error); - - g_free (pattern); -@@ -1490,14 +1527,12 @@ sync_folders (CamelIMAPXStore *imapx_sto - GCancellable *cancellable, - GError **error) - { -- CamelIMAPXServer *server; -+ CamelIMAPXConnManager *conn_man; - GHashTable *folder_info_results; - gboolean update_folder_list; - gboolean success; - -- server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, error); -- if (server == NULL) -- return FALSE; -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); - - /* mailbox name -> CamelFolderInfo */ - folder_info_results = g_hash_table_new_full ( -@@ -1520,13 +1555,13 @@ sync_folders (CamelIMAPXStore *imapx_sto - - if (root_folder_path != NULL && *root_folder_path != '\0') { - success = fetch_folder_info_from_folder_path ( -- imapx_store, server, root_folder_path, flags, -+ imapx_store, conn_man, root_folder_path, flags, - folder_info_results, cancellable, error); - } else { - gboolean have_folder_info_for_inbox; - - success = fetch_folder_info_for_namespace_category ( -- imapx_store, server, CAMEL_IMAPX_NAMESPACE_PERSONAL, flags | -+ imapx_store, conn_man, CAMEL_IMAPX_NAMESPACE_PERSONAL, flags | - (update_folder_list ? CAMEL_STORE_FOLDER_INFO_SUBSCRIBED : 0), - folder_info_results, cancellable, error); - -@@ -1538,7 +1573,7 @@ sync_folders (CamelIMAPXStore *imapx_sto - * then LIST it explicitly. */ - if (success && !have_folder_info_for_inbox) - success = fetch_folder_info_for_inbox ( -- server, flags, folder_info_results, -+ conn_man, flags, folder_info_results, - cancellable, error); - } - -@@ -1588,8 +1623,6 @@ sync_folders (CamelIMAPXStore *imapx_sto - exit: - g_hash_table_destroy (folder_info_results); - -- g_object_unref (server); -- - return success; - } - -@@ -1606,7 +1639,7 @@ imapx_refresh_finfo (CamelSession *sessi - display_name = camel_service_get_display_name (service); - - camel_operation_push_message ( -- cancellable, _("Retrieving folder list for %s"), -+ cancellable, _("Retrieving folder list for '%s'"), - display_name); - - if (!camel_offline_store_get_online (CAMEL_OFFLINE_STORE (store))) -@@ -1628,42 +1661,30 @@ static void - discover_inbox (CamelIMAPXStore *imapx_store, - GCancellable *cancellable) - { -- CamelIMAPXServer *imapx_server; -+ CamelIMAPXConnManager *conn_man; - CamelIMAPXMailbox *mailbox = NULL; - const gchar *attribute; - -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, NULL); -- -- if (imapx_server == NULL) -- return; -- -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); - mailbox = camel_imapx_store_ref_mailbox (imapx_store, "INBOX"); - - if (mailbox == NULL) -- goto exit; -+ return; - - attribute = CAMEL_IMAPX_LIST_ATTR_SUBSCRIBED; - if (!camel_imapx_mailbox_has_attribute (mailbox, attribute)) { - GError *local_error = NULL; - gboolean success; - -- success = camel_imapx_server_subscribe_mailbox (imapx_server, mailbox, cancellable, &local_error); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, &local_error); -- if (imapx_server) -- success = camel_imapx_server_subscribe_mailbox (imapx_server, mailbox, cancellable, &local_error); -+ success = camel_imapx_conn_manager_subscribe_mailbox_sync (conn_man, mailbox, cancellable, &local_error); -+ if (!success && !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { -+ g_warning ("%s: Failed to subscribe INBOX: %s", G_STRFUNC, local_error ? local_error->message : "Unknown error"); - } - - g_clear_error (&local_error); - } - --exit: - g_clear_object (&mailbox); -- g_clear_object (&imapx_server); - } - - static gboolean -@@ -1699,6 +1720,16 @@ imapx_can_refresh_folder (CamelStore *st - res = store_class->can_refresh_folder (store, info, &local_error) || - check_all || (check_subscribed && subscribed); - -+ if (!res && !local_error) { -+ CamelFolder *folder; -+ -+ folder = camel_store_get_folder_sync (store, info->full_name, 0, NULL, &local_error); -+ if (folder && CAMEL_IS_IMAPX_FOLDER (folder)) -+ res = camel_imapx_folder_get_check_folder (CAMEL_IMAPX_FOLDER (folder)); -+ -+ g_clear_object (&folder); -+ } -+ - if (local_error != NULL) - g_propagate_error (error, local_error); - -@@ -1818,7 +1849,7 @@ imapx_store_get_folder_info_sync (CamelS - g_mutex_lock (&imapx_store->priv->get_finfo_lock); - - if (!camel_offline_store_get_online (CAMEL_OFFLINE_STORE (store))) { -- fi = get_folder_info_offline (store, top, flags, error); -+ fi = get_folder_info_offline (store, top, flags, cancellable, error); - goto exit; - } - -@@ -1828,7 +1859,7 @@ imapx_store_get_folder_info_sync (CamelS - } - - /* XXX I don't know why the SUBSCRIBED flag matters here. */ -- if (!initial_setup && flags & CAMEL_STORE_FOLDER_INFO_SUBSCRIBED) { -+ if (!initial_setup && (flags & CAMEL_STORE_FOLDER_INFO_SUBSCRIBED) != 0) { - time_t time_since_last_refresh; - - time_since_last_refresh = -@@ -1836,24 +1867,29 @@ imapx_store_get_folder_info_sync (CamelS - - if (time_since_last_refresh > FINFO_REFRESH_INTERVAL) { - CamelSession *session; -+ gchar *description; - - imapx_store->priv->last_refresh_time = time (NULL); - - session = camel_service_ref_session (service); -+ if (session) { -+ description = g_strdup_printf (_("Retrieving folder list for '%s'"), camel_service_get_display_name (service)); - -- camel_session_submit_job ( -- session, (CamelSessionCallback) -- imapx_refresh_finfo, -- g_object_ref (store), -- (GDestroyNotify) g_object_unref); -+ camel_session_submit_job ( -+ session, /*description,*/ (CamelSessionCallback) -+ imapx_refresh_finfo, -+ g_object_ref (store), -+ (GDestroyNotify) g_object_unref); - -- g_object_unref (session); -+ g_object_unref (session); -+ g_free (description); -+ } - } - } - - /* Avoid server interaction if the FAST flag is set. */ - if (!initial_setup && flags & CAMEL_STORE_FOLDER_INFO_FAST) { -- fi = get_folder_info_offline (store, top, flags, error); -+ fi = get_folder_info_offline (store, top, flags, cancellable, error); - goto exit; - } - -@@ -1866,7 +1902,7 @@ imapx_store_get_folder_info_sync (CamelS - if (initial_setup && use_subscriptions) - discover_inbox (imapx_store, cancellable); - -- fi = get_folder_info_offline (store, top, flags, error); -+ fi = get_folder_info_offline (store, top, flags, cancellable, error); - - exit: - g_mutex_unlock (&imapx_store->priv->get_finfo_lock); -@@ -1980,7 +2016,7 @@ imapx_store_create_folder_sync (CamelSto - CamelIMAPXNamespaceResponse *namespace_response; - CamelIMAPXNamespace *namespace; - CamelIMAPXStore *imapx_store; -- CamelIMAPXServer *imapx_server; -+ CamelIMAPXConnManager *conn_man; - CamelFolder *folder; - CamelIMAPXMailbox *parent_mailbox = NULL; - CamelFolderInfo *fi = NULL; -@@ -1990,13 +2026,9 @@ imapx_store_create_folder_sync (CamelSto - gchar *mailbox_name = NULL; - gchar separator; - gboolean success; -- GError *local_error = NULL; - - imapx_store = CAMEL_IMAPX_STORE (store); -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, error); -- -- if (imapx_server == NULL) -- return NULL; -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); - - if (parent_name == NULL || *parent_name == '\0') - goto check_namespace; -@@ -2067,19 +2099,7 @@ check_separator: - /* This also LISTs the mailbox after creating it, which - * triggers the CamelIMAPXStore::mailbox-created signal - * and all the local processing that goes along with it. */ -- success = camel_imapx_server_create_mailbox (imapx_server, mailbox_name, cancellable, &local_error); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, &local_error); -- if (imapx_server) -- success = camel_imapx_server_create_mailbox (imapx_server, mailbox_name, cancellable, &local_error); -- } -- -- if (local_error) -- g_propagate_error (error, local_error); -+ success = camel_imapx_conn_manager_create_mailbox_sync (conn_man, mailbox_name, cancellable, error); - - if (success) { - fi = imapx_store_build_folder_info ( -@@ -2090,8 +2110,6 @@ check_separator: - exit: - g_free (mailbox_name); - -- g_clear_object (&imapx_server); -- - return fi; - } - -@@ -2103,10 +2121,9 @@ imapx_store_delete_folder_sync (CamelSto - { - CamelFolder *folder; - CamelIMAPXStore *imapx_store; -- CamelIMAPXServer *imapx_server; -+ CamelIMAPXConnManager *conn_man; - CamelIMAPXMailbox *mailbox = NULL; - gboolean success = FALSE; -- GError *local_error = NULL; - - folder = camel_store_get_folder_sync ( - store, folder_name, 0, cancellable, error); -@@ -2115,29 +2132,14 @@ imapx_store_delete_folder_sync (CamelSto - return FALSE; - - imapx_store = CAMEL_IMAPX_STORE (store); -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, error); -- -- if (imapx_server == NULL) -- goto exit; -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); - - mailbox = camel_imapx_folder_list_mailbox ( - CAMEL_IMAPX_FOLDER (folder), cancellable, error); - if (mailbox == NULL) - goto exit; - -- success = camel_imapx_server_delete_mailbox (imapx_server, mailbox, cancellable, &local_error); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, &local_error); -- if (imapx_server) -- success = camel_imapx_server_delete_mailbox (imapx_server, mailbox, cancellable, &local_error); -- } -- -- if (local_error) -- g_propagate_error (error, local_error); -+ success = camel_imapx_conn_manager_delete_mailbox_sync (conn_man, mailbox, cancellable, error); - - if (success) - imapx_delete_folder_from_cache (imapx_store, folder_name, TRUE); -@@ -2145,7 +2147,6 @@ imapx_store_delete_folder_sync (CamelSto - exit: - g_clear_object (&folder); - g_clear_object (&mailbox); -- g_clear_object (&imapx_server); - - return success; - } -@@ -2161,7 +2162,7 @@ imapx_store_rename_folder_sync (CamelSto - CamelService *service; - CamelSettings *settings; - CamelIMAPXStore *imapx_store; -- CamelIMAPXServer *imapx_server; -+ CamelIMAPXConnManager *conn_man; - CamelIMAPXMailbox *mailbox = NULL; - CamelIMAPXMailbox *cloned_mailbox; - gchar *new_mailbox_name = NULL; -@@ -2184,10 +2185,7 @@ imapx_store_rename_folder_sync (CamelSto - * in imapx_store_process_mailbox_attributes(). */ - g_atomic_int_inc (&imapx_store->priv->syncing_folders); - -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, error); -- -- if (imapx_server == NULL) -- goto exit; -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); - - folder = camel_store_get_folder_sync ( - store, old, 0, cancellable, error); -@@ -2208,30 +2206,11 @@ imapx_store_rename_folder_sync (CamelSto - new_mailbox_name = camel_imapx_folder_path_to_mailbox (new, separator); - - if (use_subscriptions) { -- success = camel_imapx_server_unsubscribe_mailbox (imapx_server, mailbox, cancellable, &local_error); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, &local_error); -- if (imapx_server) -- success = camel_imapx_server_unsubscribe_mailbox (imapx_server, mailbox, cancellable, &local_error); -- } -- -+ camel_imapx_conn_manager_unsubscribe_mailbox_sync (conn_man, mailbox, cancellable, &local_error); - g_clear_error (&local_error); - } - -- success = camel_imapx_server_rename_mailbox (imapx_server, mailbox, new_mailbox_name, cancellable, &local_error); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, &local_error); -- if (imapx_server) -- success = camel_imapx_server_rename_mailbox (imapx_server, mailbox, new_mailbox_name, cancellable, &local_error); -- } -+ success = camel_imapx_conn_manager_rename_mailbox_sync (conn_man, mailbox, new_mailbox_name, cancellable, &local_error); - - if (!success) { - if (local_error) -@@ -2241,19 +2220,14 @@ imapx_store_rename_folder_sync (CamelSto - if (use_subscriptions) { - gboolean success_2; - -- success_2 = camel_imapx_server_subscribe_mailbox (imapx_server, mailbox, cancellable, &local_error); -- -- while (!success_2 && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, &local_error); -- if (imapx_server) -- success_2 = camel_imapx_server_subscribe_mailbox (imapx_server, mailbox, cancellable, &local_error); -+ success_2 = camel_imapx_conn_manager_subscribe_mailbox_sync (conn_man, mailbox, cancellable, &local_error); -+ if (!success_2) { -+ g_warning ("%s: Failed to subscribe '%s': %s", G_STRFUNC, camel_imapx_mailbox_get_name (mailbox), -+ local_error ? local_error->message : "Unknown error"); - } -- - g_clear_error (&local_error); - } -+ - goto exit; - } - -@@ -2264,23 +2238,10 @@ imapx_store_rename_folder_sync (CamelSto - /* Create a cloned CamelIMAPXMailbox with the new mailbox name. */ - cloned_mailbox = camel_imapx_mailbox_clone (mailbox, new_mailbox_name); - -- camel_imapx_folder_set_mailbox ( -- CAMEL_IMAPX_FOLDER (folder), cloned_mailbox); -+ camel_imapx_folder_set_mailbox (CAMEL_IMAPX_FOLDER (folder), cloned_mailbox); - - if (use_subscriptions) { -- success = camel_imapx_server_subscribe_mailbox (imapx_server, cloned_mailbox, cancellable, &local_error); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, &local_error); -- if (imapx_server) -- success = camel_imapx_server_subscribe_mailbox (imapx_server, cloned_mailbox, cancellable, &local_error); -- } -- -- if (local_error) -- g_propagate_error (error, local_error); -+ success = camel_imapx_conn_manager_subscribe_mailbox_sync (conn_man, cloned_mailbox, cancellable, error); - } - - g_clear_object (&cloned_mailbox); -@@ -2289,15 +2250,322 @@ exit: - g_free (new_mailbox_name); - - g_clear_object (&mailbox); -- g_clear_object (&imapx_server); - -- /* This enabled CamelStore signal emissions -+ /* This enables CamelStore signal emissions - * in imapx_store_process_mailbox_attributes() again. */ - g_atomic_int_dec_and_test (&imapx_store->priv->syncing_folders); - - return success; - } - -+static gboolean -+imapx_is_gmail_server (CamelService *service) -+{ -+ CamelSettings *settings; -+ gboolean is_gmail = FALSE; -+ -+ g_return_val_if_fail (CAMEL_IS_SERVICE (service), FALSE); -+ -+ settings = camel_service_ref_settings (service); -+ if (CAMEL_IS_NETWORK_SETTINGS (settings)) { -+ gchar *host; -+ -+ host = camel_network_settings_dup_host (CAMEL_NETWORK_SETTINGS (settings)); -+ -+ is_gmail = host && ( -+ camel_strstrcase (host, ".gmail.com") != NULL || -+ camel_strstrcase (host, ".googlemail.com") != NULL); -+ -+ g_free (host); -+ } -+ -+ g_clear_object (&settings); -+ -+ return is_gmail; -+} -+ -+static gchar * -+imapx_find_folder_for_initial_setup (CamelFolderInfo *root, -+ const gchar *path) -+{ -+ CamelFolderInfo *finfo, *next; -+ gchar *folder_fullname = NULL; -+ gchar **path_parts; -+ gint ii; -+ -+ if (!root || !path) -+ return NULL; -+ -+ path_parts = g_strsplit (path, "/", -1); -+ if (!path_parts) -+ return NULL; -+ -+ finfo = root; -+ -+ for (ii = 0; path_parts[ii] && finfo; ii++) { -+ gchar *folded_path; -+ -+ folded_path = g_utf8_casefold (path_parts[ii], -1); -+ if (!folded_path) -+ break; -+ -+ for (next = NULL; finfo; finfo = finfo->next) { -+ gchar *folded_display_name; -+ gint cmp; -+ -+ if ((finfo->flags & (CAMEL_FOLDER_NOSELECT | CAMEL_FOLDER_VIRTUAL)) != 0) -+ continue; -+ -+ folded_display_name = g_utf8_casefold (finfo->display_name, -1); -+ if (!folded_display_name) -+ continue; -+ -+ cmp = g_utf8_collate (folded_path, folded_display_name); -+ -+ g_free (folded_display_name); -+ -+ if (cmp == 0) { -+ next = finfo; -+ break; -+ } -+ } -+ -+ g_free (folded_path); -+ -+ finfo = next; -+ if (finfo) { -+ if (path_parts[ii + 1]) -+ finfo = finfo->child; -+ else -+ folder_fullname = g_strdup (finfo->full_name); -+ } -+ } -+ -+ g_strfreev (path_parts); -+ -+ return folder_fullname; -+} -+ -+static void -+imapx_check_initial_setup_group (CamelIMAPXStore *imapx_store, -+ CamelFolderInfo *finfo, -+ GHashTable *save_setup, -+ const gchar *list_attribute, -+ const gchar *main_key, -+ const gchar *additional_key, -+ const gchar *additional_key_value, -+ const gchar **names, -+ guint n_names) -+{ -+ gchar *folder_fullname = NULL; -+ gint ii; -+ -+ g_return_if_fail (CAMEL_IS_IMAPX_STORE (imapx_store)); -+ g_return_if_fail (finfo != NULL); -+ g_return_if_fail (save_setup != NULL); -+ g_return_if_fail (main_key != NULL); -+ g_return_if_fail (names != NULL); -+ g_return_if_fail (n_names > 0); -+ -+ /* Prefer RFC 6154 "SPECIAL-USE" Flags, which are not locale sensitive */ -+ if (list_attribute) { -+ CamelIMAPXNamespaceResponse *namespace_response; -+ -+ namespace_response = camel_imapx_store_ref_namespaces (imapx_store); -+ if (namespace_response) { -+ GList *namespaces, *mailboxes, *link; -+ CamelIMAPXNamespace *user_namespace = NULL; -+ -+ namespaces = camel_imapx_namespace_response_list (namespace_response); -+ for (link = namespaces; link && !user_namespace; link = g_list_next (link)) { -+ CamelIMAPXNamespace *candidate = link->data; -+ -+ if (!candidate || camel_imapx_namespace_get_category (candidate) != CAMEL_IMAPX_NAMESPACE_PERSONAL) -+ continue; -+ -+ user_namespace = candidate; -+ } -+ -+ if (user_namespace) { -+ mailboxes = camel_imapx_store_list_mailboxes (imapx_store, user_namespace, NULL); -+ -+ for (link = mailboxes; link && !folder_fullname; link = g_list_next (link)) { -+ CamelIMAPXMailbox *mailbox = link->data; -+ -+ if (!mailbox || !camel_imapx_mailbox_has_attribute (mailbox, list_attribute)) -+ continue; -+ -+ folder_fullname = camel_imapx_mailbox_dup_folder_path (mailbox); -+ } -+ -+ g_list_free_full (mailboxes, g_object_unref); -+ } -+ -+ g_list_free_full (namespaces, g_object_unref); -+ g_object_unref (namespace_response); -+ } -+ } -+ -+ /* First check the folder names in the user's locale */ -+ for (ii = 0; ii < n_names && !folder_fullname; ii++) { -+ gchar *name; -+ -+ /* In the same level as the Inbox */ -+ folder_fullname = imapx_find_folder_for_initial_setup (finfo, g_dpgettext2 (GETTEXT_PACKAGE, "IMAPDefaults", names[ii])); -+ -+ if (folder_fullname) -+ break; -+ -+ /* as a subfolder of the Inbox */ -+ name = g_strconcat ("INBOX/", g_dpgettext2 (GETTEXT_PACKAGE, "IMAPDefaults", names[ii]), NULL); -+ folder_fullname = imapx_find_folder_for_initial_setup (finfo, name); -+ g_free (name); -+ } -+ -+ /* Then repeat with the english name (as written in the code) */ -+ for (ii = 0; ii < n_names && !folder_fullname; ii++) { -+ gchar *name; -+ -+ /* Do not try the same folder name twice */ -+ if (g_strcmp0 (g_dpgettext2 (GETTEXT_PACKAGE, "IMAPDefaults", names[ii]), names[ii]) == 0) -+ continue; -+ -+ folder_fullname = imapx_find_folder_for_initial_setup (finfo, names[ii]); -+ -+ if (folder_fullname) -+ break; -+ -+ name = g_strconcat ("INBOX/", names[ii], NULL); -+ folder_fullname = imapx_find_folder_for_initial_setup (finfo, name); -+ g_free (name); -+ } -+ -+ if (folder_fullname) { -+ g_hash_table_insert (save_setup, -+ g_strdup (main_key), -+ g_strdup (folder_fullname)); -+ -+ if (additional_key) { -+ g_hash_table_insert (save_setup, -+ g_strdup (additional_key), -+ g_strdup (additional_key_value)); -+ } -+ -+ g_free (folder_fullname); -+ } -+} -+ -+static gboolean -+imapx_initial_setup_sync (CamelStore *store, -+ GHashTable *save_setup, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ /* Translators: The strings in "IMAPDefaults" context are folder names as can be presented -+ by the server; There's checked for the localized version of it and for the non-localized -+ version as well. It's always the folder name (eventually path) as provided by the server, -+ when returned in given localization. it can be checked semi-easily in the case of -+ the GMail variants, by changing the GMail interface language in the GMail Preferences. */ -+ const gchar *draft_names[] = { -+ NC_("IMAPDefaults", "[Gmail]/Drafts"), -+ NC_("IMAPDefaults", "Drafts"), -+ NC_("IMAPDefaults", "Draft") -+ }; -+ const gchar *templates_names[] = { -+ NC_("IMAPDefaults", "Templates") -+ }; -+ #ifdef CAMEL_STORE_SETUP_ARCHIVE_FOLDER -+ const gchar *archive_names[] = { -+ NC_("IMAPDefaults", "Archive") -+ }; -+ #endif -+ const gchar *sent_names[] = { -+ NC_("IMAPDefaults", "[Gmail]/Sent Mail"), -+ NC_("IMAPDefaults", "Sent"), -+ NC_("IMAPDefaults", "Sent Items"), -+ NC_("IMAPDefaults", "Sent Messages") -+ }; -+ const gchar *junk_names[] = { -+ NC_("IMAPDefaults", "[Gmail]/Spam"), -+ NC_("IMAPDefaults", "Junk"), -+ NC_("IMAPDefaults", "Junk E-mail"), -+ NC_("IMAPDefaults", "Junk Email"), -+ NC_("IMAPDefaults", "Spam"), -+ NC_("IMAPDefaults", "Bulk Mail") -+ }; -+ const gchar *trash_names[] = { -+ NC_("IMAPDefaults", "[Gmail]/Trash"), -+ NC_("IMAPDefaults", "Trash"), -+ NC_("IMAPDefaults", "Deleted Items"), -+ NC_("IMAPDefaults", "Deleted Messages") -+ }; -+ -+ CamelIMAPXStore *imapx_store; -+ CamelFolderInfo *finfo; -+ GError *local_error = NULL; -+ -+ g_return_val_if_fail (CAMEL_IS_IMAPX_STORE (store), FALSE); -+ g_return_val_if_fail (save_setup != NULL, FALSE); -+ -+ finfo = camel_store_get_folder_info_sync (store, NULL, -+ CAMEL_STORE_FOLDER_INFO_RECURSIVE | CAMEL_STORE_FOLDER_INFO_NO_VIRTUAL, -+ cancellable, &local_error); -+ -+ if (!finfo) { -+ if (local_error) { -+ g_propagate_error (error, local_error); -+ return FALSE; -+ } -+ -+ return TRUE; -+ } -+ -+ imapx_store = CAMEL_IMAPX_STORE (store); -+ -+ imapx_check_initial_setup_group (imapx_store, finfo, save_setup, -+ CAMEL_IMAPX_LIST_ATTR_DRAFTS, -+ CAMEL_STORE_SETUP_DRAFTS_FOLDER, NULL, NULL, -+ draft_names, G_N_ELEMENTS (draft_names)); -+ -+ imapx_check_initial_setup_group (imapx_store, finfo, save_setup, NULL, -+ CAMEL_STORE_SETUP_TEMPLATES_FOLDER, NULL, NULL, -+ templates_names, G_N_ELEMENTS (templates_names)); -+ -+ #ifdef CAMEL_STORE_SETUP_ARCHIVE_FOLDER -+ imapx_check_initial_setup_group (imapx_store, finfo, save_setup, -+ CAMEL_IMAPX_LIST_ATTR_ARCHIVE, -+ CAMEL_STORE_SETUP_ARCHIVE_FOLDER, NULL, NULL, -+ archive_names, G_N_ELEMENTS (archive_names)); -+ #endif -+ -+ /* Skip changing Sent folder for GMail, because GMail stores sent messages -+ automatically, thus it would make doubled copies on the server. */ -+ if (!imapx_is_gmail_server (CAMEL_SERVICE (store))) { -+ imapx_check_initial_setup_group (imapx_store, finfo, save_setup, -+ CAMEL_IMAPX_LIST_ATTR_SENT, -+ CAMEL_STORE_SETUP_SENT_FOLDER, NULL, NULL, -+ sent_names, G_N_ELEMENTS (sent_names)); -+ } -+ -+ /* It's a folder path inside the account, thus not use the 'f' type, but the 's' type. */ -+ imapx_check_initial_setup_group (imapx_store, finfo, save_setup, -+ CAMEL_IMAPX_LIST_ATTR_JUNK, -+ "Backend:Imapx Backend:real-junk-path:s", -+ "Backend:Imapx Backend:use-real-junk-path:b", "true", -+ junk_names, G_N_ELEMENTS (junk_names)); -+ -+ /* It's a folder path inside the account, thus not use the 'f' type, but the 's' type. */ -+ imapx_check_initial_setup_group (imapx_store, finfo, save_setup, -+ CAMEL_IMAPX_LIST_ATTR_TRASH, -+ "Backend:Imapx Backend:real-trash-path:s", -+ "Backend:Imapx Backend:use-real-trash-path:b", "true", -+ trash_names, G_N_ELEMENTS (trash_names)); -+ -+ camel_folder_info_free (finfo); -+ -+ return TRUE; -+} -+ - static void - imapx_migrate_to_user_cache_dir (CamelService *service) - { -@@ -2341,7 +2609,7 @@ imapx_store_initable_init (GInitable *in - store = CAMEL_STORE (initable); - service = CAMEL_SERVICE (initable); - -- store->flags |= CAMEL_STORE_USE_CACHE_DIR; -+ store->flags |= CAMEL_STORE_USE_CACHE_DIR | CAMEL_STORE_SUPPORTS_INITIAL_SETUP; - imapx_migrate_to_user_cache_dir (service); - - /* Chain up to parent interface's init() method. */ -@@ -2460,6 +2728,8 @@ imapx_ensure_parents_subscribed (CamelIM - - /* Since this is a "fake" folder node, it is not selectable. */ - fi->flags |= CAMEL_FOLDER_NOSELECT; -+ fi->unread = -1; -+ fi->total = -1; - - parents = g_slist_prepend (parents, fi); - } -@@ -2470,6 +2740,9 @@ imapx_ensure_parents_subscribed (CamelIM - camel_subscribable_folder_subscribed (subscribable, fi); - camel_folder_info_free (fi); - } -+ -+ g_slist_free (parents); -+ g_free (parent); - } - - static gboolean -@@ -2480,16 +2753,12 @@ imapx_store_subscribe_folder_sync (Camel - { - CamelFolder *folder; - CamelIMAPXStore *imapx_store; -- CamelIMAPXServer *imapx_server; -+ CamelIMAPXConnManager *conn_man; - CamelIMAPXMailbox *mailbox = NULL; - gboolean success = FALSE; -- GError *local_error = NULL; - - imapx_store = CAMEL_IMAPX_STORE (subscribable); -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, error); -- -- if (imapx_server == NULL) -- goto exit; -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); - - folder = camel_store_get_folder_sync ( - CAMEL_STORE (subscribable), -@@ -2504,19 +2773,7 @@ imapx_store_subscribe_folder_sync (Camel - if (mailbox == NULL) - goto exit; - -- success = camel_imapx_server_subscribe_mailbox (imapx_server, mailbox, cancellable, &local_error); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, &local_error); -- if (imapx_server) -- success = camel_imapx_server_subscribe_mailbox (imapx_server, mailbox, cancellable, &local_error); -- } -- -- if (local_error) -- g_propagate_error (error, local_error); -+ success = camel_imapx_conn_manager_subscribe_mailbox_sync (conn_man, mailbox, cancellable, error); - - if (success) { - CamelFolderInfo *fi; -@@ -2532,7 +2789,6 @@ imapx_store_subscribe_folder_sync (Camel - - exit: - g_clear_object (&mailbox); -- g_clear_object (&imapx_server); - - return success; - } -@@ -2545,16 +2801,12 @@ imapx_store_unsubscribe_folder_sync (Cam - { - CamelFolder *folder; - CamelIMAPXStore *imapx_store; -- CamelIMAPXServer *imapx_server; -+ CamelIMAPXConnManager *conn_man; - CamelIMAPXMailbox *mailbox = NULL; - gboolean success = FALSE; -- GError *local_error = NULL; - - imapx_store = CAMEL_IMAPX_STORE (subscribable); -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, error); -- -- if (imapx_server == NULL) -- goto exit; -+ conn_man = camel_imapx_store_get_conn_manager (imapx_store); - - folder = camel_store_get_folder_sync ( - CAMEL_STORE (subscribable), -@@ -2569,19 +2821,7 @@ imapx_store_unsubscribe_folder_sync (Cam - if (mailbox == NULL) - goto exit; - -- success = camel_imapx_server_unsubscribe_mailbox (imapx_server, mailbox, cancellable, &local_error); -- -- while (!success && g_error_matches (local_error, CAMEL_IMAPX_SERVER_ERROR, CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT)) { -- g_clear_error (&local_error); -- g_clear_object (&imapx_server); -- -- imapx_server = camel_imapx_store_ref_server (imapx_store, NULL, FALSE, cancellable, &local_error); -- if (imapx_server) -- success = camel_imapx_server_unsubscribe_mailbox (imapx_server, mailbox, cancellable, &local_error); -- } -- -- if (local_error) -- g_propagate_error (error, local_error); -+ success = camel_imapx_conn_manager_unsubscribe_mailbox_sync (conn_man, mailbox, cancellable, error); - - if (success) { - CamelFolderInfo *fi; -@@ -2594,7 +2834,6 @@ imapx_store_unsubscribe_folder_sync (Cam - - exit: - g_clear_object (&mailbox); -- g_clear_object (&imapx_server); - - return success; - } -@@ -2677,11 +2916,23 @@ camel_imapx_store_class_init (CamelIMAPX - store_class->create_folder_sync = imapx_store_create_folder_sync; - store_class->delete_folder_sync = imapx_store_delete_folder_sync; - store_class->rename_folder_sync = imapx_store_rename_folder_sync; -+ store_class->initial_setup_sync = imapx_initial_setup_sync; - - class->mailbox_created = imapx_store_mailbox_created; - class->mailbox_renamed = imapx_store_mailbox_renamed; - class->mailbox_updated = imapx_store_mailbox_updated; - -+ g_object_class_install_property ( -+ object_class, -+ PROP_CONN_MANAGER, -+ g_param_spec_object ( -+ "conn-manager", -+ "Connection Manager", -+ "The Connection Manager being used for remote operations", -+ CAMEL_TYPE_IMAPX_CONN_MANAGER, -+ G_PARAM_READABLE | -+ G_PARAM_STATIC_STRINGS)); -+ - /* Inherited from CamelNetworkService. */ - g_object_class_override_property ( - object_class, -@@ -2751,7 +3002,7 @@ camel_imapx_store_init (CamelIMAPXStore - { - store->priv = CAMEL_IMAPX_STORE_GET_PRIVATE (store); - -- store->priv->con_man = camel_imapx_conn_manager_new (CAMEL_STORE (store)); -+ store->priv->conn_man = camel_imapx_conn_manager_new (CAMEL_STORE (store)); - - g_mutex_init (&store->priv->get_finfo_lock); - -@@ -2782,65 +3033,12 @@ camel_imapx_store_init (CamelIMAPXStore - G_CALLBACK (imapx_store_update_store_flags), NULL); - } - --/** -- * camel_imapx_store_ref_server: -- * @store: a #CamelIMAPXStore -- * @folder_name: name of a folder, for which it'll be used; can be %NULL -- * @cancellable: a #GCancellable to use ofr possible new connection creation, or %NULL -- * @error: return location for a #GError, or %NULL -- * -- * Returns the #CamelIMAPXServer for @store, if available. -- * -- * As a convenience, if the @store is not currently connected to an IMAP -- * server, the function sets @error to %CAMEL_SERVER_ERROR_UNAVAILABLE and -- * returns %NULL. If an operation can possibly be executed while offline, -- * pass %NULL for @error. -- * -- * The returned #CamelIMAPXServer is referenced for thread-safety and must -- * be unreferenced with g_object_unref() when finished with it. -- * -- * Returns: a #CamelIMAPXServer, or %NULL -- * -- * Since: 3.10 -- **/ --CamelIMAPXServer * --camel_imapx_store_ref_server (CamelIMAPXStore *store, -- const gchar *folder_name, -- gboolean for_expensive_job, -- GCancellable *cancellable, -- GError **error) -+CamelIMAPXConnManager * -+camel_imapx_store_get_conn_manager (CamelIMAPXStore *store) - { -- CamelIMAPXServer *server = NULL; -- CamelSession *session; -- GError *local_error = NULL; -- - g_return_val_if_fail (CAMEL_IS_IMAPX_STORE (store), NULL); - -- session = camel_service_ref_session (CAMEL_SERVICE (store)); -- -- if (camel_offline_store_get_online (CAMEL_OFFLINE_STORE (store)) && -- camel_session_get_online (session)) -- server = camel_imapx_conn_manager_get_connection ( -- store->priv->con_man, folder_name, for_expensive_job, cancellable, &local_error); -- -- g_clear_object (&session); -- -- if (!server && (!local_error || local_error->domain == G_RESOLVER_ERROR)) { -- if (!local_error) { -- g_set_error ( -- &local_error, CAMEL_SERVICE_ERROR, -- CAMEL_SERVICE_ERROR_UNAVAILABLE, -- _("You must be working online to complete this operation")); -- } else { -- local_error->domain = CAMEL_SERVICE_ERROR; -- local_error->code = CAMEL_SERVICE_ERROR_UNAVAILABLE; -- } -- } -- -- if (local_error) -- g_propagate_error (error, local_error); -- -- return server; -+ return store->priv->conn_man; - } - - /* The caller should hold the store->priv->server_lock already, when calling this */ -@@ -2881,19 +3079,6 @@ camel_imapx_store_is_connecting_concurre - return res; - } - --void --camel_imapx_store_folder_op_done (CamelIMAPXStore *store, -- CamelIMAPXServer *server, -- const gchar *folder_name) --{ -- g_return_if_fail (CAMEL_IS_IMAPX_STORE (store)); -- g_return_if_fail (CAMEL_IS_IMAPX_SERVER (server)); -- g_return_if_fail (folder_name != NULL); -- -- camel_imapx_conn_manager_update_con_info ( -- store->priv->con_man, server, folder_name); --} -- - /** - * camel_imapx_store_ref_namespaces: - * @imapx_store: a #CamelIMAPXStore -@@ -2908,7 +3093,7 @@ camel_imapx_store_folder_op_done (CamelI - * - * Returns: a #CamelIMAPXNamespaceResponse - * -- * Since: 3.12.2 -+ * Since: 3.16 - **/ - CamelIMAPXNamespaceResponse * - camel_imapx_store_ref_namespaces (CamelIMAPXStore *imapx_store) -@@ -3221,8 +3406,8 @@ imapx_store_rename_mailbox_unlocked (Cam - new_child_name = g_strconcat ( - new_mailbox_name, - old_child_name + old_mailbox_name_length, NULL); -- new_child = camel_imapx_mailbox_clone ( -- old_child, new_child_name); -+ -+ new_child = camel_imapx_mailbox_clone (old_child, new_child_name); - - /* Add the new mailbox, remove the old mailbox. - * Note we still have a reference on the old mailbox. */ -@@ -3254,7 +3439,7 @@ imapx_store_rename_mailbox_unlocked (Cam - * - * Returns: a #CamelIMAPXMailbox, or %NULL - * -- * Since: 3.12.2 -+ * Since: 3.16 - **/ - CamelIMAPXMailbox * - camel_imapx_store_ref_mailbox (CamelIMAPXStore *imapx_store, -@@ -3297,7 +3482,7 @@ camel_imapx_store_ref_mailbox (CamelIMAP - * - * Returns: a list of #CamelIMAPXMailbox instances - * -- * Since: 3.12.2 -+ * Since: 3.16 - **/ - GList * - camel_imapx_store_list_mailboxes (CamelIMAPXStore *imapx_store, -@@ -3377,7 +3562,7 @@ camel_imapx_store_handle_list_response ( - - /* Fabricate a CamelIMAPXNamespaceResponse if the server lacks the - * NAMESPACE capability and this is the first LIST / LSUB response. */ -- if (CAMEL_IMAPX_LACK_CAPABILITY (imapx_server->cinfo, NAMESPACE)) { -+ if (camel_imapx_server_lack_capability (imapx_server, IMAPX_CAPABILITY_NAMESPACE)) { - g_mutex_lock (&imapx_store->priv->namespaces_lock); - if (imapx_store->priv->namespaces == NULL) { - imapx_store->priv->namespaces = camel_imapx_namespace_response_faux_new (response); -@@ -3441,7 +3626,7 @@ camel_imapx_store_handle_lsub_response ( - - /* Fabricate a CamelIMAPXNamespaceResponse if the server lacks the - * NAMESPACE capability and this is the first LIST / LSUB response. */ -- if (CAMEL_IMAPX_LACK_CAPABILITY (imapx_server->cinfo, NAMESPACE)) { -+ if (camel_imapx_server_lack_capability (imapx_server, IMAPX_CAPABILITY_NAMESPACE)) { - g_mutex_lock (&imapx_store->priv->namespaces_lock); - if (imapx_store->priv->namespaces == NULL) { - imapx_store->priv->namespaces = camel_imapx_namespace_response_faux_new (response); -@@ -3512,41 +3697,11 @@ camel_imapx_store_set_quota_info (CamelI - g_mutex_unlock (&store->priv->quota_info_lock); - } - --/* Tries to find matching job among all active connections. -- See camel_imapx_server_ref_job() for more information on parameters -- and return values. --*/ --CamelIMAPXJob * --camel_imapx_store_ref_job (CamelIMAPXStore *imapx_store, -- CamelIMAPXMailbox *mailbox, -- guint32 job_type, -- const gchar *uid) --{ -- GList *servers, *siter; -- CamelIMAPXJob *job = NULL; -- -- g_return_val_if_fail (CAMEL_IS_IMAPX_STORE (imapx_store), NULL); -- -- servers = camel_imapx_conn_manager_get_connections (imapx_store->priv->con_man); -- -- for (siter = servers; siter; siter = g_list_next (siter)) { -- CamelIMAPXServer *imapx_server = siter->data; -- -- job = camel_imapx_server_ref_job (imapx_server, mailbox, job_type, uid); -- if (job) -- break; -- } -- -- g_list_free_full (servers, g_object_unref); -- -- return job; --} -- - /* for debugging purposes only */ - void - camel_imapx_store_dump_queue_status (CamelIMAPXStore *imapx_store) - { - g_return_if_fail (CAMEL_IS_IMAPX_STORE (imapx_store)); - -- camel_imapx_conn_manager_dump_queue_status (imapx_store->priv->con_man); -+ camel_imapx_conn_manager_dump_queue_status (imapx_store->priv->conn_man); - } -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.h.imapx-update-to-upstream 2014-05-22 08:45:46.000000000 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store.h 2016-08-15 13:52:41.977976329 +0200 -@@ -1,22 +1,21 @@ - /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ --/* camel-imap-store.h : class for an imap store */ -- --/* -- * Authors: Michael Zucchi -+/* camel-imap-store.h : class for an imap store - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * -- * This library is free software; you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . -+ * -+ * Authors: Michael Zucchi - */ - - #ifndef CAMEL_IMAPX_STORE_H -@@ -24,6 +23,7 @@ - - #include - -+#include "camel-imapx-conn-manager.h" - #include "camel-imapx-server.h" - - /* Standard GObject macros */ -@@ -75,22 +75,15 @@ struct _CamelIMAPXStoreClass { - }; - - GType camel_imapx_store_get_type (void); --CamelIMAPXServer * -- camel_imapx_store_ref_server (CamelIMAPXStore *store, -- const gchar *folder_name, -- gboolean for_expensive_job, -- GCancellable *cancellable, -- GError **error); -+CamelIMAPXConnManager * -+ camel_imapx_store_get_conn_manager -+ (CamelIMAPXStore *store); - void camel_imapx_store_set_connecting_server - (CamelIMAPXStore *store, - CamelIMAPXServer *server, - gboolean is_concurrent_connection); - gboolean camel_imapx_store_is_connecting_concurrent_connection - (CamelIMAPXStore *imapx_store); --void camel_imapx_store_folder_op_done -- (CamelIMAPXStore *store, -- CamelIMAPXServer *server, -- const gchar *folder_name); - CamelIMAPXNamespaceResponse * - camel_imapx_store_ref_namespaces - (CamelIMAPXStore *imapx_store); -@@ -127,12 +120,6 @@ void camel_imapx_store_set_quota_info - (CamelIMAPXStore *store, - const gchar *quota_root_name, - const CamelFolderQuotaInfo *info); --struct _CamelIMAPXJob * -- camel_imapx_store_ref_job (CamelIMAPXStore *imapx_store, -- CamelIMAPXMailbox *mailbox, -- guint32 job_type, -- const gchar *uid); -- - /* for debugging purposes only */ - void camel_imapx_store_dump_queue_status - (CamelIMAPXStore *imapx_store); -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store-summary.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store-summary.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store-summary.c.imapx-update-to-upstream 2016-08-15 13:52:41.873976333 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store-summary.c 2016-08-15 13:52:41.977976329 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-store-summary.c - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -@@ -57,7 +57,7 @@ namespace_load (FILE *in) - * delete all this cruft. */ - - for (j = 0; j < 3; j++) { -- gint32 i, n; -+ gint32 i, n = 0; - - if (camel_file_util_decode_fixed_int32 (in, &n) == -1) - goto exit; -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store-summary.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store-summary.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store-summary.h.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-store-summary.h 2016-08-15 13:52:41.977976329 +0200 -@@ -1,17 +1,17 @@ - /* - * camel-imapx-store-summary.h - * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . - * - */ - -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-summary.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-summary.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-summary.c.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-summary.c 2016-08-15 13:52:41.978976329 +0200 -@@ -2,21 +2,20 @@ - /* - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * -- * Authors: -- * Michael Zucchi -- * Dan Winship -- * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . -+ * -+ * Authors: Michael Zucchi -+ * Dan Winship - */ - - #ifdef HAVE_CONFIG_H -@@ -35,6 +34,13 @@ - - #define CAMEL_IMAPX_SUMMARY_VERSION (4) - -+enum { -+ INFO_CHANGED, -+ LAST_SIGNAL -+}; -+ -+static guint signals[LAST_SIGNAL]; -+ - G_DEFINE_TYPE ( - CamelIMAPXSummary, - camel_imapx_summary, -@@ -250,6 +256,15 @@ imapx_summary_message_info_clone (CamelF - return copy; - } - -+static void -+imapx_summary_emit_info_changed (CamelMessageInfo *info) -+{ -+ g_return_if_fail (info != NULL); -+ g_return_if_fail (CAMEL_IS_IMAPX_SUMMARY (info->summary)); -+ -+ g_signal_emit (info->summary, signals[INFO_CHANGED], 0, info); -+} -+ - static gboolean - imapx_summary_info_set_user_flag (CamelMessageInfo *info, - const gchar *id, -@@ -257,18 +272,43 @@ imapx_summary_info_set_user_flag (CamelM - { - gboolean changed; - -- /* Chain up to parent's info_set_user_flag() method. */ -- changed = CAMEL_FOLDER_SUMMARY_CLASS ( -- camel_imapx_summary_parent_class)-> -- info_set_user_flag (info, id, state); -+ /* Chain up to parent's method. */ -+ changed = CAMEL_FOLDER_SUMMARY_CLASS (camel_imapx_summary_parent_class)->info_set_user_flag (info, id, state); - -- /* there was a change, so do not forget to store it to server */ -- if (changed) { -- CamelIMAPXMessageInfo *imapx_info; -+ if (changed) -+ imapx_summary_emit_info_changed (info); - -- imapx_info = (CamelIMAPXMessageInfo *) info; -- imapx_info->info.flags |= CAMEL_MESSAGE_FOLDER_FLAGGED; -- } -+ return changed; -+} -+ -+static gboolean -+imapx_summary_info_set_user_tag (CamelMessageInfo *info, -+ const gchar *name, -+ const gchar *value) -+{ -+ gboolean changed; -+ -+ /* Chain up to parent's method. */ -+ changed = CAMEL_FOLDER_SUMMARY_CLASS (camel_imapx_summary_parent_class)->info_set_user_tag (info, name, value); -+ -+ if (changed) -+ imapx_summary_emit_info_changed (info); -+ -+ return changed; -+} -+ -+static gboolean -+imapx_summary_info_set_flags (CamelMessageInfo *info, -+ guint32 flags, -+ guint32 set) -+{ -+ gboolean changed; -+ -+ /* Chain up to parent's method. */ -+ changed = CAMEL_FOLDER_SUMMARY_CLASS (camel_imapx_summary_parent_class)->info_set_flags (info, flags, set); -+ -+ if (changed) -+ imapx_summary_emit_info_changed (info); - - return changed; - } -@@ -290,6 +330,17 @@ camel_imapx_summary_class_init (CamelIMA - folder_summary_class->message_info_free = imapx_summary_message_info_free; - folder_summary_class->message_info_clone = imapx_summary_message_info_clone; - folder_summary_class->info_set_user_flag = imapx_summary_info_set_user_flag; -+ folder_summary_class->info_set_user_tag = imapx_summary_info_set_user_tag; -+ folder_summary_class->info_set_flags = imapx_summary_info_set_flags; -+ -+ signals[INFO_CHANGED] = g_signal_new ( -+ "info-changed", -+ G_OBJECT_CLASS_TYPE (class), -+ G_SIGNAL_RUN_LAST, -+ 0 /* G_STRUCT_OFFSET (CamelIMAPXSummaryClass, info_changed) */, -+ NULL, NULL, NULL, -+ G_TYPE_NONE, 1, -+ G_TYPE_POINTER /* CamelMessageInfo * */); - } - - static void -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-summary.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-summary.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-summary.h.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-summary.h 2016-08-15 13:52:41.978976329 +0200 -@@ -1,21 +1,20 @@ - /* - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * -- * Authors: -- * Michael Zucchi -- * Dan Winship -- * -- * This library is free software you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . -+ * -+ * Authors: Michael Zucchi -+ * Dan Winship - */ - - #ifndef CAMEL_IMAPX_SUMMARY_H -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-utils.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-utils.c ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-utils.c.imapx-update-to-upstream 2016-08-15 13:52:41.873976333 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-utils.c 2016-08-15 14:38:22.158860220 +0200 -@@ -2,17 +2,18 @@ - /* - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * -- * This library is free software; you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . -+ * - */ - - #ifdef HAVE_CONFIG_H -@@ -123,7 +124,7 @@ imapx_parse_flags (CamelIMAPXInputStream - - if (tok != '(') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "expecting flag list"); - return FALSE; - } -@@ -152,12 +153,21 @@ imapx_parse_flags (CamelIMAPXInputStream - - if (!match_found && user_flagsp != NULL) { - const gchar *flag_name; -+ gchar *utf8; - - flag_name = rename_label_flag ( - (gchar *) token, - strlen ((gchar *) token), TRUE); - -- camel_flag_set (user_flagsp, flag_name, TRUE); -+ utf8 = camel_utf7_utf8 (flag_name); -+ if (utf8 && !g_utf8_validate (utf8, -1, NULL)) { -+ g_free (utf8); -+ utf8 = NULL; -+ } -+ -+ camel_flag_set (user_flagsp, utf8 ? utf8 : flag_name, TRUE); -+ -+ g_free (utf8); - } - - g_free (upper); -@@ -239,6 +249,7 @@ imapx_write_flags (GString *string, - - while (user_flags) { - const gchar *flag_name; -+ gchar *utf7; - - flag_name = rename_label_flag ( - user_flags->name, strlen (user_flags->name), FALSE); -@@ -246,7 +257,12 @@ imapx_write_flags (GString *string, - if (!first) - g_string_append_c (string, ' '); - first = FALSE; -- g_string_append (string, flag_name); -+ -+ utf7 = camel_utf8_utf7 (flag_name); -+ -+ g_string_append (string, utf7 ? utf7 : flag_name); -+ -+ g_free (utf7); - - user_flags = user_flags->next; - } -@@ -261,17 +277,21 @@ imapx_update_user_flags (CamelMessageInf - gboolean changed = FALSE; - CamelMessageInfoBase *binfo = (CamelMessageInfoBase *) info; - CamelIMAPXMessageInfo *xinfo = (CamelIMAPXMessageInfo *) info; -- gboolean set_cal = FALSE; -+ gboolean set_cal = FALSE, set_note = FALSE; - - if (camel_flag_get (&binfo->user_flags, "$has_cal")) - set_cal = TRUE; -+ if (camel_flag_get (&binfo->user_flags, "$has_note")) -+ set_note = TRUE; - - changed = camel_flag_list_copy (&binfo->user_flags, &server_user_flags); - camel_flag_list_copy (&xinfo->server_user_flags, &server_user_flags); - -- /* reset the calendar flag if it was set in messageinfo before */ -+ /* reset the flags as they were set in messageinfo before */ - if (set_cal) - camel_flag_set (&binfo->user_flags, "$has_cal", TRUE); -+ if (set_note) -+ camel_flag_set (&binfo->user_flags, "$has_note", TRUE); - - return changed; - } -@@ -312,16 +332,13 @@ imapx_update_message_info_flags (CamelMe - if (permanent_flags > 0) - server_cleared &= permanent_flags; - -- camel_message_info_set_flags (( -+ changed = camel_message_info_set_flags (( - CamelMessageInfo *) xinfo, - server_set | server_cleared, - (xinfo->info.flags | server_set) & ~server_cleared); - - xinfo->server_flags = server_flags; -- xinfo->info.flags = xinfo->info.flags & ~CAMEL_MESSAGE_FOLDER_FLAGGED; - xinfo->info.dirty = TRUE; -- -- changed = TRUE; - } - - if ((permanent_flags & CAMEL_MESSAGE_USER) != 0 && imapx_update_user_flags (info, server_user_flags)) -@@ -503,8 +520,11 @@ imapx_parse_capability (CamelIMAPXInputS - /* Put it back so that imapx_untagged() isn't unhappy */ - camel_imapx_input_stream_ungettoken ( - stream, tok, token, len); -- return cinfo; -+ break; - case 43: -+ /* the CAPABILITY shouldn't start with a '+', ignore it then */ -+ if (!token) -+ break; - token = (guchar *) g_strconcat ((gchar *) token, "+", NULL); - free_token = TRUE; - /* coverity[fallthrough] */ -@@ -530,11 +550,14 @@ imapx_parse_capability (CamelIMAPXInputS - break; - default: - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "capability: expecting name"); - break; - } - -+ if (tok == ']') -+ break; -+ - tok = camel_imapx_input_stream_token ( - stream, &token, &len, cancellable, &local_error); - } -@@ -842,26 +865,28 @@ imapx_parse_ext_optional (CamelIMAPXInpu - dinfo->refcount = 1; - /* should be string */ - if (!camel_imapx_input_stream_astring (stream, &token, cancellable, &local_error)) { -- camel_content_disposition_unref (dinfo); - if (!local_error) - g_set_error ( - &local_error, -- CAMEL_IMAPX_ERROR, 1, -+ CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "expecting string"); -- g_propagate_error (error, local_error); -- -- return NULL; -+ goto done; - } - - dinfo->disposition = g_strdup ((gchar *) token); - imapx_parse_param_list ( -- stream, &dinfo->params, cancellable, NULL); -+ stream, &dinfo->params, cancellable, -+ &local_error); -+ -+ if (local_error != NULL) -+ goto done; -+ - break; - case IMAPX_TOK_TOKEN: - break; - default: - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "body_fld_disp: expecting nil or list"); - return NULL; - } -@@ -886,7 +911,7 @@ imapx_parse_ext_optional (CamelIMAPXInpu - g_clear_error (&local_error); - g_set_error ( - &local_error, -- CAMEL_IMAPX_ERROR, 1, -+ CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "expecting string"); - break; - } -@@ -908,6 +933,7 @@ imapx_parse_ext_optional (CamelIMAPXInpu - - } - -+ done: - if (local_error != NULL) { - g_propagate_error (error, local_error); - if (dinfo) -@@ -1003,10 +1029,10 @@ imapx_parse_body_fields (CamelIMAPXInput - error: - imapx_free_body (cinfo); - -- return cinfo; -+ return NULL; - } - --struct _camel_header_address * -+CamelHeaderAddress * - imapx_parse_address_list (CamelIMAPXInputStream *stream, - GCancellable *cancellable, - GError **error) -@@ -1015,7 +1041,7 @@ imapx_parse_address_list (CamelIMAPXInpu - guint len; - guchar *token, *host; - gchar *mbox; -- struct _camel_header_address *list = NULL; -+ CamelHeaderAddress *list = NULL; - GError *local_error = NULL; - - /* "(" 1*address ")" / nil */ -@@ -1028,7 +1054,7 @@ imapx_parse_address_list (CamelIMAPXInpu - } - - if (tok == '(') { -- struct _camel_header_address *addr, *group = NULL; -+ CamelHeaderAddress *addr, *group = NULL; - while (1) { - /* address ::= "(" addr_name SPACE addr_adl SPACE addr_mailbox - * SPACE addr_host ")" */ -@@ -1040,7 +1066,7 @@ imapx_parse_address_list (CamelIMAPXInpu - g_clear_error (&local_error); - camel_header_address_list_clear (&list); - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "missing '(' for address"); - return NULL; - } -@@ -1134,7 +1160,7 @@ imapx_parse_envelope (CamelIMAPXInputStr - gint tok; - guint len; - guchar *token; -- struct _camel_header_address *addr, *addr_from; -+ CamelHeaderAddress *addr, *addr_from; - gchar *addrstr; - struct _CamelMessageInfoBase *minfo = NULL; - GError *local_error = NULL; -@@ -1155,7 +1181,7 @@ imapx_parse_envelope (CamelIMAPXInputStr - if (tok != '(') { - g_clear_error (&local_error); - camel_message_info_unref (minfo); -- g_set_error (error, CAMEL_IMAPX_ERROR, 1, "envelope: expecting '('"); -+ g_set_error (error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, "envelope: expecting '('"); - return NULL; - } - -@@ -1262,7 +1288,7 @@ imapx_parse_envelope (CamelIMAPXInputStr - if (tok != ')') { - g_clear_error (&local_error); - camel_message_info_unref (minfo); -- g_set_error (error, CAMEL_IMAPX_ERROR, 1, "expecting ')'"); -+ g_set_error (error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, "expecting ')'"); - return NULL; - } - -@@ -1297,7 +1323,7 @@ imapx_parse_body (CamelIMAPXInputStream - stream, &token, &len, cancellable, &local_error); - if (tok != '(') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "body: expecting '('"); - return NULL; - } -@@ -1533,7 +1559,7 @@ imapx_parse_section (CamelIMAPXInputStre - - if (tok != '[') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "section: expecting '['"); - return NULL; - } -@@ -1548,7 +1574,7 @@ imapx_parse_section (CamelIMAPXInputStre - camel_imapx_input_stream_ungettoken (stream, tok, token, len); - } else { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "section: expecting token"); - return NULL; - } -@@ -1569,7 +1595,7 @@ imapx_parse_section (CamelIMAPXInputStre - /* ?do something? */ - } else if (tok != ')') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "section: header fields: expecting string"); - g_free (section); - return NULL; -@@ -1582,7 +1608,7 @@ imapx_parse_section (CamelIMAPXInputStre - - if (tok != ']') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "section: expecting ']'"); - g_free (section); - return NULL; -@@ -1610,7 +1636,7 @@ imapx_parse_modseq (CamelIMAPXInputStrea - - if (tok != '(') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "fetch: expecting '('"); - return 0; - } -@@ -1629,7 +1655,7 @@ imapx_parse_modseq (CamelIMAPXInputStrea - - if (tok != ')') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "fetch: expecting '('"); - return 0; - } -@@ -1680,19 +1706,19 @@ imapx_dump_fetch (struct _fetch_info *fi - if (finfo->body != NULL) { - g_print ("Body content:\n"); - data = g_bytes_get_data (finfo->body, &size); -- fwrite (data, size, 1, stdout); -+ fwrite (data, sizeof (gchar), size, stdout); - } - - if (finfo->text != NULL) { - g_print ("Text content:\n"); - data = g_bytes_get_data (finfo->text, &size); -- fwrite (data, size, 1, stdout); -+ fwrite (data, sizeof (gchar), size, stdout); - } - - if (finfo->header != NULL) { - g_print ("Header content:\n"); - data = g_bytes_get_data (finfo->header, &size); -- fwrite (data, size, 1, stdout); -+ fwrite (data, sizeof (gchar), size, stdout); - } - - if (finfo->minfo != NULL) { -@@ -1786,7 +1812,7 @@ imapx_parse_fetch_body (CamelIMAPXInputS - } - - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "unknown body response"); - - return FALSE; -@@ -1957,7 +1983,7 @@ imapx_parse_fetch_uid (CamelIMAPXInputSt - - if (tok != IMAPX_TOK_INT) { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "uid not integer"); - return FALSE; - } -@@ -1988,7 +2014,7 @@ imapx_parse_fetch (CamelIMAPXInputStream - - if (tok != '(') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "fetch: expecting '('"); - goto fail; - } -@@ -2056,7 +2082,7 @@ imapx_parse_fetch (CamelIMAPXInputStream - - default: - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "unknown body response"); - break; - } -@@ -2073,7 +2099,7 @@ imapx_parse_fetch (CamelIMAPXInputStream - - if (tok != ')') { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "missing closing ')' on fetch response"); - goto fail; - } -@@ -2094,7 +2120,7 @@ imapx_parse_uids (CamelIMAPXInputStream - GError **error) - { - GArray *array; -- guchar *token; -+ guchar *token = NULL; - gchar **splits; - guint len, str_len; - gint tok, ii; -@@ -2106,6 +2132,11 @@ imapx_parse_uids (CamelIMAPXInputStream - if (tok < 0) - return NULL; - -+ if (!token) { -+ g_set_error (error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_IGNORE, "server response truncated"); -+ return NULL; -+ } -+ - array = g_array_new (FALSE, FALSE, sizeof (guint32)); - splits = g_strsplit ((gchar *) token, ",", -1); - str_len = g_strv_length (splits); -@@ -2181,6 +2212,7 @@ imapx_parse_status_copyuid (CamelIMAPXIn - GArray *uids; - guint64 number; - gboolean success; -+ GError *local_error = NULL; - - success = camel_imapx_input_stream_number ( - stream, &number, cancellable, error); -@@ -2190,15 +2222,37 @@ imapx_parse_status_copyuid (CamelIMAPXIn - - sinfo->u.copyuid.uidvalidity = number; - -- uids = imapx_parse_uids (stream, cancellable, error); -- if (uids == NULL) -+ uids = imapx_parse_uids (stream, cancellable, &local_error); -+ if (uids == NULL) { -+ /* Some broken servers can return truncated response, like: -+ B00083 OK [COPYUID 4154 ] COPY completed. -+ Just ignore such server error. -+ */ -+ if (g_error_matches (local_error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_IGNORE)) { -+ g_clear_error (&local_error); -+ return TRUE; -+ } -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ - return FALSE; -+ } - - sinfo->u.copyuid.uids = uids; - - uids = imapx_parse_uids (stream, cancellable, error); -- if (uids == NULL) -+ if (uids == NULL) { -+ if (g_error_matches (local_error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_IGNORE)) { -+ g_clear_error (&local_error); -+ return TRUE; -+ } -+ -+ if (local_error) -+ g_propagate_error (error, local_error); -+ - return FALSE; -+ } - - sinfo->u.copyuid.copied_uids = uids; - -@@ -2376,7 +2430,7 @@ imapx_parse_status (CamelIMAPXInputStrea - break; - default: - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "expecting OK/NO/BAD"); - goto fail; - } -@@ -2486,7 +2540,7 @@ imapx_parse_status (CamelIMAPXInputStrea - stream, &token, &len, cancellable, NULL); - if (tok == '\n' || tok < 0) { - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "server response truncated"); - goto fail; - } -@@ -2502,6 +2556,10 @@ imapx_parse_status (CamelIMAPXInputStrea - if (!success) - goto fail; - -+ if (sinfo->text) { -+ g_strstrip (sinfo->text); -+ } -+ - goto exit; - - fail: -@@ -2915,7 +2973,7 @@ camel_imapx_parse_quota (CamelIMAPXInput - break; - default: - g_set_error ( -- error, CAMEL_IMAPX_ERROR, 1, -+ error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED, - "quota_response: expecting '('"); - goto fail; - } -@@ -3228,3 +3286,18 @@ imapx_get_temp_uid (void) - - return res; - } -+ -+gboolean -+imapx_util_all_is_ascii (const gchar *str) -+{ -+ gint ii; -+ gboolean all_ascii = TRUE; -+ -+ g_return_val_if_fail (str != NULL, FALSE); -+ -+ for (ii = 0; str[ii] && all_ascii; ii++) { -+ all_ascii = str[ii] > 0; -+ } -+ -+ return all_ascii; -+} -diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-utils.h.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-utils.h ---- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-utils.h.imapx-update-to-upstream 2014-10-31 15:25:33.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-utils.h 2016-08-15 13:52:41.979976329 +0200 -@@ -2,17 +2,18 @@ - /* - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * -- * This library is free software; you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . -+ * - */ - - #ifndef CAMEL_IMAPX_UTILS_H -@@ -25,6 +26,8 @@ - - G_BEGIN_DECLS - -+#define CamelHeaderAddress struct _camel_header_address -+ - /* FIXME Split off a camel-imapx-types.h file with supplemental - * enum/struct definitions and helper macros, so we don't - * have these conflicting header dependencies. */ -@@ -213,7 +216,7 @@ struct _CamelMessageContentInfo * - imapx_parse_body_fields (CamelIMAPXInputStream *stream, - GCancellable *cancellable, - GError **error); --struct _camel_header_address * -+CamelHeaderAddress * - imapx_parse_address_list (CamelIMAPXInputStream *stream, - GCancellable *cancellable, - GError **error); -@@ -392,6 +395,8 @@ gchar * imapx_path_to_physical (const - const gchar *vpath); - gchar * imapx_get_temp_uid (void); - -+gboolean imapx_util_all_is_ascii (const gchar *str); -+ - G_END_DECLS - - #endif /* CAMEL_IMAPX_UTILS_H */ -diff -up evolution-data-server-3.12.11/camel/providers/imapx/Makefile.am.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/Makefile.am ---- evolution-data-server-3.12.11/camel/providers/imapx/Makefile.am.imapx-update-to-upstream 2014-04-23 14:37:03.000000000 +0200 -+++ evolution-data-server-3.12.11/camel/providers/imapx/Makefile.am 2016-08-15 13:52:41.982976329 +0200 -@@ -14,6 +14,7 @@ libcamelimapx_la_CPPFLAGS = \ - -I$(top_builddir)/camel \ - $(CAMEL_CFLAGS) \ - $(GIO_UNIX_CFLAGS) \ -+ $(EVOLUTION_CALENDAR_CFLAGS) \ - -DG_LOG_DOMAIN=\"camel-imapx\" \ - $(CODE_COVERAGE_CFLAGS) \ - $(NULL) -@@ -63,6 +64,7 @@ libcamelimapx_la_LIBADD = \ - $(top_builddir)/camel/libcamel-1.2.la \ - $(CAMEL_LIBS) \ - $(GIO_UNIX_LIBS) \ -+ $(EVOLUTION_CALENDAR_LIBS) \ - $(NULL) - - libcamelimapx_la_LDFLAGS = -avoid-version -module $(NO_UNDEFINED) \ -diff -up evolution-data-server-3.12.11/camel/providers/imapx/test-imapx.c.imapx-update-to-upstream evolution-data-server-3.12.11/camel/providers/imapx/test-imapx.c ---- evolution-data-server-3.12.11/camel/providers/imapx/test-imapx.c.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/providers/imapx/test-imapx.c 2016-08-15 13:52:41.983976329 +0200 -@@ -2,17 +2,18 @@ - /* - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * -- * This library is free software; you can redistribute it and/or modify it -+ * This library is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License -- * along with this library; if not, see . -+ * along with this library. If not, see . -+ * - */ - - #include -diff -up evolution-data-server-3.12.11/libedataserver/e-source-mail-account.c.imapx-update-to-upstream evolution-data-server-3.12.11/libedataserver/e-source-mail-account.c ---- evolution-data-server-3.12.11/libedataserver/e-source-mail-account.c.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/libedataserver/e-source-mail-account.c 2016-08-15 13:52:41.983976329 +0200 -@@ -47,11 +47,13 @@ - struct _ESourceMailAccountPrivate { - GMutex property_lock; - gchar *identity_uid; -+ gboolean needs_initial_setup; - }; - - enum { - PROP_0, -- PROP_IDENTITY_UID -+ PROP_IDENTITY_UID, -+ PROP_NEEDS_INITIAL_SETUP - }; - - G_DEFINE_TYPE ( -@@ -71,6 +73,12 @@ source_mail_account_set_property (GObjec - E_SOURCE_MAIL_ACCOUNT (object), - g_value_get_string (value)); - return; -+ -+ case PROP_NEEDS_INITIAL_SETUP: -+ e_source_mail_account_set_needs_initial_setup ( -+ E_SOURCE_MAIL_ACCOUNT (object), -+ g_value_get_boolean (value)); -+ return; - } - - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -@@ -89,6 +97,13 @@ source_mail_account_get_property (GObjec - e_source_mail_account_dup_identity_uid ( - E_SOURCE_MAIL_ACCOUNT (object))); - return; -+ -+ case PROP_NEEDS_INITIAL_SETUP: -+ g_value_set_boolean ( -+ value, -+ e_source_mail_account_get_needs_initial_setup ( -+ E_SOURCE_MAIL_ACCOUNT (object))); -+ return; - } - - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -@@ -137,6 +152,19 @@ e_source_mail_account_class_init (ESourc - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS | - E_SOURCE_PARAM_SETTING)); -+ -+ g_object_class_install_property ( -+ object_class, -+ PROP_NEEDS_INITIAL_SETUP, -+ g_param_spec_boolean ( -+ "needs-initial-setup", -+ "Needs Initial Setup", -+ "Whether the account needs to do an initial setup", -+ TRUE, -+ G_PARAM_READWRITE | -+ G_PARAM_CONSTRUCT | -+ G_PARAM_STATIC_STRINGS | -+ E_SOURCE_PARAM_SETTING)); - } - - static void -@@ -227,3 +255,43 @@ e_source_mail_account_set_identity_uid ( - g_object_notify (G_OBJECT (extension), "identity-uid"); - } - -+/** -+ * e_source_mail_account_get_needs_initial_setup: -+ * @extension: an #ESourceMailAccount -+ * -+ * Check whether the mail account needs to do its initial setup. -+ * -+ * Returns: %TRUE, when the account needs to run its initial setup -+ * -+ * Since: 3.12.11-25 (3.20) -+ **/ -+gboolean -+e_source_mail_account_get_needs_initial_setup (ESourceMailAccount *extension) -+{ -+ g_return_val_if_fail (E_IS_SOURCE_MAIL_ACCOUNT (extension), FALSE); -+ -+ return extension->priv->needs_initial_setup; -+} -+ -+/** -+ * e_source_mail_account_set_needs_initial_setup: -+ * @extension: an #ESourceMailAccount -+ * @needs_initial_setup: value to set -+ * -+ * Sets whether the account needs to run its initial setup. -+ * -+ * Since: 3.12.11-25 (3.20) -+ **/ -+void -+e_source_mail_account_set_needs_initial_setup (ESourceMailAccount *extension, -+ gboolean needs_initial_setup) -+{ -+ g_return_if_fail (E_IS_SOURCE_MAIL_ACCOUNT (extension)); -+ -+ if ((extension->priv->needs_initial_setup ? 1 : 0) == (needs_initial_setup ? 1 : 0)) -+ return; -+ -+ extension->priv->needs_initial_setup = needs_initial_setup; -+ -+ g_object_notify (G_OBJECT (extension), "needs-initial-setup"); -+} -diff -up evolution-data-server-3.12.11/libedataserver/e-source-mail-account.h.imapx-update-to-upstream evolution-data-server-3.12.11/libedataserver/e-source-mail-account.h ---- evolution-data-server-3.12.11/libedataserver/e-source-mail-account.h.imapx-update-to-upstream 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/libedataserver/e-source-mail-account.h 2016-08-15 13:52:41.983976329 +0200 -@@ -85,6 +85,11 @@ gchar * e_source_mail_account_dup_ident - void e_source_mail_account_set_identity_uid - (ESourceMailAccount *extension, - const gchar *identity_uid); -+gboolean e_source_mail_account_get_needs_initial_setup -+ (ESourceMailAccount *extension); -+void e_source_mail_account_set_needs_initial_setup -+ (ESourceMailAccount *extension, -+ gboolean needs_initial_setup); - - G_END_DECLS - -diff -up evolution-data-server-3.12.11/po/POTFILES.in.imapx-update-to-upstream evolution-data-server-3.12.11/po/POTFILES.in ---- evolution-data-server-3.12.11/po/POTFILES.in.imapx-update-to-upstream 2014-11-04 13:57:25.000000000 +0100 -+++ evolution-data-server-3.12.11/po/POTFILES.in 2016-08-15 13:52:41.984976329 +0200 -@@ -134,6 +134,7 @@ camel/camel-vee-store.c - camel/camel-vee-summary.c - camel/camel-vtrash-folder.c - camel/providers/imapx/camel-imapx-command.c -+camel/providers/imapx/camel-imapx-conn-manager.c - camel/providers/imapx/camel-imapx-folder.c - camel/providers/imapx/camel-imapx-input-stream.c - camel/providers/imapx/camel-imapx-provider.c diff --git a/SOURCES/evolution-data-server-3.12.11-implement-webdav-refresh.patch b/SOURCES/evolution-data-server-3.12.11-implement-webdav-refresh.patch deleted file mode 100644 index f93531b..0000000 --- a/SOURCES/evolution-data-server-3.12.11-implement-webdav-refresh.patch +++ /dev/null @@ -1,109 +0,0 @@ -diff -up evolution-data-server-3.12.11/addressbook/backends/webdav/e-book-backend-webdav.c.implement-webdav-refresh evolution-data-server-3.12.11/addressbook/backends/webdav/e-book-backend-webdav.c ---- evolution-data-server-3.12.11/addressbook/backends/webdav/e-book-backend-webdav.c.implement-webdav-refresh 2014-05-22 08:45:46.000000000 +0200 -+++ evolution-data-server-3.12.11/addressbook/backends/webdav/e-book-backend-webdav.c 2015-05-04 19:15:14.463350678 +0200 -@@ -832,6 +832,7 @@ static gboolean - download_contacts (EBookBackendWebdav *webdav, - EFlag *running, - EDataBookView *book_view, -+ gboolean force, - GCancellable *cancellable, - GError **error) - { -@@ -851,7 +852,7 @@ download_contacts (EBookBackendWebdav *w - - g_mutex_lock (&priv->update_lock); - -- if (!check_addressbook_changed (webdav, &new_ctag, cancellable)) { -+ if (!force && !check_addressbook_changed (webdav, &new_ctag, cancellable)) { - g_free (new_ctag); - g_mutex_unlock (&priv->update_lock); - return TRUE; -@@ -1072,7 +1073,7 @@ book_view_thread (gpointer data) - * it's stopped */ - g_object_ref (book_view); - -- download_contacts (webdav, closure->running, book_view, NULL, NULL); -+ download_contacts (webdav, closure->running, book_view, FALSE, NULL, NULL); - - g_object_unref (book_view); - -@@ -1218,7 +1219,7 @@ book_backend_webdav_get_backend_property - g_return_val_if_fail (prop_name != NULL, NULL); - - if (g_str_equal (prop_name, CLIENT_BACKEND_PROPERTY_CAPABILITIES)) { -- return g_strdup ("net,do-initial-query,contact-lists"); -+ return g_strdup ("net,do-initial-query,contact-lists,refresh-supported"); - - } else if (g_str_equal (prop_name, BOOK_BACKEND_PROPERTY_REQUIRED_FIELDS)) { - return g_strdup (e_contact_field_name (E_CONTACT_FILE_AS)); -@@ -1764,7 +1765,7 @@ book_backend_webdav_get_contact_list_syn - - if (e_backend_get_online (E_BACKEND (backend))) { - /* make sure the cache is up to date */ -- if (!download_contacts (webdav, NULL, NULL, cancellable, error)) -+ if (!download_contacts (webdav, NULL, NULL, FALSE, cancellable, error)) - return FALSE; - } - -@@ -1822,6 +1823,29 @@ book_backend_webdav_try_password_sync (E - return result; - } - -+static gboolean -+e_book_backend_webdav_refresh_sync (EBookBackend *book_backend, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ EBackend *backend; -+ -+ g_return_val_if_fail (E_IS_BOOK_BACKEND_WEBDAV (book_backend), FALSE); -+ -+ backend = E_BACKEND (book_backend); -+ -+ if (!e_backend_get_online (backend) && -+ e_backend_is_destination_reachable (backend, cancellable, NULL)) { -+ e_backend_set_online (backend, TRUE); -+ } -+ -+ if (e_backend_get_online (backend) && !g_cancellable_is_cancelled (cancellable)) { -+ return download_contacts (E_BOOK_BACKEND_WEBDAV (book_backend), NULL, NULL, TRUE, cancellable, error); -+ } -+ -+ return TRUE; -+} -+ - static void - e_book_backend_webdav_class_init (EBookBackendWebdavClass *class) - { -@@ -1844,6 +1868,7 @@ e_book_backend_webdav_class_init (EBookB - backend_class->get_contact_list_sync = book_backend_webdav_get_contact_list_sync; - backend_class->start_view = e_book_backend_webdav_start_view; - backend_class->stop_view = e_book_backend_webdav_stop_view; -+ backend_class->refresh_sync = e_book_backend_webdav_refresh_sync; - } - - static void -diff -up evolution-data-server-3.12.11/calendar/backends/caldav/e-cal-backend-caldav.c.implement-webdav-refresh evolution-data-server-3.12.11/calendar/backends/caldav/e-cal-backend-caldav.c ---- evolution-data-server-3.12.11/calendar/backends/caldav/e-cal-backend-caldav.c.implement-webdav-refresh 2014-11-12 17:57:45.000000000 +0100 -+++ evolution-data-server-3.12.11/calendar/backends/caldav/e-cal-backend-caldav.c 2015-05-04 19:15:14.464350669 +0200 -@@ -3013,9 +3013,17 @@ caldav_refresh (ECalBackendSync *backend - g_mutex_lock (&cbdav->priv->busy_lock); - - if (!cbdav->priv->loaded -- || cbdav->priv->slave_cmd == SLAVE_SHOULD_DIE -- || !check_state (cbdav, &online, NULL) -- || !online) { -+ || cbdav->priv->slave_cmd == SLAVE_SHOULD_DIE) { -+ g_mutex_unlock (&cbdav->priv->busy_lock); -+ return; -+ } -+ -+ if (!e_backend_get_online (E_BACKEND (backend)) && -+ e_backend_is_destination_reachable (E_BACKEND (backend), cancellable, NULL)) { -+ e_backend_set_online (E_BACKEND (backend), TRUE); -+ } -+ -+ if (!check_state (cbdav, &online, NULL) || !online) { - g_mutex_unlock (&cbdav->priv->busy_lock); - return; - } diff --git a/SOURCES/evolution-data-server-3.12.11-smtp-timeout-change.patch b/SOURCES/evolution-data-server-3.12.11-smtp-timeout-change.patch deleted file mode 100644 index 2be4be6..0000000 --- a/SOURCES/evolution-data-server-3.12.11-smtp-timeout-change.patch +++ /dev/null @@ -1,97 +0,0 @@ -diff -up evolution-data-server-3.12.11/camel/camel-network-service.c.smtp-timeout-change evolution-data-server-3.12.11/camel/camel-network-service.c ---- evolution-data-server-3.12.11/camel/camel-network-service.c.smtp-timeout-change 2015-01-12 14:23:00.000000000 +0100 -+++ evolution-data-server-3.12.11/camel/camel-network-service.c 2015-05-28 11:29:50.007493148 +0200 -@@ -659,8 +659,10 @@ network_service_connect_sync (CamelNetwo - GSocket *socket; - - socket = g_socket_connection_get_socket (connection); -- if (socket) -+ if (socket) { - g_socket_set_timeout (socket, 90); -+ g_socket_set_keepalive (socket, TRUE); -+ } - } - - return (connection != NULL) ? G_IO_STREAM (connection) : NULL; -diff -up evolution-data-server-3.12.11/camel/camel-stream.c.smtp-timeout-change evolution-data-server-3.12.11/camel/camel-stream.c ---- evolution-data-server-3.12.11/camel/camel-stream.c.smtp-timeout-change 2015-05-28 11:30:32.653491341 +0200 -+++ evolution-data-server-3.12.11/camel/camel-stream.c 2015-05-28 11:30:37.965491116 +0200 -@@ -149,20 +149,25 @@ stream_write (CamelStream *stream, - GError **error) - { - GIOStream *base_stream; -- gssize n_bytes_written = (gssize) n; -+ gssize n_bytes_written = -1; - - base_stream = camel_stream_ref_base_stream (stream); - - if (base_stream != NULL) { - GOutputStream *output_stream; -+ gsize n_written = 0; - - output_stream = g_io_stream_get_output_stream (base_stream); - stream->eos = FALSE; - -- n_bytes_written = g_output_stream_write ( -- output_stream, buffer, n, cancellable, error); -+ if (g_output_stream_write_all (output_stream, buffer, n, &n_written, cancellable, error)) -+ n_bytes_written = (gssize) n_written; -+ else -+ n_bytes_written = -1; - - g_object_unref (base_stream); -+ } else { -+ g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot write with no base stream")); - } - - return n_bytes_written; -diff -up evolution-data-server-3.12.11/camel/providers/smtp/camel-smtp-transport.c.smtp-timeout-change evolution-data-server-3.12.11/camel/providers/smtp/camel-smtp-transport.c ---- evolution-data-server-3.12.11/camel/providers/smtp/camel-smtp-transport.c.smtp-timeout-change 2014-10-14 15:32:01.000000000 +0200 -+++ evolution-data-server-3.12.11/camel/providers/smtp/camel-smtp-transport.c 2015-05-28 11:29:50.007493148 +0200 -@@ -1444,6 +1444,36 @@ smtp_rcpt (CamelSmtpTransport *transport - return TRUE; - } - -+static void -+smtp_maybe_update_socket_timeout (CamelStream *strm, -+ gint timeout_seconds) -+{ -+ GIOStream *base_strm = camel_stream_ref_base_stream (strm); -+ -+ if (G_IS_TLS_CONNECTION (base_strm)) { -+ GIOStream *base_io_stream = NULL; -+ -+ g_object_get (G_OBJECT (base_strm), "base-io-stream", &base_io_stream, NULL); -+ -+ g_object_unref (base_strm); -+ base_strm = base_io_stream; -+ } else if (base_strm) { -+ g_object_ref (base_strm); -+ } -+ -+ if (G_IS_SOCKET_CONNECTION (base_strm)) { -+ GSocket *socket; -+ -+ socket = g_socket_connection_get_socket (G_SOCKET_CONNECTION (base_strm)); -+ if (socket) { -+ if (timeout_seconds > g_socket_get_timeout (socket)) -+ g_socket_set_timeout (socket, timeout_seconds); -+ } -+ } -+ -+ g_clear_object (&base_strm); -+} -+ - static gboolean - smtp_data (CamelSmtpTransport *transport, - CamelMimeMessage *message, -@@ -1532,6 +1562,9 @@ smtp_data (CamelSmtpTransport *transport - CAMEL_DATA_WRAPPER (message), - CAMEL_STREAM (null), NULL, NULL); - -+ /* Set the upload timeout to an equal of 512 bytes per second */ -+ smtp_maybe_update_socket_timeout (transport->ostream, null->written / 512); -+ - filtered_stream = camel_stream_filter_new (transport->ostream); - - /* setup progress reporting for message sending... */ diff --git a/SOURCES/evolution-data-server-3.12.11-time-parse-am-pm.patch b/SOURCES/evolution-data-server-3.12.11-time-parse-am-pm.patch deleted file mode 100644 index d67a75b..0000000 --- a/SOURCES/evolution-data-server-3.12.11-time-parse-am-pm.patch +++ /dev/null @@ -1,33 +0,0 @@ -diff -up evolution-data-server-3.12.11/libedataserver/e-time-utils.c.time-parse-am-pm evolution-data-server-3.12.11/libedataserver/e-time-utils.c ---- evolution-data-server-3.12.11/libedataserver/e-time-utils.c.time-parse-am-pm 2014-06-01 21:10:19.000000000 +0200 -+++ evolution-data-server-3.12.11/libedataserver/e-time-utils.c 2015-07-10 16:24:54.918755056 +0200 -@@ -1576,9 +1576,28 @@ static gboolean - locale_supports_12_hour_format (void) - { - struct tm tmp_tm = { 0 }; -- gchar s[16]; -+ gchar s[40]; -+ -+ /* Fill the struct tm with some sane values. */ -+ tmp_tm.tm_year = 2000; -+ tmp_tm.tm_mon = 0; -+ tmp_tm.tm_mday = 1; -+ tmp_tm.tm_sec = 0; -+ tmp_tm.tm_isdst = 0; -+ tmp_tm.tm_hour = 1; -+ tmp_tm.tm_min = 0; -+ tmp_tm.tm_wday = 6; -+ tmp_tm.tm_yday = 6; - - e_utf8_strftime (s, sizeof (s), "%p", &tmp_tm); -+ -+ if (!s[0]) { -+ tmp_tm.tm_hour = 13; -+ tmp_tm.tm_min = 0; -+ -+ e_utf8_strftime (s, sizeof (s), "%p", &tmp_tm); -+ } -+ - return s[0] != '\0'; - } - diff --git a/SOURCES/evolution-data-server-3.12.11-translations.patch b/SOURCES/evolution-data-server-3.12.11-translations.patch deleted file mode 100644 index eff0a53..0000000 --- a/SOURCES/evolution-data-server-3.12.11-translations.patch +++ /dev/null @@ -1,29587 +0,0 @@ -diff -urN evolution-data-server-3.12.11/po/de.po evolution-data-server-3.12.11_localized/po/de.po ---- evolution-data-server-3.12.11/po/de.po 2014-11-04 18:27:25.000000000 +0530 -+++ evolution-data-server-3.12.11_localized/po/de.po 2016-03-14 19:48:05.382870110 +0530 -@@ -11,22 +11,22 @@ - # Mario Blättermann , 2009-2013. - # Hendrik Knackstedt , 2012. - # Christian Kirbach , 2010, 2012, 2013. --# -+# lstemmle , 2016. #zanata -+# pnemade , 2016. #zanata - msgid "" - msgstr "" - "Project-Id-Version: evolution-data-server master\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" --"product=evolution-data-server&keywords=I18N+L10N&component=Misc.\n" --"POT-Creation-Date: 2014-09-14 10:23+0000\n" --"PO-Revision-Date: 2014-09-14 22:12+0100\n" --"Last-Translator: Christian Kirbach \n" --"Language-Team: Deutsch \n" --"Language: de\n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2016-02-16 09:58+0530\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"PO-Revision-Date: 2016-03-07 04:36+0000\n" -+"Last-Translator: lstemmle \n" -+"Language-Team: Deutsch \n" -+"Language: de\n" - "Plural-Forms: nplurals=2; plural=(n != 1);\n" --"X-Generator: Poedit 1.5.4\n" -+"X-Generator: Zanata 3.8.2\n" - "X-Project-Style: gnome\n" - - #: ../addressbook/backends/file/e-book-backend-file.c:120 -@@ -70,8 +70,8 @@ - - #: ../addressbook/backends/file/e-book-backend-file.c:1472 - #: ../addressbook/backends/file/e-book-backend-file.c:1555 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3077 --#: ../addressbook/libedata-book/e-book-sqlite.c:6742 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3084 -+#: ../addressbook/libedata-book/e-book-sqlite.c:6793 - #, c-format - msgid "Contact '%s' not found" - msgstr "Kontakt »%s« wurde nicht gefunden" -@@ -101,79 +101,79 @@ - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:1174 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4250 - #: ../addressbook/backends/webdav/e-book-backend-webdav.c:419 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:887 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:888 - #: ../addressbook/libebook-contacts/e-book-contacts-types.c:35 - #: ../addressbook/libebook-contacts/e-phone-number.c:56 - #: ../addressbook/libebook/e-book.c:1078 --#: ../addressbook/libebook/e-book-client.c:1882 --#: ../addressbook/libebook/e-book-client.c:2054 --#: ../addressbook/libebook/e-book-client.c:2267 --#: ../addressbook/libebook/e-book-client.c:2398 --#: ../addressbook/libebook/e-book-client.c:2557 --#: ../addressbook/libebook/e-book-client.c:2691 --#: ../addressbook/libebook/e-book-client.c:2822 --#: ../addressbook/libebook/e-book-client.c:2980 --#: ../addressbook/libebook/e-book-client.c:3175 --#: ../addressbook/libebook/e-book-client.c:3393 -+#: ../addressbook/libebook/e-book-client.c:1916 -+#: ../addressbook/libebook/e-book-client.c:2088 -+#: ../addressbook/libebook/e-book-client.c:2301 -+#: ../addressbook/libebook/e-book-client.c:2432 -+#: ../addressbook/libebook/e-book-client.c:2591 -+#: ../addressbook/libebook/e-book-client.c:2725 -+#: ../addressbook/libebook/e-book-client.c:2856 -+#: ../addressbook/libebook/e-book-client.c:3014 -+#: ../addressbook/libebook/e-book-client.c:3209 -+#: ../addressbook/libebook/e-book-client.c:3427 - #: ../addressbook/libedata-book/e-book-backend-sexp.c:878 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:585 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:616 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:629 - #: ../calendar/backends/contacts/e-cal-backend-contacts.c:270 - #: ../calendar/libecal/e-cal.c:2334 ../calendar/libecal/e-cal-client.c:276 --#: ../calendar/libecal/e-cal-client.c:3239 --#: ../calendar/libecal/e-cal-client.c:3412 --#: ../calendar/libecal/e-cal-client.c:3676 --#: ../calendar/libecal/e-cal-client.c:3917 --#: ../calendar/libecal/e-cal-client.c:4107 --#: ../calendar/libecal/e-cal-client.c:4299 --#: ../calendar/libecal/e-cal-client.c:4469 --#: ../calendar/libecal/e-cal-client.c:4638 --#: ../calendar/libecal/e-cal-client.c:4841 --#: ../calendar/libecal/e-cal-client.c:4991 --#: ../calendar/libecal/e-cal-client.c:5185 --#: ../calendar/libecal/e-cal-client.c:5338 --#: ../calendar/libecal/e-cal-client.c:5555 --#: ../calendar/libecal/e-cal-client.c:5709 --#: ../calendar/libecal/e-cal-client.c:5935 --#: ../calendar/libecal/e-cal-client.c:6131 --#: ../calendar/libecal/e-cal-client.c:6494 --#: ../calendar/libecal/e-cal-client.c:6708 -+#: ../calendar/libecal/e-cal-client.c:3273 -+#: ../calendar/libecal/e-cal-client.c:3446 -+#: ../calendar/libecal/e-cal-client.c:3710 -+#: ../calendar/libecal/e-cal-client.c:3951 -+#: ../calendar/libecal/e-cal-client.c:4141 -+#: ../calendar/libecal/e-cal-client.c:4333 -+#: ../calendar/libecal/e-cal-client.c:4503 -+#: ../calendar/libecal/e-cal-client.c:4672 -+#: ../calendar/libecal/e-cal-client.c:4875 -+#: ../calendar/libecal/e-cal-client.c:5025 -+#: ../calendar/libecal/e-cal-client.c:5219 -+#: ../calendar/libecal/e-cal-client.c:5372 -+#: ../calendar/libecal/e-cal-client.c:5589 -+#: ../calendar/libecal/e-cal-client.c:5743 -+#: ../calendar/libecal/e-cal-client.c:5969 -+#: ../calendar/libecal/e-cal-client.c:6165 -+#: ../calendar/libecal/e-cal-client.c:6528 -+#: ../calendar/libecal/e-cal-client.c:6750 - #: ../camel/providers/imapx/camel-imapx-command.c:645 --#: ../camel/providers/imapx/camel-imapx-server.c:4784 --#: ../camel/providers/imapx/camel-imapx-server.c:4793 -+#: ../camel/providers/imapx/camel-imapx-server.c:4871 -+#: ../camel/providers/imapx/camel-imapx-server.c:4880 - #: ../libedataserver/e-client.c:185 - msgid "Unknown error" - msgstr "Unbekannter Fehler" - - #. Query for new contacts asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:828 -+#: ../addressbook/backends/google/e-book-backend-google.c:822 - msgid "Querying for updated contacts…" - msgstr "Aktualisierte Kontakte werden abgefragt …" - - #. Run the query asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:1010 -+#: ../addressbook/backends/google/e-book-backend-google.c:1004 - msgid "Querying for updated groups…" - msgstr "Aktualisierte Gruppen werden abgefragt …" - --#: ../addressbook/backends/google/e-book-backend-google.c:1757 -+#: ../addressbook/backends/google/e-book-backend-google.c:1751 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4997 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1433 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1434 - msgid "The backend does not support bulk additions" - msgstr "Das Backend unterstützt keine Massenhinzufügungen" - --#: ../addressbook/backends/google/e-book-backend-google.c:1912 -+#: ../addressbook/backends/google/e-book-backend-google.c:1906 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:5133 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1545 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1546 - msgid "The backend does not support bulk modifications" - msgstr "Das Backend unterstützt keine Massenänderungen" - --#: ../addressbook/backends/google/e-book-backend-google.c:2119 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1645 -+#: ../addressbook/backends/google/e-book-backend-google.c:2113 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1646 - msgid "The backend does not support bulk removals" - msgstr "Das Backend unterstützt keine Massenentfernungen" - --#: ../addressbook/backends/google/e-book-backend-google.c:2239 -+#: ../addressbook/backends/google/e-book-backend-google.c:2233 - msgid "Loading…" - msgstr "Ladevorgang …" - -@@ -273,47 +273,47 @@ - msgid "Failed to get the DN for user '%s'" - msgstr "DN für Benutzer »%s« konnte nicht erhalten werden" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:864 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:865 - msgid "Loading Addressbook summary..." - msgstr "Zusammenfassung des Adressbuchs wird geladen …" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:884 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:885 - #, c-format - msgid "PROPFIND on webdav failed with HTTP status %d (%s)" - msgstr "" - "WebDAV-Anweisung PROPFIND scheiterte mit folgendem HTTP-Status: %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:903 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:904 - msgid "No response body in webdav PROPFIND result" - msgstr "" - "Kein Response-Textkörper im Ergebnis der WebDAV-Anweisung PROPFIND gefunden" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:964 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:965 - #, c-format - msgid "Loading Contacts (%d%%)" - msgstr "Kontakte werden geladen (%d%%)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1353 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1354 - msgid "Cannot transform SoupURI to string" - msgstr "SoupURI kann nicht in eine Zeichenkette umgewandelt werden" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1474 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1475 - #, c-format - msgid "Create resource '%s' failed with HTTP status %d (%s)" - msgstr "Erzeugen der Ressource »%s« scheiterte mit HTTP-Status %d (%s)" - - # Die Formulierung können wir wohl nicht so stehen lassen --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1576 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1577 - msgid "Contact on server changed -> not modifying" - msgstr "Kontakt wurde auf dem Server geändert > wird nicht geändert" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1584 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1585 - #, c-format - msgid "Modify contact failed with HTTP status %d (%s)" - msgstr "Ändern des Kontakts scheiterte mit HTTP-Status %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1677 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1693 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1678 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1694 - #, c-format - msgid "DELETE failed with HTTP status %d" - msgstr "DELETE scheiterte mit HTTP-Status %d" -@@ -917,7 +917,7 @@ - msgid "Twitter Name List" - msgstr "Twitter-Namensliste" - --#: ../addressbook/libebook-contacts/e-contact.c:1654 -+#: ../addressbook/libebook-contacts/e-contact.c:1660 - #: ../addressbook/libebook/e-destination.c:920 - msgid "Unnamed List" - msgstr "Namenlose Liste" -@@ -940,7 +940,8 @@ - - #: ../addressbook/libebook-contacts/e-phone-number.c:49 - msgid "" --"Remaining text after the country calling code is too short for a phone number" -+"Remaining text after the country calling code is too short for a phone " -+"number" - msgstr "Zahlenreihe nach der Landesvorwahl ist zu kurz für eine Telefonnummer" - - # »Text« wäre hier irreführend -@@ -952,48 +953,48 @@ - msgid "Text is too long for a phone number" - msgstr "Zahlenreihe ist zu kurz für eine Telefonnummer" - --#: ../addressbook/libebook/e-book-client.c:807 -+#: ../addressbook/libebook/e-book-client.c:841 - #, c-format - msgid "Unknown book property '%s'" - msgstr "Unbekannte Bucheigenschaft »%s«" - --#: ../addressbook/libebook/e-book-client.c:822 -+#: ../addressbook/libebook/e-book-client.c:856 - #, c-format - msgid "Cannot change value of book property '%s'" - msgstr "Wert der Bucheigenschaft »%s« kann nicht geändert werden" - --#: ../addressbook/libebook/e-book-client.c:1207 --#: ../addressbook/libebook/e-book-client.c:1382 --#: ../addressbook/libebook/e-book-client.c:1649 --#: ../calendar/libecal/e-cal-client.c:1530 --#: ../calendar/libecal/e-cal-client.c:1712 -+#: ../addressbook/libebook/e-book-client.c:1241 -+#: ../addressbook/libebook/e-book-client.c:1416 -+#: ../addressbook/libebook/e-book-client.c:1683 -+#: ../calendar/libecal/e-cal-client.c:1564 -+#: ../calendar/libecal/e-cal-client.c:1746 - #, c-format - msgid "Unable to connect to '%s': " - msgstr "Verbindung mit »%s« ist gescheitert:" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:899 --#: ../addressbook/libedata-book/e-book-sqlite.c:2178 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:906 -+#: ../addressbook/libedata-book/e-book-sqlite.c:2201 - #, c-format - msgid "Error introspecting unknown summary field '%s'" - msgstr "Fehler beim Inspizieren des unbekannten Zusammenfassungsfeldes »%s«" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1509 --#: ../addressbook/libedata-book/e-book-sqlite.c:1334 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1516 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1340 - msgid "Error parsing regular expression" - msgstr "Fehler beim Auswerten des regulären Ausdrucks" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1554 --#: ../addressbook/libedata-book/e-book-sqlite.c:1818 ../camel/camel-db.c:545 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1561 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1824 ../camel/camel-db.c:619 - #, c-format - msgid "Insufficient memory" - msgstr "Nicht ausreichender Speicher" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1691 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1698 - #, c-format - msgid "Invalid contact field '%d' specified in summary" - msgstr "Ungültiges Kontaktfeld »%d« in der Zusammenfassung " - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1725 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1732 - #: ../addressbook/libedata-book/e-book-sqlite.c:559 - #, c-format - msgid "" -@@ -1003,8 +1004,8 @@ - "Kontaktfeld »%s« vom Typ »%s« in der Zusammenfassung angegeben, aber nur " - "boolesch, Feldtypen Zeichenkette und Zeichenkettenlisten werden unterstützt" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3065 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4161 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3072 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4168 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. vcards cannot be returned." -@@ -1012,19 +1013,19 @@ - "Volle search_contacts werden nicht zwischengespeichert. vcards können nicht " - "zurückgegeben werden." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4292 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4385 --#: ../addressbook/libedata-book/e-book-sqlite.c:5400 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4299 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4392 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5451 - #, c-format - msgid "Query contained unsupported elements" - msgstr "Abfrage enthielt nicht unterstützte Elemente" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4296 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4303 - #, c-format - msgid "Invalid Query" - msgstr "Ungültige Abfrage" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4320 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4327 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. Hence only summary query is " -@@ -1033,7 +1034,7 @@ - "Volle search_contacts werden nicht zwischengespeichert. Daher wird nur die " - "Abfrage der Zusammenfassung unterstützt." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4389 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4396 - #: ../addressbook/libedata-book/e-data-book.c:383 - #: ../addressbook/libedata-book/e-data-book.c:1028 - #: ../calendar/libedata-cal/e-data-cal.c:420 -@@ -1042,7 +1043,7 @@ - msgid "Invalid query" - msgstr "Ungültige Abfrage" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4432 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4439 - #, c-format - msgid "" - "Full vcards are not stored in cache. Hence only summary query is supported." -@@ -1050,40 +1051,40 @@ - "Volle vcards werden nicht zwischengespeichert. Daher wird nur die Abfrage " - "der Zusammenfassung unterstützt." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5255 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5262 - #, c-format - msgid "Unable to remove the db file: errno %d" - msgstr "Datenbankdatei konnte nicht entfernt werden: Fehlernummer %d" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6042 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6442 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6449 - #, c-format - msgid "Only summary queries are supported by EbSdbCursor" - msgstr "Es werden von EbSdbCursor nur zusammengefasste Anfragen unterstützt" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6056 - #, c-format - msgid "At least one sort field must be specified to use an EbSdbCursor" - msgstr "" - "Es muss zumindest ein Sortierfeld bei der Verwendung von EbSdbCursor " - "angegeben werden" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6063 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 - #, c-format - msgid "Cannot sort by a field that is not in the summary" - msgstr "" - "Es kann nicht nach einem Feld sortiert werden, das nicht in der " - "Zusammenfassung steht" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6077 - #, c-format - msgid "Cannot sort by a field which may have multiple values" - msgstr "" - "Es kann nicht nach einem Feld sortiert werden, das mehrfache Werte enthalten " - "kann" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6203 --#: ../addressbook/libedata-book/e-book-sqlite.c:7412 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6210 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7463 - #, c-format - msgid "" - "Tried to step a cursor in reverse, but cursor is already at the beginning of " -@@ -1092,8 +1093,8 @@ - "Versuch eines Rückwärtsschritts eines Zeiger, aber der Zeiger ist bereits am " - "Anfang der Kontaktliste" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6211 --#: ../addressbook/libedata-book/e-book-sqlite.c:7420 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6218 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7471 - #, c-format - msgid "" - "Tried to step a cursor forwards, but cursor is already at the end of the " -@@ -1107,7 +1108,7 @@ - msgid "Unsupported contact field '%d' specified in summary" - msgstr "Nicht unterstütztes Kontaktfeld »%d« in der Zusammenfassung angegeben" - --#: ../addressbook/libedata-book/e-book-sqlite.c:1891 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1897 - msgid "" - "Cannot upgrade contacts database from a legacy database with more than one " - "addressbook. Delete one of the entries in the 'folders' table first." -@@ -1116,22 +1117,22 @@ - "einem Adressbuch aufgerüstet werden. Löschen Sie zuerst einen Eintrag in der " - "Tabelle »Ordner«." - --#: ../addressbook/libedata-book/e-book-sqlite.c:5393 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5444 - #, c-format - msgid "Invalid query: %s" - msgstr "Ungültige Abfrage: %s" - --#: ../addressbook/libedata-book/e-book-sqlite.c:5568 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5619 - msgid "Invalid query for EbSqlCursor" - msgstr "Ungültige Abfrage nach EbSqlCursor" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7234 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7285 - msgid "At least one sort field must be specified to use an EbSqlCursor" - msgstr "" - "Es muss zumindest ein Sortierfeld bei der Verwendung von EbSqlCursor " - "angegeben werden" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7252 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7303 - msgid "Cannot sort by a field that is not a string type" - msgstr "" - "Es kann nicht nach einem Feld sortiert werden, das nicht vom Typ " -@@ -1300,15 +1301,15 @@ - msgid "Cannot remove contacts: " - msgstr "Kontakte können nicht entfernt werden:" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:772 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:776 - msgid "Cursor does not support setting the search expression" - msgstr "Zeiger unterstützt nicht das Festlegen des Suchausdrucks" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:855 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:859 - msgid "Cursor does not support step" - msgstr "Zeiger unterstützt keinen Schritt" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:938 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:942 - msgid "Cursor does not support alphabetic indexes" - msgstr "Zeiger unterstützt keine alphabetischen Indizes" - -@@ -1342,35 +1343,35 @@ - msgid "No such source for UID '%s'" - msgstr "Keine solche Quelle für UID »%s«" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:581 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 - #, c-format - msgid "Server is unreachable (%s)" - msgstr "Server ist nicht erreichbar (%s)" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:612 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 - #, c-format - msgid "Failed to connect to a server using SSL: %s" - msgstr "SSL-Verbindung zu einem Server konnte nicht hergestellt werden: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:623 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 - #, c-format --msgid "Unexpected HTTP status code %d returned (%s)" --msgstr "Ein unerwarteter HTTP-Statuscode %d wurde zurückgegeben (%s)" -+msgid "Unexpected HTTP status code %d returned (%s) for URI: %s" -+msgstr "Unerwarteter HTTP-Statuscode %d für URI: %s ausgegeben (%s)" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:642 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:647 - msgid "CalDAV backend is not loaded yet" - msgstr "CalDAV-Backend wurde noch nicht geladen" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1084 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1091 - msgid "Invalid Redirect URL" - msgstr "Ungültige Umleitungsadresse" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2887 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2894 - #, c-format - msgid "Cannot create local cache folder '%s'" - msgstr "Lokaler Ordner »%s« zum Zwischenspeichern kann nicht angelegt werden" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2939 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2946 - #, c-format - msgid "" - "Server is unreachable, calendar is opened in read-only mode.\n" -@@ -1380,27 +1381,27 @@ - "Modus geöffnet.\n" - "Fehlermeldung: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3973 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3988 - msgid "CalDAV does not support bulk additions" - msgstr "CalDAV unterstützt keine Massenhinzufügungen" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4076 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4091 - msgid "CalDAV does not support bulk modifications" - msgstr "CalDAV unterstützt keine Massenänderungen" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4252 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4267 - msgid "CalDAV does not support bulk removals" - msgstr "CalDAV unterstützt keine Massenentfernungen" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4919 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4941 - msgid "Calendar doesn't support Free/Busy" - msgstr "Kalender unterstützt keine Verfügbarkeitsinformationen" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4928 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4950 - msgid "Schedule outbox url not found" - msgstr "Adresse des Terminplanausgangs nicht gefunden" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5025 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5047 - msgid "Unexpected result in schedule-response" - msgstr "Unerwartetes Ergebnis in schedule-response" - -@@ -1450,74 +1451,75 @@ - msgstr "Kein Kalender." - - #: ../calendar/backends/http/e-cal-backend-http.c:925 --#: ../calendar/backends/weather/e-cal-backend-weather.c:536 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:700 - msgid "Could not create cache file" - msgstr "Datei zum Zwischenspeichern konnte nicht angelegt werden" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:174 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:196 - msgid "Could not retrieve weather data" - msgstr "Wetterdaten konnten nicht abgerufen werden" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:295 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:369 - msgid "Weather: Fog" - msgstr "Wetter: Nebel" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:296 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:370 - msgid "Weather: Cloudy Night" - msgstr "Wetter: Wolkige Nacht" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:297 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:371 - msgid "Weather: Cloudy" - msgstr "Wetter: Wolkig" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:298 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:372 - msgid "Weather: Overcast" - msgstr "Wetter: Bedeckt" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:299 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:373 - msgid "Weather: Showers" - msgstr "Wetter: Schauer" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:300 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:374 - msgid "Weather: Snow" - msgstr "Wetter: Schnee" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:301 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:375 - msgid "Weather: Clear Night" - msgstr "Wetter: Klare Nacht" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:302 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:376 - msgid "Weather: Sunny" - msgstr "Wetter: Sonnig" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:303 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:377 - msgid "Weather: Thunderstorms" - msgstr "Wetter: Gewitter" - - #. TRANSLATOR: This is the temperature in degrees Fahrenheit (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:329 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:403 - #, c-format - msgid "%.1f °F" - msgstr "%.1f °F" - - #. TRANSLATOR: This is the temperature in degrees Celsius (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:332 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:406 - #, c-format - msgid "%.1f °C" - msgstr "%.1f °C" - - #. TRANSLATOR: This is the temperature in kelvin --#: ../calendar/backends/weather/e-cal-backend-weather.c:335 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:409 - #, c-format - msgid "%.1f K" - msgstr "%.1f K" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:341 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:415 - #, c-format - msgid "%.1f" - msgstr "%.1f" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:452 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:580 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:608 - msgid "Forecast" - msgstr "Vorhersage" - -@@ -1574,7 +1576,7 @@ - msgstr "Legitimierung gescheitert" - - #: ../calendar/libecal/e-cal.c:2330 --#: ../camel/providers/smtp/camel-smtp-transport.c:921 -+#: ../camel/providers/smtp/camel-smtp-transport.c:960 - #: ../libedataserver/e-client.c:147 - msgid "Authentication required" - msgstr "Legitimierung erforderlich" -@@ -1597,17 +1599,17 @@ - msgid "Invalid range" - msgstr "Ungültiger Bereich" - --#: ../calendar/libecal/e-cal-client.c:936 -+#: ../calendar/libecal/e-cal-client.c:970 - #, c-format - msgid "Unknown calendar property '%s'" - msgstr "Unbekannte Kalendereigenschaft »%s«" - --#: ../calendar/libecal/e-cal-client.c:951 -+#: ../calendar/libecal/e-cal-client.c:985 - #, c-format - msgid "Cannot change value of calendar property '%s'" - msgstr "Wert der Kalendereigenschaft »%s« kann nicht geändert werden" - --#: ../calendar/libecal/e-cal-component.c:1348 -+#: ../calendar/libecal/e-cal-component.c:1349 - msgid "Untitled appointment" - msgstr "Namenloser Termin" - -@@ -1756,83 +1758,83 @@ - msgid "Undefined" - msgstr "Nicht festgelegt" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:84 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1062 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1371 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1498 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1547 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:85 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1063 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1379 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1506 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1555 - #, c-format - msgid "\"%s\" expects one argument" - msgstr "»%s« erwartet ein Argument" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:91 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:673 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1378 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:92 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:674 - #: ../calendar/libedata-cal/e-cal-backend-sexp.c:1386 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1394 - #, c-format - msgid "\"%s\" expects the first argument to be a string" - msgstr "»%s« erwartet als erstes Argument eine Zeichenkette" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:166 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:167 - #, c-format - msgid "\"%s\" expects two or three arguments" - msgstr "»%s« erwartet zwei oder drei Argumente" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:173 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:262 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:324 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:823 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1069 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1447 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1505 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1554 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:174 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:263 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:325 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:824 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1070 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1455 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1513 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1562 - #, c-format - msgid "\"%s\" expects the first argument to be a time_t" - msgstr "»%s« erwartet als erstes Argument einen time_t-Wert" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:182 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:270 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:334 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:832 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:183 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:271 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:335 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:833 - #, c-format - msgid "\"%s\" expects the second argument to be a time_t" - msgstr "»%s« erwartet als zweites Argument einen time_t-Wert" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:192 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:193 - #, c-format - msgid "\"%s\" expects the third argument to be a string" - msgstr "»%s« erwartet als drittes Argument eine Zeichenkette" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:254 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:255 - #, c-format - msgid "\"%s\" expects none or two arguments" - msgstr "»%s« erwartet keines oder zwei Argumente" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:317 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:666 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:816 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1440 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:318 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:667 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:817 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1448 - #, c-format - msgid "\"%s\" expects two arguments" - msgstr "»%s« erwartet zwei Argumente" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:602 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:625 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:748 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:780 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:987 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1020 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1332 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:603 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:626 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:749 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:781 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:988 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1021 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1340 - #, c-format - msgid "\"%s\" expects no arguments" - msgstr "»%s« erwartet keine Argumente" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:682 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:683 - #, c-format - msgid "\"%s\" expects the second argument to be a string" - msgstr "»%s« erwartet als zweites Argument eine Zeichenkette" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:713 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:714 - #, c-format - msgid "" - "\"%s\" expects the first argument to be either \"any\", \"summary\", or " -@@ -1842,12 +1844,12 @@ - "»%s« erwartet als erstes Argument entweder »any«, »summary«, »description«, " - "»location«, »attendee«, »organizer« oder »classification«" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:884 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:885 - #, c-format - msgid "\"%s\" expects at least one argument" - msgstr "»%s« erwartet mindestens ein Argument" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:899 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:900 - #, c-format - msgid "" - "\"%s\" expects all arguments to be strings or one and only one argument to " -@@ -1856,13 +1858,14 @@ - "»%s« erwartet als Argumente Zeichenketten, oder aber ein einziges Argument " - "mit dem Wahrheitswert »falsch« (#f)" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1395 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1403 - #, c-format - msgid "\"%s\" expects the first argument to be an ISO 8601 date/time string" - msgstr "" --"»%s« erwartet als erstes Argument eine Datum-/Zeit-Zeichenkette nach ISO 8601" -+"»%s« erwartet als erstes Argument eine Datum-/Zeit-Zeichenkette nach ISO " -+"8601" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1456 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1464 - #, c-format - msgid "\"%s\" expects the second argument to be an integer" - msgstr "»%s« erwartet als zweites Argument eine Ganzzahl" -@@ -2106,36 +2109,36 @@ - msgstr[0] "Neue Nachricht in »%s« wird gefiltert" - msgstr[1] "Neue Nachrichten in »%s« werden gefiltert" - --#: ../camel/camel-folder.c:1011 -+#: ../camel/camel-folder.c:1017 - #: ../camel/providers/local/camel-maildir-folder.c:330 - msgid "Moving messages" - msgstr "Nachrichten werden verschoben" - --#: ../camel/camel-folder.c:1014 -+#: ../camel/camel-folder.c:1020 - msgid "Copying messages" - msgstr "Nachrichten werden kopiert" - --#: ../camel/camel-folder.c:1056 -+#: ../camel/camel-folder.c:1062 - #, c-format - msgid "Quota information not supported for folder '%s'" - msgstr "Kontingent-Informationen werden für Ordner »%s« nicht unterstützt" - --#: ../camel/camel-folder.c:2862 -+#: ../camel/camel-folder.c:2868 - #, c-format - msgid "Expunging folder '%s'" - msgstr "Ordner »%s« wird gesäubert" - --#: ../camel/camel-folder.c:2990 -+#: ../camel/camel-folder.c:2996 - #, c-format - msgid "Retrieving message '%s' in %s" - msgstr "Nachricht »%s« in %s wird abgerufen" - --#: ../camel/camel-folder.c:3181 -+#: ../camel/camel-folder.c:3187 - #, c-format - msgid "Retrieving quota information for '%s'" - msgstr "Kontingent-Informationen für »%s« werden abgerufen" - --#: ../camel/camel-folder.c:3478 -+#: ../camel/camel-folder.c:3484 - #, c-format - msgid "Refreshing folder '%s'" - msgstr "Ordner »%s« wird aktualisiert" -@@ -2172,81 +2175,72 @@ - - #: ../camel/camel-folder-search.c:1943 ../camel/camel-folder-search.c:2109 - #, c-format --msgid "" --"Cannot parse search expression: %s:\n" -+msgid "Cannot parse search expression: %s:\n" - "%s" --msgstr "" --"Syntax des Suchausdrucks konnte nicht analysiert werden: %s:\n" -+msgstr "Syntax des Suchausdrucks konnte nicht analysiert werden: %s:\n" - "%s" - - #: ../camel/camel-folder-search.c:1955 ../camel/camel-folder-search.c:2121 - #, c-format --msgid "" --"Error executing search expression: %s:\n" -+msgid "Error executing search expression: %s:\n" - "%s" --msgstr "" --"Fehler beim Ausführen eines Suchausdrucks: %s:\n" -+msgstr "Fehler beim Ausführen eines Suchausdrucks: %s:\n" - "%s" - --#: ../camel/camel-gpg-context.c:721 ../camel/camel-gpg-context.c:726 --#: ../camel/camel-gpg-context.c:1383 -+#: ../camel/camel-gpg-context.c:725 ../camel/camel-gpg-context.c:730 -+#: ../camel/camel-gpg-context.c:1387 - #, c-format - msgid "Failed to execute gpg: %s" - msgstr "gpg konnte nicht ausgeführt werden: %s" - --#: ../camel/camel-gpg-context.c:726 --#: ../camel/providers/smtp/camel-smtp-transport.c:924 -+#: ../camel/camel-gpg-context.c:730 -+#: ../camel/providers/smtp/camel-smtp-transport.c:963 - msgid "Unknown" - msgstr "Unbekannt" - --#: ../camel/camel-gpg-context.c:791 -+#: ../camel/camel-gpg-context.c:795 - #, c-format --msgid "" --"Unexpected GnuPG status message encountered:\n" -+msgid "Unexpected GnuPG status message encountered:\n" - "\n" - "%s" --msgstr "" --"Nicht erwartete GnuPG-Statusmeldung erhalten:\n" -+msgstr "Nicht erwartete GnuPG-Statusmeldung erhalten:\n" - "\n" - "%s" - --#: ../camel/camel-gpg-context.c:827 -+#: ../camel/camel-gpg-context.c:831 - #, c-format - msgid "Failed to parse gpg userid hint." - msgstr "" - "Die Syntax des gpg-Wink auf die Benutzerkennung konnte nicht analysiert " - "werden." - --#: ../camel/camel-gpg-context.c:852 ../camel/camel-gpg-context.c:867 -+#: ../camel/camel-gpg-context.c:856 ../camel/camel-gpg-context.c:871 - #, c-format - msgid "Failed to parse gpg passphrase request." - msgstr "" - "Die Syntax des gpg-Winks auf das Passwort konnte nicht analysiert werden." - --#: ../camel/camel-gpg-context.c:888 -+#: ../camel/camel-gpg-context.c:892 - #, c-format --msgid "" --"You need a PIN to unlock the key for your\n" -+msgid "You need a PIN to unlock the key for your\n" - "SmartCard: \"%s\"" --msgstr "" --"Für das Entsperren Ihrer SmartCard\n" -+msgstr "Für das Entsperren Ihrer SmartCard\n" - "»%s« ist ein Passwort erforderlich" - --#: ../camel/camel-gpg-context.c:892 -+#: ../camel/camel-gpg-context.c:896 - #, c-format --msgid "" --"You need a passphrase to unlock the key for\n" -+msgid "You need a passphrase to unlock the key for\n" - "user: \"%s\"" - msgstr "" - "Für das Entsperren des Schlüssels für den\n" - "Benutzer %s ist ein Passwort erforderlich." - --#: ../camel/camel-gpg-context.c:898 -+#: ../camel/camel-gpg-context.c:902 - #, c-format - msgid "Unexpected request from GnuPG for '%s'" - msgstr "Unerwartete Anfrage von GnuPG für »%s«" - --#: ../camel/camel-gpg-context.c:910 -+#: ../camel/camel-gpg-context.c:914 - msgid "" - "Note the encrypted content doesn't contain information about a recipient, " - "thus there will be a password prompt for each of stored private key." -@@ -2255,43 +2249,43 @@ - "Empfänger enthält, daher erscheint ein Dialog zur Passworteingabe für jeden " - "gespeicherten geheimen Schlüssel." - --#: ../camel/camel-gpg-context.c:941 ../camel/camel-net-utils.c:524 -+#: ../camel/camel-gpg-context.c:945 ../camel/camel-net-utils.c:524 - #: ../camel/providers/nntp/camel-nntp-summary.c:401 - #: ../libedataserver/e-client.c:158 - #, c-format - msgid "Cancelled" - msgstr "Abgebrochen" - --#: ../camel/camel-gpg-context.c:962 -+#: ../camel/camel-gpg-context.c:966 - #, c-format - msgid "Failed to unlock secret key: 3 bad passphrases given." - msgstr "" - "Geheimschlüssel konnte nicht entsperrt werden: 3 falsche Passwörter " - "eingegeben." - --#: ../camel/camel-gpg-context.c:975 -+#: ../camel/camel-gpg-context.c:979 - #, c-format - msgid "Unexpected response from GnuPG: %s" - msgstr "Unerwartete GnuPG-Antwort: %s" - --#: ../camel/camel-gpg-context.c:1106 -+#: ../camel/camel-gpg-context.c:1110 - #, c-format - msgid "Failed to encrypt: No valid recipients specified." - msgstr "" - "Nachricht konnte nicht verschlüsselt werden: keine gültigen Empfänger " - "angegeben." - --#: ../camel/camel-gpg-context.c:1658 ../camel/camel-smime-context.c:844 -+#: ../camel/camel-gpg-context.c:1662 ../camel/camel-smime-context.c:844 - msgid "Could not generate signing data: " - msgstr "Signaturdaten konnten nicht erzeugt werden:" - --#: ../camel/camel-gpg-context.c:1708 ../camel/camel-gpg-context.c:1920 --#: ../camel/camel-gpg-context.c:2030 ../camel/camel-gpg-context.c:2179 -+#: ../camel/camel-gpg-context.c:1712 ../camel/camel-gpg-context.c:1924 -+#: ../camel/camel-gpg-context.c:2034 ../camel/camel-gpg-context.c:2183 - msgid "Failed to execute gpg." - msgstr "gpg konnte nicht ausgeführt werden." - --#: ../camel/camel-gpg-context.c:1791 ../camel/camel-gpg-context.c:1799 --#: ../camel/camel-gpg-context.c:1807 ../camel/camel-gpg-context.c:1827 -+#: ../camel/camel-gpg-context.c:1795 ../camel/camel-gpg-context.c:1803 -+#: ../camel/camel-gpg-context.c:1811 ../camel/camel-gpg-context.c:1831 - #: ../camel/camel-smime-context.c:973 ../camel/camel-smime-context.c:987 - #: ../camel/camel-smime-context.c:996 - #, c-format -@@ -2300,31 +2294,31 @@ - "Nachrichtensignatur konnte nicht verifiziert werden: Nachrichtenformat " - "fehlerhaft" - --#: ../camel/camel-gpg-context.c:1873 -+#: ../camel/camel-gpg-context.c:1877 - msgid "Cannot verify message signature: " - msgstr "Nachrichtensignatur konnte nicht verifiziert werden:" - --#: ../camel/camel-gpg-context.c:1996 -+#: ../camel/camel-gpg-context.c:2000 - msgid "Could not generate encrypting data: " - msgstr "Verschlüsselungsdaten konnten nicht erzeugt werden:" - --#: ../camel/camel-gpg-context.c:2049 -+#: ../camel/camel-gpg-context.c:2053 - msgid "This is a digitally encrypted message part" - msgstr "Dies ist ein digital verschlüsselter Nachrichtenteil" - --#: ../camel/camel-gpg-context.c:2105 ../camel/camel-gpg-context.c:2114 --#: ../camel/camel-gpg-context.c:2137 -+#: ../camel/camel-gpg-context.c:2109 ../camel/camel-gpg-context.c:2118 -+#: ../camel/camel-gpg-context.c:2141 - #, c-format - msgid "Cannot decrypt message: Incorrect message format" - msgstr "" - "Nachricht konnte nicht entschlüsselt werden: Nachrichtenformat fehlerhaft" - --#: ../camel/camel-gpg-context.c:2125 -+#: ../camel/camel-gpg-context.c:2129 - #, c-format - msgid "Failed to decrypt MIME part: protocol error" - msgstr "MIME-Teil konnte nicht entschlüsselt werden: Protokollfehler" - --#: ../camel/camel-gpg-context.c:2220 ../camel/camel-smime-context.c:1289 -+#: ../camel/camel-gpg-context.c:2224 ../camel/camel-smime-context.c:1289 - msgid "Encrypted content" - msgstr "Verschlüsselter Inhalt" - -@@ -2525,29 +2519,23 @@ - - #: ../camel/camel-sasl-anonymous.c:79 - #, c-format --msgid "" --"Invalid email address trace information:\n" -+msgid "Invalid email address trace information:\n" - "%s" --msgstr "" --"Ungültige E-Mail-Adressverfolgungsinformationen:\n" -+msgstr "Ungültige E-Mail-Adressverfolgungsinformationen:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:93 - #, c-format --msgid "" --"Invalid opaque trace information:\n" -+msgid "Invalid opaque trace information:\n" - "%s" --msgstr "" --"Ungültige opake Verfolgungsinformationen:\n" -+msgstr "Ungültige opake Verfolgungsinformationen:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:107 - #, c-format --msgid "" --"Invalid trace information:\n" -+msgid "Invalid trace information:\n" - "%s" --msgstr "" --"Ungültige Verfolgungsinformationen:\n" -+msgstr "Ungültige Verfolgungsinformationen:\n" - "%s" - - #: ../camel/camel-sasl-cram-md5.c:44 -@@ -2611,7 +2599,8 @@ - msgstr "GSSAPI" - - #: ../camel/camel-sasl-gssapi.c:97 --msgid "This option will connect to the server using Kerberos 5 authentication." -+msgid "" -+"This option will connect to the server using Kerberos 5 authentication." - msgstr "" - "Dies stellt eine Verbindung mit dem Server her und verwendet zur " - "Legitimierung Kerberos 5" -@@ -2693,7 +2682,7 @@ - - #: ../camel/camel-sasl-gssapi.c:223 ../camel/camel-sasl-gssapi.c:405 - #: ../camel/camel-sasl-gssapi.c:454 ../camel/camel-sasl-gssapi.c:471 --#: ../camel/providers/smtp/camel-smtp-transport.c:622 -+#: ../camel/providers/smtp/camel-smtp-transport.c:659 - #, c-format - msgid "Bad authentication response from server." - msgstr "Fehlerhafte Legitimierungsantwort vom Server." -@@ -2727,8 +2716,8 @@ - "This option will connect to a Windows-based server using NTLM / Secure " - "Password Authentication." - msgstr "" --"Mit dieser Option werden Sie mit einem Windows-basierten Server, der " --"NTLM/»Secure Password Authentication« verwendet, verbunden." -+"Mit dieser Option werden Sie mit einem Windows-basierten Server, der NTLM/" -+"»Secure Password Authentication« verwendet, verbunden." - - #: ../camel/camel-sasl-plain.c:42 - msgid "PLAIN" -@@ -2749,7 +2738,8 @@ - #: ../camel/camel-sasl-popb4smtp.c:96 - #, c-format - msgid "POP Before SMTP authentication using an unknown transport" --msgstr "POP-vor-SMTP-Legitimierung mit einem unbekannten Übertragungsverfahren" -+msgstr "" -+"POP-vor-SMTP-Legitimierung mit einem unbekannten Übertragungsverfahren" - - #: ../camel/camel-sasl-popb4smtp.c:108 ../camel/camel-sasl-popb4smtp.c:117 - #, c-format -@@ -2767,10 +2757,10 @@ - msgstr "Ungültiger GType registriert für Protokoll »%s«" - - #: ../camel/camel-session.c:502 --#: ../camel/providers/imapx/camel-imapx-server.c:4734 -+#: ../camel/providers/imapx/camel-imapx-server.c:4821 - #: ../camel/providers/pop3/camel-pop3-store.c:311 --#: ../camel/providers/pop3/camel-pop3-store.c:757 --#: ../camel/providers/smtp/camel-smtp-transport.c:515 -+#: ../camel/providers/pop3/camel-pop3-store.c:766 -+#: ../camel/providers/smtp/camel-smtp-transport.c:545 - #, c-format - msgid "No support for %s authentication" - msgstr "Keine Unterstützung für Legitimierungstyp %s" -@@ -2981,49 +2971,53 @@ - msgid "S/MIME Decrypt: No encrypted content found" - msgstr "S/MIME-Entschlüsselung: Kein entschlüsselter Inhalt gefunden" - --#: ../camel/camel-store.c:1232 -+#: ../camel/camel-store.c:1238 - #, c-format - msgid "Opening folder '%s'" - msgstr "Ordner »%s« wird geöffnet" - --#: ../camel/camel-store.c:1523 -+#: ../camel/camel-store.c:1529 - #, c-format - msgid "Scanning folders in '%s'" - msgstr "Ordner in »%s« werden eingelesen" - --#: ../camel/camel-store.c:1551 ../camel/camel-store.c:1596 -+#: ../camel/camel-store.c:1557 ../camel/camel-store.c:1602 - #: ../camel/camel-vtrash-folder.c:46 - msgid "Trash" - msgstr "Papierkorb" - --#: ../camel/camel-store.c:1565 ../camel/camel-store.c:1613 -+#: ../camel/camel-store.c:1571 ../camel/camel-store.c:1619 - #: ../camel/camel-vtrash-folder.c:48 - msgid "Junk" - msgstr "Unerwünscht" - --#: ../camel/camel-store.c:2214 -+#: ../camel/camel-store.c:2220 - #, c-format - msgid "Cannot create folder: %s: folder exists" - msgstr "Ordner konnte nicht angelegt werden: %s: Ordner existiert" - --#: ../camel/camel-store.c:2221 -+#: ../camel/camel-store.c:2227 - #, c-format - msgid "Creating folder '%s'" - msgstr "Ordner »%s« wird angelegt" - --#: ../camel/camel-store.c:2398 ../camel/camel-vee-store.c:410 --#: ../camel/providers/local/camel-maildir-store.c:321 -+#: ../camel/camel-store.c:2404 ../camel/camel-vee-store.c:410 -+#: ../camel/providers/local/camel-maildir-store.c:346 - #, c-format - msgid "Cannot delete folder: %s: Invalid operation" - msgstr "Ordner konnte nicht gelöscht werden: %s: Ungültiger Vorgang" - --#: ../camel/camel-store.c:2588 ../camel/camel-vee-store.c:461 --#: ../camel/providers/local/camel-maildir-store.c:872 -+#: ../camel/camel-store.c:2594 ../camel/camel-vee-store.c:461 -+#: ../camel/providers/local/camel-maildir-store.c:914 - #, c-format - msgid "Cannot rename folder: %s: Invalid operation" - msgstr "Ordner konnte nicht umbenannt werden: %s: Ungültiger Vorgang" - --#: ../camel/camel-stream.c:285 ../camel/camel-stream.c:336 -+#: ../camel/camel-stream.c:170 -+msgid "Cannot write with no base stream" -+msgstr "Kann ohne Basis-Datenstrom nicht geschrieben werden" -+ -+#: ../camel/camel-stream.c:290 ../camel/camel-stream.c:341 - #, c-format - msgid "Stream type '%s' is not seekable" - msgstr "Datenstromtyp »%s« kann nicht durchsucht werden" -@@ -3228,7 +3222,8 @@ - - #: ../camel/providers/imapx/camel-imapx-provider.c:72 - msgid "Only check for Junk messages in the IN_BOX folder" --msgstr "A_usschließlich den Eingangsordner auf unerwünschte Nachrichten prüfen" -+msgstr "" -+"A_usschließlich den Eingangsordner auf unerwünschte Nachrichten prüfen" - - #: ../camel/providers/imapx/camel-imapx-provider.c:74 - msgid "Automatically synchroni_ze remote mail locally" -@@ -3250,228 +3245,228 @@ - msgid "For reading and storing mail on IMAP servers." - msgstr "Zum Lesen und Speichern von E-Mails auf IMAP-Servern." - --#: ../camel/providers/imapx/camel-imapx-server.c:1009 - #: ../camel/providers/imapx/camel-imapx-server.c:1016 -+#: ../camel/providers/imapx/camel-imapx-server.c:1023 - #, c-format - msgid "Not authenticated" - msgstr "Nicht legitimiert" - --#: ../camel/providers/imapx/camel-imapx-server.c:1713 -+#: ../camel/providers/imapx/camel-imapx-server.c:1751 - msgid "Server disconnected" - msgstr "Serververbindung wurde getrennt" - --#: ../camel/providers/imapx/camel-imapx-server.c:2205 -+#: ../camel/providers/imapx/camel-imapx-server.c:2252 - msgid "Error writing to cache stream" - msgstr "Fehler beim Schreiben in den Zwischenspeicher-Datenstrom" - --#: ../camel/providers/imapx/camel-imapx-server.c:3565 -+#: ../camel/providers/imapx/camel-imapx-server.c:3640 - msgid "Error performing IDLE" - msgstr "Fehler beim Ausführen von IDLE" - --#: ../camel/providers/imapx/camel-imapx-server.c:4573 -+#: ../camel/providers/imapx/camel-imapx-server.c:4660 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: %s" - msgstr "Verbindung mit IMAP-Server %s im sicheren Modus ist gescheitert: %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:4574 --#: ../camel/providers/smtp/camel-smtp-transport.c:215 -+#: ../camel/providers/imapx/camel-imapx-server.c:4661 -+#: ../camel/providers/smtp/camel-smtp-transport.c:216 - msgid "STARTTLS not supported" - msgstr "STARTTLS nicht unterstützt" - --#: ../camel/providers/imapx/camel-imapx-server.c:4634 -+#: ../camel/providers/imapx/camel-imapx-server.c:4721 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: " - msgstr "Verbindung mit IMAP-Server %s im sicheren Modus ist gescheitert:" - --#: ../camel/providers/imapx/camel-imapx-server.c:4723 -+#: ../camel/providers/imapx/camel-imapx-server.c:4810 - #, c-format - msgid "IMAP server %s does not support %s authentication" - msgstr "IMAP-Server %s unterstützt den Legitimierungstyp %s nicht" - --#: ../camel/providers/imapx/camel-imapx-server.c:4753 -+#: ../camel/providers/imapx/camel-imapx-server.c:4840 - #: ../camel/providers/nntp/camel-nntp-store.c:394 - #: ../camel/providers/nntp/camel-nntp-store.c:531 - msgid "Cannot authenticate without a username" - msgstr "Legitimierung ohne Benutzername ist nicht möglich" - --#: ../camel/providers/imapx/camel-imapx-server.c:4762 -+#: ../camel/providers/imapx/camel-imapx-server.c:4849 - #: ../camel/providers/nntp/camel-nntp-store.c:540 - #: ../camel/providers/pop3/camel-pop3-store.c:678 --#: ../camel/providers/pop3/camel-pop3-store.c:699 -+#: ../camel/providers/pop3/camel-pop3-store.c:708 - msgid "Authentication password not available" - msgstr "Legitimierungspasswort ist nicht verfügbar" - --#: ../camel/providers/imapx/camel-imapx-server.c:4998 --#: ../camel/providers/imapx/camel-imapx-server.c:5057 -+#: ../camel/providers/imapx/camel-imapx-server.c:5085 -+#: ../camel/providers/imapx/camel-imapx-server.c:5144 - msgid "Error fetching message" - msgstr "Fehler beim Abrufen der Nachricht" - --#: ../camel/providers/imapx/camel-imapx-server.c:5050 -+#: ../camel/providers/imapx/camel-imapx-server.c:5137 - msgid "Failed to close the tmp stream" - msgstr "Temporärer Datenstrom konnte nicht geschlossen werden" - --#: ../camel/providers/imapx/camel-imapx-server.c:5086 -+#: ../camel/providers/imapx/camel-imapx-server.c:5173 - msgid "Failed to copy the tmp file" - msgstr "Temporäre Datei konnte nicht kopiert werden" - --#: ../camel/providers/imapx/camel-imapx-server.c:5227 -+#: ../camel/providers/imapx/camel-imapx-server.c:5345 - msgid "Error moving messages" - msgstr "Fehler beim Verschieben von Nachrichten" - --#: ../camel/providers/imapx/camel-imapx-server.c:5231 -+#: ../camel/providers/imapx/camel-imapx-server.c:5349 - msgid "Error copying messages" - msgstr "Fehler beim Kopieren von Nachrichten" - --#: ../camel/providers/imapx/camel-imapx-server.c:5453 -+#: ../camel/providers/imapx/camel-imapx-server.c:5579 - msgid "Error appending message" - msgstr "Fehler beim Anhängen der Nachricht" - --#: ../camel/providers/imapx/camel-imapx-server.c:5689 -+#: ../camel/providers/imapx/camel-imapx-server.c:5815 - msgid "Error fetching message headers" - msgstr "Fehler beim Holen der Nachrichtenkopfzeilen" - --#: ../camel/providers/imapx/camel-imapx-server.c:5856 -+#: ../camel/providers/imapx/camel-imapx-server.c:5982 - msgid "Error retrieving message" - msgstr "Fehler beim Abrufen der Nachricht" - --#: ../camel/providers/imapx/camel-imapx-server.c:5990 --#: ../camel/providers/imapx/camel-imapx-server.c:6219 -+#: ../camel/providers/imapx/camel-imapx-server.c:6116 -+#: ../camel/providers/imapx/camel-imapx-server.c:6345 - #, c-format - msgid "Fetching summary information for new messages in '%s'" - msgstr "" - "Zusammenfassende Informationen für neue Nachrichten in »%s« werden abgerufen" - --#: ../camel/providers/imapx/camel-imapx-server.c:6042 -+#: ../camel/providers/imapx/camel-imapx-server.c:6168 - #, c-format - msgid "Scanning for changed messages in '%s'" - msgstr "Geänderte Nachrichten werden in »%s« gesucht" - --#: ../camel/providers/imapx/camel-imapx-server.c:6094 -+#: ../camel/providers/imapx/camel-imapx-server.c:6220 - msgid "Error fetching new messages" - msgstr "Fehler beim Abrufen neuer Nachrichten" - --#: ../camel/providers/imapx/camel-imapx-server.c:6367 -+#: ../camel/providers/imapx/camel-imapx-server.c:6493 - msgid "Error refreshing folder" - msgstr "Fehler beim Aktualisieren des Ordners" - --#: ../camel/providers/imapx/camel-imapx-server.c:6517 -+#: ../camel/providers/imapx/camel-imapx-server.c:6643 - msgid "Error expunging message" - msgstr "Fehler beim Löschen der Nachricht" - --#: ../camel/providers/imapx/camel-imapx-server.c:6632 --#: ../camel/providers/imapx/camel-imapx-server.c:6657 -+#: ../camel/providers/imapx/camel-imapx-server.c:6758 -+#: ../camel/providers/imapx/camel-imapx-server.c:6783 - msgid "Error fetching folders" - msgstr "Fehler beim Abrufen der Ordner" - --#: ../camel/providers/imapx/camel-imapx-server.c:6737 -+#: ../camel/providers/imapx/camel-imapx-server.c:6863 - msgid "Error creating folder" - msgstr "Fehler beim Anlegen des Ordners" - --#: ../camel/providers/imapx/camel-imapx-server.c:6789 -+#: ../camel/providers/imapx/camel-imapx-server.c:6915 - msgid "Error deleting folder" - msgstr "Fehler beim Löschen des Ordners" - --#: ../camel/providers/imapx/camel-imapx-server.c:6865 -+#: ../camel/providers/imapx/camel-imapx-server.c:6991 - msgid "Error renaming folder" - msgstr "Fehler beim Umbenennen des Ordners" - --#: ../camel/providers/imapx/camel-imapx-server.c:6939 -+#: ../camel/providers/imapx/camel-imapx-server.c:7065 - msgid "Error subscribing to folder" - msgstr "Fehler beim Abonnieren des Ordners" - --#: ../camel/providers/imapx/camel-imapx-server.c:7005 -+#: ../camel/providers/imapx/camel-imapx-server.c:7131 - msgid "Error unsubscribing from folder" - msgstr "Fehler beim Kündigen des Abonnement des Ordners" - --#: ../camel/providers/imapx/camel-imapx-server.c:7067 -+#: ../camel/providers/imapx/camel-imapx-server.c:7193 - msgid "Error retrieving quota information" - msgstr "Fehler beim Abrufen der Kontingent-Informationen" - --#: ../camel/providers/imapx/camel-imapx-server.c:7119 -+#: ../camel/providers/imapx/camel-imapx-server.c:7245 - msgid "Search failed" - msgstr "Suche fehlgeschlagen" - --#: ../camel/providers/imapx/camel-imapx-server.c:7181 -+#: ../camel/providers/imapx/camel-imapx-server.c:7307 - msgid "Error performing NOOP" - msgstr "Fehler beim Ausführen von NOOP" - --#: ../camel/providers/imapx/camel-imapx-server.c:7288 -+#: ../camel/providers/imapx/camel-imapx-server.c:7414 - msgid "Error syncing changes" - msgstr "Fehler beim Abgleichen der Änderungen" - --#: ../camel/providers/imapx/camel-imapx-server.c:8275 -+#: ../camel/providers/imapx/camel-imapx-server.c:8446 - #, c-format - msgid "Cannot get message with message ID %s: %s" - msgstr "Nachricht mit Kennung %s konnte nicht abgerufen werden: %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:8276 -+#: ../camel/providers/imapx/camel-imapx-server.c:8447 - msgid "No such message available." - msgstr "Nachricht nicht verfügbar." - --#: ../camel/providers/imapx/camel-imapx-server.c:8483 --#: ../camel/providers/imapx/camel-imapx-server.c:8504 -+#: ../camel/providers/imapx/camel-imapx-server.c:8671 -+#: ../camel/providers/imapx/camel-imapx-server.c:8692 - msgid "Cannot create spool file: " - msgstr "Spool-Datei konnte nicht angelegt werden:" - --#: ../camel/providers/imapx/camel-imapx-server.c:9256 -+#: ../camel/providers/imapx/camel-imapx-server.c:9502 - msgid "IMAP server does not support quotas" - msgstr "IMAP-Server unterstützt keine Kontingente" - - #. create a dummy "." parent inbox, use to scan, then put back at the top level - #: ../camel/providers/imapx/camel-imapx-store.c:223 - #: ../camel/providers/local/camel-maildir-folder.c:482 --#: ../camel/providers/local/camel-maildir-store.c:322 --#: ../camel/providers/local/camel-maildir-store.c:784 --#: ../camel/providers/local/camel-maildir-store.c:790 --#: ../camel/providers/local/camel-maildir-store.c:873 -+#: ../camel/providers/local/camel-maildir-store.c:347 -+#: ../camel/providers/local/camel-maildir-store.c:826 -+#: ../camel/providers/local/camel-maildir-store.c:832 -+#: ../camel/providers/local/camel-maildir-store.c:915 - #: ../camel/providers/local/camel-spool-store.c:393 - msgid "Inbox" - msgstr "Eingang" - --#: ../camel/providers/imapx/camel-imapx-store.c:758 -+#: ../camel/providers/imapx/camel-imapx-store.c:757 - #, c-format - msgid "IMAP server %s" - msgstr "IMAP-Server %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:761 -+#: ../camel/providers/imapx/camel-imapx-store.c:760 - #, c-format - msgid "IMAP service for %s on %s" - msgstr "IMAP-Dienst für %s auf %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:836 -+#: ../camel/providers/imapx/camel-imapx-store.c:835 - #: ../camel/providers/nntp/camel-nntp-provider.c:93 - #: ../camel/providers/pop3/camel-pop3-provider.c:81 - msgid "Password" - msgstr "Passwort" - --#: ../camel/providers/imapx/camel-imapx-store.c:838 --msgid "This option will connect to the IMAP server using a plaintext password." -+#: ../camel/providers/imapx/camel-imapx-store.c:837 -+msgid "" -+"This option will connect to the IMAP server using a plaintext password." - msgstr "" - "Dies stellt unter Verwendung eines unverschlüsselten Passworts eine " - "Verbindung mit dem IMAP-Server her." - --#: ../camel/providers/imapx/camel-imapx-store.c:913 -+#: ../camel/providers/imapx/camel-imapx-store.c:916 - #, c-format - msgid "No such folder %s" - msgstr "Ordner »%s« nicht vorhanden" - --#: ../camel/providers/imapx/camel-imapx-store.c:1324 -+#: ../camel/providers/imapx/camel-imapx-store.c:1344 - #, c-format - msgid "No IMAP namespace for folder path '%s'" - msgstr "Kein IMAP-Namensraum für Ordnerpfad »%s«" - --#: ../camel/providers/imapx/camel-imapx-store.c:1472 -+#: ../camel/providers/imapx/camel-imapx-store.c:1609 - #, c-format - msgid "Retrieving folder list for %s" - msgstr "Ordnerliste für »%s« wird abgerufen" - --#: ../camel/providers/imapx/camel-imapx-store.c:1924 -+#: ../camel/providers/imapx/camel-imapx-store.c:2061 - #, c-format --msgid "" --"The folder name \"%s\" is invalid because it contains the character \"%c\"" -+msgid "The folder name \"%s\" is invalid because it contains the character \"%c\"" - msgstr "Der Ordnername »%s« ist ungültig, da er das Zeichen »%c« enthält" - --#: ../camel/providers/imapx/camel-imapx-store.c:2689 -+#: ../camel/providers/imapx/camel-imapx-store.c:2833 - #: ../camel/providers/nntp/camel-nntp-store.c:1250 - #: ../camel/providers/pop3/camel-pop3-folder.c:450 - #: ../camel/providers/pop3/camel-pop3-folder.c:593 -@@ -3481,7 +3476,7 @@ - #: ../camel/providers/pop3/camel-pop3-store.c:528 - #: ../camel/providers/pop3/camel-pop3-store.c:576 - #: ../camel/providers/pop3/camel-pop3-store.c:668 --#: ../camel/providers/pop3/camel-pop3-store.c:1072 -+#: ../camel/providers/pop3/camel-pop3-store.c:1081 - #, c-format - msgid "You must be working online to complete this operation" - msgstr "Sie müssen online arbeiten, um diesen Vorgang abzuschließen" -@@ -3508,11 +3503,9 @@ - - #: ../camel/providers/local/camel-local-folder.c:730 - #, c-format --msgid "" --"Cannot get message %s from folder %s\n" -+msgid "Cannot get message %s from folder %s\n" - "%s" --msgstr "" --"Nachricht %s konnte nicht aus Ordner %s abgerufen werden\n" -+msgstr "Nachricht %s konnte nicht aus Ordner %s abgerufen werden\n" - "%s" - - #: ../camel/providers/local/camel-local-provider.c:41 -@@ -3587,7 +3580,7 @@ - - #: ../camel/providers/local/camel-local-store.c:221 - #: ../camel/providers/local/camel-local-store.c:381 --#: ../camel/providers/local/camel-maildir-store.c:122 -+#: ../camel/providers/local/camel-maildir-store.c:123 - #: ../camel/providers/local/camel-mbox-store.c:572 - #: ../camel/providers/local/camel-spool-store.c:87 - #, c-format -@@ -3602,7 +3595,7 @@ - #: ../camel/providers/local/camel-local-store.c:242 - #: ../camel/providers/local/camel-local-store.c:252 - #: ../camel/providers/local/camel-local-store.c:394 --#: ../camel/providers/local/camel-maildir-store.c:156 -+#: ../camel/providers/local/camel-maildir-store.c:165 - #, c-format - msgid "Cannot get folder: %s: %s" - msgstr "Ordner konnte nicht abgerufen werden: %s: %s" -@@ -3624,7 +3617,7 @@ - msgid "Could not delete folder meta file '%s': %s" - msgstr "Ordner-Metadatei »%s« konnte nicht gelöscht werden: %s" - --#: ../camel/providers/local/camel-local-store.c:594 -+#: ../camel/providers/local/camel-local-store.c:595 - #, c-format - msgid "Could not rename '%s': %s" - msgstr "»%s« konnte nicht umbenannt werden: %s" -@@ -3656,53 +3649,59 @@ - msgid "Cannot transfer message to destination folder: %s" - msgstr "Nachricht kann nicht in den Zielordner übertragen werden: %s" - --#: ../camel/providers/local/camel-maildir-store.c:130 --#: ../camel/providers/local/camel-maildir-store.c:149 --#: ../camel/providers/local/camel-maildir-store.c:881 -+#: ../camel/providers/local/camel-maildir-store.c:131 -+#: ../camel/providers/local/camel-maildir-store.c:931 -+#, c-format -+msgid "Cannot create folder containing '%s'" -+msgstr "Ordner mit »%s« konnte nicht angelegt werden" -+ -+#: ../camel/providers/local/camel-maildir-store.c:139 -+#: ../camel/providers/local/camel-maildir-store.c:158 -+#: ../camel/providers/local/camel-maildir-store.c:923 - #, c-format - msgid "Folder %s already exists" - msgstr "Ordner %s existiert bereits" - --#: ../camel/providers/local/camel-maildir-store.c:241 --#: ../camel/providers/local/camel-maildir-store.c:272 -+#: ../camel/providers/local/camel-maildir-store.c:266 -+#: ../camel/providers/local/camel-maildir-store.c:297 - #: ../camel/providers/local/camel-mbox-store.c:401 - #: ../camel/providers/local/camel-mbox-store.c:422 - #, c-format - msgid "Cannot create folder '%s': %s" - msgstr "Ordner »%s« konnte nicht angelegt werden: %s" - --#: ../camel/providers/local/camel-maildir-store.c:256 -+#: ../camel/providers/local/camel-maildir-store.c:281 - #: ../camel/providers/local/camel-mbox-store.c:367 - #: ../camel/providers/local/camel-mh-store.c:523 - #, c-format - msgid "Cannot get folder '%s': %s" - msgstr "Ordner »%s« konnte nicht abgerufen werden: %s" - --#: ../camel/providers/local/camel-maildir-store.c:262 -+#: ../camel/providers/local/camel-maildir-store.c:287 - #: ../camel/providers/local/camel-mbox-store.c:377 - #: ../camel/providers/local/camel-mh-store.c:532 - #, c-format - msgid "Cannot get folder '%s': folder does not exist." - msgstr "Ordner »%s« konnte nicht abgerufen werden: Ordner existiert nicht." - --#: ../camel/providers/local/camel-maildir-store.c:289 -+#: ../camel/providers/local/camel-maildir-store.c:314 - #, c-format - msgid "Cannot get folder '%s': not a maildir directory." - msgstr "Ordner »%s« konnte nicht abgerufen werden: kein Maildir-Ordner." - --#: ../camel/providers/local/camel-maildir-store.c:353 --#: ../camel/providers/local/camel-maildir-store.c:393 -+#: ../camel/providers/local/camel-maildir-store.c:378 -+#: ../camel/providers/local/camel-maildir-store.c:418 - #: ../camel/providers/local/camel-mh-store.c:676 - #, c-format - msgid "Could not delete folder '%s': %s" - msgstr "Ordner »%s« konnte nicht gelöscht werden: %s" - --#: ../camel/providers/local/camel-maildir-store.c:355 -+#: ../camel/providers/local/camel-maildir-store.c:380 - msgid "not a maildir directory" - msgstr "kein Maildir-Ordner" - --#: ../camel/providers/local/camel-maildir-store.c:637 --#: ../camel/providers/local/camel-maildir-store.c:1095 -+#: ../camel/providers/local/camel-maildir-store.c:666 -+#: ../camel/providers/local/camel-maildir-store.c:1146 - #: ../camel/providers/local/camel-spool-store.c:212 - #: ../camel/providers/local/camel-spool-store.c:231 - #, c-format -@@ -3780,11 +3779,9 @@ - #: ../camel/providers/local/camel-mbox-store.c:663 - #: ../camel/providers/local/camel-mbox-store.c:692 - #, c-format --msgid "" --"Could not delete folder '%s':\n" -+msgid "Could not delete folder '%s':\n" - "%s" --msgstr "" --"Ordner »%s« konnte nicht gelöscht werden:\n" -+msgstr "Ordner »%s« konnte nicht gelöscht werden:\n" - "%s" - - #: ../camel/providers/local/camel-mbox-store.c:673 -@@ -3949,11 +3946,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:494 - #, c-format --msgid "" --"Could not open folder '%s':\n" -+msgid "Could not open folder '%s':\n" - "%s" --msgstr "" --"Ordner »%s« konnte nicht geöffnet werden:\n" -+msgstr "Ordner »%s« konnte nicht geöffnet werden:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:500 -@@ -3963,11 +3958,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:508 - #, c-format --msgid "" --"Could not create folder '%s':\n" -+msgid "Could not create folder '%s':\n" - "%s" --msgstr "" --"Ordner »%s« konnte nicht angelegt werden:\n" -+msgstr "Ordner »%s« konnte nicht angelegt werden:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:521 -@@ -4059,7 +4052,8 @@ - #: ../camel/providers/nntp/camel-nntp-provider.c:46 - msgid "" - "_Show folders in short notation (e.g. c.o.linux rather than comp.os.linux)" --msgstr "Ordner in _Kurznotation verwenden (also c.o.linux statt comp.os.linux)" -+msgstr "" -+"Ordner in _Kurznotation verwenden (also c.o.linux statt comp.os.linux)" - - #: ../camel/providers/nntp/camel-nntp-provider.c:49 - msgid "In the subscription _dialog, show relative folder names" -@@ -4115,12 +4109,10 @@ - - #: ../camel/providers/nntp/camel-nntp-store.c:1151 - #, c-format --msgid "" --"Error retrieving newsgroups:\n" -+msgid "Error retrieving newsgroups:\n" - "\n" - "%s" --msgstr "" --"Fehler beim Abrufen von Newsgroups:\n" -+msgstr "Fehler beim Abrufen von Newsgroups:\n" - "\n" - "%s" - -@@ -4155,8 +4147,7 @@ - - #: ../camel/providers/nntp/camel-nntp-store.c:1583 - #, c-format --msgid "" --"You cannot unsubscribe to this newsgroup:\n" -+msgid "You cannot unsubscribe to this newsgroup:\n" - "\n" - "newsgroup does not exist!" - msgstr "Sie können diese Newsgroup nicht abonnieren, da sie nicht existiert." -@@ -4347,7 +4338,16 @@ - msgid "POP3 server for %s on %s" - msgstr "POP3-Dienst für %s auf %s" - --#: ../camel/providers/pop3/camel-pop3-store.c:713 -+#: ../camel/providers/pop3/camel-pop3-store.c:690 -+#: ../camel/providers/pop3/camel-pop3-store.c:777 -+#, c-format -+msgid "Unable to connect to POP server %s.\n" -+"Error sending password: " -+msgstr "" -+"Verbindung mit POP-Server %s konnte nicht hergestellt werden.\n" -+"Fehler beim Übermitteln des Passworts:" -+ -+#: ../camel/providers/pop3/camel-pop3-store.c:722 - #, c-format - msgid "" - "Unable to connect to POP server %s:\tInvalid APOP ID received. Impersonation " -@@ -4357,32 +4357,22 @@ - "Kennung erhalten. Es könnte sich um einen sogenannten »Man in the Middle«-" - "Angriff handeln. Bitte kontaktieren Sie Ihren System-Administrator." - --#: ../camel/providers/pop3/camel-pop3-store.c:768 --#, c-format --msgid "" --"Unable to connect to POP server %s.\n" --"Error sending password: " --msgstr "" --"Verbindung mit POP-Server %s konnte nicht hergestellt werden.\n" --"Fehler beim Übermitteln des Passworts:" -- - #. Translators: Last %s is an optional explanation - #. * beginning with ": " separator. --#: ../camel/providers/pop3/camel-pop3-store.c:783 -+#: ../camel/providers/pop3/camel-pop3-store.c:792 - #, c-format --msgid "" --"Unable to connect to POP server %s.\n" -+msgid "Unable to connect to POP server %s.\n" - "Error sending username%s" - msgstr "" - "Verbindung mit POP-Server %s konnte nicht hergestellt werden.\n" - "Fehler beim Übermitteln des Benutzernamens %s" - --#: ../camel/providers/pop3/camel-pop3-store.c:865 -+#: ../camel/providers/pop3/camel-pop3-store.c:874 - #, c-format - msgid "No such folder '%s'." - msgstr "Ordner »%s« existiert nicht." - --#: ../camel/providers/pop3/camel-pop3-store.c:882 -+#: ../camel/providers/pop3/camel-pop3-store.c:891 - #, c-format - msgid "POP3 stores have no folder hierarchy" - msgstr "POP3-Postfächer haben keine Ordnerstruktur" -@@ -4480,222 +4470,222 @@ - msgstr "" - "Zum Zustellen von E-Mails per SMTP über einen entfernten E-Mail-Knotenpunkt." - --#: ../camel/providers/smtp/camel-smtp-transport.c:170 --#: ../camel/providers/smtp/camel-smtp-transport.c:178 -+#: ../camel/providers/smtp/camel-smtp-transport.c:171 -+#: ../camel/providers/smtp/camel-smtp-transport.c:179 - msgid "Welcome response error: " - msgstr "Fehler bei Welcome-Antwort:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:214 -+#: ../camel/providers/smtp/camel-smtp-transport.c:215 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: %s" - msgstr "Verbindung mit SMTP-Server %s im sicheren Modus ist gescheitert: %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:224 --#: ../camel/providers/smtp/camel-smtp-transport.c:238 --#: ../camel/providers/smtp/camel-smtp-transport.c:246 -+#: ../camel/providers/smtp/camel-smtp-transport.c:225 -+#: ../camel/providers/smtp/camel-smtp-transport.c:240 -+#: ../camel/providers/smtp/camel-smtp-transport.c:248 - msgid "STARTTLS command failed: " - msgstr "STARTTLS-Befehl gescheitert:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:265 -+#: ../camel/providers/smtp/camel-smtp-transport.c:267 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: " - msgstr "Verbindung mit SMTP-Server %s im sicheren Modus ist gescheitert:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:357 -+#: ../camel/providers/smtp/camel-smtp-transport.c:359 - #, c-format - msgid "SMTP server %s" - msgstr "SMTP-Server %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:360 -+#: ../camel/providers/smtp/camel-smtp-transport.c:362 - #, c-format - msgid "SMTP mail delivery via %s" - msgstr "SMTP-E-Mail-Auslieferung über %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:434 -+#: ../camel/providers/smtp/camel-smtp-transport.c:463 - #, c-format - msgid "SMTP server %s does not support %s authentication" - msgstr "SMTP-Server %s unterstützt den Legitimierungstypen %s nicht" - --#: ../camel/providers/smtp/camel-smtp-transport.c:506 -+#: ../camel/providers/smtp/camel-smtp-transport.c:536 - #, c-format - msgid "No SASL mechanism was specified" - msgstr "Kein gültiger SASL-Mechanismus wurde angegeben" - --#: ../camel/providers/smtp/camel-smtp-transport.c:536 --#: ../camel/providers/smtp/camel-smtp-transport.c:547 --#: ../camel/providers/smtp/camel-smtp-transport.c:560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:571 -+#: ../camel/providers/smtp/camel-smtp-transport.c:583 -+#: ../camel/providers/smtp/camel-smtp-transport.c:596 - msgid "AUTH command failed: " - msgstr "AUTH-Befehl gescheitert:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:701 -+#: ../camel/providers/smtp/camel-smtp-transport.c:740 - #, c-format - msgid "Cannot send message: service not connected." - msgstr "Nachricht konnte nicht verschickt werden: Dienst nicht verbunden." - --#: ../camel/providers/smtp/camel-smtp-transport.c:708 -+#: ../camel/providers/smtp/camel-smtp-transport.c:747 - #, c-format - msgid "Cannot send message: sender address not valid." - msgstr "" - "Nachricht konnte nicht verschickt werden: Absenderadresse nicht gültig." - --#: ../camel/providers/smtp/camel-smtp-transport.c:712 -+#: ../camel/providers/smtp/camel-smtp-transport.c:751 - msgid "Sending message" - msgstr "Nachricht wird verschickt" - --#: ../camel/providers/smtp/camel-smtp-transport.c:737 -+#: ../camel/providers/smtp/camel-smtp-transport.c:776 - #, c-format - msgid "Cannot send message: no recipients defined." - msgstr "Nachricht konnte nicht verschickt werden: Keine Empfänger angegeben." - --#: ../camel/providers/smtp/camel-smtp-transport.c:750 -+#: ../camel/providers/smtp/camel-smtp-transport.c:789 - #, c-format - msgid "Cannot send message: one or more invalid recipients" - msgstr "" - "Nachricht konnte nicht verschickt werden: Mindestens ein Empfänger ungültig" - --#: ../camel/providers/smtp/camel-smtp-transport.c:871 -+#: ../camel/providers/smtp/camel-smtp-transport.c:910 - msgid "Syntax error, command unrecognized" - msgstr "Syntaxfehler, Befehl nicht erkannt" - --#: ../camel/providers/smtp/camel-smtp-transport.c:873 -+#: ../camel/providers/smtp/camel-smtp-transport.c:912 - msgid "Syntax error in parameters or arguments" - msgstr "Syntaxfehler in Parametern oder Argumenten" - --#: ../camel/providers/smtp/camel-smtp-transport.c:875 -+#: ../camel/providers/smtp/camel-smtp-transport.c:914 - msgid "Command not implemented" - msgstr "Befehl nicht implementiert" - --#: ../camel/providers/smtp/camel-smtp-transport.c:877 -+#: ../camel/providers/smtp/camel-smtp-transport.c:916 - msgid "Command parameter not implemented" - msgstr "Befehlsparameter nicht implementiert" - --#: ../camel/providers/smtp/camel-smtp-transport.c:879 -+#: ../camel/providers/smtp/camel-smtp-transport.c:918 - msgid "System status, or system help reply" - msgstr "Systemstatus- oder Systemhilfe-Antwort" - --#: ../camel/providers/smtp/camel-smtp-transport.c:881 -+#: ../camel/providers/smtp/camel-smtp-transport.c:920 - msgid "Help message" - msgstr "Hilfemeldung" - --#: ../camel/providers/smtp/camel-smtp-transport.c:883 -+#: ../camel/providers/smtp/camel-smtp-transport.c:922 - msgid "Service ready" - msgstr "Dienst ist bereit" - --#: ../camel/providers/smtp/camel-smtp-transport.c:885 -+#: ../camel/providers/smtp/camel-smtp-transport.c:924 - msgid "Service closing transmission channel" - msgstr "Dienst schließt Übertragungskanal" - --#: ../camel/providers/smtp/camel-smtp-transport.c:887 -+#: ../camel/providers/smtp/camel-smtp-transport.c:926 - msgid "Service not available, closing transmission channel" - msgstr "Dienst nicht verfügbar, Übertragungskanal wird geschlossen" - --#: ../camel/providers/smtp/camel-smtp-transport.c:889 -+#: ../camel/providers/smtp/camel-smtp-transport.c:928 - msgid "Requested mail action okay, completed" - msgstr "Angeforderte E-Mail-Aktion in Ordnung, abgeschlossen" - --#: ../camel/providers/smtp/camel-smtp-transport.c:891 -+#: ../camel/providers/smtp/camel-smtp-transport.c:930 - msgid "User not local; will forward to " - msgstr "Benutzer nicht lokal; Weiterleitung erfolgt zu " - --#: ../camel/providers/smtp/camel-smtp-transport.c:893 -+#: ../camel/providers/smtp/camel-smtp-transport.c:932 - msgid "Requested mail action not taken: mailbox unavailable" - msgstr "Angeforderte E-Mail-Aktion nicht ausgeführt: Postfach nicht verfügbar" - --#: ../camel/providers/smtp/camel-smtp-transport.c:895 -+#: ../camel/providers/smtp/camel-smtp-transport.c:934 - msgid "Requested action not taken: mailbox unavailable" - msgstr "Angeforderte Aktion nicht ausgeführt: Postfach nicht verfügbar" - --#: ../camel/providers/smtp/camel-smtp-transport.c:897 -+#: ../camel/providers/smtp/camel-smtp-transport.c:936 - msgid "Requested action aborted: error in processing" - msgstr "Angeforderte Aktion abgebrochen: Fehler bei Verarbeitung" - --#: ../camel/providers/smtp/camel-smtp-transport.c:899 -+#: ../camel/providers/smtp/camel-smtp-transport.c:938 - msgid "User not local; please try " - msgstr "Benutzer nicht lokal; probieren Sie es mit " - --#: ../camel/providers/smtp/camel-smtp-transport.c:901 -+#: ../camel/providers/smtp/camel-smtp-transport.c:940 - msgid "Requested action not taken: insufficient system storage" - msgstr "Angeforderte Aktion nicht ausgeführt: unzureichender Systemspeicher" - --#: ../camel/providers/smtp/camel-smtp-transport.c:903 -+#: ../camel/providers/smtp/camel-smtp-transport.c:942 - msgid "Requested mail action aborted: exceeded storage allocation" - msgstr "Angeforderte Aktion abgebrochen: Speicherzuteilung überschritten" - --#: ../camel/providers/smtp/camel-smtp-transport.c:905 -+#: ../camel/providers/smtp/camel-smtp-transport.c:944 - msgid "Requested action not taken: mailbox name not allowed" - msgstr "Angeforderte Aktion nicht ausgeführt: Postfachname nicht erlaubt" - --#: ../camel/providers/smtp/camel-smtp-transport.c:907 -+#: ../camel/providers/smtp/camel-smtp-transport.c:946 - msgid "Start mail input; end with ." - msgstr "E-Mail-Eingabe beginnen; Ende mit ." - --#: ../camel/providers/smtp/camel-smtp-transport.c:909 -+#: ../camel/providers/smtp/camel-smtp-transport.c:948 - msgid "Transaction failed" - msgstr "Transaktion gescheitert" - --#: ../camel/providers/smtp/camel-smtp-transport.c:913 -+#: ../camel/providers/smtp/camel-smtp-transport.c:952 - msgid "A password transition is needed" - msgstr "Ein Passwortübergang ist notwendig" - --#: ../camel/providers/smtp/camel-smtp-transport.c:915 -+#: ../camel/providers/smtp/camel-smtp-transport.c:954 - msgid "Authentication mechanism is too weak" - msgstr "Legitimierungsmechanismus ist zu schwach" - --#: ../camel/providers/smtp/camel-smtp-transport.c:917 -+#: ../camel/providers/smtp/camel-smtp-transport.c:956 - msgid "Encryption required for requested authentication mechanism" - msgstr "" - "Für den verlangten Legitimierungsmechanismus ist eine Verschlüsselung " - "erforderlich." - --#: ../camel/providers/smtp/camel-smtp-transport.c:919 -+#: ../camel/providers/smtp/camel-smtp-transport.c:958 - msgid "Temporary authentication failure" - msgstr "Legitimierung vorübergehend gescheitert" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1207 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1247 - msgid "SMTP Greeting" - msgstr "SMTP-Begrüßung" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1217 --#: ../camel/providers/smtp/camel-smtp-transport.c:1231 --#: ../camel/providers/smtp/camel-smtp-transport.c:1239 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1257 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1272 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1280 - msgid "HELO command failed: " - msgstr "HELO-Befehl gescheitert:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1314 --#: ../camel/providers/smtp/camel-smtp-transport.c:1329 --#: ../camel/providers/smtp/camel-smtp-transport.c:1339 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1355 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1371 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1381 - msgid "MAIL FROM command failed: " - msgstr "MAIL FROM-Befehl gescheitert:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1366 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1408 - msgid "RCPT TO command failed: " - msgstr "RCPT TO-Befehl gescheitert:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1383 --#: ../camel/providers/smtp/camel-smtp-transport.c:1393 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1426 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1436 - #, c-format - msgid "RCPT TO <%s> failed: " - msgstr "RCPT TO <%s> gescheitert:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1436 --#: ../camel/providers/smtp/camel-smtp-transport.c:1447 --#: ../camel/providers/smtp/camel-smtp-transport.c:1458 --#: ../camel/providers/smtp/camel-smtp-transport.c:1517 --#: ../camel/providers/smtp/camel-smtp-transport.c:1537 --#: ../camel/providers/smtp/camel-smtp-transport.c:1551 --#: ../camel/providers/smtp/camel-smtp-transport.c:1560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1509 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1521 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1532 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1594 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1614 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1629 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1638 - msgid "DATA command failed: " - msgstr "DATA-Befehl gescheitert:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1585 --#: ../camel/providers/smtp/camel-smtp-transport.c:1600 --#: ../camel/providers/smtp/camel-smtp-transport.c:1609 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1663 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1679 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1688 - msgid "RSET command failed: " - msgstr "RSET-Befehl gescheitert:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1634 --#: ../camel/providers/smtp/camel-smtp-transport.c:1648 --#: ../camel/providers/smtp/camel-smtp-transport.c:1655 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1713 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1727 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1734 - msgid "QUIT command failed: " - msgstr "QUIT-Befehl gescheitert:" - -@@ -4709,7 +4699,8 @@ - - #: ../data/org.gnome.evolution-data-server.calendar.gschema.xml.in.h:2 - msgid "Whether to set a reminder for birthdays and anniversaries" --msgstr "Soll eine Erinnerung für Geburtstage und Jahrestage festgelegt werden?" -+msgstr "" -+"Soll eine Erinnerung für Geburtstage und Jahrestage festgelegt werden?" - - #: ../data/org.gnome.evolution-data-server.calendar.gschema.xml.in.h:3 - msgid "Birthday and anniversary reminder value" -@@ -4820,25 +4811,25 @@ - msgstr "Der Client meldet, dass das Passwort abgelehnt wurde" - - # Erscheint in einer Benachrichtigung mit Passwortabfrage --#: ../libebackend/e-authentication-session.c:539 -+#: ../libebackend/e-authentication-session.c:542 - msgid "Add this password to your keyring" - msgstr "Dieses Passwort zu Ihrem Schlüsselbund hinzufügen" - --#: ../libebackend/e-authentication-session.c:649 -+#: ../libebackend/e-authentication-session.c:547 - msgid "Password was incorrect" - msgstr "Das Passwort war nicht korrekt" - --#: ../libebackend/e-backend.c:408 -+#: ../libebackend/e-backend.c:420 - #, c-format - msgid "%s does not support authentication" - msgstr "%s unterstützt keine Legitimierung" - --#: ../libebackend/e-collection-backend.c:901 -+#: ../libebackend/e-collection-backend.c:992 - #, c-format - msgid "%s does not support creating remote resources" - msgstr "%s unterstützt das Erstellen entfernter Ressourcen nicht" - --#: ../libebackend/e-collection-backend.c:960 -+#: ../libebackend/e-collection-backend.c:1051 - #, c-format - msgid "%s does not support deleting remote resources" - msgstr "%s unterstützt das Löschen entfernter Ressourcen nicht" -@@ -4854,14 +4845,14 @@ - msgid "Data source is missing a [%s] group" - msgstr "In der Quelldatei fehlt eine [%s]-Gruppe" - --#: ../libebackend/e-server-side-source.c:1022 --#: ../libedataserver/e-source.c:1394 -+#: ../libebackend/e-server-side-source.c:1025 -+#: ../libedataserver/e-source.c:1351 - #, c-format - msgid "Data source '%s' does not support creating remote resources" - msgstr "" - "Die Datenquelle »%s« unterstützt das Erstellen entfernter Ressourcen nicht" - --#: ../libebackend/e-server-side-source.c:1036 -+#: ../libebackend/e-server-side-source.c:1039 - #, c-format - msgid "" - "Data source '%s' has no collection backend to create the remote resource" -@@ -4869,38 +4860,39 @@ - "Datenquelle »%s« hat kein Sammel-Backend zum Erstellen der entfernten " - "Ressource" - --#: ../libebackend/e-server-side-source.c:1064 --#: ../libedataserver/e-source.c:1507 -+#: ../libebackend/e-server-side-source.c:1067 -+#: ../libedataserver/e-source.c:1464 - #, c-format - msgid "Data source '%s' does not support deleting remote resources" - msgstr "" - "Die Datenquelle »%s« unterstützt das Löschen entfernter Ressourcen nicht" - --#: ../libebackend/e-server-side-source.c:1078 -+#: ../libebackend/e-server-side-source.c:1081 - #, c-format - msgid "" - "Data source '%s' has no collection backend to delete the remote resource" - msgstr "" --"Datenquelle »%s« hat kein Sammel-Backend zum Löschen der entfernten Ressource" -+"Datenquelle »%s« hat kein Sammel-Backend zum Löschen der entfernten " -+"Ressource" - --#: ../libebackend/e-server-side-source.c:1109 --#: ../libedataserver/e-source.c:1603 --#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1026 -+#: ../libebackend/e-server-side-source.c:1112 -+#: ../libedataserver/e-source.c:1560 -+#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1027 - #, c-format - msgid "Data source '%s' does not support OAuth 2.0 authentication" - msgstr "Datenquelle »%s« unterstützt die Legitimierung mit OAuth 2.0 nicht" - --#: ../libebackend/e-server-side-source.c:1456 -+#: ../libebackend/e-server-side-source.c:1459 - #, c-format - msgid "File must have a '.source' extension" - msgstr "Die Datei muss die Endung ».source« haben" - --#: ../libebackend/e-source-registry-server.c:531 --#: ../libedataserver/e-source-registry.c:1957 -+#: ../libebackend/e-source-registry-server.c:535 -+#: ../libedataserver/e-source-registry.c:1944 - msgid "The user declined to authenticate" - msgstr "Der Benutzer hat die Legitimierung verweigert" - --#: ../libebackend/e-source-registry-server.c:800 -+#: ../libebackend/e-source-registry-server.c:804 - #, c-format - msgid "UID '%s' is already in use" - msgstr "UID »%s« wird bereits verwendet" -@@ -5098,17 +5090,17 @@ - msgid "Source file is missing a [%s] group" - msgstr "In der Quelldatei fehlt eine [%s]-Gruppe" - --#: ../libedataserver/e-source.c:1174 -+#: ../libedataserver/e-source.c:1131 - #, c-format - msgid "Data source '%s' is not removable" - msgstr "Datenquelle »%s« ist nicht entfernbar" - --#: ../libedataserver/e-source.c:1297 -+#: ../libedataserver/e-source.c:1254 - #, c-format - msgid "Data source '%s' is not writable" - msgstr "Datenquelle »%s« ist schreibgeschützt" - --#: ../libedataserver/e-source.c:1910 -+#: ../libedataserver/e-source.c:1867 - msgid "Unnamed" - msgstr "Unbenannt" - -@@ -5122,7 +5114,7 @@ - msgid "Source '%s' does not support proxy lookups" - msgstr "Die Datenquelle »%s« unterstützt nicht das Nachschlagen von Proxys" - --#: ../libedataserver/e-source-webdav.c:1557 -+#: ../libedataserver/e-source-webdav.c:1562 - #, c-format - msgid "" - "SSL certificate for host '%s', used by address book '%s', is not trusted. Do " -@@ -5131,7 +5123,7 @@ - "Dem SSL-Zertifikat für »%s« (vom Adressbuch »%s« verwendet) wird nicht " - "vertraut. Wollen Sie es akzeptieren?" - --#: ../libedataserver/e-source-webdav.c:1566 -+#: ../libedataserver/e-source-webdav.c:1571 - #, c-format - msgid "" - "SSL certificate for host '%s', used by calendar '%s', is not trusted. Do you " -@@ -5140,7 +5132,7 @@ - "Dem SSL-Zertifikat für »%s« (vom Kalender »%s« verwendet) wird nicht " - "vertraut. Wollen Sie es akzeptieren?" - --#: ../libedataserver/e-source-webdav.c:1575 -+#: ../libedataserver/e-source-webdav.c:1580 - #, c-format - msgid "" - "SSL certificate for host '%s', used by memo list '%s', is not trusted. Do " -@@ -5149,7 +5141,7 @@ - "Dem SSL-Zertifikat für »%s« (von der Notizliste »%s« verwendet) wird nicht " - "vertraut. Wollen Sie es akzeptieren?" - --#: ../libedataserver/e-source-webdav.c:1584 -+#: ../libedataserver/e-source-webdav.c:1589 - #, c-format - msgid "" - "SSL certificate for host '%s', used by task list '%s', is not trusted. Do " -@@ -5162,7 +5154,7 @@ - #. * in 12-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1662 ../libedataserver/e-time-utils.c:1961 -+#: ../libedataserver/e-time-utils.c:1681 ../libedataserver/e-time-utils.c:1980 - msgid "%a %m/%d/%Y %I:%M:%S %p" - msgstr "%a, %d.%m.%Y %I:%M:%S %p" - -@@ -5170,7 +5162,7 @@ - #. * in 24-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1667 ../libedataserver/e-time-utils.c:1952 -+#: ../libedataserver/e-time-utils.c:1686 ../libedataserver/e-time-utils.c:1971 - msgid "%a %m/%d/%Y %H:%M:%S" - msgstr "%a, %d. %m %Y %k:%M:%S" - -@@ -5178,7 +5170,7 @@ - #. * in 12-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1672 ../libedataserver/e-time-utils.c:1957 -+#: ../libedataserver/e-time-utils.c:1691 ../libedataserver/e-time-utils.c:1976 - msgid "%a %m/%d/%Y %I:%M %p" - msgstr "%a, %d.%m.%Y, %I:%M %p" - -@@ -5186,78 +5178,78 @@ - #. * in 24-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1677 ../libedataserver/e-time-utils.c:1948 -+#: ../libedataserver/e-time-utils.c:1696 ../libedataserver/e-time-utils.c:1967 - msgid "%a %m/%d/%Y %H:%M" - msgstr "%a, %d.%m.%Y, %k:%M" - - #. strptime format of a weekday, a date and a time, - #. * in 12-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1682 -+#: ../libedataserver/e-time-utils.c:1701 - msgid "%a %m/%d/%Y %I %p" - msgstr "%a, %d.%m.%Y %I %p" - - #. strptime format of a weekday, a date and a time, - #. * in 24-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1687 -+#: ../libedataserver/e-time-utils.c:1706 - msgid "%a %m/%d/%Y %H" - msgstr "%a, %d.%m.%Y %k" - - #. strptime format of a weekday and a date. - #. strftime format of a weekday and a date. --#: ../libedataserver/e-time-utils.c:1690 ../libedataserver/e-time-utils.c:1810 --#: ../libedataserver/e-time-utils.c:1943 -+#: ../libedataserver/e-time-utils.c:1709 ../libedataserver/e-time-utils.c:1829 -+#: ../libedataserver/e-time-utils.c:1962 - msgid "%a %m/%d/%Y" - msgstr "%a, %d.%m.%Y" - - #. strptime format of a date and a time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1697 -+#: ../libedataserver/e-time-utils.c:1716 - msgid "%m/%d/%Y %I:%M:%S %p" - msgstr "%d.%m.%Y %I:%M:%S %p" - - #. strptime format of a date and a time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1701 -+#: ../libedataserver/e-time-utils.c:1720 - msgid "%m/%d/%Y %H:%M:%S" - msgstr "%d.%m.%Y %k:%M:%S" - - #. strptime format of a date and a time, in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1706 -+#: ../libedataserver/e-time-utils.c:1725 - msgid "%m/%d/%Y %I:%M %p" - msgstr "%d.%m.%Y / %I:%M %p" - - #. strptime format of a date and a time, in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1711 -+#: ../libedataserver/e-time-utils.c:1730 - msgid "%m/%d/%Y %H:%M" - msgstr "%d.%m.%Y %k:%M" - - #. strptime format of a date and a time, in 12-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1716 -+#: ../libedataserver/e-time-utils.c:1735 - msgid "%m/%d/%Y %I %p" - msgstr "%d.%m.%Y %I %p" - - #. strptime format of a date and a time, in 24-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1721 -+#: ../libedataserver/e-time-utils.c:1740 - msgid "%m/%d/%Y %H" - msgstr "%d.%m.%Y %k" - - #. strptime format of a weekday and a date. - #. This is the preferred date format for the locale. --#: ../libedataserver/e-time-utils.c:1724 ../libedataserver/e-time-utils.c:1813 -+#: ../libedataserver/e-time-utils.c:1743 ../libedataserver/e-time-utils.c:1832 - msgid "%m/%d/%Y" - msgstr "%d.%m.%Y" - - #. strptime format for a time of day, in 12-hour format. - #. strftime format of a time in 12-hour format. --#: ../libedataserver/e-time-utils.c:1884 ../libedataserver/e-time-utils.c:2005 -+#: ../libedataserver/e-time-utils.c:1903 ../libedataserver/e-time-utils.c:2024 - msgid "%I:%M:%S %p" - msgstr "%I:%M:%S %p" - - #. strptime format for a time of day, in 24-hour format. - #. strftime format of a time in 24-hour format. --#: ../libedataserver/e-time-utils.c:1888 ../libedataserver/e-time-utils.c:1997 -+#: ../libedataserver/e-time-utils.c:1907 ../libedataserver/e-time-utils.c:2016 - msgid "%H:%M:%S" - msgstr "%k:%M:%S" - -@@ -5265,25 +5257,25 @@ - #. * in 12-hour format. - #. strftime format of a time in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1893 ../libedataserver/e-time-utils.c:2002 -+#: ../libedataserver/e-time-utils.c:1912 ../libedataserver/e-time-utils.c:2021 - msgid "%I:%M %p" - msgstr "%I:%M %p" - - #. strptime format for time of day, without seconds 24-hour format. - #. strftime format of a time in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1897 ../libedataserver/e-time-utils.c:1994 -+#: ../libedataserver/e-time-utils.c:1916 ../libedataserver/e-time-utils.c:2013 - msgid "%H:%M" - msgstr "%k:%M" - - #. strptime format for time of day, without seconds 24-hour format, - #. * and no colon. --#: ../libedataserver/e-time-utils.c:1901 -+#: ../libedataserver/e-time-utils.c:1920 - msgid "%H%M" - msgstr "%k%M" - - #. strptime format for hour and AM/PM, 12-hour format. --#: ../libedataserver/e-time-utils.c:1905 -+#: ../libedataserver/e-time-utils.c:1924 - msgid "%I %p" - msgstr "%I %p" - -@@ -5344,7 +5336,7 @@ - msgstr "" - "In der Autodiscover-Anwort konnten weder ASUrl noch OABUrl gefunden werden" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1260 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1269 - #, c-format - msgid "" - "Cannot find a corresponding account in the org.gnome.OnlineAccounts service " -@@ -5353,23 +5345,17 @@ - "Ein »%s« zugehöriges Konto, aus welchem ein Zugriffs-Token bezogen werden " - "könnte, konnte im Dienst org.gnome.OnlineAccounts nicht gefunden werden" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1290 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1299 - #, c-format - msgid "Failed to obtain an access token for '%s': " - msgstr "Zugriffs-Token für »%s« konnte nicht erlangt werden:" - --#: ../modules/google-backend/module-google-backend.c:205 --#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 --#: ../modules/yahoo-backend/module-yahoo-backend.c:199 --msgid "Calendar" --msgstr "Kalender" -- --#: ../modules/google-backend/module-google-backend.c:279 -+#: ../modules/google-backend/module-google-backend.c:341 - #: ../modules/yahoo-backend/module-yahoo-backend.c:226 - msgid "Tasks" - msgstr "Aufgaben" - --#: ../modules/google-backend/module-google-backend.c:333 -+#: ../modules/google-backend/module-google-backend.c:395 - #: ../modules/ubuntu-online-accounts/contacts.service-type.in.in.h:1 - #: ../services/evolution-source-registry/builtin/contacts-stub.source.in.h:1 - msgid "Contacts" -@@ -5432,6 +5418,11 @@ - msgid "Reason:" - msgstr "Grund:" - -+#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 -+#: ../modules/yahoo-backend/module-yahoo-backend.c:199 -+msgid "Calendar" -+msgstr "Kalender" -+ - #: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:2 - msgid "Integrate your calendars" - msgstr "Ihre Kalender integrieren" -@@ -5472,7 +5463,7 @@ - msgid "Integrate your mailboxes" - msgstr "Ihre Postfächer integrieren" - --#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1007 -+#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1008 - #, c-format - msgid "" - "Cannot find a corresponding account service in the accounts database from " -@@ -5485,7 +5476,8 @@ - #: ../modules/ubuntu-online-accounts/uoa-utils.c:281 - #, c-format - msgid "" --"Expected status 200 when requesting your identity, instead got status %d (%s)" -+"Expected status 200 when requesting your identity, instead got status %d " -+"(%s)" - msgstr "" - "Status 200 wurde bei der Abfrage Ihrer Identität erwartet, stattdessen wurde " - "Status %d erhalten (%s)" -@@ -5574,228 +5566,3 @@ - #: ../services/evolution-user-prompter/prompt-user-gtk.c:121 - msgid "_Dismiss" - msgstr "_Verwerfen" -- --#~ msgid "No host information available" --#~ msgstr "Es sind keine Informationen zum Rechner verfügbar" -- --#~ msgid "You may not import keys with this cipher" --#~ msgstr "Sie dürfen keine Schlüssel mit dieser Verschlüsselung importieren" -- --#~ msgid "You may not export keys with this cipher" --#~ msgstr "Sie dürfen keine Schlüssel mit dieser Verschlüsselung exportieren" -- --#~ msgid "" --#~ "Could not write log entry: %s\n" --#~ "Further operations on this server will not be replayed when you\n" --#~ "reconnect to the network." --#~ msgstr "" --#~ "Protokolleintrag konnte nicht geschrieben werden: %s\n" --#~ "Auf diesem Server können keine weiteren Vorgänge wiedergegeben\n" --#~ "werden, sobald Sie die Netzwerkverbindung erneut herstellen." -- --#~ msgid "" --#~ "Could not open '%s':\n" --#~ "%s\n" --#~ "Changes made to this folder will not be resynchronized." --#~ msgstr "" --#~ "»%s« konnte nicht geöffnet werden:\n" --#~ "%s\n" --#~ "Änderungen an diesem Ordner werden nicht neu abgeglichen werden." -- --#~ msgid "Resynchronizing with server" --#~ msgstr "Neu abgleichen mit dem Server" -- --#~ msgid "Preparing folder '%s' for offline" --#~ msgstr "Ordner »%s« wird für den Offline-Modus vorbereitet" -- --#~ msgid "Canceled" --#~ msgstr "Abgesagt" -- --#~ msgid "" --#~ "Alert from IMAP server %s:\n" --#~ "%s" --#~ msgstr "" --#~ "Warnung von IMAP-Server %s:\n" --#~ "%s" -- --#~ msgid "Error while fetching messages" --#~ msgstr "Fehler beim Abholen von Nachrichten" -- --#~ msgid "Fetching summary information for %d message in '%s'" --#~ msgid_plural "Fetching summary information for %d messages in '%s'" --#~ msgstr[0] "" --#~ "Zusammenfassende Informationen für %d Nachricht in »%s« werden abgerufen" --#~ msgstr[1] "" --#~ "Zusammenfassende Informationen für %d Nachrichten in »%s« werden abgerufen" -- --#~ msgid "Unknown parent folder: %s" --#~ msgstr "Unbekannter Elternerdner: %s" -- --#~ msgid "The parent folder is not allowed to contain subfolders" --#~ msgstr "Der Elternordner darf keine Unterordner enthalten" -- --#~ msgid "Source stream unavailable" --#~ msgstr "Quelldatenstrom nicht verfügbar" -- --#~ msgid "Resolving address" --#~ msgstr "Adresse wird aufgelöst" -- --#~ msgid "Name lookup failed" --#~ msgstr "Namenssuche fehlgeschlagen" -- --#~ msgid "Name lookup failed. Check your host name for spelling errors." --#~ msgstr "" --#~ "Namenssuche ist fehlgeschlagen. Überprüfen Sie den Rechnernamen auf " --#~ "Rechtschreibfehler." -- --#~ msgid "Name lookup failed: %s" --#~ msgstr "Namenssuche fehlgeschlagen: %s" -- --#~ msgid "Could not connect to '%s:%s': " --#~ msgstr "Verbindung mit »%s:%s« gescheitert:" -- --#~ msgid "Please enter the %s password for %s on host %s." --#~ msgstr "Bitte geben Sie das %s-Passwort für %s auf dem Rechner %s ein." -- --#~ msgid "Cannot create folder '%s': folder exists" --#~ msgstr "Ordner »%s« konnte nicht angelegt werden: Ordner existiert" -- --#~ msgid "NSPR error code %d" --#~ msgstr "NSPR-Fehlercode %d" -- --#~ msgid "The proxy host does not support SOCKS4" --#~ msgstr "Der Proxy-Rechner unterstützt nicht SOCKS4" -- --#~ msgid "The proxy host denied our request: code %d" --#~ msgstr "Der Proxy-Rechner hat die Anfrage abgewiesen: Code %d" -- --#~ msgid "The proxy host does not support SOCKS5" --#~ msgstr "Der Proxy-Rechner unterstützt nicht SOCKS5" -- --#~ msgid "Could not find a suitable authentication type: code 0x%x" --#~ msgstr "Keine Unterstützung für Legitimierungstyp: Code 0x%x" -- --#~ msgid "General SOCKS server failure" --#~ msgstr "Allgemeiner Fehler des SOCKS-Server" -- --#~ msgid "SOCKS server's rules do not allow connection" --#~ msgstr "Die Richtlinien des SOCKS-Server erlaubt keine Verbindung" -- --#~ msgid "Network is unreachable from SOCKS server" --#~ msgstr "Das Netzwerk ist für den SOCKS-Server unerreichbar" -- --#~ msgid "Host is unreachable from SOCKS server" --#~ msgstr "Der Rechner ist für den SOCKS-Server unerreichbar" -- --#~ msgid "Connection refused" --#~ msgstr "Verbindung wurde verweigert" -- --#~ msgid "Time-to-live expired" --#~ msgstr "Time-to-live (TTL) ist abgelaufen" -- --#~ msgid "Command not supported by SOCKS server" --#~ msgstr "Befehl wird vom SOCKS-Server nicht unterstützt" -- --#~ msgid "Address type not supported by SOCKS server" --#~ msgstr "Adresstyp wird vom SOCKS-Server nicht unterstützt" -- --#~ msgid "Unknown error from SOCKS server" --#~ msgstr "Unbekannter Fehler vom SOCKS-Server" -- --#~ msgid "Got unknown address type from SOCKS server" --#~ msgstr "Es wurde ein unbekannter Adresstyp vom SOCKS-Server erhalten" -- --#~ msgid "Incomplete reply from SOCKS server" --#~ msgstr "Unvollständige Antwort vom SOCKS-Server" -- --#~ msgid "Hostname is too long (maximum is 255 characters)" --#~ msgstr "Der Rechnername ist zu lang (maximal 255 Zeichen)" -- --#~ msgid "Invalid reply from proxy server" --#~ msgstr "Ungültige Antwort vom Proxy-Server" -- --#~ msgid "Unable to add message to summary: unknown reason" --#~ msgstr "" --#~ "Nachricht konnte nicht zur Zusammenfassung hinzugefügt werden: Grund " --#~ "unbekannt" -- --#~ msgid "Cannot create folder '%s': folder exists." --#~ msgstr "Ordner »%s« konnte nicht angelegt werden: Ordner existiert." -- --#~ msgid "Fatal mail parser error near position %s in folder %s" --#~ msgstr "" --#~ "Schwerwiegender Fehler beim Verarbeiten der E-Mail nahe Position %s im " --#~ "Ordner %s" -- --#~ msgid "You cannot post NNTP messages while working offline!" --#~ msgstr "Sie können im Offline-Modus keine NNTP-Nachrichten veröffentlichen!" -- --#~ msgid "" --#~ "What proxy type to use. \"0\" means system, \"1\" means no proxy, \"2\" " --#~ "means manual proxy." --#~ msgstr "" --#~ "Typ des zu verwendenden Proxys. »0« bedeutet System, »1« bedeutet kein " --#~ "Proxy, »2« bedeutet manuelle Proxy-Konfiguration." -- --#~ msgid "Whether to use proxy for HTTP requests." --#~ msgstr "Legt fest, ob ein Proxy für HTTP-Anfragen verwendet werden soll." -- --#~ msgid "Whether authentication is required to access proxy server." --#~ msgstr "" --#~ "Legt fest, ob Legitimierung für den Zugriff auf den Proxy-Server nötig " --#~ "ist." -- --#~ msgid "Host name to use for HTTP requests." --#~ msgstr "Für HTTP-Anfragen zu verwendender Rechnername." -- --#~ msgid "Port number to use for HTTP requests." --#~ msgstr "Für HTTP-Anfragen zu verwendende Portnummer." -- --#~ msgid "User name to use to authenticate against proxy server." --#~ msgstr "Benutzername zur Legitimierung am Proxy-Server." -- --#~ msgid "Password to use to authenticate against proxy server." --#~ msgstr "Passwort zur Legitimierung am Proxy-Server." -- --#~ msgid "List of hosts for which do not use proxy." --#~ msgstr "Liste der Rechner, zu denen ohne Proxy verbunden werden soll." -- --#~ msgid "Host name to use for HTTPS requests." --#~ msgstr "Für HTTPS-Anfragen zu verwendender Rechnername." -- --#~ msgid "Port number to use for HTTPS requests." --#~ msgstr "Für HTTPS-Anfragen zu verwendende Portnummer." -- --#~ msgid "Host name to use for SOCKS requests." --#~ msgstr "Für SOCKS-Anfragen zu verwendender Rechnername." -- --#~ msgid "Port number to use for SOCKS requests." --#~ msgstr "Für SOCKS-Anfragen zu verwendende Portnummer." -- --#~ msgid "Where to read automatic proxy configuration from." --#~ msgstr "Speicherort der Daten zur automatischen Proxy-Konfiguration." -- --#~ msgid "Not part of certificate" --#~ msgstr "Kein Teil des Zertifikats" -- --#~ msgid "_Close" --#~ msgstr "_Schließen" -- --#~ msgid "This certificate has been verified for the following uses:" --#~ msgstr "" --#~ "Dieses Zertifikat wurde für die folgenden Anwendungszwecke überprüft:" -- --#~ msgid "SSL Client Certificate" --#~ msgstr "SSL-Client-Zertifikat" -- --#~ msgid "SSL Server Certificate" --#~ msgstr "SSL-Server-Zertifikat" -- --#~ msgid "Email Signer Certificate" --#~ msgstr "E-Mail-Signaturzertifikat" -- --#~ msgid "Email Recipient Certificate" --#~ msgstr "E-Mail-Empfangszertifikat" -- --#~ msgid "Issued To" --#~ msgstr "Ausgegeben an" -diff -urN evolution-data-server-3.12.11/po/es.po evolution-data-server-3.12.11_localized/po/es.po ---- evolution-data-server-3.12.11/po/es.po 2014-11-04 18:27:25.000000000 +0530 -+++ evolution-data-server-3.12.11_localized/po/es.po 2016-03-14 19:48:05.402870092 +0530 -@@ -2,7 +2,7 @@ - # translation of evolution-data-server es.po spanish - # Copyright © 2000-2002, 2006, 2007, 2008 Free Software Foundation, Inc. - # This file is distributed under the same license as the evolution package. --# -+# - # Carlos Perelló Marín , 2000-2001. - # Ismael Olea , 2001. - # Eneko Lacunza , 2001-2002. -@@ -11,22 +11,22 @@ - # Francisco Javier F. Serrador , 2003, 2004, 2005, 2006. - # Jorge González , 2007, 2008, 2009, 2010, 2011. - # Daniel Mustieles , 2011, 2012, 2013, 2014. --# -+# gguerrer , 2016. #zanata -+# pnemade , 2016. #zanata - msgid "" - msgstr "" - "Project-Id-Version: evolution-data-server.master\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" --"product=evolution-data-server&keywords=I18N+L10N&component=Misc.\n" --"POT-Creation-Date: 2014-09-12 08:20+0000\n" --"PO-Revision-Date: 2014-09-12 12:45+0200\n" --"Last-Translator: Daniel Mustieles \n" --"Language-Team: Español; Castellano \n" --"Language: \n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2016-02-16 09:58+0530\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"PO-Revision-Date: 2016-03-09 06:14+0000\n" -+"Last-Translator: gguerrer \n" -+"Language-Team: Español; Castellano \n" -+"Language: es\n" - "Plural-Forms: nplurals=2; plural=(n != 1);\n" --"X-Generator: Gtranslator 2.91.6\n" -+"X-Generator: Zanata 3.8.2\n" - - #: ../addressbook/backends/file/e-book-backend-file.c:120 - #, c-format -@@ -70,8 +70,8 @@ - - #: ../addressbook/backends/file/e-book-backend-file.c:1472 - #: ../addressbook/backends/file/e-book-backend-file.c:1555 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3077 --#: ../addressbook/libedata-book/e-book-sqlite.c:6742 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3084 -+#: ../addressbook/libedata-book/e-book-sqlite.c:6793 - #, c-format - msgid "Contact '%s' not found" - msgstr "Contacto «%s» no encontrado" -@@ -101,79 +101,79 @@ - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:1174 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4250 - #: ../addressbook/backends/webdav/e-book-backend-webdav.c:419 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:887 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:888 - #: ../addressbook/libebook-contacts/e-book-contacts-types.c:35 - #: ../addressbook/libebook-contacts/e-phone-number.c:56 - #: ../addressbook/libebook/e-book.c:1078 --#: ../addressbook/libebook/e-book-client.c:1882 --#: ../addressbook/libebook/e-book-client.c:2054 --#: ../addressbook/libebook/e-book-client.c:2267 --#: ../addressbook/libebook/e-book-client.c:2398 --#: ../addressbook/libebook/e-book-client.c:2557 --#: ../addressbook/libebook/e-book-client.c:2691 --#: ../addressbook/libebook/e-book-client.c:2822 --#: ../addressbook/libebook/e-book-client.c:2980 --#: ../addressbook/libebook/e-book-client.c:3175 --#: ../addressbook/libebook/e-book-client.c:3393 -+#: ../addressbook/libebook/e-book-client.c:1916 -+#: ../addressbook/libebook/e-book-client.c:2088 -+#: ../addressbook/libebook/e-book-client.c:2301 -+#: ../addressbook/libebook/e-book-client.c:2432 -+#: ../addressbook/libebook/e-book-client.c:2591 -+#: ../addressbook/libebook/e-book-client.c:2725 -+#: ../addressbook/libebook/e-book-client.c:2856 -+#: ../addressbook/libebook/e-book-client.c:3014 -+#: ../addressbook/libebook/e-book-client.c:3209 -+#: ../addressbook/libebook/e-book-client.c:3427 - #: ../addressbook/libedata-book/e-book-backend-sexp.c:878 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:585 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:616 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:629 - #: ../calendar/backends/contacts/e-cal-backend-contacts.c:270 - #: ../calendar/libecal/e-cal.c:2334 ../calendar/libecal/e-cal-client.c:276 --#: ../calendar/libecal/e-cal-client.c:3239 --#: ../calendar/libecal/e-cal-client.c:3412 --#: ../calendar/libecal/e-cal-client.c:3676 --#: ../calendar/libecal/e-cal-client.c:3917 --#: ../calendar/libecal/e-cal-client.c:4107 --#: ../calendar/libecal/e-cal-client.c:4299 --#: ../calendar/libecal/e-cal-client.c:4469 --#: ../calendar/libecal/e-cal-client.c:4638 --#: ../calendar/libecal/e-cal-client.c:4841 --#: ../calendar/libecal/e-cal-client.c:4991 --#: ../calendar/libecal/e-cal-client.c:5185 --#: ../calendar/libecal/e-cal-client.c:5338 --#: ../calendar/libecal/e-cal-client.c:5555 --#: ../calendar/libecal/e-cal-client.c:5709 --#: ../calendar/libecal/e-cal-client.c:5935 --#: ../calendar/libecal/e-cal-client.c:6131 --#: ../calendar/libecal/e-cal-client.c:6494 --#: ../calendar/libecal/e-cal-client.c:6708 -+#: ../calendar/libecal/e-cal-client.c:3273 -+#: ../calendar/libecal/e-cal-client.c:3446 -+#: ../calendar/libecal/e-cal-client.c:3710 -+#: ../calendar/libecal/e-cal-client.c:3951 -+#: ../calendar/libecal/e-cal-client.c:4141 -+#: ../calendar/libecal/e-cal-client.c:4333 -+#: ../calendar/libecal/e-cal-client.c:4503 -+#: ../calendar/libecal/e-cal-client.c:4672 -+#: ../calendar/libecal/e-cal-client.c:4875 -+#: ../calendar/libecal/e-cal-client.c:5025 -+#: ../calendar/libecal/e-cal-client.c:5219 -+#: ../calendar/libecal/e-cal-client.c:5372 -+#: ../calendar/libecal/e-cal-client.c:5589 -+#: ../calendar/libecal/e-cal-client.c:5743 -+#: ../calendar/libecal/e-cal-client.c:5969 -+#: ../calendar/libecal/e-cal-client.c:6165 -+#: ../calendar/libecal/e-cal-client.c:6528 -+#: ../calendar/libecal/e-cal-client.c:6750 - #: ../camel/providers/imapx/camel-imapx-command.c:645 --#: ../camel/providers/imapx/camel-imapx-server.c:4784 --#: ../camel/providers/imapx/camel-imapx-server.c:4793 -+#: ../camel/providers/imapx/camel-imapx-server.c:4871 -+#: ../camel/providers/imapx/camel-imapx-server.c:4880 - #: ../libedataserver/e-client.c:185 - msgid "Unknown error" - msgstr "Error desconocido" - - #. Query for new contacts asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:828 -+#: ../addressbook/backends/google/e-book-backend-google.c:822 - msgid "Querying for updated contacts…" - msgstr "Solicitando actualizaciones de contactos…" - - #. Run the query asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:1010 -+#: ../addressbook/backends/google/e-book-backend-google.c:1004 - msgid "Querying for updated groups…" - msgstr "Solicitando actualizaciones de grupos…" - --#: ../addressbook/backends/google/e-book-backend-google.c:1757 -+#: ../addressbook/backends/google/e-book-backend-google.c:1751 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4997 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1433 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1434 - msgid "The backend does not support bulk additions" - msgstr "El «backend» no soporta adiciones" - --#: ../addressbook/backends/google/e-book-backend-google.c:1912 -+#: ../addressbook/backends/google/e-book-backend-google.c:1906 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:5133 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1545 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1546 - msgid "The backend does not support bulk modifications" - msgstr "El «backend» no soporta modificaciones" - --#: ../addressbook/backends/google/e-book-backend-google.c:2119 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1645 -+#: ../addressbook/backends/google/e-book-backend-google.c:2113 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1646 - msgid "The backend does not support bulk removals" - msgstr "El «backend» no soporta eliminaciones" - --#: ../addressbook/backends/google/e-book-backend-google.c:2239 -+#: ../addressbook/backends/google/e-book-backend-google.c:2233 - msgid "Loading…" - msgstr "Cargando…" - -@@ -273,44 +273,44 @@ - msgid "Failed to get the DN for user '%s'" - msgstr "Falló al crear el DN para el usuario «%s»" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:864 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:865 - msgid "Loading Addressbook summary..." - msgstr "Cargando resumen de la libreta de direcciones…" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:884 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:885 - #, c-format - msgid "PROPFIND on webdav failed with HTTP status %d (%s)" - msgstr "Falló PROPFIND en WebDav con el estado HTTP: %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:903 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:904 - msgid "No response body in webdav PROPFIND result" - msgstr "No hay cuerpo de la respuesta en el resultado PROPFIND de WebDav" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:964 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:965 - #, c-format - msgid "Loading Contacts (%d%%)" - msgstr "Cargando contactos (%d%%)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1353 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1354 - msgid "Cannot transform SoupURI to string" - msgstr "No se puede transformar SoupURI a una cadena" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1474 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1475 - #, c-format - msgid "Create resource '%s' failed with HTTP status %d (%s)" - msgstr "Falló al crear el recurso «%s» con el estado HTTP: %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1576 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1577 - msgid "Contact on server changed -> not modifying" - msgstr "Modificado el contacto en el servidor -> no se modifica" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1584 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1585 - #, c-format - msgid "Modify contact failed with HTTP status %d (%s)" - msgstr "Falló al modificar el contacto con el estado HTTP: %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1677 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1693 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1678 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1694 - #, c-format - msgid "DELETE failed with HTTP status %d" - msgstr "DELETE con el estado HTTP %d" -@@ -914,14 +914,15 @@ - msgid "Twitter Name List" - msgstr "Lista de nombres de Twitter" - --#: ../addressbook/libebook-contacts/e-contact.c:1654 -+#: ../addressbook/libebook-contacts/e-contact.c:1660 - #: ../addressbook/libebook/e-destination.c:920 - msgid "Unnamed List" - msgstr "Lista de anónimos" - - #: ../addressbook/libebook-contacts/e-phone-number.c:41 - msgid "The library was built without phone number support." --msgstr "La biblioteca se ha construido sin soporte para el número de teléfono." -+msgstr "" -+"La biblioteca se ha construido sin soporte para el número de teléfono." - - #: ../addressbook/libebook-contacts/e-phone-number.c:43 - msgid "The phone number parser reported an yet unkown error code." -@@ -939,7 +940,8 @@ - - #: ../addressbook/libebook-contacts/e-phone-number.c:49 - msgid "" --"Remaining text after the country calling code is too short for a phone number" -+"Remaining text after the country calling code is too short for a phone " -+"number" - msgstr "" - "El texto que hay después del código del país es demasiado corto para ser un " - "número de teléfono" -@@ -952,48 +954,48 @@ - msgid "Text is too long for a phone number" - msgstr "El texto es demasiado largo para ser un número de teléfono" - --#: ../addressbook/libebook/e-book-client.c:807 -+#: ../addressbook/libebook/e-book-client.c:841 - #, c-format - msgid "Unknown book property '%s'" - msgstr "Propiedad «%s» de la libreta desconocida" - --#: ../addressbook/libebook/e-book-client.c:822 -+#: ../addressbook/libebook/e-book-client.c:856 - #, c-format - msgid "Cannot change value of book property '%s'" - msgstr "No se puede cambiar el valor de la propiedad «%s» de la libreta" - --#: ../addressbook/libebook/e-book-client.c:1207 --#: ../addressbook/libebook/e-book-client.c:1382 --#: ../addressbook/libebook/e-book-client.c:1649 --#: ../calendar/libecal/e-cal-client.c:1530 --#: ../calendar/libecal/e-cal-client.c:1712 -+#: ../addressbook/libebook/e-book-client.c:1241 -+#: ../addressbook/libebook/e-book-client.c:1416 -+#: ../addressbook/libebook/e-book-client.c:1683 -+#: ../calendar/libecal/e-cal-client.c:1564 -+#: ../calendar/libecal/e-cal-client.c:1746 - #, c-format - msgid "Unable to connect to '%s': " - msgstr "No se pudo conectar a «%s: " - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:899 --#: ../addressbook/libedata-book/e-book-sqlite.c:2178 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:906 -+#: ../addressbook/libedata-book/e-book-sqlite.c:2201 - #, c-format - msgid "Error introspecting unknown summary field '%s'" - msgstr "Error al hacer la introspección del campo de resumen «%s» no válido" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1509 --#: ../addressbook/libedata-book/e-book-sqlite.c:1334 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1516 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1340 - msgid "Error parsing regular expression" - msgstr "Error al analizar la expresión regular" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1554 --#: ../addressbook/libedata-book/e-book-sqlite.c:1818 ../camel/camel-db.c:545 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1561 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1824 ../camel/camel-db.c:619 - #, c-format - msgid "Insufficient memory" - msgstr "Memoria insuficiente" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1691 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1698 - #, c-format - msgid "Invalid contact field '%d' specified in summary" - msgstr "Campo de contacto «%d» no válido especificado en el resumen" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1725 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1732 - #: ../addressbook/libedata-book/e-book-sqlite.c:559 - #, c-format - msgid "" -@@ -1003,8 +1005,8 @@ - "Campo de contacto «%s» de tipo «%s» especificado en el resumen, pero sólo se " - "permiten campos de tipo booleano, cadena y lista de cadenas" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3065 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4161 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3072 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4168 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. vcards cannot be returned." -@@ -1012,19 +1014,19 @@ - "La búsqueda completa de contactos no se almacena en la caché. No se pueden " - "devolver las «vcards»" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4292 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4385 --#: ../addressbook/libedata-book/e-book-sqlite.c:5400 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4299 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4392 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5451 - #, c-format - msgid "Query contained unsupported elements" - msgstr "La consulta contiene elementos no soportados" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4296 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4303 - #, c-format - msgid "Invalid Query" - msgstr "Consulta no válida" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4320 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4327 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. Hence only summary query is " -@@ -1033,7 +1035,7 @@ - "La búsqueda completa de contactos no se almacena en la caché. Por lo tanto, " - "sólo se soporta la consulta del resumen." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4389 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4396 - #: ../addressbook/libedata-book/e-data-book.c:383 - #: ../addressbook/libedata-book/e-data-book.c:1028 - #: ../calendar/libedata-cal/e-data-cal.c:420 -@@ -1042,7 +1044,7 @@ - msgid "Invalid query" - msgstr "Consulta no válida" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4432 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4439 - #, c-format - msgid "" - "Full vcards are not stored in cache. Hence only summary query is supported." -@@ -1050,35 +1052,35 @@ - "Las «vcards» completas no se almacenan en la caché. Por lo tanto, sólo se " - "soporta la consulta del resumen." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5255 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5262 - #, c-format - msgid "Unable to remove the db file: errno %d" - msgstr "No se pudo quitar el archivo db: número de error %d" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6042 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6442 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6449 - #, c-format - msgid "Only summary queries are supported by EbSdbCursor" - msgstr "EbSdbCursor sólo soporta las consultas al resumen" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6056 - #, c-format - msgid "At least one sort field must be specified to use an EbSdbCursor" - msgstr "" - "Se debe especificar al menos un campo de ordenación para usar un EbSdbCursor" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6063 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 - #, c-format - msgid "Cannot sort by a field that is not in the summary" - msgstr "No se puede ordenar por un campo que no está en el resumen" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6077 - #, c-format - msgid "Cannot sort by a field which may have multiple values" - msgstr "No se puede ordenar por un campo que tiene varios valores" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6203 --#: ../addressbook/libedata-book/e-book-sqlite.c:7412 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6210 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7463 - #, c-format - msgid "" - "Tried to step a cursor in reverse, but cursor is already at the beginning of " -@@ -1087,8 +1089,8 @@ - "Se ha intentado recorrer al revés, pero el cursor ya está al principio de la " - "lista de contactos" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6211 --#: ../addressbook/libedata-book/e-book-sqlite.c:7420 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6218 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7471 - #, c-format - msgid "" - "Tried to step a cursor forwards, but cursor is already at the end of the " -@@ -1102,7 +1104,7 @@ - msgid "Unsupported contact field '%d' specified in summary" - msgstr "Campo de contacto «%d» especificado en el resumen no soportado" - --#: ../addressbook/libedata-book/e-book-sqlite.c:1891 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1897 - msgid "" - "Cannot upgrade contacts database from a legacy database with more than one " - "addressbook. Delete one of the entries in the 'folders' table first." -@@ -1111,21 +1113,21 @@ - "heredada con más de una libreta de direcciones. Elimine primero una de las " - "entradas de la tabla «carpetas»." - --#: ../addressbook/libedata-book/e-book-sqlite.c:5393 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5444 - #, c-format - msgid "Invalid query: %s" - msgstr "Consulta no válida: %s" - --#: ../addressbook/libedata-book/e-book-sqlite.c:5568 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5619 - msgid "Invalid query for EbSqlCursor" - msgstr "Consulta no válida para EbSqlCursor" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7234 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7285 - msgid "At least one sort field must be specified to use an EbSqlCursor" - msgstr "" - "Se debe especificar al menos un campo de ordenación para usar un EbSdbCursor" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7252 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7303 - msgid "Cannot sort by a field that is not a string type" - msgstr "No se puede ordenar por un campo que no es de tipo cadena" - -@@ -1291,15 +1293,15 @@ - msgid "Cannot remove contacts: " - msgstr "No se pueden quitar los contactos: " - --#: ../addressbook/libedata-book/e-data-book-cursor.c:772 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:776 - msgid "Cursor does not support setting the search expression" - msgstr "El cursor no soporta establecer la expresión de búsqueda" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:855 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:859 - msgid "Cursor does not support step" - msgstr "El cursor no se puede recorrer" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:938 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:942 - msgid "Cursor does not support alphabetic indexes" - msgstr "El cursor no soporta los índices alfabéticos" - -@@ -1335,35 +1337,35 @@ - msgid "No such source for UID '%s'" - msgstr "No existe una fuente para el UDI «%s»" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:581 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 - #, c-format - msgid "Server is unreachable (%s)" - msgstr "No se puede llegar al servidor (%s)" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:612 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 - #, c-format - msgid "Failed to connect to a server using SSL: %s" - msgstr "Falló al conectar a un servidor usando SSL: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:623 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 - #, c-format --msgid "Unexpected HTTP status code %d returned (%s)" --msgstr "Se devolvió un código de estado HTTP %d inesperado (%s)" -+msgid "Unexpected HTTP status code %d returned (%s) for URI: %s" -+msgstr "Un código de estado HTTP inesperado %d retornó (%s) para URI: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:642 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:647 - msgid "CalDAV backend is not loaded yet" - msgstr "El «backend» CalDAV aún no se puede cargar" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1084 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1091 - msgid "Invalid Redirect URL" - msgstr "URL de redirección no válida" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2887 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2894 - #, c-format - msgid "Cannot create local cache folder '%s'" - msgstr "No se puede crear la carpeta de caché local: «%s»" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2939 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2946 - #, c-format - msgid "" - "Server is unreachable, calendar is opened in read-only mode.\n" -@@ -1373,27 +1375,27 @@ - "lectura.\n" - "Mensaje de error: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3973 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3988 - msgid "CalDAV does not support bulk additions" - msgstr "CalDAV no soporta adiciones" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4076 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4091 - msgid "CalDAV does not support bulk modifications" - msgstr "CalDAV no soporta modificaciones" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4252 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4267 - msgid "CalDAV does not support bulk removals" - msgstr "CalDAV no soporta eliminaciones" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4919 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4941 - msgid "Calendar doesn't support Free/Busy" - msgstr "El calendario no soporta disponibilidad" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4928 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4950 - msgid "Schedule outbox url not found" - msgstr "URL de la bandeja de salida programa no encontrada" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5025 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5047 - msgid "Unexpected result in schedule-response" - msgstr "Resultado no esperado en la respuesta programada" - -@@ -1441,74 +1443,75 @@ - msgstr "No es un calendario." - - #: ../calendar/backends/http/e-cal-backend-http.c:925 --#: ../calendar/backends/weather/e-cal-backend-weather.c:536 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:700 - msgid "Could not create cache file" - msgstr "No se pudo crear el archivo de caché" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:174 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:196 - msgid "Could not retrieve weather data" - msgstr "No se pudieron obtener los datos meteorológicos" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:295 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:369 - msgid "Weather: Fog" - msgstr "Meteorología: Niebla" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:296 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:370 - msgid "Weather: Cloudy Night" - msgstr "Meteorología: Noche nubosa" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:297 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:371 - msgid "Weather: Cloudy" - msgstr "Meteorología: Nuboso" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:298 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:372 - msgid "Weather: Overcast" - msgstr "Meteorología: Cubierto" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:299 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:373 - msgid "Weather: Showers" - msgstr "Meteorología: Chaparrón" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:300 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:374 - msgid "Weather: Snow" - msgstr "Meteorología: Nieve" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:301 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:375 - msgid "Weather: Clear Night" - msgstr "Meteorología: Noche despejada" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:302 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:376 - msgid "Weather: Sunny" - msgstr "Meteorología: Soleado" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:303 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:377 - msgid "Weather: Thunderstorms" - msgstr "Meteorología: Tormenta" - - #. TRANSLATOR: This is the temperature in degrees Fahrenheit (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:329 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:403 - #, c-format - msgid "%.1f °F" - msgstr "%.1f °F" - - #. TRANSLATOR: This is the temperature in degrees Celsius (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:332 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:406 - #, c-format - msgid "%.1f °C" - msgstr "%.1f °C" - - #. TRANSLATOR: This is the temperature in kelvin --#: ../calendar/backends/weather/e-cal-backend-weather.c:335 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:409 - #, c-format - msgid "%.1f K" - msgstr "%.1f K" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:341 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:415 - #, c-format - msgid "%.1f" - msgstr "%.1f" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:452 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:580 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:608 - msgid "Forecast" - msgstr "Pronóstico" - -@@ -1564,7 +1567,7 @@ - msgstr "Falló la autenticación" - - #: ../calendar/libecal/e-cal.c:2330 --#: ../camel/providers/smtp/camel-smtp-transport.c:921 -+#: ../camel/providers/smtp/camel-smtp-transport.c:960 - #: ../libedataserver/e-client.c:147 - msgid "Authentication required" - msgstr "Autenticación requerida" -@@ -1587,17 +1590,17 @@ - msgid "Invalid range" - msgstr "Rango no válido" - --#: ../calendar/libecal/e-cal-client.c:936 -+#: ../calendar/libecal/e-cal-client.c:970 - #, c-format - msgid "Unknown calendar property '%s'" - msgstr "Propiedad «%s» del calendario desconocida" - --#: ../calendar/libecal/e-cal-client.c:951 -+#: ../calendar/libecal/e-cal-client.c:985 - #, c-format - msgid "Cannot change value of calendar property '%s'" - msgstr "No se puede cambiar el valor de la propiedad «%s» del calendario" - --#: ../calendar/libecal/e-cal-component.c:1348 -+#: ../calendar/libecal/e-cal-component.c:1349 - msgid "Untitled appointment" - msgstr "Cita sin título" - -@@ -1746,83 +1749,83 @@ - msgid "Undefined" - msgstr "Sin definir" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:84 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1062 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1371 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1498 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1547 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:85 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1063 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1379 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1506 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1555 - #, c-format - msgid "\"%s\" expects one argument" - msgstr "«%s» espera un argumento" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:91 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:673 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1378 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:92 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:674 - #: ../calendar/libedata-cal/e-cal-backend-sexp.c:1386 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1394 - #, c-format - msgid "\"%s\" expects the first argument to be a string" - msgstr "«%s» espera que el primer argumento sea una cadena" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:166 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:167 - #, c-format - msgid "\"%s\" expects two or three arguments" - msgstr "«%s» espera dos o tres argumentos" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:173 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:262 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:324 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:823 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1069 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1447 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1505 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1554 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:174 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:263 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:325 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:824 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1070 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1455 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1513 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1562 - #, c-format - msgid "\"%s\" expects the first argument to be a time_t" - msgstr "«%s» espera que el primer argumento sea de tipo time_t" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:182 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:270 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:334 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:832 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:183 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:271 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:335 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:833 - #, c-format - msgid "\"%s\" expects the second argument to be a time_t" - msgstr "«%s» espera que el segundo argumento sea de tipo time_t" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:192 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:193 - #, c-format - msgid "\"%s\" expects the third argument to be a string" - msgstr "«%s» espera que el tercer argumento sea una cadena" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:254 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:255 - #, c-format - msgid "\"%s\" expects none or two arguments" - msgstr "«%s» espera dos o ningún argumento" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:317 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:666 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:816 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1440 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:318 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:667 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:817 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1448 - #, c-format - msgid "\"%s\" expects two arguments" - msgstr "«%s» espera dos argumentos" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:602 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:625 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:748 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:780 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:987 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1020 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1332 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:603 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:626 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:749 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:781 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:988 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1021 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1340 - #, c-format - msgid "\"%s\" expects no arguments" - msgstr "«%s» no espera ningún argumento" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:682 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:683 - #, c-format - msgid "\"%s\" expects the second argument to be a string" - msgstr "«%s» espera que el segundo argumento sea una cadena" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:713 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:714 - #, c-format - msgid "" - "\"%s\" expects the first argument to be either \"any\", \"summary\", or " -@@ -1830,14 +1833,15 @@ - "\"classification\"" - msgstr "" - "«%s» espera que el primer argumento sea «any», «summary», «description» o " --"«description », o «location», o «attendee», u «organizer», o «classification»" -+"«description », o «location», o «attendee», u «organizer», o " -+"«classification»" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:884 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:885 - #, c-format - msgid "\"%s\" expects at least one argument" - msgstr "«%s» espera al menos un argumento" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:899 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:900 - #, c-format - msgid "" - "\"%s\" expects all arguments to be strings or one and only one argument to " -@@ -1846,14 +1850,14 @@ - "«%s» espera que todos los argumentos sean cadenas o que uno y sólo uno de " - "los argumentos sea un booleano falso (#f)" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1395 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1403 - #, c-format - msgid "\"%s\" expects the first argument to be an ISO 8601 date/time string" - msgstr "" - "«%s» espera que el primer argumento sea una cadena tipo ISO 8601 de fecha/" - "hora" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1456 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1464 - #, c-format - msgid "\"%s\" expects the second argument to be an integer" - msgstr "«%s» espera que el segundo argumento sea un entero" -@@ -2097,36 +2101,36 @@ - msgstr[0] "Filtrando el mensaje nuevo en «%s»" - msgstr[1] "Filtrando los mensajes nuevos en «%s»" - --#: ../camel/camel-folder.c:1011 -+#: ../camel/camel-folder.c:1017 - #: ../camel/providers/local/camel-maildir-folder.c:330 - msgid "Moving messages" - msgstr "Moviendo mensajes" - --#: ../camel/camel-folder.c:1014 -+#: ../camel/camel-folder.c:1020 - msgid "Copying messages" - msgstr "Copiando mensajes" - --#: ../camel/camel-folder.c:1056 -+#: ../camel/camel-folder.c:1062 - #, c-format - msgid "Quota information not supported for folder '%s'" - msgstr "Información de cuota no soportada para la carpeta «%s»" - --#: ../camel/camel-folder.c:2862 -+#: ../camel/camel-folder.c:2868 - #, c-format - msgid "Expunging folder '%s'" - msgstr "Compactando la carpeta «%s»" - --#: ../camel/camel-folder.c:2990 -+#: ../camel/camel-folder.c:2996 - #, c-format - msgid "Retrieving message '%s' in %s" - msgstr "Obteniendo mensaje «%s» en «%s»" - --#: ../camel/camel-folder.c:3181 -+#: ../camel/camel-folder.c:3187 - #, c-format - msgid "Retrieving quota information for '%s'" - msgstr "Obteniendo la información de la cuota «%s»" - --#: ../camel/camel-folder.c:3478 -+#: ../camel/camel-folder.c:3484 - #, c-format - msgid "Refreshing folder '%s'" - msgstr "Actualizando la carpeta «%s»" -@@ -2163,78 +2167,69 @@ - - #: ../camel/camel-folder-search.c:1943 ../camel/camel-folder-search.c:2109 - #, c-format --msgid "" --"Cannot parse search expression: %s:\n" -+msgid "Cannot parse search expression: %s:\n" - "%s" --msgstr "" --"No se pudo analizar la expresión de búsqueda: %s:\n" -+msgstr "No se pudo analizar la expresión de búsqueda: %s:\n" - "%s" - - #: ../camel/camel-folder-search.c:1955 ../camel/camel-folder-search.c:2121 - #, c-format --msgid "" --"Error executing search expression: %s:\n" -+msgid "Error executing search expression: %s:\n" - "%s" --msgstr "" --"Error ejecutando la búsqueda según la expresión: %s:\n" -+msgstr "Error ejecutando la búsqueda según la expresión: %s:\n" - "%s" - --#: ../camel/camel-gpg-context.c:721 ../camel/camel-gpg-context.c:726 --#: ../camel/camel-gpg-context.c:1383 -+#: ../camel/camel-gpg-context.c:725 ../camel/camel-gpg-context.c:730 -+#: ../camel/camel-gpg-context.c:1387 - #, c-format - msgid "Failed to execute gpg: %s" - msgstr "Error al ejecutar gpg: %s" - --#: ../camel/camel-gpg-context.c:726 --#: ../camel/providers/smtp/camel-smtp-transport.c:924 -+#: ../camel/camel-gpg-context.c:730 -+#: ../camel/providers/smtp/camel-smtp-transport.c:963 - msgid "Unknown" - msgstr "Desconocido" - --#: ../camel/camel-gpg-context.c:791 -+#: ../camel/camel-gpg-context.c:795 - #, c-format --msgid "" --"Unexpected GnuPG status message encountered:\n" -+msgid "Unexpected GnuPG status message encountered:\n" - "\n" - "%s" --msgstr "" --"Se encontró un mensaje de estado GNUPG inesperado:\n" -+msgstr "Se encontró un mensaje de estado GNUPG inesperado:\n" - "\n" - "%s" - --#: ../camel/camel-gpg-context.c:827 -+#: ../camel/camel-gpg-context.c:831 - #, c-format - msgid "Failed to parse gpg userid hint." - msgstr "Falló al analizar el id del usuario gpg." - --#: ../camel/camel-gpg-context.c:852 ../camel/camel-gpg-context.c:867 -+#: ../camel/camel-gpg-context.c:856 ../camel/camel-gpg-context.c:871 - #, c-format - msgid "Failed to parse gpg passphrase request." - msgstr "Falló al analizar la solicitud de contraseña gpg." - --#: ../camel/camel-gpg-context.c:888 -+#: ../camel/camel-gpg-context.c:892 - #, c-format --msgid "" --"You need a PIN to unlock the key for your\n" -+msgid "You need a PIN to unlock the key for your\n" - "SmartCard: \"%s\"" --msgstr "" --"Necesita un NIP para desbloquear la clave para su \n" -+msgstr "Necesita un NIP para desbloquear la clave para su \n" - "SmartCard: «%s»" - --#: ../camel/camel-gpg-context.c:892 -+#: ../camel/camel-gpg-context.c:896 - #, c-format --msgid "" --"You need a passphrase to unlock the key for\n" -+msgid "You need a passphrase to unlock the key for\n" - "user: \"%s\"" - msgstr "" - "Necesita una contraseña para desbloquear la clave para \n" - "el usuario: «%s»" - --#: ../camel/camel-gpg-context.c:898 -+#: ../camel/camel-gpg-context.c:902 - #, c-format - msgid "Unexpected request from GnuPG for '%s'" - msgstr "Solicitud inesperada de GnuPG para «%s»" - --#: ../camel/camel-gpg-context.c:910 -+#: ../camel/camel-gpg-context.c:914 - msgid "" - "Note the encrypted content doesn't contain information about a recipient, " - "thus there will be a password prompt for each of stored private key." -@@ -2243,39 +2238,40 @@ - "destinatario, así que se pedirá una contraseña por cada clave privada " - "almacenada." - --#: ../camel/camel-gpg-context.c:941 ../camel/camel-net-utils.c:524 -+#: ../camel/camel-gpg-context.c:945 ../camel/camel-net-utils.c:524 - #: ../camel/providers/nntp/camel-nntp-summary.c:401 - #: ../libedataserver/e-client.c:158 - #, c-format - msgid "Cancelled" - msgstr "Cancelado" - --#: ../camel/camel-gpg-context.c:962 -+#: ../camel/camel-gpg-context.c:966 - #, c-format - msgid "Failed to unlock secret key: 3 bad passphrases given." --msgstr "Falló al desbloquear la clave secreta: se dieron 3 contraseñas falsas." -+msgstr "" -+"Falló al desbloquear la clave secreta: se dieron 3 contraseñas falsas." - --#: ../camel/camel-gpg-context.c:975 -+#: ../camel/camel-gpg-context.c:979 - #, c-format - msgid "Unexpected response from GnuPG: %s" - msgstr "Respuesta inesperada del GNUPG: %s" - --#: ../camel/camel-gpg-context.c:1106 -+#: ../camel/camel-gpg-context.c:1110 - #, c-format - msgid "Failed to encrypt: No valid recipients specified." - msgstr "No se pudo cifrar este mensaje: no hay destinatarios." - --#: ../camel/camel-gpg-context.c:1658 ../camel/camel-smime-context.c:844 -+#: ../camel/camel-gpg-context.c:1662 ../camel/camel-smime-context.c:844 - msgid "Could not generate signing data: " - msgstr "No se pudo generar los datos de la firma: " - --#: ../camel/camel-gpg-context.c:1708 ../camel/camel-gpg-context.c:1920 --#: ../camel/camel-gpg-context.c:2030 ../camel/camel-gpg-context.c:2179 -+#: ../camel/camel-gpg-context.c:1712 ../camel/camel-gpg-context.c:1924 -+#: ../camel/camel-gpg-context.c:2034 ../camel/camel-gpg-context.c:2183 - msgid "Failed to execute gpg." - msgstr "Falló al ejecutar gpg." - --#: ../camel/camel-gpg-context.c:1791 ../camel/camel-gpg-context.c:1799 --#: ../camel/camel-gpg-context.c:1807 ../camel/camel-gpg-context.c:1827 -+#: ../camel/camel-gpg-context.c:1795 ../camel/camel-gpg-context.c:1803 -+#: ../camel/camel-gpg-context.c:1811 ../camel/camel-gpg-context.c:1831 - #: ../camel/camel-smime-context.c:973 ../camel/camel-smime-context.c:987 - #: ../camel/camel-smime-context.c:996 - #, c-format -@@ -2283,30 +2279,30 @@ - msgstr "" - "No se pudo verificar la firma del mensaje: Formato de mensaje incorrecto" - --#: ../camel/camel-gpg-context.c:1873 -+#: ../camel/camel-gpg-context.c:1877 - msgid "Cannot verify message signature: " - msgstr "No se puede verificar la firma del mensaje: " - --#: ../camel/camel-gpg-context.c:1996 -+#: ../camel/camel-gpg-context.c:2000 - msgid "Could not generate encrypting data: " - msgstr "No se pudieron generar los datos de cifrado: " - --#: ../camel/camel-gpg-context.c:2049 -+#: ../camel/camel-gpg-context.c:2053 - msgid "This is a digitally encrypted message part" - msgstr "Esta parte del mensaje está cifrada digitalmente" - --#: ../camel/camel-gpg-context.c:2105 ../camel/camel-gpg-context.c:2114 --#: ../camel/camel-gpg-context.c:2137 -+#: ../camel/camel-gpg-context.c:2109 ../camel/camel-gpg-context.c:2118 -+#: ../camel/camel-gpg-context.c:2141 - #, c-format - msgid "Cannot decrypt message: Incorrect message format" - msgstr "No se pudo descifrar el mensaje: Formato de mensaje incorrecto" - --#: ../camel/camel-gpg-context.c:2125 -+#: ../camel/camel-gpg-context.c:2129 - #, c-format - msgid "Failed to decrypt MIME part: protocol error" - msgstr "Falló al descifrar la parte MIME: error del protocolo" - --#: ../camel/camel-gpg-context.c:2220 ../camel/camel-smime-context.c:1289 -+#: ../camel/camel-gpg-context.c:2224 ../camel/camel-smime-context.c:1289 - msgid "Encrypted content" - msgstr "Contenido cifrado" - -@@ -2506,29 +2502,23 @@ - - #: ../camel/camel-sasl-anonymous.c:79 - #, c-format --msgid "" --"Invalid email address trace information:\n" -+msgid "Invalid email address trace information:\n" - "%s" --msgstr "" --"Información de la traza de dirección de correo errónea:\n" -+msgstr "Información de la traza de dirección de correo errónea:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:93 - #, c-format --msgid "" --"Invalid opaque trace information:\n" -+msgid "Invalid opaque trace information:\n" - "%s" --msgstr "" --"Información de traza opaca no válida:\n" -+msgstr "Información de traza opaca no válida:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:107 - #, c-format --msgid "" --"Invalid trace information:\n" -+msgid "Invalid trace information:\n" - "%s" --msgstr "" --"Información de traza no válida:\n" -+msgstr "Información de traza no válida:\n" - "%s" - - #: ../camel/camel-sasl-cram-md5.c:44 -@@ -2569,7 +2559,8 @@ - #, c-format - msgid "Server challenge contained invalid \"Quality of Protection\" token" - msgstr "" --"El reto del servidor contiene un token no válido para «Calidad de Protección»" -+"El reto del servidor contiene un token no válido para «Calidad de " -+"Protección»" - - #: ../camel/camel-sasl-digest-md5.c:907 - #, c-format -@@ -2591,8 +2582,10 @@ - msgstr "GSSAPI" - - #: ../camel/camel-sasl-gssapi.c:97 --msgid "This option will connect to the server using Kerberos 5 authentication." --msgstr "Esta opción conectará con el servidor usando autenticación Kerberos 5." -+msgid "" -+"This option will connect to the server using Kerberos 5 authentication." -+msgstr "" -+"Esta opción conectará con el servidor usando autenticación Kerberos 5." - - #: ../camel/camel-sasl-gssapi.c:149 - #, c-format -@@ -2663,7 +2656,7 @@ - - #: ../camel/camel-sasl-gssapi.c:223 ../camel/camel-sasl-gssapi.c:405 - #: ../camel/camel-sasl-gssapi.c:454 ../camel/camel-sasl-gssapi.c:471 --#: ../camel/providers/smtp/camel-smtp-transport.c:622 -+#: ../camel/providers/smtp/camel-smtp-transport.c:659 - #, c-format - msgid "Bad authentication response from server." - msgstr "Respuesta de autenticación errónea desde el servidor." -@@ -2735,10 +2728,10 @@ - msgstr "El GType registrado no es válido para el protocolo «%s»" - - #: ../camel/camel-session.c:502 --#: ../camel/providers/imapx/camel-imapx-server.c:4734 -+#: ../camel/providers/imapx/camel-imapx-server.c:4821 - #: ../camel/providers/pop3/camel-pop3-store.c:311 --#: ../camel/providers/pop3/camel-pop3-store.c:757 --#: ../camel/providers/smtp/camel-smtp-transport.c:515 -+#: ../camel/providers/pop3/camel-pop3-store.c:766 -+#: ../camel/providers/smtp/camel-smtp-transport.c:545 - #, c-format - msgid "No support for %s authentication" - msgstr "No hay soporte para la autenticación %s" -@@ -2944,49 +2937,53 @@ - msgid "S/MIME Decrypt: No encrypted content found" - msgstr "Descifrado S/MIME: No se ha encontrado contenido cifrado" - --#: ../camel/camel-store.c:1232 -+#: ../camel/camel-store.c:1238 - #, c-format - msgid "Opening folder '%s'" - msgstr "Abriendo carpeta «%s»" - --#: ../camel/camel-store.c:1523 -+#: ../camel/camel-store.c:1529 - #, c-format - msgid "Scanning folders in '%s'" - msgstr "Analizando carpetas en «%s»" - --#: ../camel/camel-store.c:1551 ../camel/camel-store.c:1596 -+#: ../camel/camel-store.c:1557 ../camel/camel-store.c:1602 - #: ../camel/camel-vtrash-folder.c:46 - msgid "Trash" - msgstr "Papelera" - --#: ../camel/camel-store.c:1565 ../camel/camel-store.c:1613 -+#: ../camel/camel-store.c:1571 ../camel/camel-store.c:1619 - #: ../camel/camel-vtrash-folder.c:48 - msgid "Junk" - msgstr "SPAM" - --#: ../camel/camel-store.c:2214 -+#: ../camel/camel-store.c:2220 - #, c-format - msgid "Cannot create folder: %s: folder exists" - msgstr "No se pudo crear la carpeta: %s: la carpeta existe" - --#: ../camel/camel-store.c:2221 -+#: ../camel/camel-store.c:2227 - #, c-format - msgid "Creating folder '%s'" - msgstr "Creando carpeta «%s»" - --#: ../camel/camel-store.c:2398 ../camel/camel-vee-store.c:410 --#: ../camel/providers/local/camel-maildir-store.c:321 -+#: ../camel/camel-store.c:2404 ../camel/camel-vee-store.c:410 -+#: ../camel/providers/local/camel-maildir-store.c:346 - #, c-format - msgid "Cannot delete folder: %s: Invalid operation" - msgstr "No se pudo eliminar la carpeta: %s: Operación no válida" - --#: ../camel/camel-store.c:2588 ../camel/camel-vee-store.c:461 --#: ../camel/providers/local/camel-maildir-store.c:872 -+#: ../camel/camel-store.c:2594 ../camel/camel-vee-store.c:461 -+#: ../camel/providers/local/camel-maildir-store.c:914 - #, c-format - msgid "Cannot rename folder: %s: Invalid operation" - msgstr "No se pudo renombrar la carpeta: %s: Operación no válida" - --#: ../camel/camel-stream.c:285 ../camel/camel-stream.c:336 -+#: ../camel/camel-stream.c:170 -+msgid "Cannot write with no base stream" -+msgstr "No se pudo escribir sin flujo de base" -+ -+#: ../camel/camel-stream.c:290 ../camel/camel-stream.c:341 - #, c-format - msgid "Stream type '%s' is not seekable" - msgstr "El tipo de flujo «%s» no es buscable:" -@@ -3212,229 +3209,229 @@ - msgid "For reading and storing mail on IMAP servers." - msgstr "Para leer y almacenar correo en los servidores IMAP." - --#: ../camel/providers/imapx/camel-imapx-server.c:1009 - #: ../camel/providers/imapx/camel-imapx-server.c:1016 -+#: ../camel/providers/imapx/camel-imapx-server.c:1023 - #, c-format - msgid "Not authenticated" - msgstr "No está autenticado" - --#: ../camel/providers/imapx/camel-imapx-server.c:1713 -+#: ../camel/providers/imapx/camel-imapx-server.c:1751 - msgid "Server disconnected" - msgstr "Servidor desconectado" - --#: ../camel/providers/imapx/camel-imapx-server.c:2205 -+#: ../camel/providers/imapx/camel-imapx-server.c:2252 - msgid "Error writing to cache stream" - msgstr "Error al escribir al flujo de caché" - --#: ../camel/providers/imapx/camel-imapx-server.c:3565 -+#: ../camel/providers/imapx/camel-imapx-server.c:3640 - msgid "Error performing IDLE" - msgstr "Error al estar inactivo" - --#: ../camel/providers/imapx/camel-imapx-server.c:4573 -+#: ../camel/providers/imapx/camel-imapx-server.c:4660 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: %s" - msgstr "Falló al conectar al servidor IMAP %s en modo seguro: %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:4574 --#: ../camel/providers/smtp/camel-smtp-transport.c:215 -+#: ../camel/providers/imapx/camel-imapx-server.c:4661 -+#: ../camel/providers/smtp/camel-smtp-transport.c:216 - msgid "STARTTLS not supported" - msgstr "No se soporta STARTTLS" - --#: ../camel/providers/imapx/camel-imapx-server.c:4634 -+#: ../camel/providers/imapx/camel-imapx-server.c:4721 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: " - msgstr "Falló al conectar al servidor IMAP %s en modo seguro: " - --#: ../camel/providers/imapx/camel-imapx-server.c:4723 -+#: ../camel/providers/imapx/camel-imapx-server.c:4810 - #, c-format - msgid "IMAP server %s does not support %s authentication" - msgstr "El servidor IMAP %s no soporta la autenticación %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:4753 -+#: ../camel/providers/imapx/camel-imapx-server.c:4840 - #: ../camel/providers/nntp/camel-nntp-store.c:394 - #: ../camel/providers/nntp/camel-nntp-store.c:531 - msgid "Cannot authenticate without a username" - msgstr "No se pudo autenticar sin un nombre de usuario" - --#: ../camel/providers/imapx/camel-imapx-server.c:4762 -+#: ../camel/providers/imapx/camel-imapx-server.c:4849 - #: ../camel/providers/nntp/camel-nntp-store.c:540 - #: ../camel/providers/pop3/camel-pop3-store.c:678 --#: ../camel/providers/pop3/camel-pop3-store.c:699 -+#: ../camel/providers/pop3/camel-pop3-store.c:708 - msgid "Authentication password not available" - msgstr "La contraseña de la autenticación no está disponible" - --#: ../camel/providers/imapx/camel-imapx-server.c:4998 --#: ../camel/providers/imapx/camel-imapx-server.c:5057 -+#: ../camel/providers/imapx/camel-imapx-server.c:5085 -+#: ../camel/providers/imapx/camel-imapx-server.c:5144 - msgid "Error fetching message" - msgstr "Error al obtener el mensaje" - --#: ../camel/providers/imapx/camel-imapx-server.c:5050 -+#: ../camel/providers/imapx/camel-imapx-server.c:5137 - msgid "Failed to close the tmp stream" - msgstr "Falló al cerrar el flujo temporal" - --#: ../camel/providers/imapx/camel-imapx-server.c:5086 -+#: ../camel/providers/imapx/camel-imapx-server.c:5173 - msgid "Failed to copy the tmp file" - msgstr "Falló al copiar el archivo temporal" - --#: ../camel/providers/imapx/camel-imapx-server.c:5227 -+#: ../camel/providers/imapx/camel-imapx-server.c:5345 - msgid "Error moving messages" - msgstr "Error al mover los mensajes" - --#: ../camel/providers/imapx/camel-imapx-server.c:5231 -+#: ../camel/providers/imapx/camel-imapx-server.c:5349 - msgid "Error copying messages" - msgstr "Error al copiar los mensajes" - --#: ../camel/providers/imapx/camel-imapx-server.c:5453 -+#: ../camel/providers/imapx/camel-imapx-server.c:5579 - msgid "Error appending message" - msgstr "Error al añadir el mensaje" - --#: ../camel/providers/imapx/camel-imapx-server.c:5689 -+#: ../camel/providers/imapx/camel-imapx-server.c:5815 - msgid "Error fetching message headers" - msgstr "Error al obtener las cabeceras de los mensajes" - --#: ../camel/providers/imapx/camel-imapx-server.c:5856 -+#: ../camel/providers/imapx/camel-imapx-server.c:5982 - msgid "Error retrieving message" - msgstr "Error al obtener el mensaje" - --#: ../camel/providers/imapx/camel-imapx-server.c:5990 --#: ../camel/providers/imapx/camel-imapx-server.c:6219 -+#: ../camel/providers/imapx/camel-imapx-server.c:6116 -+#: ../camel/providers/imapx/camel-imapx-server.c:6345 - #, c-format - msgid "Fetching summary information for new messages in '%s'" - msgstr "" - "Obteniendo recopilación de información sobre los mensajes nuevos en «%s»" - --#: ../camel/providers/imapx/camel-imapx-server.c:6042 -+#: ../camel/providers/imapx/camel-imapx-server.c:6168 - #, c-format - msgid "Scanning for changed messages in '%s'" - msgstr "Buscando mensajes modificados en «%s»" - --#: ../camel/providers/imapx/camel-imapx-server.c:6094 -+#: ../camel/providers/imapx/camel-imapx-server.c:6220 - msgid "Error fetching new messages" - msgstr "Error al obtener mensajes nuevos" - --#: ../camel/providers/imapx/camel-imapx-server.c:6367 -+#: ../camel/providers/imapx/camel-imapx-server.c:6493 - msgid "Error refreshing folder" - msgstr "Error al actualizar la carpeta" - --#: ../camel/providers/imapx/camel-imapx-server.c:6517 -+#: ../camel/providers/imapx/camel-imapx-server.c:6643 - msgid "Error expunging message" - msgstr "Error al compactar el mensaje" - --#: ../camel/providers/imapx/camel-imapx-server.c:6632 --#: ../camel/providers/imapx/camel-imapx-server.c:6657 -+#: ../camel/providers/imapx/camel-imapx-server.c:6758 -+#: ../camel/providers/imapx/camel-imapx-server.c:6783 - msgid "Error fetching folders" - msgstr "Error al obtener las carpetas" - --#: ../camel/providers/imapx/camel-imapx-server.c:6737 -+#: ../camel/providers/imapx/camel-imapx-server.c:6863 - msgid "Error creating folder" - msgstr "Error al crear la carpeta" - --#: ../camel/providers/imapx/camel-imapx-server.c:6789 -+#: ../camel/providers/imapx/camel-imapx-server.c:6915 - msgid "Error deleting folder" - msgstr "Error al eliminar la carpeta" - --#: ../camel/providers/imapx/camel-imapx-server.c:6865 -+#: ../camel/providers/imapx/camel-imapx-server.c:6991 - msgid "Error renaming folder" - msgstr "Error al renombrar la carpeta" - --#: ../camel/providers/imapx/camel-imapx-server.c:6939 -+#: ../camel/providers/imapx/camel-imapx-server.c:7065 - msgid "Error subscribing to folder" - msgstr "Error al suscribirse a las carpeta" - --#: ../camel/providers/imapx/camel-imapx-server.c:7005 -+#: ../camel/providers/imapx/camel-imapx-server.c:7131 - msgid "Error unsubscribing from folder" - msgstr "Error al desuscribirse de la carpeta" - --#: ../camel/providers/imapx/camel-imapx-server.c:7067 -+#: ../camel/providers/imapx/camel-imapx-server.c:7193 - msgid "Error retrieving quota information" - msgstr "Error al obtener la información de la cuota" - --#: ../camel/providers/imapx/camel-imapx-server.c:7119 -+#: ../camel/providers/imapx/camel-imapx-server.c:7245 - msgid "Search failed" - msgstr "Falló al buscar" - --#: ../camel/providers/imapx/camel-imapx-server.c:7181 -+#: ../camel/providers/imapx/camel-imapx-server.c:7307 - msgid "Error performing NOOP" - msgstr "Error realizar la no operación" - --#: ../camel/providers/imapx/camel-imapx-server.c:7288 -+#: ../camel/providers/imapx/camel-imapx-server.c:7414 - msgid "Error syncing changes" - msgstr "Error al sincronizar los cambios" - --#: ../camel/providers/imapx/camel-imapx-server.c:8275 -+#: ../camel/providers/imapx/camel-imapx-server.c:8446 - #, c-format - msgid "Cannot get message with message ID %s: %s" - msgstr "No se puede obtener el mensaje con ID de mensaje %s: %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:8276 -+#: ../camel/providers/imapx/camel-imapx-server.c:8447 - msgid "No such message available." - msgstr "Dicho mensaje no está disponible." - --#: ../camel/providers/imapx/camel-imapx-server.c:8483 --#: ../camel/providers/imapx/camel-imapx-server.c:8504 -+#: ../camel/providers/imapx/camel-imapx-server.c:8671 -+#: ../camel/providers/imapx/camel-imapx-server.c:8692 - msgid "Cannot create spool file: " - msgstr "No se puede crear el archivo de cola de correo: " - --#: ../camel/providers/imapx/camel-imapx-server.c:9256 -+#: ../camel/providers/imapx/camel-imapx-server.c:9502 - msgid "IMAP server does not support quotas" - msgstr "El servidor IMAP no soporta cuotas" - - #. create a dummy "." parent inbox, use to scan, then put back at the top level - #: ../camel/providers/imapx/camel-imapx-store.c:223 - #: ../camel/providers/local/camel-maildir-folder.c:482 --#: ../camel/providers/local/camel-maildir-store.c:322 --#: ../camel/providers/local/camel-maildir-store.c:784 --#: ../camel/providers/local/camel-maildir-store.c:790 --#: ../camel/providers/local/camel-maildir-store.c:873 -+#: ../camel/providers/local/camel-maildir-store.c:347 -+#: ../camel/providers/local/camel-maildir-store.c:826 -+#: ../camel/providers/local/camel-maildir-store.c:832 -+#: ../camel/providers/local/camel-maildir-store.c:915 - #: ../camel/providers/local/camel-spool-store.c:393 - msgid "Inbox" - msgstr "Bandeja de entrada" - --#: ../camel/providers/imapx/camel-imapx-store.c:758 -+#: ../camel/providers/imapx/camel-imapx-store.c:757 - #, c-format - msgid "IMAP server %s" - msgstr "Servidor IMAP %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:761 -+#: ../camel/providers/imapx/camel-imapx-store.c:760 - #, c-format - msgid "IMAP service for %s on %s" - msgstr "Servicio IMAP para %s en %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:836 -+#: ../camel/providers/imapx/camel-imapx-store.c:835 - #: ../camel/providers/nntp/camel-nntp-provider.c:93 - #: ../camel/providers/pop3/camel-pop3-provider.c:81 - msgid "Password" - msgstr "Contraseña" - --#: ../camel/providers/imapx/camel-imapx-store.c:838 --msgid "This option will connect to the IMAP server using a plaintext password." -+#: ../camel/providers/imapx/camel-imapx-store.c:837 -+msgid "" -+"This option will connect to the IMAP server using a plaintext password." - msgstr "" - "Esta opción conectará con el servidor IMAP usando una contraseña de texto " - "plano." - --#: ../camel/providers/imapx/camel-imapx-store.c:913 -+#: ../camel/providers/imapx/camel-imapx-store.c:916 - #, c-format - msgid "No such folder %s" - msgstr "No existe la carpeta %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:1324 -+#: ../camel/providers/imapx/camel-imapx-store.c:1344 - #, c-format - msgid "No IMAP namespace for folder path '%s'" - msgstr "No hay espacio de nombres IMAP para la ruta de la carpeta «%s»" - --#: ../camel/providers/imapx/camel-imapx-store.c:1472 -+#: ../camel/providers/imapx/camel-imapx-store.c:1609 - #, c-format - msgid "Retrieving folder list for %s" - msgstr "Obteniendo la lista de carpetas para %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:1924 -+#: ../camel/providers/imapx/camel-imapx-store.c:2061 - #, c-format --msgid "" --"The folder name \"%s\" is invalid because it contains the character \"%c\"" -+msgid "The folder name \"%s\" is invalid because it contains the character \"%c\"" - msgstr "" - "El nombre de la carpeta «%s» es no válido porque contiene el carácter «%c»" - --#: ../camel/providers/imapx/camel-imapx-store.c:2689 -+#: ../camel/providers/imapx/camel-imapx-store.c:2833 - #: ../camel/providers/nntp/camel-nntp-store.c:1250 - #: ../camel/providers/pop3/camel-pop3-folder.c:450 - #: ../camel/providers/pop3/camel-pop3-folder.c:593 -@@ -3444,10 +3441,11 @@ - #: ../camel/providers/pop3/camel-pop3-store.c:528 - #: ../camel/providers/pop3/camel-pop3-store.c:576 - #: ../camel/providers/pop3/camel-pop3-store.c:668 --#: ../camel/providers/pop3/camel-pop3-store.c:1072 -+#: ../camel/providers/pop3/camel-pop3-store.c:1081 - #, c-format - msgid "You must be working online to complete this operation" --msgstr "Para completar esta operación debe estar trabajando conectado a la red" -+msgstr "" -+"Para completar esta operación debe estar trabajando conectado a la red" - - #: ../camel/providers/local/camel-local-folder.c:195 - #, c-format -@@ -3471,11 +3469,9 @@ - - #: ../camel/providers/local/camel-local-folder.c:730 - #, c-format --msgid "" --"Cannot get message %s from folder %s\n" -+msgid "Cannot get message %s from folder %s\n" - "%s" --msgstr "" --"No se puede obtener el mensaje %s de la carpeta %s\n" -+msgstr "No se puede obtener el mensaje %s de la carpeta %s\n" - "%s" - - #: ../camel/providers/local/camel-local-provider.c:41 -@@ -3549,7 +3545,7 @@ - - #: ../camel/providers/local/camel-local-store.c:221 - #: ../camel/providers/local/camel-local-store.c:381 --#: ../camel/providers/local/camel-maildir-store.c:122 -+#: ../camel/providers/local/camel-maildir-store.c:123 - #: ../camel/providers/local/camel-mbox-store.c:572 - #: ../camel/providers/local/camel-spool-store.c:87 - #, c-format -@@ -3564,7 +3560,7 @@ - #: ../camel/providers/local/camel-local-store.c:242 - #: ../camel/providers/local/camel-local-store.c:252 - #: ../camel/providers/local/camel-local-store.c:394 --#: ../camel/providers/local/camel-maildir-store.c:156 -+#: ../camel/providers/local/camel-maildir-store.c:165 - #, c-format - msgid "Cannot get folder: %s: %s" - msgstr "No se pudo acceder a la carpeta: %s: %s" -@@ -3586,7 +3582,7 @@ - msgid "Could not delete folder meta file '%s': %s" - msgstr "No se pueden eliminar los metadatos de la carpeta «%s»: %s" - --#: ../camel/providers/local/camel-local-store.c:594 -+#: ../camel/providers/local/camel-local-store.c:595 - #, c-format - msgid "Could not rename '%s': %s" - msgstr "No se pudo renombrar: «%s»: %s" -@@ -3618,53 +3614,60 @@ - msgid "Cannot transfer message to destination folder: %s" - msgstr "No se puede transferir el mensaje a la carpeta de destino: %s" - --#: ../camel/providers/local/camel-maildir-store.c:130 --#: ../camel/providers/local/camel-maildir-store.c:149 --#: ../camel/providers/local/camel-maildir-store.c:881 -+#: ../camel/providers/local/camel-maildir-store.c:131 -+#: ../camel/providers/local/camel-maildir-store.c:931 -+#, c-format -+msgid "Cannot create folder containing '%s'" -+msgstr "No se puede crear la carpeta que contiene %s" -+ -+#: ../camel/providers/local/camel-maildir-store.c:139 -+#: ../camel/providers/local/camel-maildir-store.c:158 -+#: ../camel/providers/local/camel-maildir-store.c:923 - #, c-format - msgid "Folder %s already exists" - msgstr "La carpeta %s ya existe" - --#: ../camel/providers/local/camel-maildir-store.c:241 --#: ../camel/providers/local/camel-maildir-store.c:272 -+#: ../camel/providers/local/camel-maildir-store.c:266 -+#: ../camel/providers/local/camel-maildir-store.c:297 - #: ../camel/providers/local/camel-mbox-store.c:401 - #: ../camel/providers/local/camel-mbox-store.c:422 - #, c-format - msgid "Cannot create folder '%s': %s" - msgstr "No se puede crear la carpeta: «%s»: %s" - --#: ../camel/providers/local/camel-maildir-store.c:256 -+#: ../camel/providers/local/camel-maildir-store.c:281 - #: ../camel/providers/local/camel-mbox-store.c:367 - #: ../camel/providers/local/camel-mh-store.c:523 - #, c-format - msgid "Cannot get folder '%s': %s" - msgstr "No se puede acceder a la carpeta: «%s»: %s" - --#: ../camel/providers/local/camel-maildir-store.c:262 -+#: ../camel/providers/local/camel-maildir-store.c:287 - #: ../camel/providers/local/camel-mbox-store.c:377 - #: ../camel/providers/local/camel-mh-store.c:532 - #, c-format - msgid "Cannot get folder '%s': folder does not exist." - msgstr "No se puede obtener la carpeta «%s»: la carpeta no existe." - --#: ../camel/providers/local/camel-maildir-store.c:289 -+#: ../camel/providers/local/camel-maildir-store.c:314 - #, c-format - msgid "Cannot get folder '%s': not a maildir directory." --msgstr "No se puede obtener la carpeta «%s»: no es un directorio tipo maildir." -+msgstr "" -+"No se puede obtener la carpeta «%s»: no es un directorio tipo maildir." - --#: ../camel/providers/local/camel-maildir-store.c:353 --#: ../camel/providers/local/camel-maildir-store.c:393 -+#: ../camel/providers/local/camel-maildir-store.c:378 -+#: ../camel/providers/local/camel-maildir-store.c:418 - #: ../camel/providers/local/camel-mh-store.c:676 - #, c-format - msgid "Could not delete folder '%s': %s" - msgstr "No se puede eliminar la carpeta «%s»: %s" - --#: ../camel/providers/local/camel-maildir-store.c:355 -+#: ../camel/providers/local/camel-maildir-store.c:380 - msgid "not a maildir directory" - msgstr "no es una carpeta tipo maildir" - --#: ../camel/providers/local/camel-maildir-store.c:637 --#: ../camel/providers/local/camel-maildir-store.c:1095 -+#: ../camel/providers/local/camel-maildir-store.c:666 -+#: ../camel/providers/local/camel-maildir-store.c:1146 - #: ../camel/providers/local/camel-spool-store.c:212 - #: ../camel/providers/local/camel-spool-store.c:231 - #, c-format -@@ -3742,11 +3745,9 @@ - #: ../camel/providers/local/camel-mbox-store.c:663 - #: ../camel/providers/local/camel-mbox-store.c:692 - #, c-format --msgid "" --"Could not delete folder '%s':\n" -+msgid "Could not delete folder '%s':\n" - "%s" --msgstr "" --"No se pudo eliminar la carpeta «%s»:\n" -+msgstr "No se pudo eliminar la carpeta «%s»:\n" - "%s" - - #: ../camel/providers/local/camel-mbox-store.c:673 -@@ -3909,11 +3910,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:494 - #, c-format --msgid "" --"Could not open folder '%s':\n" -+msgid "Could not open folder '%s':\n" - "%s" --msgstr "" --"No se puede abrir la carpeta «%s»:\n" -+msgstr "No se puede abrir la carpeta «%s»:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:500 -@@ -3923,11 +3922,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:508 - #, c-format --msgid "" --"Could not create folder '%s':\n" -+msgid "Could not create folder '%s':\n" - "%s" --msgstr "" --"No se pudo crear la carpeta «%s»:\n" -+msgstr "No se pudo crear la carpeta «%s»:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:521 -@@ -4075,12 +4072,10 @@ - - #: ../camel/providers/nntp/camel-nntp-store.c:1151 - #, c-format --msgid "" --"Error retrieving newsgroups:\n" -+msgid "Error retrieving newsgroups:\n" - "\n" - "%s" --msgstr "" --"Error al obtener los grupos de noticias:\n" -+msgstr "Error al obtener los grupos de noticias:\n" - "\n" - "%s" - -@@ -4089,6 +4084,7 @@ - msgid "You cannot create a folder in a News store: subscribe instead." - msgstr "" - "No puede crear una carpeta en un almacén de noticias: suscríbase en su lugar." -+"" - - #: ../camel/providers/nntp/camel-nntp-store.c:1283 - #, c-format -@@ -4116,8 +4112,7 @@ - - #: ../camel/providers/nntp/camel-nntp-store.c:1583 - #, c-format --msgid "" --"You cannot unsubscribe to this newsgroup:\n" -+msgid "You cannot unsubscribe to this newsgroup:\n" - "\n" - "newsgroup does not exist!" - msgstr "" -@@ -4304,7 +4299,16 @@ - msgid "POP3 server for %s on %s" - msgstr "Servidor POP3 para %s en %s" - --#: ../camel/providers/pop3/camel-pop3-store.c:713 -+#: ../camel/providers/pop3/camel-pop3-store.c:690 -+#: ../camel/providers/pop3/camel-pop3-store.c:777 -+#, c-format -+msgid "Unable to connect to POP server %s.\n" -+"Error sending password: " -+msgstr "" -+"No se pudo conectar con el servidor POP %s.\n" -+"Error al enviar la contraseña: " -+ -+#: ../camel/providers/pop3/camel-pop3-store.c:722 - #, c-format - msgid "" - "Unable to connect to POP server %s:\tInvalid APOP ID received. Impersonation " -@@ -4313,32 +4317,22 @@ - "No se pudo conectar con el servidor POP %s: \tID APOP recibida no válida. Se " - "sospecha un ataque suplantación. Por favor, contacte con su administrador." - --#: ../camel/providers/pop3/camel-pop3-store.c:768 --#, c-format --msgid "" --"Unable to connect to POP server %s.\n" --"Error sending password: " --msgstr "" --"No se pudo conectar con el servidor POP %s.\n" --"Error al enviar la contraseña: " -- - #. Translators: Last %s is an optional explanation - #. * beginning with ": " separator. --#: ../camel/providers/pop3/camel-pop3-store.c:783 -+#: ../camel/providers/pop3/camel-pop3-store.c:792 - #, c-format --msgid "" --"Unable to connect to POP server %s.\n" -+msgid "Unable to connect to POP server %s.\n" - "Error sending username%s" - msgstr "" - "No se pudo conectar con el servidor POP %s.\n" - "Error al enviar nombre de usuario %s" - --#: ../camel/providers/pop3/camel-pop3-store.c:865 -+#: ../camel/providers/pop3/camel-pop3-store.c:874 - #, c-format - msgid "No such folder '%s'." - msgstr "No existe la carpeta «%s»." - --#: ../camel/providers/pop3/camel-pop3-store.c:882 -+#: ../camel/providers/pop3/camel-pop3-store.c:891 - #, c-format - msgid "POP3 stores have no folder hierarchy" - msgstr "Los almacenamientos POP3 no tienen jerarquía de carpetas" -@@ -4430,221 +4424,224 @@ - - #: ../camel/providers/smtp/camel-smtp-provider.c:50 - msgid "For delivering mail by connecting to a remote mailhub using SMTP." --msgstr "Para entregar correo conectándose a un servidor de correo usando SMTP." -+msgstr "" -+"Para entregar correo conectándose a un servidor de correo usando SMTP." - --#: ../camel/providers/smtp/camel-smtp-transport.c:170 --#: ../camel/providers/smtp/camel-smtp-transport.c:178 -+#: ../camel/providers/smtp/camel-smtp-transport.c:171 -+#: ../camel/providers/smtp/camel-smtp-transport.c:179 - msgid "Welcome response error: " - msgstr "Error en la respuesta de bienvenida: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:214 -+#: ../camel/providers/smtp/camel-smtp-transport.c:215 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: %s" - msgstr "Falló al conectar al servidor SMTP %s en modo seguro: %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:224 --#: ../camel/providers/smtp/camel-smtp-transport.c:238 --#: ../camel/providers/smtp/camel-smtp-transport.c:246 -+#: ../camel/providers/smtp/camel-smtp-transport.c:225 -+#: ../camel/providers/smtp/camel-smtp-transport.c:240 -+#: ../camel/providers/smtp/camel-smtp-transport.c:248 - msgid "STARTTLS command failed: " - msgstr "El comando STARTTLS ha fallado: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:265 -+#: ../camel/providers/smtp/camel-smtp-transport.c:267 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: " - msgstr "Falló al conectar al servidor SMTP %s en modo seguro: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:357 -+#: ../camel/providers/smtp/camel-smtp-transport.c:359 - #, c-format - msgid "SMTP server %s" - msgstr "Servidor SMTP %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:360 -+#: ../camel/providers/smtp/camel-smtp-transport.c:362 - #, c-format - msgid "SMTP mail delivery via %s" - msgstr "Envío de correo SMTP vía %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:434 -+#: ../camel/providers/smtp/camel-smtp-transport.c:463 - #, c-format - msgid "SMTP server %s does not support %s authentication" - msgstr "El servidor SMTP %s no soporta la autenticación %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:506 -+#: ../camel/providers/smtp/camel-smtp-transport.c:536 - #, c-format - msgid "No SASL mechanism was specified" - msgstr "No se especificó ningún mecanismo SASL" - --#: ../camel/providers/smtp/camel-smtp-transport.c:536 --#: ../camel/providers/smtp/camel-smtp-transport.c:547 --#: ../camel/providers/smtp/camel-smtp-transport.c:560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:571 -+#: ../camel/providers/smtp/camel-smtp-transport.c:583 -+#: ../camel/providers/smtp/camel-smtp-transport.c:596 - msgid "AUTH command failed: " - msgstr "El comando AUTH ha fallado: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:701 -+#: ../camel/providers/smtp/camel-smtp-transport.c:740 - #, c-format - msgid "Cannot send message: service not connected." - msgstr "No se puede enviar el correo: servicio no conectado." - --#: ../camel/providers/smtp/camel-smtp-transport.c:708 -+#: ../camel/providers/smtp/camel-smtp-transport.c:747 - #, c-format - msgid "Cannot send message: sender address not valid." - msgstr "No se puede enviar el correo: dirección del remitente no válida." - --#: ../camel/providers/smtp/camel-smtp-transport.c:712 -+#: ../camel/providers/smtp/camel-smtp-transport.c:751 - msgid "Sending message" - msgstr "Enviando correo" - --#: ../camel/providers/smtp/camel-smtp-transport.c:737 -+#: ../camel/providers/smtp/camel-smtp-transport.c:776 - #, c-format - msgid "Cannot send message: no recipients defined." - msgstr "No se puede enviar el correo: no hay destinatarios." - --#: ../camel/providers/smtp/camel-smtp-transport.c:750 -+#: ../camel/providers/smtp/camel-smtp-transport.c:789 - #, c-format - msgid "Cannot send message: one or more invalid recipients" - msgstr "No se puede enviar el correo: uno o más destinatarios no válidos" - --#: ../camel/providers/smtp/camel-smtp-transport.c:871 -+#: ../camel/providers/smtp/camel-smtp-transport.c:910 - msgid "Syntax error, command unrecognized" - msgstr "Error de sintaxis, comando no reconocido" - --#: ../camel/providers/smtp/camel-smtp-transport.c:873 -+#: ../camel/providers/smtp/camel-smtp-transport.c:912 - msgid "Syntax error in parameters or arguments" - msgstr "Error de sintaxis en los parámetros o los argumentos" - --#: ../camel/providers/smtp/camel-smtp-transport.c:875 -+#: ../camel/providers/smtp/camel-smtp-transport.c:914 - msgid "Command not implemented" - msgstr "Comando no implementado" - --#: ../camel/providers/smtp/camel-smtp-transport.c:877 -+#: ../camel/providers/smtp/camel-smtp-transport.c:916 - msgid "Command parameter not implemented" - msgstr "Parámetro del comando no implementado" - --#: ../camel/providers/smtp/camel-smtp-transport.c:879 -+#: ../camel/providers/smtp/camel-smtp-transport.c:918 - msgid "System status, or system help reply" - msgstr "Estado del sistema, o respuesta a la ayuda del sistema" - --#: ../camel/providers/smtp/camel-smtp-transport.c:881 -+#: ../camel/providers/smtp/camel-smtp-transport.c:920 - msgid "Help message" - msgstr "Mensaje de ayuda" - --#: ../camel/providers/smtp/camel-smtp-transport.c:883 -+#: ../camel/providers/smtp/camel-smtp-transport.c:922 - msgid "Service ready" - msgstr "Servicio preparado" - --#: ../camel/providers/smtp/camel-smtp-transport.c:885 -+#: ../camel/providers/smtp/camel-smtp-transport.c:924 - msgid "Service closing transmission channel" - msgstr "Servicio cerrando los canales de transmisión" - --#: ../camel/providers/smtp/camel-smtp-transport.c:887 -+#: ../camel/providers/smtp/camel-smtp-transport.c:926 - msgid "Service not available, closing transmission channel" - msgstr "Servicio no disponible, cerrando los canales de transmisión" - --#: ../camel/providers/smtp/camel-smtp-transport.c:889 -+#: ../camel/providers/smtp/camel-smtp-transport.c:928 - msgid "Requested mail action okay, completed" - msgstr "Acción de correo solicitada correctamente completada" - --#: ../camel/providers/smtp/camel-smtp-transport.c:891 -+#: ../camel/providers/smtp/camel-smtp-transport.c:930 - msgid "User not local; will forward to " - msgstr "El usuario no es local; se reenviará a " - --#: ../camel/providers/smtp/camel-smtp-transport.c:893 -+#: ../camel/providers/smtp/camel-smtp-transport.c:932 - msgid "Requested mail action not taken: mailbox unavailable" --msgstr "Acción solicitada del correo no realizada: el buzón no está disponible" -+msgstr "" -+"Acción solicitada del correo no realizada: el buzón no está disponible" - --#: ../camel/providers/smtp/camel-smtp-transport.c:895 -+#: ../camel/providers/smtp/camel-smtp-transport.c:934 - msgid "Requested action not taken: mailbox unavailable" - msgstr "Acción solicitada no realizada: el buzón no está disponible" - --#: ../camel/providers/smtp/camel-smtp-transport.c:897 -+#: ../camel/providers/smtp/camel-smtp-transport.c:936 - msgid "Requested action aborted: error in processing" - msgstr "Acción solicitada abortada: error en procesamiento" - --#: ../camel/providers/smtp/camel-smtp-transport.c:899 -+#: ../camel/providers/smtp/camel-smtp-transport.c:938 - msgid "User not local; please try " - msgstr "El usuario no es local; pruebe con " - --#: ../camel/providers/smtp/camel-smtp-transport.c:901 -+#: ../camel/providers/smtp/camel-smtp-transport.c:940 - msgid "Requested action not taken: insufficient system storage" - msgstr "" - "Acción solicitada no realizada: la capacidad del sistema es insuficiente" - --#: ../camel/providers/smtp/camel-smtp-transport.c:903 -+#: ../camel/providers/smtp/camel-smtp-transport.c:942 - msgid "Requested mail action aborted: exceeded storage allocation" --msgstr "Acción solicitada no realizada: excedió la capacidad de almacenamiento" -+msgstr "" -+"Acción solicitada no realizada: excedió la capacidad de almacenamiento" - --#: ../camel/providers/smtp/camel-smtp-transport.c:905 -+#: ../camel/providers/smtp/camel-smtp-transport.c:944 - msgid "Requested action not taken: mailbox name not allowed" - msgstr "Acción solicitada no realizada: nombre no permitido para el buzón" - --#: ../camel/providers/smtp/camel-smtp-transport.c:907 -+#: ../camel/providers/smtp/camel-smtp-transport.c:946 - msgid "Start mail input; end with ." - msgstr "Comience a escribir el mensaje; finalice con ." - --#: ../camel/providers/smtp/camel-smtp-transport.c:909 -+#: ../camel/providers/smtp/camel-smtp-transport.c:948 - msgid "Transaction failed" - msgstr "Falló la transacción" - --#: ../camel/providers/smtp/camel-smtp-transport.c:913 -+#: ../camel/providers/smtp/camel-smtp-transport.c:952 - msgid "A password transition is needed" - msgstr "Es necesaria una transición de contraseña" - --#: ../camel/providers/smtp/camel-smtp-transport.c:915 -+#: ../camel/providers/smtp/camel-smtp-transport.c:954 - msgid "Authentication mechanism is too weak" - msgstr "El método de autenticación es demasiado débil" - --#: ../camel/providers/smtp/camel-smtp-transport.c:917 -+#: ../camel/providers/smtp/camel-smtp-transport.c:956 - msgid "Encryption required for requested authentication mechanism" - msgstr "Cifrado requerida por el mecanismo de autenticación pedido" - --#: ../camel/providers/smtp/camel-smtp-transport.c:919 -+#: ../camel/providers/smtp/camel-smtp-transport.c:958 - msgid "Temporary authentication failure" - msgstr "Falló temporal en la autenticación" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1207 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1247 - msgid "SMTP Greeting" - msgstr "Saludo del SMTP" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1217 --#: ../camel/providers/smtp/camel-smtp-transport.c:1231 --#: ../camel/providers/smtp/camel-smtp-transport.c:1239 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1257 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1272 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1280 - msgid "HELO command failed: " - msgstr "El comando HELO ha fallado: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1314 --#: ../camel/providers/smtp/camel-smtp-transport.c:1329 --#: ../camel/providers/smtp/camel-smtp-transport.c:1339 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1355 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1371 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1381 - msgid "MAIL FROM command failed: " - msgstr "El comando MAIL FROM ha fallado: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1366 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1408 - msgid "RCPT TO command failed: " - msgstr "El comando RCPT TO ha fallado: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1383 --#: ../camel/providers/smtp/camel-smtp-transport.c:1393 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1426 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1436 - #, c-format - msgid "RCPT TO <%s> failed: " - msgstr "Falló RCPT TO <%s>: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1436 --#: ../camel/providers/smtp/camel-smtp-transport.c:1447 --#: ../camel/providers/smtp/camel-smtp-transport.c:1458 --#: ../camel/providers/smtp/camel-smtp-transport.c:1517 --#: ../camel/providers/smtp/camel-smtp-transport.c:1537 --#: ../camel/providers/smtp/camel-smtp-transport.c:1551 --#: ../camel/providers/smtp/camel-smtp-transport.c:1560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1509 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1521 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1532 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1594 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1614 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1629 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1638 - msgid "DATA command failed: " - msgstr "El comando DATA ha fallado: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1585 --#: ../camel/providers/smtp/camel-smtp-transport.c:1600 --#: ../camel/providers/smtp/camel-smtp-transport.c:1609 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1663 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1679 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1688 - msgid "RSET command failed: " - msgstr "El comando RSET ha fallado: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1634 --#: ../camel/providers/smtp/camel-smtp-transport.c:1648 --#: ../camel/providers/smtp/camel-smtp-transport.c:1655 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1713 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1727 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1734 - msgid "QUIT command failed: " - msgstr "El comando QUIT ha fallado: " - -@@ -4769,25 +4766,25 @@ - msgid "Client reports password was rejected" - msgstr "El cliente informa que se rechazó la contraseña" - --#: ../libebackend/e-authentication-session.c:539 -+#: ../libebackend/e-authentication-session.c:542 - msgid "Add this password to your keyring" - msgstr "Añadir esta contraseña a su depósito de claves" - --#: ../libebackend/e-authentication-session.c:649 -+#: ../libebackend/e-authentication-session.c:547 - msgid "Password was incorrect" - msgstr "La contraseña era incorrecta" - --#: ../libebackend/e-backend.c:408 -+#: ../libebackend/e-backend.c:420 - #, c-format - msgid "%s does not support authentication" - msgstr "%s no soporta la autenticación" - --#: ../libebackend/e-collection-backend.c:901 -+#: ../libebackend/e-collection-backend.c:992 - #, c-format - msgid "%s does not support creating remote resources" - msgstr "%s no soporta la creación de recursos remotos" - --#: ../libebackend/e-collection-backend.c:960 -+#: ../libebackend/e-collection-backend.c:1051 - #, c-format - msgid "%s does not support deleting remote resources" - msgstr "%s no soporta eliminar recursos remotos" -@@ -4802,13 +4799,13 @@ - msgid "Data source is missing a [%s] group" - msgstr "Falta [%s] grupo en la fuente de datos" - --#: ../libebackend/e-server-side-source.c:1022 --#: ../libedataserver/e-source.c:1394 -+#: ../libebackend/e-server-side-source.c:1025 -+#: ../libedataserver/e-source.c:1351 - #, c-format - msgid "Data source '%s' does not support creating remote resources" - msgstr "La fuente de datos «%s» no soporta crear recursos remotos" - --#: ../libebackend/e-server-side-source.c:1036 -+#: ../libebackend/e-server-side-source.c:1039 - #, c-format - msgid "" - "Data source '%s' has no collection backend to create the remote resource" -@@ -4816,13 +4813,13 @@ - "La fuente de datos «%s» no tiene una colección de «backend» para crear el " - "recurso remoto" - --#: ../libebackend/e-server-side-source.c:1064 --#: ../libedataserver/e-source.c:1507 -+#: ../libebackend/e-server-side-source.c:1067 -+#: ../libedataserver/e-source.c:1464 - #, c-format - msgid "Data source '%s' does not support deleting remote resources" - msgstr "La fuente de datos «%s» no soporta eliminar recursos remotos" - --#: ../libebackend/e-server-side-source.c:1078 -+#: ../libebackend/e-server-side-source.c:1081 - #, c-format - msgid "" - "Data source '%s' has no collection backend to delete the remote resource" -@@ -4830,24 +4827,24 @@ - "La fuente de datos «%s» no tiene una colección de «backend» para eliminar el " - "recurso remoto" - --#: ../libebackend/e-server-side-source.c:1109 --#: ../libedataserver/e-source.c:1603 --#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1026 -+#: ../libebackend/e-server-side-source.c:1112 -+#: ../libedataserver/e-source.c:1560 -+#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1027 - #, c-format - msgid "Data source '%s' does not support OAuth 2.0 authentication" - msgstr "El origen de datos %s no soporta la autenticación OAuth 2.0" - --#: ../libebackend/e-server-side-source.c:1456 -+#: ../libebackend/e-server-side-source.c:1459 - #, c-format - msgid "File must have a '.source' extension" - msgstr "El archivo debe tener una extensión «.source»" - --#: ../libebackend/e-source-registry-server.c:531 --#: ../libedataserver/e-source-registry.c:1957 -+#: ../libebackend/e-source-registry-server.c:535 -+#: ../libedataserver/e-source-registry.c:1944 - msgid "The user declined to authenticate" - msgstr "El usuario ha rechazado autenticarse" - --#: ../libebackend/e-source-registry-server.c:800 -+#: ../libebackend/e-source-registry-server.c:804 - #, c-format - msgid "UID '%s' is already in use" - msgstr "el UID «%s» ya está en uso" -@@ -5045,17 +5042,17 @@ - msgid "Source file is missing a [%s] group" - msgstr "Falta [%s] grupo en el archivo de fuentes" - --#: ../libedataserver/e-source.c:1174 -+#: ../libedataserver/e-source.c:1131 - #, c-format - msgid "Data source '%s' is not removable" - msgstr "La fuente de datos «%s» no es eliminable:" - --#: ../libedataserver/e-source.c:1297 -+#: ../libedataserver/e-source.c:1254 - #, c-format - msgid "Data source '%s' is not writable" - msgstr "La fuente de datos «%s» no es escribible:" - --#: ../libedataserver/e-source.c:1910 -+#: ../libedataserver/e-source.c:1867 - msgid "Unnamed" - msgstr "Sin nombre" - -@@ -5069,7 +5066,7 @@ - msgid "Source '%s' does not support proxy lookups" - msgstr "La fuente de datos «%s» no soporta búsquedas en el proxy" - --#: ../libedataserver/e-source-webdav.c:1557 -+#: ../libedataserver/e-source-webdav.c:1562 - #, c-format - msgid "" - "SSL certificate for host '%s', used by address book '%s', is not trusted. Do " -@@ -5078,7 +5075,7 @@ - "El certificado SSL para «%s», usado por la libreta de direcciones «%s» no es " - "de confianza. ¿Quiere aceptarlo?" - --#: ../libedataserver/e-source-webdav.c:1566 -+#: ../libedataserver/e-source-webdav.c:1571 - #, c-format - msgid "" - "SSL certificate for host '%s', used by calendar '%s', is not trusted. Do you " -@@ -5087,7 +5084,7 @@ - "El certificado SSL para «%s», usado por el calendario «%s» no es de " - "confianza. ¿Quiere aceptarlo?" - --#: ../libedataserver/e-source-webdav.c:1575 -+#: ../libedataserver/e-source-webdav.c:1580 - #, c-format - msgid "" - "SSL certificate for host '%s', used by memo list '%s', is not trusted. Do " -@@ -5096,7 +5093,7 @@ - "El certificado SSL para «%s», usado por la lista de notas «%s» no es de " - "confianza. ¿Quiere aceptarlo?" - --#: ../libedataserver/e-source-webdav.c:1584 -+#: ../libedataserver/e-source-webdav.c:1589 - #, c-format - msgid "" - "SSL certificate for host '%s', used by task list '%s', is not trusted. Do " -@@ -5109,7 +5106,7 @@ - #. * in 12-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1662 ../libedataserver/e-time-utils.c:1961 -+#: ../libedataserver/e-time-utils.c:1681 ../libedataserver/e-time-utils.c:1980 - msgid "%a %m/%d/%Y %I:%M:%S %p" - msgstr "%a %d/%m/%Y %I:%M:%S %p" - -@@ -5117,7 +5114,7 @@ - #. * in 24-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1667 ../libedataserver/e-time-utils.c:1952 -+#: ../libedataserver/e-time-utils.c:1686 ../libedataserver/e-time-utils.c:1971 - msgid "%a %m/%d/%Y %H:%M:%S" - msgstr "%a %d/%m/%Y %H:%M:%S" - -@@ -5125,7 +5122,7 @@ - #. * in 12-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1672 ../libedataserver/e-time-utils.c:1957 -+#: ../libedataserver/e-time-utils.c:1691 ../libedataserver/e-time-utils.c:1976 - msgid "%a %m/%d/%Y %I:%M %p" - msgstr "%a %d/%m/%Y %I:%M %p" - -@@ -5133,78 +5130,78 @@ - #. * in 24-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1677 ../libedataserver/e-time-utils.c:1948 -+#: ../libedataserver/e-time-utils.c:1696 ../libedataserver/e-time-utils.c:1967 - msgid "%a %m/%d/%Y %H:%M" - msgstr "%a %d/%m/%Y %H:%M" - - #. strptime format of a weekday, a date and a time, - #. * in 12-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1682 -+#: ../libedataserver/e-time-utils.c:1701 - msgid "%a %m/%d/%Y %I %p" - msgstr "%a %d/%m/%Y %I %p" - - #. strptime format of a weekday, a date and a time, - #. * in 24-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1687 -+#: ../libedataserver/e-time-utils.c:1706 - msgid "%a %m/%d/%Y %H" - msgstr "%a %d/%m/%Y %H" - - #. strptime format of a weekday and a date. - #. strftime format of a weekday and a date. --#: ../libedataserver/e-time-utils.c:1690 ../libedataserver/e-time-utils.c:1810 --#: ../libedataserver/e-time-utils.c:1943 -+#: ../libedataserver/e-time-utils.c:1709 ../libedataserver/e-time-utils.c:1829 -+#: ../libedataserver/e-time-utils.c:1962 - msgid "%a %m/%d/%Y" - msgstr "%a %d/%m/%Y" - - #. strptime format of a date and a time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1697 -+#: ../libedataserver/e-time-utils.c:1716 - msgid "%m/%d/%Y %I:%M:%S %p" - msgstr "%d/%m/%Y %I:%M:%S %p" - - #. strptime format of a date and a time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1701 -+#: ../libedataserver/e-time-utils.c:1720 - msgid "%m/%d/%Y %H:%M:%S" - msgstr "%d/%m/%Y %H:%M:%S" - - #. strptime format of a date and a time, in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1706 -+#: ../libedataserver/e-time-utils.c:1725 - msgid "%m/%d/%Y %I:%M %p" - msgstr "%d/%m/%Y %I:%M %p" - - #. strptime format of a date and a time, in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1711 -+#: ../libedataserver/e-time-utils.c:1730 - msgid "%m/%d/%Y %H:%M" - msgstr "%d/%m/%Y %H:%M" - - #. strptime format of a date and a time, in 12-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1716 -+#: ../libedataserver/e-time-utils.c:1735 - msgid "%m/%d/%Y %I %p" - msgstr "%d/%m/%Y %I %p" - - #. strptime format of a date and a time, in 24-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1721 -+#: ../libedataserver/e-time-utils.c:1740 - msgid "%m/%d/%Y %H" - msgstr "%d/%m/%Y %H" - - #. strptime format of a weekday and a date. - #. This is the preferred date format for the locale. --#: ../libedataserver/e-time-utils.c:1724 ../libedataserver/e-time-utils.c:1813 -+#: ../libedataserver/e-time-utils.c:1743 ../libedataserver/e-time-utils.c:1832 - msgid "%m/%d/%Y" - msgstr "%d/%m/%Y" - - #. strptime format for a time of day, in 12-hour format. - #. strftime format of a time in 12-hour format. --#: ../libedataserver/e-time-utils.c:1884 ../libedataserver/e-time-utils.c:2005 -+#: ../libedataserver/e-time-utils.c:1903 ../libedataserver/e-time-utils.c:2024 - msgid "%I:%M:%S %p" - msgstr "%I:%M:%S %p" - - #. strptime format for a time of day, in 24-hour format. - #. strftime format of a time in 24-hour format. --#: ../libedataserver/e-time-utils.c:1888 ../libedataserver/e-time-utils.c:1997 -+#: ../libedataserver/e-time-utils.c:1907 ../libedataserver/e-time-utils.c:2016 - msgid "%H:%M:%S" - msgstr "%H:%M:%S" - -@@ -5212,25 +5209,25 @@ - #. * in 12-hour format. - #. strftime format of a time in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1893 ../libedataserver/e-time-utils.c:2002 -+#: ../libedataserver/e-time-utils.c:1912 ../libedataserver/e-time-utils.c:2021 - msgid "%I:%M %p" - msgstr "%I:%M %p" - - #. strptime format for time of day, without seconds 24-hour format. - #. strftime format of a time in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1897 ../libedataserver/e-time-utils.c:1994 -+#: ../libedataserver/e-time-utils.c:1916 ../libedataserver/e-time-utils.c:2013 - msgid "%H:%M" - msgstr "%H:%M" - - #. strptime format for time of day, without seconds 24-hour format, - #. * and no colon. --#: ../libedataserver/e-time-utils.c:1901 -+#: ../libedataserver/e-time-utils.c:1920 - msgid "%H%M" - msgstr "%H%M" - - #. strptime format for hour and AM/PM, 12-hour format. --#: ../libedataserver/e-time-utils.c:1905 -+#: ../libedataserver/e-time-utils.c:1924 - msgid "%I %p" - msgstr "%I %p" - -@@ -5290,7 +5287,7 @@ - msgid "Failed to find ASUrl and OABUrl in autodiscover response" - msgstr "Falló al buscar ASUrl y OABUrl en la respuesta de la autodetección" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1260 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1269 - #, c-format - msgid "" - "Cannot find a corresponding account in the org.gnome.OnlineAccounts service " -@@ -5299,23 +5296,17 @@ - "No se puede encontrar una cuenta correspondiente en el servicio org.gnome." - "OnlineAccounts de la que obtener un token de acceso para «%s»" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1290 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1299 - #, c-format - msgid "Failed to obtain an access token for '%s': " - msgstr "Falló al obtener el token de acceso para «%s»: " - --#: ../modules/google-backend/module-google-backend.c:205 --#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 --#: ../modules/yahoo-backend/module-yahoo-backend.c:199 --msgid "Calendar" --msgstr "Calendario" -- --#: ../modules/google-backend/module-google-backend.c:279 -+#: ../modules/google-backend/module-google-backend.c:341 - #: ../modules/yahoo-backend/module-yahoo-backend.c:226 - msgid "Tasks" - msgstr "Tareas" - --#: ../modules/google-backend/module-google-backend.c:333 -+#: ../modules/google-backend/module-google-backend.c:395 - #: ../modules/ubuntu-online-accounts/contacts.service-type.in.in.h:1 - #: ../services/evolution-source-registry/builtin/contacts-stub.source.in.h:1 - msgid "Contacts" -@@ -5378,6 +5369,11 @@ - msgid "Reason:" - msgstr "Razón:" - -+#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 -+#: ../modules/yahoo-backend/module-yahoo-backend.c:199 -+msgid "Calendar" -+msgstr "Calendario" -+ - #: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:2 - msgid "Integrate your calendars" - msgstr "Integrar sus calendarios" -@@ -5418,7 +5414,7 @@ - msgid "Integrate your mailboxes" - msgstr "Integrar sus carpetas de correo" - --#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1007 -+#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1008 - #, c-format - msgid "" - "Cannot find a corresponding account service in the accounts database from " -@@ -5431,7 +5427,8 @@ - #: ../modules/ubuntu-online-accounts/uoa-utils.c:281 - #, c-format - msgid "" --"Expected status 200 when requesting your identity, instead got status %d (%s)" -+"Expected status 200 when requesting your identity, instead got status %d " -+"(%s)" - msgstr "" - "Se esperada un estado 200 al solicitar su identidad, pero se obtuvo el " - "estado %d (%s)" -@@ -5521,2056 +5518,3 @@ - #: ../services/evolution-user-prompter/prompt-user-gtk.c:121 - msgid "_Dismiss" - msgstr "_Descartar" -- --#~ msgid "No host information available" --#~ msgstr "Información del equipo no disponible" -- --#~ msgid "Cannot create folder '%s': folder exists" --#~ msgstr "No se pudo crear la carpeta: «%s»: la carpeta existe" -- --#~ msgid "Error while fetching messages" --#~ msgstr "Error al obtener los mensajes" -- --#~ msgid "Fetching summary information for %d message in '%s'" --#~ msgid_plural "Fetching summary information for %d messages in '%s'" --#~ msgstr[0] "Obteniendo recopilación de información sobre %d mensaje en «%s»" --#~ msgstr[1] "Obteniendo recopilación de información sobre %d mensajes en «%s»" -- --#~ msgid "Lost connection to IMAP server" --#~ msgstr "Se ha perdido la conexión con el servidor IMAP" -- --#~ msgid "Source stream unavailable" --#~ msgstr "El flujo de origen no está disponible" -- --#~ msgid "Cannot create folder '%s': folder exists." --#~ msgstr "No se pudo crear la carpeta «%s»: la carpeta existe." -- --#~ msgid "" --#~ "Alert from IMAP server %s:\n" --#~ "%s" --#~ msgstr "" --#~ "Alerta del servidor IMAP %s:\n" --#~ "%s" -- --#~ msgid "" --#~ "Could not write log entry: %s\n" --#~ "Further operations on this server will not be replayed when you\n" --#~ "reconnect to the network." --#~ msgstr "" --#~ "No se pudo escribir una entrada del archivo de actividad: %s\n" --#~ "Las siguientes operaciones en este servidor no serán registradas\n" --#~ "cuando se reconecte a la red." -- --#~ msgid "" --#~ "Could not open '%s':\n" --#~ "%s\n" --#~ "Changes made to this folder will not be resynchronized." --#~ msgstr "" --#~ "No se pudo abrir «%s»:\n" --#~ "%s\n" --#~ "Los cambios hechos a esta carpeta no serán resincronizados." -- --#~ msgid "Resynchronizing with server" --#~ msgstr "Resincronizando con el servidor" -- --#~ msgid "Preparing folder '%s' for offline" --#~ msgstr "Preparando carpeta «%s» para desconexión" -- --#~ msgid "You cannot post NNTP messages while working offline!" --#~ msgstr "No puede publicar mensajes NNTP mientras trabaja desconectado." -- --#~ msgid "Canceled" --#~ msgstr "Cancelado" -- --#~ msgid "Unknown parent folder: %s" --#~ msgstr "Carpeta raíz desconocida: %s" -- --#~ msgid "The parent folder is not allowed to contain subfolders" --#~ msgstr "No está permitido que la carpeta raíz contenga subcarpetas" -- --#~ msgid "" --#~ "What proxy type to use. \"0\" means system, \"1\" means no proxy, \"2\" " --#~ "means manual proxy." --#~ msgstr "" --#~ "El tipo de proxy que usar. «0» indica el proxy del sistema, «1» significa " --#~ "sin proxy y «2» significa proxy manual." -- --#~ msgid "Whether to use proxy for HTTP requests." --#~ msgstr "Indica si se debe usar un proxy para peticiones HTTP." -- --#~ msgid "Whether authentication is required to access proxy server." --#~ msgstr "" --#~ "Indica si es necesaria la autenticación para acceder al servidor proxy." -- --#~ msgid "Host name to use for HTTP requests." --#~ msgstr "Nombre de equipo que usar para peticiones HTTP." -- --#~ msgid "Port number to use for HTTP requests." --#~ msgstr "Número de puerto que usar para peticiones HTTP." -- --#~ msgid "User name to use to authenticate against proxy server." --#~ msgstr "Nombre de usuario que usar para autenticarse en el servidor proxy." -- --#~ msgid "Password to use to authenticate against proxy server." --#~ msgstr "Contraseña que usar para autenticarse en el servidor proxy." -- --#~ msgid "List of hosts for which do not use proxy." --#~ msgstr "Lista de equipos para los que no usar proxy." -- --#~ msgid "Host name to use for HTTPS requests." --#~ msgstr "Nombre de equipo que usar para peticiones HTTPS." -- --#~ msgid "Port number to use for HTTPS requests." --#~ msgstr "Número de puerto que usar para peticiones HTTPS." -- --#~ msgid "Host name to use for SOCKS requests." --#~ msgstr "Nombre de equipo para peticiones SOCKS." -- --#~ msgid "Port number to use for SOCKS requests." --#~ msgstr "Número de puerto que usar para peticiones SOCKS." -- --#~ msgid "Where to read automatic proxy configuration from." --#~ msgstr "De dónde leer la configuración automática del proxy." -- --#~ msgid "You may not import keys with this cipher" --#~ msgstr "No puede importar claves con este método de cifrado" -- --#~ msgid "You may not export keys with this cipher" --#~ msgstr "No puede exportar claves con este método de cifrado" -- --#~ msgid "Resolving address" --#~ msgstr "Resolviendo dirección" -- --#~ msgid "Name lookup failed" --#~ msgstr "No se pudo resolver el nombre" -- --#~ msgid "Name lookup failed. Check your host name for spelling errors." --#~ msgstr "" --#~ "Falló al resolver el nombre. Compruebe que el nombre del equipo no " --#~ "contiene errores." -- --#~ msgid "Name lookup failed: %s" --#~ msgstr "No se pudo resolver el nombre: %s" -- --#~ msgid "Could not connect to '%s:%s': " --#~ msgstr "No se pudo conectar a «%s:%s»: " -- --#~ msgid "Please enter the %s password for %s on host %s." --#~ msgstr "Escriba la contraseña %s para %s en el servidor %s." -- --#~ msgid "NSPR error code %d" --#~ msgstr "Código de error NSPR %d" -- --#~ msgid "The proxy host does not support SOCKS4" --#~ msgstr "El servidor proxy no soporta SOCKS4" -- --#~ msgid "The proxy host denied our request: code %d" --#~ msgstr "El servidor proxy denegó nuestra solicitud: código %d" -- --#~ msgid "The proxy host does not support SOCKS5" --#~ msgstr "El servidor proxy no soporta SOCKS5" -- --#~ msgid "Could not find a suitable authentication type: code 0x%x" --#~ msgstr "No se pudo obtener un tipo de autenticación apropiado: código 0x%x" -- --#~ msgid "General SOCKS server failure" --#~ msgstr "Fallo general del servidor SOCKS" -- --#~ msgid "SOCKS server's rules do not allow connection" --#~ msgstr "Las reglas del servidor SOCKS no permiten ninguna conexión" -- --#~ msgid "Network is unreachable from SOCKS server" --#~ msgstr "El servidor SOCKS no puede llegar a la red" -- --#~ msgid "Host is unreachable from SOCKS server" --#~ msgstr "El servidor SOCKS no puede llegar al servidor" -- --#~ msgid "Connection refused" --#~ msgstr "Conexión rechazada" -- --#~ msgid "Time-to-live expired" --#~ msgstr "Caducó el tiempo de vida" -- --#~ msgid "Command not supported by SOCKS server" --#~ msgstr "El servidor SOCKS no soporta el comando" -- --#~ msgid "Address type not supported by SOCKS server" --#~ msgstr "El servidor SOCKS no soporta el tipo de dirección" -- --#~ msgid "Unknown error from SOCKS server" --#~ msgstr "Error desconocido del servidor SOCKS" -- --#~ msgid "Got unknown address type from SOCKS server" --#~ msgstr "Se obtuvo una dirección de tipo desconocido desde el servidor SOCKS" -- --#~ msgid "Incomplete reply from SOCKS server" --#~ msgstr "Respuesta incompleta del servidor SOCKS" -- --#~ msgid "Hostname is too long (maximum is 255 characters)" --#~ msgstr "" --#~ "El nombre del servidor es demasiado largo (el máximo son 255 caracteres)" -- --#~ msgid "Invalid reply from proxy server" --#~ msgstr "Respuesta no válida del servidor proxy" -- --#~ msgid "Unable to add message to summary: unknown reason" --#~ msgstr "No se pudo añadir mensajes al resumen: razón desconocida" -- --#~ msgid "Fatal mail parser error near position %s in folder %s" --#~ msgstr "" --#~ "Error fatal del analizador de correo cerca de la posición %s en la " --#~ "carpeta %s" -- --#~ msgid "Not part of certificate" --#~ msgstr "No es parte del certificado" -- --#~ msgid "_Close" --#~ msgstr "_Cerrar" -- --#~ msgid "This certificate has been verified for the following uses:" --#~ msgstr "Este certificado se ha verificado para los siguientes usos:" -- --#~ msgid "SSL Client Certificate" --#~ msgstr "Certificado de cliente SSL" -- --#~ msgid "SSL Server Certificate" --#~ msgstr "Certificado de servidor SSL" -- --#~ msgid "Email Signer Certificate" --#~ msgstr "Certificado del firmante del correo-e" -- --#~ msgid "Email Recipient Certificate" --#~ msgstr "Certificado del destinatario del correo-e" -- --#~ msgid "Issued To" --#~ msgstr "Emitido a" -- --#~ msgid "Common Name (CN)" --#~ msgstr "Nombre común (CN)" -- --#~ msgid "Organization (O)" --#~ msgstr "Organización (O)" -- --#~ msgid "Organizational Unit (OU)" --#~ msgstr "Unidad organizativa (OU)" -- --#~ msgid "Serial Number" --#~ msgstr "Número de serie" -- --#~ msgid "Issued By" --#~ msgstr "Emitido por" -- --#~ msgid "Validity" --#~ msgstr "Validez" -- --#~ msgid "Issued On" --#~ msgstr "Emitido el" -- --#~ msgid "Expires On" --#~ msgstr "Caduca el" -- --#~ msgid "Fingerprints" --#~ msgstr "Huellas" -- --#~ msgid "SHA1 Fingerprint" --#~ msgstr "Huella SHA1" -- --#~ msgid "MD5 Fingerprint" --#~ msgstr "Huella MD5" -- --#~ msgid "General" --#~ msgstr "General" -- --#~ msgid "Certificate Hierarchy" --#~ msgstr "Jerarquía del certificado" -- --#~ msgid "Certificate Fields" --#~ msgstr "Campos del certificado" -- --#~ msgid "Field Value" --#~ msgstr "Valor del campo" -- --#~ msgid "Details" --#~ msgstr "Detalles" -- --#~ msgid "Version" --#~ msgstr "Version" -- --#~ msgid "Version 1" --#~ msgstr "Versión 1" -- --#~ msgid "Version 2" --#~ msgstr "Versión 2" -- --#~ msgid "Version 3" --#~ msgstr "Versión 3" -- --#~ msgid "PKCS #1 MD2 With RSA Encryption" --#~ msgstr "PKCS #1 MD2 con cifrado RSA" -- --#~ msgid "PKCS #1 MD5 With RSA Encryption" --#~ msgstr "PKCS #1 MD5 con cifrado RSA" -- --#~ msgid "PKCS #1 SHA-1 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-1 con cifrado RSA" -- --#~ msgid "PKCS #1 SHA-256 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-256 con cifrado RSA" -- --#~ msgid "PKCS #1 SHA-384 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-384 con cifrado RSA" -- --#~ msgid "PKCS #1 SHA-512 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-512 con cifrado RSA" -- --#~ msgid "PKCS #1 RSA Encryption" --#~ msgstr "PKCS #1 cifrado RSA" -- --#~ msgid "Certificate Key Usage" --#~ msgstr "Uso de la clave del certificado" -- --#~ msgid "Netscape Certificate Type" --#~ msgstr "Tipo de certificado Netscape" -- --#~ msgid "Certificate Authority Key Identifier" --#~ msgstr "Identificador de la clave de la autoridad del certificado" -- --#~ msgid "Object Identifier (%s)" --#~ msgstr "Identificador del objeto (%s)" -- --#~ msgid "Algorithm Identifier" --#~ msgstr "Identificador del algoritmo" -- --#~ msgid "Algorithm Parameters" --#~ msgstr "Parámetros del algoritmo" -- --#~ msgid "Subject Public Key Info" --#~ msgstr "Información del asunto de la clave pública" -- --#~ msgid "Subject Public Key Algorithm" --#~ msgstr "Asunto del algoritmo de clave pública" -- --#~ msgid "Subject's Public Key" --#~ msgstr "Clave pública del asunto" -- --#~ msgid "Error: Unable to process extension" --#~ msgstr "Error: No es posible procesar la extensión" -- --#~ msgid "Email" --#~ msgstr "Correo-e" -- --#~ msgid "Object Signer" --#~ msgstr "Firmante del objeto" -- --#~ msgid "SSL Certificate Authority" --#~ msgstr "Autoridad certificadora SSL" -- --#~ msgid "Email Certificate Authority" --#~ msgstr "Autoridad certificadora de correo" -- --#~ msgid "Signing" --#~ msgstr "Firma" -- --#~ msgid "Non-repudiation" --#~ msgstr "No repudio" -- --#~ msgid "Key Encipherment" --#~ msgstr "Cifrado de la clave" -- --#~ msgid "Data Encipherment" --#~ msgstr "Cifrado de datos" -- --#~ msgid "Key Agreement" --#~ msgstr "Acuerdo de claves" -- --#~ msgid "Certificate Signer" --#~ msgstr "Firmante del certificado" -- --#~ msgid "CRL Signer" --#~ msgstr "Firmante de la LRC" -- --#~ msgid "Critical" --#~ msgstr "Crítico" -- --#~ msgid "Not Critical" --#~ msgstr "No crítico" -- --#~ msgid "Extensions" --#~ msgstr "Extensiones" -- --#~ msgid "%s = %s" --#~ msgstr "%s = %s" -- --#~ msgid "Certificate" --#~ msgstr "Certificado" -- --#~ msgid "Certificate Signature Algorithm" --#~ msgstr "Algoritmo de firma del certificado" -- --#~ msgid "Issuer" --#~ msgstr "Emisor" -- --#~ msgid "Subject" --#~ msgstr "Asunto" -- --#~ msgid "Issuer Unique ID" --#~ msgstr "ID único del emisor" -- --#~ msgid "Subject Unique ID" --#~ msgstr "ID único del asunto" -- --#~ msgid "Certificate Signature Value" --#~ msgstr "Valor de la firma del certificado" -- --#~ msgid "_View Certificate" --#~ msgstr "_Ver certificado" -- --#~ msgid "Detailed information about the certificate:" --#~ msgstr "Información detallada sobre el certificado:" -- --#~ msgid "Issuer:" --#~ msgstr "Emisor" -- --#~ msgid "Subject:" --#~ msgstr "Asunto:" -- --#~ msgid "Fingerprint:" --#~ msgstr "Huella:" -- --#~ msgid "Cannot write offline journal for folder '%s': %s" --#~ msgstr "" --#~ "No se puede escribir el diario desconectado para la carpeta: «%s»: %s" -- --#~ msgid "Creating new contact…" --#~ msgstr "Creando un contacto nuevo…" -- --#~ msgid "Deleting contact…" --#~ msgstr "Eliminando contacto…" -- --#~ msgid "Modifying contact…" --#~ msgstr "Modificando contacto…" -- --#~ msgid "Clients cannot set backend properties" --#~ msgstr "Los clientes no pueden establecer las propiedades del «backend»" -- --#~ msgid "Cannot retrieve backend property: " --#~ msgstr "No se puede obtener la propiedad del soporte: " -- --#~ msgid "Could not get calendar view path: " --#~ msgstr "No se pudo obtener la ruta de la vista del calendario: " -- --#~ msgid "Invalid backend name '%s' in source '%s'" --#~ msgstr "Nombre de «backend» «%s» no válido en la fuente «%s»" -- --#~ msgid "Failed to run book factory" --#~ msgstr "Falló al ejecutar la fábrica de la libreta" -- --#~ msgid "Cannot get connection to view" --#~ msgstr "No se puede obtener conexión para ver" -- --#~ msgid "Empty query: " --#~ msgstr "Consulta vacía: " -- --#~ msgid "Cannot get backend property: " --#~ msgstr "No se puede obtener la propierdad del «backend»:" -- --#~ msgid "Failed to run calendar factory" --#~ msgstr "Falló al ejecutar la fábrica del calendario" -- --#~ msgid "Cannot create folder: %s: Folder name cannot contain a dot" --#~ msgstr "" --#~ "No se puede crear la carpeta: %s: la carpeta no puede contener un punto" -- --#~ msgid "Cannot rename the folder: %s: Folder name cannot contain a dot" --#~ msgstr "" --#~ "No se puedo renombrar la carpeta: %s: el nombre de la carpeta no puede " --#~ "contener un punto" -- --#~ msgid "Cannot process, book backend is opening" --#~ msgstr "No se puede procesar, se está abriendo el soporte de la libreta" -- --#~ msgid "Cannot process, calendar backend is opening" --#~ msgstr "No se puede procesar, se está abriendo el soporte del calendario" -- --#~ msgid "Invalid call" --#~ msgstr "Llamada no válida" -- --#~ msgid "" --#~ "Failed to connect to a server using SSL. One possible reason is an " --#~ "invalid certificate being used by the server. If this is expected, like " --#~ "self-signed certificate being used on the server, then disable " --#~ "certificate validity tests by selecting 'Ignore invalid SSL certificate' " --#~ "option in Properties" --#~ msgstr "" --#~ "Falló al conectar a un servidor usando SSL. Una posible razón es que el " --#~ "servidor use un certificado no válido. Si esto se espera, al igual que " --#~ "usar un certificado firmado por el propio servidor, desactive las pruebas " --#~ "de validez del certificado seleccionando la opción «Ignorar el " --#~ "certificado SSL no válido» en las propiedades" -- --#~ msgid "Cannot create local store" --#~ msgstr "No se puede crear el almacén local" -- --#~ msgid "No output stream" --#~ msgstr "No hay flujo de salida" -- --#~ msgid "No input stream" --#~ msgstr "No hay flujo de entrada" -- --#~ msgid "Server unexpectedly disconnected: %s" --#~ msgstr "El servidor se desconectó inesperadamente: %s" -- --#~ msgid "" --#~ "Alert from IMAP server %s@%s in folder %s:\n" --#~ "%s" --#~ msgstr "" --#~ "Alerta del servidor IMAP: %s@%s en la carpeta %s:\n" --#~ "%s" -- --#~ msgid "Unexpected response from IMAP server: %s" --#~ msgstr "Respuesta inesperada del servidor IMAP: %s" -- --#~ msgid "IMAP command failed: %s" --#~ msgstr "El comando IMAP ha fallado: %s" -- --#~ msgid "Server response ended too soon." --#~ msgstr "La respuesta del servidor terminó demasiado pronto." -- --#~ msgid "IMAP server response did not contain %s information" --#~ msgstr "La respuesta del servidor IMAP no contenía información de %s" -- --#~ msgid "Unexpected OK response from IMAP server: %s" --#~ msgstr "El servidor IMAP inesperadamente ha respondido OK: %s" -- --#~ msgid "Always check for _new mail in this folder" --#~ msgstr "Comprobar siempre si hay correo _nuevo en esta carpeta" -- --#~ msgid "Could not create directory %s: %s" --#~ msgstr "No se pudo crear el directorio %s: %s" -- --#~ msgid "Could not load summary for %s" --#~ msgstr "No se puede cargar la recopilación de %s" -- --#~ msgid "Scanning for changed messages in %s" --#~ msgstr "Buscando mensajes modificados en %s" -- --#~ msgid "Unable to retrieve message: " --#~ msgstr "No se pudo obtener el mensaje: " -- --#~ msgid "Fetching summary information for new messages in %s" --#~ msgstr "" --#~ "Obteniendo recopilación de información sobre los mensajes nuevos en %s" -- --#~ msgid "Incomplete server response: no information provided for message %d" --#~ msgstr "" --#~ "Respuesta del servidor incompleta: no hay información proporcionada para " --#~ "el mensaje %d" -- --#~ msgid "Incomplete server response: no UID provided for message %d" --#~ msgstr "" --#~ "Respuesta incompleta del servidor: No se proporcionó un UID para el " --#~ "mensaje %d" -- --#~ msgid "Could not find message body in FETCH response." --#~ msgstr "" --#~ "No se pudo encontrar el cuerpo del mensaje en la respuesta de FETCH." -- --#~ msgid "Could not open cache directory: " --#~ msgstr "No se pudo abrir directorio de caché: " -- --#~ msgid "Failed to cache message %s: %s" --#~ msgstr "Error al cachear el mensaje %s: %s" -- --#~ msgid "Failed to cache message %s: " --#~ msgstr "Falló al cachear el mensaje %s: " -- --#~ msgid "Failed to cache %s: " --#~ msgstr "Falló al cachear %s: " -- --#~ msgid "Names_pace:" --#~ msgstr "_Espacio de nombres:" -- --#~ msgid "IMAP default port" --#~ msgstr "Puerto IMAP predeterminado" -- --#~ msgid "IMAP" --#~ msgstr "IMAP" -- --#~ msgid "Retrieving list of folders at '%s'" --#~ msgstr "Obteniendo la lista de carpetas de «%s»" -- --#~ msgid "Server unexpectedly disconnected" --#~ msgstr "El servidor se desconectó inesperadamente" -- --#~ msgid "Server unexpectedly disconnected: " --#~ msgstr "El servidor se desconectó inesperadamente: " -- --#~ msgid "" --#~ " Issuer: %s\n" --#~ " Subject: %s\n" --#~ " Fingerprint: %s\n" --#~ " Signature: %s" --#~ msgstr "" --#~ " Emisor: %s\n" --#~ " Asunto: %s\n" --#~ " Huella: %s\n" --#~ " Firma: %s" -- --#~ msgid "GOOD" --#~ msgstr "CORRECTO" -- --#~ msgid "BAD" --#~ msgstr "ERRÓNEO" -- --#~ msgid "" --#~ "Certificate problem: %s\n" --#~ "Issuer: %s" --#~ msgstr "" --#~ "Problema del certificado: %s\n" --#~ "Emisor: %s" -- --#~ msgid "" --#~ "Bad certificate domain: %s\n" --#~ "Issuer: %s" --#~ msgstr "" --#~ "Dominio del certificado erróneo: %s\n" --#~ "Emisor: %s" -- --#~ msgid "" --#~ "Certificate expired: %s\n" --#~ "Issuer: %s" --#~ msgstr "" --#~ "Certificado caducado: %s\n" --#~ "Emisor: %s" -- --#~ msgid "" --#~ "Certificate revocation list expired: %s\n" --#~ "Issuer: %s" --#~ msgstr "" --#~ "Lista de Revocación de Certificados caducada: %s\n" --#~ "Emisor: %s" -- --#~ msgid "Currently _used categories:" --#~ msgstr "Categorías _usadas actualmente:" -- --#~ msgid "_Available Categories:" --#~ msgstr "Categorías _disponibles:" -- --#~ msgid "Icon" --#~ msgstr "Icono" -- --#~ msgid "Category" --#~ msgstr "Categoría" -- --#~ msgid "Create category \"%s\"" --#~ msgstr "Crear categoría «%s»" -- --#~ msgid "Category Icon" --#~ msgstr "Icono de categoría" -- --#~ msgid "_No Image" --#~ msgstr "_Sin imagen" -- --#~ msgid "Category _Name" --#~ msgstr "_Nombre de la categoría" -- --#~ msgid "Category _Icon" --#~ msgstr "_Icono de categoría" -- --#~ msgid "Category Properties" --#~ msgstr "Propiedades de la categoría" -- --#~ msgid "" --#~ "There is already a category '%s' in the configuration. Please use another " --#~ "name" --#~ msgstr "" --#~ "Ya hay una categoría «%s» en la configuración. Por favor, use otro nombre" -- --#~ msgid "Show Contacts" --#~ msgstr "Mostrar contactos" -- --#~ msgid "Address B_ook:" --#~ msgstr "_Libreta de direcciones:" -- --#~ msgid "Cat_egory:" --#~ msgstr "Cat_egoría:" -- --#~ msgid "_Search:" --#~ msgstr "_Buscar:" -- --#~ msgid "Any Category" --#~ msgstr "Cualquier categoría" -- --#~ msgid "Co_ntacts" --#~ msgstr "Co_ntactos" -- --#~ msgid "Search" --#~ msgstr "Buscar" -- --#~ msgid "Address Book" --#~ msgstr "Libreta de direcciones" -- --#~ msgid "Select Contacts from Address Book" --#~ msgstr "Selecciona contactos de la libreta de direcciones" -- --#~ msgid "_Add" --#~ msgstr "_Añadir" -- --#~ msgid "_Remove" --#~ msgstr "_Quitar" -- --#~ msgid "Error loading address book: %s" --#~ msgstr "Error al cargar la libreta de direcciones: %s" -- --#~ msgid "E_xpand %s Inline" --#~ msgstr "E_xpandir %s en línea" -- --#~ msgid "Cop_y %s" --#~ msgstr "_Copiar %s" -- --#~ msgid "C_ut %s" --#~ msgstr "Cor_tar %s" -- --#~ msgid "_Edit %s" --#~ msgstr "_Editar %s" -- --#~ msgid "_Delete %s" --#~ msgstr "_Eliminar %s" -- --#~ msgid "Keyring key is unusable: no user or host name" --#~ msgstr "" --#~ "La clave del depósito de claves no es usable: no existe el usuario o el " --#~ "nombre del servidor" -- --#~ msgid "You have the Caps Lock key on." --#~ msgstr "Tiene activada la tecla Bloq. Mayús." -- --#~ msgid "_Remember this passphrase" --#~ msgstr "_Recordar esta frase de paso" -- --#~ msgid "_Remember this passphrase for the remainder of this session" --#~ msgstr "_Recordar esta frase de paso durante el resto de esta sesión" -- --#~ msgid "_Remember this password" --#~ msgstr "_Recordar esta contraseña" -- --#~ msgid "_Remember this password for the remainder of this session" --#~ msgstr "_Recordar esta contraseña durante el resto de esta sesión" -- --#~ msgid "_Destination" --#~ msgstr "_Destino" -- --#~ msgid "Select destination" --#~ msgstr "Seleccione destino" -- --#~ msgid "Evolution Source Viewer" --#~ msgstr "Visor de fuentes de Evolution" -- --#~ msgid "Display Name" --#~ msgstr "Mostrar nombre" -- --#~ msgid "Flags" --#~ msgstr "Opciones" -- --#~ msgid "Identity" --#~ msgstr "Identidad" -- --#~ msgid "Could not connect to %s: " --#~ msgstr "No se pudo conectar con %s: " -- --#~ msgid "Could not connect to POP server %s" --#~ msgstr "No se pudo conectar con el servidor POP %s" -- --#~ msgid "Failed to build summary for an address book %s" --#~ msgstr "Falló al construir el resumen para una libreta de direcciones :%s" -- --#~ msgid "Using Distinguished Name (DN)" --#~ msgstr "Usando nombre distintivo (ND)" -- --#~ msgid "Using Email Address" --#~ msgstr "Usando dirección de correo" -- --#~ msgid "Could not create synch slave thread" --#~ msgstr "No se pudo crear el flujo esclavo de sincronización" -- --#~ msgid "Cannot remove book: " --#~ msgstr "No se puede quitar la libreta: " -- --#~ msgid "Cannot remove calendar: " --#~ msgstr "No se puede quitar el calendario: " -- --#~ msgid "Keyring operation was cancelled" --#~ msgstr "Se canceló la operación del depósito de claves." -- --#~ msgid "Updating %s folder" --#~ msgstr "Actualizando la carpeta %s" -- --#~ msgid "Closing tmp stream failed: " --#~ msgstr "Falló el flujo de cierre del temporal: " -- --#~ msgid "_Use custom command to connect to server" --#~ msgstr "_Usar un comando personalizado para conectarse al servidor" -- --#~ msgid "Co_mmand:" --#~ msgstr "Co_mando:" -- --#~ msgid "Command:" --#~ msgstr "Comando:" -- --#~ msgid "SMTP Authentication" --#~ msgstr "Autenticación SMTP" -- --#~ msgid "Authenticating with the server…" --#~ msgstr "Autenticando con el servidor…" -- --#~ msgid "%s: there was no source for UID '%s' stored in GConf." --#~ msgstr "%s: no había origen para el UID «%s» almacenado en GConf." -- --#~ msgid "Incorrect uri '%s'" --#~ msgstr "URI «%s» incorrecto" -- --#~ msgid "Failed to find system book" --#~ msgstr "Falló al buscar la libreta del sistema" -- --#~ msgid "There was no source for UID '%s' stored in a source list." --#~ msgstr "No había origen para el UID «%s» almacenado en la lista de origen." -- --#~ msgid "Cannot authenticate user: " --#~ msgstr "No se puede autenticar al usuario: " -- --#~ msgid "Empty URI" --#~ msgstr "URI vacío" -- --#~ msgid "" --#~ "Enter password for address book %s (user %s)\n" --#~ "Reason: %s" --#~ msgstr "" --#~ "Introduzca la contraseña para la libreta de direcciones %s (usuario %s)\n" --#~ "Razón: %s" -- --#~ msgid "Enter password for address book %s (user %s)" --#~ msgstr "" --#~ "Introduzca la contraseña para la libreta de direcciones %s (usuario %s)" -- --#~ msgid "Enter password for %s (user %s)" --#~ msgstr "Introduzca la contraseña para %s (usuario %s)" -- --#~ msgid "Enter password for %s to enable proxy for user %s" --#~ msgstr "" --#~ "Introduzca la contraseña de %s para activar el proxy para el usuario %s" -- --#~ msgid "Invalid source type" --#~ msgstr "Tipo de fuente no válida" -- --#~ msgid "Accessing LDAP Server anonymously" --#~ msgstr "Acceder a un servidor LDAP anónimamente" -- --#~ msgid "" --#~ "Enter password for calendar %s (user %s)\n" --#~ "Reason: %s" --#~ msgstr "" --#~ "Introduzca la contraseña para el calendario %s (usuario %s)\n" --#~ "Razón: %s" -- --#~ msgid "Enter password for calendar %s (user %s)" --#~ msgstr "Introduzca la contraseña para el calendario %s (usuario %s)" -- --#~ msgid "" --#~ "Enter password for task list %s (user %s)\n" --#~ "Reason: %s" --#~ msgstr "" --#~ "Introduzca la contraseña para la lista de tareas %s (usuario %s)\n" --#~ "Razón: %s" -- --#~ msgid "Enter password for task list %s (user %s)" --#~ msgstr "Introduzca la contraseña para la lista de tareas %s (usuario %s)" -- --#~ msgid "" --#~ "Enter password for memo list %s (user %s)\n" --#~ "Reason: %s" --#~ msgstr "" --#~ "Introduzca la contraseña para la lista de notas %s (usuario %s)\n" --#~ "Razón: %s" -- --#~ msgid "Enter password for memo list %s (user %s)" --#~ msgstr "Introduzca la contraseña para la lista de notas %s (usuario %s)" -- --#~ msgid "Enter Passphrase" --#~ msgstr "Introduzca la frase de paso" -- --#~ msgid "Enter Password" --#~ msgstr "Introduzca contraseña" -- --#~ msgid "Check new messages for Jun_k contents" --#~ msgstr "Comprobar si el contenido de los mensajes nuevos es _spam" -- --#~ msgid "" --#~ "SSL Certificate check for %s:\n" --#~ "\n" --#~ "%s\n" --#~ "\n" --#~ "Do you wish to accept?" --#~ msgstr "" --#~ "Comprobación de Certificado SSL para %s:\n" --#~ "\n" --#~ "%s\n" --#~ "\n" --#~ "¿Quiere aceptar?" -- --#~ msgid "Use I_dle if the server supports it" --#~ msgstr "Usar i_nactividad si el servidor lo soporta" -- --#~ msgid "URL '%s' needs a user component" --#~ msgstr "El URL «%s» necesita un componente de usuario" -- --#~ msgid "URL '%s' needs a host component" --#~ msgstr "El URL «%s» necesita un servidor" -- --#~ msgid "URL '%s' needs a path component" --#~ msgstr "La URL «%s» necesita un componente de ruta" -- --#~ msgid "Error creating SASL authentication object." --#~ msgstr "Error al crear el objeto de autenticación SASL." -- --#~ msgid "You did not enter a password." --#~ msgstr "No introdujo una contraseña." -- --#~ msgid "Authentication requested but no username provided" --#~ msgstr "" --#~ "Se solicito autenticación pero no se proporcionó un nombre de usuario" -- --#~ msgid "" --#~ "Unable to connect to POP server %s: No support for requested " --#~ "authentication mechanism." --#~ msgstr "" --#~ "No se pudo conectar con el servidor POP %s: \n" --#~ "No hay soporte para el sistema de autenticación pedido." -- --#~ msgid "SASL '%s' Login failed for POP server %s%s" --#~ msgstr "SASL «%s» falló el inicio de sesión para servidor POP %s%s" -- --#~ msgid "" --#~ "Unable to connect to POP server %s.\n" --#~ "Error sending password%s" --#~ msgstr "" --#~ "No se pudo conectar con el servidor POP %s.\n" --#~ "Error al enviar la contraseña %s" -- --#~ msgid "" --#~ "Unable to authenticate to SMTP server.\n" --#~ "%s\n" --#~ "\n" --#~ msgstr "" --#~ "No se pudo autenticar en el servidor SMTP.\n" --#~ "%s\n" --#~ "\n" -- --#~ msgid "Invalid URI" --#~ msgstr "URI no válido" -- --#~ msgid "Could not instantiate backend" --#~ msgstr "No se pudo instanciar el «backend»" -- --#~ msgid "SSL unavailable" --#~ msgstr "SSL no disponible" -- --#~ msgid "SSL is not available in this build" --#~ msgstr "No se soporta SSL en esta compilación" -- --#~ msgid "TLS is not available in this build" --#~ msgstr "No se soporta TLS en esta compilación" -- --#~ msgctxt "BookClientError" --#~ msgid "Contact not found" --#~ msgstr "Contacto no encontrado" -- --#~ msgctxt "BookClientError" --#~ msgid "Contact ID already exists" --#~ msgstr "Ya existe el ID del contacto" -- --#~ msgctxt "BookClientError" --#~ msgid "No space" --#~ msgstr "Sin espacio" -- --#~ msgctxt "BookClientError" --#~ msgid "Unknown error" --#~ msgstr "Error desconocido" -- --#~ msgid "D-Bus book proxy gone" --#~ msgstr "El proxy de la libreta D-Bus ha desaparecido" -- --#~ msgid "Cannot start view, D-Bus proxy gone" --#~ msgstr "No se puede iniciar la vista, el proxy D-Bus ha desaparecido" -- --#~ msgid "Cannot stop view, D-Bus proxy gone" --#~ msgstr "No se puede detener la vista, el proxy D-Bus ha desaparecido" -- --#~ msgid "Cannot set fields of interest, D-Bus proxy gone" --#~ msgstr "" --#~ "No se pueden establecer los campos de interés, el proxy D-Bus ha " --#~ "desaparecido" -- --#~ msgctxt "CalClientError" --#~ msgid "No such calendar" --#~ msgstr "No existe tal calendario" -- --#~ msgctxt "CalClientError" --#~ msgid "Object not found" --#~ msgstr "Objeto no encontrado" -- --#~ msgctxt "CalClientError" --#~ msgid "Invalid object" --#~ msgstr "Objeto no válido" -- --#~ msgctxt "CalClientError" --#~ msgid "Unknown user" --#~ msgstr "Usuario desconocido" -- --#~ msgctxt "CalClientError" --#~ msgid "Object ID already exists" --#~ msgstr "El ID del objeto ya existe" -- --#~ msgctxt "CalClientError" --#~ msgid "Invalid range" --#~ msgstr "Rango no válido" -- --#~ msgctxt "CalClientError" --#~ msgid "Unknown error" --#~ msgstr "Error desconocido" -- --#~ msgid "D-Bus calendar proxy gone" --#~ msgstr "El proxy del calendario de D-Bus ha desaparecido" -- --#~ msgctxt "ClientError" --#~ msgid "Invalid argument" --#~ msgstr "Argumento no válido" -- --#~ msgctxt "ClientError" --#~ msgid "Backend is busy" --#~ msgstr "El soporte está ocupado" -- --#~ msgctxt "ClientError" --#~ msgid "Authentication failed" --#~ msgstr "Falló la autenticación" -- --#~ msgctxt "ClientError" --#~ msgid "Authentication required" --#~ msgstr "Autenticación requerida" -- --#~ msgctxt "ClientError" --#~ msgid "Repository offline" --#~ msgstr "Repositorio desconectado" -- --#~ msgctxt "ClientError" --#~ msgid "Permission denied" --#~ msgstr "Permiso denegado" -- --#~ msgctxt "ClientError" --#~ msgid "Cancelled" --#~ msgstr "Cancelado" -- --#~ msgctxt "ClientError" --#~ msgid "Could not cancel" --#~ msgstr "No se pudo cancelar" -- --#~ msgctxt "ClientError" --#~ msgid "Not supported" --#~ msgstr "No soportado" -- --#~ msgctxt "ClientError" --#~ msgid "Unsupported authentication method" --#~ msgstr "Método de autenticación no soportado" -- --#~ msgctxt "ClientError" --#~ msgid "TLS not available" --#~ msgstr "TLS no disponible" -- --#~ msgctxt "ClientError" --#~ msgid "Search size limit exceeded" --#~ msgstr "Se excedió el límite del tamaño de la búsqueda" -- --#~ msgctxt "ClientError" --#~ msgid "Search time limit exceeded" --#~ msgstr "Se excedió el límite de tiempo de la búsqueda" -- --#~ msgctxt "ClientError" --#~ msgid "Invalid query" --#~ msgstr "Consulta no válida" -- --#~ msgctxt "ClientError" --#~ msgid "Query refused" --#~ msgstr "Consulta rechazada" -- --#~ msgctxt "ClientError" --#~ msgid "Other error" --#~ msgstr "Otro error" -- --#~ msgctxt "ClientError" --#~ msgid "Backend is not opened yet" --#~ msgstr "El «backend» aún no está abierto" -- --#~ msgctxt "ClientError" --#~ msgid "Unknown error" --#~ msgstr "Error desconocido" -- --#~ msgid "No stream available" --#~ msgstr "No hay un flujo disponible" -- --#~ msgid "Could not connect to %s (port %s): " --#~ msgstr "No se pudo conectar con %s (puerto %s): " -- --#~ msgid "SSL negotiations failed" --#~ msgstr "Falló la negociación SSL" -- --#~ msgid "TLS negotiations failed" --#~ msgstr "Falló la negociación TLS" -- --#~ msgctxt "BookClientError" --#~ msgid "TLS not available" --#~ msgstr "TLS no disponible" -- --#~ msgctxt "BookClientError" --#~ msgid "Unsupported authentication method" --#~ msgstr "Método de autenticación no soportado" -- --#~ msgid "Updating contacts cache (%d)... " --#~ msgstr "Actualizando caché de contactos (%d)…" -- --#~ msgid "Cannot get supported fields: %s" --#~ msgstr "No se pueden obtener los campos soportados: %s" -- --#~ msgid "Cannot get required fields: %s" --#~ msgstr "No se pueden obtener los campos necesarios: %s" -- --#~ msgid "Cannot get supported authentication methods: %s" --#~ msgstr "No se pueden obtener los métodos de autenticación soportados: %s" -- --#~ msgid "Cannot get changes: %s" --#~ msgstr "No se pueden obtener los cambios: %s" -- --#~ msgid "Cancel operation failed: %s" --#~ msgstr "Falló al cancelar la operación: %s" -- --#~ msgid "Reply Requested: by " --#~ msgstr "Respuesta solicitada: por" -- --#~ msgid "Reply Requested: When convenient" --#~ msgstr "Respuesta solicitada: Cuando convenga" -- --#~ msgid "Loading Appointment items" --#~ msgstr "Cargando elementos de citas" -- --#~ msgid "Loading Task items" --#~ msgstr "Cargando elementos de tareas" -- --#~ msgid "Loading Note items" --#~ msgstr "Cargando elementos de notas" -- --#~ msgid "Loading items" --#~ msgstr "Cargando elementos" -- --#~ msgid "Could not create thread for populating cache" --#~ msgstr "No se pudo crear el hilo para la llenar la caché" -- --#~ msgid "Cannot retrieve calendar alarm e-mail address: %s" --#~ msgstr "No se puede obtener la dirección de alerta del calendario: %s" -- --#~ msgid "Cannot retrieve calendar's LDAP attribute: %s" --#~ msgstr "No se puede obtener el atributo LDAP del calendario: %s" -- --#~ msgid "Cannot retrieve calendar scheduling information: %s" --#~ msgstr "" --#~ "No se puede obtener la información de planificación del calendario: %s" -- --#~ msgid "Cannot retrieve default calendar object path: %s" --#~ msgstr "" --#~ "No se puede obtener la ruta del objeto del calendario predeterminado: %s" -- --#~ msgid "Could not complete calendar query: %s" --#~ msgstr "No se pudo completar la consulta sobre el calendario: %s" -- --#~ msgid "Could not set default calendar time zone: %s" --#~ msgstr "" --#~ "No se pudo establecer la zona horaria predeterminada del calendario: %s" -- --#~ msgid "Cannot retrieve calendar changes: %s" --#~ msgstr "No se pueden obtener los cambios del calendario: %s" -- --#~ msgid "Checking for deleted messages %s" --#~ msgstr "Comprobando los mensajes borrados %s" -- --#~ msgid "Could not get message" --#~ msgstr "No se puede obtener el mensaje" -- --#~ msgid "Cannot append message to folder '%s': %s" --#~ msgstr "No se pudo añadir el mensaje a la carpeta «%s»: %s" -- --#~ msgid "Cannot create message: %s" --#~ msgstr "No se pudo crear el mensaje: %s" -- --#~ msgid "" --#~ "Cannot get message: %s\n" --#~ " %s" --#~ msgstr "" --#~ "No se puede obtener el mensaje: %s\n" --#~ " %s" -- --#~ msgid "This message is not available in offline mode." --#~ msgstr "Este mensaje no está disponible en modo desconectado." -- --#~ msgid "Cannot get folder container %s" --#~ msgstr "No se puede obtener el contenedor de la carpeta %s" -- --#~ msgid "Cannot append message in offline mode: " --#~ msgstr "No se puede anexar el mensaje en modo desconectado: " -- --#~ msgid "Checking for new mail" --#~ msgstr "Comprobación de correo nuevo" -- --#~ msgid "Check new messages for J_unk contents" --#~ msgstr "Comprobar si el contenido de los mensajes nuevos es S_PAM" -- --#~ msgid "Automatically synchroni_ze account locally" --#~ msgstr "Sincroni_zar automáticamente la cuenta localmente" -- --#~ msgid "SOAP Settings" --#~ msgstr "Configuración SOAP" -- --#~ msgid "Post Office Agent SOAP _Port:" --#~ msgstr "_Puerto del agente de la oficina de correos SOAP:" -- --#~ msgid "Default GroupWise port" --#~ msgstr "Puerto GroupWise predeterminado" -- --#~ msgid "Novell GroupWise" --#~ msgstr "Novell GroupWise" -- --#~ msgid "For accessing Novell GroupWise servers" --#~ msgstr "Para acceder a servidores Novell Groupwise" -- --#~ msgid "" --#~ "This option will connect to the GroupWise server using a plaintext " --#~ "password." --#~ msgstr "" --#~ "Esta opción conectará con el servidor GroupWise usando una contraseña de " --#~ "texto plano." -- --#~ msgid "" --#~ "Some features may not work correctly with your current server version" --#~ msgstr "" --#~ "Algunas características quizá no funcionen correctamente con su versión " --#~ "actual del servidor" -- --#~ msgid "Cannot create GroupWise folders in offline mode." --#~ msgstr "No se pueden crear las carpetas GroupWise en modo desconectado." -- --#~ msgid "Cannot create a special system folder" --#~ msgstr "No se puede crear una carpeta especial del sistema" -- --#~ msgid "Cannot rename GroupWise folder '%s' to '%s'" --#~ msgstr "No se puede renombrar la carpeta Groupwise de «%s» a «%s»" -- --#~ msgid "GroupWise server %s" --#~ msgstr "Servidor GroupWise %s" -- --#~ msgid "GroupWise service for %s on %s" --#~ msgstr "Servicio GroupWise para %s en %s" -- --#~ msgid "Host or user not available in url" --#~ msgstr "Servidor o usuario no disponible en el URL" -- --#~ msgid "GroupWise mail delivery via %s" --#~ msgstr "Entrega de correo Groupwise por medio de %s" -- --#~ msgid "Sending Message" --#~ msgstr "Enviando mensaje" -- --#~ msgid "" --#~ "You have exceeded this account's storage limit. Your messages are queued " --#~ "in your Outbox. Resend by pressing Send/Receive after deleting/archiving " --#~ "some of your mail.\n" --#~ msgstr "" --#~ "Ha excedido el límite de almacenamiento de esta cuenta. Sus mensajes se " --#~ "encolan en su Bandeja de salida. Reenvíelos pulsando Enviar/Recibir " --#~ "después de borrar/archivar algunos de sus mensajes.\n" -- --#~ msgid "Could not send message: %s" --#~ msgstr "No se pudo enviar mensaje: %s" -- --#~ msgid "_Edit" --#~ msgstr "_Editar" -- --#~ msgid "Invalid connection" --#~ msgstr "Conexión inválida" -- --#~ msgid "Invalid response from server" --#~ msgstr "Respuesta inválida del servidor" -- --#~ msgid "Bad parameter" --#~ msgstr "Parámetro erróneo" -- --#~ msgid "" --#~ "Could not create directory %s:\n" --#~ "%s" --#~ msgstr "" --#~ "No se pudo crear el directorio %s:\n" --#~ "%s" -- --#~ msgid "Cannot get folder: Invalid operation on this store" --#~ msgstr "No se pudo obtener la carpeta: Operación no válida en este almacén" -- --#~ msgid "_Apply filters to new messages in INBOX on this server" --#~ msgstr "_Aplicar filtros a los mensajes nuevos en INBOX en este servidor" -- --#~ msgid "Cannot create spool file: %s" --#~ msgstr "No se puede crear el archivo de cola de correo: %s" -- --#~ msgid "categories" --#~ msgstr "categorías" -- --#~ msgid "*" --#~ msgstr "*" -- --#~ msgid "Co_ntacts" --#~ msgstr "Co_ntactos" -- --#~ msgid "Show Contacts" --#~ msgstr "Mostrar contactos" -- --#~ msgid "Verifying message" --#~ msgstr "Verificando mensaje" -- --#~ msgid "UnknownUser" --#~ msgstr "Usuario desconocido" -- --#~ msgid "Cannot complete operation" --#~ msgstr "No se puede completar la operación" -- --#~ msgid "Cannot open message" --#~ msgstr "No se pudo abrir el mensaje" -- --#~ msgid "Canceled." --#~ msgstr "Cancelado." -- --#~ msgid "Cannot verify message signature: could not create temp file: %s" --#~ msgstr "" --#~ "No se pudo verificar la firma del mensaje: no pude crear un archivo " --#~ "temporal: %s" -- --#~ msgid "Unable to parse message content" --#~ msgstr "No se pudo interpretar el contenido del mensaje" -- --#~ msgid "cannot create thread" --#~ msgstr "no se puede crear el hilo" -- --#~ msgid "User canceled" --#~ msgstr "El usuario ha cancelado" -- --#~ msgid "Trash Folder Full. Please Empty." --#~ msgstr "La papelera está llena. Por favor vacíela." -- --#~ msgid "Unexpected response status '%s' after APPEND command" --#~ msgstr "Estado de respuesta inesperada «%s» después del comando APPEND" -- --#~ msgid "No response on continuation after APPEND command" --#~ msgstr "No hubo respuesta de continuación después del comando APPEND" -- --#~ msgid "Unknown error occurred during APPEND command!" --#~ msgstr "Ocurrió un error desconocido durante el comando APPEND" -- --#~ msgid "Maildir append message canceled" --#~ msgstr "Adición del mensaje al Maildir cancelada" -- --# --#~ msgid "Invalid message contents" --#~ msgstr "Contenido inválido en el mensaje" -- --#~ msgid "Mail append canceled" --#~ msgstr "Adición del mensaje cancelada" -- --#~ msgid "Message construction failed." --#~ msgstr "Falló la construcción del mensaje." -- --# --#~ msgid "MH append message canceled" --#~ msgstr "Anexión MH del mensaje cancelada" -- --#~ msgid "STARTTLS command failed" --#~ msgstr "El comando STARTTLS ha fallado" -- --#~ msgid "HELO command failed" --#~ msgstr "El comando HELO ha fallado" -- --#~ msgid "AUTH command failed" --#~ msgstr "El comando AUTH ha fallado" -- --#~ msgid "Bad authentication response from server.\n" --#~ msgstr "Respuesta de autenticación errónea desde el servidor.\n" -- --#~ msgid "MAIL FROM command failed: %s: mail not sent" --#~ msgstr "El comando MAIL FROM ha fallado: %s: correo no enviado" -- --#~ msgid "RCPT TO command failed: %s: mail not sent" --#~ msgstr "El comando RCPT TO ha fallado: %s: correo no enviado" -- --#~ msgid "DATA command failed: %s: mail not sent" --#~ msgstr "El comando DATA ha fallado: %s: correo no enviado" -- --#~ msgid "RSET command failed" --#~ msgstr "El comando RSET ha fallado" -- --#~ msgid "QUIT command failed" --#~ msgstr "El comando QUIT ha fallado" -- --#~ msgid "Could not create thread for getting deltas" --#~ msgstr "No se pudo crear el hilo para obtener deltas" -- --#~ msgid "Unsupported operation: append message: for %s" --#~ msgstr "Operación no implementada: añadir mensaje: para %s" -- --#~ msgid "Unsupported operation: search by expression: for %s" --#~ msgstr "Operación no implementada: búsqueda según la expresión: para %s" -- --#~ msgid "Unsupported operation: count by expression: for %s" --#~ msgstr "Operación no soportada: conteo por expresión: para %s" -- --#~ msgid "Unsupported operation: search by UIDs: for %s" --#~ msgstr "Operación no implementada: búsqueda por uids: para %s" -- --#~ msgid "Learning junk" --#~ msgstr "Aprendiendo SPAM" -- --#~ msgid "Learning non-junk" --#~ msgstr "Aprendiendo no SPAM" -- --#~ msgid "Camel session doesn't support forwarding of a message." --#~ msgstr "La sesión Camel no soporta el reenvío de un mensaje." -- --#~ msgid "import keys: unimplemented" --#~ msgstr "importación de claves: no implementado" -- --#~ msgid "export keys: unimplemented" --#~ msgstr "exportar claves: no implementado" -- --#~ msgid "Cannot create folder: Invalid operation on this store" --#~ msgstr "No se pudo crear la carpeta: Operación no válida en este almacén" -- --#~ msgid "Hula" --#~ msgstr "Hula" -- --#~ msgid "For accessing Hula servers" --#~ msgstr "Para acceder a servidores Hula" -- --#~ msgid "" --#~ "This option will connect to the Hula server using a plaintext password." --#~ msgstr "" --#~ "Esta opción conectará con el servidor Hula usando una contraseña de texto " --#~ "plano." -- --#~ msgid "Failed sending command to IMAP server %s: %s" --#~ msgstr "Falló al enviar el comando al servidor IMAP %s: %s" -- --#~ msgid "Unexpected response from IMAP4 server %s: %s" --#~ msgstr "Respuesta inesperada del servidor IMAP4 %s: %s" -- --#~ msgid "Unexpected greeting from IMAP server %s." --#~ msgstr "Anuncio de bienvenida inesperado del servidor IMAP: %s." -- --#~ msgid "Cannot select folder '%s': Invalid mailbox name" --#~ msgstr "No se pudo seleccionar la carpeta «%s»: Nombre de buzón no válido" -- --#~ msgid "Cannot select folder '%s': Bad command" --#~ msgstr "No se pudo seleccionar la carpeta «%s»: Comando erróneo" -- --#~ msgid "Failed to send command to IMAP server %s: %s" --#~ msgstr "Falló al enviar el comando al servidor IMAP %s: %s" -- --#~ msgid "IMAP4 server %s unexpectedly disconnected: %s" --#~ msgstr "El servidor IMAP4 %s se desconectó inesperadamente: %s" -- --#~ msgid "" --#~ "Enable extended Mailing-List detection required for some filter and " --#~ "vFolder rules" --#~ msgstr "" --#~ "Activar la detección de lista de correo requerida para algunos filtros y " --#~ "reglas de carpetas virtuales" -- --#~ msgid "Expire cached messages that haven't been read in X seconds" --#~ msgstr "Caducar los mensajes cacheados que no se han leído en X segundos" -- --#~ msgid "Expire cached messages older than X seconds" --#~ msgstr "Caducar los mensajes cacheados más antiguos de X segundos" -- --#~ msgid "Cannot access folder '%s': %s" --#~ msgstr "No se puede acceder a la carpeta: «%s»: %s" -- --#~ msgid "Cannot sync flags to folder '%s': Unknown error" --#~ msgstr "" --#~ "No se pueden sincronizar los flags de la carpeta: «%s»: Error desconocido" -- --#~ msgid "Cannot sync flags to folder '%s': Bad command" --#~ msgstr "" --#~ "No se pueden sincronizar los flags de la carpeta «%s»: Comando erróneo" -- --#~ msgid "Cannot expunge folder '%s': Unknown error" --#~ msgstr "No se puede compactar la carpeta «%s»: Error desconocido" -- --#~ msgid "Cannot expunge folder '%s': Bad command" --#~ msgstr "No se puede compactar la carpeta «%s»: Comando erróneo" -- --#~ msgid "Cannot get message %s from folder '%s': No such message" --#~ msgstr "" --#~ "No se puede obtener el mensaje %s de la carpeta «%s»: No existe dicho " --#~ "mensaje" -- --#~ msgid "Cannot get message %s from folder '%s': Bad command" --#~ msgstr "" --#~ "No se puede obtener el mensaje %s de la carpeta «%s»: Comando erróneo" -- --#~ msgid "Cannot append message to folder '%s': Folder is read-only" --#~ msgstr "" --#~ "No se puede anexar el mensaje a la carpeta «%s»: La carpeta es de sólo " --#~ "lectura" -- --#~ msgid "Cannot append message to folder '%s': Unknown error" --#~ msgstr "No se puede anexar el mensaje a la carpeta «%s»: Error desconocido" -- --#~ msgid "Cannot append message to folder '%s': Bad command" --#~ msgstr "No se puede anexar el mensaje a la carpeta «%s»: Comando erróneo" -- --#~ msgid "Cannot move messages from folder '%s' to folder '%s': Unknown error" --#~ msgstr "" --#~ "No se pueden mover los mensajes de la carpeta «%s» a la carpeta «%s»: " --#~ "Error desconocido" -- --#~ msgid "Cannot copy messages from folder '%s' to folder '%s': Unknown error" --#~ msgstr "" --#~ "No se pueden copiar los mensajes de la carpeta «%s» a la carpeta «%s»: " --#~ "Error desconocido" -- --#~ msgid "Cannot move messages from folder '%s' to folder '%s': Bad command" --#~ msgstr "" --#~ "No se pueden mover los mensajes de la carpeta «%s» a la carpeta «%s»: " --#~ "Comando erróneo" -- --#~ msgid "Cannot copy messages from folder '%s' to folder '%s': Bad command" --#~ msgstr "" --#~ "No se pueden copiar los mensajes de la carpeta «%s» a la carpeta «%s»: " --#~ "Comando erróneo" -- --#~ msgid "Only check for Junk messa_ges in the INBOX folder" --#~ msgstr "Sólo comprobar si hay _spam en la carpeta INBOX" -- --#~ msgid "IMAP4rev1" --#~ msgstr "IMAPv4rev1 " -- --#~ msgid "For reading and storing mail on IMAPv4rev1 servers." --#~ msgstr "Para leer y almacenar correo en los servidores IMAPv4rev1." -- --#~ msgid "" --#~ "This option will connect to the IMAPv4rev1 server using a plaintext " --#~ "password." --#~ msgstr "" --#~ "Esta opción conectará con el servidor IMAPv4rev1 usando una contraseña de " --#~ "texto plano." -- --#~ msgid "" --#~ "Failed to connect to IMAP server %s in secure mode: Server does not " --#~ "support STARTTLS" --#~ msgstr "" --#~ "Falló al conectar al servidor IMAP %s en modo seguro: El servidor no " --#~ "soporta STARTTLS" -- --#~ msgid "" --#~ "Cannot authenticate to IMAP server %s using the %s authentication " --#~ "mechanism" --#~ msgstr "" --#~ "No se puede autenticar con el servidor IMAP %s usando el mecanismo de " --#~ "autenticación %s" -- --#~ msgid "Cannot authenticate to IMAP server %s using %s" --#~ msgstr "No se puede autenticar frente al servidor IMAP %s usando %s" -- --#~ msgid "Cannot create IMAP folders in offline mode." --#~ msgstr "No se pueden crear las carpetas IMAP en modo desconectado." -- --#~ msgid "Cannot get folder '%s' on IMAP server %s: Unknown error" --#~ msgstr "" --#~ "No se puede obtener la carpeta «%s» en el servidor IMAP %s: Error " --#~ "desconocido" -- --#~ msgid "Cannot get LIST information for '%s' on IMAP server %s: %s" --#~ msgstr "" --#~ "No se puede obtener la información LIST para «%s» en el servidor IMAP %s: " --#~ "%s" -- --#~ msgid "Bad command" --#~ msgstr "Comando erróneo" -- --#~ msgid "Cannot create folder '%s': Invalid mailbox name" --#~ msgstr "No se puede crear la carpeta «%s»: Nombre de buzón inválido" -- --#~ msgid "Cannot create folder '%s': Bad command" --#~ msgstr "No se puede crear la carpeta «%s»: Comando erróneo" -- --#~ msgid "Cannot delete IMAP folders in offline mode." --#~ msgstr "No se pueden borrar carpetas IMAP en modo desconectado." -- --#~ msgid "Cannot delete folder '%s': Invalid mailbox name" --#~ msgstr "No se puede borrar la carpeta: «%s»: Nombre de buzón inválido" -- --#~ msgid "Cannot delete folder '%s': Bad command" --#~ msgstr "No se puede borrar la carpeta «%s»: Comando erróneo" -- --#~ msgid "Cannot rename folder '%s' to '%s': Special folder" --#~ msgstr "No se puede renombrar la carpeta «%s» a «%s»: Carpeta especial" -- --#~ msgid "Cannot rename IMAP folders in offline mode." --#~ msgstr "No se puede renombrar las carpetas IMAP en modo desconectado." -- --#~ msgid "Cannot rename folder '%s' to '%s': Invalid mailbox name" --#~ msgstr "" --#~ "No se puede renombrar la carpeta «%s» a «%s»: Nombre de buzón inválido" -- --#~ msgid "Cannot rename folder '%s' to '%s': Bad command" --#~ msgstr "No se puede renombrar la carpeta «%s» a «%s»: Comando erróneo" -- --#~ msgid "Cannot get %s information for pattern '%s' on IMAP server %s: %s" --#~ msgstr "" --#~ "No se puede obtener la información %s para el patrón «%s» en el servidor " --#~ "IMAP %s:%s" -- --#~ msgid "Cannot subscribe to IMAP folders in offline mode." --#~ msgstr "No puede suscribirse a las carpetas IMAP en modo desconectado." -- --#~ msgid "Cannot subscribe to folder '%s': Invalid mailbox name" --#~ msgstr "No puede suscribirse a la carpeta «%s»: Nombre de buzón inválido" -- --#~ msgid "Cannot subscribe to folder '%s': Bad command" --#~ msgstr "No puede suscribirse a la carpeta «%s»: Comando erróneo" -- --#~ msgid "Cannot unsubscribe from IMAP folders in offline mode." --#~ msgstr "No puede desuscribirse de las carpetas IMAP en modo desconectado." -- --#~ msgid "Cannot unsubscribe from folder '%s': Invalid mailbox name" --#~ msgstr "No puede desuscribirse de la carpeta «%s»: Nombre de buzón inválido" -- --#~ msgid "Cannot unsubscribe from folder '%s': Bad command" --#~ msgstr "No puede desuscribirse de la carpeta «%s»: Comando erróneo" -- --#~ msgid "Scanning for changed messages" --#~ msgstr "Buscando mensajes modificados" -- --#~ msgid "IMAP server %s is in an inconsistent state." --#~ msgstr "El servidor IMAP %s está en un estado inconsistente." -- --#~ msgid "Fetching envelopes of new messages" --#~ msgstr "Obteniendo envolturas de los mensajes nuevos" -- --#~ msgid "Unexpected token in response from IMAP server %s: " --#~ msgstr "Token inesperado en la respuesta del servidor IMAP %s: " -- --#~ msgid "No data" --#~ msgstr "Sin datos" -- --#~ msgid "IMAP server %s unexpectedly disconnected: %s" --#~ msgstr "El servidor IMAP %s se desconectó inesperadamente: %s" -- --#~ msgid "%sPlease enter the IMAP password for %s@%s" --#~ msgstr "%s Escriba la contraseña IMAP para %s@%s" -- --#~ msgid "Could not connect to POP server on %s" --#~ msgstr "No se pudo conectar con el servidor POP en %s" -- --#~ msgid "Use cancel" --#~ msgstr "Usar cancelar" -- --#~ msgid "Item(s) _belong to these categories:" --#~ msgstr "Los elementos perte_necen a estas categorías:" -- --#~ msgid "Color Info" --#~ msgstr "Información del color" -- --#~ msgid "The color to render" --#~ msgstr "El color que renderizar" -- --#~ msgid "" --#~ "Experimental IMAP 4(.1) client\n" --#~ "This is untested and unsupported code, you want to use plain imap " --#~ "instead.\n" --#~ "\n" --#~ " !!! DO NOT USE THIS FOR PRODUCTION EMAIL !!!\n" --#~ msgstr "" --#~ "Cliente experimental IMAP 4(.1) \n" --#~ "Este código no está probado y no está soportado, quizá desee usar imap " --#~ "simple en su lugar.\n" --#~ "\n" --#~ " !!! NO USAR ESTO PARA CORREO EN PRODUCCIÓN !!!\n" -- --#~ msgid "This is a digitally signed message part" --#~ msgstr "Esta parte del mensaje está firmada digitalmente" -- --#~ msgid "%s: there was no self contact UID stored in gconf" --#~ msgstr "%s: no había uid de contacto para sí mismo almacenado en gconf" -- --#~ msgid "\"%s\" on book before \"%s\"" --#~ msgstr "«%s» en la libreta antes que «%s»" -- --#~ msgid "book busy" --#~ msgstr "libreta ocupada" -- --#~ msgid "CORBA exception making \"%s\" call" --#~ msgstr "Excepción CORBA haciendo la llamada «%s»" -- --#~ msgid "%s: there is no current operation" --#~ msgstr "%s: no hay operación actual" -- --#~ msgid "\"%s\" on book after \"%s\"" --#~ msgstr "«%s» en la libreta antes que «%s»" -- --#~ msgid "%s: canceled" --#~ msgstr "%s: cancelado" -- --#~ msgid "%s: no factories available for URI `%s'" --#~ msgstr "%s: no hay fábricas disponibles para el URI «%s»" -- --#~ msgid "%s: Could not create EBookListener" --#~ msgstr "%s: No se pudo crear el EBookListener" -- --#~ msgid "Kerberos 4" --#~ msgstr "Kerberos 4" -- --#~ msgid "" --#~ "This option will connect to the server using Kerberos 4 authentication." --#~ msgstr "" --#~ "Esta opción conectará con el servidor usando autenticación Kerberos 4." -- --#~ msgid "" --#~ "Could not get Kerberos ticket:\n" --#~ "%s" --#~ msgstr "" --#~ "No se pudo obtener el ticket Kerberos:\n" --#~ "%s" -- --#~ msgid "Unable to get issuer's certificate" --#~ msgstr "No se pudo obtener el certificado del emisor" -- --#~ msgid "Unable to get Certificate Revocation List" --#~ msgstr "No se pudo obtener la Lista de Revocación de Certificados" -- --#~ msgid "Unable to decrypt certificate signature" --#~ msgstr "No se pudo descifrar la firma del certificado" -- --#~ msgid "Unable to decrypt Certificate Revocation List signature" --#~ msgstr "" --#~ "No se pudo descifrar la firma de la Lista de Revocación de Certificados" -- --#~ msgid "Unable to decode issuer's public key" --#~ msgstr "No se pudo decodificar la clave pública del emisor" -- --#~ msgid "Certificate not yet valid" --#~ msgstr "Certificado aún no válido" -- --#~ msgid "Certificate Revocation List (CRL) not yet valid" --#~ msgstr "La Lista de Revocación de Certificados (CRL) aún no es válida" -- --#~ msgid "Certificate Revocation List (CRL) has expired" --#~ msgstr "La Lista de Revocación de Certificados (CRL) ha caducado" -- --#~ msgid "Error in Certificate Revocation List (CRL)" --#~ msgstr "Error en la Lista de Revocación de Certificados (CRL)" -- --#~ msgid "Out of memory" --#~ msgstr "Memoria agotada" -- --#~ msgid "Zero-depth self-signed certificate" --#~ msgstr "Certificado de profundidad cero autofirmado" -- --#~ msgid "Self-signed certificate in chain" --#~ msgstr "Certificado auto-firmado en la cadena" -- --#~ msgid "Unable to get issuer's certificate locally" --#~ msgstr "No se pudo obtener el certificado del emisor localmente" -- --#~ msgid "Unable to verify leaf signature" --#~ msgstr "No se pudo verificar la firma de la hoja" -- --#~ msgid "Certificate chain too long" --#~ msgstr "Cadena de certificados demasiado larga" -- --#~ msgid "Path length exceeded" --#~ msgstr "Longitud de ruta excedida" -- --#~ msgid "Invalid purpose" --#~ msgstr "Propósito inválido" -- --#~ msgid "Subject/Issuer mismatch" --#~ msgstr "No coincide Asunto/Emisor" -- --#~ msgid "AKID/SKID mismatch" --#~ msgstr "No coincide AKID/SKID " -- --#~ msgid "AKID/Issuer serial mismatch" --#~ msgstr "No coinciden las series AKID/Emisor" -- --#~ msgid "Key usage does not support certificate signing" --#~ msgstr "El uso de la clave no soporta firmado de certificados" -- --#~ msgid "Error in application verification" --#~ msgstr "Error en la verificación de la aplicación" -- --#~ msgid "" --#~ "Bad certificate from %s:\n" --#~ "\n" --#~ "%s\n" --#~ "\n" --#~ "%s\n" --#~ "\n" --#~ "Do you wish to accept anyway?" --#~ msgstr "" --#~ "Certificado erróneo de %s:\n" --#~ "\n" --#~ "%s\n" --#~ "\n" --#~ "%s\n" --#~ "\n" --#~ "¿Quiere aceptarlo de todos modos?" -- --#~ msgid "Drafts" --#~ msgstr "Borradores" -- --#~ msgid "Sent" --#~ msgstr "Correo enviado" -- --#~ msgid "Templates" --#~ msgstr "Plantillas" -- --#~ msgid "Owner" --#~ msgstr "Propietario" -- --#~ msgid "Publishing Editor" --#~ msgstr "Editor publicador" -- --#~ msgid "Editor" --#~ msgstr "Editor" -- --#~ msgid "Publishing Author" --#~ msgstr "Autor publicador" -- --#~ msgid "Author" --#~ msgstr "Autor" -- --#~ msgid "Reviewer" --#~ msgstr "Revisor" -- --#~ msgid "Contributor" --#~ msgstr "Contribuidor" -- --#~ msgid "None" --#~ msgstr "Ninguno" -- --#~ msgid "Custom" --#~ msgstr "Personalizado" -- --#~ msgid "Generic error" --#~ msgstr "Error genérico" -- --#~ msgid "A folder with the same name already exists" --#~ msgstr "Ya existe una carpeta con el mismo nombre" -- --#~ msgid "The specified folder type is not valid" --#~ msgstr "El tipo de carpeta especificado no es válido" -- --#~ msgid "Not enough space to create the folder" --#~ msgstr "Sin suficiente espacio para crear la carpeta" -- --#~ msgid "The folder is not empty" --#~ msgstr "La carpeta no está vacía" -- --#~ msgid "The specified folder was not found" --#~ msgstr "La carpeta especificada no se encontró" -- --#~ msgid "Function not implemented in this storage" --#~ msgstr "Función no implementada en este almacén" -- --#~ msgid "The specified type is not supported in this storage" --#~ msgstr "El tipo especificado no está soportado en este almacenamiento" -- --#~ msgid "The specified folder cannot be modified or removed" --#~ msgstr "La carpeta especificada no puede ser modificada o eliminada" -- --#~ msgid "Cannot make a folder a child of one of its descendants" --#~ msgstr "No se puede hacer una carpeta una hija de uno de sus descendientes" -- --#~ msgid "Cannot create a folder with that name" --#~ msgstr "No se pudo crear una carpeta con ese nombre" -- --#~ msgid "This operation cannot be performed in off-line mode" --#~ msgstr "Esta operación no se puede realizar en modo desconectado" -- --#~ msgid "%s's Folders" --#~ msgstr "Carpetas de %s" -- --#~ msgid "Favorite Public Folders" --#~ msgstr "Carpetas públicas favoritas" -- --#~ msgid "All Public Folders" --#~ msgstr "Todas las carpetas públicas" -- --#~ msgid "Global Address List" --#~ msgstr "Lista de direcciones global" -- --#~ msgid "Deleted Items" --#~ msgstr "Elementos borrados" -- --#~ msgid "Journal" --#~ msgstr "Diario" -- --#~ msgid "Notes" --#~ msgstr "Notas" -- --#~ msgid "Outbox" --#~ msgstr "Bandeja de salida" -- --#~ msgid "Sent Items" --#~ msgstr "Elementos enviados" -- --#~ msgid "Evolution Addressbook file backend" --#~ msgstr "Soporte de libretas de direcciones en archivo local de Evolution" -- --#~ msgid "Evolution Calendar file and webcal backend" --#~ msgstr "Soporte de calendario y webcal de Evolution" -- --#~ msgid "Evolution Data Server interface check service" --#~ msgstr "Servicio de comprobación del interfaz de Evolution Data Server" -- --#~ msgid "Multiple segmentation faults occurred; cannot display error dialog\n" --#~ msgstr "" --#~ "Han ocurrido fallos de segmentación múltiples; no se puede mostrar el " --#~ "diálogo de error\n" -- --#~ msgid "Decoder failed, error %d" --#~ msgstr "El decodificador ha fallado, error %d" -- --#~ msgid "CRL not yet valid" --#~ msgstr "LRC todavía no válida" -- --#~ msgid "CRL has expired" --#~ msgstr "La LRC ha caducado" -- --#~ msgid "Error in CRL" --#~ msgstr "Error en LRC" -- --#~ msgid "Failed to create create child process '%s': %s" --#~ msgstr "Error al crear proceso hijo «%s»: %s" -- --#~ msgid "Performing query on unknown header: %s" --#~ msgstr "Realizando búsqueda en cabecera desconocida: %s" -- --#~ msgid "Fair" --#~ msgstr "Buen tiempo" -- --#~ msgid "Snow showers" --#~ msgstr "Chubascos de nieve" -- --#~ msgid "Snow" --#~ msgstr "Nieve" -- --#~ msgid "Partly cloudy" --#~ msgstr "Parcialmente nuboso" -- --#~ msgid "Smoke" --#~ msgstr "Humo" -- --#~ msgid "Thunderstorms" --#~ msgstr "Tormentas" -- --#~ msgid "Cloudy" --#~ msgstr "Nuboso" -- --#~ msgid "Drizzle" --#~ msgstr "Llovizna" -- --#~ msgid "Sunny" --#~ msgstr "Soleado" -- --#~ msgid "Dust" --#~ msgstr "Polvo" -- --#~ msgid "Clear" --#~ msgstr "Despejado" -- --#~ msgid "Mostly cloudy" --#~ msgstr "Mayormente nuboso" -- --#~ msgid "Windy" --#~ msgstr "Ventoso" -- --#~ msgid "Rain showers" --#~ msgstr "Chaparrones" -- --#~ msgid "Foggy" --#~ msgstr "Niebla" -- --#~ msgid "Rain/snow mixed" --#~ msgstr "Lluvia/nieve mezclados" -- --#~ msgid "Sleet" --#~ msgstr "Aguanieve" -- --#~ msgid "Very hot/humid" --#~ msgstr "Muy caliente/húmedo" -- --#~ msgid "Blizzard" --#~ msgstr "Ventisca" -- --#~ msgid "Freezing rain" --#~ msgstr "Lluvia helada" -- --#~ msgid "Haze" --#~ msgstr "Bruma" -- --#~ msgid "Blowing snow" --#~ msgstr "Nieve y viento" -- --#~ msgid "Freezing drizzle" --#~ msgstr "Lloviznas congeladas" -- --#~ msgid "Very cold/wind chill" --#~ msgstr "Muy frío/viento aullante" -- --#~ msgid "Rain" --#~ msgstr "Lluvia" -- --#~ msgid "Weather: Partly Cloudy" --#~ msgstr "Meteorología: Parcialmente nuboso" -- --#~ msgid "%.1f/%.1f°C - %s" --#~ msgstr "%.1f/%.1f°C - %s" -- --#~ msgid "%.1f/%.1f°F - %s" --#~ msgstr "%.1f/%.1f°F - %s" -- --#~ msgid "%d%% chance of precipitation\n" --#~ msgstr "%d%% probabilidad de precipitación\n" -- --#~ msgid "%.1fcm snow\n" --#~ msgstr "%.1fcm nieve\n" -- --#~ msgid "%.1fin snow\n" --#~ msgstr "%.1fpl nieve\n" -- --#~ msgid "%.1f-%.1fcm snow\n" --#~ msgstr "%.1f-%.1fcm nieve\n" -- --#~ msgid "%.1f-%.1fin snow\n" --#~ msgstr "%.1f-%.1fpl nieve\n" -- --#~ msgid "Folder was destroyed and recreated on server." --#~ msgstr "La carpeta fue destruida y recreada en el servidor." -- --#~ msgid "Detected a corrupt mbox file or an invalid 'From' header" --#~ msgstr "Se detectó un archivo mbox corrupto o una cabecera «De:» no válida" -- --#~ msgid "Folder %s cannot be opened: %s" --#~ msgstr "La carpeta «%s» no se puede abrir: %s" -diff -urN evolution-data-server-3.12.11/po/fr.po evolution-data-server-3.12.11_localized/po/fr.po ---- evolution-data-server-3.12.11/po/fr.po 2014-11-04 18:27:25.000000000 +0530 -+++ evolution-data-server-3.12.11_localized/po/fr.po 2016-03-14 19:48:05.422870074 +0530 -@@ -1,7 +1,7 @@ - # French translation of evolution-data-server. - # Copyright (C) 2003-2014 Free Software Foundation, Inc. - # This file is distributed under the same license as the evolution-data-server package. --# -+# - # Christophe Merlet , 2000-2006. - # Christophe Fergeau , 2003. - # Brigitte Le Grand pour Sun Microsystems(tm), 2003. -@@ -16,21 +16,22 @@ - # Bruno Brouard , 2008,2012. - # Yannick Tailliez , 2008. - # Laurent Coudeur , 2009, 2010. --# -+# Sam Friedmann , 2016. #zanata -+# pnemade , 2016. #zanata - msgid "" - msgstr "" - "Project-Id-Version: evolution-data-server HEAD\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" --"product=evolution-data-server&keywords=I18N+L10N&component=Misc.\n" --"POT-Creation-Date: 2014-09-12 11:25+0000\n" --"PO-Revision-Date: 2014-08-31 19:26+0200\n" --"Last-Translator: Claude Paroz \n" --"Language-Team: GNOME French Team \n" --"Language: fr\n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2016-02-16 09:58+0530\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"PO-Revision-Date: 2016-03-07 12:22+0000\n" -+"Last-Translator: Sam Friedmann \n" -+"Language-Team: GNOME French Team \n" -+"Language: fr\n" - "Plural-Forms: nplurals=2; plural=(n > 1);\n" -+"X-Generator: Zanata 3.8.2\n" - - #: ../addressbook/backends/file/e-book-backend-file.c:120 - #, c-format -@@ -74,8 +75,8 @@ - - #: ../addressbook/backends/file/e-book-backend-file.c:1472 - #: ../addressbook/backends/file/e-book-backend-file.c:1555 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3077 --#: ../addressbook/libedata-book/e-book-sqlite.c:6742 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3084 -+#: ../addressbook/libedata-book/e-book-sqlite.c:6793 - #, c-format - msgid "Contact '%s' not found" - msgstr "Contact « %s » non trouvé" -@@ -106,81 +107,81 @@ - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:1174 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4250 - #: ../addressbook/backends/webdav/e-book-backend-webdav.c:419 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:887 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:888 - #: ../addressbook/libebook-contacts/e-book-contacts-types.c:35 - #: ../addressbook/libebook-contacts/e-phone-number.c:56 - #: ../addressbook/libebook/e-book.c:1078 --#: ../addressbook/libebook/e-book-client.c:1882 --#: ../addressbook/libebook/e-book-client.c:2054 --#: ../addressbook/libebook/e-book-client.c:2267 --#: ../addressbook/libebook/e-book-client.c:2398 --#: ../addressbook/libebook/e-book-client.c:2557 --#: ../addressbook/libebook/e-book-client.c:2691 --#: ../addressbook/libebook/e-book-client.c:2822 --#: ../addressbook/libebook/e-book-client.c:2980 --#: ../addressbook/libebook/e-book-client.c:3175 --#: ../addressbook/libebook/e-book-client.c:3393 -+#: ../addressbook/libebook/e-book-client.c:1916 -+#: ../addressbook/libebook/e-book-client.c:2088 -+#: ../addressbook/libebook/e-book-client.c:2301 -+#: ../addressbook/libebook/e-book-client.c:2432 -+#: ../addressbook/libebook/e-book-client.c:2591 -+#: ../addressbook/libebook/e-book-client.c:2725 -+#: ../addressbook/libebook/e-book-client.c:2856 -+#: ../addressbook/libebook/e-book-client.c:3014 -+#: ../addressbook/libebook/e-book-client.c:3209 -+#: ../addressbook/libebook/e-book-client.c:3427 - #: ../addressbook/libedata-book/e-book-backend-sexp.c:878 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:585 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:616 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:629 - #: ../calendar/backends/contacts/e-cal-backend-contacts.c:270 - #: ../calendar/libecal/e-cal.c:2334 ../calendar/libecal/e-cal-client.c:276 --#: ../calendar/libecal/e-cal-client.c:3239 --#: ../calendar/libecal/e-cal-client.c:3412 --#: ../calendar/libecal/e-cal-client.c:3676 --#: ../calendar/libecal/e-cal-client.c:3917 --#: ../calendar/libecal/e-cal-client.c:4107 --#: ../calendar/libecal/e-cal-client.c:4299 --#: ../calendar/libecal/e-cal-client.c:4469 --#: ../calendar/libecal/e-cal-client.c:4638 --#: ../calendar/libecal/e-cal-client.c:4841 --#: ../calendar/libecal/e-cal-client.c:4991 --#: ../calendar/libecal/e-cal-client.c:5185 --#: ../calendar/libecal/e-cal-client.c:5338 --#: ../calendar/libecal/e-cal-client.c:5555 --#: ../calendar/libecal/e-cal-client.c:5709 --#: ../calendar/libecal/e-cal-client.c:5935 --#: ../calendar/libecal/e-cal-client.c:6131 --#: ../calendar/libecal/e-cal-client.c:6494 --#: ../calendar/libecal/e-cal-client.c:6708 -+#: ../calendar/libecal/e-cal-client.c:3273 -+#: ../calendar/libecal/e-cal-client.c:3446 -+#: ../calendar/libecal/e-cal-client.c:3710 -+#: ../calendar/libecal/e-cal-client.c:3951 -+#: ../calendar/libecal/e-cal-client.c:4141 -+#: ../calendar/libecal/e-cal-client.c:4333 -+#: ../calendar/libecal/e-cal-client.c:4503 -+#: ../calendar/libecal/e-cal-client.c:4672 -+#: ../calendar/libecal/e-cal-client.c:4875 -+#: ../calendar/libecal/e-cal-client.c:5025 -+#: ../calendar/libecal/e-cal-client.c:5219 -+#: ../calendar/libecal/e-cal-client.c:5372 -+#: ../calendar/libecal/e-cal-client.c:5589 -+#: ../calendar/libecal/e-cal-client.c:5743 -+#: ../calendar/libecal/e-cal-client.c:5969 -+#: ../calendar/libecal/e-cal-client.c:6165 -+#: ../calendar/libecal/e-cal-client.c:6528 -+#: ../calendar/libecal/e-cal-client.c:6750 - #: ../camel/providers/imapx/camel-imapx-command.c:645 --#: ../camel/providers/imapx/camel-imapx-server.c:4784 --#: ../camel/providers/imapx/camel-imapx-server.c:4793 -+#: ../camel/providers/imapx/camel-imapx-server.c:4871 -+#: ../camel/providers/imapx/camel-imapx-server.c:4880 - #: ../libedataserver/e-client.c:185 - msgid "Unknown error" - msgstr "Erreur inconnue" - - #. Query for new contacts asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:828 -+#: ../addressbook/backends/google/e-book-backend-google.c:822 - msgid "Querying for updated contacts…" - msgstr "Recherche de mise à jour de contacts…" - - #. Run the query asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:1010 -+#: ../addressbook/backends/google/e-book-backend-google.c:1004 - msgid "Querying for updated groups…" - msgstr "Recherche de mise à jour de groupes…" - --#: ../addressbook/backends/google/e-book-backend-google.c:1757 -+#: ../addressbook/backends/google/e-book-backend-google.c:1751 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4997 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1433 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1434 - msgid "The backend does not support bulk additions" - msgstr "Le moteur de traitement ne prend pas en charge les ajouts en masse" - --#: ../addressbook/backends/google/e-book-backend-google.c:1912 -+#: ../addressbook/backends/google/e-book-backend-google.c:1906 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:5133 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1545 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1546 - msgid "The backend does not support bulk modifications" - msgstr "" - "Le moteur de traitement ne prend pas en charge les modifications en masse" - --#: ../addressbook/backends/google/e-book-backend-google.c:2119 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1645 -+#: ../addressbook/backends/google/e-book-backend-google.c:2113 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1646 - msgid "The backend does not support bulk removals" - msgstr "" - "Le moteur de traitement ne prend pas en charge les suppressions en masse" - --#: ../addressbook/backends/google/e-book-backend-google.c:2239 -+#: ../addressbook/backends/google/e-book-backend-google.c:2233 - msgid "Loading…" - msgstr "Chargement…" - -@@ -280,45 +281,45 @@ - msgid "Failed to get the DN for user '%s'" - msgstr "La récupération du DN de l'utilisateur « %s » a échoué" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:864 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:865 - msgid "Loading Addressbook summary..." - msgstr "Chargement du sommaire du carnet d'adresses…" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:884 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:885 - #, c-format - msgid "PROPFIND on webdav failed with HTTP status %d (%s)" - msgstr "La requête PROPFIND sur webdav a échoué avec l'état HTTP : %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:903 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:904 - msgid "No response body in webdav PROPFIND result" - msgstr "Pas de contenu dans le résultat renvoyé par PROPFIND sur le webdav" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:964 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:965 - #, c-format - msgid "Loading Contacts (%d%%)" - msgstr "Chargement des contacts (%d%%)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1353 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1354 - msgid "Cannot transform SoupURI to string" - msgstr "Impossible de transformer SoupURI en chaîne" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1474 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1475 - #, c-format - msgid "Create resource '%s' failed with HTTP status %d (%s)" - msgstr "La création de la ressource « %s » a échoué avec l'état HTTP %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1576 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1577 - msgid "Contact on server changed -> not modifying" - msgstr "" - "Le contact sur le serveur a été modifié -> pas d'application des changements" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1584 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1585 - #, c-format - msgid "Modify contact failed with HTTP status %d (%s)" - msgstr "La modification du contact a échoué avec l'état HTTP %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1677 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1693 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1678 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1694 - #, c-format - msgid "DELETE failed with HTTP status %d" - msgstr "L'action DELETE a échoué avec l'état HTTP %d" -@@ -923,7 +924,7 @@ - msgid "Twitter Name List" - msgstr "Liste des noms Twitter" - --#: ../addressbook/libebook-contacts/e-contact.c:1654 -+#: ../addressbook/libebook-contacts/e-contact.c:1660 - #: ../addressbook/libebook/e-destination.c:920 - msgid "Unnamed List" - msgstr "Liste de contacts sans nom" -@@ -932,6 +933,7 @@ - msgid "The library was built without phone number support." - msgstr "" - "La bibliothèque a été compilée sans prise en charge des numéros de téléphone." -+"" - - #: ../addressbook/libebook-contacts/e-phone-number.c:43 - msgid "The phone number parser reported an yet unkown error code." -@@ -947,7 +949,8 @@ - - #: ../addressbook/libebook-contacts/e-phone-number.c:49 - msgid "" --"Remaining text after the country calling code is too short for a phone number" -+"Remaining text after the country calling code is too short for a phone " -+"number" - msgstr "" - "Le texte suivant l'indicatif international est trop court pour un numéro de " - "téléphone" -@@ -960,48 +963,48 @@ - msgid "Text is too long for a phone number" - msgstr "Le texte est trop long pour un numéro de téléphone" - --#: ../addressbook/libebook/e-book-client.c:807 -+#: ../addressbook/libebook/e-book-client.c:841 - #, c-format - msgid "Unknown book property '%s'" - msgstr "Propriété de carnet « %s » inconnue" - --#: ../addressbook/libebook/e-book-client.c:822 -+#: ../addressbook/libebook/e-book-client.c:856 - #, c-format - msgid "Cannot change value of book property '%s'" - msgstr "Impossible de changer la valeur de la propriété de carnet « %s »" - --#: ../addressbook/libebook/e-book-client.c:1207 --#: ../addressbook/libebook/e-book-client.c:1382 --#: ../addressbook/libebook/e-book-client.c:1649 --#: ../calendar/libecal/e-cal-client.c:1530 --#: ../calendar/libecal/e-cal-client.c:1712 -+#: ../addressbook/libebook/e-book-client.c:1241 -+#: ../addressbook/libebook/e-book-client.c:1416 -+#: ../addressbook/libebook/e-book-client.c:1683 -+#: ../calendar/libecal/e-cal-client.c:1564 -+#: ../calendar/libecal/e-cal-client.c:1746 - #, c-format - msgid "Unable to connect to '%s': " - msgstr "Impossible de se connecter à « %s » : " - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:899 --#: ../addressbook/libedata-book/e-book-sqlite.c:2178 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:906 -+#: ../addressbook/libedata-book/e-book-sqlite.c:2201 - #, c-format - msgid "Error introspecting unknown summary field '%s'" - msgstr "Erreur d'introspection du champ résumé inconnu « %s »" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1509 --#: ../addressbook/libedata-book/e-book-sqlite.c:1334 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1516 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1340 - msgid "Error parsing regular expression" - msgstr "Erreur d'analyse de l'expression régulière" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1554 --#: ../addressbook/libedata-book/e-book-sqlite.c:1818 ../camel/camel-db.c:545 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1561 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1824 ../camel/camel-db.c:619 - #, c-format - msgid "Insufficient memory" - msgstr "Mémoire insuffisante" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1691 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1698 - #, c-format - msgid "Invalid contact field '%d' specified in summary" - msgstr "Champ de contact « %d » non valide dans le résumé" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1725 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1732 - #: ../addressbook/libedata-book/e-book-sqlite.c:559 - #, c-format - msgid "" -@@ -1012,8 +1015,8 @@ - "seuls les types de champ booléen, chaîne ou liste de chaînes sont pris en " - "charge" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3065 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4161 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3072 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4168 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. vcards cannot be returned." -@@ -1021,19 +1024,19 @@ - "Les « search_contacts » complets ne sont pas stockés en cache. Il n'est pas " - "possible de renvoyer des vcards." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4292 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4385 --#: ../addressbook/libedata-book/e-book-sqlite.c:5400 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4299 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4392 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5451 - #, c-format - msgid "Query contained unsupported elements" - msgstr "La requête contient des éléments non pris en charge" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4296 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4303 - #, c-format - msgid "Invalid Query" - msgstr "Requête non valide" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4320 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4327 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. Hence only summary query is " -@@ -1042,7 +1045,7 @@ - "Les « search_contacts » complets ne sont pas stockés en cache. Seules les " - "requêtes de résumé sont possibles." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4389 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4396 - #: ../addressbook/libedata-book/e-data-book.c:383 - #: ../addressbook/libedata-book/e-data-book.c:1028 - #: ../calendar/libedata-cal/e-data-cal.c:420 -@@ -1051,7 +1054,7 @@ - msgid "Invalid query" - msgstr "Requête non valide" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4432 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4439 - #, c-format - msgid "" - "Full vcards are not stored in cache. Hence only summary query is supported." -@@ -1059,36 +1062,36 @@ - "Les vcards complets ne sont pas stockés en cache. Seules les requêtes de " - "résumé sont possibles." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5255 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5262 - #, c-format - msgid "Unable to remove the db file: errno %d" - msgstr "" - "Impossible de supprimer le fichier de base de données : numéro d'erreur %d" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6042 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6442 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6449 - #, c-format - msgid "Only summary queries are supported by EbSdbCursor" - msgstr "Seules les requêtes de résumé sont prises en charge par EbSdbCursor" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6056 - #, c-format - msgid "At least one sort field must be specified to use an EbSdbCursor" - msgstr "" - "Au minimum un champ de tri doit être indiqué pour utiliser un EbSdbCursor" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6063 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 - #, c-format - msgid "Cannot sort by a field that is not in the summary" - msgstr "Impossible de trier par un champ ne figurant pas dans le résumé" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6077 - #, c-format - msgid "Cannot sort by a field which may have multiple values" - msgstr "Impossible de trier par un champ pouvant avoir plusieurs valeurs" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6203 --#: ../addressbook/libedata-book/e-book-sqlite.c:7412 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6210 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7463 - #, c-format - msgid "" - "Tried to step a cursor in reverse, but cursor is already at the beginning of " -@@ -1097,8 +1100,8 @@ - "Tentative de reculer le curseur, mais celui-ci est déjà au début de la liste " - "des contacts" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6211 --#: ../addressbook/libedata-book/e-book-sqlite.c:7420 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6218 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7471 - #, c-format - msgid "" - "Tried to step a cursor forwards, but cursor is already at the end of the " -@@ -1112,7 +1115,7 @@ - msgid "Unsupported contact field '%d' specified in summary" - msgstr "Champ de contact « %d » non pris en charge dans le résumé" - --#: ../addressbook/libedata-book/e-book-sqlite.c:1891 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1897 - msgid "" - "Cannot upgrade contacts database from a legacy database with more than one " - "addressbook. Delete one of the entries in the 'folders' table first." -@@ -1121,21 +1124,21 @@ - "base de données existante avec plus d'un carnet d'adresses. Supprimez " - "d'abord l'une des entrées dans la table « folders »." - --#: ../addressbook/libedata-book/e-book-sqlite.c:5393 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5444 - #, c-format - msgid "Invalid query: %s" - msgstr "Requête non valide : %s" - --#: ../addressbook/libedata-book/e-book-sqlite.c:5568 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5619 - msgid "Invalid query for EbSqlCursor" - msgstr "Requête non valide pour EbSqlCursor" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7234 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7285 - msgid "At least one sort field must be specified to use an EbSqlCursor" - msgstr "" - "Au minimum un champ de tri doit être indiqué pour utiliser un EbSqlCursor" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7252 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7303 - msgid "Cannot sort by a field that is not a string type" - msgstr "Impossible de trier par un champ n'étant pas de type string" - -@@ -1301,15 +1304,15 @@ - msgid "Cannot remove contacts: " - msgstr "Impossible de supprimer les contacts : " - --#: ../addressbook/libedata-book/e-data-book-cursor.c:772 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:776 - msgid "Cursor does not support setting the search expression" - msgstr "Le curseur ne gère pas la définition de l'expression de recherche" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:855 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:859 - msgid "Cursor does not support step" - msgstr "Le curseur ne prend pas en charge l'opération « step »" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:938 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:942 - msgid "Cursor does not support alphabetic indexes" - msgstr "Le curseur ne prend pas en charge les index alphabétiques" - -@@ -1343,35 +1346,35 @@ - msgid "No such source for UID '%s'" - msgstr "Pas de source pour l'UID « %s »" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:581 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 - #, c-format - msgid "Server is unreachable (%s)" - msgstr "Le serveur est inaccessible (%s)" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:612 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 - #, c-format - msgid "Failed to connect to a server using SSL: %s" - msgstr "Impossible de se connecter à un serveur en utilisant SSL : %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:623 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 - #, c-format --msgid "Unexpected HTTP status code %d returned (%s)" --msgstr "Le code d'état HTTP renvoyé (%d) est inattendu (%s)" -+msgid "Unexpected HTTP status code %d returned (%s) for URI: %s" -+msgstr "Le code de statut HTTP inattendu %d a retourné (%s) comme URI : %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:642 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:647 - msgid "CalDAV backend is not loaded yet" - msgstr "Le moteur CalDAV n'est pas encore chargé" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1084 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1091 - msgid "Invalid Redirect URL" - msgstr "URL de redirection non valide" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2887 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2894 - #, c-format - msgid "Cannot create local cache folder '%s'" - msgstr "Impossible de créer le dossier de cache local « %s »" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2939 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2946 - #, c-format - msgid "" - "Server is unreachable, calendar is opened in read-only mode.\n" -@@ -1380,27 +1383,27 @@ - "Le serveur est inaccessible, l'agenda est ouvert en mode lecture seule.\n" - "Message d'erreur : %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3973 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3988 - msgid "CalDAV does not support bulk additions" - msgstr "CalDAV ne prend pas en charge les ajouts en masse" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4076 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4091 - msgid "CalDAV does not support bulk modifications" - msgstr "CalDAV ne prend pas en charge les modifications en masse" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4252 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4267 - msgid "CalDAV does not support bulk removals" - msgstr "CalDAV ne prend pas en charge les suppressions en masse" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4919 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4941 - msgid "Calendar doesn't support Free/Busy" - msgstr "L'agenda ne prend pas en charge les informations Libre/Occupé" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4928 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4950 - msgid "Schedule outbox url not found" - msgstr "URL de la boîte d'envoi d'agenda non trouvée" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5025 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5047 - msgid "Unexpected result in schedule-response" - msgstr "Réponse inattendue dans schedule-response" - -@@ -1448,74 +1451,75 @@ - msgstr "Ce n'est pas un agenda." - - #: ../calendar/backends/http/e-cal-backend-http.c:925 --#: ../calendar/backends/weather/e-cal-backend-weather.c:536 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:700 - msgid "Could not create cache file" - msgstr "Impossible de créer le fichier cache" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:174 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:196 - msgid "Could not retrieve weather data" - msgstr "Impossible de récupérer les informations météo" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:295 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:369 - msgid "Weather: Fog" - msgstr "Météo : brume" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:296 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:370 - msgid "Weather: Cloudy Night" - msgstr "Météo : nuit nuageuse" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:297 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:371 - msgid "Weather: Cloudy" - msgstr "Météo : nuageux" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:298 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:372 - msgid "Weather: Overcast" - msgstr "Météo : couvert" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:299 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:373 - msgid "Weather: Showers" - msgstr "Météo : averses" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:300 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:374 - msgid "Weather: Snow" - msgstr "Météo : neige" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:301 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:375 - msgid "Weather: Clear Night" - msgstr "Météo : nuit claire" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:302 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:376 - msgid "Weather: Sunny" - msgstr "Météo : ensoleillé" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:303 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:377 - msgid "Weather: Thunderstorms" - msgstr "Météo : orages" - - #. TRANSLATOR: This is the temperature in degrees Fahrenheit (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:329 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:403 - #, c-format - msgid "%.1f °F" - msgstr "%.1f °F" - - #. TRANSLATOR: This is the temperature in degrees Celsius (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:332 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:406 - #, c-format - msgid "%.1f °C" - msgstr "%.1f °C" - - #. TRANSLATOR: This is the temperature in kelvin --#: ../calendar/backends/weather/e-cal-backend-weather.c:335 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:409 - #, c-format - msgid "%.1f K" - msgstr "%.1f K" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:341 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:415 - #, c-format - msgid "%.1f" - msgstr "%.1f" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:452 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:580 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:608 - msgid "Forecast" - msgstr "Prévisions" - -@@ -1571,7 +1575,7 @@ - msgstr "L'authentification a échoué" - - #: ../calendar/libecal/e-cal.c:2330 --#: ../camel/providers/smtp/camel-smtp-transport.c:921 -+#: ../camel/providers/smtp/camel-smtp-transport.c:960 - #: ../libedataserver/e-client.c:147 - msgid "Authentication required" - msgstr "Authentification requise" -@@ -1594,17 +1598,17 @@ - msgid "Invalid range" - msgstr "Plage non valide" - --#: ../calendar/libecal/e-cal-client.c:936 -+#: ../calendar/libecal/e-cal-client.c:970 - #, c-format - msgid "Unknown calendar property '%s'" - msgstr "Propriété d'agenda « %s » inconnue" - --#: ../calendar/libecal/e-cal-client.c:951 -+#: ../calendar/libecal/e-cal-client.c:985 - #, c-format - msgid "Cannot change value of calendar property '%s'" - msgstr "Impossible de changer la valeur de la propriété d'agenda « %s »" - --#: ../calendar/libecal/e-cal-component.c:1348 -+#: ../calendar/libecal/e-cal-component.c:1349 - msgid "Untitled appointment" - msgstr "Rendez-vous sans titre" - -@@ -1753,83 +1757,83 @@ - msgid "Undefined" - msgstr "Indéfinie" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:84 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1062 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1371 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1498 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1547 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:85 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1063 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1379 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1506 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1555 - #, c-format - msgid "\"%s\" expects one argument" - msgstr "« %s » requiert un argument" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:91 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:673 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1378 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:92 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:674 - #: ../calendar/libedata-cal/e-cal-backend-sexp.c:1386 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1394 - #, c-format - msgid "\"%s\" expects the first argument to be a string" - msgstr "« %s » requiert une chaîne comme premier argument" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:166 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:167 - #, c-format - msgid "\"%s\" expects two or three arguments" - msgstr "« %s » requiert deux ou trois arguments" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:173 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:262 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:324 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:823 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1069 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1447 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1505 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1554 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:174 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:263 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:325 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:824 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1070 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1455 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1513 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1562 - #, c-format - msgid "\"%s\" expects the first argument to be a time_t" - msgstr "« %s » requiert un time_t comme premier argument" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:182 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:270 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:334 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:832 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:183 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:271 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:335 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:833 - #, c-format - msgid "\"%s\" expects the second argument to be a time_t" - msgstr "« %s » requiert un time_t comme second argument" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:192 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:193 - #, c-format - msgid "\"%s\" expects the third argument to be a string" - msgstr "« %s » requiert une chaîne comme troisième argument" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:254 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:255 - #, c-format - msgid "\"%s\" expects none or two arguments" - msgstr "« %s » requiert aucun ou deux arguments" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:317 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:666 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:816 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1440 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:318 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:667 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:817 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1448 - #, c-format - msgid "\"%s\" expects two arguments" - msgstr "« %s » requiert deux arguments" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:602 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:625 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:748 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:780 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:987 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1020 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1332 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:603 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:626 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:749 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:781 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:988 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1021 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1340 - #, c-format - msgid "\"%s\" expects no arguments" - msgstr "« %s » ne requiert pas d'argument" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:682 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:683 - #, c-format - msgid "\"%s\" expects the second argument to be a string" - msgstr "« %s » requiert une chaîne comme second argument" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:713 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:714 - #, c-format - msgid "" - "\"%s\" expects the first argument to be either \"any\", \"summary\", or " -@@ -1840,12 +1844,12 @@ - "« description », « location », « attendee », « organizer » ou " - "« classification »" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:884 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:885 - #, c-format - msgid "\"%s\" expects at least one argument" - msgstr "« %s » requiert au moins un argument" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:899 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:900 - #, c-format - msgid "" - "\"%s\" expects all arguments to be strings or one and only one argument to " -@@ -1854,14 +1858,14 @@ - "« %s » requiert tous les arguments comme chaîne ou seulement un argument " - "comme booléen faux (#f)" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1395 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1403 - #, c-format - msgid "\"%s\" expects the first argument to be an ISO 8601 date/time string" - msgstr "" - "« %s » requiert une chaîne au format date/heure ISO 8601 comme premier " - "argument" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1456 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1464 - #, c-format - msgid "\"%s\" expects the second argument to be an integer" - msgstr "« %s » requiert un nombre entier comme second argument" -@@ -2105,37 +2109,38 @@ - msgstr[0] "Filtrage du nouveau message dans « %s »" - msgstr[1] "Filtrage des nouveaux messages dans « %s »" - --#: ../camel/camel-folder.c:1011 -+#: ../camel/camel-folder.c:1017 - #: ../camel/providers/local/camel-maildir-folder.c:330 - msgid "Moving messages" - msgstr "Déplacement des messages" - --#: ../camel/camel-folder.c:1014 -+#: ../camel/camel-folder.c:1020 - msgid "Copying messages" - msgstr "Copie des messages" - --#: ../camel/camel-folder.c:1056 -+#: ../camel/camel-folder.c:1062 - #, c-format - msgid "Quota information not supported for folder '%s'" - msgstr "" --"Les informations de quota ne sont pas prises en charge pour le dossier « %s »" -+"Les informations de quota ne sont pas prises en charge pour le dossier " -+"« %s »" - --#: ../camel/camel-folder.c:2862 -+#: ../camel/camel-folder.c:2868 - #, c-format - msgid "Expunging folder '%s'" - msgstr "Nettoyage du dossier « %s »" - --#: ../camel/camel-folder.c:2990 -+#: ../camel/camel-folder.c:2996 - #, c-format - msgid "Retrieving message '%s' in %s" - msgstr "Récupération du message « %s » dans %s" - --#: ../camel/camel-folder.c:3181 -+#: ../camel/camel-folder.c:3187 - #, c-format - msgid "Retrieving quota information for '%s'" - msgstr "Récupération des informations de quota pour « %s »" - --#: ../camel/camel-folder.c:3478 -+#: ../camel/camel-folder.c:3484 - #, c-format - msgid "Refreshing folder '%s'" - msgstr "Actualisation du dossier « %s »" -@@ -2172,78 +2177,70 @@ - - #: ../camel/camel-folder-search.c:1943 ../camel/camel-folder-search.c:2109 - #, c-format --msgid "" --"Cannot parse search expression: %s:\n" -+msgid "Cannot parse search expression: %s:\n" - "%s" --msgstr "" --"Impossible d'analyser l'expression de recherche : %s :\n" -+msgstr "Impossible d'analyser l'expression de recherche : %s :\n" - "%s" - - #: ../camel/camel-folder-search.c:1955 ../camel/camel-folder-search.c:2121 - #, c-format --msgid "" --"Error executing search expression: %s:\n" -+msgid "Error executing search expression: %s:\n" - "%s" --msgstr "" --"Erreur lors de l'exécution de l'expression de recherche : %s :\n" -+msgstr "Erreur lors de l'exécution de l'expression de recherche : %s :\n" - "%s" - --#: ../camel/camel-gpg-context.c:721 ../camel/camel-gpg-context.c:726 --#: ../camel/camel-gpg-context.c:1383 -+#: ../camel/camel-gpg-context.c:725 ../camel/camel-gpg-context.c:730 -+#: ../camel/camel-gpg-context.c:1387 - #, c-format - msgid "Failed to execute gpg: %s" - msgstr "Le lancement de GPG a échoué : %s" - --#: ../camel/camel-gpg-context.c:726 --#: ../camel/providers/smtp/camel-smtp-transport.c:924 -+#: ../camel/camel-gpg-context.c:730 -+#: ../camel/providers/smtp/camel-smtp-transport.c:963 - msgid "Unknown" - msgstr "Inconnu" - --#: ../camel/camel-gpg-context.c:791 -+#: ../camel/camel-gpg-context.c:795 - #, c-format --msgid "" --"Unexpected GnuPG status message encountered:\n" -+msgid "Unexpected GnuPG status message encountered:\n" - "\n" - "%s" --msgstr "" --"Message de statut GnuPG inattendu rencontré : \n" -+msgstr "Message de statut GnuPG inattendu rencontré : \n" - "\n" - "%s" - --#: ../camel/camel-gpg-context.c:827 -+#: ../camel/camel-gpg-context.c:831 - #, c-format - msgid "Failed to parse gpg userid hint." - msgstr "L'analyse de l'indication ID d'utilisateur de GPG a échoué." - --#: ../camel/camel-gpg-context.c:852 ../camel/camel-gpg-context.c:867 -+#: ../camel/camel-gpg-context.c:856 ../camel/camel-gpg-context.c:871 - #, c-format - msgid "Failed to parse gpg passphrase request." - msgstr "L'analyse de la requête de mot de passe de GPG a échoué." - --#: ../camel/camel-gpg-context.c:888 -+#: ../camel/camel-gpg-context.c:892 - #, c-format --msgid "" --"You need a PIN to unlock the key for your\n" -+msgid "You need a PIN to unlock the key for your\n" - "SmartCard: \"%s\"" - msgstr "" - "Vous avez besoin d'un numéro d'identification personnel (PIN) pour\n" - "débloquer la clé pour votre SmartCard : « %s »" - --#: ../camel/camel-gpg-context.c:892 -+#: ../camel/camel-gpg-context.c:896 - #, c-format --msgid "" --"You need a passphrase to unlock the key for\n" -+msgid "You need a passphrase to unlock the key for\n" - "user: \"%s\"" - msgstr "" - "Vous avez besoin d'un mot de passe pour\n" - "débloquer la clé de l'utilisateur : « %s »" - --#: ../camel/camel-gpg-context.c:898 -+#: ../camel/camel-gpg-context.c:902 - #, c-format - msgid "Unexpected request from GnuPG for '%s'" - msgstr "Requête inattendue de GnuPG pour « %s »" - --#: ../camel/camel-gpg-context.c:910 -+#: ../camel/camel-gpg-context.c:914 - msgid "" - "Note the encrypted content doesn't contain information about a recipient, " - "thus there will be a password prompt for each of stored private key." -@@ -2252,41 +2249,41 @@ - "destinataire, par conséquent un mot de passe sera demandé pour chaque clé " - "privée enregistrée." - --#: ../camel/camel-gpg-context.c:941 ../camel/camel-net-utils.c:524 -+#: ../camel/camel-gpg-context.c:945 ../camel/camel-net-utils.c:524 - #: ../camel/providers/nntp/camel-nntp-summary.c:401 - #: ../libedataserver/e-client.c:158 - #, c-format - msgid "Cancelled" - msgstr "Annulé" - --#: ../camel/camel-gpg-context.c:962 -+#: ../camel/camel-gpg-context.c:966 - #, c-format - msgid "Failed to unlock secret key: 3 bad passphrases given." - msgstr "" - "Le déblocage de la clé secrète a échoué : 3 mots de passe incorrects ont été " - "saisis." - --#: ../camel/camel-gpg-context.c:975 -+#: ../camel/camel-gpg-context.c:979 - #, c-format - msgid "Unexpected response from GnuPG: %s" - msgstr "Réponse inattendue de GnuPG : %s" - --#: ../camel/camel-gpg-context.c:1106 -+#: ../camel/camel-gpg-context.c:1110 - #, c-format - msgid "Failed to encrypt: No valid recipients specified." - msgstr "Le chiffrement a échoué : aucun destinataire valide renseigné." - --#: ../camel/camel-gpg-context.c:1658 ../camel/camel-smime-context.c:844 -+#: ../camel/camel-gpg-context.c:1662 ../camel/camel-smime-context.c:844 - msgid "Could not generate signing data: " - msgstr "Impossible de générer les données signées : " - --#: ../camel/camel-gpg-context.c:1708 ../camel/camel-gpg-context.c:1920 --#: ../camel/camel-gpg-context.c:2030 ../camel/camel-gpg-context.c:2179 -+#: ../camel/camel-gpg-context.c:1712 ../camel/camel-gpg-context.c:1924 -+#: ../camel/camel-gpg-context.c:2034 ../camel/camel-gpg-context.c:2183 - msgid "Failed to execute gpg." - msgstr "Le lancement de GPG a échoué." - --#: ../camel/camel-gpg-context.c:1791 ../camel/camel-gpg-context.c:1799 --#: ../camel/camel-gpg-context.c:1807 ../camel/camel-gpg-context.c:1827 -+#: ../camel/camel-gpg-context.c:1795 ../camel/camel-gpg-context.c:1803 -+#: ../camel/camel-gpg-context.c:1811 ../camel/camel-gpg-context.c:1831 - #: ../camel/camel-smime-context.c:973 ../camel/camel-smime-context.c:987 - #: ../camel/camel-smime-context.c:996 - #, c-format -@@ -2295,31 +2292,31 @@ - "Impossible de vérifier la signature de ce message : format de message " - "incorrect" - --#: ../camel/camel-gpg-context.c:1873 -+#: ../camel/camel-gpg-context.c:1877 - msgid "Cannot verify message signature: " - msgstr "Impossible de vérifier la signature du message : " - --#: ../camel/camel-gpg-context.c:1996 -+#: ../camel/camel-gpg-context.c:2000 - msgid "Could not generate encrypting data: " - msgstr "Impossible de générer des données chiffrées : " - --#: ../camel/camel-gpg-context.c:2049 -+#: ../camel/camel-gpg-context.c:2053 - msgid "This is a digitally encrypted message part" - msgstr "Ceci est une partie de message numériquement signée" - --#: ../camel/camel-gpg-context.c:2105 ../camel/camel-gpg-context.c:2114 --#: ../camel/camel-gpg-context.c:2137 -+#: ../camel/camel-gpg-context.c:2109 ../camel/camel-gpg-context.c:2118 -+#: ../camel/camel-gpg-context.c:2141 - #, c-format - msgid "Cannot decrypt message: Incorrect message format" - msgstr "" - "Impossible de déchiffrer le message : le format du message est incorrect" - --#: ../camel/camel-gpg-context.c:2125 -+#: ../camel/camel-gpg-context.c:2129 - #, c-format - msgid "Failed to decrypt MIME part: protocol error" - msgstr "Le déchiffrement de la partie MIME a échoué : erreur de protocole" - --#: ../camel/camel-gpg-context.c:2220 ../camel/camel-smime-context.c:1289 -+#: ../camel/camel-gpg-context.c:2224 ../camel/camel-smime-context.c:1289 - msgid "Encrypted content" - msgstr "Contenu chiffré" - -@@ -2498,7 +2495,8 @@ - #: ../camel/camel-provider.c:279 - #, c-format - msgid "Could not load %s: No initialization code in module." --msgstr "Impossible de charger %s : aucun code d'initialisation dans le module." -+msgstr "" -+"Impossible de charger %s : aucun code d'initialisation dans le module." - - #: ../camel/camel-provider.c:427 ../camel/camel-session.c:424 - #, c-format -@@ -2523,29 +2521,23 @@ - - #: ../camel/camel-sasl-anonymous.c:79 - #, c-format --msgid "" --"Invalid email address trace information:\n" -+msgid "Invalid email address trace information:\n" - "%s" --msgstr "" --"Trace d'une adresse électronique non valide :\n" -+msgstr "Trace d'une adresse électronique non valide :\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:93 - #, c-format --msgid "" --"Invalid opaque trace information:\n" -+msgid "Invalid opaque trace information:\n" - "%s" --msgstr "" --"Information de trace opaque non valide :\n" -+msgstr "Information de trace opaque non valide :\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:107 - #, c-format --msgid "" --"Invalid trace information:\n" -+msgid "Invalid trace information:\n" - "%s" --msgstr "" --"Information de trace non valide :\n" -+msgstr "Information de trace non valide :\n" - "%s" - - #: ../camel/camel-sasl-cram-md5.c:44 -@@ -2596,7 +2588,8 @@ - #: ../camel/camel-sasl-digest-md5.c:928 - #, c-format - msgid "Server response contained incomplete authorization data" --msgstr "La réponse du serveur contenait des données d'autorisation incomplètes" -+msgstr "" -+"La réponse du serveur contenait des données d'autorisation incomplètes" - - #: ../camel/camel-sasl-digest-md5.c:941 - #, c-format -@@ -2608,7 +2601,8 @@ - msgstr "GSSAPI" - - #: ../camel/camel-sasl-gssapi.c:97 --msgid "This option will connect to the server using Kerberos 5 authentication." -+msgid "" -+"This option will connect to the server using Kerberos 5 authentication." - msgstr "" - "Cette option utilisera une authentification Kerberos 5 pour se connecter au " - "serveur." -@@ -2683,7 +2677,7 @@ - - #: ../camel/camel-sasl-gssapi.c:223 ../camel/camel-sasl-gssapi.c:405 - #: ../camel/camel-sasl-gssapi.c:454 ../camel/camel-sasl-gssapi.c:471 --#: ../camel/providers/smtp/camel-smtp-transport.c:622 -+#: ../camel/providers/smtp/camel-smtp-transport.c:659 - #, c-format - msgid "Bad authentication response from server." - msgstr "Mauvaise réponse d'authentification en provenance du serveur." -@@ -2756,10 +2750,10 @@ - msgstr "GType non valide enregistré pour le protocole « %s »" - - #: ../camel/camel-session.c:502 --#: ../camel/providers/imapx/camel-imapx-server.c:4734 -+#: ../camel/providers/imapx/camel-imapx-server.c:4821 - #: ../camel/providers/pop3/camel-pop3-store.c:311 --#: ../camel/providers/pop3/camel-pop3-store.c:757 --#: ../camel/providers/smtp/camel-smtp-transport.c:515 -+#: ../camel/providers/pop3/camel-pop3-store.c:766 -+#: ../camel/providers/smtp/camel-smtp-transport.c:545 - #, c-format - msgid "No support for %s authentication" - msgstr "Aucun support pour l'authentification %s" -@@ -2967,49 +2961,53 @@ - msgid "S/MIME Decrypt: No encrypted content found" - msgstr "Déchiffrement S/MIME : aucun contenu chiffré trouvé" - --#: ../camel/camel-store.c:1232 -+#: ../camel/camel-store.c:1238 - #, c-format - msgid "Opening folder '%s'" - msgstr "Ouverture du dossier « %s »" - --#: ../camel/camel-store.c:1523 -+#: ../camel/camel-store.c:1529 - #, c-format - msgid "Scanning folders in '%s'" - msgstr "Examen des dossiers dans « %s »" - --#: ../camel/camel-store.c:1551 ../camel/camel-store.c:1596 -+#: ../camel/camel-store.c:1557 ../camel/camel-store.c:1602 - #: ../camel/camel-vtrash-folder.c:46 - msgid "Trash" - msgstr "Corbeille" - --#: ../camel/camel-store.c:1565 ../camel/camel-store.c:1613 -+#: ../camel/camel-store.c:1571 ../camel/camel-store.c:1619 - #: ../camel/camel-vtrash-folder.c:48 - msgid "Junk" - msgstr "Pourriels" - --#: ../camel/camel-store.c:2214 -+#: ../camel/camel-store.c:2220 - #, c-format - msgid "Cannot create folder: %s: folder exists" - msgstr "Impossible de créer le dossier : %s : le dossier existe" - --#: ../camel/camel-store.c:2221 -+#: ../camel/camel-store.c:2227 - #, c-format - msgid "Creating folder '%s'" - msgstr "Création du dossier « %s »" - --#: ../camel/camel-store.c:2398 ../camel/camel-vee-store.c:410 --#: ../camel/providers/local/camel-maildir-store.c:321 -+#: ../camel/camel-store.c:2404 ../camel/camel-vee-store.c:410 -+#: ../camel/providers/local/camel-maildir-store.c:346 - #, c-format - msgid "Cannot delete folder: %s: Invalid operation" - msgstr "Impossible de supprimer le dossier : %s : opération non valide" - --#: ../camel/camel-store.c:2588 ../camel/camel-vee-store.c:461 --#: ../camel/providers/local/camel-maildir-store.c:872 -+#: ../camel/camel-store.c:2594 ../camel/camel-vee-store.c:461 -+#: ../camel/providers/local/camel-maildir-store.c:914 - #, c-format - msgid "Cannot rename folder: %s: Invalid operation" - msgstr "Impossible de renommer le dossier : %s : opération non valide" - --#: ../camel/camel-stream.c:285 ../camel/camel-stream.c:336 -+#: ../camel/camel-stream.c:170 -+msgid "Cannot write with no base stream" -+msgstr "Impossible d'effectuer une écriture sans flux de base" -+ -+#: ../camel/camel-stream.c:290 ../camel/camel-stream.c:341 - #, c-format - msgid "Stream type '%s' is not seekable" - msgstr "Impossible de se déplacer dans le type de flux « %s »" -@@ -3017,7 +3015,8 @@ - #: ../camel/camel-stream-filter.c:344 - msgid "Only reset to beginning is supported with CamelStreamFilter" - msgstr "" --"Seule la réinitialisation au début est prise en charge avec CamelStreamFilter" -+"Seule la réinitialisation au début est prise en charge avec " -+"CamelStreamFilter" - - #: ../camel/camel-stream-null.c:76 - msgid "Only reset to beginning is supported with CamelHttpStream" -@@ -3240,229 +3239,230 @@ - msgid "For reading and storing mail on IMAP servers." - msgstr "Pour lire et stocker les courriels sur des serveurs IMAP." - --#: ../camel/providers/imapx/camel-imapx-server.c:1009 - #: ../camel/providers/imapx/camel-imapx-server.c:1016 -+#: ../camel/providers/imapx/camel-imapx-server.c:1023 - #, c-format - msgid "Not authenticated" - msgstr "Non authentifié" - --#: ../camel/providers/imapx/camel-imapx-server.c:1713 -+#: ../camel/providers/imapx/camel-imapx-server.c:1751 - msgid "Server disconnected" - msgstr "Serveur déconnecté" - --#: ../camel/providers/imapx/camel-imapx-server.c:2205 -+#: ../camel/providers/imapx/camel-imapx-server.c:2252 - msgid "Error writing to cache stream" - msgstr "Erreur d'écriture dans le flux du cache" - --#: ../camel/providers/imapx/camel-imapx-server.c:3565 -+#: ../camel/providers/imapx/camel-imapx-server.c:3640 - msgid "Error performing IDLE" - msgstr "Erreur lors de la réalisation de IDLE" - --#: ../camel/providers/imapx/camel-imapx-server.c:4573 -+#: ../camel/providers/imapx/camel-imapx-server.c:4660 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: %s" - msgstr "La connexion au serveur IMAP %s en mode sécurisé a échoué : %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:4574 --#: ../camel/providers/smtp/camel-smtp-transport.c:215 -+#: ../camel/providers/imapx/camel-imapx-server.c:4661 -+#: ../camel/providers/smtp/camel-smtp-transport.c:216 - msgid "STARTTLS not supported" - msgstr "STARTTLS non pris en charge" - --#: ../camel/providers/imapx/camel-imapx-server.c:4634 -+#: ../camel/providers/imapx/camel-imapx-server.c:4721 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: " - msgstr "La connexion au serveur IMAP %s en mode sécurisé a échoué : " - --#: ../camel/providers/imapx/camel-imapx-server.c:4723 -+#: ../camel/providers/imapx/camel-imapx-server.c:4810 - #, c-format - msgid "IMAP server %s does not support %s authentication" - msgstr "Le serveur IMAP %s ne prend pas en charge l'authentification %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:4753 -+#: ../camel/providers/imapx/camel-imapx-server.c:4840 - #: ../camel/providers/nntp/camel-nntp-store.c:394 - #: ../camel/providers/nntp/camel-nntp-store.c:531 - msgid "Cannot authenticate without a username" - msgstr "Impossible de s'authentifier sans nom d'utilisateur" - --#: ../camel/providers/imapx/camel-imapx-server.c:4762 -+#: ../camel/providers/imapx/camel-imapx-server.c:4849 - #: ../camel/providers/nntp/camel-nntp-store.c:540 - #: ../camel/providers/pop3/camel-pop3-store.c:678 --#: ../camel/providers/pop3/camel-pop3-store.c:699 -+#: ../camel/providers/pop3/camel-pop3-store.c:708 - msgid "Authentication password not available" - msgstr "Mot de passe d'authentification non disponible" - --#: ../camel/providers/imapx/camel-imapx-server.c:4998 --#: ../camel/providers/imapx/camel-imapx-server.c:5057 -+#: ../camel/providers/imapx/camel-imapx-server.c:5085 -+#: ../camel/providers/imapx/camel-imapx-server.c:5144 - msgid "Error fetching message" - msgstr "Erreur lors de la récupération du message" - --#: ../camel/providers/imapx/camel-imapx-server.c:5050 -+#: ../camel/providers/imapx/camel-imapx-server.c:5137 - msgid "Failed to close the tmp stream" - msgstr "La fermeture du flux temporaire a échoué" - --#: ../camel/providers/imapx/camel-imapx-server.c:5086 -+#: ../camel/providers/imapx/camel-imapx-server.c:5173 - msgid "Failed to copy the tmp file" - msgstr "La copie du fichier temporaire a échoué" - --#: ../camel/providers/imapx/camel-imapx-server.c:5227 -+#: ../camel/providers/imapx/camel-imapx-server.c:5345 - msgid "Error moving messages" - msgstr "Erreur lors du déplacement des messages" - --#: ../camel/providers/imapx/camel-imapx-server.c:5231 -+#: ../camel/providers/imapx/camel-imapx-server.c:5349 - msgid "Error copying messages" - msgstr "Erreur lors de la copie des messages" - --#: ../camel/providers/imapx/camel-imapx-server.c:5453 -+#: ../camel/providers/imapx/camel-imapx-server.c:5579 - msgid "Error appending message" - msgstr "Erreur lors de l'ajout du message" - --#: ../camel/providers/imapx/camel-imapx-server.c:5689 -+#: ../camel/providers/imapx/camel-imapx-server.c:5815 - msgid "Error fetching message headers" - msgstr "Erreur lors de la récupération des en-têtes de message" - --#: ../camel/providers/imapx/camel-imapx-server.c:5856 -+#: ../camel/providers/imapx/camel-imapx-server.c:5982 - msgid "Error retrieving message" - msgstr "Erreur lors de la récupération du message" - --#: ../camel/providers/imapx/camel-imapx-server.c:5990 --#: ../camel/providers/imapx/camel-imapx-server.c:6219 -+#: ../camel/providers/imapx/camel-imapx-server.c:6116 -+#: ../camel/providers/imapx/camel-imapx-server.c:6345 - #, c-format - msgid "Fetching summary information for new messages in '%s'" - msgstr "" - "Récupération des informations de résumé des nouveaux messages dans « %s »" - --#: ../camel/providers/imapx/camel-imapx-server.c:6042 -+#: ../camel/providers/imapx/camel-imapx-server.c:6168 - #, c-format - msgid "Scanning for changed messages in '%s'" - msgstr "Examen des messages modifiés dans « %s »" - --#: ../camel/providers/imapx/camel-imapx-server.c:6094 -+#: ../camel/providers/imapx/camel-imapx-server.c:6220 - msgid "Error fetching new messages" - msgstr "Erreur lors de la récupération des nouveaux messages" - --#: ../camel/providers/imapx/camel-imapx-server.c:6367 -+#: ../camel/providers/imapx/camel-imapx-server.c:6493 - msgid "Error refreshing folder" - msgstr "Erreur lors du rafraîchissement du dossier" - --#: ../camel/providers/imapx/camel-imapx-server.c:6517 -+#: ../camel/providers/imapx/camel-imapx-server.c:6643 - msgid "Error expunging message" - msgstr "Erreur lors de la purge du message" - --#: ../camel/providers/imapx/camel-imapx-server.c:6632 --#: ../camel/providers/imapx/camel-imapx-server.c:6657 -+#: ../camel/providers/imapx/camel-imapx-server.c:6758 -+#: ../camel/providers/imapx/camel-imapx-server.c:6783 - msgid "Error fetching folders" - msgstr "Erreur lors de la récupération des dossiers" - --#: ../camel/providers/imapx/camel-imapx-server.c:6737 -+#: ../camel/providers/imapx/camel-imapx-server.c:6863 - msgid "Error creating folder" - msgstr "Erreur lors de la création du dossier" - --#: ../camel/providers/imapx/camel-imapx-server.c:6789 -+#: ../camel/providers/imapx/camel-imapx-server.c:6915 - msgid "Error deleting folder" - msgstr "Erreur lors de la suppression du dossier" - --#: ../camel/providers/imapx/camel-imapx-server.c:6865 -+#: ../camel/providers/imapx/camel-imapx-server.c:6991 - msgid "Error renaming folder" - msgstr "Erreur lors du renommage du dossier" - --#: ../camel/providers/imapx/camel-imapx-server.c:6939 -+#: ../camel/providers/imapx/camel-imapx-server.c:7065 - msgid "Error subscribing to folder" - msgstr "Erreur lors de l'abonnement au dossier" - --#: ../camel/providers/imapx/camel-imapx-server.c:7005 -+#: ../camel/providers/imapx/camel-imapx-server.c:7131 - msgid "Error unsubscribing from folder" - msgstr "Erreur lors du désabonnement au dossier" - --#: ../camel/providers/imapx/camel-imapx-server.c:7067 -+#: ../camel/providers/imapx/camel-imapx-server.c:7193 - msgid "Error retrieving quota information" - msgstr "Erreur durant la récupération des informations de quota" - --#: ../camel/providers/imapx/camel-imapx-server.c:7119 -+#: ../camel/providers/imapx/camel-imapx-server.c:7245 - msgid "Search failed" - msgstr "La recherche a échoué" - --#: ../camel/providers/imapx/camel-imapx-server.c:7181 -+#: ../camel/providers/imapx/camel-imapx-server.c:7307 - msgid "Error performing NOOP" - msgstr "Erreur lors de la réalisation de NOOP" - --#: ../camel/providers/imapx/camel-imapx-server.c:7288 -+#: ../camel/providers/imapx/camel-imapx-server.c:7414 - msgid "Error syncing changes" - msgstr "Erreur lors de la synchronisation des modifications" - --#: ../camel/providers/imapx/camel-imapx-server.c:8275 -+#: ../camel/providers/imapx/camel-imapx-server.c:8446 - #, c-format - msgid "Cannot get message with message ID %s: %s" - msgstr "Impossible d'obtenir le message qui a pour identificateur « %s » : %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:8276 -+#: ../camel/providers/imapx/camel-imapx-server.c:8447 - msgid "No such message available." - msgstr "Aucun message correspondant." - --#: ../camel/providers/imapx/camel-imapx-server.c:8483 --#: ../camel/providers/imapx/camel-imapx-server.c:8504 -+#: ../camel/providers/imapx/camel-imapx-server.c:8671 -+#: ../camel/providers/imapx/camel-imapx-server.c:8692 - msgid "Cannot create spool file: " - msgstr "Impossible de créer le fichier tampon : " - --#: ../camel/providers/imapx/camel-imapx-server.c:9256 -+#: ../camel/providers/imapx/camel-imapx-server.c:9502 - msgid "IMAP server does not support quotas" - msgstr "Le serveur IMAP ne prend pas en charge les quotas" - - #. create a dummy "." parent inbox, use to scan, then put back at the top level - #: ../camel/providers/imapx/camel-imapx-store.c:223 - #: ../camel/providers/local/camel-maildir-folder.c:482 --#: ../camel/providers/local/camel-maildir-store.c:322 --#: ../camel/providers/local/camel-maildir-store.c:784 --#: ../camel/providers/local/camel-maildir-store.c:790 --#: ../camel/providers/local/camel-maildir-store.c:873 -+#: ../camel/providers/local/camel-maildir-store.c:347 -+#: ../camel/providers/local/camel-maildir-store.c:826 -+#: ../camel/providers/local/camel-maildir-store.c:832 -+#: ../camel/providers/local/camel-maildir-store.c:915 - #: ../camel/providers/local/camel-spool-store.c:393 - msgid "Inbox" - msgstr "Boîte de réception" - --#: ../camel/providers/imapx/camel-imapx-store.c:758 -+#: ../camel/providers/imapx/camel-imapx-store.c:757 - #, c-format - msgid "IMAP server %s" - msgstr "Serveur IMAP %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:761 -+#: ../camel/providers/imapx/camel-imapx-store.c:760 - #, c-format - msgid "IMAP service for %s on %s" - msgstr "Service IMAP pour %s sur %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:836 -+#: ../camel/providers/imapx/camel-imapx-store.c:835 - #: ../camel/providers/nntp/camel-nntp-provider.c:93 - #: ../camel/providers/pop3/camel-pop3-provider.c:81 - msgid "Password" - msgstr "Mot de passe" - --#: ../camel/providers/imapx/camel-imapx-store.c:838 --msgid "This option will connect to the IMAP server using a plaintext password." -+#: ../camel/providers/imapx/camel-imapx-store.c:837 -+msgid "" -+"This option will connect to the IMAP server using a plaintext password." - msgstr "" - "Cette option utilisera un mot de passe en clair pour se connecter au serveur " - "IMAP." - --#: ../camel/providers/imapx/camel-imapx-store.c:913 -+#: ../camel/providers/imapx/camel-imapx-store.c:916 - #, c-format - msgid "No such folder %s" - msgstr "Pas de dossier « %s »" - --#: ../camel/providers/imapx/camel-imapx-store.c:1324 -+#: ../camel/providers/imapx/camel-imapx-store.c:1344 - #, c-format - msgid "No IMAP namespace for folder path '%s'" - msgstr "Aucun espace de noms IMAP pour le chemin de dossier « %s »" - --#: ../camel/providers/imapx/camel-imapx-store.c:1472 -+#: ../camel/providers/imapx/camel-imapx-store.c:1609 - #, c-format - msgid "Retrieving folder list for %s" - msgstr "Récupération de la liste des dossiers pour %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:1924 -+#: ../camel/providers/imapx/camel-imapx-store.c:2061 - #, c-format --msgid "" --"The folder name \"%s\" is invalid because it contains the character \"%c\"" -+msgid "The folder name \"%s\" is invalid because it contains the character \"%c\"" - msgstr "" --"Le nom de dossier « %s » n'est pas valide car il contient le caractère « %c »" -+"Le nom de dossier « %s » n'est pas valide car il contient le caractère " -+"« %c »" - --#: ../camel/providers/imapx/camel-imapx-store.c:2689 -+#: ../camel/providers/imapx/camel-imapx-store.c:2833 - #: ../camel/providers/nntp/camel-nntp-store.c:1250 - #: ../camel/providers/pop3/camel-pop3-folder.c:450 - #: ../camel/providers/pop3/camel-pop3-folder.c:593 -@@ -3472,7 +3472,7 @@ - #: ../camel/providers/pop3/camel-pop3-store.c:528 - #: ../camel/providers/pop3/camel-pop3-store.c:576 - #: ../camel/providers/pop3/camel-pop3-store.c:668 --#: ../camel/providers/pop3/camel-pop3-store.c:1072 -+#: ../camel/providers/pop3/camel-pop3-store.c:1081 - #, c-format - msgid "You must be working online to complete this operation" - msgstr "Vous devez travailler en ligne pour terminer cette opération" -@@ -3499,11 +3499,9 @@ - - #: ../camel/providers/local/camel-local-folder.c:730 - #, c-format --msgid "" --"Cannot get message %s from folder %s\n" -+msgid "Cannot get message %s from folder %s\n" - "%s" --msgstr "" --"Impossible d'obtenir le message %s du dossier %s\n" -+msgstr "Impossible d'obtenir le message %s du dossier %s\n" - "%s" - - #: ../camel/providers/local/camel-local-provider.c:41 -@@ -3542,7 +3540,8 @@ - - #: ../camel/providers/local/camel-local-provider.c:89 - msgid "For storing local mail in maildir directories." --msgstr "Pour stocker le courriel local dans des répertoires au format Maildir." -+msgstr "" -+"Pour stocker le courriel local dans des répertoires au format Maildir." - - #: ../camel/providers/local/camel-local-provider.c:102 - msgid "_Store status headers in Elm/Pine/Mutt format" -@@ -3579,7 +3578,7 @@ - - #: ../camel/providers/local/camel-local-store.c:221 - #: ../camel/providers/local/camel-local-store.c:381 --#: ../camel/providers/local/camel-maildir-store.c:122 -+#: ../camel/providers/local/camel-maildir-store.c:123 - #: ../camel/providers/local/camel-mbox-store.c:572 - #: ../camel/providers/local/camel-spool-store.c:87 - #, c-format -@@ -3594,7 +3593,7 @@ - #: ../camel/providers/local/camel-local-store.c:242 - #: ../camel/providers/local/camel-local-store.c:252 - #: ../camel/providers/local/camel-local-store.c:394 --#: ../camel/providers/local/camel-maildir-store.c:156 -+#: ../camel/providers/local/camel-maildir-store.c:165 - #, c-format - msgid "Cannot get folder: %s: %s" - msgstr "Impossible d'obtenir le dossier : %s : %s" -@@ -3616,7 +3615,7 @@ - msgid "Could not delete folder meta file '%s': %s" - msgstr "Impossible de supprimer le méta fichier du dossier « %s » : %s" - --#: ../camel/providers/local/camel-local-store.c:594 -+#: ../camel/providers/local/camel-local-store.c:595 - #, c-format - msgid "Could not rename '%s': %s" - msgstr "Impossible de renommer « %s » : %s" -@@ -3649,54 +3648,60 @@ - msgstr "" - "Impossible de transférer le message dans le dossier de destination : %s" - --#: ../camel/providers/local/camel-maildir-store.c:130 --#: ../camel/providers/local/camel-maildir-store.c:149 --#: ../camel/providers/local/camel-maildir-store.c:881 -+#: ../camel/providers/local/camel-maildir-store.c:131 -+#: ../camel/providers/local/camel-maildir-store.c:931 -+#, c-format -+msgid "Cannot create folder containing '%s'" -+msgstr "Impossible de créer un dossier contenant « %s »" -+ -+#: ../camel/providers/local/camel-maildir-store.c:139 -+#: ../camel/providers/local/camel-maildir-store.c:158 -+#: ../camel/providers/local/camel-maildir-store.c:923 - #, c-format - msgid "Folder %s already exists" - msgstr "Le dossier %s existe déjà" - --#: ../camel/providers/local/camel-maildir-store.c:241 --#: ../camel/providers/local/camel-maildir-store.c:272 -+#: ../camel/providers/local/camel-maildir-store.c:266 -+#: ../camel/providers/local/camel-maildir-store.c:297 - #: ../camel/providers/local/camel-mbox-store.c:401 - #: ../camel/providers/local/camel-mbox-store.c:422 - #, c-format - msgid "Cannot create folder '%s': %s" - msgstr "Impossible de créer le dossier « %s » : %s" - --#: ../camel/providers/local/camel-maildir-store.c:256 -+#: ../camel/providers/local/camel-maildir-store.c:281 - #: ../camel/providers/local/camel-mbox-store.c:367 - #: ../camel/providers/local/camel-mh-store.c:523 - #, c-format - msgid "Cannot get folder '%s': %s" - msgstr "Impossible d'obtenir le dossier « %s » : %s" - --#: ../camel/providers/local/camel-maildir-store.c:262 -+#: ../camel/providers/local/camel-maildir-store.c:287 - #: ../camel/providers/local/camel-mbox-store.c:377 - #: ../camel/providers/local/camel-mh-store.c:532 - #, c-format - msgid "Cannot get folder '%s': folder does not exist." - msgstr "Impossible d'obtenir le dossier « %s » : le dossier n'existe pas." - --#: ../camel/providers/local/camel-maildir-store.c:289 -+#: ../camel/providers/local/camel-maildir-store.c:314 - #, c-format - msgid "Cannot get folder '%s': not a maildir directory." - msgstr "" - "Impossible d'obtenir le dossier « %s » : ce n'est pas un répertoire Maildir." - --#: ../camel/providers/local/camel-maildir-store.c:353 --#: ../camel/providers/local/camel-maildir-store.c:393 -+#: ../camel/providers/local/camel-maildir-store.c:378 -+#: ../camel/providers/local/camel-maildir-store.c:418 - #: ../camel/providers/local/camel-mh-store.c:676 - #, c-format - msgid "Could not delete folder '%s': %s" - msgstr "Impossible de supprimer le dossier « %s » : %s" - --#: ../camel/providers/local/camel-maildir-store.c:355 -+#: ../camel/providers/local/camel-maildir-store.c:380 - msgid "not a maildir directory" - msgstr "n'est pas un répertoire Maildir" - --#: ../camel/providers/local/camel-maildir-store.c:637 --#: ../camel/providers/local/camel-maildir-store.c:1095 -+#: ../camel/providers/local/camel-maildir-store.c:666 -+#: ../camel/providers/local/camel-maildir-store.c:1146 - #: ../camel/providers/local/camel-spool-store.c:212 - #: ../camel/providers/local/camel-spool-store.c:231 - #, c-format -@@ -3776,11 +3781,9 @@ - #: ../camel/providers/local/camel-mbox-store.c:663 - #: ../camel/providers/local/camel-mbox-store.c:692 - #, c-format --msgid "" --"Could not delete folder '%s':\n" -+msgid "Could not delete folder '%s':\n" - "%s" --msgstr "" --"Impossible de supprimer le dossier « %s » :\n" -+msgstr "Impossible de supprimer le dossier « %s » :\n" - "%s" - - #: ../camel/providers/local/camel-mbox-store.c:673 -@@ -3944,11 +3947,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:494 - #, c-format --msgid "" --"Could not open folder '%s':\n" -+msgid "Could not open folder '%s':\n" - "%s" --msgstr "" --"Impossible d'ouvrir le dossier « %s » :\n" -+msgstr "Impossible d'ouvrir le dossier « %s » :\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:500 -@@ -3958,11 +3959,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:508 - #, c-format --msgid "" --"Could not create folder '%s':\n" -+msgid "Could not create folder '%s':\n" - "%s" --msgstr "" --"Impossible de créer le dossier « %s » :\n" -+msgstr "Impossible de créer le dossier « %s » :\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:521 -@@ -4114,12 +4113,10 @@ - - #: ../camel/providers/nntp/camel-nntp-store.c:1151 - #, c-format --msgid "" --"Error retrieving newsgroups:\n" -+msgid "Error retrieving newsgroups:\n" - "\n" - "%s" --msgstr "" --"Erreur lors de la récupération des groupes de discussion :\n" -+msgstr "Erreur lors de la récupération des groupes de discussion :\n" - "\n" - "%s" - -@@ -4156,8 +4153,7 @@ - - #: ../camel/providers/nntp/camel-nntp-store.c:1583 - #, c-format --msgid "" --"You cannot unsubscribe to this newsgroup:\n" -+msgid "You cannot unsubscribe to this newsgroup:\n" - "\n" - "newsgroup does not exist!" - msgstr "" -@@ -4346,7 +4342,16 @@ - msgid "POP3 server for %s on %s" - msgstr "Serveur POP3 pour %s sur %s" - --#: ../camel/providers/pop3/camel-pop3-store.c:713 -+#: ../camel/providers/pop3/camel-pop3-store.c:690 -+#: ../camel/providers/pop3/camel-pop3-store.c:777 -+#, c-format -+msgid "Unable to connect to POP server %s.\n" -+"Error sending password: " -+msgstr "" -+"Impossible de se connecter au serveur POP %s.\n" -+"Erreur lors de l'envoi du mot de passe : " -+ -+#: ../camel/providers/pop3/camel-pop3-store.c:722 - #, c-format - msgid "" - "Unable to connect to POP server %s:\tInvalid APOP ID received. Impersonation " -@@ -4356,32 +4361,22 @@ - "valide. Ce peut être un indice d'une attaque par usurpation d'identité. " - "Contactez votre administrateur." - --#: ../camel/providers/pop3/camel-pop3-store.c:768 --#, c-format --msgid "" --"Unable to connect to POP server %s.\n" --"Error sending password: " --msgstr "" --"Impossible de se connecter au serveur POP %s.\n" --"Erreur lors de l'envoi du mot de passe : " -- - #. Translators: Last %s is an optional explanation - #. * beginning with ": " separator. --#: ../camel/providers/pop3/camel-pop3-store.c:783 -+#: ../camel/providers/pop3/camel-pop3-store.c:792 - #, c-format --msgid "" --"Unable to connect to POP server %s.\n" -+msgid "Unable to connect to POP server %s.\n" - "Error sending username%s" - msgstr "" - "Impossible de se connecter au serveur POP %s.\n" - "Erreur lors de l'envoi du nom d'utilisateur %s" - --#: ../camel/providers/pop3/camel-pop3-store.c:865 -+#: ../camel/providers/pop3/camel-pop3-store.c:874 - #, c-format - msgid "No such folder '%s'." - msgstr "Aucun dossier nommé « %s »." - --#: ../camel/providers/pop3/camel-pop3-store.c:882 -+#: ../camel/providers/pop3/camel-pop3-store.c:891 - #, c-format - msgid "POP3 stores have no folder hierarchy" - msgstr "Le stockage POP3 n'a pas de hiérarchie de dossiers" -@@ -4477,225 +4472,226 @@ - "Pour la distribution du courriel via un serveur de courriel distant " - "utilisant SMTP." - --#: ../camel/providers/smtp/camel-smtp-transport.c:170 --#: ../camel/providers/smtp/camel-smtp-transport.c:178 -+#: ../camel/providers/smtp/camel-smtp-transport.c:171 -+#: ../camel/providers/smtp/camel-smtp-transport.c:179 - msgid "Welcome response error: " - msgstr "Erreur lors de la réponse de bienvenue : " - --#: ../camel/providers/smtp/camel-smtp-transport.c:214 -+#: ../camel/providers/smtp/camel-smtp-transport.c:215 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: %s" - msgstr "La connexion au serveur SMTP %s en mode sécurisé a échoué : %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:224 --#: ../camel/providers/smtp/camel-smtp-transport.c:238 --#: ../camel/providers/smtp/camel-smtp-transport.c:246 -+#: ../camel/providers/smtp/camel-smtp-transport.c:225 -+#: ../camel/providers/smtp/camel-smtp-transport.c:240 -+#: ../camel/providers/smtp/camel-smtp-transport.c:248 - msgid "STARTTLS command failed: " - msgstr "La commande STARTTLS a échoué : " - --#: ../camel/providers/smtp/camel-smtp-transport.c:265 -+#: ../camel/providers/smtp/camel-smtp-transport.c:267 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: " - msgstr "La connexion au serveur SMTP %s en mode sécurisé a échoué : " - --#: ../camel/providers/smtp/camel-smtp-transport.c:357 -+#: ../camel/providers/smtp/camel-smtp-transport.c:359 - #, c-format - msgid "SMTP server %s" - msgstr "Serveur SMTP %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:360 -+#: ../camel/providers/smtp/camel-smtp-transport.c:362 - #, c-format - msgid "SMTP mail delivery via %s" - msgstr "Distribution du courriel en SMTP via %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:434 -+#: ../camel/providers/smtp/camel-smtp-transport.c:463 - #, c-format - msgid "SMTP server %s does not support %s authentication" - msgstr "Le serveur SMTP %s ne prend pas en charge l'authentification %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:506 -+#: ../camel/providers/smtp/camel-smtp-transport.c:536 - #, c-format - msgid "No SASL mechanism was specified" - msgstr "Aucun mécanisme SASL n'a été spécifié" - --#: ../camel/providers/smtp/camel-smtp-transport.c:536 --#: ../camel/providers/smtp/camel-smtp-transport.c:547 --#: ../camel/providers/smtp/camel-smtp-transport.c:560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:571 -+#: ../camel/providers/smtp/camel-smtp-transport.c:583 -+#: ../camel/providers/smtp/camel-smtp-transport.c:596 - msgid "AUTH command failed: " - msgstr "La commande AUTH a échoué : " - --#: ../camel/providers/smtp/camel-smtp-transport.c:701 -+#: ../camel/providers/smtp/camel-smtp-transport.c:740 - #, c-format - msgid "Cannot send message: service not connected." - msgstr "Impossible d'envoyer le message : service non connecté." - --#: ../camel/providers/smtp/camel-smtp-transport.c:708 -+#: ../camel/providers/smtp/camel-smtp-transport.c:747 - #, c-format - msgid "Cannot send message: sender address not valid." - msgstr "" - "Impossible d'envoyer le message : l'adresse de l'expéditeur n'est pas valide." -+"" - --#: ../camel/providers/smtp/camel-smtp-transport.c:712 -+#: ../camel/providers/smtp/camel-smtp-transport.c:751 - msgid "Sending message" - msgstr "Envoi du message" - --#: ../camel/providers/smtp/camel-smtp-transport.c:737 -+#: ../camel/providers/smtp/camel-smtp-transport.c:776 - #, c-format - msgid "Cannot send message: no recipients defined." - msgstr "Impossible d'envoyer le message : aucun destinataire n'est défini." - --#: ../camel/providers/smtp/camel-smtp-transport.c:750 -+#: ../camel/providers/smtp/camel-smtp-transport.c:789 - #, c-format - msgid "Cannot send message: one or more invalid recipients" - msgstr "" - "Impossible d'envoyer le message : un ou plusieurs destinataires sont non " - "valides" - --#: ../camel/providers/smtp/camel-smtp-transport.c:871 -+#: ../camel/providers/smtp/camel-smtp-transport.c:910 - msgid "Syntax error, command unrecognized" - msgstr "Erreur de syntaxe, commande non reconnue" - --#: ../camel/providers/smtp/camel-smtp-transport.c:873 -+#: ../camel/providers/smtp/camel-smtp-transport.c:912 - msgid "Syntax error in parameters or arguments" - msgstr "Erreur de syntaxe dans les paramètres ou les arguments" - --#: ../camel/providers/smtp/camel-smtp-transport.c:875 -+#: ../camel/providers/smtp/camel-smtp-transport.c:914 - msgid "Command not implemented" - msgstr "Commande non implémentée" - --#: ../camel/providers/smtp/camel-smtp-transport.c:877 -+#: ../camel/providers/smtp/camel-smtp-transport.c:916 - msgid "Command parameter not implemented" - msgstr "Paramètre de commande non implémenté" - --#: ../camel/providers/smtp/camel-smtp-transport.c:879 -+#: ../camel/providers/smtp/camel-smtp-transport.c:918 - msgid "System status, or system help reply" - msgstr "État du système ou réponse à une aide système" - --#: ../camel/providers/smtp/camel-smtp-transport.c:881 -+#: ../camel/providers/smtp/camel-smtp-transport.c:920 - msgid "Help message" - msgstr "Message d'aide" - --#: ../camel/providers/smtp/camel-smtp-transport.c:883 -+#: ../camel/providers/smtp/camel-smtp-transport.c:922 - msgid "Service ready" - msgstr "Service prêt" - --#: ../camel/providers/smtp/camel-smtp-transport.c:885 -+#: ../camel/providers/smtp/camel-smtp-transport.c:924 - msgid "Service closing transmission channel" - msgstr "Service de fermeture du canal de transmission" - --#: ../camel/providers/smtp/camel-smtp-transport.c:887 -+#: ../camel/providers/smtp/camel-smtp-transport.c:926 - msgid "Service not available, closing transmission channel" - msgstr "Service non disponible, fermeture du canal de transmission" - --#: ../camel/providers/smtp/camel-smtp-transport.c:889 -+#: ../camel/providers/smtp/camel-smtp-transport.c:928 - msgid "Requested mail action okay, completed" - msgstr "Action courriel demandée OK, terminé" - --#: ../camel/providers/smtp/camel-smtp-transport.c:891 -+#: ../camel/providers/smtp/camel-smtp-transport.c:930 - msgid "User not local; will forward to " - msgstr "Utilisateur non local ; transfert vers " - --#: ../camel/providers/smtp/camel-smtp-transport.c:893 -+#: ../camel/providers/smtp/camel-smtp-transport.c:932 - msgid "Requested mail action not taken: mailbox unavailable" - msgstr "" - "Opération courriel demandée non effectuée : boîte aux lettres non disponible" - --#: ../camel/providers/smtp/camel-smtp-transport.c:895 -+#: ../camel/providers/smtp/camel-smtp-transport.c:934 - msgid "Requested action not taken: mailbox unavailable" - msgstr "Opération demandée non effectuée : boîte aux lettres non disponible" - --#: ../camel/providers/smtp/camel-smtp-transport.c:897 -+#: ../camel/providers/smtp/camel-smtp-transport.c:936 - msgid "Requested action aborted: error in processing" - msgstr "Opération demandée abandonnée : erreur de traitement" - --#: ../camel/providers/smtp/camel-smtp-transport.c:899 -+#: ../camel/providers/smtp/camel-smtp-transport.c:938 - msgid "User not local; please try " - msgstr "Utilisateur non local ; veuillez essayer " - --#: ../camel/providers/smtp/camel-smtp-transport.c:901 -+#: ../camel/providers/smtp/camel-smtp-transport.c:940 - msgid "Requested action not taken: insufficient system storage" - msgstr "Opération demandée non effectuée : stockage système insuffisant" - --#: ../camel/providers/smtp/camel-smtp-transport.c:903 -+#: ../camel/providers/smtp/camel-smtp-transport.c:942 - msgid "Requested mail action aborted: exceeded storage allocation" - msgstr "" - "Opération courriel demandée abandonnée : dépassement de l'allocation de " - "stockage" - --#: ../camel/providers/smtp/camel-smtp-transport.c:905 -+#: ../camel/providers/smtp/camel-smtp-transport.c:944 - msgid "Requested action not taken: mailbox name not allowed" - msgstr "" - "Opération demandée non effectuée : nom de boîte aux lettres non autorisé" - --#: ../camel/providers/smtp/camel-smtp-transport.c:907 -+#: ../camel/providers/smtp/camel-smtp-transport.c:946 - msgid "Start mail input; end with ." - msgstr "Démarrer la saisie du courriel ; fin avec ." - --#: ../camel/providers/smtp/camel-smtp-transport.c:909 -+#: ../camel/providers/smtp/camel-smtp-transport.c:948 - msgid "Transaction failed" - msgstr "La transaction a échoué" - --#: ../camel/providers/smtp/camel-smtp-transport.c:913 -+#: ../camel/providers/smtp/camel-smtp-transport.c:952 - msgid "A password transition is needed" - msgstr "Aucun mot de passe fourni" - --#: ../camel/providers/smtp/camel-smtp-transport.c:915 -+#: ../camel/providers/smtp/camel-smtp-transport.c:954 - msgid "Authentication mechanism is too weak" - msgstr "Le mécanisme d'authentification est trop faible" - --#: ../camel/providers/smtp/camel-smtp-transport.c:917 -+#: ../camel/providers/smtp/camel-smtp-transport.c:956 - msgid "Encryption required for requested authentication mechanism" - msgstr "Chiffrement requis pour le mécanisme d'authentification demandé" - --#: ../camel/providers/smtp/camel-smtp-transport.c:919 -+#: ../camel/providers/smtp/camel-smtp-transport.c:958 - msgid "Temporary authentication failure" - msgstr "Anomalie d'authentification temporaire" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1207 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1247 - msgid "SMTP Greeting" - msgstr "Accueil SMTP" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1217 --#: ../camel/providers/smtp/camel-smtp-transport.c:1231 --#: ../camel/providers/smtp/camel-smtp-transport.c:1239 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1257 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1272 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1280 - msgid "HELO command failed: " - msgstr "La commande HELO a échoué : " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1314 --#: ../camel/providers/smtp/camel-smtp-transport.c:1329 --#: ../camel/providers/smtp/camel-smtp-transport.c:1339 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1355 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1371 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1381 - msgid "MAIL FROM command failed: " - msgstr "La commande MAIL FROM a échoué : " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1366 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1408 - msgid "RCPT TO command failed: " - msgstr "La commande RCPT TO a échoué : " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1383 --#: ../camel/providers/smtp/camel-smtp-transport.c:1393 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1426 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1436 - #, c-format - msgid "RCPT TO <%s> failed: " - msgstr "RCPT TO <%s> a échoué : " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1436 --#: ../camel/providers/smtp/camel-smtp-transport.c:1447 --#: ../camel/providers/smtp/camel-smtp-transport.c:1458 --#: ../camel/providers/smtp/camel-smtp-transport.c:1517 --#: ../camel/providers/smtp/camel-smtp-transport.c:1537 --#: ../camel/providers/smtp/camel-smtp-transport.c:1551 --#: ../camel/providers/smtp/camel-smtp-transport.c:1560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1509 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1521 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1532 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1594 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1614 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1629 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1638 - msgid "DATA command failed: " - msgstr "La commande DATA a échoué : " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1585 --#: ../camel/providers/smtp/camel-smtp-transport.c:1600 --#: ../camel/providers/smtp/camel-smtp-transport.c:1609 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1663 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1679 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1688 - msgid "RSET command failed: " - msgstr "La commande RSET a échoué : " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1634 --#: ../camel/providers/smtp/camel-smtp-transport.c:1648 --#: ../camel/providers/smtp/camel-smtp-transport.c:1655 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1713 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1727 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1734 - msgid "QUIT command failed: " - msgstr "La commande QUIT a échoué : " - -@@ -4777,7 +4773,8 @@ - - #: ../data/org.gnome.evolution.shell.network-config.gschema.xml.in.h:9 - msgid "(Deprecated) List of hosts to connect to without proxy" --msgstr "(obsolète) Liste des hôtes pour les connexions sans serveur mandataire" -+msgstr "" -+"(obsolète) Liste des hôtes pour les connexions sans serveur mandataire" - - #: ../data/org.gnome.evolution.shell.network-config.gschema.xml.in.h:10 - msgid "(Deprecated) Host name for HTTPS requests" -@@ -4821,25 +4818,25 @@ - msgid "Client reports password was rejected" - msgstr "Le client signale que le mot de passe a été rejeté" - --#: ../libebackend/e-authentication-session.c:539 -+#: ../libebackend/e-authentication-session.c:542 - msgid "Add this password to your keyring" - msgstr "Ajouter ce mot de passer à votre trousseau" - --#: ../libebackend/e-authentication-session.c:649 -+#: ../libebackend/e-authentication-session.c:547 - msgid "Password was incorrect" - msgstr "Le mot de passe était incorrect" - --#: ../libebackend/e-backend.c:408 -+#: ../libebackend/e-backend.c:420 - #, c-format - msgid "%s does not support authentication" - msgstr "%s ne prend pas en charge l'authentification" - --#: ../libebackend/e-collection-backend.c:901 -+#: ../libebackend/e-collection-backend.c:992 - #, c-format - msgid "%s does not support creating remote resources" - msgstr "%s ne gère pas la création de ressources distantes" - --#: ../libebackend/e-collection-backend.c:960 -+#: ../libebackend/e-collection-backend.c:1051 - #, c-format - msgid "%s does not support deleting remote resources" - msgstr "%s ne prend pas en charge la suppression de ressources distantes" -@@ -4854,14 +4851,14 @@ - msgid "Data source is missing a [%s] group" - msgstr "Un groupe [%s] manque à la source de données" - --#: ../libebackend/e-server-side-source.c:1022 --#: ../libedataserver/e-source.c:1394 -+#: ../libebackend/e-server-side-source.c:1025 -+#: ../libedataserver/e-source.c:1351 - #, c-format - msgid "Data source '%s' does not support creating remote resources" - msgstr "" - "La source de données « %s » ne gère pas la création de ressources distantes" - --#: ../libebackend/e-server-side-source.c:1036 -+#: ../libebackend/e-server-side-source.c:1039 - #, c-format - msgid "" - "Data source '%s' has no collection backend to create the remote resource" -@@ -4869,15 +4866,15 @@ - "La source de données « %s » n'a pas de moteur pour créer la ressource " - "distante" - --#: ../libebackend/e-server-side-source.c:1064 --#: ../libedataserver/e-source.c:1507 -+#: ../libebackend/e-server-side-source.c:1067 -+#: ../libedataserver/e-source.c:1464 - #, c-format - msgid "Data source '%s' does not support deleting remote resources" - msgstr "" - "La source de données « %s » ne gère pas la suppression de ressources " - "distantes" - --#: ../libebackend/e-server-side-source.c:1078 -+#: ../libebackend/e-server-side-source.c:1081 - #, c-format - msgid "" - "Data source '%s' has no collection backend to delete the remote resource" -@@ -4885,25 +4882,25 @@ - "La source de données « %s » n'a pas de moteur pour supprimer la ressource " - "distante" - --#: ../libebackend/e-server-side-source.c:1109 --#: ../libedataserver/e-source.c:1603 --#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1026 -+#: ../libebackend/e-server-side-source.c:1112 -+#: ../libedataserver/e-source.c:1560 -+#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1027 - #, c-format - msgid "Data source '%s' does not support OAuth 2.0 authentication" - msgstr "" - "La source de données %s ne prend pas en charge l'authentification OAuth 2.0" - --#: ../libebackend/e-server-side-source.c:1456 -+#: ../libebackend/e-server-side-source.c:1459 - #, c-format - msgid "File must have a '.source' extension" - msgstr "Le fichier doit avoir une extension « .source »" - --#: ../libebackend/e-source-registry-server.c:531 --#: ../libedataserver/e-source-registry.c:1957 -+#: ../libebackend/e-source-registry-server.c:535 -+#: ../libedataserver/e-source-registry.c:1944 - msgid "The user declined to authenticate" - msgstr "L'utilisateur a refusé de s'authentifier" - --#: ../libebackend/e-source-registry-server.c:800 -+#: ../libebackend/e-source-registry-server.c:804 - #, c-format - msgid "UID '%s' is already in use" - msgstr "L'UID « %s » est déjà utilisé" -@@ -5109,17 +5106,17 @@ - msgid "Source file is missing a [%s] group" - msgstr "Un groupe [%s] manque au fichier source" - --#: ../libedataserver/e-source.c:1174 -+#: ../libedataserver/e-source.c:1131 - #, c-format - msgid "Data source '%s' is not removable" - msgstr "La source de données « %s » n'est pas supprimable" - --#: ../libedataserver/e-source.c:1297 -+#: ../libedataserver/e-source.c:1254 - #, c-format - msgid "Data source '%s' is not writable" - msgstr "La source de données « %s » n'est pas modifiable" - --#: ../libedataserver/e-source.c:1910 -+#: ../libedataserver/e-source.c:1867 - msgid "Unnamed" - msgstr "Sans nom" - -@@ -5133,7 +5130,7 @@ - msgid "Source '%s' does not support proxy lookups" - msgstr "La source « %s » ne gère pas la recherche de serveur mandataire" - --#: ../libedataserver/e-source-webdav.c:1557 -+#: ../libedataserver/e-source-webdav.c:1562 - #, c-format - msgid "" - "SSL certificate for host '%s', used by address book '%s', is not trusted. Do " -@@ -5142,7 +5139,7 @@ - "Le certificat SSL de l'hôte « %s », utilisé par le carnet d'adresses « %s », " - "n'est pas sûr. Voulez-vous l'accepter ?" - --#: ../libedataserver/e-source-webdav.c:1566 -+#: ../libedataserver/e-source-webdav.c:1571 - #, c-format - msgid "" - "SSL certificate for host '%s', used by calendar '%s', is not trusted. Do you " -@@ -5151,7 +5148,7 @@ - "Le certificat SSL de l'hôte « %s », utilisé par l'agenda « %s », n'est pas " - "sûr. Voulez-vous l'accepter ?" - --#: ../libedataserver/e-source-webdav.c:1575 -+#: ../libedataserver/e-source-webdav.c:1580 - #, c-format - msgid "" - "SSL certificate for host '%s', used by memo list '%s', is not trusted. Do " -@@ -5160,7 +5157,7 @@ - "Le certificat SSL de l'hôte « %s », utilisé par la liste de mémos « %s », " - "n'est pas sûr. Voulez-vous l'accepter ?" - --#: ../libedataserver/e-source-webdav.c:1584 -+#: ../libedataserver/e-source-webdav.c:1589 - #, c-format - msgid "" - "SSL certificate for host '%s', used by task list '%s', is not trusted. Do " -@@ -5173,7 +5170,7 @@ - #. * in 12-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1662 ../libedataserver/e-time-utils.c:1961 -+#: ../libedataserver/e-time-utils.c:1681 ../libedataserver/e-time-utils.c:1980 - msgid "%a %m/%d/%Y %I:%M:%S %p" - msgstr "%a %d/%m/%Y %I:%M:%S %p" - -@@ -5181,7 +5178,7 @@ - #. * in 24-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1667 ../libedataserver/e-time-utils.c:1952 -+#: ../libedataserver/e-time-utils.c:1686 ../libedataserver/e-time-utils.c:1971 - msgid "%a %m/%d/%Y %H:%M:%S" - msgstr "%a %d/%m/%Y %H:%M:%S" - -@@ -5189,7 +5186,7 @@ - #. * in 12-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1672 ../libedataserver/e-time-utils.c:1957 -+#: ../libedataserver/e-time-utils.c:1691 ../libedataserver/e-time-utils.c:1976 - msgid "%a %m/%d/%Y %I:%M %p" - msgstr "%a %d/%m/%Y %I:%M %p" - -@@ -5197,78 +5194,78 @@ - #. * in 24-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1677 ../libedataserver/e-time-utils.c:1948 -+#: ../libedataserver/e-time-utils.c:1696 ../libedataserver/e-time-utils.c:1967 - msgid "%a %m/%d/%Y %H:%M" - msgstr "%a %d/%m/%Y %H:%M" - - #. strptime format of a weekday, a date and a time, - #. * in 12-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1682 -+#: ../libedataserver/e-time-utils.c:1701 - msgid "%a %m/%d/%Y %I %p" - msgstr "%a %d/%m/%Y %I %p" - - #. strptime format of a weekday, a date and a time, - #. * in 24-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1687 -+#: ../libedataserver/e-time-utils.c:1706 - msgid "%a %m/%d/%Y %H" - msgstr "%a %d/%m/%Y %H" - - #. strptime format of a weekday and a date. - #. strftime format of a weekday and a date. --#: ../libedataserver/e-time-utils.c:1690 ../libedataserver/e-time-utils.c:1810 --#: ../libedataserver/e-time-utils.c:1943 -+#: ../libedataserver/e-time-utils.c:1709 ../libedataserver/e-time-utils.c:1829 -+#: ../libedataserver/e-time-utils.c:1962 - msgid "%a %m/%d/%Y" - msgstr "%a %d/%m/%Y" - - #. strptime format of a date and a time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1697 -+#: ../libedataserver/e-time-utils.c:1716 - msgid "%m/%d/%Y %I:%M:%S %p" - msgstr "%d/%m/%Y %I:%M:%S %p" - - #. strptime format of a date and a time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1701 -+#: ../libedataserver/e-time-utils.c:1720 - msgid "%m/%d/%Y %H:%M:%S" - msgstr "%d/%m/%Y %H:%M:%S" - - #. strptime format of a date and a time, in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1706 -+#: ../libedataserver/e-time-utils.c:1725 - msgid "%m/%d/%Y %I:%M %p" - msgstr "%d/%m/%Y %I:%M %p" - - #. strptime format of a date and a time, in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1711 -+#: ../libedataserver/e-time-utils.c:1730 - msgid "%m/%d/%Y %H:%M" - msgstr "%d/%m/%Y %H:%M" - - #. strptime format of a date and a time, in 12-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1716 -+#: ../libedataserver/e-time-utils.c:1735 - msgid "%m/%d/%Y %I %p" - msgstr "%d/%m/%Y %I %p" - - #. strptime format of a date and a time, in 24-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1721 -+#: ../libedataserver/e-time-utils.c:1740 - msgid "%m/%d/%Y %H" - msgstr "%d/%m/%Y %H" - - #. strptime format of a weekday and a date. - #. This is the preferred date format for the locale. --#: ../libedataserver/e-time-utils.c:1724 ../libedataserver/e-time-utils.c:1813 -+#: ../libedataserver/e-time-utils.c:1743 ../libedataserver/e-time-utils.c:1832 - msgid "%m/%d/%Y" - msgstr "%d/%m/%Y" - - #. strptime format for a time of day, in 12-hour format. - #. strftime format of a time in 12-hour format. --#: ../libedataserver/e-time-utils.c:1884 ../libedataserver/e-time-utils.c:2005 -+#: ../libedataserver/e-time-utils.c:1903 ../libedataserver/e-time-utils.c:2024 - msgid "%I:%M:%S %p" - msgstr "%I:%M:%S %p" - - #. strptime format for a time of day, in 24-hour format. - #. strftime format of a time in 24-hour format. --#: ../libedataserver/e-time-utils.c:1888 ../libedataserver/e-time-utils.c:1997 -+#: ../libedataserver/e-time-utils.c:1907 ../libedataserver/e-time-utils.c:2016 - msgid "%H:%M:%S" - msgstr "%H:%M:%S" - -@@ -5276,25 +5273,25 @@ - #. * in 12-hour format. - #. strftime format of a time in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1893 ../libedataserver/e-time-utils.c:2002 -+#: ../libedataserver/e-time-utils.c:1912 ../libedataserver/e-time-utils.c:2021 - msgid "%I:%M %p" - msgstr "%I:%M %p" - - #. strptime format for time of day, without seconds 24-hour format. - #. strftime format of a time in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1897 ../libedataserver/e-time-utils.c:1994 -+#: ../libedataserver/e-time-utils.c:1916 ../libedataserver/e-time-utils.c:2013 - msgid "%H:%M" - msgstr "%H:%M" - - #. strptime format for time of day, without seconds 24-hour format, - #. * and no colon. --#: ../libedataserver/e-time-utils.c:1901 -+#: ../libedataserver/e-time-utils.c:1920 - msgid "%H%M" - msgstr "%H%M" - - #. strptime format for hour and AM/PM, 12-hour format. --#: ../libedataserver/e-time-utils.c:1905 -+#: ../libedataserver/e-time-utils.c:1924 - msgid "%I %p" - msgstr "%I %p" - -@@ -5354,7 +5351,7 @@ - msgid "Failed to find ASUrl and OABUrl in autodiscover response" - msgstr "Impossible de trouver ASUrl et OABUrl dans la réponse d'autodétection" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1260 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1269 - #, c-format - msgid "" - "Cannot find a corresponding account in the org.gnome.OnlineAccounts service " -@@ -5363,23 +5360,17 @@ - "Impossible de trouver un compte dans le service org.gnome.OnlineAccounts qui " - "permettrait d'obtenir un jeton d'accès pour « %s »" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1290 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1299 - #, c-format - msgid "Failed to obtain an access token for '%s': " - msgstr "Impossible d'obtenir un jeton d'accès pour « %s » : " - --#: ../modules/google-backend/module-google-backend.c:205 --#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 --#: ../modules/yahoo-backend/module-yahoo-backend.c:199 --msgid "Calendar" --msgstr "Agenda" -- --#: ../modules/google-backend/module-google-backend.c:279 -+#: ../modules/google-backend/module-google-backend.c:341 - #: ../modules/yahoo-backend/module-yahoo-backend.c:226 - msgid "Tasks" - msgstr "Tâches" - --#: ../modules/google-backend/module-google-backend.c:333 -+#: ../modules/google-backend/module-google-backend.c:395 - #: ../modules/ubuntu-online-accounts/contacts.service-type.in.in.h:1 - #: ../services/evolution-source-registry/builtin/contacts-stub.source.in.h:1 - msgid "Contacts" -@@ -5443,6 +5434,11 @@ - msgid "Reason:" - msgstr "Raison :" - -+#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 -+#: ../modules/yahoo-backend/module-yahoo-backend.c:199 -+msgid "Calendar" -+msgstr "Agenda" -+ - #: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:2 - msgid "Integrate your calendars" - msgstr "Intégration de vos agendas" -@@ -5483,7 +5479,7 @@ - msgid "Integrate your mailboxes" - msgstr "Intégration de votre messagerie" - --#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1007 -+#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1008 - #, c-format - msgid "" - "Cannot find a corresponding account service in the accounts database from " -@@ -5496,7 +5492,8 @@ - #: ../modules/ubuntu-online-accounts/uoa-utils.c:281 - #, c-format - msgid "" --"Expected status 200 when requesting your identity, instead got status %d (%s)" -+"Expected status 200 when requesting your identity, instead got status %d " -+"(%s)" - msgstr "" - "Code 200 attendu lors de la requête de votre identité, code %d (%s) reçu à " - "la place" -@@ -5588,15 +5585,3 @@ - #: ../services/evolution-user-prompter/prompt-user-gtk.c:121 - msgid "_Dismiss" - msgstr "_Annuler" -- --#~ msgid "No host information available" --#~ msgstr "Aucune information d'hôte disponible" -- --#~ msgid "Cannot create folder '%s': folder exists" --#~ msgstr "Impossible de créer le dossier « %s » : le dossier existe" -- --#~ msgid "Source stream unavailable" --#~ msgstr "Flux source non disponible" -- --#~ msgid "Cannot create folder '%s': folder exists." --#~ msgstr "Impossible de créer le dossier « %s » : le dossier existe." -diff -urN evolution-data-server-3.12.11/po/it.po evolution-data-server-3.12.11_localized/po/it.po ---- evolution-data-server-3.12.11/po/it.po 2014-11-04 18:27:25.000000000 +0530 -+++ evolution-data-server-3.12.11_localized/po/it.po 2016-03-14 19:48:05.442870056 +0530 -@@ -6,9 +6,9 @@ - # Marco Ciampa , 2003, 2004, 2005. - # Alessio Dessi , 2003. - # Monica Badia , 2003. --# -+# - # ### Glossario ### --# -+# - # journal -> diario (Exchange) - # task -> attività - # list -> elenco -@@ -19,26 +19,25 @@ - # junk -> indesiderato (MS) - # not junk -> attendibile - # spam -> spam --# -+# - # Milo Casagrande , 2012, 2013, 2014. - # Luca Ferretti , 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013. - # Gianvito Cavasoli , 2014. --# -+# pnemade , 2016. #zanata - msgid "" - msgstr "" - "Project-Id-Version: evolution-data-server\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" --"product=evolution-data-server&keywords=I18N+L10N&component=Misc.\n" --"POT-Creation-Date: 2014-10-09 17:00+0000\n" --"PO-Revision-Date: 2014-10-10 10:11+0100\n" --"Last-Translator: Milo Casagrande \n" --"Language-Team: Italiano \n" --"Language: it\n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2016-02-16 09:58+0530\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"PO-Revision-Date: 2014-10-10 09:11+0000\n" -+"Last-Translator: Milo Casagrande \n" -+"Language-Team: Italiano \n" -+"Language: it\n" - "Plural-Forms: nplurals=2; plural=(n != 1);\n" --"X-Generator: Poedit 1.6.9\n" -+"X-Generator: Zanata 3.8.2\n" - - #: ../addressbook/backends/file/e-book-backend-file.c:120 - #, c-format -@@ -82,8 +81,8 @@ - - #: ../addressbook/backends/file/e-book-backend-file.c:1472 - #: ../addressbook/backends/file/e-book-backend-file.c:1555 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3077 --#: ../addressbook/libedata-book/e-book-sqlite.c:6742 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3084 -+#: ../addressbook/libedata-book/e-book-sqlite.c:6793 - #, c-format - msgid "Contact '%s' not found" - msgstr "Contatto «%s» non trovato" -@@ -113,81 +112,81 @@ - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:1174 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4250 - #: ../addressbook/backends/webdav/e-book-backend-webdav.c:419 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:887 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:888 - #: ../addressbook/libebook-contacts/e-book-contacts-types.c:35 - #: ../addressbook/libebook-contacts/e-phone-number.c:56 - #: ../addressbook/libebook/e-book.c:1078 --#: ../addressbook/libebook/e-book-client.c:1882 --#: ../addressbook/libebook/e-book-client.c:2054 --#: ../addressbook/libebook/e-book-client.c:2267 --#: ../addressbook/libebook/e-book-client.c:2398 --#: ../addressbook/libebook/e-book-client.c:2557 --#: ../addressbook/libebook/e-book-client.c:2691 --#: ../addressbook/libebook/e-book-client.c:2822 --#: ../addressbook/libebook/e-book-client.c:2980 --#: ../addressbook/libebook/e-book-client.c:3175 --#: ../addressbook/libebook/e-book-client.c:3393 -+#: ../addressbook/libebook/e-book-client.c:1916 -+#: ../addressbook/libebook/e-book-client.c:2088 -+#: ../addressbook/libebook/e-book-client.c:2301 -+#: ../addressbook/libebook/e-book-client.c:2432 -+#: ../addressbook/libebook/e-book-client.c:2591 -+#: ../addressbook/libebook/e-book-client.c:2725 -+#: ../addressbook/libebook/e-book-client.c:2856 -+#: ../addressbook/libebook/e-book-client.c:3014 -+#: ../addressbook/libebook/e-book-client.c:3209 -+#: ../addressbook/libebook/e-book-client.c:3427 - #: ../addressbook/libedata-book/e-book-backend-sexp.c:878 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:585 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:616 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:629 - #: ../calendar/backends/contacts/e-cal-backend-contacts.c:270 - #: ../calendar/libecal/e-cal.c:2334 ../calendar/libecal/e-cal-client.c:276 --#: ../calendar/libecal/e-cal-client.c:3239 --#: ../calendar/libecal/e-cal-client.c:3412 --#: ../calendar/libecal/e-cal-client.c:3676 --#: ../calendar/libecal/e-cal-client.c:3917 --#: ../calendar/libecal/e-cal-client.c:4107 --#: ../calendar/libecal/e-cal-client.c:4299 --#: ../calendar/libecal/e-cal-client.c:4469 --#: ../calendar/libecal/e-cal-client.c:4638 --#: ../calendar/libecal/e-cal-client.c:4841 --#: ../calendar/libecal/e-cal-client.c:4991 --#: ../calendar/libecal/e-cal-client.c:5185 --#: ../calendar/libecal/e-cal-client.c:5338 --#: ../calendar/libecal/e-cal-client.c:5555 --#: ../calendar/libecal/e-cal-client.c:5709 --#: ../calendar/libecal/e-cal-client.c:5935 --#: ../calendar/libecal/e-cal-client.c:6131 --#: ../calendar/libecal/e-cal-client.c:6494 --#: ../calendar/libecal/e-cal-client.c:6708 -+#: ../calendar/libecal/e-cal-client.c:3273 -+#: ../calendar/libecal/e-cal-client.c:3446 -+#: ../calendar/libecal/e-cal-client.c:3710 -+#: ../calendar/libecal/e-cal-client.c:3951 -+#: ../calendar/libecal/e-cal-client.c:4141 -+#: ../calendar/libecal/e-cal-client.c:4333 -+#: ../calendar/libecal/e-cal-client.c:4503 -+#: ../calendar/libecal/e-cal-client.c:4672 -+#: ../calendar/libecal/e-cal-client.c:4875 -+#: ../calendar/libecal/e-cal-client.c:5025 -+#: ../calendar/libecal/e-cal-client.c:5219 -+#: ../calendar/libecal/e-cal-client.c:5372 -+#: ../calendar/libecal/e-cal-client.c:5589 -+#: ../calendar/libecal/e-cal-client.c:5743 -+#: ../calendar/libecal/e-cal-client.c:5969 -+#: ../calendar/libecal/e-cal-client.c:6165 -+#: ../calendar/libecal/e-cal-client.c:6528 -+#: ../calendar/libecal/e-cal-client.c:6750 - #: ../camel/providers/imapx/camel-imapx-command.c:645 --#: ../camel/providers/imapx/camel-imapx-server.c:4784 --#: ../camel/providers/imapx/camel-imapx-server.c:4793 -+#: ../camel/providers/imapx/camel-imapx-server.c:4871 -+#: ../camel/providers/imapx/camel-imapx-server.c:4880 - #: ../libedataserver/e-client.c:185 - msgid "Unknown error" - msgstr "Errore sconosciuto" - - # infedele, ma meglio di "Interrogazione" - #. Query for new contacts asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:828 -+#: ../addressbook/backends/google/e-book-backend-google.c:822 - msgid "Querying for updated contacts…" - msgstr "Verifica dei contatti aggiornati..." - - # infedele, ma meglio di "Interrogazione"< - #. Run the query asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:1010 -+#: ../addressbook/backends/google/e-book-backend-google.c:1004 - msgid "Querying for updated groups…" - msgstr "Verifica dei gruppi aggiornati..." - --#: ../addressbook/backends/google/e-book-backend-google.c:1757 -+#: ../addressbook/backends/google/e-book-backend-google.c:1751 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4997 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1433 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1434 - msgid "The backend does not support bulk additions" - msgstr "Il backend non supporta le aggiunte in serie" - --#: ../addressbook/backends/google/e-book-backend-google.c:1912 -+#: ../addressbook/backends/google/e-book-backend-google.c:1906 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:5133 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1545 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1546 - msgid "The backend does not support bulk modifications" - msgstr "Il backend non supporta le modifiche in serie" - --#: ../addressbook/backends/google/e-book-backend-google.c:2119 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1645 -+#: ../addressbook/backends/google/e-book-backend-google.c:2113 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1646 - msgid "The backend does not support bulk removals" - msgstr "Il backend non supporta le rimozioni in serie" - --#: ../addressbook/backends/google/e-book-backend-google.c:2239 -+#: ../addressbook/backends/google/e-book-backend-google.c:2233 - msgid "Loading…" - msgstr "Caricamento..." - -@@ -288,44 +287,44 @@ - msgid "Failed to get the DN for user '%s'" - msgstr "Recupero del DN per l'utente \"%s\" non riuscito" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:864 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:865 - msgid "Loading Addressbook summary..." - msgstr "Caricamento sommario rubrica..." - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:884 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:885 - #, c-format - msgid "PROPFIND on webdav failed with HTTP status %d (%s)" - msgstr "PROPFIND su webdav non riuscita con stato HTTP %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:903 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:904 - msgid "No response body in webdav PROPFIND result" - msgstr "Nessun corpo della risposta nel risultato webdav PROPFIND" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:964 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:965 - #, c-format - msgid "Loading Contacts (%d%%)" - msgstr "Caricamento contatti (%d%%)..." - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1353 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1354 - msgid "Cannot transform SoupURI to string" - msgstr "Impossibile trasformare il SoupURI in stringa" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1474 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1475 - #, c-format - msgid "Create resource '%s' failed with HTTP status %d (%s)" - msgstr "Creazione della risorsa «%s» non riuscita con stato HTTP %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1576 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1577 - msgid "Contact on server changed -> not modifying" - msgstr "Contatto sul server cambiato → non modificato" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1584 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1585 - #, c-format - msgid "Modify contact failed with HTTP status %d (%s)" - msgstr "Modifica del contatto non riuscita con stato HTTP %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1677 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1693 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1678 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1694 - #, c-format - msgid "DELETE failed with HTTP status %d" - msgstr "DELETE non riuscita con stato HTTP %d" -@@ -375,7 +374,6 @@ - # full name in en_GB indica generalità... - # Sarebbe da vedere l'esatto significato en_US - # -Luca --# - #. Name fields - #. FN isn't really a structured field - we use a getter/setter - #. * so we can set the N property (since evo 1.4 works fine with -@@ -950,14 +948,15 @@ - msgid "Twitter Name List" - msgstr "Elenco dei nominativi Twitter" - --#: ../addressbook/libebook-contacts/e-contact.c:1654 -+#: ../addressbook/libebook-contacts/e-contact.c:1660 - #: ../addressbook/libebook/e-destination.c:920 - msgid "Unnamed List" - msgstr "Elenco senza nome" - - #: ../addressbook/libebook-contacts/e-phone-number.c:41 - msgid "The library was built without phone number support." --msgstr "La libreria è stata compilata senza il supporto ai numeri di telefono." -+msgstr "" -+"La libreria è stata compilata senza il supporto ai numeri di telefono." - - #: ../addressbook/libebook-contacts/e-phone-number.c:43 - msgid "The phone number parser reported an yet unkown error code." -@@ -975,7 +974,8 @@ - - #: ../addressbook/libebook-contacts/e-phone-number.c:49 - msgid "" --"Remaining text after the country calling code is too short for a phone number" -+"Remaining text after the country calling code is too short for a phone " -+"number" - msgstr "" - "Il testo dopo il codice di chiamata internazionale è troppo corto per essere " - "un numero di telefono" -@@ -988,48 +988,48 @@ - msgid "Text is too long for a phone number" - msgstr "Testo troppo lungo per essere un numero di telefono" - --#: ../addressbook/libebook/e-book-client.c:807 -+#: ../addressbook/libebook/e-book-client.c:841 - #, c-format - msgid "Unknown book property '%s'" - msgstr "Proprietà di rubrica «%s» sconosciuta" - --#: ../addressbook/libebook/e-book-client.c:822 -+#: ../addressbook/libebook/e-book-client.c:856 - #, c-format - msgid "Cannot change value of book property '%s'" - msgstr "Impossibile cambiare valore della proprietà di rubrica «%s»" - --#: ../addressbook/libebook/e-book-client.c:1207 --#: ../addressbook/libebook/e-book-client.c:1382 --#: ../addressbook/libebook/e-book-client.c:1649 --#: ../calendar/libecal/e-cal-client.c:1530 --#: ../calendar/libecal/e-cal-client.c:1712 -+#: ../addressbook/libebook/e-book-client.c:1241 -+#: ../addressbook/libebook/e-book-client.c:1416 -+#: ../addressbook/libebook/e-book-client.c:1683 -+#: ../calendar/libecal/e-cal-client.c:1564 -+#: ../calendar/libecal/e-cal-client.c:1746 - #, c-format - msgid "Unable to connect to '%s': " - msgstr "Impossibile connettersi a «%s»: " - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:899 --#: ../addressbook/libedata-book/e-book-sqlite.c:2178 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:906 -+#: ../addressbook/libedata-book/e-book-sqlite.c:2201 - #, c-format - msgid "Error introspecting unknown summary field '%s'" - msgstr "Errore nell'eseguire l'introspezione del campo di riepilogo «%s»" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1509 --#: ../addressbook/libedata-book/e-book-sqlite.c:1334 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1516 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1340 - msgid "Error parsing regular expression" - msgstr "Errore nell'analizzare l'espressione regolare" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1554 --#: ../addressbook/libedata-book/e-book-sqlite.c:1818 ../camel/camel-db.c:545 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1561 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1824 ../camel/camel-db.c:619 - #, c-format - msgid "Insufficient memory" - msgstr "Memoria non sufficiente" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1691 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1698 - #, c-format - msgid "Invalid contact field '%d' specified in summary" - msgstr "Campo «%d» del contatto specificato nel riepilogo non valido" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1725 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1732 - #: ../addressbook/libedata-book/e-book-sqlite.c:559 - #, c-format - msgid "" -@@ -1039,8 +1039,8 @@ - "Nel sommario è specificato il campo di contatto \"%s\" di tipo \"%s\", ma " - "sono supportati solo campi di tipo booleano, stringa e lista di stringhe" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3065 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4161 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3072 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4168 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. vcards cannot be returned." -@@ -1048,19 +1048,19 @@ - "Nella cache non sono memorizzati i search_contacts completi. Impossibile " - "restituire vcards." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4292 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4385 --#: ../addressbook/libedata-book/e-book-sqlite.c:5400 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4299 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4392 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5451 - #, c-format - msgid "Query contained unsupported elements" - msgstr "La query conteneva elementi non supportati" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4296 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4303 - #, c-format - msgid "Invalid Query" - msgstr "Interrogazione non valida" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4320 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4327 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. Hence only summary query is " -@@ -1069,7 +1069,7 @@ - "Nella cache non sono memorizzati i search_contacts completi. Sono supportate " - "solo le interrogazioni di riepilogo." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4389 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4396 - #: ../addressbook/libedata-book/e-data-book.c:383 - #: ../addressbook/libedata-book/e-data-book.c:1028 - #: ../calendar/libedata-cal/e-data-cal.c:420 -@@ -1078,7 +1078,7 @@ - msgid "Invalid query" - msgstr "Interrogazione non valida" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4432 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4439 - #, c-format - msgid "" - "Full vcards are not stored in cache. Hence only summary query is supported." -@@ -1086,35 +1086,35 @@ - "Nella cache non sono memorizzati i vcards completi. Sono supportate solo le " - "interrogazioni di riepilogo." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5255 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5262 - #, c-format - msgid "Unable to remove the db file: errno %d" - msgstr "Impossibile rimuovere il file del database: errore numero %d" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6042 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6442 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6449 - #, c-format - msgid "Only summary queries are supported by EbSdbCursor" - msgstr "Solo le interrogazioni di riepilogo sono supportate da EbSdbCursor" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6056 - #, c-format - msgid "At least one sort field must be specified to use an EbSdbCursor" - msgstr "" - "Deve essere specificato almeno un campo di ordinamento per usare EbSdbCursor" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6063 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 - #, c-format - msgid "Cannot sort by a field that is not in the summary" - msgstr "Impossibile ordinare per un campo che non è nel riepilogo" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6077 - #, c-format - msgid "Cannot sort by a field which may have multiple values" - msgstr "Impossibile ordinare per un campo che potrebbe avere valori multipli" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6203 --#: ../addressbook/libedata-book/e-book-sqlite.c:7412 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6210 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7463 - #, c-format - msgid "" - "Tried to step a cursor in reverse, but cursor is already at the beginning of " -@@ -1123,8 +1123,8 @@ - "Si è cercato di passare un cursore in senso inverso, ma il cursore è già " - "alla fine dell'elenco dei contatti" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6211 --#: ../addressbook/libedata-book/e-book-sqlite.c:7420 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6218 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7471 - #, c-format - msgid "" - "Tried to step a cursor forwards, but cursor is already at the end of the " -@@ -1138,7 +1138,7 @@ - msgid "Unsupported contact field '%d' specified in summary" - msgstr "Campo «%d» del contatto specificato nel riepilogo non supportato" - --#: ../addressbook/libedata-book/e-book-sqlite.c:1891 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1897 - msgid "" - "Cannot upgrade contacts database from a legacy database with more than one " - "addressbook. Delete one of the entries in the 'folders' table first." -@@ -1147,22 +1147,22 @@ - "più di una rubrica. Eliminare prima una delle voci nella tabella delle " - "«cartelle»." - --#: ../addressbook/libedata-book/e-book-sqlite.c:5393 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5444 - #, c-format - msgid "Invalid query: %s" - msgstr "Interrogazione non valida: %s" - --#: ../addressbook/libedata-book/e-book-sqlite.c:5568 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5619 - msgid "Invalid query for EbSqlCursor" - msgstr "Interrogazione non valida per EbSqlCursor" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7234 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7285 - msgid "At least one sort field must be specified to use an EbSqlCursor" - msgstr "" - "Almeno un campo di ordinamento deve essere specificato per usare un " - "EbSqlCursor" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7252 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7303 - msgid "Cannot sort by a field that is not a string type" - msgstr "Impossibile ordinare per un campo che non è un tipo di stringa" - -@@ -1328,15 +1328,15 @@ - msgid "Cannot remove contacts: " - msgstr "Impossibile rimuovere i contatti: " - --#: ../addressbook/libedata-book/e-data-book-cursor.c:772 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:776 - msgid "Cursor does not support setting the search expression" - msgstr "Il cursore non supporta l'impostazione dell'espressione di ricerca" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:855 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:859 - msgid "Cursor does not support step" - msgstr "Il cursore non supporta il passare" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:938 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:942 - msgid "Cursor does not support alphabetic indexes" - msgstr "Il cursore non supporta l'indicizzazione alfabetica" - -@@ -1371,35 +1371,35 @@ - msgid "No such source for UID '%s'" - msgstr "Nessuna sorgente per l'UID \"%s\"" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:581 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 - #, c-format - msgid "Server is unreachable (%s)" - msgstr "Il server è irragiungibile (%s)" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:612 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 - #, c-format - msgid "Failed to connect to a server using SSL: %s" - msgstr "Connessione a un server usando SSL non riuscita: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:623 --#, c-format --msgid "Unexpected HTTP status code %d returned (%s)" -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 -+#, fuzzy, c-format -+msgid "Unexpected HTTP status code %d returned (%s) for URI: %s" - msgstr "Restituito codice di stato HTTP %d inatteso (%s)" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:642 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:647 - msgid "CalDAV backend is not loaded yet" - msgstr "Il backend CalDAV non è ancora caricato" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1084 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1091 - msgid "Invalid Redirect URL" - msgstr "URL di redirezione non valido" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2887 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2894 - #, c-format - msgid "Cannot create local cache folder '%s'" - msgstr "Impossibile creare la cartella cache locale «%s»" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2939 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2946 - #, c-format - msgid "" - "Server is unreachable, calendar is opened in read-only mode.\n" -@@ -1409,27 +1409,27 @@ - "lettura.\n" - "Messaggio d'errore: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3973 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3988 - msgid "CalDAV does not support bulk additions" - msgstr "CalDAV non supporta le aggiunte in serie" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4076 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4091 - msgid "CalDAV does not support bulk modifications" - msgstr "CalDAV non supporta le modifiche in serie" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4252 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4267 - msgid "CalDAV does not support bulk removals" - msgstr "CalDAV non supporta le rimozioni in serie" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4919 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4941 - msgid "Calendar doesn't support Free/Busy" - msgstr "Il calendario non supporta libero/occupato" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4928 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4950 - msgid "Schedule outbox url not found" - msgstr "URL schedule outbox non trovato" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5025 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5047 - msgid "Unexpected result in schedule-response" - msgstr "Risultato inatteso in schedule-response" - -@@ -1477,76 +1477,77 @@ - msgstr "Non è un calendario." - - #: ../calendar/backends/http/e-cal-backend-http.c:925 --#: ../calendar/backends/weather/e-cal-backend-weather.c:536 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:700 - msgid "Could not create cache file" - msgstr "Impossibile creare il file cache" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:174 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:196 - msgid "Could not retrieve weather data" - msgstr "Impossibile recuperare i dati meteo" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:295 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:369 - msgid "Weather: Fog" - msgstr "Meteo: nebbia" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:296 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:370 - msgid "Weather: Cloudy Night" - msgstr "Meteo: nuvoloso (notte)" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:297 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:371 - msgid "Weather: Cloudy" - msgstr "Meteo: nuvoloso" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:298 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:372 - msgid "Weather: Overcast" - msgstr "Meteo: coperto" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:299 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:373 - msgid "Weather: Showers" - msgstr "Meteo: acquazzoni" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:300 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:374 - msgid "Weather: Snow" - msgstr "Meteo: neve" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:301 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:375 - msgid "Weather: Clear Night" - msgstr "Meteo: sereno (notte)" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:302 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:376 - msgid "Weather: Sunny" - msgstr "Meteo: soleggiato" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:303 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:377 - msgid "Weather: Thunderstorms" - msgstr "Meteo: temporali" - - #. TRANSLATOR: This is the temperature in degrees Fahrenheit (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:329 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:403 - #, c-format - msgid "%.1f °F" - msgstr "%.1f °F" - - #. TRANSLATOR: This is the temperature in degrees Celsius (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:332 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:406 - #, c-format - msgid "%.1f °C" - msgstr "%.1f °C" - - #. TRANSLATOR: This is the temperature in kelvin --#: ../calendar/backends/weather/e-cal-backend-weather.c:335 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:409 - #, c-format - msgid "%.1f K" - msgstr "%.1f K" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:341 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:415 - #, c-format - msgid "%.1f" - msgstr "%.1f" - - # stando a garzantlinguistica.it il weather - # può essere sottinteso --#: ../calendar/backends/weather/e-cal-backend-weather.c:452 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:580 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:608 - msgid "Forecast" - msgstr "Previsioni meteo" - -@@ -1602,7 +1603,7 @@ - msgstr "Autenticazione non riuscita" - - #: ../calendar/libecal/e-cal.c:2330 --#: ../camel/providers/smtp/camel-smtp-transport.c:921 -+#: ../camel/providers/smtp/camel-smtp-transport.c:960 - #: ../libedataserver/e-client.c:147 - msgid "Authentication required" - msgstr "Autenticazione richiesta" -@@ -1625,17 +1626,17 @@ - msgid "Invalid range" - msgstr "Intervallo non valido" - --#: ../calendar/libecal/e-cal-client.c:936 -+#: ../calendar/libecal/e-cal-client.c:970 - #, c-format - msgid "Unknown calendar property '%s'" - msgstr "Proprietà di calendario «%s» sconosciuta" - --#: ../calendar/libecal/e-cal-client.c:951 -+#: ../calendar/libecal/e-cal-client.c:985 - #, c-format - msgid "Cannot change value of calendar property '%s'" - msgstr "Impossibile cambiare valore della proprietà di calendario «%s»" - --#: ../calendar/libecal/e-cal-component.c:1348 -+#: ../calendar/libecal/e-cal-component.c:1349 - msgid "Untitled appointment" - msgstr "Appuntamento senza titolo" - -@@ -1784,83 +1785,83 @@ - msgid "Undefined" - msgstr "Non definita" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:84 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1062 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1371 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1498 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1547 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:85 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1063 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1379 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1506 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1555 - #, c-format - msgid "\"%s\" expects one argument" - msgstr "\"%s\" prevede un argomento" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:91 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:673 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1378 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:92 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:674 - #: ../calendar/libedata-cal/e-cal-backend-sexp.c:1386 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1394 - #, c-format - msgid "\"%s\" expects the first argument to be a string" - msgstr "\"%s\" prevede che il primo argomento sia una stringa" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:166 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:167 - #, c-format - msgid "\"%s\" expects two or three arguments" - msgstr "\"%s\" prevede due o tre argomenti" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:173 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:262 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:324 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:823 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1069 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1447 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1505 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1554 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:174 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:263 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:325 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:824 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1070 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1455 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1513 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1562 - #, c-format - msgid "\"%s\" expects the first argument to be a time_t" - msgstr "\"%s\" prevede che il primo argomento sia un time_t" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:182 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:270 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:334 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:832 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:183 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:271 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:335 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:833 - #, c-format - msgid "\"%s\" expects the second argument to be a time_t" - msgstr "\"%s\" prevede che il secondo argomento sia un time_t" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:192 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:193 - #, c-format - msgid "\"%s\" expects the third argument to be a string" - msgstr "\"%s\" prevede che il terzo argomento sia una stringa" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:254 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:255 - #, c-format - msgid "\"%s\" expects none or two arguments" - msgstr "\"%s\" prevede due argomenti o nessuno" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:317 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:666 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:816 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1440 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:318 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:667 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:817 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1448 - #, c-format - msgid "\"%s\" expects two arguments" - msgstr "\"%s\" prevede due argomenti" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:602 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:625 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:748 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:780 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:987 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1020 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1332 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:603 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:626 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:749 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:781 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:988 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1021 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1340 - #, c-format - msgid "\"%s\" expects no arguments" - msgstr "\"%s\" non prevede alcun argomento" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:682 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:683 - #, c-format - msgid "\"%s\" expects the second argument to be a string" - msgstr "\"%s\" prevede che il secondo argomento sia una stringa" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:713 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:714 - #, c-format - msgid "" - "\"%s\" expects the first argument to be either \"any\", \"summary\", or " -@@ -1868,15 +1869,15 @@ - "\"classification\"" - msgstr "" - "\"%s\" prevede che il primo argomento sia uno tra \"any\", \"summary\", " --"\"description\", \"location\", \"attendee\", \"organizer\" o \"classification" --"\"" -+"\"description\", \"location\", \"attendee\", \"organizer\" o " -+"\"classification\"" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:884 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:885 - #, c-format - msgid "\"%s\" expects at least one argument" - msgstr "\"%s\" prevede almeno un argomento" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:899 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:900 - #, c-format - msgid "" - "\"%s\" expects all arguments to be strings or one and only one argument to " -@@ -1885,13 +1886,12 @@ - "\"%s\" prevede che tutti gli argomenti siano stringhe o uno e soltanto uno " - "falso booleano (#f)" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1395 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1403 - #, c-format - msgid "\"%s\" expects the first argument to be an ISO 8601 date/time string" --msgstr "" --"\"%s\" prevede che il primo argomento sia una stringa data/ora ISO 8601" -+msgstr "\"%s\" prevede che il primo argomento sia una stringa data/ora ISO 8601" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1456 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1464 - #, c-format - msgid "\"%s\" expects the second argument to be an integer" - msgstr "\"%s\" prevede che il secondo argomento sia un intero" -@@ -2136,36 +2136,36 @@ - msgstr[0] "Filtraggio nuovo messaggio in «%s»" - msgstr[1] "Filtraggio nuovi messaggi in «%s»" - --#: ../camel/camel-folder.c:1011 -+#: ../camel/camel-folder.c:1017 - #: ../camel/providers/local/camel-maildir-folder.c:330 - msgid "Moving messages" - msgstr "Spostamento messaggi" - --#: ../camel/camel-folder.c:1014 -+#: ../camel/camel-folder.c:1020 - msgid "Copying messages" - msgstr "Copia messaggi" - --#: ../camel/camel-folder.c:1056 -+#: ../camel/camel-folder.c:1062 - #, c-format - msgid "Quota information not supported for folder '%s'" - msgstr "Informazioni sulla quota non supportate per la cartella «%s»" - --#: ../camel/camel-folder.c:2862 -+#: ../camel/camel-folder.c:2868 - #, c-format - msgid "Expunging folder '%s'" - msgstr "Svuotamento cartella «%s»" - --#: ../camel/camel-folder.c:2990 -+#: ../camel/camel-folder.c:2996 - #, c-format - msgid "Retrieving message '%s' in %s" - msgstr "Ricezione messaggio «%s» in %s" - --#: ../camel/camel-folder.c:3181 -+#: ../camel/camel-folder.c:3187 - #, c-format - msgid "Retrieving quota information for '%s'" - msgstr "Recupero informazioni di quota per «%s»" - --#: ../camel/camel-folder.c:3478 -+#: ../camel/camel-folder.c:3484 - #, c-format - msgid "Refreshing folder '%s'" - msgstr "Aggiornamento cartella «%s»" -@@ -2202,78 +2202,70 @@ - - #: ../camel/camel-folder-search.c:1943 ../camel/camel-folder-search.c:2109 - #, c-format --msgid "" --"Cannot parse search expression: %s:\n" -+msgid "Cannot parse search expression: %s:\n" - "%s" --msgstr "" --"Impossibile analizzare l'espressione di ricerca: %s:\n" -+msgstr "Impossibile analizzare l'espressione di ricerca: %s:\n" - "%s" - - #: ../camel/camel-folder-search.c:1955 ../camel/camel-folder-search.c:2121 - #, c-format --msgid "" --"Error executing search expression: %s:\n" -+msgid "Error executing search expression: %s:\n" - "%s" --msgstr "" --"Errore nell'eseguire l'espressione di ricerca: %s:\n" -+msgstr "Errore nell'eseguire l'espressione di ricerca: %s:\n" - "%s" - --#: ../camel/camel-gpg-context.c:721 ../camel/camel-gpg-context.c:726 --#: ../camel/camel-gpg-context.c:1383 -+#: ../camel/camel-gpg-context.c:725 ../camel/camel-gpg-context.c:730 -+#: ../camel/camel-gpg-context.c:1387 - #, c-format - msgid "Failed to execute gpg: %s" - msgstr "Esecuzione di gpg non riuscita: %s" - --#: ../camel/camel-gpg-context.c:726 --#: ../camel/providers/smtp/camel-smtp-transport.c:924 -+#: ../camel/camel-gpg-context.c:730 -+#: ../camel/providers/smtp/camel-smtp-transport.c:963 - msgid "Unknown" - msgstr "Sconosciuto" - --#: ../camel/camel-gpg-context.c:791 -+#: ../camel/camel-gpg-context.c:795 - #, c-format --msgid "" --"Unexpected GnuPG status message encountered:\n" -+msgid "Unexpected GnuPG status message encountered:\n" - "\n" - "%s" --msgstr "" --"È stato riscontrato un messaggio di stato GnuPG inatteso:\n" -+msgstr "È stato riscontrato un messaggio di stato GnuPG inatteso:\n" - "\n" - "%s" - --#: ../camel/camel-gpg-context.c:827 -+#: ../camel/camel-gpg-context.c:831 - #, c-format - msgid "Failed to parse gpg userid hint." - msgstr "Analisi hint ID utente gpg non riuscita." - --#: ../camel/camel-gpg-context.c:852 ../camel/camel-gpg-context.c:867 -+#: ../camel/camel-gpg-context.c:856 ../camel/camel-gpg-context.c:871 - #, c-format - msgid "Failed to parse gpg passphrase request." - msgstr "Analisi richiesta passphrase gpg non riuscita." - --#: ../camel/camel-gpg-context.c:888 -+#: ../camel/camel-gpg-context.c:892 - #, c-format --msgid "" --"You need a PIN to unlock the key for your\n" -+msgid "You need a PIN to unlock the key for your\n" - "SmartCard: \"%s\"" - msgstr "" - "È necessario un PIN per sbloccare la chiave\n" - "della propria SmartCard: «%s»" - --#: ../camel/camel-gpg-context.c:892 -+#: ../camel/camel-gpg-context.c:896 - #, c-format --msgid "" --"You need a passphrase to unlock the key for\n" -+msgid "You need a passphrase to unlock the key for\n" - "user: \"%s\"" - msgstr "" - "È necessaria una passphrase per sbloccare la chiave\n" - "per l'utente: «%s»" - --#: ../camel/camel-gpg-context.c:898 -+#: ../camel/camel-gpg-context.c:902 - #, c-format - msgid "Unexpected request from GnuPG for '%s'" - msgstr "Richiesta inattesa da GnuPG per «%s»" - --#: ../camel/camel-gpg-context.c:910 -+#: ../camel/camel-gpg-context.c:914 - msgid "" - "Note the encrypted content doesn't contain information about a recipient, " - "thus there will be a password prompt for each of stored private key." -@@ -2282,72 +2274,73 @@ - "destinatario, perciò verrà chiesta una password per ciascuna delle chiavi " - "private memorizzate." - --#: ../camel/camel-gpg-context.c:941 ../camel/camel-net-utils.c:524 -+#: ../camel/camel-gpg-context.c:945 ../camel/camel-net-utils.c:524 - #: ../camel/providers/nntp/camel-nntp-summary.c:401 - #: ../libedataserver/e-client.c:158 - #, c-format - msgid "Cancelled" - msgstr "Annullato" - --#: ../camel/camel-gpg-context.c:962 -+#: ../camel/camel-gpg-context.c:966 - #, c-format - msgid "Failed to unlock secret key: 3 bad passphrases given." - msgstr "" - "Sblocco della chiave segreta non riuscito: sono state fornite 3 passphrase " - "errate." - --#: ../camel/camel-gpg-context.c:975 -+#: ../camel/camel-gpg-context.c:979 - #, c-format - msgid "Unexpected response from GnuPG: %s" - msgstr "Risposta inattesa da GnuPG: %s" - --#: ../camel/camel-gpg-context.c:1106 -+#: ../camel/camel-gpg-context.c:1110 - #, c-format - msgid "Failed to encrypt: No valid recipients specified." - msgstr "Cifratura non riuscita: nessun destinatario valido specificato." - --#: ../camel/camel-gpg-context.c:1658 ../camel/camel-smime-context.c:844 -+#: ../camel/camel-gpg-context.c:1662 ../camel/camel-smime-context.c:844 - msgid "Could not generate signing data: " - msgstr "Impossibile generare i dati per la firma: " - --#: ../camel/camel-gpg-context.c:1708 ../camel/camel-gpg-context.c:1920 --#: ../camel/camel-gpg-context.c:2030 ../camel/camel-gpg-context.c:2179 -+#: ../camel/camel-gpg-context.c:1712 ../camel/camel-gpg-context.c:1924 -+#: ../camel/camel-gpg-context.c:2034 ../camel/camel-gpg-context.c:2183 - msgid "Failed to execute gpg." - msgstr "Esecuzione di gpg non riuscita." - --#: ../camel/camel-gpg-context.c:1791 ../camel/camel-gpg-context.c:1799 --#: ../camel/camel-gpg-context.c:1807 ../camel/camel-gpg-context.c:1827 -+#: ../camel/camel-gpg-context.c:1795 ../camel/camel-gpg-context.c:1803 -+#: ../camel/camel-gpg-context.c:1811 ../camel/camel-gpg-context.c:1831 - #: ../camel/camel-smime-context.c:973 ../camel/camel-smime-context.c:987 - #: ../camel/camel-smime-context.c:996 - #, c-format - msgid "Cannot verify message signature: Incorrect message format" - msgstr "" --"Impossibile verificare la firma del messaggio: formato messaggio non corretto" -+"Impossibile verificare la firma del messaggio: formato messaggio non " -+"corretto" - --#: ../camel/camel-gpg-context.c:1873 -+#: ../camel/camel-gpg-context.c:1877 - msgid "Cannot verify message signature: " - msgstr "Impossibile verificare la firma del messaggio: " - --#: ../camel/camel-gpg-context.c:1996 -+#: ../camel/camel-gpg-context.c:2000 - msgid "Could not generate encrypting data: " - msgstr "Impossibile generare i dati per la cifratura: " - --#: ../camel/camel-gpg-context.c:2049 -+#: ../camel/camel-gpg-context.c:2053 - msgid "This is a digitally encrypted message part" - msgstr "Questa è una parte del messaggio cifrata digitalmente" - --#: ../camel/camel-gpg-context.c:2105 ../camel/camel-gpg-context.c:2114 --#: ../camel/camel-gpg-context.c:2137 -+#: ../camel/camel-gpg-context.c:2109 ../camel/camel-gpg-context.c:2118 -+#: ../camel/camel-gpg-context.c:2141 - #, c-format - msgid "Cannot decrypt message: Incorrect message format" - msgstr "Impossibile decifrare il messaggio: formato del messaggio non valido" - --#: ../camel/camel-gpg-context.c:2125 -+#: ../camel/camel-gpg-context.c:2129 - #, c-format - msgid "Failed to decrypt MIME part: protocol error" - msgstr "Decifratura della parte MIME non riuscita: errore di protocollo" - --#: ../camel/camel-gpg-context.c:2220 ../camel/camel-smime-context.c:1289 -+#: ../camel/camel-gpg-context.c:2224 ../camel/camel-smime-context.c:1289 - msgid "Encrypted content" - msgstr "Contenuto cifrato" - -@@ -2525,7 +2518,8 @@ - #: ../camel/camel-provider.c:279 - #, c-format - msgid "Could not load %s: No initialization code in module." --msgstr "Impossibile caricare %s: nessun codice di inizializzazione nel modulo." -+msgstr "" -+"Impossibile caricare %s: nessun codice di inizializzazione nel modulo." - - #: ../camel/camel-provider.c:427 ../camel/camel-session.c:424 - #, c-format -@@ -2549,29 +2543,23 @@ - # trace info: see http://tools.ietf.org/html/rfc4505 - #: ../camel/camel-sasl-anonymous.c:79 - #, c-format --msgid "" --"Invalid email address trace information:\n" -+msgid "Invalid email address trace information:\n" - "%s" --msgstr "" --"Informazioni tracciamento dell'indirizzo email non valide:\n" -+msgstr "Informazioni tracciamento dell'indirizzo email non valide:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:93 - #, c-format --msgid "" --"Invalid opaque trace information:\n" -+msgid "Invalid opaque trace information:\n" - "%s" --msgstr "" --"Informazioni di tracciamento opaco non valide:\n" -+msgstr "Informazioni di tracciamento opaco non valide:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:107 - #, c-format --msgid "" --"Invalid trace information:\n" -+msgid "Invalid trace information:\n" - "%s" --msgstr "" --"Informazioni di tracciamento non valide:\n" -+msgstr "Informazioni di tracciamento non valide:\n" - "%s" - - #: ../camel/camel-sasl-cram-md5.c:44 -@@ -2634,7 +2622,8 @@ - msgstr "GSSAPI" - - #: ../camel/camel-sasl-gssapi.c:97 --msgid "This option will connect to the server using Kerberos 5 authentication." -+msgid "" -+"This option will connect to the server using Kerberos 5 authentication." - msgstr "" - "Opzione per connessioni al server usando Kerberos 5 per l'autenticazione." - -@@ -2705,7 +2694,7 @@ - - #: ../camel/camel-sasl-gssapi.c:223 ../camel/camel-sasl-gssapi.c:405 - #: ../camel/camel-sasl-gssapi.c:454 ../camel/camel-sasl-gssapi.c:471 --#: ../camel/providers/smtp/camel-smtp-transport.c:622 -+#: ../camel/providers/smtp/camel-smtp-transport.c:659 - #, c-format - msgid "Bad authentication response from server." - msgstr "Risposta di autenticazione dal server errata." -@@ -2777,10 +2766,10 @@ - msgstr "GType non valido registato per il protocollo «%s»" - - #: ../camel/camel-session.c:502 --#: ../camel/providers/imapx/camel-imapx-server.c:4734 -+#: ../camel/providers/imapx/camel-imapx-server.c:4821 - #: ../camel/providers/pop3/camel-pop3-store.c:311 --#: ../camel/providers/pop3/camel-pop3-store.c:757 --#: ../camel/providers/smtp/camel-smtp-transport.c:515 -+#: ../camel/providers/pop3/camel-pop3-store.c:766 -+#: ../camel/providers/smtp/camel-smtp-transport.c:545 - #, c-format - msgid "No support for %s authentication" - msgstr "Nessun supporto per l'autenticazione %s" -@@ -2920,7 +2909,8 @@ - #: ../camel/camel-smime-context.c:639 - #, c-format - msgid "Certificate is the only message, certificates imported and verified" --msgstr "Il certificato è il solo messaggio, certificati importati e verificati" -+msgstr "" -+"Il certificato è il solo messaggio, certificati importati e verificati" - - #: ../camel/camel-smime-context.c:643 - msgid "Cannot find signature digests" -@@ -2993,49 +2983,54 @@ - msgid "S/MIME Decrypt: No encrypted content found" - msgstr "Decifratura S/MIME: non è stato trovato alcun contenuto cifrato" - --#: ../camel/camel-store.c:1232 -+#: ../camel/camel-store.c:1238 - #, c-format - msgid "Opening folder '%s'" - msgstr "Apertura cartella «%s»" - --#: ../camel/camel-store.c:1523 -+#: ../camel/camel-store.c:1529 - #, c-format - msgid "Scanning folders in '%s'" - msgstr "Scansione cartelle in «%s»" - --#: ../camel/camel-store.c:1551 ../camel/camel-store.c:1596 -+#: ../camel/camel-store.c:1557 ../camel/camel-store.c:1602 - #: ../camel/camel-vtrash-folder.c:46 - msgid "Trash" - msgstr "Cestino" - --#: ../camel/camel-store.c:1565 ../camel/camel-store.c:1613 -+#: ../camel/camel-store.c:1571 ../camel/camel-store.c:1619 - #: ../camel/camel-vtrash-folder.c:48 - msgid "Junk" - msgstr "Indesiderata" - --#: ../camel/camel-store.c:2214 -+#: ../camel/camel-store.c:2220 - #, c-format - msgid "Cannot create folder: %s: folder exists" - msgstr "Impossibile creare la cartella «%s»: la cartella esiste già" - --#: ../camel/camel-store.c:2221 -+#: ../camel/camel-store.c:2227 - #, c-format - msgid "Creating folder '%s'" - msgstr "Creazione cartella «%s»" - --#: ../camel/camel-store.c:2398 ../camel/camel-vee-store.c:410 --#: ../camel/providers/local/camel-maildir-store.c:321 -+#: ../camel/camel-store.c:2404 ../camel/camel-vee-store.c:410 -+#: ../camel/providers/local/camel-maildir-store.c:346 - #, c-format - msgid "Cannot delete folder: %s: Invalid operation" - msgstr "Impossibile eliminare la cartella: %s: operazione non valida" - --#: ../camel/camel-store.c:2588 ../camel/camel-vee-store.c:461 --#: ../camel/providers/local/camel-maildir-store.c:872 -+#: ../camel/camel-store.c:2594 ../camel/camel-vee-store.c:461 -+#: ../camel/providers/local/camel-maildir-store.c:914 - #, c-format - msgid "Cannot rename folder: %s: Invalid operation" - msgstr "Impossibile rinominare la cartella: %s: operazione non valida" - --#: ../camel/camel-stream.c:285 ../camel/camel-stream.c:336 -+#: ../camel/camel-stream.c:170 -+#, fuzzy -+msgid "Cannot write with no base stream" -+msgstr "Impossibile effettuare l'autenticazione senza un nome utente" -+ -+#: ../camel/camel-stream.c:290 ../camel/camel-stream.c:341 - #, c-format - msgid "Stream type '%s' is not seekable" - msgstr "Il tipo di flusso «%s» non è ricercabile" -@@ -3183,7 +3178,8 @@ - - #: ../camel/providers/imapx/camel-imapx-provider.c:42 - msgid "Ch_eck for new messages in subscribed folders" --msgstr "Controllare la pr_esenza di nuovi messaggi nelle cartelle sottoscritte" -+msgstr "" -+"Controllare la pr_esenza di nuovi messaggi nelle cartelle sottoscritte" - - # FIXME?!?!? - # Quick Resync è parola chiave da non tradurre? -@@ -3267,234 +3263,235 @@ - msgid "For reading and storing mail on IMAP servers." - msgstr "Per leggere e memorizzare la posta su server IMAP." - --#: ../camel/providers/imapx/camel-imapx-server.c:1009 - #: ../camel/providers/imapx/camel-imapx-server.c:1016 -+#: ../camel/providers/imapx/camel-imapx-server.c:1023 - #, c-format - msgid "Not authenticated" - msgstr "Non autenticato" - --#: ../camel/providers/imapx/camel-imapx-server.c:1713 -+#: ../camel/providers/imapx/camel-imapx-server.c:1751 - msgid "Server disconnected" - msgstr "Server disconnesso" - --#: ../camel/providers/imapx/camel-imapx-server.c:2205 -+#: ../camel/providers/imapx/camel-imapx-server.c:2252 - msgid "Error writing to cache stream" - msgstr "Errore nello scrivere sullo stream di cache" - --#: ../camel/providers/imapx/camel-imapx-server.c:3565 -+#: ../camel/providers/imapx/camel-imapx-server.c:3640 - msgid "Error performing IDLE" - msgstr "Errore nell'eseguire IDLE" - --#: ../camel/providers/imapx/camel-imapx-server.c:4573 -+#: ../camel/providers/imapx/camel-imapx-server.c:4660 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: %s" - msgstr "Connessione al server IMAP %s in modalità sicura non riuscita: %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:4574 --#: ../camel/providers/smtp/camel-smtp-transport.c:215 -+#: ../camel/providers/imapx/camel-imapx-server.c:4661 -+#: ../camel/providers/smtp/camel-smtp-transport.c:216 - msgid "STARTTLS not supported" - msgstr "STARTTLS non supportato" - --#: ../camel/providers/imapx/camel-imapx-server.c:4634 -+#: ../camel/providers/imapx/camel-imapx-server.c:4721 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: " - msgstr "Connessione al server IMAP %s in modalità sicura non riuscita: " - --#: ../camel/providers/imapx/camel-imapx-server.c:4723 -+#: ../camel/providers/imapx/camel-imapx-server.c:4810 - #, c-format - msgid "IMAP server %s does not support %s authentication" - msgstr "Il server IMAP %s non supporta l'autenticazione %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:4753 -+#: ../camel/providers/imapx/camel-imapx-server.c:4840 - #: ../camel/providers/nntp/camel-nntp-store.c:394 - #: ../camel/providers/nntp/camel-nntp-store.c:531 - msgid "Cannot authenticate without a username" - msgstr "Impossibile effettuare l'autenticazione senza un nome utente" - --#: ../camel/providers/imapx/camel-imapx-server.c:4762 -+#: ../camel/providers/imapx/camel-imapx-server.c:4849 - #: ../camel/providers/nntp/camel-nntp-store.c:540 - #: ../camel/providers/pop3/camel-pop3-store.c:678 --#: ../camel/providers/pop3/camel-pop3-store.c:699 -+#: ../camel/providers/pop3/camel-pop3-store.c:708 - msgid "Authentication password not available" - msgstr "Password di autenticazione non disponibile" - --#: ../camel/providers/imapx/camel-imapx-server.c:4998 --#: ../camel/providers/imapx/camel-imapx-server.c:5057 -+#: ../camel/providers/imapx/camel-imapx-server.c:5085 -+#: ../camel/providers/imapx/camel-imapx-server.c:5144 - msgid "Error fetching message" - msgstr "Errore nel recuperare il messaggio" - --#: ../camel/providers/imapx/camel-imapx-server.c:5050 -+#: ../camel/providers/imapx/camel-imapx-server.c:5137 - msgid "Failed to close the tmp stream" - msgstr "Chiusura dello stream tmp non riuscita" - --#: ../camel/providers/imapx/camel-imapx-server.c:5086 -+#: ../camel/providers/imapx/camel-imapx-server.c:5173 - msgid "Failed to copy the tmp file" - msgstr "Copia del file tmp non riuscito" - --#: ../camel/providers/imapx/camel-imapx-server.c:5227 -+#: ../camel/providers/imapx/camel-imapx-server.c:5345 - msgid "Error moving messages" - msgstr "Errore nello spostare i messaggi" - --#: ../camel/providers/imapx/camel-imapx-server.c:5231 -+#: ../camel/providers/imapx/camel-imapx-server.c:5349 - msgid "Error copying messages" - msgstr "Errore nel copiare i messaggi" - --#: ../camel/providers/imapx/camel-imapx-server.c:5453 -+#: ../camel/providers/imapx/camel-imapx-server.c:5579 - msgid "Error appending message" - msgstr "Errore nell'accodare il messaggio" - --#: ../camel/providers/imapx/camel-imapx-server.c:5689 -+#: ../camel/providers/imapx/camel-imapx-server.c:5815 - msgid "Error fetching message headers" - msgstr "Errore nel recuperare le intestazioni di messaggio" - - # chiesto su #evolution, solo una svista sul termine, è == fetch --#: ../camel/providers/imapx/camel-imapx-server.c:5856 -+#: ../camel/providers/imapx/camel-imapx-server.c:5982 - msgid "Error retrieving message" - msgstr "Errore nel recuperare il messaggio" - --#: ../camel/providers/imapx/camel-imapx-server.c:5990 --#: ../camel/providers/imapx/camel-imapx-server.c:6219 -+#: ../camel/providers/imapx/camel-imapx-server.c:6116 -+#: ../camel/providers/imapx/camel-imapx-server.c:6345 - #, c-format - msgid "Fetching summary information for new messages in '%s'" - msgstr "Recupero informazioni di indice per nuovi messaggi in «%s»" - --#: ../camel/providers/imapx/camel-imapx-server.c:6042 -+#: ../camel/providers/imapx/camel-imapx-server.c:6168 - #, c-format - msgid "Scanning for changed messages in '%s'" - msgstr "Scansione per messaggi cambiati in «%s»" - --#: ../camel/providers/imapx/camel-imapx-server.c:6094 -+#: ../camel/providers/imapx/camel-imapx-server.c:6220 - msgid "Error fetching new messages" - msgstr "Errore nel recuperare i nuovi messaggi" - --#: ../camel/providers/imapx/camel-imapx-server.c:6367 -+#: ../camel/providers/imapx/camel-imapx-server.c:6493 - msgid "Error refreshing folder" - msgstr "Errore nell'aggiornare la cartella" - - # prima era "ripulire" --#: ../camel/providers/imapx/camel-imapx-server.c:6517 -+#: ../camel/providers/imapx/camel-imapx-server.c:6643 - msgid "Error expunging message" - msgstr "Errore nel rimuovere il messaggio" - --#: ../camel/providers/imapx/camel-imapx-server.c:6632 --#: ../camel/providers/imapx/camel-imapx-server.c:6657 -+#: ../camel/providers/imapx/camel-imapx-server.c:6758 -+#: ../camel/providers/imapx/camel-imapx-server.c:6783 - msgid "Error fetching folders" - msgstr "Errore nel recuperare le cartelle" - --#: ../camel/providers/imapx/camel-imapx-server.c:6737 -+#: ../camel/providers/imapx/camel-imapx-server.c:6863 - msgid "Error creating folder" - msgstr "Errore nel creare la cartella" - --#: ../camel/providers/imapx/camel-imapx-server.c:6789 -+#: ../camel/providers/imapx/camel-imapx-server.c:6915 - msgid "Error deleting folder" - msgstr "Errore nell'eliminare la cartella" - --#: ../camel/providers/imapx/camel-imapx-server.c:6865 -+#: ../camel/providers/imapx/camel-imapx-server.c:6991 - msgid "Error renaming folder" - msgstr "Errore nel rinominare la cartella" - --#: ../camel/providers/imapx/camel-imapx-server.c:6939 -+#: ../camel/providers/imapx/camel-imapx-server.c:7065 - msgid "Error subscribing to folder" - msgstr "Errore nell'eseguire la sottoscrizione alla cartella" - --#: ../camel/providers/imapx/camel-imapx-server.c:7005 -+#: ../camel/providers/imapx/camel-imapx-server.c:7131 - msgid "Error unsubscribing from folder" --msgstr "Errore nell'eseguire l'annullamento alla sottoscrizione dalla cartella" -+msgstr "" -+"Errore nell'eseguire l'annullamento alla sottoscrizione dalla cartella" - --#: ../camel/providers/imapx/camel-imapx-server.c:7067 -+#: ../camel/providers/imapx/camel-imapx-server.c:7193 - msgid "Error retrieving quota information" - msgstr "Errore nel recuperare le informazioni sulla quota" - --#: ../camel/providers/imapx/camel-imapx-server.c:7119 -+#: ../camel/providers/imapx/camel-imapx-server.c:7245 - msgid "Search failed" - msgstr "Ricerca non riuscita" - --#: ../camel/providers/imapx/camel-imapx-server.c:7181 -+#: ../camel/providers/imapx/camel-imapx-server.c:7307 - msgid "Error performing NOOP" - msgstr "Errore nell'eseguire NOOP" - --#: ../camel/providers/imapx/camel-imapx-server.c:7288 -+#: ../camel/providers/imapx/camel-imapx-server.c:7414 - msgid "Error syncing changes" - msgstr "Errore nel sincronizzare le modifiche" - --#: ../camel/providers/imapx/camel-imapx-server.c:8275 -+#: ../camel/providers/imapx/camel-imapx-server.c:8446 - #, c-format - msgid "Cannot get message with message ID %s: %s" - msgstr "Impossibile ottenere il messaggio avente ID %s: %s" - - # eeeeeeeehhh???? - # che ci sta a fare il such? --#: ../camel/providers/imapx/camel-imapx-server.c:8276 -+#: ../camel/providers/imapx/camel-imapx-server.c:8447 - msgid "No such message available." - msgstr "Nessun messaggio disponibile." - --#: ../camel/providers/imapx/camel-imapx-server.c:8483 --#: ../camel/providers/imapx/camel-imapx-server.c:8504 -+#: ../camel/providers/imapx/camel-imapx-server.c:8671 -+#: ../camel/providers/imapx/camel-imapx-server.c:8692 - msgid "Cannot create spool file: " - msgstr "Impossibile creare il file di spool: " - --#: ../camel/providers/imapx/camel-imapx-server.c:9256 -+#: ../camel/providers/imapx/camel-imapx-server.c:9502 - msgid "IMAP server does not support quotas" - msgstr "Il server IMAP non supporta le quote" - - #. create a dummy "." parent inbox, use to scan, then put back at the top level - #: ../camel/providers/imapx/camel-imapx-store.c:223 - #: ../camel/providers/local/camel-maildir-folder.c:482 --#: ../camel/providers/local/camel-maildir-store.c:322 --#: ../camel/providers/local/camel-maildir-store.c:784 --#: ../camel/providers/local/camel-maildir-store.c:790 --#: ../camel/providers/local/camel-maildir-store.c:873 -+#: ../camel/providers/local/camel-maildir-store.c:347 -+#: ../camel/providers/local/camel-maildir-store.c:826 -+#: ../camel/providers/local/camel-maildir-store.c:832 -+#: ../camel/providers/local/camel-maildir-store.c:915 - #: ../camel/providers/local/camel-spool-store.c:393 - msgid "Inbox" - msgstr "In arrivo" - --#: ../camel/providers/imapx/camel-imapx-store.c:758 -+#: ../camel/providers/imapx/camel-imapx-store.c:757 - #, c-format - msgid "IMAP server %s" - msgstr "Server IMAP %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:761 -+#: ../camel/providers/imapx/camel-imapx-store.c:760 - #, c-format - msgid "IMAP service for %s on %s" - msgstr "Servizio IMAP per %s su %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:836 -+#: ../camel/providers/imapx/camel-imapx-store.c:835 - #: ../camel/providers/nntp/camel-nntp-provider.c:93 - #: ../camel/providers/pop3/camel-pop3-provider.c:81 - msgid "Password" - msgstr "Password" - --#: ../camel/providers/imapx/camel-imapx-store.c:838 --msgid "This option will connect to the IMAP server using a plaintext password." -+#: ../camel/providers/imapx/camel-imapx-store.c:837 -+msgid "" -+"This option will connect to the IMAP server using a plaintext password." - msgstr "" - "Opzione per connessioni al server IMAP usando una password di testo semplice." -+"" - --#: ../camel/providers/imapx/camel-imapx-store.c:913 -+#: ../camel/providers/imapx/camel-imapx-store.c:916 - #, c-format - msgid "No such folder %s" - msgstr "Cartella %s inesistente" - --#: ../camel/providers/imapx/camel-imapx-store.c:1324 -+#: ../camel/providers/imapx/camel-imapx-store.c:1344 - #, c-format - msgid "No IMAP namespace for folder path '%s'" - msgstr "Nessun spazio nomi IMAP per il percorso della cartella «%s»" - --#: ../camel/providers/imapx/camel-imapx-store.c:1472 -+#: ../camel/providers/imapx/camel-imapx-store.c:1609 - #, c-format - msgid "Retrieving folder list for %s" - msgstr "Recupero elenco cartelle per %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:1924 -+#: ../camel/providers/imapx/camel-imapx-store.c:2061 - #, c-format --msgid "" --"The folder name \"%s\" is invalid because it contains the character \"%c\"" -+msgid "The folder name \"%s\" is invalid because it contains the character \"%c\"" - msgstr "" - "Il nome della cartella «%s» non è valido perché contiene il carattere '%c'" - - # Umoristica: se in linea --> i ciccioni non possono completare - # questa operazione :-) -Luca --# --#: ../camel/providers/imapx/camel-imapx-store.c:2689 -+#: ../camel/providers/imapx/camel-imapx-store.c:2833 - #: ../camel/providers/nntp/camel-nntp-store.c:1250 - #: ../camel/providers/pop3/camel-pop3-folder.c:450 - #: ../camel/providers/pop3/camel-pop3-folder.c:593 -@@ -3504,7 +3501,7 @@ - #: ../camel/providers/pop3/camel-pop3-store.c:528 - #: ../camel/providers/pop3/camel-pop3-store.c:576 - #: ../camel/providers/pop3/camel-pop3-store.c:668 --#: ../camel/providers/pop3/camel-pop3-store.c:1072 -+#: ../camel/providers/pop3/camel-pop3-store.c:1081 - #, c-format - msgid "You must be working online to complete this operation" - msgstr "È necessario non essere fuori rete per completare questa operazione" -@@ -3526,7 +3523,7 @@ - msgstr "%s (%s)" - - # ########################## --# -+# - # ricontrollare tutti i messaggi del provider local - #: ../camel/providers/local/camel-local-folder.c:500 - msgid "_Index message body data" -@@ -3534,11 +3531,9 @@ - - #: ../camel/providers/local/camel-local-folder.c:730 - #, c-format --msgid "" --"Cannot get message %s from folder %s\n" -+msgid "Cannot get message %s from folder %s\n" - "%s" --msgstr "" --"Impossibile ottenere il messaggio: %s dalla cartella: %s\n" -+msgstr "Impossibile ottenere il messaggio: %s dalla cartella: %s\n" - "%s" - - #: ../camel/providers/local/camel-local-provider.c:41 -@@ -3612,7 +3607,7 @@ - - #: ../camel/providers/local/camel-local-store.c:221 - #: ../camel/providers/local/camel-local-store.c:381 --#: ../camel/providers/local/camel-maildir-store.c:122 -+#: ../camel/providers/local/camel-maildir-store.c:123 - #: ../camel/providers/local/camel-mbox-store.c:572 - #: ../camel/providers/local/camel-spool-store.c:87 - #, c-format -@@ -3627,7 +3622,7 @@ - #: ../camel/providers/local/camel-local-store.c:242 - #: ../camel/providers/local/camel-local-store.c:252 - #: ../camel/providers/local/camel-local-store.c:394 --#: ../camel/providers/local/camel-maildir-store.c:156 -+#: ../camel/providers/local/camel-maildir-store.c:165 - #, c-format - msgid "Cannot get folder: %s: %s" - msgstr "Impossibile ottenere la cartella: %s: %s" -@@ -3653,7 +3648,7 @@ - msgid "Could not delete folder meta file '%s': %s" - msgstr "Impossibile eliminare il meta file della cartella «%s»: %s" - --#: ../camel/providers/local/camel-local-store.c:594 -+#: ../camel/providers/local/camel-local-store.c:595 - #, c-format - msgid "Could not rename '%s': %s" - msgstr "Impossibile rinominare la cartella «%s»: %s" -@@ -3683,55 +3678,62 @@ - #: ../camel/providers/local/camel-maildir-folder.c:362 - #, c-format - msgid "Cannot transfer message to destination folder: %s" --msgstr "Impossibile trasferire il messaggio nella cartella di destinazione: %s" -+msgstr "" -+"Impossibile trasferire il messaggio nella cartella di destinazione: %s" - --#: ../camel/providers/local/camel-maildir-store.c:130 --#: ../camel/providers/local/camel-maildir-store.c:149 --#: ../camel/providers/local/camel-maildir-store.c:881 -+#: ../camel/providers/local/camel-maildir-store.c:131 -+#: ../camel/providers/local/camel-maildir-store.c:931 -+#, fuzzy, c-format -+msgid "Cannot create folder containing '%s'" -+msgstr "Impossibile creare la cartella «%s»: %s" -+ -+#: ../camel/providers/local/camel-maildir-store.c:139 -+#: ../camel/providers/local/camel-maildir-store.c:158 -+#: ../camel/providers/local/camel-maildir-store.c:923 - #, c-format - msgid "Folder %s already exists" - msgstr "La cartella «%s» esiste già" - --#: ../camel/providers/local/camel-maildir-store.c:241 --#: ../camel/providers/local/camel-maildir-store.c:272 -+#: ../camel/providers/local/camel-maildir-store.c:266 -+#: ../camel/providers/local/camel-maildir-store.c:297 - #: ../camel/providers/local/camel-mbox-store.c:401 - #: ../camel/providers/local/camel-mbox-store.c:422 - #, c-format - msgid "Cannot create folder '%s': %s" - msgstr "Impossibile creare la cartella «%s»: %s" - --#: ../camel/providers/local/camel-maildir-store.c:256 -+#: ../camel/providers/local/camel-maildir-store.c:281 - #: ../camel/providers/local/camel-mbox-store.c:367 - #: ../camel/providers/local/camel-mh-store.c:523 - #, c-format - msgid "Cannot get folder '%s': %s" - msgstr "Impossibile ottenere la cartella «%s»: %s" - --#: ../camel/providers/local/camel-maildir-store.c:262 -+#: ../camel/providers/local/camel-maildir-store.c:287 - #: ../camel/providers/local/camel-mbox-store.c:377 - #: ../camel/providers/local/camel-mh-store.c:532 - #, c-format - msgid "Cannot get folder '%s': folder does not exist." - msgstr "Impossibile ottenere la cartella «%s»: la cartella non esiste." - --#: ../camel/providers/local/camel-maildir-store.c:289 -+#: ../camel/providers/local/camel-maildir-store.c:314 - #, c-format - msgid "Cannot get folder '%s': not a maildir directory." - msgstr "Impossibile ottenere la cartella «%s»: non è una directory maildir." - --#: ../camel/providers/local/camel-maildir-store.c:353 --#: ../camel/providers/local/camel-maildir-store.c:393 -+#: ../camel/providers/local/camel-maildir-store.c:378 -+#: ../camel/providers/local/camel-maildir-store.c:418 - #: ../camel/providers/local/camel-mh-store.c:676 - #, c-format - msgid "Could not delete folder '%s': %s" - msgstr "Impossibile eliminare la cartella «%s»: %s" - --#: ../camel/providers/local/camel-maildir-store.c:355 -+#: ../camel/providers/local/camel-maildir-store.c:380 - msgid "not a maildir directory" - msgstr "non è una directory maildir" - --#: ../camel/providers/local/camel-maildir-store.c:637 --#: ../camel/providers/local/camel-maildir-store.c:1095 -+#: ../camel/providers/local/camel-maildir-store.c:666 -+#: ../camel/providers/local/camel-maildir-store.c:1146 - #: ../camel/providers/local/camel-spool-store.c:212 - #: ../camel/providers/local/camel-spool-store.c:231 - #, c-format -@@ -3781,7 +3783,7 @@ - msgstr "Impossibile creare il lock di cartella per %s: %s" - - # Nota: esiste un altro messaggio con "with this name" --# -+# - # Option 1: "by this" è errato - # Option 2: "by this" significa qualcosa che non so - #: ../camel/providers/local/camel-mbox-store.c:389 -@@ -3813,11 +3815,9 @@ - #: ../camel/providers/local/camel-mbox-store.c:663 - #: ../camel/providers/local/camel-mbox-store.c:692 - #, c-format --msgid "" --"Could not delete folder '%s':\n" -+msgid "Could not delete folder '%s':\n" - "%s" --msgstr "" --"Impossibile eliminare la cartella «%s»:\n" -+msgstr "Impossibile eliminare la cartella «%s»:\n" - "%s" - - #: ../camel/providers/local/camel-mbox-store.c:673 -@@ -3838,7 +3838,6 @@ - msgstr "Impossibile eliminare il file dell'indice della cartella «%s»: %s" - - # glossario: illegal -> non lecito --# - #: ../camel/providers/local/camel-mbox-store.c:806 - #, c-format - msgid "The new folder name is illegal." -@@ -3988,11 +3987,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:494 - #, c-format --msgid "" --"Could not open folder '%s':\n" -+msgid "Could not open folder '%s':\n" - "%s" --msgstr "" --"Impossibile aprire la cartella «%s»:\n" -+msgstr "Impossibile aprire la cartella «%s»:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:500 -@@ -4002,11 +3999,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:508 - #, c-format --msgid "" --"Could not create folder '%s':\n" -+msgid "Could not create folder '%s':\n" - "%s" --msgstr "" --"Impossibile creare la cartella «%s»:\n" -+msgstr "Impossibile creare la cartella «%s»:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:521 -@@ -4158,12 +4153,10 @@ - # usato . invece di : - #: ../camel/providers/nntp/camel-nntp-store.c:1151 - #, c-format --msgid "" --"Error retrieving newsgroups:\n" -+msgid "Error retrieving newsgroups:\n" - "\n" - "%s" --msgstr "" --"Errore nella ricezione dei newsgroup.\n" -+msgstr "Errore nella ricezione dei newsgroup.\n" - "\n" - "%s" - -@@ -4202,8 +4195,7 @@ - # usato . invece di : - #: ../camel/providers/nntp/camel-nntp-store.c:1583 - #, c-format --msgid "" --"You cannot unsubscribe to this newsgroup:\n" -+msgid "You cannot unsubscribe to this newsgroup:\n" - "\n" - "newsgroup does not exist!" - msgstr "" -@@ -4375,7 +4367,8 @@ - #, c-format - msgid "Cannot login to POP server %s: SASL Protocol error" - msgstr "" --"Impossibile effettuare l'accesso sul server POP %s: errore di protocollo SASL" -+"Impossibile effettuare l'accesso sul server POP %s: errore di protocollo " -+"SASL" - - #: ../camel/providers/pop3/camel-pop3-store.c:382 - #, c-format -@@ -4392,10 +4385,19 @@ - msgid "POP3 server for %s on %s" - msgstr "Servizio POP3 per %s su %s" - -+#: ../camel/providers/pop3/camel-pop3-store.c:690 -+#: ../camel/providers/pop3/camel-pop3-store.c:777 -+#, c-format -+msgid "Unable to connect to POP server %s.\n" -+"Error sending password: " -+msgstr "" -+"Impossibile connettersi al server POP %s.\n" -+"Errore nell'inviare la password: " -+ - # credo che sostituzione di persona sia un po' meglio di - # personificazione - # imitazione --#: ../camel/providers/pop3/camel-pop3-store.c:713 -+#: ../camel/providers/pop3/camel-pop3-store.c:722 - #, c-format - msgid "" - "Unable to connect to POP server %s:\tInvalid APOP ID received. Impersonation " -@@ -4405,32 +4407,22 @@ - "Possibile attacco di sostituzione di persona. Contattare il proprio " - "amministratore." - --#: ../camel/providers/pop3/camel-pop3-store.c:768 --#, c-format --msgid "" --"Unable to connect to POP server %s.\n" --"Error sending password: " --msgstr "" --"Impossibile connettersi al server POP %s.\n" --"Errore nell'inviare la password: " -- - #. Translators: Last %s is an optional explanation - #. * beginning with ": " separator. --#: ../camel/providers/pop3/camel-pop3-store.c:783 -+#: ../camel/providers/pop3/camel-pop3-store.c:792 - #, c-format --msgid "" --"Unable to connect to POP server %s.\n" -+msgid "Unable to connect to POP server %s.\n" - "Error sending username%s" - msgstr "" - "Impossibile connettersi al server POP %s.\n" - "Errore nell'inviare il nome utente%s" - --#: ../camel/providers/pop3/camel-pop3-store.c:865 -+#: ../camel/providers/pop3/camel-pop3-store.c:874 - #, c-format - msgid "No such folder '%s'." - msgstr "Cartella «%s» inesistente." - --#: ../camel/providers/pop3/camel-pop3-store.c:882 -+#: ../camel/providers/pop3/camel-pop3-store.c:891 - #, c-format - msgid "POP3 stores have no folder hierarchy" - msgstr "L'archivio POP3 non ha gerarchia di cartelle" -@@ -4526,219 +4518,219 @@ - msgstr "" - "Per consegnare la posta connettendosi a un mail hub remoto usando SMTP." - --#: ../camel/providers/smtp/camel-smtp-transport.c:170 --#: ../camel/providers/smtp/camel-smtp-transport.c:178 -+#: ../camel/providers/smtp/camel-smtp-transport.c:171 -+#: ../camel/providers/smtp/camel-smtp-transport.c:179 - msgid "Welcome response error: " - msgstr "Errore nella risposta di benvenuto: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:214 -+#: ../camel/providers/smtp/camel-smtp-transport.c:215 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: %s" - msgstr "Connessione al server SMTP %s in modalità sicura non riuscita: %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:224 --#: ../camel/providers/smtp/camel-smtp-transport.c:238 --#: ../camel/providers/smtp/camel-smtp-transport.c:246 -+#: ../camel/providers/smtp/camel-smtp-transport.c:225 -+#: ../camel/providers/smtp/camel-smtp-transport.c:240 -+#: ../camel/providers/smtp/camel-smtp-transport.c:248 - msgid "STARTTLS command failed: " - msgstr "Comando STARTTLS non riuscito: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:265 -+#: ../camel/providers/smtp/camel-smtp-transport.c:267 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: " - msgstr "Connessione al server SMTP %s in modalità sicura non riuscita: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:357 -+#: ../camel/providers/smtp/camel-smtp-transport.c:359 - #, c-format - msgid "SMTP server %s" - msgstr "Server SMTP %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:360 -+#: ../camel/providers/smtp/camel-smtp-transport.c:362 - #, c-format - msgid "SMTP mail delivery via %s" - msgstr "Posta SMTP consegnata attraverso %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:434 -+#: ../camel/providers/smtp/camel-smtp-transport.c:463 - #, c-format - msgid "SMTP server %s does not support %s authentication" - msgstr "Il server SMTP %s non supporta l'autenticazione %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:506 -+#: ../camel/providers/smtp/camel-smtp-transport.c:536 - #, c-format - msgid "No SASL mechanism was specified" - msgstr "Non è stato specificato alcun meccanismo SASL" - --#: ../camel/providers/smtp/camel-smtp-transport.c:536 --#: ../camel/providers/smtp/camel-smtp-transport.c:547 --#: ../camel/providers/smtp/camel-smtp-transport.c:560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:571 -+#: ../camel/providers/smtp/camel-smtp-transport.c:583 -+#: ../camel/providers/smtp/camel-smtp-transport.c:596 - msgid "AUTH command failed: " - msgstr "Comando AUTH non riuscito: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:701 -+#: ../camel/providers/smtp/camel-smtp-transport.c:740 - #, c-format - msgid "Cannot send message: service not connected." - msgstr "Impossibile inviare il messaggio: servizio non connesso." - --#: ../camel/providers/smtp/camel-smtp-transport.c:708 -+#: ../camel/providers/smtp/camel-smtp-transport.c:747 - #, c-format - msgid "Cannot send message: sender address not valid." - msgstr "Impossibile inviare il messaggio: indirizzo mittente non valido." - --#: ../camel/providers/smtp/camel-smtp-transport.c:712 -+#: ../camel/providers/smtp/camel-smtp-transport.c:751 - msgid "Sending message" - msgstr "Invio messaggio" - --#: ../camel/providers/smtp/camel-smtp-transport.c:737 -+#: ../camel/providers/smtp/camel-smtp-transport.c:776 - #, c-format - msgid "Cannot send message: no recipients defined." - msgstr "Impossibile inviare il messaggio: nessun destinatario definito." - --#: ../camel/providers/smtp/camel-smtp-transport.c:750 -+#: ../camel/providers/smtp/camel-smtp-transport.c:789 - #, c-format - msgid "Cannot send message: one or more invalid recipients" - msgstr "Impossibile inviare il messaggio: uno o più destinatari non validi" - --#: ../camel/providers/smtp/camel-smtp-transport.c:871 -+#: ../camel/providers/smtp/camel-smtp-transport.c:910 - msgid "Syntax error, command unrecognized" - msgstr "Errore di sintassi, comando non riconosciuto" - --#: ../camel/providers/smtp/camel-smtp-transport.c:873 -+#: ../camel/providers/smtp/camel-smtp-transport.c:912 - msgid "Syntax error in parameters or arguments" - msgstr "Errore di sintassi nei parametri o negli argomenti" - --#: ../camel/providers/smtp/camel-smtp-transport.c:875 -+#: ../camel/providers/smtp/camel-smtp-transport.c:914 - msgid "Command not implemented" - msgstr "Comando non implementato" - --#: ../camel/providers/smtp/camel-smtp-transport.c:877 -+#: ../camel/providers/smtp/camel-smtp-transport.c:916 - msgid "Command parameter not implemented" - msgstr "Parametro del comando non implementato" - --#: ../camel/providers/smtp/camel-smtp-transport.c:879 -+#: ../camel/providers/smtp/camel-smtp-transport.c:918 - msgid "System status, or system help reply" - msgstr "Stato del sistema o risposta di aiuto del sistema" - --#: ../camel/providers/smtp/camel-smtp-transport.c:881 -+#: ../camel/providers/smtp/camel-smtp-transport.c:920 - msgid "Help message" - msgstr "Messaggio di aiuto" - --#: ../camel/providers/smtp/camel-smtp-transport.c:883 -+#: ../camel/providers/smtp/camel-smtp-transport.c:922 - msgid "Service ready" - msgstr "Servizio pronto" - --#: ../camel/providers/smtp/camel-smtp-transport.c:885 -+#: ../camel/providers/smtp/camel-smtp-transport.c:924 - msgid "Service closing transmission channel" - msgstr "Il servizio sta chiudendo il canale di trasmissione" - --#: ../camel/providers/smtp/camel-smtp-transport.c:887 -+#: ../camel/providers/smtp/camel-smtp-transport.c:926 - msgid "Service not available, closing transmission channel" - msgstr "Servizio non disponibile, chiusura del canale di trasmissione" - --#: ../camel/providers/smtp/camel-smtp-transport.c:889 -+#: ../camel/providers/smtp/camel-smtp-transport.c:928 - msgid "Requested mail action okay, completed" - msgstr "L'azione di posta richiesta è corretta, completata" - --#: ../camel/providers/smtp/camel-smtp-transport.c:891 -+#: ../camel/providers/smtp/camel-smtp-transport.c:930 - msgid "User not local; will forward to " - msgstr "Utente non locale; verrà inoltrata a " - --#: ../camel/providers/smtp/camel-smtp-transport.c:893 -+#: ../camel/providers/smtp/camel-smtp-transport.c:932 - msgid "Requested mail action not taken: mailbox unavailable" - msgstr "Azione di posta richiesta non intrapresa: mailbox non disponibile" - --#: ../camel/providers/smtp/camel-smtp-transport.c:895 -+#: ../camel/providers/smtp/camel-smtp-transport.c:934 - msgid "Requested action not taken: mailbox unavailable" - msgstr "Azione richiesta non intrapresa: mailbox non disponibile" - --#: ../camel/providers/smtp/camel-smtp-transport.c:897 -+#: ../camel/providers/smtp/camel-smtp-transport.c:936 - msgid "Requested action aborted: error in processing" - msgstr "Azione richiesta interrotta: errore nell'elaborazione" - --#: ../camel/providers/smtp/camel-smtp-transport.c:899 -+#: ../camel/providers/smtp/camel-smtp-transport.c:938 - msgid "User not local; please try " - msgstr "Utente non locale; tentare " - --#: ../camel/providers/smtp/camel-smtp-transport.c:901 -+#: ../camel/providers/smtp/camel-smtp-transport.c:940 - msgid "Requested action not taken: insufficient system storage" - msgstr "Azione richiesta non intrapresa: archivio di sistema non sufficiente" - --#: ../camel/providers/smtp/camel-smtp-transport.c:903 -+#: ../camel/providers/smtp/camel-smtp-transport.c:942 - msgid "Requested mail action aborted: exceeded storage allocation" - msgstr "" - "Azione di posta richiesta interrotta: allocazione dell'archivio superata" - --#: ../camel/providers/smtp/camel-smtp-transport.c:905 -+#: ../camel/providers/smtp/camel-smtp-transport.c:944 - msgid "Requested action not taken: mailbox name not allowed" - msgstr "Azione richiesta non intrapresa: nome della mailbox non consentito" - --#: ../camel/providers/smtp/camel-smtp-transport.c:907 -+#: ../camel/providers/smtp/camel-smtp-transport.c:946 - msgid "Start mail input; end with ." - msgstr "Iniziare a inserire la posta; terminare con ." - --#: ../camel/providers/smtp/camel-smtp-transport.c:909 -+#: ../camel/providers/smtp/camel-smtp-transport.c:948 - msgid "Transaction failed" - msgstr "Transazione non riuscita" - --#: ../camel/providers/smtp/camel-smtp-transport.c:913 -+#: ../camel/providers/smtp/camel-smtp-transport.c:952 - msgid "A password transition is needed" - msgstr "È necessario passare attraverso la verifica della password" - --#: ../camel/providers/smtp/camel-smtp-transport.c:915 -+#: ../camel/providers/smtp/camel-smtp-transport.c:954 - msgid "Authentication mechanism is too weak" - msgstr "Il meccanismo di autenticazione è troppo debole" - --#: ../camel/providers/smtp/camel-smtp-transport.c:917 -+#: ../camel/providers/smtp/camel-smtp-transport.c:956 - msgid "Encryption required for requested authentication mechanism" - msgstr "Il meccanismo di autenticazione richiesto richiede la cifratura" - --#: ../camel/providers/smtp/camel-smtp-transport.c:919 -+#: ../camel/providers/smtp/camel-smtp-transport.c:958 - msgid "Temporary authentication failure" - msgstr "Autenticazione temporaneamente non riuscita" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1207 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1247 - msgid "SMTP Greeting" - msgstr "Messaggio di benvenuto SMTP" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1217 --#: ../camel/providers/smtp/camel-smtp-transport.c:1231 --#: ../camel/providers/smtp/camel-smtp-transport.c:1239 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1257 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1272 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1280 - msgid "HELO command failed: " - msgstr "Comando HELO non riuscito: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1314 --#: ../camel/providers/smtp/camel-smtp-transport.c:1329 --#: ../camel/providers/smtp/camel-smtp-transport.c:1339 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1355 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1371 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1381 - msgid "MAIL FROM command failed: " - msgstr "Comando MAIL FROM non riuscito: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1366 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1408 - msgid "RCPT TO command failed: " - msgstr "Comando RSET non riuscito: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1383 --#: ../camel/providers/smtp/camel-smtp-transport.c:1393 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1426 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1436 - #, c-format - msgid "RCPT TO <%s> failed: " - msgstr "RCPT TO <%s> non riuscito: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1436 --#: ../camel/providers/smtp/camel-smtp-transport.c:1447 --#: ../camel/providers/smtp/camel-smtp-transport.c:1458 --#: ../camel/providers/smtp/camel-smtp-transport.c:1517 --#: ../camel/providers/smtp/camel-smtp-transport.c:1537 --#: ../camel/providers/smtp/camel-smtp-transport.c:1551 --#: ../camel/providers/smtp/camel-smtp-transport.c:1560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1509 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1521 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1532 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1594 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1614 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1629 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1638 - msgid "DATA command failed: " - msgstr "Comando DATA non riuscito: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1585 --#: ../camel/providers/smtp/camel-smtp-transport.c:1600 --#: ../camel/providers/smtp/camel-smtp-transport.c:1609 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1663 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1679 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1688 - msgid "RSET command failed: " - msgstr "Comando RSET non riuscito: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1634 --#: ../camel/providers/smtp/camel-smtp-transport.c:1648 --#: ../camel/providers/smtp/camel-smtp-transport.c:1655 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1713 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1727 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1734 - msgid "QUIT command failed: " - msgstr "Comando QUIT non riuscito: " - -@@ -4761,7 +4753,8 @@ - #: ../data/org.gnome.evolution-data-server.calendar.gschema.xml.in.h:4 - msgid "Number of units for determining a birthday or anniversary reminder" - msgstr "" --"Numero di unità per determinare il promemoria di un compleanno o anniversario" -+"Numero di unità per determinare il promemoria di un compleanno o " -+"anniversario" - - #: ../data/org.gnome.evolution-data-server.calendar.gschema.xml.in.h:5 - msgid "Birthday and anniversary reminder units" -@@ -4860,25 +4853,25 @@ - msgid "Client reports password was rejected" - msgstr "Il client riporta che la password è stata rifiutata" - --#: ../libebackend/e-authentication-session.c:539 -+#: ../libebackend/e-authentication-session.c:542 - msgid "Add this password to your keyring" - msgstr "Aggiungere questa password al proprio portachiavi" - --#: ../libebackend/e-authentication-session.c:649 -+#: ../libebackend/e-authentication-session.c:547 - msgid "Password was incorrect" - msgstr "La password non era corretta" - --#: ../libebackend/e-backend.c:408 -+#: ../libebackend/e-backend.c:420 - #, c-format - msgid "%s does not support authentication" - msgstr "%s non supporta l'autenticazione" - --#: ../libebackend/e-collection-backend.c:901 -+#: ../libebackend/e-collection-backend.c:992 - #, c-format - msgid "%s does not support creating remote resources" - msgstr "%s non supporta la creazione di risorse remote" - --#: ../libebackend/e-collection-backend.c:960 -+#: ../libebackend/e-collection-backend.c:1051 - #, c-format - msgid "%s does not support deleting remote resources" - msgstr "%s non supporta l'eliminazione di risorse remote" -@@ -4893,13 +4886,13 @@ - msgid "Data source is missing a [%s] group" - msgstr "Alla sorgente dati manca un gruppo [%s]" - --#: ../libebackend/e-server-side-source.c:1022 --#: ../libedataserver/e-source.c:1394 -+#: ../libebackend/e-server-side-source.c:1025 -+#: ../libedataserver/e-source.c:1351 - #, c-format - msgid "Data source '%s' does not support creating remote resources" - msgstr "La sorgenti dati «%s» non supporta la creazione di risorse remote" - --#: ../libebackend/e-server-side-source.c:1036 -+#: ../libebackend/e-server-side-source.c:1039 - #, c-format - msgid "" - "Data source '%s' has no collection backend to create the remote resource" -@@ -4907,13 +4900,13 @@ - "La sorgenti dati «%s» non dispone di un backend per la creazione della " - "risorsa remota" - --#: ../libebackend/e-server-side-source.c:1064 --#: ../libedataserver/e-source.c:1507 -+#: ../libebackend/e-server-side-source.c:1067 -+#: ../libedataserver/e-source.c:1464 - #, c-format - msgid "Data source '%s' does not support deleting remote resources" - msgstr "La sorgenti dati «%s» non supporta l'eliminazione di risorse remote" - --#: ../libebackend/e-server-side-source.c:1078 -+#: ../libebackend/e-server-side-source.c:1081 - #, c-format - msgid "" - "Data source '%s' has no collection backend to delete the remote resource" -@@ -4921,24 +4914,24 @@ - "La sorgente dati «%s» non dispone di un backend per l'eliminazione della " - "risorse remota" - --#: ../libebackend/e-server-side-source.c:1109 --#: ../libedataserver/e-source.c:1603 -+#: ../libebackend/e-server-side-source.c:1112 -+#: ../libedataserver/e-source.c:1560 - #: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1027 - #, c-format - msgid "Data source '%s' does not support OAuth 2.0 authentication" - msgstr "La sorgente dati «%s» non supporta l'autenticazione OAuth 2.0" - --#: ../libebackend/e-server-side-source.c:1456 -+#: ../libebackend/e-server-side-source.c:1459 - #, c-format - msgid "File must have a '.source' extension" - msgstr "Il file deve avere una estensione \".source\"" - --#: ../libebackend/e-source-registry-server.c:531 --#: ../libedataserver/e-source-registry.c:1957 -+#: ../libebackend/e-source-registry-server.c:535 -+#: ../libedataserver/e-source-registry.c:1944 - msgid "The user declined to authenticate" - msgstr "L'utente ha rifiutato l'autenticazione" - --#: ../libebackend/e-source-registry-server.c:800 -+#: ../libebackend/e-source-registry-server.c:804 - #, c-format - msgid "UID '%s' is already in use" - msgstr "L'UID «%s» è già in uso" -@@ -5137,17 +5130,17 @@ - msgid "Source file is missing a [%s] group" - msgstr "Al file sorgente manca un gruppo [%s]" - --#: ../libedataserver/e-source.c:1174 -+#: ../libedataserver/e-source.c:1131 - #, c-format - msgid "Data source '%s' is not removable" - msgstr "La sorgente dati «%s» non è rimovibile" - --#: ../libedataserver/e-source.c:1297 -+#: ../libedataserver/e-source.c:1254 - #, c-format - msgid "Data source '%s' is not writable" - msgstr "La sorgente dati «%s» non è scrivibile" - --#: ../libedataserver/e-source.c:1910 -+#: ../libedataserver/e-source.c:1867 - msgid "Unnamed" - msgstr "Senza nome" - -@@ -5161,7 +5154,7 @@ - msgid "Source '%s' does not support proxy lookups" - msgstr "La sorgente «%s» non supporta i controlli proxy" - --#: ../libedataserver/e-source-webdav.c:1557 -+#: ../libedataserver/e-source-webdav.c:1562 - #, c-format - msgid "" - "SSL certificate for host '%s', used by address book '%s', is not trusted. Do " -@@ -5170,7 +5163,7 @@ - "Il certificato SSL per l'host «%s», usato dalla rubrica «%s», non è fidato. " - "Accettarlo?" - --#: ../libedataserver/e-source-webdav.c:1566 -+#: ../libedataserver/e-source-webdav.c:1571 - #, c-format - msgid "" - "SSL certificate for host '%s', used by calendar '%s', is not trusted. Do you " -@@ -5179,7 +5172,7 @@ - "Il certificato SSL per l'host «%s», usato dal calendario «%s», non è fidato. " - "Accettarlo?" - --#: ../libedataserver/e-source-webdav.c:1575 -+#: ../libedataserver/e-source-webdav.c:1580 - #, c-format - msgid "" - "SSL certificate for host '%s', used by memo list '%s', is not trusted. Do " -@@ -5188,7 +5181,7 @@ - "Il certificato SSL per l'host «%s», usato dall'elenco memo «%s», non è " - "fidato. Accettarlo?" - --#: ../libedataserver/e-source-webdav.c:1584 -+#: ../libedataserver/e-source-webdav.c:1589 - #, c-format - msgid "" - "SSL certificate for host '%s', used by task list '%s', is not trusted. Do " -@@ -5201,7 +5194,7 @@ - #. * in 12-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1662 ../libedataserver/e-time-utils.c:1961 -+#: ../libedataserver/e-time-utils.c:1681 ../libedataserver/e-time-utils.c:1980 - msgid "%a %m/%d/%Y %I:%M:%S %p" - msgstr "%a %d/%m/%Y, %I.%M.%S %p" - -@@ -5209,7 +5202,7 @@ - #. * in 24-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1667 ../libedataserver/e-time-utils.c:1952 -+#: ../libedataserver/e-time-utils.c:1686 ../libedataserver/e-time-utils.c:1971 - msgid "%a %m/%d/%Y %H:%M:%S" - msgstr "%a %d/%m/%Y, %k.%M.%S" - -@@ -5217,7 +5210,7 @@ - #. * in 12-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1672 ../libedataserver/e-time-utils.c:1957 -+#: ../libedataserver/e-time-utils.c:1691 ../libedataserver/e-time-utils.c:1976 - msgid "%a %m/%d/%Y %I:%M %p" - msgstr "%a %d/%m/%Y, %I.%M %p" - -@@ -5225,78 +5218,78 @@ - #. * in 24-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1677 ../libedataserver/e-time-utils.c:1948 -+#: ../libedataserver/e-time-utils.c:1696 ../libedataserver/e-time-utils.c:1967 - msgid "%a %m/%d/%Y %H:%M" - msgstr "%a %d/%m/%Y, %k.%M" - - #. strptime format of a weekday, a date and a time, - #. * in 12-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1682 -+#: ../libedataserver/e-time-utils.c:1701 - msgid "%a %m/%d/%Y %I %p" - msgstr "%a %d/%m/%Y, %I %p" - - #. strptime format of a weekday, a date and a time, - #. * in 24-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1687 -+#: ../libedataserver/e-time-utils.c:1706 - msgid "%a %m/%d/%Y %H" - msgstr "%a %d/%m/%Y, %k" - - #. strptime format of a weekday and a date. - #. strftime format of a weekday and a date. --#: ../libedataserver/e-time-utils.c:1690 ../libedataserver/e-time-utils.c:1810 --#: ../libedataserver/e-time-utils.c:1943 -+#: ../libedataserver/e-time-utils.c:1709 ../libedataserver/e-time-utils.c:1829 -+#: ../libedataserver/e-time-utils.c:1962 - msgid "%a %m/%d/%Y" - msgstr "%a %d/%m/%Y" - - #. strptime format of a date and a time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1697 -+#: ../libedataserver/e-time-utils.c:1716 - msgid "%m/%d/%Y %I:%M:%S %p" - msgstr "%d/%m/%Y, %I.%M.%S %p" - - #. strptime format of a date and a time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1701 -+#: ../libedataserver/e-time-utils.c:1720 - msgid "%m/%d/%Y %H:%M:%S" - msgstr "%d/%m/%Y, %k.%M.%S" - - #. strptime format of a date and a time, in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1706 -+#: ../libedataserver/e-time-utils.c:1725 - msgid "%m/%d/%Y %I:%M %p" - msgstr "%d/%m/%Y, %I.%M %p" - - #. strptime format of a date and a time, in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1711 -+#: ../libedataserver/e-time-utils.c:1730 - msgid "%m/%d/%Y %H:%M" - msgstr "%d/%m/%Y, %k.%M" - - #. strptime format of a date and a time, in 12-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1716 -+#: ../libedataserver/e-time-utils.c:1735 - msgid "%m/%d/%Y %I %p" - msgstr "%d/%m/%Y, %I %p" - - #. strptime format of a date and a time, in 24-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1721 -+#: ../libedataserver/e-time-utils.c:1740 - msgid "%m/%d/%Y %H" - msgstr "%d/%m/%Y, %k" - - #. strptime format of a weekday and a date. - #. This is the preferred date format for the locale. --#: ../libedataserver/e-time-utils.c:1724 ../libedataserver/e-time-utils.c:1813 -+#: ../libedataserver/e-time-utils.c:1743 ../libedataserver/e-time-utils.c:1832 - msgid "%m/%d/%Y" - msgstr "%d/%m/%Y" - - #. strptime format for a time of day, in 12-hour format. - #. strftime format of a time in 12-hour format. --#: ../libedataserver/e-time-utils.c:1884 ../libedataserver/e-time-utils.c:2005 -+#: ../libedataserver/e-time-utils.c:1903 ../libedataserver/e-time-utils.c:2024 - msgid "%I:%M:%S %p" - msgstr "%I.%M.%S %p" - - #. strptime format for a time of day, in 24-hour format. - #. strftime format of a time in 24-hour format. --#: ../libedataserver/e-time-utils.c:1888 ../libedataserver/e-time-utils.c:1997 -+#: ../libedataserver/e-time-utils.c:1907 ../libedataserver/e-time-utils.c:2016 - msgid "%H:%M:%S" - msgstr "%k.%M.%S" - -@@ -5304,25 +5297,25 @@ - #. * in 12-hour format. - #. strftime format of a time in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1893 ../libedataserver/e-time-utils.c:2002 -+#: ../libedataserver/e-time-utils.c:1912 ../libedataserver/e-time-utils.c:2021 - msgid "%I:%M %p" - msgstr "%I.%M %p" - - #. strptime format for time of day, without seconds 24-hour format. - #. strftime format of a time in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1897 ../libedataserver/e-time-utils.c:1994 -+#: ../libedataserver/e-time-utils.c:1916 ../libedataserver/e-time-utils.c:2013 - msgid "%H:%M" - msgstr "%k.%M" - - #. strptime format for time of day, without seconds 24-hour format, - #. * and no colon. --#: ../libedataserver/e-time-utils.c:1901 -+#: ../libedataserver/e-time-utils.c:1920 - msgid "%H%M" - msgstr "%k%M" - - #. strptime format for hour and AM/PM, 12-hour format. --#: ../libedataserver/e-time-utils.c:1905 -+#: ../libedataserver/e-time-utils.c:1924 - msgid "%I %p" - msgstr "%I %p" - -@@ -5382,7 +5375,7 @@ - msgid "Failed to find ASUrl and OABUrl in autodiscover response" - msgstr "Ricerca di ASUrl e OABUrl nella risposta autodiscover non riuscita" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1260 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1269 - #, c-format - msgid "" - "Cannot find a corresponding account in the org.gnome.OnlineAccounts service " -@@ -5391,23 +5384,17 @@ - "Impossibile trovare nel servizio org.gnome.OnlineAccounts un account " - "corrispondente da cui ottenere un token d'accesso per \"%s\"" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1290 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1299 - #, c-format - msgid "Failed to obtain an access token for '%s': " - msgstr "Recupero del token di accesso per «%s» non riuscito: " - --#: ../modules/google-backend/module-google-backend.c:205 --#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 --#: ../modules/yahoo-backend/module-yahoo-backend.c:199 --msgid "Calendar" --msgstr "Calendario" -- --#: ../modules/google-backend/module-google-backend.c:279 -+#: ../modules/google-backend/module-google-backend.c:341 - #: ../modules/yahoo-backend/module-yahoo-backend.c:226 - msgid "Tasks" - msgstr "Attività" - --#: ../modules/google-backend/module-google-backend.c:333 -+#: ../modules/google-backend/module-google-backend.c:395 - #: ../modules/ubuntu-online-accounts/contacts.service-type.in.in.h:1 - #: ../services/evolution-source-registry/builtin/contacts-stub.source.in.h:1 - msgid "Contacts" -@@ -5470,6 +5457,11 @@ - msgid "Reason:" - msgstr "Motivo:" - -+#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 -+#: ../modules/yahoo-backend/module-yahoo-backend.c:199 -+msgid "Calendar" -+msgstr "Calendario" -+ - #: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:2 - msgid "Integrate your calendars" - msgstr "Integra i propri calendari" -@@ -5523,7 +5515,8 @@ - #: ../modules/ubuntu-online-accounts/uoa-utils.c:281 - #, c-format - msgid "" --"Expected status 200 when requesting your identity, instead got status %d (%s)" -+"Expected status 200 when requesting your identity, instead got status %d " -+"(%s)" - msgstr "" - "Atteso lo stato 200 nel richiedere l'identità, ottenuto invece lo stato %d " - "(%s)" -@@ -5612,6 +5605,3 @@ - #: ../services/evolution-user-prompter/prompt-user-gtk.c:121 - msgid "_Dismiss" - msgstr "A_nnulla" -- --#~ msgid "No host information available" --#~ msgstr "Nessuna informazione host disponibile" -diff -urN evolution-data-server-3.12.11/po/ja.po evolution-data-server-3.12.11_localized/po/ja.po ---- evolution-data-server-3.12.11/po/ja.po 2014-11-04 18:27:25.000000000 +0530 -+++ evolution-data-server-3.12.11_localized/po/ja.po 2016-03-14 19:48:05.461870039 +0530 -@@ -10,169 +10,173 @@ - # Takayoshi OKANO , 2011. - # Jiro Matsuzawa , 2011, 2013, 2014. - # Noriko Mizumoto , 2012. --# -+# kmoriguc , 2016. #zanata -+# pnemade , 2016. #zanata - msgid "" - msgstr "" - "Project-Id-Version: evolution-data-server master\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=evolution-data-server&keywords=I18N+L10N&component=Misc.\n" --"POT-Creation-Date: 2014-03-24 15:15+0000\n" --"PO-Revision-Date: 2014-03-25 05:04+0000\n" --"Last-Translator: Jiro Matsuzawa \n" --"Language-Team: Japanese \n" --"Language: ja\n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2016-02-16 09:58+0530\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"PO-Revision-Date: 2016-03-14 12:34+0000\n" -+"Last-Translator: kmoriguc \n" -+"Language-Team: Japanese \n" -+"Language: ja\n" - "Plural-Forms: nplurals=1; plural=0;\n" -+"X-Generator: Zanata 3.8.2\n" - --#: ../addressbook/backends/file/e-book-backend-file.c:117 -+#: ../addressbook/backends/file/e-book-backend-file.c:120 - #, c-format - msgid "Failed to remove file '%s': %s" - msgstr "ファイル '%s' の削除に失敗しました: %s" - --#: ../addressbook/backends/file/e-book-backend-file.c:145 -+#: ../addressbook/backends/file/e-book-backend-file.c:148 - #, c-format - msgid "Failed to make directory %s: %s" - msgstr "フォルダー %s の作成に失敗しました: %s" - --#: ../addressbook/backends/file/e-book-backend-file.c:396 -+#: ../addressbook/backends/file/e-book-backend-file.c:419 - #, c-format - msgid "Failed to create hardlink for resource '%s': %s" - msgstr "リソース '%s' のハードリンクの作成に失敗しました: %s" - --#: ../addressbook/backends/file/e-book-backend-file.c:501 --#: ../addressbook/backends/file/e-book-backend-file.c:1230 -+#: ../addressbook/backends/file/e-book-backend-file.c:524 -+#: ../addressbook/backends/file/e-book-backend-file.c:1253 - msgid "No UID in the contact" - msgstr "この連絡先に UID はありません" - --#: ../addressbook/backends/file/e-book-backend-file.c:828 -+#: ../addressbook/backends/file/e-book-backend-file.c:851 - #, c-format - msgid "Conflicting UIDs found in added contacts" - msgstr "追加した連絡先に UID の衝突が見つかりました" - --#: ../addressbook/backends/file/e-book-backend-file.c:967 -+#: ../addressbook/backends/file/e-book-backend-file.c:990 - msgid "Loading..." - msgstr "読み込み中..." - --#: ../addressbook/backends/file/e-book-backend-file.c:969 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4423 -+#: ../addressbook/backends/file/e-book-backend-file.c:992 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4360 - msgid "Searching..." - msgstr "検索中..." - --#: ../addressbook/backends/file/e-book-backend-file.c:1258 -+#: ../addressbook/backends/file/e-book-backend-file.c:1281 - #, c-format - msgid "Tried to modify contact '%s' with out of sync revision" - msgstr "同期していない版の連絡先 '%s' を変更しようとしました" - --#: ../addressbook/backends/file/e-book-backend-file.c:1449 --#: ../addressbook/backends/file/e-book-backend-file.c:1532 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3077 --#: ../addressbook/libedata-book/e-book-sqlite.c:6706 -+#: ../addressbook/backends/file/e-book-backend-file.c:1472 -+#: ../addressbook/backends/file/e-book-backend-file.c:1555 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3084 -+#: ../addressbook/libedata-book/e-book-sqlite.c:6793 - #, c-format - msgid "Contact '%s' not found" - msgstr "連絡先 '%s' が見つかりません" - --#: ../addressbook/backends/file/e-book-backend-file.c:1592 --#: ../addressbook/backends/file/e-book-backend-file.c:1673 -+#: ../addressbook/backends/file/e-book-backend-file.c:1615 -+#: ../addressbook/backends/file/e-book-backend-file.c:1696 - #, c-format - msgid "Query '%s' not supported" - msgstr "問い合わせ '%s' はサポートされていません" - --#: ../addressbook/backends/file/e-book-backend-file.c:1601 --#: ../addressbook/backends/file/e-book-backend-file.c:1682 -+#: ../addressbook/backends/file/e-book-backend-file.c:1624 -+#: ../addressbook/backends/file/e-book-backend-file.c:1705 - #, c-format - msgid "Invalid Query '%s'" - msgstr "問い合わせ内容 '%s' は無効です" - --#: ../addressbook/backends/file/e-book-backend-file.c:1947 -+#: ../addressbook/backends/file/e-book-backend-file.c:1970 - msgid "Requested to delete an unrelated cursor" - msgstr "関係ないカーソルの削除が要求されました" - --#: ../addressbook/backends/file/e-book-backend-file.c:2014 -+#: ../addressbook/backends/file/e-book-backend-file.c:2041 - #, c-format - msgid "Failed to rename old database from '%s' to '%s': %s" - msgstr "古いデータベースを '%s' から '%s' へ名前変更できませんでした: %s" - --#: ../addressbook/backends/file/e-book-backend-file-migrate-bdb.c:147 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1242 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4318 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:417 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:874 -+#: ../addressbook/backends/file/e-book-backend-file-migrate-bdb.c:148 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1174 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4250 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:419 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:888 - #: ../addressbook/libebook-contacts/e-book-contacts-types.c:35 - #: ../addressbook/libebook-contacts/e-phone-number.c:56 - #: ../addressbook/libebook/e-book.c:1078 --#: ../addressbook/libebook/e-book-client.c:1882 --#: ../addressbook/libebook/e-book-client.c:2054 --#: ../addressbook/libebook/e-book-client.c:2267 --#: ../addressbook/libebook/e-book-client.c:2398 --#: ../addressbook/libebook/e-book-client.c:2557 --#: ../addressbook/libebook/e-book-client.c:2691 --#: ../addressbook/libebook/e-book-client.c:2822 --#: ../addressbook/libebook/e-book-client.c:2980 --#: ../addressbook/libebook/e-book-client.c:3175 --#: ../addressbook/libebook/e-book-client.c:3393 -+#: ../addressbook/libebook/e-book-client.c:1916 -+#: ../addressbook/libebook/e-book-client.c:2088 -+#: ../addressbook/libebook/e-book-client.c:2301 -+#: ../addressbook/libebook/e-book-client.c:2432 -+#: ../addressbook/libebook/e-book-client.c:2591 -+#: ../addressbook/libebook/e-book-client.c:2725 -+#: ../addressbook/libebook/e-book-client.c:2856 -+#: ../addressbook/libebook/e-book-client.c:3014 -+#: ../addressbook/libebook/e-book-client.c:3209 -+#: ../addressbook/libebook/e-book-client.c:3427 - #: ../addressbook/libedata-book/e-book-backend-sexp.c:878 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:576 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:607 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:619 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:585 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:616 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:629 - #: ../calendar/backends/contacts/e-cal-backend-contacts.c:270 - #: ../calendar/libecal/e-cal.c:2334 ../calendar/libecal/e-cal-client.c:276 --#: ../calendar/libecal/e-cal-client.c:3239 --#: ../calendar/libecal/e-cal-client.c:3412 --#: ../calendar/libecal/e-cal-client.c:3676 --#: ../calendar/libecal/e-cal-client.c:3917 --#: ../calendar/libecal/e-cal-client.c:4105 --#: ../calendar/libecal/e-cal-client.c:4297 --#: ../calendar/libecal/e-cal-client.c:4467 --#: ../calendar/libecal/e-cal-client.c:4636 --#: ../calendar/libecal/e-cal-client.c:4839 --#: ../calendar/libecal/e-cal-client.c:4989 --#: ../calendar/libecal/e-cal-client.c:5183 --#: ../calendar/libecal/e-cal-client.c:5336 --#: ../calendar/libecal/e-cal-client.c:5553 --#: ../calendar/libecal/e-cal-client.c:5707 --#: ../calendar/libecal/e-cal-client.c:5933 --#: ../calendar/libecal/e-cal-client.c:6129 --#: ../calendar/libecal/e-cal-client.c:6492 --#: ../calendar/libecal/e-cal-client.c:6706 --#: ../camel/providers/imapx/camel-imapx-command.c:642 -+#: ../calendar/libecal/e-cal-client.c:3273 -+#: ../calendar/libecal/e-cal-client.c:3446 -+#: ../calendar/libecal/e-cal-client.c:3710 -+#: ../calendar/libecal/e-cal-client.c:3951 -+#: ../calendar/libecal/e-cal-client.c:4141 -+#: ../calendar/libecal/e-cal-client.c:4333 -+#: ../calendar/libecal/e-cal-client.c:4503 -+#: ../calendar/libecal/e-cal-client.c:4672 -+#: ../calendar/libecal/e-cal-client.c:4875 -+#: ../calendar/libecal/e-cal-client.c:5025 -+#: ../calendar/libecal/e-cal-client.c:5219 -+#: ../calendar/libecal/e-cal-client.c:5372 -+#: ../calendar/libecal/e-cal-client.c:5589 -+#: ../calendar/libecal/e-cal-client.c:5743 -+#: ../calendar/libecal/e-cal-client.c:5969 -+#: ../calendar/libecal/e-cal-client.c:6165 -+#: ../calendar/libecal/e-cal-client.c:6528 -+#: ../calendar/libecal/e-cal-client.c:6750 -+#: ../camel/providers/imapx/camel-imapx-command.c:645 -+#: ../camel/providers/imapx/camel-imapx-server.c:4871 -+#: ../camel/providers/imapx/camel-imapx-server.c:4880 - #: ../libedataserver/e-client.c:185 - msgid "Unknown error" - msgstr "エラーを特定できません" - - #. Query for new contacts asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:847 -+#: ../addressbook/backends/google/e-book-backend-google.c:822 - msgid "Querying for updated contacts…" - msgstr "更新された連絡先を問い合わせ中…" - - #. Run the query asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:999 -+#: ../addressbook/backends/google/e-book-backend-google.c:1004 - msgid "Querying for updated groups…" - msgstr "更新されたグループを問い合わせ中…" - --#: ../addressbook/backends/google/e-book-backend-google.c:1719 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5054 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1361 -+#: ../addressbook/backends/google/e-book-backend-google.c:1751 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4997 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1434 - msgid "The backend does not support bulk additions" - msgstr "バックエンドが大量追加に対応していません" - --#: ../addressbook/backends/google/e-book-backend-google.c:1868 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5190 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1473 -+#: ../addressbook/backends/google/e-book-backend-google.c:1906 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5133 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1546 - msgid "The backend does not support bulk modifications" - msgstr "バックエンドが大量修正に対応していません" - --#: ../addressbook/backends/google/e-book-backend-google.c:2068 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1573 -+#: ../addressbook/backends/google/e-book-backend-google.c:2113 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1646 - msgid "The backend does not support bulk removals" - msgstr "バックエンドが大量削除に対応していません" - --#: ../addressbook/backends/google/e-book-backend-google.c:2194 -+#: ../addressbook/backends/google/e-book-backend-google.c:2233 - msgid "Loading…" - msgstr "読み込み中…" - - #. System Group: My Contacts --#: ../addressbook/backends/google/e-book-google-utils.c:1625 -+#: ../addressbook/backends/google/e-book-google-utils.c:1631 - #: ../services/evolution-source-registry/builtin/system-address-book.source.in.h:1 - #: ../services/evolution-source-registry/builtin/system-calendar.source.in.h:1 - #: ../services/evolution-source-registry/builtin/system-memo-list.source.in.h:1 -@@ -181,130 +185,130 @@ - msgstr "個人" - - #. System Group: Friends --#: ../addressbook/backends/google/e-book-google-utils.c:1627 -+#: ../addressbook/backends/google/e-book-google-utils.c:1633 - msgid "Friends" - msgstr "友人" - - #. System Group: Family --#: ../addressbook/backends/google/e-book-google-utils.c:1629 -+#: ../addressbook/backends/google/e-book-google-utils.c:1635 - msgid "Family" - msgstr "家族" - - #. System Group: Coworkers --#: ../addressbook/backends/google/e-book-google-utils.c:1631 -+#: ../addressbook/backends/google/e-book-google-utils.c:1637 - msgid "Coworkers" - msgstr "同僚" - - #. Translators: An error message shown to a user when trying to do an - #. * operation on the LDAP address book which is not connected to the server --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:170 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:113 - msgid "Not connected" - msgstr "接続していません" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:969 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:901 - msgid "Failed to bind using either v3 or v2 binds" - msgstr "v3 または v2 のバインドいずれかを使った結合に失敗しました" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1092 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1024 - msgid "Reconnecting to LDAP server..." - msgstr "LDAP サーバーへ再接続中..." - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1223 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1155 - msgid "Invalid DN syntax" - msgstr "無効な識別名 (DN)" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1239 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4317 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1171 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4249 - #, c-format - msgid "LDAP error 0x%x (%s)" - msgstr "LDAP エラー 0x%x (%s)" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1851 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2174 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1783 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2106 - #, c-format - msgid "%s: NULL returned from ldap_first_entry" - msgstr "%s: ldap_first_entry から NULL が返されました" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2104 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2232 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2036 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2164 - #, c-format - msgid "%s: Unhandled result type %d returned" - msgstr "%s: 未処理の結果タイプ %d が返されました" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2365 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2492 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2297 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2424 - #, c-format - msgid "%s: Unhandled search result type %d returned" - msgstr "%s: 未処理の検索結果タイプ %d が返されました" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4266 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4198 - msgid "Receiving LDAP search results..." - msgstr "LDAP サーバー検索結果を取得中..." - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4445 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4382 - msgid "Error performing search" - msgstr "検索中にエラーが発生しました" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4573 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4515 - #, c-format - msgid "Downloading contacts (%d)..." - msgstr "連絡先 (%d 個目) をダウンロード中..." - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5137 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5080 - msgid "Adding contact to LDAP server..." - msgstr "LDAP サーバーへ連絡先を追加中..." - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5212 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5155 - msgid "Modifying contact from LDAP server..." - msgstr "LDAP サーバーにある連絡先を修正中..." - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5278 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5221 - msgid "Removing contact from LDAP server..." - msgstr "LDAP サーバーから連絡先を削除中..." - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5667 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5610 - #, c-format - msgid "Failed to get the DN for user '%s'" - msgstr "ユーザー '%s' の DN 取得に失敗しました" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:853 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:865 - msgid "Loading Addressbook summary..." - msgstr "アドレス帳の要約を読み込み中..." - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:871 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:885 - #, c-format - msgid "PROPFIND on webdav failed with HTTP status %d (%s)" - msgstr "WebDAV での PROPFIND に失敗しました。HTTP ステータス: %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:890 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:904 - msgid "No response body in webdav PROPFIND result" - msgstr "WebDAV PROPFIND の結果にレスポンスボディがありません" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:951 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:965 - #, c-format - msgid "Loading Contacts (%d%%)" - msgstr "連絡先を読み込み中 (%d%%)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1283 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1354 - msgid "Cannot transform SoupURI to string" - msgstr "SoupURI を文字列に変換できません" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1402 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1475 - #, c-format - msgid "Create resource '%s' failed with HTTP status %d (%s)" - msgstr "リソース '%s' の作成に失敗しました。HTTP ステータス %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1504 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1577 - msgid "Contact on server changed -> not modifying" - msgstr "サーバー上の連絡先が変更されました -> 修正していません" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1512 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1585 - #, c-format - msgid "Modify contact failed with HTTP status %d (%s)" - msgstr "連絡先の変更に失敗しました。HTTP ステータス %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1605 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1621 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1678 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1694 - #, c-format - msgid "DELETE failed with HTTP status %d" - msgstr "削除に失敗しました。HTTP ステータス: %d" -@@ -908,8 +912,8 @@ - msgid "Twitter Name List" - msgstr "Twitter 名の一覧" - --#: ../addressbook/libebook-contacts/e-contact.c:1635 --#: ../addressbook/libebook/e-destination.c:917 -+#: ../addressbook/libebook-contacts/e-contact.c:1660 -+#: ../addressbook/libebook/e-destination.c:920 - msgid "Unnamed List" - msgstr "名前なしの一覧" - -@@ -930,7 +934,9 @@ - msgstr "国呼び出しコードが無効です" - - #: ../addressbook/libebook-contacts/e-phone-number.c:49 --msgid "Remaining text after the country calling code is too short for a phone number" -+msgid "" -+"Remaining text after the country calling code is too short for a phone " -+"number" - msgstr "国呼び出しコードの後の残り文字列が電話番号としては短すぎます" - - #: ../addressbook/libebook-contacts/e-phone-number.c:51 -@@ -941,77 +947,82 @@ - msgid "Text is too long for a phone number" - msgstr "文字列が電話番号としては長すぎます" - --#: ../addressbook/libebook/e-book-client.c:807 -+#: ../addressbook/libebook/e-book-client.c:841 - #, c-format - msgid "Unknown book property '%s'" - msgstr "不明なアドレス帳プロパティ '%s'" - --#: ../addressbook/libebook/e-book-client.c:822 -+#: ../addressbook/libebook/e-book-client.c:856 - #, c-format - msgid "Cannot change value of book property '%s'" - msgstr "アドレス帳プロパティ '%s' の値を変更できません" - --#: ../addressbook/libebook/e-book-client.c:1207 --#: ../addressbook/libebook/e-book-client.c:1382 --#: ../addressbook/libebook/e-book-client.c:1649 --#: ../calendar/libecal/e-cal-client.c:1530 --#: ../calendar/libecal/e-cal-client.c:1712 -+#: ../addressbook/libebook/e-book-client.c:1241 -+#: ../addressbook/libebook/e-book-client.c:1416 -+#: ../addressbook/libebook/e-book-client.c:1683 -+#: ../calendar/libecal/e-cal-client.c:1564 -+#: ../calendar/libecal/e-cal-client.c:1746 - #, c-format - msgid "Unable to connect to '%s': " - msgstr "'%s' へ接続できません: " - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:899 --#: ../addressbook/libedata-book/e-book-sqlite.c:2163 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:906 -+#: ../addressbook/libedata-book/e-book-sqlite.c:2201 - #, c-format - msgid "Error introspecting unknown summary field '%s'" - msgstr "不明なサマリーフィールド '%s' の内部検査エラー" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1509 --#: ../addressbook/libedata-book/e-book-sqlite.c:1319 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1516 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1340 - msgid "Error parsing regular expression" - msgstr "正規表現解析エラー" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1554 --#: ../addressbook/libedata-book/e-book-sqlite.c:1803 ../camel/camel-db.c:545 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1561 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1824 ../camel/camel-db.c:619 - #, c-format - msgid "Insufficient memory" - msgstr "メモリが足りません" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1691 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1698 - #, c-format - msgid "Invalid contact field '%d' specified in summary" - msgstr "無効な連絡先 '%d' がサマリーで指定されています" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1725 --#: ../addressbook/libedata-book/e-book-sqlite.c:557 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1732 -+#: ../addressbook/libedata-book/e-book-sqlite.c:559 - #, c-format --msgid "Contact field '%s' of type '%s' specified in summary, but only boolean, string and string list field types are supported" -+msgid "" -+"Contact field '%s' of type '%s' specified in summary, but only boolean, " -+"string and string list field types are supported" - msgstr "サマリーで連絡先 '%s' が型 '%s' に対して指定されていますが、サポートされている型は真偽値、文字列、文字列一覧だけです" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3065 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4161 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3072 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4168 - #, c-format --msgid "Full search_contacts are not stored in cache. vcards cannot be returned." -+msgid "" -+"Full search_contacts are not stored in cache. vcards cannot be returned." - msgstr "search_contacts は全体がキャッシュに保管されてはいません。vcard を返せません。" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4292 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4385 --#: ../addressbook/libedata-book/e-book-sqlite.c:5364 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4299 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4392 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5451 - #, c-format - msgid "Query contained unsupported elements" - msgstr "問い合わせにサポート外のエレメントがありました" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4296 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4303 - #, c-format - msgid "Invalid Query" - msgstr "問い合わせの内容が無効です" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4320 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4327 - #, c-format --msgid "Full search_contacts are not stored in cache. Hence only summary query is supported." -+msgid "" -+"Full search_contacts are not stored in cache. Hence only summary query is " -+"supported." - msgstr "search_contacts は全体がキャッシュに保管されてはいません。サマリーの問い合わせだけをサポートしています。" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4389 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4396 - #: ../addressbook/libedata-book/e-data-book.c:383 - #: ../addressbook/libedata-book/e-data-book.c:1028 - #: ../calendar/libedata-cal/e-data-cal.c:420 -@@ -1020,83 +1031,84 @@ - msgid "Invalid query" - msgstr "問い合わせの内容が無効です" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4432 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4439 - #, c-format --msgid "Full vcards are not stored in cache. Hence only summary query is supported." -+msgid "" -+"Full vcards are not stored in cache. Hence only summary query is supported." - msgstr "vcard は全体がキャッシュに保管されてはいません。サマリーの問い合わせだけをサポートしています。" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5255 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5262 - #, c-format - msgid "Unable to remove the db file: errno %d" - msgstr "データベースファイルの削除に失敗しました: エラー番号: %d" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6042 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6442 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6449 - #, c-format - msgid "Only summary queries are supported by EbSdbCursor" - msgstr "EbSdbCursor ではサマリーの問い合わせだけをサポートしています" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6056 - #, c-format - msgid "At least one sort field must be specified to use an EbSdbCursor" - msgstr "EbSdbCursor を利用するには並べ替える項目を最低でも1つは指定する必要があります" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6063 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 - #, c-format - msgid "Cannot sort by a field that is not in the summary" - msgstr "サマリーにない項目による並べ替えはできません" - - # Translator's NOTE: 「複数の値を取り得る」では突っ込みの余地が生まれるので補った --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6077 - #, c-format - msgid "Cannot sort by a field which may have multiple values" - msgstr "複数の値を同時に取り得る項目による並べ替えはできません" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6203 --#: ../addressbook/libedata-book/e-book-sqlite.c:7376 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6210 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7463 - #, c-format --msgid "Tried to step a cursor in reverse, but cursor is already at the beginning of the contact list" -+msgid "" -+"Tried to step a cursor in reverse, but cursor is already at the beginning of " -+"the contact list" - msgstr "カーソルを1つ手前に移動しようとしましたがカーソルは既に連絡先一覧の先頭にありました" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6211 --#: ../addressbook/libedata-book/e-book-sqlite.c:7384 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6218 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7471 - #, c-format --msgid "Tried to step a cursor forwards, but cursor is already at the end of the contact list" -+msgid "" -+"Tried to step a cursor forwards, but cursor is already at the end of the " -+"contact list" - msgstr "カーソルを1つ先に移動しようとしましたがカーソルは既に連絡先一覧の最後尾にありました" - --#: ../addressbook/libedata-book/e-book-sqlite.c:524 --#, fuzzy, c-format --#| msgid "Invalid contact field '%d' specified in summary" -+#: ../addressbook/libedata-book/e-book-sqlite.c:526 -+#, c-format - msgid "Unsupported contact field '%d' specified in summary" --msgstr "無効な連絡先 '%d' がサマリーで指定されています" -+msgstr "サポートされていない連絡先 '%d' がサマリーで指定されています" - --#: ../addressbook/libedata-book/e-book-sqlite.c:1876 --msgid "Cannot upgrade contacts database from a legacy database with more than one addressbook. Delete one of the entries in the 'folders' table first." -+#: ../addressbook/libedata-book/e-book-sqlite.c:1897 -+msgid "" -+"Cannot upgrade contacts database from a legacy database with more than one " -+"addressbook. Delete one of the entries in the 'folders' table first." - msgstr "" -+"複数のアドレスブックでは、連絡先データベースをレガシーデータベースからアップグレードできません。まず「フォルダー」表のエントリーの 1 " -+"つを削除してください。" - --#: ../addressbook/libedata-book/e-book-sqlite.c:5357 --#, fuzzy, c-format --#| msgid "Invalid query: " -+#: ../addressbook/libedata-book/e-book-sqlite.c:5444 -+#, c-format - msgid "Invalid query: %s" --msgstr "問い合わせ内容が無効です: " -+msgstr "無効なクエリー: %s" - --#: ../addressbook/libedata-book/e-book-sqlite.c:5532 --#, fuzzy --#| msgid "Invalid query: " -+#: ../addressbook/libedata-book/e-book-sqlite.c:5619 - msgid "Invalid query for EbSqlCursor" --msgstr "問い合わせ内容が無効です: " -+msgstr "EbSqlCursor の無効なクエリー" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7198 --#, fuzzy --#| msgid "At least one sort field must be specified to use an EbSdbCursor" -+#: ../addressbook/libedata-book/e-book-sqlite.c:7285 - msgid "At least one sort field must be specified to use an EbSqlCursor" --msgstr "EbSdbCursor を利用するには並べ替える項目を最低でも1つは指定する必要があります" -+msgstr "EbSqlCursor を利用するには並べ替える項目を最低でも 1 つは指定する必要があります" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7216 --#, fuzzy --#| msgid "Cannot sort by a field that is not in the summary" -+#: ../addressbook/libedata-book/e-book-sqlite.c:7303 - msgid "Cannot sort by a field that is not a string type" --msgstr "サマリーにない項目による並べ替えはできません" -+msgstr "文字列タイプでない項目による並べ替えはできません" - - #: ../addressbook/libedata-book/e-data-book.c:367 - #: ../calendar/libedata-cal/e-data-cal.c:401 -@@ -1260,15 +1272,15 @@ - msgid "Cannot remove contacts: " - msgstr "連絡先を削除できません: " - --#: ../addressbook/libedata-book/e-data-book-cursor.c:772 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:776 - msgid "Cursor does not support setting the search expression" - msgstr "カーソルは検索表現の設定をサポートしていません" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:855 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:859 - msgid "Cursor does not support step" - msgstr "カーソルはステップをサポートしていません" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:938 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:942 - msgid "Cursor does not support alphabetic indexes" - msgstr "カーソルは英字の索引をサポートしていません" - -@@ -1302,65 +1314,63 @@ - msgid "No such source for UID '%s'" - msgstr "UID '%s' にそのようなソースはありません" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:574 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 - #, c-format - msgid "Server is unreachable (%s)" - msgstr "サーバーに接続できません (%s)" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:605 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 - #, c-format - msgid "Failed to connect to a server using SSL: %s" - msgstr "SSL によるサーバーへの接続に失敗しました: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:616 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 - #, c-format --msgid "Unexpected HTTP status code %d returned (%s)" --msgstr "予想外の HTTP ステータスコード %d が返されました (%s)" -+msgid "Unexpected HTTP status code %d returned (%s) for URI: %s" -+msgstr "URI の予想外の HTTP ステータスコード %d が返されました (%s): %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:635 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:647 - msgid "CalDAV backend is not loaded yet" - msgstr "CalDAV バックエンドがまだ読み込まれていません" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1074 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1091 - msgid "Invalid Redirect URL" - msgstr "無効な転送 URL です" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2577 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2942 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2894 -+#, c-format -+msgid "Cannot create local cache folder '%s'" -+msgstr "'%s' というローカルキャッシュフォルダーを作成できません" -+ -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2946 - #, c-format - msgid "" - "Server is unreachable, calendar is opened in read-only mode.\n" - "Error message: %s" --msgstr "" --"サーバーに接続できないんで、カレンダーを読み込み専用モードで開きます。\n" -+msgstr "サーバーに接続できないんで、カレンダーを読み込み専用モードで開きます。\n" - "エラーメッセージ: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2897 --#, c-format --msgid "Cannot create local cache folder '%s'" --msgstr "'%s' というローカルキャッシュフォルダーを作成できません" -- --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3982 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3988 - msgid "CalDAV does not support bulk additions" - msgstr "CalDAV が大量追加に対応していません" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4085 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4091 - msgid "CalDAV does not support bulk modifications" - msgstr "CalDAV が大量修正に対応していません" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4261 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4267 - msgid "CalDAV does not support bulk removals" - msgstr "CalDAV が大量削除に対応していません" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4928 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4941 - msgid "Calendar doesn't support Free/Busy" - msgstr "カレンダーは予定の有無に対応しません" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4937 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4950 - msgid "Schedule outbox url not found" - msgstr "スケジュールのアウトボックス URL が見つかりません" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5034 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5047 - msgid "Unexpected result in schedule-response" - msgstr "schedule-response の予期しない結果" - -@@ -1387,95 +1397,96 @@ - msgid "Cannot save calendar data" - msgstr "カレンダーのデータを保存できません" - --#: ../calendar/backends/http/e-cal-backend-http.c:486 -+#: ../calendar/backends/http/e-cal-backend-http.c:491 - #, c-format - msgid "Malformed URI: %s" - msgstr "不正な URI: %s" - --#: ../calendar/backends/http/e-cal-backend-http.c:577 -+#: ../calendar/backends/http/e-cal-backend-http.c:582 - #, c-format - msgid "Redirected to Invalid URI" - msgstr "URI へのリダイレクトが無効です" - --#: ../calendar/backends/http/e-cal-backend-http.c:620 -+#: ../calendar/backends/http/e-cal-backend-http.c:625 - #, c-format - msgid "Bad file format." - msgstr "ファイルのフォーマットが間違っています。" - --#: ../calendar/backends/http/e-cal-backend-http.c:630 -+#: ../calendar/backends/http/e-cal-backend-http.c:635 - #, c-format - msgid "Not a calendar." - msgstr "カレンダーではありません。" - --#: ../calendar/backends/http/e-cal-backend-http.c:917 --#: ../calendar/backends/weather/e-cal-backend-weather.c:536 -+#: ../calendar/backends/http/e-cal-backend-http.c:925 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:700 - msgid "Could not create cache file" - msgstr "キャッシュファイルを生成できませんでした" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:174 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:196 - msgid "Could not retrieve weather data" - msgstr "天気のデータを取得できませんでした" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:295 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:369 - msgid "Weather: Fog" - msgstr "天気: 霧" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:296 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:370 - msgid "Weather: Cloudy Night" - msgstr "天気: 曇のある夜空" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:297 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:371 - msgid "Weather: Cloudy" - msgstr "天気: 曇り" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:298 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:372 - msgid "Weather: Overcast" - msgstr "天気: 本曇り" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:299 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:373 - msgid "Weather: Showers" - msgstr "天気: 雨" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:300 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:374 - msgid "Weather: Snow" - msgstr "天気: 雪" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:301 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:375 - msgid "Weather: Clear Night" - msgstr "天気: 澄んだ夜空" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:302 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:376 - msgid "Weather: Sunny" - msgstr "天気: 暖かい快晴" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:303 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:377 - msgid "Weather: Thunderstorms" - msgstr "天気: 雷雨" - - #. TRANSLATOR: This is the temperature in degrees Fahrenheit (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:329 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:403 - #, c-format - msgid "%.1f °F" --msgstr "" -+msgstr "%.1f °F" - - #. TRANSLATOR: This is the temperature in degrees Celsius (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:332 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:406 - #, c-format - msgid "%.1f °C" --msgstr "" -+msgstr "%.1f °C" - - #. TRANSLATOR: This is the temperature in kelvin --#: ../calendar/backends/weather/e-cal-backend-weather.c:335 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:409 - #, c-format - msgid "%.1f K" --msgstr "" -+msgstr "%.1f K" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:341 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:415 - #, c-format - msgid "%.1f" --msgstr "" -+msgstr "%.1f" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:452 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:580 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:608 - msgid "Forecast" - msgstr "天気予報" - -@@ -1531,7 +1542,7 @@ - msgstr "認証に失敗しました" - - #: ../calendar/libecal/e-cal.c:2330 --#: ../camel/providers/smtp/camel-smtp-transport.c:921 -+#: ../camel/providers/smtp/camel-smtp-transport.c:960 - #: ../libedataserver/e-client.c:147 - msgid "Authentication required" - msgstr "認証を必要としています" -@@ -1554,17 +1565,17 @@ - msgid "Invalid range" - msgstr "有効範囲が無効です" - --#: ../calendar/libecal/e-cal-client.c:936 -+#: ../calendar/libecal/e-cal-client.c:970 - #, c-format - msgid "Unknown calendar property '%s'" - msgstr "不明なカレンダープロパティ '%s'" - --#: ../calendar/libecal/e-cal-client.c:951 -+#: ../calendar/libecal/e-cal-client.c:985 - #, c-format - msgid "Cannot change value of calendar property '%s'" - msgstr "カレンダープロパティ '%s' の値を変更できません" - --#: ../calendar/libecal/e-cal-component.c:1348 -+#: ../calendar/libecal/e-cal-component.c:1349 - msgid "Untitled appointment" - msgstr "タイトルなしの予定" - -@@ -1713,103 +1724,111 @@ - msgid "Undefined" - msgstr "未定義" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:84 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1062 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1371 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1498 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1547 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:85 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1063 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1379 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1506 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1555 - #, c-format - msgid "\"%s\" expects one argument" - msgstr "\"%s\" は引数を一つ必要とします" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:91 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:673 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1378 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:92 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:674 - #: ../calendar/libedata-cal/e-cal-backend-sexp.c:1386 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1394 - #, c-format - msgid "\"%s\" expects the first argument to be a string" - msgstr "\"%s\" は最初の引数として文字列を必要とします" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:166 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:167 - #, c-format - msgid "\"%s\" expects two or three arguments" - msgstr "\"%s\" は引数を二つまたは三つ必要とします" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:173 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:262 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:324 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:823 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1069 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1447 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1505 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1554 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:174 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:263 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:325 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:824 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1070 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1455 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1513 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1562 - #, c-format - msgid "\"%s\" expects the first argument to be a time_t" - msgstr "\"%s\" は最初の引数として time_t 型の値を必要とします" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:182 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:270 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:334 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:832 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:183 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:271 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:335 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:833 - #, c-format - msgid "\"%s\" expects the second argument to be a time_t" - msgstr "\"%s\" は二番目の引数として time_t 型の値を必要とします" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:192 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:193 - #, c-format - msgid "\"%s\" expects the third argument to be a string" - msgstr "\"%s\" は三番目の引数として文字列を必要とします" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:254 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:255 - #, c-format - msgid "\"%s\" expects none or two arguments" - msgstr "\"%s\" は引数なしまたは引数を二つ必要とします" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:317 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:666 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:816 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1440 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:318 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:667 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:817 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1448 - #, c-format - msgid "\"%s\" expects two arguments" - msgstr "\"%s\" は引数を二つ必要とします" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:602 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:625 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:748 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:780 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:987 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1020 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1332 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:603 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:626 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:749 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:781 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:988 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1021 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1340 - #, c-format - msgid "\"%s\" expects no arguments" - msgstr "\"%s\" は引数を必要としません" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:682 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:683 - #, c-format - msgid "\"%s\" expects the second argument to be a string" - msgstr "\"%s\" は二番目の引数として文字列を必要とします" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:713 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:714 - #, c-format --msgid "\"%s\" expects the first argument to be either \"any\", \"summary\", or \"description\", or \"location\", or \"attendee\", or \"organizer\", or \"classification\"" --msgstr "\"%s\" は最初の引数として \"any\", \"summary\" または \"description\"、\"location\"、\"attendee\"、\"organizer\"、\"classification\" のいずれか一つが必要です" -+msgid "" -+"\"%s\" expects the first argument to be either \"any\", \"summary\", or " -+"\"description\", or \"location\", or \"attendee\", or \"organizer\", or " -+"\"classification\"" -+msgstr "" -+"\"%s\" は最初の引数として \"any\", \"summary\" または " -+"\"description\"、\"location\"、\"attendee\"、\"organizer\"、\"classification\" " -+"のいずれか一つが必要です" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:884 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:885 - #, c-format - msgid "\"%s\" expects at least one argument" - msgstr "\"%s\" は少なくとも引数を一つ必要とします" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:899 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:900 - #, c-format --msgid "\"%s\" expects all arguments to be strings or one and only one argument to be a boolean false (#f)" -+msgid "" -+"\"%s\" expects all arguments to be strings or one and only one argument to " -+"be a boolean false (#f)" - msgstr "\"%s\" は、すべての引数が文字列であるか、または引数が一つだけで論理値 FALSE (#f) である必要があります" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1395 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1403 - #, c-format - msgid "\"%s\" expects the first argument to be an ISO 8601 date/time string" - msgstr "\"%s\" は最初の引数として \"ISO 8601 日付/時刻\" の文字列を必要とします" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1456 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1464 - #, c-format - msgid "\"%s\" expects the second argument to be an integer" - msgstr "\"%s\" は二番目の引数として整数値を必要とします" -@@ -2027,7 +2046,7 @@ - msgid "Invalid arguments to (user-tag)" - msgstr "(user-tag) に対する無効な引数" - --#: ../camel/camel-filter-search.c:1044 ../camel/camel-filter-search.c:1053 -+#: ../camel/camel-filter-search.c:1075 ../camel/camel-filter-search.c:1086 - #, c-format - msgid "Error executing filter search: %s: %s" - msgstr "フィルター検索実行中にエラー: %s: %s" -@@ -2050,16 +2069,16 @@ - msgid_plural "Filtering new messages in '%s'" - msgstr[0] "'%s' にある新しいメッセージのフィルターリング中" - --#: ../camel/camel-folder.c:1011 -+#: ../camel/camel-folder.c:1017 - #: ../camel/providers/local/camel-maildir-folder.c:330 - msgid "Moving messages" - msgstr "メッセージの移動中" - --#: ../camel/camel-folder.c:1014 -+#: ../camel/camel-folder.c:1020 - msgid "Copying messages" - msgstr "メッセージのコピー中" - --#: ../camel/camel-folder.c:1056 -+#: ../camel/camel-folder.c:1062 - #, c-format - msgid "Quota information not supported for folder '%s'" - msgstr "フォルダー'%s' に対してはクオータ情報はサポートされていません" -@@ -2079,181 +2098,174 @@ - msgid "Retrieving quota information for '%s'" - msgstr "'%s' のクオータ情報を取得中" - --#: ../camel/camel-folder.c:3487 -+#: ../camel/camel-folder.c:3484 - #, c-format - msgid "Refreshing folder '%s'" - msgstr "フォルダー '%s' を更新中" - - #. Translators: The '%s' is an element type name, part of an expressing language --#: ../camel/camel-folder-search.c:886 ../camel/camel-folder-search.c:929 -+#: ../camel/camel-folder-search.c:898 ../camel/camel-folder-search.c:941 - #, c-format - msgid "(%s) requires a single bool result" - msgstr "(%s) には論理結果が必要です" - - #. Translators: Each '%s' is an element type name, part of an expressing language --#: ../camel/camel-folder-search.c:964 -+#: ../camel/camel-folder-search.c:976 - #, c-format - msgid "(%s) not allowed inside %s" - msgstr "(%s) は %s の中に含めることはできません" - - #. Translators: The '%s' is an element type name, part of an expressing language --#: ../camel/camel-folder-search.c:971 ../camel/camel-folder-search.c:979 -+#: ../camel/camel-folder-search.c:983 ../camel/camel-folder-search.c:991 - #, c-format - msgid "(%s) requires a match type string" - msgstr "(%s) には検索の種類を表す文字列が必要です" - - #. Translators: The '%s' is an element type name, part of an expressing language --#: ../camel/camel-folder-search.c:1007 -+#: ../camel/camel-folder-search.c:1019 - #, c-format - msgid "(%s) expects an array result" - msgstr "(%s) は配列の結果を期待します" - - #. Translators: The '%s' is an element type name, part of an expressing language --#: ../camel/camel-folder-search.c:1017 -+#: ../camel/camel-folder-search.c:1029 - #, c-format - msgid "(%s) requires the folder set" - msgstr "(%s) にはフォルダーの組が必要です" - --#: ../camel/camel-folder-search.c:1931 ../camel/camel-folder-search.c:2097 -+#: ../camel/camel-folder-search.c:1943 ../camel/camel-folder-search.c:2109 - #, c-format --msgid "" --"Cannot parse search expression: %s:\n" -+msgid "Cannot parse search expression: %s:\n" - "%s" --msgstr "" --"正規表現の構文を解析できません: %s:\n" -+msgstr "正規表現の構文を解析できません: %s:\n" - "%s" - --#: ../camel/camel-folder-search.c:1943 ../camel/camel-folder-search.c:2109 -+#: ../camel/camel-folder-search.c:1955 ../camel/camel-folder-search.c:2121 - #, c-format --msgid "" --"Error executing search expression: %s:\n" -+msgid "Error executing search expression: %s:\n" - "%s" --msgstr "" --"正規表現での検索を実行中にエラー: %s:\n" -+msgstr "正規表現での検索を実行中にエラー: %s:\n" - "%s" - --#: ../camel/camel-gpg-context.c:721 ../camel/camel-gpg-context.c:726 --#: ../camel/camel-gpg-context.c:1383 -+#: ../camel/camel-gpg-context.c:725 ../camel/camel-gpg-context.c:730 -+#: ../camel/camel-gpg-context.c:1387 - #, c-format - msgid "Failed to execute gpg: %s" - msgstr "GPG の実行に失敗しました: %s" - --#: ../camel/camel-gpg-context.c:726 --#: ../camel/providers/smtp/camel-smtp-transport.c:924 -+#: ../camel/camel-gpg-context.c:730 -+#: ../camel/providers/smtp/camel-smtp-transport.c:963 - msgid "Unknown" - msgstr "不明" - --#: ../camel/camel-gpg-context.c:791 -+#: ../camel/camel-gpg-context.c:795 - #, c-format --msgid "" --"Unexpected GnuPG status message encountered:\n" -+msgid "Unexpected GnuPG status message encountered:\n" - "\n" - "%s" --msgstr "" --"Unexpected GnuPG status message encountered:\n" -+msgstr "Unexpected GnuPG status message encountered:\n" - "\n" - "%s" - --#: ../camel/camel-gpg-context.c:827 -+#: ../camel/camel-gpg-context.c:831 - #, c-format - msgid "Failed to parse gpg userid hint." - msgstr "GnuPG のユーザー ID ヒントの解析に失敗しました。" - --#: ../camel/camel-gpg-context.c:852 ../camel/camel-gpg-context.c:867 -+#: ../camel/camel-gpg-context.c:856 ../camel/camel-gpg-context.c:871 - #, c-format - msgid "Failed to parse gpg passphrase request." - msgstr "GnuPG のパスフレーズ要求の解析に失敗しました。" - --#: ../camel/camel-gpg-context.c:888 -+#: ../camel/camel-gpg-context.c:892 - #, c-format --msgid "" --"You need a PIN to unlock the key for your\n" -+msgid "You need a PIN to unlock the key for your\n" - "SmartCard: \"%s\"" --msgstr "" --"お使いのスマートカードのキーを解除するには\n" -+msgstr "お使いのスマートカードのキーを解除するには\n" - "PIN が必要です: \"%s\"" - --#: ../camel/camel-gpg-context.c:892 -+#: ../camel/camel-gpg-context.c:896 - #, c-format --msgid "" --"You need a passphrase to unlock the key for\n" -+msgid "You need a passphrase to unlock the key for\n" - "user: \"%s\"" --msgstr "" --"次のユーザーのキーを解除するにはパスフレーズが必要です:\n" -+msgstr "次のユーザーのキーを解除するにはパスフレーズが必要です:\n" - " \"%s\"" - --#: ../camel/camel-gpg-context.c:898 -+#: ../camel/camel-gpg-context.c:902 - #, c-format - msgid "Unexpected request from GnuPG for '%s'" - msgstr "'%s' に対して GnuPG から想定外の要求がありました" - --#: ../camel/camel-gpg-context.c:910 --msgid "Note the encrypted content doesn't contain information about a recipient, thus there will be a password prompt for each of stored private key." --msgstr "暗号化されたコンテンツには受信者に関する情報は含まれないため、格納されている各プライベートキーごとにパスワードの入力が求められることになります。" -+#: ../camel/camel-gpg-context.c:914 -+msgid "" -+"Note the encrypted content doesn't contain information about a recipient, " -+"thus there will be a password prompt for each of stored private key." -+msgstr "" -+"暗号化されたコンテンツには受信者に関する情報は含まれないため、格納されている各プライベートキーごとにパスワードの入力が求められることになります。" - --#: ../camel/camel-gpg-context.c:941 ../camel/camel-net-utils.c:522 -+#: ../camel/camel-gpg-context.c:945 ../camel/camel-net-utils.c:524 - #: ../camel/providers/nntp/camel-nntp-summary.c:401 - #: ../libedataserver/e-client.c:158 - #, c-format - msgid "Cancelled" - msgstr "キャンセル済み" - --#: ../camel/camel-gpg-context.c:962 -+#: ../camel/camel-gpg-context.c:966 - #, c-format - msgid "Failed to unlock secret key: 3 bad passphrases given." - msgstr "秘密鍵の解除に失敗しました: 指定した三つのパスフレーズがおかしいです。" - --#: ../camel/camel-gpg-context.c:975 -+#: ../camel/camel-gpg-context.c:979 - #, c-format - msgid "Unexpected response from GnuPG: %s" - msgstr "GnuPG から想定外の応答がありました: %s" - --#: ../camel/camel-gpg-context.c:1106 -+#: ../camel/camel-gpg-context.c:1110 - #, c-format - msgid "Failed to encrypt: No valid recipients specified." - msgstr "暗号化に失敗しました: 正しい宛先が指定されていません。" - --#: ../camel/camel-gpg-context.c:1658 ../camel/camel-smime-context.c:844 -+#: ../camel/camel-gpg-context.c:1662 ../camel/camel-smime-context.c:844 - msgid "Could not generate signing data: " - msgstr "署名データを生成できませんでした: " - --#: ../camel/camel-gpg-context.c:1708 ../camel/camel-gpg-context.c:1920 --#: ../camel/camel-gpg-context.c:2030 ../camel/camel-gpg-context.c:2179 -+#: ../camel/camel-gpg-context.c:1712 ../camel/camel-gpg-context.c:1924 -+#: ../camel/camel-gpg-context.c:2034 ../camel/camel-gpg-context.c:2183 - msgid "Failed to execute gpg." - msgstr "GPG の実行に失敗しました。" - --#: ../camel/camel-gpg-context.c:1791 ../camel/camel-gpg-context.c:1799 --#: ../camel/camel-gpg-context.c:1807 ../camel/camel-gpg-context.c:1827 -+#: ../camel/camel-gpg-context.c:1795 ../camel/camel-gpg-context.c:1803 -+#: ../camel/camel-gpg-context.c:1811 ../camel/camel-gpg-context.c:1831 - #: ../camel/camel-smime-context.c:973 ../camel/camel-smime-context.c:987 - #: ../camel/camel-smime-context.c:996 - #, c-format - msgid "Cannot verify message signature: Incorrect message format" - msgstr "このメッセージ署名の整合性を確認できません: メッセージの書式が正しくありません" - --#: ../camel/camel-gpg-context.c:1873 -+#: ../camel/camel-gpg-context.c:1877 - msgid "Cannot verify message signature: " - msgstr "このメッセージ署名の整合性を確認できません: " - --#: ../camel/camel-gpg-context.c:1996 -+#: ../camel/camel-gpg-context.c:2000 - msgid "Could not generate encrypting data: " - msgstr "暗号化されたデータを生成できませんでした: " - --#: ../camel/camel-gpg-context.c:2049 -+#: ../camel/camel-gpg-context.c:2053 - msgid "This is a digitally encrypted message part" - msgstr "これはデジタル署名された部分です" - --#: ../camel/camel-gpg-context.c:2105 ../camel/camel-gpg-context.c:2114 --#: ../camel/camel-gpg-context.c:2137 -+#: ../camel/camel-gpg-context.c:2109 ../camel/camel-gpg-context.c:2118 -+#: ../camel/camel-gpg-context.c:2141 - #, c-format - msgid "Cannot decrypt message: Incorrect message format" - msgstr "メッセージを解読できません: メッセージの書式が正しくありません" - --#: ../camel/camel-gpg-context.c:2125 -+#: ../camel/camel-gpg-context.c:2129 - #, c-format - msgid "Failed to decrypt MIME part: protocol error" - msgstr "MIME 型の暗号解読に失敗しました: プロトコルエラー" - --#: ../camel/camel-gpg-context.c:2220 ../camel/camel-smime-context.c:1289 -+#: ../camel/camel-gpg-context.c:2224 ../camel/camel-smime-context.c:1289 - msgid "Encrypted content" - msgstr "暗号化した内容" - -@@ -2370,31 +2382,25 @@ - msgid "parse error" - msgstr "解析エラー" - --#: ../camel/camel-net-utils.c:702 -+#: ../camel/camel-net-utils.c:706 - #, c-format - msgid "Resolving: %s" - msgstr "解決中: %s" - --#: ../camel/camel-net-utils.c:725 -+#: ../camel/camel-net-utils.c:731 - msgid "Host lookup failed" - msgstr "ホストの検索に失敗しました" - --#: ../camel/camel-net-utils.c:731 -+#: ../camel/camel-net-utils.c:737 - #, c-format - msgid "Host lookup '%s' failed. Check your host name for spelling errors." - msgstr "ホストの検索 '%s' に失敗しました。ホスト名につづりの誤りがないか確認してください。" - --#: ../camel/camel-net-utils.c:735 -+#: ../camel/camel-net-utils.c:741 - #, c-format - msgid "Host lookup '%s' failed: %s" - msgstr "ホストの検索 '%s' に失敗しました: %s" - --#: ../camel/camel-network-service.c:1009 --#, fuzzy --#| msgid "No quota information available for folder '%s'" --msgid "No host information available" --msgstr "フォルダー'%s' について利用できるクオータ情報はありません" -- - #: ../camel/camel-offline-folder.c:90 - msgid "Downloading new messages for offline mode" - msgstr "オフラインモードでの新着メールのダウンロード中" -@@ -2452,29 +2458,23 @@ - - #: ../camel/camel-sasl-anonymous.c:79 - #, c-format --msgid "" --"Invalid email address trace information:\n" -+msgid "Invalid email address trace information:\n" - "%s" --msgstr "" --"無効な メールアドレスのトレース情報:\n" -+msgstr "無効な メールアドレスのトレース情報:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:93 - #, c-format --msgid "" --"Invalid opaque trace information:\n" -+msgid "Invalid opaque trace information:\n" - "%s" --msgstr "" --"無効で不可解なトレース情報:\n" -+msgstr "無効で不可解なトレース情報:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:107 - #, c-format --msgid "" --"Invalid trace information:\n" -+msgid "Invalid trace information:\n" - "%s" --msgstr "" --"無効なトレース情報:\n" -+msgstr "無効なトレース情報:\n" - "%s" - - #: ../camel/camel-sasl-cram-md5.c:44 -@@ -2482,7 +2482,9 @@ - msgstr "CRAM-MD5" - - #: ../camel/camel-sasl-cram-md5.c:46 --msgid "This option will connect to the server using a secure CRAM-MD5 password, if the server supports it." -+msgid "" -+"This option will connect to the server using a secure CRAM-MD5 password, if " -+"the server supports it." - msgstr "サーバーがサポートしている場合、このオプションはセキュリティ保護された CRAM-MD5 認証を使ってサーバーへ接続します。" - - #: ../camel/camel-sasl-digest-md5.c:57 -@@ -2490,95 +2492,113 @@ - msgstr "DIGEST-MD5" - - #: ../camel/camel-sasl-digest-md5.c:59 --msgid "This option will connect to the server using a secure DIGEST-MD5 password, if the server supports it." -+msgid "" -+"This option will connect to the server using a secure DIGEST-MD5 password, " -+"if the server supports it." - msgstr "サーバーがサポートしている場合、このオプションはセキュリティ保護された DIGEST-MD5 を使ってサーバーへ接続します。" - --#: ../camel/camel-sasl-digest-md5.c:853 -+#: ../camel/camel-sasl-digest-md5.c:855 - #, c-format - msgid "Server challenge too long (>2048 octets)" - msgstr "サーバー要求が長すぎます (2048 octet 以上です)" - --#: ../camel/camel-sasl-digest-md5.c:864 -+#: ../camel/camel-sasl-digest-md5.c:866 - #, c-format - msgid "Server challenge invalid\n" - msgstr "無効です\n" - --#: ../camel/camel-sasl-digest-md5.c:872 -+#: ../camel/camel-sasl-digest-md5.c:874 - #, c-format - msgid "Server challenge contained invalid \"Quality of Protection\" token" - msgstr "サーバー要求におかしな \"保護品質 (QOP: Quality of Protection)\" のトークンが含まれています" - --#: ../camel/camel-sasl-digest-md5.c:905 -+#: ../camel/camel-sasl-digest-md5.c:907 - #, c-format - msgid "Server response did not contain authorization data" - msgstr "サーバーの応答に認証データがありません" - --#: ../camel/camel-sasl-digest-md5.c:926 -+#: ../camel/camel-sasl-digest-md5.c:928 - #, c-format - msgid "Server response contained incomplete authorization data" - msgstr "サーバーの応答に不完全な認証データがあります" - --#: ../camel/camel-sasl-digest-md5.c:939 -+#: ../camel/camel-sasl-digest-md5.c:941 - #, c-format - msgid "Server response does not match" - msgstr "サーバーの応答が一致しません" - --#: ../camel/camel-sasl-gssapi.c:89 -+#: ../camel/camel-sasl-gssapi.c:95 - msgid "GSSAPI" - msgstr "GSSAPI" - --#: ../camel/camel-sasl-gssapi.c:91 --msgid "This option will connect to the server using Kerberos 5 authentication." -+#: ../camel/camel-sasl-gssapi.c:97 -+msgid "" -+"This option will connect to the server using Kerberos 5 authentication." - msgstr "このオプションは Kerberos 5 認証を使ってサーバーに接続します。" - --#: ../camel/camel-sasl-gssapi.c:134 --msgid "The specified mechanism is not supported by the provided credential, or is unrecognized by the implementation." -+#: ../camel/camel-sasl-gssapi.c:149 -+#, c-format -+msgid "(Unknown GSSAPI mechanism code: %x)" -+msgstr "(不明な GSSAPI メカニズムコード: %x)" -+ -+#: ../camel/camel-sasl-gssapi.c:182 -+msgid "" -+"The specified mechanism is not supported by the provided credential, or is " -+"unrecognized by the implementation." - msgstr "指定したメカニズムが提供された証明書ではサポートされていないか、その実装で認識されていません。" - --#: ../camel/camel-sasl-gssapi.c:139 -+#: ../camel/camel-sasl-gssapi.c:187 - msgid "The provided target_name parameter was ill-formed." - msgstr "指定した引数 target_name の形式が間違っています。" - --#: ../camel/camel-sasl-gssapi.c:142 --msgid "The provided target_name parameter contained an invalid or unsupported type of name." -+#: ../camel/camel-sasl-gssapi.c:190 -+msgid "" -+"The provided target_name parameter contained an invalid or unsupported type " -+"of name." - msgstr "指定した引数の target_name に無効な、あるいはサポートしていない種類の名前があります。" - --#: ../camel/camel-sasl-gssapi.c:146 --msgid "The input_token contains different channel bindings to those specified via the input_chan_bindings parameter." -+#: ../camel/camel-sasl-gssapi.c:194 -+msgid "" -+"The input_token contains different channel bindings to those specified via " -+"the input_chan_bindings parameter." - msgstr "input_token に引数 input_chan_bindings を介して指定された別のチャンネルのビンディングがあります。" - --#: ../camel/camel-sasl-gssapi.c:151 --msgid "The input_token contains an invalid signature, or a signature that could not be verified." -+#: ../camel/camel-sasl-gssapi.c:199 -+msgid "" -+"The input_token contains an invalid signature, or a signature that could not " -+"be verified." - msgstr "input_token の中に無効な署名があるか、またはその署名が正しくありません。" - --#: ../camel/camel-sasl-gssapi.c:155 --msgid "The supplied credentials were not valid for context initiation, or the credential handle did not reference any credentials." -+#: ../camel/camel-sasl-gssapi.c:203 -+msgid "" -+"The supplied credentials were not valid for context initiation, or the " -+"credential handle did not reference any credentials." - msgstr "指定した証明書でコンテキストの初期化はできないか、または証明書のハンドルが任意の証明書を参照していませんでした。" - --#: ../camel/camel-sasl-gssapi.c:160 -+#: ../camel/camel-sasl-gssapi.c:208 - msgid "The supplied context handle did not refer to a valid context." - msgstr "指定したコンテキストのハンドルが正しいコンテキストを参照していませんでした。" - --#: ../camel/camel-sasl-gssapi.c:163 -+#: ../camel/camel-sasl-gssapi.c:211 - msgid "The consistency checks performed on the input_token failed." - msgstr "input_token で実施した整合性のチェックが失敗しました。" - --#: ../camel/camel-sasl-gssapi.c:166 -+#: ../camel/camel-sasl-gssapi.c:214 - msgid "The consistency checks performed on the credential failed." - msgstr "証明書で実施した整合性のチェックが失敗しました。" - --#: ../camel/camel-sasl-gssapi.c:169 -+#: ../camel/camel-sasl-gssapi.c:217 - msgid "The referenced credentials have expired." - msgstr "参照している証明書の期限が過ぎています。" - --#: ../camel/camel-sasl-gssapi.c:175 ../camel/camel-sasl-gssapi.c:352 --#: ../camel/camel-sasl-gssapi.c:400 ../camel/camel-sasl-gssapi.c:417 --#: ../camel/providers/smtp/camel-smtp-transport.c:622 -+#: ../camel/camel-sasl-gssapi.c:223 ../camel/camel-sasl-gssapi.c:405 -+#: ../camel/camel-sasl-gssapi.c:454 ../camel/camel-sasl-gssapi.c:471 -+#: ../camel/providers/smtp/camel-smtp-transport.c:659 - #, c-format - msgid "Bad authentication response from server." - msgstr "サーバーから間違った認証応答がありました。" - --#: ../camel/camel-sasl-gssapi.c:429 -+#: ../camel/camel-sasl-gssapi.c:483 - #, c-format - msgid "Unsupported security layer." - msgstr "サポートしていないセキュリティレイヤーです。" -@@ -2601,7 +2621,9 @@ - msgstr "NTLM / SPA" - - #: ../camel/camel-sasl-ntlm.c:48 --msgid "This option will connect to a Windows-based server using NTLM / Secure Password Authentication." -+msgid "" -+"This option will connect to a Windows-based server using NTLM / Secure " -+"Password Authentication." - msgstr "このオプションは NTLM/セキュリティ保護されたパスワード認証を使って Windows サーバーに接続します。" - - #: ../camel/camel-sasl-plain.c:42 -@@ -2641,10 +2663,10 @@ - msgstr "'%s' というプロトコルに無効な GType が登録されています" - - #: ../camel/camel-session.c:502 --#: ../camel/providers/imapx/camel-imapx-server.c:4814 -+#: ../camel/providers/imapx/camel-imapx-server.c:4821 - #: ../camel/providers/pop3/camel-pop3-store.c:311 --#: ../camel/providers/pop3/camel-pop3-store.c:757 --#: ../camel/providers/smtp/camel-smtp-transport.c:515 -+#: ../camel/providers/pop3/camel-pop3-store.c:766 -+#: ../camel/providers/smtp/camel-smtp-transport.c:545 - #, c-format - msgid "No support for %s authentication" - msgstr "%s という認証タイプはサポートしていません" -@@ -2848,49 +2870,53 @@ - msgid "S/MIME Decrypt: No encrypted content found" - msgstr "S/MIME 復号化: 暗号化された内容がありません" - --#: ../camel/camel-store.c:1232 -+#: ../camel/camel-store.c:1238 - #, c-format - msgid "Opening folder '%s'" - msgstr "フォルダー '%s' を開いています" - --#: ../camel/camel-store.c:1523 -+#: ../camel/camel-store.c:1529 - #, c-format - msgid "Scanning folders in '%s'" - msgstr "'%s' にあるフォルダーをスキャン中" - --#: ../camel/camel-store.c:1551 ../camel/camel-store.c:1596 -+#: ../camel/camel-store.c:1557 ../camel/camel-store.c:1602 - #: ../camel/camel-vtrash-folder.c:46 - msgid "Trash" - msgstr "ゴミ箱" - --#: ../camel/camel-store.c:1565 ../camel/camel-store.c:1613 -+#: ../camel/camel-store.c:1571 ../camel/camel-store.c:1619 - #: ../camel/camel-vtrash-folder.c:48 - msgid "Junk" - msgstr "ジャンク" - --#: ../camel/camel-store.c:2214 -+#: ../camel/camel-store.c:2220 - #, c-format - msgid "Cannot create folder: %s: folder exists" - msgstr "フォルダーを作成できません: %s: フォルダーが存在します" - --#: ../camel/camel-store.c:2221 -+#: ../camel/camel-store.c:2227 - #, c-format - msgid "Creating folder '%s'" - msgstr "フォルダー '%s' の作成中" - --#: ../camel/camel-store.c:2398 ../camel/camel-vee-store.c:416 --#: ../camel/providers/local/camel-maildir-store.c:321 -+#: ../camel/camel-store.c:2404 ../camel/camel-vee-store.c:410 -+#: ../camel/providers/local/camel-maildir-store.c:346 - #, c-format - msgid "Cannot delete folder: %s: Invalid operation" - msgstr "フォルダーを削除できません: %s: 無効な操作です" - --#: ../camel/camel-store.c:2588 ../camel/camel-vee-store.c:467 --#: ../camel/providers/local/camel-maildir-store.c:852 -+#: ../camel/camel-store.c:2594 ../camel/camel-vee-store.c:461 -+#: ../camel/providers/local/camel-maildir-store.c:914 - #, c-format - msgid "Cannot rename folder: %s: Invalid operation" - msgstr "フォルダー名を変更できません: %s: 無効な操作です" - --#: ../camel/camel-stream.c:285 ../camel/camel-stream.c:336 -+#: ../camel/camel-stream.c:170 -+msgid "Cannot write with no base stream" -+msgstr "ベースストリームなしで書き込みができません" -+ -+#: ../camel/camel-stream.c:290 ../camel/camel-stream.c:341 - #, c-format - msgid "Stream type '%s' is not seekable" - msgstr "ストリームタイプ '%s' は検索できません" -@@ -2958,17 +2984,17 @@ - msgid "Unmatched" - msgstr "該当しないもの" - --#: ../camel/camel-vee-store.c:442 -+#: ../camel/camel-vee-store.c:436 - #, c-format - msgid "Cannot delete folder: %s: No such folder" - msgstr "フォルダーを削除できません: %s: そのようなフォルダーはありません" - --#: ../camel/camel-vee-store.c:477 -+#: ../camel/camel-vee-store.c:471 - #, c-format - msgid "Cannot rename folder: %s: No such folder" - msgstr "フォルダー名を変更できません: %s: そのようなフォルダーはありません" - --#: ../camel/camel-vee-store.c:539 -+#: ../camel/camel-vee-store.c:533 - msgid "Enable _Unmatched folder" - msgstr "一致しないフォルダーを有効にする(_U)" - -@@ -2980,46 +3006,46 @@ - msgid "Cannot copy messages to the Junk folder" - msgstr "ジャンクフォルダーへメッセージをコピーできません" - --#: ../camel/providers/imapx/camel-imapx-folder.c:727 -+#: ../camel/providers/imapx/camel-imapx-folder.c:796 - #, c-format - msgid "No quota information available for folder '%s'" - msgstr "フォルダー'%s' について利用できるクオータ情報はありません" - --#: ../camel/providers/imapx/camel-imapx-folder.c:841 --#: ../camel/providers/imapx/camel-imapx-folder.c:934 -+#: ../camel/providers/imapx/camel-imapx-folder.c:936 -+#: ../camel/providers/imapx/camel-imapx-folder.c:1029 - #, c-format - msgid "No destination folder specified" - msgstr "対象フォルダーが指定されていません" - --#: ../camel/providers/imapx/camel-imapx-folder.c:869 -+#: ../camel/providers/imapx/camel-imapx-folder.c:964 - msgid "Unable to move junk messages" - msgstr "ジャンクメッセージを移動できません" - --#: ../camel/providers/imapx/camel-imapx-folder.c:962 -+#: ../camel/providers/imapx/camel-imapx-folder.c:1057 - msgid "Unable to move deleted messages" - msgstr "削除したメッセージを移動できません" - --#: ../camel/providers/imapx/camel-imapx-folder.c:1189 --#: ../camel/providers/nntp/camel-nntp-folder.c:758 -+#: ../camel/providers/imapx/camel-imapx-folder.c:1374 -+#: ../camel/providers/nntp/camel-nntp-folder.c:760 - msgid "Apply message _filters to this folder" - msgstr "このフォルダーにメッセージフィルターを適用 (_F)" - --#: ../camel/providers/imapx/camel-imapx-folder.c:1295 -+#: ../camel/providers/imapx/camel-imapx-folder.c:1485 - #, c-format - msgid "Could not create folder summary for %s" - msgstr "%s のフォルダーサマリを作成できませんでした" - --#: ../camel/providers/imapx/camel-imapx-folder.c:1304 -+#: ../camel/providers/imapx/camel-imapx-folder.c:1494 - #, c-format - msgid "Could not create cache for %s: " - msgstr "%s のキャッシュを生成できませんでした: " - --#: ../camel/providers/imapx/camel-imapx-folder.c:1489 -+#: ../camel/providers/imapx/camel-imapx-folder.c:1709 - #, c-format - msgid "No IMAP mailbox available for folder '%s'" - msgstr "フォルダー '%s' で利用できる IMAP mailbox はありません" - --#: ../camel/providers/imapx/camel-imapx-input-stream.c:92 -+#: ../camel/providers/imapx/camel-imapx-input-stream.c:93 - #, c-format - msgid "Source stream returned no data" - msgstr "ソースストリームはデータを返しませんでした" -@@ -3045,23 +3071,31 @@ - msgstr "サーバー変更の通知をリッスンする(_L)" - - #: ../camel/providers/imapx/camel-imapx-provider.c:49 -+msgid "Connection to Server" -+msgstr "サーバへの接続" -+ -+#: ../camel/providers/imapx/camel-imapx-provider.c:51 -+msgid "Numbe_r of concurrent connections to use" -+msgstr "同時接続の数(_R)" -+ -+#: ../camel/providers/imapx/camel-imapx-provider.c:54 - #: ../camel/providers/nntp/camel-nntp-provider.c:44 - msgid "Folders" - msgstr "フォルダー" - --#: ../camel/providers/imapx/camel-imapx-provider.c:51 -+#: ../camel/providers/imapx/camel-imapx-provider.c:56 - msgid "_Show only subscribed folders" - msgstr "購読しているフォルダーだけ表示する(_S)" - --#: ../camel/providers/imapx/camel-imapx-provider.c:54 -+#: ../camel/providers/imapx/camel-imapx-provider.c:59 - msgid "O_verride server-supplied folder namespace" - msgstr "サーバーが提供するフォルダーのネームスペースを上書きする(_V)" - --#: ../camel/providers/imapx/camel-imapx-provider.c:56 -+#: ../camel/providers/imapx/camel-imapx-provider.c:61 - msgid "Namespace:" - msgstr "ネームスペース:" - --#: ../camel/providers/imapx/camel-imapx-provider.c:59 -+#: ../camel/providers/imapx/camel-imapx-provider.c:64 - #: ../camel/providers/local/camel-local-provider.c:39 - #: ../camel/providers/local/camel-local-provider.c:79 - #: ../camel/providers/local/camel-local-provider.c:99 -@@ -3069,259 +3103,262 @@ - msgid "Options" - msgstr "オプション" - --#: ../camel/providers/imapx/camel-imapx-provider.c:61 -+#: ../camel/providers/imapx/camel-imapx-provider.c:66 - #: ../camel/providers/nntp/camel-nntp-provider.c:41 - msgid "Apply _filters to new messages in all folders" - msgstr "すべてのフォルダーの新着メッセージにフィルターを適用する(_F)" - --#: ../camel/providers/imapx/camel-imapx-provider.c:63 -+#: ../camel/providers/imapx/camel-imapx-provider.c:68 - msgid "_Apply filters to new messages in Inbox on this server" - msgstr "このサーバーの受信箱の新しいメッセージへフィルターを適用する(_A)" - --#: ../camel/providers/imapx/camel-imapx-provider.c:65 -+#: ../camel/providers/imapx/camel-imapx-provider.c:70 - msgid "Check new messages for _Junk contents" - msgstr "新着メールにスパムが含まれているかチェックする(_J)" - --#: ../camel/providers/imapx/camel-imapx-provider.c:67 -+#: ../camel/providers/imapx/camel-imapx-provider.c:72 - msgid "Only check for Junk messages in the IN_BOX folder" - msgstr "受信箱にあるメールだけスパムかどうかチェックする(_B)" - --#: ../camel/providers/imapx/camel-imapx-provider.c:69 -+#: ../camel/providers/imapx/camel-imapx-provider.c:74 - msgid "Automatically synchroni_ze remote mail locally" - msgstr "リモートとローカルのメールを自動的に同期する(_Z)" - --#: ../camel/providers/imapx/camel-imapx-provider.c:75 -+#: ../camel/providers/imapx/camel-imapx-provider.c:80 - msgid "Default IMAP port" - msgstr "デフォルトの IMAP ポート" - --#: ../camel/providers/imapx/camel-imapx-provider.c:76 -+#: ../camel/providers/imapx/camel-imapx-provider.c:81 - msgid "IMAP over SSL" - msgstr "IMAP over SSL" - --#: ../camel/providers/imapx/camel-imapx-provider.c:83 -+#: ../camel/providers/imapx/camel-imapx-provider.c:88 - msgid "IMAP+" - msgstr "IMAP+" - --#: ../camel/providers/imapx/camel-imapx-provider.c:85 -+#: ../camel/providers/imapx/camel-imapx-provider.c:90 - msgid "For reading and storing mail on IMAP servers." - msgstr "IMAP サーバーのメールを読んだり大切なメールを保存します。" - --#: ../camel/providers/imapx/camel-imapx-server.c:844 -+#: ../camel/providers/imapx/camel-imapx-server.c:1016 -+#: ../camel/providers/imapx/camel-imapx-server.c:1023 - #, c-format - msgid "Not authenticated" - msgstr "認証されていません" - --#: ../camel/providers/imapx/camel-imapx-server.c:1773 -+#: ../camel/providers/imapx/camel-imapx-server.c:1751 - msgid "Server disconnected" - msgstr "サーバーが切断されました" - --#: ../camel/providers/imapx/camel-imapx-server.c:2255 -+#: ../camel/providers/imapx/camel-imapx-server.c:2252 - msgid "Error writing to cache stream" - msgstr "キャッシュストリームに書き込み中にエラー" - --#: ../camel/providers/imapx/camel-imapx-server.c:3672 -+#: ../camel/providers/imapx/camel-imapx-server.c:3640 - msgid "Error performing IDLE" - msgstr "IDLE を実行する際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:4661 -+#: ../camel/providers/imapx/camel-imapx-server.c:4660 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: %s" - msgstr "セキュリティ保護されたモードで IMAP サーバー %s への接続に失敗しました: %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:4662 --#: ../camel/providers/smtp/camel-smtp-transport.c:215 -+#: ../camel/providers/imapx/camel-imapx-server.c:4661 -+#: ../camel/providers/smtp/camel-smtp-transport.c:216 - msgid "STARTTLS not supported" - msgstr "STARTTLS 拡張はサポートしていません。" - --#: ../camel/providers/imapx/camel-imapx-server.c:4722 -+#: ../camel/providers/imapx/camel-imapx-server.c:4721 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: " - msgstr "セキュリティ保護されたモードによる IMAP サーバー %s への接続に失敗しました: " - --#: ../camel/providers/imapx/camel-imapx-server.c:4803 -+#: ../camel/providers/imapx/camel-imapx-server.c:4810 - #, c-format - msgid "IMAP server %s does not support %s authentication" - msgstr "IMAP サーバーの %s では %s という認証タイプをサポートしていません" - --#: ../camel/providers/imapx/camel-imapx-server.c:4833 -+#: ../camel/providers/imapx/camel-imapx-server.c:4840 - #: ../camel/providers/nntp/camel-nntp-store.c:394 - #: ../camel/providers/nntp/camel-nntp-store.c:531 - msgid "Cannot authenticate without a username" - msgstr "ユーザー名がないと認証を行えません" - --#: ../camel/providers/imapx/camel-imapx-server.c:4842 -+#: ../camel/providers/imapx/camel-imapx-server.c:4849 - #: ../camel/providers/nntp/camel-nntp-store.c:540 - #: ../camel/providers/pop3/camel-pop3-store.c:678 --#: ../camel/providers/pop3/camel-pop3-store.c:699 -+#: ../camel/providers/pop3/camel-pop3-store.c:708 - msgid "Authentication password not available" - msgstr "認証用のパスワードがありません" - --#: ../camel/providers/imapx/camel-imapx-server.c:5093 -+#: ../camel/providers/imapx/camel-imapx-server.c:5085 -+#: ../camel/providers/imapx/camel-imapx-server.c:5144 - msgid "Error fetching message" - msgstr "メッセージを取得する際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:5139 -+#: ../camel/providers/imapx/camel-imapx-server.c:5137 - msgid "Failed to close the tmp stream" - msgstr "tmp ストリームのクローズに失敗しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:5168 -+#: ../camel/providers/imapx/camel-imapx-server.c:5173 - msgid "Failed to copy the tmp file" - msgstr "tmp ファイルのコピーに失敗しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:5294 -+#: ../camel/providers/imapx/camel-imapx-server.c:5345 - msgid "Error moving messages" - msgstr "メッセージを移動する際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:5298 -+#: ../camel/providers/imapx/camel-imapx-server.c:5349 - msgid "Error copying messages" - msgstr "メッセージをコピーする際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:5520 -+#: ../camel/providers/imapx/camel-imapx-server.c:5579 - msgid "Error appending message" - msgstr "メッセージを追加する際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:5756 -+#: ../camel/providers/imapx/camel-imapx-server.c:5815 - msgid "Error fetching message headers" - msgstr "メッセージヘッダーを取得する際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:5921 -+#: ../camel/providers/imapx/camel-imapx-server.c:5982 - msgid "Error retrieving message" - msgstr "メッセージの取得中にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:6051 --#: ../camel/providers/imapx/camel-imapx-server.c:6274 -+#: ../camel/providers/imapx/camel-imapx-server.c:6116 -+#: ../camel/providers/imapx/camel-imapx-server.c:6345 - #, c-format - msgid "Fetching summary information for new messages in '%s'" - msgstr "'%s' にある新着メッセージのサマリ情報を取得中" - --#: ../camel/providers/imapx/camel-imapx-server.c:6103 -+#: ../camel/providers/imapx/camel-imapx-server.c:6168 - #, c-format - msgid "Scanning for changed messages in '%s'" - msgstr "'%s' 内の変更されたメッセージをスキャン中" - --#: ../camel/providers/imapx/camel-imapx-server.c:6155 -+#: ../camel/providers/imapx/camel-imapx-server.c:6220 - msgid "Error fetching new messages" - msgstr "新しいメッセージの取得中にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:6423 -+#: ../camel/providers/imapx/camel-imapx-server.c:6493 - msgid "Error refreshing folder" - msgstr "フォルダーを更新する際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:6573 -+#: ../camel/providers/imapx/camel-imapx-server.c:6643 - msgid "Error expunging message" - msgstr "メッセージを抹消する際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:6682 --#: ../camel/providers/imapx/camel-imapx-server.c:6707 -+#: ../camel/providers/imapx/camel-imapx-server.c:6758 -+#: ../camel/providers/imapx/camel-imapx-server.c:6783 - msgid "Error fetching folders" - msgstr "フォルダーを取得する際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:6787 -+#: ../camel/providers/imapx/camel-imapx-server.c:6863 - msgid "Error creating folder" - msgstr "フォルダーを作成する際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:6839 -+#: ../camel/providers/imapx/camel-imapx-server.c:6915 - msgid "Error deleting folder" - msgstr "フォルダーを削除する際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:6906 -+#: ../camel/providers/imapx/camel-imapx-server.c:6991 - msgid "Error renaming folder" - msgstr "フォルダーの名前を変更する際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:6993 -+#: ../camel/providers/imapx/camel-imapx-server.c:7065 - msgid "Error subscribing to folder" - msgstr "フォルダーをサブスクライブする際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:7053 -+#: ../camel/providers/imapx/camel-imapx-server.c:7131 - msgid "Error unsubscribing from folder" - msgstr "フォルダーをサブスクライブ解除する際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:7109 -+#: ../camel/providers/imapx/camel-imapx-server.c:7193 - msgid "Error retrieving quota information" - msgstr "クオータ情報の取得エラー" - --#: ../camel/providers/imapx/camel-imapx-server.c:7161 -+#: ../camel/providers/imapx/camel-imapx-server.c:7245 - msgid "Search failed" - msgstr "検索失敗" - --#: ../camel/providers/imapx/camel-imapx-server.c:7223 -+#: ../camel/providers/imapx/camel-imapx-server.c:7307 - msgid "Error performing NOOP" - msgstr "NOOP を実行する際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:7330 -+#: ../camel/providers/imapx/camel-imapx-server.c:7414 - msgid "Error syncing changes" - msgstr "変更を同期する際にエラーが発生しました" - --#: ../camel/providers/imapx/camel-imapx-server.c:8441 -+#: ../camel/providers/imapx/camel-imapx-server.c:8446 - #, c-format - msgid "Cannot get message with message ID %s: %s" - msgstr "%s という ID のメッセージを取得できません: %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:8442 -+#: ../camel/providers/imapx/camel-imapx-server.c:8447 - msgid "No such message available." - msgstr "そのようなメッセージは利用できません。" - --#: ../camel/providers/imapx/camel-imapx-server.c:8640 --#: ../camel/providers/imapx/camel-imapx-server.c:8661 -+#: ../camel/providers/imapx/camel-imapx-server.c:8671 -+#: ../camel/providers/imapx/camel-imapx-server.c:8692 - msgid "Cannot create spool file: " - msgstr "スプールファイルを作成できません: " - --#: ../camel/providers/imapx/camel-imapx-server.c:9403 -+#: ../camel/providers/imapx/camel-imapx-server.c:9502 - msgid "IMAP server does not support quotas" - msgstr "IMAP サーバーはクオータをサポートしていません" - - #. create a dummy "." parent inbox, use to scan, then put back at the top level --#: ../camel/providers/imapx/camel-imapx-store.c:207 -+#: ../camel/providers/imapx/camel-imapx-store.c:223 - #: ../camel/providers/local/camel-maildir-folder.c:482 --#: ../camel/providers/local/camel-maildir-store.c:322 --#: ../camel/providers/local/camel-maildir-store.c:764 --#: ../camel/providers/local/camel-maildir-store.c:770 --#: ../camel/providers/local/camel-maildir-store.c:853 -+#: ../camel/providers/local/camel-maildir-store.c:347 -+#: ../camel/providers/local/camel-maildir-store.c:826 -+#: ../camel/providers/local/camel-maildir-store.c:832 -+#: ../camel/providers/local/camel-maildir-store.c:915 - #: ../camel/providers/local/camel-spool-store.c:393 - msgid "Inbox" - msgstr "受信箱" - --#: ../camel/providers/imapx/camel-imapx-store.c:823 -+#: ../camel/providers/imapx/camel-imapx-store.c:757 - #, c-format - msgid "IMAP server %s" - msgstr "IMAP サーバー %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:826 -+#: ../camel/providers/imapx/camel-imapx-store.c:760 - #, c-format - msgid "IMAP service for %s on %s" - msgstr "%s の %s にある IMAP サービス" - --#: ../camel/providers/imapx/camel-imapx-store.c:1035 -+#: ../camel/providers/imapx/camel-imapx-store.c:835 - #: ../camel/providers/nntp/camel-nntp-provider.c:93 - #: ../camel/providers/pop3/camel-pop3-provider.c:81 - msgid "Password" - msgstr "パスワード" - --#: ../camel/providers/imapx/camel-imapx-store.c:1037 --msgid "This option will connect to the IMAP server using a plaintext password." -+#: ../camel/providers/imapx/camel-imapx-store.c:837 -+msgid "" -+"This option will connect to the IMAP server using a plaintext password." - msgstr "このオプションはプレインテキストのパスワードを使って IMAP サーバーに接続します。" - --#: ../camel/providers/imapx/camel-imapx-store.c:1112 -+#: ../camel/providers/imapx/camel-imapx-store.c:916 - #, c-format - msgid "No such folder %s" - msgstr "そのようなフォルダー %s はありません" - --#: ../camel/providers/imapx/camel-imapx-store.c:1507 -+#: ../camel/providers/imapx/camel-imapx-store.c:1344 - #, c-format - msgid "No IMAP namespace for folder path '%s'" - msgstr "フォルダーパス '%s' には IMAP 名前空間がありません" - --#: ../camel/providers/imapx/camel-imapx-store.c:1656 -+#: ../camel/providers/imapx/camel-imapx-store.c:1609 - #, c-format - msgid "Retrieving folder list for %s" - msgstr "%s のフォルダーの一覧を取得中" - --#: ../camel/providers/imapx/camel-imapx-store.c:2094 -+#: ../camel/providers/imapx/camel-imapx-store.c:2061 - #, c-format - msgid "The folder name \"%s\" is invalid because it contains the character \"%c\"" - msgstr "\"%s\" というフォルダー名に \"%c\" という文字を含めることはできません" - --#: ../camel/providers/imapx/camel-imapx-store.c:2615 -+#: ../camel/providers/imapx/camel-imapx-store.c:2833 - #: ../camel/providers/nntp/camel-nntp-store.c:1250 - #: ../camel/providers/pop3/camel-pop3-folder.c:450 - #: ../camel/providers/pop3/camel-pop3-folder.c:593 -@@ -3331,38 +3368,36 @@ - #: ../camel/providers/pop3/camel-pop3-store.c:528 - #: ../camel/providers/pop3/camel-pop3-store.c:576 - #: ../camel/providers/pop3/camel-pop3-store.c:668 --#: ../camel/providers/pop3/camel-pop3-store.c:1072 -+#: ../camel/providers/pop3/camel-pop3-store.c:1081 - #, c-format - msgid "You must be working online to complete this operation" - msgstr "この動作を完了するためにオンラインで作業してください" - --#: ../camel/providers/local/camel-local-folder.c:192 -+#: ../camel/providers/local/camel-local-folder.c:195 - #, c-format - msgid "~%s (%s)" - msgstr "~%s (%s)" - --#: ../camel/providers/local/camel-local-folder.c:202 --#: ../camel/providers/local/camel-local-folder.c:211 -+#: ../camel/providers/local/camel-local-folder.c:205 -+#: ../camel/providers/local/camel-local-folder.c:214 - #, c-format - msgid "mailbox: %s (%s)" - msgstr "mailbox: %s (%s)" - --#: ../camel/providers/local/camel-local-folder.c:220 -+#: ../camel/providers/local/camel-local-folder.c:223 - #, c-format - msgid "%s (%s)" - msgstr "%s (%s)" - --#: ../camel/providers/local/camel-local-folder.c:497 -+#: ../camel/providers/local/camel-local-folder.c:500 - msgid "_Index message body data" - msgstr "メール本文のインデックスを作成する(_I)" - --#: ../camel/providers/local/camel-local-folder.c:725 -+#: ../camel/providers/local/camel-local-folder.c:730 - #, c-format --msgid "" --"Cannot get message %s from folder %s\n" -+msgid "Cannot get message %s from folder %s\n" - "%s" --msgstr "" --"メッセージ %s をフォルダー %s から取得できません\n" -+msgstr "メッセージ %s をフォルダー %s から取得できません\n" - " %s" - - #: ../camel/providers/local/camel-local-provider.c:41 -@@ -3382,7 +3417,9 @@ - msgstr "ローカルの配信" - - #: ../camel/providers/local/camel-local-provider.c:67 --msgid "For retrieving (moving) local mail from standard mbox-formatted spools into folders managed by Evolution." -+msgid "" -+"For retrieving (moving) local mail from standard mbox-formatted spools into " -+"folders managed by Evolution." - msgstr "ローカルメールを収集して標準 mbox 形式のスプールから Evolution が管理するフォルダーに移動します。" - - #: ../camel/providers/local/camel-local-provider.c:81 -@@ -3431,7 +3468,7 @@ - - #: ../camel/providers/local/camel-local-store.c:221 - #: ../camel/providers/local/camel-local-store.c:381 --#: ../camel/providers/local/camel-maildir-store.c:122 -+#: ../camel/providers/local/camel-maildir-store.c:123 - #: ../camel/providers/local/camel-mbox-store.c:572 - #: ../camel/providers/local/camel-spool-store.c:87 - #, c-format -@@ -3446,7 +3483,7 @@ - #: ../camel/providers/local/camel-local-store.c:242 - #: ../camel/providers/local/camel-local-store.c:252 - #: ../camel/providers/local/camel-local-store.c:394 --#: ../camel/providers/local/camel-maildir-store.c:156 -+#: ../camel/providers/local/camel-maildir-store.c:165 - #, c-format - msgid "Cannot get folder: %s: %s" - msgstr "フォルダーを取得できません: %s: %s" -@@ -3468,7 +3505,7 @@ - msgid "Could not delete folder meta file '%s': %s" - msgstr "'%s' というメタファイルを削除できませんでした: %s" - --#: ../camel/providers/local/camel-local-store.c:594 -+#: ../camel/providers/local/camel-local-store.c:595 - #, c-format - msgid "Could not rename '%s': %s" - msgstr "'%s' の名前を変更できませんでした: %s" -@@ -3500,53 +3537,59 @@ - msgid "Cannot transfer message to destination folder: %s" - msgstr "指定のフォルダーにメッセージを転送できません: %s" - --#: ../camel/providers/local/camel-maildir-store.c:130 --#: ../camel/providers/local/camel-maildir-store.c:149 --#: ../camel/providers/local/camel-maildir-store.c:861 -+#: ../camel/providers/local/camel-maildir-store.c:131 -+#: ../camel/providers/local/camel-maildir-store.c:931 -+#, c-format -+msgid "Cannot create folder containing '%s'" -+msgstr "'%s' を含むフォルダーを作成できません" -+ -+#: ../camel/providers/local/camel-maildir-store.c:139 -+#: ../camel/providers/local/camel-maildir-store.c:158 -+#: ../camel/providers/local/camel-maildir-store.c:923 - #, c-format - msgid "Folder %s already exists" - msgstr "既にフォルダー %s があります" - --#: ../camel/providers/local/camel-maildir-store.c:241 --#: ../camel/providers/local/camel-maildir-store.c:272 -+#: ../camel/providers/local/camel-maildir-store.c:266 -+#: ../camel/providers/local/camel-maildir-store.c:297 - #: ../camel/providers/local/camel-mbox-store.c:401 - #: ../camel/providers/local/camel-mbox-store.c:422 - #, c-format - msgid "Cannot create folder '%s': %s" - msgstr "'%s' というフォルダーを作成できません: %s" - --#: ../camel/providers/local/camel-maildir-store.c:256 -+#: ../camel/providers/local/camel-maildir-store.c:281 - #: ../camel/providers/local/camel-mbox-store.c:367 - #: ../camel/providers/local/camel-mh-store.c:523 - #, c-format - msgid "Cannot get folder '%s': %s" - msgstr "'%s' というフォルダーを取得できません: %s" - --#: ../camel/providers/local/camel-maildir-store.c:262 -+#: ../camel/providers/local/camel-maildir-store.c:287 - #: ../camel/providers/local/camel-mbox-store.c:377 - #: ../camel/providers/local/camel-mh-store.c:532 - #, c-format - msgid "Cannot get folder '%s': folder does not exist." - msgstr "'%s' というフォルダーを取得できません: フォルダーが存在しません。" - --#: ../camel/providers/local/camel-maildir-store.c:289 -+#: ../camel/providers/local/camel-maildir-store.c:314 - #, c-format - msgid "Cannot get folder '%s': not a maildir directory." - msgstr "'%s' というフォルダーを取得できません: maildir フォルダーが存在しません。" - --#: ../camel/providers/local/camel-maildir-store.c:353 --#: ../camel/providers/local/camel-maildir-store.c:393 -+#: ../camel/providers/local/camel-maildir-store.c:378 -+#: ../camel/providers/local/camel-maildir-store.c:418 - #: ../camel/providers/local/camel-mh-store.c:676 - #, c-format - msgid "Could not delete folder '%s': %s" - msgstr "'%s' というフォルダーを削除できませんでした: %s" - --#: ../camel/providers/local/camel-maildir-store.c:355 -+#: ../camel/providers/local/camel-maildir-store.c:380 - msgid "not a maildir directory" - msgstr "maildir 形式のフォルダーではありません" - --#: ../camel/providers/local/camel-maildir-store.c:636 --#: ../camel/providers/local/camel-maildir-store.c:1075 -+#: ../camel/providers/local/camel-maildir-store.c:666 -+#: ../camel/providers/local/camel-maildir-store.c:1146 - #: ../camel/providers/local/camel-spool-store.c:212 - #: ../camel/providers/local/camel-spool-store.c:231 - #, c-format -@@ -3567,10 +3610,10 @@ - msgid "Checking for new messages" - msgstr "新しいメッセージのチェック" - --#: ../camel/providers/local/camel-maildir-summary.c:784 -+#: ../camel/providers/local/camel-maildir-summary.c:791 - #: ../camel/providers/local/camel-mbox-summary.c:466 --#: ../camel/providers/local/camel-mbox-summary.c:682 --#: ../camel/providers/local/camel-mbox-summary.c:831 -+#: ../camel/providers/local/camel-mbox-summary.c:687 -+#: ../camel/providers/local/camel-mbox-summary.c:836 - #: ../camel/providers/local/camel-spool-summary.c:139 - msgid "Storing folder" - msgstr "フォルダーに格納する" -@@ -3624,11 +3667,9 @@ - #: ../camel/providers/local/camel-mbox-store.c:663 - #: ../camel/providers/local/camel-mbox-store.c:692 - #, c-format --msgid "" --"Could not delete folder '%s':\n" -+msgid "Could not delete folder '%s':\n" - "%s" --msgstr "" --"'%s' というフォルダーを削除できませんでした:\n" -+msgstr "'%s' というフォルダーを削除できませんでした:\n" - "%s" - - #: ../camel/providers/local/camel-mbox-store.c:673 -@@ -3667,71 +3708,73 @@ - msgid "Could not open folder: %s: %s" - msgstr "フォルダーを開けませんでした: %s: %s" - --#: ../camel/providers/local/camel-mbox-summary.c:606 -+#: ../camel/providers/local/camel-mbox-summary.c:611 - #, c-format - msgid "Cannot check folder: %s: %s" - msgstr "フォルダーをチェックできません: %s: %s" - --#: ../camel/providers/local/camel-mbox-summary.c:695 --#: ../camel/providers/local/camel-mbox-summary.c:840 -+#: ../camel/providers/local/camel-mbox-summary.c:700 -+#: ../camel/providers/local/camel-mbox-summary.c:845 - #: ../camel/providers/local/camel-spool-summary.c:146 - #, c-format - msgid "Could not open file: %s: %s" - msgstr "ファイルを開けませんでした: %s: %s" - --#: ../camel/providers/local/camel-mbox-summary.c:710 -+#: ../camel/providers/local/camel-mbox-summary.c:715 - #: ../camel/providers/local/camel-spool-summary.c:161 - #, c-format - msgid "Cannot open temporary mailbox: %s" - msgstr "作業用の mailbox を開けませんでした: %s" - --#: ../camel/providers/local/camel-mbox-summary.c:727 --#: ../camel/providers/local/camel-mbox-summary.c:962 -+#: ../camel/providers/local/camel-mbox-summary.c:732 -+#: ../camel/providers/local/camel-mbox-summary.c:967 - #, c-format - msgid "Could not close source folder %s: %s" - msgstr "元のフォルダー %s を閉じることができませんでした: %s" - --#: ../camel/providers/local/camel-mbox-summary.c:740 -+#: ../camel/providers/local/camel-mbox-summary.c:745 - #, c-format - msgid "Could not close temporary folder: %s" - msgstr "作業用フォルダーを閉じることができませんでした: %s" - --#: ../camel/providers/local/camel-mbox-summary.c:759 -+#: ../camel/providers/local/camel-mbox-summary.c:764 - #, c-format - msgid "Could not rename folder: %s" - msgstr "フォルダー名を変更できませんでした: %s" - --#: ../camel/providers/local/camel-mbox-summary.c:854 --#: ../camel/providers/local/camel-mbox-summary.c:1127 -+#: ../camel/providers/local/camel-mbox-summary.c:859 -+#: ../camel/providers/local/camel-mbox-summary.c:1132 - #, c-format - msgid "Could not store folder: %s" - msgstr "フォルダーを保存できませんでした: %s" - --#: ../camel/providers/local/camel-mbox-summary.c:893 --#: ../camel/providers/local/camel-mbox-summary.c:1167 -+#: ../camel/providers/local/camel-mbox-summary.c:898 -+#: ../camel/providers/local/camel-mbox-summary.c:1172 - #, c-format --msgid "MBOX file is corrupted, please fix it. (Expected a From line, but didn't get it.)" -+msgid "" -+"MBOX file is corrupted, please fix it. (Expected a From line, but didn't get " -+"it.)" - msgstr "MBOX ファイルが壊れています (差出人の行を得るはずですが、できませんでした)。修正してください。" - --#: ../camel/providers/local/camel-mbox-summary.c:903 --#: ../camel/providers/local/camel-mbox-summary.c:1179 -+#: ../camel/providers/local/camel-mbox-summary.c:908 -+#: ../camel/providers/local/camel-mbox-summary.c:1184 - #, c-format - msgid "Summary and folder mismatch, even after a sync" - msgstr "サマリとフォルダーが一致しませんでした (同期しても)" - --#: ../camel/providers/local/camel-mbox-summary.c:1072 -+#: ../camel/providers/local/camel-mbox-summary.c:1077 - #: ../camel/providers/local/camel-spool-summary.c:356 - #, c-format - msgid "Unknown error: %s" - msgstr "原因不明のエラー: %s" - --#: ../camel/providers/local/camel-mbox-summary.c:1237 --#: ../camel/providers/local/camel-mbox-summary.c:1267 -+#: ../camel/providers/local/camel-mbox-summary.c:1242 -+#: ../camel/providers/local/camel-mbox-summary.c:1272 - #, c-format - msgid "Writing to temporary mailbox failed: %s" - msgstr "作業用の mailbox に書き込めませんでした: %s" - --#: ../camel/providers/local/camel-mbox-summary.c:1256 -+#: ../camel/providers/local/camel-mbox-summary.c:1261 - #, c-format - msgid "Writing to temporary mailbox failed: %s: %s" - msgstr "作業用の mailbox に書き込めませんでした: %s: %s" -@@ -3787,11 +3830,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:494 - #, c-format --msgid "" --"Could not open folder '%s':\n" -+msgid "Could not open folder '%s':\n" - "%s" --msgstr "" --"'%s' というフォルダーを開けませんでした:\n" -+msgstr "'%s' というフォルダーを開けませんでした:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:500 -@@ -3801,11 +3842,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:508 - #, c-format --msgid "" --"Could not create folder '%s':\n" -+msgid "Could not create folder '%s':\n" - "%s" --msgstr "" --"'%s' というフォルダーを作成できませんでした:\n" -+msgstr "'%s' というフォルダーを作成できませんでした:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:521 -@@ -3852,21 +3891,21 @@ - "フォルダーが壊れている可能性があります。そのコピーを '%s' に保存しました。" - - #: ../camel/providers/nntp/camel-nntp-folder.c:222 --#: ../camel/providers/nntp/camel-nntp-folder.c:588 -+#: ../camel/providers/nntp/camel-nntp-folder.c:590 - #, c-format - msgid "Internal error: UID in invalid format: %s" - msgstr "内部エラー: UID の書式が無効です: %s" - --#: ../camel/providers/nntp/camel-nntp-folder.c:291 --#: ../camel/providers/nntp/camel-nntp-folder.c:296 -+#: ../camel/providers/nntp/camel-nntp-folder.c:292 -+#: ../camel/providers/nntp/camel-nntp-folder.c:297 - #: ../camel/providers/pop3/camel-pop3-folder.c:546 - #: ../camel/providers/pop3/camel-pop3-folder.c:945 - #, c-format - msgid "Cannot get message %s: %s" - msgstr "メッセージ %s を取得できません: %s" - --#: ../camel/providers/nntp/camel-nntp-folder.c:303 --#: ../camel/providers/nntp/camel-nntp-folder.c:622 -+#: ../camel/providers/nntp/camel-nntp-folder.c:304 -+#: ../camel/providers/nntp/camel-nntp-folder.c:624 - #: ../camel/providers/pop3/camel-pop3-folder.c:476 - #: ../camel/providers/pop3/camel-pop3-folder.c:536 - #: ../camel/providers/pop3/camel-pop3-folder.c:555 -@@ -3880,23 +3919,23 @@ - msgid "Posting failed: %s" - msgstr "投稿に失敗しました: %s" - --#: ../camel/providers/nntp/camel-nntp-folder.c:501 -+#: ../camel/providers/nntp/camel-nntp-folder.c:503 - msgid "Posting failed: " - msgstr "投稿に失敗しました: " - --#: ../camel/providers/nntp/camel-nntp-folder.c:611 -+#: ../camel/providers/nntp/camel-nntp-folder.c:613 - #, c-format - msgid "This message is not currently available" - msgstr "このメッセージは現在利用できません" - --#: ../camel/providers/nntp/camel-nntp-folder.c:720 --#, fuzzy, c-format --#| msgid "You cannot copy messages from a NNTP folder!" -+#: ../camel/providers/nntp/camel-nntp-folder.c:722 -+#, c-format - msgid "You cannot copy messages from a NNTP folder" --msgstr "NNTP フォルダーからメッセージのコピーはできません!" -+msgstr "NNTP フォルダーからメッセージのコピーはできません" - - #: ../camel/providers/nntp/camel-nntp-provider.c:46 --msgid "_Show folders in short notation (e.g. c.o.linux rather than comp.os.linux)" -+msgid "" -+"_Show folders in short notation (e.g. c.o.linux rather than comp.os.linux)" - msgstr "フォルダー名を短く表記する (例: \"comp.os.linux\" => \"c.o.linux\")(_S)" - - #: ../camel/providers/nntp/camel-nntp-provider.c:49 -@@ -3920,11 +3959,15 @@ - msgstr "USENET のニュースグループを購読したり投稿します。" - - #: ../camel/providers/nntp/camel-nntp-provider.c:85 --msgid "This option will connect to the NNTP server anonymously, without authentication." -+msgid "" -+"This option will connect to the NNTP server anonymously, without " -+"authentication." - msgstr "このオプションは NNTP サーバーに匿名で、認証せずに接続します。" - - #: ../camel/providers/nntp/camel-nntp-provider.c:95 --msgid "This option will authenticate with the NNTP server using a plaintext password." -+msgid "" -+"This option will authenticate with the NNTP server using a plaintext " -+"password." - msgstr "このオプションはプレインテキストのパスワードを使って NNTP サーバーで認証します。" - - #: ../camel/providers/nntp/camel-nntp-store.c:371 -@@ -3944,12 +3987,10 @@ - - #: ../camel/providers/nntp/camel-nntp-store.c:1151 - #, c-format --msgid "" --"Error retrieving newsgroups:\n" -+msgid "Error retrieving newsgroups:\n" - "\n" - "%s" --msgstr "" --"ニュースグループの取得でエラー:\n" -+msgstr "ニュースグループの取得でエラー:\n" - "\n" - "%s" - -@@ -3974,19 +4015,16 @@ - "You cannot subscribe to this newsgroup:\n" - "\n" - "No such newsgroup. The selected item is a probably a parent folder." --msgstr "" --"このニュースグループは購読できません:\n" -+msgstr "このニュースグループは購読できません:\n" - "\n" - "そのようなニュースグループはありません。選択したアイテムは親フォルダーのものかもしれません。" - - #: ../camel/providers/nntp/camel-nntp-store.c:1583 - #, c-format --msgid "" --"You cannot unsubscribe to this newsgroup:\n" -+msgid "You cannot unsubscribe to this newsgroup:\n" - "\n" - "newsgroup does not exist!" --msgstr "" --"このニュースグループの購読を停止できません:\n" -+msgstr "このニュースグループの購読を停止できません:\n" - "\n" - "ニュースグループがありません!" - -@@ -4100,12 +4138,20 @@ - msgstr "POP サーバーに接続したりメールを読んだりします。" - - #: ../camel/providers/pop3/camel-pop3-provider.c:83 --msgid "This option will connect to the POP server using a plaintext password. This is the only option supported by many POP servers." --msgstr "このオプションはプレインテキストのパスワードを使って POP サーバーへ接続します。これは多くの POP サーバーでサポートされるオプションです。" -+msgid "" -+"This option will connect to the POP server using a plaintext password. This " -+"is the only option supported by many POP servers." -+msgstr "" -+"このオプションはプレインテキストのパスワードを使って POP サーバーへ接続します。これは多くの POP サーバーでサポートされるオプションです。" - - #: ../camel/providers/pop3/camel-pop3-provider.c:93 --msgid "This option will connect to the POP server using an encrypted password via the APOP protocol. This may not work for all users even on servers that claim to support it." --msgstr "このオプションは APOP プロトコル経由で暗号化されたパスワードを使って POP サーバーへ接続します。これは、たとえ APOP 対応を謳っているサーバーであっても、すべてのユーザーが正常に動作するわけではありません。" -+msgid "" -+"This option will connect to the POP server using an encrypted password via " -+"the APOP protocol. This may not work for all users even on servers that " -+"claim to support it." -+msgstr "" -+"このオプションは APOP プロトコル経由で暗号化されたパスワードを使って POP サーバーへ接続します。これは、たとえ APOP " -+"対応を謳っているサーバーであっても、すべてのユーザーが正常に動作するわけではありません。" - - #. Translators: This is the separator between an error and an explanation - #: ../camel/providers/pop3/camel-pop3-store.c:97 -@@ -4158,37 +4204,37 @@ - msgid "POP3 server for %s on %s" - msgstr "%s の %s にある POP3 サーバー" - --#: ../camel/providers/pop3/camel-pop3-store.c:713 -+#: ../camel/providers/pop3/camel-pop3-store.c:690 -+#: ../camel/providers/pop3/camel-pop3-store.c:777 - #, c-format --msgid "Unable to connect to POP server %s:\tInvalid APOP ID received. Impersonation attack suspected. Please contact your admin." --msgstr "POP サーバー %s へ接続できません:\t無効な APOP ID を受け取りました; 詐称攻撃の可能性があるので管理者に連絡してください。" -+msgid "Unable to connect to POP server %s.\n" -+"Error sending password: " -+msgstr "POP サーバー %s に接続できません。\n" -+"パスワードの送信中にエラー: " - --#: ../camel/providers/pop3/camel-pop3-store.c:768 -+#: ../camel/providers/pop3/camel-pop3-store.c:722 - #, c-format - msgid "" --"Unable to connect to POP server %s.\n" --"Error sending password: " -+"Unable to connect to POP server %s:\tInvalid APOP ID received. Impersonation " -+"attack suspected. Please contact your admin." - msgstr "" --"POP サーバー %s に接続できません。\n" --"パスワードの送信中にエラー: " -+"POP サーバー %s へ接続できません:\t無効な APOP ID を受け取りました; 詐称攻撃の可能性があるので管理者に連絡してください。" - - #. Translators: Last %s is an optional explanation - #. * beginning with ": " separator. --#: ../camel/providers/pop3/camel-pop3-store.c:783 -+#: ../camel/providers/pop3/camel-pop3-store.c:792 - #, c-format --msgid "" --"Unable to connect to POP server %s.\n" -+msgid "Unable to connect to POP server %s.\n" - "Error sending username%s" --msgstr "" --"POP サーバー %s に接続できません。\n" -+msgstr "POP サーバー %s に接続できません。\n" - "ユーザー名の送信中にエラー%s" - --#: ../camel/providers/pop3/camel-pop3-store.c:865 -+#: ../camel/providers/pop3/camel-pop3-store.c:874 - #, c-format - msgid "No such folder '%s'." - msgstr "'%s' というフォルダーは存在しません。" - --#: ../camel/providers/pop3/camel-pop3-store.c:882 -+#: ../camel/providers/pop3/camel-pop3-store.c:891 - #, c-format - msgid "POP3 stores have no folder hierarchy" - msgstr "POP3 ストアはフォルダーの階層構造を持ちません" -@@ -4199,7 +4245,9 @@ - msgstr "Sendmail" - - #: ../camel/providers/sendmail/camel-sendmail-provider.c:36 --msgid "For delivering mail by passing it to the \"sendmail\" program on the local system." -+msgid "" -+"For delivering mail by passing it to the \"sendmail\" program on the local " -+"system." - msgstr "メールを配送するためにローカルシステムの \"sendmail\" プログラムへ渡します。" - - #: ../camel/providers/sendmail/camel-sendmail-transport.c:48 -@@ -4279,218 +4327,218 @@ - msgid "For delivering mail by connecting to a remote mailhub using SMTP." - msgstr "SMTP を使ってリモートのメールハブに接続することでメールを配信します。" - --#: ../camel/providers/smtp/camel-smtp-transport.c:170 --#: ../camel/providers/smtp/camel-smtp-transport.c:178 -+#: ../camel/providers/smtp/camel-smtp-transport.c:171 -+#: ../camel/providers/smtp/camel-smtp-transport.c:179 - msgid "Welcome response error: " - msgstr "Welcome 応答エラー: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:214 -+#: ../camel/providers/smtp/camel-smtp-transport.c:215 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: %s" - msgstr "セキュリティ保護されたモードで SMTP サーバー %s への接続に失敗しました: %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:224 --#: ../camel/providers/smtp/camel-smtp-transport.c:238 --#: ../camel/providers/smtp/camel-smtp-transport.c:246 -+#: ../camel/providers/smtp/camel-smtp-transport.c:225 -+#: ../camel/providers/smtp/camel-smtp-transport.c:240 -+#: ../camel/providers/smtp/camel-smtp-transport.c:248 - msgid "STARTTLS command failed: " - msgstr "STARTTLS コマンドが失敗しました: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:265 -+#: ../camel/providers/smtp/camel-smtp-transport.c:267 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: " - msgstr "セキュリティ保護されたモードで SMTP サーバー %s への接続に失敗しました: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:357 -+#: ../camel/providers/smtp/camel-smtp-transport.c:359 - #, c-format - msgid "SMTP server %s" - msgstr "SMTP サーバー %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:360 -+#: ../camel/providers/smtp/camel-smtp-transport.c:362 - #, c-format - msgid "SMTP mail delivery via %s" - msgstr "%s 経由で SMTP メールを配信します" - --#: ../camel/providers/smtp/camel-smtp-transport.c:434 -+#: ../camel/providers/smtp/camel-smtp-transport.c:463 - #, c-format - msgid "SMTP server %s does not support %s authentication" - msgstr "SMTP サーバー %s は認証方式 %s をサポートしていません" - --#: ../camel/providers/smtp/camel-smtp-transport.c:506 -+#: ../camel/providers/smtp/camel-smtp-transport.c:536 - #, c-format - msgid "No SASL mechanism was specified" - msgstr "SASL メカニズムが指定されていませんでした" - --#: ../camel/providers/smtp/camel-smtp-transport.c:536 --#: ../camel/providers/smtp/camel-smtp-transport.c:547 --#: ../camel/providers/smtp/camel-smtp-transport.c:560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:571 -+#: ../camel/providers/smtp/camel-smtp-transport.c:583 -+#: ../camel/providers/smtp/camel-smtp-transport.c:596 - msgid "AUTH command failed: " - msgstr "AUTH コマンドが失敗しました: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:701 -+#: ../camel/providers/smtp/camel-smtp-transport.c:740 - #, c-format - msgid "Cannot send message: service not connected." - msgstr "メッセージを送信できません: サービスが接続されていません。" - --#: ../camel/providers/smtp/camel-smtp-transport.c:708 -+#: ../camel/providers/smtp/camel-smtp-transport.c:747 - #, c-format - msgid "Cannot send message: sender address not valid." - msgstr "メッセージを送信できません: 差出人のアドレスが正しくありません。" - --#: ../camel/providers/smtp/camel-smtp-transport.c:712 -+#: ../camel/providers/smtp/camel-smtp-transport.c:751 - msgid "Sending message" - msgstr "メッセージの送信中" - --#: ../camel/providers/smtp/camel-smtp-transport.c:737 -+#: ../camel/providers/smtp/camel-smtp-transport.c:776 - #, c-format - msgid "Cannot send message: no recipients defined." - msgstr "メッセージを送信できません: 宛先が定義されていません。" - --#: ../camel/providers/smtp/camel-smtp-transport.c:750 -+#: ../camel/providers/smtp/camel-smtp-transport.c:789 - #, c-format - msgid "Cannot send message: one or more invalid recipients" - msgstr "メッセージを送信できません: 無効な応答が一つ以上あります" - --#: ../camel/providers/smtp/camel-smtp-transport.c:871 -+#: ../camel/providers/smtp/camel-smtp-transport.c:910 - msgid "Syntax error, command unrecognized" - msgstr "構文解析エラー: コマンドではありません" - --#: ../camel/providers/smtp/camel-smtp-transport.c:873 -+#: ../camel/providers/smtp/camel-smtp-transport.c:912 - msgid "Syntax error in parameters or arguments" - msgstr "パラメーターあるいは引数に構文解析エラー" - --#: ../camel/providers/smtp/camel-smtp-transport.c:875 -+#: ../camel/providers/smtp/camel-smtp-transport.c:914 - msgid "Command not implemented" - msgstr "コマンドは実装されていません" - --#: ../camel/providers/smtp/camel-smtp-transport.c:877 -+#: ../camel/providers/smtp/camel-smtp-transport.c:916 - msgid "Command parameter not implemented" - msgstr "コマンドパラメーターは実装されていません" - --#: ../camel/providers/smtp/camel-smtp-transport.c:879 -+#: ../camel/providers/smtp/camel-smtp-transport.c:918 - msgid "System status, or system help reply" - msgstr "システムステータスまたはシステムヘルプの応答" - --#: ../camel/providers/smtp/camel-smtp-transport.c:881 -+#: ../camel/providers/smtp/camel-smtp-transport.c:920 - msgid "Help message" - msgstr "ヘルプメッセージ" - --#: ../camel/providers/smtp/camel-smtp-transport.c:883 -+#: ../camel/providers/smtp/camel-smtp-transport.c:922 - msgid "Service ready" - msgstr "サービスは利用できます" - --#: ../camel/providers/smtp/camel-smtp-transport.c:885 -+#: ../camel/providers/smtp/camel-smtp-transport.c:924 - msgid "Service closing transmission channel" - msgstr "サービスは送信チャンネルを閉じています" - --#: ../camel/providers/smtp/camel-smtp-transport.c:887 -+#: ../camel/providers/smtp/camel-smtp-transport.c:926 - msgid "Service not available, closing transmission channel" - msgstr "サービスは利用できません, 送信チャンネルを閉じています" - --#: ../camel/providers/smtp/camel-smtp-transport.c:889 -+#: ../camel/providers/smtp/camel-smtp-transport.c:928 - msgid "Requested mail action okay, completed" - msgstr "要求されたメールの動作はOK, 完了しました" - --#: ../camel/providers/smtp/camel-smtp-transport.c:891 -+#: ../camel/providers/smtp/camel-smtp-transport.c:930 - msgid "User not local; will forward to " - msgstr "ユーザーはローカルではありません; へ転送します" - --#: ../camel/providers/smtp/camel-smtp-transport.c:893 -+#: ../camel/providers/smtp/camel-smtp-transport.c:932 - msgid "Requested mail action not taken: mailbox unavailable" - msgstr "要求されたメールの動作は完了しません: メールボックスは利用できません" - --#: ../camel/providers/smtp/camel-smtp-transport.c:895 -+#: ../camel/providers/smtp/camel-smtp-transport.c:934 - msgid "Requested action not taken: mailbox unavailable" - msgstr "要求された動作は完了しません: メールボックスは利用できません" - --#: ../camel/providers/smtp/camel-smtp-transport.c:897 -+#: ../camel/providers/smtp/camel-smtp-transport.c:936 - msgid "Requested action aborted: error in processing" - msgstr "要求された動作を中断しました: 処理中にエラー" - --#: ../camel/providers/smtp/camel-smtp-transport.c:899 -+#: ../camel/providers/smtp/camel-smtp-transport.c:938 - msgid "User not local; please try " - msgstr "ユーザーはローカルではありません; を試してください。" - --#: ../camel/providers/smtp/camel-smtp-transport.c:901 -+#: ../camel/providers/smtp/camel-smtp-transport.c:940 - msgid "Requested action not taken: insufficient system storage" - msgstr "要求された動作は完了しません: システムの保存領域が足りません" - --#: ../camel/providers/smtp/camel-smtp-transport.c:903 -+#: ../camel/providers/smtp/camel-smtp-transport.c:942 - msgid "Requested mail action aborted: exceeded storage allocation" - msgstr "要求されたメールの動作を中断しました: 領域割り当てを越えました" - --#: ../camel/providers/smtp/camel-smtp-transport.c:905 -+#: ../camel/providers/smtp/camel-smtp-transport.c:944 - msgid "Requested action not taken: mailbox name not allowed" - msgstr "要求された動作は完了しません: メールボックス名は認められません" - --#: ../camel/providers/smtp/camel-smtp-transport.c:907 -+#: ../camel/providers/smtp/camel-smtp-transport.c:946 - msgid "Start mail input; end with ." - msgstr "メールの入力を開始します; . で終了します" - --#: ../camel/providers/smtp/camel-smtp-transport.c:909 -+#: ../camel/providers/smtp/camel-smtp-transport.c:948 - msgid "Transaction failed" - msgstr "処理は失敗しました" - --#: ../camel/providers/smtp/camel-smtp-transport.c:913 -+#: ../camel/providers/smtp/camel-smtp-transport.c:952 - msgid "A password transition is needed" - msgstr "パスワードの変更が必要です" - --#: ../camel/providers/smtp/camel-smtp-transport.c:915 -+#: ../camel/providers/smtp/camel-smtp-transport.c:954 - msgid "Authentication mechanism is too weak" - msgstr "認証メカニズムは不十分過ぎます" - --#: ../camel/providers/smtp/camel-smtp-transport.c:917 -+#: ../camel/providers/smtp/camel-smtp-transport.c:956 - msgid "Encryption required for requested authentication mechanism" - msgstr "要求した認証メカニズムのために暗号化が必要です" - --#: ../camel/providers/smtp/camel-smtp-transport.c:919 -+#: ../camel/providers/smtp/camel-smtp-transport.c:958 - msgid "Temporary authentication failure" - msgstr "一時的な認証に失敗しました" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1207 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1247 - msgid "SMTP Greeting" - msgstr "SMTP で接続中" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1217 --#: ../camel/providers/smtp/camel-smtp-transport.c:1231 --#: ../camel/providers/smtp/camel-smtp-transport.c:1239 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1257 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1272 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1280 - msgid "HELO command failed: " - msgstr "HELO コマンドが失敗しました: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1314 --#: ../camel/providers/smtp/camel-smtp-transport.c:1329 --#: ../camel/providers/smtp/camel-smtp-transport.c:1339 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1355 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1371 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1381 - msgid "MAIL FROM command failed: " - msgstr "MAIL FROM コマンドが失敗しました: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1366 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1408 - msgid "RCPT TO command failed: " - msgstr "RCPT TO コマンドが失敗しました: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1383 --#: ../camel/providers/smtp/camel-smtp-transport.c:1393 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1426 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1436 - #, c-format - msgid "RCPT TO <%s> failed: " - msgstr "RCPT TO <%s> コマンドが失敗しました: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1436 --#: ../camel/providers/smtp/camel-smtp-transport.c:1447 --#: ../camel/providers/smtp/camel-smtp-transport.c:1458 --#: ../camel/providers/smtp/camel-smtp-transport.c:1517 --#: ../camel/providers/smtp/camel-smtp-transport.c:1537 --#: ../camel/providers/smtp/camel-smtp-transport.c:1551 --#: ../camel/providers/smtp/camel-smtp-transport.c:1560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1509 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1521 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1532 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1594 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1614 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1629 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1638 - msgid "DATA command failed: " - msgstr "DATA コマンドが失敗しました: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1585 --#: ../camel/providers/smtp/camel-smtp-transport.c:1600 --#: ../camel/providers/smtp/camel-smtp-transport.c:1609 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1663 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1679 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1688 - msgid "RSET command failed: " - msgstr "RSET コマンドが失敗しました: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1634 --#: ../camel/providers/smtp/camel-smtp-transport.c:1648 --#: ../camel/providers/smtp/camel-smtp-transport.c:1655 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1713 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1727 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1734 - msgid "QUIT command failed: " - msgstr "QUIT コマンドが失敗しました: " - -@@ -4519,7 +4567,9 @@ - msgstr "誕生日や記念日のリマインダーユニット" - - #: ../data/org.gnome.evolution-data-server.calendar.gschema.xml.in.h:6 --msgid "Units for a birthday or anniversary reminder, \"minutes\", \"hours\" or \"days\"" -+msgid "" -+"Units for a birthday or anniversary reminder, \"minutes\", \"hours\" or " -+"\"days\"" - msgstr "\"minutes\"、\"hours\"、\"days\" など誕生日または記念日の単位です" - - #: ../data/org.gnome.evolution.shell.network-config.gschema.xml.in.h:1 -@@ -4527,8 +4577,13 @@ - msgstr "(非推奨) 使用するプロキシタイプ" - - #: ../data/org.gnome.evolution.shell.network-config.gschema.xml.in.h:2 --msgid "This key was deprecated in version 3.12 and should no longer be used. Proxy settings are now integrated into Evolution-Data-Server's account system. See the ESourceProxy API documentation for details." --msgstr "このキーはバージョン 3.12 で非推奨となっており、利用すべきではなくなっています。プロキシ設定は今では Evolution-Data-Server のアカウントシステムに統合されています。詳細については ESourceProxy API 文書を見てください。" -+msgid "" -+"This key was deprecated in version 3.12 and should no longer be used. Proxy " -+"settings are now integrated into Evolution-Data-Server's account system. See " -+"the ESourceProxy API documentation for details." -+msgstr "" -+"このキーはバージョン 3.12 で非推奨となっており、利用すべきではなくなっています。プロキシ設定は今では Evolution-Data-Server " -+"のアカウントシステムに統合されています。詳細については ESourceProxy API 文書を見てください。" - - #: ../data/org.gnome.evolution.shell.network-config.gschema.xml.in.h:3 - msgid "(Deprecated) Whether to use http-proxy" -@@ -4580,8 +4635,8 @@ - - #: ../libebackend/e-authentication-mediator.c:204 - #: ../libebackend/e-authentication-mediator.c:215 --#: ../libebackend/e-authentication-mediator.c:861 --#: ../libebackend/e-authentication-mediator.c:1198 -+#: ../libebackend/e-authentication-mediator.c:860 -+#: ../libebackend/e-authentication-mediator.c:1197 - msgid "Bus name vanished (client terminated?)" - msgstr "バス名が消えています (クライアントを終了しませんでしたか?)" - -@@ -4591,8 +4646,8 @@ - - #: ../libebackend/e-authentication-mediator.c:333 - #: ../libebackend/e-authentication-mediator.c:344 --#: ../libebackend/e-authentication-mediator.c:855 --#: ../libebackend/e-authentication-mediator.c:1192 -+#: ../libebackend/e-authentication-mediator.c:854 -+#: ../libebackend/e-authentication-mediator.c:1191 - msgid "Client cancelled the operation" - msgstr "クライアントにより操作が取り消されました" - -@@ -4600,25 +4655,25 @@ - msgid "Client reports password was rejected" - msgstr "クライアントはパスワードが拒否されたと報告しています" - --#: ../libebackend/e-authentication-session.c:554 -+#: ../libebackend/e-authentication-session.c:542 - msgid "Add this password to your keyring" - msgstr "キーリングにこのパスワードを追加する" - --#: ../libebackend/e-authentication-session.c:664 -+#: ../libebackend/e-authentication-session.c:547 - msgid "Password was incorrect" - msgstr "パスワードが間違っています" - --#: ../libebackend/e-backend.c:408 -+#: ../libebackend/e-backend.c:420 - #, c-format - msgid "%s does not support authentication" - msgstr "%s では認証をサポートしていません" - --#: ../libebackend/e-collection-backend.c:900 -+#: ../libebackend/e-collection-backend.c:992 - #, c-format - msgid "%s does not support creating remote resources" - msgstr "%s ではリモートリソースの作成をサポートしていません" - --#: ../libebackend/e-collection-backend.c:959 -+#: ../libebackend/e-collection-backend.c:1051 - #, c-format - msgid "%s does not support deleting remote resources" - msgstr "%s ではリモートリソースの削除をサポートしていません" -@@ -4633,46 +4688,48 @@ - msgid "Data source is missing a [%s] group" - msgstr "データソースには [%s] グループがありません" - --#: ../libebackend/e-server-side-source.c:1020 --#: ../libedataserver/e-source.c:1348 -+#: ../libebackend/e-server-side-source.c:1025 -+#: ../libedataserver/e-source.c:1351 - #, c-format - msgid "Data source '%s' does not support creating remote resources" - msgstr "データソース '%s' ではリモートリソースの作成をサポートしていません" - --#: ../libebackend/e-server-side-source.c:1034 -+#: ../libebackend/e-server-side-source.c:1039 - #, c-format --msgid "Data source '%s' has no collection backend to create the remote resource" -+msgid "" -+"Data source '%s' has no collection backend to create the remote resource" - msgstr "データソース '%s' には、リモートリソースを作成するために収集されるバックエンドがありません。" - --#: ../libebackend/e-server-side-source.c:1062 --#: ../libedataserver/e-source.c:1461 -+#: ../libebackend/e-server-side-source.c:1067 -+#: ../libedataserver/e-source.c:1464 - #, c-format - msgid "Data source '%s' does not support deleting remote resources" - msgstr "データソース '%s' はリモートリソースの削除をサポートしていません" - --#: ../libebackend/e-server-side-source.c:1076 -+#: ../libebackend/e-server-side-source.c:1081 - #, c-format --msgid "Data source '%s' has no collection backend to delete the remote resource" -+msgid "" -+"Data source '%s' has no collection backend to delete the remote resource" - msgstr "データソース '%s' には、リモートリソースを削除するために収集されるバックエンドがありません。" - --#: ../libebackend/e-server-side-source.c:1107 --#: ../libedataserver/e-source.c:1557 -+#: ../libebackend/e-server-side-source.c:1112 -+#: ../libedataserver/e-source.c:1560 - #: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1027 - #, c-format - msgid "Data source '%s' does not support OAuth 2.0 authentication" - msgstr "データソース %s は OAuth 2.0 という認証タイプをサポートしていません" - --#: ../libebackend/e-server-side-source.c:1452 -+#: ../libebackend/e-server-side-source.c:1459 - #, c-format - msgid "File must have a '.source' extension" - msgstr "ファイルには '.source' 拡張子が必要です" - --#: ../libebackend/e-source-registry-server.c:531 --#: ../libedataserver/e-source-registry.c:1957 -+#: ../libebackend/e-source-registry-server.c:535 -+#: ../libedataserver/e-source-registry.c:1944 - msgid "The user declined to authenticate" - msgstr "ユーザー認証に失敗しました" - --#: ../libebackend/e-source-registry-server.c:800 -+#: ../libebackend/e-source-registry-server.c:804 - #, c-format - msgid "UID '%s' is already in use" - msgstr "UID '%s' は既に使用されています" -@@ -4865,26 +4922,26 @@ - msgid "Please enter the password for account \"%s\"." - msgstr "アカウント \"%s\" のパスワードを入力してください。" - --#: ../libedataserver/e-source.c:765 -+#: ../libedataserver/e-source.c:768 - #, c-format - msgid "Source file is missing a [%s] group" - msgstr "ソースファイルには [%s] グループがありません" - --#: ../libedataserver/e-source.c:1128 -+#: ../libedataserver/e-source.c:1131 - #, c-format - msgid "Data source '%s' is not removable" - msgstr "データソース '%s' を削除することはできません" - --#: ../libedataserver/e-source.c:1251 -+#: ../libedataserver/e-source.c:1254 - #, c-format - msgid "Data source '%s' is not writable" - msgstr "データソース '%s' には書き込みできません" - --#: ../libedataserver/e-source.c:1864 -+#: ../libedataserver/e-source.c:1867 - msgid "Unnamed" - msgstr "名前なしの一覧" - --#: ../libedataserver/e-source-mail-signature.c:486 -+#: ../libedataserver/e-source-mail-signature.c:485 - #, c-format - msgid "Signature script must be a local file" - msgstr "署名スクリプトはローカルファイルにしてください" -@@ -4894,31 +4951,39 @@ - msgid "Source '%s' does not support proxy lookups" - msgstr "ソース '%s' ではプロキシ検索をサポートしていません" - --#: ../libedataserver/e-source-webdav.c:1551 -+#: ../libedataserver/e-source-webdav.c:1562 - #, c-format --msgid "SSL certificate for host '%s', used by address book '%s', is not trusted. Do you wish to accept it?" -+msgid "" -+"SSL certificate for host '%s', used by address book '%s', is not trusted. Do " -+"you wish to accept it?" - msgstr "ホスト '%s' の SSL 証明書がアドレス帳 '%s' で利用されていますが信頼できません。許可しますか?" - --#: ../libedataserver/e-source-webdav.c:1560 -+#: ../libedataserver/e-source-webdav.c:1571 - #, c-format --msgid "SSL certificate for host '%s', used by calendar '%s', is not trusted. Do you wish to accept it?" -+msgid "" -+"SSL certificate for host '%s', used by calendar '%s', is not trusted. Do you " -+"wish to accept it?" - msgstr "ホスト '%s' の SSL 証明書がカレンダー '%s' で利用されていますが信頼できません。許可しますか?" - --#: ../libedataserver/e-source-webdav.c:1569 -+#: ../libedataserver/e-source-webdav.c:1580 - #, c-format --msgid "SSL certificate for host '%s', used by memo list '%s', is not trusted. Do you wish to accept it?" -+msgid "" -+"SSL certificate for host '%s', used by memo list '%s', is not trusted. Do " -+"you wish to accept it?" - msgstr "ホスト '%s' の SSL 証明書がメモ一覧 '%s' で利用されていますが信頼できません。許可しますか?" - --#: ../libedataserver/e-source-webdav.c:1578 -+#: ../libedataserver/e-source-webdav.c:1589 - #, c-format --msgid "SSL certificate for host '%s', used by task list '%s', is not trusted. Do you wish to accept it?" -+msgid "" -+"SSL certificate for host '%s', used by task list '%s', is not trusted. Do " -+"you wish to accept it?" - msgstr "ホスト '%s' の SSL 証明書がタスク一覧 '%s' で利用されていますが信頼できません。許可しますか?" - - #. strptime format of a weekday, a date and a time, - #. * in 12-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1662 ../libedataserver/e-time-utils.c:1961 -+#: ../libedataserver/e-time-utils.c:1681 ../libedataserver/e-time-utils.c:1980 - msgid "%a %m/%d/%Y %I:%M:%S %p" - msgstr "%Y/%m/%d (%a) %p%l:%M:%S" - -@@ -4926,7 +4991,7 @@ - #. * in 24-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1667 ../libedataserver/e-time-utils.c:1952 -+#: ../libedataserver/e-time-utils.c:1686 ../libedataserver/e-time-utils.c:1971 - msgid "%a %m/%d/%Y %H:%M:%S" - msgstr "%Y/%m/%d (%a) %k:%M:%S" - -@@ -4934,7 +4999,7 @@ - #. * in 12-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1672 ../libedataserver/e-time-utils.c:1957 -+#: ../libedataserver/e-time-utils.c:1691 ../libedataserver/e-time-utils.c:1976 - msgid "%a %m/%d/%Y %I:%M %p" - msgstr "%Y/%m/%d (%a) %p%l:%M" - -@@ -4942,78 +5007,78 @@ - #. * in 24-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1677 ../libedataserver/e-time-utils.c:1948 -+#: ../libedataserver/e-time-utils.c:1696 ../libedataserver/e-time-utils.c:1967 - msgid "%a %m/%d/%Y %H:%M" - msgstr "%Y/%m/%d (%a) %k:%M" - - #. strptime format of a weekday, a date and a time, - #. * in 12-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1682 -+#: ../libedataserver/e-time-utils.c:1701 - msgid "%a %m/%d/%Y %I %p" - msgstr "%Y/%m/%d (%a) %p%l時" - - #. strptime format of a weekday, a date and a time, - #. * in 24-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1687 -+#: ../libedataserver/e-time-utils.c:1706 - msgid "%a %m/%d/%Y %H" - msgstr "%Y/%m/%d (%a) %k時" - - #. strptime format of a weekday and a date. - #. strftime format of a weekday and a date. --#: ../libedataserver/e-time-utils.c:1690 ../libedataserver/e-time-utils.c:1810 --#: ../libedataserver/e-time-utils.c:1943 -+#: ../libedataserver/e-time-utils.c:1709 ../libedataserver/e-time-utils.c:1829 -+#: ../libedataserver/e-time-utils.c:1962 - msgid "%a %m/%d/%Y" - msgstr "%Y/%m/%d (%a)" - - #. strptime format of a date and a time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1697 -+#: ../libedataserver/e-time-utils.c:1716 - msgid "%m/%d/%Y %I:%M:%S %p" - msgstr "%Y/%m/%d %p%l:%M:%S" - - #. strptime format of a date and a time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1701 -+#: ../libedataserver/e-time-utils.c:1720 - msgid "%m/%d/%Y %H:%M:%S" - msgstr "%Y/%m/%d %k:%M:%S" - - #. strptime format of a date and a time, in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1706 -+#: ../libedataserver/e-time-utils.c:1725 - msgid "%m/%d/%Y %I:%M %p" - msgstr "%Y/%m/%d %p%l:%M" - - #. strptime format of a date and a time, in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1711 -+#: ../libedataserver/e-time-utils.c:1730 - msgid "%m/%d/%Y %H:%M" - msgstr "%Y/%m/%d %k:%M" - - #. strptime format of a date and a time, in 12-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1716 -+#: ../libedataserver/e-time-utils.c:1735 - msgid "%m/%d/%Y %I %p" - msgstr "%Y/%m/%d %p%l時" - - #. strptime format of a date and a time, in 24-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1721 -+#: ../libedataserver/e-time-utils.c:1740 - msgid "%m/%d/%Y %H" - msgstr "%Y/%m/%d %k時" - - #. strptime format of a weekday and a date. - #. This is the preferred date format for the locale. --#: ../libedataserver/e-time-utils.c:1724 ../libedataserver/e-time-utils.c:1813 -+#: ../libedataserver/e-time-utils.c:1743 ../libedataserver/e-time-utils.c:1832 - msgid "%m/%d/%Y" - msgstr "%Y/%m/%d" - - #. strptime format for a time of day, in 12-hour format. - #. strftime format of a time in 12-hour format. --#: ../libedataserver/e-time-utils.c:1884 ../libedataserver/e-time-utils.c:2005 -+#: ../libedataserver/e-time-utils.c:1903 ../libedataserver/e-time-utils.c:2024 - msgid "%I:%M:%S %p" - msgstr "%p%l:%M:%S" - - #. strptime format for a time of day, in 24-hour format. - #. strftime format of a time in 24-hour format. --#: ../libedataserver/e-time-utils.c:1888 ../libedataserver/e-time-utils.c:1997 -+#: ../libedataserver/e-time-utils.c:1907 ../libedataserver/e-time-utils.c:2016 - msgid "%H:%M:%S" - msgstr "%k:%M:%S" - -@@ -5021,25 +5086,25 @@ - #. * in 12-hour format. - #. strftime format of a time in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1893 ../libedataserver/e-time-utils.c:2002 -+#: ../libedataserver/e-time-utils.c:1912 ../libedataserver/e-time-utils.c:2021 - msgid "%I:%M %p" - msgstr "%p%l:%M" - - #. strptime format for time of day, without seconds 24-hour format. - #. strftime format of a time in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1897 ../libedataserver/e-time-utils.c:1994 -+#: ../libedataserver/e-time-utils.c:1916 ../libedataserver/e-time-utils.c:2013 - msgid "%H:%M" - msgstr "%k:%M" - - #. strptime format for time of day, without seconds 24-hour format, - #. * and no colon. --#: ../libedataserver/e-time-utils.c:1901 -+#: ../libedataserver/e-time-utils.c:1920 - msgid "%H%M" - msgstr "%k%M" - - #. strptime format for hour and AM/PM, 12-hour format. --#: ../libedataserver/e-time-utils.c:1905 -+#: ../libedataserver/e-time-utils.c:1924 - msgid "%I %p" - msgstr "%p%l時" - -@@ -5051,7 +5116,9 @@ - - #: ../modules/gnome-online-accounts/e-goa-password-based.c:142 - #, c-format --msgid "Cannot find a corresponding account in the org.gnome.OnlineAccounts service from which to obtain a password for '%s'" -+msgid "" -+"Cannot find a corresponding account in the org.gnome.OnlineAccounts service " -+"from which to obtain a password for '%s'" - msgstr "'%s' のパスワード取得先の org.gnome.OnlineAccounts サービスから対応するアカウントを見つけることができません" - - #: ../modules/gnome-online-accounts/e-goa-password-based.c:218 -@@ -5095,23 +5162,25 @@ - msgid "Failed to find ASUrl and OABUrl in autodiscover response" - msgstr "autodiscover 応答内で ASUrl と OABUrl の検出に失敗しました" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1261 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1269 - #, c-format --msgid "Cannot find a corresponding account in the org.gnome.OnlineAccounts service from which to obtain an access token for '%s'" --msgstr "'%s' のアクセス用トークン取得先の org.gnome.OnlineAccounts サービスから対応するアカウントを見つけることができません" -+msgid "" -+"Cannot find a corresponding account in the org.gnome.OnlineAccounts service " -+"from which to obtain an access token for '%s'" -+msgstr "" -+"'%s' のアクセス用トークン取得先の org.gnome.OnlineAccounts サービスから対応するアカウントを見つけることができません" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1288 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1299 - #, c-format - msgid "Failed to obtain an access token for '%s': " - msgstr "'%s' のアクセス用トークン取得に失敗しました: " - --#: ../modules/google-backend/module-google-backend.c:191 --#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 --#: ../modules/yahoo-backend/module-yahoo-backend.c:199 --msgid "Calendar" --msgstr "カレンダー" -+#: ../modules/google-backend/module-google-backend.c:341 -+#: ../modules/yahoo-backend/module-yahoo-backend.c:226 -+msgid "Tasks" -+msgstr "タスク" - --#: ../modules/google-backend/module-google-backend.c:260 -+#: ../modules/google-backend/module-google-backend.c:395 - #: ../modules/ubuntu-online-accounts/contacts.service-type.in.in.h:1 - #: ../services/evolution-source-registry/builtin/contacts-stub.source.in.h:1 - msgid "Contacts" -@@ -5122,7 +5191,9 @@ - msgstr "署名している認証局が未知です" - - #: ../modules/trust-prompt/module-trust-prompt.c:84 --msgid "The certificate does not match the expected identity of the site that it was retrieved from." -+msgid "" -+"The certificate does not match the expected identity of the site that it was " -+"retrieved from." - msgstr "証明書が予期した取得サイトの識別情報と一致しません。" - - #: ../modules/trust-prompt/module-trust-prompt.c:86 -@@ -5134,7 +5205,9 @@ - msgstr "証明書の有効期限が切れています。" - - #: ../modules/trust-prompt/module-trust-prompt.c:90 --msgid "The certificate has been revoked according to the connection's certificate revocation list." -+msgid "" -+"The certificate has been revoked according to the connection's certificate " -+"revocation list." - msgstr "この接続の証明書失効リストによれば、この証明書は失効されています。" - - #: ../modules/trust-prompt/module-trust-prompt.c:92 -@@ -5166,6 +5239,11 @@ - msgid "Reason:" - msgstr "理由:" - -+#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 -+#: ../modules/yahoo-backend/module-yahoo-backend.c:199 -+msgid "Calendar" -+msgstr "カレンダー" -+ - #: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:2 - msgid "Integrate your calendars" - msgstr "カレンダーと統合" -@@ -5208,15 +5286,18 @@ - - #: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1008 - #, c-format --msgid "Cannot find a corresponding account service in the accounts database from which to obtain an access token for '%s'" -+msgid "" -+"Cannot find a corresponding account service in the accounts database from " -+"which to obtain an access token for '%s'" - msgstr "'%s' のアクセス用トークン取得先のアカウントデータベースから対応するアカウントを見つけることができません" - - #: ../modules/ubuntu-online-accounts/uoa-utils.c:84 - #: ../modules/ubuntu-online-accounts/uoa-utils.c:281 --#, fuzzy, c-format --#| msgid "Expected status 200 when requesting guid, instead got status %d (%s)" --msgid "Expected status 200 when requesting your identity, instead got status %d (%s)" --msgstr "guid を要求した時に返されるステータスは 200 を期待していましたが、代わりに受け取ったステータスは %d (%s) でした" -+#, c-format -+msgid "" -+"Expected status 200 when requesting your identity, instead got status %d " -+"(%s)" -+msgstr "アイデンティティーを要求した際に期待していたステータスは 200 でしたが、代わりに受け取ったステータスは %d (%s) でした" - - #: ../modules/ubuntu-online-accounts/uoa-utils.c:101 - #: ../modules/ubuntu-online-accounts/uoa-utils.c:298 -@@ -5224,28 +5305,20 @@ - msgstr "応答を JSON として解析中にエラー: " - - #: ../modules/ubuntu-online-accounts/uoa-utils.c:119 --#, fuzzy --#| msgid "Didn't find email member in JSON data" - msgid "Didn't find 'email' in JSON data" --msgstr "JSON データ中にメールアドレスを見つけられませんでした" -+msgstr "JSON データ内に 'email' は見つかりませんでした" - - #: ../modules/ubuntu-online-accounts/uoa-utils.c:316 --#, fuzzy --#| msgid "Didn't find email member in JSON data" - msgid "Didn't find 'id' in JSON data" --msgstr "JSON データ中にメールアドレスを見つけられませんでした" -+msgstr "JSON データ内に 'id' は見つかりませんでした" - - #: ../modules/ubuntu-online-accounts/uoa-utils.c:321 --#, fuzzy --#| msgid "Didn't find email member in JSON data" - msgid "Didn't find 'emails.account' in JSON data" --msgstr "JSON データ中にメールアドレスを見つけられませんでした" -+msgstr "JSON データ内に 'emails.account' は見つかりませんでした" - - #: ../modules/ubuntu-online-accounts/windows-live-mail.service.in.in.h:1 --#, fuzzy --#| msgid "Wants HTML Mail" - msgid "Windows Live Mail" --msgstr "HTML 形式のメールを希望する" -+msgstr "Windows Live メール" - - #: ../modules/ubuntu-online-accounts/yahoo-calendar.service.in.in.h:1 - msgid "Yahoo! Calendar" -@@ -5255,10 +5328,6 @@ - msgid "Yahoo! Mail" - msgstr "Yahoo!メール" - --#: ../modules/yahoo-backend/module-yahoo-backend.c:226 --msgid "Tasks" --msgstr "タスク" -- - #: ../services/evolution-addressbook-factory/evolution-addressbook-factory.c:46 - #: ../services/evolution-calendar-factory/evolution-calendar-factory.c:50 - #: ../services/evolution-user-prompter/evolution-user-prompter.c:30 -@@ -5309,64 +5378,8 @@ - - #: ../services/evolution-source-registry/evolution-source-registry.c:38 - msgid "Don't migrate user data from previous versions of Evolution" --msgstr "" -+msgstr "Evolution の以前のバージョンからのユーザーデータを移行しないでください" - - #: ../services/evolution-user-prompter/prompt-user-gtk.c:121 - msgid "_Dismiss" - msgstr "解散(_D)" -- --#~ msgid "" --#~ "Could not write log entry: %s\n" --#~ "Further operations on this server will not be replayed when you\n" --#~ "reconnect to the network." --#~ msgstr "" --#~ "ログを書き込めませんでした: %s\n" --#~ "ネットワークに再接続しても、このサーバーに対する\n" --#~ "これ以降の操作は再現されません。" -- --#~ msgid "" --#~ "Could not open '%s':\n" --#~ "%s\n" --#~ "Changes made to this folder will not be resynchronized." --#~ msgstr "" --#~ "'%s' が開けませんでした:\n" --#~ "%s\n" --#~ "このフォルダーに対する変更が再び同期されることはありません。" -- --#~ msgid "Resynchronizing with server" --#~ msgstr "サーバーの再同期中" -- --#~ msgid "Preparing folder '%s' for offline" --#~ msgstr "オフラインに切り替える準備中: %s" -- --#~ msgid "Canceled" --#~ msgstr "キャンセル済み" -- --#~ msgid "" --#~ "Alert from IMAP server %s:\n" --#~ "%s" --#~ msgstr "" --#~ "IMAP サーバー %s からの警告:\n" --#~ "%s" -- --#~ msgid "Error while fetching messages" --#~ msgstr "メッセージの取得中にエラーが発生しました" -- --#~ msgid "Fetching summary information for %d message in '%s'" --#~ msgid_plural "Fetching summary information for %d messages in '%s'" --#~ msgstr[0] "%d メッセージ (%s 内) のサマリ情報を取得中" -- --#~ msgid "Lost connection to IMAP server" --#~ msgstr "IMAP サーバーへの接続を失いました" -- --#~ msgid "Source stream unavailable" --#~ msgstr "ソースストリームは利用できません" -- --#~ msgid "Cannot create folder '%s': folder exists" --#~ msgstr "'%s' というフォルダーを作成できません: 既に存在しています" -- --#~ msgid "Cannot create folder '%s': folder exists." --#~ msgstr "'%s' というフォルダーを作成できません: 既に存在しています。" -- --#~ msgid "You cannot post NNTP messages while working offline!" --#~ msgstr "オフライン状態の間は NNTP メッセージを投稿できません!" -diff -urN evolution-data-server-3.12.11/po/ko.po evolution-data-server-3.12.11_localized/po/ko.po ---- evolution-data-server-3.12.11/po/ko.po 2014-11-04 18:27:25.000000000 +0530 -+++ evolution-data-server-3.12.11_localized/po/ko.po 2016-03-14 19:48:05.477870024 +0530 -@@ -5,31 +5,31 @@ - # Young-Ho Cha , 2000, 2002. - # Seong-ho Cho , 2012. - # Changwoo Ryu , 2004-2014. --# -+# - # 주의: - # - 기술적인 용어가 많습니다. 무슨 의미인지 확실히 파악하고 번역하시기 바랍니다. --# -+# - # 용어: - # - "Evolution"은 "에볼루션"으로 음역. - # - "Google Talk"는 "구글 토크"로 번역. - # - "spool"은 "메일 모음"으로 번역. - # - "authentication"을 여러가지 인증 방식을 구별하는 용도로 사용할 때는 "인증 - # 방법"이라고 번역. --# -+# pnemade , 2016. #zanata - msgid "" - msgstr "" - "Project-Id-Version: evolution-data-server\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" --"product=evolution-data-server&keywords=I18N+L10N&component=Misc.\n" --"POT-Creation-Date: 2014-09-12 19:07+0000\n" --"PO-Revision-Date: 2014-09-14 01:21+0900\n" --"Last-Translator: Changwoo Ryu \n" --"Language-Team: GNOME Korea \n" --"Language: Korean\n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2016-02-16 09:58+0530\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"PO-Revision-Date: 2014-09-13 04:21+0000\n" -+"Last-Translator: Changwoo Ryu \n" -+"Language-Team: GNOME Korea \n" -+"Language: ko\n" - "Plural-Forms: nplurals=1; plural=0;\n" -+"X-Generator: Zanata 3.8.2\n" - - #: ../addressbook/backends/file/e-book-backend-file.c:120 - #, c-format -@@ -72,8 +72,8 @@ - - #: ../addressbook/backends/file/e-book-backend-file.c:1472 - #: ../addressbook/backends/file/e-book-backend-file.c:1555 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3077 --#: ../addressbook/libedata-book/e-book-sqlite.c:6742 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3084 -+#: ../addressbook/libedata-book/e-book-sqlite.c:6793 - #, c-format - msgid "Contact '%s' not found" - msgstr "'%s' 연락처를 찾을 수 없습니다" -@@ -103,79 +103,79 @@ - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:1174 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4250 - #: ../addressbook/backends/webdav/e-book-backend-webdav.c:419 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:887 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:888 - #: ../addressbook/libebook-contacts/e-book-contacts-types.c:35 - #: ../addressbook/libebook-contacts/e-phone-number.c:56 - #: ../addressbook/libebook/e-book.c:1078 --#: ../addressbook/libebook/e-book-client.c:1882 --#: ../addressbook/libebook/e-book-client.c:2054 --#: ../addressbook/libebook/e-book-client.c:2267 --#: ../addressbook/libebook/e-book-client.c:2398 --#: ../addressbook/libebook/e-book-client.c:2557 --#: ../addressbook/libebook/e-book-client.c:2691 --#: ../addressbook/libebook/e-book-client.c:2822 --#: ../addressbook/libebook/e-book-client.c:2980 --#: ../addressbook/libebook/e-book-client.c:3175 --#: ../addressbook/libebook/e-book-client.c:3393 -+#: ../addressbook/libebook/e-book-client.c:1916 -+#: ../addressbook/libebook/e-book-client.c:2088 -+#: ../addressbook/libebook/e-book-client.c:2301 -+#: ../addressbook/libebook/e-book-client.c:2432 -+#: ../addressbook/libebook/e-book-client.c:2591 -+#: ../addressbook/libebook/e-book-client.c:2725 -+#: ../addressbook/libebook/e-book-client.c:2856 -+#: ../addressbook/libebook/e-book-client.c:3014 -+#: ../addressbook/libebook/e-book-client.c:3209 -+#: ../addressbook/libebook/e-book-client.c:3427 - #: ../addressbook/libedata-book/e-book-backend-sexp.c:878 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:585 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:616 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:629 - #: ../calendar/backends/contacts/e-cal-backend-contacts.c:270 - #: ../calendar/libecal/e-cal.c:2334 ../calendar/libecal/e-cal-client.c:276 --#: ../calendar/libecal/e-cal-client.c:3239 --#: ../calendar/libecal/e-cal-client.c:3412 --#: ../calendar/libecal/e-cal-client.c:3676 --#: ../calendar/libecal/e-cal-client.c:3917 --#: ../calendar/libecal/e-cal-client.c:4107 --#: ../calendar/libecal/e-cal-client.c:4299 --#: ../calendar/libecal/e-cal-client.c:4469 --#: ../calendar/libecal/e-cal-client.c:4638 --#: ../calendar/libecal/e-cal-client.c:4841 --#: ../calendar/libecal/e-cal-client.c:4991 --#: ../calendar/libecal/e-cal-client.c:5185 --#: ../calendar/libecal/e-cal-client.c:5338 --#: ../calendar/libecal/e-cal-client.c:5555 --#: ../calendar/libecal/e-cal-client.c:5709 --#: ../calendar/libecal/e-cal-client.c:5935 --#: ../calendar/libecal/e-cal-client.c:6131 --#: ../calendar/libecal/e-cal-client.c:6494 --#: ../calendar/libecal/e-cal-client.c:6708 -+#: ../calendar/libecal/e-cal-client.c:3273 -+#: ../calendar/libecal/e-cal-client.c:3446 -+#: ../calendar/libecal/e-cal-client.c:3710 -+#: ../calendar/libecal/e-cal-client.c:3951 -+#: ../calendar/libecal/e-cal-client.c:4141 -+#: ../calendar/libecal/e-cal-client.c:4333 -+#: ../calendar/libecal/e-cal-client.c:4503 -+#: ../calendar/libecal/e-cal-client.c:4672 -+#: ../calendar/libecal/e-cal-client.c:4875 -+#: ../calendar/libecal/e-cal-client.c:5025 -+#: ../calendar/libecal/e-cal-client.c:5219 -+#: ../calendar/libecal/e-cal-client.c:5372 -+#: ../calendar/libecal/e-cal-client.c:5589 -+#: ../calendar/libecal/e-cal-client.c:5743 -+#: ../calendar/libecal/e-cal-client.c:5969 -+#: ../calendar/libecal/e-cal-client.c:6165 -+#: ../calendar/libecal/e-cal-client.c:6528 -+#: ../calendar/libecal/e-cal-client.c:6750 - #: ../camel/providers/imapx/camel-imapx-command.c:645 --#: ../camel/providers/imapx/camel-imapx-server.c:4784 --#: ../camel/providers/imapx/camel-imapx-server.c:4793 -+#: ../camel/providers/imapx/camel-imapx-server.c:4871 -+#: ../camel/providers/imapx/camel-imapx-server.c:4880 - #: ../libedataserver/e-client.c:185 - msgid "Unknown error" - msgstr "알 수 없는 오류가 발생했습니다" - - #. Query for new contacts asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:828 -+#: ../addressbook/backends/google/e-book-backend-google.c:822 - msgid "Querying for updated contacts…" - msgstr "업데이트된 연락처를 받는 중입니다…" - - #. Run the query asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:1010 -+#: ../addressbook/backends/google/e-book-backend-google.c:1004 - msgid "Querying for updated groups…" - msgstr "업데이트된 그룹을 받는 중입니다…" - --#: ../addressbook/backends/google/e-book-backend-google.c:1757 -+#: ../addressbook/backends/google/e-book-backend-google.c:1751 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4997 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1433 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1434 - msgid "The backend does not support bulk additions" - msgstr "백엔드가 대량 추가를 지원하지 않습니다" - --#: ../addressbook/backends/google/e-book-backend-google.c:1912 -+#: ../addressbook/backends/google/e-book-backend-google.c:1906 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:5133 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1545 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1546 - msgid "The backend does not support bulk modifications" - msgstr "백엔드가 대량 수정을 지원하지 않습니다" - --#: ../addressbook/backends/google/e-book-backend-google.c:2119 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1645 -+#: ../addressbook/backends/google/e-book-backend-google.c:2113 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1646 - msgid "The backend does not support bulk removals" - msgstr "백엔드가 대량 제거를 지원하지 않습니다" - --#: ../addressbook/backends/google/e-book-backend-google.c:2239 -+#: ../addressbook/backends/google/e-book-backend-google.c:2233 - msgid "Loading…" - msgstr "읽어들이는 중입니다…" - -@@ -275,44 +275,44 @@ - msgid "Failed to get the DN for user '%s'" - msgstr "'%s' 사용자의 DN을 가져오는데 실패했습니다" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:864 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:865 - msgid "Loading Addressbook summary..." - msgstr "주소록 개요를 불러오는 중..." - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:884 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:885 - #, c-format - msgid "PROPFIND on webdav failed with HTTP status %d (%s)" - msgstr "WebDAV의 PROPFIND에서 HTTP 상태 %d (%s)(으)로 실패했습니다" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:903 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:904 - msgid "No response body in webdav PROPFIND result" - msgstr "WebDAV PROPFIND 결과에서 본문 응답이 없습니다" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:964 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:965 - #, c-format - msgid "Loading Contacts (%d%%)" - msgstr "연락처 불러오는 중(%d%%)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1353 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1354 - msgid "Cannot transform SoupURI to string" - msgstr "SoupURI를 문자열로 변환할 수 없습니다" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1474 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1475 - #, c-format - msgid "Create resource '%s' failed with HTTP status %d (%s)" - msgstr "'%s' 리소스 만들기 실패, HTTP 상태 %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1576 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1577 - msgid "Contact on server changed -> not modifying" - msgstr "서버의 연락처 바뀜 -> 수정하지 않음" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1584 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1585 - #, c-format - msgid "Modify contact failed with HTTP status %d (%s)" - msgstr "연락처 수정을 HTTP 상태 %d번(%s)으로 실패했습니다" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1677 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1693 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1678 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1694 - #, c-format - msgid "DELETE failed with HTTP status %d" - msgstr "DELETE를 HTTP 상태 %d(으)로 실패했습니다" -@@ -916,7 +916,7 @@ - msgid "Twitter Name List" - msgstr "트위터 이름 목록" - --#: ../addressbook/libebook-contacts/e-contact.c:1654 -+#: ../addressbook/libebook-contacts/e-contact.c:1660 - #: ../addressbook/libebook/e-destination.c:920 - msgid "Unnamed List" - msgstr "이름 없는 목록" -@@ -939,7 +939,8 @@ - - #: ../addressbook/libebook-contacts/e-phone-number.c:49 - msgid "" --"Remaining text after the country calling code is too short for a phone number" -+"Remaining text after the country calling code is too short for a phone " -+"number" - msgstr "국가 번호 다음의 텍스트가 전화 번호로 너무 짧습니다" - - #: ../addressbook/libebook-contacts/e-phone-number.c:51 -@@ -950,86 +951,82 @@ - msgid "Text is too long for a phone number" - msgstr "텍스트가 전화 번호로 너무 깁니다" - --#: ../addressbook/libebook/e-book-client.c:807 -+#: ../addressbook/libebook/e-book-client.c:841 - #, c-format - msgid "Unknown book property '%s'" - msgstr "알 수 없는 주소록 속성 '%s'" - --#: ../addressbook/libebook/e-book-client.c:822 -+#: ../addressbook/libebook/e-book-client.c:856 - #, c-format - msgid "Cannot change value of book property '%s'" - msgstr "주소록 속성 '%s'의 값을 바꿀 수 없습니다" - --#: ../addressbook/libebook/e-book-client.c:1207 --#: ../addressbook/libebook/e-book-client.c:1382 --#: ../addressbook/libebook/e-book-client.c:1649 --#: ../calendar/libecal/e-cal-client.c:1530 --#: ../calendar/libecal/e-cal-client.c:1712 -+#: ../addressbook/libebook/e-book-client.c:1241 -+#: ../addressbook/libebook/e-book-client.c:1416 -+#: ../addressbook/libebook/e-book-client.c:1683 -+#: ../calendar/libecal/e-cal-client.c:1564 -+#: ../calendar/libecal/e-cal-client.c:1746 - #, c-format - msgid "Unable to connect to '%s': " - msgstr "'%s'에 연결할 수 없습니다: " - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:899 --#: ../addressbook/libedata-book/e-book-sqlite.c:2178 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:906 -+#: ../addressbook/libedata-book/e-book-sqlite.c:2201 - #, c-format - msgid "Error introspecting unknown summary field '%s'" - msgstr "요약 필드 '%s' 점검에 오류가 발생했습니다" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1509 --#: ../addressbook/libedata-book/e-book-sqlite.c:1334 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1516 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1340 - msgid "Error parsing regular expression" - msgstr "정규식을 파싱하는 중 오류: %s" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1554 --#: ../addressbook/libedata-book/e-book-sqlite.c:1818 ../camel/camel-db.c:545 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1561 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1824 ../camel/camel-db.c:619 - #, c-format - msgid "Insufficient memory" - msgstr "메모리 부족" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1691 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1698 - #, c-format - msgid "Invalid contact field '%d' specified in summary" - msgstr "잘못된 연락처 필드 '%d'번을 요약에서 지정했습니다" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1725 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1732 - #: ../addressbook/libedata-book/e-book-sqlite.c:559 - #, c-format - msgid "" - "Contact field '%s' of type '%s' specified in summary, but only boolean, " - "string and string list field types are supported" --msgstr "" --"연락처 필드 '%s'(형식 '%s')을(를) 지정했지만 불리언, 문자열, 문자열 목록 필" --"드 형식만 지원합니다." -+msgstr "연락처 필드 '%s'(형식 '%s')을(를) 지정했지만 불리언, 문자열, 문자열 목록 필드 형식만 지원합니다." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3065 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4161 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3072 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4168 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. vcards cannot be returned." --msgstr "" --"전체 search_contacts는 캐시에 저장하지 않습니다. vcards를 리턴할 수 없습니다." -+msgstr "전체 search_contacts는 캐시에 저장하지 않습니다. vcards를 리턴할 수 없습니다." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4292 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4385 --#: ../addressbook/libedata-book/e-book-sqlite.c:5400 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4299 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4392 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5451 - #, c-format - msgid "Query contained unsupported elements" - msgstr "질의에 지원하지 않는 요소가 들어 있습니다" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4296 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4303 - #, c-format - msgid "Invalid Query" - msgstr "질의가 잘못되었습니다" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4320 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4327 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. Hence only summary query is " - "supported." --msgstr "" --"전체 search_contacts는 캐시에 저장하지 않습니다. 즉 요약 질의만 지원합니다." -+msgstr "전체 search_contacts는 캐시에 저장하지 않습니다. 즉 요약 질의만 지원합니다." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4389 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4396 - #: ../addressbook/libedata-book/e-data-book.c:383 - #: ../addressbook/libedata-book/e-data-book.c:1028 - #: ../calendar/libedata-cal/e-data-cal.c:420 -@@ -1038,85 +1035,81 @@ - msgid "Invalid query" - msgstr "질의가 잘못되었습니다" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4432 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4439 - #, c-format - msgid "" - "Full vcards are not stored in cache. Hence only summary query is supported." - msgstr "전체 vcards는 캐시에 저장하지 않습니다. 즉 요약 질의만 지원합니다." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5255 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5262 - #, c-format - msgid "Unable to remove the db file: errno %d" - msgstr "DB 파일을 제거하는데 실패했습니다: 오류 번호 %d번" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6042 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6442 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6449 - #, c-format - msgid "Only summary queries are supported by EbSdbCursor" - msgstr "EbSdbCursor에서는 요약 정보 질의만 지원합니다." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6056 - #, c-format - msgid "At least one sort field must be specified to use an EbSdbCursor" - msgstr "EbSdbCursor를 사용하려면 최소한 하나의 정렬 항목을 지정해야 합니다" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6063 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 - #, c-format - msgid "Cannot sort by a field that is not in the summary" - msgstr "요약문에 없는 항목으로는 정렬할 수 없습니다" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6077 - #, c-format - msgid "Cannot sort by a field which may have multiple values" - msgstr "값이 여러 개일 수도 있는 항목으로는 정렬할 수 없습니다" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6203 --#: ../addressbook/libedata-book/e-book-sqlite.c:7412 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6210 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7463 - #, c-format - msgid "" - "Tried to step a cursor in reverse, but cursor is already at the beginning of " - "the contact list" --msgstr "" --"커서를 반대 순서으로 지정하려고 했지만, 이미 커서가 연락처 목록 처음에 들어 " --"있습니다" -+msgstr "커서를 반대 순서으로 지정하려고 했지만, 이미 커서가 연락처 목록 처음에 들어 있습니다" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6211 --#: ../addressbook/libedata-book/e-book-sqlite.c:7420 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6218 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7471 - #, c-format - msgid "" - "Tried to step a cursor forwards, but cursor is already at the end of the " - "contact list" --msgstr "" --"커서를 반대 순서으로 지정하려고 했지만, 이미 커서가 연락처 목록 끝에 들어 있" --"습니다" -+msgstr "커서를 반대 순서으로 지정하려고 했지만, 이미 커서가 연락처 목록 끝에 들어 있습니다" - - #: ../addressbook/libedata-book/e-book-sqlite.c:526 - #, c-format - msgid "Unsupported contact field '%d' specified in summary" - msgstr "지원하지 않는 연락처 필드 '%d'번을 요약에서 지정했습니다" - --#: ../addressbook/libedata-book/e-book-sqlite.c:1891 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1897 - msgid "" - "Cannot upgrade contacts database from a legacy database with more than one " - "addressbook. Delete one of the entries in the 'folders' table first." - msgstr "" --"여러 개의 주소록이 있는 레가시 데이터베이스에서 연락처 데이터베이스를 업그레" --"이드할 수 없습니다. 먼저 'folders' 테이블의 항목을 삭제하십시오." -+"여러 개의 주소록이 있는 레가시 데이터베이스에서 연락처 데이터베이스를 업그레이드할 수 없습니다. 먼저 'folders' 테이블의 항목을 " -+"삭제하십시오." - --#: ../addressbook/libedata-book/e-book-sqlite.c:5393 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5444 - #, c-format - msgid "Invalid query: %s" - msgstr "질의가 잘못되었습니다: %s" - --#: ../addressbook/libedata-book/e-book-sqlite.c:5568 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5619 - msgid "Invalid query for EbSqlCursor" - msgstr "EbSqlCursor에 대한 질의가 잘못되었습니다" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7234 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7285 - msgid "At least one sort field must be specified to use an EbSqlCursor" - msgstr "EbSqlCursor를 사용하려면 최소한 하나의 정렬 항목을 지정해야 합니다" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7252 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7303 - msgid "Cannot sort by a field that is not a string type" - msgstr "문자열이 아닌 항목으로는 정렬할 수 없습니다" - -@@ -1282,15 +1275,15 @@ - msgid "Cannot remove contacts: " - msgstr "연락처를 제거할 수 없습니다: " - --#: ../addressbook/libedata-book/e-data-book-cursor.c:772 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:776 - msgid "Cursor does not support setting the search expression" - msgstr "커서에서 검색 식 설정을 지원하지 않습니다" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:855 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:859 - msgid "Cursor does not support step" - msgstr "커서에서 스텝을 지원하지 않습니다" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:938 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:942 - msgid "Cursor does not support alphabetic indexes" - msgstr "커서에서 사전 순서 인덱스를 지원하지 않습니다" - -@@ -1324,64 +1317,63 @@ - msgid "No such source for UID '%s'" - msgstr "'%s' UID에 대한 원본이 없습니다" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:581 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 - #, c-format - msgid "Server is unreachable (%s)" - msgstr "서버에 접근할 수 없습니다(%s)" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:612 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 - #, c-format - msgid "Failed to connect to a server using SSL: %s" - msgstr "SSL을 사용하여 서버에 연결하는데 실패했습니다: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:623 --#, c-format --msgid "Unexpected HTTP status code %d returned (%s)" -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 -+#, fuzzy, c-format -+msgid "Unexpected HTTP status code %d returned (%s) for URI: %s" - msgstr "예기치 않은 HTTP 상태 코드 %d번을 리턴했습니다(%s)" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:642 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:647 - msgid "CalDAV backend is not loaded yet" - msgstr "CalDAV 백엔드를 아직 불러오지 않았습니다" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1084 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1091 - msgid "Invalid Redirect URL" - msgstr "잘못된 경로 재지정 URL 입니다" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2887 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2894 - #, c-format - msgid "Cannot create local cache folder '%s'" - msgstr "'%s' 로컬 캐시 폴더를 만들 수 없습니다" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2939 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2946 - #, c-format - msgid "" - "Server is unreachable, calendar is opened in read-only mode.\n" - "Error message: %s" --msgstr "" --"서버에 접근할 수 없습니다. 달력을 읽기 전용 모드로 엽니다.\n" -+msgstr "서버에 접근할 수 없습니다. 달력을 읽기 전용 모드로 엽니다.\n" - "오류 메시지: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3973 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3988 - msgid "CalDAV does not support bulk additions" - msgstr "CalDAV가 대량 추가를 지원하지 않습니다" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4076 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4091 - msgid "CalDAV does not support bulk modifications" - msgstr "CalDAV가 대량 수정을 지원하지 않습니다" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4252 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4267 - msgid "CalDAV does not support bulk removals" - msgstr "CalDAV가 대량 제거를 지원하지 않습니다" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4919 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4941 - msgid "Calendar doesn't support Free/Busy" - msgstr "달력이 약속 있음/없음을 지원하지 않습니다" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4928 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4950 - msgid "Schedule outbox url not found" - msgstr "스케듈 outbox URL을 찾을 수 없습니다" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5025 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5047 - msgid "Unexpected result in schedule-response" - msgstr "schedule-response에 예상치 못한 결과가 있습니다" - -@@ -1429,74 +1421,75 @@ - msgstr "달력이 아닙니다." - - #: ../calendar/backends/http/e-cal-backend-http.c:925 --#: ../calendar/backends/weather/e-cal-backend-weather.c:536 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:700 - msgid "Could not create cache file" - msgstr "캐시 파일을 만들 수 없습니다" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:174 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:196 - msgid "Could not retrieve weather data" - msgstr "달력 데이터를 가져올 수 없습니다" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:295 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:369 - msgid "Weather: Fog" - msgstr "날씨: 안개" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:296 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:370 - msgid "Weather: Cloudy Night" - msgstr "날씨: 밤하늘 구름" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:297 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:371 - msgid "Weather: Cloudy" - msgstr "날씨: 구름" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:298 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:372 - msgid "Weather: Overcast" - msgstr "날씨: 흐림" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:299 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:373 - msgid "Weather: Showers" - msgstr "날씨: 소나기" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:300 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:374 - msgid "Weather: Snow" - msgstr "날씨: 눈" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:301 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:375 - msgid "Weather: Clear Night" - msgstr "날씨: 밤하늘 맑음" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:302 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:376 - msgid "Weather: Sunny" - msgstr "날씨: 해" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:303 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:377 - msgid "Weather: Thunderstorms" - msgstr "날씨: 뇌우" - - #. TRANSLATOR: This is the temperature in degrees Fahrenheit (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:329 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:403 - #, c-format - msgid "%.1f °F" - msgstr "%.1f °F" - - #. TRANSLATOR: This is the temperature in degrees Celsius (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:332 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:406 - #, c-format - msgid "%.1f °C" - msgstr "%.1f °C" - - #. TRANSLATOR: This is the temperature in kelvin --#: ../calendar/backends/weather/e-cal-backend-weather.c:335 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:409 - #, c-format - msgid "%.1f K" - msgstr "%.1f K" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:341 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:415 - #, c-format - msgid "%.1f" - msgstr "%.1f" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:452 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:580 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:608 - msgid "Forecast" - msgstr "예보" - -@@ -1552,7 +1545,7 @@ - msgstr "인증이 실패했습니다" - - #: ../calendar/libecal/e-cal.c:2330 --#: ../camel/providers/smtp/camel-smtp-transport.c:921 -+#: ../camel/providers/smtp/camel-smtp-transport.c:960 - #: ../libedataserver/e-client.c:147 - msgid "Authentication required" - msgstr "인증이 필요합니다" -@@ -1575,17 +1568,17 @@ - msgid "Invalid range" - msgstr "범위가 잘못되었습니다" - --#: ../calendar/libecal/e-cal-client.c:936 -+#: ../calendar/libecal/e-cal-client.c:970 - #, c-format - msgid "Unknown calendar property '%s'" - msgstr "알 수 없는 달력 속성 '%s'" - --#: ../calendar/libecal/e-cal-client.c:951 -+#: ../calendar/libecal/e-cal-client.c:985 - #, c-format - msgid "Cannot change value of calendar property '%s'" - msgstr "'%s' 달력 속성의 값을 바꿀 수 없습니다" - --#: ../calendar/libecal/e-cal-component.c:1348 -+#: ../calendar/libecal/e-cal-component.c:1349 - msgid "Untitled appointment" - msgstr "제목없는 약속" - -@@ -1734,83 +1727,83 @@ - msgid "Undefined" - msgstr "정의안됨" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:84 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1062 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1371 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1498 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1547 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:85 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1063 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1379 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1506 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1555 - #, c-format - msgid "\"%s\" expects one argument" - msgstr "\"%s\"에는 한 개의 인자가 필요합니다" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:91 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:673 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1378 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:92 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:674 - #: ../calendar/libedata-cal/e-cal-backend-sexp.c:1386 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1394 - #, c-format - msgid "\"%s\" expects the first argument to be a string" - msgstr "\"%s\"의 첫번째 인자가 문자열이어야 합니다" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:166 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:167 - #, c-format - msgid "\"%s\" expects two or three arguments" - msgstr "\"%s\"에는 두 개 또는 세 개 인자가 필요합니다" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:173 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:262 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:324 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:823 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1069 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1447 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1505 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1554 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:174 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:263 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:325 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:824 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1070 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1455 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1513 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1562 - #, c-format - msgid "\"%s\" expects the first argument to be a time_t" - msgstr "\"%s\"의 첫번째 인자가 time_t 값이어야 합니다" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:182 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:270 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:334 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:832 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:183 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:271 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:335 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:833 - #, c-format - msgid "\"%s\" expects the second argument to be a time_t" - msgstr "\"%s\"의 두번째 인자가 time_t여야 합니다" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:192 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:193 - #, c-format - msgid "\"%s\" expects the third argument to be a string" - msgstr "\"%s\"의 세번째 인자가 문자열이어야 합니다" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:254 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:255 - #, c-format - msgid "\"%s\" expects none or two arguments" - msgstr "\"%s\"에는 인자가 없거나 두 개의 인자가 필요합니다" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:317 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:666 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:816 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1440 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:318 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:667 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:817 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1448 - #, c-format - msgid "\"%s\" expects two arguments" - msgstr "\"%s\"에는 두 개의 인자가 필요합니다" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:602 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:625 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:748 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:780 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:987 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1020 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1332 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:603 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:626 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:749 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:781 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:988 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1021 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1340 - #, c-format - msgid "\"%s\" expects no arguments" - msgstr "\"%s\"에는 인자가 필요 없습니다" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:682 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:683 - #, c-format - msgid "\"%s\" expects the second argument to be a string" - msgstr "\"%s\"의 두번째 인자가 문자열이어야 합니다" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:713 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:714 - #, c-format - msgid "" - "\"%s\" expects the first argument to be either \"any\", \"summary\", or " -@@ -1820,26 +1813,24 @@ - "\"%s\"의 첫번째 인자가 \"any\", \"summary\", \"description\", \"location\", " - "\"attendee\", \"organizer\", \"classification\" 중의 하나여야 합니다" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:884 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:885 - #, c-format - msgid "\"%s\" expects at least one argument" - msgstr "\"%s\"에는 최소한 한 개의 인자가 필요합니다" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:899 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:900 - #, c-format - msgid "" - "\"%s\" expects all arguments to be strings or one and only one argument to " - "be a boolean false (#f)" --msgstr "" --"\"%s\"의 모든 인자가 문자열이거나, 아니면 인자가 한 개이고 불리언 거짓(#f) 값" --"이어야 합니다" -+msgstr "\"%s\"의 모든 인자가 문자열이거나, 아니면 인자가 한 개이고 불리언 거짓(#f) 값이어야 합니다" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1395 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1403 - #, c-format - msgid "\"%s\" expects the first argument to be an ISO 8601 date/time string" - msgstr "\"%s\"의 첫번째 인자가 ISO 8601 날짜/시각 문자열이어야 합니다" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1456 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1464 - #, c-format - msgid "\"%s\" expects the second argument to be an integer" - msgstr "\"%s\"의 두번째 인자가 정수 값이어야 합니다" -@@ -2080,36 +2071,36 @@ - msgid_plural "Filtering new messages in '%s'" - msgstr[0] "'%s'에 있는 새 메시지를 필터링하는 중입니다" - --#: ../camel/camel-folder.c:1011 -+#: ../camel/camel-folder.c:1017 - #: ../camel/providers/local/camel-maildir-folder.c:330 - msgid "Moving messages" - msgstr "메시지 옮기는 중입니다" - --#: ../camel/camel-folder.c:1014 -+#: ../camel/camel-folder.c:1020 - msgid "Copying messages" - msgstr "메시지 복사하는 중입니다" - --#: ../camel/camel-folder.c:1056 -+#: ../camel/camel-folder.c:1062 - #, c-format - msgid "Quota information not supported for folder '%s'" - msgstr "'%s' 폴더에 대해 용량 제한 정보를 지원하지 않습니다" - --#: ../camel/camel-folder.c:2862 -+#: ../camel/camel-folder.c:2868 - #, c-format - msgid "Expunging folder '%s'" - msgstr "'%s' 폴더를 삭제하는 중" - --#: ../camel/camel-folder.c:2990 -+#: ../camel/camel-folder.c:2996 - #, c-format - msgid "Retrieving message '%s' in %s" - msgstr "%2$s 안에 '%1$s' 메시지를 가져오는 중입니다" - --#: ../camel/camel-folder.c:3181 -+#: ../camel/camel-folder.c:3187 - #, c-format - msgid "Retrieving quota information for '%s'" - msgstr "'%s'에 대한 용량 제한 정보를 가져오는 중입니다" - --#: ../camel/camel-folder.c:3478 -+#: ../camel/camel-folder.c:3484 - #, c-format - msgid "Refreshing folder '%s'" - msgstr "'%s' 폴더를 새로 고치는 중" -@@ -2146,148 +2137,136 @@ - - #: ../camel/camel-folder-search.c:1943 ../camel/camel-folder-search.c:2109 - #, c-format --msgid "" --"Cannot parse search expression: %s:\n" -+msgid "Cannot parse search expression: %s:\n" - "%s" --msgstr "" --"검색 표현식을 해석할 수 없음: %s:\n" -+msgstr "검색 표현식을 해석할 수 없음: %s:\n" - "%s" - - #: ../camel/camel-folder-search.c:1955 ../camel/camel-folder-search.c:2121 - #, c-format --msgid "" --"Error executing search expression: %s:\n" -+msgid "Error executing search expression: %s:\n" - "%s" --msgstr "" --"검색을 수행하는 중 오류: %s:\n" -+msgstr "검색을 수행하는 중 오류: %s:\n" - "%s" - --#: ../camel/camel-gpg-context.c:721 ../camel/camel-gpg-context.c:726 --#: ../camel/camel-gpg-context.c:1383 -+#: ../camel/camel-gpg-context.c:725 ../camel/camel-gpg-context.c:730 -+#: ../camel/camel-gpg-context.c:1387 - #, c-format - msgid "Failed to execute gpg: %s" - msgstr "gpg 실행에 실패했습니다: %s" - --#: ../camel/camel-gpg-context.c:726 --#: ../camel/providers/smtp/camel-smtp-transport.c:924 -+#: ../camel/camel-gpg-context.c:730 -+#: ../camel/providers/smtp/camel-smtp-transport.c:963 - msgid "Unknown" - msgstr "알 수 없음" - --#: ../camel/camel-gpg-context.c:791 -+#: ../camel/camel-gpg-context.c:795 - #, c-format --msgid "" --"Unexpected GnuPG status message encountered:\n" -+msgid "Unexpected GnuPG status message encountered:\n" - "\n" - "%s" --msgstr "" --"예기치 않은 GnuPG 상태 메시지가 나왔습니다:\n" -+msgstr "예기치 않은 GnuPG 상태 메시지가 나왔습니다:\n" - "\n" - "%s" - --#: ../camel/camel-gpg-context.c:827 -+#: ../camel/camel-gpg-context.c:831 - #, c-format - msgid "Failed to parse gpg userid hint." - msgstr "gpg userid 힌트를 파싱하는데 실패했습니다." - --#: ../camel/camel-gpg-context.c:852 ../camel/camel-gpg-context.c:867 -+#: ../camel/camel-gpg-context.c:856 ../camel/camel-gpg-context.c:871 - #, c-format - msgid "Failed to parse gpg passphrase request." - msgstr "gpg 암호 요청을 파싱하는데 실패했습니다." - --#: ../camel/camel-gpg-context.c:888 -+#: ../camel/camel-gpg-context.c:892 - #, c-format --msgid "" --"You need a PIN to unlock the key for your\n" -+msgid "You need a PIN to unlock the key for your\n" - "SmartCard: \"%s\"" --msgstr "" --"스마트카드에서 키를 열려면 PIN이 필요합니다:\n" -+msgstr "스마트카드에서 키를 열려면 PIN이 필요합니다:\n" - "\"%s\"" - --#: ../camel/camel-gpg-context.c:892 -+#: ../camel/camel-gpg-context.c:896 - #, c-format --msgid "" --"You need a passphrase to unlock the key for\n" -+msgid "You need a passphrase to unlock the key for\n" - "user: \"%s\"" --msgstr "" --"다음 사용자에 대한 키를 열려면 암호가 필요합니다:\n" -+msgstr "다음 사용자에 대한 키를 열려면 암호가 필요합니다:\n" - "\"%s\"" - --#: ../camel/camel-gpg-context.c:898 -+#: ../camel/camel-gpg-context.c:902 - #, c-format - msgid "Unexpected request from GnuPG for '%s'" - msgstr "'%s'에 대해 GnuPG로부터 예상치 못한 요청" - --#: ../camel/camel-gpg-context.c:910 -+#: ../camel/camel-gpg-context.c:914 - msgid "" - "Note the encrypted content doesn't contain information about a recipient, " - "thus there will be a password prompt for each of stored private key." --msgstr "" --"암호화된 내용 안에는 수신자에 대한 정보가 들어 있지 않습니다. 그러므로 저장" --"된 개인 키 하나하나에 대해 암호를 묻습니다." -+msgstr "암호화된 내용 안에는 수신자에 대한 정보가 들어 있지 않습니다. 그러므로 저장된 개인 키 하나하나에 대해 암호를 묻습니다." - --#: ../camel/camel-gpg-context.c:941 ../camel/camel-net-utils.c:524 -+#: ../camel/camel-gpg-context.c:945 ../camel/camel-net-utils.c:524 - #: ../camel/providers/nntp/camel-nntp-summary.c:401 - #: ../libedataserver/e-client.c:158 - #, c-format - msgid "Cancelled" - msgstr "취소함" - --#: ../camel/camel-gpg-context.c:962 -+#: ../camel/camel-gpg-context.c:966 - #, c-format - msgid "Failed to unlock secret key: 3 bad passphrases given." - msgstr "비밀 키를 여는데 실패했습니다: 암호가 3번 틀렸습니다." - --#: ../camel/camel-gpg-context.c:975 -+#: ../camel/camel-gpg-context.c:979 - #, c-format - msgid "Unexpected response from GnuPG: %s" - msgstr "GnuPG로부터 예상치못한 답변: %s" - --#: ../camel/camel-gpg-context.c:1106 -+#: ../camel/camel-gpg-context.c:1110 - #, c-format - msgid "Failed to encrypt: No valid recipients specified." - msgstr "암호화하는데 실패했습니다: 받는 사람이 올바르게 지정되지 않았습니다." - --#: ../camel/camel-gpg-context.c:1658 ../camel/camel-smime-context.c:844 -+#: ../camel/camel-gpg-context.c:1662 ../camel/camel-smime-context.c:844 - msgid "Could not generate signing data: " - msgstr "서명 데이터를 만들 수 없습니다: " - --#: ../camel/camel-gpg-context.c:1708 ../camel/camel-gpg-context.c:1920 --#: ../camel/camel-gpg-context.c:2030 ../camel/camel-gpg-context.c:2179 -+#: ../camel/camel-gpg-context.c:1712 ../camel/camel-gpg-context.c:1924 -+#: ../camel/camel-gpg-context.c:2034 ../camel/camel-gpg-context.c:2183 - msgid "Failed to execute gpg." - msgstr "GPG 실행에 실패했습니다." - --#: ../camel/camel-gpg-context.c:1791 ../camel/camel-gpg-context.c:1799 --#: ../camel/camel-gpg-context.c:1807 ../camel/camel-gpg-context.c:1827 -+#: ../camel/camel-gpg-context.c:1795 ../camel/camel-gpg-context.c:1803 -+#: ../camel/camel-gpg-context.c:1811 ../camel/camel-gpg-context.c:1831 - #: ../camel/camel-smime-context.c:973 ../camel/camel-smime-context.c:987 - #: ../camel/camel-smime-context.c:996 - #, c-format - msgid "Cannot verify message signature: Incorrect message format" - msgstr "메시지 서명을 확인할 수 없습니다: 메시지 형식이 틀렸습니다" - --#: ../camel/camel-gpg-context.c:1873 -+#: ../camel/camel-gpg-context.c:1877 - msgid "Cannot verify message signature: " - msgstr "메시지 서명을 확인할 수 없습니다: " - --#: ../camel/camel-gpg-context.c:1996 -+#: ../camel/camel-gpg-context.c:2000 - msgid "Could not generate encrypting data: " - msgstr "암호화 데이터를 만들 수 없습니다: " - --#: ../camel/camel-gpg-context.c:2049 -+#: ../camel/camel-gpg-context.c:2053 - msgid "This is a digitally encrypted message part" - msgstr "디지탈 암호화된 메시지 부분입니다" - --#: ../camel/camel-gpg-context.c:2105 ../camel/camel-gpg-context.c:2114 --#: ../camel/camel-gpg-context.c:2137 -+#: ../camel/camel-gpg-context.c:2109 ../camel/camel-gpg-context.c:2118 -+#: ../camel/camel-gpg-context.c:2141 - #, c-format - msgid "Cannot decrypt message: Incorrect message format" - msgstr "메시지의 암호화를 풀 수 없습니다: 메시지 형식이 틀렸습니다" - --#: ../camel/camel-gpg-context.c:2125 -+#: ../camel/camel-gpg-context.c:2129 - #, c-format - msgid "Failed to decrypt MIME part: protocol error" - msgstr "MIME 부분을 암호화 해독하는데 실패했습니다: 프로토콜 오류" - --#: ../camel/camel-gpg-context.c:2220 ../camel/camel-smime-context.c:1289 -+#: ../camel/camel-gpg-context.c:2224 ../camel/camel-smime-context.c:1289 - msgid "Encrypted content" - msgstr "암호화된 내용" - -@@ -2303,8 +2282,7 @@ - #: ../camel/camel-lock.c:153 - #, c-format - msgid "Timed out trying to get lock file on %s. Try again later." --msgstr "" --"%s의 잠금 파일을 가져오는데 제한 시간이 넘었습니다. 나중에 다시 시도합니다." -+msgstr "%s의 잠금 파일을 가져오는데 제한 시간이 넘었습니다. 나중에 다시 시도합니다." - - #: ../camel/camel-lock.c:215 - #, c-format -@@ -2329,8 +2307,7 @@ - #: ../camel/camel-lock-client.c:218 ../camel/camel-lock-client.c:246 - #, c-format - msgid "Could not lock '%s': protocol error with lock-helper" --msgstr "" --"'%s'을(를) 잠글 수 없습니다: lock-helper에 프로토콜 오류가 발생했습니다" -+msgstr "'%s'을(를) 잠글 수 없습니다: lock-helper에 프로토콜 오류가 발생했습니다" - - #: ../camel/camel-lock-client.c:234 - #, c-format -@@ -2418,8 +2395,7 @@ - #: ../camel/camel-net-utils.c:737 - #, c-format - msgid "Host lookup '%s' failed. Check your host name for spelling errors." --msgstr "" --"'%s' 호스트 찾기가 실패했습니다. 호스트 이름이 틀리지 않았는지 확인하십시오." -+msgstr "'%s' 호스트 찾기가 실패했습니다. 호스트 이름이 틀리지 않았는지 확인하십시오." - - #: ../camel/camel-net-utils.c:741 - #, c-format -@@ -2450,8 +2426,7 @@ - #: ../camel/camel-provider.c:261 - #, c-format - msgid "Could not load %s: Module loading not supported on this system." --msgstr "" --"%s을(를) 읽어들일 수 없습니다: 이 시스템에는 모듈 로드를 지원하지 않습니다." -+msgstr "%s을(를) 읽어들일 수 없습니다: 이 시스템에는 모듈 로드를 지원하지 않습니다." - - #: ../camel/camel-provider.c:270 - #, c-format -@@ -2484,30 +2459,24 @@ - - #: ../camel/camel-sasl-anonymous.c:79 - #, c-format --msgid "" --"Invalid email address trace information:\n" -+msgid "Invalid email address trace information:\n" - "%s" --msgstr "" --"전자메일 주소 추적 정보가 잘못되었습니다:\n" -+msgstr "전자메일 주소 추적 정보가 잘못되었습니다:\n" - "%s" - - # opaque? - #: ../camel/camel-sasl-anonymous.c:93 - #, c-format --msgid "" --"Invalid opaque trace information:\n" -+msgid "Invalid opaque trace information:\n" - "%s" --msgstr "" --"불투명 추적 정보가 잘못되었습니다:\n" -+msgstr "불투명 추적 정보가 잘못되었습니다:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:107 - #, c-format --msgid "" --"Invalid trace information:\n" -+msgid "Invalid trace information:\n" - "%s" --msgstr "" --"추적 정보가 잘못되었습니다:\n" -+msgstr "추적 정보가 잘못되었습니다:\n" - "%s" - - #: ../camel/camel-sasl-cram-md5.c:44 -@@ -2518,9 +2487,7 @@ - msgid "" - "This option will connect to the server using a secure CRAM-MD5 password, if " - "the server supports it." --msgstr "" --"이 옵션을 켜면 서버에서 지원하는 경우 보안용 CRAM-MD5 암호를 사용해 서버에 연" --"결합니다." -+msgstr "이 옵션을 켜면 서버에서 지원하는 경우 보안용 CRAM-MD5 암호를 사용해 서버에 연결합니다." - - #: ../camel/camel-sasl-digest-md5.c:57 - msgid "DIGEST-MD5" -@@ -2530,9 +2497,7 @@ - msgid "" - "This option will connect to the server using a secure DIGEST-MD5 password, " - "if the server supports it." --msgstr "" --"이 옵션을 켜면 서버에서 지원하는 경우 보안용 DIGEST-MD5 암호를 사용해 서버에 " --"연결합니다." -+msgstr "이 옵션을 켜면 서버에서 지원하는 경우 보안용 DIGEST-MD5 암호를 사용해 서버에 연결합니다." - - #: ../camel/camel-sasl-digest-md5.c:855 - #, c-format -@@ -2569,7 +2534,8 @@ - msgstr "GSSAPI" - - #: ../camel/camel-sasl-gssapi.c:97 --msgid "This option will connect to the server using Kerberos 5 authentication." -+msgid "" -+"This option will connect to the server using Kerberos 5 authentication." - msgstr "이 옵션을 켜면 Kerberos 5 인증을 사용해 서버에 연결합니다." - - #: ../camel/camel-sasl-gssapi.c:149 -@@ -2581,9 +2547,7 @@ - msgid "" - "The specified mechanism is not supported by the provided credential, or is " - "unrecognized by the implementation." --msgstr "" --"지정한 방식은 제공한 증명서가 지원하지 않습니다. 혹은 현재 구현해 놓은 것에" --"서 인식할 수 없습니다." -+msgstr "지정한 방식은 제공한 증명서가 지원하지 않습니다. 혹은 현재 구현해 놓은 것에서 인식할 수 없습니다." - - #: ../camel/camel-sasl-gssapi.c:187 - msgid "The provided target_name parameter was ill-formed." -@@ -2593,17 +2557,13 @@ - msgid "" - "The provided target_name parameter contained an invalid or unsupported type " - "of name." --msgstr "" --"제공된 target_name 매개변수에 잘못되었거나 지원하지 않은 종류의 이름이 들어 " --"있습니다." -+msgstr "제공된 target_name 매개변수에 잘못되었거나 지원하지 않은 종류의 이름이 들어 있습니다." - - #: ../camel/camel-sasl-gssapi.c:194 - msgid "" - "The input_token contains different channel bindings to those specified via " - "the input_chan_bindings parameter." --msgstr "" --"input_chan_bindings 인수를 통해 지정된 것과 다른 채널 바인딩이 input_token에 " --"들어 있습니다." -+msgstr "input_chan_bindings 인수를 통해 지정된 것과 다른 채널 바인딩이 input_token에 들어 있습니다." - - #: ../camel/camel-sasl-gssapi.c:199 - msgid "" -@@ -2615,9 +2575,7 @@ - msgid "" - "The supplied credentials were not valid for context initiation, or the " - "credential handle did not reference any credentials." --msgstr "" --"제공된 증명서가 컨텍스트 초기화에 올바르지 않거나, 증명서 핸들이 어떤 증명서" --"도 참조하지 않습니다." -+msgstr "제공된 증명서가 컨텍스트 초기화에 올바르지 않거나, 증명서 핸들이 어떤 증명서도 참조하지 않습니다." - - #: ../camel/camel-sasl-gssapi.c:208 - msgid "The supplied context handle did not refer to a valid context." -@@ -2637,7 +2595,7 @@ - - #: ../camel/camel-sasl-gssapi.c:223 ../camel/camel-sasl-gssapi.c:405 - #: ../camel/camel-sasl-gssapi.c:454 ../camel/camel-sasl-gssapi.c:471 --#: ../camel/providers/smtp/camel-smtp-transport.c:622 -+#: ../camel/providers/smtp/camel-smtp-transport.c:659 - #, c-format - msgid "Bad authentication response from server." - msgstr "서버에서 보낸 인증 응답이 틀렸습니다." -@@ -2668,8 +2626,7 @@ - msgid "" - "This option will connect to a Windows-based server using NTLM / Secure " - "Password Authentication." --msgstr "" --"이 옵션을 켜면 NTLM / 보안 암호 인증을 Windows 기반의 서버에 연결합니다." -+msgstr "이 옵션을 켜면 NTLM / 보안 암호 인증을 Windows 기반의 서버에 연결합니다." - - #: ../camel/camel-sasl-plain.c:42 - msgid "PLAIN" -@@ -2708,10 +2665,10 @@ - msgstr "'%s' 프로토콜에 대해 잘못된 GType을 등록했습니다" - - #: ../camel/camel-session.c:502 --#: ../camel/providers/imapx/camel-imapx-server.c:4734 -+#: ../camel/providers/imapx/camel-imapx-server.c:4821 - #: ../camel/providers/pop3/camel-pop3-store.c:311 --#: ../camel/providers/pop3/camel-pop3-store.c:757 --#: ../camel/providers/smtp/camel-smtp-transport.c:515 -+#: ../camel/providers/pop3/camel-pop3-store.c:766 -+#: ../camel/providers/smtp/camel-smtp-transport.c:545 - #, c-format - msgid "No support for %s authentication" - msgstr "%s 인증을 지원하지 않습니다" -@@ -2915,49 +2872,54 @@ - msgid "S/MIME Decrypt: No encrypted content found" - msgstr "S/MIME 암호화 해제: 암호화한 내용이 없습니다" - --#: ../camel/camel-store.c:1232 -+#: ../camel/camel-store.c:1238 - #, c-format - msgid "Opening folder '%s'" - msgstr "폴더 '%s' 여는 중" - --#: ../camel/camel-store.c:1523 -+#: ../camel/camel-store.c:1529 - #, c-format - msgid "Scanning folders in '%s'" - msgstr "'%s'의 폴더 검사하는 중" - --#: ../camel/camel-store.c:1551 ../camel/camel-store.c:1596 -+#: ../camel/camel-store.c:1557 ../camel/camel-store.c:1602 - #: ../camel/camel-vtrash-folder.c:46 - msgid "Trash" - msgstr "지운 메시지" - --#: ../camel/camel-store.c:1565 ../camel/camel-store.c:1613 -+#: ../camel/camel-store.c:1571 ../camel/camel-store.c:1619 - #: ../camel/camel-vtrash-folder.c:48 - msgid "Junk" - msgstr "정크메일" - --#: ../camel/camel-store.c:2214 -+#: ../camel/camel-store.c:2220 - #, c-format - msgid "Cannot create folder: %s: folder exists" - msgstr "폴더를 만들 수 없습니다: %s: 폴더가 이미 있습니다" - --#: ../camel/camel-store.c:2221 -+#: ../camel/camel-store.c:2227 - #, c-format - msgid "Creating folder '%s'" - msgstr "'%s' 폴더를 만드는 중" - --#: ../camel/camel-store.c:2398 ../camel/camel-vee-store.c:410 --#: ../camel/providers/local/camel-maildir-store.c:321 -+#: ../camel/camel-store.c:2404 ../camel/camel-vee-store.c:410 -+#: ../camel/providers/local/camel-maildir-store.c:346 - #, c-format - msgid "Cannot delete folder: %s: Invalid operation" - msgstr "폴더를 삭제할 수 없습니다: %s: 잘못된 동작" - --#: ../camel/camel-store.c:2588 ../camel/camel-vee-store.c:461 --#: ../camel/providers/local/camel-maildir-store.c:872 -+#: ../camel/camel-store.c:2594 ../camel/camel-vee-store.c:461 -+#: ../camel/providers/local/camel-maildir-store.c:914 - #, c-format - msgid "Cannot rename folder: %s: Invalid operation" - msgstr "폴더 이름을 바꿀 수 없습니다: %s: 잘못된 동작" - --#: ../camel/camel-stream.c:285 ../camel/camel-stream.c:336 -+#: ../camel/camel-stream.c:170 -+#, fuzzy -+msgid "Cannot write with no base stream" -+msgstr "사용자 이름 없이 인증할 수 없습니다" -+ -+#: ../camel/camel-stream.c:290 ../camel/camel-stream.c:341 - #, c-format - msgid "Stream type '%s' is not seekable" - msgstr "'%s' 스트림 종류에서는 입출력 위치를 이동할 수 없습니다." -@@ -3183,228 +3145,227 @@ - msgid "For reading and storing mail on IMAP servers." - msgstr "IMAP서버에 메일을 읽고 저장." - --#: ../camel/providers/imapx/camel-imapx-server.c:1009 - #: ../camel/providers/imapx/camel-imapx-server.c:1016 -+#: ../camel/providers/imapx/camel-imapx-server.c:1023 - #, c-format - msgid "Not authenticated" - msgstr "인증하지 않았습니다" - --#: ../camel/providers/imapx/camel-imapx-server.c:1713 -+#: ../camel/providers/imapx/camel-imapx-server.c:1751 - msgid "Server disconnected" - msgstr "서버 연결이 끊겼습니다" - --#: ../camel/providers/imapx/camel-imapx-server.c:2205 -+#: ../camel/providers/imapx/camel-imapx-server.c:2252 - msgid "Error writing to cache stream" - msgstr "캐시 스트림에 쓰는 중 오류 발생" - - # IMAP 동작 --#: ../camel/providers/imapx/camel-imapx-server.c:3565 -+#: ../camel/providers/imapx/camel-imapx-server.c:3640 - msgid "Error performing IDLE" - msgstr "IDLE 수행하는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:4573 -+#: ../camel/providers/imapx/camel-imapx-server.c:4660 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: %s" - msgstr "보안 모드로 IMAP 서버 %s에 연결하는데 실패했습니다: %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:4574 --#: ../camel/providers/smtp/camel-smtp-transport.c:215 -+#: ../camel/providers/imapx/camel-imapx-server.c:4661 -+#: ../camel/providers/smtp/camel-smtp-transport.c:216 - msgid "STARTTLS not supported" - msgstr "STARTLS를 지원하지 않습니다" - --#: ../camel/providers/imapx/camel-imapx-server.c:4634 -+#: ../camel/providers/imapx/camel-imapx-server.c:4721 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: " - msgstr "보안 모드로 IMAP 서버 %s에 연결하는데 실패했습니다: " - --#: ../camel/providers/imapx/camel-imapx-server.c:4723 -+#: ../camel/providers/imapx/camel-imapx-server.c:4810 - #, c-format - msgid "IMAP server %s does not support %s authentication" - msgstr "%s IMAP 서버는 %s 인증 방법을 지원하지 않습니다" - --#: ../camel/providers/imapx/camel-imapx-server.c:4753 -+#: ../camel/providers/imapx/camel-imapx-server.c:4840 - #: ../camel/providers/nntp/camel-nntp-store.c:394 - #: ../camel/providers/nntp/camel-nntp-store.c:531 - msgid "Cannot authenticate without a username" - msgstr "사용자 이름 없이 인증할 수 없습니다" - --#: ../camel/providers/imapx/camel-imapx-server.c:4762 -+#: ../camel/providers/imapx/camel-imapx-server.c:4849 - #: ../camel/providers/nntp/camel-nntp-store.c:540 - #: ../camel/providers/pop3/camel-pop3-store.c:678 --#: ../camel/providers/pop3/camel-pop3-store.c:699 -+#: ../camel/providers/pop3/camel-pop3-store.c:708 - msgid "Authentication password not available" - msgstr "인증 암호가 없습니다" - --#: ../camel/providers/imapx/camel-imapx-server.c:4998 --#: ../camel/providers/imapx/camel-imapx-server.c:5057 -+#: ../camel/providers/imapx/camel-imapx-server.c:5085 -+#: ../camel/providers/imapx/camel-imapx-server.c:5144 - msgid "Error fetching message" - msgstr "메시지 가져오는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:5050 -+#: ../camel/providers/imapx/camel-imapx-server.c:5137 - msgid "Failed to close the tmp stream" - msgstr "임시 스트림을 닫는데 실패했습니다" - --#: ../camel/providers/imapx/camel-imapx-server.c:5086 -+#: ../camel/providers/imapx/camel-imapx-server.c:5173 - msgid "Failed to copy the tmp file" - msgstr "임시 파일을 복사하는데 실패했습니다" - --#: ../camel/providers/imapx/camel-imapx-server.c:5227 -+#: ../camel/providers/imapx/camel-imapx-server.c:5345 - msgid "Error moving messages" - msgstr "메시지 옮기는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:5231 -+#: ../camel/providers/imapx/camel-imapx-server.c:5349 - msgid "Error copying messages" - msgstr "메시지 복사하는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:5453 -+#: ../camel/providers/imapx/camel-imapx-server.c:5579 - msgid "Error appending message" - msgstr "메시지 덧붙이는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:5689 -+#: ../camel/providers/imapx/camel-imapx-server.c:5815 - msgid "Error fetching message headers" - msgstr "메시지 헤더를 가져오는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:5856 -+#: ../camel/providers/imapx/camel-imapx-server.c:5982 - msgid "Error retrieving message" - msgstr "메시지를 가져오는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:5990 --#: ../camel/providers/imapx/camel-imapx-server.c:6219 -+#: ../camel/providers/imapx/camel-imapx-server.c:6116 -+#: ../camel/providers/imapx/camel-imapx-server.c:6345 - #, c-format - msgid "Fetching summary information for new messages in '%s'" - msgstr "'%s'에서 새 메시지 요약 정보를 가져오는 중" - --#: ../camel/providers/imapx/camel-imapx-server.c:6042 -+#: ../camel/providers/imapx/camel-imapx-server.c:6168 - #, c-format - msgid "Scanning for changed messages in '%s'" - msgstr "'%s'에서 바뀐 메시지 검색 중" - --#: ../camel/providers/imapx/camel-imapx-server.c:6094 -+#: ../camel/providers/imapx/camel-imapx-server.c:6220 - msgid "Error fetching new messages" - msgstr "새 메시지를 가져오는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:6367 -+#: ../camel/providers/imapx/camel-imapx-server.c:6493 - msgid "Error refreshing folder" - msgstr "폴더를 새로 고치는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:6517 -+#: ../camel/providers/imapx/camel-imapx-server.c:6643 - msgid "Error expunging message" - msgstr "메시지를 완전히 삭제하는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:6632 --#: ../camel/providers/imapx/camel-imapx-server.c:6657 -+#: ../camel/providers/imapx/camel-imapx-server.c:6758 -+#: ../camel/providers/imapx/camel-imapx-server.c:6783 - msgid "Error fetching folders" - msgstr "폴더를 가져오는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:6737 -+#: ../camel/providers/imapx/camel-imapx-server.c:6863 - msgid "Error creating folder" - msgstr "폴더를 만드는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:6789 -+#: ../camel/providers/imapx/camel-imapx-server.c:6915 - msgid "Error deleting folder" - msgstr "폴더를 삭제하는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:6865 -+#: ../camel/providers/imapx/camel-imapx-server.c:6991 - msgid "Error renaming folder" - msgstr "폴더의 이름을 바꾸는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:6939 -+#: ../camel/providers/imapx/camel-imapx-server.c:7065 - msgid "Error subscribing to folder" - msgstr "폴더에 구독하는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:7005 -+#: ../camel/providers/imapx/camel-imapx-server.c:7131 - msgid "Error unsubscribing from folder" - msgstr "폴더에 구독 해제하는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:7067 -+#: ../camel/providers/imapx/camel-imapx-server.c:7193 - msgid "Error retrieving quota information" - msgstr "용량 제한 정보를 가져오는 중 오류" - --#: ../camel/providers/imapx/camel-imapx-server.c:7119 -+#: ../camel/providers/imapx/camel-imapx-server.c:7245 - msgid "Search failed" - msgstr "검색이 실패했습니다" - - # IMAP 동작 --#: ../camel/providers/imapx/camel-imapx-server.c:7181 -+#: ../camel/providers/imapx/camel-imapx-server.c:7307 - msgid "Error performing NOOP" - msgstr "NOOP 수행하는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:7288 -+#: ../camel/providers/imapx/camel-imapx-server.c:7414 - msgid "Error syncing changes" - msgstr "바뀐 내용을 동기화하는데 오류 발생" - --#: ../camel/providers/imapx/camel-imapx-server.c:8275 -+#: ../camel/providers/imapx/camel-imapx-server.c:8446 - #, c-format - msgid "Cannot get message with message ID %s: %s" - msgstr "메시지 ID가 %s인 메시지를 얻을 수 없습니다: %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:8276 -+#: ../camel/providers/imapx/camel-imapx-server.c:8447 - msgid "No such message available." - msgstr "그런 메시지가 없습니다." - --#: ../camel/providers/imapx/camel-imapx-server.c:8483 --#: ../camel/providers/imapx/camel-imapx-server.c:8504 -+#: ../camel/providers/imapx/camel-imapx-server.c:8671 -+#: ../camel/providers/imapx/camel-imapx-server.c:8692 - msgid "Cannot create spool file: " - msgstr "메일 모음 파일을 만들 수 없습니다: " - --#: ../camel/providers/imapx/camel-imapx-server.c:9256 -+#: ../camel/providers/imapx/camel-imapx-server.c:9502 - msgid "IMAP server does not support quotas" - msgstr "IMAP 서버가 용량 제한을 지원하지 않습니다" - - #. create a dummy "." parent inbox, use to scan, then put back at the top level - #: ../camel/providers/imapx/camel-imapx-store.c:223 - #: ../camel/providers/local/camel-maildir-folder.c:482 --#: ../camel/providers/local/camel-maildir-store.c:322 --#: ../camel/providers/local/camel-maildir-store.c:784 --#: ../camel/providers/local/camel-maildir-store.c:790 --#: ../camel/providers/local/camel-maildir-store.c:873 -+#: ../camel/providers/local/camel-maildir-store.c:347 -+#: ../camel/providers/local/camel-maildir-store.c:826 -+#: ../camel/providers/local/camel-maildir-store.c:832 -+#: ../camel/providers/local/camel-maildir-store.c:915 - #: ../camel/providers/local/camel-spool-store.c:393 - msgid "Inbox" - msgstr "받은 편지함" - --#: ../camel/providers/imapx/camel-imapx-store.c:758 -+#: ../camel/providers/imapx/camel-imapx-store.c:757 - #, c-format - msgid "IMAP server %s" - msgstr "IMAP 서버 %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:761 -+#: ../camel/providers/imapx/camel-imapx-store.c:760 - #, c-format - msgid "IMAP service for %s on %s" - msgstr "IMAP 서비스(사용자: %s, 위치: %s)" - --#: ../camel/providers/imapx/camel-imapx-store.c:836 -+#: ../camel/providers/imapx/camel-imapx-store.c:835 - #: ../camel/providers/nntp/camel-nntp-provider.c:93 - #: ../camel/providers/pop3/camel-pop3-provider.c:81 - msgid "Password" - msgstr "암호" - --#: ../camel/providers/imapx/camel-imapx-store.c:838 --msgid "This option will connect to the IMAP server using a plaintext password." -+#: ../camel/providers/imapx/camel-imapx-store.c:837 -+msgid "" -+"This option will connect to the IMAP server using a plaintext password." - msgstr "이 옵션을 켜면 일반 텍스트 암호를 이용해 IMAP 서버에 연결합니다." - --#: ../camel/providers/imapx/camel-imapx-store.c:913 -+#: ../camel/providers/imapx/camel-imapx-store.c:916 - #, c-format - msgid "No such folder %s" - msgstr "%s 폴더가 없습니다" - --#: ../camel/providers/imapx/camel-imapx-store.c:1324 -+#: ../camel/providers/imapx/camel-imapx-store.c:1344 - #, c-format - msgid "No IMAP namespace for folder path '%s'" - msgstr "폴더 경로 '%s'에 대해 IMAP 네임스페이스가 없습니다" - --#: ../camel/providers/imapx/camel-imapx-store.c:1472 -+#: ../camel/providers/imapx/camel-imapx-store.c:1609 - #, c-format - msgid "Retrieving folder list for %s" - msgstr "'%s'에 대한 폴더 목록을 가져오는 중" - --#: ../camel/providers/imapx/camel-imapx-store.c:1924 -+#: ../camel/providers/imapx/camel-imapx-store.c:2061 - #, c-format --msgid "" --"The folder name \"%s\" is invalid because it contains the character \"%c\"" --msgstr "" --"폴더 이름 \"%s\"이(가) 올바르지 않습니다. \"%c\" 문자가 들어 있어 있습니다" -+msgid "The folder name \"%s\" is invalid because it contains the character \"%c\"" -+msgstr "폴더 이름 \"%s\"이(가) 올바르지 않습니다. \"%c\" 문자가 들어 있어 있습니다" - --#: ../camel/providers/imapx/camel-imapx-store.c:2689 -+#: ../camel/providers/imapx/camel-imapx-store.c:2833 - #: ../camel/providers/nntp/camel-nntp-store.c:1250 - #: ../camel/providers/pop3/camel-pop3-folder.c:450 - #: ../camel/providers/pop3/camel-pop3-folder.c:593 -@@ -3414,7 +3375,7 @@ - #: ../camel/providers/pop3/camel-pop3-store.c:528 - #: ../camel/providers/pop3/camel-pop3-store.c:576 - #: ../camel/providers/pop3/camel-pop3-store.c:668 --#: ../camel/providers/pop3/camel-pop3-store.c:1072 -+#: ../camel/providers/pop3/camel-pop3-store.c:1081 - #, c-format - msgid "You must be working online to complete this operation" - msgstr "이 작업을 마치려면 온라인으로 실행해야 합니다" -@@ -3441,11 +3402,9 @@ - - #: ../camel/providers/local/camel-local-folder.c:730 - #, c-format --msgid "" --"Cannot get message %s from folder %s\n" -+msgid "Cannot get message %s from folder %s\n" - "%s" --msgstr "" --"메시지를 얻을 수 없음: %2$s 폴더에서 %1$s\n" -+msgstr "메시지를 얻을 수 없음: %2$s 폴더에서 %1$s\n" - "%3$s" - - #: ../camel/providers/local/camel-local-provider.c:41 -@@ -3468,9 +3427,7 @@ - msgid "" - "For retrieving (moving) local mail from standard mbox-formatted spools into " - "folders managed by Evolution." --msgstr "" --"표준 mbox 형식의 메일 모음에 들어 있는 로컬 메일을 에볼루션이 관리하는 폴더" --"로 가져올 때(옮길 때) 쓰입니다." -+msgstr "표준 mbox 형식의 메일 모음에 들어 있는 로컬 메일을 에볼루션이 관리하는 폴더로 가져올 때(옮길 때) 쓰입니다." - - #: ../camel/providers/local/camel-local-provider.c:81 - #: ../camel/providers/local/camel-local-provider.c:101 -@@ -3499,8 +3456,8 @@ - "For reading and storing local mail in external standard mbox spool files.\n" - "May also be used to read a tree of Elm, Pine, or Mutt style folders." - msgstr "" --"외부 표준 mbox 메일 모음 파일에서 로컬 메일로 읽거나 저장할 때 사용합니다. 또" --"한 Elm, Pine 또는 Mutt방식의 폴더를 읽을 때도 쓰입니다." -+"외부 표준 mbox 메일 모음 파일에서 로컬 메일로 읽거나 저장할 때 사용합니다. 또한 Elm, Pine 또는 Mutt방식의 폴더를 읽을 " -+"때도 쓰입니다." - - #: ../camel/providers/local/camel-local-provider.c:123 - msgid "Standard Unix mbox spool directory" -@@ -3518,7 +3475,7 @@ - - #: ../camel/providers/local/camel-local-store.c:221 - #: ../camel/providers/local/camel-local-store.c:381 --#: ../camel/providers/local/camel-maildir-store.c:122 -+#: ../camel/providers/local/camel-maildir-store.c:123 - #: ../camel/providers/local/camel-mbox-store.c:572 - #: ../camel/providers/local/camel-spool-store.c:87 - #, c-format -@@ -3533,7 +3490,7 @@ - #: ../camel/providers/local/camel-local-store.c:242 - #: ../camel/providers/local/camel-local-store.c:252 - #: ../camel/providers/local/camel-local-store.c:394 --#: ../camel/providers/local/camel-maildir-store.c:156 -+#: ../camel/providers/local/camel-maildir-store.c:165 - #, c-format - msgid "Cannot get folder: %s: %s" - msgstr "폴더를 얻을 수 없습니다: %s: %s" -@@ -3555,7 +3512,7 @@ - msgid "Could not delete folder meta file '%s': %s" - msgstr "폴더 메타 파일 '%s'을(를) 삭제할 수 없습니다: %s" - --#: ../camel/providers/local/camel-local-store.c:594 -+#: ../camel/providers/local/camel-local-store.c:595 - #, c-format - msgid "Could not rename '%s': %s" - msgstr "'%s'의 이름을 바꿀 수 없습니다: %s" -@@ -3587,53 +3544,59 @@ - msgid "Cannot transfer message to destination folder: %s" - msgstr "메시지를 대상 폴더로 옮길 수 없습니다: %s" - --#: ../camel/providers/local/camel-maildir-store.c:130 --#: ../camel/providers/local/camel-maildir-store.c:149 --#: ../camel/providers/local/camel-maildir-store.c:881 -+#: ../camel/providers/local/camel-maildir-store.c:131 -+#: ../camel/providers/local/camel-maildir-store.c:931 -+#, fuzzy, c-format -+msgid "Cannot create folder containing '%s'" -+msgstr "'%s' 폴더를 만들 수 없습니다: %s" -+ -+#: ../camel/providers/local/camel-maildir-store.c:139 -+#: ../camel/providers/local/camel-maildir-store.c:158 -+#: ../camel/providers/local/camel-maildir-store.c:923 - #, c-format - msgid "Folder %s already exists" - msgstr "'%s' 폴더가 이미 있습니다" - --#: ../camel/providers/local/camel-maildir-store.c:241 --#: ../camel/providers/local/camel-maildir-store.c:272 -+#: ../camel/providers/local/camel-maildir-store.c:266 -+#: ../camel/providers/local/camel-maildir-store.c:297 - #: ../camel/providers/local/camel-mbox-store.c:401 - #: ../camel/providers/local/camel-mbox-store.c:422 - #, c-format - msgid "Cannot create folder '%s': %s" - msgstr "'%s' 폴더를 만들 수 없습니다: %s" - --#: ../camel/providers/local/camel-maildir-store.c:256 -+#: ../camel/providers/local/camel-maildir-store.c:281 - #: ../camel/providers/local/camel-mbox-store.c:367 - #: ../camel/providers/local/camel-mh-store.c:523 - #, c-format - msgid "Cannot get folder '%s': %s" - msgstr "'%s' 폴더를 얻을 수 없습니다: %s" - --#: ../camel/providers/local/camel-maildir-store.c:262 -+#: ../camel/providers/local/camel-maildir-store.c:287 - #: ../camel/providers/local/camel-mbox-store.c:377 - #: ../camel/providers/local/camel-mh-store.c:532 - #, c-format - msgid "Cannot get folder '%s': folder does not exist." - msgstr "'%s' 폴더를 얻을 수 없습니다: 폴더가 없습니다." - --#: ../camel/providers/local/camel-maildir-store.c:289 -+#: ../camel/providers/local/camel-maildir-store.c:314 - #, c-format - msgid "Cannot get folder '%s': not a maildir directory." - msgstr "'%s' 폴더를 얻을 수 없습니다: maildir 디렉터리가 아닙니다." - --#: ../camel/providers/local/camel-maildir-store.c:353 --#: ../camel/providers/local/camel-maildir-store.c:393 -+#: ../camel/providers/local/camel-maildir-store.c:378 -+#: ../camel/providers/local/camel-maildir-store.c:418 - #: ../camel/providers/local/camel-mh-store.c:676 - #, c-format - msgid "Could not delete folder '%s': %s" - msgstr "'%s' 폴더를 삭제할 수 없습니다: %s" - --#: ../camel/providers/local/camel-maildir-store.c:355 -+#: ../camel/providers/local/camel-maildir-store.c:380 - msgid "not a maildir directory" - msgstr "메일폴더 디렉터리가 아닙니다" - --#: ../camel/providers/local/camel-maildir-store.c:637 --#: ../camel/providers/local/camel-maildir-store.c:1095 -+#: ../camel/providers/local/camel-maildir-store.c:666 -+#: ../camel/providers/local/camel-maildir-store.c:1146 - #: ../camel/providers/local/camel-spool-store.c:212 - #: ../camel/providers/local/camel-spool-store.c:231 - #, c-format -@@ -3711,11 +3674,9 @@ - #: ../camel/providers/local/camel-mbox-store.c:663 - #: ../camel/providers/local/camel-mbox-store.c:692 - #, c-format --msgid "" --"Could not delete folder '%s':\n" -+msgid "Could not delete folder '%s':\n" - "%s" --msgstr "" --"'%s' 폴더를 삭제할 수 없습니다:\n" -+msgstr "'%s' 폴더를 삭제할 수 없습니다:\n" - "%s" - - #: ../camel/providers/local/camel-mbox-store.c:673 -@@ -3800,8 +3761,7 @@ - msgid "" - "MBOX file is corrupted, please fix it. (Expected a From line, but didn't get " - "it.)" --msgstr "" --"MBOX 파일이 망가졌습니다. 바로잡으십시오. (From 줄이 와야 하지만 없습니다.)" -+msgstr "MBOX 파일이 망가졌습니다. 바로잡으십시오. (From 줄이 와야 하지만 없습니다.)" - - #: ../camel/providers/local/camel-mbox-summary.c:908 - #: ../camel/providers/local/camel-mbox-summary.c:1184 -@@ -3877,11 +3837,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:494 - #, c-format --msgid "" --"Could not open folder '%s':\n" -+msgid "Could not open folder '%s':\n" - "%s" --msgstr "" --"'%s' 폴더를 열 수 없습니다:\n" -+msgstr "'%s' 폴더를 열 수 없습니다:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:500 -@@ -3891,11 +3849,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:508 - #, c-format --msgid "" --"Could not create folder '%s':\n" -+msgid "Could not create folder '%s':\n" - "%s" --msgstr "" --"'%s' 폴더를 만들 수 없습니다:\n" -+msgstr "'%s' 폴더를 만들 수 없습니다:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:521 -@@ -3937,8 +3893,7 @@ - msgid "" - "Could not synchronize spool folder %s: %s\n" - "Folder may be corrupt, copy saved in '%s'" --msgstr "" --"메일 모음 폴더 %s과(와) 동기화 할 수 없습니다: %s\n" -+msgstr "메일 모음 폴더 %s과(와) 동기화 할 수 없습니다: %s\n" - "폴더가 망가졌을 수 있습니다. '%s'에 사본을 저장합니다" - - #: ../camel/providers/nntp/camel-nntp-folder.c:222 -@@ -3987,8 +3942,7 @@ - #: ../camel/providers/nntp/camel-nntp-provider.c:46 - msgid "" - "_Show folders in short notation (e.g. c.o.linux rather than comp.os.linux)" --msgstr "" --"폴더 이름을 줄인 이름으로 표시(_S) (예를 들어 comp.os.linux를 c.o.linux로)" -+msgstr "폴더 이름을 줄인 이름으로 표시(_S) (예를 들어 comp.os.linux를 c.o.linux로)" - - #: ../camel/providers/nntp/camel-nntp-provider.c:49 - msgid "In the subscription _dialog, show relative folder names" -@@ -4039,12 +3993,10 @@ - - #: ../camel/providers/nntp/camel-nntp-store.c:1151 - #, c-format --msgid "" --"Error retrieving newsgroups:\n" -+msgid "Error retrieving newsgroups:\n" - "\n" - "%s" --msgstr "" --"뉴스그룹을 가져오는데 오류가 밝생했습니다:\n" -+msgstr "뉴스그룹을 가져오는데 오류가 밝생했습니다:\n" - "\n" - "%s" - -@@ -4069,19 +4021,16 @@ - "You cannot subscribe to this newsgroup:\n" - "\n" - "No such newsgroup. The selected item is a probably a parent folder." --msgstr "" --"이 뉴스그룹에 구독할 수 없습니다:\n" -+msgstr "이 뉴스그룹에 구독할 수 없습니다:\n" - "\n" - "그런 뉴스그룹이 없습니다. 선택한 항목이 상위 폴더일 수 있습니다." - - #: ../camel/providers/nntp/camel-nntp-store.c:1583 - #, c-format --msgid "" --"You cannot unsubscribe to this newsgroup:\n" -+msgid "You cannot unsubscribe to this newsgroup:\n" - "\n" - "newsgroup does not exist!" --msgstr "" --"이 뉴스그룹서 구독을 해제할 수 없습니다:\n" -+msgstr "이 뉴스그룹서 구독을 해제할 수 없습니다:\n" - "\n" - "뉴스그룹이 없습니다!" - -@@ -4198,9 +4147,7 @@ - msgid "" - "This option will connect to the POP server using a plaintext password. This " - "is the only option supported by many POP servers." --msgstr "" --"이 옵션을 켜면 일반 텍스트 암호를 이용해 POP 서버에 연결합니다. 많은 POP 서버" --"에서 이 옵션만을 지원합니다." -+msgstr "이 옵션을 켜면 일반 텍스트 암호를 이용해 POP 서버에 연결합니다. 많은 POP 서버에서 이 옵션만을 지원합니다." - - #: ../camel/providers/pop3/camel-pop3-provider.c:93 - msgid "" -@@ -4208,9 +4155,8 @@ - "the APOP protocol. This may not work for all users even on servers that " - "claim to support it." - msgstr "" --"이 옵션을 켜면 APOP 프로토콜을 통해 암호화된 암호를 이용해 POP 서버에 연결합" --"니다. 이 옵션을 지원한다고 말하고 있는 서버에서 조차 사용자에 따라 동작하지 " --"않을 수도 있습니다." -+"이 옵션을 켜면 APOP 프로토콜을 통해 암호화된 암호를 이용해 POP 서버에 연결합니다. 이 옵션을 지원한다고 말하고 있는 서버에서 " -+"조차 사용자에 따라 동작하지 않을 수도 있습니다." - - #. Translators: This is the separator between an error and an explanation - #: ../camel/providers/pop3/camel-pop3-store.c:97 -@@ -4263,41 +4209,37 @@ - msgid "POP3 server for %s on %s" - msgstr "POP3 서버(사용자: %s, 위치: %s)" - --#: ../camel/providers/pop3/camel-pop3-store.c:713 -+#: ../camel/providers/pop3/camel-pop3-store.c:690 -+#: ../camel/providers/pop3/camel-pop3-store.c:777 - #, c-format --msgid "" --"Unable to connect to POP server %s:\tInvalid APOP ID received. Impersonation " --"attack suspected. Please contact your admin." --msgstr "" --"POP 서버 %s에 연결할 수 없습니다: 잘못된 APOP ID를 받았습니다. 개인정보 공격" --"이 의심됩니다. 관리자에게 문의하십시오." -+msgid "Unable to connect to POP server %s.\n" -+"Error sending password: " -+msgstr "POP 서버 %s에 연결하는데 실패했습니다.\n" -+"암호를 보내는데 오류가 발생했습니다: " - --#: ../camel/providers/pop3/camel-pop3-store.c:768 -+#: ../camel/providers/pop3/camel-pop3-store.c:722 - #, c-format - msgid "" --"Unable to connect to POP server %s.\n" --"Error sending password: " -+"Unable to connect to POP server %s:\tInvalid APOP ID received. Impersonation " -+"attack suspected. Please contact your admin." - msgstr "" --"POP 서버 %s에 연결하는데 실패했습니다.\n" --"암호를 보내는데 오류가 발생했습니다: " -+"POP 서버 %s에 연결할 수 없습니다: 잘못된 APOP ID를 받았습니다. 개인정보 공격이 의심됩니다. 관리자에게 문의하십시오." - - #. Translators: Last %s is an optional explanation - #. * beginning with ": " separator. --#: ../camel/providers/pop3/camel-pop3-store.c:783 -+#: ../camel/providers/pop3/camel-pop3-store.c:792 - #, c-format --msgid "" --"Unable to connect to POP server %s.\n" -+msgid "Unable to connect to POP server %s.\n" - "Error sending username%s" --msgstr "" --"POP 서버 %s에 연결할 수 없습니다.\n" -+msgstr "POP 서버 %s에 연결할 수 없습니다.\n" - "사용자 이름을 보내는데 오류가 발생했습니다%s" - --#: ../camel/providers/pop3/camel-pop3-store.c:865 -+#: ../camel/providers/pop3/camel-pop3-store.c:874 - #, c-format - msgid "No such folder '%s'." - msgstr "'%s'(이)라는 폴더가 없습니다." - --#: ../camel/providers/pop3/camel-pop3-store.c:882 -+#: ../camel/providers/pop3/camel-pop3-store.c:891 - #, c-format - msgid "POP3 stores have no folder hierarchy" - msgstr "POP3는 폴더 구조를 저장하지 않습니다" -@@ -4390,218 +4332,218 @@ - msgid "For delivering mail by connecting to a remote mailhub using SMTP." - msgstr "SMTP를 사용해서 원격 메일허브로 연결해 메일을 보냅니다." - --#: ../camel/providers/smtp/camel-smtp-transport.c:170 --#: ../camel/providers/smtp/camel-smtp-transport.c:178 -+#: ../camel/providers/smtp/camel-smtp-transport.c:171 -+#: ../camel/providers/smtp/camel-smtp-transport.c:179 - msgid "Welcome response error: " - msgstr "Welcome 응답에 오류가 있습니다: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:214 -+#: ../camel/providers/smtp/camel-smtp-transport.c:215 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: %s" - msgstr "SMTP 서버 %s에 보안 모드로 연결하는데 실패했습니다: %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:224 --#: ../camel/providers/smtp/camel-smtp-transport.c:238 --#: ../camel/providers/smtp/camel-smtp-transport.c:246 -+#: ../camel/providers/smtp/camel-smtp-transport.c:225 -+#: ../camel/providers/smtp/camel-smtp-transport.c:240 -+#: ../camel/providers/smtp/camel-smtp-transport.c:248 - msgid "STARTTLS command failed: " - msgstr "STARTTLS 명령이 실패했습니다: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:265 -+#: ../camel/providers/smtp/camel-smtp-transport.c:267 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: " - msgstr "SMTP 서버 %s에 보안 모드로 연결하는데 실패했습니다: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:357 -+#: ../camel/providers/smtp/camel-smtp-transport.c:359 - #, c-format - msgid "SMTP server %s" - msgstr "SMTP 서버 %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:360 -+#: ../camel/providers/smtp/camel-smtp-transport.c:362 - #, c-format - msgid "SMTP mail delivery via %s" - msgstr "%s 서버를 통한 SMTP 메일" - --#: ../camel/providers/smtp/camel-smtp-transport.c:434 -+#: ../camel/providers/smtp/camel-smtp-transport.c:463 - #, c-format - msgid "SMTP server %s does not support %s authentication" - msgstr "SMTP 서버 %s에서 요청한 %s 인증 방식을 지원하지 않습니다." - --#: ../camel/providers/smtp/camel-smtp-transport.c:506 -+#: ../camel/providers/smtp/camel-smtp-transport.c:536 - #, c-format - msgid "No SASL mechanism was specified" - msgstr "SASL 방식을 하나도 지정하지 않았습니다." - --#: ../camel/providers/smtp/camel-smtp-transport.c:536 --#: ../camel/providers/smtp/camel-smtp-transport.c:547 --#: ../camel/providers/smtp/camel-smtp-transport.c:560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:571 -+#: ../camel/providers/smtp/camel-smtp-transport.c:583 -+#: ../camel/providers/smtp/camel-smtp-transport.c:596 - msgid "AUTH command failed: " - msgstr "AUTH 명령이 실패했습니다: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:701 -+#: ../camel/providers/smtp/camel-smtp-transport.c:740 - #, c-format - msgid "Cannot send message: service not connected." - msgstr "메시지를 보낼 수 없습니다: 서비스에 연결되지 않았습니다." - --#: ../camel/providers/smtp/camel-smtp-transport.c:708 -+#: ../camel/providers/smtp/camel-smtp-transport.c:747 - #, c-format - msgid "Cannot send message: sender address not valid." - msgstr "메시지를 보낼 수 없습니다. 보내는 사람 주소가 올바르지 않습니다." - --#: ../camel/providers/smtp/camel-smtp-transport.c:712 -+#: ../camel/providers/smtp/camel-smtp-transport.c:751 - msgid "Sending message" - msgstr "메시지를 보냄" - --#: ../camel/providers/smtp/camel-smtp-transport.c:737 -+#: ../camel/providers/smtp/camel-smtp-transport.c:776 - #, c-format - msgid "Cannot send message: no recipients defined." - msgstr "메시지를 보낼 수 없습니다: 받는 사람이 정의되지 않았습니다." - --#: ../camel/providers/smtp/camel-smtp-transport.c:750 -+#: ../camel/providers/smtp/camel-smtp-transport.c:789 - #, c-format - msgid "Cannot send message: one or more invalid recipients" - msgstr "메시지를 보낼 수 없습니다: 받는 사람 중에 한 명 이상이 잘못되었습니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:871 -+#: ../camel/providers/smtp/camel-smtp-transport.c:910 - msgid "Syntax error, command unrecognized" - msgstr "문법 오류로, 무슨 명령인지 파악할 수 없습니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:873 -+#: ../camel/providers/smtp/camel-smtp-transport.c:912 - msgid "Syntax error in parameters or arguments" - msgstr "인자 혹은 인수에서 문법 오류입니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:875 -+#: ../camel/providers/smtp/camel-smtp-transport.c:914 - msgid "Command not implemented" - msgstr "명령이 구현되지 않았습니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:877 -+#: ../camel/providers/smtp/camel-smtp-transport.c:916 - msgid "Command parameter not implemented" - msgstr "명령어 인자가 구현되지 않았습니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:879 -+#: ../camel/providers/smtp/camel-smtp-transport.c:918 - msgid "System status, or system help reply" - msgstr "시스템 상태, 혹은 시스템 도움말 응답" - --#: ../camel/providers/smtp/camel-smtp-transport.c:881 -+#: ../camel/providers/smtp/camel-smtp-transport.c:920 - msgid "Help message" - msgstr "도움말" - --#: ../camel/providers/smtp/camel-smtp-transport.c:883 -+#: ../camel/providers/smtp/camel-smtp-transport.c:922 - msgid "Service ready" - msgstr "서비스 준비되었습니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:885 -+#: ../camel/providers/smtp/camel-smtp-transport.c:924 - msgid "Service closing transmission channel" - msgstr "서비스가 전송 채널을 닫았습니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:887 -+#: ../camel/providers/smtp/camel-smtp-transport.c:926 - msgid "Service not available, closing transmission channel" - msgstr "서비스를 사용할 수 없습니다. 전송 채널을 닫습니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:889 -+#: ../camel/providers/smtp/camel-smtp-transport.c:928 - msgid "Requested mail action okay, completed" - msgstr "요청한 메일 동작을 정상적으로 수행했습니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:891 -+#: ../camel/providers/smtp/camel-smtp-transport.c:930 - msgid "User not local; will forward to " - msgstr "로컬 사용자가 아닙니다. 에 전달합니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:893 -+#: ../camel/providers/smtp/camel-smtp-transport.c:932 - msgid "Requested mail action not taken: mailbox unavailable" - msgstr "요청한 메일 동작을 하지 않습니다: 메일함을 사용할 수 없습니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:895 -+#: ../camel/providers/smtp/camel-smtp-transport.c:934 - msgid "Requested action not taken: mailbox unavailable" - msgstr "요청한 작업을 하지 않습니다: 메일함을 사용할 수 없습니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:897 -+#: ../camel/providers/smtp/camel-smtp-transport.c:936 - msgid "Requested action aborted: error in processing" - msgstr "요청한 작업을 취소했습니다: 처리하는데 오류 발생" - --#: ../camel/providers/smtp/camel-smtp-transport.c:899 -+#: ../camel/providers/smtp/camel-smtp-transport.c:938 - msgid "User not local; please try " - msgstr "로컬 사용자가 아닙니다. 를 시도해 보십시오" - --#: ../camel/providers/smtp/camel-smtp-transport.c:901 -+#: ../camel/providers/smtp/camel-smtp-transport.c:940 - msgid "Requested action not taken: insufficient system storage" - msgstr "요청한 메일 작업을 하지 않습니다: 시스템 저장 공간이 부족합니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:903 -+#: ../camel/providers/smtp/camel-smtp-transport.c:942 - msgid "Requested mail action aborted: exceeded storage allocation" - msgstr "요청한 메일 작업을 취소했습니다: 저장 공간이 할당량을 넘었습니다." - msgstr "메일 입력 시작. .로 끝납니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:909 -+#: ../camel/providers/smtp/camel-smtp-transport.c:948 - msgid "Transaction failed" - msgstr "전송이 실패했습니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:913 -+#: ../camel/providers/smtp/camel-smtp-transport.c:952 - msgid "A password transition is needed" - msgstr "암호를 넘겨야 합니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:915 -+#: ../camel/providers/smtp/camel-smtp-transport.c:954 - msgid "Authentication mechanism is too weak" - msgstr "인증 방식이 너무 취약합니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:917 -+#: ../camel/providers/smtp/camel-smtp-transport.c:956 - msgid "Encryption required for requested authentication mechanism" - msgstr "요청한 인증 방식에서는 암호화가 필요합니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:919 -+#: ../camel/providers/smtp/camel-smtp-transport.c:958 - msgid "Temporary authentication failure" - msgstr "인증이 임시로 실패했습니다" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1207 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1247 - msgid "SMTP Greeting" - msgstr "SMTP 초기 메시지" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1217 --#: ../camel/providers/smtp/camel-smtp-transport.c:1231 --#: ../camel/providers/smtp/camel-smtp-transport.c:1239 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1257 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1272 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1280 - msgid "HELO command failed: " - msgstr "HELO 명령이 실패했습니다: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1314 --#: ../camel/providers/smtp/camel-smtp-transport.c:1329 --#: ../camel/providers/smtp/camel-smtp-transport.c:1339 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1355 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1371 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1381 - msgid "MAIL FROM command failed: " - msgstr "MAIL FROM 명령이 실패했습니다: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1366 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1408 - msgid "RCPT TO command failed: " - msgstr "RCPT TO 명령이 실패했습니다: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1383 --#: ../camel/providers/smtp/camel-smtp-transport.c:1393 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1426 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1436 - #, c-format - msgid "RCPT TO <%s> failed: " - msgstr "RCPT TO <%s> 실패했습니다: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1436 --#: ../camel/providers/smtp/camel-smtp-transport.c:1447 --#: ../camel/providers/smtp/camel-smtp-transport.c:1458 --#: ../camel/providers/smtp/camel-smtp-transport.c:1517 --#: ../camel/providers/smtp/camel-smtp-transport.c:1537 --#: ../camel/providers/smtp/camel-smtp-transport.c:1551 --#: ../camel/providers/smtp/camel-smtp-transport.c:1560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1509 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1521 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1532 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1594 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1614 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1629 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1638 - msgid "DATA command failed: " - msgstr "DATA 명령이 실패했습니다: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1585 --#: ../camel/providers/smtp/camel-smtp-transport.c:1600 --#: ../camel/providers/smtp/camel-smtp-transport.c:1609 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1663 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1679 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1688 - msgid "RSET command failed: " - msgstr "RSET 명령이 실패했습니다: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1634 --#: ../camel/providers/smtp/camel-smtp-transport.c:1648 --#: ../camel/providers/smtp/camel-smtp-transport.c:1655 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1713 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1727 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1734 - msgid "QUIT command failed: " - msgstr "QUIT 명령이 실패했습니다: " - -@@ -4645,9 +4587,8 @@ - "settings are now integrated into Evolution-Data-Server's account system. See " - "the ESourceProxy API documentation for details." - msgstr "" --"이 키는 버전 3.12부터 없어질 기능으로 표시되었고 더 이상 사용하지 않습니다. " --"프록시 설정은 이제 evolution-data-server의 계정 시스템으로 통합되었습니다. 자" --"세한 정보는 ESourceProxy API 문서를 참고하십시오." -+"이 키는 버전 3.12부터 없어질 기능으로 표시되었고 더 이상 사용하지 않습니다. 프록시 설정은 이제 evolution-data-" -+"server의 계정 시스템으로 통합되었습니다. 자세한 정보는 ESourceProxy API 문서를 참고하십시오." - - #: ../data/org.gnome.evolution.shell.network-config.gschema.xml.in.h:3 - msgid "(Deprecated) Whether to use http-proxy" -@@ -4719,25 +4660,25 @@ - msgid "Client reports password was rejected" - msgstr "클라이언트에서 암호가 거절되었음을 보고했습니다" - --#: ../libebackend/e-authentication-session.c:539 -+#: ../libebackend/e-authentication-session.c:542 - msgid "Add this password to your keyring" - msgstr "이 암호를 키 모음에 추가" - --#: ../libebackend/e-authentication-session.c:649 -+#: ../libebackend/e-authentication-session.c:547 - msgid "Password was incorrect" - msgstr "암호가 맞지 않습니다" - --#: ../libebackend/e-backend.c:408 -+#: ../libebackend/e-backend.c:420 - #, c-format - msgid "%s does not support authentication" - msgstr "%s은(는) 인증을 지원하지 않습니다" - --#: ../libebackend/e-collection-backend.c:901 -+#: ../libebackend/e-collection-backend.c:992 - #, c-format - msgid "%s does not support creating remote resources" - msgstr "%s은(는) 원격 자원 생성을 지원하지 않습니다" - --#: ../libebackend/e-collection-backend.c:960 -+#: ../libebackend/e-collection-backend.c:1051 - #, c-format - msgid "%s does not support deleting remote resources" - msgstr "%s은(는) 원격 자원 삭제를 지원하지 않습니다" -@@ -4752,48 +4693,48 @@ - msgid "Data source is missing a [%s] group" - msgstr "데이터 소스에서 [%s] 그룹이 빠졌습니다" - --#: ../libebackend/e-server-side-source.c:1022 --#: ../libedataserver/e-source.c:1394 -+#: ../libebackend/e-server-side-source.c:1025 -+#: ../libedataserver/e-source.c:1351 - #, c-format - msgid "Data source '%s' does not support creating remote resources" - msgstr "'%s' 데이터 소스에서 원격 자원 만들기를 지원하지 않습니다" - --#: ../libebackend/e-server-side-source.c:1036 -+#: ../libebackend/e-server-side-source.c:1039 - #, c-format - msgid "" - "Data source '%s' has no collection backend to create the remote resource" - msgstr "'%s' 데이터 소스에 원격 자원을 만들기 위한 콜렉션 백엔드가 없습니다" - --#: ../libebackend/e-server-side-source.c:1064 --#: ../libedataserver/e-source.c:1507 -+#: ../libebackend/e-server-side-source.c:1067 -+#: ../libedataserver/e-source.c:1464 - #, c-format - msgid "Data source '%s' does not support deleting remote resources" - msgstr "'%s' 데이터 소스에서 원격 자원 삭제를 지원하지 않습니다" - --#: ../libebackend/e-server-side-source.c:1078 -+#: ../libebackend/e-server-side-source.c:1081 - #, c-format - msgid "" - "Data source '%s' has no collection backend to delete the remote resource" - msgstr "'%s' 데이터 소스에 원격 자원을 삭제하기 위한 콜렉션 백엔드가 없습니다" - --#: ../libebackend/e-server-side-source.c:1109 --#: ../libedataserver/e-source.c:1603 --#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1026 -+#: ../libebackend/e-server-side-source.c:1112 -+#: ../libedataserver/e-source.c:1560 -+#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1027 - #, c-format - msgid "Data source '%s' does not support OAuth 2.0 authentication" - msgstr "'%s' 데이터 원본은 OAuth 2.0 인증 방법을 지원하지 않습니다" - --#: ../libebackend/e-server-side-source.c:1456 -+#: ../libebackend/e-server-side-source.c:1459 - #, c-format - msgid "File must have a '.source' extension" - msgstr "파일 확장자는 반드시 '.source' 이어야 합니다" - --#: ../libebackend/e-source-registry-server.c:531 --#: ../libedataserver/e-source-registry.c:1957 -+#: ../libebackend/e-source-registry-server.c:535 -+#: ../libedataserver/e-source-registry.c:1944 - msgid "The user declined to authenticate" - msgstr "인증을 거절한 사용자" - --#: ../libebackend/e-source-registry-server.c:800 -+#: ../libebackend/e-source-registry-server.c:804 - #, c-format - msgid "UID '%s' is already in use" - msgstr "'%s' UID는 이미 사용중입니다" -@@ -4991,17 +4932,17 @@ - msgid "Source file is missing a [%s] group" - msgstr "소스 파일에서 [%s] 그룹이 빠졌습니다" - --#: ../libedataserver/e-source.c:1174 -+#: ../libedataserver/e-source.c:1131 - #, c-format - msgid "Data source '%s' is not removable" - msgstr "'%s' 데이터 소스를 제거할 수 없습니다" - --#: ../libedataserver/e-source.c:1297 -+#: ../libedataserver/e-source.c:1254 - #, c-format - msgid "Data source '%s' is not writable" - msgstr "'%s' 데이터 소스를 기록할 수 없습니다" - --#: ../libedataserver/e-source.c:1910 -+#: ../libedataserver/e-source.c:1867 - msgid "Unnamed" - msgstr "이름 없음" - -@@ -5015,47 +4956,39 @@ - msgid "Source '%s' does not support proxy lookups" - msgstr "'%s' 소스에서 프록시 찾아보기를 지원하지 않습니다" - --#: ../libedataserver/e-source-webdav.c:1557 -+#: ../libedataserver/e-source-webdav.c:1562 - #, c-format - msgid "" - "SSL certificate for host '%s', used by address book '%s', is not trusted. Do " - "you wish to accept it?" --msgstr "" --"호스트 '%s'에 대한 SSL 인증서('%s' 주소록에서 사용)를 신뢰할 수 없습니다. 이 " --"인증서를 허용하시겠습니까?" -+msgstr "호스트 '%s'에 대한 SSL 인증서('%s' 주소록에서 사용)를 신뢰할 수 없습니다. 이 인증서를 허용하시겠습니까?" - --#: ../libedataserver/e-source-webdav.c:1566 -+#: ../libedataserver/e-source-webdav.c:1571 - #, c-format - msgid "" - "SSL certificate for host '%s', used by calendar '%s', is not trusted. Do you " - "wish to accept it?" --msgstr "" --"호스트 '%s'에 대한 SSL 인증서('%s' 달력에서 사용)를 신뢰할 수 없습니다. 이 인" --"증서를 허용하시겠습니까?" -+msgstr "호스트 '%s'에 대한 SSL 인증서('%s' 달력에서 사용)를 신뢰할 수 없습니다. 이 인증서를 허용하시겠습니까?" - --#: ../libedataserver/e-source-webdav.c:1575 -+#: ../libedataserver/e-source-webdav.c:1580 - #, c-format - msgid "" - "SSL certificate for host '%s', used by memo list '%s', is not trusted. Do " - "you wish to accept it?" --msgstr "" --"호스트 '%s'에 대한 SSL 인증서('%s' 메모 목록에서 사용)를 신뢰할 수 없습니다. " --"이 인증서를 허용하시겠습니까?" -+msgstr "호스트 '%s'에 대한 SSL 인증서('%s' 메모 목록에서 사용)를 신뢰할 수 없습니다. 이 인증서를 허용하시겠습니까?" - --#: ../libedataserver/e-source-webdav.c:1584 -+#: ../libedataserver/e-source-webdav.c:1589 - #, c-format - msgid "" - "SSL certificate for host '%s', used by task list '%s', is not trusted. Do " - "you wish to accept it?" --msgstr "" --"호스트 '%s'에 대한 SSL 인증서('%s' 작업 목록에서 사용)를 신뢰할 수 없습니다. " --"이 인증서를 허용하시겠습니까?" -+msgstr "호스트 '%s'에 대한 SSL 인증서('%s' 작업 목록에서 사용)를 신뢰할 수 없습니다. 이 인증서를 허용하시겠습니까?" - - #. strptime format of a weekday, a date and a time, - #. * in 12-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1662 ../libedataserver/e-time-utils.c:1961 -+#: ../libedataserver/e-time-utils.c:1681 ../libedataserver/e-time-utils.c:1980 - msgid "%a %m/%d/%Y %I:%M:%S %p" - msgstr "%Y/%m/%d (%a) %p %I:%M:%S" - -@@ -5063,7 +4996,7 @@ - #. * in 24-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1667 ../libedataserver/e-time-utils.c:1952 -+#: ../libedataserver/e-time-utils.c:1686 ../libedataserver/e-time-utils.c:1971 - msgid "%a %m/%d/%Y %H:%M:%S" - msgstr "%Y/%m/%d (%a) %H:%M:%S" - -@@ -5071,7 +5004,7 @@ - #. * in 12-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1672 ../libedataserver/e-time-utils.c:1957 -+#: ../libedataserver/e-time-utils.c:1691 ../libedataserver/e-time-utils.c:1976 - msgid "%a %m/%d/%Y %I:%M %p" - msgstr "%Y/%m/%d (%a) %p %I:%M" - -@@ -5079,78 +5012,78 @@ - #. * in 24-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1677 ../libedataserver/e-time-utils.c:1948 -+#: ../libedataserver/e-time-utils.c:1696 ../libedataserver/e-time-utils.c:1967 - msgid "%a %m/%d/%Y %H:%M" - msgstr "%Y/%m/%d (%a) %H:%M" - - #. strptime format of a weekday, a date and a time, - #. * in 12-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1682 -+#: ../libedataserver/e-time-utils.c:1701 - msgid "%a %m/%d/%Y %I %p" - msgstr "%Y/%m/%d (%a) %p %I" - - #. strptime format of a weekday, a date and a time, - #. * in 24-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1687 -+#: ../libedataserver/e-time-utils.c:1706 - msgid "%a %m/%d/%Y %H" - msgstr "%Y/%m/%d (%a) %H" - - #. strptime format of a weekday and a date. - #. strftime format of a weekday and a date. --#: ../libedataserver/e-time-utils.c:1690 ../libedataserver/e-time-utils.c:1810 --#: ../libedataserver/e-time-utils.c:1943 -+#: ../libedataserver/e-time-utils.c:1709 ../libedataserver/e-time-utils.c:1829 -+#: ../libedataserver/e-time-utils.c:1962 - msgid "%a %m/%d/%Y" - msgstr "%Y/%m/%d (%a)" - - #. strptime format of a date and a time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1697 -+#: ../libedataserver/e-time-utils.c:1716 - msgid "%m/%d/%Y %I:%M:%S %p" - msgstr "%Y/%m/%d %p %I:%M:%S" - - #. strptime format of a date and a time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1701 -+#: ../libedataserver/e-time-utils.c:1720 - msgid "%m/%d/%Y %H:%M:%S" - msgstr "%Y/%m/%d %H:%M:%S" - - #. strptime format of a date and a time, in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1706 -+#: ../libedataserver/e-time-utils.c:1725 - msgid "%m/%d/%Y %I:%M %p" - msgstr "%Y/%m/%d %p %I:%M" - - #. strptime format of a date and a time, in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1711 -+#: ../libedataserver/e-time-utils.c:1730 - msgid "%m/%d/%Y %H:%M" - msgstr "%Y/%m/%d %H:%M" - - #. strptime format of a date and a time, in 12-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1716 -+#: ../libedataserver/e-time-utils.c:1735 - msgid "%m/%d/%Y %I %p" - msgstr "%Y/%m/%d %p %I" - - #. strptime format of a date and a time, in 24-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1721 -+#: ../libedataserver/e-time-utils.c:1740 - msgid "%m/%d/%Y %H" - msgstr "%Y/%m/%d %H" - - #. strptime format of a weekday and a date. - #. This is the preferred date format for the locale. --#: ../libedataserver/e-time-utils.c:1724 ../libedataserver/e-time-utils.c:1813 -+#: ../libedataserver/e-time-utils.c:1743 ../libedataserver/e-time-utils.c:1832 - msgid "%m/%d/%Y" - msgstr "%Y/%m/%d" - - #. strptime format for a time of day, in 12-hour format. - #. strftime format of a time in 12-hour format. --#: ../libedataserver/e-time-utils.c:1884 ../libedataserver/e-time-utils.c:2005 -+#: ../libedataserver/e-time-utils.c:1903 ../libedataserver/e-time-utils.c:2024 - msgid "%I:%M:%S %p" - msgstr "%p %I:%M:%S" - - #. strptime format for a time of day, in 24-hour format. - #. strftime format of a time in 24-hour format. --#: ../libedataserver/e-time-utils.c:1888 ../libedataserver/e-time-utils.c:1997 -+#: ../libedataserver/e-time-utils.c:1907 ../libedataserver/e-time-utils.c:2016 - msgid "%H:%M:%S" - msgstr "%H:%M:%S" - -@@ -5158,25 +5091,25 @@ - #. * in 12-hour format. - #. strftime format of a time in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1893 ../libedataserver/e-time-utils.c:2002 -+#: ../libedataserver/e-time-utils.c:1912 ../libedataserver/e-time-utils.c:2021 - msgid "%I:%M %p" - msgstr "%p %I:%M" - - #. strptime format for time of day, without seconds 24-hour format. - #. strftime format of a time in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1897 ../libedataserver/e-time-utils.c:1994 -+#: ../libedataserver/e-time-utils.c:1916 ../libedataserver/e-time-utils.c:2013 - msgid "%H:%M" - msgstr "%H:%M" - - #. strptime format for time of day, without seconds 24-hour format, - #. * and no colon. --#: ../libedataserver/e-time-utils.c:1901 -+#: ../libedataserver/e-time-utils.c:1920 - msgid "%H%M" - msgstr "%H%M" - - #. strptime format for hour and AM/PM, 12-hour format. --#: ../libedataserver/e-time-utils.c:1905 -+#: ../libedataserver/e-time-utils.c:1924 - msgid "%I %p" - msgstr "%p %I" - -@@ -5191,9 +5124,7 @@ - msgid "" - "Cannot find a corresponding account in the org.gnome.OnlineAccounts service " - "from which to obtain a password for '%s'" --msgstr "" --"org.gnome.OnlineAccounts 서비스에서 '%s'에 대한 암호를 얻을 해당 계정을 찾을 " --"수 없습니다" -+msgstr "org.gnome.OnlineAccounts 서비스에서 '%s'에 대한 암호를 얻을 해당 계정을 찾을 수 없습니다" - - #: ../modules/gnome-online-accounts/e-goa-password-based.c:218 - #, c-format -@@ -5236,32 +5167,24 @@ - msgid "Failed to find ASUrl and OABUrl in autodiscover response" - msgstr "자동 발견 응답에서 ASUrl 및 OABUrl을 찾는데 실패했습니다" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1260 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1269 - #, c-format - msgid "" - "Cannot find a corresponding account in the org.gnome.OnlineAccounts service " - "from which to obtain an access token for '%s'" --msgstr "" --"org.gnome.OnlineAccounts 서비스에서 '%s'에 대한 접근 토큰을 얻을 해당 계정을 " --"찾을 수 없습니다" -+msgstr "org.gnome.OnlineAccounts 서비스에서 '%s'에 대한 접근 토큰을 얻을 해당 계정을 찾을 수 없습니다" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1290 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1299 - #, c-format - msgid "Failed to obtain an access token for '%s': " - msgstr "'%s'에 대한 접근 토큰을 얻는데 실패했습니다: " - --#: ../modules/google-backend/module-google-backend.c:205 --#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 --#: ../modules/yahoo-backend/module-yahoo-backend.c:199 --msgid "Calendar" --msgstr "달력" -- --#: ../modules/google-backend/module-google-backend.c:279 -+#: ../modules/google-backend/module-google-backend.c:341 - #: ../modules/yahoo-backend/module-yahoo-backend.c:226 - msgid "Tasks" - msgstr "작업" - --#: ../modules/google-backend/module-google-backend.c:333 -+#: ../modules/google-backend/module-google-backend.c:395 - #: ../modules/ubuntu-online-accounts/contacts.service-type.in.in.h:1 - #: ../services/evolution-source-registry/builtin/contacts-stub.source.in.h:1 - msgid "Contacts" -@@ -5314,13 +5237,17 @@ - #: ../modules/trust-prompt/trust-prompt-gtk.c:160 - #, c-format - msgid "SSL certificate for '%s' is not trusted. Do you wish to accept it?" --msgstr "" --"'%s'에 대한 SSL 인증서를 신뢰할 수 없습니다. 이 인증서를 허용하시겠습니까?" -+msgstr "'%s'에 대한 SSL 인증서를 신뢰할 수 없습니다. 이 인증서를 허용하시겠습니까?" - - #: ../modules/trust-prompt/trust-prompt-gtk.c:175 - msgid "Reason:" - msgstr "이유:" - -+#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 -+#: ../modules/yahoo-backend/module-yahoo-backend.c:199 -+msgid "Calendar" -+msgstr "달력" -+ - #: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:2 - msgid "Integrate your calendars" - msgstr "달력 통합" -@@ -5361,20 +5288,19 @@ - msgid "Integrate your mailboxes" - msgstr "메일함 통합" - --#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1007 -+#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1008 - #, c-format - msgid "" - "Cannot find a corresponding account service in the accounts database from " - "which to obtain an access token for '%s'" --msgstr "" --"계정 데이터베이스에서 '%s'에 대한 접근 토큰을 얻을 해당 계정 서비스를 찾을 " --"수 없습니다" -+msgstr "계정 데이터베이스에서 '%s'에 대한 접근 토큰을 얻을 해당 계정 서비스를 찾을 수 없습니다" - - #: ../modules/ubuntu-online-accounts/uoa-utils.c:84 - #: ../modules/ubuntu-online-accounts/uoa-utils.c:281 - #, c-format - msgid "" --"Expected status 200 when requesting your identity, instead got status %d (%s)" -+"Expected status 200 when requesting your identity, instead got status %d " -+"(%s)" - msgstr "신원 요청에 상태 200을 예상했지만, 상태 %d번(%s)을 받았습니다" - - #: ../modules/ubuntu-online-accounts/uoa-utils.c:101 -diff -urN evolution-data-server-3.12.11/po/pt_BR.po evolution-data-server-3.12.11_localized/po/pt_BR.po ---- evolution-data-server-3.12.11/po/pt_BR.po 2014-11-04 18:27:25.000000000 +0530 -+++ evolution-data-server-3.12.11_localized/po/pt_BR.po 2016-03-14 19:48:05.493870010 +0530 -@@ -15,22 +15,22 @@ - # Jonh Wendell , 2012. - # Rafael Ferreira , 2012, 2013, 2014. - # Enrico Nicoletto , 2013, 2014. --# -+# msuppesd , 2016. #zanata -+# pnemade , 2016. #zanata - msgid "" - msgstr "" - "Project-Id-Version: evolution-data-server\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" --"product=evolution-data-server&keywords=I18N+L10N&component=Misc.\n" --"POT-Creation-Date: 2014-09-11 23:42+0000\n" --"PO-Revision-Date: 2014-09-11 22:13-0300\n" --"Last-Translator: Rafael Ferreira \n" --"Language-Team: Brazilian Portuguese \n" --"Language: pt_BR\n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2016-02-16 09:58+0530\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"PO-Revision-Date: 2016-03-09 08:49+0000\n" -+"Last-Translator: msuppesd \n" -+"Language-Team: Brazilian Portuguese \n" -+"Language: pt-BR\n" - "Plural-Forms: nplurals=2; plural=(n > 1);\n" --"X-Generator: Poedit 1.6.9\n" -+"X-Generator: Zanata 3.8.2\n" - "X-Project-Style: gnome\n" - - #: ../addressbook/backends/file/e-book-backend-file.c:120 -@@ -74,8 +74,8 @@ - - #: ../addressbook/backends/file/e-book-backend-file.c:1472 - #: ../addressbook/backends/file/e-book-backend-file.c:1555 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3077 --#: ../addressbook/libedata-book/e-book-sqlite.c:6742 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3084 -+#: ../addressbook/libedata-book/e-book-sqlite.c:6793 - #, c-format - msgid "Contact '%s' not found" - msgstr "O contato \"%s\" não foi encontrado" -@@ -99,86 +99,85 @@ - #: ../addressbook/backends/file/e-book-backend-file.c:2041 - #, c-format - msgid "Failed to rename old database from '%s' to '%s': %s" --msgstr "" --"Não foi possível renomear a velha base de dados de \"%s\" para \"%s\": %s" -+msgstr "Não foi possível renomear a velha base de dados de \"%s\" para \"%s\": %s" - - #: ../addressbook/backends/file/e-book-backend-file-migrate-bdb.c:148 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:1174 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4250 - #: ../addressbook/backends/webdav/e-book-backend-webdav.c:419 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:887 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:888 - #: ../addressbook/libebook-contacts/e-book-contacts-types.c:35 - #: ../addressbook/libebook-contacts/e-phone-number.c:56 - #: ../addressbook/libebook/e-book.c:1078 --#: ../addressbook/libebook/e-book-client.c:1882 --#: ../addressbook/libebook/e-book-client.c:2054 --#: ../addressbook/libebook/e-book-client.c:2267 --#: ../addressbook/libebook/e-book-client.c:2398 --#: ../addressbook/libebook/e-book-client.c:2557 --#: ../addressbook/libebook/e-book-client.c:2691 --#: ../addressbook/libebook/e-book-client.c:2822 --#: ../addressbook/libebook/e-book-client.c:2980 --#: ../addressbook/libebook/e-book-client.c:3175 --#: ../addressbook/libebook/e-book-client.c:3393 -+#: ../addressbook/libebook/e-book-client.c:1916 -+#: ../addressbook/libebook/e-book-client.c:2088 -+#: ../addressbook/libebook/e-book-client.c:2301 -+#: ../addressbook/libebook/e-book-client.c:2432 -+#: ../addressbook/libebook/e-book-client.c:2591 -+#: ../addressbook/libebook/e-book-client.c:2725 -+#: ../addressbook/libebook/e-book-client.c:2856 -+#: ../addressbook/libebook/e-book-client.c:3014 -+#: ../addressbook/libebook/e-book-client.c:3209 -+#: ../addressbook/libebook/e-book-client.c:3427 - #: ../addressbook/libedata-book/e-book-backend-sexp.c:878 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:585 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:616 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:629 - #: ../calendar/backends/contacts/e-cal-backend-contacts.c:270 - #: ../calendar/libecal/e-cal.c:2334 ../calendar/libecal/e-cal-client.c:276 --#: ../calendar/libecal/e-cal-client.c:3239 --#: ../calendar/libecal/e-cal-client.c:3412 --#: ../calendar/libecal/e-cal-client.c:3676 --#: ../calendar/libecal/e-cal-client.c:3917 --#: ../calendar/libecal/e-cal-client.c:4107 --#: ../calendar/libecal/e-cal-client.c:4299 --#: ../calendar/libecal/e-cal-client.c:4469 --#: ../calendar/libecal/e-cal-client.c:4638 --#: ../calendar/libecal/e-cal-client.c:4841 --#: ../calendar/libecal/e-cal-client.c:4991 --#: ../calendar/libecal/e-cal-client.c:5185 --#: ../calendar/libecal/e-cal-client.c:5338 --#: ../calendar/libecal/e-cal-client.c:5555 --#: ../calendar/libecal/e-cal-client.c:5709 --#: ../calendar/libecal/e-cal-client.c:5935 --#: ../calendar/libecal/e-cal-client.c:6131 --#: ../calendar/libecal/e-cal-client.c:6494 --#: ../calendar/libecal/e-cal-client.c:6708 -+#: ../calendar/libecal/e-cal-client.c:3273 -+#: ../calendar/libecal/e-cal-client.c:3446 -+#: ../calendar/libecal/e-cal-client.c:3710 -+#: ../calendar/libecal/e-cal-client.c:3951 -+#: ../calendar/libecal/e-cal-client.c:4141 -+#: ../calendar/libecal/e-cal-client.c:4333 -+#: ../calendar/libecal/e-cal-client.c:4503 -+#: ../calendar/libecal/e-cal-client.c:4672 -+#: ../calendar/libecal/e-cal-client.c:4875 -+#: ../calendar/libecal/e-cal-client.c:5025 -+#: ../calendar/libecal/e-cal-client.c:5219 -+#: ../calendar/libecal/e-cal-client.c:5372 -+#: ../calendar/libecal/e-cal-client.c:5589 -+#: ../calendar/libecal/e-cal-client.c:5743 -+#: ../calendar/libecal/e-cal-client.c:5969 -+#: ../calendar/libecal/e-cal-client.c:6165 -+#: ../calendar/libecal/e-cal-client.c:6528 -+#: ../calendar/libecal/e-cal-client.c:6750 - #: ../camel/providers/imapx/camel-imapx-command.c:645 --#: ../camel/providers/imapx/camel-imapx-server.c:4784 --#: ../camel/providers/imapx/camel-imapx-server.c:4793 -+#: ../camel/providers/imapx/camel-imapx-server.c:4871 -+#: ../camel/providers/imapx/camel-imapx-server.c:4880 - #: ../libedataserver/e-client.c:185 - msgid "Unknown error" - msgstr "Erro desconhecido" - - #. Query for new contacts asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:828 -+#: ../addressbook/backends/google/e-book-backend-google.c:822 - msgid "Querying for updated contacts…" - msgstr "Consultando por contatos atualizados..." - - #. Run the query asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:1010 -+#: ../addressbook/backends/google/e-book-backend-google.c:1004 - msgid "Querying for updated groups…" - msgstr "Consultando por grupos atualizados..." - --#: ../addressbook/backends/google/e-book-backend-google.c:1757 -+#: ../addressbook/backends/google/e-book-backend-google.c:1751 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4997 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1433 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1434 - msgid "The backend does not support bulk additions" - msgstr "O backend não tem suporte a adição em massa" - --#: ../addressbook/backends/google/e-book-backend-google.c:1912 -+#: ../addressbook/backends/google/e-book-backend-google.c:1906 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:5133 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1545 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1546 - msgid "The backend does not support bulk modifications" - msgstr "O backend não tem suporte a alterações em massa" - --#: ../addressbook/backends/google/e-book-backend-google.c:2119 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1645 -+#: ../addressbook/backends/google/e-book-backend-google.c:2113 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1646 - msgid "The backend does not support bulk removals" - msgstr "O backend não tem suporte a remoção em massa" - --#: ../addressbook/backends/google/e-book-backend-google.c:2239 -+#: ../addressbook/backends/google/e-book-backend-google.c:2233 - msgid "Loading…" - msgstr "Carregando..." - -@@ -278,44 +277,44 @@ - msgid "Failed to get the DN for user '%s'" - msgstr "Falha ao adquirir o DN para o usuário \"%s\"" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:864 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:865 - msgid "Loading Addressbook summary..." - msgstr "Carregando resumo do catálogo de endereços..." - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:884 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:885 - #, c-format - msgid "PROPFIND on webdav failed with HTTP status %d (%s)" - msgstr "Falha ao PROPFIND no webdav com HTTP estado: %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:903 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:904 - msgid "No response body in webdav PROPFIND result" - msgstr "Nenhum conteúdo de reposta no resultado de PROPFIND do webdar" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:964 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:965 - #, c-format - msgid "Loading Contacts (%d%%)" - msgstr "Baixando contatos (%d%%)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1353 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1354 - msgid "Cannot transform SoupURI to string" - msgstr "Não foi possível transformar SoupURI em string" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1474 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1475 - #, c-format - msgid "Create resource '%s' failed with HTTP status %d (%s)" - msgstr "A criação do recurso \"%s\" falhou com HTTP estado: %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1576 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1577 - msgid "Contact on server changed -> not modifying" - msgstr "Contato no servidor alterado -> não modificando" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1584 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1585 - #, c-format - msgid "Modify contact failed with HTTP status %d (%s)" - msgstr "A modificação de contato falhou com HTTP estado: %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1677 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1693 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1678 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1694 - #, c-format - msgid "DELETE failed with HTTP status %d" - msgstr "Falha ao EXCLUIR com HTTP estado: %d" -@@ -919,7 +918,7 @@ - msgid "Twitter Name List" - msgstr "Lista de nomes do Twitter" - --#: ../addressbook/libebook-contacts/e-contact.c:1654 -+#: ../addressbook/libebook-contacts/e-contact.c:1660 - #: ../addressbook/libebook/e-destination.c:920 - msgid "Unnamed List" - msgstr "Lista sem nome" -@@ -944,7 +943,8 @@ - - #: ../addressbook/libebook-contacts/e-phone-number.c:49 - msgid "" --"Remaining text after the country calling code is too short for a phone number" -+"Remaining text after the country calling code is too short for a phone " -+"number" - msgstr "" - "Texto restante após o código de chamada do país é muito curto para ser um " - "número de telefone" -@@ -957,48 +957,48 @@ - msgid "Text is too long for a phone number" - msgstr "Texto muito longo para ser um número de telefone" - --#: ../addressbook/libebook/e-book-client.c:807 -+#: ../addressbook/libebook/e-book-client.c:841 - #, c-format - msgid "Unknown book property '%s'" - msgstr "Propriedade desconhecida do catálogo \"%s\"" - --#: ../addressbook/libebook/e-book-client.c:822 -+#: ../addressbook/libebook/e-book-client.c:856 - #, c-format - msgid "Cannot change value of book property '%s'" - msgstr "Não é possível modificar o valor da propriedade do catálogo \"%s\"" - --#: ../addressbook/libebook/e-book-client.c:1207 --#: ../addressbook/libebook/e-book-client.c:1382 --#: ../addressbook/libebook/e-book-client.c:1649 --#: ../calendar/libecal/e-cal-client.c:1530 --#: ../calendar/libecal/e-cal-client.c:1712 -+#: ../addressbook/libebook/e-book-client.c:1241 -+#: ../addressbook/libebook/e-book-client.c:1416 -+#: ../addressbook/libebook/e-book-client.c:1683 -+#: ../calendar/libecal/e-cal-client.c:1564 -+#: ../calendar/libecal/e-cal-client.c:1746 - #, c-format - msgid "Unable to connect to '%s': " - msgstr "Não é possível conectar-se a \"%s\": " - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:899 --#: ../addressbook/libedata-book/e-book-sqlite.c:2178 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:906 -+#: ../addressbook/libedata-book/e-book-sqlite.c:2201 - #, c-format - msgid "Error introspecting unknown summary field '%s'" - msgstr "Ocorreu erro ao inspecionar campo de resumo \"%s\" desconhecido" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1509 --#: ../addressbook/libedata-book/e-book-sqlite.c:1334 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1516 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1340 - msgid "Error parsing regular expression" - msgstr "Erro ao analisar expressão regular" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1554 --#: ../addressbook/libedata-book/e-book-sqlite.c:1818 ../camel/camel-db.c:545 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1561 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1824 ../camel/camel-db.c:619 - #, c-format - msgid "Insufficient memory" - msgstr "Memória insuficiente" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1691 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1698 - #, c-format - msgid "Invalid contact field '%d' specified in summary" - msgstr "Campo de contato \"%d\" inválido especificado no resumo" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1725 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1732 - #: ../addressbook/libedata-book/e-book-sqlite.c:559 - #, c-format - msgid "" -@@ -1008,8 +1008,8 @@ - "Campo de contato \"%s\" do tipo \"%s\" especificado no resumo, porém só há " - "suporte apenas a campos de tipo booleano, string e string list" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3065 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4161 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3072 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4168 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. vcards cannot be returned." -@@ -1017,19 +1017,19 @@ - "Os \"search_contacts\" completos não são armazenados em cache. vcards não " - "podem ser retornados." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4292 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4385 --#: ../addressbook/libedata-book/e-book-sqlite.c:5400 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4299 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4392 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5451 - #, c-format - msgid "Query contained unsupported elements" - msgstr "A consulta contém elementos sem suporte" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4296 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4303 - #, c-format - msgid "Invalid Query" - msgstr "Consulta inválida" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4320 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4327 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. Hence only summary query is " -@@ -1038,7 +1038,7 @@ - "Os \"search_contacts\" completos não são armazenados em cache. Uma vez que " - "so há suporte a consulta do resumo." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4389 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4396 - #: ../addressbook/libedata-book/e-data-book.c:383 - #: ../addressbook/libedata-book/e-data-book.c:1028 - #: ../calendar/libedata-cal/e-data-cal.c:420 -@@ -1047,7 +1047,7 @@ - msgid "Invalid query" - msgstr "Consulta inválida" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4432 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4439 - #, c-format - msgid "" - "Full vcards are not stored in cache. Hence only summary query is supported." -@@ -1055,36 +1055,36 @@ - "Os vcards completos não são armazenados em cache. Uma vez que so há suporte " - "a consulta do resumo." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5255 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5262 - #, c-format - msgid "Unable to remove the db file: errno %d" - msgstr "Não é possível remover o arquivo db: erro de número %d" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6042 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6442 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6449 - #, c-format - msgid "Only summary queries are supported by EbSdbCursor" - msgstr "Apenas consultas a resumos têm suporte no EbSdbCursor" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6056 - #, c-format - msgid "At least one sort field must be specified to use an EbSdbCursor" - msgstr "" - "Pelo menos um campo de ordenação deve ser especificado para usar um " - "EbSdbCursor" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6063 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 - #, c-format - msgid "Cannot sort by a field that is not in the summary" - msgstr "Não é possível ordenar por um campo que não está no resumo" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6077 - #, c-format - msgid "Cannot sort by a field which may have multiple values" - msgstr "Não é possível ordenar por um campo que pode ter múltiplos valores" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6203 --#: ../addressbook/libedata-book/e-book-sqlite.c:7412 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6210 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7463 - #, c-format - msgid "" - "Tried to step a cursor in reverse, but cursor is already at the beginning of " -@@ -1093,8 +1093,8 @@ - "Tentou mover um cursor no sentido inverso, mas o cursor já está no começo da " - "lista de contatos" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6211 --#: ../addressbook/libedata-book/e-book-sqlite.c:7420 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6218 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7471 - #, c-format - msgid "" - "Tried to step a cursor forwards, but cursor is already at the end of the " -@@ -1108,7 +1108,7 @@ - msgid "Unsupported contact field '%d' specified in summary" - msgstr "Campo de contato \"%d\" sem suporte especificado no resumo" - --#: ../addressbook/libedata-book/e-book-sqlite.c:1891 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1897 - msgid "" - "Cannot upgrade contacts database from a legacy database with more than one " - "addressbook. Delete one of the entries in the 'folders' table first." -@@ -1117,21 +1117,22 @@ - "dados legado com mais de um catálogo de endereços. Exclua um dos registros " - "na tabela \"folder\" primeiro." - --#: ../addressbook/libedata-book/e-book-sqlite.c:5393 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5444 - #, c-format - msgid "Invalid query: %s" - msgstr "Consulta inválida: %s" - --#: ../addressbook/libedata-book/e-book-sqlite.c:5568 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5619 - msgid "Invalid query for EbSqlCursor" - msgstr "Consulta inválida de EbSqlCursor" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7234 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7285 - msgid "At least one sort field must be specified to use an EbSqlCursor" - msgstr "" --"Ao menos um campo de ordenação deve ser especificado para usar um EbSqlCursor" -+"Ao menos um campo de ordenação deve ser especificado para usar um " -+"EbSqlCursor" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7252 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7303 - msgid "Cannot sort by a field that is not a string type" - msgstr "Não foi possível ordenar por um campo que não é um tipo string" - -@@ -1297,15 +1298,15 @@ - msgid "Cannot remove contacts: " - msgstr "Não é possível remover contatos: " - --#: ../addressbook/libedata-book/e-data-book-cursor.c:772 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:776 - msgid "Cursor does not support setting the search expression" - msgstr "O cursor não tem suporte a configuração de expressão de pesquisa" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:855 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:859 - msgid "Cursor does not support step" - msgstr "O cursor não tem suporte a mover" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:938 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:942 - msgid "Cursor does not support alphabetic indexes" - msgstr "%s não tem suporte a índices alfabéticos" - -@@ -1339,35 +1340,35 @@ - msgid "No such source for UID '%s'" - msgstr "Não existe a fonte para o UID \"%s\"" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:581 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 - #, c-format - msgid "Server is unreachable (%s)" - msgstr "O servidor está inacessível (%s)" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:612 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 - #, c-format - msgid "Failed to connect to a server using SSL: %s" - msgstr "Falha ao conectar a um servidor usando SSL: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:623 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 - #, c-format --msgid "Unexpected HTTP status code %d returned (%s)" --msgstr "Retornou um estado inesperado de HTTP código %d (%s)" -+msgid "Unexpected HTTP status code %d returned (%s) for URI: %s" -+msgstr "Código de status HTTP %d inesperado retornou (%s) para URI: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:642 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:647 - msgid "CalDAV backend is not loaded yet" - msgstr "O backend CalDAV ainda não está carregado" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1084 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1091 - msgid "Invalid Redirect URL" - msgstr "URI de redirecionamento inválida" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2887 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2894 - #, c-format - msgid "Cannot create local cache folder '%s'" - msgstr "Não foi possível criar a pasta cache local \"%s\"" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2939 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2946 - #, c-format - msgid "" - "Server is unreachable, calendar is opened in read-only mode.\n" -@@ -1376,29 +1377,29 @@ - "O servidor está inacessível, calendário foi aberto em modo somente leitura.\n" - "Mensagem de erro: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3973 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3988 - msgid "CalDAV does not support bulk additions" - msgstr "CalDAV não suporta adição em massa" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4076 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4091 - msgid "CalDAV does not support bulk modifications" - msgstr "CalDAV não suporta alterações em massa" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4252 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4267 - msgid "CalDAV does not support bulk removals" - msgstr "CalDAV não suporta remoção em massa" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4919 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4941 - msgid "Calendar doesn't support Free/Busy" - msgstr "Agenda não suporta livre/ocupado" - - # Schedule outbox = caixa de saíde de agendamento? (ou talvez "de agenda" ou "de reunião"?) --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4928 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4950 - msgid "Schedule outbox url not found" - msgstr "URL de caixa de saída de agendamento não encontrada" - - # Vendo pelo código fonte, "schedule-response" parece ser algum tipo campo, e não meramente uma "resposta de agendamento" --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5025 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5047 - msgid "Unexpected result in schedule-response" - msgstr "Resultado inesperado no schedule-response" - -@@ -1446,74 +1447,75 @@ - msgstr "Não é uma agenda." - - #: ../calendar/backends/http/e-cal-backend-http.c:925 --#: ../calendar/backends/weather/e-cal-backend-weather.c:536 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:700 - msgid "Could not create cache file" - msgstr "Não foi possível criar arquivo de cache" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:174 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:196 - msgid "Could not retrieve weather data" - msgstr "Não foi possível recuperar dados do tempo" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:295 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:369 - msgid "Weather: Fog" - msgstr "Tempo: neblina" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:296 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:370 - msgid "Weather: Cloudy Night" - msgstr "Tempo: noite com núvens" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:297 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:371 - msgid "Weather: Cloudy" - msgstr "Tempo: nublado" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:298 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:372 - msgid "Weather: Overcast" - msgstr "Tempo: nublado" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:299 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:373 - msgid "Weather: Showers" - msgstr "Tempo: pancada de chuva" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:300 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:374 - msgid "Weather: Snow" - msgstr "Tempo: neve" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:301 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:375 - msgid "Weather: Clear Night" - msgstr "Tempo: noite limpa" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:302 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:376 - msgid "Weather: Sunny" - msgstr "Tempo: ensolarado" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:303 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:377 - msgid "Weather: Thunderstorms" - msgstr "Tempo: trovoadas" - - #. TRANSLATOR: This is the temperature in degrees Fahrenheit (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:329 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:403 - #, c-format - msgid "%.1f °F" - msgstr "%.1f °F" - - #. TRANSLATOR: This is the temperature in degrees Celsius (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:332 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:406 - #, c-format - msgid "%.1f °C" - msgstr "%.1f °C" - - #. TRANSLATOR: This is the temperature in kelvin --#: ../calendar/backends/weather/e-cal-backend-weather.c:335 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:409 - #, c-format - msgid "%.1f K" - msgstr "%.1f K" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:341 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:415 - #, c-format - msgid "%.1f" - msgstr "%.1f" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:452 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:580 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:608 - msgid "Forecast" - msgstr "Previsão" - -@@ -1569,7 +1571,7 @@ - msgstr "A autenticação falhou" - - #: ../calendar/libecal/e-cal.c:2330 --#: ../camel/providers/smtp/camel-smtp-transport.c:921 -+#: ../camel/providers/smtp/camel-smtp-transport.c:960 - #: ../libedataserver/e-client.c:147 - msgid "Authentication required" - msgstr "Autenticação exigida" -@@ -1592,17 +1594,17 @@ - msgid "Invalid range" - msgstr "Faixa inválida" - --#: ../calendar/libecal/e-cal-client.c:936 -+#: ../calendar/libecal/e-cal-client.c:970 - #, c-format - msgid "Unknown calendar property '%s'" - msgstr "Propriedade de agenda desconhecida \"%s\"" - --#: ../calendar/libecal/e-cal-client.c:951 -+#: ../calendar/libecal/e-cal-client.c:985 - #, c-format - msgid "Cannot change value of calendar property '%s'" - msgstr "Não é possível modificar o valor da propriedade da agenda \"%s\"" - --#: ../calendar/libecal/e-cal-component.c:1348 -+#: ../calendar/libecal/e-cal-component.c:1349 - msgid "Untitled appointment" - msgstr "Compromisso sem nome" - -@@ -1751,83 +1753,83 @@ - msgid "Undefined" - msgstr "Indefinida" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:84 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1062 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1371 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1498 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1547 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:85 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1063 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1379 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1506 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1555 - #, c-format - msgid "\"%s\" expects one argument" - msgstr "\"%s\" espera um argumento" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:91 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:673 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1378 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:92 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:674 - #: ../calendar/libedata-cal/e-cal-backend-sexp.c:1386 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1394 - #, c-format - msgid "\"%s\" expects the first argument to be a string" - msgstr "\"%s\" espera que o primeiro argumento seja uma string" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:166 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:167 - #, c-format - msgid "\"%s\" expects two or three arguments" - msgstr "\"%s\" espera dois ou três argumentos" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:173 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:262 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:324 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:823 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1069 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1447 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1505 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1554 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:174 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:263 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:325 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:824 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1070 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1455 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1513 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1562 - #, c-format - msgid "\"%s\" expects the first argument to be a time_t" - msgstr "\"%s\" espera que o primeiro argumento seja um time_t" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:182 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:270 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:334 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:832 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:183 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:271 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:335 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:833 - #, c-format - msgid "\"%s\" expects the second argument to be a time_t" - msgstr "\"%s\" espera que o segundo argumento seja um time_t" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:192 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:193 - #, c-format - msgid "\"%s\" expects the third argument to be a string" - msgstr "\"%s\" espera que o terceiro argumento seja uma string" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:254 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:255 - #, c-format - msgid "\"%s\" expects none or two arguments" - msgstr "\"%s\" espera nenhum ou dois argumentos" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:317 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:666 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:816 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1440 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:318 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:667 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:817 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1448 - #, c-format - msgid "\"%s\" expects two arguments" - msgstr "\"%s\" espera dois argumentos" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:602 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:625 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:748 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:780 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:987 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1020 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1332 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:603 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:626 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:749 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:781 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:988 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1021 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1340 - #, c-format - msgid "\"%s\" expects no arguments" - msgstr "\"%s\" não espera argumentos" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:682 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:683 - #, c-format - msgid "\"%s\" expects the second argument to be a string" - msgstr "\"%s\" espera que o segundo argumento seja uma string" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:713 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:714 - #, c-format - msgid "" - "\"%s\" expects the first argument to be either \"any\", \"summary\", or " -@@ -1838,12 +1840,12 @@ - "\"description\", ou \"location\", ou \"attendee\", ou \"organizer\", ou " - "\"classification\"" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:884 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:885 - #, c-format - msgid "\"%s\" expects at least one argument" - msgstr "\"%s\" espera pelo menos um argumento" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:899 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:900 - #, c-format - msgid "" - "\"%s\" expects all arguments to be strings or one and only one argument to " -@@ -1852,13 +1854,13 @@ - "\"%s\" espera que todos os argumentos sejam strings ou um e somente um " - "argumento que seja um falso booleano (#f)" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1395 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1403 - #, c-format - msgid "\"%s\" expects the first argument to be an ISO 8601 date/time string" - msgstr "" - "\"%s\" espera que o primeiro argumento seja uma string de data/hora ISO 8601" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1456 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1464 - #, c-format - msgid "\"%s\" expects the second argument to be an integer" - msgstr "\"%s\" espera que o segundo argumento seja um inteiro" -@@ -2102,36 +2104,36 @@ - msgstr[0] "Filtrando nova mensagem em \"%s\"" - msgstr[1] "Filtrando novas mensagens em \"%s\"" - --#: ../camel/camel-folder.c:1011 -+#: ../camel/camel-folder.c:1017 - #: ../camel/providers/local/camel-maildir-folder.c:330 - msgid "Moving messages" - msgstr "Movendo mensagens" - --#: ../camel/camel-folder.c:1014 -+#: ../camel/camel-folder.c:1020 - msgid "Copying messages" - msgstr "Copiando mensagens" - --#: ../camel/camel-folder.c:1056 -+#: ../camel/camel-folder.c:1062 - #, c-format - msgid "Quota information not supported for folder '%s'" - msgstr "Não tem suporte a informação de cota para a pasta \"%s\"" - --#: ../camel/camel-folder.c:2862 -+#: ../camel/camel-folder.c:2868 - #, c-format - msgid "Expunging folder '%s'" - msgstr "Excluindo pasta \"%s\"" - --#: ../camel/camel-folder.c:2990 -+#: ../camel/camel-folder.c:2996 - #, c-format - msgid "Retrieving message '%s' in %s" - msgstr "Recuperando mensagem \"%s\" em %s" - --#: ../camel/camel-folder.c:3181 -+#: ../camel/camel-folder.c:3187 - #, c-format - msgid "Retrieving quota information for '%s'" - msgstr "Recuperando informação de cota para \"%s\"" - --#: ../camel/camel-folder.c:3478 -+#: ../camel/camel-folder.c:3484 - #, c-format - msgid "Refreshing folder '%s'" - msgstr "Atualizando pasta \"%s\"" -@@ -2168,78 +2170,70 @@ - - #: ../camel/camel-folder-search.c:1943 ../camel/camel-folder-search.c:2109 - #, c-format --msgid "" --"Cannot parse search expression: %s:\n" -+msgid "Cannot parse search expression: %s:\n" - "%s" --msgstr "" --"Não foi possível analisar expressão de pesquisa: %s:\n" -+msgstr "Não foi possível analisar expressão de pesquisa: %s:\n" - "%s" - - #: ../camel/camel-folder-search.c:1955 ../camel/camel-folder-search.c:2121 - #, c-format --msgid "" --"Error executing search expression: %s:\n" -+msgid "Error executing search expression: %s:\n" - "%s" --msgstr "" --"Erro ao executar expressão de pesquisa: %s:\n" -+msgstr "Erro ao executar expressão de pesquisa: %s:\n" - "%s" - --#: ../camel/camel-gpg-context.c:721 ../camel/camel-gpg-context.c:726 --#: ../camel/camel-gpg-context.c:1383 -+#: ../camel/camel-gpg-context.c:725 ../camel/camel-gpg-context.c:730 -+#: ../camel/camel-gpg-context.c:1387 - #, c-format - msgid "Failed to execute gpg: %s" - msgstr "Falha ao executar GPG: %s" - --#: ../camel/camel-gpg-context.c:726 --#: ../camel/providers/smtp/camel-smtp-transport.c:924 -+#: ../camel/camel-gpg-context.c:730 -+#: ../camel/providers/smtp/camel-smtp-transport.c:963 - msgid "Unknown" - msgstr "Desconhecido" - --#: ../camel/camel-gpg-context.c:791 -+#: ../camel/camel-gpg-context.c:795 - #, c-format --msgid "" --"Unexpected GnuPG status message encountered:\n" -+msgid "Unexpected GnuPG status message encountered:\n" - "\n" - "%s" --msgstr "" --"Encontrada mensagem de estado inesperada do GnuPG:\n" -+msgstr "Encontrada mensagem de estado inesperada do GnuPG:\n" - "\n" - "%s" - --#: ../camel/camel-gpg-context.c:827 -+#: ../camel/camel-gpg-context.c:831 - #, c-format - msgid "Failed to parse gpg userid hint." - msgstr "Falha ao analisar dica de id de usuário do gpg." - --#: ../camel/camel-gpg-context.c:852 ../camel/camel-gpg-context.c:867 -+#: ../camel/camel-gpg-context.c:856 ../camel/camel-gpg-context.c:871 - #, c-format - msgid "Failed to parse gpg passphrase request." - msgstr "Falha ao analisar requisição de frase secreta do GPG." - --#: ../camel/camel-gpg-context.c:888 -+#: ../camel/camel-gpg-context.c:892 - #, c-format --msgid "" --"You need a PIN to unlock the key for your\n" -+msgid "You need a PIN to unlock the key for your\n" - "SmartCard: \"%s\"" - msgstr "" - "Você precisa de um PIN para desbloquear a chave\n" - "para o seu cartão inteligente: \"%s\"" - --#: ../camel/camel-gpg-context.c:892 -+#: ../camel/camel-gpg-context.c:896 - #, c-format --msgid "" --"You need a passphrase to unlock the key for\n" -+msgid "You need a passphrase to unlock the key for\n" - "user: \"%s\"" - msgstr "" - "Você precisa de uma frase secreta para desbloquear a chave\n" - "para o usuário: \"%s\"" - --#: ../camel/camel-gpg-context.c:898 -+#: ../camel/camel-gpg-context.c:902 - #, c-format - msgid "Unexpected request from GnuPG for '%s'" - msgstr "Requisição inesperada do GnuPG para \"%s\"" - --#: ../camel/camel-gpg-context.c:910 -+#: ../camel/camel-gpg-context.c:914 - msgid "" - "Note the encrypted content doesn't contain information about a recipient, " - "thus there will be a password prompt for each of stored private key." -@@ -2248,40 +2242,40 @@ - "destinatário, assim, será exibida uma tela pedindo a senha para cada chave " - "privada armazenada." - --#: ../camel/camel-gpg-context.c:941 ../camel/camel-net-utils.c:524 -+#: ../camel/camel-gpg-context.c:945 ../camel/camel-net-utils.c:524 - #: ../camel/providers/nntp/camel-nntp-summary.c:401 - #: ../libedataserver/e-client.c:158 - #, c-format - msgid "Cancelled" - msgstr "Cancelado" - --#: ../camel/camel-gpg-context.c:962 -+#: ../camel/camel-gpg-context.c:966 - #, c-format - msgid "Failed to unlock secret key: 3 bad passphrases given." - msgstr "" - "Falha ao desbloquear chave secreta: fornecidas 3 frases secretas inválidas." - --#: ../camel/camel-gpg-context.c:975 -+#: ../camel/camel-gpg-context.c:979 - #, c-format - msgid "Unexpected response from GnuPG: %s" - msgstr "Resposta inesperada do GnuPG: %s" - --#: ../camel/camel-gpg-context.c:1106 -+#: ../camel/camel-gpg-context.c:1110 - #, c-format - msgid "Failed to encrypt: No valid recipients specified." - msgstr "Falha ao criptografar: Não foram especificados destinatários válidos." - --#: ../camel/camel-gpg-context.c:1658 ../camel/camel-smime-context.c:844 -+#: ../camel/camel-gpg-context.c:1662 ../camel/camel-smime-context.c:844 - msgid "Could not generate signing data: " - msgstr "Não foi possível gerar dados de assinatura:" - --#: ../camel/camel-gpg-context.c:1708 ../camel/camel-gpg-context.c:1920 --#: ../camel/camel-gpg-context.c:2030 ../camel/camel-gpg-context.c:2179 -+#: ../camel/camel-gpg-context.c:1712 ../camel/camel-gpg-context.c:1924 -+#: ../camel/camel-gpg-context.c:2034 ../camel/camel-gpg-context.c:2183 - msgid "Failed to execute gpg." - msgstr "Falha ao executar GPG." - --#: ../camel/camel-gpg-context.c:1791 ../camel/camel-gpg-context.c:1799 --#: ../camel/camel-gpg-context.c:1807 ../camel/camel-gpg-context.c:1827 -+#: ../camel/camel-gpg-context.c:1795 ../camel/camel-gpg-context.c:1803 -+#: ../camel/camel-gpg-context.c:1811 ../camel/camel-gpg-context.c:1831 - #: ../camel/camel-smime-context.c:973 ../camel/camel-smime-context.c:987 - #: ../camel/camel-smime-context.c:996 - #, c-format -@@ -2290,31 +2284,31 @@ - "Não foi possível verificar assinatura da mensagem: Formato de mensagem " - "incorreto" - --#: ../camel/camel-gpg-context.c:1873 -+#: ../camel/camel-gpg-context.c:1877 - msgid "Cannot verify message signature: " - msgstr "Não foi possível verificar assinatura da mensagem:" - --#: ../camel/camel-gpg-context.c:1996 -+#: ../camel/camel-gpg-context.c:2000 - msgid "Could not generate encrypting data: " - msgstr "Não foi possível gerar dados de criptografia:" - --#: ../camel/camel-gpg-context.c:2049 -+#: ../camel/camel-gpg-context.c:2053 - msgid "This is a digitally encrypted message part" - msgstr "Esta é uma parte de mensagem criptografada digitalmente" - --#: ../camel/camel-gpg-context.c:2105 ../camel/camel-gpg-context.c:2114 --#: ../camel/camel-gpg-context.c:2137 -+#: ../camel/camel-gpg-context.c:2109 ../camel/camel-gpg-context.c:2118 -+#: ../camel/camel-gpg-context.c:2141 - #, c-format - msgid "Cannot decrypt message: Incorrect message format" - msgstr "" - "Não foi possível descriptografar a mensagem: Formato de mensagem incorreto" - --#: ../camel/camel-gpg-context.c:2125 -+#: ../camel/camel-gpg-context.c:2129 - #, c-format - msgid "Failed to decrypt MIME part: protocol error" - msgstr "Falha ao descriptografar parte MIME: erro de protocolo" - --#: ../camel/camel-gpg-context.c:2220 ../camel/camel-smime-context.c:1289 -+#: ../camel/camel-gpg-context.c:2224 ../camel/camel-smime-context.c:1289 - msgid "Encrypted content" - msgstr "Conteúdo criptografado" - -@@ -2357,8 +2351,7 @@ - #: ../camel/camel-lock-client.c:218 ../camel/camel-lock-client.c:246 - #, c-format - msgid "Could not lock '%s': protocol error with lock-helper" --msgstr "" --"Não foi possível bloquear \"%s\": erro de protocolo com \"lock-helper\"" -+msgstr "Não foi possível bloquear \"%s\": erro de protocolo com \"lock-helper\"" - - #: ../camel/camel-lock-client.c:234 - #, c-format -@@ -2515,29 +2508,23 @@ - - #: ../camel/camel-sasl-anonymous.c:79 - #, c-format --msgid "" --"Invalid email address trace information:\n" -+msgid "Invalid email address trace information:\n" - "%s" --msgstr "" --"Informação de rastreio de endereço de e-mail inválida:\n" -+msgstr "Informação de rastreio de endereço de e-mail inválida:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:93 - #, c-format --msgid "" --"Invalid opaque trace information:\n" -+msgid "Invalid opaque trace information:\n" - "%s" --msgstr "" --"Informação de rastreio opaca inválida:\n" -+msgstr "Informação de rastreio opaca inválida:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:107 - #, c-format --msgid "" --"Invalid trace information:\n" -+msgid "Invalid trace information:\n" - "%s" --msgstr "" --"Informação de rastreamento inválida:\n" -+msgstr "Informação de rastreamento inválida:\n" - "%s" - - #: ../camel/camel-sasl-cram-md5.c:44 -@@ -2600,7 +2587,8 @@ - msgstr "GSSAPI" - - #: ../camel/camel-sasl-gssapi.c:97 --msgid "This option will connect to the server using Kerberos 5 authentication." -+msgid "" -+"This option will connect to the server using Kerberos 5 authentication." - msgstr "" - "Esta opção estabelecerá conexão com o servidor usando autenticação Kerberos " - "5." -@@ -2673,7 +2661,7 @@ - - #: ../camel/camel-sasl-gssapi.c:223 ../camel/camel-sasl-gssapi.c:405 - #: ../camel/camel-sasl-gssapi.c:454 ../camel/camel-sasl-gssapi.c:471 --#: ../camel/providers/smtp/camel-smtp-transport.c:622 -+#: ../camel/providers/smtp/camel-smtp-transport.c:659 - #, c-format - msgid "Bad authentication response from server." - msgstr "Resposta de autenticação do servidor inválida." -@@ -2746,10 +2734,10 @@ - msgstr "O GType registrado não é válido para o protocolo \"%s\"" - - #: ../camel/camel-session.c:502 --#: ../camel/providers/imapx/camel-imapx-server.c:4734 -+#: ../camel/providers/imapx/camel-imapx-server.c:4821 - #: ../camel/providers/pop3/camel-pop3-store.c:311 --#: ../camel/providers/pop3/camel-pop3-store.c:757 --#: ../camel/providers/smtp/camel-smtp-transport.c:515 -+#: ../camel/providers/pop3/camel-pop3-store.c:766 -+#: ../camel/providers/smtp/camel-smtp-transport.c:545 - #, c-format - msgid "No support for %s authentication" - msgstr "Não há suporte à autenticação %s" -@@ -2957,49 +2945,53 @@ - msgid "S/MIME Decrypt: No encrypted content found" - msgstr "Descriptografia S/MIME: Não foi localizado conteúdo criptografado" - --#: ../camel/camel-store.c:1232 -+#: ../camel/camel-store.c:1238 - #, c-format - msgid "Opening folder '%s'" - msgstr "Abrindo pasta \"%s\"" - --#: ../camel/camel-store.c:1523 -+#: ../camel/camel-store.c:1529 - #, c-format - msgid "Scanning folders in '%s'" - msgstr "Procurando por pastas em \"%s\"" - --#: ../camel/camel-store.c:1551 ../camel/camel-store.c:1596 -+#: ../camel/camel-store.c:1557 ../camel/camel-store.c:1602 - #: ../camel/camel-vtrash-folder.c:46 - msgid "Trash" - msgstr "Lixeira" - --#: ../camel/camel-store.c:1565 ../camel/camel-store.c:1613 -+#: ../camel/camel-store.c:1571 ../camel/camel-store.c:1619 - #: ../camel/camel-vtrash-folder.c:48 - msgid "Junk" - msgstr "Spam" - --#: ../camel/camel-store.c:2214 -+#: ../camel/camel-store.c:2220 - #, c-format - msgid "Cannot create folder: %s: folder exists" - msgstr "Não foi possível criar pasta: %s: pasta existe" - --#: ../camel/camel-store.c:2221 -+#: ../camel/camel-store.c:2227 - #, c-format - msgid "Creating folder '%s'" - msgstr "Criando pasta \"%s\"" - --#: ../camel/camel-store.c:2398 ../camel/camel-vee-store.c:410 --#: ../camel/providers/local/camel-maildir-store.c:321 -+#: ../camel/camel-store.c:2404 ../camel/camel-vee-store.c:410 -+#: ../camel/providers/local/camel-maildir-store.c:346 - #, c-format - msgid "Cannot delete folder: %s: Invalid operation" - msgstr "Não foi possível excluir pasta: %s: Operação inválida" - --#: ../camel/camel-store.c:2588 ../camel/camel-vee-store.c:461 --#: ../camel/providers/local/camel-maildir-store.c:872 -+#: ../camel/camel-store.c:2594 ../camel/camel-vee-store.c:461 -+#: ../camel/providers/local/camel-maildir-store.c:914 - #, c-format - msgid "Cannot rename folder: %s: Invalid operation" - msgstr "Não foi possível renomear pasta: %s: Operação inválida" - --#: ../camel/camel-stream.c:285 ../camel/camel-stream.c:336 -+#: ../camel/camel-stream.c:170 -+msgid "Cannot write with no base stream" -+msgstr "Não é possível gravar sem fluxo base" -+ -+#: ../camel/camel-stream.c:290 ../camel/camel-stream.c:341 - #, c-format - msgid "Stream type '%s' is not seekable" - msgstr "O tipo de fluxo \"%s\" não pode ser pesquisado" -@@ -3059,7 +3051,8 @@ - - #: ../camel/camel-vee-folder.c:1167 - msgid "Automatically _update on change in source folders" --msgstr "_Atualizar automaticamente caso haja modificações nas pastas de origem" -+msgstr "" -+"_Atualizar automaticamente caso haja modificações nas pastas de origem" - - #. Translators: 'Unmatched' is a folder name under Search folders where are shown - #. * all messages not belonging into any other configured search folder -@@ -3193,7 +3186,8 @@ - - #: ../camel/providers/imapx/camel-imapx-provider.c:68 - msgid "_Apply filters to new messages in Inbox on this server" --msgstr "_Aplicar filtros às novas mensagens na caixa de entrada deste servidor" -+msgstr "" -+"_Aplicar filtros às novas mensagens na caixa de entrada deste servidor" - - #: ../camel/providers/imapx/camel-imapx-provider.c:70 - msgid "Check new messages for _Junk contents" -@@ -3223,226 +3217,226 @@ - msgid "For reading and storing mail on IMAP servers." - msgstr "Para ler e armazenar correio em servidores IMAP." - --#: ../camel/providers/imapx/camel-imapx-server.c:1009 - #: ../camel/providers/imapx/camel-imapx-server.c:1016 -+#: ../camel/providers/imapx/camel-imapx-server.c:1023 - #, c-format - msgid "Not authenticated" - msgstr "Não autenticado" - --#: ../camel/providers/imapx/camel-imapx-server.c:1713 -+#: ../camel/providers/imapx/camel-imapx-server.c:1751 - msgid "Server disconnected" - msgstr "Servidor desconectado" - --#: ../camel/providers/imapx/camel-imapx-server.c:2205 -+#: ../camel/providers/imapx/camel-imapx-server.c:2252 - msgid "Error writing to cache stream" - msgstr "Erro ao escrever em fluxo de cache" - --#: ../camel/providers/imapx/camel-imapx-server.c:3565 -+#: ../camel/providers/imapx/camel-imapx-server.c:3640 - msgid "Error performing IDLE" - msgstr "Erro enquanto ocioso" - --#: ../camel/providers/imapx/camel-imapx-server.c:4573 -+#: ../camel/providers/imapx/camel-imapx-server.c:4660 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: %s" - msgstr "Falha ao conectar ao servidor IMAP %s em modo seguro: %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:4574 --#: ../camel/providers/smtp/camel-smtp-transport.c:215 -+#: ../camel/providers/imapx/camel-imapx-server.c:4661 -+#: ../camel/providers/smtp/camel-smtp-transport.c:216 - msgid "STARTTLS not supported" - msgstr "Não há suporte a STARTTLS" - --#: ../camel/providers/imapx/camel-imapx-server.c:4634 -+#: ../camel/providers/imapx/camel-imapx-server.c:4721 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: " - msgstr "Falha ao conectar ao servidor IMAP %s em modo seguro: " - --#: ../camel/providers/imapx/camel-imapx-server.c:4723 -+#: ../camel/providers/imapx/camel-imapx-server.c:4810 - #, c-format - msgid "IMAP server %s does not support %s authentication" - msgstr "O servidor IMAP %s não suporta a autenticação %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:4753 -+#: ../camel/providers/imapx/camel-imapx-server.c:4840 - #: ../camel/providers/nntp/camel-nntp-store.c:394 - #: ../camel/providers/nntp/camel-nntp-store.c:531 - msgid "Cannot authenticate without a username" - msgstr "Não é possível autenticar sem um nome de usuário" - --#: ../camel/providers/imapx/camel-imapx-server.c:4762 -+#: ../camel/providers/imapx/camel-imapx-server.c:4849 - #: ../camel/providers/nntp/camel-nntp-store.c:540 - #: ../camel/providers/pop3/camel-pop3-store.c:678 --#: ../camel/providers/pop3/camel-pop3-store.c:699 -+#: ../camel/providers/pop3/camel-pop3-store.c:708 - msgid "Authentication password not available" - msgstr "A senha de autenticação não está disponível" - --#: ../camel/providers/imapx/camel-imapx-server.c:4998 --#: ../camel/providers/imapx/camel-imapx-server.c:5057 -+#: ../camel/providers/imapx/camel-imapx-server.c:5085 -+#: ../camel/providers/imapx/camel-imapx-server.c:5144 - msgid "Error fetching message" - msgstr "Erro ao obter a mensagem" - --#: ../camel/providers/imapx/camel-imapx-server.c:5050 -+#: ../camel/providers/imapx/camel-imapx-server.c:5137 - msgid "Failed to close the tmp stream" - msgstr "Falha ao fechar o fluxo temporário" - --#: ../camel/providers/imapx/camel-imapx-server.c:5086 -+#: ../camel/providers/imapx/camel-imapx-server.c:5173 - msgid "Failed to copy the tmp file" - msgstr "Falha ao copiar o arquivo temporário" - --#: ../camel/providers/imapx/camel-imapx-server.c:5227 -+#: ../camel/providers/imapx/camel-imapx-server.c:5345 - msgid "Error moving messages" - msgstr "Erro ao mover as mensagens" - --#: ../camel/providers/imapx/camel-imapx-server.c:5231 -+#: ../camel/providers/imapx/camel-imapx-server.c:5349 - msgid "Error copying messages" - msgstr "Erro ao copiar as mensagens" - --#: ../camel/providers/imapx/camel-imapx-server.c:5453 -+#: ../camel/providers/imapx/camel-imapx-server.c:5579 - msgid "Error appending message" - msgstr "Erro ao adicionar a mensagem" - --#: ../camel/providers/imapx/camel-imapx-server.c:5689 -+#: ../camel/providers/imapx/camel-imapx-server.c:5815 - msgid "Error fetching message headers" - msgstr "Erro ao obter os cabeçalhos da mensagem" - --#: ../camel/providers/imapx/camel-imapx-server.c:5856 -+#: ../camel/providers/imapx/camel-imapx-server.c:5982 - msgid "Error retrieving message" - msgstr "Erro ao recuperar a mensagem" - --#: ../camel/providers/imapx/camel-imapx-server.c:5990 --#: ../camel/providers/imapx/camel-imapx-server.c:6219 -+#: ../camel/providers/imapx/camel-imapx-server.c:6116 -+#: ../camel/providers/imapx/camel-imapx-server.c:6345 - #, c-format - msgid "Fetching summary information for new messages in '%s'" - msgstr "Obtendo informação de resumo para novas mensagens em \"%s\"" - --#: ../camel/providers/imapx/camel-imapx-server.c:6042 -+#: ../camel/providers/imapx/camel-imapx-server.c:6168 - #, c-format - msgid "Scanning for changed messages in '%s'" - msgstr "Procurando por mensagens alteradas em \"%s\"" - --#: ../camel/providers/imapx/camel-imapx-server.c:6094 -+#: ../camel/providers/imapx/camel-imapx-server.c:6220 - msgid "Error fetching new messages" - msgstr "Erro ao obter novas mensagens" - --#: ../camel/providers/imapx/camel-imapx-server.c:6367 -+#: ../camel/providers/imapx/camel-imapx-server.c:6493 - msgid "Error refreshing folder" - msgstr "Erro ao atualizar a pasta" - --#: ../camel/providers/imapx/camel-imapx-server.c:6517 -+#: ../camel/providers/imapx/camel-imapx-server.c:6643 - msgid "Error expunging message" - msgstr "Erro ao excluir a mensagem" - --#: ../camel/providers/imapx/camel-imapx-server.c:6632 --#: ../camel/providers/imapx/camel-imapx-server.c:6657 -+#: ../camel/providers/imapx/camel-imapx-server.c:6758 -+#: ../camel/providers/imapx/camel-imapx-server.c:6783 - msgid "Error fetching folders" - msgstr "Erro recuperando as pastas" - --#: ../camel/providers/imapx/camel-imapx-server.c:6737 -+#: ../camel/providers/imapx/camel-imapx-server.c:6863 - msgid "Error creating folder" - msgstr "Erro ao criar a pasta" - --#: ../camel/providers/imapx/camel-imapx-server.c:6789 -+#: ../camel/providers/imapx/camel-imapx-server.c:6915 - msgid "Error deleting folder" - msgstr "Erro ao apagar a pasta" - --#: ../camel/providers/imapx/camel-imapx-server.c:6865 -+#: ../camel/providers/imapx/camel-imapx-server.c:6991 - msgid "Error renaming folder" - msgstr "Erro ao renomear a pasta" - --#: ../camel/providers/imapx/camel-imapx-server.c:6939 -+#: ../camel/providers/imapx/camel-imapx-server.c:7065 - msgid "Error subscribing to folder" - msgstr "Erro ao se inscrever na pasta" - --#: ../camel/providers/imapx/camel-imapx-server.c:7005 -+#: ../camel/providers/imapx/camel-imapx-server.c:7131 - msgid "Error unsubscribing from folder" - msgstr "Erro ao se desinscrever da pasta" - --#: ../camel/providers/imapx/camel-imapx-server.c:7067 -+#: ../camel/providers/imapx/camel-imapx-server.c:7193 - msgid "Error retrieving quota information" - msgstr "Erro ao recuperar informações de cota" - --#: ../camel/providers/imapx/camel-imapx-server.c:7119 -+#: ../camel/providers/imapx/camel-imapx-server.c:7245 - msgid "Search failed" - msgstr "A pesquisa falhou" - --#: ../camel/providers/imapx/camel-imapx-server.c:7181 -+#: ../camel/providers/imapx/camel-imapx-server.c:7307 - msgid "Error performing NOOP" - msgstr "Erro ao executar NOOP" - --#: ../camel/providers/imapx/camel-imapx-server.c:7288 -+#: ../camel/providers/imapx/camel-imapx-server.c:7414 - msgid "Error syncing changes" - msgstr "Erro ao sincronizar as mudanças" - --#: ../camel/providers/imapx/camel-imapx-server.c:8275 -+#: ../camel/providers/imapx/camel-imapx-server.c:8446 - #, c-format - msgid "Cannot get message with message ID %s: %s" - msgstr "Não foi possível obter mensagem com ID %s: %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:8276 -+#: ../camel/providers/imapx/camel-imapx-server.c:8447 - msgid "No such message available." - msgstr "Não existe tal mensagem." - --#: ../camel/providers/imapx/camel-imapx-server.c:8483 --#: ../camel/providers/imapx/camel-imapx-server.c:8504 -+#: ../camel/providers/imapx/camel-imapx-server.c:8671 -+#: ../camel/providers/imapx/camel-imapx-server.c:8692 - msgid "Cannot create spool file: " - msgstr "Não foi possível criar arquivo de fila:" - --#: ../camel/providers/imapx/camel-imapx-server.c:9256 -+#: ../camel/providers/imapx/camel-imapx-server.c:9502 - msgid "IMAP server does not support quotas" - msgstr "O servidor IMAP não suporta cotas" - - #. create a dummy "." parent inbox, use to scan, then put back at the top level - #: ../camel/providers/imapx/camel-imapx-store.c:223 - #: ../camel/providers/local/camel-maildir-folder.c:482 --#: ../camel/providers/local/camel-maildir-store.c:322 --#: ../camel/providers/local/camel-maildir-store.c:784 --#: ../camel/providers/local/camel-maildir-store.c:790 --#: ../camel/providers/local/camel-maildir-store.c:873 -+#: ../camel/providers/local/camel-maildir-store.c:347 -+#: ../camel/providers/local/camel-maildir-store.c:826 -+#: ../camel/providers/local/camel-maildir-store.c:832 -+#: ../camel/providers/local/camel-maildir-store.c:915 - #: ../camel/providers/local/camel-spool-store.c:393 - msgid "Inbox" - msgstr "Entrada" - --#: ../camel/providers/imapx/camel-imapx-store.c:758 -+#: ../camel/providers/imapx/camel-imapx-store.c:757 - #, c-format - msgid "IMAP server %s" - msgstr "Servidor IMAP %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:761 -+#: ../camel/providers/imapx/camel-imapx-store.c:760 - #, c-format - msgid "IMAP service for %s on %s" - msgstr "Serviço IMAP para %s em %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:836 -+#: ../camel/providers/imapx/camel-imapx-store.c:835 - #: ../camel/providers/nntp/camel-nntp-provider.c:93 - #: ../camel/providers/pop3/camel-pop3-provider.c:81 - msgid "Password" - msgstr "Senha" - --#: ../camel/providers/imapx/camel-imapx-store.c:838 --msgid "This option will connect to the IMAP server using a plaintext password." -+#: ../camel/providers/imapx/camel-imapx-store.c:837 -+msgid "" -+"This option will connect to the IMAP server using a plaintext password." - msgstr "" - "Esta opção conectará com o servidor IMAP usando uma senha em texto aberto." - --#: ../camel/providers/imapx/camel-imapx-store.c:913 -+#: ../camel/providers/imapx/camel-imapx-store.c:916 - #, c-format - msgid "No such folder %s" - msgstr "Não existe a pasta %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:1324 -+#: ../camel/providers/imapx/camel-imapx-store.c:1344 - #, c-format - msgid "No IMAP namespace for folder path '%s'" - msgstr "Nenhum espaço de nomes de IMAP para o caminho de pasta \"%s\"" - --#: ../camel/providers/imapx/camel-imapx-store.c:1472 -+#: ../camel/providers/imapx/camel-imapx-store.c:1609 - #, c-format - msgid "Retrieving folder list for %s" - msgstr "Recuperando a lista de pastas para %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:1924 -+#: ../camel/providers/imapx/camel-imapx-store.c:2061 - #, c-format --msgid "" --"The folder name \"%s\" is invalid because it contains the character \"%c\"" -+msgid "The folder name \"%s\" is invalid because it contains the character \"%c\"" - msgstr "O nome de pasta \"%s\" é inválido pois ele contém o caractere \"%c\"" - --#: ../camel/providers/imapx/camel-imapx-store.c:2689 -+#: ../camel/providers/imapx/camel-imapx-store.c:2833 - #: ../camel/providers/nntp/camel-nntp-store.c:1250 - #: ../camel/providers/pop3/camel-pop3-folder.c:450 - #: ../camel/providers/pop3/camel-pop3-folder.c:593 -@@ -3452,7 +3446,7 @@ - #: ../camel/providers/pop3/camel-pop3-store.c:528 - #: ../camel/providers/pop3/camel-pop3-store.c:576 - #: ../camel/providers/pop3/camel-pop3-store.c:668 --#: ../camel/providers/pop3/camel-pop3-store.c:1072 -+#: ../camel/providers/pop3/camel-pop3-store.c:1081 - #, c-format - msgid "You must be working online to complete this operation" - msgstr "Você deve estar em modo conectado para completar esta operação" -@@ -3479,11 +3473,9 @@ - - #: ../camel/providers/local/camel-local-folder.c:730 - #, c-format --msgid "" --"Cannot get message %s from folder %s\n" -+msgid "Cannot get message %s from folder %s\n" - "%s" --msgstr "" --"Não foi possível obter a mensagem %s da pasta %s\n" -+msgstr "Não foi possível obter a mensagem %s da pasta %s\n" - " %s" - - #: ../camel/providers/local/camel-local-provider.c:41 -@@ -3537,8 +3529,7 @@ - "For reading and storing local mail in external standard mbox spool files.\n" - "May also be used to read a tree of Elm, Pine, or Mutt style folders." - msgstr "" --"Para ler e armazenar correio local em arquivos de fila mbox padrão " --"externos.\n" -+"Para ler e armazenar correio local em arquivos de fila mbox padrão externos.\n" - "Pode também ser usado para ler uma árvore de pastas do Elm, Pine ou Mutt." - - #: ../camel/providers/local/camel-local-provider.c:123 -@@ -3557,7 +3548,7 @@ - - #: ../camel/providers/local/camel-local-store.c:221 - #: ../camel/providers/local/camel-local-store.c:381 --#: ../camel/providers/local/camel-maildir-store.c:122 -+#: ../camel/providers/local/camel-maildir-store.c:123 - #: ../camel/providers/local/camel-mbox-store.c:572 - #: ../camel/providers/local/camel-spool-store.c:87 - #, c-format -@@ -3572,7 +3563,7 @@ - #: ../camel/providers/local/camel-local-store.c:242 - #: ../camel/providers/local/camel-local-store.c:252 - #: ../camel/providers/local/camel-local-store.c:394 --#: ../camel/providers/local/camel-maildir-store.c:156 -+#: ../camel/providers/local/camel-maildir-store.c:165 - #, c-format - msgid "Cannot get folder: %s: %s" - msgstr "Não foi possível obter a pasta: %s: %s" -@@ -3594,7 +3585,7 @@ - msgid "Could not delete folder meta file '%s': %s" - msgstr "Não foi possível excluir o meta arquivo de pasta \"%s\": %s" - --#: ../camel/providers/local/camel-local-store.c:594 -+#: ../camel/providers/local/camel-local-store.c:595 - #, c-format - msgid "Could not rename '%s': %s" - msgstr "Não foi possível renomear \"%s\": %s" -@@ -3626,53 +3617,59 @@ - msgid "Cannot transfer message to destination folder: %s" - msgstr "Não foi possível transferir a mensagem para a pasta destino: %s" - --#: ../camel/providers/local/camel-maildir-store.c:130 --#: ../camel/providers/local/camel-maildir-store.c:149 --#: ../camel/providers/local/camel-maildir-store.c:881 -+#: ../camel/providers/local/camel-maildir-store.c:131 -+#: ../camel/providers/local/camel-maildir-store.c:931 -+#, c-format -+msgid "Cannot create folder containing '%s'" -+msgstr "Não é possível criar pasta contendo '%s'" -+ -+#: ../camel/providers/local/camel-maildir-store.c:139 -+#: ../camel/providers/local/camel-maildir-store.c:158 -+#: ../camel/providers/local/camel-maildir-store.c:923 - #, c-format - msgid "Folder %s already exists" - msgstr "A pasta %s já existe" - --#: ../camel/providers/local/camel-maildir-store.c:241 --#: ../camel/providers/local/camel-maildir-store.c:272 -+#: ../camel/providers/local/camel-maildir-store.c:266 -+#: ../camel/providers/local/camel-maildir-store.c:297 - #: ../camel/providers/local/camel-mbox-store.c:401 - #: ../camel/providers/local/camel-mbox-store.c:422 - #, c-format - msgid "Cannot create folder '%s': %s" - msgstr "Não foi possível criar a pasta \"%s\": %s" - --#: ../camel/providers/local/camel-maildir-store.c:256 -+#: ../camel/providers/local/camel-maildir-store.c:281 - #: ../camel/providers/local/camel-mbox-store.c:367 - #: ../camel/providers/local/camel-mh-store.c:523 - #, c-format - msgid "Cannot get folder '%s': %s" - msgstr "Não foi possível obter a pasta \"%s\": %s" - --#: ../camel/providers/local/camel-maildir-store.c:262 -+#: ../camel/providers/local/camel-maildir-store.c:287 - #: ../camel/providers/local/camel-mbox-store.c:377 - #: ../camel/providers/local/camel-mh-store.c:532 - #, c-format - msgid "Cannot get folder '%s': folder does not exist." - msgstr "Não foi possível obter a pasta \"%s\": pasta não existe." - --#: ../camel/providers/local/camel-maildir-store.c:289 -+#: ../camel/providers/local/camel-maildir-store.c:314 - #, c-format - msgid "Cannot get folder '%s': not a maildir directory." - msgstr "Não foi possível obter a pasta \"%s\": não é um diretório maildir." - --#: ../camel/providers/local/camel-maildir-store.c:353 --#: ../camel/providers/local/camel-maildir-store.c:393 -+#: ../camel/providers/local/camel-maildir-store.c:378 -+#: ../camel/providers/local/camel-maildir-store.c:418 - #: ../camel/providers/local/camel-mh-store.c:676 - #, c-format - msgid "Could not delete folder '%s': %s" - msgstr "Não foi possível excluir a pasta \"%s\": %s" - --#: ../camel/providers/local/camel-maildir-store.c:355 -+#: ../camel/providers/local/camel-maildir-store.c:380 - msgid "not a maildir directory" - msgstr "não é um diretório maildir" - --#: ../camel/providers/local/camel-maildir-store.c:637 --#: ../camel/providers/local/camel-maildir-store.c:1095 -+#: ../camel/providers/local/camel-maildir-store.c:666 -+#: ../camel/providers/local/camel-maildir-store.c:1146 - #: ../camel/providers/local/camel-spool-store.c:212 - #: ../camel/providers/local/camel-spool-store.c:231 - #, c-format -@@ -3750,11 +3747,9 @@ - #: ../camel/providers/local/camel-mbox-store.c:663 - #: ../camel/providers/local/camel-mbox-store.c:692 - #, c-format --msgid "" --"Could not delete folder '%s':\n" -+msgid "Could not delete folder '%s':\n" - "%s" --msgstr "" --"Não foi possível excluir a pasta \"%s\":\n" -+msgstr "Não foi possível excluir a pasta \"%s\":\n" - "%s" - - #: ../camel/providers/local/camel-mbox-store.c:673 -@@ -3917,11 +3912,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:494 - #, c-format --msgid "" --"Could not open folder '%s':\n" -+msgid "Could not open folder '%s':\n" - "%s" --msgstr "" --"Não foi possível abrir a pasta \"%s\":\n" -+msgstr "Não foi possível abrir a pasta \"%s\":\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:500 -@@ -3931,11 +3924,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:508 - #, c-format --msgid "" --"Could not create folder '%s':\n" -+msgid "Could not create folder '%s':\n" - "%s" --msgstr "" --"Não foi possível criar a pasta \"%s\":\n" -+msgstr "Não foi possível criar a pasta \"%s\":\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:521 -@@ -4084,12 +4075,10 @@ - - #: ../camel/providers/nntp/camel-nntp-store.c:1151 - #, c-format --msgid "" --"Error retrieving newsgroups:\n" -+msgid "Error retrieving newsgroups:\n" - "\n" - "%s" --msgstr "" --"Erro ao recuperar grupos de notícias:\n" -+msgstr "Erro ao recuperar grupos de notícias:\n" - "\n" - "%s" - -@@ -4125,8 +4114,7 @@ - - #: ../camel/providers/nntp/camel-nntp-store.c:1583 - #, c-format --msgid "" --"You cannot unsubscribe to this newsgroup:\n" -+msgid "You cannot unsubscribe to this newsgroup:\n" - "\n" - "newsgroup does not exist!" - msgstr "" -@@ -4312,7 +4300,15 @@ - msgid "POP3 server for %s on %s" - msgstr "Serviço POP3 para %s em %s" - --#: ../camel/providers/pop3/camel-pop3-store.c:713 -+#: ../camel/providers/pop3/camel-pop3-store.c:690 -+#: ../camel/providers/pop3/camel-pop3-store.c:777 -+#, c-format -+msgid "Unable to connect to POP server %s.\n" -+"Error sending password: " -+msgstr "Não foi possível conectar ao servidor POP %s.\n" -+"Erro ao enviar senha:" -+ -+#: ../camel/providers/pop3/camel-pop3-store.c:722 - #, c-format - msgid "" - "Unable to connect to POP server %s:\tInvalid APOP ID received. Impersonation " -@@ -4321,32 +4317,22 @@ - "Não foi possível conectar ao servidor POP %s:\tID APOP recebido é inválido. " - "Suspeita de ataque do falsa origem. Por favor contacte o administrador." - --#: ../camel/providers/pop3/camel-pop3-store.c:768 --#, c-format --msgid "" --"Unable to connect to POP server %s.\n" --"Error sending password: " --msgstr "" --"Não foi possível conectar ao servidor POP %s.\n" --"Erro ao enviar senha:" -- - #. Translators: Last %s is an optional explanation - #. * beginning with ": " separator. --#: ../camel/providers/pop3/camel-pop3-store.c:783 -+#: ../camel/providers/pop3/camel-pop3-store.c:792 - #, c-format --msgid "" --"Unable to connect to POP server %s.\n" -+msgid "Unable to connect to POP server %s.\n" - "Error sending username%s" - msgstr "" - "Não foi possível se conectar ao servidor POP %s.\n" - "Erro ao enviar nome do usuário%s" - --#: ../camel/providers/pop3/camel-pop3-store.c:865 -+#: ../camel/providers/pop3/camel-pop3-store.c:874 - #, c-format - msgid "No such folder '%s'." - msgstr "A pasta \"%s\" não existe." - --#: ../camel/providers/pop3/camel-pop3-store.c:882 -+#: ../camel/providers/pop3/camel-pop3-store.c:891 - #, c-format - msgid "POP3 stores have no folder hierarchy" - msgstr "Os repositórios POP3 não possuem hierarquia de pasta" -@@ -4442,219 +4428,219 @@ - msgid "For delivering mail by connecting to a remote mailhub using SMTP." - msgstr "Para entregar o correio conectando à um servidor remoto usando SMTP." - --#: ../camel/providers/smtp/camel-smtp-transport.c:170 --#: ../camel/providers/smtp/camel-smtp-transport.c:178 -+#: ../camel/providers/smtp/camel-smtp-transport.c:171 -+#: ../camel/providers/smtp/camel-smtp-transport.c:179 - msgid "Welcome response error: " - msgstr "Erro na resposta de boas vindas:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:214 -+#: ../camel/providers/smtp/camel-smtp-transport.c:215 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: %s" - msgstr "Falha ao se conectar ao servidor SMTP %s em modo seguro: %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:224 --#: ../camel/providers/smtp/camel-smtp-transport.c:238 --#: ../camel/providers/smtp/camel-smtp-transport.c:246 -+#: ../camel/providers/smtp/camel-smtp-transport.c:225 -+#: ../camel/providers/smtp/camel-smtp-transport.c:240 -+#: ../camel/providers/smtp/camel-smtp-transport.c:248 - msgid "STARTTLS command failed: " - msgstr "O comando STARTTLS falhou:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:265 -+#: ../camel/providers/smtp/camel-smtp-transport.c:267 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: " - msgstr "Falha ao conectar-se ao servidor SMTP %s em modo seguro: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:357 -+#: ../camel/providers/smtp/camel-smtp-transport.c:359 - #, c-format - msgid "SMTP server %s" - msgstr "Servidor SMTP %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:360 -+#: ../camel/providers/smtp/camel-smtp-transport.c:362 - #, c-format - msgid "SMTP mail delivery via %s" - msgstr "Entrega de correio SMTP via %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:434 -+#: ../camel/providers/smtp/camel-smtp-transport.c:463 - #, c-format - msgid "SMTP server %s does not support %s authentication" - msgstr "O servidor SMTP %s não suporta a autenticação %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:506 -+#: ../camel/providers/smtp/camel-smtp-transport.c:536 - #, c-format - msgid "No SASL mechanism was specified" - msgstr "Nenhum mecanismo SASL foi especificado" - --#: ../camel/providers/smtp/camel-smtp-transport.c:536 --#: ../camel/providers/smtp/camel-smtp-transport.c:547 --#: ../camel/providers/smtp/camel-smtp-transport.c:560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:571 -+#: ../camel/providers/smtp/camel-smtp-transport.c:583 -+#: ../camel/providers/smtp/camel-smtp-transport.c:596 - msgid "AUTH command failed: " - msgstr "O comando AUTH falhou:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:701 -+#: ../camel/providers/smtp/camel-smtp-transport.c:740 - #, c-format - msgid "Cannot send message: service not connected." - msgstr "Não foi possível enviar mensagem: serviço não conectado." - --#: ../camel/providers/smtp/camel-smtp-transport.c:708 -+#: ../camel/providers/smtp/camel-smtp-transport.c:747 - #, c-format - msgid "Cannot send message: sender address not valid." - msgstr "Não foi possível enviar mensagem: endereço do remetente não é válido." - --#: ../camel/providers/smtp/camel-smtp-transport.c:712 -+#: ../camel/providers/smtp/camel-smtp-transport.c:751 - msgid "Sending message" - msgstr "Enviando mensagem" - --#: ../camel/providers/smtp/camel-smtp-transport.c:737 -+#: ../camel/providers/smtp/camel-smtp-transport.c:776 - #, c-format - msgid "Cannot send message: no recipients defined." - msgstr "Não foi possível enviar mensagem: não foram definidos destinatários." - --#: ../camel/providers/smtp/camel-smtp-transport.c:750 -+#: ../camel/providers/smtp/camel-smtp-transport.c:789 - #, c-format - msgid "Cannot send message: one or more invalid recipients" - msgstr "Não foi possível enviar mensagem: um ou mais destinatários inválidos" - --#: ../camel/providers/smtp/camel-smtp-transport.c:871 -+#: ../camel/providers/smtp/camel-smtp-transport.c:910 - msgid "Syntax error, command unrecognized" - msgstr "Erro de sintaxe, comando não reconhecido" - --#: ../camel/providers/smtp/camel-smtp-transport.c:873 -+#: ../camel/providers/smtp/camel-smtp-transport.c:912 - msgid "Syntax error in parameters or arguments" - msgstr "Erro de sintaxe nos parâmetros ou argumentos" - --#: ../camel/providers/smtp/camel-smtp-transport.c:875 -+#: ../camel/providers/smtp/camel-smtp-transport.c:914 - msgid "Command not implemented" - msgstr "Comando não implementado" - --#: ../camel/providers/smtp/camel-smtp-transport.c:877 -+#: ../camel/providers/smtp/camel-smtp-transport.c:916 - msgid "Command parameter not implemented" - msgstr "Parâmetro de comando não implementado" - --#: ../camel/providers/smtp/camel-smtp-transport.c:879 -+#: ../camel/providers/smtp/camel-smtp-transport.c:918 - msgid "System status, or system help reply" - msgstr "Estado do sistema ou resposta de ajuda do sistema" - --#: ../camel/providers/smtp/camel-smtp-transport.c:881 -+#: ../camel/providers/smtp/camel-smtp-transport.c:920 - msgid "Help message" - msgstr "Mensagem de ajuda" - --#: ../camel/providers/smtp/camel-smtp-transport.c:883 -+#: ../camel/providers/smtp/camel-smtp-transport.c:922 - msgid "Service ready" - msgstr "Serviço pronto" - --#: ../camel/providers/smtp/camel-smtp-transport.c:885 -+#: ../camel/providers/smtp/camel-smtp-transport.c:924 - msgid "Service closing transmission channel" - msgstr "Serviço fechando o canal de transmissão" - --#: ../camel/providers/smtp/camel-smtp-transport.c:887 -+#: ../camel/providers/smtp/camel-smtp-transport.c:926 - msgid "Service not available, closing transmission channel" - msgstr "Serviço indisponível, fechando o canal de transmissão" - --#: ../camel/providers/smtp/camel-smtp-transport.c:889 -+#: ../camel/providers/smtp/camel-smtp-transport.c:928 - msgid "Requested mail action okay, completed" - msgstr "Ação de correio solicitada OK, concluída" - --#: ../camel/providers/smtp/camel-smtp-transport.c:891 -+#: ../camel/providers/smtp/camel-smtp-transport.c:930 - msgid "User not local; will forward to " - msgstr "O usuário não é local; irei encaminhar para " - --#: ../camel/providers/smtp/camel-smtp-transport.c:893 -+#: ../camel/providers/smtp/camel-smtp-transport.c:932 - msgid "Requested mail action not taken: mailbox unavailable" - msgstr "" - "Ação de correio solicitada não executada: caixa de correio indisponível" - --#: ../camel/providers/smtp/camel-smtp-transport.c:895 -+#: ../camel/providers/smtp/camel-smtp-transport.c:934 - msgid "Requested action not taken: mailbox unavailable" - msgstr "Ação solicitada não executada: caixa de correio indisponível" - --#: ../camel/providers/smtp/camel-smtp-transport.c:897 -+#: ../camel/providers/smtp/camel-smtp-transport.c:936 - msgid "Requested action aborted: error in processing" - msgstr "Ação solicitada abortada: erro no processamento" - --#: ../camel/providers/smtp/camel-smtp-transport.c:899 -+#: ../camel/providers/smtp/camel-smtp-transport.c:938 - msgid "User not local; please try " - msgstr "O usuário não é local; por favor tente " - --#: ../camel/providers/smtp/camel-smtp-transport.c:901 -+#: ../camel/providers/smtp/camel-smtp-transport.c:940 - msgid "Requested action not taken: insufficient system storage" - msgstr "Ação solicitada não executada: espaço no sistema insuficiente" - --#: ../camel/providers/smtp/camel-smtp-transport.c:903 -+#: ../camel/providers/smtp/camel-smtp-transport.c:942 - msgid "Requested mail action aborted: exceeded storage allocation" - msgstr "Ação de correio solicitada abortada: espaço alocado excedido" - --#: ../camel/providers/smtp/camel-smtp-transport.c:905 -+#: ../camel/providers/smtp/camel-smtp-transport.c:944 - msgid "Requested action not taken: mailbox name not allowed" - msgstr "Ação pedida não executada: nome da caixa de correio não permitido" - --#: ../camel/providers/smtp/camel-smtp-transport.c:907 -+#: ../camel/providers/smtp/camel-smtp-transport.c:946 - msgid "Start mail input; end with ." - msgstr "Inicie a entrada da mensagem; termine com ." - --#: ../camel/providers/smtp/camel-smtp-transport.c:909 -+#: ../camel/providers/smtp/camel-smtp-transport.c:948 - msgid "Transaction failed" - msgstr "A transação falhou" - --#: ../camel/providers/smtp/camel-smtp-transport.c:913 -+#: ../camel/providers/smtp/camel-smtp-transport.c:952 - msgid "A password transition is needed" - msgstr "É necessária uma transição de senha" - --#: ../camel/providers/smtp/camel-smtp-transport.c:915 -+#: ../camel/providers/smtp/camel-smtp-transport.c:954 - msgid "Authentication mechanism is too weak" - msgstr "O mecanismo de autenticação é fraco demais" - --#: ../camel/providers/smtp/camel-smtp-transport.c:917 -+#: ../camel/providers/smtp/camel-smtp-transport.c:956 - msgid "Encryption required for requested authentication mechanism" - msgstr "Criptografia necessária para o mecanismo de autenticação pedido" - --#: ../camel/providers/smtp/camel-smtp-transport.c:919 -+#: ../camel/providers/smtp/camel-smtp-transport.c:958 - msgid "Temporary authentication failure" - msgstr "Falha de autenticação temporária" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1207 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1247 - msgid "SMTP Greeting" - msgstr "Saudação SMTP" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1217 --#: ../camel/providers/smtp/camel-smtp-transport.c:1231 --#: ../camel/providers/smtp/camel-smtp-transport.c:1239 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1257 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1272 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1280 - msgid "HELO command failed: " - msgstr "O comando HELO falhou:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1314 --#: ../camel/providers/smtp/camel-smtp-transport.c:1329 --#: ../camel/providers/smtp/camel-smtp-transport.c:1339 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1355 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1371 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1381 - msgid "MAIL FROM command failed: " - msgstr "O comando MAIL FROM falhou:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1366 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1408 - msgid "RCPT TO command failed: " - msgstr "O comando RCPT TO falhou: %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1383 --#: ../camel/providers/smtp/camel-smtp-transport.c:1393 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1426 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1436 - #, c-format - msgid "RCPT TO <%s> failed: " - msgstr "RCPT TO <%s> falhou:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1436 --#: ../camel/providers/smtp/camel-smtp-transport.c:1447 --#: ../camel/providers/smtp/camel-smtp-transport.c:1458 --#: ../camel/providers/smtp/camel-smtp-transport.c:1517 --#: ../camel/providers/smtp/camel-smtp-transport.c:1537 --#: ../camel/providers/smtp/camel-smtp-transport.c:1551 --#: ../camel/providers/smtp/camel-smtp-transport.c:1560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1509 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1521 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1532 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1594 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1614 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1629 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1638 - msgid "DATA command failed: " - msgstr "O comando DATA falhou:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1585 --#: ../camel/providers/smtp/camel-smtp-transport.c:1600 --#: ../camel/providers/smtp/camel-smtp-transport.c:1609 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1663 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1679 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1688 - msgid "RSET command failed: " - msgstr "O comando RSET falhou:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1634 --#: ../camel/providers/smtp/camel-smtp-transport.c:1648 --#: ../camel/providers/smtp/camel-smtp-transport.c:1655 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1713 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1727 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1734 - msgid "QUIT command failed: " - msgstr "O comando QUIT falhou:" - -@@ -4705,6 +4691,7 @@ - "Esta chave se tornou obsoleta na versão 3.12 e não deve mais ser usada. As " - "configurações de proxy agora estão integradas ao sistema de contas do " - "Evolution-Data-Server. Veja a documentação da API ESourceProxy para detalhes." -+"" - - #: ../data/org.gnome.evolution.shell.network-config.gschema.xml.in.h:3 - msgid "(Deprecated) Whether to use http-proxy" -@@ -4776,25 +4763,25 @@ - msgid "Client reports password was rejected" - msgstr "Cliente relata que a senha foi rejeitada" - --#: ../libebackend/e-authentication-session.c:539 -+#: ../libebackend/e-authentication-session.c:542 - msgid "Add this password to your keyring" - msgstr "Adicionar esta senha ao chaveiro" - --#: ../libebackend/e-authentication-session.c:649 -+#: ../libebackend/e-authentication-session.c:547 - msgid "Password was incorrect" - msgstr "Senha estava incorreta" - --#: ../libebackend/e-backend.c:408 -+#: ../libebackend/e-backend.c:420 - #, c-format - msgid "%s does not support authentication" - msgstr "%s não suporta autenticação" - --#: ../libebackend/e-collection-backend.c:901 -+#: ../libebackend/e-collection-backend.c:992 - #, c-format - msgid "%s does not support creating remote resources" - msgstr "%s não suporta criação de recursos remotos" - --#: ../libebackend/e-collection-backend.c:960 -+#: ../libebackend/e-collection-backend.c:1051 - #, c-format - msgid "%s does not support deleting remote resources" - msgstr "%s não suporta exclusão de recursos remotos" -@@ -4810,13 +4797,13 @@ - msgid "Data source is missing a [%s] group" - msgstr "Fonte de dados está com um grupo [%s] faltando" - --#: ../libebackend/e-server-side-source.c:1022 --#: ../libedataserver/e-source.c:1394 -+#: ../libebackend/e-server-side-source.c:1025 -+#: ../libedataserver/e-source.c:1351 - #, c-format - msgid "Data source '%s' does not support creating remote resources" - msgstr "Fonte de dados \"%s\" não suporta criação de recursos remotos" - --#: ../libebackend/e-server-side-source.c:1036 -+#: ../libebackend/e-server-side-source.c:1039 - #, c-format - msgid "" - "Data source '%s' has no collection backend to create the remote resource" -@@ -4824,13 +4811,13 @@ - "Fonte de dados \"%s\" não possui coleção de backend para criação de recursos " - "remotos" - --#: ../libebackend/e-server-side-source.c:1064 --#: ../libedataserver/e-source.c:1507 -+#: ../libebackend/e-server-side-source.c:1067 -+#: ../libedataserver/e-source.c:1464 - #, c-format - msgid "Data source '%s' does not support deleting remote resources" - msgstr "Fonte de dados \"%s\" não suporta exclusão de recursos remotos" - --#: ../libebackend/e-server-side-source.c:1078 -+#: ../libebackend/e-server-side-source.c:1081 - #, c-format - msgid "" - "Data source '%s' has no collection backend to delete the remote resource" -@@ -4838,24 +4825,24 @@ - "Fonte de dados \"%s\" não possui coleção de backend para exclusão de " - "recursos remotos" - --#: ../libebackend/e-server-side-source.c:1109 --#: ../libedataserver/e-source.c:1603 --#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1026 -+#: ../libebackend/e-server-side-source.c:1112 -+#: ../libedataserver/e-source.c:1560 -+#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1027 - #, c-format - msgid "Data source '%s' does not support OAuth 2.0 authentication" - msgstr "A fonte de dados \"%s\" não suporta autenticação OAuth 2.0" - --#: ../libebackend/e-server-side-source.c:1456 -+#: ../libebackend/e-server-side-source.c:1459 - #, c-format - msgid "File must have a '.source' extension" - msgstr "Arquivo deve ter uma extensão \".source\"" - --#: ../libebackend/e-source-registry-server.c:531 --#: ../libedataserver/e-source-registry.c:1957 -+#: ../libebackend/e-source-registry-server.c:535 -+#: ../libedataserver/e-source-registry.c:1944 - msgid "The user declined to authenticate" - msgstr "O usuário se recusou a autenticar." - --#: ../libebackend/e-source-registry-server.c:800 -+#: ../libebackend/e-source-registry-server.c:804 - #, c-format - msgid "UID '%s' is already in use" - msgstr "UID '%s' já está em uso" -@@ -5053,17 +5040,17 @@ - msgid "Source file is missing a [%s] group" - msgstr "Arquivo fonte está com um grupo [%s] faltando" - --#: ../libedataserver/e-source.c:1174 -+#: ../libedataserver/e-source.c:1131 - #, c-format - msgid "Data source '%s' is not removable" - msgstr "Fonte de dados \"%s\" não pode ser exluído" - --#: ../libedataserver/e-source.c:1297 -+#: ../libedataserver/e-source.c:1254 - #, c-format - msgid "Data source '%s' is not writable" - msgstr "Fonte de dados \"%s\" não pode ser gravado" - --#: ../libedataserver/e-source.c:1910 -+#: ../libedataserver/e-source.c:1867 - msgid "Unnamed" - msgstr "Sem nome" - -@@ -5077,16 +5064,16 @@ - msgid "Source '%s' does not support proxy lookups" - msgstr "A fonte \"%s\" não tem suporte a consultas por proxy" - --#: ../libedataserver/e-source-webdav.c:1557 -+#: ../libedataserver/e-source-webdav.c:1562 - #, c-format - msgid "" - "SSL certificate for host '%s', used by address book '%s', is not trusted. Do " - "you wish to accept it?" - msgstr "" --"O certificado SSL para a máquina \"%s\", usado pelo livro de endereços \"%s" --"\", não é confiável. Você deseja aceitá-lo?" -+"O certificado SSL para a máquina \"%s\", usado pelo livro de endereços " -+"\"%s\", não é confiável. Você deseja aceitá-lo?" - --#: ../libedataserver/e-source-webdav.c:1566 -+#: ../libedataserver/e-source-webdav.c:1571 - #, c-format - msgid "" - "SSL certificate for host '%s', used by calendar '%s', is not trusted. Do you " -@@ -5095,16 +5082,16 @@ - "O certificado SSL para a máquina \"%s\", usado pela agenda \"%s\", não é " - "confiável. Você deseja aceitá-lo?" - --#: ../libedataserver/e-source-webdav.c:1575 -+#: ../libedataserver/e-source-webdav.c:1580 - #, c-format - msgid "" - "SSL certificate for host '%s', used by memo list '%s', is not trusted. Do " - "you wish to accept it?" - msgstr "" --"O certificado SSL para a máquina \"%s\", usado pela lista de memorandos \"%s" --"\", não é confiável. Você deseja aceitá-lo?" -+"O certificado SSL para a máquina \"%s\", usado pela lista de memorandos " -+"\"%s\", não é confiável. Você deseja aceitá-lo?" - --#: ../libedataserver/e-source-webdav.c:1584 -+#: ../libedataserver/e-source-webdav.c:1589 - #, c-format - msgid "" - "SSL certificate for host '%s', used by task list '%s', is not trusted. Do " -@@ -5117,7 +5104,7 @@ - #. * in 12-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1662 ../libedataserver/e-time-utils.c:1961 -+#: ../libedataserver/e-time-utils.c:1681 ../libedataserver/e-time-utils.c:1980 - msgid "%a %m/%d/%Y %I:%M:%S %p" - msgstr "%a %d/%m/%Y %I:%M:%S %p" - -@@ -5125,7 +5112,7 @@ - #. * in 24-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1667 ../libedataserver/e-time-utils.c:1952 -+#: ../libedataserver/e-time-utils.c:1686 ../libedataserver/e-time-utils.c:1971 - msgid "%a %m/%d/%Y %H:%M:%S" - msgstr "%a %d/%m/%Y %H:%M:%S" - -@@ -5133,7 +5120,7 @@ - #. * in 12-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1672 ../libedataserver/e-time-utils.c:1957 -+#: ../libedataserver/e-time-utils.c:1691 ../libedataserver/e-time-utils.c:1976 - msgid "%a %m/%d/%Y %I:%M %p" - msgstr "%a %d/%m/%Y %I:%M %p" - -@@ -5141,78 +5128,78 @@ - #. * in 24-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1677 ../libedataserver/e-time-utils.c:1948 -+#: ../libedataserver/e-time-utils.c:1696 ../libedataserver/e-time-utils.c:1967 - msgid "%a %m/%d/%Y %H:%M" - msgstr "%a %d/%m/%Y %H:%M" - - #. strptime format of a weekday, a date and a time, - #. * in 12-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1682 -+#: ../libedataserver/e-time-utils.c:1701 - msgid "%a %m/%d/%Y %I %p" - msgstr "%a %d/%m/%Y %I %p" - - #. strptime format of a weekday, a date and a time, - #. * in 24-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1687 -+#: ../libedataserver/e-time-utils.c:1706 - msgid "%a %m/%d/%Y %H" - msgstr "%a %d/%m/%Y %H" - - #. strptime format of a weekday and a date. - #. strftime format of a weekday and a date. --#: ../libedataserver/e-time-utils.c:1690 ../libedataserver/e-time-utils.c:1810 --#: ../libedataserver/e-time-utils.c:1943 -+#: ../libedataserver/e-time-utils.c:1709 ../libedataserver/e-time-utils.c:1829 -+#: ../libedataserver/e-time-utils.c:1962 - msgid "%a %m/%d/%Y" - msgstr "%a %d/%m/%Y" - - #. strptime format of a date and a time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1697 -+#: ../libedataserver/e-time-utils.c:1716 - msgid "%m/%d/%Y %I:%M:%S %p" - msgstr "%d/%m/%Y %I:%M:%S %p" - - #. strptime format of a date and a time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1701 -+#: ../libedataserver/e-time-utils.c:1720 - msgid "%m/%d/%Y %H:%M:%S" - msgstr "%d/%m/%Y %H:%M:%S" - - #. strptime format of a date and a time, in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1706 -+#: ../libedataserver/e-time-utils.c:1725 - msgid "%m/%d/%Y %I:%M %p" - msgstr "%d/%m/%Y %I:%M %p" - - #. strptime format of a date and a time, in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1711 -+#: ../libedataserver/e-time-utils.c:1730 - msgid "%m/%d/%Y %H:%M" - msgstr "%d/%m/%Y %H:%M" - - #. strptime format of a date and a time, in 12-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1716 -+#: ../libedataserver/e-time-utils.c:1735 - msgid "%m/%d/%Y %I %p" - msgstr "%d/%m/%Y %I %p" - - #. strptime format of a date and a time, in 24-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1721 -+#: ../libedataserver/e-time-utils.c:1740 - msgid "%m/%d/%Y %H" - msgstr "%d/%m/%Y %H" - - #. strptime format of a weekday and a date. - #. This is the preferred date format for the locale. --#: ../libedataserver/e-time-utils.c:1724 ../libedataserver/e-time-utils.c:1813 -+#: ../libedataserver/e-time-utils.c:1743 ../libedataserver/e-time-utils.c:1832 - msgid "%m/%d/%Y" - msgstr "%d/%m/%Y" - - #. strptime format for a time of day, in 12-hour format. - #. strftime format of a time in 12-hour format. --#: ../libedataserver/e-time-utils.c:1884 ../libedataserver/e-time-utils.c:2005 -+#: ../libedataserver/e-time-utils.c:1903 ../libedataserver/e-time-utils.c:2024 - msgid "%I:%M:%S %p" - msgstr "%I:%M:%S %p" - - #. strptime format for a time of day, in 24-hour format. - #. strftime format of a time in 24-hour format. --#: ../libedataserver/e-time-utils.c:1888 ../libedataserver/e-time-utils.c:1997 -+#: ../libedataserver/e-time-utils.c:1907 ../libedataserver/e-time-utils.c:2016 - msgid "%H:%M:%S" - msgstr "%H:%M:%S" - -@@ -5220,25 +5207,25 @@ - #. * in 12-hour format. - #. strftime format of a time in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1893 ../libedataserver/e-time-utils.c:2002 -+#: ../libedataserver/e-time-utils.c:1912 ../libedataserver/e-time-utils.c:2021 - msgid "%I:%M %p" - msgstr "%I:%M %p" - - #. strptime format for time of day, without seconds 24-hour format. - #. strftime format of a time in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1897 ../libedataserver/e-time-utils.c:1994 -+#: ../libedataserver/e-time-utils.c:1916 ../libedataserver/e-time-utils.c:2013 - msgid "%H:%M" - msgstr "%H:%M" - - #. strptime format for time of day, without seconds 24-hour format, - #. * and no colon. --#: ../libedataserver/e-time-utils.c:1901 -+#: ../libedataserver/e-time-utils.c:1920 - msgid "%H%M" - msgstr "%H:%M" - - #. strptime format for hour and AM/PM, 12-hour format. --#: ../libedataserver/e-time-utils.c:1905 -+#: ../libedataserver/e-time-utils.c:1924 - msgid "%I %p" - msgstr "%I %p" - -@@ -5298,7 +5285,7 @@ - msgid "Failed to find ASUrl and OABUrl in autodiscover response" - msgstr "Falha ao localizar ASUrl e OABUrl na reposta de auto-detecção" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1260 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1269 - #, c-format - msgid "" - "Cannot find a corresponding account in the org.gnome.OnlineAccounts service " -@@ -5307,23 +5294,17 @@ - "Não foi possível encontrar uma conta correspondente no serviço \"org.gnome." - "OnlineAccounts\" a fim de obter um token de acesso para \"%s\"" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1290 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1299 - #, c-format - msgid "Failed to obtain an access token for '%s': " - msgstr "Falha ao obter um token de acesso para \"%s\":" - --#: ../modules/google-backend/module-google-backend.c:205 --#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 --#: ../modules/yahoo-backend/module-yahoo-backend.c:199 --msgid "Calendar" --msgstr "Agenda" -- --#: ../modules/google-backend/module-google-backend.c:279 -+#: ../modules/google-backend/module-google-backend.c:341 - #: ../modules/yahoo-backend/module-yahoo-backend.c:226 - msgid "Tasks" - msgstr "Tarefas" - --#: ../modules/google-backend/module-google-backend.c:333 -+#: ../modules/google-backend/module-google-backend.c:395 - #: ../modules/ubuntu-online-accounts/contacts.service-type.in.in.h:1 - #: ../services/evolution-source-registry/builtin/contacts-stub.source.in.h:1 - msgid "Contacts" -@@ -5386,6 +5367,11 @@ - msgid "Reason:" - msgstr "Motivo:" - -+#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 -+#: ../modules/yahoo-backend/module-yahoo-backend.c:199 -+msgid "Calendar" -+msgstr "Agenda" -+ - #: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:2 - msgid "Integrate your calendars" - msgstr "Integre suas agendas" -@@ -5427,7 +5413,7 @@ - msgid "Integrate your mailboxes" - msgstr "Integre suas caixas de correio" - --#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1007 -+#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1008 - #, c-format - msgid "" - "Cannot find a corresponding account service in the accounts database from " -@@ -5440,7 +5426,8 @@ - #: ../modules/ubuntu-online-accounts/uoa-utils.c:281 - #, c-format - msgid "" --"Expected status 200 when requesting your identity, instead got status %d (%s)" -+"Expected status 200 when requesting your identity, instead got status %d " -+"(%s)" - msgstr "" - "Esperava-se estado 200 ao solicitar sua identidade, ao invés disso obteve-se " - "estado %d (%s)" -@@ -5529,327 +5516,3 @@ - #: ../services/evolution-user-prompter/prompt-user-gtk.c:121 - msgid "_Dismiss" - msgstr "_Descartar" -- --#~ msgid "No host information available" --#~ msgstr "Não há informações disponível sobre a máquina" -- --#~ msgid "Cannot create folder '%s': folder exists" --#~ msgstr "Não foi possível criar a pasta \"%s\": pasta existe" -- --#~ msgid "Source stream unavailable" --#~ msgstr "Origem do fluxo indisponível" -- --#~ msgid "Cannot create folder '%s': folder exists." --#~ msgstr "Não foi possível criar a pasta \"%s\": a pasta existe." -- --#~ msgid "" --#~ "Could not write log entry: %s\n" --#~ "Further operations on this server will not be replayed when you\n" --#~ "reconnect to the network." --#~ msgstr "" --#~ "Não foi possível escrever entrada de registro: %s\n" --#~ "Operações subseqüentes neste servidor não serão reexecutadas quando\n" --#~ "você se reconectar à rede." -- --#~ msgid "" --#~ "Could not open '%s':\n" --#~ "%s\n" --#~ "Changes made to this folder will not be resynchronized." --#~ msgstr "" --#~ "Não foi possível abrir \"%s\":\n" --#~ "%s\n" --#~ "Alterações feitas a esta pasta não serão ressincronizadas." -- --#~ msgid "Resynchronizing with server" --#~ msgstr "Ressincronizando com servidor" -- --#~ msgid "Preparing folder '%s' for offline" --#~ msgstr "Preparando a pasta \"%s\" para modo desconectado" -- --#~ msgid "Canceled" --#~ msgstr "Cancelado" -- --#~ msgid "" --#~ "Alert from IMAP server %s:\n" --#~ "%s" --#~ msgstr "" --#~ "Alerta do servidor IMAP %s:\n" --#~ "%s" -- --#~ msgid "Error while fetching messages" --#~ msgstr "Erro ao recuperar as mensagens" -- --#~ msgid "Fetching summary information for %d message in '%s'" --#~ msgid_plural "Fetching summary information for %d messages in '%s'" --#~ msgstr[0] "Obtendo resumo para %d nova mensagem em \"%s\"" --#~ msgstr[1] "Obtendo resumo para %d novas mensagens em \"%s\"" -- --#~ msgid "Unknown parent folder: %s" --#~ msgstr "Pasta pai desconhecida: %s" -- --#~ msgid "The parent folder is not allowed to contain subfolders" --#~ msgstr "A pasta pai não pode conter subpastas" -- --#~ msgid "You cannot post NNTP messages while working offline!" --#~ msgstr "" --#~ "Você não pode publicar mensagens NNTP enquanto trabalha desconectado!" -- --#~ msgid "" --#~ "What proxy type to use. \"0\" means system, \"1\" means no proxy, \"2\" " --#~ "means manual proxy." --#~ msgstr "" --#~ "Qual o tipo de proxy a ser usado. \"0\" significa sistema, \"1\" " --#~ "significa sem proxy, \"2\" significa proxy manual." -- --#~ msgid "Whether to use proxy for HTTP requests." --#~ msgstr "Se o proxy deve ser usado nas requisições HTTP." -- --#~ msgid "Whether authentication is required to access proxy server." --#~ msgstr "" --#~ "Se autenticação é necessária para acessar este servidor proxy ou não." -- --#~ msgid "Host name to use for HTTP requests." --#~ msgstr "Nome da máquina para requisições HTTP" -- --#~ msgid "Port number to use for HTTP requests." --#~ msgstr "Número da porta nas requisições HTTP" -- --#~ msgid "User name to use to authenticate against proxy server." --#~ msgstr "Nome de usuário a ser usado na autenticação do servidor proxy." -- --#~ msgid "Password to use to authenticate against proxy server." --#~ msgstr "Senha a ser usada na autenticação do servidor proxy." -- --#~ msgid "List of hosts for which do not use proxy." --#~ msgstr "Lista de máquinas nas quais o proxy não será usado" -- --#~ msgid "Host name to use for HTTPS requests." --#~ msgstr "Nome da máquina para requisições HTTPS" -- --#~ msgid "Port number to use for HTTPS requests." --#~ msgstr "Número da porta nas requisições HTTPS" -- --#~ msgid "Host name to use for SOCKS requests." --#~ msgstr "Nome da máquina para requisições SOCKS" -- --#~ msgid "Port number to use for SOCKS requests." --#~ msgstr "Número da porta nas requisições SOCKS" -- --#~ msgid "Where to read automatic proxy configuration from." --#~ msgstr "De onde ler a configuração automática do proxy." -- --#~ msgid "You may not import keys with this cipher" --#~ msgstr "Você não pode importar chaves com esta cifra" -- --#~ msgid "You may not export keys with this cipher" --#~ msgstr "Você não pode exportar chaves com esta cifra" -- --#~ msgid "Resolving address" --#~ msgstr "Resolvendo endereço" -- --#~ msgid "Name lookup failed" --#~ msgstr "A consulta de nome falhou" -- --#~ msgid "Name lookup failed. Check your host name for spelling errors." --#~ msgstr "" --#~ "A consulta de nome falhou. Verifique seu nome de máquina por erros de " --#~ "escrita." -- --#~ msgid "Name lookup failed: %s" --#~ msgstr "A consulta de nome falhou: %s" -- --#~ msgid "Could not connect to '%s:%s': " --#~ msgstr "Não foi possível conectar-se a \"%s:%s\": " -- --#~ msgid "Please enter the %s password for %s on host %s." --#~ msgstr "Por favor, entre com a senha de %s para %s no servidor %s." -- --#~ msgid "NSPR error code %d" --#~ msgstr "Erro NSPR de código %d" -- --#~ msgid "The proxy host does not support SOCKS4" --#~ msgstr "O proxy não tem suporte a SOCKS4" -- --#~ msgid "The proxy host denied our request: code %d" --#~ msgstr "O proxy negou a requisição: código %d" -- --#~ msgid "The proxy host does not support SOCKS5" --#~ msgstr "O proxy não tem suporte a SOCKS5" -- --#~ msgid "Could not find a suitable authentication type: code 0x%x" --#~ msgstr "Não foi possível localizar um tipo de autenticação: código 0x%x" -- --#~ msgid "General SOCKS server failure" --#~ msgstr "Falha geral no serviço de SOCKS" -- --#~ msgid "SOCKS server's rules do not allow connection" --#~ msgstr "Regras dos servidores SOCKS não permitem conexões" -- --#~ msgid "Network is unreachable from SOCKS server" --#~ msgstr "A rede está inacessível do servidor SOCKS" -- --#~ msgid "Host is unreachable from SOCKS server" --#~ msgstr "A máquina está inacessível do servidor SOCKS" -- --#~ msgid "Connection refused" --#~ msgstr "Conexão recusada" -- --#~ msgid "Time-to-live expired" --#~ msgstr "Tempo de vida expirou" -- --#~ msgid "Command not supported by SOCKS server" --#~ msgstr "Comando sem suporte do serviço SOCKS" -- --#~ msgid "Address type not supported by SOCKS server" --#~ msgstr "Tipo de endereço sem suporte pelo servidor SOCKS" -- --#~ msgid "Unknown error from SOCKS server" --#~ msgstr "Erro desconhecido do serviço SOCKS" -- --#~ msgid "Got unknown address type from SOCKS server" --#~ msgstr "Tipo de endereço desconhecido do servidor SOCKS" -- --#~ msgid "Incomplete reply from SOCKS server" --#~ msgstr "Resposta incompleta do servidor SOCKS" -- --#~ msgid "Hostname is too long (maximum is 255 characters)" --#~ msgstr "Nome de máquina é muito longo (máximo é de 255 caracteres)" -- --#~ msgid "Invalid reply from proxy server" --#~ msgstr "Resposta inválida do servidor proxy" -- --#~ msgid "Unable to add message to summary: unknown reason" --#~ msgstr "Não foi possível adicionar mensagem ao resumo: razão desconhecida" -- --#~ msgid "Fatal mail parser error near position %s in folder %s" --#~ msgstr "" --#~ "Erro fatal do analisador de correio próximo à posição %s na pasta %s" -- --#~ msgid "Not part of certificate" --#~ msgstr "Não faz parte do certificado" -- --#~ msgid "_Close" --#~ msgstr "_Fechar" -- --#~ msgid "This certificate has been verified for the following uses:" --#~ msgstr "Este certificado foi verificado para os seguintes usos:" -- --#~ msgid "SSL Client Certificate" --#~ msgstr "Certificado do cliente SSL" -- --#~ msgid "SSL Server Certificate" --#~ msgstr "Certificado do servidor SSL" -- --#~ msgid "Email Signer Certificate" --#~ msgstr "Certificado do signatário do e-mail" -- --#~ msgid "Email Recipient Certificate" --#~ msgstr "Certificado do destinatário do e-mail" -- --#~ msgid "Issued To" --#~ msgstr "Emitido para" -- --#~ msgid "Common Name (CN)" --#~ msgstr "Nome comum (CN)" -- --#~ msgid "Organization (O)" --#~ msgstr "Organização (O)" -- --#~ msgid "Organizational Unit (OU)" --#~ msgstr "Unidade organizacional (OU)" -- --#~ msgid "Serial Number" --#~ msgstr "Número de série" -- --#~ msgid "Issued By" --#~ msgstr "Emitido por" -- --#~ msgid "Validity" --#~ msgstr "Validade" -- --#~ msgid "Issued On" --#~ msgstr "Emitido em" -- --#~ msgid "Expires On" --#~ msgstr "Válido até" -- --#~ msgid "Fingerprints" --#~ msgstr "Impressões digitais" -- --#~ msgid "SHA1 Fingerprint" --#~ msgstr "Impressão digital SHA1" -- --#~ msgid "MD5 Fingerprint" --#~ msgstr "Impressão digital MD5" -- --#~ msgid "General" --#~ msgstr "Geral" -- --#~ msgid "Certificate Hierarchy" --#~ msgstr "Hierarquia do certificado" -- --#~ msgid "Certificate Fields" --#~ msgstr "Campos do certificado" -- --#~ msgid "Field Value" --#~ msgstr "Valor do campo" -- --#~ msgid "Details" --#~ msgstr "Detalhes" -- --#~ msgid "Version" --#~ msgstr "Versão" -- --#~ msgid "Version 1" --#~ msgstr "Versão 1" -- --#~ msgid "Version 2" --#~ msgstr "Versão 2" -- --#~ msgid "Version 3" --#~ msgstr "Versão 3" -- --#~ msgid "PKCS #1 MD2 With RSA Encryption" --#~ msgstr "PKCS #1 MD2 com criptografia RSA" -- --#~ msgid "PKCS #1 MD5 With RSA Encryption" --#~ msgstr "PKCS #1 MD5 com criptografia RSA" -- --#~ msgid "PKCS #1 SHA-1 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-1 com criptografia RSA" -- --#~ msgid "PKCS #1 SHA-256 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-256 com criptografia RSA" -- --#~ msgid "PKCS #1 SHA-384 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-384 com criptografia RSA" -- --#~ msgid "PKCS #1 SHA-512 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-512 com criptografia RSA" -- --#~ msgid "PKCS #1 RSA Encryption" --#~ msgstr "PKCS #1 criptografia RSA" -- --#~ msgid "Certificate Key Usage" --#~ msgstr "Utilização da chave do certificado" -- --#~ msgid "Netscape Certificate Type" --#~ msgstr "Tipo de certificado Netscape" -- --#~ msgid "Certificate Authority Key Identifier" --#~ msgstr "Identificador de chave da autoridade certificadora" -- --#~ msgid "Object Identifier (%s)" --#~ msgstr "Identificador do objeto (%s)" -- --#~ msgid "Algorithm Identifier" --#~ msgstr "Identificador do algoritmo" -- --#~ msgid "Algorithm Parameters" --#~ msgstr "Parâmetros do algoritmo" -- --#~ msgid "Subject Public Key Info" --#~ msgstr "Informações da chave pública da entidade" -- --#~ msgid "Subject Public Key Algorithm" --#~ msgstr "Algoritmo da chave pública da entidade" -diff -urN evolution-data-server-3.12.11/po/ru.po evolution-data-server-3.12.11_localized/po/ru.po ---- evolution-data-server-3.12.11/po/ru.po 2014-11-04 18:27:25.000000000 +0530 -+++ evolution-data-server-3.12.11_localized/po/ru.po 2016-03-14 19:48:05.511869994 +0530 -@@ -1,30 +1,30 @@ - # translation of evolution-data-server.master.ru.po to Russian - # Russian translation of evolution-data-server - # Copyright (C) 2000,2002,2003, 2004, 2005, 2006, 2007, 2010 Free Software Foundation, Inc. --# -+# - # Valek Filippov , 2000. - # Dmitry Mastrukov , 2001-2003. - # Leonid Kanter , 2004-2006, 2007. - # Michael Yakhontov , 2003. - # Yuri Kozlov , 2010, 2011, 2012. - # Yuri Myasoedov , 2012, 2013. --# -+# pnemade , 2016. #zanata -+# ypoyarko , 2016. #zanata - msgid "" - msgstr "" - "Project-Id-Version: evolution-data-server trunk\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" --"product=evolution-data-server&keywords=I18N+L10N&component=Misc.\n" --"POT-Creation-Date: 2014-09-17 15:15+0000\n" --"PO-Revision-Date: 2014-09-17 21:53+0400\n" --"Last-Translator: Yuri Myasoedov \n" --"Language-Team: русский \n" --"Language: ru\n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2016-02-16 09:58+0530\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" --"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" --"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" --"X-Generator: Poedit 1.6.9\n" -+"PO-Revision-Date: 2016-03-07 06:17+0000\n" -+"Last-Translator: ypoyarko \n" -+"Language-Team: русский \n" -+"Language: ru\n" -+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -+"X-Generator: Zanata 3.8.2\n" - - #: ../addressbook/backends/file/e-book-backend-file.c:120 - #, c-format -@@ -67,8 +67,8 @@ - - #: ../addressbook/backends/file/e-book-backend-file.c:1472 - #: ../addressbook/backends/file/e-book-backend-file.c:1555 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3077 --#: ../addressbook/libedata-book/e-book-sqlite.c:6742 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3084 -+#: ../addressbook/libedata-book/e-book-sqlite.c:6793 - #, c-format - msgid "Contact '%s' not found" - msgstr "Контакт «%s» не найден" -@@ -98,79 +98,79 @@ - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:1174 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4250 - #: ../addressbook/backends/webdav/e-book-backend-webdav.c:419 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:887 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:888 - #: ../addressbook/libebook-contacts/e-book-contacts-types.c:35 - #: ../addressbook/libebook-contacts/e-phone-number.c:56 - #: ../addressbook/libebook/e-book.c:1078 --#: ../addressbook/libebook/e-book-client.c:1882 --#: ../addressbook/libebook/e-book-client.c:2054 --#: ../addressbook/libebook/e-book-client.c:2267 --#: ../addressbook/libebook/e-book-client.c:2398 --#: ../addressbook/libebook/e-book-client.c:2557 --#: ../addressbook/libebook/e-book-client.c:2691 --#: ../addressbook/libebook/e-book-client.c:2822 --#: ../addressbook/libebook/e-book-client.c:2980 --#: ../addressbook/libebook/e-book-client.c:3175 --#: ../addressbook/libebook/e-book-client.c:3393 -+#: ../addressbook/libebook/e-book-client.c:1916 -+#: ../addressbook/libebook/e-book-client.c:2088 -+#: ../addressbook/libebook/e-book-client.c:2301 -+#: ../addressbook/libebook/e-book-client.c:2432 -+#: ../addressbook/libebook/e-book-client.c:2591 -+#: ../addressbook/libebook/e-book-client.c:2725 -+#: ../addressbook/libebook/e-book-client.c:2856 -+#: ../addressbook/libebook/e-book-client.c:3014 -+#: ../addressbook/libebook/e-book-client.c:3209 -+#: ../addressbook/libebook/e-book-client.c:3427 - #: ../addressbook/libedata-book/e-book-backend-sexp.c:878 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:585 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:616 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:629 - #: ../calendar/backends/contacts/e-cal-backend-contacts.c:270 - #: ../calendar/libecal/e-cal.c:2334 ../calendar/libecal/e-cal-client.c:276 --#: ../calendar/libecal/e-cal-client.c:3239 --#: ../calendar/libecal/e-cal-client.c:3412 --#: ../calendar/libecal/e-cal-client.c:3676 --#: ../calendar/libecal/e-cal-client.c:3917 --#: ../calendar/libecal/e-cal-client.c:4107 --#: ../calendar/libecal/e-cal-client.c:4299 --#: ../calendar/libecal/e-cal-client.c:4469 --#: ../calendar/libecal/e-cal-client.c:4638 --#: ../calendar/libecal/e-cal-client.c:4841 --#: ../calendar/libecal/e-cal-client.c:4991 --#: ../calendar/libecal/e-cal-client.c:5185 --#: ../calendar/libecal/e-cal-client.c:5338 --#: ../calendar/libecal/e-cal-client.c:5555 --#: ../calendar/libecal/e-cal-client.c:5709 --#: ../calendar/libecal/e-cal-client.c:5935 --#: ../calendar/libecal/e-cal-client.c:6131 --#: ../calendar/libecal/e-cal-client.c:6494 --#: ../calendar/libecal/e-cal-client.c:6708 -+#: ../calendar/libecal/e-cal-client.c:3273 -+#: ../calendar/libecal/e-cal-client.c:3446 -+#: ../calendar/libecal/e-cal-client.c:3710 -+#: ../calendar/libecal/e-cal-client.c:3951 -+#: ../calendar/libecal/e-cal-client.c:4141 -+#: ../calendar/libecal/e-cal-client.c:4333 -+#: ../calendar/libecal/e-cal-client.c:4503 -+#: ../calendar/libecal/e-cal-client.c:4672 -+#: ../calendar/libecal/e-cal-client.c:4875 -+#: ../calendar/libecal/e-cal-client.c:5025 -+#: ../calendar/libecal/e-cal-client.c:5219 -+#: ../calendar/libecal/e-cal-client.c:5372 -+#: ../calendar/libecal/e-cal-client.c:5589 -+#: ../calendar/libecal/e-cal-client.c:5743 -+#: ../calendar/libecal/e-cal-client.c:5969 -+#: ../calendar/libecal/e-cal-client.c:6165 -+#: ../calendar/libecal/e-cal-client.c:6528 -+#: ../calendar/libecal/e-cal-client.c:6750 - #: ../camel/providers/imapx/camel-imapx-command.c:645 --#: ../camel/providers/imapx/camel-imapx-server.c:4784 --#: ../camel/providers/imapx/camel-imapx-server.c:4793 -+#: ../camel/providers/imapx/camel-imapx-server.c:4871 -+#: ../camel/providers/imapx/camel-imapx-server.c:4880 - #: ../libedataserver/e-client.c:185 - msgid "Unknown error" - msgstr "Неизвестная ошибка" - - #. Query for new contacts asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:828 -+#: ../addressbook/backends/google/e-book-backend-google.c:822 - msgid "Querying for updated contacts…" - msgstr "Запрос обновлённых контактов…" - - #. Run the query asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:1010 -+#: ../addressbook/backends/google/e-book-backend-google.c:1004 - msgid "Querying for updated groups…" - msgstr "Запрос обновлённых групп…" - --#: ../addressbook/backends/google/e-book-backend-google.c:1757 -+#: ../addressbook/backends/google/e-book-backend-google.c:1751 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4997 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1433 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1434 - msgid "The backend does not support bulk additions" - msgstr "Драйвер не поддерживает общие добавления" - --#: ../addressbook/backends/google/e-book-backend-google.c:1912 -+#: ../addressbook/backends/google/e-book-backend-google.c:1906 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:5133 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1545 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1546 - msgid "The backend does not support bulk modifications" - msgstr "Драйвер не поддерживает общие изменения" - --#: ../addressbook/backends/google/e-book-backend-google.c:2119 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1645 -+#: ../addressbook/backends/google/e-book-backend-google.c:2113 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1646 - msgid "The backend does not support bulk removals" - msgstr "Драйвер не поддерживает общие удаления" - --#: ../addressbook/backends/google/e-book-backend-google.c:2239 -+#: ../addressbook/backends/google/e-book-backend-google.c:2233 - msgid "Loading…" - msgstr "Загрузка…" - -@@ -270,46 +270,46 @@ - msgid "Failed to get the DN for user '%s'" - msgstr "Не удалось получить DN для пользователя «%s»" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:864 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:865 - msgid "Loading Addressbook summary..." - msgstr "Загрузка сводки об адресной книге…" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:884 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:885 - #, c-format - msgid "PROPFIND on webdav failed with HTTP status %d (%s)" - msgstr "Метод PROPFIND завершился с ошибкой с кодом состояния HTTP: %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:903 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:904 - msgid "No response body in webdav PROPFIND result" - msgstr "Тело ответа отсутствует в результатах работы метода webdav PROPFIND" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:964 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:965 - #, c-format - msgid "Loading Contacts (%d%%)" - msgstr "Загрузка контактов (%d%%)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1353 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1354 - msgid "Cannot transform SoupURI to string" - msgstr "Не удалось преобразовать SoupURI в строку" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1474 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1475 - #, c-format - msgid "Create resource '%s' failed with HTTP status %d (%s)" - msgstr "" - "При создании ресурса «%s» произошёл сбой с кодом состояния HTTP: %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1576 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1577 - msgid "Contact on server changed -> not modifying" - msgstr "Контакт на сервере изменён -> нет изменения" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1584 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1585 - #, c-format - msgid "Modify contact failed with HTTP status %d (%s)" - msgstr "" - "При изменении контакта произошла ошибка с кодом состояния HTTP: %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1677 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1693 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1678 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1694 - #, c-format - msgid "DELETE failed with HTTP status %d" - msgstr "Ошибка метода DELETE с кодом HTTP %d" -@@ -913,7 +913,7 @@ - msgid "Twitter Name List" - msgstr "Список имён Twitter" - --#: ../addressbook/libebook-contacts/e-contact.c:1654 -+#: ../addressbook/libebook-contacts/e-contact.c:1660 - #: ../addressbook/libebook/e-destination.c:920 - msgid "Unnamed List" - msgstr "Безымянный список" -@@ -936,7 +936,8 @@ - - #: ../addressbook/libebook-contacts/e-phone-number.c:49 - msgid "" --"Remaining text after the country calling code is too short for a phone number" -+"Remaining text after the country calling code is too short for a phone " -+"number" - msgstr "Текст после кода страны слишком короткий для телефонного номера" - - #: ../addressbook/libebook-contacts/e-phone-number.c:51 -@@ -947,48 +948,48 @@ - msgid "Text is too long for a phone number" - msgstr "Текст слишком длинный для телефонного номера" - --#: ../addressbook/libebook/e-book-client.c:807 -+#: ../addressbook/libebook/e-book-client.c:841 - #, c-format - msgid "Unknown book property '%s'" - msgstr "Неизвестное свойство книги «%s»" - --#: ../addressbook/libebook/e-book-client.c:822 -+#: ../addressbook/libebook/e-book-client.c:856 - #, c-format - msgid "Cannot change value of book property '%s'" - msgstr "Невозможно изменить значение свойства книги «%s»" - --#: ../addressbook/libebook/e-book-client.c:1207 --#: ../addressbook/libebook/e-book-client.c:1382 --#: ../addressbook/libebook/e-book-client.c:1649 --#: ../calendar/libecal/e-cal-client.c:1530 --#: ../calendar/libecal/e-cal-client.c:1712 -+#: ../addressbook/libebook/e-book-client.c:1241 -+#: ../addressbook/libebook/e-book-client.c:1416 -+#: ../addressbook/libebook/e-book-client.c:1683 -+#: ../calendar/libecal/e-cal-client.c:1564 -+#: ../calendar/libecal/e-cal-client.c:1746 - #, c-format - msgid "Unable to connect to '%s': " - msgstr "Не удалось подключиться к «%s»: " - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:899 --#: ../addressbook/libedata-book/e-book-sqlite.c:2178 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:906 -+#: ../addressbook/libedata-book/e-book-sqlite.c:2201 - #, c-format - msgid "Error introspecting unknown summary field '%s'" - msgstr "Ошибка при интроспекции неизвестного поля сводки «%s»" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1509 --#: ../addressbook/libedata-book/e-book-sqlite.c:1334 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1516 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1340 - msgid "Error parsing regular expression" - msgstr "Ошибка разбора регулярного выражения" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1554 --#: ../addressbook/libedata-book/e-book-sqlite.c:1818 ../camel/camel-db.c:545 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1561 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1824 ../camel/camel-db.c:619 - #, c-format - msgid "Insufficient memory" - msgstr "Недостаточно памяти" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1691 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1698 - #, c-format - msgid "Invalid contact field '%d' specified in summary" - msgstr "В сводке указано неверное поле контакта «%d»" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1725 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1732 - #: ../addressbook/libedata-book/e-book-sqlite.c:559 - #, c-format - msgid "" -@@ -998,8 +999,8 @@ - "В сводке указано поле контакта «%s», имеющее тип данных «%s», но " - "поддерживается только логический тип, строковый тип или список строк." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3065 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4161 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3072 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4168 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. vcards cannot be returned." -@@ -1007,19 +1008,19 @@ - "Полные данные search_contact не хранятся в кэше. Невозможно возвратить " - "данные vcards." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4292 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4385 --#: ../addressbook/libedata-book/e-book-sqlite.c:5400 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4299 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4392 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5451 - #, c-format - msgid "Query contained unsupported elements" - msgstr "Запрос содержит неподдерживаемые элементы" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4296 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4303 - #, c-format - msgid "Invalid Query" - msgstr "Некорректный запрос" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4320 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4327 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. Hence only summary query is " -@@ -1028,7 +1029,7 @@ - "Полные данные search_contact не хранятся в кэше. Поэтому поддерживается " - "только запрос для сводки." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4389 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4396 - #: ../addressbook/libedata-book/e-data-book.c:383 - #: ../addressbook/libedata-book/e-data-book.c:1028 - #: ../calendar/libedata-cal/e-data-cal.c:420 -@@ -1037,7 +1038,7 @@ - msgid "Invalid query" - msgstr "Некорректный запрос" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4432 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4439 - #, c-format - msgid "" - "Full vcards are not stored in cache. Hence only summary query is supported." -@@ -1045,36 +1046,36 @@ - "Полные данные vcard не хранятся в кэше. Поэтому поддерживается только запрос " - "для сводки." - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5255 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5262 - #, c-format - msgid "Unable to remove the db file: errno %d" - msgstr "Не удалось удалить файл базы данных: код ошибки %d" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6042 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6442 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6449 - #, c-format - msgid "Only summary queries are supported by EbSdbCursor" - msgstr "EbSdbCursor поддерживает только запросы по сводкам" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6056 - #, c-format - msgid "At least one sort field must be specified to use an EbSdbCursor" - msgstr "" - "Для использования EbSdbCursor должно быть указано по крайней мере одно поле " - "сортировки" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6063 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 - #, c-format - msgid "Cannot sort by a field that is not in the summary" - msgstr "Невозможно отсортировать по полю, которое не является сводкой" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6077 - #, c-format - msgid "Cannot sort by a field which may have multiple values" - msgstr "Невозможно отсортировать по полю, которое имеет несколько значений" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6203 --#: ../addressbook/libedata-book/e-book-sqlite.c:7412 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6210 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7463 - #, c-format - msgid "" - "Tried to step a cursor in reverse, but cursor is already at the beginning of " -@@ -1083,8 +1084,8 @@ - "Попытка перевести курсор на шаг назад, но курсор уже находится в начале " - "списка контактов" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6211 --#: ../addressbook/libedata-book/e-book-sqlite.c:7420 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6218 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7471 - #, c-format - msgid "" - "Tried to step a cursor forwards, but cursor is already at the end of the " -@@ -1098,7 +1099,7 @@ - msgid "Unsupported contact field '%d' specified in summary" - msgstr "В сводке указано неподдерживаемое поле контакта «%d»" - --#: ../addressbook/libedata-book/e-book-sqlite.c:1891 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1897 - msgid "" - "Cannot upgrade contacts database from a legacy database with more than one " - "addressbook. Delete one of the entries in the 'folders' table first." -@@ -1107,22 +1108,22 @@ - "больше одной адресной книги. Сначала удалите одну из записей в таблице " - "«папки»." - --#: ../addressbook/libedata-book/e-book-sqlite.c:5393 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5444 - #, c-format - msgid "Invalid query: %s" - msgstr "Недопустимый запрос: %s" - --#: ../addressbook/libedata-book/e-book-sqlite.c:5568 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5619 - msgid "Invalid query for EbSqlCursor" - msgstr "Недопустимый запрос для EbSqlCursor" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7234 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7285 - msgid "At least one sort field must be specified to use an EbSqlCursor" - msgstr "" - "Для использования EbSqlCursor должно быть указано по крайней мере одно поле " - "сортировки" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7252 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7303 - msgid "Cannot sort by a field that is not a string type" - msgstr "Невозможно отсортировать по полю, которое имеет нестроковый тип" - -@@ -1288,15 +1289,15 @@ - msgid "Cannot remove contacts: " - msgstr "Невозможно удалить контакты: " - --#: ../addressbook/libedata-book/e-data-book-cursor.c:772 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:776 - msgid "Cursor does not support setting the search expression" - msgstr "Курсор не поддерживает установку поискового выражения" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:855 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:859 - msgid "Cursor does not support step" - msgstr "Курсор не поддерживает шаг" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:938 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:942 - msgid "Cursor does not support alphabetic indexes" - msgstr "Курсор не поддерживает алфавитные индексы" - -@@ -1330,35 +1331,35 @@ - msgid "No such source for UID '%s'" - msgstr "Нет такого источника для UID «%s»" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:581 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 - #, c-format - msgid "Server is unreachable (%s)" - msgstr "Сервер недоступен (%s)" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:612 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 - #, c-format - msgid "Failed to connect to a server using SSL: %s" - msgstr "Сбой при подключении к серверу с использованием SSL: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:623 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 - #, c-format --msgid "Unexpected HTTP status code %d returned (%s)" --msgstr "Получен неожиданный код (%d) состояния HTTP (%s)" -+msgid "Unexpected HTTP status code %d returned (%s) for URI: %s" -+msgstr "Получен неожиданный код состояния HTTP %d (%s) для URI: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:642 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:647 - msgid "CalDAV backend is not loaded yet" - msgstr "Драйвер CalDAV ещё не загружен" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1084 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1091 - msgid "Invalid Redirect URL" - msgstr "Неверный перенаправляющий URL" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2887 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2894 - #, c-format - msgid "Cannot create local cache folder '%s'" - msgstr "Не удалось создать локальную кэш-папку «%s»" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2939 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2946 - #, c-format - msgid "" - "Server is unreachable, calendar is opened in read-only mode.\n" -@@ -1367,27 +1368,27 @@ - "Сервер недоступен, календарь открыт в режиме «только чтение».\n" - "Сообщение об ошибке: %s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3973 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3988 - msgid "CalDAV does not support bulk additions" - msgstr "CalDAV не поддерживает пакетные добавления" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4076 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4091 - msgid "CalDAV does not support bulk modifications" - msgstr "CalDAV не поддерживает пакетные изменения" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4252 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4267 - msgid "CalDAV does not support bulk removals" - msgstr "CalDAV не поддерживает пакетные удаления" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4919 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4941 - msgid "Calendar doesn't support Free/Busy" - msgstr "Календарь не поддерживает информацию о занятости" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4928 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4950 - msgid "Schedule outbox url not found" - msgstr "Не найден url исходящего расписания" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5025 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5047 - msgid "Unexpected result in schedule-response" - msgstr "Неожиданный результат в ответе-расписании" - -@@ -1435,74 +1436,75 @@ - msgstr "Не является календарём." - - #: ../calendar/backends/http/e-cal-backend-http.c:925 --#: ../calendar/backends/weather/e-cal-backend-weather.c:536 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:700 - msgid "Could not create cache file" - msgstr "Не удалось создать файл кэша" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:174 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:196 - msgid "Could not retrieve weather data" - msgstr "Не удалось получить информацию о погоде" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:295 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:369 - msgid "Weather: Fog" - msgstr "Погода: Туман" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:296 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:370 - msgid "Weather: Cloudy Night" - msgstr "Погода: Облачная ночь" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:297 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:371 - msgid "Weather: Cloudy" - msgstr "Погода: Облачно" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:298 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:372 - msgid "Weather: Overcast" - msgstr "Погода: Пасмурно" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:299 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:373 - msgid "Weather: Showers" - msgstr "Погода: Дожди" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:300 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:374 - msgid "Weather: Snow" - msgstr "Погода: Снег" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:301 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:375 - msgid "Weather: Clear Night" - msgstr "Погода: Ясная ночь" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:302 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:376 - msgid "Weather: Sunny" - msgstr "Погода: Солнечно" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:303 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:377 - msgid "Weather: Thunderstorms" - msgstr "Погода: Грозы" - - #. TRANSLATOR: This is the temperature in degrees Fahrenheit (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:329 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:403 - #, c-format - msgid "%.1f °F" - msgstr "%.1f °F" - - #. TRANSLATOR: This is the temperature in degrees Celsius (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:332 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:406 - #, c-format - msgid "%.1f °C" - msgstr "%.1f °C" - - #. TRANSLATOR: This is the temperature in kelvin --#: ../calendar/backends/weather/e-cal-backend-weather.c:335 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:409 - #, c-format - msgid "%.1f K" - msgstr "%.1f K" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:341 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:415 - #, c-format - msgid "%.1f" - msgstr "%.1f" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:452 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:580 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:608 - msgid "Forecast" - msgstr "Прогноз" - -@@ -1558,7 +1560,7 @@ - msgstr "Сбой проверки подлинности" - - #: ../calendar/libecal/e-cal.c:2330 --#: ../camel/providers/smtp/camel-smtp-transport.c:921 -+#: ../camel/providers/smtp/camel-smtp-transport.c:960 - #: ../libedataserver/e-client.c:147 - msgid "Authentication required" - msgstr "Требуется аутентификация" -@@ -1581,17 +1583,17 @@ - msgid "Invalid range" - msgstr "Недопустимый диапазон" - --#: ../calendar/libecal/e-cal-client.c:936 -+#: ../calendar/libecal/e-cal-client.c:970 - #, c-format - msgid "Unknown calendar property '%s'" - msgstr "Неизвестное свойство календаря «%s»" - --#: ../calendar/libecal/e-cal-client.c:951 -+#: ../calendar/libecal/e-cal-client.c:985 - #, c-format - msgid "Cannot change value of calendar property '%s'" - msgstr "Невозможно изменить значение свойства календаря «%s»" - --#: ../calendar/libecal/e-cal-component.c:1348 -+#: ../calendar/libecal/e-cal-component.c:1349 - msgid "Untitled appointment" - msgstr "Неозаглавленная встреча" - -@@ -1740,83 +1742,83 @@ - msgid "Undefined" - msgstr "Неопределённый" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:84 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1062 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1371 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1498 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1547 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:85 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1063 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1379 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1506 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1555 - #, c-format - msgid "\"%s\" expects one argument" - msgstr "«%s» предполагает один аргумент" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:91 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:673 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1378 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:92 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:674 - #: ../calendar/libedata-cal/e-cal-backend-sexp.c:1386 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1394 - #, c-format - msgid "\"%s\" expects the first argument to be a string" - msgstr "«%s» предполагает строку в качестве аргумента 1" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:166 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:167 - #, c-format - msgid "\"%s\" expects two or three arguments" - msgstr "«%s» предполагает два или три аргумента" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:173 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:262 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:324 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:823 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1069 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1447 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1505 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1554 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:174 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:263 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:325 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:824 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1070 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1455 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1513 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1562 - #, c-format - msgid "\"%s\" expects the first argument to be a time_t" - msgstr "«%s» предполагает тип time_t в качестве аргумента 1" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:182 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:270 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:334 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:832 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:183 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:271 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:335 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:833 - #, c-format - msgid "\"%s\" expects the second argument to be a time_t" - msgstr "«%s» предполагает тип time_t в качестве аргумента 1" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:192 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:193 - #, c-format - msgid "\"%s\" expects the third argument to be a string" - msgstr "«%s» предполагает строку в качестве третьего аргумента" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:254 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:255 - #, c-format - msgid "\"%s\" expects none or two arguments" - msgstr "«%s» предполагает два аргумента или ни одного" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:317 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:666 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:816 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1440 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:318 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:667 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:817 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1448 - #, c-format - msgid "\"%s\" expects two arguments" - msgstr "«%s» предполагает два аргумента" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:602 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:625 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:748 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:780 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:987 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1020 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1332 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:603 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:626 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:749 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:781 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:988 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1021 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1340 - #, c-format - msgid "\"%s\" expects no arguments" - msgstr "«%s» не предполагает аргументов" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:682 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:683 - #, c-format - msgid "\"%s\" expects the second argument to be a string" - msgstr "«%s» предполагает строку в качестве аргумента 2" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:713 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:714 - #, c-format - msgid "" - "\"%s\" expects the first argument to be either \"any\", \"summary\", or " -@@ -1826,12 +1828,12 @@ - "«%s» предполагает одно из «any», «summary», «description», «location», " - "«attendee», «organizer» или «classification» в качестве аргумента 1" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:884 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:885 - #, c-format - msgid "\"%s\" expects at least one argument" - msgstr "«%s» предполагает по крайней мере 1 аргумент" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:899 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:900 - #, c-format - msgid "" - "\"%s\" expects all arguments to be strings or one and only one argument to " -@@ -1840,14 +1842,14 @@ - "«%s» предполагает, что все аргументы - строки или единственный аргумент - " - "логическая ложь (#f)" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1395 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1403 - #, c-format - msgid "\"%s\" expects the first argument to be an ISO 8601 date/time string" - msgstr "" - "«%s» предусматривает, что аргумент 1 должен быть строкой даты в формате ISO " - "8601" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1456 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1464 - #, c-format - msgid "\"%s\" expects the second argument to be an integer" - msgstr "«%s» предполагает целое число в качестве аргумента 2" -@@ -2094,36 +2096,36 @@ - msgstr[1] "Фильтрация новых сообщений в «%s»" - msgstr[2] "Фильтрация новых сообщений в «%s»" - --#: ../camel/camel-folder.c:1011 -+#: ../camel/camel-folder.c:1017 - #: ../camel/providers/local/camel-maildir-folder.c:330 - msgid "Moving messages" - msgstr "Перемещение сообщений" - --#: ../camel/camel-folder.c:1014 -+#: ../camel/camel-folder.c:1020 - msgid "Copying messages" - msgstr "Копирование сообщений" - --#: ../camel/camel-folder.c:1056 -+#: ../camel/camel-folder.c:1062 - #, c-format - msgid "Quota information not supported for folder '%s'" - msgstr "Информация о квоте не поддерживается для папки «%s»" - --#: ../camel/camel-folder.c:2862 -+#: ../camel/camel-folder.c:2868 - #, c-format - msgid "Expunging folder '%s'" - msgstr "Уничтожение папки «%s»" - --#: ../camel/camel-folder.c:2990 -+#: ../camel/camel-folder.c:2996 - #, c-format - msgid "Retrieving message '%s' in %s" - msgstr "Получение сообщения «%s» в %s" - --#: ../camel/camel-folder.c:3181 -+#: ../camel/camel-folder.c:3187 - #, c-format - msgid "Retrieving quota information for '%s'" - msgstr "Получение информации о квоте для «%s»" - --#: ../camel/camel-folder.c:3478 -+#: ../camel/camel-folder.c:3484 - #, c-format - msgid "Refreshing folder '%s'" - msgstr "Обновление папки «%s»" -@@ -2160,76 +2162,67 @@ - - #: ../camel/camel-folder-search.c:1943 ../camel/camel-folder-search.c:2109 - #, c-format --msgid "" --"Cannot parse search expression: %s:\n" -+msgid "Cannot parse search expression: %s:\n" - "%s" --msgstr "" --"Ошибка в регулярном выражении «%s»:\n" -+msgstr "Ошибка в регулярном выражении «%s»:\n" - "%s" - - #: ../camel/camel-folder-search.c:1955 ../camel/camel-folder-search.c:2121 - #, c-format --msgid "" --"Error executing search expression: %s:\n" -+msgid "Error executing search expression: %s:\n" - "%s" --msgstr "" --"Ошибка при выполнении выражения поиска «%s»:\n" -+msgstr "Ошибка при выполнении выражения поиска «%s»:\n" - "%s" - --#: ../camel/camel-gpg-context.c:721 ../camel/camel-gpg-context.c:726 --#: ../camel/camel-gpg-context.c:1383 -+#: ../camel/camel-gpg-context.c:725 ../camel/camel-gpg-context.c:730 -+#: ../camel/camel-gpg-context.c:1387 - #, c-format - msgid "Failed to execute gpg: %s" - msgstr "Сбой при исполнении gpg: %s" - --#: ../camel/camel-gpg-context.c:726 --#: ../camel/providers/smtp/camel-smtp-transport.c:924 -+#: ../camel/camel-gpg-context.c:730 -+#: ../camel/providers/smtp/camel-smtp-transport.c:963 - msgid "Unknown" - msgstr "Неизвестно" - --#: ../camel/camel-gpg-context.c:791 -+#: ../camel/camel-gpg-context.c:795 - #, c-format --msgid "" --"Unexpected GnuPG status message encountered:\n" -+msgid "Unexpected GnuPG status message encountered:\n" - "\n" - "%s" --msgstr "" --"Встречено неожиданное сообщение о состоянии GnuPG:\n" -+msgstr "Встречено неожиданное сообщение о состоянии GnuPG:\n" - "\n" - "%s" - --#: ../camel/camel-gpg-context.c:827 -+#: ../camel/camel-gpg-context.c:831 - #, c-format - msgid "Failed to parse gpg userid hint." - msgstr "Ошибка при обработке подсказки gpg userid." - --#: ../camel/camel-gpg-context.c:852 ../camel/camel-gpg-context.c:867 -+#: ../camel/camel-gpg-context.c:856 ../camel/camel-gpg-context.c:871 - #, c-format - msgid "Failed to parse gpg passphrase request." - msgstr "Ошибка при обработке запроса парольной фразы gpg." - --#: ../camel/camel-gpg-context.c:888 -+#: ../camel/camel-gpg-context.c:892 - #, c-format --msgid "" --"You need a PIN to unlock the key for your\n" -+msgid "You need a PIN to unlock the key for your\n" - "SmartCard: \"%s\"" - msgstr "Для разблокирования смарткарты необходимо ввести PIN: «%s»" - --#: ../camel/camel-gpg-context.c:892 -+#: ../camel/camel-gpg-context.c:896 - #, c-format --msgid "" --"You need a passphrase to unlock the key for\n" -+msgid "You need a passphrase to unlock the key for\n" - "user: \"%s\"" --msgstr "" --"Введите ключевую фразу, чтобы разблокировать\n" -+msgstr "Введите ключевую фразу, чтобы разблокировать\n" - "ключ пользователя: «%s»" - --#: ../camel/camel-gpg-context.c:898 -+#: ../camel/camel-gpg-context.c:902 - #, c-format - msgid "Unexpected request from GnuPG for '%s'" - msgstr "Неожиданный запрос от GnuPG для «%s»" - --#: ../camel/camel-gpg-context.c:910 -+#: ../camel/camel-gpg-context.c:914 - msgid "" - "Note the encrypted content doesn't contain information about a recipient, " - "thus there will be a password prompt for each of stored private key." -@@ -2237,72 +2230,72 @@ - "Зашифрованные данные не содержат сведений о получателе. Для каждого " - "закрытого ключа будет предложено ввести пароль." - --#: ../camel/camel-gpg-context.c:941 ../camel/camel-net-utils.c:524 -+#: ../camel/camel-gpg-context.c:945 ../camel/camel-net-utils.c:524 - #: ../camel/providers/nntp/camel-nntp-summary.c:401 - #: ../libedataserver/e-client.c:158 - #, c-format - msgid "Cancelled" - msgstr "Отменено" - --#: ../camel/camel-gpg-context.c:962 -+#: ../camel/camel-gpg-context.c:966 - #, c-format - msgid "Failed to unlock secret key: 3 bad passphrases given." - msgstr "" - "Сбой при разблокировании секретного ключа: указано 3 некорректных парольных " - "фразы." - --#: ../camel/camel-gpg-context.c:975 -+#: ../camel/camel-gpg-context.c:979 - #, c-format - msgid "Unexpected response from GnuPG: %s" - msgstr "Неожиданный ответ от GnuPG: %s" - --#: ../camel/camel-gpg-context.c:1106 -+#: ../camel/camel-gpg-context.c:1110 - #, c-format - msgid "Failed to encrypt: No valid recipients specified." - msgstr "" - "Не удалось зашифровать это сообщение: Не определены корректные получатели" - --#: ../camel/camel-gpg-context.c:1658 ../camel/camel-smime-context.c:844 -+#: ../camel/camel-gpg-context.c:1662 ../camel/camel-smime-context.c:844 - msgid "Could not generate signing data: " - msgstr "Не удалось создать данные подписи: " - --#: ../camel/camel-gpg-context.c:1708 ../camel/camel-gpg-context.c:1920 --#: ../camel/camel-gpg-context.c:2030 ../camel/camel-gpg-context.c:2179 -+#: ../camel/camel-gpg-context.c:1712 ../camel/camel-gpg-context.c:1924 -+#: ../camel/camel-gpg-context.c:2034 ../camel/camel-gpg-context.c:2183 - msgid "Failed to execute gpg." - msgstr "Сбой при исполнении gpg." - --#: ../camel/camel-gpg-context.c:1791 ../camel/camel-gpg-context.c:1799 --#: ../camel/camel-gpg-context.c:1807 ../camel/camel-gpg-context.c:1827 -+#: ../camel/camel-gpg-context.c:1795 ../camel/camel-gpg-context.c:1803 -+#: ../camel/camel-gpg-context.c:1811 ../camel/camel-gpg-context.c:1831 - #: ../camel/camel-smime-context.c:973 ../camel/camel-smime-context.c:987 - #: ../camel/camel-smime-context.c:996 - #, c-format - msgid "Cannot verify message signature: Incorrect message format" - msgstr "Не удалось проверить подпись сообщения: Неверный формат сообщения" - --#: ../camel/camel-gpg-context.c:1873 -+#: ../camel/camel-gpg-context.c:1877 - msgid "Cannot verify message signature: " - msgstr "Не удалось проверить подпись сообщения: " - --#: ../camel/camel-gpg-context.c:1996 -+#: ../camel/camel-gpg-context.c:2000 - msgid "Could not generate encrypting data: " - msgstr "Не удалось создать данные шифрования: " - --#: ../camel/camel-gpg-context.c:2049 -+#: ../camel/camel-gpg-context.c:2053 - msgid "This is a digitally encrypted message part" - msgstr "Это зашифрованная часть сообщения" - --#: ../camel/camel-gpg-context.c:2105 ../camel/camel-gpg-context.c:2114 --#: ../camel/camel-gpg-context.c:2137 -+#: ../camel/camel-gpg-context.c:2109 ../camel/camel-gpg-context.c:2118 -+#: ../camel/camel-gpg-context.c:2141 - #, c-format - msgid "Cannot decrypt message: Incorrect message format" - msgstr "Не удалось декодировать сообщение: Неверный формат сообщения" - --#: ../camel/camel-gpg-context.c:2125 -+#: ../camel/camel-gpg-context.c:2129 - #, c-format - msgid "Failed to decrypt MIME part: protocol error" - msgstr "Сбой при декодировании части MIME: ошибка протокола" - --#: ../camel/camel-gpg-context.c:2220 ../camel/camel-smime-context.c:1289 -+#: ../camel/camel-gpg-context.c:2224 ../camel/camel-smime-context.c:1289 - msgid "Encrypted content" - msgstr "Зашифрованное содержимое" - -@@ -2497,29 +2490,23 @@ - - #: ../camel/camel-sasl-anonymous.c:79 - #, c-format --msgid "" --"Invalid email address trace information:\n" -+msgid "Invalid email address trace information:\n" - "%s" --msgstr "" --"Неверная трассировочная информация эл.адреса:\n" -+msgstr "Неверная трассировочная информация эл.адреса:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:93 - #, c-format --msgid "" --"Invalid opaque trace information:\n" -+msgid "Invalid opaque trace information:\n" - "%s" --msgstr "" --"Неверная скрытая трассировочная информация:\n" -+msgstr "Неверная скрытая трассировочная информация:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:107 - #, c-format --msgid "" --"Invalid trace information:\n" -+msgid "Invalid trace information:\n" - "%s" --msgstr "" --"Неверная трассировочная информация:\n" -+msgstr "Неверная трассировочная информация:\n" - "%s" - - #: ../camel/camel-sasl-cram-md5.c:44 -@@ -2581,8 +2568,10 @@ - msgstr "GSSAPI" - - #: ../camel/camel-sasl-gssapi.c:97 --msgid "This option will connect to the server using Kerberos 5 authentication." --msgstr "Подключение к серверу будет производиться с использованием Kerberos 5." -+msgid "" -+"This option will connect to the server using Kerberos 5 authentication." -+msgstr "" -+"Подключение к серверу будет производиться с использованием Kerberos 5." - - #: ../camel/camel-sasl-gssapi.c:149 - #, c-format -@@ -2652,7 +2641,7 @@ - - #: ../camel/camel-sasl-gssapi.c:223 ../camel/camel-sasl-gssapi.c:405 - #: ../camel/camel-sasl-gssapi.c:454 ../camel/camel-sasl-gssapi.c:471 --#: ../camel/providers/smtp/camel-smtp-transport.c:622 -+#: ../camel/providers/smtp/camel-smtp-transport.c:659 - #, c-format - msgid "Bad authentication response from server." - msgstr "Неверный ответ от сервера при идентификации." -@@ -2726,10 +2715,10 @@ - msgstr "Некорректный зарегистрированный GType для протокола «%s»" - - #: ../camel/camel-session.c:502 --#: ../camel/providers/imapx/camel-imapx-server.c:4734 -+#: ../camel/providers/imapx/camel-imapx-server.c:4821 - #: ../camel/providers/pop3/camel-pop3-store.c:311 --#: ../camel/providers/pop3/camel-pop3-store.c:757 --#: ../camel/providers/smtp/camel-smtp-transport.c:515 -+#: ../camel/providers/pop3/camel-pop3-store.c:766 -+#: ../camel/providers/smtp/camel-smtp-transport.c:545 - #, c-format - msgid "No support for %s authentication" - msgstr "Аутентификация %s не поддерживается" -@@ -2934,49 +2923,53 @@ - msgid "S/MIME Decrypt: No encrypted content found" - msgstr "S/MIME Decrypt: Не найдено зашифрованного содержимого" - --#: ../camel/camel-store.c:1232 -+#: ../camel/camel-store.c:1238 - #, c-format - msgid "Opening folder '%s'" - msgstr "Открытие папки «%s»" - --#: ../camel/camel-store.c:1523 -+#: ../camel/camel-store.c:1529 - #, c-format - msgid "Scanning folders in '%s'" - msgstr "Сканирование папок на «%s»" - --#: ../camel/camel-store.c:1551 ../camel/camel-store.c:1596 -+#: ../camel/camel-store.c:1557 ../camel/camel-store.c:1602 - #: ../camel/camel-vtrash-folder.c:46 - msgid "Trash" - msgstr "Корзина" - --#: ../camel/camel-store.c:1565 ../camel/camel-store.c:1613 -+#: ../camel/camel-store.c:1571 ../camel/camel-store.c:1619 - #: ../camel/camel-vtrash-folder.c:48 - msgid "Junk" - msgstr "Спам" - --#: ../camel/camel-store.c:2214 -+#: ../camel/camel-store.c:2220 - #, c-format - msgid "Cannot create folder: %s: folder exists" - msgstr "Не удалось создать папку: %s: папка существует" - --#: ../camel/camel-store.c:2221 -+#: ../camel/camel-store.c:2227 - #, c-format - msgid "Creating folder '%s'" - msgstr "Создание папки «%s»" - --#: ../camel/camel-store.c:2398 ../camel/camel-vee-store.c:410 --#: ../camel/providers/local/camel-maildir-store.c:321 -+#: ../camel/camel-store.c:2404 ../camel/camel-vee-store.c:410 -+#: ../camel/providers/local/camel-maildir-store.c:346 - #, c-format - msgid "Cannot delete folder: %s: Invalid operation" - msgstr "Не удалось удалить папку: %s: недопустимая операция" - --#: ../camel/camel-store.c:2588 ../camel/camel-vee-store.c:461 --#: ../camel/providers/local/camel-maildir-store.c:872 -+#: ../camel/camel-store.c:2594 ../camel/camel-vee-store.c:461 -+#: ../camel/providers/local/camel-maildir-store.c:914 - #, c-format - msgid "Cannot rename folder: %s: Invalid operation" - msgstr "Не удалось переименовать папку: %s: недопустимая операция" - --#: ../camel/camel-stream.c:285 ../camel/camel-stream.c:336 -+#: ../camel/camel-stream.c:170 -+msgid "Cannot write with no base stream" -+msgstr "Запись невозможна в силу отсутствия основного потока" -+ -+#: ../camel/camel-stream.c:290 ../camel/camel-stream.c:341 - #, c-format - msgid "Stream type '%s' is not seekable" - msgstr "Потоковый тип «%s» не позволяет перемещаться по потоку" -@@ -3204,227 +3197,227 @@ - msgid "For reading and storing mail on IMAP servers." - msgstr "Для чтения и хранения почты на серверах IMAP." - --#: ../camel/providers/imapx/camel-imapx-server.c:1009 - #: ../camel/providers/imapx/camel-imapx-server.c:1016 -+#: ../camel/providers/imapx/camel-imapx-server.c:1023 - #, c-format - msgid "Not authenticated" - msgstr "Не удалось выполнить аутентификацию" - --#: ../camel/providers/imapx/camel-imapx-server.c:1713 -+#: ../camel/providers/imapx/camel-imapx-server.c:1751 - msgid "Server disconnected" - msgstr "Сервер отключился" - --#: ../camel/providers/imapx/camel-imapx-server.c:2205 -+#: ../camel/providers/imapx/camel-imapx-server.c:2252 - msgid "Error writing to cache stream" - msgstr "Ошибка записи в поток кэша" - --#: ../camel/providers/imapx/camel-imapx-server.c:3565 -+#: ../camel/providers/imapx/camel-imapx-server.c:3640 - msgid "Error performing IDLE" - msgstr "Ошибка выполнения команды IDLE" - --#: ../camel/providers/imapx/camel-imapx-server.c:4573 -+#: ../camel/providers/imapx/camel-imapx-server.c:4660 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: %s" - msgstr "Не удалось подключиться к IMAP-серверу %s в защищённом режиме:%s" - --#: ../camel/providers/imapx/camel-imapx-server.c:4574 --#: ../camel/providers/smtp/camel-smtp-transport.c:215 -+#: ../camel/providers/imapx/camel-imapx-server.c:4661 -+#: ../camel/providers/smtp/camel-smtp-transport.c:216 - msgid "STARTTLS not supported" - msgstr "STARTTLS не поддерживается" - --#: ../camel/providers/imapx/camel-imapx-server.c:4634 -+#: ../camel/providers/imapx/camel-imapx-server.c:4721 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: " - msgstr "Не удалось подключиться к IMAP-серверу %s в защищённом режиме: " - --#: ../camel/providers/imapx/camel-imapx-server.c:4723 -+#: ../camel/providers/imapx/camel-imapx-server.c:4810 - #, c-format - msgid "IMAP server %s does not support %s authentication" - msgstr "Сервер IMAP %s не поддерживает аутентификацию %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:4753 -+#: ../camel/providers/imapx/camel-imapx-server.c:4840 - #: ../camel/providers/nntp/camel-nntp-store.c:394 - #: ../camel/providers/nntp/camel-nntp-store.c:531 - msgid "Cannot authenticate without a username" - msgstr "Невозможно выполнить проверку подлинности без имени пользователя" - --#: ../camel/providers/imapx/camel-imapx-server.c:4762 -+#: ../camel/providers/imapx/camel-imapx-server.c:4849 - #: ../camel/providers/nntp/camel-nntp-store.c:540 - #: ../camel/providers/pop3/camel-pop3-store.c:678 --#: ../camel/providers/pop3/camel-pop3-store.c:699 -+#: ../camel/providers/pop3/camel-pop3-store.c:708 - msgid "Authentication password not available" - msgstr "Пароль аутентификации недоступен" - --#: ../camel/providers/imapx/camel-imapx-server.c:4998 --#: ../camel/providers/imapx/camel-imapx-server.c:5057 -+#: ../camel/providers/imapx/camel-imapx-server.c:5085 -+#: ../camel/providers/imapx/camel-imapx-server.c:5144 - msgid "Error fetching message" - msgstr "Ошибка при получении сообщения" - --#: ../camel/providers/imapx/camel-imapx-server.c:5050 -+#: ../camel/providers/imapx/camel-imapx-server.c:5137 - msgid "Failed to close the tmp stream" - msgstr "Сбой при закрытии временного потока" - --#: ../camel/providers/imapx/camel-imapx-server.c:5086 -+#: ../camel/providers/imapx/camel-imapx-server.c:5173 - msgid "Failed to copy the tmp file" - msgstr "Сбой при копировании временного файла" - --#: ../camel/providers/imapx/camel-imapx-server.c:5227 -+#: ../camel/providers/imapx/camel-imapx-server.c:5345 - msgid "Error moving messages" - msgstr "Ошибка при перемещении сообщений" - --#: ../camel/providers/imapx/camel-imapx-server.c:5231 -+#: ../camel/providers/imapx/camel-imapx-server.c:5349 - msgid "Error copying messages" - msgstr "Ошибка при копировании сообщений" - --#: ../camel/providers/imapx/camel-imapx-server.c:5453 -+#: ../camel/providers/imapx/camel-imapx-server.c:5579 - msgid "Error appending message" - msgstr "Ошибка при присоединении сообщения" - --#: ../camel/providers/imapx/camel-imapx-server.c:5689 -+#: ../camel/providers/imapx/camel-imapx-server.c:5815 - msgid "Error fetching message headers" - msgstr "Ошибка при получении заголовков сообщений" - --#: ../camel/providers/imapx/camel-imapx-server.c:5856 -+#: ../camel/providers/imapx/camel-imapx-server.c:5982 - msgid "Error retrieving message" - msgstr "Ошибка при получении сообщения" - --#: ../camel/providers/imapx/camel-imapx-server.c:5990 --#: ../camel/providers/imapx/camel-imapx-server.c:6219 -+#: ../camel/providers/imapx/camel-imapx-server.c:6116 -+#: ../camel/providers/imapx/camel-imapx-server.c:6345 - #, c-format - msgid "Fetching summary information for new messages in '%s'" - msgstr "Получение краткой информации о новых сообщениях «%s»" - --#: ../camel/providers/imapx/camel-imapx-server.c:6042 -+#: ../camel/providers/imapx/camel-imapx-server.c:6168 - #, c-format - msgid "Scanning for changed messages in '%s'" - msgstr "Поиск изменённых сообщений в «%s»" - --#: ../camel/providers/imapx/camel-imapx-server.c:6094 -+#: ../camel/providers/imapx/camel-imapx-server.c:6220 - msgid "Error fetching new messages" - msgstr "Ошибка при получении новых сообщений" - --#: ../camel/providers/imapx/camel-imapx-server.c:6367 -+#: ../camel/providers/imapx/camel-imapx-server.c:6493 - msgid "Error refreshing folder" - msgstr "Ошибка при обновлении папки" - --#: ../camel/providers/imapx/camel-imapx-server.c:6517 -+#: ../camel/providers/imapx/camel-imapx-server.c:6643 - msgid "Error expunging message" - msgstr "Ошибка уничтожения сообщений" - --#: ../camel/providers/imapx/camel-imapx-server.c:6632 --#: ../camel/providers/imapx/camel-imapx-server.c:6657 -+#: ../camel/providers/imapx/camel-imapx-server.c:6758 -+#: ../camel/providers/imapx/camel-imapx-server.c:6783 - msgid "Error fetching folders" - msgstr "Ошибка при получении папок" - --#: ../camel/providers/imapx/camel-imapx-server.c:6737 -+#: ../camel/providers/imapx/camel-imapx-server.c:6863 - msgid "Error creating folder" - msgstr "Ошибка при создании папки" - --#: ../camel/providers/imapx/camel-imapx-server.c:6789 -+#: ../camel/providers/imapx/camel-imapx-server.c:6915 - msgid "Error deleting folder" - msgstr "Ошибка при удалении папки" - --#: ../camel/providers/imapx/camel-imapx-server.c:6865 -+#: ../camel/providers/imapx/camel-imapx-server.c:6991 - msgid "Error renaming folder" - msgstr "Ошибка при переименовании папки" - --#: ../camel/providers/imapx/camel-imapx-server.c:6939 -+#: ../camel/providers/imapx/camel-imapx-server.c:7065 - msgid "Error subscribing to folder" - msgstr "Ошибка подписывания на папку" - --#: ../camel/providers/imapx/camel-imapx-server.c:7005 -+#: ../camel/providers/imapx/camel-imapx-server.c:7131 - msgid "Error unsubscribing from folder" - msgstr "Ошибка отписывания от папки" - --#: ../camel/providers/imapx/camel-imapx-server.c:7067 -+#: ../camel/providers/imapx/camel-imapx-server.c:7193 - msgid "Error retrieving quota information" - msgstr "Ошибка получения информации о квоте" - --#: ../camel/providers/imapx/camel-imapx-server.c:7119 -+#: ../camel/providers/imapx/camel-imapx-server.c:7245 - msgid "Search failed" - msgstr "Ошибка поиска" - --#: ../camel/providers/imapx/camel-imapx-server.c:7181 -+#: ../camel/providers/imapx/camel-imapx-server.c:7307 - msgid "Error performing NOOP" - msgstr "Ошибка выполнения команды NOOP" - --#: ../camel/providers/imapx/camel-imapx-server.c:7288 -+#: ../camel/providers/imapx/camel-imapx-server.c:7414 - msgid "Error syncing changes" - msgstr "Ошибка при синхронизации изменений" - --#: ../camel/providers/imapx/camel-imapx-server.c:8275 -+#: ../camel/providers/imapx/camel-imapx-server.c:8446 - #, c-format - msgid "Cannot get message with message ID %s: %s" - msgstr "Не удалось получить сообщение с идентификатором %s: %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:8276 -+#: ../camel/providers/imapx/camel-imapx-server.c:8447 - msgid "No such message available." - msgstr "Нет такого сообщения." - --#: ../camel/providers/imapx/camel-imapx-server.c:8483 --#: ../camel/providers/imapx/camel-imapx-server.c:8504 -+#: ../camel/providers/imapx/camel-imapx-server.c:8671 -+#: ../camel/providers/imapx/camel-imapx-server.c:8692 - msgid "Cannot create spool file: " - msgstr "Не удалось создать файл спула: " - --#: ../camel/providers/imapx/camel-imapx-server.c:9256 -+#: ../camel/providers/imapx/camel-imapx-server.c:9502 - msgid "IMAP server does not support quotas" - msgstr "Сервер IMAP не поддерживает квоты" - - #. create a dummy "." parent inbox, use to scan, then put back at the top level - #: ../camel/providers/imapx/camel-imapx-store.c:223 - #: ../camel/providers/local/camel-maildir-folder.c:482 --#: ../camel/providers/local/camel-maildir-store.c:322 --#: ../camel/providers/local/camel-maildir-store.c:784 --#: ../camel/providers/local/camel-maildir-store.c:790 --#: ../camel/providers/local/camel-maildir-store.c:873 -+#: ../camel/providers/local/camel-maildir-store.c:347 -+#: ../camel/providers/local/camel-maildir-store.c:826 -+#: ../camel/providers/local/camel-maildir-store.c:832 -+#: ../camel/providers/local/camel-maildir-store.c:915 - #: ../camel/providers/local/camel-spool-store.c:393 - msgid "Inbox" - msgstr "Входящие" - --#: ../camel/providers/imapx/camel-imapx-store.c:758 -+#: ../camel/providers/imapx/camel-imapx-store.c:757 - #, c-format - msgid "IMAP server %s" - msgstr "Сервер IMAP %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:761 -+#: ../camel/providers/imapx/camel-imapx-store.c:760 - #, c-format - msgid "IMAP service for %s on %s" - msgstr "Сервис IMAP для %s на %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:836 -+#: ../camel/providers/imapx/camel-imapx-store.c:835 - #: ../camel/providers/nntp/camel-nntp-provider.c:93 - #: ../camel/providers/pop3/camel-pop3-provider.c:81 - msgid "Password" - msgstr "Пароль" - --#: ../camel/providers/imapx/camel-imapx-store.c:838 --msgid "This option will connect to the IMAP server using a plaintext password." -+#: ../camel/providers/imapx/camel-imapx-store.c:837 -+msgid "" -+"This option will connect to the IMAP server using a plaintext password." - msgstr "" - "Подключение к серверу IMAP будет производиться с использованием " - "незашифрованного пароля." - --#: ../camel/providers/imapx/camel-imapx-store.c:913 -+#: ../camel/providers/imapx/camel-imapx-store.c:916 - #, c-format - msgid "No such folder %s" - msgstr "Нет папки с именем %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:1324 -+#: ../camel/providers/imapx/camel-imapx-store.c:1344 - #, c-format - msgid "No IMAP namespace for folder path '%s'" - msgstr "Нет пространства имён IMAP для папки с путём «%s»" - --#: ../camel/providers/imapx/camel-imapx-store.c:1472 -+#: ../camel/providers/imapx/camel-imapx-store.c:1609 - #, c-format - msgid "Retrieving folder list for %s" - msgstr "Получение списка папок для %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:1924 -+#: ../camel/providers/imapx/camel-imapx-store.c:2061 - #, c-format --msgid "" --"The folder name \"%s\" is invalid because it contains the character \"%c\"" -+msgid "The folder name \"%s\" is invalid because it contains the character \"%c\"" - msgstr "Недопустимое имя папки «%s»: имя содержит символ «%c»" - --#: ../camel/providers/imapx/camel-imapx-store.c:2689 -+#: ../camel/providers/imapx/camel-imapx-store.c:2833 - #: ../camel/providers/nntp/camel-nntp-store.c:1250 - #: ../camel/providers/pop3/camel-pop3-folder.c:450 - #: ../camel/providers/pop3/camel-pop3-folder.c:593 -@@ -3434,7 +3427,7 @@ - #: ../camel/providers/pop3/camel-pop3-store.c:528 - #: ../camel/providers/pop3/camel-pop3-store.c:576 - #: ../camel/providers/pop3/camel-pop3-store.c:668 --#: ../camel/providers/pop3/camel-pop3-store.c:1072 -+#: ../camel/providers/pop3/camel-pop3-store.c:1081 - #, c-format - msgid "You must be working online to complete this operation" - msgstr "Для завершения данной операции необходимо подключение к сети" -@@ -3461,11 +3454,9 @@ - - #: ../camel/providers/local/camel-local-folder.c:730 - #, c-format --msgid "" --"Cannot get message %s from folder %s\n" -+msgid "Cannot get message %s from folder %s\n" - "%s" --msgstr "" --"Не удалось получить сообщение %s из папки %s\n" -+msgstr "Не удалось получить сообщение %s из папки %s\n" - "%s" - - #: ../camel/providers/local/camel-local-provider.c:41 -@@ -3539,7 +3530,7 @@ - - #: ../camel/providers/local/camel-local-store.c:221 - #: ../camel/providers/local/camel-local-store.c:381 --#: ../camel/providers/local/camel-maildir-store.c:122 -+#: ../camel/providers/local/camel-maildir-store.c:123 - #: ../camel/providers/local/camel-mbox-store.c:572 - #: ../camel/providers/local/camel-spool-store.c:87 - #, c-format -@@ -3554,7 +3545,7 @@ - #: ../camel/providers/local/camel-local-store.c:242 - #: ../camel/providers/local/camel-local-store.c:252 - #: ../camel/providers/local/camel-local-store.c:394 --#: ../camel/providers/local/camel-maildir-store.c:156 -+#: ../camel/providers/local/camel-maildir-store.c:165 - #, c-format - msgid "Cannot get folder: %s: %s" - msgstr "Не удалось получить папку: %s: %s" -@@ -3576,7 +3567,7 @@ - msgid "Could not delete folder meta file '%s': %s" - msgstr "Не удалось удалить мета-файл папки «%s»: %s" - --#: ../camel/providers/local/camel-local-store.c:594 -+#: ../camel/providers/local/camel-local-store.c:595 - #, c-format - msgid "Could not rename '%s': %s" - msgstr "Не удалось переименовать «%s»: %s" -@@ -3608,53 +3599,59 @@ - msgid "Cannot transfer message to destination folder: %s" - msgstr "Не удалось переместить сообщение в папку: %s" - --#: ../camel/providers/local/camel-maildir-store.c:130 --#: ../camel/providers/local/camel-maildir-store.c:149 --#: ../camel/providers/local/camel-maildir-store.c:881 -+#: ../camel/providers/local/camel-maildir-store.c:131 -+#: ../camel/providers/local/camel-maildir-store.c:931 -+#, c-format -+msgid "Cannot create folder containing '%s'" -+msgstr "Не удалось создать папку, содержащую «%s»" -+ -+#: ../camel/providers/local/camel-maildir-store.c:139 -+#: ../camel/providers/local/camel-maildir-store.c:158 -+#: ../camel/providers/local/camel-maildir-store.c:923 - #, c-format - msgid "Folder %s already exists" - msgstr "Папка %s уже существует" - --#: ../camel/providers/local/camel-maildir-store.c:241 --#: ../camel/providers/local/camel-maildir-store.c:272 -+#: ../camel/providers/local/camel-maildir-store.c:266 -+#: ../camel/providers/local/camel-maildir-store.c:297 - #: ../camel/providers/local/camel-mbox-store.c:401 - #: ../camel/providers/local/camel-mbox-store.c:422 - #, c-format - msgid "Cannot create folder '%s': %s" - msgstr "Не удалось создать папку: «%s»: %s" - --#: ../camel/providers/local/camel-maildir-store.c:256 -+#: ../camel/providers/local/camel-maildir-store.c:281 - #: ../camel/providers/local/camel-mbox-store.c:367 - #: ../camel/providers/local/camel-mh-store.c:523 - #, c-format - msgid "Cannot get folder '%s': %s" - msgstr "Не удалось получить папку: «%s»: %s" - --#: ../camel/providers/local/camel-maildir-store.c:262 -+#: ../camel/providers/local/camel-maildir-store.c:287 - #: ../camel/providers/local/camel-mbox-store.c:377 - #: ../camel/providers/local/camel-mh-store.c:532 - #, c-format - msgid "Cannot get folder '%s': folder does not exist." - msgstr "Не удалось получить папку «%s»: папка не существует." - --#: ../camel/providers/local/camel-maildir-store.c:289 -+#: ../camel/providers/local/camel-maildir-store.c:314 - #, c-format - msgid "Cannot get folder '%s': not a maildir directory." - msgstr "Не удалось получить папку «%s»: не является почтовым каталогом." - --#: ../camel/providers/local/camel-maildir-store.c:353 --#: ../camel/providers/local/camel-maildir-store.c:393 -+#: ../camel/providers/local/camel-maildir-store.c:378 -+#: ../camel/providers/local/camel-maildir-store.c:418 - #: ../camel/providers/local/camel-mh-store.c:676 - #, c-format - msgid "Could not delete folder '%s': %s" - msgstr "Не удалось удалить папку «%s»: %s" - --#: ../camel/providers/local/camel-maildir-store.c:355 -+#: ../camel/providers/local/camel-maildir-store.c:380 - msgid "not a maildir directory" - msgstr "не является почтовым каталогом" - --#: ../camel/providers/local/camel-maildir-store.c:637 --#: ../camel/providers/local/camel-maildir-store.c:1095 -+#: ../camel/providers/local/camel-maildir-store.c:666 -+#: ../camel/providers/local/camel-maildir-store.c:1146 - #: ../camel/providers/local/camel-spool-store.c:212 - #: ../camel/providers/local/camel-spool-store.c:231 - #, c-format -@@ -3732,11 +3729,9 @@ - #: ../camel/providers/local/camel-mbox-store.c:663 - #: ../camel/providers/local/camel-mbox-store.c:692 - #, c-format --msgid "" --"Could not delete folder '%s':\n" -+msgid "Could not delete folder '%s':\n" - "%s" --msgstr "" --"Не удалось удалить папку «%s»:\n" -+msgstr "Не удалось удалить папку «%s»:\n" - "%s" - - #: ../camel/providers/local/camel-mbox-store.c:673 -@@ -3899,11 +3894,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:494 - #, c-format --msgid "" --"Could not open folder '%s':\n" -+msgid "Could not open folder '%s':\n" - "%s" --msgstr "" --"Не удалось открыть папку «%s»:\n" -+msgstr "Не удалось открыть папку «%s»:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:500 -@@ -3913,11 +3906,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:508 - #, c-format --msgid "" --"Could not create folder '%s':\n" -+msgid "Could not create folder '%s':\n" - "%s" --msgstr "" --"Не удалось создать папку «%s»:\n" -+msgstr "Не удалось создать папку «%s»:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:521 -@@ -4065,12 +4056,10 @@ - - #: ../camel/providers/nntp/camel-nntp-store.c:1151 - #, c-format --msgid "" --"Error retrieving newsgroups:\n" -+msgid "Error retrieving newsgroups:\n" - "\n" - "%s" --msgstr "" --"Ошибка получения групп:\n" -+msgstr "Ошибка получения групп:\n" - "\n" - " %s" - -@@ -4107,8 +4096,7 @@ - - #: ../camel/providers/nntp/camel-nntp-store.c:1583 - #, c-format --msgid "" --"You cannot unsubscribe to this newsgroup:\n" -+msgid "You cannot unsubscribe to this newsgroup:\n" - "\n" - "newsgroup does not exist!" - msgstr "" -@@ -4278,7 +4266,8 @@ - #: ../camel/providers/pop3/camel-pop3-store.c:360 - #, c-format - msgid "Cannot login to POP server %s: SASL Protocol error" --msgstr "Не удалось зарегистрироваться на сервере POP %s: Ошибка протокола SASL" -+msgstr "" -+"Не удалось зарегистрироваться на сервере POP %s: Ошибка протокола SASL" - - #: ../camel/providers/pop3/camel-pop3-store.c:382 - #, c-format -@@ -4295,7 +4284,15 @@ - msgid "POP3 server for %s on %s" - msgstr "Сервер POP3 для %s на %s" - --#: ../camel/providers/pop3/camel-pop3-store.c:713 -+#: ../camel/providers/pop3/camel-pop3-store.c:690 -+#: ../camel/providers/pop3/camel-pop3-store.c:777 -+#, c-format -+msgid "Unable to connect to POP server %s.\n" -+"Error sending password: " -+msgstr "Не удалось подключиться к POP-серверу %s.\n" -+"Ошибка отправки пароля: " -+ -+#: ../camel/providers/pop3/camel-pop3-store.c:722 - #, c-format - msgid "" - "Unable to connect to POP server %s:\tInvalid APOP ID received. Impersonation " -@@ -4305,32 +4302,22 @@ - "некорректный идентификатор APOP. Возникает подозрение о проведение атаки на " - "персонификацию. Пожалуйста, свяжитесь с администратором." - --#: ../camel/providers/pop3/camel-pop3-store.c:768 --#, c-format --msgid "" --"Unable to connect to POP server %s.\n" --"Error sending password: " --msgstr "" --"Не удалось подключиться к POP-серверу %s.\n" --"Ошибка отправки пароля: " -- - #. Translators: Last %s is an optional explanation - #. * beginning with ": " separator. --#: ../camel/providers/pop3/camel-pop3-store.c:783 -+#: ../camel/providers/pop3/camel-pop3-store.c:792 - #, c-format --msgid "" --"Unable to connect to POP server %s.\n" -+msgid "Unable to connect to POP server %s.\n" - "Error sending username%s" - msgstr "" - "Не удалось подключиться к POP-серверу %s.\n" - "Ошибка отправки имени пользователя%s" - --#: ../camel/providers/pop3/camel-pop3-store.c:865 -+#: ../camel/providers/pop3/camel-pop3-store.c:874 - #, c-format - msgid "No such folder '%s'." - msgstr "Нет такой папки «%s»." - --#: ../camel/providers/pop3/camel-pop3-store.c:882 -+#: ../camel/providers/pop3/camel-pop3-store.c:891 - #, c-format - msgid "POP3 stores have no folder hierarchy" - msgstr "В хранилищах POP3 отсутствует иерархия папок" -@@ -4425,222 +4412,222 @@ - "Для доставки почты путём подключения к удалённому почтовому концентратору по " - "протоколу SMTP." - --#: ../camel/providers/smtp/camel-smtp-transport.c:170 --#: ../camel/providers/smtp/camel-smtp-transport.c:178 -+#: ../camel/providers/smtp/camel-smtp-transport.c:171 -+#: ../camel/providers/smtp/camel-smtp-transport.c:179 - msgid "Welcome response error: " - msgstr "Ошибка ответа на приветствие: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:214 -+#: ../camel/providers/smtp/camel-smtp-transport.c:215 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: %s" - msgstr "Не удалось подключиться к SMTP-серверу %s в защищённом режиме: %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:224 --#: ../camel/providers/smtp/camel-smtp-transport.c:238 --#: ../camel/providers/smtp/camel-smtp-transport.c:246 -+#: ../camel/providers/smtp/camel-smtp-transport.c:225 -+#: ../camel/providers/smtp/camel-smtp-transport.c:240 -+#: ../camel/providers/smtp/camel-smtp-transport.c:248 - msgid "STARTTLS command failed: " - msgstr "Сбой команды STARTTLS: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:265 -+#: ../camel/providers/smtp/camel-smtp-transport.c:267 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: " - msgstr "Не удалось подключиться к SMTP-серверу %s в защищённом режиме: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:357 -+#: ../camel/providers/smtp/camel-smtp-transport.c:359 - #, c-format - msgid "SMTP server %s" - msgstr "SMTP-сервер %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:360 -+#: ../camel/providers/smtp/camel-smtp-transport.c:362 - #, c-format - msgid "SMTP mail delivery via %s" - msgstr "SMTP-доставка почты через %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:434 -+#: ../camel/providers/smtp/camel-smtp-transport.c:463 - #, c-format - msgid "SMTP server %s does not support %s authentication" - msgstr "Сервер SMTP %s не поддерживает аутентификацию %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:506 -+#: ../camel/providers/smtp/camel-smtp-transport.c:536 - #, c-format - msgid "No SASL mechanism was specified" - msgstr "Не указан механизм SASL" - --#: ../camel/providers/smtp/camel-smtp-transport.c:536 --#: ../camel/providers/smtp/camel-smtp-transport.c:547 --#: ../camel/providers/smtp/camel-smtp-transport.c:560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:571 -+#: ../camel/providers/smtp/camel-smtp-transport.c:583 -+#: ../camel/providers/smtp/camel-smtp-transport.c:596 - msgid "AUTH command failed: " - msgstr "Сбой команды AUTH: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:701 -+#: ../camel/providers/smtp/camel-smtp-transport.c:740 - #, c-format - msgid "Cannot send message: service not connected." - msgstr "Не удалось отправить сообщение: сервис не подключён." - --#: ../camel/providers/smtp/camel-smtp-transport.c:708 -+#: ../camel/providers/smtp/camel-smtp-transport.c:747 - #, c-format - msgid "Cannot send message: sender address not valid." - msgstr "Не удалось отправить сообщение: неверный адрес отправителя." - --#: ../camel/providers/smtp/camel-smtp-transport.c:712 -+#: ../camel/providers/smtp/camel-smtp-transport.c:751 - msgid "Sending message" - msgstr "Отправка сообщения" - --#: ../camel/providers/smtp/camel-smtp-transport.c:737 -+#: ../camel/providers/smtp/camel-smtp-transport.c:776 - #, c-format - msgid "Cannot send message: no recipients defined." - msgstr "Не удалось отправить сообщение: не определены получатели." - --#: ../camel/providers/smtp/camel-smtp-transport.c:750 -+#: ../camel/providers/smtp/camel-smtp-transport.c:789 - #, c-format - msgid "Cannot send message: one or more invalid recipients" - msgstr "" - "Не удалось отправить сообщение: указан один или несколько некорректных " - "получателей" - --#: ../camel/providers/smtp/camel-smtp-transport.c:871 -+#: ../camel/providers/smtp/camel-smtp-transport.c:910 - msgid "Syntax error, command unrecognized" - msgstr "Синтаксическая ошибка, команда не распознана" - --#: ../camel/providers/smtp/camel-smtp-transport.c:873 -+#: ../camel/providers/smtp/camel-smtp-transport.c:912 - msgid "Syntax error in parameters or arguments" - msgstr "Синтаксическая ошибка в параметрах или аргументах" - --#: ../camel/providers/smtp/camel-smtp-transport.c:875 -+#: ../camel/providers/smtp/camel-smtp-transport.c:914 - msgid "Command not implemented" - msgstr "Команда не реализована" - --#: ../camel/providers/smtp/camel-smtp-transport.c:877 -+#: ../camel/providers/smtp/camel-smtp-transport.c:916 - msgid "Command parameter not implemented" - msgstr "Параметр команды не реализован" - --#: ../camel/providers/smtp/camel-smtp-transport.c:879 -+#: ../camel/providers/smtp/camel-smtp-transport.c:918 - msgid "System status, or system help reply" - msgstr "Состояние системы или ответ системной справки" - --#: ../camel/providers/smtp/camel-smtp-transport.c:881 -+#: ../camel/providers/smtp/camel-smtp-transport.c:920 - msgid "Help message" - msgstr "Справочное сообщение" - --#: ../camel/providers/smtp/camel-smtp-transport.c:883 -+#: ../camel/providers/smtp/camel-smtp-transport.c:922 - msgid "Service ready" - msgstr "Сервис готов" - --#: ../camel/providers/smtp/camel-smtp-transport.c:885 -+#: ../camel/providers/smtp/camel-smtp-transport.c:924 - msgid "Service closing transmission channel" - msgstr "Сервис закрывает канал передачи" - --#: ../camel/providers/smtp/camel-smtp-transport.c:887 -+#: ../camel/providers/smtp/camel-smtp-transport.c:926 - msgid "Service not available, closing transmission channel" - msgstr "Сервис не доступен, закрытие канала передачи" - --#: ../camel/providers/smtp/camel-smtp-transport.c:889 -+#: ../camel/providers/smtp/camel-smtp-transport.c:928 - msgid "Requested mail action okay, completed" - msgstr "Запрошенное почтовое действие выполнено" - --#: ../camel/providers/smtp/camel-smtp-transport.c:891 -+#: ../camel/providers/smtp/camel-smtp-transport.c:930 - msgid "User not local; will forward to " - msgstr "" - "Не локальный пользователь; будет отправлено в соответствии с " - --#: ../camel/providers/smtp/camel-smtp-transport.c:893 -+#: ../camel/providers/smtp/camel-smtp-transport.c:932 - msgid "Requested mail action not taken: mailbox unavailable" - msgstr "Запрошенное действие с почтой не выполнено: почтовый ящик недоступен" - --#: ../camel/providers/smtp/camel-smtp-transport.c:895 -+#: ../camel/providers/smtp/camel-smtp-transport.c:934 - msgid "Requested action not taken: mailbox unavailable" - msgstr "Запрошенное действие не выполнено: почтовый ящик недоступен" - --#: ../camel/providers/smtp/camel-smtp-transport.c:897 -+#: ../camel/providers/smtp/camel-smtp-transport.c:936 - msgid "Requested action aborted: error in processing" - msgstr "Запрошенное действие прервано: ошибка при обработке" - --#: ../camel/providers/smtp/camel-smtp-transport.c:899 -+#: ../camel/providers/smtp/camel-smtp-transport.c:938 - msgid "User not local; please try " - msgstr "Пользователь не локальный; установите " - --#: ../camel/providers/smtp/camel-smtp-transport.c:901 -+#: ../camel/providers/smtp/camel-smtp-transport.c:940 - msgid "Requested action not taken: insufficient system storage" - msgstr "" - "Запрошенное действие не выполнено: недостаточно места в системном хранилище" - --#: ../camel/providers/smtp/camel-smtp-transport.c:903 -+#: ../camel/providers/smtp/camel-smtp-transport.c:942 - msgid "Requested mail action aborted: exceeded storage allocation" - msgstr "Запрошенное действие прервано: исчерпано место в хранилище" - --#: ../camel/providers/smtp/camel-smtp-transport.c:905 -+#: ../camel/providers/smtp/camel-smtp-transport.c:944 - msgid "Requested action not taken: mailbox name not allowed" - msgstr "Запрошенное действие прервано: имя почтового ящика недопустимо" - --#: ../camel/providers/smtp/camel-smtp-transport.c:907 -+#: ../camel/providers/smtp/camel-smtp-transport.c:946 - msgid "Start mail input; end with ." - msgstr "Начало ввода почты; окончание после ." - --#: ../camel/providers/smtp/camel-smtp-transport.c:909 -+#: ../camel/providers/smtp/camel-smtp-transport.c:948 - msgid "Transaction failed" - msgstr "Сбой транзакции" - --#: ../camel/providers/smtp/camel-smtp-transport.c:913 -+#: ../camel/providers/smtp/camel-smtp-transport.c:952 - msgid "A password transition is needed" - msgstr "Необходима передача пароля" - --#: ../camel/providers/smtp/camel-smtp-transport.c:915 -+#: ../camel/providers/smtp/camel-smtp-transport.c:954 - msgid "Authentication mechanism is too weak" - msgstr "Слишком слабый механизм аутентификации" - --#: ../camel/providers/smtp/camel-smtp-transport.c:917 -+#: ../camel/providers/smtp/camel-smtp-transport.c:956 - msgid "Encryption required for requested authentication mechanism" - msgstr "Для запрошенного механизма аутентификации требуется шифрование" - --#: ../camel/providers/smtp/camel-smtp-transport.c:919 -+#: ../camel/providers/smtp/camel-smtp-transport.c:958 - msgid "Temporary authentication failure" - msgstr "Временный сбой аутентификации" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1207 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1247 - msgid "SMTP Greeting" - msgstr "Приветствие SMTP" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1217 --#: ../camel/providers/smtp/camel-smtp-transport.c:1231 --#: ../camel/providers/smtp/camel-smtp-transport.c:1239 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1257 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1272 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1280 - msgid "HELO command failed: " - msgstr "Сбой команды HELO: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1314 --#: ../camel/providers/smtp/camel-smtp-transport.c:1329 --#: ../camel/providers/smtp/camel-smtp-transport.c:1339 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1355 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1371 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1381 - msgid "MAIL FROM command failed: " - msgstr "Сбой команды MAIL FROM: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1366 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1408 - msgid "RCPT TO command failed: " - msgstr "Сбой команды RCPT TO: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1383 --#: ../camel/providers/smtp/camel-smtp-transport.c:1393 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1426 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1436 - #, c-format - msgid "RCPT TO <%s> failed: " - msgstr "Сбой команды RCPT TO <%s>: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1436 --#: ../camel/providers/smtp/camel-smtp-transport.c:1447 --#: ../camel/providers/smtp/camel-smtp-transport.c:1458 --#: ../camel/providers/smtp/camel-smtp-transport.c:1517 --#: ../camel/providers/smtp/camel-smtp-transport.c:1537 --#: ../camel/providers/smtp/camel-smtp-transport.c:1551 --#: ../camel/providers/smtp/camel-smtp-transport.c:1560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1509 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1521 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1532 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1594 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1614 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1629 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1638 - msgid "DATA command failed: " - msgstr "Сбой команды DATA: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1585 --#: ../camel/providers/smtp/camel-smtp-transport.c:1600 --#: ../camel/providers/smtp/camel-smtp-transport.c:1609 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1663 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1679 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1688 - msgid "RSET command failed: " - msgstr "Сбой команды RSET: " - --#: ../camel/providers/smtp/camel-smtp-transport.c:1634 --#: ../camel/providers/smtp/camel-smtp-transport.c:1648 --#: ../camel/providers/smtp/camel-smtp-transport.c:1655 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1713 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1727 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1734 - msgid "QUIT command failed: " - msgstr "Сбой команды QUIT: " - -@@ -4761,25 +4748,25 @@ - msgid "Client reports password was rejected" - msgstr "Пароль клиента отклонён" - --#: ../libebackend/e-authentication-session.c:539 -+#: ../libebackend/e-authentication-session.c:542 - msgid "Add this password to your keyring" - msgstr "Добавить этот пароль в связку ключей" - --#: ../libebackend/e-authentication-session.c:649 -+#: ../libebackend/e-authentication-session.c:547 - msgid "Password was incorrect" - msgstr "Некорректный пароль" - --#: ../libebackend/e-backend.c:408 -+#: ../libebackend/e-backend.c:420 - #, c-format - msgid "%s does not support authentication" - msgstr "%s не поддерживает аутентификацию" - --#: ../libebackend/e-collection-backend.c:901 -+#: ../libebackend/e-collection-backend.c:992 - #, c-format - msgid "%s does not support creating remote resources" - msgstr "%s не поддерживает создание удалённых ресурсов" - --#: ../libebackend/e-collection-backend.c:960 -+#: ../libebackend/e-collection-backend.c:1051 - #, c-format - msgid "%s does not support deleting remote resources" - msgstr "%s не поддерживает удаление удалённых ресурсов" -@@ -4794,48 +4781,48 @@ - msgid "Data source is missing a [%s] group" - msgstr "В источнике данных нет группы [%s]" - --#: ../libebackend/e-server-side-source.c:1022 --#: ../libedataserver/e-source.c:1394 -+#: ../libebackend/e-server-side-source.c:1025 -+#: ../libedataserver/e-source.c:1351 - #, c-format - msgid "Data source '%s' does not support creating remote resources" - msgstr "Источник данных «%s» не поддерживает создание удалённых ресурсов" - --#: ../libebackend/e-server-side-source.c:1036 -+#: ../libebackend/e-server-side-source.c:1039 - #, c-format - msgid "" - "Data source '%s' has no collection backend to create the remote resource" - msgstr "У источника данных «%s» нет бэкэнда для создания удалённого ресурса" - --#: ../libebackend/e-server-side-source.c:1064 --#: ../libedataserver/e-source.c:1507 -+#: ../libebackend/e-server-side-source.c:1067 -+#: ../libedataserver/e-source.c:1464 - #, c-format - msgid "Data source '%s' does not support deleting remote resources" - msgstr "Источник данных «%s» не поддерживает удаление удалённых ресурсов" - --#: ../libebackend/e-server-side-source.c:1078 -+#: ../libebackend/e-server-side-source.c:1081 - #, c-format - msgid "" - "Data source '%s' has no collection backend to delete the remote resource" - msgstr "У источника данных «%s» нет бэкэнда для удаления удалённого ресурса" - --#: ../libebackend/e-server-side-source.c:1109 --#: ../libedataserver/e-source.c:1603 --#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1026 -+#: ../libebackend/e-server-side-source.c:1112 -+#: ../libedataserver/e-source.c:1560 -+#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1027 - #, c-format - msgid "Data source '%s' does not support OAuth 2.0 authentication" - msgstr "Источник данных «%s» не поддерживает аутентификацию OAuth 2.0" - --#: ../libebackend/e-server-side-source.c:1456 -+#: ../libebackend/e-server-side-source.c:1459 - #, c-format - msgid "File must have a '.source' extension" - msgstr "Файл должен иметь расширение «.source»" - --#: ../libebackend/e-source-registry-server.c:531 --#: ../libedataserver/e-source-registry.c:1957 -+#: ../libebackend/e-source-registry-server.c:535 -+#: ../libedataserver/e-source-registry.c:1944 - msgid "The user declined to authenticate" - msgstr "Пользователю отказано в аутентификации" - --#: ../libebackend/e-source-registry-server.c:800 -+#: ../libebackend/e-source-registry-server.c:804 - #, c-format - msgid "UID '%s' is already in use" - msgstr "UID «%s» уже используется" -@@ -5033,17 +5020,17 @@ - msgid "Source file is missing a [%s] group" - msgstr "В исходном файле отсутствует группа [%s]" - --#: ../libedataserver/e-source.c:1174 -+#: ../libedataserver/e-source.c:1131 - #, c-format - msgid "Data source '%s' is not removable" - msgstr "Источник данных «%s» нельзя удалить" - --#: ../libedataserver/e-source.c:1297 -+#: ../libedataserver/e-source.c:1254 - #, c-format - msgid "Data source '%s' is not writable" - msgstr "Источник данных «%s» нельзя изменить" - --#: ../libedataserver/e-source.c:1910 -+#: ../libedataserver/e-source.c:1867 - msgid "Unnamed" - msgstr "Безымянный" - -@@ -5057,7 +5044,7 @@ - msgid "Source '%s' does not support proxy lookups" - msgstr "Источник «%s» не поддерживает поиск прокси" - --#: ../libedataserver/e-source-webdav.c:1557 -+#: ../libedataserver/e-source-webdav.c:1562 - #, c-format - msgid "" - "SSL certificate for host '%s', used by address book '%s', is not trusted. Do " -@@ -5066,7 +5053,7 @@ - "Сертификат SSL для «%s», используемый адресной книгой «%s», не является " - "доверенным. Принять сертификат?" - --#: ../libedataserver/e-source-webdav.c:1566 -+#: ../libedataserver/e-source-webdav.c:1571 - #, c-format - msgid "" - "SSL certificate for host '%s', used by calendar '%s', is not trusted. Do you " -@@ -5075,7 +5062,7 @@ - "Сертификат SSL для «%s», используемый календарём «%s», не является " - "доверенным. Принять сертификат?" - --#: ../libedataserver/e-source-webdav.c:1575 -+#: ../libedataserver/e-source-webdav.c:1580 - #, c-format - msgid "" - "SSL certificate for host '%s', used by memo list '%s', is not trusted. Do " -@@ -5084,7 +5071,7 @@ - "Сертификат SSL для «%s», используемый списком заметок «%s», не является " - "доверенным. Принять сертификат?" - --#: ../libedataserver/e-source-webdav.c:1584 -+#: ../libedataserver/e-source-webdav.c:1589 - #, c-format - msgid "" - "SSL certificate for host '%s', used by task list '%s', is not trusted. Do " -@@ -5097,7 +5084,7 @@ - #. * in 12-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1662 ../libedataserver/e-time-utils.c:1961 -+#: ../libedataserver/e-time-utils.c:1681 ../libedataserver/e-time-utils.c:1980 - msgid "%a %m/%d/%Y %I:%M:%S %p" - msgstr "%a, %d.%m.%Y %I:%M:%S %p" - -@@ -5105,7 +5092,7 @@ - #. * in 24-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1667 ../libedataserver/e-time-utils.c:1952 -+#: ../libedataserver/e-time-utils.c:1686 ../libedataserver/e-time-utils.c:1971 - msgid "%a %m/%d/%Y %H:%M:%S" - msgstr "%a %d/%m/%Y %H:%M:%S" - -@@ -5113,7 +5100,7 @@ - #. * in 12-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1672 ../libedataserver/e-time-utils.c:1957 -+#: ../libedataserver/e-time-utils.c:1691 ../libedataserver/e-time-utils.c:1976 - msgid "%a %m/%d/%Y %I:%M %p" - msgstr "%a %d/%m/%Y %I:%M %p" - -@@ -5121,78 +5108,78 @@ - #. * in 24-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1677 ../libedataserver/e-time-utils.c:1948 -+#: ../libedataserver/e-time-utils.c:1696 ../libedataserver/e-time-utils.c:1967 - msgid "%a %m/%d/%Y %H:%M" - msgstr "%a %d/%m/%Y %H:%M" - - #. strptime format of a weekday, a date and a time, - #. * in 12-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1682 -+#: ../libedataserver/e-time-utils.c:1701 - msgid "%a %m/%d/%Y %I %p" - msgstr "%a %d/%m/%Y %I %p" - - #. strptime format of a weekday, a date and a time, - #. * in 24-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1687 -+#: ../libedataserver/e-time-utils.c:1706 - msgid "%a %m/%d/%Y %H" - msgstr "%a %d/%m/%Y %H" - - #. strptime format of a weekday and a date. - #. strftime format of a weekday and a date. --#: ../libedataserver/e-time-utils.c:1690 ../libedataserver/e-time-utils.c:1810 --#: ../libedataserver/e-time-utils.c:1943 -+#: ../libedataserver/e-time-utils.c:1709 ../libedataserver/e-time-utils.c:1829 -+#: ../libedataserver/e-time-utils.c:1962 - msgid "%a %m/%d/%Y" - msgstr "%a %d/%m/%Y" - - #. strptime format of a date and a time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1697 -+#: ../libedataserver/e-time-utils.c:1716 - msgid "%m/%d/%Y %I:%M:%S %p" - msgstr "%d/%m/%Y %I:%M:%S %p" - - #. strptime format of a date and a time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1701 -+#: ../libedataserver/e-time-utils.c:1720 - msgid "%m/%d/%Y %H:%M:%S" - msgstr "%d/%m/%Y %H:%M:%S" - - #. strptime format of a date and a time, in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1706 -+#: ../libedataserver/e-time-utils.c:1725 - msgid "%m/%d/%Y %I:%M %p" - msgstr "%d/%m/%Y %I:%M %p" - - #. strptime format of a date and a time, in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1711 -+#: ../libedataserver/e-time-utils.c:1730 - msgid "%m/%d/%Y %H:%M" - msgstr "%d/%m/%Y %H:%M" - - #. strptime format of a date and a time, in 12-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1716 -+#: ../libedataserver/e-time-utils.c:1735 - msgid "%m/%d/%Y %I %p" - msgstr "%d/%m/%Y %I %p" - - #. strptime format of a date and a time, in 24-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1721 -+#: ../libedataserver/e-time-utils.c:1740 - msgid "%m/%d/%Y %H" - msgstr "%d/%m/%Y %H" - - #. strptime format of a weekday and a date. - #. This is the preferred date format for the locale. --#: ../libedataserver/e-time-utils.c:1724 ../libedataserver/e-time-utils.c:1813 -+#: ../libedataserver/e-time-utils.c:1743 ../libedataserver/e-time-utils.c:1832 - msgid "%m/%d/%Y" - msgstr "%d/%m/%Y" - - #. strptime format for a time of day, in 12-hour format. - #. strftime format of a time in 12-hour format. --#: ../libedataserver/e-time-utils.c:1884 ../libedataserver/e-time-utils.c:2005 -+#: ../libedataserver/e-time-utils.c:1903 ../libedataserver/e-time-utils.c:2024 - msgid "%I:%M:%S %p" - msgstr "%I:%M:%S %p" - - #. strptime format for a time of day, in 24-hour format. - #. strftime format of a time in 24-hour format. --#: ../libedataserver/e-time-utils.c:1888 ../libedataserver/e-time-utils.c:1997 -+#: ../libedataserver/e-time-utils.c:1907 ../libedataserver/e-time-utils.c:2016 - msgid "%H:%M:%S" - msgstr "%H:%M:%S" - -@@ -5200,25 +5187,25 @@ - #. * in 12-hour format. - #. strftime format of a time in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1893 ../libedataserver/e-time-utils.c:2002 -+#: ../libedataserver/e-time-utils.c:1912 ../libedataserver/e-time-utils.c:2021 - msgid "%I:%M %p" - msgstr "%I:%M %p" - - #. strptime format for time of day, without seconds 24-hour format. - #. strftime format of a time in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1897 ../libedataserver/e-time-utils.c:1994 -+#: ../libedataserver/e-time-utils.c:1916 ../libedataserver/e-time-utils.c:2013 - msgid "%H:%M" - msgstr "%H:%M" - - #. strptime format for time of day, without seconds 24-hour format, - #. * and no colon. --#: ../libedataserver/e-time-utils.c:1901 -+#: ../libedataserver/e-time-utils.c:1920 - msgid "%H%M" - msgstr "%H%M" - - #. strptime format for hour and AM/PM, 12-hour format. --#: ../libedataserver/e-time-utils.c:1905 -+#: ../libedataserver/e-time-utils.c:1924 - msgid "%I %p" - msgstr "%I %p" - -@@ -5278,7 +5265,7 @@ - msgid "Failed to find ASUrl and OABUrl in autodiscover response" - msgstr "Не удалось найти ASUrl и OABUrl в ответе автообнаружения" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1260 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1269 - #, c-format - msgid "" - "Cannot find a corresponding account in the org.gnome.OnlineAccounts service " -@@ -5287,23 +5274,17 @@ - "Не удалось найти соответствующую запись в службе org.gnome.OnlineAccounts, с " - "помощью которой можно получить маркер доступа для «%s»" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1290 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1299 - #, c-format - msgid "Failed to obtain an access token for '%s': " - msgstr "Не удалось получить маркер доступа для «%s»: " - --#: ../modules/google-backend/module-google-backend.c:205 --#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 --#: ../modules/yahoo-backend/module-yahoo-backend.c:199 --msgid "Calendar" --msgstr "Календарь" -- --#: ../modules/google-backend/module-google-backend.c:279 -+#: ../modules/google-backend/module-google-backend.c:341 - #: ../modules/yahoo-backend/module-yahoo-backend.c:226 - msgid "Tasks" - msgstr "Задачи" - --#: ../modules/google-backend/module-google-backend.c:333 -+#: ../modules/google-backend/module-google-backend.c:395 - #: ../modules/ubuntu-online-accounts/contacts.service-type.in.in.h:1 - #: ../services/evolution-source-registry/builtin/contacts-stub.source.in.h:1 - msgid "Contacts" -@@ -5364,6 +5345,11 @@ - msgid "Reason:" - msgstr "Причина:" - -+#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 -+#: ../modules/yahoo-backend/module-yahoo-backend.c:199 -+msgid "Calendar" -+msgstr "Календарь" -+ - #: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:2 - msgid "Integrate your calendars" - msgstr "Интеграция ваших календарей" -@@ -5404,7 +5390,7 @@ - msgid "Integrate your mailboxes" - msgstr "Интегрировать ваши почтовые ящики" - --#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1007 -+#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1008 - #, c-format - msgid "" - "Cannot find a corresponding account service in the accounts database from " -@@ -5417,7 +5403,8 @@ - #: ../modules/ubuntu-online-accounts/uoa-utils.c:281 - #, c-format - msgid "" --"Expected status 200 when requesting your identity, instead got status %d (%s)" -+"Expected status 200 when requesting your identity, instead got status %d " -+"(%s)" - msgstr "" - "Вместо ожидаемого статуса 200 при запросе идентификации получен статус %d " - "(%s)" -@@ -5508,412 +5495,3 @@ - #: ../services/evolution-user-prompter/prompt-user-gtk.c:121 - msgid "_Dismiss" - msgstr "_Отклонить" -- --#~| msgid "No quota information available for folder '%s'" --#~ msgid "No host information available" --#~ msgstr "Нет доступной информации об узле" -- --#~ msgid "Cannot create folder '%s': folder exists" --#~ msgstr "Не удалось создать папку «%s»: папка уже существует" -- --#~ msgid "Source stream unavailable" --#~ msgstr "Поток недоступен" -- --#~ msgid "Cannot create folder '%s': folder exists." --#~ msgstr "Не удалось создать папку «%s»: папка существует." -- --#~ msgid "You may not import keys with this cipher" --#~ msgstr "Импорт ключей не поддерживается этим шифром" -- --#~ msgid "You may not export keys with this cipher" --#~ msgstr "Экспорт ключей не поддерживается этим шифром" -- --#~ msgid "" --#~ "Could not write log entry: %s\n" --#~ "Further operations on this server will not be replayed when you\n" --#~ "reconnect to the network." --#~ msgstr "" --#~ "Не удалось произвести запись в журнал: %s\n" --#~ "Дальнейшие операции не будут записаны и, соответственно, не будут\n" --#~ "воспроизведены после подключения к серверу." -- --#~ msgid "" --#~ "Could not open '%s':\n" --#~ "%s\n" --#~ "Changes made to this folder will not be resynchronized." --#~ msgstr "" --#~ "Не удалось открыть «%s»:\n" --#~ "%s\n" --#~ "Изменения, сделанные в этой папке, не будут синхронизированы." -- --#~ msgid "Resynchronizing with server" --#~ msgstr "Синхронизация с сервером" -- --#~ msgid "Preparing folder '%s' for offline" --#~ msgstr "Подготовка папки «%s» для автономной работы" -- --#~ msgid "Canceled" --#~ msgstr "Отменено" -- --#~ msgid "" --#~ "Alert from IMAP server %s:\n" --#~ "%s" --#~ msgstr "" --#~ "Предупреждение от сервера IMAP %s:\n" --#~ "%s" -- --#~ msgid "Error while fetching messages" --#~ msgstr "Ошибка при получении сообщений" -- --#~ msgid "Fetching summary information for %d message in '%s'" --#~ msgid_plural "Fetching summary information for %d messages in '%s'" --#~ msgstr[0] "Получение краткой информации об %d новом сообщении в «%s»" --#~ msgstr[1] "Получение краткой информации о %d новых сообщениях в «%s»" --#~ msgstr[2] "Получение краткой информации о %d новых сообщениях в «%s»" -- --#~ msgid "Unknown parent folder: %s" --#~ msgstr "Неизвестная родительская папка: %s" -- --#~ msgid "The parent folder is not allowed to contain subfolders" --#~ msgstr "Эта папка не может содержать подпапки" -- --#~ msgid "Resolving address" --#~ msgstr "Поиск адреса" -- --#~ msgid "Name lookup failed" --#~ msgstr "Имя узла не найдено" -- --#~ msgid "Name lookup failed. Check your host name for spelling errors." --#~ msgstr "Имя узла не найдено. Проверьте правильность имени узла." -- --#~ msgid "Name lookup failed: %s" --#~ msgstr "Имя узла не найдено: %s" -- --#~ msgid "Could not connect to '%s:%s': " --#~ msgstr "Не удалось подключиться к «%s:%s»: " -- --#~ msgid "Please enter the %s password for %s on host %s." --#~ msgstr "Введите пароль %s для %s на узле %s." -- --#~ msgid "NSPR error code %d" --#~ msgstr "Код ошибки NSPR %d" -- --#~ msgid "The proxy host does not support SOCKS4" --#~ msgstr "Узел прокси не поддерживает SOCKS4" -- --#~ msgid "The proxy host denied our request: code %d" --#~ msgstr "Узел прокси отклонил запрос: код %d" -- --#~ msgid "The proxy host does not support SOCKS5" --#~ msgstr "Узел прокси не поддерживает SOCKS5" -- --#~ msgid "Could not find a suitable authentication type: code 0x%x" --#~ msgstr "Не удалось найти подходящий тип аутентификации: код 0x%x" -- --#~ msgid "General SOCKS server failure" --#~ msgstr "Сбой сервера SOCKS" -- --#~ msgid "SOCKS server's rules do not allow connection" --#~ msgstr "Правила сервера SOCKS запрещают подключение" -- --#~ msgid "Network is unreachable from SOCKS server" --#~ msgstr "Сеть недоступна через сервер SOCKS" -- --#~ msgid "Host is unreachable from SOCKS server" --#~ msgstr "Узел недоступен через сервер SOCKS" -- --#~ msgid "Connection refused" --#~ msgstr "Соединение отклонено" -- --#~ msgid "Time-to-live expired" --#~ msgstr "Превышено максимальное время ожидания" -- --#~ msgid "Command not supported by SOCKS server" --#~ msgstr "Команда не поддерживается сервером SOCKS" -- --#~ msgid "Address type not supported by SOCKS server" --#~ msgstr "Тип адреса не поддерживается сервером SOCKS" -- --#~ msgid "Unknown error from SOCKS server" --#~ msgstr "Получена неизвестная ошибка от сервера SOCKS" -- --#~ msgid "Got unknown address type from SOCKS server" --#~ msgstr "От сервера SOCKS получен адрес неизвестного типа" -- --#~ msgid "Incomplete reply from SOCKS server" --#~ msgstr "Получен неполный ответ от сервера SOCKS" -- --#~ msgid "Hostname is too long (maximum is 255 characters)" --#~ msgstr "Слишком длинное имя узла (максимальное кол-во символов — 255)" -- --#~ msgid "Invalid reply from proxy server" --#~ msgstr "Недопустимый ответ от прокси-сервера" -- --#~ msgid "Unable to add message to summary: unknown reason" --#~ msgstr "" --#~ "Не удалось добавить сообщение к краткой информации: причина неизвестна" -- --#~ msgid "Fatal mail parser error near position %s in folder %s" --#~ msgstr "Фатальная ошибка почтового анализатора возле позиции %s в папке %s" -- --#~ msgid "You cannot post NNTP messages while working offline!" --#~ msgstr "Вы не можете отправлять сообщения NNTP во время автономной работы!" -- --#~ msgid "" --#~ "What proxy type to use. \"0\" means system, \"1\" means no proxy, \"2\" " --#~ "means manual proxy." --#~ msgstr "" --#~ "Тип используемого прокси. «0» — системный; «1» — без прокси; «2» — " --#~ "прокси, настроенный вручную." -- --#~ msgid "Whether to use proxy for HTTP requests." --#~ msgstr "Использовать ли прокси для запросов HTTP." -- --#~ msgid "Whether authentication is required to access proxy server." --#~ msgstr "Требуется ли для доступа к серверу прокси аутентификация." -- --#~ msgid "Host name to use for HTTP requests." --#~ msgstr "Имя узла для запросов HTTP." -- --#~ msgid "Port number to use for HTTP requests." --#~ msgstr "Номер порта для запросов HTTP." -- --#~ msgid "User name to use to authenticate against proxy server." --#~ msgstr "Имя пользователя для аутентификации через сервер прокси." -- --#~ msgid "Password to use to authenticate against proxy server." --#~ msgstr "Пароль для аутентификации через сервер прокси." -- --#~ msgid "List of hosts for which do not use proxy." --#~ msgstr "Список узлов для подключения без прокси." -- --#~ msgid "Host name to use for HTTPS requests." --#~ msgstr "Имя узла для запросов HTTPS." -- --#~ msgid "Port number to use for HTTPS requests." --#~ msgstr "Номер порта для запросов HTTPS." -- --#~ msgid "Host name to use for SOCKS requests." --#~ msgstr "Имя узла для запросов SOCKS." -- --#~ msgid "Port number to use for SOCKS requests." --#~ msgstr "Номер порта для запросов SOCKS." -- --#~ msgid "Where to read automatic proxy configuration from." --#~ msgstr "Откуда читается автоматическая настройка прокси." -- --#~ msgid "Not part of certificate" --#~ msgstr "Не входит в сертификат" -- --#~ msgid "_Close" --#~ msgstr "_Закрыть" -- --#~ msgid "This certificate has been verified for the following uses:" --#~ msgstr "Этот сертификат проверен для следующих применений:" -- --#~ msgid "SSL Client Certificate" --#~ msgstr "Клиентский сертификат SSL" -- --#~ msgid "SSL Server Certificate" --#~ msgstr "Серверный сертификат SSL" -- --#~ msgid "Email Signer Certificate" --#~ msgstr "Сертификат подписчика почты" -- --#~ msgid "Email Recipient Certificate" --#~ msgstr "Сертификат получателя почты" -- --#~ msgid "Issued To" --#~ msgstr "Кому выдано" -- --#~ msgid "Common Name (CN)" --#~ msgstr "Общее имя (CN)" -- --#~ msgid "Organization (O)" --#~ msgstr "Организация (O)" -- --#~ msgid "Organizational Unit (OU)" --#~ msgstr "Подразделение организации (OU)" -- --#~ msgid "Serial Number" --#~ msgstr "Серийный номер" -- --#~ msgid "Issued By" --#~ msgstr "Кем выдано" -- --#~ msgid "Validity" --#~ msgstr "Срок действия" -- --#~ msgid "Issued On" --#~ msgstr "Выдано" -- --#~ msgid "Expires On" --#~ msgstr "Истекает" -- --#~ msgid "Fingerprints" --#~ msgstr "Отпечатки" -- --#~ msgid "SHA1 Fingerprint" --#~ msgstr "Отпечаток SHA1" -- --#~ msgid "MD5 Fingerprint" --#~ msgstr "Отпечаток MD5" -- --#~ msgid "General" --#~ msgstr "Общие" -- --#~ msgid "Certificate Hierarchy" --#~ msgstr "Иерархия сертификата" -- --#~ msgid "Certificate Fields" --#~ msgstr "Поля сертификата" -- --#~ msgid "Field Value" --#~ msgstr "Значение поля" -- --#~ msgid "Details" --#~ msgstr "Подробности" -- --#~ msgid "Version" --#~ msgstr "Версия" -- --#~ msgid "Version 1" --#~ msgstr "Версия 1" -- --#~ msgid "Version 2" --#~ msgstr "Версия 3" -- --#~ msgid "Version 3" --#~ msgstr "Версия 3" -- --#~ msgid "PKCS #1 MD2 With RSA Encryption" --#~ msgstr "PKCS #1 MD2 с шифрованием RSA" -- --#~ msgid "PKCS #1 MD5 With RSA Encryption" --#~ msgstr "PKCS #1 MD5 с шифрованием RSA" -- --#~ msgid "PKCS #1 SHA-1 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-1 с шифрованием RSA" -- --#~ msgid "PKCS #1 SHA-256 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-256 с шифрованием RSA" -- --#~ msgid "PKCS #1 SHA-384 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-384 с шифрованием RSA" -- --#~ msgid "PKCS #1 SHA-512 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-512 с шифрованием RSA" -- --#~ msgid "PKCS #1 RSA Encryption" --#~ msgstr "PKCS #1 шифрование RSA" -- --#~ msgid "Certificate Key Usage" --#~ msgstr "Использование ключа сертификата" -- --#~ msgid "Netscape Certificate Type" --#~ msgstr "Тип сертификата Netscape" -- --#~ msgid "Certificate Authority Key Identifier" --#~ msgstr "Идентификатор ключа удостоверяющего центра сертификата" -- --#~ msgid "Object Identifier (%s)" --#~ msgstr "Идентификатор объекта (%s)" -- --#~ msgid "Algorithm Identifier" --#~ msgstr "Идентификатор алгоритма" -- --#~ msgid "Algorithm Parameters" --#~ msgstr "Параметры алгоритма" -- --#~ msgid "Subject Public Key Info" --#~ msgstr "Информация о публичном ключе субъекта" -- --#~ msgid "Subject Public Key Algorithm" --#~ msgstr "Алгоритм публичного ключа субъекта" -- --#~ msgid "Subject's Public Key" --#~ msgstr "Публичный ключ субъекта" -- --#~ msgid "Error: Unable to process extension" --#~ msgstr "Ошибка: невозможно обработать расширение" -- --#~ msgid "Email" --#~ msgstr "Эл. почта" -- --#~ msgid "Object Signer" --#~ msgstr "Подписчик объекта" -- --#~ msgid "SSL Certificate Authority" --#~ msgstr "Удостоверяющий центр SSL-сертификата" -- --#~ msgid "Email Certificate Authority" --#~ msgstr "Эл. почта центра сертификации" -- --#~ msgid "Signing" --#~ msgstr "Подпись" -- --#~ msgid "Non-repudiation" --#~ msgstr "Безотказность" -- --#~ msgid "Key Encipherment" --#~ msgstr "Шифрование ключа" -- --#~ msgid "Data Encipherment" --#~ msgstr "Шифрование данных" -- --#~ msgid "Key Agreement" --#~ msgstr "Соглашение о ключе" -- --#~ msgid "Certificate Signer" --#~ msgstr "Подписчик сертификата" -- --#~ msgid "CRL Signer" --#~ msgstr "Подписчик CRL" -- --#~ msgid "Critical" --#~ msgstr "Критично" -- --#~ msgid "Not Critical" --#~ msgstr "Не критично" -- --#~ msgid "Extensions" --#~ msgstr "Расширения" -- --#~ msgid "%s = %s" --#~ msgstr "%s = %s" -- --#~ msgid "Certificate" --#~ msgstr "Сертификат" -- --#~ msgid "Certificate Signature Algorithm" --#~ msgstr "Алгоритм подписи сертификата" -- --#~ msgid "Issuer" --#~ msgstr "Издатель" -- --#~ msgid "Subject" --#~ msgstr "Субъект" -- --#~ msgid "Issuer Unique ID" --#~ msgstr "Уникальный идентификатор издателя" -- --#~ msgid "Subject Unique ID" --#~ msgstr "Уникальный идентификатор субъекта" -- --#~ msgid "Certificate Signature Value" --#~ msgstr "Значение подписи сертификата" -- --#~ msgid "_View Certificate" --#~ msgstr "_Показать сертификат" -- --#~ msgid "Detailed information about the certificate:" --#~ msgstr "Подробная информация о сертификате:" -- --#~ msgid "Issuer:" --#~ msgstr "Издатель:" -- --#~ msgid "Subject:" --#~ msgstr "Субъект:" -- --#~ msgid "Fingerprint:" --#~ msgstr "Отпечаток:" -diff -urN evolution-data-server-3.12.11/po/zh_CN.po evolution-data-server-3.12.11_localized/po/zh_CN.po ---- evolution-data-server-3.12.11/po/zh_CN.po 2014-11-18 14:32:20.000000000 +0530 -+++ evolution-data-server-3.12.11_localized/po/zh_CN.po 2016-03-14 19:48:05.525869981 +0530 -@@ -15,22 +15,22 @@ - # Wylmer Wang , 2011, 2013. - # YunQiang Su , 2011. - # Aron Xu , 2009, 2012. --# -+# Leah Liu , 2016. #zanata -+# pnemade , 2016. #zanata - msgid "" - msgstr "" - "Project-Id-Version: evolution-data-server master\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" --"product=evolution-data-server&keywords=I18N+L10N&component=Misc.\n" --"POT-Creation-Date: 2014-11-14 12:41+0000\n" --"PO-Revision-Date: 2014-11-15 01:05+0800\n" --"Last-Translator: YunQiang Su \n" --"Language-Team: Chinese (simplified) \n" --"Language: zh_CN\n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2016-02-16 09:58+0530\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"PO-Revision-Date: 2016-03-07 04:02+0000\n" -+"Last-Translator: Leah Liu \n" -+"Language-Team: Chinese (simplified) \n" -+"Language: zh-CN\n" - "Plural-Forms: nplurals=1; plural=0;\n" --"X-Generator: Poedit 1.6.10\n" -+"X-Generator: Zanata 3.8.2\n" - - #: ../addressbook/backends/file/e-book-backend-file.c:120 - #, c-format -@@ -73,8 +73,8 @@ - - #: ../addressbook/backends/file/e-book-backend-file.c:1472 - #: ../addressbook/backends/file/e-book-backend-file.c:1555 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3077 --#: ../addressbook/libedata-book/e-book-sqlite.c:6742 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3084 -+#: ../addressbook/libedata-book/e-book-sqlite.c:6793 - #, c-format - msgid "Contact '%s' not found" - msgstr "未找到联系人“%s”" -@@ -104,7 +104,7 @@ - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:1174 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4250 - #: ../addressbook/backends/webdav/e-book-backend-webdav.c:419 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:887 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:888 - #: ../addressbook/libebook-contacts/e-book-contacts-types.c:35 - #: ../addressbook/libebook-contacts/e-phone-number.c:56 - #: ../addressbook/libebook/e-book.c:1078 -@@ -119,9 +119,9 @@ - #: ../addressbook/libebook/e-book-client.c:3209 - #: ../addressbook/libebook/e-book-client.c:3427 - #: ../addressbook/libedata-book/e-book-backend-sexp.c:878 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:585 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:616 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:629 - #: ../calendar/backends/contacts/e-cal-backend-contacts.c:270 - #: ../calendar/libecal/e-cal.c:2334 ../calendar/libecal/e-cal-client.c:276 - #: ../calendar/libecal/e-cal-client.c:3273 -@@ -141,42 +141,42 @@ - #: ../calendar/libecal/e-cal-client.c:5969 - #: ../calendar/libecal/e-cal-client.c:6165 - #: ../calendar/libecal/e-cal-client.c:6528 --#: ../calendar/libecal/e-cal-client.c:6742 -+#: ../calendar/libecal/e-cal-client.c:6750 - #: ../camel/providers/imapx/camel-imapx-command.c:645 --#: ../camel/providers/imapx/camel-imapx-server.c:4835 --#: ../camel/providers/imapx/camel-imapx-server.c:4844 -+#: ../camel/providers/imapx/camel-imapx-server.c:4871 -+#: ../camel/providers/imapx/camel-imapx-server.c:4880 - #: ../libedataserver/e-client.c:185 - msgid "Unknown error" - msgstr "未知的错误" - - #. Query for new contacts asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:828 -+#: ../addressbook/backends/google/e-book-backend-google.c:822 - msgid "Querying for updated contacts…" - msgstr "查询更新的联系人..." - - #. Run the query asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:1010 -+#: ../addressbook/backends/google/e-book-backend-google.c:1004 - msgid "Querying for updated groups…" - msgstr "查询更新的组..." - --#: ../addressbook/backends/google/e-book-backend-google.c:1757 -+#: ../addressbook/backends/google/e-book-backend-google.c:1751 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:4997 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1433 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1434 - msgid "The backend does not support bulk additions" - msgstr "后端不支持批量添加" - --#: ../addressbook/backends/google/e-book-backend-google.c:1912 -+#: ../addressbook/backends/google/e-book-backend-google.c:1906 - #: ../addressbook/backends/ldap/e-book-backend-ldap.c:5133 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1545 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1546 - msgid "The backend does not support bulk modifications" - msgstr "后端不支持批量修改" - --#: ../addressbook/backends/google/e-book-backend-google.c:2119 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1645 -+#: ../addressbook/backends/google/e-book-backend-google.c:2113 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1646 - msgid "The backend does not support bulk removals" - msgstr "后端不支持批量删除" - --#: ../addressbook/backends/google/e-book-backend-google.c:2239 -+#: ../addressbook/backends/google/e-book-backend-google.c:2233 - msgid "Loading…" - msgstr "正在载入..." - -@@ -276,44 +276,44 @@ - msgid "Failed to get the DN for user '%s'" - msgstr "无法获取用户“%s”的 DN" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:864 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:865 - msgid "Loading Addressbook summary..." - msgstr "正在加载地址簿概要..." - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:884 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:885 - #, c-format - msgid "PROPFIND on webdav failed with HTTP status %d (%s)" - msgstr "webdav 上的 PROPFIND 失败,HTTP 状态码:%d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:903 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:904 - msgid "No response body in webdav PROPFIND result" - msgstr "在 webdav PROPFIND 结果中无应答主体" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:964 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:965 - #, c-format - msgid "Loading Contacts (%d%%)" - msgstr "正在加载联系人(%d%%)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1353 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1354 - msgid "Cannot transform SoupURI to string" - msgstr "无法将 SoupURI 转为字符串" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1474 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1475 - #, c-format - msgid "Create resource '%s' failed with HTTP status %d (%s)" - msgstr "创建资源“%s”失败,HTTP 状态码为: %d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1576 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1577 - msgid "Contact on server changed -> not modifying" - msgstr "服务器上的联系人已更改 -> 将不做更改" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1584 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1585 - #, c-format - msgid "Modify contact failed with HTTP status %d (%s)" - msgstr "修改联系人失败,HTTP 状态码:%d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1677 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1693 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1678 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1694 - #, c-format - msgid "DELETE failed with HTTP status %d" - msgstr "DELETE 失败,HTTP 状态码:%d" -@@ -917,7 +917,7 @@ - msgid "Twitter Name List" - msgstr "Twitter 姓名列表" - --#: ../addressbook/libebook-contacts/e-contact.c:1654 -+#: ../addressbook/libebook-contacts/e-contact.c:1660 - #: ../addressbook/libebook/e-destination.c:920 - msgid "Unnamed List" - msgstr "未命名的列表" -@@ -940,7 +940,8 @@ - - #: ../addressbook/libebook-contacts/e-phone-number.c:49 - msgid "" --"Remaining text after the country calling code is too short for a phone number" -+"Remaining text after the country calling code is too short for a phone " -+"number" - msgstr "国家代码之后的电话号码太短" - - #: ../addressbook/libebook-contacts/e-phone-number.c:51 -@@ -970,65 +971,63 @@ - msgid "Unable to connect to '%s': " - msgstr "无法连接到“%s”:" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:899 --#: ../addressbook/libedata-book/e-book-sqlite.c:2178 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:906 -+#: ../addressbook/libedata-book/e-book-sqlite.c:2201 - #, c-format - msgid "Error introspecting unknown summary field '%s'" - msgstr "检查未知概要信息字段“%s”出错" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1509 --#: ../addressbook/libedata-book/e-book-sqlite.c:1334 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1516 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1340 - msgid "Error parsing regular expression" - msgstr "执行搜索表达式错误" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1554 --#: ../addressbook/libedata-book/e-book-sqlite.c:1818 ../camel/camel-db.c:582 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1561 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1824 ../camel/camel-db.c:619 - #, c-format - msgid "Insufficient memory" - msgstr "内存不足" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1691 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1698 - #, c-format - msgid "Invalid contact field '%d' specified in summary" - msgstr "概要中的联系人字段“%d”无效" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1725 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1732 - #: ../addressbook/libedata-book/e-book-sqlite.c:559 - #, c-format - msgid "" - "Contact field '%s' of type '%s' specified in summary, but only boolean, " - "string and string list field types are supported" --msgstr "" --"概要中定义了“%2$s”类型的联系人字段“%1$s”,但是程序只持布尔值、字符串和字符串" --"列表类型。" -+msgstr "概要中定义了“%2$s”类型的联系人字段“%1$s”,但是程序只持布尔值、字符串和字符串列表类型。" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3065 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4161 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3072 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4168 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. vcards cannot be returned." - msgstr "缓存中没有保存完整的 search_contacts,无法返回电子名片。" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4292 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4385 --#: ../addressbook/libedata-book/e-book-sqlite.c:5400 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4299 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4392 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5451 - #, c-format - msgid "Query contained unsupported elements" - msgstr "查询中包含不支持的元素" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4296 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4303 - #, c-format - msgid "Invalid Query" - msgstr "无效的查询" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4320 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4327 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. Hence only summary query is " - "supported." - msgstr "缓存中没有保存完整的 search_contacts,所以只支持概要查询。" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4389 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4396 - #: ../addressbook/libedata-book/e-data-book.c:383 - #: ../addressbook/libedata-book/e-data-book.c:1028 - #: ../calendar/libedata-cal/e-data-cal.c:420 -@@ -1037,48 +1036,48 @@ - msgid "Invalid query" - msgstr "无效的查询" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4432 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4439 - #, c-format - msgid "" - "Full vcards are not stored in cache. Hence only summary query is supported." - msgstr "缓存中没有保存完整的电子名片,所以只支持概要查询。" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5255 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5262 - #, c-format - msgid "Unable to remove the db file: errno %d" - msgstr "无法删除数据库文件:错误代码 %d" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6042 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6442 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6449 - #, c-format - msgid "Only summary queries are supported by EbSdbCursor" - msgstr "EbSdbCursor 只支持概要查询" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6056 - #, c-format - msgid "At least one sort field must be specified to use an EbSdbCursor" - msgstr "使用 EbSdbCursor 时必须指定至少一个排序字段" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6063 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 - #, c-format - msgid "Cannot sort by a field that is not in the summary" - msgstr "无法按不在概要中的字段排序" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6077 - #, c-format - msgid "Cannot sort by a field which may have multiple values" - msgstr "无法按可能有多个值的字段排序" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6203 --#: ../addressbook/libedata-book/e-book-sqlite.c:7412 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6210 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7463 - #, c-format - msgid "" - "Tried to step a cursor in reverse, but cursor is already at the beginning of " - "the contact list" - msgstr "尝试对 cursor 反向步进,但 cursor 已位于联系人列表的开头" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6211 --#: ../addressbook/libedata-book/e-book-sqlite.c:7420 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6218 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7471 - #, c-format - msgid "" - "Tried to step a cursor forwards, but cursor is already at the end of the " -@@ -1090,28 +1089,26 @@ - msgid "Unsupported contact field '%d' specified in summary" - msgstr "不支持概要中指定的联系人字段“%d”" - --#: ../addressbook/libedata-book/e-book-sqlite.c:1891 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1897 - msgid "" - "Cannot upgrade contacts database from a legacy database with more than one " - "addressbook. Delete one of the entries in the 'folders' table first." --msgstr "" --"无法从包含多于一个地址簿的旧数据库升级联系人数据库。请先删除“folders”表中的一" --"条记录。" -+msgstr "无法从包含多于一个地址簿的旧数据库升级联系人数据库。请先删除“folders”表中的一条记录。" - --#: ../addressbook/libedata-book/e-book-sqlite.c:5393 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5444 - #, c-format - msgid "Invalid query: %s" - msgstr "无效的查询:%s" - --#: ../addressbook/libedata-book/e-book-sqlite.c:5568 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5619 - msgid "Invalid query for EbSqlCursor" - msgstr "无效的 EbSqlCursor 查询" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7234 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7285 - msgid "At least one sort field must be specified to use an EbSqlCursor" - msgstr "要使用 EbSqlCursor 至少要指定一个排序字段" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7252 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7303 - msgid "Cannot sort by a field that is not a string type" - msgstr "无法按非字符串类型的字段排序" - -@@ -1277,15 +1274,15 @@ - msgid "Cannot remove contacts: " - msgstr "无法移除联系人:" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:772 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:776 - msgid "Cursor does not support setting the search expression" - msgstr "Cursor 不支持设置搜索表达式" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:855 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:859 - msgid "Cursor does not support step" - msgstr "Cursor 不支持步进" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:938 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:942 - msgid "Cursor does not support alphabetic indexes" - msgstr "Cursor 不支持字母表索引" - -@@ -1319,64 +1316,63 @@ - msgid "No such source for UID '%s'" - msgstr "没有 UID “%s”的源" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:581 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 - #, c-format - msgid "Server is unreachable (%s)" - msgstr "服务器不可用 (%s)" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:612 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 - #, c-format - msgid "Failed to connect to a server using SSL: %s" - msgstr "无法使用 SSL 连接到服务器:%s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:623 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 - #, c-format --msgid "Unexpected HTTP status code %d returned (%s)" --msgstr "返回了意外的 HTTP 状态代码 %d(%s)" -+msgid "Unexpected HTTP status code %d returned (%s) for URI: %s" -+msgstr "为 URI 返回的(%s)意外 HTTP 状态代码 %d:%s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:642 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:647 - msgid "CalDAV backend is not loaded yet" - msgstr "CalDAV 后端尚未加载" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1084 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1091 - msgid "Invalid Redirect URL" - msgstr "无效的重定向 URL" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2887 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2894 - #, c-format - msgid "Cannot create local cache folder '%s'" - msgstr "无法创建本地缓存文件夹“%s”" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2939 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2946 - #, c-format - msgid "" - "Server is unreachable, calendar is opened in read-only mode.\n" - "Error message: %s" --msgstr "" --"服务器不可用,日历将以只读模式打开。\n" -+msgstr "服务器不可用,日历将以只读模式打开。\n" - "错误消息:%s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3973 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3988 - msgid "CalDAV does not support bulk additions" - msgstr "CalDAV 不支持批量添加" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4076 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4091 - msgid "CalDAV does not support bulk modifications" - msgstr "CalDAV 不支持批量修改" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4252 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4267 - msgid "CalDAV does not support bulk removals" - msgstr "CalDAV 不支持批量删除" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4926 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4941 - msgid "Calendar doesn't support Free/Busy" - msgstr "日历不支持空闲/繁忙" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4935 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4950 - msgid "Schedule outbox url not found" - msgstr "未找到定时发件箱 url" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5032 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5047 - msgid "Unexpected result in schedule-response" - msgstr "定时响应的结果异常" - -@@ -1424,74 +1420,75 @@ - msgstr "不是日历。" - - #: ../calendar/backends/http/e-cal-backend-http.c:925 --#: ../calendar/backends/weather/e-cal-backend-weather.c:536 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:700 - msgid "Could not create cache file" - msgstr "无法创建缓存文件" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:174 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:196 - msgid "Could not retrieve weather data" - msgstr "无法获取天气数据" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:295 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:369 - msgid "Weather: Fog" - msgstr "天气:雾" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:296 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:370 - msgid "Weather: Cloudy Night" - msgstr "天气:多云夜晚" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:297 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:371 - msgid "Weather: Cloudy" - msgstr "天气:多云" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:298 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:372 - msgid "Weather: Overcast" - msgstr "天气:阴天" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:299 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:373 - msgid "Weather: Showers" - msgstr "天气:阵雨" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:300 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:374 - msgid "Weather: Snow" - msgstr "天气:雪" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:301 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:375 - msgid "Weather: Clear Night" - msgstr "天气:晴朗夜晚" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:302 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:376 - msgid "Weather: Sunny" - msgstr "天气:晴" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:303 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:377 - msgid "Weather: Thunderstorms" - msgstr "天气:暴风雨" - - #. TRANSLATOR: This is the temperature in degrees Fahrenheit (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:329 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:403 - #, c-format - msgid "%.1f °F" - msgstr "%.1f °F" - - #. TRANSLATOR: This is the temperature in degrees Celsius (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:332 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:406 - #, c-format - msgid "%.1f °C" - msgstr "%.1f °C" - - #. TRANSLATOR: This is the temperature in kelvin --#: ../calendar/backends/weather/e-cal-backend-weather.c:335 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:409 - #, c-format - msgid "%.1f K" - msgstr "%.1f K" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:341 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:415 - #, c-format - msgid "%.1f" - msgstr "%.1f" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:452 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:580 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:608 - msgid "Forecast" - msgstr "天气预报" - -@@ -1580,7 +1577,7 @@ - msgid "Cannot change value of calendar property '%s'" - msgstr "无法更改日历属性的值“%s”" - --#: ../calendar/libecal/e-cal-component.c:1348 -+#: ../calendar/libecal/e-cal-component.c:1349 - msgid "Untitled appointment" - msgstr "无标题约会" - -@@ -1729,111 +1726,109 @@ - msgid "Undefined" - msgstr "未定义" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:84 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1062 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1371 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1498 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1547 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:85 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1063 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1379 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1506 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1555 - #, c-format - msgid "\"%s\" expects one argument" - msgstr "“%s”需要一个参数" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:91 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:673 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1378 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:92 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:674 - #: ../calendar/libedata-cal/e-cal-backend-sexp.c:1386 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1394 - #, c-format - msgid "\"%s\" expects the first argument to be a string" - msgstr "“%s”需要第一个参数是字符串" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:166 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:167 - #, c-format - msgid "\"%s\" expects two or three arguments" - msgstr "“%s”需要两个或三个参数" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:173 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:262 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:324 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:823 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1069 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1447 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1505 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1554 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:174 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:263 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:325 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:824 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1070 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1455 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1513 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1562 - #, c-format - msgid "\"%s\" expects the first argument to be a time_t" - msgstr "“%s”的第一个参数应该是 time_t" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:182 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:270 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:334 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:832 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:183 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:271 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:335 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:833 - #, c-format - msgid "\"%s\" expects the second argument to be a time_t" - msgstr "“%s”的第一个参数应该是 time_t" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:192 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:193 - #, c-format - msgid "\"%s\" expects the third argument to be a string" - msgstr "“%s”需要第三个参数是字符串" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:254 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:255 - #, c-format - msgid "\"%s\" expects none or two arguments" - msgstr "“%s”需要零个或两个参数" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:317 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:666 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:816 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1440 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:318 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:667 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:817 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1448 - #, c-format - msgid "\"%s\" expects two arguments" - msgstr "“%s”需要两个参数" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:602 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:625 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:748 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:780 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:987 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1020 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1332 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:603 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:626 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:749 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:781 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:988 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1021 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1340 - #, c-format - msgid "\"%s\" expects no arguments" - msgstr "“%s”不需要参数" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:682 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:683 - #, c-format - msgid "\"%s\" expects the second argument to be a string" - msgstr "“%s”的第二个参数应该是字符串" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:713 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:714 - #, c-format - msgid "" - "\"%s\" expects the first argument to be either \"any\", \"summary\", or " - "\"description\", or \"location\", or \"attendee\", or \"organizer\", or " - "\"classification\"" - msgstr "" --"“%s”的第一个参数必须" --"是“any”、“summary”、“description”、“location”、“attendee”、“organizer”、“classification”之" --"一" -+"“%s”的第一个参数必须是“any”、“summary”、“description”、“location”、“attendee”、“organizer”、“classification”之一" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:884 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:885 - #, c-format - msgid "\"%s\" expects at least one argument" - msgstr "“%s”至少需要一个参数" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:899 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:900 - #, c-format - msgid "" - "\"%s\" expects all arguments to be strings or one and only one argument to " - "be a boolean false (#f)" - msgstr "“%s”的所有参数都应该为字符串或者它唯一的参数为布尔假 (#f)" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1395 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1403 - #, c-format - msgid "\"%s\" expects the first argument to be an ISO 8601 date/time string" - msgstr "“%s”的第一个参数必须是 ISO 8601 日期/时间字符串" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1456 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1464 - #, c-format - msgid "\"%s\" expects the second argument to be an integer" - msgstr "“%s”的第二个参数应该是整数" -@@ -2140,146 +2135,136 @@ - - #: ../camel/camel-folder-search.c:1943 ../camel/camel-folder-search.c:2109 - #, c-format --msgid "" --"Cannot parse search expression: %s:\n" -+msgid "Cannot parse search expression: %s:\n" - "%s" --msgstr "" --"无法解析搜索表达式:%s:\n" -+msgstr "无法解析搜索表达式:%s:\n" - "%s" - - #: ../camel/camel-folder-search.c:1955 ../camel/camel-folder-search.c:2121 - #, c-format --msgid "" --"Error executing search expression: %s:\n" -+msgid "Error executing search expression: %s:\n" - "%s" --msgstr "" --"执行搜索表达式错误:%s:\n" -+msgstr "执行搜索表达式错误:%s:\n" - "%s" - --#: ../camel/camel-gpg-context.c:721 ../camel/camel-gpg-context.c:726 --#: ../camel/camel-gpg-context.c:1383 -+#: ../camel/camel-gpg-context.c:725 ../camel/camel-gpg-context.c:730 -+#: ../camel/camel-gpg-context.c:1387 - #, c-format - msgid "Failed to execute gpg: %s" - msgstr "执行 gpg 失败:%s" - --#: ../camel/camel-gpg-context.c:726 -+#: ../camel/camel-gpg-context.c:730 - #: ../camel/providers/smtp/camel-smtp-transport.c:963 - msgid "Unknown" - msgstr "未知" - --#: ../camel/camel-gpg-context.c:791 -+#: ../camel/camel-gpg-context.c:795 - #, c-format --msgid "" --"Unexpected GnuPG status message encountered:\n" -+msgid "Unexpected GnuPG status message encountered:\n" - "\n" - "%s" --msgstr "" --"遇到了意外的 GnuPG 状态消息:\n" -+msgstr "遇到了意外的 GnuPG 状态消息:\n" - "\n" - "%s" - --#: ../camel/camel-gpg-context.c:827 -+#: ../camel/camel-gpg-context.c:831 - #, c-format - msgid "Failed to parse gpg userid hint." - msgstr "解析 gpg userid 提示失败。" - --#: ../camel/camel-gpg-context.c:852 ../camel/camel-gpg-context.c:867 -+#: ../camel/camel-gpg-context.c:856 ../camel/camel-gpg-context.c:871 - #, c-format - msgid "Failed to parse gpg passphrase request." - msgstr "解析 gpg 密码句请求失败。" - --#: ../camel/camel-gpg-context.c:888 -+#: ../camel/camel-gpg-context.c:892 - #, c-format --msgid "" --"You need a PIN to unlock the key for your\n" -+msgid "You need a PIN to unlock the key for your\n" - "SmartCard: \"%s\"" --msgstr "" --"您需要一个 PIN 用来解锁您的智能卡:\n" -+msgstr "您需要一个 PIN 用来解锁您的智能卡:\n" - "“%s”" - --#: ../camel/camel-gpg-context.c:892 -+#: ../camel/camel-gpg-context.c:896 - #, c-format --msgid "" --"You need a passphrase to unlock the key for\n" -+msgid "You need a passphrase to unlock the key for\n" - "user: \"%s\"" --msgstr "" --"您需要一个密码句用来解锁以下用户:\n" -+msgstr "您需要一个密码句用来解锁以下用户:\n" - "“%s”" - --#: ../camel/camel-gpg-context.c:898 -+#: ../camel/camel-gpg-context.c:902 - #, c-format - msgid "Unexpected request from GnuPG for '%s'" - msgstr "GnuPG 对“%s”的意外响应" - --#: ../camel/camel-gpg-context.c:910 -+#: ../camel/camel-gpg-context.c:914 - msgid "" - "Note the encrypted content doesn't contain information about a recipient, " - "thus there will be a password prompt for each of stored private key." - msgstr "请注意加密的内容里不包含收件人信息,因此可能会请求输出每个私钥的口令。" - --#: ../camel/camel-gpg-context.c:941 ../camel/camel-net-utils.c:524 -+#: ../camel/camel-gpg-context.c:945 ../camel/camel-net-utils.c:524 - #: ../camel/providers/nntp/camel-nntp-summary.c:401 - #: ../libedataserver/e-client.c:158 - #, c-format - msgid "Cancelled" - msgstr "已取消" - --#: ../camel/camel-gpg-context.c:962 -+#: ../camel/camel-gpg-context.c:966 - #, c-format - msgid "Failed to unlock secret key: 3 bad passphrases given." - msgstr "解锁密钥失败:给出了 3 个错误的密码句。" - --#: ../camel/camel-gpg-context.c:975 -+#: ../camel/camel-gpg-context.c:979 - #, c-format - msgid "Unexpected response from GnuPG: %s" - msgstr "来自 GnuPG 的意外应答:%s" - --#: ../camel/camel-gpg-context.c:1106 -+#: ../camel/camel-gpg-context.c:1110 - #, c-format - msgid "Failed to encrypt: No valid recipients specified." - msgstr "加密失败:没有指定有效的收件人。" - --#: ../camel/camel-gpg-context.c:1658 ../camel/camel-smime-context.c:844 -+#: ../camel/camel-gpg-context.c:1662 ../camel/camel-smime-context.c:844 - msgid "Could not generate signing data: " - msgstr "无法生成签名数据:" - --#: ../camel/camel-gpg-context.c:1708 ../camel/camel-gpg-context.c:1919 --#: ../camel/camel-gpg-context.c:2029 ../camel/camel-gpg-context.c:2178 -+#: ../camel/camel-gpg-context.c:1712 ../camel/camel-gpg-context.c:1924 -+#: ../camel/camel-gpg-context.c:2034 ../camel/camel-gpg-context.c:2183 - msgid "Failed to execute gpg." - msgstr "执行 gpg 失败。" - --#: ../camel/camel-gpg-context.c:1791 ../camel/camel-gpg-context.c:1799 --#: ../camel/camel-gpg-context.c:1807 ../camel/camel-gpg-context.c:1827 -+#: ../camel/camel-gpg-context.c:1795 ../camel/camel-gpg-context.c:1803 -+#: ../camel/camel-gpg-context.c:1811 ../camel/camel-gpg-context.c:1831 - #: ../camel/camel-smime-context.c:973 ../camel/camel-smime-context.c:987 - #: ../camel/camel-smime-context.c:996 - #, c-format - msgid "Cannot verify message signature: Incorrect message format" - msgstr "无法校验消息签名:消息格式不对" - --#: ../camel/camel-gpg-context.c:1873 -+#: ../camel/camel-gpg-context.c:1877 - msgid "Cannot verify message signature: " - msgstr "无法校验消息签名:" - --#: ../camel/camel-gpg-context.c:1995 -+#: ../camel/camel-gpg-context.c:2000 - msgid "Could not generate encrypting data: " - msgstr "无法生成加密数据:" - --#: ../camel/camel-gpg-context.c:2048 -+#: ../camel/camel-gpg-context.c:2053 - msgid "This is a digitally encrypted message part" - msgstr "这是消息的数字加密部分" - --#: ../camel/camel-gpg-context.c:2104 ../camel/camel-gpg-context.c:2113 --#: ../camel/camel-gpg-context.c:2136 -+#: ../camel/camel-gpg-context.c:2109 ../camel/camel-gpg-context.c:2118 -+#: ../camel/camel-gpg-context.c:2141 - #, c-format - msgid "Cannot decrypt message: Incorrect message format" - msgstr "无法解密消息:消息格式不对" - --#: ../camel/camel-gpg-context.c:2124 -+#: ../camel/camel-gpg-context.c:2129 - #, c-format - msgid "Failed to decrypt MIME part: protocol error" - msgstr "解密 MIME 部分失败:协议错误" - --#: ../camel/camel-gpg-context.c:2219 ../camel/camel-smime-context.c:1289 -+#: ../camel/camel-gpg-context.c:2224 ../camel/camel-smime-context.c:1289 - msgid "Encrypted content" - msgstr "加密内容" - -@@ -2472,29 +2457,23 @@ - - #: ../camel/camel-sasl-anonymous.c:79 - #, c-format --msgid "" --"Invalid email address trace information:\n" -+msgid "Invalid email address trace information:\n" - "%s" --msgstr "" --"无效的电子邮件跟踪信息:\n" -+msgstr "无效的电子邮件跟踪信息:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:93 - #, c-format --msgid "" --"Invalid opaque trace information:\n" -+msgid "Invalid opaque trace information:\n" - "%s" --msgstr "" --"无效的诲涩跟踪信息:\n" -+msgstr "无效的诲涩跟踪信息:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:107 - #, c-format --msgid "" --"Invalid trace information:\n" -+msgid "Invalid trace information:\n" - "%s" --msgstr "" --"无效的跟踪信息:\n" -+msgstr "无效的跟踪信息:\n" - "%s" - - #: ../camel/camel-sasl-cram-md5.c:44 -@@ -2552,7 +2531,8 @@ - msgstr "GSSAPI" - - #: ../camel/camel-sasl-gssapi.c:97 --msgid "This option will connect to the server using Kerberos 5 authentication." -+msgid "" -+"This option will connect to the server using Kerberos 5 authentication." - msgstr "该选项将用 Kerberos 5 认证连接到服务器。" - - #: ../camel/camel-sasl-gssapi.c:149 -@@ -2580,8 +2560,7 @@ - msgid "" - "The input_token contains different channel bindings to those specified via " - "the input_chan_bindings parameter." --msgstr "" --"input_token 包含的通道绑定与通过 input_chan_bindings 参数指定的通道不同。" -+msgstr "input_token 包含的通道绑定与通过 input_chan_bindings 参数指定的通道不同。" - - #: ../camel/camel-sasl-gssapi.c:199 - msgid "" -@@ -2683,9 +2662,9 @@ - msgstr "为协议“%s”注册的 GType 无效" - - #: ../camel/camel-session.c:502 --#: ../camel/providers/imapx/camel-imapx-server.c:4785 -+#: ../camel/providers/imapx/camel-imapx-server.c:4821 - #: ../camel/providers/pop3/camel-pop3-store.c:311 --#: ../camel/providers/pop3/camel-pop3-store.c:757 -+#: ../camel/providers/pop3/camel-pop3-store.c:766 - #: ../camel/providers/smtp/camel-smtp-transport.c:545 - #, c-format - msgid "No support for %s authentication" -@@ -2921,18 +2900,22 @@ - msgstr "创建文件夹“%s”" - - #: ../camel/camel-store.c:2404 ../camel/camel-vee-store.c:410 --#: ../camel/providers/local/camel-maildir-store.c:321 -+#: ../camel/providers/local/camel-maildir-store.c:346 - #, c-format - msgid "Cannot delete folder: %s: Invalid operation" - msgstr "无法删除文件夹:%s:无效操作" - - #: ../camel/camel-store.c:2594 ../camel/camel-vee-store.c:461 --#: ../camel/providers/local/camel-maildir-store.c:872 -+#: ../camel/providers/local/camel-maildir-store.c:914 - #, c-format - msgid "Cannot rename folder: %s: Invalid operation" - msgstr "无法重命名文件夹:%s:无效操作" - --#: ../camel/camel-stream.c:285 ../camel/camel-stream.c:336 -+#: ../camel/camel-stream.c:170 -+msgid "Cannot write with no base stream" -+msgstr "没有基流则无法写入" -+ -+#: ../camel/camel-stream.c:290 ../camel/camel-stream.c:341 - #, c-format - msgid "Stream type '%s' is not seekable" - msgstr "流类型“%s”是无法定位的" -@@ -3156,225 +3139,225 @@ - msgid "For reading and storing mail on IMAP servers." - msgstr "IMAP 服务器上的邮件的读写。" - --#: ../camel/providers/imapx/camel-imapx-server.c:1015 --#: ../camel/providers/imapx/camel-imapx-server.c:1022 -+#: ../camel/providers/imapx/camel-imapx-server.c:1016 -+#: ../camel/providers/imapx/camel-imapx-server.c:1023 - #, c-format - msgid "Not authenticated" - msgstr "没有验证" - --#: ../camel/providers/imapx/camel-imapx-server.c:1740 -+#: ../camel/providers/imapx/camel-imapx-server.c:1751 - msgid "Server disconnected" - msgstr "服务器断开连接" - --#: ../camel/providers/imapx/camel-imapx-server.c:2234 -+#: ../camel/providers/imapx/camel-imapx-server.c:2252 - msgid "Error writing to cache stream" - msgstr "写入缓存流错误" - --#: ../camel/providers/imapx/camel-imapx-server.c:3622 -+#: ../camel/providers/imapx/camel-imapx-server.c:3640 - msgid "Error performing IDLE" - msgstr "执行 IDLE 命令出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:4624 -+#: ../camel/providers/imapx/camel-imapx-server.c:4660 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: %s" - msgstr "以安全模式连接到 IMAP 服务器 %s 失败:%s" - --#: ../camel/providers/imapx/camel-imapx-server.c:4625 -+#: ../camel/providers/imapx/camel-imapx-server.c:4661 - #: ../camel/providers/smtp/camel-smtp-transport.c:216 - msgid "STARTTLS not supported" - msgstr "不支持 STARTTLS" - --#: ../camel/providers/imapx/camel-imapx-server.c:4685 -+#: ../camel/providers/imapx/camel-imapx-server.c:4721 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: " - msgstr "以安全模式连接到 IMAP 服务器 %s 失败:" - --#: ../camel/providers/imapx/camel-imapx-server.c:4774 -+#: ../camel/providers/imapx/camel-imapx-server.c:4810 - #, c-format - msgid "IMAP server %s does not support %s authentication" - msgstr "IMAP 服务器 %s 不支持 %s 认证" - --#: ../camel/providers/imapx/camel-imapx-server.c:4804 -+#: ../camel/providers/imapx/camel-imapx-server.c:4840 - #: ../camel/providers/nntp/camel-nntp-store.c:394 - #: ../camel/providers/nntp/camel-nntp-store.c:531 - msgid "Cannot authenticate without a username" - msgstr "无法进行无用户名的认证" - --#: ../camel/providers/imapx/camel-imapx-server.c:4813 -+#: ../camel/providers/imapx/camel-imapx-server.c:4849 - #: ../camel/providers/nntp/camel-nntp-store.c:540 - #: ../camel/providers/pop3/camel-pop3-store.c:678 --#: ../camel/providers/pop3/camel-pop3-store.c:699 -+#: ../camel/providers/pop3/camel-pop3-store.c:708 - msgid "Authentication password not available" - msgstr "密码认证不可用" - --#: ../camel/providers/imapx/camel-imapx-server.c:5049 --#: ../camel/providers/imapx/camel-imapx-server.c:5108 -+#: ../camel/providers/imapx/camel-imapx-server.c:5085 -+#: ../camel/providers/imapx/camel-imapx-server.c:5144 - msgid "Error fetching message" - msgstr "取回消息出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:5101 -+#: ../camel/providers/imapx/camel-imapx-server.c:5137 - msgid "Failed to close the tmp stream" - msgstr "无法关闭临时流" - --#: ../camel/providers/imapx/camel-imapx-server.c:5137 -+#: ../camel/providers/imapx/camel-imapx-server.c:5173 - msgid "Failed to copy the tmp file" - msgstr "无法复制临时文件" - --#: ../camel/providers/imapx/camel-imapx-server.c:5278 -+#: ../camel/providers/imapx/camel-imapx-server.c:5345 - msgid "Error moving messages" - msgstr "移动消息出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:5282 -+#: ../camel/providers/imapx/camel-imapx-server.c:5349 - msgid "Error copying messages" - msgstr "复制消息出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:5504 -+#: ../camel/providers/imapx/camel-imapx-server.c:5579 - msgid "Error appending message" - msgstr "追加消息出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:5740 -+#: ../camel/providers/imapx/camel-imapx-server.c:5815 - msgid "Error fetching message headers" - msgstr "取回消息头出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:5907 -+#: ../camel/providers/imapx/camel-imapx-server.c:5982 - msgid "Error retrieving message" - msgstr "收取消息出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:6041 --#: ../camel/providers/imapx/camel-imapx-server.c:6270 -+#: ../camel/providers/imapx/camel-imapx-server.c:6116 -+#: ../camel/providers/imapx/camel-imapx-server.c:6345 - #, c-format - msgid "Fetching summary information for new messages in '%s'" - msgstr "获取“%s”中新消息的概要信息" - --#: ../camel/providers/imapx/camel-imapx-server.c:6093 -+#: ../camel/providers/imapx/camel-imapx-server.c:6168 - #, c-format - msgid "Scanning for changed messages in '%s'" - msgstr "扫描“%s”中更改了的消息" - --#: ../camel/providers/imapx/camel-imapx-server.c:6145 -+#: ../camel/providers/imapx/camel-imapx-server.c:6220 - msgid "Error fetching new messages" - msgstr "取回新消息出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:6418 -+#: ../camel/providers/imapx/camel-imapx-server.c:6493 - msgid "Error refreshing folder" - msgstr "刷新文件夹出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:6568 -+#: ../camel/providers/imapx/camel-imapx-server.c:6643 - msgid "Error expunging message" - msgstr "销毁消息出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:6683 --#: ../camel/providers/imapx/camel-imapx-server.c:6708 -+#: ../camel/providers/imapx/camel-imapx-server.c:6758 -+#: ../camel/providers/imapx/camel-imapx-server.c:6783 - msgid "Error fetching folders" - msgstr "取回文件夹出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:6788 -+#: ../camel/providers/imapx/camel-imapx-server.c:6863 - msgid "Error creating folder" - msgstr "创建文件夹出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:6840 -+#: ../camel/providers/imapx/camel-imapx-server.c:6915 - msgid "Error deleting folder" - msgstr "删除文件夹出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:6916 -+#: ../camel/providers/imapx/camel-imapx-server.c:6991 - msgid "Error renaming folder" - msgstr "重命名文件夹出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:6990 -+#: ../camel/providers/imapx/camel-imapx-server.c:7065 - msgid "Error subscribing to folder" - msgstr "订阅文件夹出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:7056 -+#: ../camel/providers/imapx/camel-imapx-server.c:7131 - msgid "Error unsubscribing from folder" - msgstr "取消订阅文件夹出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:7118 -+#: ../camel/providers/imapx/camel-imapx-server.c:7193 - msgid "Error retrieving quota information" - msgstr "获取配额信息出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:7170 -+#: ../camel/providers/imapx/camel-imapx-server.c:7245 - msgid "Search failed" - msgstr "搜索失败" - --#: ../camel/providers/imapx/camel-imapx-server.c:7232 -+#: ../camel/providers/imapx/camel-imapx-server.c:7307 - msgid "Error performing NOOP" - msgstr "执行 NOOP 出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:7339 -+#: ../camel/providers/imapx/camel-imapx-server.c:7414 - msgid "Error syncing changes" - msgstr "同步变更出错" - --#: ../camel/providers/imapx/camel-imapx-server.c:8331 -+#: ../camel/providers/imapx/camel-imapx-server.c:8446 - #, c-format - msgid "Cannot get message with message ID %s: %s" - msgstr "无法获取消息 ID %s:%s" - --#: ../camel/providers/imapx/camel-imapx-server.c:8332 -+#: ../camel/providers/imapx/camel-imapx-server.c:8447 - msgid "No such message available." - msgstr "没有该消息。" - --#: ../camel/providers/imapx/camel-imapx-server.c:8545 --#: ../camel/providers/imapx/camel-imapx-server.c:8566 -+#: ../camel/providers/imapx/camel-imapx-server.c:8671 -+#: ../camel/providers/imapx/camel-imapx-server.c:8692 - msgid "Cannot create spool file: " - msgstr "无法创建离线文件:" - --#: ../camel/providers/imapx/camel-imapx-server.c:9371 -+#: ../camel/providers/imapx/camel-imapx-server.c:9502 - msgid "IMAP server does not support quotas" - msgstr "IMAP 服务器不支持配额" - - #. create a dummy "." parent inbox, use to scan, then put back at the top level - #: ../camel/providers/imapx/camel-imapx-store.c:223 - #: ../camel/providers/local/camel-maildir-folder.c:482 --#: ../camel/providers/local/camel-maildir-store.c:322 --#: ../camel/providers/local/camel-maildir-store.c:784 --#: ../camel/providers/local/camel-maildir-store.c:790 --#: ../camel/providers/local/camel-maildir-store.c:873 -+#: ../camel/providers/local/camel-maildir-store.c:347 -+#: ../camel/providers/local/camel-maildir-store.c:826 -+#: ../camel/providers/local/camel-maildir-store.c:832 -+#: ../camel/providers/local/camel-maildir-store.c:915 - #: ../camel/providers/local/camel-spool-store.c:393 - msgid "Inbox" - msgstr "收件箱" - --#: ../camel/providers/imapx/camel-imapx-store.c:758 -+#: ../camel/providers/imapx/camel-imapx-store.c:757 - #, c-format - msgid "IMAP server %s" - msgstr "IMAP 服务器 %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:761 -+#: ../camel/providers/imapx/camel-imapx-store.c:760 - #, c-format - msgid "IMAP service for %s on %s" - msgstr "%2$s 为 %1$s 提供的 IMAP 服务" - --#: ../camel/providers/imapx/camel-imapx-store.c:836 -+#: ../camel/providers/imapx/camel-imapx-store.c:835 - #: ../camel/providers/nntp/camel-nntp-provider.c:93 - #: ../camel/providers/pop3/camel-pop3-provider.c:81 - msgid "Password" - msgstr "密码" - --#: ../camel/providers/imapx/camel-imapx-store.c:838 --msgid "This option will connect to the IMAP server using a plaintext password." -+#: ../camel/providers/imapx/camel-imapx-store.c:837 -+msgid "" -+"This option will connect to the IMAP server using a plaintext password." - msgstr "该选项将使用纯文本密码连接到 IMAP 服务器。" - --#: ../camel/providers/imapx/camel-imapx-store.c:917 -+#: ../camel/providers/imapx/camel-imapx-store.c:916 - #, c-format - msgid "No such folder %s" - msgstr "没有文件夹 %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:1328 -+#: ../camel/providers/imapx/camel-imapx-store.c:1344 - #, c-format - msgid "No IMAP namespace for folder path '%s'" - msgstr "没有对应文件夹路径“%s”的 IMAP 名字空间" - --#: ../camel/providers/imapx/camel-imapx-store.c:1476 -+#: ../camel/providers/imapx/camel-imapx-store.c:1609 - #, c-format - msgid "Retrieving folder list for %s" - msgstr "正在获取“%s”的文件夹列表" - --#: ../camel/providers/imapx/camel-imapx-store.c:1928 -+#: ../camel/providers/imapx/camel-imapx-store.c:2061 - #, c-format --msgid "" --"The folder name \"%s\" is invalid because it contains the character \"%c\"" -+msgid "The folder name \"%s\" is invalid because it contains the character \"%c\"" - msgstr "文件夹名“%s”无效,原因是其中含有字符“%c”" - --#: ../camel/providers/imapx/camel-imapx-store.c:2700 -+#: ../camel/providers/imapx/camel-imapx-store.c:2833 - #: ../camel/providers/nntp/camel-nntp-store.c:1250 - #: ../camel/providers/pop3/camel-pop3-folder.c:450 - #: ../camel/providers/pop3/camel-pop3-folder.c:593 -@@ -3384,7 +3367,7 @@ - #: ../camel/providers/pop3/camel-pop3-store.c:528 - #: ../camel/providers/pop3/camel-pop3-store.c:576 - #: ../camel/providers/pop3/camel-pop3-store.c:668 --#: ../camel/providers/pop3/camel-pop3-store.c:1072 -+#: ../camel/providers/pop3/camel-pop3-store.c:1081 - #, c-format - msgid "You must be working online to complete this operation" - msgstr "您必须在线工作以便完成该操作" -@@ -3411,11 +3394,9 @@ - - #: ../camel/providers/local/camel-local-folder.c:730 - #, c-format --msgid "" --"Cannot get message %s from folder %s\n" -+msgid "Cannot get message %s from folder %s\n" - "%s" --msgstr "" --"无法从文件夹 %2$s 获取消息 %1$s\n" -+msgstr "无法从文件夹 %2$s 获取消息 %1$s\n" - "%3$s" - - #: ../camel/providers/local/camel-local-provider.c:41 -@@ -3438,9 +3419,7 @@ - msgid "" - "For retrieving (moving) local mail from standard mbox-formatted spools into " - "folders managed by Evolution." --msgstr "" --"对于将本地邮件从标准 mbox 格式离线文件夹获取(移动)到由 Evolution 管理的文件" --"夹。" -+msgstr "对于将本地邮件从标准 mbox 格式离线文件夹获取(移动)到由 Evolution 管理的文件夹。" - - #: ../camel/providers/local/camel-local-provider.c:81 - #: ../camel/providers/local/camel-local-provider.c:101 -@@ -3468,8 +3447,7 @@ - msgid "" - "For reading and storing local mail in external standard mbox spool files.\n" - "May also be used to read a tree of Elm, Pine, or Mutt style folders." --msgstr "" --"对于读取和存储外部标准 mbox 离线文件中的本地邮件。\n" -+msgstr "对于读取和存储外部标准 mbox 离线文件中的本地邮件。\n" - "也可用于读取 Elm、Pine 或 Mutt 风格的文件夹树。" - - #: ../camel/providers/local/camel-local-provider.c:123 -@@ -3488,7 +3466,7 @@ - - #: ../camel/providers/local/camel-local-store.c:221 - #: ../camel/providers/local/camel-local-store.c:381 --#: ../camel/providers/local/camel-maildir-store.c:122 -+#: ../camel/providers/local/camel-maildir-store.c:123 - #: ../camel/providers/local/camel-mbox-store.c:572 - #: ../camel/providers/local/camel-spool-store.c:87 - #, c-format -@@ -3503,7 +3481,7 @@ - #: ../camel/providers/local/camel-local-store.c:242 - #: ../camel/providers/local/camel-local-store.c:252 - #: ../camel/providers/local/camel-local-store.c:394 --#: ../camel/providers/local/camel-maildir-store.c:156 -+#: ../camel/providers/local/camel-maildir-store.c:165 - #, c-format - msgid "Cannot get folder: %s: %s" - msgstr "无法获取文件夹:%s:%s" -@@ -3525,7 +3503,7 @@ - msgid "Could not delete folder meta file '%s': %s" - msgstr "无法删除文件夹元文件“%s”:%s" - --#: ../camel/providers/local/camel-local-store.c:594 -+#: ../camel/providers/local/camel-local-store.c:595 - #, c-format - msgid "Could not rename '%s': %s" - msgstr "无法重命名“%s”:%s" -@@ -3550,60 +3528,66 @@ - #: ../camel/providers/local/camel-mh-folder.c:179 - #, c-format - msgid "Cannot get message %s from folder %s: " --msgstr "无法从文件夹 %2$s 获取消息 %1$s:" -+msgstr "无法从文件夹 %s 获取消息 %s:" - - #: ../camel/providers/local/camel-maildir-folder.c:362 - #, c-format - msgid "Cannot transfer message to destination folder: %s" - msgstr "无法将消息转移到目标文件夹:%s" - --#: ../camel/providers/local/camel-maildir-store.c:130 --#: ../camel/providers/local/camel-maildir-store.c:149 --#: ../camel/providers/local/camel-maildir-store.c:881 -+#: ../camel/providers/local/camel-maildir-store.c:131 -+#: ../camel/providers/local/camel-maildir-store.c:931 -+#, c-format -+msgid "Cannot create folder containing '%s'" -+msgstr "无法创建包含 '%s' 的文件夹" -+ -+#: ../camel/providers/local/camel-maildir-store.c:139 -+#: ../camel/providers/local/camel-maildir-store.c:158 -+#: ../camel/providers/local/camel-maildir-store.c:923 - #, c-format - msgid "Folder %s already exists" - msgstr "文件夹 %s 已经存在" - --#: ../camel/providers/local/camel-maildir-store.c:241 --#: ../camel/providers/local/camel-maildir-store.c:272 -+#: ../camel/providers/local/camel-maildir-store.c:266 -+#: ../camel/providers/local/camel-maildir-store.c:297 - #: ../camel/providers/local/camel-mbox-store.c:401 - #: ../camel/providers/local/camel-mbox-store.c:422 - #, c-format - msgid "Cannot create folder '%s': %s" - msgstr "无法创建文件夹“%s”:%s" - --#: ../camel/providers/local/camel-maildir-store.c:256 -+#: ../camel/providers/local/camel-maildir-store.c:281 - #: ../camel/providers/local/camel-mbox-store.c:367 - #: ../camel/providers/local/camel-mh-store.c:523 - #, c-format - msgid "Cannot get folder '%s': %s" - msgstr "无法获取文件夹“%s”:%s" - --#: ../camel/providers/local/camel-maildir-store.c:262 -+#: ../camel/providers/local/camel-maildir-store.c:287 - #: ../camel/providers/local/camel-mbox-store.c:377 - #: ../camel/providers/local/camel-mh-store.c:532 - #, c-format - msgid "Cannot get folder '%s': folder does not exist." - msgstr "无法获得文件夹“%s”:文件夹不存在。" - --#: ../camel/providers/local/camel-maildir-store.c:289 -+#: ../camel/providers/local/camel-maildir-store.c:314 - #, c-format - msgid "Cannot get folder '%s': not a maildir directory." - msgstr "无法获取文件夹“%s”:不是 maildir 目录。" - --#: ../camel/providers/local/camel-maildir-store.c:353 --#: ../camel/providers/local/camel-maildir-store.c:393 -+#: ../camel/providers/local/camel-maildir-store.c:378 -+#: ../camel/providers/local/camel-maildir-store.c:418 - #: ../camel/providers/local/camel-mh-store.c:676 - #, c-format - msgid "Could not delete folder '%s': %s" - msgstr "无法删除文件夹“%s”:%s" - --#: ../camel/providers/local/camel-maildir-store.c:355 -+#: ../camel/providers/local/camel-maildir-store.c:380 - msgid "not a maildir directory" - msgstr "不是 maildir 目录" - --#: ../camel/providers/local/camel-maildir-store.c:637 --#: ../camel/providers/local/camel-maildir-store.c:1095 -+#: ../camel/providers/local/camel-maildir-store.c:666 -+#: ../camel/providers/local/camel-maildir-store.c:1146 - #: ../camel/providers/local/camel-spool-store.c:212 - #: ../camel/providers/local/camel-spool-store.c:231 - #, c-format -@@ -3681,11 +3665,9 @@ - #: ../camel/providers/local/camel-mbox-store.c:663 - #: ../camel/providers/local/camel-mbox-store.c:692 - #, c-format --msgid "" --"Could not delete folder '%s':\n" -+msgid "Could not delete folder '%s':\n" - "%s" --msgstr "" --"无法删除文件夹“%s”:\n" -+msgstr "无法删除文件夹“%s”:\n" - "%s" - - #: ../camel/providers/local/camel-mbox-store.c:673 -@@ -3846,11 +3828,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:494 - #, c-format --msgid "" --"Could not open folder '%s':\n" -+msgid "Could not open folder '%s':\n" - "%s" --msgstr "" --"无法打开文件夹“%s”:\n" -+msgstr "无法打开文件夹“%s”:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:500 -@@ -3860,11 +3840,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:508 - #, c-format --msgid "" --"Could not create folder '%s':\n" -+msgid "Could not create folder '%s':\n" - "%s" --msgstr "" --"无法创建文件夹“%s”:\n" -+msgstr "无法创建文件夹“%s”:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:521 -@@ -3906,8 +3884,7 @@ - msgid "" - "Could not synchronize spool folder %s: %s\n" - "Folder may be corrupt, copy saved in '%s'" --msgstr "" --"无法同步离线文件夹 %s: %s\n" -+msgstr "无法同步离线文件夹 %s: %s\n" - "文件夹可能已损坏,副本已存放在 '%s'" - - #: ../camel/providers/nntp/camel-nntp-folder.c:222 -@@ -4007,12 +3984,10 @@ - - #: ../camel/providers/nntp/camel-nntp-store.c:1151 - #, c-format --msgid "" --"Error retrieving newsgroups:\n" -+msgid "Error retrieving newsgroups:\n" - "\n" - "%s" --msgstr "" --"收取新闻组出错:\n" -+msgstr "收取新闻组出错:\n" - "\n" - "%s" - -@@ -4037,19 +4012,16 @@ - "You cannot subscribe to this newsgroup:\n" - "\n" - "No such newsgroup. The selected item is a probably a parent folder." --msgstr "" --"您无法订阅此新闻组:\n" -+msgstr "您无法订阅此新闻组:\n" - "\n" - "没有这样的新闻组。选中项目可能是父文件夹。" - - #: ../camel/providers/nntp/camel-nntp-store.c:1583 - #, c-format --msgid "" --"You cannot unsubscribe to this newsgroup:\n" -+msgid "You cannot unsubscribe to this newsgroup:\n" - "\n" - "newsgroup does not exist!" --msgstr "" --"您无法订阅此新闻组:\n" -+msgstr "您无法订阅此新闻组:\n" - "\n" - "新闻组不存在!" - -@@ -4166,18 +4138,14 @@ - msgid "" - "This option will connect to the POP server using a plaintext password. This " - "is the only option supported by many POP servers." --msgstr "" --"该选项使 Evolution 在连接到 POP 服务器时使用明文密码。这是许多 POP 服务器唯一" --"支持的选项。" -+msgstr "该选项使 Evolution 在连接到 POP 服务器时使用明文密码。这是许多 POP 服务器唯一支持的选项。" - - #: ../camel/providers/pop3/camel-pop3-provider.c:93 - msgid "" - "This option will connect to the POP server using an encrypted password via " - "the APOP protocol. This may not work for all users even on servers that " - "claim to support it." --msgstr "" --"该选项使 Evolution 在连接到 POP 服务器时使用 APOP 协议。即使是声称支持这一功" --"能的服务器,也不一定能使所有用户工作。" -+msgstr "该选项使 Evolution 在连接到 POP 服务器时使用 APOP 协议。即使是声称支持这一功能的服务器,也不一定能使所有用户工作。" - - #. Translators: This is the separator between an error and an explanation - #: ../camel/providers/pop3/camel-pop3-store.c:97 -@@ -4230,41 +4198,36 @@ - msgid "POP3 server for %s on %s" - msgstr "%2$s 为 %1$s 提供的 POP 服务" - --#: ../camel/providers/pop3/camel-pop3-store.c:713 -+#: ../camel/providers/pop3/camel-pop3-store.c:690 -+#: ../camel/providers/pop3/camel-pop3-store.c:777 - #, c-format --msgid "" --"Unable to connect to POP server %s:\tInvalid APOP ID received. Impersonation " --"attack suspected. Please contact your admin." --msgstr "" --"无法连接到 POP 服务器 %s:\t接收到非法的 APOP ID。可能是冒名攻击。请联系您的" --"管理员。" -+msgid "Unable to connect to POP server %s.\n" -+"Error sending password: " -+msgstr "无法连接到 POP 服务器 %s。\n" -+"发送密码错误:" - --#: ../camel/providers/pop3/camel-pop3-store.c:768 -+#: ../camel/providers/pop3/camel-pop3-store.c:722 - #, c-format - msgid "" --"Unable to connect to POP server %s.\n" --"Error sending password: " --msgstr "" --"无法连接到 POP 服务器 %s。\n" --"发送密码错误:" -+"Unable to connect to POP server %s:\tInvalid APOP ID received. Impersonation " -+"attack suspected. Please contact your admin." -+msgstr "无法连接到 POP 服务器 %s:\t接收到非法的 APOP ID。可能是冒名攻击。请联系您的管理员。" - - #. Translators: Last %s is an optional explanation - #. * beginning with ": " separator. --#: ../camel/providers/pop3/camel-pop3-store.c:783 -+#: ../camel/providers/pop3/camel-pop3-store.c:792 - #, c-format --msgid "" --"Unable to connect to POP server %s.\n" -+msgid "Unable to connect to POP server %s.\n" - "Error sending username%s" --msgstr "" --"无法连接到 POP 服务器 %s。\n" -+msgstr "无法连接到 POP 服务器 %s。\n" - "发送用户名错误%s" - --#: ../camel/providers/pop3/camel-pop3-store.c:865 -+#: ../camel/providers/pop3/camel-pop3-store.c:874 - #, c-format - msgid "No such folder '%s'." - msgstr "没有文件夹“%s”。" - --#: ../camel/providers/pop3/camel-pop3-store.c:882 -+#: ../camel/providers/pop3/camel-pop3-store.c:891 - #, c-format - msgid "POP3 stores have no folder hierarchy" - msgstr "POP3 的存储没有文件夹结构" -@@ -4550,25 +4513,25 @@ - msgid "RCPT TO <%s> failed: " - msgstr "RCPT TO <%s> 失败:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1479 --#: ../camel/providers/smtp/camel-smtp-transport.c:1491 --#: ../camel/providers/smtp/camel-smtp-transport.c:1502 --#: ../camel/providers/smtp/camel-smtp-transport.c:1561 --#: ../camel/providers/smtp/camel-smtp-transport.c:1581 --#: ../camel/providers/smtp/camel-smtp-transport.c:1596 --#: ../camel/providers/smtp/camel-smtp-transport.c:1605 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1509 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1521 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1532 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1594 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1614 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1629 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1638 - msgid "DATA command failed: " - msgstr "DATP 命令失败:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1630 --#: ../camel/providers/smtp/camel-smtp-transport.c:1646 --#: ../camel/providers/smtp/camel-smtp-transport.c:1655 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1663 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1679 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1688 - msgid "RSET command failed: " - msgstr "RSET 命令失败:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1680 --#: ../camel/providers/smtp/camel-smtp-transport.c:1694 --#: ../camel/providers/smtp/camel-smtp-transport.c:1701 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1713 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1727 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1734 - msgid "QUIT command failed: " - msgstr "QUIT 命令失败:" - -@@ -4612,8 +4575,8 @@ - "settings are now integrated into Evolution-Data-Server's account system. See " - "the ESourceProxy API documentation for details." - msgstr "" --"此键在 3.12 版本废弃,不应再用。代理设置现在集成到了 Evolution-Data-See 的帐" --"号系统中。详情参阅 ESourceProxy API 文档。" -+"此键在 3.12 版本废弃,不应再用。代理设置现在集成到了 Evolution-Data-See 的帐号系统中。详情参阅 ESourceProxy " -+"API 文档。" - - #: ../data/org.gnome.evolution.shell.network-config.gschema.xml.in.h:3 - msgid "(Deprecated) Whether to use http-proxy" -@@ -4693,17 +4656,17 @@ - msgid "Password was incorrect" - msgstr "密码错误" - --#: ../libebackend/e-backend.c:419 -+#: ../libebackend/e-backend.c:420 - #, c-format - msgid "%s does not support authentication" - msgstr "%s 不支持认证" - --#: ../libebackend/e-collection-backend.c:936 -+#: ../libebackend/e-collection-backend.c:992 - #, c-format - msgid "%s does not support creating remote resources" - msgstr "%s 不支持创建远程资源" - --#: ../libebackend/e-collection-backend.c:995 -+#: ../libebackend/e-collection-backend.c:1051 - #, c-format - msgid "%s does not support deleting remote resources" - msgstr "%s 不支持删除远程资源" -@@ -4719,7 +4682,7 @@ - msgstr "数据源缺少一个 [%s] 组" - - #: ../libebackend/e-server-side-source.c:1025 --#: ../libedataserver/e-source.c:1394 -+#: ../libedataserver/e-source.c:1351 - #, c-format - msgid "Data source '%s' does not support creating remote resources" - msgstr "数据源“%s”不支持创建远程资源" -@@ -4732,7 +4695,7 @@ - msgstr "数据源“%s”没有合集后端(collection backend)来创建远程资源" - - #: ../libebackend/e-server-side-source.c:1067 --#: ../libedataserver/e-source.c:1507 -+#: ../libedataserver/e-source.c:1464 - #, c-format - msgid "Data source '%s' does not support deleting remote resources" - msgstr "数据源“%s”不支持删除远程资源" -@@ -4744,7 +4707,7 @@ - msgstr "数据源“%s”没有合集后端(collection backend)来删除远程资源" - - #: ../libebackend/e-server-side-source.c:1112 --#: ../libedataserver/e-source.c:1603 -+#: ../libedataserver/e-source.c:1560 - #: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1027 - #, c-format - msgid "Data source '%s' does not support OAuth 2.0 authentication" -@@ -4755,12 +4718,12 @@ - msgid "File must have a '.source' extension" - msgstr "文件扩展名必须为“.source”" - --#: ../libebackend/e-source-registry-server.c:531 --#: ../libedataserver/e-source-registry.c:1957 -+#: ../libebackend/e-source-registry-server.c:535 -+#: ../libedataserver/e-source-registry.c:1944 - msgid "The user declined to authenticate" - msgstr "用户拒绝认证" - --#: ../libebackend/e-source-registry-server.c:800 -+#: ../libebackend/e-source-registry-server.c:804 - #, c-format - msgid "UID '%s' is already in use" - msgstr "UID“%s” 已在使用" -@@ -4958,17 +4921,17 @@ - msgid "Source file is missing a [%s] group" - msgstr "源文件缺少一个 [%s] 组" - --#: ../libedataserver/e-source.c:1174 -+#: ../libedataserver/e-source.c:1131 - #, c-format - msgid "Data source '%s' is not removable" - msgstr "数据源“%s”不是可删除的" - --#: ../libedataserver/e-source.c:1297 -+#: ../libedataserver/e-source.c:1254 - #, c-format - msgid "Data source '%s' is not writable" - msgstr "数据源“%s”不是可写的" - --#: ../libedataserver/e-source.c:1910 -+#: ../libedataserver/e-source.c:1867 - msgid "Unnamed" - msgstr "未命名" - -@@ -4982,40 +4945,39 @@ - msgid "Source '%s' does not support proxy lookups" - msgstr "数据源“%s”不支持代理查找" - --#: ../libedataserver/e-source-webdav.c:1557 -+#: ../libedataserver/e-source-webdav.c:1562 - #, c-format - msgid "" - "SSL certificate for host '%s', used by address book '%s', is not trusted. Do " - "you wish to accept it?" - msgstr "地址簿“%2$s”所使用的主机“%1$s”的 SSL 证书不受信任,您是否想要接受它?" - --#: ../libedataserver/e-source-webdav.c:1566 -+#: ../libedataserver/e-source-webdav.c:1571 - #, c-format - msgid "" - "SSL certificate for host '%s', used by calendar '%s', is not trusted. Do you " - "wish to accept it?" - msgstr "日历“%2$s”所使用的主机“%1$s”的 SSL 证书不受信任,您是否想要接受它?" - --#: ../libedataserver/e-source-webdav.c:1575 -+#: ../libedataserver/e-source-webdav.c:1580 - #, c-format - msgid "" - "SSL certificate for host '%s', used by memo list '%s', is not trusted. Do " - "you wish to accept it?" - msgstr "备忘录“%2$s”所使用的主机“%1$s”的 SSL 证书不受信任,您是否想要接受它?" - --#: ../libedataserver/e-source-webdav.c:1584 -+#: ../libedataserver/e-source-webdav.c:1589 - #, c-format - msgid "" - "SSL certificate for host '%s', used by task list '%s', is not trusted. Do " - "you wish to accept it?" --msgstr "" --"任务列表“%2$s”所使用的主机“%1$s” 的 SSL 证书不受信任,您是否想要接受它?" -+msgstr "任务列表“%2$s”所使用的主机“%1$s” 的 SSL 证书不受信任,您是否想要接受它?" - - #. strptime format of a weekday, a date and a time, - #. * in 12-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1662 ../libedataserver/e-time-utils.c:1961 -+#: ../libedataserver/e-time-utils.c:1681 ../libedataserver/e-time-utils.c:1980 - msgid "%a %m/%d/%Y %I:%M:%S %p" - msgstr "%Y-%m-%d %A%p%I:%M:%S" - -@@ -5023,7 +4985,7 @@ - #. * in 24-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1667 ../libedataserver/e-time-utils.c:1952 -+#: ../libedataserver/e-time-utils.c:1686 ../libedataserver/e-time-utils.c:1971 - msgid "%a %m/%d/%Y %H:%M:%S" - msgstr "%Y-%m-%d %A %H:%M:%S" - -@@ -5031,7 +4993,7 @@ - #. * in 12-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1672 ../libedataserver/e-time-utils.c:1957 -+#: ../libedataserver/e-time-utils.c:1691 ../libedataserver/e-time-utils.c:1976 - msgid "%a %m/%d/%Y %I:%M %p" - msgstr "%Y-%m-%d %A%p%I:%M" - -@@ -5039,78 +5001,78 @@ - #. * in 24-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1677 ../libedataserver/e-time-utils.c:1948 -+#: ../libedataserver/e-time-utils.c:1696 ../libedataserver/e-time-utils.c:1967 - msgid "%a %m/%d/%Y %H:%M" - msgstr "%Y-%m-%d %A %H:%M" - - #. strptime format of a weekday, a date and a time, - #. * in 12-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1682 -+#: ../libedataserver/e-time-utils.c:1701 - msgid "%a %m/%d/%Y %I %p" - msgstr "%Y-%m-%d %A%p%I" - - #. strptime format of a weekday, a date and a time, - #. * in 24-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1687 -+#: ../libedataserver/e-time-utils.c:1706 - msgid "%a %m/%d/%Y %H" - msgstr "%Y-%m-%d %A %H" - - #. strptime format of a weekday and a date. - #. strftime format of a weekday and a date. --#: ../libedataserver/e-time-utils.c:1690 ../libedataserver/e-time-utils.c:1810 --#: ../libedataserver/e-time-utils.c:1943 -+#: ../libedataserver/e-time-utils.c:1709 ../libedataserver/e-time-utils.c:1829 -+#: ../libedataserver/e-time-utils.c:1962 - msgid "%a %m/%d/%Y" - msgstr "%Y-%m-%d %A" - - #. strptime format of a date and a time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1697 -+#: ../libedataserver/e-time-utils.c:1716 - msgid "%m/%d/%Y %I:%M:%S %p" - msgstr "%Y-%m-%d%p%I:%M:%S" - - #. strptime format of a date and a time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1701 -+#: ../libedataserver/e-time-utils.c:1720 - msgid "%m/%d/%Y %H:%M:%S" - msgstr "%Y-%m-%d %H:%M:%S" - - #. strptime format of a date and a time, in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1706 -+#: ../libedataserver/e-time-utils.c:1725 - msgid "%m/%d/%Y %I:%M %p" - msgstr "%Y-%m-%d%p%I:%M" - - #. strptime format of a date and a time, in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1711 -+#: ../libedataserver/e-time-utils.c:1730 - msgid "%m/%d/%Y %H:%M" - msgstr "%Y-%m-%d %H:%M" - - #. strptime format of a date and a time, in 12-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1716 -+#: ../libedataserver/e-time-utils.c:1735 - msgid "%m/%d/%Y %I %p" - msgstr "%Y-%m-%d%p%I" - - #. strptime format of a date and a time, in 24-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1721 -+#: ../libedataserver/e-time-utils.c:1740 - msgid "%m/%d/%Y %H" - msgstr "%Y-%m-%d %H" - - #. strptime format of a weekday and a date. - #. This is the preferred date format for the locale. --#: ../libedataserver/e-time-utils.c:1724 ../libedataserver/e-time-utils.c:1813 -+#: ../libedataserver/e-time-utils.c:1743 ../libedataserver/e-time-utils.c:1832 - msgid "%m/%d/%Y" - msgstr "%Y-%m-%d" - - #. strptime format for a time of day, in 12-hour format. - #. strftime format of a time in 12-hour format. --#: ../libedataserver/e-time-utils.c:1884 ../libedataserver/e-time-utils.c:2005 -+#: ../libedataserver/e-time-utils.c:1903 ../libedataserver/e-time-utils.c:2024 - msgid "%I:%M:%S %p" - msgstr "%p%I:%M:%S" - - #. strptime format for a time of day, in 24-hour format. - #. strftime format of a time in 24-hour format. --#: ../libedataserver/e-time-utils.c:1888 ../libedataserver/e-time-utils.c:1997 -+#: ../libedataserver/e-time-utils.c:1907 ../libedataserver/e-time-utils.c:2016 - msgid "%H:%M:%S" - msgstr "%H:%M:%S" - -@@ -5118,25 +5080,25 @@ - #. * in 12-hour format. - #. strftime format of a time in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1893 ../libedataserver/e-time-utils.c:2002 -+#: ../libedataserver/e-time-utils.c:1912 ../libedataserver/e-time-utils.c:2021 - msgid "%I:%M %p" - msgstr "%p%I:%M" - - #. strptime format for time of day, without seconds 24-hour format. - #. strftime format of a time in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1897 ../libedataserver/e-time-utils.c:1994 -+#: ../libedataserver/e-time-utils.c:1916 ../libedataserver/e-time-utils.c:2013 - msgid "%H:%M" - msgstr "%H:%M" - - #. strptime format for time of day, without seconds 24-hour format, - #. * and no colon. --#: ../libedataserver/e-time-utils.c:1901 -+#: ../libedataserver/e-time-utils.c:1920 - msgid "%H%M" - msgstr "%H%M" - - #. strptime format for hour and AM/PM, 12-hour format. --#: ../libedataserver/e-time-utils.c:1905 -+#: ../libedataserver/e-time-utils.c:1924 - msgid "%I %p" - msgstr "%p%I" - -@@ -5194,30 +5156,24 @@ - msgid "Failed to find ASUrl and OABUrl in autodiscover response" - msgstr "无法在自动发现响应中找到 ASUrl 和 OABUrl" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1260 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1269 - #, c-format - msgid "" - "Cannot find a corresponding account in the org.gnome.OnlineAccounts service " - "from which to obtain an access token for '%s'" - msgstr "通过 org.gnome.OnlineAccounts 服务无法找到“%s”对应的帐号并获取访问令牌" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1290 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1299 - #, c-format - msgid "Failed to obtain an access token for '%s': " - msgstr "无法获取“%s”的访问令牌:" - --#: ../modules/google-backend/module-google-backend.c:205 --#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 --#: ../modules/yahoo-backend/module-yahoo-backend.c:199 --msgid "Calendar" --msgstr "日历" -- --#: ../modules/google-backend/module-google-backend.c:279 -+#: ../modules/google-backend/module-google-backend.c:341 - #: ../modules/yahoo-backend/module-yahoo-backend.c:226 - msgid "Tasks" - msgstr "任务" - --#: ../modules/google-backend/module-google-backend.c:333 -+#: ../modules/google-backend/module-google-backend.c:395 - #: ../modules/ubuntu-online-accounts/contacts.service-type.in.in.h:1 - #: ../services/evolution-source-registry/builtin/contacts-stub.source.in.h:1 - msgid "Contacts" -@@ -5276,6 +5232,11 @@ - msgid "Reason:" - msgstr "原因:" - -+#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 -+#: ../modules/yahoo-backend/module-yahoo-backend.c:199 -+msgid "Calendar" -+msgstr "日历" -+ - #: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:2 - msgid "Integrate your calendars" - msgstr "集成您的日历" -@@ -5327,7 +5288,8 @@ - #: ../modules/ubuntu-online-accounts/uoa-utils.c:281 - #, c-format - msgid "" --"Expected status 200 when requesting your identity, instead got status %d (%s)" -+"Expected status 200 when requesting your identity, instead got status %d " -+"(%s)" - msgstr "请求您身份时的期望状态为 200,但得到的状态为 %d (%s)" - - #: ../modules/ubuntu-online-accounts/uoa-utils.c:101 -@@ -5414,854 +5376,3 @@ - #: ../services/evolution-user-prompter/prompt-user-gtk.c:121 - msgid "_Dismiss" - msgstr "解除(_D)" -- --#~ msgid "No host information available" --#~ msgstr "无可用的主机信息" -- --#~ msgid "Cannot create folder '%s': folder exists" --#~ msgstr "无法创建文件夹“%s”文件夹已存在" -- --#~ msgid "Source stream unavailable" --#~ msgstr "源流不可用" -- --#~ msgid "Cannot create folder '%s': folder exists." --#~ msgstr "无法创建文件夹“%s”:文件夹已存在。" -- --#~ msgid "You may not import keys with this cipher" --#~ msgstr "您不能用此密码导入密钥" -- --#~ msgid "You may not export keys with this cipher" --#~ msgstr "您不能用此密码导出密钥" -- --#~ msgid "" --#~ "Could not write log entry: %s\n" --#~ "Further operations on this server will not be replayed when you\n" --#~ "reconnect to the network." --#~ msgstr "" --#~ "无法写入日志条目:%s\n" --#~ "当您重新连接到网络时本服务器\n" --#~ "上进一步的操作不会重做。" -- --#~ msgid "" --#~ "Could not open '%s':\n" --#~ "%s\n" --#~ "Changes made to this folder will not be resynchronized." --#~ msgstr "" --#~ "无法打开“%s”:\n" --#~ "%s\n" --#~ "对该文件夹的修改不会被重新同步。" -- --#~ msgid "Resynchronizing with server" --#~ msgstr "重新与服务器同步" -- --#~ msgid "Preparing folder '%s' for offline" --#~ msgstr "准备离线文件夹“%s”" -- --#~ msgid "Canceled" --#~ msgstr "已取消" -- --#~ msgid "" --#~ "Alert from IMAP server %s:\n" --#~ "%s" --#~ msgstr "" --#~ "来自 IMAP 服务器 %s 的提醒:\n" --#~ "%s" -- --#~ msgid "Error while fetching messages" --#~ msgstr "取回消息出错" -- --#~ msgid "Fetching summary information for %d message in '%s'" --#~ msgid_plural "Fetching summary information for %d messages in '%s'" --#~ msgstr[0] "获取“%2$s”中“%1$d”条消息的概要信息" -- --#~ msgid "Unknown parent folder: %s" --#~ msgstr "未知的父文件夹:%s" -- --#~ msgid "The parent folder is not allowed to contain subfolders" --#~ msgstr "父文件夹不允许含有子文件夹" -- --#~ msgid "Resolving address" --#~ msgstr "解析地址" -- --#~ msgid "Name lookup failed" --#~ msgstr "名称查阅失败" -- --#~ msgid "Name lookup failed. Check your host name for spelling errors." --#~ msgstr "名称查阅失败,请检查主机名是否存在拼写错误。" -- --#~ msgid "Name lookup failed: %s" --#~ msgstr "名称查阅失败:%s" -- --#~ msgid "Could not connect to '%s:%s': " --#~ msgstr "无法连接到 “%s:%s”:" -- --#~ msgid "Please enter the %s password for %s on host %s." --#~ msgstr "请输入 %2$s@%3$s 的 %1$s 密码" -- --#~ msgid "NSPR error code %d" --#~ msgstr "NSPR 错误代码 %d" -- --#~ msgid "The proxy host does not support SOCKS4" --#~ msgstr "代理主机不支持 SOCKS4" -- --#~ msgid "The proxy host denied our request: code %d" --#~ msgstr "代理主机拒绝了已方的请求:代码 %d" -- --#~ msgid "The proxy host does not support SOCKS5" --#~ msgstr "代理主机不支持 SOCKS5" -- --#~ msgid "Could not find a suitable authentication type: code 0x%x" --#~ msgstr "无法找到合适的认证类型: 代码 0x%x" -- --#~ msgid "General SOCKS server failure" --#~ msgstr "通用 SOCKS 服务器失败" -- --#~ msgid "SOCKS server's rules do not allow connection" --#~ msgstr "SOCKS 服务器的策略不允许连接" -- --#~ msgid "Network is unreachable from SOCKS server" --#~ msgstr "SOCKS 服务器网络不可及" -- --#~ msgid "Host is unreachable from SOCKS server" --#~ msgstr "SOCKS 服务器主机不可及" -- --#~ msgid "Connection refused" --#~ msgstr "连接被拒绝" -- --#~ msgid "Time-to-live expired" --#~ msgstr "连通时间过期" -- --#~ msgid "Command not supported by SOCKS server" --#~ msgstr "SOCKS 服务器不支持该命令" -- --#~ msgid "Address type not supported by SOCKS server" --#~ msgstr "SOCKS 服务器不支持该地址类型" -- --#~ msgid "Unknown error from SOCKS server" --#~ msgstr "SOCKS 服务器发生未知错误" -- --#~ msgid "Got unknown address type from SOCKS server" --#~ msgstr "从 SOCKS 服务器获取的地址类型未知" -- --#~ msgid "Incomplete reply from SOCKS server" --#~ msgstr "SOCKS 服务器的响应不完整" -- --#~ msgid "Hostname is too long (maximum is 255 characters)" --#~ msgstr "主机名太长 (最长 255 字符)" -- --#~ msgid "Invalid reply from proxy server" --#~ msgstr "代理服务器的响应无效" -- --#~ msgid "Unable to add message to summary: unknown reason" --#~ msgstr "无法将消息添加到概要中:未知的原因" -- --#~ msgid "Fatal mail parser error near position %s in folder %s" --#~ msgstr "邮件解析发生致命错误,位于 %s (文件夹 %s)" -- --#~ msgid "You cannot post NNTP messages while working offline!" --#~ msgstr "您离线时无法投递 NNTP 消息!" -- --#~ msgid "" --#~ "What proxy type to use. \"0\" means system, \"1\" means no proxy, \"2\" " --#~ "means manual proxy." --#~ msgstr "" --#~ "使用何种类型的代理。0 代表使用系统代理设置、1 代表不使用代理、2 代表手动设" --#~ "置代理。" -- --#~ msgid "Whether to use proxy for HTTP requests." --#~ msgstr "HTTP 请求是否使用代理。" -- --#~ msgid "Whether authentication is required to access proxy server." --#~ msgstr "访问代理服务器是否需要认证。" -- --#~ msgid "Host name to use for HTTP requests." --#~ msgstr "HTTP 请求使用的主机名" -- --#~ msgid "Port number to use for HTTP requests." --#~ msgstr "HTTP 请求使用的端口。" -- --#~ msgid "User name to use to authenticate against proxy server." --#~ msgstr "认证到代理服务器时使用的用户名。" -- --#~ msgid "Password to use to authenticate against proxy server." --#~ msgstr "认证到代理服务器时使用的密码。" -- --#~ msgid "List of hosts for which do not use proxy." --#~ msgstr "不使用代理的主机列表。" -- --#~ msgid "Host name to use for HTTPS requests." --#~ msgstr "HTTPS 请求使用的主机名。" -- --#~ msgid "Port number to use for HTTPS requests." --#~ msgstr "HTTPS 请求使用的端口。" -- --#~ msgid "Host name to use for SOCKS requests." --#~ msgstr "SOCKS 请求使用的主机名。" -- --#~ msgid "Port number to use for SOCKS requests." --#~ msgstr "SOCKS 请求使用的端口。" -- --#~ msgid "Where to read automatic proxy configuration from." --#~ msgstr "从何处读取自动代理配置信息。" -- --#~ msgid "Not part of certificate" --#~ msgstr "未包括在证书中" -- --#~ msgid "_Close" --#~ msgstr "关闭(_C)" -- --#~ msgid "This certificate has been verified for the following uses:" --#~ msgstr "此证书已通过验证可用于以下用途:" -- --#~ msgid "SSL Client Certificate" --#~ msgstr "SSL 客户端证书" -- --#~ msgid "SSL Server Certificate" --#~ msgstr "SSL 服务器证书" -- --#~ msgid "Email Signer Certificate" --#~ msgstr "邮件签名证书" -- --#~ msgid "Email Recipient Certificate" --#~ msgstr "收件人证书" -- --#~ msgid "Issued To" --#~ msgstr "授予" -- --#~ msgid "Common Name (CN)" --#~ msgstr "公用名(CN)" -- --#~ msgid "Organization (O)" --#~ msgstr "组织(O)" -- --#~ msgid "Organizational Unit (OU)" --#~ msgstr "组织单位(OU)" -- --#~ msgid "Serial Number" --#~ msgstr "序列号" -- --#~ msgid "Issued By" --#~ msgstr "颁发机构" -- --#~ msgid "Validity" --#~ msgstr "有效期" -- --#~ msgid "Issued On" --#~ msgstr "授权时间" -- --#~ msgid "Expires On" --#~ msgstr "过期时间" -- --#~ msgid "Fingerprints" --#~ msgstr "指纹" -- --#~ msgid "SHA1 Fingerprint" --#~ msgstr "SHA1 指纹" -- --#~ msgid "MD5 Fingerprint" --#~ msgstr "MD5 指纹" -- --#~ msgid "General" --#~ msgstr "常规" -- --#~ msgid "Certificate Hierarchy" --#~ msgstr "证书等级" -- --#~ msgid "Certificate Fields" --#~ msgstr "证书字段" -- --#~ msgid "Field Value" --#~ msgstr "字段值" -- --#~ msgid "Details" --#~ msgstr "详细信息" -- --#~ msgid "Version" --#~ msgstr "版本号" -- --#~ msgid "Version 1" --#~ msgstr "版本 1" -- --#~ msgid "Version 2" --#~ msgstr "版本 2" -- --#~ msgid "Version 3" --#~ msgstr "版本 3" -- --#~ msgid "PKCS #1 MD2 With RSA Encryption" --#~ msgstr "PKCS #1 MD2 RSA 加密" -- --#~ msgid "PKCS #1 MD5 With RSA Encryption" --#~ msgstr "PKCS #1 MD5 RSA 加密" -- --#~ msgid "PKCS #1 SHA-1 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-1 RSA 加密" -- --#~ msgid "PKCS #1 SHA-256 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-256 RSA 加密" -- --#~ msgid "PKCS #1 SHA-384 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-384 RSA 加密" -- --#~ msgid "PKCS #1 SHA-512 With RSA Encryption" --#~ msgstr "PKCS #1 SHA-512 RSA 加密" -- --#~ msgid "PKCS #1 RSA Encryption" --#~ msgstr "PKCS #1 RSA 加密" -- --#~ msgid "Certificate Key Usage" --#~ msgstr "证书密钥用途" -- --#~ msgid "Netscape Certificate Type" --#~ msgstr "Netscape 证书类型" -- --#~ msgid "Certificate Authority Key Identifier" --#~ msgstr "证书颁发机构公钥标识" -- --#~ msgid "Object Identifier (%s)" --#~ msgstr "对象标识符(%s)" -- --#~ msgid "Algorithm Identifier" --#~ msgstr "算法标识" -- --#~ msgid "Algorithm Parameters" --#~ msgstr "算法参数" -- --#~ msgid "Subject Public Key Info" --#~ msgstr "证书持有者公钥信息" -- --#~ msgid "Subject Public Key Algorithm" --#~ msgstr "证书持有者的公钥算法" -- --#~ msgid "Subject's Public Key" --#~ msgstr "证书持有者的公钥" -- --#, fuzzy --#~| msgid "Unable to process spool folder" --#~ msgid "Error: Unable to process extension" --#~ msgstr "错误:无法执行扩展" -- --#~ msgid "Email" --#~ msgstr "电子邮件" -- --#~ msgid "Object Signer" --#~ msgstr "物件签署人" -- --#~ msgid "SSL Certificate Authority" --#~ msgstr "SSL 证书颁发机构" -- --#~ msgid "Email Certificate Authority" --#~ msgstr "电子邮件证书颁发机构" -- --#~ msgid "Signing" --#~ msgstr "签名" -- --#~ msgid "Non-repudiation" --#~ msgstr "不可否认" -- --#~ msgid "Key Encipherment" --#~ msgstr "密钥加密" -- --#~ msgid "Data Encipherment" --#~ msgstr "数据加密" -- --#~ msgid "Key Agreement" --#~ msgstr "密钥协商" -- --#~ msgid "Certificate Signer" --#~ msgstr "证书签署者" -- --#~ msgid "CRL Signer" --#~ msgstr "CRL 签署者" -- --#~ msgid "Critical" --#~ msgstr "重要" -- --#~ msgid "Not Critical" --#~ msgstr "非重要" -- --#~ msgid "Extensions" --#~ msgstr "扩展" -- --#~ msgid "%s = %s" --#~ msgstr "%s = %s" -- --#~ msgid "Certificate" --#~ msgstr "证书" -- --#~ msgid "Certificate Signature Algorithm" --#~ msgstr "证书签名算法未知" -- --#~ msgid "Issuer" --#~ msgstr "证书颁发者" -- --#~ msgid "Subject" --#~ msgstr "证书持有者" -- --#~ msgid "Issuer Unique ID" --#~ msgstr "颁发者唯一标识" -- --#~ msgid "Subject Unique ID" --#~ msgstr "持有者唯一标识" -- --#~ msgid "Certificate Signature Value" --#~ msgstr "证书数字签名值 " -- --#~ msgid "_View Certificate" --#~ msgstr "查看证书(_V)" -- --#~ msgid "Detailed information about the certificate:" --#~ msgstr "证书的详细信息:" -- --#~ msgid "Issuer:" --#~ msgstr "颁发机构:" -- --#~ msgid "Subject:" --#~ msgstr "持有者:" -- --#~ msgid "Fingerprint:" --#~ msgstr "指纹:" -- --#~ msgid "Cannot write offline journal for folder '%s': %s" --#~ msgstr "无法写入文件夹“%s”的离线日记:%s" -- --#~ msgid "Failed to build summary for an address book %s" --#~ msgstr "为地址簿 %s 创建摘要失败" -- --#~ msgid "Creating new contact…" --#~ msgstr "创建新的联系人..." -- --#~ msgid "Deleting contact…" --#~ msgstr "删除联系人..." -- --#~ msgid "Modifying contact…" --#~ msgstr "修改联系人..." -- --#~ msgid "Using Distinguished Name (DN)" --#~ msgstr "使用已识别的姓名 (DN)" -- --#~ msgid "Using Email Address" --#~ msgstr "使用电子邮件地址" -- --#~ msgid "Failed to run book factory" --#~ msgstr "运行地址簿工厂失败" -- --#~ msgid "Cannot get connection to view" --#~ msgstr "无法获取到视图的连接" -- --#~ msgid "Cannot process, book backend is opening" --#~ msgstr "无法进行,地址簿后端正在打开" -- --#~ msgid "Empty query: " --#~ msgstr "空的查询:" -- --#~ msgid "Cannot remove book: " --#~ msgstr "无法删除地址簿:" -- --#~ msgid "Cannot get backend property: " --#~ msgstr "无法获取后端属性:" -- --#~ msgid "Cannot set backend property: " --#~ msgstr "无法发送后端属性:" -- --#~ msgid "Invalid backend name '%s' in source '%s'" --#~ msgstr "在源文件“%2$s”中的后端名称“%1$s”无效" -- --#~ msgid "" --#~ "Failed to connect to a server using SSL. One possible reason is an " --#~ "invalid certificate being used by the server. If this is expected, like " --#~ "self-signed certificate being used on the server, then disable " --#~ "certificate validity tests by selecting 'Ignore invalid SSL certificate' " --#~ "option in Properties" --#~ msgstr "" --#~ "无法使用 SSL 连接到服务器。一个可能的原因是服务器使用了无效的证书。如果这" --#~ "在您意料之中,如服务器使用了自我签名的证书,可选择属性里的“忽略无效 SSL 证" --#~ "书”选项来禁用证书有效性测试" -- --#~ msgid "Cannot create local store" --#~ msgstr "无法创建本地存储" -- --#~ msgid "Could not create synch slave thread" --#~ msgstr "无法创建同步从属线程" -- --#~ msgid "Failed to run calendar factory" --#~ msgstr "运行日历工厂失败" -- --#~ msgid "Cannot process, calendar backend is opening" --#~ msgstr "无法进行,日历后端正在打开" -- --#~ msgid "Cannot remove calendar: " --#~ msgstr "无法移除日历:" -- --#~ msgid "Cannot retrieve backend property: " --#~ msgstr "无法获取后端属性:" -- --#~ msgid "Could not get calendar view path: " --#~ msgstr "无法获取日历视图路径:" -- --#~ msgid "Invalid call" --#~ msgstr "无效调用" -- --#~ msgid "" --#~ " Issuer: %s\n" --#~ " Subject: %s\n" --#~ " Fingerprint: %s\n" --#~ " Signature: %s" --#~ msgstr "" --#~ " 提交者: %s\n" --#~ " 主题: %s\n" --#~ " 指纹: %s\n" --#~ " 签名: %s" -- --#~ msgid "GOOD" --#~ msgstr "好" -- --#~ msgid "BAD" --#~ msgstr "坏" -- --#~ msgid "" --#~ "Certificate problem: %s\n" --#~ "Issuer: %s" --#~ msgstr "" --#~ "证书问题:%s\n" --#~ "发行者:%s" -- --#~ msgid "" --#~ "Bad certificate domain: %s\n" --#~ "Issuer: %s" --#~ msgstr "" --#~ "无效的证书域名:%s\n" --#~ "发行者:%s" -- --#~ msgid "" --#~ "Certificate expired: %s\n" --#~ "Issuer: %s" --#~ msgstr "" --#~ "证书过期:%s\n" --#~ "发行者:%s" -- --#~ msgid "" --#~ "Certificate revocation list expired: %s\n" --#~ "Issuer: %s" --#~ msgstr "" --#~ "证书撤销列表已过期:%s\n" --#~ "发行者:%s" -- --#~ msgid "No output stream" --#~ msgstr "没有输出流" -- --#~ msgid "No input stream" --#~ msgstr "没有输入流" -- --#~ msgid "Server unexpectedly disconnected: %s" --#~ msgstr "服务器意外地中止了连接:%s" -- --#~ msgid "" --#~ "Alert from IMAP server %s@%s in folder %s:\n" --#~ "%s" --#~ msgstr "" --#~ "来自 IMAP 服务器 %s@%s 的提醒(%s 文件夹):\n" --#~ "%s" -- --#~ msgid "Unexpected response from IMAP server: %s" --#~ msgstr "来自 IMAP 服务器的意外应答:%s" -- --#~ msgid "IMAP command failed: %s" --#~ msgstr "IMAP 命令失败:%s" -- --#~ msgid "Server response ended too soon." --#~ msgstr "服务器应答结束太快。" -- --#~ msgid "IMAP server response did not contain %s information" --#~ msgstr "IMAP 服务器应答不含有 %s 信息" -- --#~ msgid "Unexpected OK response from IMAP server: %s" --#~ msgstr "来自 IMAP 服务器意外的 OK 应答:%s" -- --#~ msgid "Always check for _new mail in this folder" --#~ msgstr "总是检查此文件夹中的新邮件(_N)" -- --#~ msgid "Could not create directory %s: %s" --#~ msgstr "无法创建目录 %s:%s" -- --#~ msgid "Could not load summary for %s" --#~ msgstr "无法为 %s 载入概要" -- --#~ msgid "Scanning for changed messages in %s" --#~ msgstr "扫描 %s 中更改了的消息" -- --#~ msgid "Fetching summary information for new messages in %s" --#~ msgstr "从 %s 中的新消息中获取概要信息" -- --#~ msgid "Incomplete server response: no information provided for message %d" --#~ msgstr "不完整的服务器响应:没有为第 %d 封信提供信息" -- --#~ msgid "Incomplete server response: no UID provided for message %d" --#~ msgstr "不完整的服务器响应:没有为第 %d 封信提供 UID" -- --#~ msgid "Could not find message body in FETCH response." --#~ msgstr "无法在 FETCH 应答中找到信体。" -- --#~ msgid "Could not open cache directory: " --#~ msgstr "无法打开缓存目录:" -- --#~ msgid "Failed to cache message %s: %s" --#~ msgstr "缓存消息 %s 失败:%s" -- --#~ msgid "Failed to cache message %s: " --#~ msgstr "缓存消息 %s 失败:" -- --#~ msgid "Failed to cache %s: " --#~ msgstr "缓存 %s 失败:" -- --#~ msgid "Names_pace:" --#~ msgstr "命名空间(_P):" -- --#~ msgid "IMAP default port" --#~ msgstr "IMAP 默认端口" -- --#~ msgid "IMAP" --#~ msgstr "IMAP" -- --#~ msgid "Retrieving list of folders at '%s'" --#~ msgstr "正在获取“%s”的文件夹列表" -- --#~ msgid "Server unexpectedly disconnected" --#~ msgstr "服务器意外断开 " -- --#~ msgid "Server unexpectedly disconnected: " --#~ msgstr "服务器意外断开:" -- --#~ msgid "Cannot create folder: %s: Folder name cannot contain a dot" --#~ msgstr "无法创建文件夹:%s:文件夹名称不能包含点" -- --#~ msgid "Cannot rename the folder: %s: Folder name cannot contain a dot" --#~ msgstr "无法重命名文件夹:%s:文件夹名称不能包含点" -- --#~ msgid "Could not connect to POP server %s" --#~ msgstr "无法连接到 POP 服务器 %s" -- --#~ msgid "Keyring operation was cancelled" --#~ msgstr "密钥环操作已取消" -- --#~ msgid "Currently _used categories:" --#~ msgstr "当前使用的分类(_U):" -- --#~ msgid "_Available Categories:" --#~ msgstr "可用类别(_A):" -- --#~ msgid "Icon" --#~ msgstr "图标" -- --#~ msgid "Category" --#~ msgstr "类别" -- --#~ msgid "Create category \"%s\"" --#~ msgstr "创建分类“%s”" -- --#~ msgid "Category Icon" --#~ msgstr "类别图标" -- --#~ msgid "_No Image" --#~ msgstr "没有图像(_N)" -- --#~ msgid "Category _Name" --#~ msgstr "类别名称(_N)" -- --#~ msgid "Category _Icon" --#~ msgstr "类别图标(_I)" -- --#~ msgid "Category Properties" --#~ msgstr "类别属性" -- --#~ msgid "" --#~ "There is already a category '%s' in the configuration. Please use another " --#~ "name" --#~ msgstr "配置中已有类别“%s”了。请使用另外一个名称" -- --#~ msgid "Show Contacts" --#~ msgstr "显示联系人" -- --#~ msgid "Address B_ook:" --#~ msgstr "地址簿(_O):" -- --#~ msgid "Cat_egory:" --#~ msgstr "类别(_E):" -- --#~ msgid "_Search:" --#~ msgstr "搜索(_S):" -- --#~ msgid "Any Category" --#~ msgstr "任何类别" -- --#~ msgid "Co_ntacts" --#~ msgstr "联系人(_N)" -- --#~ msgid "Search" --#~ msgstr "搜索" -- --#~ msgid "Address Book" --#~ msgstr "地址簿" -- --#~ msgid "Select Contacts from Address Book" --#~ msgstr "从地址簿中选择联系人" -- --#~ msgid "_Add" --#~ msgstr "添加(_A)" -- --#~ msgid "_Remove" --#~ msgstr "删除(_R)" -- --#~ msgid "Error loading address book: %s" --#~ msgstr "载入地址簿时出错:%s" -- --#~ msgid "E_xpand %s Inline" --#~ msgstr "嵌入式展开 %s(_X)" -- --#~ msgid "Cop_y %s" --#~ msgstr "复制 %s(_Y)" -- --#~ msgid "C_ut %s" --#~ msgstr "剪切 %s(_U)" -- --#~ msgid "_Edit %s" --#~ msgstr "编辑 %s(_E)" -- --#~ msgid "_Delete %s" --#~ msgstr "删除 %s(_D)" -- --#~ msgid "Keyring key is unusable: no user or host name" --#~ msgstr "密钥环不可用:没有用户或主机名" -- --#~ msgid "You have the Caps Lock key on." --#~ msgstr "您打开了 Caps Lock。" -- --#~ msgid "_Remember this passphrase" --#~ msgstr "记住此密码句(_R)" -- --#~ msgid "_Remember this passphrase for the remainder of this session" --#~ msgstr "本次会话记住此密码句(_R)" -- --#~ msgid "_Remember this password" --#~ msgstr "记住此密码(_R)" -- --#~ msgid "_Remember this password for the remainder of this session" --#~ msgstr "本次会话记住此密码(_R)" -- --#~ msgid "_Destination" --#~ msgstr "目的(_D)" -- --#~ msgid "Select destination" --#~ msgstr "选择目的地" -- --#~ msgid "Evolution Source Viewer" --#~ msgstr "Evolution 源码查看器" -- --#~ msgid "Display Name" --#~ msgstr "显示名称" -- --#~ msgid "Flags" --#~ msgstr "标志" -- --#~ msgid "Identity" --#~ msgstr "身份" -- --#~ msgid "Authenticating with the server…" --#~ msgstr "正在与服务器进行认证..." -- --#~ msgid "%s: there was no source for UID '%s' stored in GConf." --#~ msgstr "%s:GConf 中没有存储 UID“%s”的源。" -- --#~ msgid "Invalid source" --#~ msgstr "无效的源" -- --#~ msgid "Incorrect uri '%s'" --#~ msgstr "不正确的 URI “%s”" -- --#~ msgid "Failed to find system book" --#~ msgstr "找不到系统地址簿" -- --#~ msgid "There was no source for UID '%s' stored in a source list." --#~ msgstr "源列表中没有存储对应 UID “%s”的源。" -- --#~ msgid "Cannot authenticate user: " --#~ msgstr "无法认证用户:" -- --#~ msgid "Empty URI" --#~ msgstr "空的 URI" -- --#~ msgid "" --#~ "Enter password for address book %s (user %s)\n" --#~ "Reason: %s" --#~ msgstr "" --#~ "输入地址簿 %s 的密码(用户 %s)\n" --#~ "原因:%s" -- --#~ msgid "Enter password for address book %s (user %s)" --#~ msgstr "输入地址簿 %s 的密码(用户 %s)" -- --#~ msgid "Enter password for %s (user %s)" --#~ msgstr "输入 %s 的密码 (用户 %s)" -- --#~ msgid "Enter password for %s to enable proxy for user %s" --#~ msgstr "输入 %s 的密码,以便为用户 %s 启用代理服务器" -- --#~ msgid "Invalid source type" --#~ msgstr "无效的源类型" -- --#~ msgid "Updating %s folder" --#~ msgstr "更新 %s 文件夹" -- --#~ msgid "_Use custom command to connect to server" --#~ msgstr "使用自定义命令连接到服务器(_U)" -- --#~ msgid "Co_mmand:" --#~ msgstr "命令(_M):" -- --#~ msgid "Command:" --#~ msgstr "命令:" -- --#~ msgid "Closing tmp stream failed: " --#~ msgstr "关闭临时流失败:" -- --#~ msgid "SMTP Authentication" --#~ msgstr "SMTP 认证" -- --#~ msgid "Accessing LDAP Server anonymously" --#~ msgstr "匿名访问 LDAP 服务器" -- --#~ msgid "" --#~ "Enter password for calendar %s (user %s)\n" --#~ "Reason: %s" --#~ msgstr "" --#~ "输入日历 %s 的密码(用户 %s)\n" --#~ "原因:%s" -- --#~ msgid "Enter password for calendar %s (user %s)" --#~ msgstr "输入日历 %s 的密码(用户 %s)" -- --#~ msgid "" --#~ "Enter password for task list %s (user %s)\n" --#~ "Reason: %s" --#~ msgstr "" --#~ "输入任务列表 %s 的密码(用户 %s)\n" --#~ "原因:%s" -- --#~ msgid "Enter password for task list %s (user %s)" --#~ msgstr "输入任务列表 %s 的密码(用户 %s)" -- --#~ msgid "" --#~ "Enter password for memo list %s (user %s)\n" --#~ "Reason: %s" --#~ msgstr "" --#~ "输入备忘 %s 的密码(用户 %s)\n" --#~ "原因:%s" -- --#~ msgid "Enter password for memo list %s (user %s)" --#~ msgstr "输入备忘 %s 的密码(用户 %s)" -- --#~ msgid "Enter Passphrase" --#~ msgstr "输入口令" -- --#~ msgid "Enter Password" --#~ msgstr "输入密码" -diff -urN evolution-data-server-3.12.11/po/zh_TW.po evolution-data-server-3.12.11_localized/po/zh_TW.po ---- evolution-data-server-3.12.11/po/zh_TW.po 2014-11-04 18:27:25.000000000 +0530 -+++ evolution-data-server-3.12.11_localized/po/zh_TW.po 2016-03-14 19:48:05.537869970 +0530 -@@ -5,21 +5,22 @@ - # Craig Jeffares ,2004. - # Chao-Hsiung Liao , 2005. 2008, 2010, 2012. - # Wei-Lun Chao , 2010. -+# ccheng , 2016. #zanata -+# pnemade , 2016. #zanata - msgid "" - msgstr "" - "Project-Id-Version: evolution-data-server 3.3.91\n" --"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" --"product=evolution-data-server&keywords=I18N+L10N&component=Misc.\n" --"POT-Creation-Date: 2014-08-23 10:30+0000\n" --"PO-Revision-Date: 2014-08-24 17:25+0800\n" --"Last-Translator: Chao-Hsiung Liao \n" --"Language-Team: Chinese (traditional)\n" --"Language: zh_TW\n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2016-02-16 09:58+0530\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" -+"PO-Revision-Date: 2016-03-04 06:27+0000\n" -+"Last-Translator: ccheng \n" -+"Language-Team: Chinese (traditional)\n" -+"Language: zh-TW\n" - "Plural-Forms: nplurals=1; plural=0;\n" --"X-Generator: Poedit 1.6.5\n" -+"X-Generator: Zanata 3.8.2\n" - "X-Project-Style: gnome\n" - "X-Poedit-Bookmarks: -1,257,-1,-1,-1,-1,-1,-1,-1,-1\n" - -@@ -53,7 +54,7 @@ - msgstr "載入中…" - - #: ../addressbook/backends/file/e-book-backend-file.c:992 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4353 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4360 - msgid "Searching..." - msgstr "搜尋中…" - -@@ -64,8 +65,8 @@ - - #: ../addressbook/backends/file/e-book-backend-file.c:1472 - #: ../addressbook/backends/file/e-book-backend-file.c:1555 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3077 --#: ../addressbook/libedata-book/e-book-sqlite.c:6711 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3084 -+#: ../addressbook/libedata-book/e-book-sqlite.c:6793 - #, c-format - msgid "Contact '%s' not found" - msgstr "找不到連絡人「%s」" -@@ -92,82 +93,82 @@ - msgstr "無法將舊資料庫「%s」重新命名為「%s」: %s" - - #: ../addressbook/backends/file/e-book-backend-file-migrate-bdb.c:148 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1172 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4248 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1174 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4250 - #: ../addressbook/backends/webdav/e-book-backend-webdav.c:419 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:887 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:888 - #: ../addressbook/libebook-contacts/e-book-contacts-types.c:35 - #: ../addressbook/libebook-contacts/e-phone-number.c:56 - #: ../addressbook/libebook/e-book.c:1078 --#: ../addressbook/libebook/e-book-client.c:1882 --#: ../addressbook/libebook/e-book-client.c:2054 --#: ../addressbook/libebook/e-book-client.c:2267 --#: ../addressbook/libebook/e-book-client.c:2398 --#: ../addressbook/libebook/e-book-client.c:2557 --#: ../addressbook/libebook/e-book-client.c:2691 --#: ../addressbook/libebook/e-book-client.c:2822 --#: ../addressbook/libebook/e-book-client.c:2980 --#: ../addressbook/libebook/e-book-client.c:3175 --#: ../addressbook/libebook/e-book-client.c:3393 -+#: ../addressbook/libebook/e-book-client.c:1916 -+#: ../addressbook/libebook/e-book-client.c:2088 -+#: ../addressbook/libebook/e-book-client.c:2301 -+#: ../addressbook/libebook/e-book-client.c:2432 -+#: ../addressbook/libebook/e-book-client.c:2591 -+#: ../addressbook/libebook/e-book-client.c:2725 -+#: ../addressbook/libebook/e-book-client.c:2856 -+#: ../addressbook/libebook/e-book-client.c:3014 -+#: ../addressbook/libebook/e-book-client.c:3209 -+#: ../addressbook/libebook/e-book-client.c:3427 - #: ../addressbook/libedata-book/e-book-backend-sexp.c:878 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:578 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:609 --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:621 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:585 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:616 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:629 - #: ../calendar/backends/contacts/e-cal-backend-contacts.c:270 - #: ../calendar/libecal/e-cal.c:2334 ../calendar/libecal/e-cal-client.c:276 --#: ../calendar/libecal/e-cal-client.c:3239 --#: ../calendar/libecal/e-cal-client.c:3412 --#: ../calendar/libecal/e-cal-client.c:3676 --#: ../calendar/libecal/e-cal-client.c:3917 --#: ../calendar/libecal/e-cal-client.c:4107 --#: ../calendar/libecal/e-cal-client.c:4299 --#: ../calendar/libecal/e-cal-client.c:4469 --#: ../calendar/libecal/e-cal-client.c:4638 --#: ../calendar/libecal/e-cal-client.c:4841 --#: ../calendar/libecal/e-cal-client.c:4991 --#: ../calendar/libecal/e-cal-client.c:5185 --#: ../calendar/libecal/e-cal-client.c:5338 --#: ../calendar/libecal/e-cal-client.c:5555 --#: ../calendar/libecal/e-cal-client.c:5709 --#: ../calendar/libecal/e-cal-client.c:5935 --#: ../calendar/libecal/e-cal-client.c:6131 --#: ../calendar/libecal/e-cal-client.c:6494 --#: ../calendar/libecal/e-cal-client.c:6708 -+#: ../calendar/libecal/e-cal-client.c:3273 -+#: ../calendar/libecal/e-cal-client.c:3446 -+#: ../calendar/libecal/e-cal-client.c:3710 -+#: ../calendar/libecal/e-cal-client.c:3951 -+#: ../calendar/libecal/e-cal-client.c:4141 -+#: ../calendar/libecal/e-cal-client.c:4333 -+#: ../calendar/libecal/e-cal-client.c:4503 -+#: ../calendar/libecal/e-cal-client.c:4672 -+#: ../calendar/libecal/e-cal-client.c:4875 -+#: ../calendar/libecal/e-cal-client.c:5025 -+#: ../calendar/libecal/e-cal-client.c:5219 -+#: ../calendar/libecal/e-cal-client.c:5372 -+#: ../calendar/libecal/e-cal-client.c:5589 -+#: ../calendar/libecal/e-cal-client.c:5743 -+#: ../calendar/libecal/e-cal-client.c:5969 -+#: ../calendar/libecal/e-cal-client.c:6165 -+#: ../calendar/libecal/e-cal-client.c:6528 -+#: ../calendar/libecal/e-cal-client.c:6750 - #: ../camel/providers/imapx/camel-imapx-command.c:645 --#: ../camel/providers/imapx/camel-imapx-server.c:4769 --#: ../camel/providers/imapx/camel-imapx-server.c:4778 -+#: ../camel/providers/imapx/camel-imapx-server.c:4871 -+#: ../camel/providers/imapx/camel-imapx-server.c:4880 - #: ../libedataserver/e-client.c:185 - msgid "Unknown error" - msgstr "不明的錯誤" - - #. Query for new contacts asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:828 -+#: ../addressbook/backends/google/e-book-backend-google.c:822 - msgid "Querying for updated contacts…" - msgstr "查詢更新的連絡人…" - - #. Run the query asynchronously --#: ../addressbook/backends/google/e-book-backend-google.c:1010 -+#: ../addressbook/backends/google/e-book-backend-google.c:1004 - msgid "Querying for updated groups…" - msgstr "查詢更新的群組…" - --#: ../addressbook/backends/google/e-book-backend-google.c:1757 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4984 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1433 -+#: ../addressbook/backends/google/e-book-backend-google.c:1751 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4997 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1434 - msgid "The backend does not support bulk additions" - msgstr "後端不支援大量增加" - --#: ../addressbook/backends/google/e-book-backend-google.c:1912 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5120 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1545 -+#: ../addressbook/backends/google/e-book-backend-google.c:1906 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5133 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1546 - msgid "The backend does not support bulk modifications" - msgstr "後端不支援大量修改" - --#: ../addressbook/backends/google/e-book-backend-google.c:2119 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1645 -+#: ../addressbook/backends/google/e-book-backend-google.c:2113 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1646 - msgid "The backend does not support bulk removals" - msgstr "後端不支援大量移除" - --#: ../addressbook/backends/google/e-book-backend-google.c:2239 -+#: ../addressbook/backends/google/e-book-backend-google.c:2233 - msgid "Loading…" - msgstr "載入中…" - -@@ -201,110 +202,110 @@ - msgid "Not connected" - msgstr "未連線" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:899 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:901 - msgid "Failed to bind using either v3 or v2 binds" - msgstr "無法使用 v3 或 v2 的 binds 來綁定" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1022 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1024 - msgid "Reconnecting to LDAP server..." - msgstr "正在重新連接 LDAP 伺服器…" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1153 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1155 - msgid "Invalid DN syntax" - msgstr "無效的 DN 語法" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1169 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4247 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1171 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4249 - #, c-format - msgid "LDAP error 0x%x (%s)" - msgstr "LDAP 錯誤 0x%x (%s)" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1781 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2104 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:1783 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2106 - #, c-format - msgid "%s: NULL returned from ldap_first_entry" - msgstr "%s:從 ldap_first_entry 傳回 NULL" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2034 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2162 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2036 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2164 - #, c-format - msgid "%s: Unhandled result type %d returned" - msgstr "%s:傳回未處理的類型 %d" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2295 --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2422 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2297 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:2424 - #, c-format - msgid "%s: Unhandled search result type %d returned" - msgstr "%s:傳回未處理的搜尋結果類型 %d" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4196 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4198 - msgid "Receiving LDAP search results..." - msgstr "正在接收 LDAP 搜尋結果…" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4375 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4382 - msgid "Error performing search" - msgstr "進行搜尋時發生錯誤" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4503 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:4515 - #, c-format - msgid "Downloading contacts (%d)..." - msgstr "下載連絡人 (%d)…" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5067 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5080 - msgid "Adding contact to LDAP server..." - msgstr "正在新增連絡人至 LDAP 伺服器…" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5142 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5155 - msgid "Modifying contact from LDAP server..." - msgstr "正在修改 LDAP 伺服器中的連絡人…" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5208 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5221 - msgid "Removing contact from LDAP server..." - msgstr "正在移除 LDAP 伺服器中的連絡人…" - --#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5597 -+#: ../addressbook/backends/ldap/e-book-backend-ldap.c:5610 - #, c-format - msgid "Failed to get the DN for user '%s'" - msgstr "無法擷取 DN 給使用者「%s」" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:864 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:865 - msgid "Loading Addressbook summary..." - msgstr "載入通訊錄摘要…" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:884 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:885 - #, c-format - msgid "PROPFIND on webdav failed with HTTP status %d (%s)" - msgstr "webdav PROPFIND 失敗,HTTP 狀態:%d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:903 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:904 - msgid "No response body in webdav PROPFIND result" - msgstr "在 webdav PROPFIND 結果沒有回應本體" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:964 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:965 - #, c-format - msgid "Loading Contacts (%d%%)" - msgstr "載入聯絡人 (%d%%)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1353 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1354 - msgid "Cannot transform SoupURI to string" - msgstr "不能將 SoupURI 轉換為字串" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1474 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1475 - #, c-format - msgid "Create resource '%s' failed with HTTP status %d (%s)" - msgstr "建立資源「%s」失敗,HTTP 狀態:%d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1576 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1577 - msgid "Contact on server changed -> not modifying" - msgstr "伺服器上的連絡人已變更 -> 尚未修改" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1584 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1585 - #, c-format - msgid "Modify contact failed with HTTP status %d (%s)" - msgstr "修改連絡人失敗,HTTP 狀態:%d (%s)" - --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1677 --#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1693 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1678 -+#: ../addressbook/backends/webdav/e-book-backend-webdav.c:1694 - #, c-format - msgid "DELETE failed with HTTP status %d" - msgstr "DELETE 失敗,HTTP 狀態:%d" -@@ -908,7 +909,7 @@ - msgid "Twitter Name List" - msgstr "Twitter 名稱清單" - --#: ../addressbook/libebook-contacts/e-contact.c:1654 -+#: ../addressbook/libebook-contacts/e-contact.c:1660 - #: ../addressbook/libebook/e-destination.c:920 - msgid "Unnamed List" - msgstr "未命名的清單" -@@ -931,7 +932,8 @@ - - #: ../addressbook/libebook-contacts/e-phone-number.c:49 - msgid "" --"Remaining text after the country calling code is too short for a phone number" -+"Remaining text after the country calling code is too short for a phone " -+"number" - msgstr "國碼後的文字太短,不足電話號碼的長度" - - #: ../addressbook/libebook-contacts/e-phone-number.c:51 -@@ -942,84 +944,82 @@ - msgid "Text is too long for a phone number" - msgstr "文字太長,不符合電話號碼格式" - --#: ../addressbook/libebook/e-book-client.c:807 -+#: ../addressbook/libebook/e-book-client.c:841 - #, c-format - msgid "Unknown book property '%s'" - msgstr "不明的通訊錄屬性「%s」" - --#: ../addressbook/libebook/e-book-client.c:822 -+#: ../addressbook/libebook/e-book-client.c:856 - #, c-format - msgid "Cannot change value of book property '%s'" - msgstr "不能改變通訊錄屬性「%s」的數值" - --#: ../addressbook/libebook/e-book-client.c:1207 --#: ../addressbook/libebook/e-book-client.c:1382 --#: ../addressbook/libebook/e-book-client.c:1649 --#: ../calendar/libecal/e-cal-client.c:1530 --#: ../calendar/libecal/e-cal-client.c:1712 -+#: ../addressbook/libebook/e-book-client.c:1241 -+#: ../addressbook/libebook/e-book-client.c:1416 -+#: ../addressbook/libebook/e-book-client.c:1683 -+#: ../calendar/libecal/e-cal-client.c:1564 -+#: ../calendar/libecal/e-cal-client.c:1746 - #, c-format - msgid "Unable to connect to '%s': " - msgstr "無法連線至「%s」:" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:899 --#: ../addressbook/libedata-book/e-book-sqlite.c:2163 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:906 -+#: ../addressbook/libedata-book/e-book-sqlite.c:2201 - #, c-format - msgid "Error introspecting unknown summary field '%s'" - msgstr "插補不明的摘要欄位「%s」時發生錯誤" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1509 --#: ../addressbook/libedata-book/e-book-sqlite.c:1319 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1516 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1340 - msgid "Error parsing regular expression" - msgstr "解析正規表示式時發生錯誤" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1554 --#: ../addressbook/libedata-book/e-book-sqlite.c:1803 ../camel/camel-db.c:545 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1561 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1824 ../camel/camel-db.c:619 - #, c-format - msgid "Insufficient memory" - msgstr "記憶體不足" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1691 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1698 - #, c-format - msgid "Invalid contact field '%d' specified in summary" - msgstr "在摘要中指定了無效的連絡人欄位「%d」" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1725 --#: ../addressbook/libedata-book/e-book-sqlite.c:557 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:1732 -+#: ../addressbook/libedata-book/e-book-sqlite.c:559 - #, c-format - msgid "" - "Contact field '%s' of type '%s' specified in summary, but only boolean, " - "string and string list field types are supported" --msgstr "" --"在摘要中指定了類型「%2$s」的連絡人欄位「%1$s」,但是只支援布林值、字串及字串" --"清單欄位類型" -+msgstr "在摘要中指定了類型「%2$s」的連絡人欄位「%1$s」,但是只支援布林值、字串及字串清單欄位類型" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3065 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4161 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:3072 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4168 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. vcards cannot be returned." - msgstr "完整搜尋連絡人未儲存於快取。不能傳回 vcard。" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4292 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4385 --#: ../addressbook/libedata-book/e-book-sqlite.c:5369 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4299 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4392 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5451 - #, c-format - msgid "Query contained unsupported elements" - msgstr "查詢包含了不支援的元素" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4296 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4303 - #, c-format - msgid "Invalid Query" - msgstr "無效的查詢" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4320 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4327 - #, c-format - msgid "" - "Full search_contacts are not stored in cache. Hence only summary query is " - "supported." - msgstr "完整搜尋連絡人未儲存於快取。因此只支援摘要查詢。" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4389 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4396 - #: ../addressbook/libedata-book/e-data-book.c:383 - #: ../addressbook/libedata-book/e-data-book.c:1028 - #: ../calendar/libedata-cal/e-data-cal.c:420 -@@ -1028,81 +1028,79 @@ - msgid "Invalid query" - msgstr "無效的查詢" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4432 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:4439 - #, c-format - msgid "" - "Full vcards are not stored in cache. Hence only summary query is supported." - msgstr "完整 vcard 未儲存於快取。因此只支援摘要查詢。" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5255 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:5262 - #, c-format - msgid "Unable to remove the db file: errno %d" - msgstr "無法移除 db 檔案:錯誤 %d" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6042 --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6442 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6449 - #, c-format - msgid "Only summary queries are supported by EbSdbCursor" - msgstr "EbSdbCursor 只支援摘要查詢。" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6049 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6056 - #, c-format - msgid "At least one sort field must be specified to use an EbSdbCursor" - msgstr "必須選擇至少一項排序欄位使用 EbSdbCursor" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6063 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 - #, c-format - msgid "Cannot sort by a field that is not in the summary" - msgstr "不能排序不在摘要中的欄位" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6070 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6077 - #, c-format - msgid "Cannot sort by a field which may have multiple values" - msgstr "不能排序可能含有多重數值的欄位" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6203 --#: ../addressbook/libedata-book/e-book-sqlite.c:7381 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6210 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7463 - #, c-format - msgid "" - "Tried to step a cursor in reverse, but cursor is already at the beginning of " - "the contact list" - msgstr "嘗試反向推進游標,但是游標已在連絡人清單的開頭" - --#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6211 --#: ../addressbook/libedata-book/e-book-sqlite.c:7389 -+#: ../addressbook/libedata-book/e-book-backend-sqlitedb.c:6218 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7471 - #, c-format - msgid "" - "Tried to step a cursor forwards, but cursor is already at the end of the " - "contact list" - msgstr "嘗試推進游標,但是游標已在連絡人清單的結尾" - --#: ../addressbook/libedata-book/e-book-sqlite.c:524 -+#: ../addressbook/libedata-book/e-book-sqlite.c:526 - #, c-format - msgid "Unsupported contact field '%d' specified in summary" - msgstr "在摘要中指定了不支援的連絡人欄位「%d」" - --#: ../addressbook/libedata-book/e-book-sqlite.c:1876 -+#: ../addressbook/libedata-book/e-book-sqlite.c:1897 - msgid "" - "Cannot upgrade contacts database from a legacy database with more than one " - "addressbook. Delete one of the entries in the 'folders' table first." --msgstr "" --"有一個以上通訊錄時不能從傳統資料庫升級連絡人資料庫。請先在「folders」表格中刪" --"除其中一個項目。" -+msgstr "有一個以上通訊錄時不能從傳統資料庫升級連絡人資料庫。請先在「folders」表格中刪除其中一個項目。" - --#: ../addressbook/libedata-book/e-book-sqlite.c:5362 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5444 - #, c-format - msgid "Invalid query: %s" - msgstr "無效的查詢:%s" - --#: ../addressbook/libedata-book/e-book-sqlite.c:5537 -+#: ../addressbook/libedata-book/e-book-sqlite.c:5619 - msgid "Invalid query for EbSqlCursor" - msgstr "EbSqlCursor 的無效查詢" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7203 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7285 - msgid "At least one sort field must be specified to use an EbSqlCursor" - msgstr "要使用 EbSqlCursor 您必須指定至少一個排序欄位" - --#: ../addressbook/libedata-book/e-book-sqlite.c:7221 -+#: ../addressbook/libedata-book/e-book-sqlite.c:7303 - msgid "Cannot sort by a field that is not a string type" - msgstr "不能排序不是字串類型的欄位" - -@@ -1268,15 +1266,15 @@ - msgid "Cannot remove contacts: " - msgstr "不能移除連絡人:" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:772 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:776 - msgid "Cursor does not support setting the search expression" - msgstr "游標不支援設定搜尋正規表示式" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:855 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:859 - msgid "Cursor does not support step" - msgstr "游標並不支援步進" - --#: ../addressbook/libedata-book/e-data-book-cursor.c:938 -+#: ../addressbook/libedata-book/e-data-book-cursor.c:942 - msgid "Cursor does not support alphabetic indexes" - msgstr "游標不支援字母排列索引" - -@@ -1310,64 +1308,63 @@ - msgid "No such source for UID '%s'" - msgstr "沒有 UID「%s」的這類來源" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:576 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:583 - #, c-format - msgid "Server is unreachable (%s)" - msgstr "無法連接伺服器 (%s)" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:607 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:614 - #, c-format - msgid "Failed to connect to a server using SSL: %s" - msgstr "無法使用 SSL 連線至伺服器:%s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:618 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 - #, c-format --msgid "Unexpected HTTP status code %d returned (%s)" --msgstr "HTTP 回應未預期的狀態碼 %d (%s)" -+msgid "Unexpected HTTP status code %d returned (%s) for URI: %s" -+msgstr "HTTP 為 URI 回應未預期的狀態碼 %d (%s):%s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:637 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:647 - msgid "CalDAV backend is not loaded yet" - msgstr "CalDAV 後端尚未載入" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1079 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:1091 - msgid "Invalid Redirect URL" - msgstr "無效的重新導向 URL" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2882 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2894 - #, c-format - msgid "Cannot create local cache folder '%s'" - msgstr "不能建立本地快取資料夾「%s」" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2934 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:2946 - #, c-format - msgid "" - "Server is unreachable, calendar is opened in read-only mode.\n" - "Error message: %s" --msgstr "" --"無法連接伺服器,行事曆會以唯讀模式開啟。\n" -+msgstr "無法連接伺服器,行事曆會以唯讀模式開啟。\n" - "錯誤訊息:%s" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3968 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:3988 - msgid "CalDAV does not support bulk additions" - msgstr "CalDAV 不支援大量增加" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4071 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4091 - msgid "CalDAV does not support bulk modifications" - msgstr "CalDAV 不支援大量修改" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4247 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4267 - msgid "CalDAV does not support bulk removals" - msgstr "CalDAV 不支援大量移除" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4914 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4941 - msgid "Calendar doesn't support Free/Busy" - msgstr "行事曆不支援空閒/忙碌" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4923 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:4950 - msgid "Schedule outbox url not found" - msgstr "找不到排程的寄件匣 url" - --#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5020 -+#: ../calendar/backends/caldav/e-cal-backend-caldav.c:5047 - msgid "Unexpected result in schedule-response" - msgstr "在排程-回應中未預期的結果" - -@@ -1415,74 +1412,75 @@ - msgstr "並非行事曆。" - - #: ../calendar/backends/http/e-cal-backend-http.c:925 --#: ../calendar/backends/weather/e-cal-backend-weather.c:536 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:700 - msgid "Could not create cache file" - msgstr "無法建構快取檔案" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:174 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:196 - msgid "Could not retrieve weather data" - msgstr "無法取得天氣資料" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:295 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:369 - msgid "Weather: Fog" - msgstr "天氣:起霧" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:296 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:370 - msgid "Weather: Cloudy Night" - msgstr "天氣:多雲的夜晚" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:297 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:371 - msgid "Weather: Cloudy" - msgstr "天氣:多雲" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:298 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:372 - msgid "Weather: Overcast" - msgstr "天氣:多雲" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:299 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:373 - msgid "Weather: Showers" - msgstr "天氣:陣雨" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:300 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:374 - msgid "Weather: Snow" - msgstr "天氣:下雪" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:301 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:375 - msgid "Weather: Clear Night" - msgstr "天氣:晴朗的夜晚" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:302 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:376 - msgid "Weather: Sunny" - msgstr "天氣:艷陽" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:303 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:377 - msgid "Weather: Thunderstorms" - msgstr "天氣:雷暴" - - #. TRANSLATOR: This is the temperature in degrees Fahrenheit (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:329 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:403 - #, c-format - msgid "%.1f °F" - msgstr "%.1f °F" - - #. TRANSLATOR: This is the temperature in degrees Celsius (\302\260 is U+00B0 DEGREE SIGN) --#: ../calendar/backends/weather/e-cal-backend-weather.c:332 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:406 - #, c-format - msgid "%.1f °C" - msgstr "%.1f °C" - - #. TRANSLATOR: This is the temperature in kelvin --#: ../calendar/backends/weather/e-cal-backend-weather.c:335 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:409 - #, c-format - msgid "%.1f K" - msgstr "%.1f K" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:341 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:415 - #, c-format - msgid "%.1f" - msgstr "%.1f" - --#: ../calendar/backends/weather/e-cal-backend-weather.c:452 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:580 -+#: ../calendar/backends/weather/e-cal-backend-weather.c:608 - msgid "Forecast" - msgstr "天氣預報" - -@@ -1538,7 +1536,7 @@ - msgstr "核對失敗" - - #: ../calendar/libecal/e-cal.c:2330 --#: ../camel/providers/smtp/camel-smtp-transport.c:921 -+#: ../camel/providers/smtp/camel-smtp-transport.c:960 - #: ../libedataserver/e-client.c:147 - msgid "Authentication required" - msgstr "要求核對" -@@ -1561,17 +1559,17 @@ - msgid "Invalid range" - msgstr "無效的範圍" - --#: ../calendar/libecal/e-cal-client.c:936 -+#: ../calendar/libecal/e-cal-client.c:970 - #, c-format - msgid "Unknown calendar property '%s'" - msgstr "不明的行事曆屬性「%s」" - --#: ../calendar/libecal/e-cal-client.c:951 -+#: ../calendar/libecal/e-cal-client.c:985 - #, c-format - msgid "Cannot change value of calendar property '%s'" - msgstr "不能改變行事曆屬性「%s」的數值" - --#: ../calendar/libecal/e-cal-component.c:1348 -+#: ../calendar/libecal/e-cal-component.c:1349 - msgid "Untitled appointment" - msgstr "未命名的約會" - -@@ -1720,110 +1718,108 @@ - msgid "Undefined" - msgstr "未定義" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:84 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1062 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1371 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1498 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1547 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:85 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1063 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1379 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1506 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1555 - #, c-format - msgid "\"%s\" expects one argument" - msgstr "「%s」需要一個引數" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:91 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:673 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1378 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:92 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:674 - #: ../calendar/libedata-cal/e-cal-backend-sexp.c:1386 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1394 - #, c-format - msgid "\"%s\" expects the first argument to be a string" - msgstr "「%s」的第一個引數必須為字串" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:166 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:167 - #, c-format - msgid "\"%s\" expects two or three arguments" - msgstr "「%s」需要二或三個引數" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:173 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:262 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:324 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:823 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1069 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1447 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1505 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1554 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:174 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:263 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:325 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:824 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1070 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1455 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1513 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1562 - #, c-format - msgid "\"%s\" expects the first argument to be a time_t" - msgstr "「%s」的第一個引數必須為 time_t" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:182 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:270 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:334 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:832 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:183 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:271 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:335 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:833 - #, c-format - msgid "\"%s\" expects the second argument to be a time_t" - msgstr "「%s」的第二個引數必須為 time_t" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:192 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:193 - #, c-format - msgid "\"%s\" expects the third argument to be a string" - msgstr "「%s」的第三個引數必須為字串" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:254 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:255 - #, c-format - msgid "\"%s\" expects none or two arguments" - msgstr "「%s」需要零或二個引數" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:317 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:666 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:816 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1440 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:318 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:667 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:817 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1448 - #, c-format - msgid "\"%s\" expects two arguments" - msgstr "「%s」需要兩個引數" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:602 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:625 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:748 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:780 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:987 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1020 --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1332 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:603 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:626 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:749 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:781 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:988 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1021 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1340 - #, c-format - msgid "\"%s\" expects no arguments" - msgstr "「%s」不需要引數" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:682 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:683 - #, c-format - msgid "\"%s\" expects the second argument to be a string" - msgstr "「%s」的第二個引數必須為字串" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:713 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:714 - #, c-format - msgid "" - "\"%s\" expects the first argument to be either \"any\", \"summary\", or " - "\"description\", or \"location\", or \"attendee\", or \"organizer\", or " - "\"classification\"" --msgstr "" --"「%s」的第一個引數必須為「任何」、「摘要」之一,或「描述」、「位置」、「到會" --"者」、「召集人」、「分類」其中之一" -+msgstr "「%s」的第一個引數必須為「任何」、「摘要」之一,或「描述」、「位置」、「到會者」、「召集人」、「分類」其中之一" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:884 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:885 - #, c-format - msgid "\"%s\" expects at least one argument" - msgstr "「%s」需要至少一個引數" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:899 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:900 - #, c-format - msgid "" - "\"%s\" expects all arguments to be strings or one and only one argument to " - "be a boolean false (#f)" - msgstr "「%s」的所有引數必須為字串,或只有一個引數為布林偽值 (#f)" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1395 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1403 - #, c-format - msgid "\"%s\" expects the first argument to be an ISO 8601 date/time string" - msgstr "「%s」的第一個引數必須為 ISO 8601 日期/時間字串" - --#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1456 -+#: ../calendar/libedata-cal/e-cal-backend-sexp.c:1464 - #, c-format - msgid "\"%s\" expects the second argument to be an integer" - msgstr "「%s」的第二個引數必須為整數" -@@ -2064,36 +2060,36 @@ - msgid_plural "Filtering new messages in '%s'" - msgstr[0] "正在過濾「%s」中的新郵件" - --#: ../camel/camel-folder.c:1011 -+#: ../camel/camel-folder.c:1017 - #: ../camel/providers/local/camel-maildir-folder.c:330 - msgid "Moving messages" - msgstr "正在移動郵件" - --#: ../camel/camel-folder.c:1014 -+#: ../camel/camel-folder.c:1020 - msgid "Copying messages" - msgstr "正在複製郵件" - --#: ../camel/camel-folder.c:1056 -+#: ../camel/camel-folder.c:1062 - #, c-format - msgid "Quota information not supported for folder '%s'" - msgstr "資料夾「%s」不支援限額資訊" - --#: ../camel/camel-folder.c:2862 -+#: ../camel/camel-folder.c:2868 - #, c-format - msgid "Expunging folder '%s'" - msgstr "刪除資料夾「%s」" - --#: ../camel/camel-folder.c:2990 -+#: ../camel/camel-folder.c:2996 - #, c-format - msgid "Retrieving message '%s' in %s" - msgstr "接收 %2$s 中的郵件「%1$s」" - --#: ../camel/camel-folder.c:3181 -+#: ../camel/camel-folder.c:3187 - #, c-format - msgid "Retrieving quota information for '%s'" - msgstr "取得「%s」的用量限額資訊" - --#: ../camel/camel-folder.c:3478 -+#: ../camel/camel-folder.c:3484 - #, c-format - msgid "Refreshing folder '%s'" - msgstr "重新整理資料夾「%s」" -@@ -2130,147 +2126,136 @@ - - #: ../camel/camel-folder-search.c:1943 ../camel/camel-folder-search.c:2109 - #, c-format --msgid "" --"Cannot parse search expression: %s:\n" -+msgid "Cannot parse search expression: %s:\n" - "%s" --msgstr "" --"不能分析搜尋詞句:%s:\n" -+msgstr "不能分析搜尋詞句:%s:\n" - "%s" - - #: ../camel/camel-folder-search.c:1955 ../camel/camel-folder-search.c:2121 - #, c-format --msgid "" --"Error executing search expression: %s:\n" -+msgid "Error executing search expression: %s:\n" - "%s" --msgstr "" --"執行搜尋詞句時發生錯誤:%s:\n" -+msgstr "執行搜尋詞句時發生錯誤:%s:\n" - "%s" - --#: ../camel/camel-gpg-context.c:721 ../camel/camel-gpg-context.c:726 --#: ../camel/camel-gpg-context.c:1383 -+#: ../camel/camel-gpg-context.c:725 ../camel/camel-gpg-context.c:730 -+#: ../camel/camel-gpg-context.c:1387 - #, c-format - msgid "Failed to execute gpg: %s" - msgstr "執行 gpg 失敗: %s" - --#: ../camel/camel-gpg-context.c:726 --#: ../camel/providers/smtp/camel-smtp-transport.c:924 -+#: ../camel/camel-gpg-context.c:730 -+#: ../camel/providers/smtp/camel-smtp-transport.c:963 - msgid "Unknown" - msgstr "不明" - --#: ../camel/camel-gpg-context.c:791 -+#: ../camel/camel-gpg-context.c:795 - #, c-format --msgid "" --"Unexpected GnuPG status message encountered:\n" -+msgid "Unexpected GnuPG status message encountered:\n" - "\n" - "%s" --msgstr "" --"遇到非預期的 GnuPG 狀態訊息:\n" -+msgstr "遇到非預期的 GnuPG 狀態訊息:\n" - "\n" - "%s" - --#: ../camel/camel-gpg-context.c:827 -+#: ../camel/camel-gpg-context.c:831 - #, c-format - msgid "Failed to parse gpg userid hint." - msgstr "解析 gpg userid 提示時失敗。" - --#: ../camel/camel-gpg-context.c:852 ../camel/camel-gpg-context.c:867 -+#: ../camel/camel-gpg-context.c:856 ../camel/camel-gpg-context.c:871 - #, c-format - msgid "Failed to parse gpg passphrase request." - msgstr "解析 gpg 密語要求時失敗。" - --#: ../camel/camel-gpg-context.c:888 -+#: ../camel/camel-gpg-context.c:892 - #, c-format --msgid "" --"You need a PIN to unlock the key for your\n" -+msgid "You need a PIN to unlock the key for your\n" - "SmartCard: \"%s\"" --msgstr "" --"需要 PIN 才能為您的智慧卡解鎖:\n" -+msgstr "需要 PIN 才能為您的智慧卡解鎖:\n" - "「%s」" - --#: ../camel/camel-gpg-context.c:892 -+#: ../camel/camel-gpg-context.c:896 - #, c-format --msgid "" --"You need a passphrase to unlock the key for\n" -+msgid "You need a passphrase to unlock the key for\n" - "user: \"%s\"" --msgstr "" --"您需要密語才能為此使用者的金鑰解鎖:\n" -+msgstr "您需要密語才能為此使用者的金鑰解鎖:\n" - "「%s」" - --#: ../camel/camel-gpg-context.c:898 -+#: ../camel/camel-gpg-context.c:902 - #, c-format - msgid "Unexpected request from GnuPG for '%s'" - msgstr "GnuPG 傳回對「%s」未預期的要求" - --#: ../camel/camel-gpg-context.c:910 -+#: ../camel/camel-gpg-context.c:914 - msgid "" - "Note the encrypted content doesn't contain information about a recipient, " - "thus there will be a password prompt for each of stored private key." --msgstr "" --"注意加密的內容不會包含收件者資訊,因此每個儲存的私密金鑰都會提示輸入密碼。" -+msgstr "注意加密的內容不會包含收件者資訊,因此每個儲存的私密金鑰都會提示輸入密碼。" - --#: ../camel/camel-gpg-context.c:941 ../camel/camel-net-utils.c:522 -+#: ../camel/camel-gpg-context.c:945 ../camel/camel-net-utils.c:524 - #: ../camel/providers/nntp/camel-nntp-summary.c:401 - #: ../libedataserver/e-client.c:158 - #, c-format - msgid "Cancelled" - msgstr "已取消" - --#: ../camel/camel-gpg-context.c:962 -+#: ../camel/camel-gpg-context.c:966 - #, c-format - msgid "Failed to unlock secret key: 3 bad passphrases given." - msgstr "解鎖私密金鑰時失敗:輸入了 3 次錯誤的密語 。" - --#: ../camel/camel-gpg-context.c:975 -+#: ../camel/camel-gpg-context.c:979 - #, c-format - msgid "Unexpected response from GnuPG: %s" - msgstr "從 GnuPG 傳回意外的回應: %s" - --#: ../camel/camel-gpg-context.c:1106 -+#: ../camel/camel-gpg-context.c:1110 - #, c-format - msgid "Failed to encrypt: No valid recipients specified." - msgstr "不能加密郵件:沒有提供有效的收件者。" - --#: ../camel/camel-gpg-context.c:1658 ../camel/camel-smime-context.c:844 -+#: ../camel/camel-gpg-context.c:1662 ../camel/camel-smime-context.c:844 - msgid "Could not generate signing data: " - msgstr "無法產生簽章資料:" - --#: ../camel/camel-gpg-context.c:1708 ../camel/camel-gpg-context.c:1920 --#: ../camel/camel-gpg-context.c:2030 ../camel/camel-gpg-context.c:2179 -+#: ../camel/camel-gpg-context.c:1712 ../camel/camel-gpg-context.c:1924 -+#: ../camel/camel-gpg-context.c:2034 ../camel/camel-gpg-context.c:2183 - msgid "Failed to execute gpg." - msgstr "執行 gpg 失敗。" - --#: ../camel/camel-gpg-context.c:1791 ../camel/camel-gpg-context.c:1799 --#: ../camel/camel-gpg-context.c:1807 ../camel/camel-gpg-context.c:1827 -+#: ../camel/camel-gpg-context.c:1795 ../camel/camel-gpg-context.c:1803 -+#: ../camel/camel-gpg-context.c:1811 ../camel/camel-gpg-context.c:1831 - #: ../camel/camel-smime-context.c:973 ../camel/camel-smime-context.c:987 - #: ../camel/camel-smime-context.c:996 - #, c-format - msgid "Cannot verify message signature: Incorrect message format" - msgstr "不能驗證此郵件的簽章:錯誤的訊息格式" - --#: ../camel/camel-gpg-context.c:1873 -+#: ../camel/camel-gpg-context.c:1877 - msgid "Cannot verify message signature: " - msgstr "不能驗證此郵件的簽章:" - --#: ../camel/camel-gpg-context.c:1996 -+#: ../camel/camel-gpg-context.c:2000 - msgid "Could not generate encrypting data: " - msgstr "無法產生加密資料:" - --#: ../camel/camel-gpg-context.c:2049 -+#: ../camel/camel-gpg-context.c:2053 - msgid "This is a digitally encrypted message part" - msgstr "這是數位化加密訊息部份" - --#: ../camel/camel-gpg-context.c:2105 ../camel/camel-gpg-context.c:2114 --#: ../camel/camel-gpg-context.c:2137 -+#: ../camel/camel-gpg-context.c:2109 ../camel/camel-gpg-context.c:2118 -+#: ../camel/camel-gpg-context.c:2141 - #, c-format - msgid "Cannot decrypt message: Incorrect message format" - msgstr "不能解密此郵件:錯誤的訊息格式" - --#: ../camel/camel-gpg-context.c:2125 -+#: ../camel/camel-gpg-context.c:2129 - #, c-format - msgid "Failed to decrypt MIME part: protocol error" - msgstr "解密 MIME 組件時失敗:通訊協定錯誤" - --#: ../camel/camel-gpg-context.c:2220 ../camel/camel-smime-context.c:1289 -+#: ../camel/camel-gpg-context.c:2224 ../camel/camel-smime-context.c:1289 - msgid "Encrypted content" - msgstr "加密內容" - -@@ -2387,21 +2372,21 @@ - msgid "parse error" - msgstr "解析錯誤" - --#: ../camel/camel-net-utils.c:702 -+#: ../camel/camel-net-utils.c:706 - #, c-format - msgid "Resolving: %s" - msgstr "解析:%s" - --#: ../camel/camel-net-utils.c:725 -+#: ../camel/camel-net-utils.c:731 - msgid "Host lookup failed" - msgstr "搜尋主機失敗" - --#: ../camel/camel-net-utils.c:731 -+#: ../camel/camel-net-utils.c:737 - #, c-format - msgid "Host lookup '%s' failed. Check your host name for spelling errors." - msgstr "主機查詢「%s」失敗。請檢查您的主機名稱是否有拼錯字。" - --#: ../camel/camel-net-utils.c:735 -+#: ../camel/camel-net-utils.c:741 - #, c-format - msgid "Host lookup '%s' failed: %s" - msgstr "查詢主機「%s」失敗:%s" -@@ -2463,29 +2448,23 @@ - - #: ../camel/camel-sasl-anonymous.c:79 - #, c-format --msgid "" --"Invalid email address trace information:\n" -+msgid "Invalid email address trace information:\n" - "%s" --msgstr "" --"無效的電子郵件地址追蹤資訊:\n" -+msgstr "無效的電子郵件地址追蹤資訊:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:93 - #, c-format --msgid "" --"Invalid opaque trace information:\n" -+msgid "Invalid opaque trace information:\n" - "%s" --msgstr "" --"無效的不透明追蹤資訊:\n" -+msgstr "無效的不透明追蹤資訊:\n" - "%s" - - #: ../camel/camel-sasl-anonymous.c:107 - #, c-format --msgid "" --"Invalid trace information:\n" -+msgid "Invalid trace information:\n" - "%s" --msgstr "" --"無效的追蹤資訊:\n" -+msgstr "無效的追蹤資訊:\n" - "%s" - - #: ../camel/camel-sasl-cram-md5.c:44 -@@ -2496,9 +2475,7 @@ - msgid "" - "This option will connect to the server using a secure CRAM-MD5 password, if " - "the server supports it." --msgstr "" --"這個選項將會使用 CRAM-MD5 加密的密碼連線至伺服器,若發現該伺服器支援這種服" --"務。" -+msgstr "這個選項將會使用 CRAM-MD5 加密的密碼連線至伺服器,若發現該伺服器支援這種服務。" - - #: ../camel/camel-sasl-digest-md5.c:57 - msgid "DIGEST-MD5" -@@ -2508,107 +2485,110 @@ - msgid "" - "This option will connect to the server using a secure DIGEST-MD5 password, " - "if the server supports it." --msgstr "" --"這個選項將會使用 DIGEST-MD5 加密的密碼連線至伺服器,若發現該伺服器支援這種服" --"務。" -+msgstr "這個選項將會使用 DIGEST-MD5 加密的密碼連線至伺服器,若發現該伺服器支援這種服務。" - --#: ../camel/camel-sasl-digest-md5.c:853 -+#: ../camel/camel-sasl-digest-md5.c:855 - #, c-format - msgid "Server challenge too long (>2048 octets)" - msgstr "伺服器查問過長(>2048 位元 )" - --#: ../camel/camel-sasl-digest-md5.c:864 -+#: ../camel/camel-sasl-digest-md5.c:866 - #, c-format - msgid "Server challenge invalid\n" - msgstr "伺服器查問無效\n" - --#: ../camel/camel-sasl-digest-md5.c:872 -+#: ../camel/camel-sasl-digest-md5.c:874 - #, c-format - msgid "Server challenge contained invalid \"Quality of Protection\" token" - msgstr "伺服器查問包含無效的 「Quality of Protection」代符" - --#: ../camel/camel-sasl-digest-md5.c:905 -+#: ../camel/camel-sasl-digest-md5.c:907 - #, c-format - msgid "Server response did not contain authorization data" - msgstr "伺服器回應並未包含授權資料" - --#: ../camel/camel-sasl-digest-md5.c:926 -+#: ../camel/camel-sasl-digest-md5.c:928 - #, c-format - msgid "Server response contained incomplete authorization data" - msgstr "伺服器回應包含不完整的授權資料" - --#: ../camel/camel-sasl-digest-md5.c:939 -+#: ../camel/camel-sasl-digest-md5.c:941 - #, c-format - msgid "Server response does not match" - msgstr "伺服器回應不符" - --#: ../camel/camel-sasl-gssapi.c:89 -+#: ../camel/camel-sasl-gssapi.c:95 - msgid "GSSAPI" - msgstr "GSSAPI" - --#: ../camel/camel-sasl-gssapi.c:91 --msgid "This option will connect to the server using Kerberos 5 authentication." -+#: ../camel/camel-sasl-gssapi.c:97 -+msgid "" -+"This option will connect to the server using Kerberos 5 authentication." - msgstr "這個選項將會使用 Kerberos 5 核對連線至伺服器。" - --#: ../camel/camel-sasl-gssapi.c:134 -+#: ../camel/camel-sasl-gssapi.c:149 -+#, c-format -+msgid "(Unknown GSSAPI mechanism code: %x)" -+msgstr "(未知的 GSSAPI 機制碼:%x)" -+ -+#: ../camel/camel-sasl-gssapi.c:182 - msgid "" - "The specified mechanism is not supported by the provided credential, or is " - "unrecognized by the implementation." - msgstr "提供的證件不支援指定的機制,或者是執行無法辨識。" - --#: ../camel/camel-sasl-gssapi.c:139 -+#: ../camel/camel-sasl-gssapi.c:187 - msgid "The provided target_name parameter was ill-formed." - msgstr "提供的 target_name 參數格式錯誤。" - --#: ../camel/camel-sasl-gssapi.c:142 -+#: ../camel/camel-sasl-gssapi.c:190 - msgid "" - "The provided target_name parameter contained an invalid or unsupported type " - "of name." - msgstr "提供的 target_name 參數包含無效或不支援的名稱類型。" - --#: ../camel/camel-sasl-gssapi.c:146 -+#: ../camel/camel-sasl-gssapi.c:194 - msgid "" - "The input_token contains different channel bindings to those specified via " - "the input_chan_bindings parameter." --msgstr "" --"input_token 包含不同的通道,透過 input_chan_bindings,連結至這些指定的參數。" -+msgstr "input_token 包含不同的通道,透過 input_chan_bindings,連結至這些指定的參數。" - --#: ../camel/camel-sasl-gssapi.c:151 -+#: ../camel/camel-sasl-gssapi.c:199 - msgid "" - "The input_token contains an invalid signature, or a signature that could not " - "be verified." - msgstr "input_token 包含無效的簽章,或者無法確認的簽章。" - --#: ../camel/camel-sasl-gssapi.c:155 -+#: ../camel/camel-sasl-gssapi.c:203 - msgid "" - "The supplied credentials were not valid for context initiation, or the " - "credential handle did not reference any credentials." - msgstr "提供的證件不適用於網路位置,或者證件識別指標未參照任何憑證。" - --#: ../camel/camel-sasl-gssapi.c:160 -+#: ../camel/camel-sasl-gssapi.c:208 - msgid "The supplied context handle did not refer to a valid context." - msgstr "提供的網路位置識別指標未參照有效的網路位置。" - --#: ../camel/camel-sasl-gssapi.c:163 -+#: ../camel/camel-sasl-gssapi.c:211 - msgid "The consistency checks performed on the input_token failed." - msgstr "在 input_token 執行一致性檢查失敗。" - --#: ../camel/camel-sasl-gssapi.c:166 -+#: ../camel/camel-sasl-gssapi.c:214 - msgid "The consistency checks performed on the credential failed." - msgstr "在證件執行一致性檢查失敗。" - --#: ../camel/camel-sasl-gssapi.c:169 -+#: ../camel/camel-sasl-gssapi.c:217 - msgid "The referenced credentials have expired." - msgstr "參照的證件已經過期。" - --#: ../camel/camel-sasl-gssapi.c:175 ../camel/camel-sasl-gssapi.c:352 --#: ../camel/camel-sasl-gssapi.c:400 ../camel/camel-sasl-gssapi.c:417 --#: ../camel/providers/smtp/camel-smtp-transport.c:622 -+#: ../camel/camel-sasl-gssapi.c:223 ../camel/camel-sasl-gssapi.c:405 -+#: ../camel/camel-sasl-gssapi.c:454 ../camel/camel-sasl-gssapi.c:471 -+#: ../camel/providers/smtp/camel-smtp-transport.c:659 - #, c-format - msgid "Bad authentication response from server." - msgstr "來自伺服器的不良許可回應。" - --#: ../camel/camel-sasl-gssapi.c:429 -+#: ../camel/camel-sasl-gssapi.c:483 - #, c-format - msgid "Unsupported security layer." - msgstr "不支援的類型" -@@ -2673,10 +2653,10 @@ - msgstr "通訊協定「%s」註冊了無效的 GType" - - #: ../camel/camel-session.c:502 --#: ../camel/providers/imapx/camel-imapx-server.c:4719 -+#: ../camel/providers/imapx/camel-imapx-server.c:4821 - #: ../camel/providers/pop3/camel-pop3-store.c:311 --#: ../camel/providers/pop3/camel-pop3-store.c:757 --#: ../camel/providers/smtp/camel-smtp-transport.c:515 -+#: ../camel/providers/pop3/camel-pop3-store.c:766 -+#: ../camel/providers/smtp/camel-smtp-transport.c:545 - #, c-format - msgid "No support for %s authentication" - msgstr "不支援 %s 核對" -@@ -2880,49 +2860,53 @@ - msgid "S/MIME Decrypt: No encrypted content found" - msgstr "S/MIME 解密:找不到加密內容" - --#: ../camel/camel-store.c:1232 -+#: ../camel/camel-store.c:1238 - #, c-format - msgid "Opening folder '%s'" - msgstr "開啟資料夾「%s」" - --#: ../camel/camel-store.c:1523 -+#: ../camel/camel-store.c:1529 - #, c-format - msgid "Scanning folders in '%s'" - msgstr "掃描「%s」內的資料夾" - --#: ../camel/camel-store.c:1551 ../camel/camel-store.c:1596 -+#: ../camel/camel-store.c:1557 ../camel/camel-store.c:1602 - #: ../camel/camel-vtrash-folder.c:46 - msgid "Trash" - msgstr "回收筒" - --#: ../camel/camel-store.c:1565 ../camel/camel-store.c:1613 -+#: ../camel/camel-store.c:1571 ../camel/camel-store.c:1619 - #: ../camel/camel-vtrash-folder.c:48 - msgid "Junk" - msgstr "垃圾郵件" - --#: ../camel/camel-store.c:2214 -+#: ../camel/camel-store.c:2220 - #, c-format - msgid "Cannot create folder: %s: folder exists" - msgstr "無法建構資料夾:%s:資料夾已存在" - --#: ../camel/camel-store.c:2221 -+#: ../camel/camel-store.c:2227 - #, c-format - msgid "Creating folder '%s'" - msgstr "正在建立資料夾「%s」" - --#: ../camel/camel-store.c:2398 ../camel/camel-vee-store.c:410 --#: ../camel/providers/local/camel-maildir-store.c:321 -+#: ../camel/camel-store.c:2404 ../camel/camel-vee-store.c:410 -+#: ../camel/providers/local/camel-maildir-store.c:346 - #, c-format - msgid "Cannot delete folder: %s: Invalid operation" - msgstr "不能刪除資料夾: %s :無效的操作" - --#: ../camel/camel-store.c:2588 ../camel/camel-vee-store.c:461 --#: ../camel/providers/local/camel-maildir-store.c:872 -+#: ../camel/camel-store.c:2594 ../camel/camel-vee-store.c:461 -+#: ../camel/providers/local/camel-maildir-store.c:914 - #, c-format - msgid "Cannot rename folder: %s: Invalid operation" - msgstr "不能重新命名資料夾: %s :無效的操作" - --#: ../camel/camel-stream.c:285 ../camel/camel-stream.c:336 -+#: ../camel/camel-stream.c:170 -+msgid "Cannot write with no base stream" -+msgstr "沒有基礎串流不能寫入" -+ -+#: ../camel/camel-stream.c:290 ../camel/camel-stream.c:341 - #, c-format - msgid "Stream type '%s' is not seekable" - msgstr "串流類型「%s」不是可尋找的" -@@ -3077,12 +3061,10 @@ - msgstr "聽取伺服器變更通知(_L)" - - #: ../camel/providers/imapx/camel-imapx-provider.c:49 --#| msgid "Lost connection to IMAP server" - msgid "Connection to Server" - msgstr "連接到伺服器" - - #: ../camel/providers/imapx/camel-imapx-provider.c:51 --#| msgid "Numbe_r of cached connections to use" - msgid "Numbe_r of concurrent connections to use" - msgstr "要使用的同時連線數量(_R)" - -@@ -3148,225 +3130,225 @@ - msgid "For reading and storing mail on IMAP servers." - msgstr "用作讀取及儲存郵件於 IMAP 伺服器。" - --#: ../camel/providers/imapx/camel-imapx-server.c:1009 - #: ../camel/providers/imapx/camel-imapx-server.c:1016 -+#: ../camel/providers/imapx/camel-imapx-server.c:1023 - #, c-format - msgid "Not authenticated" - msgstr "尚未核對" - --#: ../camel/providers/imapx/camel-imapx-server.c:1713 -+#: ../camel/providers/imapx/camel-imapx-server.c:1751 - msgid "Server disconnected" - msgstr "伺服器斷線" - --#: ../camel/providers/imapx/camel-imapx-server.c:2205 -+#: ../camel/providers/imapx/camel-imapx-server.c:2252 - msgid "Error writing to cache stream" - msgstr "寫入快取串流時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:3550 -+#: ../camel/providers/imapx/camel-imapx-server.c:3640 - msgid "Error performing IDLE" - msgstr "進行 IDLE 時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:4558 -+#: ../camel/providers/imapx/camel-imapx-server.c:4660 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: %s" - msgstr "以安全模式連線到 IMAP 伺服器 %s 時失敗了: %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:4559 --#: ../camel/providers/smtp/camel-smtp-transport.c:215 -+#: ../camel/providers/imapx/camel-imapx-server.c:4661 -+#: ../camel/providers/smtp/camel-smtp-transport.c:216 - msgid "STARTTLS not supported" - msgstr "不支援 STARTTLS" - --#: ../camel/providers/imapx/camel-imapx-server.c:4619 -+#: ../camel/providers/imapx/camel-imapx-server.c:4721 - #, c-format - msgid "Failed to connect to IMAP server %s in secure mode: " - msgstr "以安全模式連線到 IMAP 伺服器 %s 時失敗了: " - --#: ../camel/providers/imapx/camel-imapx-server.c:4708 -+#: ../camel/providers/imapx/camel-imapx-server.c:4810 - #, c-format - msgid "IMAP server %s does not support %s authentication" - msgstr "IMAP 伺服器 %s 不支援 %s 核對" - --#: ../camel/providers/imapx/camel-imapx-server.c:4738 -+#: ../camel/providers/imapx/camel-imapx-server.c:4840 - #: ../camel/providers/nntp/camel-nntp-store.c:394 - #: ../camel/providers/nntp/camel-nntp-store.c:531 - msgid "Cannot authenticate without a username" - msgstr "不能核對沒有使用者名稱" - --#: ../camel/providers/imapx/camel-imapx-server.c:4747 -+#: ../camel/providers/imapx/camel-imapx-server.c:4849 - #: ../camel/providers/nntp/camel-nntp-store.c:540 - #: ../camel/providers/pop3/camel-pop3-store.c:678 --#: ../camel/providers/pop3/camel-pop3-store.c:699 -+#: ../camel/providers/pop3/camel-pop3-store.c:708 - msgid "Authentication password not available" - msgstr "沒有核對的密碼" - --#: ../camel/providers/imapx/camel-imapx-server.c:4983 --#: ../camel/providers/imapx/camel-imapx-server.c:5042 -+#: ../camel/providers/imapx/camel-imapx-server.c:5085 -+#: ../camel/providers/imapx/camel-imapx-server.c:5144 - msgid "Error fetching message" - msgstr "取回郵件時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:5035 -+#: ../camel/providers/imapx/camel-imapx-server.c:5137 - msgid "Failed to close the tmp stream" - msgstr "無法關閉 tmp 的串流" - --#: ../camel/providers/imapx/camel-imapx-server.c:5071 -+#: ../camel/providers/imapx/camel-imapx-server.c:5173 - msgid "Failed to copy the tmp file" - msgstr "無法複製 tmp 檔案" - --#: ../camel/providers/imapx/camel-imapx-server.c:5212 -+#: ../camel/providers/imapx/camel-imapx-server.c:5345 - msgid "Error moving messages" - msgstr "移動郵件時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:5216 -+#: ../camel/providers/imapx/camel-imapx-server.c:5349 - msgid "Error copying messages" - msgstr "複製郵件時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:5438 -+#: ../camel/providers/imapx/camel-imapx-server.c:5579 - msgid "Error appending message" - msgstr "附加郵件時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:5674 -+#: ../camel/providers/imapx/camel-imapx-server.c:5815 - msgid "Error fetching message headers" - msgstr "取回郵件檔頭時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:5841 -+#: ../camel/providers/imapx/camel-imapx-server.c:5982 - msgid "Error retrieving message" - msgstr "取回郵件時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:5975 --#: ../camel/providers/imapx/camel-imapx-server.c:6204 -+#: ../camel/providers/imapx/camel-imapx-server.c:6116 -+#: ../camel/providers/imapx/camel-imapx-server.c:6345 - #, c-format - msgid "Fetching summary information for new messages in '%s'" - msgstr "正取得「%s」中新郵件的摘要資訊" - --#: ../camel/providers/imapx/camel-imapx-server.c:6027 -+#: ../camel/providers/imapx/camel-imapx-server.c:6168 - #, c-format - msgid "Scanning for changed messages in '%s'" - msgstr "掃描「%s」中變更過的郵件" - --#: ../camel/providers/imapx/camel-imapx-server.c:6079 -+#: ../camel/providers/imapx/camel-imapx-server.c:6220 - msgid "Error fetching new messages" - msgstr "取回新郵件時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:6352 -+#: ../camel/providers/imapx/camel-imapx-server.c:6493 - msgid "Error refreshing folder" - msgstr "重新整理資料夾時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:6502 -+#: ../camel/providers/imapx/camel-imapx-server.c:6643 - msgid "Error expunging message" - msgstr "清空郵件時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:6617 --#: ../camel/providers/imapx/camel-imapx-server.c:6642 -+#: ../camel/providers/imapx/camel-imapx-server.c:6758 -+#: ../camel/providers/imapx/camel-imapx-server.c:6783 - msgid "Error fetching folders" - msgstr "取回資料夾時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:6722 -+#: ../camel/providers/imapx/camel-imapx-server.c:6863 - msgid "Error creating folder" - msgstr "建立資料夾時發生錯誤。" - --#: ../camel/providers/imapx/camel-imapx-server.c:6774 -+#: ../camel/providers/imapx/camel-imapx-server.c:6915 - msgid "Error deleting folder" - msgstr "刪除資料夾時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:6850 -+#: ../camel/providers/imapx/camel-imapx-server.c:6991 - msgid "Error renaming folder" - msgstr "重新命名資料夾時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:6924 -+#: ../camel/providers/imapx/camel-imapx-server.c:7065 - msgid "Error subscribing to folder" - msgstr "訂閱到資料夾時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:6990 -+#: ../camel/providers/imapx/camel-imapx-server.c:7131 - msgid "Error unsubscribing from folder" - msgstr "取消訂閱資料夾發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:7052 -+#: ../camel/providers/imapx/camel-imapx-server.c:7193 - msgid "Error retrieving quota information" - msgstr "取得用量限額資訊時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:7104 -+#: ../camel/providers/imapx/camel-imapx-server.c:7245 - msgid "Search failed" - msgstr "搜尋失敗" - --#: ../camel/providers/imapx/camel-imapx-server.c:7166 -+#: ../camel/providers/imapx/camel-imapx-server.c:7307 - msgid "Error performing NOOP" - msgstr "進行 NOOP 時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:7273 -+#: ../camel/providers/imapx/camel-imapx-server.c:7414 - msgid "Error syncing changes" - msgstr "同步變更時發生錯誤" - --#: ../camel/providers/imapx/camel-imapx-server.c:8258 -+#: ../camel/providers/imapx/camel-imapx-server.c:8446 - #, c-format - msgid "Cannot get message with message ID %s: %s" - msgstr "無法取得郵件 ID 為 %s 的郵件: %s" - --#: ../camel/providers/imapx/camel-imapx-server.c:8259 -+#: ../camel/providers/imapx/camel-imapx-server.c:8447 - msgid "No such message available." - msgstr "沒有這個郵件。" - --#: ../camel/providers/imapx/camel-imapx-server.c:8466 --#: ../camel/providers/imapx/camel-imapx-server.c:8487 -+#: ../camel/providers/imapx/camel-imapx-server.c:8671 -+#: ../camel/providers/imapx/camel-imapx-server.c:8692 - msgid "Cannot create spool file: " - msgstr "不能建立排程器檔案:" - --#: ../camel/providers/imapx/camel-imapx-server.c:9228 -+#: ../camel/providers/imapx/camel-imapx-server.c:9502 - msgid "IMAP server does not support quotas" - msgstr "IMAP 伺服器不支援限額" - - #. create a dummy "." parent inbox, use to scan, then put back at the top level - #: ../camel/providers/imapx/camel-imapx-store.c:223 - #: ../camel/providers/local/camel-maildir-folder.c:482 --#: ../camel/providers/local/camel-maildir-store.c:322 --#: ../camel/providers/local/camel-maildir-store.c:784 --#: ../camel/providers/local/camel-maildir-store.c:790 --#: ../camel/providers/local/camel-maildir-store.c:873 -+#: ../camel/providers/local/camel-maildir-store.c:347 -+#: ../camel/providers/local/camel-maildir-store.c:826 -+#: ../camel/providers/local/camel-maildir-store.c:832 -+#: ../camel/providers/local/camel-maildir-store.c:915 - #: ../camel/providers/local/camel-spool-store.c:393 - msgid "Inbox" - msgstr "收件匣" - --#: ../camel/providers/imapx/camel-imapx-store.c:758 -+#: ../camel/providers/imapx/camel-imapx-store.c:757 - #, c-format - msgid "IMAP server %s" - msgstr "IMAP 伺服器 %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:761 -+#: ../camel/providers/imapx/camel-imapx-store.c:760 - #, c-format - msgid "IMAP service for %s on %s" - msgstr "%s 的 IMAP 服務於 %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:836 -+#: ../camel/providers/imapx/camel-imapx-store.c:835 - #: ../camel/providers/nntp/camel-nntp-provider.c:93 - #: ../camel/providers/pop3/camel-pop3-provider.c:81 - msgid "Password" - msgstr "密碼" - --#: ../camel/providers/imapx/camel-imapx-store.c:838 --msgid "This option will connect to the IMAP server using a plaintext password." -+#: ../camel/providers/imapx/camel-imapx-store.c:837 -+msgid "" -+"This option will connect to the IMAP server using a plaintext password." - msgstr "這個選項將會使用簡易的密碼連線至 IMAP 伺服器。" - --#: ../camel/providers/imapx/camel-imapx-store.c:913 -+#: ../camel/providers/imapx/camel-imapx-store.c:916 - #, c-format - msgid "No such folder %s" - msgstr "沒有這個資料夾 %s" - --#: ../camel/providers/imapx/camel-imapx-store.c:1324 -+#: ../camel/providers/imapx/camel-imapx-store.c:1344 - #, c-format - msgid "No IMAP namespace for folder path '%s'" - msgstr "資料夾路徑「%s」沒有 IMAP 命名空間可用" - --#: ../camel/providers/imapx/camel-imapx-store.c:1472 -+#: ../camel/providers/imapx/camel-imapx-store.c:1609 - #, c-format - msgid "Retrieving folder list for %s" - msgstr "取得 %s 的資料夾清單" - --#: ../camel/providers/imapx/camel-imapx-store.c:1924 -+#: ../camel/providers/imapx/camel-imapx-store.c:2061 - #, c-format --msgid "" --"The folder name \"%s\" is invalid because it contains the character \"%c\"" -+msgid "The folder name \"%s\" is invalid because it contains the character \"%c\"" - msgstr "資料夾名稱「%s」無效,因為它包括字元「%c」" - --#: ../camel/providers/imapx/camel-imapx-store.c:2689 -+#: ../camel/providers/imapx/camel-imapx-store.c:2833 - #: ../camel/providers/nntp/camel-nntp-store.c:1250 - #: ../camel/providers/pop3/camel-pop3-folder.c:450 - #: ../camel/providers/pop3/camel-pop3-folder.c:593 -@@ -3376,7 +3358,7 @@ - #: ../camel/providers/pop3/camel-pop3-store.c:528 - #: ../camel/providers/pop3/camel-pop3-store.c:576 - #: ../camel/providers/pop3/camel-pop3-store.c:668 --#: ../camel/providers/pop3/camel-pop3-store.c:1072 -+#: ../camel/providers/pop3/camel-pop3-store.c:1081 - #, c-format - msgid "You must be working online to complete this operation" - msgstr "您必須於線上工作才能完成此操作" -@@ -3403,11 +3385,9 @@ - - #: ../camel/providers/local/camel-local-folder.c:730 - #, c-format --msgid "" --"Cannot get message %s from folder %s\n" -+msgid "Cannot get message %s from folder %s\n" - "%s" --msgstr "" --"不能從資料夾 %2$s 取得郵件 %1$s \n" -+msgstr "不能從資料夾 %2$s 取得郵件 %1$s \n" - "%3$s" - - #: ../camel/providers/local/camel-local-provider.c:41 -@@ -3430,8 +3410,7 @@ - msgid "" - "For retrieving (moving) local mail from standard mbox-formatted spools into " - "folders managed by Evolution." --msgstr "" --"用於自標準 mbox 格式排程器接收(移動)本地端郵件至 Evolution 管理的資料夾。" -+msgstr "用於自標準 mbox 格式排程器接收(移動)本地端郵件至 Evolution 管理的資料夾。" - - #: ../camel/providers/local/camel-local-provider.c:81 - #: ../camel/providers/local/camel-local-provider.c:101 -@@ -3459,8 +3438,7 @@ - msgid "" - "For reading and storing local mail in external standard mbox spool files.\n" - "May also be used to read a tree of Elm, Pine, or Mutt style folders." --msgstr "" --"用於讀取及儲存外部標準 mbox 排程器檔案中的本地端郵件。\n" -+msgstr "用於讀取及儲存外部標準 mbox 排程器檔案中的本地端郵件。\n" - "也可以用來讀 Elm 、 Pine 或 Mutt 形式資料夾的樹狀結構。" - - #: ../camel/providers/local/camel-local-provider.c:123 -@@ -3479,7 +3457,7 @@ - - #: ../camel/providers/local/camel-local-store.c:221 - #: ../camel/providers/local/camel-local-store.c:381 --#: ../camel/providers/local/camel-maildir-store.c:122 -+#: ../camel/providers/local/camel-maildir-store.c:123 - #: ../camel/providers/local/camel-mbox-store.c:572 - #: ../camel/providers/local/camel-spool-store.c:87 - #, c-format -@@ -3494,7 +3472,7 @@ - #: ../camel/providers/local/camel-local-store.c:242 - #: ../camel/providers/local/camel-local-store.c:252 - #: ../camel/providers/local/camel-local-store.c:394 --#: ../camel/providers/local/camel-maildir-store.c:156 -+#: ../camel/providers/local/camel-maildir-store.c:165 - #, c-format - msgid "Cannot get folder: %s: %s" - msgstr "不能取得資料夾:%s:%s" -@@ -3516,7 +3494,7 @@ - msgid "Could not delete folder meta file '%s': %s" - msgstr "不能刪除資料夾中繼檔案「%s」:%s" - --#: ../camel/providers/local/camel-local-store.c:594 -+#: ../camel/providers/local/camel-local-store.c:595 - #, c-format - msgid "Could not rename '%s': %s" - msgstr "無法重新命名「%s」:%s " -@@ -3548,53 +3526,59 @@ - msgid "Cannot transfer message to destination folder: %s" - msgstr "不能將郵件傳輸到目的端資料夾:%s" - --#: ../camel/providers/local/camel-maildir-store.c:130 --#: ../camel/providers/local/camel-maildir-store.c:149 --#: ../camel/providers/local/camel-maildir-store.c:881 -+#: ../camel/providers/local/camel-maildir-store.c:131 -+#: ../camel/providers/local/camel-maildir-store.c:931 -+#, c-format -+msgid "Cannot create folder containing '%s'" -+msgstr "不能建立包含「%s」的資料夾" -+ -+#: ../camel/providers/local/camel-maildir-store.c:139 -+#: ../camel/providers/local/camel-maildir-store.c:158 -+#: ../camel/providers/local/camel-maildir-store.c:923 - #, c-format - msgid "Folder %s already exists" - msgstr "資料夾 %s 已存在" - --#: ../camel/providers/local/camel-maildir-store.c:241 --#: ../camel/providers/local/camel-maildir-store.c:272 -+#: ../camel/providers/local/camel-maildir-store.c:266 -+#: ../camel/providers/local/camel-maildir-store.c:297 - #: ../camel/providers/local/camel-mbox-store.c:401 - #: ../camel/providers/local/camel-mbox-store.c:422 - #, c-format - msgid "Cannot create folder '%s': %s" - msgstr "不能建立資料夾「%s」:%s" - --#: ../camel/providers/local/camel-maildir-store.c:256 -+#: ../camel/providers/local/camel-maildir-store.c:281 - #: ../camel/providers/local/camel-mbox-store.c:367 - #: ../camel/providers/local/camel-mh-store.c:523 - #, c-format - msgid "Cannot get folder '%s': %s" - msgstr "不能建立資料夾「%s」:%s" - --#: ../camel/providers/local/camel-maildir-store.c:262 -+#: ../camel/providers/local/camel-maildir-store.c:287 - #: ../camel/providers/local/camel-mbox-store.c:377 - #: ../camel/providers/local/camel-mh-store.c:532 - #, c-format - msgid "Cannot get folder '%s': folder does not exist." - msgstr "不能取得資料夾「%s」:資料夾不存在。" - --#: ../camel/providers/local/camel-maildir-store.c:289 -+#: ../camel/providers/local/camel-maildir-store.c:314 - #, c-format - msgid "Cannot get folder '%s': not a maildir directory." - msgstr "不能取得資料夾「%s」:不是 maildir 目錄。" - --#: ../camel/providers/local/camel-maildir-store.c:353 --#: ../camel/providers/local/camel-maildir-store.c:393 -+#: ../camel/providers/local/camel-maildir-store.c:378 -+#: ../camel/providers/local/camel-maildir-store.c:418 - #: ../camel/providers/local/camel-mh-store.c:676 - #, c-format - msgid "Could not delete folder '%s': %s" - msgstr "無法刪除資料夾「%s」:%s" - --#: ../camel/providers/local/camel-maildir-store.c:355 -+#: ../camel/providers/local/camel-maildir-store.c:380 - msgid "not a maildir directory" - msgstr "不是一個 maildir 目錄" - --#: ../camel/providers/local/camel-maildir-store.c:637 --#: ../camel/providers/local/camel-maildir-store.c:1095 -+#: ../camel/providers/local/camel-maildir-store.c:666 -+#: ../camel/providers/local/camel-maildir-store.c:1146 - #: ../camel/providers/local/camel-spool-store.c:212 - #: ../camel/providers/local/camel-spool-store.c:231 - #, c-format -@@ -3672,11 +3656,9 @@ - #: ../camel/providers/local/camel-mbox-store.c:663 - #: ../camel/providers/local/camel-mbox-store.c:692 - #, c-format --msgid "" --"Could not delete folder '%s':\n" -+msgid "Could not delete folder '%s':\n" - "%s" --msgstr "" --"無法刪除資料夾「%s」:\n" -+msgstr "無法刪除資料夾「%s」:\n" - "%s" - - #: ../camel/providers/local/camel-mbox-store.c:673 -@@ -3837,11 +3819,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:494 - #, c-format --msgid "" --"Could not open folder '%s':\n" -+msgid "Could not open folder '%s':\n" - "%s" --msgstr "" --"無法開啟資料夾「%s」:\n" -+msgstr "無法開啟資料夾「%s」:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:500 -@@ -3851,11 +3831,9 @@ - - #: ../camel/providers/local/camel-spool-store.c:508 - #, c-format --msgid "" --"Could not create folder '%s':\n" -+msgid "Could not create folder '%s':\n" - "%s" --msgstr "" --"無法建立資料夾「%s」:\n" -+msgstr "無法建立資料夾「%s」:\n" - "%s" - - #: ../camel/providers/local/camel-spool-store.c:521 -@@ -3897,8 +3875,7 @@ - msgid "" - "Could not synchronize spool folder %s: %s\n" - "Folder may be corrupt, copy saved in '%s'" --msgstr "" --"無法同步排程資料夾 %s:%s\n" -+msgstr "無法同步排程資料夾 %s:%s\n" - "資料夾可能損毀,複本儲存於「%s」" - - #: ../camel/providers/nntp/camel-nntp-folder.c:222 -@@ -3998,12 +3975,10 @@ - - #: ../camel/providers/nntp/camel-nntp-store.c:1151 - #, c-format --msgid "" --"Error retrieving newsgroups:\n" -+msgid "Error retrieving newsgroups:\n" - "\n" - "%s" --msgstr "" --"取得新聞群組發生錯誤:\n" -+msgstr "取得新聞群組發生錯誤:\n" - "\n" - "%s" - -@@ -4028,19 +4003,16 @@ - "You cannot subscribe to this newsgroup:\n" - "\n" - "No such newsgroup. The selected item is a probably a parent folder." --msgstr "" --"您無法訂閱此新聞群組:\n" -+msgstr "您無法訂閱此新聞群組:\n" - "\n" - "沒有類似的新聞群組。選取的項目可能是父代資料夾。" - - #: ../camel/providers/nntp/camel-nntp-store.c:1583 - #, c-format --msgid "" --"You cannot unsubscribe to this newsgroup:\n" -+msgid "You cannot unsubscribe to this newsgroup:\n" - "\n" - "newsgroup does not exist!" --msgstr "" --"您無法取消訂閱此新聞群組:\n" -+msgstr "您無法取消訂閱此新聞群組:\n" - "\n" - "新聞群組不存在!" - -@@ -4157,18 +4129,14 @@ - msgid "" - "This option will connect to the POP server using a plaintext password. This " - "is the only option supported by many POP servers." --msgstr "" --"這個選項將會使用純文字的密碼連線到 POP 伺服器。一般的 POP 伺服器只會支援這種" --"方式。" -+msgstr "這個選項將會使用純文字的密碼連線到 POP 伺服器。一般的 POP 伺服器只會支援這種方式。" - - #: ../camel/providers/pop3/camel-pop3-provider.c:93 - msgid "" - "This option will connect to the POP server using an encrypted password via " - "the APOP protocol. This may not work for all users even on servers that " - "claim to support it." --msgstr "" --"這個選項將會使用加密的密碼經由 APOP 通訊協定連線到 POP 伺服器。不過就算伺服器" --"聲稱能夠支援,但對於所有使用者來講都未必一定可行。" -+msgstr "這個選項將會使用加密的密碼經由 APOP 通訊協定連線到 POP 伺服器。不過就算伺服器聲稱能夠支援,但對於所有使用者來講都未必一定可行。" - - #. Translators: This is the separator between an error and an explanation - #: ../camel/providers/pop3/camel-pop3-store.c:97 -@@ -4221,41 +4189,36 @@ - msgid "POP3 server for %s on %s" - msgstr "%s 在 %s 的 POP3 伺服器" - --#: ../camel/providers/pop3/camel-pop3-store.c:713 -+#: ../camel/providers/pop3/camel-pop3-store.c:690 -+#: ../camel/providers/pop3/camel-pop3-store.c:777 - #, c-format --msgid "" --"Unable to connect to POP server %s:\tInvalid APOP ID received. Impersonation " --"attack suspected. Please contact your admin." --msgstr "" --"無法連線至 POP 伺服器 %s:\t收到無效的 APOP ID。推測可能是使用者假冒攻擊。請" --"聯絡您的系統管理者。" -+msgid "Unable to connect to POP server %s.\n" -+"Error sending password: " -+msgstr "無法連線到 POP 伺服器 %s。\n" -+"傳送密碼時發生錯誤:" - --#: ../camel/providers/pop3/camel-pop3-store.c:768 -+#: ../camel/providers/pop3/camel-pop3-store.c:722 - #, c-format - msgid "" --"Unable to connect to POP server %s.\n" --"Error sending password: " --msgstr "" --"無法連線到 POP 伺服器 %s。\n" --"傳送密碼時發生錯誤:" -+"Unable to connect to POP server %s:\tInvalid APOP ID received. Impersonation " -+"attack suspected. Please contact your admin." -+msgstr "無法連線至 POP 伺服器 %s:\t收到無效的 APOP ID。推測可能是使用者假冒攻擊。請聯絡您的系統管理者。" - - #. Translators: Last %s is an optional explanation - #. * beginning with ": " separator. --#: ../camel/providers/pop3/camel-pop3-store.c:783 -+#: ../camel/providers/pop3/camel-pop3-store.c:792 - #, c-format --msgid "" --"Unable to connect to POP server %s.\n" -+msgid "Unable to connect to POP server %s.\n" - "Error sending username%s" --msgstr "" --"無法連線 POP 伺服器 %s。\n" -+msgstr "無法連線 POP 伺服器 %s。\n" - "傳送使用者名稱發生錯誤%s" - --#: ../camel/providers/pop3/camel-pop3-store.c:865 -+#: ../camel/providers/pop3/camel-pop3-store.c:874 - #, c-format - msgid "No such folder '%s'." - msgstr "沒有這個資料夾「%s」。" - --#: ../camel/providers/pop3/camel-pop3-store.c:882 -+#: ../camel/providers/pop3/camel-pop3-store.c:891 - #, c-format - msgid "POP3 stores have no folder hierarchy" - msgstr "POP3 儲存區沒有資料夾階層" -@@ -4348,218 +4311,218 @@ - msgid "For delivering mail by connecting to a remote mailhub using SMTP." - msgstr "使用 SMTP 連線到遠端 mailhub 來傳送郵件。" - --#: ../camel/providers/smtp/camel-smtp-transport.c:170 --#: ../camel/providers/smtp/camel-smtp-transport.c:178 -+#: ../camel/providers/smtp/camel-smtp-transport.c:171 -+#: ../camel/providers/smtp/camel-smtp-transport.c:179 - msgid "Welcome response error: " - msgstr "迎接的回應錯誤:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:214 -+#: ../camel/providers/smtp/camel-smtp-transport.c:215 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: %s" - msgstr "無法以安全模式連線到 SMTP 伺服器 %s: %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:224 --#: ../camel/providers/smtp/camel-smtp-transport.c:238 --#: ../camel/providers/smtp/camel-smtp-transport.c:246 -+#: ../camel/providers/smtp/camel-smtp-transport.c:225 -+#: ../camel/providers/smtp/camel-smtp-transport.c:240 -+#: ../camel/providers/smtp/camel-smtp-transport.c:248 - msgid "STARTTLS command failed: " - msgstr "STARTTLS 指令失敗:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:265 -+#: ../camel/providers/smtp/camel-smtp-transport.c:267 - #, c-format - msgid "Failed to connect to SMTP server %s in secure mode: " - msgstr "無法以安全模式連線到 SMTP 伺服器 %s:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:357 -+#: ../camel/providers/smtp/camel-smtp-transport.c:359 - #, c-format - msgid "SMTP server %s" - msgstr "SMTP 伺服器 %s" - --#: ../camel/providers/smtp/camel-smtp-transport.c:360 -+#: ../camel/providers/smtp/camel-smtp-transport.c:362 - #, c-format - msgid "SMTP mail delivery via %s" - msgstr "經由 %s 傳送 SMTP 郵件" - --#: ../camel/providers/smtp/camel-smtp-transport.c:434 -+#: ../camel/providers/smtp/camel-smtp-transport.c:463 - #, c-format - msgid "SMTP server %s does not support %s authentication" - msgstr "SMTP 伺服器 %s 不支援 %s 核對" - --#: ../camel/providers/smtp/camel-smtp-transport.c:506 -+#: ../camel/providers/smtp/camel-smtp-transport.c:536 - #, c-format - msgid "No SASL mechanism was specified" - msgstr "沒有指定 SASL 機制" - --#: ../camel/providers/smtp/camel-smtp-transport.c:536 --#: ../camel/providers/smtp/camel-smtp-transport.c:547 --#: ../camel/providers/smtp/camel-smtp-transport.c:560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:571 -+#: ../camel/providers/smtp/camel-smtp-transport.c:583 -+#: ../camel/providers/smtp/camel-smtp-transport.c:596 - msgid "AUTH command failed: " - msgstr "AUTH 指令失敗:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:701 -+#: ../camel/providers/smtp/camel-smtp-transport.c:740 - #, c-format - msgid "Cannot send message: service not connected." - msgstr "無法傳送訊息:服務未連線。" - --#: ../camel/providers/smtp/camel-smtp-transport.c:708 -+#: ../camel/providers/smtp/camel-smtp-transport.c:747 - #, c-format - msgid "Cannot send message: sender address not valid." - msgstr "不能傳送郵件:寄件者的地址無效。" - --#: ../camel/providers/smtp/camel-smtp-transport.c:712 -+#: ../camel/providers/smtp/camel-smtp-transport.c:751 - msgid "Sending message" - msgstr "傳送郵件" - --#: ../camel/providers/smtp/camel-smtp-transport.c:737 -+#: ../camel/providers/smtp/camel-smtp-transport.c:776 - #, c-format - msgid "Cannot send message: no recipients defined." - msgstr "不能傳送郵件:沒有定義收件者。" - --#: ../camel/providers/smtp/camel-smtp-transport.c:750 -+#: ../camel/providers/smtp/camel-smtp-transport.c:789 - #, c-format - msgid "Cannot send message: one or more invalid recipients" - msgstr "不能傳送郵件:一或多個無效的收件者" - --#: ../camel/providers/smtp/camel-smtp-transport.c:871 -+#: ../camel/providers/smtp/camel-smtp-transport.c:910 - msgid "Syntax error, command unrecognized" - msgstr "語法錯誤,不認識的指令" - --#: ../camel/providers/smtp/camel-smtp-transport.c:873 -+#: ../camel/providers/smtp/camel-smtp-transport.c:912 - msgid "Syntax error in parameters or arguments" - msgstr "參數內的語法錯誤" - --#: ../camel/providers/smtp/camel-smtp-transport.c:875 -+#: ../camel/providers/smtp/camel-smtp-transport.c:914 - msgid "Command not implemented" - msgstr "指令沒有實作" - --#: ../camel/providers/smtp/camel-smtp-transport.c:877 -+#: ../camel/providers/smtp/camel-smtp-transport.c:916 - msgid "Command parameter not implemented" - msgstr "指令的參數沒有實作" - --#: ../camel/providers/smtp/camel-smtp-transport.c:879 -+#: ../camel/providers/smtp/camel-smtp-transport.c:918 - msgid "System status, or system help reply" - msgstr "系統狀況,或者是系統的求助說明回應" - --#: ../camel/providers/smtp/camel-smtp-transport.c:881 -+#: ../camel/providers/smtp/camel-smtp-transport.c:920 - msgid "Help message" - msgstr "求助說明訊息" - --#: ../camel/providers/smtp/camel-smtp-transport.c:883 -+#: ../camel/providers/smtp/camel-smtp-transport.c:922 - msgid "Service ready" - msgstr "服務已就緒" - --#: ../camel/providers/smtp/camel-smtp-transport.c:885 -+#: ../camel/providers/smtp/camel-smtp-transport.c:924 - msgid "Service closing transmission channel" - msgstr "此服務將傳輸通道關閉" - --#: ../camel/providers/smtp/camel-smtp-transport.c:887 -+#: ../camel/providers/smtp/camel-smtp-transport.c:926 - msgid "Service not available, closing transmission channel" - msgstr "此服務仍未可用,傳輸通道關閉" - --#: ../camel/providers/smtp/camel-smtp-transport.c:889 -+#: ../camel/providers/smtp/camel-smtp-transport.c:928 - msgid "Requested mail action okay, completed" - msgstr " 所要求的郵件動作已成功完成" - --#: ../camel/providers/smtp/camel-smtp-transport.c:891 -+#: ../camel/providers/smtp/camel-smtp-transport.c:930 - msgid "User not local; will forward to " - msgstr "不是本地端的使用者;將會轉寄至 <轉寄路徑>" - --#: ../camel/providers/smtp/camel-smtp-transport.c:893 -+#: ../camel/providers/smtp/camel-smtp-transport.c:932 - msgid "Requested mail action not taken: mailbox unavailable" - msgstr "所要求的郵件動作無法執行:郵箱仍未可用" - --#: ../camel/providers/smtp/camel-smtp-transport.c:895 -+#: ../camel/providers/smtp/camel-smtp-transport.c:934 - msgid "Requested action not taken: mailbox unavailable" - msgstr "所要求的動作無法執行:郵箱仍未可用" - --#: ../camel/providers/smtp/camel-smtp-transport.c:897 -+#: ../camel/providers/smtp/camel-smtp-transport.c:936 - msgid "Requested action aborted: error in processing" - msgstr "所要求的動作已放棄:正在處理時發生錯誤" - --#: ../camel/providers/smtp/camel-smtp-transport.c:899 -+#: ../camel/providers/smtp/camel-smtp-transport.c:938 - msgid "User not local; please try " - msgstr "不是本地端的使用者;請嘗試使用 <轉寄路徑>" - --#: ../camel/providers/smtp/camel-smtp-transport.c:901 -+#: ../camel/providers/smtp/camel-smtp-transport.c:940 - msgid "Requested action not taken: insufficient system storage" - msgstr "所要求的動作無法執行:系統的儲存空間不足" - --#: ../camel/providers/smtp/camel-smtp-transport.c:903 -+#: ../camel/providers/smtp/camel-smtp-transport.c:942 - msgid "Requested mail action aborted: exceeded storage allocation" - msgstr "所要求的郵件動作已放棄:超出可供儲存空間的限制" - --#: ../camel/providers/smtp/camel-smtp-transport.c:905 -+#: ../camel/providers/smtp/camel-smtp-transport.c:944 - msgid "Requested action not taken: mailbox name not allowed" - msgstr "所要求的動作已放棄:不允許的郵箱名稱" - --#: ../camel/providers/smtp/camel-smtp-transport.c:907 -+#: ../camel/providers/smtp/camel-smtp-transport.c:946 - msgid "Start mail input; end with ." - msgstr "請開始輸入郵件的資料;. 結束撰寫郵件" - --#: ../camel/providers/smtp/camel-smtp-transport.c:909 -+#: ../camel/providers/smtp/camel-smtp-transport.c:948 - msgid "Transaction failed" - msgstr "執行失敗" - --#: ../camel/providers/smtp/camel-smtp-transport.c:913 -+#: ../camel/providers/smtp/camel-smtp-transport.c:952 - msgid "A password transition is needed" - msgstr "需要密碼傳送" - --#: ../camel/providers/smtp/camel-smtp-transport.c:915 -+#: ../camel/providers/smtp/camel-smtp-transport.c:954 - msgid "Authentication mechanism is too weak" - msgstr "核對機制太弱了" - --#: ../camel/providers/smtp/camel-smtp-transport.c:917 -+#: ../camel/providers/smtp/camel-smtp-transport.c:956 - msgid "Encryption required for requested authentication mechanism" - msgstr "所要求的核對機制必須加密處理" - --#: ../camel/providers/smtp/camel-smtp-transport.c:919 -+#: ../camel/providers/smtp/camel-smtp-transport.c:958 - msgid "Temporary authentication failure" - msgstr "臨時核對失敗" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1207 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1247 - msgid "SMTP Greeting" - msgstr "SMTP 迎接" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1217 --#: ../camel/providers/smtp/camel-smtp-transport.c:1231 --#: ../camel/providers/smtp/camel-smtp-transport.c:1239 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1257 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1272 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1280 - msgid "HELO command failed: " - msgstr "HELO 指令失敗:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1314 --#: ../camel/providers/smtp/camel-smtp-transport.c:1329 --#: ../camel/providers/smtp/camel-smtp-transport.c:1339 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1355 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1371 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1381 - msgid "MAIL FROM command failed: " - msgstr "MAIL FROM 指令失敗:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1366 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1408 - msgid "RCPT TO command failed: " - msgstr "RCPT TO 指令失敗:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1383 --#: ../camel/providers/smtp/camel-smtp-transport.c:1393 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1426 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1436 - #, c-format - msgid "RCPT TO <%s> failed: " - msgstr "RCPT TO <%s> 失敗:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1436 --#: ../camel/providers/smtp/camel-smtp-transport.c:1447 --#: ../camel/providers/smtp/camel-smtp-transport.c:1458 --#: ../camel/providers/smtp/camel-smtp-transport.c:1517 --#: ../camel/providers/smtp/camel-smtp-transport.c:1537 --#: ../camel/providers/smtp/camel-smtp-transport.c:1551 --#: ../camel/providers/smtp/camel-smtp-transport.c:1560 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1509 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1521 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1532 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1594 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1614 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1629 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1638 - msgid "DATA command failed: " - msgstr "DATA 指令失敗:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1585 --#: ../camel/providers/smtp/camel-smtp-transport.c:1600 --#: ../camel/providers/smtp/camel-smtp-transport.c:1609 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1663 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1679 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1688 - msgid "RSET command failed: " - msgstr "RSET 指令失敗:" - --#: ../camel/providers/smtp/camel-smtp-transport.c:1634 --#: ../camel/providers/smtp/camel-smtp-transport.c:1648 --#: ../camel/providers/smtp/camel-smtp-transport.c:1655 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1713 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1727 -+#: ../camel/providers/smtp/camel-smtp-transport.c:1734 - msgid "QUIT command failed: " - msgstr "QUIT 指令失敗:" - -@@ -4591,8 +4554,7 @@ - msgid "" - "Units for a birthday or anniversary reminder, \"minutes\", \"hours\" or " - "\"days\"" --msgstr "" --"生日和週年紀念日提醒的單位,「minutes」(分鐘)、「hours」(小時)或「days」(日)" -+msgstr "生日和週年紀念日提醒的單位,「minutes」(分鐘)、「hours」(小時)或「days」(日)" - - #: ../data/org.gnome.evolution.shell.network-config.gschema.xml.in.h:1 - msgid "(Deprecated) Proxy type to use" -@@ -4604,8 +4566,8 @@ - "settings are now integrated into Evolution-Data-Server's account system. See " - "the ESourceProxy API documentation for details." - msgstr "" --"這個設定鍵在 3.12 版中已廢棄不再使用。代理伺服器設定值現在已整合到 Evolution-" --"Data-Server 帳號系統。請查看 ESourceProxy API 文件以了解詳細資訊。" -+"這個設定鍵在 3.12 版中已廢棄不再使用。代理伺服器設定值現在已整合到 Evolution-Data-Server 帳號系統。請查看 " -+"ESourceProxy API 文件以了解詳細資訊。" - - #: ../data/org.gnome.evolution.shell.network-config.gschema.xml.in.h:3 - msgid "(Deprecated) Whether to use http-proxy" -@@ -4677,25 +4639,25 @@ - msgid "Client reports password was rejected" - msgstr "客戶端回報密碼被拒絕" - --#: ../libebackend/e-authentication-session.c:539 -+#: ../libebackend/e-authentication-session.c:542 - msgid "Add this password to your keyring" - msgstr "將密碼加入您的鑰匙圈" - --#: ../libebackend/e-authentication-session.c:649 -+#: ../libebackend/e-authentication-session.c:547 - msgid "Password was incorrect" - msgstr "密碼是不正確的" - --#: ../libebackend/e-backend.c:408 -+#: ../libebackend/e-backend.c:420 - #, c-format - msgid "%s does not support authentication" - msgstr "%s 不支援核對" - --#: ../libebackend/e-collection-backend.c:901 -+#: ../libebackend/e-collection-backend.c:992 - #, c-format - msgid "%s does not support creating remote resources" - msgstr "%s 不支援建立遠端資源" - --#: ../libebackend/e-collection-backend.c:960 -+#: ../libebackend/e-collection-backend.c:1051 - #, c-format - msgid "%s does not support deleting remote resources" - msgstr "%s 不支援刪除遠端資源" -@@ -4710,48 +4672,48 @@ - msgid "Data source is missing a [%s] group" - msgstr "資料來源缺少 [%s] 群組" - --#: ../libebackend/e-server-side-source.c:1022 --#: ../libedataserver/e-source.c:1394 -+#: ../libebackend/e-server-side-source.c:1025 -+#: ../libedataserver/e-source.c:1351 - #, c-format - msgid "Data source '%s' does not support creating remote resources" - msgstr "資料來源「%s」不支援建立遠端資源" - --#: ../libebackend/e-server-side-source.c:1036 -+#: ../libebackend/e-server-side-source.c:1039 - #, c-format - msgid "" - "Data source '%s' has no collection backend to create the remote resource" - msgstr "資料來源「%s」沒有用來建立遠端資料的收集後端" - --#: ../libebackend/e-server-side-source.c:1064 --#: ../libedataserver/e-source.c:1507 -+#: ../libebackend/e-server-side-source.c:1067 -+#: ../libedataserver/e-source.c:1464 - #, c-format - msgid "Data source '%s' does not support deleting remote resources" - msgstr "資料來源「%s」不支援刪除遠端資源" - --#: ../libebackend/e-server-side-source.c:1078 -+#: ../libebackend/e-server-side-source.c:1081 - #, c-format - msgid "" - "Data source '%s' has no collection backend to delete the remote resource" - msgstr "資料來源「%s」沒有用來刪除遠端資料的收集後端" - --#: ../libebackend/e-server-side-source.c:1109 --#: ../libedataserver/e-source.c:1603 --#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1026 -+#: ../libebackend/e-server-side-source.c:1112 -+#: ../libedataserver/e-source.c:1560 -+#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1027 - #, c-format - msgid "Data source '%s' does not support OAuth 2.0 authentication" - msgstr "資料來源「%s」不支援 OAuth 2.0 核對" - --#: ../libebackend/e-server-side-source.c:1456 -+#: ../libebackend/e-server-side-source.c:1459 - #, c-format - msgid "File must have a '.source' extension" - msgstr "檔案必須以「.source」做為延伸檔名" - --#: ../libebackend/e-source-registry-server.c:531 --#: ../libedataserver/e-source-registry.c:1957 -+#: ../libebackend/e-source-registry-server.c:535 -+#: ../libedataserver/e-source-registry.c:1944 - msgid "The user declined to authenticate" - msgstr "使用者拒絕核對" - --#: ../libebackend/e-source-registry-server.c:800 -+#: ../libebackend/e-source-registry-server.c:804 - #, c-format - msgid "UID '%s' is already in use" - msgstr "UID 「%s」已經在使用中" -@@ -4949,17 +4911,17 @@ - msgid "Source file is missing a [%s] group" - msgstr "來源檔案缺少 [%s] 群組" - --#: ../libedataserver/e-source.c:1174 -+#: ../libedataserver/e-source.c:1131 - #, c-format - msgid "Data source '%s' is not removable" - msgstr "資料來源「%s」無法移除" - --#: ../libedataserver/e-source.c:1297 -+#: ../libedataserver/e-source.c:1254 - #, c-format - msgid "Data source '%s' is not writable" - msgstr "資料來源「%s」無法寫入" - --#: ../libedataserver/e-source.c:1910 -+#: ../libedataserver/e-source.c:1867 - msgid "Unnamed" - msgstr "未命名的" - -@@ -4973,28 +4935,28 @@ - msgid "Source '%s' does not support proxy lookups" - msgstr "來源「%s」不支援代理伺服器查詢" - --#: ../libedataserver/e-source-webdav.c:1555 -+#: ../libedataserver/e-source-webdav.c:1562 - #, c-format - msgid "" - "SSL certificate for host '%s', used by address book '%s', is not trusted. Do " - "you wish to accept it?" - msgstr "主機「%s」用於通訊錄「%s」的 SSL 憑證未受信任。您想要接受它嗎?" - --#: ../libedataserver/e-source-webdav.c:1564 -+#: ../libedataserver/e-source-webdav.c:1571 - #, c-format - msgid "" - "SSL certificate for host '%s', used by calendar '%s', is not trusted. Do you " - "wish to accept it?" - msgstr "主機「%s」用於行事曆「%s」的 SSL 憑證未受信任。您想要接受它嗎?" - --#: ../libedataserver/e-source-webdav.c:1573 -+#: ../libedataserver/e-source-webdav.c:1580 - #, c-format - msgid "" - "SSL certificate for host '%s', used by memo list '%s', is not trusted. Do " - "you wish to accept it?" - msgstr "主機「%s」用於備忘錄清單「%s」的 SSL 憑證未受信任。您想要接受它嗎?" - --#: ../libedataserver/e-source-webdav.c:1582 -+#: ../libedataserver/e-source-webdav.c:1589 - #, c-format - msgid "" - "SSL certificate for host '%s', used by task list '%s', is not trusted. Do " -@@ -5005,7 +4967,7 @@ - #. * in 12-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1662 ../libedataserver/e-time-utils.c:1961 -+#: ../libedataserver/e-time-utils.c:1681 ../libedataserver/e-time-utils.c:1980 - msgid "%a %m/%d/%Y %I:%M:%S %p" - msgstr "%Y/%m/%d (%a) %p %I:%M:%S" - -@@ -5013,7 +4975,7 @@ - #. * in 24-hour format. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1667 ../libedataserver/e-time-utils.c:1952 -+#: ../libedataserver/e-time-utils.c:1686 ../libedataserver/e-time-utils.c:1971 - msgid "%a %m/%d/%Y %H:%M:%S" - msgstr "%Y/%m/%d (%a) %H:%M:%S" - -@@ -5021,7 +4983,7 @@ - #. * in 12-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 12-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1672 ../libedataserver/e-time-utils.c:1957 -+#: ../libedataserver/e-time-utils.c:1691 ../libedataserver/e-time-utils.c:1976 - msgid "%a %m/%d/%Y %I:%M %p" - msgstr "%a %m/%d/%Y %I:%M %p" - -@@ -5029,78 +4991,78 @@ - #. * in 24-hour format, without seconds. - #. strftime format of a weekday, a date and a - #. * time, in 24-hour format, without seconds. --#: ../libedataserver/e-time-utils.c:1677 ../libedataserver/e-time-utils.c:1948 -+#: ../libedataserver/e-time-utils.c:1696 ../libedataserver/e-time-utils.c:1967 - msgid "%a %m/%d/%Y %H:%M" - msgstr "%a %m/%d/%Y %H:%M" - - #. strptime format of a weekday, a date and a time, - #. * in 12-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1682 -+#: ../libedataserver/e-time-utils.c:1701 - msgid "%a %m/%d/%Y %I %p" - msgstr "%a %m/%d/%Y %I %p" - - #. strptime format of a weekday, a date and a time, - #. * in 24-hour format, without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1687 -+#: ../libedataserver/e-time-utils.c:1706 - msgid "%a %m/%d/%Y %H" - msgstr "%a %m/%d/%Y %H" - - #. strptime format of a weekday and a date. - #. strftime format of a weekday and a date. --#: ../libedataserver/e-time-utils.c:1690 ../libedataserver/e-time-utils.c:1810 --#: ../libedataserver/e-time-utils.c:1943 -+#: ../libedataserver/e-time-utils.c:1709 ../libedataserver/e-time-utils.c:1829 -+#: ../libedataserver/e-time-utils.c:1962 - msgid "%a %m/%d/%Y" - msgstr "%Y/%m/%d (%a)" - - #. strptime format of a date and a time, in 12-hour format. --#: ../libedataserver/e-time-utils.c:1697 -+#: ../libedataserver/e-time-utils.c:1716 - msgid "%m/%d/%Y %I:%M:%S %p" - msgstr "%m/%d/%Y %I:%M:%S %p" - - #. strptime format of a date and a time, in 24-hour format. --#: ../libedataserver/e-time-utils.c:1701 -+#: ../libedataserver/e-time-utils.c:1720 - msgid "%m/%d/%Y %H:%M:%S" - msgstr "%m/%d/%Y %H:%M:%S" - - #. strptime format of a date and a time, in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1706 -+#: ../libedataserver/e-time-utils.c:1725 - msgid "%m/%d/%Y %I:%M %p" - msgstr "%m/%d/%Y %I:%M %p" - - #. strptime format of a date and a time, in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1711 -+#: ../libedataserver/e-time-utils.c:1730 - msgid "%m/%d/%Y %H:%M" - msgstr "%m/%d/%Y %H:%M" - - #. strptime format of a date and a time, in 12-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1716 -+#: ../libedataserver/e-time-utils.c:1735 - msgid "%m/%d/%Y %I %p" - msgstr "%m/%d/%Y %I %p" - - #. strptime format of a date and a time, in 24-hour format, - #. * without minutes or seconds. --#: ../libedataserver/e-time-utils.c:1721 -+#: ../libedataserver/e-time-utils.c:1740 - msgid "%m/%d/%Y %H" - msgstr "%m/%d/%Y %H" - - #. strptime format of a weekday and a date. - #. This is the preferred date format for the locale. --#: ../libedataserver/e-time-utils.c:1724 ../libedataserver/e-time-utils.c:1813 -+#: ../libedataserver/e-time-utils.c:1743 ../libedataserver/e-time-utils.c:1832 - msgid "%m/%d/%Y" - msgstr "%Y/%m/%d" - - #. strptime format for a time of day, in 12-hour format. - #. strftime format of a time in 12-hour format. --#: ../libedataserver/e-time-utils.c:1884 ../libedataserver/e-time-utils.c:2005 -+#: ../libedataserver/e-time-utils.c:1903 ../libedataserver/e-time-utils.c:2024 - msgid "%I:%M:%S %p" - msgstr "%p %I:%M:%S" - - #. strptime format for a time of day, in 24-hour format. - #. strftime format of a time in 24-hour format. --#: ../libedataserver/e-time-utils.c:1888 ../libedataserver/e-time-utils.c:1997 -+#: ../libedataserver/e-time-utils.c:1907 ../libedataserver/e-time-utils.c:2016 - msgid "%H:%M:%S" - msgstr "%H:%M:%S" - -@@ -5108,25 +5070,25 @@ - #. * in 12-hour format. - #. strftime format of a time in 12-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1893 ../libedataserver/e-time-utils.c:2002 -+#: ../libedataserver/e-time-utils.c:1912 ../libedataserver/e-time-utils.c:2021 - msgid "%I:%M %p" - msgstr "%p %I:%M" - - #. strptime format for time of day, without seconds 24-hour format. - #. strftime format of a time in 24-hour format, - #. * without seconds. --#: ../libedataserver/e-time-utils.c:1897 ../libedataserver/e-time-utils.c:1994 -+#: ../libedataserver/e-time-utils.c:1916 ../libedataserver/e-time-utils.c:2013 - msgid "%H:%M" - msgstr "%H:%M" - - #. strptime format for time of day, without seconds 24-hour format, - #. * and no colon. --#: ../libedataserver/e-time-utils.c:1901 -+#: ../libedataserver/e-time-utils.c:1920 - msgid "%H%M" - msgstr "%H%M" - - #. strptime format for hour and AM/PM, 12-hour format. --#: ../libedataserver/e-time-utils.c:1905 -+#: ../libedataserver/e-time-utils.c:1924 - msgid "%I %p" - msgstr "%I %p" - -@@ -5141,9 +5103,7 @@ - msgid "" - "Cannot find a corresponding account in the org.gnome.OnlineAccounts service " - "from which to obtain a password for '%s'" --msgstr "" --"找不到在 org.gnome 中對應的帳號。這是 OnlineAccounts 服務用來獲得「%s」的密碼" --"的地方" -+msgstr "找不到在 org.gnome 中對應的帳號。這是 OnlineAccounts 服務用來獲得「%s」的密碼的地方" - - #: ../modules/gnome-online-accounts/e-goa-password-based.c:218 - #, c-format -@@ -5186,32 +5146,24 @@ - msgid "Failed to find ASUrl and OABUrl in autodiscover response" - msgstr "在自動探索回應中找不到 ASUrl 與 OABUrl" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1260 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1269 - #, c-format - msgid "" - "Cannot find a corresponding account in the org.gnome.OnlineAccounts service " - "from which to obtain an access token for '%s'" --msgstr "" --"找不到在 org.gnome 中對應的帳號。這是 OnlineAccounts 服務用來獲得「%s」的存取" --"記號的地方" -+msgstr "找不到在 org.gnome 中對應的帳號。這是 OnlineAccounts 服務用來獲得「%s」的存取記號的地方" - --#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1290 -+#: ../modules/gnome-online-accounts/module-gnome-online-accounts.c:1299 - #, c-format - msgid "Failed to obtain an access token for '%s': " - msgstr "無法獲得「%s」的存取記號:" - --#: ../modules/google-backend/module-google-backend.c:195 --#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 --#: ../modules/yahoo-backend/module-yahoo-backend.c:199 --msgid "Calendar" --msgstr "行事曆" -- --#: ../modules/google-backend/module-google-backend.c:268 -+#: ../modules/google-backend/module-google-backend.c:341 - #: ../modules/yahoo-backend/module-yahoo-backend.c:226 - msgid "Tasks" - msgstr "工作" - --#: ../modules/google-backend/module-google-backend.c:321 -+#: ../modules/google-backend/module-google-backend.c:395 - #: ../modules/ubuntu-online-accounts/contacts.service-type.in.in.h:1 - #: ../services/evolution-source-registry/builtin/contacts-stub.source.in.h:1 - msgid "Contacts" -@@ -5270,6 +5222,11 @@ - msgid "Reason:" - msgstr "原因:" - -+#: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:1 -+#: ../modules/yahoo-backend/module-yahoo-backend.c:199 -+msgid "Calendar" -+msgstr "行事曆" -+ - #: ../modules/ubuntu-online-accounts/calendar.service-type.in.in.h:2 - msgid "Integrate your calendars" - msgstr "整合您的行事曆" -@@ -5310,7 +5267,7 @@ - msgid "Integrate your mailboxes" - msgstr "整合您的信箱" - --#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1007 -+#: ../modules/ubuntu-online-accounts/module-ubuntu-online-accounts.c:1008 - #, c-format - msgid "" - "Cannot find a corresponding account service in the accounts database from " -@@ -5321,7 +5278,8 @@ - #: ../modules/ubuntu-online-accounts/uoa-utils.c:281 - #, c-format - msgid "" --"Expected status 200 when requesting your identity, instead got status %d (%s)" -+"Expected status 200 when requesting your identity, instead got status %d " -+"(%s)" - msgstr "請求您的身分識別時預期的狀態為 200,但卻取得狀態 %d (%s)" - - #: ../modules/ubuntu-online-accounts/uoa-utils.c:101 -diff -urN evolution-data-server-3.12.11/po/it.po evolution-data-server-3.12.11_localized/po/it.po ---- evolution-data-server-3.12.11/po/it.po 2016-06-19 11:38:26.077306396 +0530 -+++ evolution-data-server-3.12.11_localized/po/it.po 2016-06-19 11:38:47.855304664 +0530 -@@ -23,6 +23,7 @@ - # Milo Casagrande , 2012, 2013, 2014. - # Luca Ferretti , 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013. - # Gianvito Cavasoli , 2014. -+# fvalen , 2016. #zanata - # pnemade , 2016. #zanata - msgid "" - msgstr "" -@@ -32,8 +33,8 @@ - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" --"PO-Revision-Date: 2014-10-10 09:11+0000\n" --"Last-Translator: Milo Casagrande \n" -+"PO-Revision-Date: 2016-05-27 06:35+0000\n" -+"Last-Translator: fvalen \n" - "Language-Team: Italiano \n" - "Language: it\n" - "Plural-Forms: nplurals=2; plural=(n != 1);\n" -@@ -1382,9 +1383,9 @@ - msgstr "Connessione a un server usando SSL non riuscita: %s" - - #: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 --#, fuzzy, c-format -+#, c-format - msgid "Unexpected HTTP status code %d returned (%s) for URI: %s" --msgstr "Restituito codice di stato HTTP %d inatteso (%s)" -+msgstr "Restituito codice di stato HTTP %d inatteso (%s) per URI: %s" - - #: ../calendar/backends/caldav/e-cal-backend-caldav.c:647 - msgid "CalDAV backend is not loaded yet" -@@ -3026,9 +3027,8 @@ - msgstr "Impossibile rinominare la cartella: %s: operazione non valida" - - #: ../camel/camel-stream.c:170 --#, fuzzy - msgid "Cannot write with no base stream" --msgstr "Impossibile effettuare l'autenticazione senza un nome utente" -+msgstr "Impossibile eseguire la scrittura senza uno stream di base" - - #: ../camel/camel-stream.c:290 ../camel/camel-stream.c:341 - #, c-format -@@ -3683,9 +3683,9 @@ - - #: ../camel/providers/local/camel-maildir-store.c:131 - #: ../camel/providers/local/camel-maildir-store.c:931 --#, fuzzy, c-format -+#, c-format - msgid "Cannot create folder containing '%s'" --msgstr "Impossibile creare la cartella «%s»: %s" -+msgstr "Impossibile creare la cartella contenente '%s'" - - #: ../camel/providers/local/camel-maildir-store.c:139 - #: ../camel/providers/local/camel-maildir-store.c:158 -diff -urN evolution-data-server-3.12.11/po/ko.po evolution-data-server-3.12.11_localized/po/ko.po ---- evolution-data-server-3.12.11/po/ko.po 2016-06-19 11:38:26.081306396 +0530 -+++ evolution-data-server-3.12.11_localized/po/ko.po 2016-06-19 11:38:47.866304663 +0530 -@@ -15,6 +15,7 @@ - # - "spool"은 "메일 모음"으로 번역. - # - "authentication"을 여러가지 인증 방식을 구별하는 용도로 사용할 때는 "인증 - # 방법"이라고 번역. -+# eukim , 2016. #zanata - # pnemade , 2016. #zanata - msgid "" - msgstr "" -@@ -24,8 +25,8 @@ - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" --"PO-Revision-Date: 2014-09-13 04:21+0000\n" --"Last-Translator: Changwoo Ryu \n" -+"PO-Revision-Date: 2016-05-26 12:40+0000\n" -+"Last-Translator: eukim \n" - "Language-Team: GNOME Korea \n" - "Language: ko\n" - "Plural-Forms: nplurals=1; plural=0;\n" -@@ -1328,9 +1329,9 @@ - msgstr "SSL을 사용하여 서버에 연결하는데 실패했습니다: %s" - - #: ../calendar/backends/caldav/e-cal-backend-caldav.c:626 --#, fuzzy, c-format -+#, c-format - msgid "Unexpected HTTP status code %d returned (%s) for URI: %s" --msgstr "예기치 않은 HTTP 상태 코드 %d번을 리턴했습니다(%s)" -+msgstr "예기치 않은 HTTP 상태 코드 %d번을 리턴했습니다(%s): %s" - - #: ../calendar/backends/caldav/e-cal-backend-caldav.c:647 - msgid "CalDAV backend is not loaded yet" -@@ -2915,9 +2916,8 @@ - msgstr "폴더 이름을 바꿀 수 없습니다: %s: 잘못된 동작" - - #: ../camel/camel-stream.c:170 --#, fuzzy - msgid "Cannot write with no base stream" --msgstr "사용자 이름 없이 인증할 수 없습니다" -+msgstr "기반 스트림없이 쓸 수 없습니다" - - #: ../camel/camel-stream.c:290 ../camel/camel-stream.c:341 - #, c-format -@@ -3546,9 +3546,9 @@ - - #: ../camel/providers/local/camel-maildir-store.c:131 - #: ../camel/providers/local/camel-maildir-store.c:931 --#, fuzzy, c-format -+#, c-format - msgid "Cannot create folder containing '%s'" --msgstr "'%s' 폴더를 만들 수 없습니다: %s" -+msgstr "'%s'이/가 포함된 폴더를 만들 수 없습니다" - - #: ../camel/providers/local/camel-maildir-store.c:139 - #: ../camel/providers/local/camel-maildir-store.c:158 diff --git a/SOURCES/evolution-data-server-3.12.11-truly-disable-gtk-doc.patch b/SOURCES/evolution-data-server-3.12.11-truly-disable-gtk-doc.patch deleted file mode 100644 index c7eb51a..0000000 --- a/SOURCES/evolution-data-server-3.12.11-truly-disable-gtk-doc.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff -up evolution-data-server-3.12.11/Makefile.am.truly-disable-gtk-doc evolution-data-server-3.12.11/Makefile.am ---- evolution-data-server-3.12.11/Makefile.am.truly-disable-gtk-doc 2014-07-10 12:27:18.000000000 +0200 -+++ evolution-data-server-3.12.11/Makefile.am 2015-05-28 19:29:13.077569079 +0200 -@@ -20,11 +20,14 @@ SUBDIRS = \ - modules \ - services \ - tests \ -- docs \ - art \ - po \ - $(NULL) - -+if ENABLE_GTK_DOC -+SUBDIRS += docs -+endif -+ - if BUILD_EXAMPLES - SUBDIRS += examples - endif diff --git a/SOURCES/evolution-data-server-3.12.11-weather-calendar-merge-day-forecasts.patch b/SOURCES/evolution-data-server-3.12.11-weather-calendar-merge-day-forecasts.patch deleted file mode 100644 index c293424..0000000 --- a/SOURCES/evolution-data-server-3.12.11-weather-calendar-merge-day-forecasts.patch +++ /dev/null @@ -1,278 +0,0 @@ -diff -up evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c.weather-calendar-merge-day-forecasts evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c ---- evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c.weather-calendar-merge-day-forecasts 2014-03-24 10:07:52.000000000 +0100 -+++ evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c 2015-05-21 16:07:41.897961486 +0200 -@@ -46,7 +46,8 @@ static ECalComponent * - create_weather (ECalBackendWeather *cbw, - GWeatherInfo *report, - GWeatherTemperatureUnit unit, -- gboolean is_forecast); -+ gboolean is_forecast, -+ GSList *same_day_forecasts); - static void e_cal_backend_weather_add_timezone - (ECalBackendSync *backend, - EDataCal *cal, -@@ -157,6 +158,27 @@ put_component_to_store (ECalBackendWeath - e_cal_backend_store_put_component_with_time_range (priv->store, comp, time_start, time_end); - } - -+static gint -+compare_weather_info_by_date (gconstpointer a, -+ gconstpointer b) -+{ -+ GWeatherInfo *nfoa = (GWeatherInfo *) a, *nfob = (GWeatherInfo *) b; -+ -+ if (nfoa && nfob) { -+ time_t tma, tmb; -+ -+ if (!gweather_info_get_value_update (nfoa, &tma)) -+ tma = 0; -+ -+ if (!gweather_info_get_value_update (nfob, &tmb)) -+ tmb = 0; -+ -+ return tma == tmb ? 0 : (tma < tmb ? -1 : 1); -+ } -+ -+ return nfoa == nfob ? 0 : (nfoa ? 1 : -1); -+} -+ - static void - finished_retrieval_cb (GWeatherInfo *info, - ECalBackendWeather *cbw) -@@ -202,31 +224,83 @@ finished_retrieval_cb (GWeatherInfo *inf - g_slist_free (comps); - e_cal_backend_store_clean (priv->store); - -- comp = create_weather (cbw, info, unit, FALSE); -+ comp = create_weather (cbw, info, unit, FALSE, NULL); - if (comp) { -- GSList *forecasts; -+ GSList *orig_forecasts; - - put_component_to_store (cbw, comp); - e_cal_backend_notify_component_created (E_CAL_BACKEND (cbw), comp); - g_object_unref (comp); - -- forecasts = gweather_info_get_forecast_list (info); -- if (forecasts) { -- GSList *f; -+ orig_forecasts = gweather_info_get_forecast_list (info); -+ if (orig_forecasts) { -+ time_t info_day = 0; -+ GSList *forecasts, *f; -+ -+ if (!gweather_info_get_value_update (info, &info_day)) -+ info_day = 0; -+ -+ info_day = info_day / (24 * 60 * 60); - - /* skip the first one, it's for today, which has been added above */ -- for (f = forecasts->next; f; f = f->next) { -+ forecasts = g_slist_copy (orig_forecasts->next); -+ forecasts = g_slist_sort (forecasts, compare_weather_info_by_date); -+ -+ f = forecasts; -+ while (f) { -+ time_t current_day; - GWeatherInfo *nfo = f->data; - -- if (nfo) { -- comp = create_weather (cbw, nfo, unit, TRUE); -+ f = g_slist_next (f); -+ -+ if (nfo && gweather_info_get_value_update (nfo, ¤t_day)) { -+ GSList *same_day_forecasts = NULL; -+ gint current_hour; -+ -+ current_hour = current_day % (24 * 60 * 60); -+ current_day = current_day / (24 * 60 * 60); -+ -+ if (current_day == info_day) -+ continue; -+ -+ while (f) { -+ GWeatherInfo *test_nfo = f->data; -+ time_t test_day; -+ -+ if (test_nfo && gweather_info_get_value_update (test_nfo, &test_day)) { -+ time_t test_hour; -+ -+ test_hour = test_day % (24 * 60 * 60); -+ -+ if (test_day / (24 * 60 * 60) != current_day) -+ break; -+ -+ same_day_forecasts = g_slist_prepend (same_day_forecasts, test_nfo); -+ -+ /* Use the main GWeatherInfo the one closest to noon */ -+ if (ABS (test_hour - (12 * 60 * 60)) < ABS (current_hour - (12 * 60 * 60))) { -+ nfo = test_nfo; -+ current_hour = test_hour; -+ } -+ } -+ -+ f = g_slist_next (f); -+ } -+ -+ same_day_forecasts = g_slist_reverse (same_day_forecasts); -+ -+ comp = create_weather (cbw, nfo, unit, TRUE, same_day_forecasts); - if (comp) { - put_component_to_store (cbw, comp); - e_cal_backend_notify_component_created (E_CAL_BACKEND (cbw), comp); - g_object_unref (comp); - } -+ -+ g_slist_free (same_day_forecasts); - } - } -+ -+ g_slist_free (forecasts); - } - } - -@@ -341,11 +415,53 @@ cal_backend_weather_get_temp (gdouble va - return g_strdup_printf (_("%.1f"), value); - } - -+static gchar * -+describe_forecast (GWeatherInfo *nfo, -+ GWeatherTemperatureUnit unit) -+{ -+ gchar *str, *date, *summary, *temp; -+ gdouble tmin = 0.0, tmax = 0.0, temp1 = 0.0; -+ -+ date = gweather_info_get_update (nfo); -+ summary = gweather_info_get_conditions (nfo); -+ if (g_str_equal (summary, "-")) { -+ g_free (summary); -+ summary = gweather_info_get_sky (nfo); -+ } -+ -+ if (gweather_info_get_value_temp_min (nfo, unit, &tmin) && -+ gweather_info_get_value_temp_max (nfo, unit, &tmax) && -+ tmin != tmax) { -+ gchar *min, *max; -+ -+ min = cal_backend_weather_get_temp (tmin, unit); -+ max = cal_backend_weather_get_temp (tmax, unit); -+ -+ temp = g_strdup_printf ("%s / %s", min, max); -+ -+ g_free (min); -+ g_free (max); -+ } else if (gweather_info_get_value_temp (nfo, unit, &temp1)) { -+ temp = cal_backend_weather_get_temp (temp1, unit); -+ } else { -+ temp = gweather_info_get_temp (nfo); -+ } -+ -+ str = g_strdup_printf (" * %s: %s, %s", date, summary, temp); -+ -+ g_free (date); -+ g_free (summary); -+ g_free (temp); -+ -+ return str; -+} -+ - static ECalComponent * - create_weather (ECalBackendWeather *cbw, - GWeatherInfo *report, - GWeatherTemperatureUnit unit, -- gboolean is_forecast) -+ gboolean is_forecast, -+ GSList *same_day_forecasts) - { - ECalComponent *cal_comp; - ECalComponentText comp_summary; -@@ -353,7 +469,7 @@ create_weather (ECalBackendWeather *cbw, - struct icaltimetype itt; - ECalComponentDateTime dt; - gchar *uid; -- GSList *text_list = NULL; -+ GSList *text_list = NULL, *link; - ECalComponentText *description; - gchar *tmp, *city_name; - time_t update_time; -@@ -435,12 +551,12 @@ create_weather (ECalBackendWeather *cbw, - e_cal_component_set_summary (cal_comp, &comp_summary); - g_free ((gchar *) comp_summary.value); - -- tmp = gweather_info_get_forecast (report); - comp_summary.value = gweather_info_get_weather_summary (report); - - description = g_new0 (ECalComponentText, 1); - { - GString *builder; -+ gboolean has_forecast_word = FALSE; - - builder = g_string_new (NULL); - -@@ -448,12 +564,60 @@ create_weather (ECalBackendWeather *cbw, - g_string_append (builder, comp_summary.value); - g_string_append_c (builder, '\n'); - } -- if (tmp) { -- g_string_append (builder, _("Forecast")); -- g_string_append_c (builder, ':'); -- if (!is_forecast) -- g_string_append_c (builder, '\n'); -- g_string_append (builder, tmp); -+ -+ tmp = NULL; -+ -+ for (link = gweather_info_get_forecast_list (report); link; link = g_slist_next (link)) { -+ GWeatherInfo *nfo = link->data; -+ -+ if (nfo) { -+ tmp = describe_forecast (nfo, unit); -+ -+ if (tmp && *tmp) { -+ if (!has_forecast_word) { -+ has_forecast_word = TRUE; -+ -+ g_string_append (builder, _("Forecast")); -+ g_string_append_c (builder, ':'); -+ g_string_append_c (builder, '\n'); -+ } -+ -+ g_string_append (builder, tmp); -+ g_string_append_c (builder, '\n'); -+ } -+ -+ g_free (tmp); -+ tmp = NULL; -+ } -+ } -+ -+ if (same_day_forecasts) { -+ g_free (tmp); -+ tmp = NULL; -+ -+ for (link = same_day_forecasts; link; link = g_slist_next (link)) { -+ GWeatherInfo *nfo = link->data; -+ -+ if (nfo) { -+ tmp = describe_forecast (nfo, unit); -+ -+ if (tmp && *tmp) { -+ if (!has_forecast_word) { -+ has_forecast_word = TRUE; -+ -+ g_string_append (builder, _("Forecast")); -+ g_string_append_c (builder, ':'); -+ g_string_append_c (builder, '\n'); -+ } -+ -+ g_string_append (builder, tmp); -+ g_string_append_c (builder, '\n'); -+ } -+ -+ g_free (tmp); -+ tmp = NULL; -+ } -+ } - } - - description->value = g_string_free (builder, FALSE); diff --git a/SOURCES/evolution-data-server-3.12.11-weather-update-units.patch b/SOURCES/evolution-data-server-3.12.11-weather-update-units.patch deleted file mode 100644 index 3e4f8a2..0000000 --- a/SOURCES/evolution-data-server-3.12.11-weather-update-units.patch +++ /dev/null @@ -1,200 +0,0 @@ -diff -up evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c.weather-update-units evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c ---- evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c.weather-update-units 2016-03-07 13:58:10.305155925 +0100 -+++ evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c 2016-03-07 13:58:10.336155765 +0100 -@@ -67,13 +67,16 @@ struct _ECalBackendWeatherPrivate { - guint reload_timeout_id; - guint is_loading : 1; - -- /* Flags */ -- gboolean opened; -- - /* Weather source */ - EWeatherSource *source; - - guint begin_retrival_id; -+ -+ gulong source_changed_id; -+ -+ GMutex last_used_mutex; -+ ESourceWeatherUnits last_used_units; -+ gchar *last_used_location; - }; - - static gboolean -@@ -87,7 +90,6 @@ reload_cb (gpointer user_data) - return TRUE; - - cbw->priv->reload_timeout_id = 0; -- cbw->priv->opened = TRUE; - begin_retrieval_cb (cbw); - - return FALSE; -@@ -200,13 +202,21 @@ finished_retrieval_cb (GWeatherInfo *inf - source = e_backend_get_source (E_BACKEND (cbw)); - weather_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEATHER_BACKEND); - -- if (e_source_weather_get_units (weather_extension) == E_SOURCE_WEATHER_UNITS_CENTIGRADE) -+ g_mutex_lock (&priv->last_used_mutex); -+ -+ priv->last_used_units = e_source_weather_get_units (weather_extension); -+ g_free (priv->last_used_location); -+ priv->last_used_location = e_source_weather_dup_location (weather_extension); -+ -+ if (priv->last_used_units == E_SOURCE_WEATHER_UNITS_CENTIGRADE) - unit = GWEATHER_TEMP_UNIT_CENTIGRADE; -- else if (e_source_weather_get_units (weather_extension) == E_SOURCE_WEATHER_UNITS_KELVIN) -+ else if (priv->last_used_units == E_SOURCE_WEATHER_UNITS_KELVIN) - unit = GWEATHER_TEMP_UNIT_KELVIN; - else /* E_SOURCE_WEATHER_UNITS_FAHRENHEIT */ - unit = GWEATHER_TEMP_UNIT_FAHRENHEIT; - -+ g_mutex_unlock (&priv->last_used_mutex); -+ - /* update cache */ - comps = e_cal_backend_store_get_components (priv->store); - -@@ -713,28 +723,29 @@ e_cal_backend_weather_open (ECalBackendS - } - - static void --e_cal_backend_weather_refresh (ECalBackendSync *backend, -- EDataCal *cal, -- GCancellable *cancellable, -- GError **perror) -+e_cal_backend_weather_refresh_content (ECalBackendWeather *cbw) - { -- ECalBackendWeather *cbw; -- ECalBackendWeatherPrivate *priv; -+ g_return_if_fail (E_IS_CAL_BACKEND_WEATHER (cbw)); - -- cbw = E_CAL_BACKEND_WEATHER (backend); -- priv = cbw->priv; -- -- if (!priv->opened || -- priv->is_loading) -+ if (!e_cal_backend_is_opened (E_CAL_BACKEND (cbw)) || -+ cbw->priv->is_loading) - return; - -- if (priv->reload_timeout_id) -- g_source_remove (priv->reload_timeout_id); -- priv->reload_timeout_id = 0; -+ if (cbw->priv->reload_timeout_id) -+ g_source_remove (cbw->priv->reload_timeout_id); -+ cbw->priv->reload_timeout_id = 0; - - /* wait a second, then start reloading */ -- priv->reload_timeout_id = -- e_named_timeout_add_seconds (1, reload_cb, cbw); -+ cbw->priv->reload_timeout_id = e_named_timeout_add_seconds (1, reload_cb, cbw); -+} -+ -+static void -+e_cal_backend_weather_refresh (ECalBackendSync *backend, -+ EDataCal *cal, -+ GCancellable *cancellable, -+ GError **perror) -+{ -+ e_cal_backend_weather_refresh_content (E_CAL_BACKEND_WEATHER (backend)); - } - - static void -@@ -945,6 +956,54 @@ e_cal_backend_weather_notify_online_cb ( - } - - static void -+e_cal_backend_weather_source_changed_cb (ESource *source, -+ ECalBackendWeather *cbw) -+{ -+ ESourceWeather *weather_extension; -+ gchar *location; -+ -+ g_return_if_fail (E_IS_SOURCE (source)); -+ g_return_if_fail (E_IS_CAL_BACKEND_WEATHER (cbw)); -+ -+ weather_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEATHER_BACKEND); -+ location = e_source_weather_dup_location (weather_extension); -+ -+ g_mutex_lock (&cbw->priv->last_used_mutex); -+ -+ if (cbw->priv->last_used_units != e_source_weather_get_units (weather_extension) || -+ g_strcmp0 (location, cbw->priv->last_used_location) != 0) { -+ g_mutex_unlock (&cbw->priv->last_used_mutex); -+ -+ e_cal_backend_weather_refresh_content (cbw); -+ } else { -+ g_mutex_unlock (&cbw->priv->last_used_mutex); -+ } -+ -+ g_free (location); -+} -+ -+static void -+e_cal_backend_weather_constructed (GObject *object) -+{ -+ ECalBackendWeather *cbw; -+ ESource *source; -+ ESourceWeather *weather_extension; -+ -+ /* Chain up to parent's method. */ -+ G_OBJECT_CLASS (e_cal_backend_weather_parent_class)->constructed (object); -+ -+ cbw = E_CAL_BACKEND_WEATHER (object); -+ source = e_backend_get_source (E_BACKEND (cbw)); -+ -+ g_return_if_fail (source != NULL); -+ -+ weather_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEATHER_BACKEND); -+ -+ cbw->priv->last_used_units = e_source_weather_get_units (weather_extension); -+ cbw->priv->source_changed_id = g_signal_connect (source, "changed", G_CALLBACK (e_cal_backend_weather_source_changed_cb), cbw); -+} -+ -+static void - e_cal_backend_weather_dispose (GObject *object) - { - ECalBackendWeatherPrivate *priv; -@@ -961,6 +1020,17 @@ e_cal_backend_weather_dispose (GObject * - priv->begin_retrival_id = 0; - } - -+ if (priv->source_changed_id) { -+ ESource *source; -+ -+ source = e_backend_get_source (E_BACKEND (object)); -+ if (source) { -+ g_signal_handler_disconnect (source, priv->source_changed_id); -+ } -+ -+ priv->source_changed_id = 0; -+ } -+ - g_clear_object (&priv->source); - - /* Chain up to parent's dispose() method. */ -@@ -979,6 +1049,8 @@ e_cal_backend_weather_finalize (GObject - priv->store = NULL; - } - -+ g_mutex_clear (&priv->last_used_mutex); -+ - /* Chain up to parent's finalize() method. */ - G_OBJECT_CLASS (e_cal_backend_weather_parent_class)->finalize (object); - } -@@ -989,6 +1061,8 @@ e_cal_backend_weather_init (ECalBackendW - { - cbw->priv = E_CAL_BACKEND_WEATHER_GET_PRIVATE (cbw); - -+ g_mutex_init (&cbw->priv->last_used_mutex); -+ - g_signal_connect ( - cbw, "notify::online", - G_CALLBACK (e_cal_backend_weather_notify_online_cb), NULL); -@@ -1008,6 +1082,7 @@ e_cal_backend_weather_class_init (ECalBa - backend_class = (ECalBackendClass *) class; - sync_class = (ECalBackendSyncClass *) class; - -+ object_class->constructed = e_cal_backend_weather_constructed; - object_class->dispose = e_cal_backend_weather_dispose; - object_class->finalize = e_cal_backend_weather_finalize; - diff --git a/SOURCES/evolution-data-server-3.22.6-coverity-scan-issues.patch b/SOURCES/evolution-data-server-3.22.6-coverity-scan-issues.patch new file mode 100644 index 0000000..92c7ff3 --- /dev/null +++ b/SOURCES/evolution-data-server-3.22.6-coverity-scan-issues.patch @@ -0,0 +1,150 @@ +diff --git a/addressbook/backends/ldap/e-book-backend-ldap.c b/addressbook/backends/ldap/e-book-backend-ldap.c +index 93d5f8a..8cb1cd8 100644 +--- a/addressbook/backends/ldap/e-book-backend-ldap.c ++++ b/addressbook/backends/ldap/e-book-backend-ldap.c +@@ -3822,7 +3822,11 @@ e_book_backend_ldap_build_query (EBookBackendLDAP *bl, + } + + e_sexp_input_text (sexp, query, strlen (query)); +- e_sexp_parse (sexp); ++ if (e_sexp_parse (sexp) == -1) { ++ g_warning ("%s: Error in parsing '%s': %s", G_STRFUNC, query, e_sexp_get_error (sexp)); ++ g_object_unref (sexp); ++ return NULL; ++ } + + r = e_sexp_eval (sexp); + +diff --git a/addressbook/libebook-contacts/e-book-query.c b/addressbook/libebook-contacts/e-book-query.c +index 3604bae..38a3ec3 100644 +--- a/addressbook/libebook-contacts/e-book-query.c ++++ b/addressbook/libebook-contacts/e-book-query.c +@@ -777,6 +777,7 @@ e_book_query_from_string (const gchar *query_string) + + if (e_sexp_parse (sexp) == -1) { + g_warning ("%s: Error in parsing: %s", G_STRFUNC, e_sexp_get_error (sexp)); ++ g_object_unref (sexp); + return NULL; + } + +diff --git a/addressbook/libedata-book/e-book-backend-sqlitedb.c b/addressbook/libedata-book/e-book-backend-sqlitedb.c +index 2f51d2d..18568c8 100644 +--- a/addressbook/libedata-book/e-book-backend-sqlitedb.c ++++ b/addressbook/libedata-book/e-book-backend-sqlitedb.c +@@ -3318,6 +3318,7 @@ e_book_backend_sqlitedb_check_summary_query_locked (EBookBackendSqliteDB *ebsdb, + if (esexp_error == -1) { + if (invalid_query) + *invalid_query = TRUE; ++ g_object_unref (sexp); + + return FALSE; + } +diff --git a/addressbook/libedata-book/e-book-backend-summary.c b/addressbook/libedata-book/e-book-backend-summary.c +index 2275548..ba59c9f 100644 +--- a/addressbook/libedata-book/e-book-backend-summary.c ++++ b/addressbook/libedata-book/e-book-backend-summary.c +@@ -1273,6 +1273,7 @@ e_book_backend_summary_search (EBookBackendSummary *summary, + esexp_error = e_sexp_parse (sexp); + + if (esexp_error == -1) { ++ g_object_unref (sexp); + return NULL; + } + +diff --git a/camel/camel-db.c b/camel/camel-db.c +index f21c359..71b06a6 100644 +--- a/camel/camel-db.c ++++ b/camel/camel-db.c +@@ -2263,7 +2263,7 @@ cdb_delete_ids (CamelDB *cdb, + GError **error) + { + gchar *tmp; +- gint ret = 0; ++ gint ret; + gboolean first = TRUE; + GString *str = g_string_new ("DELETE FROM "); + GList *iterator; +@@ -2294,7 +2294,7 @@ cdb_delete_ids (CamelDB *cdb, + + g_string_append (str, ")"); + +- ret = ret == -1 ? ret : camel_db_add_to_transaction (cdb, str->str, error); ++ ret = camel_db_add_to_transaction (cdb, str->str, error); + + if (ret == -1) + camel_db_abort_transaction (cdb, NULL); +diff --git a/libedataserverui/e-webdav-discover-widget.c b/libedataserverui/e-webdav-discover-widget.c +index 984455f..3fe9dc7 100644 +--- a/libedataserverui/e-webdav-discover-widget.c ++++ b/libedataserverui/e-webdav-discover-widget.c +@@ -646,7 +646,7 @@ e_webdav_discover_content_trust_prompt_done_cb (GObject *source_object, + e_webdav_discover_content_refresh_done_cb, rd); + } else { + g_cancellable_cancel (rd->cancellable); +- g_cancellable_set_error_if_cancelled (rd->cancellable, &local_error); ++ g_warn_if_fail (g_cancellable_set_error_if_cancelled (rd->cancellable, &local_error)); + g_simple_async_result_take_error (rd->simple, local_error); + local_error = NULL; + g_simple_async_result_complete (rd->simple); +diff --git a/tools/addressbook-export/addressbook-export.c b/tools/addressbook-export/addressbook-export.c +index 7c19614..0ce10b0 100644 +--- a/tools/addressbook-export/addressbook-export.c ++++ b/tools/addressbook-export/addressbook-export.c +@@ -80,7 +80,7 @@ action_list_folders_init (ActionContext *p_actctx) + EBookClient *book_client; + EBookQuery *query; + ESource *source; +- GSList *contacts; ++ GSList *contacts = NULL; + const gchar *display_name; + const gchar *uid; + gchar *query_str; +@@ -110,8 +110,8 @@ action_list_folders_init (ActionContext *p_actctx) + query_str = e_book_query_to_string (query); + e_book_query_unref (query); + +- e_book_client_get_contacts_sync ( +- book_client, query_str, &contacts, NULL, NULL); ++ if (!e_book_client_get_contacts_sync (book_client, query_str, &contacts, NULL, NULL)) ++ contacts = NULL; + + display_name = e_source_get_display_name (source); + uid = e_source_get_uid (source); +@@ -125,9 +125,7 @@ action_list_folders_init (ActionContext *p_actctx) + "\"%s\",\"%s\",%d\n", + uid, display_name, g_slist_length (contacts)); + +- g_slist_foreach (contacts, (GFunc) g_object_unref, NULL); +- g_slist_free (contacts); +- ++ g_slist_free_full (contacts, g_object_unref); + g_object_unref (book_client); + } + +@@ -806,7 +804,7 @@ action_list_cards_init (ActionContext *p_actctx) + EBookClient *book_client; + EBookQuery *query; + ESource *source; +- GSList *contacts; ++ GSList *contacts = NULL; + const gchar *uid; + gchar *query_str; + GError *error = NULL; +@@ -853,13 +851,11 @@ action_list_cards_init (ActionContext *p_actctx) + query_str = e_book_query_to_string (query); + e_book_query_unref (query); + +- e_book_client_get_contacts_sync ( +- book_client, query_str, &contacts, NULL, &error); +- +- action_list_cards (contacts, p_actctx); ++ if (e_book_client_get_contacts_sync (book_client, query_str, &contacts, NULL, &error)) { ++ action_list_cards (contacts, p_actctx); ++ g_slist_free_full (contacts, g_object_unref); ++ } + +- g_slist_foreach (contacts, (GFunc) g_object_unref, NULL); +- g_slist_free (contacts); + g_object_unref (book_client); + + if (error != NULL) { diff --git a/SOURCES/evolution-data-server-3.22.6-maybe-uninitialized-variable.patch b/SOURCES/evolution-data-server-3.22.6-maybe-uninitialized-variable.patch new file mode 100644 index 0000000..411a876 --- /dev/null +++ b/SOURCES/evolution-data-server-3.22.6-maybe-uninitialized-variable.patch @@ -0,0 +1,12 @@ +diff -up evolution-data-server-3.22.6/camel/providers/pop3/camel-pop3-folder.c.maybe-uninitialized-variable evolution-data-server-3.22.6/camel/providers/pop3/camel-pop3-folder.c +--- evolution-data-server-3.22.6/camel/providers/pop3/camel-pop3-folder.c.maybe-uninitialized-variable 2017-03-14 15:24:48.131584612 +0100 ++++ evolution-data-server-3.22.6/camel/providers/pop3/camel-pop3-folder.c 2017-03-14 15:25:42.541580816 +0100 +@@ -409,7 +409,7 @@ pop3_folder_get_message_internal_sync (C + CamelPOP3Command *pcr; + CamelPOP3FolderInfo *fi; + gchar buffer[1]; +- gint i, last; ++ gint i = -1, last; + CamelStream *stream = NULL; + CamelService *service; + CamelSettings *settings; diff --git a/SOURCES/evolution-data-server-3.22.7-caldav-oauth2-refresh-deadlock.patch b/SOURCES/evolution-data-server-3.22.7-caldav-oauth2-refresh-deadlock.patch new file mode 100644 index 0000000..ddb2cd5 --- /dev/null +++ b/SOURCES/evolution-data-server-3.22.7-caldav-oauth2-refresh-deadlock.patch @@ -0,0 +1,57 @@ +diff -up evolution-data-server-3.22.7/calendar/backends/caldav/e-cal-backend-caldav.c.caldav-oauth2-refresh-deadlock evolution-data-server-3.22.7/calendar/backends/caldav/e-cal-backend-caldav.c +--- evolution-data-server-3.22.7/calendar/backends/caldav/e-cal-backend-caldav.c.caldav-oauth2-refresh-deadlock 2017-03-20 10:07:46.000000000 +0100 ++++ evolution-data-server-3.22.7/calendar/backends/caldav/e-cal-backend-caldav.c 2017-04-10 10:58:07.970110715 +0200 +@@ -362,6 +362,7 @@ caldav_ensure_bearer_auth_usage (ECalBac + + static gboolean + caldav_setup_bearer_auth (ECalBackendCalDAV *cbdav, ++ gboolean is_in_authenticate, + ESoupAuthBearer *bearer, + GCancellable *cancellable, + GError **error) +@@ -381,7 +382,8 @@ caldav_setup_bearer_auth (ECalBackendCal + + if (success) { + e_soup_auth_bearer_set_access_token (bearer, access_token, expires_in_seconds); +- caldav_ensure_bearer_auth_usage (cbdav, bearer); ++ if (!is_in_authenticate) ++ caldav_ensure_bearer_auth_usage (cbdav, bearer); + } + + g_free (access_token); +@@ -419,7 +421,7 @@ caldav_maybe_prepare_bearer_auth (ECalBa + g_free (auth_method); + + if (cbdav->priv->using_bearer_auth) { +- success = caldav_setup_bearer_auth (cbdav, cbdav->priv->using_bearer_auth, cancellable, error); ++ success = caldav_setup_bearer_auth (cbdav, FALSE, cbdav->priv->using_bearer_auth, cancellable, error); + } else { + ESourceWebdav *extension; + SoupAuth *soup_auth; +@@ -432,7 +434,7 @@ caldav_maybe_prepare_bearer_auth (ECalBa + E_TYPE_SOUP_AUTH_BEARER, + SOUP_AUTH_HOST, soup_uri->host, NULL); + +- success = caldav_setup_bearer_auth (cbdav, E_SOUP_AUTH_BEARER (soup_auth), cancellable, error); ++ success = caldav_setup_bearer_auth (cbdav, FALSE, E_SOUP_AUTH_BEARER (soup_auth), cancellable, error); + if (success) + cbdav->priv->using_bearer_auth = g_object_ref (soup_auth); + +@@ -1134,7 +1136,7 @@ soup_authenticate_bearer (SoupSession *s + { + GError *local_error = NULL; + +- caldav_setup_bearer_auth (cbdav, E_SOUP_AUTH_BEARER (auth), NULL, &local_error); ++ caldav_setup_bearer_auth (cbdav, TRUE, E_SOUP_AUTH_BEARER (auth), NULL, &local_error); + + /* Stash the error to be picked up by caldav_credentials_required_sync(). + * There's no way to explicitly propagate a GError directly +@@ -1266,7 +1268,7 @@ send_and_handle_redirection (ECalBackend + e_soup_auth_bearer_is_expired (cbdav->priv->using_bearer_auth)) { + GError *local_error = NULL; + +- if (!caldav_setup_bearer_auth (cbdav, cbdav->priv->using_bearer_auth, cancellable, &local_error)) { ++ if (!caldav_setup_bearer_auth (cbdav, FALSE, cbdav->priv->using_bearer_auth, cancellable, &local_error)) { + if (local_error) { + soup_message_set_status_full (msg, SOUP_STATUS_BAD_REQUEST, local_error->message); + g_propagate_error (error, local_error); diff --git a/SOURCES/evolution-data-server-3.22.7-correct-libecal-tests.patch b/SOURCES/evolution-data-server-3.22.7-correct-libecal-tests.patch new file mode 100644 index 0000000..3650aa2 --- /dev/null +++ b/SOURCES/evolution-data-server-3.22.7-correct-libecal-tests.patch @@ -0,0 +1,35 @@ +From 3f638b527fc46625d9dc791a07eea573c66f5d3c Mon Sep 17 00:00:00 2001 +From: Milan Crha +Date: Mon, 10 Apr 2017 21:02:53 +0200 +Subject: Correct two libecal/client tests + +The main loop should be passed always as a user_data, because +the function called from the callback expects it and there is +no guarantee in which order the callbacks will be called. + +diff --git a/tests/libecal/client/test-cal-client-get-view.c b/tests/libecal/client/test-cal-client-get-view.c +index 47514cc..2280646 100644 +--- a/tests/libecal/client/test-cal-client-get-view.c ++++ b/tests/libecal/client/test-cal-client-get-view.c +@@ -206,7 +206,7 @@ test_get_view_sync (ETestServerFixture *fixture, + g_signal_connect (view, "objects_added", G_CALLBACK (objects_added_cb), fixture->loop); + g_signal_connect (view, "objects_modified", G_CALLBACK (objects_modified_cb), fixture->loop); + g_signal_connect (view, "objects_removed", G_CALLBACK (objects_removed_cb), fixture->loop); +- g_signal_connect (view, "complete", G_CALLBACK (complete_cb), NULL); ++ g_signal_connect (view, "complete", G_CALLBACK (complete_cb), fixture->loop); + + e_cal_client_view_set_fields_of_interest (view, NULL, &error); + if (error) +diff --git a/tests/libecal/client/test-cal-client-revision-view.c b/tests/libecal/client/test-cal-client-revision-view.c +index 0e25114..fdb386c 100644 +--- a/tests/libecal/client/test-cal-client-revision-view.c ++++ b/tests/libecal/client/test-cal-client-revision-view.c +@@ -250,7 +250,7 @@ test_get_revision_view_sync (ETestServerFixture *fixture, + g_signal_connect (view, "objects_added", G_CALLBACK (objects_added_cb), fixture->loop); + g_signal_connect (view, "objects_modified", G_CALLBACK (objects_modified_cb), fixture->loop); + g_signal_connect (view, "objects_removed", G_CALLBACK (objects_removed_cb), fixture->loop); +- g_signal_connect (view, "complete", G_CALLBACK (complete_cb), NULL); ++ g_signal_connect (view, "complete", G_CALLBACK (complete_cb), fixture->loop); + + field_list = g_slist_prepend (NULL, (gpointer) "UID"); + field_list = g_slist_prepend (field_list, (gpointer) "RECURRENCE-ID"); diff --git a/SOURCES/evolution-data-server-3.22.7-imapx-idle-server-leak.patch b/SOURCES/evolution-data-server-3.22.7-imapx-idle-server-leak.patch new file mode 100644 index 0000000..9666d50 --- /dev/null +++ b/SOURCES/evolution-data-server-3.22.7-imapx-idle-server-leak.patch @@ -0,0 +1,11 @@ +diff -up evolution-data-server-3.22.7/camel/providers/imapx/camel-imapx-server.c.imapx-idle-server-leak evolution-data-server-3.22.7/camel/providers/imapx/camel-imapx-server.c +--- evolution-data-server-3.22.7/camel/providers/imapx/camel-imapx-server.c.imapx-idle-server-leak 2017-03-20 10:07:46.000000000 +0100 ++++ evolution-data-server-3.22.7/camel/providers/imapx/camel-imapx-server.c 2017-06-05 16:08:13.983713415 +0200 +@@ -6318,6 +6318,7 @@ imapx_server_run_idle_thread_cb (gpointe + } + + g_mutex_unlock (&is->priv->idle_lock); ++ g_object_unref (is); + + return FALSE; + } diff --git a/SOURCES/evolution-data-server-3.22.7-imapx-subscriptions.patch b/SOURCES/evolution-data-server-3.22.7-imapx-subscriptions.patch new file mode 100644 index 0000000..b9add06 --- /dev/null +++ b/SOURCES/evolution-data-server-3.22.7-imapx-subscriptions.patch @@ -0,0 +1,26 @@ +diff -up evolution-data-server-3.22.7/camel/providers/imapx/camel-imapx-store.c.imapx-subscriptions evolution-data-server-3.22.7/camel/providers/imapx/camel-imapx-store.c +--- evolution-data-server-3.22.7/camel/providers/imapx/camel-imapx-store.c.imapx-subscriptions 2017-04-12 15:10:11.507183207 +0200 ++++ evolution-data-server-3.22.7/camel/providers/imapx/camel-imapx-store.c 2017-04-12 15:12:39.367181163 +0200 +@@ -1449,14 +1449,21 @@ imapx_store_remove_unknown_mailboxes_cb + g_return_val_if_fail (CAMEL_IS_IMAPX_STORE (imapx_store), FALSE); + + if (camel_imapx_mailbox_get_state (mailbox) == CAMEL_IMAPX_MAILBOX_STATE_CREATED) { ++ CamelSettings *settings; + CamelFolderInfo *fi; + gchar *folder_path; ++ gboolean use_subscriptions; ++ ++ settings = camel_service_ref_settings (CAMEL_SERVICE (imapx_store)); ++ use_subscriptions = camel_imapx_settings_get_use_subscriptions (CAMEL_IMAPX_SETTINGS (settings)); ++ g_object_unref (settings); + + folder_path = camel_imapx_mailbox_dup_folder_path (mailbox); + fi = imapx_store_build_folder_info (imapx_store, folder_path, + (CamelFolderInfoFlags) imapx_store_mailbox_attributes_to_flags (mailbox)); + camel_store_folder_created (CAMEL_STORE (imapx_store), fi); +- camel_subscribable_folder_subscribed (CAMEL_SUBSCRIBABLE (imapx_store), fi); ++ if ((fi->flags & CAMEL_STORE_INFO_FOLDER_SUBSCRIBED) != 0 || !use_subscriptions) ++ camel_subscribable_folder_subscribed (CAMEL_SUBSCRIBABLE (imapx_store), fi); + camel_folder_info_free (fi); + g_free (folder_path); + } diff --git a/SOURCES/evolution-data-server-3.22.7-use-after-free-component-summary-set.patch b/SOURCES/evolution-data-server-3.22.7-use-after-free-component-summary-set.patch new file mode 100644 index 0000000..d50a7f4 --- /dev/null +++ b/SOURCES/evolution-data-server-3.22.7-use-after-free-component-summary-set.patch @@ -0,0 +1,31 @@ +diff -up evolution-data-server-3.22.7/calendar/libecal/e-cal-component.c.use-after-free-component-summary-set evolution-data-server-3.22.7/calendar/libecal/e-cal-component.c +--- evolution-data-server-3.22.7/calendar/libecal/e-cal-component.c.use-after-free-component-summary-set 2017-03-20 10:07:46.000000000 +0100 ++++ evolution-data-server-3.22.7/calendar/libecal/e-cal-component.c 2017-04-12 12:37:17.319310071 +0200 +@@ -4468,7 +4468,7 @@ e_cal_component_get_summary (ECalCompone + } + + typedef struct { +- const gchar *old_summary; ++ gchar *old_summary; + const gchar *new_summary; + } SetAlarmDescriptionData; + +@@ -4559,7 +4559,8 @@ e_cal_component_set_summary (ECalCompone + g_return_if_fail (summary->value != NULL); + + if (priv->summary.prop) { +- sadd.old_summary = icalproperty_get_summary (priv->summary.prop); ++ /* Make a copy, to avoid use-after-free */ ++ sadd.old_summary = g_strdup (icalproperty_get_summary (priv->summary.prop)); + icalproperty_set_summary (priv->summary.prop, (gchar *) summary->value); + } else { + sadd.old_summary = NULL; +@@ -4589,6 +4590,8 @@ e_cal_component_set_summary (ECalCompone + /* look for alarms that need a description */ + sadd.new_summary = summary->value; + g_hash_table_foreach (priv->alarm_uid_hash, set_alarm_description_cb, &sadd); ++ ++ g_free (sadd.old_summary); + } + + /** diff --git a/SPECS/evolution-data-server.spec b/SPECS/evolution-data-server.spec index 40a357e..c6f11e6 100644 --- a/SPECS/evolution-data-server.spec +++ b/SPECS/evolution-data-server.spec @@ -5,24 +5,27 @@ %define largefile_support 1 # Coverity scan can override this to 0, to skip checking in gtk-doc generated code -%{!?with_docs: %define with_docs 1} +%{!?with_docs: %global with_docs 1} -%define glib2_version 2.36.0 -%define gtk3_version 3.4.0 +%define glib2_version 2.50.3 +%define gtk3_version 3.22.9 %define gcr_version 3.4 %define gtk_doc_version 1.9 %define goa_version 3.8 -%define intltool_version 0.35.5 -%define libsecret_version 0.5 -%define libgdata_version 0.16.0 -%define libgweather_version 3.5.0 -%define libical_version 1.0 -%define libsoup_version 2.40.3 -%define sqlite_version 3.5 +%define intltool_version 0.50.2-7 +%define libsecret_version 0.18.5 +%define libgdata_version 0.17.7 +%define libgweather_version 3.20.4 +%define libical_version 0.46 +%define libsoup_version 2.42 %define nss_version 3.14 +%define sqlite_version 3.5 +%define webkit2gtk_version 2.14.5 +%define json_glib_version 1.2.2 -%define eds_base_version 3.12 +%define eds_base_version 3.22 +%define credential_modules_dir %{_libdir}/evolution-data-server/credential-modules %define camel_provider_dir %{_libdir}/evolution-data-server/camel-providers %define ebook_backends_dir %{_libdir}/evolution-data-server/addressbook-backends %define ecal_backends_dir %{_libdir}/evolution-data-server/calendar-backends @@ -31,114 +34,47 @@ ### Abstract ### Name: evolution-data-server -Version: 3.12.11 -Release: 37%{?dist} +Version: 3.22.7 +Release: 6%{?dist} Group: System Environment/Libraries Summary: Backend data server for Evolution License: LGPLv2+ URL: https://wiki.gnome.org/Apps/Evolution BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) -Source: http://download.gnome.org/sources/%{name}/3.12/%{name}-%{version}.tar.xz +Source: http://download.gnome.org/sources/%{name}/3.22/%{name}-%{version}.tar.xz Provides: evolution-webcal = %{version} Obsoletes: evolution-webcal < 2.24.0 +%if 0%{?fedora} +# From rhughes-f20-gnome-3-12 copr +Obsoletes: compat-evolution-data-server310-libcamel < 3.12 +%endif + ### Patches ### # RH bug #243296 Patch01: evolution-data-server-1.11.5-fix-64bit-acinclude.patch -# RH bug #1202372 -Patch02: evolution-data-server-3.12.11-google-calendar-discover.patch - -# RH bug #1211355 -Patch03: evolution-data-server-3.12.11-implement-webdav-refresh.patch - -# RH bug #1211542 -Patch04: evolution-data-server-3.12.11-foreign-key-constraint-failed.patch - -# related to RH bug #1202372 -Patch05: evolution-data-server-3.12.11-goa-sources-auth-method.patch - -# RH bug #1223479 -Patch06: evolution-data-server-3.12.11-imapx-expunge-processing.patch - -# RH bug #1170647 -Patch07: evolution-data-server-3.12.11-weather-calendar-merge-day-forecasts.patch - -# Coverity Scan issues -Patch08: evolution-data-server-3.12.11-coverity-scan.patch - -# RH bug #1224901 -Patch09: evolution-data-server-3.12.11-smtp-timeout-change.patch - -# RH bug #1224736 -Patch10: evolution-data-server-3.12.11-camel-tohtml-extra-cr.patch - -# RH bug #1101476 -Patch11: evolution-data-server-3.12.11-imapx-empty-cache-file-temp-workaround.patch - -# RH bug #1111600 -Patch12: evolution-data-server-3.12.11-imapx-msg-download-indefinite-wait.patch - -# RH bug #1225981 -Patch13: evolution-data-server-3.12.11-truly-disable-gtk-doc.patch - -# RH bug #1226318 -Patch14: evolution-data-server-3.12.11-camel-maildir-migration.patch - -# RH bug #1226924 -Patch15: evolution-data-server-3.12.11-async-closures-thread-safety.patch - -# RH bug #1229812 -Patch16: evolution-data-server-3.12.11-goa-preserve-ews-host.patch - -# RH bug #1232767 -Patch17: evolution-data-server-3.12.11-book-sqlite-left-outer-join.patch - -# RH bug #1091353 -Patch18: evolution-data-server-3.12.11-time-parse-am-pm.patch - -# RH bug #1174414 -Patch19: evolution-data-server-3.12.11-camel-imapx-folder-removed-on-refresh.patch - -# RH bug #1254199 -Patch20: evolution-data-server-3.12.11-goa-source-change-removed.patch - -# RH bug #1229377 -Patch21: evolution-data-server-3.12.11-caldav-password-ask-for-oauth.patch - -# RH bug #1260501 -Patch22: evolution-data-server-3.12.11-camel-vfoler-message-delete-freeze.patch - -# RH bug #1264957 -Patch23: evolution-data-server-3.12.11-weather-update-units.patch - -# RH bug #1204373 -Patch24: evolution-data-server-3.12.11-camel-session-no-gtask.patch - -# RH bug #1265684 (3.21.90/commit 8d07e3f) -Patch25: evolution-data-server-3.12.11-imapx-update-to-upstream.patch +Patch02: evolution-data-server-3.22.6-maybe-uninitialized-variable.patch +Patch03: evolution-data-server-3.22.6-coverity-scan-issues.patch -# RH bug #1304309 -Patch26: evolution-data-server-3.12.11-translations.patch +# RH bug #1440643 +Patch04: evolution-data-server-3.22.7-caldav-oauth2-refresh-deadlock.patch -# RH bug #1305515 glib2 rebase -Patch27: evolution-data-server-3.12.11-glib2-rebase-fix.patch +Patch05: evolution-data-server-3.22.7-correct-libecal-tests.patch -# RH bug #1326634 -Patch28: evolution-data-server-3.12.11-goa-google-calendar-auth-method.patch +# RH bug #1441608 +Patch06: evolution-data-server-3.22.7-use-after-free-component-summary-set.patch -# RH bug #1337259 -Patch29: evolution-data-server-3.12.11-imapx-disable-and-hide-qresync.patch +# RH bug #1439590 +Patch07: evolution-data-server-3.22.7-imapx-subscriptions.patch -# RH bug #1346179 -Patch30: evolution-data-server-3.12.11-camel-connect-timeout.patch - -# RH bug #1362674 -Patch31: evolution-data-server-3.12.11-caldav-daily-limit-exceeded.patch +# RH bug #1444075 +Patch08: evolution-data-server-3.22.7-imapx-idle-server-leak.patch ### Dependencies ### + Requires: dconf ### Build Dependencies ### @@ -152,6 +88,7 @@ BuildRequires: libdb-devel BuildRequires: libtool BuildRequires: vala BuildRequires: vala-tools +BuildRequires: systemd BuildRequires: pkgconfig(gcr-3) >= %{gcr_version} BuildRequires: pkgconfig(gcr-base-3) >= %{gcr_version} @@ -170,17 +107,19 @@ BuildRequires: pkgconfig(libxml-2.0) BuildRequires: pkgconfig(nspr) BuildRequires: pkgconfig(nss) >= %{nss_version} BuildRequires: pkgconfig(sqlite3) >= %{sqlite_version} +BuildRequires: pkgconfig(webkit2gtk-4.0) >= %{webkit2gtk_version} +BuildRequires: pkgconfig(json-glib-1.0) >= %{json_glib_version} %if %{ldap_support} %if %{static_ldap} BuildRequires: openldap-devel%{?_isa} BuildRequires: pkgconfig(openssl) %else -BuildRequires: openldap-devel >= 2.0.11 +BuildRequires: openldap-devel >= 2.0.11 %endif %endif -%if %{krb5_support} +%if %{krb5_support} BuildRequires: krb5-devel >= 1.11 %endif @@ -194,7 +133,7 @@ by other packages. %package devel Summary: Development files for building against %{name} Group: Development/Libraries -Requires: %{name} = %{version}-%{release} +Requires: %{name}%{?_isa} = %{version}-%{release} Requires: pkgconfig(goa-1.0) >= %{goa_version} Requires: pkgconfig(libgdata) >= %{libgdata_version} @@ -203,6 +142,8 @@ Requires: pkgconfig(libical) >= %{libical_version} Requires: pkgconfig(libsecret-unstable) >= %{libsecret_version} Requires: pkgconfig(libsoup-2.4) >= %{libsoup_version} Requires: pkgconfig(sqlite3) >= %{sqlite_version} +Requires: pkgconfig(webkit2gtk-4.0) >= %{webkit2gtk_version} +Requires: pkgconfig(json-glib-1.0) >= %{json_glib_version} %description devel Development files needed for building things which link against %{name}. @@ -217,43 +158,37 @@ BuildArch: noarch %description doc This package contains developer documentation for %{name}. -# %{with_docs} +# %%{with_docs} %endif +%package perl +Group: Applications/Productivity +Summary: Supplemental utilities that require Perl +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description perl +This package contains supplemental utilities for %{name} that require Perl. + +%package tests +Summary: Tests for the %{name} package +Group: Development/Libraries +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description tests +The %{name}-tests package contains tests that can be used to verify +the functionality of the installed %{name} package. + %prep %setup -q %patch01 -p1 -b .fix-64bit-acinclude -%patch02 -p1 -b .google-calendar-discover -%patch03 -p1 -b .implement-webdav-refresh -%patch04 -p1 -b .foreign-key-constraint-failed -%patch05 -p1 -b .goa-sources-auth-method -%patch06 -p1 -b .imapx-expunge-processing -%patch07 -p1 -b .weather-calendar-merge-day-forecasts -%patch08 -p1 -b .coverity-scan -%patch09 -p1 -b .smtp-timeout-change -%patch10 -p1 -b .camel-tohtml-extra-cr -%patch11 -p1 -b .imapx-empty-cache-file-temp-workaround -%patch12 -p1 -b .imapx-msg-download-indefinite-wait -%patch13 -p1 -b .truly-disable-gtk-doc -%patch14 -p1 -b .camel-maildir-migration -%patch15 -p1 -b .async-closures-thread-safety -%patch16 -p1 -b .goa-preserve-ews-host -%patch17 -p1 -b .book-sqlite-left-outer-join -%patch18 -p1 -b .time-parse-am-pm -%patch19 -p1 -b .camel-imapx-folder-removed-on-refresh -%patch20 -p1 -b .goa-source-change-removed -%patch21 -p1 -b .caldav-password-ask-for-oauth -%patch22 -p1 -b .camel-vfoler-message-delete-freeze -%patch23 -p1 -b .weather-update-units -%patch24 -p1 -b .camel-session-no-gtask -%patch25 -p1 -b .imapx-update-to-upstream -%patch26 -p1 -b .translations -%patch27 -p1 -b .glib2-rebase-fix -%patch28 -p1 -b .goa-google-calendar-auth-method -%patch29 -p1 -b .imapx-disable-and-hide-qresync -%patch30 -p1 -b .camel-connect-timeout -%patch31 -p1 -b .caldav-daily-limit-exceeded +%patch02 -p1 -b .maybe-uninitialized-variable +%patch03 -p1 -b .coverity-scan-issues +%patch04 -p1 -b .caldav-oauth2-refresh-deadlock +%patch05 -p1 -b .correct-libecal-tests +%patch06 -p1 -b .use-after-free-component-summary-set +%patch07 -p1 -b .imapx-subscriptions +%patch08 -p1 -b .imapx-idle-server-leak %build %if %{ldap_support} @@ -308,7 +243,7 @@ fi %define gtkdoc_flags --disable-gtk-doc %endif -if ! pkg-config --exists nss; then +if ! pkg-config --exists nss; then echo "Unable to find suitable version of nss to use!" exit 1 fi @@ -330,12 +265,12 @@ autoconf %configure \ --disable-maintainer-mode \ --disable-uoa \ - --disable-examples \ --with-libdb=/usr \ --enable-file-locking=fcntl \ --enable-dot-locking=no \ --enable-introspection=yes \ --enable-vala-bindings \ + --enable-installed-tests \ %ldap_flags %krb5_flags %nntp_flags %ssl_flags \ %largefile_flags %gtkdoc_flags export tagname=CC @@ -350,12 +285,14 @@ make DESTDIR=$RPM_BUILD_ROOT LIBTOOL=/usr/bin/libtool install # remove libtool archives for importers and the like find $RPM_BUILD_ROOT/%{_libdir} -name '*.la' -exec rm {} \; rm -f $RPM_BUILD_ROOT/%{_libdir}/*.a -rm -f $RPM_BUILD_ROOT/%{_libdir}/evolution-data-server/camel-providers/*.a -rm -f $RPM_BUILD_ROOT/%{_libdir}/evolution-data-server/addressbook-backends/*.a -rm -f $RPM_BUILD_ROOT/%{_libdir}/evolution-data-server/calendar-backends/*.a -rm -f $RPM_BUILD_ROOT/%{_libdir}/evolution-data-server/registry-modules/*.a - -# give the libraries some executable bits +rm -f $RPM_BUILD_ROOT/%{_libdir}/evolution-data-server/*.a +rm -f $RPM_BUILD_ROOT/%{credential_modules_dir}/*.a +rm -f $RPM_BUILD_ROOT/%{camel_provider_dir}/*.a +rm -f $RPM_BUILD_ROOT/%{ebook_backends_dir}/*.a +rm -f $RPM_BUILD_ROOT/%{ecal_backends_dir}/*.a +rm -f $RPM_BUILD_ROOT/%{modules_dir}/*.a + +# give the libraries some executable bits find $RPM_BUILD_ROOT -name '*.so.*' -exec chmod +x {} \; %find_lang %{name}-%{eds_base_version} @@ -375,7 +312,6 @@ fi glib-compile-schemas %{_datadir}/glib-2.0/schemas &>/dev/null || : %files -f %{name}-%{eds_base_version}.lang -%defattr(-,root,root,-) %doc README COPYING ChangeLog NEWS %{_libdir}/libcamel-1.2.so.* %{_libdir}/libebackend-1.2.so.* @@ -385,22 +321,29 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &>/dev/null || : %{_libdir}/libedata-book-1.2.so.* %{_libdir}/libedata-cal-1.2.so.* %{_libdir}/libedataserver-1.2.so.* +%{_libdir}/libedataserverui-1.2.so.* %{_libdir}/girepository-1.0/EBook-1.2.typelib %{_libdir}/girepository-1.0/EBookContacts-1.2.typelib %{_libdir}/girepository-1.0/EDataServer-1.2.typelib +%{_libexecdir}/camel-gpg-photo-saver %{_libexecdir}/camel-index-control-1.2 %{_libexecdir}/camel-lock-helper-1.2 %{_libexecdir}/evolution-addressbook-factory +%{_libexecdir}/evolution-addressbook-factory-subprocess %{_libexecdir}/evolution-calendar-factory +%{_libexecdir}/evolution-calendar-factory-subprocess %{_libexecdir}/evolution-scan-gconf-tree-xml %{_libexecdir}/evolution-source-registry %{_libexecdir}/evolution-user-prompter +%{_libexecdir}/evolution-data-server/addressbook-export + # GSettings schemas: %{_datadir}/GConf/gsettings/evolution-data-server.convert %{_datadir}/glib-2.0/schemas/org.gnome.Evolution.DefaultSources.gschema.xml +%{_datadir}/glib-2.0/schemas/org.gnome.evolution-data-server.gschema.xml %{_datadir}/glib-2.0/schemas/org.gnome.evolution-data-server.addressbook.gschema.xml %{_datadir}/glib-2.0/schemas/org.gnome.evolution-data-server.calendar.gschema.xml %{_datadir}/glib-2.0/schemas/org.gnome.evolution.eds-shell.gschema.xml @@ -413,12 +356,20 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &>/dev/null || : %{_datadir}/dbus-1/services/org.gnome.evolution.dataserver.UserPrompter.service %{_datadir}/pixmaps/evolution-data-server +%{_userunitdir}/evolution-addressbook-factory.service +%{_userunitdir}/evolution-calendar-factory.service +%{_userunitdir}/evolution-source-registry.service +%{_userunitdir}/evolution-user-prompter.service + %dir %{_libdir}/evolution-data-server +%dir %{credential_modules_dir} %dir %{camel_provider_dir} %dir %{ebook_backends_dir} %dir %{ecal_backends_dir} %dir %{modules_dir} +%{_libdir}/evolution-data-server/libedbus-private.so + # Camel providers: %{camel_provider_dir}/libcamelimapx.so %{camel_provider_dir}/libcamelimapx.urls @@ -439,6 +390,7 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &>/dev/null || : %{camel_provider_dir}/libcamelsmtp.urls # e-d-s extensions: +%{credential_modules_dir}/module-credentials-goa.so %{ebook_backends_dir}/libebookbackendfile.so %{ebook_backends_dir}/libebookbackendgoogle.so %{ebook_backends_dir}/libebookbackendldap.so @@ -459,7 +411,6 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &>/dev/null || : %{modules_dir}/module-yahoo-backend.so %files devel -%defattr(-,root,root,-) %{_includedir}/evolution-data-server %{_libdir}/libcamel-1.2.so %{_libdir}/libebackend-1.2.so @@ -469,6 +420,7 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &>/dev/null || : %{_libdir}/libedata-book-1.2.so %{_libdir}/libedata-cal-1.2.so %{_libdir}/libedataserver-1.2.so +%{_libdir}/libedataserverui-1.2.so %{_libdir}/pkgconfig/camel-1.2.pc %{_libdir}/pkgconfig/evolution-data-server-1.2.pc %{_libdir}/pkgconfig/libebackend-1.2.pc @@ -478,9 +430,13 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &>/dev/null || : %{_libdir}/pkgconfig/libedata-book-1.2.pc %{_libdir}/pkgconfig/libedata-cal-1.2.pc %{_libdir}/pkgconfig/libedataserver-1.2.pc +%{_libdir}/pkgconfig/libedataserverui-1.2.pc +%{_datadir}/gir-1.0/Camel-1.2.gir %{_datadir}/gir-1.0/EBook-1.2.gir %{_datadir}/gir-1.0/EBookContacts-1.2.gir %{_datadir}/gir-1.0/EDataServer-1.2.gir +%{_datadir}/vala/vapi/camel-1.2.deps +%{_datadir}/vala/vapi/camel-1.2.vapi %{_datadir}/vala/vapi/libebook-1.2.deps %{_datadir}/vala/vapi/libebook-1.2.vapi %{_datadir}/vala/vapi/libebook-contacts-1.2.deps @@ -491,13 +447,60 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &>/dev/null || : %if %{with_docs} %files doc -%defattr(-,root,root,-) %{_datadir}/gtk-doc/html/* -# %{with_docs} %endif +%files perl +%{_libexecdir}/evolution-data-server/csv2vcard + +%files tests +%{_libdir}/libetestserverutils.so +%{_libdir}/libetestserverutils.so.* +%{_libexecdir}/%{name}/installed-tests +%{_datadir}/installed-tests + %changelog +* Mon Jun 05 2017 Milan Crha - 3.22.7-6 +- Add patch for RH bug #1444075 ([IMAPx] Fix a memory leak of CamelIMAPXServer) + +* Wed Apr 26 2017 Milan Crha - 3.22.7-5 +- Rebuild against updated webkitgtk4 + +* Wed Apr 12 2017 Milan Crha - 3.22.7-4 +- Add patch for RH bug #1441608 (Use-after-free when setting summary for component with alarms) +- Add patch for RH bug #1439590 ([IMAPx] Unsubscribed folders shown after refresh) + +* Tue Apr 11 2017 Milan Crha - 3.22.7-3 +- Add patch to correct two libecal tests + +* Mon Apr 10 2017 Milan Crha - 3.22.7-2 +- Add patch for RH bug #1440643 ([CalDAV] Deadlock after refresh of OAuth2 token) + +* Mon Mar 20 2017 Milan Crha - 3.22.7-1 +- Update to 3.22.7 upstream release + +* Wed Mar 15 2017 Milan Crha - 3.22.6-4 +- Add missing nss_version variable into the .spec file + +* Wed Mar 15 2017 Milan Crha - 3.22.6-3 +- Add patch to address some of the Coverity scan issues + +* Tue Mar 14 2017 Milan Crha - 3.22.6-2 +- Add patch for a -Wmaybe-uninitialized variable use in POP3 folder + +* Mon Mar 13 2017 Milan Crha - 3.22.6-1 +- Update to 3.22.6 upstream release + +* Thu Feb 16 2017 Kalev Lember - 3.22.5-3 +- Drop previous workaround now that intltool is fixed + +* Thu Feb 16 2017 Milan Crha - 3.22.5-2 +- Rebuild with a workaround for RH-bug #1422632 + +* Wed Feb 15 2017 Milan Crha - 3.22.5-1 +- Rebase to 3.22.5 + * Tue Sep 06 2016 Milan Crha - 3.12.11-37 - Update patch for RH bug #1362674 (CalDAV fails to recognize "Daily Limit Exceeded" error from Google/GOA)