From a4e0e810039763e891ffea6b8ce665cc629f6f1f Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Wed, 13 May 2020 16:45:10 +0200 Subject: [PATCH] caldav: add Client.MultiGetCalendar --- caldav/caldav.go | 5 +++++ caldav/client.go | 32 ++++++++++++++++++++++++++++++++ caldav/elements.go | 9 +++++++++ 3 files changed, 46 insertions(+) diff --git a/caldav/caldav.go b/caldav/caldav.go index d12ff7e..3840c7d 100644 --- a/caldav/caldav.go +++ b/caldav/caldav.go @@ -47,6 +47,11 @@ type CalendarQuery struct { CompFilter CompFilter } +type CalendarMultiGet struct { + Paths []string + CompRequest CalendarCompRequest +} + type CalendarObject struct { Path string ModTime time.Time diff --git a/caldav/client.go b/caldav/client.go index 78fb2c1..8f7952e 100644 --- a/caldav/client.go +++ b/caldav/client.go @@ -218,6 +218,38 @@ func (c *Client) QueryCalendar(calendar string, query *CalendarQuery) ([]Calenda return decodeCalendarObjectList(ms) } +func (c *Client) MultiGetCalendar(path string, multiGet *CalendarMultiGet) ([]CalendarObject, error) { + propReq, err := encodeCalendarReq(&multiGet.CompRequest) + if err != nil { + return nil, err + } + + calendarMultiget := calendarMultiget{Prop: propReq} + + if multiGet == nil || len(multiGet.Paths) == 0 { + href := internal.Href{Path: path} + calendarMultiget.Hrefs = []internal.Href{href} + } else { + calendarMultiget.Hrefs = make([]internal.Href, len(multiGet.Paths)) + for i, p := range multiGet.Paths { + calendarMultiget.Hrefs[i] = internal.Href{Path: p} + } + } + + req, err := c.ic.NewXMLRequest("REPORT", path, &calendarMultiget) + if err != nil { + return nil, err + } + req.Header.Add("Depth", "1") + + ms, err := c.ic.DoMultiStatus(req) + if err != nil { + return nil, err + } + + return decodeCalendarObjectList(ms) +} + func populateCalendarObject(co *CalendarObject, resp *http.Response) error { if loc := resp.Header.Get("Location"); loc != "" { u, err := url.Parse(loc) diff --git a/caldav/elements.go b/caldav/elements.go index 75e9bcb..7fca200 100644 --- a/caldav/elements.go +++ b/caldav/elements.go @@ -60,6 +60,15 @@ type calendarQuery struct { // TODO: timezone } +// https://tools.ietf.org/html/rfc4791#section-9.10 +type calendarMultiget struct { + XMLName xml.Name `xml:"urn:ietf:params:xml:ns:caldav calendar-multiget"` + Hrefs []internal.Href `xml:"DAV: href"` + Prop *internal.Prop `xml:"DAV: prop,omitempty"` + AllProp *struct{} `xml:"DAV: allprop,omitempty"` + PropName *struct{} `xml:"DAV: propname,omitempty"` +} + // https://tools.ietf.org/html/rfc4791#section-9.7 type filter struct { XMLName xml.Name `xml:"urn:ietf:params:xml:ns:caldav filter"`