* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#define _GNU_SOURCE
#include <stdio.h>
+#include <time.h>
#include <curl/curl.h>
#include <expat.h>
CURL *curl;
XML_Parser expat;
buf_t buf;
+ event_t *first_event;
+ event_t *last_event;
+ event_t *event;
+ char **next_text;
+ date_t *next_date;
// Debugging
int debug;
}
cal->indent++;
}
+
+ /* Parse items */
+ if (match(tag, "t:CalendarItem")) {
+ cal->event = new0(event_t);
+ cal->event->cal = &cal->cal;
+ if (!cal->first_event) {
+ cal->first_event = cal->event;
+ cal->last_event = cal->event;
+ } else {
+ cal->event->prev = cal->last_event;
+ cal->last_event->next = cal->event;
+ cal->last_event = cal->event;
+ }
+ } else if (cal->event) {
+ if (match(tag, "t:Subject"))
+ cal->next_text = &cal->event->name;
+ if (match(tag, "t:Start"))
+ cal->next_date = &cal->event->start;
+ if (match(tag, "t:End"))
+ cal->next_date = &cal->event->end;
+ }
}
static void on_end(void *_cal, const char *tag)
cal->indent--;
}
+ /* Assign strings */
+ if (cal->next_text && cal->buf.len) {
+ *cal->next_text = strcopy(cal->buf.data);
+ }
+ if (cal->next_date && cal->buf.len) {
+ int year, month, day, hour, min, sec;
+ char zone;
+ int cnt = sscanf(cal->buf.data, "%d-%d-%dT%d:%d:%d%c",
+ &year, &month, &day, &hour, &min, &sec, &zone);
+ if (cnt != 7)
+ error("Error parsing time: [%s]", cal->buf.data);
+ if (zone != 'Z')
+ error("Expected UTC timestamp: [%s]", cal->buf.data);
+ struct tm tm = {
+ .tm_year = year-1900,
+ .tm_mon = month-1,
+ .tm_mday = day,
+ .tm_hour = hour,
+ .tm_min = min,
+ .tm_sec = sec,
+ };
+ *cal->next_date = get_date(timegm(&tm));
+ }
+
/* Parse items */
+ if (match(tag, "t:CalendarItem"))
+ cal->event = NULL;
+ cal->next_text = NULL;
+ cal->next_date = NULL;
cal->buf.len = 0;
}
static void on_data(void *_cal, const char *data, int len)
{
ews_t *cal = _cal;
- if (cal->debug)
+ if (cal->debug || cal->next_text || cal->next_date)
append(&cal->buf, data, len);
}
/* Event functions */
event_t *ews_events(date_t start, date_t end)
{
- return NULL;
+ event_t *events = NULL;
+ for (ews_t *cal = calendars; cal; cal = cal->next)
+ events = merge_events(events, cal->first_event);
+ for (event_t *e = events; e; e = e->next)
+ debug("Event: %s", e->name);
+ return events;
}
/* Todo functions */
(*next) = (*next)->next;
}
-static cal_t *merge_cals(cal_t *a, cal_t *b)
+/* Merge functions */
+cal_t *merge_cals(cal_t *a, cal_t *b)
{
// TODO - we should sort these
if (!a) return b;
return a;
}
-static event_t *merge_events(event_t *a, event_t *b)
+event_t *merge_events(event_t *a, event_t *b)
{
event_t *first = NULL, *last = NULL;
while (a && b)
return first;
}
-static todo_t *merge_todos(todo_t *a, todo_t *b)
+todo_t *merge_todos(todo_t *a, todo_t *b)
{
todo_t *first = NULL, *last = NULL;
while (a && b)
void cal_load(year_t year, month_t month, day_t day, int days);
void cal_config(const char *group, const char *name, const char *key, const char *value);
+/* Merge functions */
+cal_t *merge_cals(cal_t *a, cal_t *b);
+event_t *merge_events(event_t *a, event_t *b);
+todo_t *merge_todos(todo_t *a, todo_t *b);
+
/* Event functions */
event_t *find_event(date_t *target);