CVS: sylpheedclaws/plugins/vcalendar/src vcal_folder.c,1.2.2.50,1.2.2.51 vcal_folder.h,1.1.2.6,1.1.2.7 vcal_manager.c,1.1.2.47,1.1.2.48 vcal_manager.h,1.1.2.9,1.1.2.10 vcal_meeting_gtk.c,1.1.2.46,1.1.2.47 vcalendar.c,1.2.2.44,1.2.2.45

[email protected] Wed, 27 Dec 2006 20:46:02 +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-serv11755/src

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

	* src/vcal_folder.c
	* src/vcal_folder.h
	* src/vcal_manager.c
	* src/vcal_manager.h
	* src/vcal_meeting_gtk.c
	* src/vcalendar.c
		Add recurrence support in meetings

Index: vcal_folder.c
===================================================================
RCS file: /pack/anoncvs/sylpheedclaws/plugins/vcalendar/src/vcal_folder.c,v
retrieving revision 1.2.2.50
retrieving revision 1.2.2.51
diff -u -d -r1.2.2.50 -r1.2.2.51
--- vcal_folder.c	2006/11/27 08:24:31	1.2.2.50
+++ vcal_folder.c	2006/12/27 20:45:56	1.2.2.51
@@ -441,6 +441,7 @@
 		item->evtlist = NULL;
 	}
 
+	vcal_folder_block_export(TRUE);
 	while (evt) {
 		icalproperty *prop = icalcomponent_get_first_property(evt, ICAL_UID_PROPERTY);
 		EventTime days;
@@ -498,9 +499,44 @@
 	}
 	*list = item->numlist ? g_slist_copy(item->numlist) : NULL;
 	debug_print("return %d\n", num);
+	vcal_folder_block_export(FALSE);
 	return num;
 }
 
+#define VCAL_FOLDER_ADD_EVENT(event) \
+{ \
+ \
+	if (status == ICAL_PARTSTAT_ACCEPTED \
+	||  status == ICAL_PARTSTAT_TENTATIVE) { \
+		*list = g_slist_append(*list, GINT_TO_POINTER(n_msg)); \
+		debug_print("add %d\n", n_msg); \
+		n_msg++; \
+	} \
+	days = event_to_today(event, 0); \
+ \
+	if (days == EVENT_PAST && past_msg == -1) { \
+		*list = g_slist_append(*list, GINT_TO_POINTER(n_msg)); \
+		past_msg = n_msg++; \
+		g_hash_table_insert(hash_uids, g_strdup_printf("%d", past_msg), g_strdup(EVENT_PAST_ID)); \
+	} else if (days == EVENT_TODAY && today_msg == -1) { \
+		*list = g_slist_append(*list, GINT_TO_POINTER(n_msg)); \
+		today_msg = n_msg++; \
+		g_hash_table_insert(hash_uids, g_strdup_printf("%d", today_msg), g_strdup(EVENT_TODAY_ID)); \
+	} else if (days == EVENT_TOMORROW && tomorrow_msg == -1) { \
+		*list = g_slist_append(*list, GINT_TO_POINTER(n_msg)); \
+		tomorrow_msg = n_msg++; \
+		g_hash_table_insert(hash_uids, g_strdup_printf("%d", tomorrow_msg), g_strdup(EVENT_TOMORROW_ID)); \
+	} else if (days == EVENT_THISWEEK && thisweek_msg == -1) { \
+		*list = g_slist_append(*list, GINT_TO_POINTER(n_msg)); \
+		thisweek_msg = n_msg++; \
+		g_hash_table_insert(hash_uids, g_strdup_printf("%d", thisweek_msg), g_strdup(EVENT_THISWEEK_ID)); \
+	} else if (days == EVENT_LATER && later_msg == -1) { \
+		*list = g_slist_append(*list, GINT_TO_POINTER(n_msg)); \
+		later_msg = n_msg++; \
+		g_hash_table_insert(hash_uids, g_strdup_printf("%d", later_msg), g_strdup(EVENT_LATER_ID)); \
+	} \
+}
+
 static gint vcal_get_num_list(Folder *folder, FolderItem *item,
 				 MsgNumberList ** list, gboolean *old_uids_valid)
 {
@@ -512,7 +548,7 @@
 		thisweek_msg = -1, later_msg = -1;
 
 	debug_print(" num for %s\n", ((VCalFolderItem *)item)->uri);
-		
+	
 	*old_uids_valid = FALSE;
 	
 	if (((VCalFolderItem *)item)->uri) 
@@ -531,7 +567,8 @@
 		
 	hash_uids = g_hash_table_new_full(g_str_hash, g_str_equal,
 					  g_free, g_free);
-					  
+	
+	vcal_folder_block_export(TRUE);	  
 	while ((d = readdir(dp)) != NULL) {
 		VCalEvent *event = NULL;
 		if (d->d_name[0] == '.' || strstr(d->d_name, ".bak")
@@ -544,48 +581,75 @@
 		g_hash_table_insert(hash_uids, snmsg, g_strdup(d->d_name));
 		
 		event = vcal_manager_load_event(d->d_name);
+		if (event->rec_occurence) {
+			vcal_manager_free_event(event);
+			g_unlink(d->d_name);
+			continue;
+		}
 
 		if (event && event->method != ICAL_METHOD_CANCEL) {
-			EventTime days;
-			PrefsAccount *account = vcal_manager_get_account_from_event(event);
-			enum icalparameter_partstat status = ICAL_PARTSTAT_NEEDSACTION;
-			status = account ? vcal_manager_get_reply_for_attendee(event, account->address): ICAL_PARTSTAT_NEEDSACTION;
+			EventTime days; \
+			PrefsAccount *account = vcal_manager_get_account_from_event(event); \
+			enum icalparameter_partstat status = \
+				account ? vcal_manager_get_reply_for_attendee(event, account->address): ICAL_PARTSTAT_NEEDSACTION; \
+			VCAL_FOLDER_ADD_EVENT(event);
+			if (event->recur && strlen(event->recur)) {
+        			struct icalrecurrencetype recur;
+        			struct icaltimetype dtstart;
+        			struct icaltimetype next;
+        			icalrecur_iterator* ritr;
+				time_t duration = (time_t) NULL;
+				struct icaldurationtype ical_dur;
+				int i = 0;
 
-			if (status == ICAL_PARTSTAT_ACCEPTED
-			||  status == ICAL_PARTSTAT_TENTATIVE) {
-				*list = g_slist_append(*list, GINT_TO_POINTER(n_msg));
-				debug_print("add %d:%s\n", n_msg, d->d_name);
-				n_msg++;
-			}
-			days = event_to_today(event, 0);
-			
-			if (days == EVENT_PAST && past_msg == -1) {
-				*list = g_slist_append(*list, GINT_TO_POINTER(n_msg));
-				past_msg = n_msg++;
-				g_hash_table_insert(hash_uids, g_strdup_printf("%d", past_msg), g_strdup(EVENT_PAST_ID));
-			} else if (days == EVENT_TODAY && today_msg == -1) {
-				*list = g_slist_append(*list, GINT_TO_POINTER(n_msg));
-				today_msg = n_msg++;
-				g_hash_table_insert(hash_uids, g_strdup_printf("%d", today_msg), g_strdup(EVENT_TODAY_ID));
-			} else if (days == EVENT_TOMORROW && tomorrow_msg == -1) {
-				*list = g_slist_append(*list, GINT_TO_POINTER(n_msg));
-				tomorrow_msg = n_msg++;
-				g_hash_table_insert(hash_uids, g_strdup_printf("%d", tomorrow_msg), g_strdup(EVENT_TOMORROW_ID));
-			} else if (days == EVENT_THISWEEK && thisweek_msg == -1) {
-				*list = g_slist_append(*list, GINT_TO_POINTER(n_msg));
-				thisweek_msg = n_msg++;
-				g_hash_table_insert(hash_uids, g_strdup_printf("%d", thisweek_msg), g_strdup(EVENT_THISWEEK_ID));
-			} else if (days == EVENT_LATER && later_msg == -1) {
-				*list = g_slist_append(*list, GINT_TO_POINTER(n_msg));
-				later_msg = n_msg++;
-				g_hash_table_insert(hash_uids, g_strdup_printf("%d", later_msg), g_strdup(EVENT_LATER_ID));
+				debug_print("dumping recurring events from main event\n");
+        			recur = icalrecurrencetype_from_string(event->recur);
+				dtstart = icaltime_from_string(event->dtstart);
+
+				duration = icaltime_as_timet(icaltime_from_string(event->dtend))
+							    - icaltime_as_timet(icaltime_from_string(event->dtstart));
+
+				ical_dur = icaldurationtype_from_int(duration);
+
+        			ritr = icalrecur_iterator_new(recur, dtstart);
+
+				next = icalrecur_iterator_next(ritr); /* skip first one */
+				if (!icaltime_is_null_time(next))
+					next = icalrecur_iterator_next(ritr);
+				debug_print("next time is %snull\n", icaltime_is_null_time(next)?"":"not ");
+        			while (!icaltime_is_null_time(next) && i < 100) {
+					gchar *new_start = NULL, *new_end = NULL;
+					VCalEvent *nevent = NULL;
+					gchar *uid = g_strdup_printf("%s-%d", event->uid, i);
+					new_start = icaltime_as_ical_string(next);
+					new_end = icaltime_as_ical_string(
+							icaltime_add(next, ical_dur));
+					debug_print("adding with start/end %s:%s\n", new_start, new_end);
+					nevent = vcal_manager_new_event(uid, event->organizer, event->orgname, 
+								event->summary, event->description, 
+								new_start, new_end, NULL, 
+								event->tzid, event->url, event->method, 
+								event->sequence, event->type);
+					vcal_manager_copy_attendees(event, nevent);
+					nevent->rec_occurence = TRUE;
+					vcal_manager_save_event(nevent);
+					snmsg = g_strdup_printf("%d",n_msg);
+					g_hash_table_insert(hash_uids, snmsg, g_strdup(uid));
+					VCAL_FOLDER_ADD_EVENT(nevent);
+					vcal_manager_free_event(nevent);
+					next = icalrecur_iterator_next(ritr);
+					debug_print("next time is %snull\n", icaltime_is_null_time(next)?"":"not ");
+					i++;
+				}
 			}
 		}
 		if (event)
 			vcal_manager_free_event(event);
+
+
 	}
 	closedir(dp);
-		
+	vcal_folder_block_export(FALSE);
 	return g_slist_length(*list);
 }
 
@@ -728,6 +792,7 @@
 		if (filename) {
 			created_files = g_slist_prepend(created_files, g_strdup(filename));
 		}
+
 		vcal_manager_free_event(event);
 	} 
 
@@ -815,8 +880,18 @@
 	return TRUE;
 }
 
+static gboolean vcal_folder_no_export;
+void vcal_folder_block_export(gboolean block)
+{
+	vcal_folder_no_export = block;
+	if (block == FALSE)
+		vcal_folder_export();
+}
+
 void vcal_folder_export(void)
 {
+	if (vcal_folder_no_export)
+		return;
 	if (vcal_meeting_export_calendar(vcalprefs.export_path, TRUE)) {
 		debug_print("exporting calendar\n");
 		if (vcalprefs.export_enable &&
@@ -1187,7 +1262,7 @@
 	res = curl_easy_perform(curl_ctx);
 	
 	if (res != 0) {
-		printf("res %d %s\n", res, curl_easy_strerror(res));
+		debug_print("res %d %s\n", res, curl_easy_strerror(res));
 		td->error = g_strdup(curl_easy_strerror(res));
 	}
 
@@ -1312,7 +1387,7 @@
 	res = curl_easy_perform(curl_ctx);
 
 	if (res != 0) {
-		printf("res %d %s\n", res, curl_easy_strerror(res));
+		debug_print("res %d %s\n", res, curl_easy_strerror(res));
 	} else {
 		res = TRUE;
 	}

Index: vcal_folder.h
===================================================================
RCS file: /pack/anoncvs/sylpheedclaws/plugins/vcalendar/src/vcal_folder.h,v
retrieving revision 1.1.2.6
retrieving revision 1.1.2.7
diff -u -d -r1.1.2.6 -r1.1.2.7
--- vcal_folder.h	2006/11/07 11:01:47	1.1.2.6
+++ vcal_folder.h	2006/12/27 20:45:56	1.1.2.7
@@ -38,4 +38,5 @@
 	void (*callback)(const gchar *url, gchar *data, gboolean verbose, gchar
 		*error));
 gchar* get_item_event_list_for_date(FolderItem *item, EventTime date);
+void vcal_folder_block_export(gboolean block);
 #endif

Index: vcal_manager.c
===================================================================
RCS file: /pack/anoncvs/sylpheedclaws/plugins/vcalendar/src/vcal_manager.c,v
retrieving revision 1.1.2.47
retrieving revision 1.1.2.48
diff -u -d -r1.1.2.47 -r1.1.2.48
--- vcal_manager.c	2006/12/15 12:22:57	1.1.2.47
+++ vcal_manager.c	2006/12/27 20:45:56	1.1.2.48
@@ -84,6 +84,17 @@
 	return NULL;
 }
 
+void vcal_manager_copy_attendees(VCalEvent *src, VCalEvent *dest)
+{
+	GSList *cur = src->answers;
+	while (cur && cur->data) {
+		Answer *a = (Answer *)cur->data;
+		Answer *b = answer_new(a->attendee, a->name, a->answer, a->cutype);
+		dest->answers = g_slist_append(dest->answers, b);
+		cur = cur->next;
+	}
+}
+
 gchar *vcal_manager_answer_get_text(enum icalparameter_partstat ans) 
 {
 	static gchar *replies[5]={
@@ -247,6 +258,7 @@
 		"event->url\t%s\n"
 		"event->dtstart\t\t%s\n"
 		"event->dtend\t\t%s\n"
+		"event->recur\t\t%s\n"
 		"event->tzid\t\t%s\n"
 		"event->method\t\t%d\n"
 		"event->sequence\t\t%d\n",
@@ -259,6 +271,7 @@
 		event->url,
 		event->dtstart,
 		event->dtend,
+		event->recur,
 		event->tzid,
 		event->method,
 		event->sequence);
@@ -387,6 +400,10 @@
 		icalproperty_vanew_dtstart((icaltime_from_string(event->dtstart)), 0));
 	icalcomponent_add_property(ievent,
 		icalproperty_vanew_dtend((icaltime_from_string(event->dtend)), 0));
+	if (event->recur && strlen(event->recur)) {
+		icalcomponent_add_property(ievent,
+			icalproperty_vanew_rrule((icalrecurrencetype_from_string(event->recur)), 0));
+	}
 	icalcomponent_add_property(ievent,
 		icalproperty_new_description(event->description));
 	icalcomponent_add_property(ievent,
@@ -746,6 +763,7 @@
 					 const gchar	*description,
 					 const gchar	*dtstart,
 					 const gchar	*dtend,
+					 const gchar	*recur,
 					 const gchar	*tzid,
 					 const gchar	*url,
 					 enum icalproperty_method method,
@@ -770,6 +788,7 @@
 	}
 	event->dtstart		= g_strdup(dtstart?dtstart:"");
 	event->dtend		= g_strdup(dtend?dtend:"");
+	event->recur		= g_strdup(recur?recur:"");
 	event->summary		= g_strdup(summary?summary:"");
 	event->description	= g_strdup(description?description:"");
 	event->url		= g_strdup(url?url:"");
@@ -777,6 +796,7 @@
 	event->method		= method;
 	event->sequence		= sequence;
 	event->type		= type;
+	event->rec_occurence		= FALSE;
 	return event;
 }
 					 
@@ -792,6 +812,7 @@
 	g_free(event->summary);
 	g_free(event->dtstart);
 	g_free(event->dtend);
+	g_free(event->recur);
 	g_free(event->tzid);
 	g_free(event->description);
 	g_free(event->url);
@@ -857,6 +878,7 @@
 	xml_tag_add_attr(tag, xml_attr_new("url", event->url));
 	xml_tag_add_attr(tag, xml_attr_new("dtstart", event->dtstart));
 	xml_tag_add_attr(tag, xml_attr_new("dtend", event->dtend));
+	xml_tag_add_attr(tag, xml_attr_new("recur", event->recur));
 	xml_tag_add_attr(tag, xml_attr_new("tzid", event->tzid));
 	
 	/* updating answers saves events, don't save them with reply type */
@@ -879,6 +901,10 @@
 	xml_tag_add_attr(tag, xml_attr_new("postponed", tmp));
 	g_free(tmp);
 	
+	tmp = g_strdup_printf("%lu", event->rec_occurence);
+	xml_tag_add_attr(tag, xml_attr_new("rec_occurence", tmp));
+	g_free(tmp);
+	
 	xmlnode = xml_node_new(tag, NULL);
 	rootnode = g_node_new(xmlnode);
 	
@@ -929,11 +955,12 @@
 	XMLNode *xmlnode;
 	GList *list;
 	gchar *org = NULL, *summary = NULL, *orgname = NULL;
-	gchar *dtstart = NULL, *dtend = NULL, *tzid = NULL, *description = NULL, *url = NULL;
+	gchar *dtstart = NULL, *dtend = NULL, *tzid = NULL;
+	gchar *description = NULL, *url = NULL, *recur = NULL;
 	VCalEvent *event = NULL;
 	enum icalproperty_method method = ICAL_METHOD_REQUEST;
 	enum icalproperty_kind type = ICAL_VEVENT_COMPONENT;
-	gint sequence = 0;
+	gint sequence = 0, rec_occurence = 0;
 	time_t postponed = (time_t)0;
 	
 	g_return_val_if_fail(node->data != NULL, NULL);
@@ -963,6 +990,8 @@
 			dtstart = g_strdup(attr->value);
 		if (!strcmp(attr->name, "dtend"))
 			dtend = g_strdup(attr->value);
+		if (!strcmp(attr->name, "recur"))
+			recur = g_strdup(attr->value);
 		if (!strcmp(attr->name, "tzid"))
 			tzid = g_strdup(attr->value);
 		if (!strcmp(attr->name, "type"))
@@ -973,13 +1002,16 @@
 			sequence = atoi(attr->value);
 		if (!strcmp(attr->name, "postponed"))
 			postponed = atoi(attr->value);
+		if (!strcmp(attr->name, "rec_occurence"))
+			rec_occurence = atoi(attr->value);
 	}
 
 	event = vcal_manager_new_event(uid, org, orgname, summary, description, 
-					dtstart, dtend, tzid, url, method, 
+					dtstart, dtend, recur, tzid, url, method, 
 					sequence, type);
 
 	event->postponed = postponed;
+	event->rec_occurence = rec_occurence;
 
 	g_free(org); 
 	g_free(orgname); 
@@ -988,6 +1020,7 @@
 	g_free(url); 
 	g_free(dtstart); 
 	g_free(dtend);
+	g_free(recur);
 	g_free(tzid);
 
 	node = node->children;
@@ -1395,9 +1428,19 @@
 		}
 	} else if (today.tm_year > evtstart.tm_year) {
 		return EVENT_PAST;
-	} else {
+	} else if (today.tm_year < evtstart.tm_year) {
+		int days = ((365 - today.tm_yday) + evtstart.tm_yday);
+		if (days == 0) {
+			return EVENT_TODAY;
+		} else if (days == 1) {
+			return EVENT_TOMORROW;
+		} else if (days > 1 && days < 7) {
+			return EVENT_THISWEEK;
+		} else {
+			return EVENT_LATER;
+		}
+	} else 
 		return EVENT_LATER;
-	}
 }
 
 const gchar *event_to_today_str(VCalEvent *event, time_t t)

Index: vcal_manager.h
===================================================================
RCS file: /pack/anoncvs/sylpheedclaws/plugins/vcalendar/src/vcal_manager.h,v
retrieving revision 1.1.2.9
retrieving revision 1.1.2.10
diff -u -d -r1.1.2.9 -r1.1.2.10
--- vcal_manager.h	2006/11/07 11:01:48	1.1.2.9
+++ vcal_manager.h	2006/12/27 20:45:57	1.1.2.10
@@ -41,6 +41,7 @@
 	gchar *end;
 	gchar *dtstart;
 	gchar *dtend;
+	gchar *recur;
 	gchar *tzid;
 	gchar *summary;
 	gchar *description;
@@ -50,6 +51,7 @@
 	gchar *url;
 	enum icalproperty_kind type;
 	time_t postponed;
+	gboolean rec_occurence;
 };
 
 typedef enum {
@@ -66,6 +68,7 @@
 					 const gchar	*description,
 					 const gchar	*dtstart,
 					 const gchar	*dtend,
+					 const gchar	*recur,
 					 const gchar	*tzid,
 					 const gchar	*url,
 					 enum icalproperty_method method,
@@ -107,4 +110,5 @@
 void vcal_manager_event_print(VCalEvent *event);
 EventTime event_to_today(VCalEvent *event, time_t t);
 const gchar *event_to_today_str(VCalEvent *event, time_t t);
+void vcal_manager_copy_attendees(VCalEvent *src, VCalEvent *dest);
 #endif

Index: vcal_meeting_gtk.c
===================================================================
RCS file: /pack/anoncvs/sylpheedclaws/plugins/vcalendar/src/vcal_meeting_gtk.c,v
retrieving revision 1.1.2.46
retrieving revision 1.1.2.47
diff -u -d -r1.1.2.46 -r1.1.2.47
--- vcal_meeting_gtk.c	2006/11/07 11:01:48	1.1.2.46
+++ vcal_meeting_gtk.c	2006/12/27 20:45:57	1.1.2.47
@@ -993,7 +993,7 @@
 	description	= get_description(meet);
 	
 	event = vcal_manager_new_event(uid, organizer, organizer_name, summary, description,
-					dtstart, dtend, tzid, NULL, meet->method, 
+					dtstart, dtend, NULL, tzid, NULL, meet->method, 
 					meet->sequence,
 					ICAL_VEVENT_COMPONENT);
 	
@@ -1651,8 +1651,11 @@
 	&& strncmp(file, "https://", 8)
 	&& strncmp(file, "webdav://", 9)
 	&& strncmp(file, "ftp://", 6)) {
-		if (move_file(tmpfile, file, TRUE) != 0)
+		if (move_file(tmpfile, file, TRUE) != 0) {
+			log_error(_("Couldn't export calendar to '%s'\n"),
+				file);
 			res = FALSE;
+		}
 		g_free(file);
 	} else if (file) {
 		FILE *fp = fopen(tmpfile, "rb");
@@ -1931,8 +1934,11 @@
 	&& strncmp(file, "https://", 8)
 	&& strncmp(file, "webdav://", 9)
 	&& strncmp(file, "ftp://", 6)) {
-		if (move_file(tmpfile, file, TRUE) != 0)
+		if (move_file(tmpfile, file, TRUE) != 0) {
+			log_error(_("Couldn't export free/busy to '%s'\n"),
+				file);
 			res = FALSE;
+		}
 		g_free(file);
 	} else if (file) {
 		FILE *fp = fopen(tmpfile, "rb");

Index: vcalendar.c
===================================================================
RCS file: /pack/anoncvs/sylpheedclaws/plugins/vcalendar/src/vcalendar.c,v
retrieving revision 1.2.2.44
retrieving revision 1.2.2.45
diff -u -d -r1.2.2.44 -r1.2.2.45
--- vcalendar.c	2006/12/15 12:22:57	1.2.2.44
+++ vcalendar.c	2006/12/27 20:45:57	1.2.2.45
@@ -420,6 +420,19 @@
 	return account;
 }
 
+static gchar *vcalviewer_get_recurrence(VCalViewer *vcalviewer)
+{
+	gchar *rrule = NULL;
+	icalproperty *iprop = vcalviewer_get_property(vcalviewer, ICAL_RRULE_PROPERTY);
+	if (iprop) {
+		struct icalrecurrencetype recur = icalproperty_get_rrule(iprop);
+		rrule = g_strdup(icalrecurrencetype_as_string(&recur));
+		icalproperty_free(iprop);
+	} 
+	printf("got rrule %s\n", rrule);
+	return rrule;
+}
+
 static gchar *vcalviewer_get_dtstart(VCalViewer *vcalviewer)
 {
 	gchar *dtstart = NULL;
@@ -466,7 +479,7 @@
 	
 	vcalviewer_show_unavailable(vcalviewer, FALSE);
 
-	if (method == ICAL_METHOD_REQUEST) {
+	if (method == ICAL_METHOD_REQUEST && event && !event->rec_occurence) {
 		PrefsAccount *account = get_account_from_attendees(vcalviewer);
 		if (!account && event) {
 			account = account_get_default();
@@ -620,7 +633,21 @@
 	}
 	
 	if (event->start && strlen(event->start)) {
-		GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer->start), event->start);
+		if (event->recur && strlen(event->recur)) {
+			gchar *tmp = g_strdup_printf(_("%s <span weight=\"bold\">(this event recurs)</span>"),
+					event->start);
+			GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer->start), tmp);
+			gtk_label_set_use_markup(GTK_LABEL(vcalviewer->start), TRUE);
+			g_free(tmp);
+		} else if (event->rec_occurence) {
+			gchar *tmp = g_strdup_printf(_("%s <span weight=\"bold\">(this event is part of a recurring event)</span>"),
+					event->start);
+			GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer->start), tmp);
+			gtk_label_set_use_markup(GTK_LABEL(vcalviewer->start), TRUE);
+			g_free(tmp);
+		} else {
+			GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer->start), event->start);
+		}
 	} else {
 		GTK_LABEL_SET_TEXT_TRIMMED(GTK_LABEL(vcalviewer->start), "-");
 	}
@@ -734,6 +761,7 @@
 	icalproperty *iprop = NULL;
 	gchar *org = NULL, *summary = NULL, *description = NULL, *url = NULL;
 	gchar *dtstart = NULL, *dtend = NULL, *tzid = NULL, *orgname = NULL;
+	gchar *recur = NULL;
 	enum icalproperty_method method = ICAL_METHOD_REQUEST;
 	VCalEvent *event = NULL;
 	gchar *tmp;
@@ -821,6 +849,7 @@
 	} 
 	dtstart = vcalviewer_get_dtstart(vcalviewer);
 	dtend = vcalviewer_get_dtend(vcalviewer);
+	recur = vcalviewer_get_recurrence(vcalviewer);
 	
 	iprop = vcalviewer_get_property(vcalviewer, ICAL_TZID_PROPERTY);
 	if (iprop) {
@@ -836,7 +865,7 @@
 	
 	event = vcal_manager_new_event( uid,
 					org, orgname, summary, description, 
-					dtstart, dtend, tzid, url, method, sequence, 
+					dtstart, dtend, recur, tzid, url, method, sequence, 
 					is_todo?ICAL_VTODO_COMPONENT:ICAL_VEVENT_COMPONENT);
 	vcalviewer_get_attendees(vcalviewer, event);
 	if (!saveme || strcmp(saveme,"no"))
@@ -850,6 +879,7 @@
 	g_free(uid);
 	g_free(dtstart);
 	g_free(dtend);
+	g_free(recur);
 	g_free(tzid);
 	vcalviewer_display_event(vcalviewer, event);
 	vcal_manager_free_event(event);