From f40972938df392d245c9b5a910d22243def6f9c5 Mon Sep 17 00:00:00 2001 From: erdgeist Date: Sun, 15 Mar 2009 04:00:40 +0100 Subject: ruby wrapper around libical --- lib/chaos_calendar/extconf.rb | 3 +++ lib/chaos_calendar/gen.sh | 6 +++++ lib/chaos_calendar/ical_occurrences.c | 48 +++++++++++++++++++++++++++++++++++ lib/chaos_calendar/ical_occurrences.i | 6 +++++ 4 files changed, 63 insertions(+) create mode 100644 lib/chaos_calendar/extconf.rb create mode 100644 lib/chaos_calendar/gen.sh create mode 100644 lib/chaos_calendar/ical_occurrences.c create mode 100644 lib/chaos_calendar/ical_occurrences.i (limited to 'lib') diff --git a/lib/chaos_calendar/extconf.rb b/lib/chaos_calendar/extconf.rb new file mode 100644 index 0000000..2eef938 --- /dev/null +++ b/lib/chaos_calendar/extconf.rb @@ -0,0 +1,3 @@ +require 'mkmf' +have_library('ical') +create_makefile('ical_occurrences') diff --git a/lib/chaos_calendar/gen.sh b/lib/chaos_calendar/gen.sh new file mode 100644 index 0000000..2f5351a --- /dev/null +++ b/lib/chaos_calendar/gen.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +rm -f Makefile *.o *wrap.c* +swig -ruby ical_occurrences.i +ruby extconf.rb +make diff --git a/lib/chaos_calendar/ical_occurrences.c b/lib/chaos_calendar/ical_occurrences.c new file mode 100644 index 0000000..2f36d8c --- /dev/null +++ b/lib/chaos_calendar/ical_occurrences.c @@ -0,0 +1,48 @@ +#include +#include + +//#define RRULE "FREQ=MONTHLY;BYMONTH=1,2,3,4,5,6,7,8,9,10,11;BYDAY=-1WE;UNTIL=20091105T220000" +//#define RRULE "FREQ=DAILY;UNTIL=20991111T220000;VFOO" +//#define DTSTART "20000101T010000" + +VALUE occurrences( char *dtstart, char *dtend, char *rrule ) { + VALUE occurr = rb_ary_new(); + + icalerror_clear_errno(); + icalerror_set_error_state( ICAL_MALFORMEDDATA_ERROR, ICAL_ERROR_NONFATAL); + + struct icalrecurrencetype recur = icalrecurrencetype_from_string( rrule ); + if( icalerrno != ICAL_NO_ERROR ) { + printf( "libical error: %i. -- 1\n", icalerrno ); + return occurr; + } + struct icaltimetype start = icaltime_from_string( dtstart ); + if( icalerrno != ICAL_NO_ERROR ) { + printf( "libical error: %i. -- 2\n", icalerrno ); + return occurr; + } + struct icaltimetype end = icaltime_from_string( dtend ); + if( icalerrno != ICAL_NO_ERROR ) { + printf( "libical error: %i. -- 3\n", icalerrno ); + return occurr; + } + + icalrecur_iterator* ritr = icalrecur_iterator_new( recur, start ); + + while(1) { +// char outbuf[1024] = {0}; + struct icaltimetype next = icalrecur_iterator_next(ritr); + + if( icaltime_is_null_time(next) || ( icaltime_compare( next, end ) > 0 ) ) { + icalrecur_iterator_free(ritr); + return occurr; + } + + rb_ary_push( occurr, rb_time_new( icaltime_as_timet( next ), 0 ) ); +// print_datetime_to_string( outbuf, &next ); +// rb_ary_push( occurr, rb_str_new2( outbuf ) ); + }; + + icalrecur_iterator_free(ritr); + return occurr; +} diff --git a/lib/chaos_calendar/ical_occurrences.i b/lib/chaos_calendar/ical_occurrences.i new file mode 100644 index 0000000..5f7efd5 --- /dev/null +++ b/lib/chaos_calendar/ical_occurrences.i @@ -0,0 +1,6 @@ +%module ical_occurrences + +%inline { + VALUE occurrences( char * dtstart, char * dtend, char * rrule ); +} + -- cgit v1.3