$Id: CHANGES,v 1.24 2005/04/14 22:54:36 ianmacd Exp $


0.4.8
-----

My thanks go to Peter Colijn for the fixes and improvements in this release:

Let CTime::Agenda#delete_event take an optional second argument, namely a
recurrence ID to delete specific instances of a repeating event. This can be a
String or an object that responds to either the getutc or new_offset methods.

Clean up some error checking code (less strcmp).

Many more fixes for working with CAPI v9.


0.4.7
-----

Calling Agenda#get_events would convert its parameters to UTC if they
responded to #gmtime, because #gmtime modifies its arguments in place. This
has been fixed.


0.4.6
-----

Exceptions caused by bad UTF-8 in Event.parse_line are now caught.

Debugging output should go to STDERR, not STDOUT.


0.4.5
-----

My thanks go to Peter Colijn for the fixes and improvements in this release:

CTime::Agenda#Reply has been added. This is experimental and can be used only
when compiled against CAPI v9.

More stringent escaping of Event object strings is now performed.

Many bug fixes and minor code changes for robustness were made.


0.4.4
-----

My thanks go to Peter Colijn for the fixes and improvements in this release:

RECURRENCE-ID is once again handled. Replacing a meeting involves using the
original start time of the meeting as the recurrence ID, even if the start
time is being changed.

Removal of attendees from events was not working properly with CAPI v9. This
feature is unavailable in earlier CAPI versions.


0.4.3
-----

My thanks go to Peter Colijn for the fixes and improvements in this release:

CTime::Agenda#get_event is now implemented for Oracle CAPI v9.

The code that handled RECURRENCE-ID has been removed, as this seemed to result
in the inability to update existing events using their UID and
CTime::Agenda#set_event.

Event objects that defined @attendees now have those attendees set when
creating an event using CAPI v9.

CTime::Agenda::Event#duration_str has been fixed to emit a more clearly defined
string. The previous format specifier was too loose.


0.4.2
-----

@organiser is now an alias of @organizer for Event objects.

Various documentation fixes.


0.4.1
-----

CTime#connect, CTime#open_agenda, CTime::Agenda#get_event and
CTime::Agenda#get_events can now be called with an optional block. For
CTime#connect, the connection is yielded to the block. For CTime#open_agenda,
the agenda is yielded. For CTime::Agenda#get_event and
CTime::Agenda#get_events, each event in the returned array is yielded
separately to the block.


0.4.0
-----

The library has undergone quite a large rewrite to provide a more logical
interface and clean up a lot of the ugly code.

An exception is now thrown when CTime#quit is called multiple times.

A check is now performed to ensure that the parameter passed to
CTime::Agenda#get_event is actually a string.

It's now possible to call CTime.new to instantiate a CTime object without
actually connecting to a server. For compatibility with previous versions, you
can still pass 3 parameters, in which case they will be silently passed to the
new CTime#connect method. CTime#connect returns self.

The CTimeError exception class has been renamed CAPIError. When CTime#connect
raises a a CAPIError, the exception message is now much more specific about
why the connection attempt failed.

When CTime#designate fails, we now raise a DesignationError, not a
CAPIError/CTimeError. We also raise a DesignationError when attempting to
designate to an unknown user. The previous UnknownUserError exception has been
dropped.

CTime objects no longer have @agendas attribute to track open agendas. This is
no longer needed, because CTime#connect returns a CTime::Agenda object.
Logically, this has resulted in the removal of CTime#close_agenda, which has
been replaced by CTime::Agenda#close.

Other methods that logically relate to an agenda but operated on CTime objects
now have a CTime::Agenda object as their receiver. These are
CTime::Agenda#set_event, CTime::Agenda#delete_event, CTime::Agenda#get_event
and CTime::Agenda#get_events.

CTime objects no longer have an @error attribute for tracking the status of
the most recently attempted operation. Instead, an exception will be raised
whenever something bad happens.

CTime objects no longer have a @capabilities attribute. Instead,
CTime#capabilities has been implemented.

A new command line option, -c|--calendar, was added to the mycal example
program for viewing someone else's agenda.


0.3.4
-----

CTime#get_event has now been implemented. This takes a UID and returns an
Array of Event objects associated with that UID.

A new command line option, -i|--ics, was added to the mycal example program
to allow the dumping of events as raw iCalendar data.


0.3.3
-----

When Event objects were initialised, the start_time attribute was not
correctly being converted to UTC when used by CTime#set_event. The end_time
attribute suffered from the same problem, but was not used by CTime#set_event,
making the problem less apparent.

Commas in the location, summary and description attributes of Event objects
are now escaped with a backslash. Otherwise, the server will complain when
passed such an object by CTime#set_event.


0.3.2
-----

Start and end time parameters to CTime#get_events may now be of any class that
responds to the strftime method. The same applies to the start time parameter
passed to Event.new. Previously, each of these parameters could only be a
String.

Start and end time parameters to CTime#get_events are now automatically
converted to UTC, if they respond to either the gmtime or new_offset methods.
The same applies to the start time parameter passed to Event.new.

The example programs have been updated and simplified to reflect these
changes.


0.3.1
-----

Event objects now have a new attribute, @ics, which contains the raw iCalendar
stream for that object.

Fixed UTF-8 to Latin 1 conversion.

Event#inspect is now Event#to_s. Event#inspect has been rewritten to return the
raw iCalendar stream for the associated event.


0.3.0
-----

Ignore alarms when parsing events. Specifically, their description would
overwrite the event's description.

CTime#get_events now takes an optional third parameter. If set to false, the
raw iCal stream will be returned instead of an array of event objects.

Event object values are now converted from UTF-8 to Latin 1.


0.2.3
-----

Event setting was still broken. Sigh...


0.2.2
-----

Fixed the setting of events, which was broken in 0.2.0. Time for some
unit-tests ;-)


0.2.1
-----

Fixed the event parser to handle DATE values. It returns start_time and
end_time at the beginning/end of the day in localtime. Also fixed the case for
a missing end_time, which is actually legal.

Event description and summary are now unescaped during parsing.


0.2.0
-----

Thanks to Kevin McCarthy for most of the work in this release:

Added a compatibility layer to work with different versions of the CAPI.

Wrapped the CAPIHandle object in the Agenda object returned by ct_open_agenda.
The Agenda object should now be passed to close_agenda.

Fixed a bug in close_agenda to pass in a (CAPIHandle *) instead of CAPIHandle.

Eliminated the second fetch attempt (with fewer attributes) in ct_get_events.
The server will return all attributes it can; there's no need to requery.

Created new 'Event' and 'Attendee' classes. Moved iCalendar parsing into the
Event class.


0.1.4
-----

When using Ruby 1.8.0, a warning would be issued when instantiating a
CTime object. This is now avoided.


0.1.3
-----

Ruby/CorporateTime now works with CAPI 2.5.1 from Oracle. Making this work
revealed a nasty bug in previous versions, whereby CAPI_DestroyStreams()
would be called before the event stream had been parsed. This has been
fixed.

CTime#get_events is now back to taking just two parameters. A call to this
method will attempt to fetch the full list of associated properties. If
this is unsuccessful (due to restricted permission on the server), the
underlying C code will make a second call to CAPI_FetchEventsByRange(),
requesting just the start and end times of the event, plus the duration.

CTime::Event objects now have the extra attribute @end. The reason for
this addition is that Oracle has broken backwards compatibility for
CAPI_FetchEventsByRange() in version 2.5 of the CAPI. Calls to previous
versions returned the duration of the event in the DURATION iCalendar
attribute, but the newer version dispenses with DURATION in favour of
DTEND.

As a consequence, CTime#get_events with CAPI 2.5 and later will set @end,
but not @duration, whereas it will set @duration, but not @end with
previous versions. It is hoped to handle this transparently in the future,
so that both @duration and @end are set, regardless of which version of
the CAPI is used.

Note that CTime#set_event is unaffected by this change. @duration should
be set for the object passed to the method, regardless of the version of
the CAPI you are using.

All-day events are now handled a little more gracefully when using the
CTime#get_events method. When an all-day event is found, both @start
and @end will be set to the same value. However, this string does not
contain the usual time specification of 'yyyymmddThhmmssZ', but instead
a simple date specification of 'yyyymmdd'.

It is not yet possible to use CTime#set_event to set an all-day event.

Finally, the calendar stream is printed a little more legibly when
running in debug mode.


0.1.2
-----

CTime#get_events now takes a third parameter, which is a constant that
determines whether a full property list should be obtained for each Event
object. The access level of some events prevents the full property list
from being retrieved. In these cases, CTime::RESTRICTED_PROPERTIES should
be used. In all other cases, CTime::ALL_PROPERTIES is appropriate.


0.1.1
-----

MIME quoted printable strings are now decoded in ct_get_events(), so it's
not necessary to strip '=20' from the end of @summary, @description, etc.
