[asterisk-commits] pitel: trunk r284851 - in /trunk: ./ include/asterisk/ res/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Sep 3 07:58:57 CDT 2010


Author: pitel
Date: Fri Sep  3 07:58:52 2010
New Revision: 284851

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=284851
Log:
Support for calendar events priorities and categories (with ISO C90 fix)

See RFC 5545 ch. 3.8.1.2 and 9.

(closes issue #17837)
Review: https://reviewboard.asterisk.org/r/880/

Modified:
    trunk/   (props changed)
    trunk/include/asterisk/calendar.h
    trunk/res/res_calendar.c
    trunk/res/res_calendar_caldav.c
    trunk/res/res_calendar_ews.c
    trunk/res/res_calendar_icalendar.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.

Modified: trunk/include/asterisk/calendar.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/calendar.h?view=diff&rev=284851&r1=284850&r2=284851
==============================================================================
--- trunk/include/asterisk/calendar.h (original)
+++ trunk/include/asterisk/calendar.h Fri Sep  3 07:58:52 2010
@@ -95,7 +95,9 @@
 		AST_STRING_FIELD(organizer);
 		AST_STRING_FIELD(location);
 		AST_STRING_FIELD(uid);
+		AST_STRING_FIELD(categories);
 	);
+	int priority;        /*!< Priority of event */
 	struct ast_calendar *owner;   /*!< The calendar that owns this event */
 	time_t start;        /*!< Start of event (UTC) */
 	time_t end;          /*!< End of event (UTC) */

Modified: trunk/res/res_calendar.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_calendar.c?view=diff&rev=284851&r1=284850&r2=284851
==============================================================================
--- trunk/res/res_calendar.c (original)
+++ trunk/res/res_calendar.c Fri Sep  3 07:58:52 2010
@@ -65,6 +65,8 @@
 					<enum name="description"><para>The text description of the event</para></enum>
 					<enum name="organizer"><para>The organizer of the event</para></enum>
 					<enum name="location"><para>The location of the eventt</para></enum>
+					<enum name="categories"><para>The categories of the event</para></enum>
+					<enum name="priority"><para>The priority of the event</para></enum>
 					<enum name="calendar"><para>The name of the calendar associated with the event</para></enum>
 					<enum name="uid"><para>The unique identifier for this event</para></enum>
 					<enum name="start"><para>The start time of the event</para></enum>
@@ -112,6 +114,8 @@
 					<enum name="description"><para>The full event description</para></enum>
 					<enum name="organizer"><para>The event organizer</para></enum>
 					<enum name="location"><para>The event location</para></enum>
+					<enum name="categories"><para>The categories of the event</para></enum>
+					<enum name="priority"><para>The priority of the event</para></enum>
 					<enum name="calendar"><para>The name of the calendar associted with the event</para></enum>
 					<enum name="uid"><para>The unique identifier for the event</para></enum>
 					<enum name="start"><para>The start time of the event (in seconds since epoch)</para></enum>
@@ -142,6 +146,8 @@
 					<enum name="description"><para>The full event description</para></enum>
 					<enum name="organizer"><para>The event organizer</para></enum>
 					<enum name="location"><para>The event location</para></enum>
+					<enum name="categories"><para>The categories of the event</para></enum>
+					<enum name="priority"><para>The priority of the event</para></enum>
 					<enum name="uid"><para>The unique identifier for the event</para></enum>
 					<enum name="start"><para>The start time of the event (in seconds since epoch)</para></enum>
 					<enum name="end"><para>The end time of the event (in seconds since epoch)</para></enum>
@@ -786,6 +792,8 @@
 	ast_string_field_set(dst, organizer, src->organizer);
 	ast_string_field_set(dst, location, src->location);
 	ast_string_field_set(dst, uid, src->uid);
+	ast_string_field_set(dst, categories, src->categories);
+	dst->priority = src->priority;
 	dst->owner = src->owner;
 	dst->start = src->start;
 	dst->end = src->end;
@@ -1228,6 +1236,10 @@
 			ast_copy_string(buf, entry->event->organizer, len);
 		} else if (!strcasecmp(args.field, "location")) {
 			ast_copy_string(buf, entry->event->location, len);
+		} else if (!strcasecmp(args.field, "categories")) {
+			ast_copy_string(buf, entry->event->categories, len);
+		} else if (!strcasecmp(args.field, "priority")) {
+			snprintf(buf, len, "%d", entry->event->priority);
 		} else if (!strcasecmp(args.field, "calendar")) {
 			ast_copy_string(buf, entry->event->owner->name, len);
 		} else if (!strcasecmp(args.field, "uid")) {
@@ -1313,6 +1325,10 @@
 			ast_string_field_set(event, organizer, values.value[j]);
 		} else if (!strcasecmp(fields.field[i], "location")) {
 			ast_string_field_set(event, location, values.value[j]);
+		} else if (!strcasecmp(fields.field[i], "categories")) {
+			ast_string_field_set(event, categories, values.value[j]);
+		} else if (!strcasecmp(fields.field[i], "priority")) {
+			event->priority = atoi(values.value[j]);
 		} else if (!strcasecmp(fields.field[i], "uid")) {
 			ast_string_field_set(event, uid, values.value[j]);
 		} else if (!strcasecmp(fields.field[i], "start")) {
@@ -1468,6 +1484,8 @@
 		ast_cli(a->fd, FORMAT2, "Description", event->description);
 		ast_cli(a->fd, FORMAT2, "Organizer", event->organizer);
 		ast_cli(a->fd, FORMAT2, "Location", event->location);
+		ast_cli(a->fd, FORMAT2, "Cartegories", event->categories);
+		ast_cli(a->fd, "%-12.12s: %d\n", "Priority", event->priority);
 		ast_cli(a->fd, FORMAT2, "UID", event->uid);
 		ast_cli(a->fd, FORMAT2, "Start", epoch_to_string(buf, sizeof(buf), event->start));
 		ast_cli(a->fd, FORMAT2, "End", epoch_to_string(buf, sizeof(buf), event->end));
@@ -1539,6 +1557,10 @@
 		ast_copy_string(buf, event->organizer, len);
 	} else if (!strcasecmp(data, "location")) {
 		ast_copy_string(buf, event->location, len);
+	} else if (!strcasecmp(data, "categories")) {
+		ast_copy_string(buf, event->categories, len);
+	} else if (!strcasecmp(data, "priority")) {
+		snprintf(buf, len, "%d", event->priority);
 	} else if (!strcasecmp(data, "calendar")) {
 		ast_copy_string(buf, event->owner->name, len);
 	} else if (!strcasecmp(data, "uid")) {

Modified: trunk/res/res_calendar_caldav.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_calendar_caldav.c?view=diff&rev=284851&r1=284850&r2=284851
==============================================================================
--- trunk/res/res_calendar_caldav.c (original)
+++ trunk/res/res_calendar_caldav.c Fri Sep  3 07:58:52 2010
@@ -215,6 +215,12 @@
 	}
 	if (!ast_strlen_zero(event->location)) {
 		icalcomponent_add_property(icalevent, icalproperty_new_location(event->location));
+	}
+	if (!ast_strlen_zero(event->categories)) {
+		icalcomponent_add_property(icalevent, icalproperty_new_categories(event->categories));
+	}
+	if (event->priority > 0) {
+		icalcomponent_add_property(icalevent, icalproperty_new_priority(event->priority));
 	}
 
 	switch (event->busy_state) {
@@ -365,6 +371,14 @@
 		ast_string_field_set(event, location, icalproperty_get_value_as_string(prop));
 	}
 
+	if ((prop = icalcomponent_get_first_property(comp, ICAL_CATEGORIES_PROPERTY))) {
+		ast_string_field_set(event, categories, icalproperty_get_value_as_string(prop));
+	}
+
+	if ((prop = icalcomponent_get_first_property(comp, ICAL_PRIORITY_PROPERTY))) {
+		event->priority = icalvalue_get_integer(icalproperty_get_value(prop));
+	}
+
 	if ((prop = icalcomponent_get_first_property(comp, ICAL_UID_PROPERTY))) {
 		ast_string_field_set(event, uid, icalproperty_get_value_as_string(prop));
 	} else {

Modified: trunk/res/res_calendar_ews.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_calendar_ews.c?view=diff&rev=284851&r1=284850&r2=284851
==============================================================================
--- trunk/res/res_calendar_ews.c (original)
+++ trunk/res/res_calendar_ews.c Fri Sep  3 07:58:52 2010
@@ -87,6 +87,9 @@
 	XML_EVENT_ATTENDEE,
 	XML_EVENT_MAILBOX,
 	XML_EVENT_EMAIL_ADDRESS,
+	XML_EVENT_CATEGORIES,
+	XML_EVENT_CATEGORY,
+	XML_EVENT_IMPORTANCE,
 };
 
 struct ewscal_pvt {
@@ -271,6 +274,23 @@
 		}
 		ast_str_reset(ctx->cdata);
 		return XML_EVENT_LOCATION;
+	} else if (!strcmp(name, "Categories")) {
+		/* Event categories */
+		if (!ctx->cdata) {
+			return NE_XML_ABORT;
+		}
+		ast_str_reset(ctx->cdata);
+		return XML_EVENT_CATEGORIES;
+	} else if (parent == XML_EVENT_CATEGORIES && !strcmp(name, "String")) {
+		/* Event category */
+		return XML_EVENT_CATEGORY;
+	} else if (!strcmp(name, "Importance")) {
+		/* Event importance (priority) */
+		if (!ctx->cdata) {
+			return NE_XML_ABORT;
+		}
+		ast_str_reset(ctx->cdata);
+		return XML_EVENT_IMPORTANCE;
 	} else if (!strcmp(name, "RequiredAttendees") || !strcmp(name, "OptionalAttendees")) {
 		return XML_EVENT_ATTENDEE_LIST;
 	} else if (!strcmp(name, "Attendee") && parent == XML_EVENT_ATTENDEE_LIST) {
@@ -331,6 +351,13 @@
 			ctx->event->busy_state = AST_CALENDAR_BS_FREE;
 		}
 		break;
+	case XML_EVENT_CATEGORY:
+		if (ast_str_strlen(ctx->cdata) == 0) {
+			ast_str_set(&ctx->cdata, 0, "%s", data);
+		} else {
+			ast_str_append(&ctx->cdata, 0, ",%s", data);
+		}
+		break;
 	default:
 		ast_str_append(&ctx->cdata, 0, "%s", data);
 	}
@@ -363,6 +390,22 @@
 		/* Event location end */
 		ast_string_field_set(ctx->event, location, ast_str_buffer(ctx->cdata));
 		ast_debug(3, "EWS: XML: Location: %s\n", ctx->event->location);
+		ast_str_reset(ctx->cdata);
+	} else if (!strcmp(name, "Categories")) {
+		/* Event categories end */
+		ast_string_field_set(ctx->event, categories, ast_str_buffer(ctx->cdata));
+		ast_debug(3, "EWS: XML: Categories: %s\n", ctx->event->categories);
+		ast_str_reset(ctx->cdata);
+	} else if (!strcmp(name, "Importance")) {
+		/* Event importance end */
+		if (!strcmp(ast_str_buffer(ctx->cdata), "Low")) {
+			ctx->event->priority = 9;
+		} else if (!strcmp(ast_str_buffer(ctx->cdata), "Normal")) {
+			ctx->event->priority = 5;
+		} else if (!strcmp(ast_str_buffer(ctx->cdata), "High")) {
+			ctx->event->priority = 1;
+		}
+		ast_debug(3, "EWS: XML: Importance: %s (%d)\n", ast_str_buffer(ctx->cdata), ctx->event->priority);
 		ast_str_reset(ctx->cdata);
 	} else if (state == XML_EVENT_EMAIL_ADDRESS) {
 		struct ast_calendar_attendee *attendee;
@@ -501,6 +544,7 @@
 		.pvt = pvt,
 	};
 	int ret;
+	char *category, *categories;
 
 	if (!pvt) {
 		return -1;
@@ -531,12 +575,7 @@
 						"<End>%s</End>"
 						"<IsAllDayEvent>false</IsAllDayEvent>"
 						"<LegacyFreeBusyStatus>%s</LegacyFreeBusyStatus>"
-						"<Location>%s</Location>"
-					"</t:CalendarItem>"
-				"</Items>"
-			"</CreateItem>"
-		"</soap:Body>"
-		"</soap:Envelope>",
+						"<Location>%s</Location>",
 		event->summary,
 		event->description,
 		mstime(event->start, start, sizeof(start)),
@@ -544,6 +583,37 @@
 		msstatus(event->busy_state),
 		event->location
 	);
+	/* Event priority */
+	switch (event->priority) {
+	case 1:
+	case 2:
+	case 3:
+	case 4:
+		ast_str_append(&request, 0, "<Importance>High</Importance>");
+		break;
+	case 5:
+		ast_str_append(&request, 0, "<Importance>Normal</Importance>");
+		break;
+	case 6:
+	case 7:
+	case 8:
+	case 9:
+		ast_str_append(&request, 0, "<Importance>Low</Importance>");
+		break;
+	}
+	/* Event categories*/
+	if (strlen(event->categories) > 0) {
+		ast_str_append(&request, 0, "<Categories>");
+		categories = strdupa(event->categories);	/* Duplicate string, since strsep() is destructive */
+		category = strsep(&categories, ",");
+		while (category != NULL) {
+			ast_str_append(&request, 0, "<String>%s</String>", category);
+			category = strsep(&categories, ",");
+		}
+		ast_str_append(&request, 0, "</Categories>");
+	}
+	/* Finish request */
+	ast_str_append(&request, 0, "</t:CalendarItem></Items></CreateItem></soap:Body></soap:Envelope>");
 
 	ret = send_ews_request_and_parse(request, &ctx);
 

Modified: trunk/res/res_calendar_icalendar.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_calendar_icalendar.c?view=diff&rev=284851&r1=284850&r2=284851
==============================================================================
--- trunk/res/res_calendar_icalendar.c (original)
+++ trunk/res/res_calendar_icalendar.c Fri Sep  3 07:58:52 2010
@@ -224,6 +224,14 @@
 		ast_string_field_set(event, location, icalproperty_get_value_as_string(prop));
 	}
 
+	if ((prop = icalcomponent_get_first_property(comp, ICAL_CATEGORIES_PROPERTY))) {
+		ast_string_field_set(event, categories, icalproperty_get_value_as_string(prop));
+	}
+
+	if ((prop = icalcomponent_get_first_property(comp, ICAL_PRIORITY_PROPERTY))) {
+		event->priority = icalvalue_get_integer(icalproperty_get_value(prop));
+	}
+
 	if ((prop = icalcomponent_get_first_property(comp, ICAL_UID_PROPERTY))) {
 		ast_string_field_set(event, uid, icalproperty_get_value_as_string(prop));
 	} else {




More information about the asterisk-commits mailing list