]> Pileus Git - lackey/commitdiff
Add event parsing for EWS calendars ews
authorAndy Spencer <andy753421@gmail.com>
Sat, 3 Dec 2016 10:35:53 +0000 (10:35 +0000)
committerAndy Spencer <andy753421@gmail.com>
Mon, 12 Jun 2017 05:26:46 +0000 (05:26 +0000)
cals/ews.c
src/cal.c
src/cal.h

index 62776d2471058095503f8d239d71dc8039f87d40..4ad063c37f08e08f9029a45404105ed2527df643 100644 (file)
@@ -15,7 +15,9 @@
  * 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>
@@ -40,6 +42,11 @@ typedef struct ews_t {
        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;
@@ -98,6 +105,27 @@ static void on_start(void *_cal, const char *tag, const char **attrs)
                }
                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)
@@ -113,14 +141,42 @@ 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);
 }
 
@@ -256,7 +312,12 @@ cal_t *ews_cals(void)
 /* 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 */
index 8fe7e702f15079dbd1d6050f4c45df91acf3202b..4e2a1e6b816c91bbdba8fdec0f32f85a48e02e20 100644 (file)
--- a/src/cal.c
+++ b/src/cal.c
@@ -65,7 +65,8 @@ static void add_todo(todo_t **first, todo_t **last, todo_t **next)
        (*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;
@@ -77,7 +78,7 @@ static cal_t *merge_cals(cal_t *a, cal_t *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)
@@ -90,7 +91,7 @@ static event_t *merge_events(event_t *a, event_t *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)
index 7d308ec23fe47f60dad9681571407685af30941f..6001542a16410d9d7fcb975baadcb9f9bcf80fe8 100644 (file)
--- a/src/cal.h
+++ b/src/cal.h
@@ -64,5 +64,10 @@ void cal_init(void);
 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);