[Xfce4-commits] r25785 - in xfcalendar/trunk: . src

Juha Kautto juha at xfce.org
Tue Jun 5 22:47:19 CEST 2007


Author: juha
Date: 2007-06-05 20:47:19 +0000 (Tue, 05 Jun 2007)
New Revision: 25785

Modified:
   xfcalendar/trunk/configure.in.in
   xfcalendar/trunk/src/appointment.c
   xfcalendar/trunk/src/appointment.h
   xfcalendar/trunk/src/event-list.c
   xfcalendar/trunk/src/ical-code.c
   xfcalendar/trunk/src/ical-code.h
   xfcalendar/trunk/src/reminder.c
   xfcalendar/trunk/src/reminder.h
Log:
4.5.9.6: basic procedure alarm added.


Modified: xfcalendar/trunk/configure.in.in
===================================================================
--- xfcalendar/trunk/configure.in.in	2007-06-05 06:38:28 UTC (rev 25784)
+++ xfcalendar/trunk/configure.in.in	2007-06-05 20:47:19 UTC (rev 25785)
@@ -9,7 +9,7 @@
 dnl
 
 dnl Version information
-m4_define([orage_version], [4.5.9.5-svn])
+m4_define([orage_version], [4.5.9.6-svn])
 
 m4_define([gtk_minimum_version], [2.6.0])
 m4_define([xfce_minimum_version], [4.4.0])

Modified: xfcalendar/trunk/src/appointment.c
===================================================================
--- xfcalendar/trunk/src/appointment.c	2007-06-05 06:38:28 UTC (rev 25784)
+++ xfcalendar/trunk/src/appointment.c	2007-06-05 20:47:19 UTC (rev 25785)
@@ -452,6 +452,21 @@
 #endif
 }
 
+static void set_proc_sensitivity(appt_win *apptw)
+{
+    gboolean proc_act;
+
+    proc_act = gtk_toggle_button_get_active(
+	    GTK_TOGGLE_BUTTON(apptw->Proc_checkbutton));
+
+    if (proc_act) {
+        gtk_widget_set_sensitive(apptw->Proc_entry, TRUE);
+    }
+    else {
+        gtk_widget_set_sensitive(apptw->Proc_entry, FALSE);
+    }
+}
+
 static void app_type_checkbutton_clicked_cb(GtkCheckButton *cb
         , gpointer user_data)
 {
@@ -524,6 +539,13 @@
 }
 #endif
 
+static void app_proc_checkbutton_clicked_cb(GtkCheckButton *cb
+        , gpointer user_data)
+{
+    mark_appointment_changed((appt_win *)user_data);
+    set_proc_sensitivity((appt_win *)user_data);
+}
+
 static void app_checkbutton_clicked_cb(GtkCheckButton *cb, gpointer user_data)
 {
     mark_appointment_changed((appt_win *)user_data);
@@ -723,9 +745,10 @@
     const char *time_format="%H:%M";
     struct tm current_t;
     gchar starttime[6], endtime[6], completedtime[6];
-    gint i;
+    gint i, j, k;
+    gchar *tmp;
 
-    /* Next line is fix for bug 2811.
+/* Next line is fix for bug 2811.
  * We need to make sure spin buttons do not have values which are not
  * yet updated = visible.
  * gtk_spin_button_update call would do it, but it seems to cause
@@ -738,6 +761,7 @@
  */
     gtk_widget_grab_focus(apptw->Title_entry);
 
+            /*********** GENERAL TAB ***********/
     /* type */
     if (gtk_toggle_button_get_active(
                 GTK_TOGGLE_BUTTON(apptw->Type_event_rb)))
@@ -833,6 +857,7 @@
             */
     appt->note = gtk_text_iter_get_text(&start, &end);
 
+            /*********** ALARM TAB ***********/
     /* reminder time */
     appt->alarmtime = gtk_spin_button_get_value_as_int(
             GTK_SPIN_BUTTON(apptw->Alarm_spin_dd)) * 24*60*60
@@ -911,6 +936,27 @@
     appt->display_notify_timeout = -1;
 #endif
 
+    /* Do we use procedure alarm */
+    appt->procedure_alarm = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(apptw->Proc_checkbutton));
+
+    /* The actual command. 
+     * Note that we need to split this into cmd and the parameters 
+     * since that is how libical stores it */
+    appt->procedure_cmd =  NULL;
+    appt->procedure_params =  NULL;
+    tmp = (char*)gtk_entry_get_text(GTK_ENTRY(apptw->Proc_entry));
+    j = strlen(tmp);
+    for (i = 0; i < j && g_ascii_isspace(tmp[i]); i++)
+        ; /* skip blanks */
+    for (k = i; k < j && !g_ascii_isspace(tmp[k]); k++)
+        ; /* find first blank after the cmd */
+        /* now i points to start of cmd and k points to end of cmd */
+    if (k-i)
+        appt->procedure_cmd = g_strndup(tmp+i, k-i);
+    if (j-k)
+        appt->procedure_params = g_strndup(tmp+k, j-k);
+
+            /*********** RECURRENCE TAB ***********/
     /* recurrence */
     appt->freq = gtk_combo_box_get_active(GTK_COMBO_BOX(apptw->Recur_freq_cb));
 
@@ -1384,7 +1430,7 @@
     int year, month, day, hours, minutes;
     xfical_appt *appt;
     struct tm *t, tm_date;
-    char *untildate_to_display;
+    char *untildate_to_display, *tmp;
     int i;
 
     orage_message("%s appointment: %s", action, par);
@@ -1552,6 +1598,14 @@
     }
 #endif
 
+    /* procedure */
+    gtk_toggle_button_set_active(
+            GTK_TOGGLE_BUTTON(apptw->Proc_checkbutton)
+                    , appt->procedure_alarm);
+    tmp = g_strconcat(appt->procedure_cmd, " ", appt->procedure_params, NULL);
+    gtk_entry_set_text(GTK_ENTRY(apptw->Proc_entry), tmp ? tmp : "");
+    g_free(tmp);
+
     /********************* RECURRENCE tab *********************/
     /* recurrence */
     gtk_combo_box_set_active(GTK_COMBO_BOX(apptw->Recur_freq_cb)
@@ -1628,6 +1682,7 @@
     set_repeat_sensitivity(apptw);
     set_sound_sensitivity(apptw);
     set_notify_sensitivity(apptw);
+    set_proc_sensitivity(apptw);
     mark_appointment_unchanged(apptw);
 }
 
@@ -2120,6 +2175,27 @@
             , ++row, (GTK_EXPAND | GTK_FILL), (0));
 #endif
 
+    /***** Procedure Alarm *****/
+    apptw->Proc_label = gtk_label_new(_("Procedure"));
+
+    apptw->Proc_hbox = gtk_hbox_new(FALSE, 6);
+    apptw->Proc_checkbutton = 
+            gtk_check_button_new_with_mnemonic(_("Use"));
+    gtk_tooltips_set_tip(apptw->Tooltips, apptw->Proc_checkbutton
+            , _("Select this if you want procedure or script alarm"), NULL);
+    gtk_box_pack_start(GTK_BOX(apptw->Proc_hbox), apptw->Proc_checkbutton
+            , FALSE, TRUE, 0);
+
+    apptw->Proc_entry = gtk_entry_new();
+    gtk_tooltips_set_tip(apptw->Tooltips, apptw->Proc_entry
+            , _("You must enter all escape etc characters yourself.\n This string is just given to shell to process"), NULL);
+    gtk_box_pack_start(GTK_BOX(apptw->Proc_hbox), apptw->Proc_entry
+            , TRUE, TRUE, 0);
+
+    orage_table_add_row(apptw->TableAlarm
+            , apptw->Proc_label, apptw->Proc_hbox
+            , ++row, (GTK_FILL), (GTK_FILL));
+
     g_signal_connect((gpointer)apptw->Alarm_spin_dd, "value-changed"
             , G_CALLBACK(on_app_spin_button_changed_cb), apptw);
     g_signal_connect((gpointer)apptw->Alarm_spin_hh, "value-changed"
@@ -2154,6 +2230,11 @@
             , "value-changed"
             , G_CALLBACK(on_app_spin_button_changed_cb), apptw);
 #endif
+
+    g_signal_connect((gpointer)apptw->Proc_checkbutton, "clicked"
+            , G_CALLBACK(app_proc_checkbutton_clicked_cb), apptw);
+    g_signal_connect((gpointer)apptw->Proc_entry, "changed"
+            , G_CALLBACK(on_app_entry_changed_cb), apptw);
 }
 
 static void build_recurrence_page(appt_win *apptw)

Modified: xfcalendar/trunk/src/appointment.h
===================================================================
--- xfcalendar/trunk/src/appointment.h	2007-06-05 06:38:28 UTC (rev 25784)
+++ xfcalendar/trunk/src/appointment.h	2007-06-05 20:47:19 UTC (rev 25785)
@@ -132,6 +132,10 @@
     GtkWidget *Display_spin_expire_notify;
     GtkWidget *Display_spin_expire_notify_label;
 #endif
+    GtkWidget *Proc_label;
+    GtkWidget *Proc_hbox;
+    GtkWidget *Proc_checkbutton;
+    GtkWidget *Proc_entry;
 
     GtkWidget *Recur_notebook_page;
     GtkWidget *Recur_tab_label;

Modified: xfcalendar/trunk/src/event-list.c
===================================================================
--- xfcalendar/trunk/src/event-list.c	2007-06-05 06:38:28 UTC (rev 25784)
+++ xfcalendar/trunk/src/event-list.c	2007-06-05 20:47:19 UTC (rev 25785)
@@ -326,7 +326,7 @@
     gchar          *title = NULL;
     gchar           flags[5]; 
     gchar          *stime;
-    gchar          *s_sort, *s_sort1;
+    gchar          /* *s_sort,*/ *s_sort1;
     gchar           source[5]; 
     gint            len = 50;
 

Modified: xfcalendar/trunk/src/ical-code.c
===================================================================
--- xfcalendar/trunk/src/ical-code.c	2007-06-05 06:38:28 UTC (rev 25784)
+++ xfcalendar/trunk/src/ical-code.c	2007-06-05 20:47:19 UTC (rev 25785)
@@ -1118,9 +1118,13 @@
     g_print(P_N "\n");
 #endif
     appt = g_new0(xfical_appt, 1);
-    appt->availability = 1;
     appt->alarm_before = TRUE;
     appt->alarm_related_start = TRUE;
+    appt->availability = 1;
+    appt->soundrepeat_cnt = 500;
+    appt->soundrepeat_len = 2;
+    appt->freq = XFICAL_FREQ_NONE;
+    appt->interval = 1;
     for (i=0; i <= 6; i++)
         appt->recur_byday[i] = TRUE;
     return(appt);
@@ -1277,8 +1281,7 @@
         return(NULL);
 }
 
-static void process_alarm_data(icalcomponent *c
-        , icalcomponent *ca, alarm_struct *new_alarm)
+static void process_alarm_data(icalcomponent *ca, alarm_struct *new_alarm)
 {
 #undef P_N
 #define P_N "process_alarm_data: "
@@ -1298,75 +1301,73 @@
         return;
     }
     act = icalproperty_get_action(p);
-    if (act == ICAL_ACTION_DISPLAY)
+    if (act == ICAL_ACTION_DISPLAY) {
         new_alarm->display = TRUE;
-    else if (act == ICAL_ACTION_AUDIO)
-        new_alarm->audio = TRUE;
-    for (p = icalcomponent_get_first_property(ca, ICAL_ANY_PROPERTY);
-         p != 0;
-         p = icalcomponent_get_next_property(ca, ICAL_ANY_PROPERTY)) {
-        switch (icalproperty_isa(p)) {
-            case ICAL_DESCRIPTION_PROPERTY:
-                if (new_alarm->description)
-                    g_string_free(new_alarm->description, TRUE);
-                new_alarm->description = g_string_new(
-                        (char *)icalproperty_get_description(p));
-                break;
-            case ICAL_ATTACH_PROPERTY:
-                attach = icalproperty_get_attach(p);
-                text = (char *)icalattach_get_url(attach);
-                if (text)
-                    new_alarm->sound = g_string_new(text);
-                break;
-            case ICAL_REPEAT_PROPERTY:
-                new_alarm->repeat_cnt = icalproperty_get_repeat(p);
-                break;
-            case ICAL_DURATION_PROPERTY:
-                duration = icalproperty_get_duration(p);
-                new_alarm->repeat_delay = icaldurationtype_as_int(duration);
-                break;
-            case ICAL_X_PROPERTY:
-                text = (char *)icalproperty_get_x_name(p);
-                /*
-                g_print(P_N "x-property %s\n", text);
-                */
-                if (!strcmp(text, "X-ORAGE-DISPLAY-ALARM")) {
-                    text = (char *)icalproperty_get_value_as_string(p);
-                /*
-                g_print(P_N "x-value %s\n", text);
-                */
-                    if (!strcmp(text, "ORAGE")) {
-                        new_alarm->display_orage = TRUE;
-                /*
-                g_print(P_N "x-orage %s\n", text);
-                */
-                    }
-                    else if (!strcmp(text, "NOTIFY")) {
-                        new_alarm->display_notify = TRUE;
-                /*
-                g_print(P_N "x-notify %s\n", text);
-                */
-                    }
+        p = icalcomponent_get_first_property(ca, ICAL_DESCRIPTION_PROPERTY);
+        if (p)
+            new_alarm->description = g_string_new(
+                    (char *)icalproperty_get_description(p));
+        for (p = icalcomponent_get_first_property(ca, ICAL_X_PROPERTY);
+             p != 0;
+             p = icalcomponent_get_next_property(ca, ICAL_X_PROPERTY)) {
+            text = (char *)icalproperty_get_x_name(p);
+            if (!strcmp(text, "X-ORAGE-DISPLAY-ALARM")) {
+                text = (char *)icalproperty_get_value_as_string(p);
+                if (!strcmp(text, "ORAGE")) {
+                    new_alarm->display_orage = TRUE;
                 }
-                else if (!strcmp(text, "X-ORAGE-NOTIFY-ALARM-TIMEOUT")) {
-                    text = (char *)icalproperty_get_value_as_string(p);
-                    sscanf(text, "%d", &i);
-                    new_alarm->notify_timeout = i;
+                else if (!strcmp(text, "NOTIFY")) {
+                    new_alarm->display_notify = TRUE;
                 }
-                else {
-                    g_warning(P_N "unknown X property %s", text);
-                }
-                break;
-            case ICAL_ACTION_PROPERTY:
-            case ICAL_TRIGGER_PROPERTY:
-                /* these are processed already */
-                break;
-            default:
-                g_warning(P_N "Unknown property (%s) in Alarm",
-                    (char *)icalproperty_get_property_name(p));
-                break;
-        } 
-    } 
+            }
+            else if (!strcmp(text, "X-ORAGE-NOTIFY-ALARM-TIMEOUT")) {
+                text = (char *)icalproperty_get_value_as_string(p);
+                sscanf(text, "%d", &i);
+                new_alarm->notify_timeout = i;
+            }
+            else {
+                g_warning(P_N "unknown X property %s", text);
+            }
+        }
+    }
+    else if (act == ICAL_ACTION_AUDIO) {
+        new_alarm->audio = TRUE;
+        p = icalcomponent_get_first_property(ca, ICAL_ATTACH_PROPERTY);
+        if (p) {
+            attach = icalproperty_get_attach(p);
+            text = (char *)icalattach_get_url(attach);
+            if (text)
+                new_alarm->sound = g_string_new(text);
+        }
+        p = icalcomponent_get_first_property(ca, ICAL_REPEAT_PROPERTY);
+        if (p)
+            new_alarm->repeat_cnt = icalproperty_get_repeat(p);
+        p = icalcomponent_get_first_property(ca, ICAL_DURATION_PROPERTY);
+        if (p) {
+            duration = icalproperty_get_duration(p);
+            new_alarm->repeat_delay = icaldurationtype_as_int(duration);
+        }
+    }
+    else if (act == ICAL_ACTION_PROCEDURE) {
+        new_alarm->procedure = TRUE;
+        p = icalcomponent_get_first_property(ca, ICAL_ATTACH_PROPERTY);
+        if (p) {
+            attach = icalproperty_get_attach(p);
+            text = (char *)icalattach_get_url(attach);
+            if (text) {
+                new_alarm->cmd = g_string_new(text);
+                p = icalcomponent_get_first_property(ca
+                        , ICAL_DESCRIPTION_PROPERTY);
+                if (p)
+                    new_alarm->cmd = g_string_append(new_alarm->cmd
+                            , (char *)icalproperty_get_description(p));
+            }
+        }
+    }
+    else { /* unknown alarm action */
+        g_warning(P_N "Unknown ACTION (%d) in alarm. Ignoring ALARM.", act);
+        return;
+    }
 }
 
 static void xfical_alarm_build_list_internal_real(gboolean first_list_today
@@ -1379,7 +1380,7 @@
     icalproperty_status stat=ICAL_ACTION_DISPLAY;
     struct icaltimetype cur_time;
     char *suid, *ssummary, *sdescription, *ssound = NULL;
-    gboolean trg_found = FALSE, trg_active = FALSE;
+    gboolean trg_processed = FALSE, trg_active = FALSE;
     gint repeat_cnt = 0, repeat_delay = 0;
     gint cnt_alarm=0, cnt_repeat=0, cnt_event=0, cnt_act_alarm=0
         , cnt_alarm_add=0;
@@ -1395,15 +1396,15 @@
             c != 0;
             c = icalcomponent_get_next_component(base, ICAL_ANY_COMPONENT)) {
         cnt_event++;
-        trg_found = FALSE;
+        trg_processed = FALSE;
         trg_active = FALSE;
         for (ci = icalcomponent_begin_component(c, ICAL_VALARM_COMPONENT);
                 icalcompiter_deref(&ci) != 0;
                 icalcompiter_next(&ci)) {
             ca = icalcompiter_deref(&ci);
             cnt_alarm++;
-            if (!trg_found) {
-                trg_found = TRUE;
+            if (!trg_processed) {
+                trg_processed = TRUE;
                 new_alarm = process_alarm_trigger(c, ca, cur_time, &cnt_repeat);
                 if (new_alarm) {
                     trg_active = TRUE;
@@ -1412,14 +1413,12 @@
                     new_alarm->uid = g_string_append(new_alarm->uid, suid);
                     new_alarm->title = g_string_new(
                             (char *)icalcomponent_get_summary(c));
-                    new_alarm->description = g_string_new(
-                            (char *)icalcomponent_get_description(c));
                 }
             }
-            if (trg_found) {
+            if (trg_processed) {
                 if (trg_active) {
                     cnt_act_alarm++;
-                    process_alarm_data(c, ca, new_alarm);
+                    process_alarm_data(ca, new_alarm);
                 }
             }
             else {
@@ -1428,6 +1427,9 @@
             }
         }  /* ALARM */
         if (trg_active) {
+            if (!new_alarm->description)
+                new_alarm->description = g_string_new(
+                        (char *)icalcomponent_get_description(c));
             g_par.alarm_list = g_list_append(g_par.alarm_list, new_alarm);
             cnt_alarm_add++;
         }
@@ -1501,6 +1503,25 @@
     return(xf_uid);
 }
 
+/* dispprop   = 3*(
+                ; the following are all REQUIRED,
+                ; but MUST NOT occur more than once
+                action / description / trigger /
+***** Not Implemented in Orage *****
+                ; 'duration' and 'repeat' are both optional,
+                ; and MUST NOT occur more than once each,
+                ; but if one occurs, so MUST the other
+                duration / repeat /
+***** Not Implemented in Orage *****
+                ; the following is optional,
+                ; and MAY occur more than once
+                x-prop
+***** Orage implements: *****
+X-ORAGE-DISPLAY-ALARM:ORAGE
+X-ORAGE-DISPLAY-ALARM:NOTIFY
+X-ORAGE-NOTIFY-ALARM-TIMEOUT:%d
+                )
+*/
 static void appt_add_alarm_internal_display(xfical_appt *appt
         , icalcomponent *ialarm)
 {
@@ -1536,6 +1557,23 @@
     }
 }
 
+/*
+     audioprop  = 2*(
+                ; 'action' and 'trigger' are both REQUIRED,
+                ; but MUST NOT occur more than once
+                action / trigger /
+                ; 'duration' and 'repeat' are both optional,
+                ; and MUST NOT occur more than once each,
+                ; but if one occurs, so MUST the other
+                duration / repeat /
+                ; the following is optional,
+                ; but MUST NOT occur more than once
+                attach /
+                ; the following is optional,
+                ; and MAY occur more than once
+                x-prop
+                )
+*/
 static void appt_add_alarm_internal_audio(xfical_appt *appt
         , icalcomponent *ialarm)
 {
@@ -1549,8 +1587,7 @@
     icalcomponent_add_property(ialarm
             , icalproperty_new_action(ICAL_ACTION_AUDIO));
     attach = icalattach_new_from_url(appt->sound);
-    icalcomponent_add_property(ialarm
-            , icalproperty_new_attach(attach));
+    icalcomponent_add_property(ialarm, icalproperty_new_attach(attach));
     if (appt->soundrepeat) {
         icalcomponent_add_property(ialarm
                 , icalproperty_new_repeat(appt->soundrepeat_cnt));
@@ -1576,6 +1613,7 @@
                 attach / x-prop
                 )
 */
+/*
 static void appt_add_alarm_internal_email(xfical_appt *appt
         , icalcomponent *ialarm)
 {
@@ -1585,21 +1623,22 @@
 #ifdef ORAGE_DEBUG
     g_print(P_N "\n");
 #endif
-    /*
     icalcomponent_add_property(ialarm
             , icalproperty_new_action(ICAL_ACTION_EMAIL));
-    */
     g_warning("EMAIL ACTION not implemented yet");
 }
+*/
 
 /* procprop   = 3*(
                 ; the following are all REQUIRED,
                 ; but MUST NOT occur more than once
                 action / attach / trigger /
+***** Not Implemented in Orage *****
                 ; 'duration' and 'repeat' are both optional,
                 ; and MUST NOT occur more than once each,
                 ; but if one occurs, so MUST the other
                 duration / repeat /
+***** Not Implemented in Orage *****
                 ; 'description' is optional,
                 ; and MUST NOT occur more than once
                 description /
@@ -1613,17 +1652,23 @@
 {
 #undef P_N
 #define P_N "appt_add_alarm_internal_procedure: "
+    icalattach *attach;
 
 #ifdef ORAGE_DEBUG
     g_print(P_N "\n");
 #endif
-    /*
     icalcomponent_add_property(ialarm
             , icalproperty_new_action(ICAL_ACTION_PROCEDURE));
-    */
-    g_warning("PROCEDURE ACTION not implemented yet");
+    attach = icalattach_new_from_url(appt->procedure_cmd);
+    icalcomponent_add_property(ialarm, icalproperty_new_attach(attach));
+    if ORAGE_STR_EXISTS(appt->procedure_params)
+        icalcomponent_add_property(ialarm
+                , icalproperty_new_description(appt->procedure_params));
 }
 
+/* Create new alarm and add trigger to it.
+ * Note that Orage uses same trigger for all alarms.
+ */
 static icalcomponent *appt_add_alarm_internal_base(xfical_appt *appt
         , struct icaltriggertype trg)
 {
@@ -1636,8 +1681,7 @@
 #endif
     ialarm = icalcomponent_new(ICAL_VALARM_COMPONENT);
     if (appt->alarm_related_start)
-        icalcomponent_add_property(ialarm
-                , icalproperty_new_trigger(trg));
+        icalcomponent_add_property(ialarm, icalproperty_new_trigger(trg));
     else
         icalcomponent_add_property(ialarm
                 , icalproperty_vanew_trigger(trg
@@ -1691,13 +1735,11 @@
     */
 
     /********** PROCEDURE **********/
-    /*
-    if ORAGE_STR_EXISTS(appt->sound) {
+    if (appt->procedure_alarm && ORAGE_STR_EXISTS(appt->procedure_cmd)) {
         ialarm = appt_add_alarm_internal_base(appt, trg);
         appt_add_alarm_internal_procedure(appt, ialarm);
         icalcomponent_add_component(ievent, ialarm);
     }
-    */
 }
 
 static void appt_add_recur_internal(xfical_appt *appt, icalcomponent *ievent)
@@ -2019,127 +2061,171 @@
     return(appt_add_internal(appt, TRUE, NULL, icaltime_null_time()));
 }
 
-void ical_appt_get_alarm_internal(icalcomponent *c,  xfical_appt *appt)
+static gboolean get_alarm_trigger(icalcomponent *ca,  xfical_appt *appt)
 {
 #undef P_N
-#define P_N "ical_appt_get_alarm_internal: "
-    icalcomponent *ca = NULL;
+#define P_N "get_alarm_trigger: "
     icalproperty *p = NULL;
     struct icaltriggertype trg;
+    icalparameter *trg_related_par;
+    icalparameter_related rel;
+
+#ifdef ORAGE_DEBUG
+    g_print(P_N "\n");
+#endif
+    p = icalcomponent_get_first_property(ca, ICAL_TRIGGER_PROPERTY);
+    if (p) {
+        trg = icalproperty_get_trigger(p);
+        if (icaltime_is_null_time(trg.time)) {
+            appt->alarmtime = icaldurationtype_as_int(trg.duration);
+            if (appt->alarmtime < 0) { /* before */
+                appt->alarmtime *= -1;
+                appt->alarm_before = TRUE;
+            }
+            else
+                appt->alarm_before = FALSE;
+            trg_related_par = icalproperty_get_first_parameter(p
+                    , ICAL_RELATED_PARAMETER);
+            if (trg_related_par) {
+                rel = icalparameter_get_related(trg_related_par);
+                if (rel == ICAL_RELATED_END)
+                    appt->alarm_related_start = FALSE;
+                else
+                    appt->alarm_related_start = TRUE;
+            }
+            else
+                appt->alarm_related_start = TRUE;
+        }
+        else
+            g_warning(P_N "Can not process time triggers");
+    }
+    else {
+        g_warning(P_N "Trigger missing. Ignoring alarm");
+        return(FALSE);
+    }
+    return(TRUE);
+}
+
+static gboolean get_alarm_data(icalcomponent *ca,  xfical_appt *appt)
+{
+#undef P_N
+#define P_N "get_alarm_data: "
+    icalproperty *p = NULL;
     enum icalproperty_action act;
     icalattach *attach;
     struct icaldurationtype duration;
-    icalparameter *trg_related_par;
-    icalparameter_related rel;
-    gboolean display_alarm = FALSE;
     char *text;
     int i;
 
 #ifdef ORAGE_DEBUG
     g_print(P_N "\n");
 #endif
-    for (ca = icalcomponent_get_first_component(c, ICAL_VALARM_COMPONENT); 
-         ca != 0;
-         ca = icalcomponent_get_next_component(c, ICAL_VALARM_COMPONENT)) {
-        for (p = icalcomponent_get_first_property(ca, ICAL_ANY_PROPERTY);
+    p = icalcomponent_get_first_property(ca, ICAL_ACTION_PROPERTY);
+    if (!p) {
+        g_warning(P_N "No ACTION in alarm. Ignoring this ALARM.");
+        return(FALSE);
+    }
+    act = icalproperty_get_action(p);
+    if (act == ICAL_ACTION_DISPLAY) {
+        p = icalcomponent_get_first_property(ca, ICAL_DESCRIPTION_PROPERTY);
+        if (p)
+            appt->note = (char *)icalproperty_get_description(p);
+        for (p = icalcomponent_get_first_property(ca, ICAL_X_PROPERTY);
              p != 0;
-             p = icalcomponent_get_next_property(ca, ICAL_ANY_PROPERTY)) {
-            switch (icalproperty_isa(p)) {
-                case ICAL_TRIGGER_PROPERTY:
-                    trg = icalproperty_get_trigger(p);
-                    if (icaltime_is_null_time(trg.time)) {
-                        appt->alarmtime = icaldurationtype_as_int(trg.duration);
-                        if (appt->alarmtime < 0) { /* before */
-                            appt->alarmtime *= -1;
-                            appt->alarm_before = TRUE;
-                        }
-                        else
-                            appt->alarm_before = FALSE;
-                        trg_related_par = icalproperty_get_first_parameter(p
-                                , ICAL_RELATED_PARAMETER);
-                        if (trg_related_par) {
-                            rel = icalparameter_get_related(trg_related_par);
-                            if (rel == ICAL_RELATED_END)
-                                appt->alarm_related_start = FALSE;
-                            else
-                                appt->alarm_related_start = TRUE;
-                        }
-                        else
-                            appt->alarm_related_start = TRUE;
-                    }
-                    else
-                        g_warning(P_N "Can not process time triggers");
-                    break;
-                case ICAL_ATTACH_PROPERTY:
-                    attach = icalproperty_get_attach(p);
-                    appt->sound = (char *)icalattach_get_url(attach);
-                    break;
-                case ICAL_REPEAT_PROPERTY:
-                    appt->soundrepeat = TRUE;
-                    appt->soundrepeat_cnt = icalproperty_get_repeat(p);
-                    break;
-                case ICAL_DESCRIPTION_PROPERTY:
-                    if (appt->note == NULL)
-                        appt->note = (char *) icalproperty_get_description(p);
-                    break;
-                case ICAL_DURATION_PROPERTY:
-                    duration = icalproperty_get_duration(p);
-                    appt->soundrepeat_len = icaldurationtype_as_int(duration);
-                    break;
-                case ICAL_X_PROPERTY:
-                    text = (char *)icalproperty_get_x_name(p);
-                    /*
-                    g_print(P_N "x-property %s\n", text);
-                    */
-                    if (!strcmp(text, "X-ORAGE-DISPLAY-ALARM")) {
-                        text = (char *)icalproperty_get_value_as_string(p);
-                    /*
-                    g_print(P_N "x-value %s\n", text);
-                    */
-                        if (!strcmp(text, "ORAGE")) {
-                            appt->display_alarm_orage = TRUE;
-                    /*
-                    g_print(P_N "x-orage %s\n", text);
-                    */
-                        }
-                        else if (!strcmp(text, "NOTIFY")) {
-                            appt->display_alarm_notify = TRUE;
-                    /*
-                    g_print(P_N "x-notify %s\n", text);
-                    */
-                        }
-                    }
-                    else if (!strcmp(text, "X-ORAGE-NOTIFY-ALARM-TIMEOUT")) {
-                        text = (char *)icalproperty_get_value_as_string(p);
-                        sscanf(text, "%d", &i);
-                        appt->display_notify_timeout = i;
-                    }
-                    else {
-                        g_warning(P_N "unknown X property %s", text);
-                    }
-                    break;
-                case ICAL_ACTION_PROPERTY:
-                    act = icalproperty_get_action(p);
-                    if (act == ICAL_ACTION_AUDIO)
-                        appt->sound_alarm = TRUE;
-                    else if (act == ICAL_ACTION_DISPLAY)
-                    /* we do not know yet which type of display alarm this is */
-                        display_alarm = TRUE;
-                    else /* unsupported property */
-                        g_warning(P_N "unknown action property %d", act);
-                    break;
-                default:
-                    g_warning(P_N "unknown property %s", (char *)icalproperty_get_property_name(p));
-                    break;
+             p = icalcomponent_get_next_property(ca, ICAL_X_PROPERTY)) {
+            text = (char *)icalproperty_get_x_name(p);
+            if (!strcmp(text, "X-ORAGE-DISPLAY-ALARM")) {
+                text = (char *)icalproperty_get_value_as_string(p);
+                if (!strcmp(text, "ORAGE")) {
+                    appt->display_alarm_orage = TRUE;
+                }
+                else if (!strcmp(text, "NOTIFY")) {
+                    appt->display_alarm_notify = TRUE;
+                }
             }
+            else if (!strcmp(text, "X-ORAGE-NOTIFY-ALARM-TIMEOUT")) {
+                text = (char *)icalproperty_get_value_as_string(p);
+                sscanf(text, "%d", &i);
+                appt->display_notify_timeout = i;
+            }
+            else {
+                g_warning(P_N "unknown X property %s", text);
+            }
         }
+        if (!appt->display_alarm_orage && !appt->display_alarm_notify)	
+            appt->display_alarm_orage = TRUE;
     }
-    /* default display alarm is Orage style */
-    if (display_alarm
-            && (!appt->display_alarm_orage && !appt->display_alarm_notify))	
-        appt->display_alarm_orage = TRUE;
+    else if (act == ICAL_ACTION_AUDIO) {
+        p = icalcomponent_get_first_property(ca, ICAL_ATTACH_PROPERTY);
+        if (p) {
+            appt->sound_alarm = TRUE;
+            attach = icalproperty_get_attach(p);
+            appt->sound = g_strdup((char *)icalattach_get_url(attach));
+            p = icalcomponent_get_first_property(ca, ICAL_REPEAT_PROPERTY);
+            if (p) {
+                appt->soundrepeat = TRUE;
+                appt->soundrepeat_cnt = icalproperty_get_repeat(p);
+            }
+            p = icalcomponent_get_first_property(ca, ICAL_DURATION_PROPERTY);
+            if (p) {
+                duration = icalproperty_get_duration(p);
+                appt->soundrepeat_len = icaldurationtype_as_int(duration);
+            }
+        }
+    }
+    else if (act == ICAL_ACTION_PROCEDURE) {
+        p = icalcomponent_get_first_property(ca, ICAL_ATTACH_PROPERTY);
+        if (p) {
+            appt->procedure_alarm = TRUE;
+            attach = icalproperty_get_attach(p);
+            text = (char *)icalattach_get_url(attach);
+            if (text) {
+                appt->procedure_cmd = g_strdup(text);
+                p = icalcomponent_get_first_property(ca
+                        , ICAL_DESCRIPTION_PROPERTY);
+                if (p)
+                    appt->procedure_params = g_strdup(
+                            (char *)icalproperty_get_description(p));
+            }
+        }
+    }
+    else { /* unknown alarm action */
+        g_warning(P_N "Unknown ACTION (%d) in alarm. Ignoring ALARM.", act);
+        return;
+    }
 }
 
+static void ical_appt_get_alarm_internal(icalcomponent *c,  xfical_appt *appt)
+{
+#undef P_N
+#define P_N "ical_appt_get_alarm_internal: "
+    icalcomponent *ca = NULL;
+    icalcompiter ci;
+    gboolean trg_processed = FALSE;
+
+#ifdef ORAGE_DEBUG
+    g_print(P_N "\n");
+#endif
+    for (ci = icalcomponent_begin_component(c, ICAL_VALARM_COMPONENT);
+         icalcompiter_deref(&ci) != 0;
+         icalcompiter_next(&ci)) {
+        ca = icalcompiter_deref(&ci);
+        /* FIXME: Orage assumes all alarms have similar trigger, which may
+         * not be the case with other than Orage originated alarms.
+         * We process trigger only once. */
+        if (!trg_processed) {
+            trg_processed = TRUE;
+            if (!get_alarm_trigger(ca, appt)) {
+                g_warning(P_N "Trigger missing. Ignoring alarm");
+                return;
+            }
+        }
+        if (trg_processed) {
+            get_alarm_data(ca, appt);
+        }
+    }
+}
+
 static void process_start_date(xfical_appt *appt, icalproperty *p
         , struct icaltimetype *itime, struct icaltimetype *stime
         , struct icaltimetype *sltime, struct icaltimetype *etime)
@@ -2161,14 +2247,21 @@
     text  = icaltime_as_ical_string(*itime);
     */
     g_strlcpy(appt->starttime, text, 17);
-    if (icaltime_is_date(*itime))
+    if (icaltime_is_date(*itime)) {
         appt->allDay = TRUE;
-    else if (icaltime_is_utc(*itime))
+        appt->start_tz_loc = "floating";
+    }
+    else if (icaltime_is_utc(*itime)) {
         appt->start_tz_loc = "UTC";
+    }
     else { /* let's check timezone */
         itime_tz = icalproperty_get_first_parameter(p, ICAL_TZID_PARAMETER);
-        if (itime_tz)
+        if (itime_tz) {
             appt->start_tz_loc = (char *)icalparameter_get_tzid(itime_tz);
+        }
+        else {
+            appt->start_tz_loc = "floating";
+        }
     }
     if (appt->endtime[0] == '\0') {
         g_strlcpy(appt->endtime,  appt->starttime, 17);
@@ -2198,15 +2291,19 @@
     g_strlcpy(appt->endtime, text, 17);
     if (icaltime_is_date(*itime)) {
         appt->allDay = TRUE;
+        appt->end_tz_loc = "floating";
     }
-    else if (icaltime_is_utc(*itime))
+    else if (icaltime_is_utc(*itime)) {
         appt->end_tz_loc = "UTC";
+    }
     else { /* let's check timezone */
         itime_tz = icalproperty_get_first_parameter(p, ICAL_TZID_PARAMETER);
-        if (itime_tz)
+        if (itime_tz) {
             appt->end_tz_loc = (char *)icalparameter_get_tzid(itime_tz);
-        else
-            appt->end_tz_loc = NULL;
+        }
+        else {
+            appt->end_tz_loc = "floating";
+        }
     }
 }
 
@@ -2236,6 +2333,90 @@
     appt->completed = TRUE;
 }
 
+static void ical_appt_get_rrule_internal(icalcomponent *c, xfical_appt *appt
+        , icalproperty *p)
+{
+#undef P_N
+#define P_N "ical_appt_get_rrule_internal: "
+    struct icalrecurrencetype rrule;
+    const char *text;
+    int i, cnt, day;
+
+#ifdef ORAGE_DEBUG
+    g_print(P_N "\n");
+#endif
+    rrule = icalproperty_get_rrule(p);
+    switch (rrule.freq) {
+        case ICAL_DAILY_RECURRENCE:
+            appt->freq = XFICAL_FREQ_DAILY;
+            break;
+        case ICAL_WEEKLY_RECURRENCE:
+            appt->freq = XFICAL_FREQ_WEEKLY;
+            break;
+        case ICAL_MONTHLY_RECURRENCE:
+            appt->freq = XFICAL_FREQ_MONTHLY;
+            break;
+        case ICAL_YEARLY_RECURRENCE:
+            appt->freq = XFICAL_FREQ_YEARLY;
+            break;
+        default:
+            appt->freq = XFICAL_FREQ_NONE;
+            break;
+    }
+    if ((appt->recur_count = rrule.count))
+        appt->recur_limit = 1;
+    else if(! icaltime_is_null_time(rrule.until)) {
+        appt->recur_limit = 2;
+        text  = icaltime_as_ical_string(rrule.until);
+        g_strlcpy(appt->recur_until, text, 17);
+    }
+    if (rrule.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
+        for (i=0; i <= 6; i++)
+            appt->recur_byday[i] = FALSE;
+        for (i=0; i <= 6 && rrule.by_day[i] != ICAL_RECURRENCE_ARRAY_MAX; i++) {
+            cnt = (int)floor((double)(rrule.by_day[i]/8));
+            day = abs(rrule.by_day[i]-8*cnt);
+            switch (day) {
+                case ICAL_MONDAY_WEEKDAY:
+                    appt->recur_byday[0] = TRUE;
+                    appt->recur_byday_cnt[0] = cnt;
+                    break;
+                case ICAL_TUESDAY_WEEKDAY:
+                    appt->recur_byday[1] = TRUE;
+                    appt->recur_byday_cnt[1] = cnt;
+                    break;
+                case ICAL_WEDNESDAY_WEEKDAY:
+                    appt->recur_byday[2] = TRUE;
+                    appt->recur_byday_cnt[2] = cnt;
+                    break;
+                case ICAL_THURSDAY_WEEKDAY:
+                    appt->recur_byday[3] = TRUE;
+                    appt->recur_byday_cnt[3] = cnt;
+                    break;
+                case ICAL_FRIDAY_WEEKDAY:
+                    appt->recur_byday[4] = TRUE;
+                    appt->recur_byday_cnt[4] = cnt;
+                    break;
+                case ICAL_SATURDAY_WEEKDAY:
+                    appt->recur_byday[5] = TRUE;
+                    appt->recur_byday_cnt[5] = cnt;
+                    break;
+                case ICAL_SUNDAY_WEEKDAY:
+                    appt->recur_byday[6] = TRUE;
+                    appt->recur_byday_cnt[6] = cnt;
+                    break;
+                case ICAL_NO_WEEKDAY:
+                    break;
+                default:
+                    g_warning(P_N "unknown weekday %s: %d/%d (%x)"
+                            , appt->uid, rrule.by_day[i], i, rrule.by_day[i]);
+                    break;
+            }
+        }
+    }
+    appt->interval = rrule.interval;
+}
+
  /* Read EVENT/TODO/JOURNAL component from ical datafile.
   * ical_uid:  key of ical comp appt-> is to be read
   * returns: if failed: NULL
@@ -2261,9 +2442,8 @@
     icaltimezone *l_icaltimezone = NULL;
     icalparameter *itime_tz;
     icalproperty_transp xf_transp;
-    struct icalrecurrencetype rrule;
     struct icaldurationtype duration, duration_tmp;
-    int i, cnt, day;
+    int i;
     gboolean stime_found = FALSE, etime_found = FALSE, valid_comp = FALSE;
 
 #ifdef ORAGE_DEBUG
@@ -2272,33 +2452,31 @@
     for (c = icalcomponent_get_first_component(base, ICAL_ANY_COMPONENT); 
          c != 0 && !key_found;
          c = icalcomponent_get_next_component(base, ICAL_ANY_COMPONENT)) {
-        if (icalcomponent_isa(c) == ICAL_VEVENT_COMPONENT) {
-            appt.type = XFICAL_TYPE_EVENT;
-            valid_comp = TRUE;
-        }
-        else if (icalcomponent_isa(c) == ICAL_VTODO_COMPONENT) {
-            appt.type = XFICAL_TYPE_TODO;
-            valid_comp = TRUE;
-        }
-        else if (icalcomponent_isa(c) == ICAL_VJOURNAL_COMPONENT) {
-            appt.type = XFICAL_TYPE_JOURNAL;
-            valid_comp = TRUE;
-        }
-        else {
-            g_warning(P_N "Unknown component");
-            valid_comp = FALSE;
-        }
         text = icalcomponent_get_uid(c);
 
-        if (ORAGE_STR_EXISTS(text) && strcmp(text, ical_uid) == 0
-                && valid_comp) { 
+        if (ORAGE_STR_EXISTS(text) && strcmp(text, ical_uid) == 0) { 
             /* we found our uid (=component) */
+            key_found = TRUE;
+        /********** Component type ********/
+            if (icalcomponent_isa(c) == ICAL_VEVENT_COMPONENT) {
+                appt.type = XFICAL_TYPE_EVENT;
+            }
+            else if (icalcomponent_isa(c) == ICAL_VTODO_COMPONENT) {
+                appt.type = XFICAL_TYPE_TODO;
+            }
+            else if (icalcomponent_isa(c) == ICAL_VJOURNAL_COMPONENT) {
+                appt.type = XFICAL_TYPE_JOURNAL;
+            }
+            else {
+                g_warning(P_N "Unknown component");
+                key_found = FALSE;
+                break; /* end for loop */
+            }
         /*********** Defaults ***********/
             stime = icaltime_null_time();
             sltime = icaltime_null_time();
             eltime = icaltime_null_time();
             duration = icaldurationtype_null_duration();
-            key_found = TRUE;
             appt.uid = NULL;
             appt.title = NULL;
             appt.location = NULL;
@@ -2312,32 +2490,33 @@
             appt.completed = FALSE;
             appt.completedtime[0] = '\0';
             appt.completed_tz_loc = NULL;
-            appt.availability = -1;
             appt.priority = 0;
             appt.note = NULL;
             appt.alarmtime = 0;
-            appt.alarm_before = TRUE;
-            appt.alarm_related_start = TRUE;
             appt.sound_alarm = FALSE;
             appt.sound = NULL;
             appt.soundrepeat = FALSE;
-            appt.soundrepeat_cnt = 500;
-            appt.soundrepeat_len = 2;
             appt.display_alarm_orage = FALSE;
             appt.display_alarm_notify = FALSE;
             appt.display_notify_timeout = 0;
-/*
-            appt.email_alarm = FALSE;
-            appt.email_attendees = NULL;
             appt.procedure_alarm = FALSE;
             appt.procedure_cmd = NULL;
-*/
+            appt.procedure_params = NULL;
             appt.starttimecur[0] = '\0';
             appt.endtimecur[0] = '\0';
-            appt.freq = XFICAL_FREQ_NONE;
             appt.recur_limit = 0;
             appt.recur_count = 0;
             appt.recur_until[0] = '\0';
+/*
+            appt.email_alarm = FALSE;
+            appt.email_attendees = NULL;
+*/
+            appt.alarm_before = TRUE;
+            appt.alarm_related_start = TRUE;
+            appt.availability = -1;
+            appt.soundrepeat_cnt = 500;
+            appt.soundrepeat_len = 2;
+            appt.freq = XFICAL_FREQ_NONE;
             for (i=0; i <= 6; i++) {
                 appt.recur_byday[i] = TRUE;
                 appt.recur_byday_cnt[i] = 0;
@@ -2353,13 +2532,13 @@
                         appt.title = (char *)icalproperty_get_summary(p);
                         break;
                     case ICAL_LOCATION_PROPERTY:
-                        appt.location = (char *) icalproperty_get_location(p);
+                        appt.location = (char *)icalproperty_get_location(p);
                         break;
                     case ICAL_DESCRIPTION_PROPERTY:
                         appt.note = (char *)icalproperty_get_description(p);
                         break;
                     case ICAL_UID_PROPERTY:
-                        appt.uid = (char *) icalproperty_get_uid(p);
+                        appt.uid = (char *)icalproperty_get_uid(p);
                         break;
                     case ICAL_TRANSP_PROPERTY:
                         xf_transp = icalproperty_get_transp(p);
@@ -2390,79 +2569,7 @@
                         appt.duration = icaldurationtype_as_int(duration);
                         break;
                     case ICAL_RRULE_PROPERTY:
-                        rrule = icalproperty_get_rrule(p);
-                        switch (rrule.freq) {
-                            case ICAL_DAILY_RECURRENCE:
-                                appt.freq = XFICAL_FREQ_DAILY;
-                                break;
-                            case ICAL_WEEKLY_RECURRENCE:
-                                appt.freq = XFICAL_FREQ_WEEKLY;
-                                break;
-                            case ICAL_MONTHLY_RECURRENCE:
-                                appt.freq = XFICAL_FREQ_MONTHLY;
-                                break;
-                            case ICAL_YEARLY_RECURRENCE:
-                                appt.freq = XFICAL_FREQ_YEARLY;
-                                break;
-                            default:
-                                appt.freq = XFICAL_FREQ_NONE;
-                                break;
-                        }
-                        if ((appt.recur_count = rrule.count))
-                            appt.recur_limit = 1;
-                        else if(! icaltime_is_null_time(rrule.until)) {
-                            appt.recur_limit = 2;
-                            text  = icaltime_as_ical_string(rrule.until);
-                            g_strlcpy(appt.recur_until, text, 17);
-                        }
-                        if (rrule.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
-                            for (i=0; i <= 6; i++)
-                                appt.recur_byday[i] = FALSE;
-                            for (i=0; i <= 6 && 
-                                 rrule.by_day[i] != ICAL_RECURRENCE_ARRAY_MAX; 
-                                 i++) {
-                                cnt = (int)floor((double)(rrule.by_day[i]/8));
-                                day = abs(rrule.by_day[i]-8*cnt);
-                                switch (day) {
-                                    case ICAL_MONDAY_WEEKDAY:
-                                        appt.recur_byday[0] = TRUE;
-                                        appt.recur_byday_cnt[0] = cnt;
-                                        break;
-                                    case ICAL_TUESDAY_WEEKDAY:
-                                        appt.recur_byday[1] = TRUE;
-                                        appt.recur_byday_cnt[1] = cnt;
-                                        break;
-                                    case ICAL_WEDNESDAY_WEEKDAY:
-                                        appt.recur_byday[2] = TRUE;
-                                        appt.recur_byday_cnt[2] = cnt;
-                                        break;
-                                    case ICAL_THURSDAY_WEEKDAY:
-                                        appt.recur_byday[3] = TRUE;
-                                        appt.recur_byday_cnt[3] = cnt;
-                                        break;
-                                    case ICAL_FRIDAY_WEEKDAY:
-                                        appt.recur_byday[4] = TRUE;
-                                        appt.recur_byday_cnt[4] = cnt;
-                                        break;
-                                    case ICAL_SATURDAY_WEEKDAY:
-                                        appt.recur_byday[5] = TRUE;
-                                        appt.recur_byday_cnt[5] = cnt;
-                                        break;
-                                    case ICAL_SUNDAY_WEEKDAY:
-                                        appt.recur_byday[6] = TRUE;
-                                        appt.recur_byday_cnt[6] = cnt;
-                                        break;
-                                    case ICAL_NO_WEEKDAY:
-                                        break;
-                                    default:
-                                        g_warning(P_N "unknown weekday %s: %d/%d (%x)"
-                                                , ical_uid, rrule.by_day[i]
-                                                , i, rrule.by_day[i]);
-                                        break;
-                                }
-                            }
-                        }
-                        appt.interval = rrule.interval;
+                        ical_appt_get_rrule_internal(c, &appt, p);
                         break;
                     case ICAL_X_PROPERTY:
                         /*
@@ -2482,8 +2589,7 @@
                             etime_found = TRUE;
                             break;
                         }
-                        g_warning(P_N "unknown X property %s"
-                                , (char *)text);
+                        g_warning(P_N "unknown X property %s", (char *)text);
                     case ICAL_PRIORITY_PROPERTY:
                         appt.priority = icalproperty_get_priority(p);
                         break;
@@ -2498,9 +2604,9 @@
                         break;
                 }
             }
-        ical_appt_get_alarm_internal(c, &appt);
+            ical_appt_get_alarm_internal(c, &appt);
         }
-    } 
+    }  /* for loop */
 
     if (key_found) {
     /* need to set missing endtime or duration */
@@ -2515,7 +2621,7 @@
             appt.duration = icaldurationtype_as_int(duration);
             if (appt.allDay && appt.duration) {
         /* need to subtract 1 day.
-         * read explanation from appt_add_internal: appt->endtime processing */
+         * read explanation from appt_add_internal: appt.endtime processing */
                 duration_tmp = icaldurationtype_from_int(60*60*24);
                 appt.duration -= icaldurationtype_as_int(duration_tmp);
                 duration = icaldurationtype_from_int(appt.duration);
@@ -2541,8 +2647,9 @@
         }
         return(&appt);
     }
-    else
+    else {
         return(NULL);
+    }
 }
 
 static void xfical_appt_get_fill_internal(xfical_appt *appt, char *file_type)
@@ -2570,6 +2677,8 @@
             appt->completed_tz_loc = g_strdup("floating");
         appt->note = g_strdup(appt->note);
         appt->sound = g_strdup(appt->sound);
+        appt->procedure_cmd = g_strdup(appt->procedure_cmd);
+        appt->procedure_params = g_strdup(appt->procedure_params);
     }
 }
 
@@ -2589,18 +2698,7 @@
     }
     return(appt);
 }
-/*
-static xfical_appt *xfical_appt_get_archive(char *ical_uid)
-{
-    xfical_appt *appt;
 
-    if ((appt = g_memdup(xfical_appt_get_internal(ical_uid, aical)
-            , sizeof(xfical_appt)))) {
-        xfical_appt_get_fill_internal(appt);
-    }
-    return(appt);
-}
-*/
  /* Read EVENT from ical datafile.
   * ical_uid:  key of ical EVENT appt-> is to be read
   * returns: if failed: NULL
@@ -2645,12 +2743,6 @@
         g_warning(P_N "unknown file type %s", uid);
         return(NULL);
     }
-    /*
-    if ((appt = g_memdup(xfical_appt_get_internal(ical_uid, ical)
-            , sizeof(xfical_appt)))) {
-        xfical_appt_get_fill_internal(appt);
-    }
-    */
     return(appt);
 }
 
@@ -2666,11 +2758,13 @@
     g_free(appt->location);
     g_free(appt->start_tz_loc);
     g_free(appt->end_tz_loc);
+    g_free(appt->completed_tz_loc);
     g_free(appt->note);
     g_free(appt->sound);
+    g_free(appt->procedure_cmd);
+    g_free(appt->procedure_params);
     /*
     g_free(appt->email_attendees);
-    g_free(appt->procedure_cmd);
     */
     g_free(appt);
 }

Modified: xfcalendar/trunk/src/ical-code.h
===================================================================
--- xfcalendar/trunk/src/ical-code.h	2007-06-05 06:38:28 UTC (rev 25784)
+++ xfcalendar/trunk/src/ical-code.h	2007-06-05 20:47:19 UTC (rev 25785)
@@ -44,7 +44,6 @@
 
 typedef struct _xfical_appt
 {
-    gchar *uid; 
     /* note that version 4.5.9 changed uid format.
      * new format starts with 3 char source id (plus separator '.'), 
      * which tells the file where the id is found:
@@ -52,6 +51,7 @@
      * "A01." = Archive file
      * "F10." = Foreign file number 10
      */
+    gchar *uid; 
 
     xfical_type type;
     gchar *title;
@@ -98,10 +98,11 @@
     /*
     gboolean email_alarm;
     gchar *email_attendees;
+    */
 
     gboolean procedure_alarm;
     gchar *procedure_cmd;
-    */
+    gchar *procedure_params;
 
         /* for repeating events cur times show current repeating event.
          * normal times are always the real (=first) start and end times

Modified: xfcalendar/trunk/src/reminder.c
===================================================================
--- xfcalendar/trunk/src/reminder.c	2007-06-05 06:38:28 UTC (rev 25784)
+++ xfcalendar/trunk/src/reminder.c	2007-06-05 20:47:19 UTC (rev 25785)
@@ -132,7 +132,7 @@
         status = orage_exec(alarm->sound->str
                 , &alarm->active_alarm->sound_active, &error);
         if (!status) {
-            g_warning("reminder: play failed (%si)", alarm->sound->str);
+            g_warning("reminder: play failed (%s)", alarm->sound->str);
             alarm->repeat_cnt = 0; /* one warning is enough */
         }
         else if (alarm->repeat_cnt > 0)
@@ -346,12 +346,22 @@
                 , btStopNoiseReminder, GTK_RESPONSE_OK);
         g_signal_connect((gpointer)btStopNoiseReminder, "clicked",
             G_CALLBACK(on_btStopNoiseReminder_clicked), alarm);
-        g_signal_connect(G_OBJECT(wReminder), "destroy",
-            G_CALLBACK(destroy_orage_reminder), alarm);
     }
+    g_signal_connect(G_OBJECT(wReminder), "destroy",
+        G_CALLBACK(destroy_orage_reminder), alarm);
     gtk_widget_show_all(wReminder);
 }
 
+static void create_procedure_reminder(alarm_struct *alarm)
+{
+    gboolean status, active; /* active not used */
+    GError *error = NULL;
+
+    status = orage_exec(alarm->cmd->str, &active, &error);
+    if (!status)
+        g_warning("create_procedure_reminder: cmd failed(%s)", alarm->cmd->str);
+}
+
 void create_reminders(alarm_struct *alarm)
 {
     alarm_struct *n_alarm;
@@ -378,6 +388,8 @@
     if (n_alarm->display
     && (!n_alarm->display_orage && !n_alarm->display_notify))
         n_alarm->display_orage = TRUE;
+    n_alarm->procedure = alarm->procedure;
+    n_alarm->cmd = g_string_new(alarm->cmd->str);
     n_alarm->active_alarm = g_new0(active_alarm_struct, 1);
 
     if (n_alarm->audio)
@@ -386,6 +398,8 @@
         create_orage_reminder(n_alarm);
     if (n_alarm->display_notify)
         create_notify_reminder(n_alarm);
+    if (n_alarm->procedure)
+        create_procedure_reminder(n_alarm);
     /*
     if (alarm->display
     && (!alarm->display_orage && !alarm->display_notify))

Modified: xfcalendar/trunk/src/reminder.h
===================================================================
--- xfcalendar/trunk/src/reminder.h	2007-06-05 06:38:28 UTC (rev 25784)
+++ xfcalendar/trunk/src/reminder.h	2007-06-05 20:47:19 UTC (rev 25785)
@@ -49,9 +49,10 @@
     gint     repeat_cnt;
     gint     repeat_delay;
 
+    gboolean procedure;
+    GString *cmd;
     /*
     gboolean email;
-    gboolean procedure;
     */
     /* this is used to control active alarms */
     active_alarm_struct *active_alarm;



More information about the Xfce4-commits mailing list