#include "asterisk.h"
#include "asterisk/stringfields.h"
#include "asterisk/config.h"
#include "asterisk/linkedlists.h"
#include "asterisk/lock.h"
#include "asterisk/dial.h"
Go to the source code of this file.
Data Structures | |
struct | ast_calendar |
Asterisk calendar structure. More... | |
struct | ast_calendar_attendee |
struct | ast_calendar_event |
struct | ast_calendar_event::attendees |
struct | ast_calendar_tech |
Individual calendaring technology data. More... | |
Enumerations | |
enum | ast_calendar_busy_state { AST_CALENDAR_BS_FREE = 0, AST_CALENDAR_BS_BUSY_TENTATIVE, AST_CALENDAR_BS_BUSY } |
Functions | |
void | ast_calendar_clear_events (struct ast_calendar *cal) |
Remove all events from calendar. | |
ast_config * | ast_calendar_config_acquire (void) |
Grab and lock pointer to the calendar config (read only). | |
void | ast_calendar_config_release (void) |
Release the calendar config. | |
ast_calendar_event * | ast_calendar_event_alloc (struct ast_calendar *cal) |
Allocate an astobj2 ast_calendar_event object. | |
ao2_container * | ast_calendar_event_container_alloc (void) |
Allocate an astobj2 container for ast_calendar_event objects. | |
void | ast_calendar_merge_events (struct ast_calendar *cal, struct ao2_container *new_events) |
Add an event to the list of events for a calendar. | |
int | ast_calendar_register (struct ast_calendar_tech *tech) |
Register a new calendar technology. | |
ast_calendar_event * | ast_calendar_unref_event (struct ast_calendar_event *event) |
Unreference an ast_calendar_event. | |
void | ast_calendar_unregister (struct ast_calendar_tech *tech) |
Unregister a new calendar technology. |
BUSYSTATE can have the values 0 (free), 1 (tentatively busy), or 2 (busy)
Usage All calendaring configuration data is located in calendar.conf and is only read directly by the Calendaring API. Each calendar technology resource must register a load_calendar callback which will be passed an ast_calendar_load_data structure. The load_calendar callback function should then set the values it needs from this cfg, load the calendar data, and then loop updating the calendar data and events baesd on the refresh interval in the ast_calendar object. Each call to the load_calendar callback will be will run in its own thread.
Updating events involves creating an astobj2 container of new events and passing it to the API through ast_calendar_merge_events.
Calendar technology resource modules must also register an unref_calendar callback which will only be called when the resource module calls ast_calendar_unregister() to unregister that module's calendar type (usually done in module_unload())
Definition in file calendar.h.
Definition at line 79 of file calendar.h.
00079 { 00080 AST_CALENDAR_BS_FREE = 0, 00081 AST_CALENDAR_BS_BUSY_TENTATIVE, 00082 AST_CALENDAR_BS_BUSY, 00083 };
void ast_calendar_clear_events | ( | struct ast_calendar * | cal | ) |
Remove all events from calendar.
cal | calendar whose events need to be cleared |
Definition at line 589 of file res_calendar.c.
References ao2_callback, ast_debug, clear_events_cb(), ast_calendar::events, ast_calendar::name, OBJ_MULTIPLE, OBJ_NODATA, and OBJ_UNLINK.
Referenced by calendar_destructor().
00590 { 00591 ast_debug(3, "Clearing all events for calendar %s\n", cal->name); 00592 00593 ao2_callback(cal->events, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, clear_events_cb, NULL); 00594 }
struct ast_config* ast_calendar_config_acquire | ( | void | ) |
Grab and lock pointer to the calendar config (read only).
Definition at line 236 of file res_calendar.c.
References ast_rwlock_rdlock, and ast_rwlock_unlock.
Referenced by caldav_load_calendar(), ewscal_load_calendar(), exchangecal_load_calendar(), and ical_load_calendar().
00237 { 00238 ast_rwlock_rdlock(&config_lock); 00239 00240 if (!calendar_config) { 00241 ast_rwlock_unlock(&config_lock); 00242 return NULL; 00243 } 00244 00245 return calendar_config; 00246 }
void ast_calendar_config_release | ( | void | ) |
Release the calendar config.
Definition at line 248 of file res_calendar.c.
References ast_rwlock_unlock, and config_lock.
Referenced by caldav_load_calendar(), ewscal_load_calendar(), exchangecal_load_calendar(), and ical_load_calendar().
00249 { 00250 ast_rwlock_unlock(&config_lock); 00251 }
struct ast_calendar_event* ast_calendar_event_alloc | ( | struct ast_calendar * | cal | ) |
Allocate an astobj2 ast_calendar_event object.
cal | calendar to allocate an event for |
Definition at line 596 of file res_calendar.c.
References ao2_alloc, ast_calendar_unref_event(), AST_LIST_HEAD_INIT_NOLOCK, ast_string_field_init, and calendar_event_destructor().
Referenced by caldav_add_event(), calendar_write_exec(), icalendar_add_event(), parse_tag(), and startelm().
00597 { 00598 struct ast_calendar_event *event; 00599 if (!(event = ao2_alloc(sizeof(*event), calendar_event_destructor))) { 00600 return NULL; 00601 } 00602 00603 if (ast_string_field_init(event, 32)) { 00604 event = ast_calendar_unref_event(event); 00605 return NULL; 00606 } 00607 00608 event->owner = cal; 00609 event->notify_sched = -1; 00610 event->bs_start_sched = -1; 00611 event->bs_end_sched = -1; 00612 00613 AST_LIST_HEAD_INIT_NOLOCK(&event->attendees); 00614 00615 return event; 00616 }
struct ao2_container* ast_calendar_event_container_alloc | ( | void | ) |
Allocate an astobj2 container for ast_calendar_event objects.
Definition at line 618 of file res_calendar.c.
References ao2_container_alloc, CALENDAR_BUCKETS, event_cmp_fn(), and event_hash_fn().
Referenced by caldav_load_calendar(), ewscal_load_calendar(), exchangecal_load_calendar(), and ical_load_calendar().
00619 { 00620 return ao2_container_alloc(CALENDAR_BUCKETS, event_hash_fn, event_cmp_fn); 00621 }
void ast_calendar_merge_events | ( | struct ast_calendar * | cal, | |
struct ao2_container * | new_events | |||
) |
Add an event to the list of events for a calendar.
cal | calendar containing the events to be merged | |
new_events | an oa2 container of events to be merged into cal->events |
Definition at line 951 of file res_calendar.c.
References add_new_event_cb(), ao2_callback, ast_calendar::events, merge_events_cb(), OBJ_MULTIPLE, OBJ_NODATA, and OBJ_UNLINK.
Referenced by endelm(), icalendar_update_events(), startelm(), update_caldav(), and update_exchangecal().
00952 { 00953 /* Loop through all events attached to the calendar. If there is a matching new event 00954 * merge its data over and handle any schedule changes that need to be made. Then remove 00955 * the new_event from new_events so that we are left with only new_events that we can add later. */ 00956 ao2_callback(cal->events, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, merge_events_cb, new_events); 00957 00958 /* Now, we should only have completely new events in new_events. Loop through and add them */ 00959 ao2_callback(new_events, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, add_new_event_cb, cal->events); 00960 }
int ast_calendar_register | ( | struct ast_calendar_tech * | tech | ) |
Register a new calendar technology.
tech | calendar technology to register |
0 | success | |
-1 | failure |
Definition at line 485 of file res_calendar.c.
References AST_LIST_INSERT_HEAD, AST_LIST_LOCK, AST_LIST_TRAVERSE, AST_LIST_UNLOCK, ast_log(), ast_verb, ast_calendar_tech::description, ast_calendar_tech::list, load_tech_calendars(), LOG_WARNING, and ast_calendar_tech::type.
Referenced by load_module().
00486 { 00487 struct ast_calendar_tech *iter; 00488 00489 AST_LIST_LOCK(&techs); 00490 AST_LIST_TRAVERSE(&techs, iter, list) { 00491 if(!strcasecmp(tech->type, iter->type)) { 00492 ast_log(LOG_WARNING, "Already have a handler for calendar type '%s'\n", tech->type); 00493 AST_LIST_UNLOCK(&techs); 00494 return -1; 00495 } 00496 } 00497 AST_LIST_INSERT_HEAD(&techs, tech, list); 00498 AST_LIST_UNLOCK(&techs); 00499 00500 ast_verb(2, "Registered calendar type '%s' (%s)\n", tech->type, tech->description); 00501 00502 return load_tech_calendars(tech); 00503 }
struct ast_calendar_event* ast_calendar_unref_event | ( | struct ast_calendar_event * | event | ) |
Unreference an ast_calendar_event.
event | event to unref |
Definition at line 299 of file res_calendar.c.
References ao2_ref, and evententry::event.
Referenced by ast_calendar_event_alloc(), caldav_add_event(), calendar_devstate_change(), calendar_query_exec(), do_notify(), endelm(), event_notification_destroy(), handle_show_calendar(), icalendar_add_event(), merge_events_cb(), and parse_tag().
00300 { 00301 ao2_ref(event, -1); 00302 return NULL; 00303 }
void ast_calendar_unregister | ( | struct ast_calendar_tech * | tech | ) |
Unregister a new calendar technology.
tech | calendar technology to unregister |
0 | success | |
-1 | failure |
Definition at line 517 of file res_calendar.c.
References ao2_callback, AST_LIST_LOCK, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, AST_LIST_UNLOCK, ast_verb, ast_calendar_tech::list, match_caltech_cb(), OBJ_MULTIPLE, OBJ_NODATA, OBJ_UNLINK, and ast_calendar_tech::type.
Referenced by load_tech_calendars(), and unload_module().
00518 { 00519 struct ast_calendar_tech *iter; 00520 00521 AST_LIST_LOCK(&techs); 00522 AST_LIST_TRAVERSE_SAFE_BEGIN(&techs, iter, list) { 00523 if (iter != tech) { 00524 continue; 00525 } 00526 00527 ao2_callback(calendars, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, match_caltech_cb, tech); 00528 00529 AST_LIST_REMOVE_CURRENT(list); 00530 ast_verb(2, "Unregistered calendar type '%s'\n", tech->type); 00531 break; 00532 } 00533 AST_LIST_TRAVERSE_SAFE_END; 00534 AST_LIST_UNLOCK(&techs); 00535 00536 }