[evolution-data-server] ECalObjModType is a flags type, not an enum type.



commit 76fbbdb886fc35f409ced603d0351fc6da4029ff
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sun Feb 17 08:33:48 2013 -0500

    ECalObjModType is a flags type, not an enum type.
    
    Transmit flags over D-Bus as a string of colon-separated nicknames.

 calendar/libecal/e-cal-client.c    |   48 ++++++++++++++++++++----------
 calendar/libedata-cal/e-data-cal.c |   56 +++++++++++++++++++++++++++---------
 2 files changed, 74 insertions(+), 30 deletions(-)
---
diff --git a/calendar/libecal/e-cal-client.c b/calendar/libecal/e-cal-client.c
index b2b4935..e0c8047 100644
--- a/calendar/libecal/e-cal-client.c
+++ b/calendar/libecal/e-cal-client.c
@@ -4938,8 +4938,9 @@ e_cal_client_modify_objects_sync (ECalClient *client,
                                   GCancellable *cancellable,
                                   GError **error)
 {
-       GEnumClass *enum_class;
-       GEnumValue *enum_value;
+       GFlagsClass *flags_class;
+       GFlagsValue *flags_value;
+       GString *flags;
        gboolean success;
        gchar **strv;
        gint ii = 0;
@@ -4947,9 +4948,16 @@ e_cal_client_modify_objects_sync (ECalClient *client,
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
        g_return_val_if_fail (comps != NULL, FALSE);
 
-       enum_class = g_type_class_ref (E_TYPE_CAL_OBJ_MOD_TYPE);
-       enum_value = g_enum_get_value (enum_class, mod);
-       g_return_val_if_fail (enum_value != NULL, FALSE);
+       flags = g_string_new (NULL);
+       flags_class = g_type_class_ref (E_TYPE_CAL_OBJ_MOD_TYPE);
+       flags_value = g_flags_get_first_value (flags_class, mod);
+       while (flags_value != NULL) {
+               if (flags->len > 0)
+                       g_string_append_c (flags, ':');
+               g_string_append (flags, flags_value->value_nick);
+               mod &= ~flags_value->value;
+               flags_value = g_flags_get_first_value (flags_class, mod);
+       }
 
        strv = g_new0 (gchar *, g_slist_length (comps) + 1);
        while (comps != NULL) {
@@ -4963,12 +4971,12 @@ e_cal_client_modify_objects_sync (ECalClient *client,
        success = e_dbus_calendar_call_modify_objects_sync (
                client->priv->dbus_proxy,
                (const gchar * const *) strv,
-               enum_value->value_nick,
-               cancellable, error);
+               flags->str, cancellable, error);
 
        g_strfreev (strv);
 
-       g_type_class_unref (enum_class);
+       g_type_class_unref (flags_class);
+       g_string_free (flags, TRUE);
 
        return success;
 }
@@ -5252,16 +5260,24 @@ e_cal_client_remove_objects_sync (ECalClient *client,
                                   GError **error)
 {
        GVariantBuilder builder;
-       GEnumClass *enum_class;
-       GEnumValue *enum_value;
+       GFlagsClass *flags_class;
+       GFlagsValue *flags_value;
+       GString *flags;
        gboolean success;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
        g_return_val_if_fail (ids != NULL, FALSE);
 
-       enum_class = g_type_class_ref (E_TYPE_CAL_OBJ_MOD_TYPE);
-       enum_value = g_enum_get_value (enum_class, mod);
-       g_return_val_if_fail (enum_value != NULL, FALSE);
+       flags = g_string_new (NULL);
+       flags_class = g_type_class_ref (E_TYPE_CAL_OBJ_MOD_TYPE);
+       flags_value = g_flags_get_first_value (flags_class, mod);
+       while (flags_value != NULL) {
+               if (flags->len > 0)
+                       g_string_append_c (flags, ':');
+               g_string_append (flags, flags_value->value_nick);
+               mod &= ~flags_value->value;
+               flags_value = g_flags_get_first_value (flags_class, mod);
+       }
 
        g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY);
        while (ids != NULL) {
@@ -5287,10 +5303,10 @@ e_cal_client_remove_objects_sync (ECalClient *client,
        success = e_dbus_calendar_call_remove_objects_sync (
                client->priv->dbus_proxy,
                g_variant_builder_end (&builder),
-               enum_value->value_nick,
-               cancellable, error);
+               flags->str, cancellable, error);
 
-       g_type_class_unref (enum_class);
+       g_type_class_unref (flags_class);
+       g_string_free (flags, TRUE);
 
        return success;
 }
diff --git a/calendar/libedata-cal/e-data-cal.c b/calendar/libedata-cal/e-data-cal.c
index 4e06093..2333e04 100644
--- a/calendar/libedata-cal/e-data-cal.c
+++ b/calendar/libedata-cal/e-data-cal.c
@@ -960,27 +960,40 @@ data_cal_handle_modify_objects_cb (EDBusCalendar *interface,
                                    const gchar *in_mod_type,
                                    EDataCal *cal)
 {
-       GEnumClass *enum_class;
-       GEnumValue *enum_value;
+       GFlagsClass *flags_class;
+       ECalObjModType mod = 0;
        OperationData *op;
        GSList *tmp = NULL;
+       gchar **flags_strv;
        gint ii;
 
-       enum_class = g_type_class_ref (E_TYPE_CAL_OBJ_MOD_TYPE);
-       enum_value = g_enum_get_value_by_nick (enum_class, in_mod_type);
-       g_return_val_if_fail (enum_value != NULL, FALSE);
+       flags_class = g_type_class_ref (E_TYPE_CAL_OBJ_MOD_TYPE);
+       flags_strv = g_strsplit (in_mod_type, ":", -1);
+       for (ii = 0; flags_strv[ii] != NULL; ii++) {
+               GFlagsValue *flags_value;
+
+               flags_value = g_flags_get_value_by_nick (
+                       flags_class, flags_strv[ii]);
+               if (flags_value != NULL) {
+                       mod |= flags_value->value;
+               } else {
+                       g_warning (
+                               "%s: Unknown flag: %s",
+                               G_STRFUNC, flags_strv[ii]);
+               }
+       }
+       g_strfreev (flags_strv);
+       g_type_class_unref (flags_class);
 
        for (ii = 0; in_ics_objects[ii] != NULL; ii++)
                tmp = g_slist_prepend (tmp, g_strdup (in_ics_objects[ii]));
 
        op = op_new (OP_MODIFY_OBJECTS, cal, invocation);
        op->d.mo.calobjs = g_slist_reverse (tmp);
-       op->d.mo.mod = enum_value->value;
+       op->d.mo.mod = mod;
 
        op_dispatch (cal, op);
 
-       g_type_class_unref (enum_class);
-
        return TRUE;
 }
 
@@ -991,15 +1004,30 @@ data_cal_handle_remove_objects_cb (EDBusCalendar *interface,
                                    const gchar *in_mod_type,
                                    EDataCal *cal)
 {
-       GEnumClass *enum_class;
-       GEnumValue *enum_value;
+       GFlagsClass *flags_class;
+       ECalObjModType mod = 0;
        OperationData *op;
        GSList *tmp = NULL;
+       gchar **flags_strv;
        gsize n_children, ii;
 
-       enum_class = g_type_class_ref (E_TYPE_CAL_OBJ_MOD_TYPE);
-       enum_value = g_enum_get_value_by_nick (enum_class, in_mod_type);
-       g_return_val_if_fail (enum_value != NULL, FALSE);
+       flags_class = g_type_class_ref (E_TYPE_CAL_OBJ_MOD_TYPE);
+       flags_strv = g_strsplit (in_mod_type, ":", -1);
+       for (ii = 0; flags_strv[ii] != NULL; ii++) {
+               GFlagsValue *flags_value;
+
+               flags_value = g_flags_get_value_by_nick (
+                       flags_class, flags_strv[ii]);
+               if (flags_value != NULL) {
+                       mod |= flags_value->value;
+               } else {
+                       g_warning (
+                               "%s: Unknown flag: %s",
+                               G_STRFUNC, flags_strv[ii]);
+               }
+       }
+       g_strfreev (flags_strv);
+       g_type_class_unref (flags_class);
 
        n_children = g_variant_n_children (in_uid_rid_array);
        for (ii = 0; ii < n_children; ii++) {
@@ -1030,7 +1058,7 @@ data_cal_handle_remove_objects_cb (EDBusCalendar *interface,
 
        op = op_new (OP_REMOVE_OBJECTS, cal, invocation);
        op->d.ro.ids = g_slist_reverse (tmp);
-       op->d.ro.mod = enum_value->value;
+       op->d.ro.mod = mod;
 
        op_dispatch (cal, op);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]