Here's a library which encapsulates all the peculiarities in outlook's
handling of calendar entries. Outlook wont display a calendar entry even if
it's legal ICAL format, unless certain arbitrary random items are done just
right. This library also completely hides the libimap routines so
that it doesn't need to be imported to access an outlook calendar. the ical
library will have to be imported with this in order to do any useful work, as
I didn't bother to make program stubs for the hundreds of functions.

This package contains a modified version of the python libical, Mostly I fixed
errors in the .py files, and worked around a reported bug in the python SWIG
program. My version might be rolled into one of the future libical program.

Here's an example of a python program fragment for creating a new calendar
entry that outlook will recognize:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
from schedule_calendar import *
from ical import *

server = "tayexc19.americas.cpqcorp.net"
user   = "reynoldsn"
passwd = "Dont be silly"

mycal = schedule_calendar(server, user, passwd)
mycal.load()

newuid, newevent  = mycal.new_entry(ICAL_VEVENT_COMPONENT)

icalevent_add_dtstamp(newevent)      #2nd parameter can explicitly set time,
				     #without this it uses the current time
icalevent_add_dtstart(newevent, time.time() + 7*24*60*60)
icalevent_add_dtend(newevent,   time.time() + (7*24+2)*60*60)
icalevent_add_uid(newevent)          #2nd parameter can explicitly set UID
icalevent_add_organizer(newevent, 'Neil.Reynolds@hp.com', 'Reynolds, Neil')
icalevent_add_description(newevent, 
    "This is the long, drawn out data string that is supposed \nto explain every thing about the meeting, but doesn't quite manage to.")
icalevent_add_summary(newevent, "Meeting Name")
icalevent_add_sequence(newevent)

newuid = mycal.sync_entry(newuid)
mycal.free()     
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
libical already handles the memory management for messages, and all messages
are passed by reference. My routines behave the same way, so after modifying
the event, there is no routine needed for pushing an event back into mycal. In
the above code newevent behaves like a pointer to a libical managed struct, in
the language C.

The line "newuid = mycal.sync_entry(newuid)" pushes a message from the local
program to the server. The message is still contained on the local program,
but the number that refers to it (the uid) has changed, since the server
assigns a new one, and the local program mirrors this.

In the above code, newevent is a libical item, and can be modified by any of
the libical functions. However it is easy to make an event that outlook
refuses to display.
