[evolution-data-server/gnome-3-38] evo-I#1090 - Forward as iCalendar: Embed event's local attachments
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/gnome-3-38] evo-I#1090 - Forward as iCalendar: Embed event's local attachments
- Date: Mon, 14 Sep 2020 13:57:19 +0000 (UTC)
commit 159c513bdb06c15d32a07569e4e9604bef3184d9
Author: Milan Crha <mcrha redhat com>
Date: Mon Sep 14 15:54:44 2020 +0200
evo-I#1090 - Forward as iCalendar: Embed event's local attachments
Related to https://gitlab.gnome.org/GNOME/evolution/-/issues/1090
src/calendar/libecal/e-cal-util.c | 115 +++++++++++++++++++++++++
src/calendar/libecal/e-cal-util.h | 4 +
src/calendar/libedata-cal/e-cal-meta-backend.c | 74 +---------------
3 files changed, 120 insertions(+), 73 deletions(-)
---
diff --git a/src/calendar/libecal/e-cal-util.c b/src/calendar/libecal/e-cal-util.c
index e91236bfb..c042645bb 100644
--- a/src/calendar/libecal/e-cal-util.c
+++ b/src/calendar/libecal/e-cal-util.c
@@ -2832,3 +2832,118 @@ e_cal_util_conflict_resolution_to_operation_flags (EConflictResolution conflict_
return E_CAL_OPERATION_FLAG_CONFLICT_KEEP_LOCAL;
}
+
+static void
+ecu_remove_all_but_filename_parameter (ICalProperty *prop)
+{
+ ICalParameter *param;
+
+ g_return_if_fail (prop != NULL);
+
+ while (param = i_cal_property_get_first_parameter (prop, I_CAL_ANY_PARAMETER), param) {
+ if (i_cal_parameter_isa (param) == I_CAL_FILENAME_PARAMETER) {
+ g_object_unref (param);
+ param = i_cal_property_get_next_parameter (prop, I_CAL_ANY_PARAMETER);
+ if (!param)
+ break;
+ }
+
+ i_cal_property_remove_parameter_by_ref (prop, param);
+ g_object_unref (param);
+ }
+}
+
+/**
+ * e_cal_util_inline_local_attachments_sync:
+ * @component: an #ICalComponent to work with
+ * @cancellable: optional #GCancellable object, or %NULL
+ * @error: return location for a #GError, or %NULL
+ *
+ * Changes all URL attachments which point to a local file in @component
+ * to inline attachments, aka adds the file content into the @component.
+ * It also populates FILENAME parameter on the attachment.
+ *
+ * Returns: Whether succeeded.
+ *
+ * Since: 3.38.1
+ **/
+gboolean
+e_cal_util_inline_local_attachments_sync (ICalComponent *component,
+ GCancellable *cancellable,
+ GError **error)
+{
+ ICalProperty *prop;
+ const gchar *uid;
+ gboolean success = TRUE;
+
+ g_return_val_if_fail (component != NULL, FALSE);
+
+ uid = i_cal_component_get_uid (component);
+
+ for (prop = i_cal_component_get_first_property (component, I_CAL_ATTACH_PROPERTY);
+ prop && success;
+ g_object_unref (prop), prop = i_cal_component_get_next_property (component,
I_CAL_ATTACH_PROPERTY)) {
+ ICalAttach *attach;
+
+ attach = i_cal_property_get_attach (prop);
+ if (attach && i_cal_attach_get_is_url (attach)) {
+ const gchar *url;
+
+ url = i_cal_attach_get_url (attach);
+ if (g_str_has_prefix (url, "file://")) {
+ GFile *file;
+ gchar *basename;
+ gchar *content;
+ gsize len;
+
+ file = g_file_new_for_uri (url);
+ basename = g_file_get_basename (file);
+ if (g_file_load_contents (file, cancellable, &content, &len, NULL, error)) {
+ ICalAttach *new_attach;
+ ICalParameter *param;
+ gchar *base64;
+
+ base64 = g_base64_encode ((const guchar *) content, len);
+ new_attach = i_cal_attach_new_from_data (base64, (GFunc) g_free,
NULL);
+ g_free (content);
+
+ ecu_remove_all_but_filename_parameter (prop);
+
+ i_cal_property_set_attach (prop, new_attach);
+ g_object_unref (new_attach);
+
+ param = i_cal_parameter_new_value (I_CAL_VALUE_BINARY);
+ i_cal_property_take_parameter (prop, param);
+
+ param = i_cal_parameter_new_encoding (I_CAL_ENCODING_BASE64);
+ i_cal_property_take_parameter (prop, param);
+
+ /* Preserve existing FILENAME parameter */
+ if (!e_cal_util_property_has_parameter (prop,
I_CAL_FILENAME_PARAMETER)) {
+ const gchar *use_filename = basename;
+
+ /* generated filename by Evolution */
+ if (uid && g_str_has_prefix (use_filename, uid) &&
+ use_filename[strlen (uid)] == '-') {
+ use_filename += strlen (uid) + 1;
+ }
+
+ param = i_cal_parameter_new_filename (use_filename);
+ i_cal_property_take_parameter (prop, param);
+ }
+ } else {
+ success = FALSE;
+ }
+
+ g_object_unref (file);
+ g_free (basename);
+ }
+ }
+
+ g_clear_object (&attach);
+ }
+
+ g_clear_object (&prop);
+
+ return success;
+}
diff --git a/src/calendar/libecal/e-cal-util.h b/src/calendar/libecal/e-cal-util.h
index a0d5ea2fb..ece7f9419 100644
--- a/src/calendar/libecal/e-cal-util.h
+++ b/src/calendar/libecal/e-cal-util.h
@@ -343,6 +343,10 @@ EConflictResolution
(guint32 flags); /* bit-or of ECalOperationFlags */
guint32 e_cal_util_conflict_resolution_to_operation_flags /* bit-or of ECalOperationFlags */
(EConflictResolution conflict_resolution);
+gboolean e_cal_util_inline_local_attachments_sync
+ (ICalComponent *component,
+ GCancellable *cancellable,
+ GError **error);
G_END_DECLS
diff --git a/src/calendar/libedata-cal/e-cal-meta-backend.c b/src/calendar/libedata-cal/e-cal-meta-backend.c
index 61cfb3228..c4415d5bd 100644
--- a/src/calendar/libedata-cal/e-cal-meta-backend.c
+++ b/src/calendar/libedata-cal/e-cal-meta-backend.c
@@ -4053,81 +4053,9 @@ e_cal_meta_backend_inline_local_attachments_sync (ECalMetaBackend *meta_backend,
GCancellable *cancellable,
GError **error)
{
- ICalProperty *prop;
- const gchar *uid;
- gboolean success = TRUE;
-
g_return_val_if_fail (E_IS_CAL_META_BACKEND (meta_backend), FALSE);
- g_return_val_if_fail (component != NULL, FALSE);
-
- uid = i_cal_component_get_uid (component);
- for (prop = i_cal_component_get_first_property (component, I_CAL_ATTACH_PROPERTY);
- prop && success;
- g_object_unref (prop), prop = i_cal_component_get_next_property (component,
I_CAL_ATTACH_PROPERTY)) {
- ICalAttach *attach;
-
- attach = i_cal_property_get_attach (prop);
- if (attach && i_cal_attach_get_is_url (attach)) {
- const gchar *url;
-
- url = i_cal_attach_get_url (attach);
- if (g_str_has_prefix (url, LOCAL_PREFIX)) {
- GFile *file;
- gchar *basename;
- gchar *content;
- gsize len;
-
- file = g_file_new_for_uri (url);
- basename = g_file_get_basename (file);
- if (g_file_load_contents (file, cancellable, &content, &len, NULL, error)) {
- ICalAttach *new_attach;
- ICalParameter *param;
- gchar *base64;
-
- base64 = g_base64_encode ((const guchar *) content, len);
- new_attach = i_cal_attach_new_from_data (base64, (GFunc) g_free,
NULL);
- g_free (content);
-
- ecmb_remove_all_but_filename_parameter (prop);
-
- i_cal_property_set_attach (prop, new_attach);
- g_object_unref (new_attach);
-
- param = i_cal_parameter_new_value (I_CAL_VALUE_BINARY);
- i_cal_property_take_parameter (prop, param);
-
- param = i_cal_parameter_new_encoding (I_CAL_ENCODING_BASE64);
- i_cal_property_take_parameter (prop, param);
-
- /* Preserve existing FILENAME parameter */
- if (!e_cal_util_property_has_parameter (prop,
I_CAL_FILENAME_PARAMETER)) {
- const gchar *use_filename = basename;
-
- /* generated filename by Evolution */
- if (uid && g_str_has_prefix (use_filename, uid) &&
- use_filename[strlen (uid)] == '-') {
- use_filename += strlen (uid) + 1;
- }
-
- param = i_cal_parameter_new_filename (use_filename);
- i_cal_property_take_parameter (prop, param);
- }
- } else {
- success = FALSE;
- }
-
- g_object_unref (file);
- g_free (basename);
- }
- }
-
- g_clear_object (&attach);
- }
-
- g_clear_object (&prop);
-
- return success;
+ return e_cal_util_inline_local_attachments_sync (component, cancellable, error);
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]