diff -uNr libmimedir-0.4.0/bin/ical-dump.c libmimedir-0.4.0cvs20061111/bin/ical-dump.c --- libmimedir-0.4.0/bin/ical-dump.c 2005-09-01 17:36:27.000000000 +0200 +++ libmimedir-0.4.0cvs20061111/bin/ical-dump.c 2006-11-11 19:14:19.000000000 +0100 @@ -144,7 +144,7 @@ print_component (MIMEDirVComponent *component) { gchar *s, *summary, *categories, *uid; - guint priority, seq; + guint priority, seq, duration; MIMEDirDateTime *dtstart, *dtend, *due; MIMEDirRecurrence *recur; @@ -161,6 +161,7 @@ "dtstart", &dtstart, "dtend", &dtend, + "duration", &duration, "due", &due, "recurrence", &recur, @@ -207,6 +208,9 @@ } } + if (duration) { + printf (_(" Duration: %ds\n"), duration); + } if (due && mimedir_datetime_is_valid (due)) { s = mimedir_datetime_to_string (due); if (s) { diff -uNr libmimedir-0.4.0/mimedir/mimedir-recurrence.c libmimedir-0.4.0cvs20061111/mimedir/mimedir-recurrence.c --- libmimedir-0.4.0/mimedir/mimedir-recurrence.c 2005-10-08 08:46:36.000000000 +0200 +++ libmimedir-0.4.0cvs20061111/mimedir/mimedir-recurrence.c 2006-11-11 15:47:28.000000000 +0100 @@ -56,7 +56,8 @@ PROP_COUNT, PROP_INTERVAL, PROP_UNIT, - PROP_UNITLIST + PROP_UNITLIST, + PROP_WKST }; struct _MIMEDirRecurrencePriv { @@ -67,6 +68,7 @@ MIMEDirRecurrenceUnit unit; gchar *units; + guint8 wkst; }; static GObjectClass *parent_class = NULL; @@ -167,6 +169,50 @@ return -1; } +static const gchar * +weekday_to_string (GDateWeekday weekday) +{ + switch (weekday) { + case G_DATE_MONDAY: + return "MO"; + case G_DATE_TUESDAY: + return "TU"; + case G_DATE_WEDNESDAY: + return "WE"; + case G_DATE_THURSDAY: + return "TH"; + case G_DATE_FRIDAY: + return "FR"; + case G_DATE_SATURDAY: + return "SA"; + case G_DATE_SUNDAY: + return "SU"; + default: + g_return_val_if_reached (NULL); + } +} + +static GDateWeekday +string_to_weekday (const gchar *s) +{ + if (strcmp (s, "MO") == 0) + return G_DATE_MONDAY; + else if (strcmp (s, "TU") == 0) + return G_DATE_TUESDAY; + else if (strcmp (s, "WE") == 0) + return G_DATE_WEDNESDAY; + else if (strcmp (s, "TH") == 0) + return G_DATE_THURSDAY; + else if (strcmp (s, "FR") == 0) + return G_DATE_FRIDAY; + else if (strcmp (s, "SA") == 0) + return G_DATE_SATURDAY; + else if (strcmp (s, "SU") == 0) + return G_DATE_SUNDAY; + else + return G_DATE_BAD_WEEKDAY; +} + /* * Class and Object Management */ @@ -261,6 +307,14 @@ NULL, G_PARAM_READWRITE); g_object_class_install_property (gobject_class, PROP_UNITLIST, pspec); + pspec = g_param_spec_uint ("wkst", + _("Workweek start"), + _("The day on which the workweek starts"), + G_DATE_BAD_WEEKDAY, + G_DATE_SUNDAY, + G_DATE_BAD_WEEKDAY, + G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, PROP_WKST, pspec); } @@ -273,6 +327,7 @@ recurrence->priv = g_new0 (MIMEDirRecurrencePriv, 1); recurrence->priv->freq = RECURRENCE_DAILY; recurrence->priv->unit = RECURRENCE_UNIT_NONE; + recurrence->priv->wkst = G_DATE_BAD_WEEKDAY; } @@ -335,6 +390,9 @@ case PROP_UNITLIST: mimedir_utils_set_property_string (&priv->units, value); break; + case PROP_WKST: + priv->wkst = g_value_get_uint (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -375,6 +433,9 @@ case PROP_UNITLIST: g_value_set_string (value, priv->units); break; + case PROP_WKST: + g_value_set_uint (value, priv->wkst); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); return; @@ -512,6 +573,17 @@ g_object_set (G_OBJECT (recurrence), "unit", unit, NULL); g_object_set (G_OBJECT (recurrence), "units", value, NULL); } + else if (!strcasecmp (name, "WKST")) { + GDateWeekday weekday; + + weekday = string_to_weekday (value); + if (!g_date_valid_weekday (weekday)) { + ret = FALSE; + break; + } + + g_object_set (G_OBJECT (recurrence), "wkst", weekday, NULL); + } else { ret = FALSE; break; @@ -571,5 +643,11 @@ g_string_append_printf (string, ";%s=%s", unit, priv->units); } + if (g_date_valid_weekday (priv->wkst)) { + const gchar *weekday; + weekday = weekday_to_string (priv->wkst); + g_string_append_printf (string, ";WKST=%s", weekday); + } + return g_string_free (string, FALSE); } --- libmimedir-0.4.0/mimedir/mimedir-vcomponent.c 2006-12-01 12:53:26.000000000 +0100 +++ libmimedir-0.4.0cvs20061111/mimedir/mimedir-vcomponent.c 2006-11-11 19:08:26.000000000 +0100 @@ -908,6 +905,7 @@ const gchar *s; gint duration = 0; gboolean neg = FALSE; + gboolean dur_week = FALSE; g_return_val_if_fail (error == NULL || *error == NULL, 0); @@ -939,48 +937,52 @@ if (s[0] == 'D' || s[0] == 'd') duration = num * SECS_PER_DAY; - else if (s[0] == 'W' || s[0] == 'w') + else if (s[0] == 'W' || s[0] == 'w') { duration = num * SECS_PER_WEEK; - else { + dur_week = TRUE; + } else { g_set_error (error, MIMEDIR_ATTRIBUTE_ERROR, MIMEDIR_ATTRIBUTE_ERROR_INVALID_FORMAT, MIMEDIR_ATTRIBUTE_ERROR_INVALID_FORMAT_STR, "DURATION", name); return 0; } s++; } - if (s[0] == 'T' || s[0] == 't') { - GError *err = NULL; - guint num; + if ((s[0] == 'T' || s[0] == 't') && !dur_week) { + guint state = 0; s++; - while (s[0] != '\0') { + while (state < 3) { + GError *err = NULL; + guint num; + num = mimedir_vcomponent_parse_number (name, "DURATION", &s, &err); if (err) { g_propagate_error (error, err); return 0; } - - switch (s[0]) { - case 'H': - s++; + if (s[0] == 'H' && state < 1) { duration += num * SECS_PER_HOUR; - break; - case 'M': - s++; + state = 1; + } else if (s[0] == 'M' && state < 2) { duration += num * SECS_PER_MINUTE; - break; - case 'S': - s++; - duration += num; - break; - default: + state = 2; + } else if (s[0] == 'S' && state < 3) { + duration += num ; + state = 3; + } else { g_set_error (error, MIMEDIR_ATTRIBUTE_ERROR, MIMEDIR_ATTRIBUTE_ERROR_INVALID_FORMAT, MIMEDIR_ATTRIBUTE_ERROR_INVALID_FORMAT_STR, "DURATION", name); return 0; } + s++; } } + if (s[0] != '\0') { + g_set_error (error, MIMEDIR_ATTRIBUTE_ERROR, MIMEDIR_ATTRIBUTE_ERROR_INVALID_FORMAT, MIMEDIR_ATTRIBUTE_ERROR_INVALID_FORMAT_STR, "DURATION", name); + return 0; + } + return neg ? -duration : duration; }