]> Pileus Git - lackey/blobdiff - cals/ews.c
Add event parsing for EWS calendars
[lackey] / cals / ews.c
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 */