From e7603921cff8ee73cea3975b96586b90e184e18f Mon Sep 17 00:00:00 2001 From: Jan Kalab Date: Fri, 3 Sep 2010 11:27:04 +0000 Subject: [PATCH] Support for calendar events priorities and categories Review 880 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@284849 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- include/asterisk/calendar.h | 2 + res/res_calendar.c | 22 ++++++++++ res/res_calendar_caldav.c | 14 +++++++ res/res_calendar_ews.c | 81 +++++++++++++++++++++++++++++++++--- res/res_calendar_icalendar.c | 8 ++++ 5 files changed, 121 insertions(+), 6 deletions(-) diff --git a/include/asterisk/calendar.h b/include/asterisk/calendar.h index 09e5bcd5b5..8b970ae696 100644 --- a/include/asterisk/calendar.h +++ b/include/asterisk/calendar.h @@ -95,7 +95,9 @@ struct ast_calendar_event { 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) */ diff --git a/res/res_calendar.c b/res/res_calendar.c index 2de9959335..183b408453 100644 --- a/res/res_calendar.c +++ b/res/res_calendar.c @@ -65,6 +65,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") The text description of the event The organizer of the event The location of the eventt + The categories of the event + The priority of the event The name of the calendar associated with the event The unique identifier for this event The start time of the event @@ -112,6 +114,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") The full event description The event organizer The event location + The categories of the event + The priority of the event The name of the calendar associted with the event The unique identifier for the event The start time of the event (in seconds since epoch) @@ -142,6 +146,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") The full event description The event organizer The event location + The categories of the event + The priority of the event The unique identifier for the event The start time of the event (in seconds since epoch) The end time of the event (in seconds since epoch) @@ -786,6 +792,8 @@ static void copy_event_data(struct ast_calendar_event *dst, struct ast_calendar_ 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 @@ static int calendar_query_result_exec(struct ast_channel *chan, const char *cmd, 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 @@ static int calendar_write_exec(struct ast_channel *chan, const char *cmd, char * 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 @@ static char *handle_show_calendar(struct ast_cli_entry *e, int cmd, struct ast_c 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 @@ static int calendar_event_read(struct ast_channel *chan, const char *cmd, char * 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")) { diff --git a/res/res_calendar_caldav.c b/res/res_calendar_caldav.c index 664f25b87e..e0d8c483e6 100644 --- a/res/res_calendar_caldav.c +++ b/res/res_calendar_caldav.c @@ -216,6 +216,12 @@ static int caldav_write_event(struct ast_calendar_event *event) 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) { case AST_CALENDAR_BS_BUSY: @@ -365,6 +371,14 @@ static void caldav_add_event(icalcomponent *comp, struct icaltime_span *span, vo 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 { diff --git a/res/res_calendar_ews.c b/res/res_calendar_ews.c index 931e368547..e9d40089f1 100644 --- a/res/res_calendar_ews.c +++ b/res/res_calendar_ews.c @@ -87,6 +87,9 @@ enum { 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 @@ static int startelm(void *userdata, int parent, const char *nspace, const char * } 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 @@ static int cdata(void *userdata, int state, const char *cdata, size_t len) 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); } @@ -364,6 +391,22 @@ static int endelm(void *userdata, int state, const char *nspace, const char *nam 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; @@ -531,12 +574,7 @@ static int ewscal_write_event(struct ast_calendar_event *event) "%s" "false" "%s" - "%s" - "" - "" - "" - "" - "", + "%s", event->summary, event->description, mstime(event->start, start, sizeof(start)), @@ -544,6 +582,37 @@ static int ewscal_write_event(struct ast_calendar_event *event) msstatus(event->busy_state), event->location ); + /* Event priority */ + switch (event->priority) { + case 1: + case 2: + case 3: + case 4: + ast_str_append(&request, 0, "High"); + break; + case 5: + ast_str_append(&request, 0, "Normal"); + break; + case 6: + case 7: + case 8: + case 9: + ast_str_append(&request, 0, "Low"); + break; + } + /* Event categories*/ + if (strlen(event->categories) > 0) { + ast_str_append(&request, 0, ""); + char *categories = strdupa(event->categories); /* Duplicate string, since strsep() is destructive */ + char *category = strsep(&categories, ","); + while (category != NULL) { + ast_str_append(&request, 0, "%s", category); + category = strsep(&categories, ","); + } + ast_str_append(&request, 0, ""); + } + /* Finish request */ + ast_str_append(&request, 0, ""); ret = send_ews_request_and_parse(request, &ctx); diff --git a/res/res_calendar_icalendar.c b/res/res_calendar_icalendar.c index 2eda352456..300da2ac9b 100644 --- a/res/res_calendar_icalendar.c +++ b/res/res_calendar_icalendar.c @@ -224,6 +224,14 @@ static void icalendar_add_event(icalcomponent *comp, struct icaltime_span *span, 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 {