Added a few doc comments
This commit is contained in:
parent
23bd2fa785
commit
3b1aafad99
|
@ -28,6 +28,7 @@ type ICal struct {
|
||||||
eventData []string // sub slice
|
eventData []string // sub slice
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retrieve the summary (aka title) of the event.
|
||||||
func (i ICal) Summary() string {
|
func (i ICal) Summary() string {
|
||||||
for _, s := range i.eventData {
|
for _, s := range i.eventData {
|
||||||
if strings.HasPrefix(s, "SUMMARY:") {
|
if strings.HasPrefix(s, "SUMMARY:") {
|
||||||
|
@ -37,6 +38,7 @@ func (i ICal) Summary() string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retrieve the UID of the event.
|
||||||
func (i ICal) UID() string {
|
func (i ICal) UID() string {
|
||||||
for _, s := range i.eventData {
|
for _, s := range i.eventData {
|
||||||
if strings.HasPrefix(s, "UID:") {
|
if strings.HasPrefix(s, "UID:") {
|
||||||
|
@ -46,6 +48,10 @@ func (i ICal) UID() string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Internal helper function to retrieve a time from the given field within
|
||||||
|
// the event data of the ICal structure. Timezone information are ignored.
|
||||||
|
// The time is therefore either a local time or a UTC time, depending on
|
||||||
|
// the notation.
|
||||||
func (i ICal) getTimeField(f string) time.Time {
|
func (i ICal) getTimeField(f string) time.Time {
|
||||||
for _, s := range i.eventData {
|
for _, s := range i.eventData {
|
||||||
if strings.HasPrefix(s, f) {
|
if strings.HasPrefix(s, f) {
|
||||||
|
@ -67,10 +73,12 @@ func (i ICal) getTimeField(f string) time.Time {
|
||||||
return time.Time{}
|
return time.Time{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retrieve the start time of the event.
|
||||||
func (i ICal) Start() time.Time {
|
func (i ICal) Start() time.Time {
|
||||||
return i.getTimeField("DTSTART")
|
return i.getTimeField("DTSTART")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retrieve the end time of the event.
|
||||||
func (i ICal) End() time.Time {
|
func (i ICal) End() time.Time {
|
||||||
return i.getTimeField("DTEND")
|
return i.getTimeField("DTEND")
|
||||||
}
|
}
|
||||||
|
@ -90,6 +98,7 @@ func (i *ICal) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Builds a string representation of the ICal (as ICS).
|
||||||
func (i ICal) String() string {
|
func (i ICal) String() string {
|
||||||
sb := &strings.Builder{}
|
sb := &strings.Builder{}
|
||||||
for n, line := range i.data {
|
for n, line := range i.data {
|
||||||
|
@ -101,6 +110,8 @@ func (i ICal) String() string {
|
||||||
return sb.String()
|
return sb.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Parses the given ICal into structure. It identifies the first (and only
|
||||||
|
// the first) event within the given calendar.
|
||||||
func ParseICal(r io.Reader) (*ICal, error) {
|
func ParseICal(r io.Reader) (*ICal, error) {
|
||||||
var data []string
|
var data []string
|
||||||
scanner := bufio.NewScanner(r)
|
scanner := bufio.NewScanner(r)
|
||||||
|
@ -136,6 +147,9 @@ func ParseICal(r io.Reader) (*ICal, error) {
|
||||||
}, err
|
}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create a new empty ICal structure with the given parameters.
|
||||||
|
// Currently only supports time based events; date-only is not
|
||||||
|
// supported.
|
||||||
func CreateICal(uid, summary string, start, end time.Time) *ICal {
|
func CreateICal(uid, summary string, start, end time.Time) *ICal {
|
||||||
model := struct {
|
model := struct {
|
||||||
UID string
|
UID string
|
||||||
|
@ -177,6 +191,12 @@ type CalDAVItem struct {
|
||||||
*ICal
|
*ICal
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retrieve all events from the configured CalDAV server.
|
||||||
|
// Each item will contain the original URL in relative format
|
||||||
|
// as well as the ICal data for the given event.
|
||||||
|
//
|
||||||
|
// It is expected that each event is a ICal calendar with only
|
||||||
|
// a single event.
|
||||||
func (c *CalDAV) GetEvents() ([]CalDAVItem, error) {
|
func (c *CalDAV) GetEvents() ([]CalDAVItem, error) {
|
||||||
req, err := http.NewRequest("PROPFIND", c.URL, strings.NewReader(`<propfind xmlns='DAV:'><prop><calendar-data xmlns='urn:ietf:params:xml:ns:caldav'/></prop></propfind>`))
|
req, err := http.NewRequest("PROPFIND", c.URL, strings.NewReader(`<propfind xmlns='DAV:'><prop><calendar-data xmlns='urn:ietf:params:xml:ns:caldav'/></prop></propfind>`))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -207,6 +227,10 @@ func (c *CalDAV) GetEvents() ([]CalDAVItem, error) {
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Put the given item on the configured CalDAV server, either updating
|
||||||
|
// an existing item or creating a new one.
|
||||||
|
// The target URL is calculated by the URL in the settings together with
|
||||||
|
// the HRef of the CalDAV item.
|
||||||
func (c CalDAV) UploadItem(item CalDAVItem) error {
|
func (c CalDAV) UploadItem(item CalDAVItem) error {
|
||||||
itemURL, _ := url.Parse(item.HRef)
|
itemURL, _ := url.Parse(item.HRef)
|
||||||
base, _ := url.Parse(c.URL)
|
base, _ := url.Parse(c.URL)
|
||||||
|
@ -231,6 +255,9 @@ func (c CalDAV) UploadItem(item CalDAVItem) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Removes the given item from the configured CalDAV server using the
|
||||||
|
// calculated URL from the settings together with the HRef of the given
|
||||||
|
// CalDAV item.
|
||||||
func (c CalDAV) DeleteItem(item CalDAVItem) error {
|
func (c CalDAV) DeleteItem(item CalDAVItem) error {
|
||||||
itemURL, _ := url.Parse(item.HRef)
|
itemURL, _ := url.Parse(item.HRef)
|
||||||
base, _ := url.Parse(c.URL)
|
base, _ := url.Parse(c.URL)
|
||||||
|
|
|
@ -29,6 +29,10 @@ type CalendarItem struct {
|
||||||
CalendarItemType string
|
CalendarItemType string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Build a hash for the given calendar item by combining the UID and
|
||||||
|
// the recurrenceId therefore guaranteeing a unique identifier for the
|
||||||
|
// event, even if it has been a calculated recurrence (which would
|
||||||
|
// otherwise share the same UID).
|
||||||
func (ci CalendarItem) Hash() string {
|
func (ci CalendarItem) Hash() string {
|
||||||
h := md5.New()
|
h := md5.New()
|
||||||
h.Write([]byte(ci.UID))
|
h.Write([]byte(ci.UID))
|
||||||
|
@ -59,6 +63,9 @@ func NewEWSCalendar(url, username, password string) *EWSCalendar {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Internal helper to prepare a request to the EWS server. This is a shortcut
|
||||||
|
// since all requests share some similarities: they transmit XML and receive
|
||||||
|
// XML. Also it needs a basic auth header.
|
||||||
func (e *EWSCalendar) prepareRequest(body io.Reader) (req *http.Request, err error) {
|
func (e *EWSCalendar) prepareRequest(body io.Reader) (req *http.Request, err error) {
|
||||||
req, err = http.NewRequest(http.MethodPost, e.url, body)
|
req, err = http.NewRequest(http.MethodPost, e.url, body)
|
||||||
req.Header.Set("Content-Type", "text/xml")
|
req.Header.Set("Content-Type", "text/xml")
|
||||||
|
@ -67,6 +74,8 @@ func (e *EWSCalendar) prepareRequest(body io.Reader) (req *http.Request, err err
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Request the ID of the default calendar folder. This is necessary to do
|
||||||
|
// the actual event query.
|
||||||
func (e *EWSCalendar) getCalendarFolderID() (id *FolderId, err error) {
|
func (e *EWSCalendar) getCalendarFolderID() (id *FolderId, err error) {
|
||||||
req, err := e.prepareRequest(strings.NewReader(folderIdRequest))
|
req, err := e.prepareRequest(strings.NewReader(folderIdRequest))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -108,6 +117,7 @@ func (e *EWSCalendar) getCalendarFolderID() (id *FolderId, err error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Query events from the given folder in the given timeframe.
|
||||||
func (e *EWSCalendar) getCalendarItems(folder *FolderId, start, end time.Time) (items []CalendarItem, err error) {
|
func (e *EWSCalendar) getCalendarItems(folder *FolderId, start, end time.Time) (items []CalendarItem, err error) {
|
||||||
b := &bytes.Buffer{}
|
b := &bytes.Buffer{}
|
||||||
model := struct {
|
model := struct {
|
||||||
|
|
Loading…
Reference in New Issue