diff options
-rw-r--r-- | calendar/ChangeLog | 11 | ||||
-rw-r--r-- | calendar/cal-util/cal-component.c | 16 | ||||
-rw-r--r-- | calendar/cal-util/cal-component.h | 4 | ||||
-rw-r--r-- | calendar/gui/alarm-notify/alarm-queue.c | 406 | ||||
-rw-r--r-- | calendar/gui/dialogs/alarm-options.c | 40 |
5 files changed, 38 insertions, 439 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index fdf6a2d2ef..2db3ecb34d 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,14 @@ +2001-09-10 Federico Mena Quintero <federico@ximian.com> + + * cal-util/cal-component.c (cal_component_alarm_get_attach): + Handle the new icalattach type instead of struct icalattachtype. + (cal_component_alarm_set_attach): Likewise. + + * gui/dialogs/alarm-options.c (alarm_to_aalarm_widgets): Likewise. + (alarm_to_palarm_widgets): Likewise. + (aalarm_widgets_to_alarm): Likewise. + (palarm_widgets_to_alarm): Likewise. + 2001-09-05 Ettore Perazzoli <ettore@ximian.com> [Fix #958, ShellComponents should not be created by factories, for diff --git a/calendar/cal-util/cal-component.c b/calendar/cal-util/cal-component.c index c7800f0456..d74c1238b2 100644 --- a/calendar/cal-util/cal-component.c +++ b/calendar/cal-util/cal-component.c @@ -4573,12 +4573,12 @@ cal_component_alarm_set_action (CalComponentAlarm *alarm, CalAlarmAction action) /** * cal_component_alarm_get_attach: * @alarm: An alarm. - * @attach: Return value for the attachment; should be freed using icalattachtype_free(). + * @attach: Return value for the attachment; should be freed using icalattach_unref(). * * Queries the attachment property of an alarm. **/ void -cal_component_alarm_get_attach (CalComponentAlarm *alarm, struct icalattachtype **attach) +cal_component_alarm_get_attach (CalComponentAlarm *alarm, icalattach **attach) { g_return_if_fail (alarm != NULL); g_return_if_fail (attach != NULL); @@ -4586,12 +4586,8 @@ cal_component_alarm_get_attach (CalComponentAlarm *alarm, struct icalattachtype g_assert (alarm->icalcomp != NULL); if (alarm->attach) { - *attach = icalattachtype_new (); - **attach = icalproperty_get_attach (alarm->attach); - /* FIXME: This is bogus in libical; icalattachtype is supposed - * to be refcounted but the property functions return it by - * value. - */ + *attach = icalproperty_get_attach (alarm->attach); + icalattach_ref (*attach); } else *attach = NULL; } @@ -4604,7 +4600,7 @@ cal_component_alarm_get_attach (CalComponentAlarm *alarm, struct icalattachtype * Sets the attachment property of an alarm. **/ void -cal_component_alarm_set_attach (CalComponentAlarm *alarm, struct icalattachtype *attach) +cal_component_alarm_set_attach (CalComponentAlarm *alarm, icalattach *attach) { g_return_if_fail (alarm != NULL); @@ -4617,7 +4613,7 @@ cal_component_alarm_set_attach (CalComponentAlarm *alarm, struct icalattachtype } if (attach) { - alarm->attach = icalproperty_new_attach (*attach); + alarm->attach = icalproperty_new_attach (attach); icalcomponent_add_property (alarm->icalcomp, alarm->attach); } } diff --git a/calendar/cal-util/cal-component.h b/calendar/cal-util/cal-component.h index b0545397b4..ef38483c68 100644 --- a/calendar/cal-util/cal-component.h +++ b/calendar/cal-util/cal-component.h @@ -437,8 +437,8 @@ const char *cal_component_alarm_get_uid (CalComponentAlarm *alarm); void cal_component_alarm_get_action (CalComponentAlarm *alarm, CalAlarmAction *action); void cal_component_alarm_set_action (CalComponentAlarm *alarm, CalAlarmAction action); -void cal_component_alarm_get_attach (CalComponentAlarm *alarm, struct icalattachtype **attach); -void cal_component_alarm_set_attach (CalComponentAlarm *alarm, struct icalattachtype *attach); +void cal_component_alarm_get_attach (CalComponentAlarm *alarm, icalattach **attach); +void cal_component_alarm_set_attach (CalComponentAlarm *alarm, icalattach *attach); void cal_component_alarm_get_description (CalComponentAlarm *alarm, CalComponentText *description); void cal_component_alarm_set_description (CalComponentAlarm *alarm, CalComponentText *description); diff --git a/calendar/gui/alarm-notify/alarm-queue.c b/calendar/gui/alarm-notify/alarm-queue.c index a2035c8b61..0b093b2a5b 100644 --- a/calendar/gui/alarm-notify/alarm-queue.c +++ b/calendar/gui/alarm-notify/alarm-queue.c @@ -795,409 +795,3 @@ alarm_queue_remove_client (CalClient *client) g_hash_table_remove (client_alarms_hash, client); } - - - -#if 0 - -/* Sends a mail notification of an alarm trigger */ -static void -mail_notification (char *mail_address, char *text, time_t app_time) -{ - pid_t pid; - int p [2]; - char *command; - - pipe (p); - pid = fork (); - if (pid == 0){ - int dev_null; - - dev_null = open ("/dev/null", O_RDWR); - dup2 (p [0], 0); - dup2 (dev_null, 1); - dup2 (dev_null, 2); - execl ("/usr/lib/sendmail", "/usr/lib/sendmail", - mail_address, NULL); - _exit (127); - } - command = g_strconcat ("To: ", mail_address, "\n", - "Subject: ", _("Reminder of your appointment at "), - ctime (&app_time), "\n\n", text, "\n", NULL); - write (p [1], command, strlen (command)); - close (p [1]); - close (p [0]); - g_free (command); -} - -static int -max_open_files (void) -{ - static int files; - - if (files) - return files; - - files = sysconf (_SC_OPEN_MAX); - if (files != -1) - return files; -#ifdef OPEN_MAX - return files = OPEN_MAX; -#else - return files = 256; -#endif -} - -/* Executes a program as a notification of an alarm trigger */ -static void -program_notification (char *command, int close_standard) -{ - struct sigaction ignore, save_intr, save_quit; - int status = 0, i; - pid_t pid; - - ignore.sa_handler = SIG_IGN; - sigemptyset (&ignore.sa_mask); - ignore.sa_flags = 0; - - sigaction (SIGINT, &ignore, &save_intr); - sigaction (SIGQUIT, &ignore, &save_quit); - - if ((pid = fork ()) < 0){ - fprintf (stderr, "\n\nfork () = -1\n"); - return; - } - if (pid == 0){ - pid = fork (); - if (pid == 0){ - const int top = max_open_files (); - sigaction (SIGINT, &save_intr, NULL); - sigaction (SIGQUIT, &save_quit, NULL); - - for (i = (close_standard ? 0 : 3); i < top; i++) - close (i); - - /* FIXME: As an excercise to the reader, copy the - * code from mc to setup shell properly instead of - * /bin/sh. Yes, this comment is larger than a cut and paste. - */ - execl ("/bin/sh", "/bin/sh", "-c", command, (char *) 0); - - _exit (127); - } else { - _exit (127); - } - } - wait (&status); - sigaction (SIGINT, &save_intr, NULL); - sigaction (SIGQUIT, &save_quit, NULL); -} - -/* Queues a snooze alarm */ -static void -snooze (GnomeCalendar *gcal, CalComponent *comp, time_t occur, int snooze_mins, gboolean audio) -{ - time_t now, trigger; - struct tm tm; - CalAlarmInstance ai; - - now = time (NULL); - tm = *localtime (&now); - tm.tm_min += snooze_mins; - - trigger = mktime (&tm); - if (trigger == -1) { - g_message ("snooze(): produced invalid time_t; not queueing alarm!"); - return; - } - -#if 0 - cal_component_get_uid (comp, &ai.uid); - ai.type = audio ? ALARM_AUDIO : ALARM_DISPLAY; -#endif - ai.trigger = trigger; - ai.occur = occur; - - setup_alarm (gcal, &ai); -} - -struct alarm_notify_closure { - GnomeCalendar *gcal; - CalComponent *comp; - time_t occur; -}; - -/* Callback used for the result of the alarm notification dialog */ -static void -display_notification_cb (AlarmNotifyResult result, int snooze_mins, gpointer data) -{ - struct alarm_notify_closure *c; - - c = data; - - switch (result) { - case ALARM_NOTIFY_CLOSE: - break; - - case ALARM_NOTIFY_SNOOZE: - snooze (c->gcal, c->comp, c->occur, snooze_mins, FALSE); - break; - - case ALARM_NOTIFY_EDIT: - gnome_calendar_edit_object (c->gcal, c->comp); - break; - - default: - g_assert_not_reached (); - } - - gtk_object_unref (GTK_OBJECT (c->comp)); - g_free (c); -} - -/* Present a display notification of an alarm trigger */ -static void -display_notification (time_t trigger, time_t occur, CalComponent *comp, GnomeCalendar *gcal) -{ - gboolean result; - struct alarm_notify_closure *c; - - gtk_object_ref (GTK_OBJECT (comp)); - - c = g_new (struct alarm_notify_closure, 1); - c->gcal = gcal; - c->comp = comp; - c->occur = occur; - - result = alarm_notify_dialog (trigger, occur, comp, display_notification_cb, c); - if (!result) { - g_message ("display_notification(): could not display the alarm notification dialog"); - g_free (c); - gtk_object_unref (GTK_OBJECT (comp)); - } -} - -/* Present an audible notification of an alarm trigger */ -static void -audio_notification (time_t trigger, time_t occur, CalComponent *comp, GnomeCalendar *gcal) -{ - g_message ("AUDIO NOTIFICATION!"); - /* FIXME */ -} - -/* Callback function used when an alarm is triggered */ -static void -trigger_alarm_cb (gpointer alarm_id, time_t trigger, gpointer data) -{ - struct trigger_alarm_closure *c; - GnomeCalendarPrivate *priv; - CalComponent *comp; - CalClientGetStatus status; - const char *uid; - ObjectAlarms *oa; - GList *l; - - c = data; - priv = c->gcal->priv; - - /* Fetch the object */ - - status = cal_client_get_object (priv->client, c->uid, &comp); - - switch (status) { - case CAL_CLIENT_GET_SUCCESS: - /* Go on */ - break; - case CAL_CLIENT_GET_SYNTAX_ERROR: - case CAL_CLIENT_GET_NOT_FOUND: - g_message ("trigger_alarm_cb(): syntax error in fetched object"); - return; - } - - g_assert (comp != NULL); - - /* Present notification */ - - switch (c->type) { - case CAL_COMPONENT_ALARM_EMAIL: -#if 0 - g_assert (ico->malarm.enabled); - mail_notification (ico->malarm.data, ico->summary, c->occur); -#endif - break; - - case CAL_COMPONENT_ALARM_PROCEDURE: -#if 0 - g_assert (ico->palarm.enabled); - program_notification (ico->palarm.data, FALSE); -#endif - break; - - case CAL_COMPONENT_ALARM_DISPLAY: -#if 0 - g_assert (ico->dalarm.enabled); -#endif - display_notification (trigger, c->occur, comp, c->gcal); - break; - - case CAL_COMPONENT_ALARM_AUDIO: -#if 0 - g_assert (ico->aalarm.enabled); -#endif - audio_notification (trigger, c->occur, comp, c->gcal); - break; - - default: - break; - } - - /* Remove the alarm from the hash table */ - cal_component_get_uid (comp, &uid); - oa = g_hash_table_lookup (priv->alarms, uid); - g_assert (oa != NULL); - - l = g_list_find (oa->alarm_ids, alarm_id); - g_assert (l != NULL); - - oa->alarm_ids = g_list_remove_link (oa->alarm_ids, l); - g_list_free_1 (l); - - if (!oa->alarm_ids) { - g_hash_table_remove (priv->alarms, uid); - g_free (oa->uid); - g_free (oa); - } - - gtk_object_unref (GTK_OBJECT (comp)); -} - -#endif - -#if 0 - -static void -stop_beeping (GtkObject* object, gpointer data) -{ - guint timer_tag, beep_tag; - timer_tag = GPOINTER_TO_INT (gtk_object_get_data (object, "timer_tag")); - beep_tag = GPOINTER_TO_INT (gtk_object_get_data (object, "beep_tag")); - - if (beep_tag > 0) { - gtk_timeout_remove (beep_tag); - gtk_object_set_data (object, "beep_tag", GINT_TO_POINTER (0)); - } - if (timer_tag > 0) { - gtk_timeout_remove (timer_tag); - gtk_object_set_data (object, "timer_tag", GINT_TO_POINTER (0)); - } -} - -static gint -start_beeping (gpointer data) -{ - gdk_beep (); - - return TRUE; -} - -static gint -timeout_beep (gpointer data) -{ - stop_beeping (data, NULL); - return FALSE; -} - -void -calendar_notify (time_t activation_time, CalendarAlarm *which, void *data) -{ - iCalObject *ico = data; - guint beep_tag, timer_tag; - int ret; - gchar* snooze_button = (enable_snooze ? _("Snooze") : NULL); - time_t now, diff; - - if (&ico->aalarm == which){ - time_t app = ico->aalarm.trigger + ico->aalarm.offset; - GtkWidget *w; - char *msg; - - msg = g_strconcat (_("Reminder of your appointment at "), - ctime (&app), "`", - ico->summary, "'", NULL); - - /* Idea: we need Snooze option :-) */ - w = gnome_message_box_new (msg, GNOME_MESSAGE_BOX_INFO, _("Ok"), snooze_button, NULL); - beep_tag = gtk_timeout_add (1000, start_beeping, NULL); - if (enable_aalarm_timeout) - timer_tag = gtk_timeout_add (audio_alarm_timeout*1000, - timeout_beep, w); - else - timer_tag = 0; - gtk_object_set_data (GTK_OBJECT (w), "timer_tag", - GINT_TO_POINTER (timer_tag)); - gtk_object_set_data (GTK_OBJECT (w), "beep_tag", - GINT_TO_POINTER (beep_tag)); - gtk_widget_ref (w); - gtk_window_set_modal (GTK_WINDOW (w), FALSE); - ret = gnome_dialog_run (GNOME_DIALOG (w)); - switch (ret) { - case 1: - stop_beeping (GTK_OBJECT (w), NULL); - now = time (NULL); - diff = now - which->trigger; - which->trigger = which->trigger + diff + snooze_secs; - which->offset = which->offset - diff - snooze_secs; - alarm_add (which, &calendar_notify, data); - break; - default: - stop_beeping (GTK_OBJECT (w), NULL); - break; - } - - gtk_widget_unref (w); - return; - } - - if (&ico->palarm == which){ - execute (ico->palarm.data, 0); - return; - } - - if (&ico->malarm == which){ - time_t app = ico->malarm.trigger + ico->malarm.offset; - - mail_notify (ico->malarm.data, ico->summary, app); - return; - } - - if (&ico->dalarm == which){ - time_t app = ico->dalarm.trigger + ico->dalarm.offset; - GtkWidget *w; - char *msg; - - if (beep_on_display) - gdk_beep (); - msg = g_strconcat (_("Reminder of your appointment at "), - ctime (&app), "`", - ico->summary, "'", NULL); - w = gnome_message_box_new (msg, GNOME_MESSAGE_BOX_INFO, - _("Ok"), snooze_button, NULL); - gtk_window_set_modal (GTK_WINDOW (w), FALSE); - ret = gnome_dialog_run (GNOME_DIALOG (w)); - switch (ret) { - case 1: - now = time (NULL); - diff = now - which->trigger; - which->trigger = which->trigger + diff + snooze_secs; - which->offset = which->offset - diff - snooze_secs; - alarm_add (which, &calendar_notify, data); - break; - default: - break; - } - - return; - } -} - -#endif diff --git a/calendar/gui/dialogs/alarm-options.c b/calendar/gui/dialogs/alarm-options.c index c1d152c341..1835e8fa9d 100644 --- a/calendar/gui/dialogs/alarm-options.c +++ b/calendar/gui/dialogs/alarm-options.c @@ -205,7 +205,7 @@ init_widgets (Dialog *dialog) static void alarm_to_aalarm_widgets (Dialog *dialog, CalComponentAlarm *alarm) { - struct icalattachtype *attach; + icalattach *attach; char *url; cal_component_alarm_get_attach (alarm, &attach); @@ -219,16 +219,14 @@ alarm_to_aalarm_widgets (Dialog *dialog, CalComponentAlarm *alarm) url = NULL; - if (icalattachtype_get_base64 (attach)) - g_message ("alarm_to_aalarm_widgets(): FIXME: we don't support base64 data yet"); - else if (icalattachtype_get_binary (attach)) - g_message ("alarm_to_aalarm_widgets(): FIXME: we don't support binary data yet"); + if (icalattach_get_is_url (attach)) + url = icalattach_get_url (attach); else - url = icalattachtype_get_url (attach); + g_message ("alarm_to_aalarm_widgets(): FIXME: we don't support inline data yet"); e_dialog_editable_set (dialog->aalarm_attach, url); - icalattachtype_free (attach); + icalattach_unref (attach); } /* Fills the display alarm widgets with the values from the alarm component */ @@ -253,7 +251,7 @@ alarm_to_malarm_widgets (Dialog *dialog, CalComponentAlarm *alarm) static void alarm_to_palarm_widgets (Dialog *dialog, CalComponentAlarm *alarm) { - struct icalattachtype *attach; + icalattach *attach; CalComponentText description; cal_component_alarm_get_attach (alarm, &attach); @@ -262,10 +260,14 @@ alarm_to_palarm_widgets (Dialog *dialog, CalComponentAlarm *alarm) if (attach) { char *url; - url = icalattachtype_get_url (attach); - e_dialog_editable_set (dialog->palarm_program, url); + if (icalattach_get_is_url (attach)) { + url = icalattach_get_url (attach); + e_dialog_editable_set (dialog->palarm_program, url); + } else + g_message ("alarm_to_palarm_widgets(): Don't know what to do with non-URL " + "attachments"); - icalattachtype_free (attach); + icalattach_unref (attach); } e_dialog_editable_set (dialog->palarm_args, description.value); @@ -443,16 +445,14 @@ static void aalarm_widgets_to_alarm (Dialog *dialog, CalComponentAlarm *alarm) { char *url; - struct icalattachtype *attach; - - attach = icalattachtype_new (); + icalattach *attach; url = e_dialog_editable_get (dialog->aalarm_attach); - icalattachtype_set_url (attach, url ? url : ""); + attach = icalattach_new_from_url (url ? url : ""); g_free (url); cal_component_alarm_set_attach (alarm, attach); - icalattachtype_free (attach); + icalattach_unref (attach); } /* Fills the display alarm data with the values from the widgets */ @@ -482,18 +482,16 @@ static void palarm_widgets_to_alarm (Dialog *dialog, CalComponentAlarm *alarm) { char *program; - struct icalattachtype *attach; + icalattach *attach; char *str; CalComponentText description; - attach = icalattachtype_new (); - program = e_dialog_editable_get (dialog->palarm_program); - icalattachtype_set_url (attach, program ? program : ""); + attach = icalattach_new_from_url (program ? program : ""); g_free (program); cal_component_alarm_set_attach (alarm, attach); - icalattachtype_free (attach); + icalattach_unref (attach); str = e_dialog_editable_get (dialog->palarm_args); description.value = str; |