On Mon, 2002-04-15 at 18:11, Russell Steinthal wrote:
> Fellow hackers:
> 
> Below, please find a patch to evolution-alarm-notify to add the ability
> to interpolate values into the arguments passed to alarms (currently
> only procedures).  Basically, the user can add certain escape sequences
> (a la printf) to the arguments line for a procedure alarm, and they will
> be replaced by certain values from the appointment structure before
> being passed to the external program.
> 
> As a first pass, the following values are supported:
> 
> %s --- the appointment's Summary
> %d --- the alarm's Description
> %t --- the start time of the appointment as a time_t
> %T --- the start time of the appointment as a ctime (3) value
> 
> It should be fairly simple to add more values if people can suggest (1)
> useful values to allow and (2) intuitive one letter flags for them. :) 
> Similarly, they're currently only implemented for procedure alarms, but
> it's a matter of adding 2-3 lines of code to add them to the mail,
> display, etc. alarms.
> 
> Finally, I'm sure the substitution code is overly hackish, and can be
> cleaned up substantially.  But it seems to work for me.
> 
> I don't know who the appropriate maintainer is for this section of code,
> so I decided to send it here.  If the appropriate person wants to reveal
> himself, I'm happy to take suggested changes, instructions on whether to
> commit, where to send this, etc...

evolution-patches I suppose.  Its usually useful to create a bug to 
track it and attach it there too.

I can't really comment on the calendar interaction code, but the rest of
it looks a little questionable on several fronts.

For example, if the string contains 2 %d's, the second will access a
dereferenced alarm, or if it contains none, then the alarm is leaked (if
i understand the alarm_get/free semantics which appear in other parts of
that file).  Once you start getting user-supplied strings, you have to
assume the data wont be correct.

Using the g_strsplit and g_strjoin stuff is pretty messy - its much
simpler and more robust to just use a g_string with g_string_append_c
etc, and iterate through the source string char by char.  It'll probably
reduce your code by 10% and save executing >50% of what it does now, and
be more readable.

Finally, none of the arguments are escaped when put into the command
line, which might introduce potential problems - but that sort of
depends on how the string is specified & used, etc.

 
> -Russell
> 
> Index: calendar/ChangeLog
> ===================================================================
> RCS file: /cvs/gnome/evolution/calendar/ChangeLog,v
> retrieving revision 1.1356
> diff -u -r1.1356 ChangeLog
> --- calendar/ChangeLog        10 Apr 2002 22:00:45 -0000      1.1356
> +++ calendar/ChangeLog        15 Apr 2002 08:27:34 -0000
> @@ -1,3 +1,10 @@
> +2002-04-15  Russell Steinthal  <[EMAIL PROTECTED]>
> +
> +     * gui/alarm-notify/alarm-queue.c (alarm_replace_strings): New
> +     function to support interpolation of summary, description,
> +     appointment start times into arguments for procedure alarms.
> +     Currently called only from procedure_notification ()
> +
>  2002-04-10  Dan Winship  <[EMAIL PROTECTED]>
>  
>       * gui/gnome-cal.c (gnome_calendar_open): Fix this: Rodrigo's patch
> Index: calendar/gui/alarm-notify/alarm-queue.c
> ===================================================================
> RCS file: /cvs/gnome/evolution/calendar/gui/alarm-notify/alarm-queue.c,v
> retrieving revision 1.21
> diff -u -r1.21 alarm-queue.c
> --- calendar/gui/alarm-notify/alarm-queue.c   14 Jan 2002 01:07:09 -0000      1.21
> +++ calendar/gui/alarm-notify/alarm-queue.c   15 Apr 2002 08:27:44 -0000
> @@ -110,7 +110,7 @@
>  static void audio_notification (time_t trigger, CompQueuedAlarms *cqa, gpointer 
>alarm_id);
>  static void mail_notification (time_t trigger, CompQueuedAlarms *cqa, gpointer 
>alarm_id);
>  static void procedure_notification (time_t trigger, CompQueuedAlarms *cqa, gpointer 
>alarm_id);
> -
> +static gchar* alarm_replace_strings (gchar *str, time_t trigger, CompQueuedAlarms 
>*cqa, gpointer alarm_id);
>  
>  
>  /* Alarm queue engine */
> @@ -793,6 +793,7 @@
>       icalattach *attach;
>       const char *url;
>       char *cmd;
> +     char *subst_cmd;
>       int result;
>  
>       comp = cqa->alarms->comp;
> @@ -825,12 +826,16 @@
>               cmd = (char *) url;
>  
>       result = 0;
> +     
> +     subst_cmd = alarm_replace_strings (cmd, trigger, cqa, alarm_id);
>       if (procedure_notification_dialog (cmd, url))
> -             result = gnome_execute_shell (NULL, cmd);
> +             result = gnome_execute_shell (NULL, subst_cmd);
>       
>       if (cmd != (char *) url)
>               g_free (cmd);
>  
> +     g_free (subst_cmd);
> +
>       icalattach_unref (attach);
>  
>       /* Fall back to display notification if we got an error */
> @@ -1028,4 +1033,77 @@
>       g_free (ca);
>  
>       g_hash_table_remove (client_alarms_hash, client);
> +}
> +
> +static gchar*
> +alarm_replace_strings (gchar *str, time_t trigger, CompQueuedAlarms *cqa, gpointer 
>alarm_id)
> +{
> +     CalComponent *comp;
> +     CalComponentAlarm *alarm;
> +     CalComponentText text;
> +     QueuedAlarm *qa;
> +     
> +     gchar **src_tokens, **dest_tokens;
> +     gchar **src, **dest, *ret;
> +     int num_tokens;
> +
> +     /* Find the alarm structures */
> +     comp  = cqa->alarms->comp;
> +     qa    = lookup_queued_alarm (cqa, alarm_id);
> +     g_assert (qa != NULL);
> +     alarm = cal_component_get_alarm (comp, qa->instance->auid);
> +     g_assert (alarm != NULL);
> +
> +     src_tokens = g_strsplit (str, "%", 0);
> +     src = src_tokens;
> +     num_tokens = 0;
> +     while (*(src++)) {
> +             num_tokens++;
> +     }
> +
> +     dest_tokens = g_new0 (gchar*, num_tokens * 2);
> +
> +     /* The first token can't contain a replacement character */
> +     src = src_tokens;
> +     dest = dest_tokens;
> +     *(dest++) = g_strdup (*(src++));
> +
> +     while (*src) {
> +             switch (**src) {
> +             case 's':
> +                     cal_component_get_summary (comp, &text);
> +                     *(dest++) = g_strdup (text.value ? text.value : _("No 
>description available"));
> +                     *(dest++) = g_strdup (*src+1);
> +                     break;
> +             case 'd':
> +                     cal_component_alarm_get_description (alarm, &text);
> +                     cal_component_alarm_free (alarm);
> +                     *(dest++) = g_strdup (text.value ? text.value : _("No 
>description available"));
> +                     *(dest++) = g_strdup (*src+1);
> +                     break;
> +             case 't':
> +                     *(dest++) = g_strdup_printf ("%ld", 
>qa->instance->occur_start); /* FIXME */
> +                     *(dest++) = g_strdup (*src+1);
> +                     break;
> +             case 'T':
> +                     *(dest++) = g_strdup ((gchar*) ctime 
>(&qa->instance->occur_start)); /* FIXME */
> +                     *(dest++) = g_strdup (*src+1);
> +                     break;
> +             case '\0':
> +                     *(dest++) = g_strdup ("%");
> +                     if (*(src+1) && **(src+1) == '\0')
> +                             src++;
> +                     break;
> +             default:
> +                     *(dest++) = g_strdup (*src+1);
> +                     break;
> +             }
> +             src++;
> +     }
> +     
> +     dest = NULL;
> +     ret = g_strjoinv ("", dest_tokens);
> +     g_strfreev (dest_tokens);
> +     g_strfreev (src_tokens);
> +     return ret;
>  }
> 
> -- 
> Russell Steinthal             Columbia Law School, Class of 2002
> <[EMAIL PROTECTED]>          Columbia College, Class of 1999
> <[EMAIL PROTECTED]>              UNIX System Administrator, nj.org
> 
> _______________________________________________
> evolution-hackers maillist  -  [EMAIL PROTECTED]
> http://lists.ximian.com/mailman/listinfo/evolution-hackers


_______________________________________________
evolution-hackers maillist  -  [EMAIL PROTECTED]
http://lists.ximian.com/mailman/listinfo/evolution-hackers

Reply via email to