[Evolution] How to import tasks/appts non-interactively?
Dan Winship
danw@ximian.com
Fri, 03 Oct 2003 13:38:13 -0400
> Here's the idea I came up with so far. Assume one main Tasks folder and
> one main Calendar folder. Create two maildir folders for messages to
> transform, such as "appts-from-email" and "tasks-from-email". Drag any
> emails you want into those folders. Run my proposed script that reads
> the messages and converts them into vCal/iCal files (perhaps from a rule
> if possible or perhaps from cron every few minutes), and then import
> those into the appropriate Evolution folders. For appointments, set
> them for the current hour, and then let the user move them to the
> appropriate day/time.
Of course, it would be cooler to make an app that creates a window or
panel applet or something, which you can drag messages to and it will
convert them directly. :)
> In Perl, I can handle (and have written) the part of reading the maildir
> folder and transforming the messages into iCal format (extract only the
> plain/text body, etc). Here's where I am stuck: how do I get the iCal
> data into Evolution?
You can't do it easily directly from perl. You'll need to write a C
program and use libcalclient (and beware that you'll have to rewrite it
for Evolution 2.0 because the API will be changing).
The source is in calendar/cal-client/ in the evolution source tree.
There is some documentation in the source files in the form of
gtk-doc-style comments. Basically you'll want to use cal_client_new() to
create a CalClient object, then cal_client_open_default_calendar() or
cal_client_open_default_tasks() to open the default calendar or tasks
folder with that client object. Then use cal_client_update_object() to
create the new appointment/task.
Well, ok, so cal_client_update_object() takes a CalComponent, so you'll
need to use libcal-util as well. There's no function to directly create
a CalComponent from an ical string, so you'll need to first create an
icalcomponent (using icalcomponent_new_from_string() in libical) and
then call cal_component_set_icalcomponent(). Or you could just build up
the CalComponent using the cal_component_set_* functions instead of
creating an icalendar string.
The client-test.c code in calendar/cal-client has some code you can use
as a starting point.
-- Dan