CVS: sylpheedclaws/plugins/vcalendar/src vcal_folder.c,1.2.2.51,1.2.2.52 vcal_manager.c,1.1.2.48,1.1.2.49 vcalendar.c,1.2.2.45,1.2.2.46

[email protected] Wed, 27 Dec 2006 22:06:23 +0000
Newsgroups gmane.mail.sylpheed.claws.cvs
Message-ID <[email protected]>
Update of /pack/anoncvs/sylpheedclaws/plugins/vcalendar/src
In directory sunsite.dk:/tmp/cvs-serv29937/src

Modified Files:
      Tag: gtk2
	vcal_folder.c vcal_manager.c vcalendar.c 
Log Message:
2006-12-27 [colin]	1.91.0cvs7

	* src/vcal_folder.c
	* src/vcal_manager.c
	* src/vcalendar.c
		Add recurrence support to webcal feeds

Index: vcal_folder.c
===================================================================
RCS file: /pack/anoncvs/sylpheedclaws/plugins/vcalendar/src/vcal_folder.c,v
retrieving revision 1.2.2.51
retrieving revision 1.2.2.52
diff -u -d -r1.2.2.51 -r1.2.2.52
--- vcal_folder.c	2006/12/27 20:45:56	1.2.2.51
+++ vcal_folder.c	2006/12/27 22:06:19	1.2.2.52
@@ -443,18 +443,41 @@
 
 	vcal_folder_block_export(TRUE);
 	while (evt) {
-		icalproperty *prop = icalcomponent_get_first_property(evt, ICAL_UID_PROPERTY);
+		icalproperty *prop;
+		icalproperty *rprop = icalcomponent_get_first_property(evt, ICAL_RRULE_PROPERTY);
+		struct icalrecurrencetype recur;
+        	struct icaltimetype next;
+        	icalrecur_iterator* ritr;
 		EventTime days;
+
+		if (rprop) {
+			icalproperty *rprop2;
+			recur = icalproperty_get_rrule(rprop);
+			rprop2 = icalproperty_new_rrule(recur);
+			prop = icalcomponent_get_first_property(evt, ICAL_DTSTART_PROPERTY);
+			if (prop) {
+        			ritr = icalrecur_iterator_new(recur, icalproperty_get_dtstart(prop));
+				next = icalrecur_iterator_next(ritr); /* skip first one */				
+			}
+			
+			rprop = rprop2;
+		} 
+
+		prop = icalcomponent_get_first_property(evt, ICAL_UID_PROPERTY);
 		if (prop) {
+			gchar *orig_uid = NULL;
 			gchar *uid = g_strdup(icalproperty_get_uid(prop));
 			IcalFeedData *data = icalfeeddata_new(evt, NULL);
+			int i = 0;
+			orig_uid = g_strdup(uid);
+
+add_new:			
 			item->numlist = g_slist_append(item->numlist, GINT_TO_POINTER(num));
 			item->evtlist = g_slist_append(item->evtlist, data);
 			data = NULL;
 			debug_print("add %d : %s\n", num, uid);
 			g_free(uid);
 			num++;
-			
 			prop = icalcomponent_get_first_property(evt, ICAL_DTSTART_PROPERTY);
 			if (prop) {
 				struct icaltimetype itt = icalproperty_get_dtstart(prop);
@@ -491,9 +514,44 @@
 				item->evtlist = g_slist_append(item->evtlist, data);
 				data = NULL;
 			}
+			if (rprop) {
+				struct icaldurationtype ical_dur;
+				struct icaltimetype dtstart, dtend;
+				evt = icalcomponent_new_clone(evt);
+				prop = icalcomponent_get_first_property(evt, ICAL_RRULE_PROPERTY);
+				if (prop)
+					icalcomponent_remove_property(evt, prop);
+				prop = icalcomponent_get_first_property(evt, ICAL_DTSTART_PROPERTY);
+				if (prop)
+					dtstart = icalproperty_get_dtstart(prop);
+				prop = icalcomponent_get_first_property(evt, ICAL_DTEND_PROPERTY);
+				if (prop)
+					dtend = icalproperty_get_dtend(prop);
+				ical_dur = icaltime_subtract(dtend, dtstart);
+				next = icalrecur_iterator_next(ritr); 
+				if (!icaltime_is_null_time(next) &&
+				    !icaltime_is_null_time(dtstart) && i < 100) {
+					prop = icalcomponent_get_first_property(evt, ICAL_DTSTART_PROPERTY);
+					icalproperty_set_dtstart(prop, next);
+
+					prop = icalcomponent_get_first_property(evt, ICAL_DTEND_PROPERTY);
+					if (prop)
+						icalproperty_set_dtend(prop, icaltime_add(next, ical_dur));
+
+					prop = icalcomponent_get_first_property(evt, ICAL_UID_PROPERTY);
+					uid = g_strdup_printf("%s-%d", orig_uid, i);
+					icalproperty_set_uid(prop, uid);
+					data = icalfeeddata_new(evt, NULL);
+					i++;
+					goto add_new;
+				} 
+			}
+			g_free(orig_uid);
 		} else {
 			debug_print("no uid!\n");
 		}
+		if (rprop)
+			icalproperty_free(rprop);
 		evt = icalcomponent_get_next_component(
 			item->cal, type);
 	}

Index: vcal_manager.c
===================================================================
RCS file: /pack/anoncvs/sylpheedclaws/plugins/vcalendar/src/vcal_manager.c,v
retrieving revision 1.1.2.48
retrieving revision 1.1.2.49
diff -u -d -r1.1.2.48 -r1.1.2.49
--- vcal_manager.c	2006/12/27 20:45:56	1.1.2.48
+++ vcal_manager.c	2006/12/27 22:06:19	1.1.2.49
@@ -1428,7 +1428,7 @@
 		}
 	} else if (today.tm_year > evtstart.tm_year) {
 		return EVENT_PAST;
-	} else if (today.tm_year < evtstart.tm_year) {
+	} else if (today.tm_year == evtstart.tm_year - 1) {
 		int days = ((365 - today.tm_yday) + evtstart.tm_yday);
 		if (days == 0) {
 			return EVENT_TODAY;

Index: vcalendar.c
===================================================================
RCS file: /pack/anoncvs/sylpheedclaws/plugins/vcalendar/src/vcalendar.c,v
retrieving revision 1.2.2.45
retrieving revision 1.2.2.46
diff -u -d -r1.2.2.45 -r1.2.2.46
--- vcalendar.c	2006/12/27 20:45:57	1.2.2.45
+++ vcalendar.c	2006/12/27 22:06:19	1.2.2.46
@@ -429,7 +429,6 @@
 		rrule = g_strdup(icalrecurrencetype_as_string(&recur));
 		icalproperty_free(iprop);
 	} 
-	printf("got rrule %s\n", rrule);
 	return rrule;
 }
 
@@ -453,7 +452,20 @@
 		struct icaltimetype itt = icalproperty_get_dtend(iprop);
 		dtend = g_strdup(icaltime_as_ical_string(itt));
 		icalproperty_free(iprop);
-	} 
+	} else {
+		iprop = vcalviewer_get_property(vcalviewer, ICAL_DURATION_PROPERTY);
+		if (iprop) {
+			struct icaldurationtype duration = icalproperty_get_duration(iprop);
+			struct icaltimetype itt;
+			icalproperty_free(iprop);
+			iprop = vcalviewer_get_property(vcalviewer, ICAL_DTSTART_PROPERTY);
+			itt = icalproperty_get_dtstart(iprop);
+			if (iprop) {
+				icalproperty_free(iprop);
+				dtend = g_strdup(icaltime_as_ical_string(icaltime_add(itt,duration)));
+			}
+		}
+	}
 	return dtend;
 }