const char *e_cal_backend_3e_get_cache_path(ECalBackend3e *cb) { if (cb->priv->cache_path == NULL) { char *mangled_uri = g_strdup(e_cal_backend_get_cache_dir(E_CAL_BACKEND(cb))); guint i; for (i = 0; i < strlen(mangled_uri); i++) { if (mangled_uri[i] == ':' || mangled_uri[i] == '/') { mangled_uri[i] = '_'; } } cb->priv->cache_path = g_build_filename(e_cal_backend_get_cache_dir (E_CAL_BACKEND(cb)), "calendar3e", mangled_uri, NULL); g_free(mangled_uri); } return cb->priv->cache_path; }
/* Open handler for the file backend */ static void e_cal_backend_http_open (ECalBackendSync *backend, EDataCal *cal, GCancellable *cancellable, gboolean only_if_exists, GError **perror) { ECalBackendHttp *cbhttp; ECalBackendHttpPrivate *priv; ESource *source; ESourceWebdav *webdav_extension; const gchar *extension_name; const gchar *cache_dir; gboolean opened = TRUE; gchar *tmp; GError *local_error = NULL; cbhttp = E_CAL_BACKEND_HTTP (backend); priv = cbhttp->priv; /* already opened, thus can skip all this initialization */ if (priv->opened) return; source = e_backend_get_source (E_BACKEND (backend)); cache_dir = e_cal_backend_get_cache_dir (E_CAL_BACKEND (backend)); extension_name = E_SOURCE_EXTENSION_WEBDAV_BACKEND; webdav_extension = e_source_get_extension (source, extension_name); e_source_webdav_unset_temporary_ssl_trust (webdav_extension); if (priv->source_changed_id == 0) { priv->source_changed_id = g_signal_connect ( source, "changed", G_CALLBACK (source_changed_cb), cbhttp); } /* always read uri again */ tmp = priv->uri; priv->uri = NULL; g_free (tmp); if (priv->store == NULL) { /* remove the old cache while migrating to ECalBackendStore */ e_cal_backend_cache_remove (cache_dir, "cache.xml"); priv->store = e_cal_backend_store_new ( cache_dir, E_TIMEZONE_CACHE (backend)); e_cal_backend_store_load (priv->store); if (!priv->store) { g_propagate_error ( perror, EDC_ERROR_EX (OtherError, _("Could not create cache file"))); return; } } e_cal_backend_set_writable (E_CAL_BACKEND (backend), FALSE); if (e_backend_get_online (E_BACKEND (backend))) { gchar *certificate_pem = NULL; GTlsCertificateFlags certificate_errors = 0; const gchar *uri; uri = cal_backend_http_ensure_uri (cbhttp); opened = cal_backend_http_load (cbhttp, uri, &certificate_pem, &certificate_errors, cancellable, &local_error); if (g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_UNAUTHORIZED) || g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_SSL_FAILED) || (g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_FORBIDDEN) && !cbhttp->priv->password)) { GError *local_error2 = NULL; ESourceCredentialsReason reason = E_SOURCE_CREDENTIALS_REASON_REQUIRED; if (g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_SSL_FAILED)) { reason = E_SOURCE_CREDENTIALS_REASON_SSL_FAILED; } e_backend_credentials_required_sync (E_BACKEND (cbhttp), reason, certificate_pem, certificate_errors, local_error, cancellable, &local_error2); g_clear_error (&local_error); local_error = local_error2; } else if (g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_FORBIDDEN)) { GError *local_error2 = NULL; e_backend_credentials_required_sync (E_BACKEND (cbhttp), E_SOURCE_CREDENTIALS_REASON_REJECTED, certificate_pem, certificate_errors, local_error, cancellable, &local_error2); g_clear_error (&local_error); local_error = local_error2; } g_free (certificate_pem); if (local_error != NULL) g_propagate_error (perror, local_error); } if (opened) { if (!priv->reload_timeout_id) priv->reload_timeout_id = e_source_refresh_add_timeout (source, NULL, http_cal_reload_cb, backend, NULL); } }