Loading src/main/kotlin/at/bitfire/dav4jvm/DavAddressBook.kt +28 −25 Original line number Diff line number Diff line Loading @@ -6,8 +6,12 @@ package at.bitfire.dav4jvm import at.bitfire.dav4jvm.XmlUtils.insertTag import at.bitfire.dav4jvm.exception.DavException import at.bitfire.dav4jvm.exception.HttpException import at.bitfire.dav4jvm.property.AddressData import at.bitfire.dav4jvm.property.GetContentType import at.bitfire.dav4jvm.property.GetETag import okhttp3.HttpUrl import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient Loading @@ -26,6 +30,10 @@ class DavAddressBook @JvmOverloads constructor( companion object { val MIME_VCARD3_UTF8 = "text/vcard;charset=utf-8".toMediaType() val MIME_VCARD4 = "text/vcard;version=4.0".toMediaType() val ADDRESSBOOK_QUERY = Property.Name(XmlUtils.NS_CARDDAV, "addressbook-query") val ADDRESSBOOK_MULTIGET = Property.Name(XmlUtils.NS_CARDDAV, "addressbook-multiget") val FILTER = Property.Name(XmlUtils.NS_CARDDAV, "filter") } /** Loading @@ -52,14 +60,12 @@ class DavAddressBook @JvmOverloads constructor( serializer.startDocument("UTF-8", null) serializer.setPrefix("", XmlUtils.NS_WEBDAV) serializer.setPrefix("CARD", XmlUtils.NS_CARDDAV) serializer.startTag(XmlUtils.NS_CARDDAV, "addressbook-query") serializer.startTag(XmlUtils.NS_WEBDAV, "prop") serializer.startTag(XmlUtils.NS_WEBDAV, "getetag") serializer.endTag(XmlUtils.NS_WEBDAV, "getetag") serializer.endTag(XmlUtils.NS_WEBDAV, "prop") serializer.startTag(XmlUtils.NS_CARDDAV, "filter") serializer.endTag(XmlUtils.NS_CARDDAV, "filter") serializer.endTag(XmlUtils.NS_CARDDAV, "addressbook-query") serializer.insertTag(ADDRESSBOOK_QUERY) { insertTag(PROP) { insertTag(GetETag.NAME) } insertTag(FILTER) } serializer.endDocument() followRedirects { Loading Loading @@ -99,25 +105,22 @@ class DavAddressBook @JvmOverloads constructor( serializer.startDocument("UTF-8", null) serializer.setPrefix("", XmlUtils.NS_WEBDAV) serializer.setPrefix("CARD", XmlUtils.NS_CARDDAV) serializer.startTag(XmlUtils.NS_CARDDAV, "addressbook-multiget") serializer.startTag(XmlUtils.NS_WEBDAV, "prop") serializer.startTag(XmlUtils.NS_WEBDAV, "getcontenttype") // to determine the character set serializer.endTag(XmlUtils.NS_WEBDAV, "getcontenttype") serializer.startTag(XmlUtils.NS_WEBDAV, "getetag") serializer.endTag(XmlUtils.NS_WEBDAV, "getetag") serializer.startTag(XmlUtils.NS_CARDDAV, "address-data") serializer.insertTag(ADDRESSBOOK_MULTIGET) { insertTag(PROP) { insertTag(GetContentType.NAME) insertTag(GetETag.NAME) insertTag(AddressData.NAME) { if (vCard4) { serializer.attribute(null, "content-type", "text/vcard") serializer.attribute(null, "version", "4.0") attribute(null, AddressData.CONTENT_TYPE, "text/vcard") attribute(null, AddressData.VERSION, "4.0") } } } for (url in urls) insertTag(HREF) { text(url.encodedPath) } serializer.endTag(XmlUtils.NS_CARDDAV, "address-data") serializer.endTag(XmlUtils.NS_WEBDAV, "prop") for (url in urls) { serializer.startTag(XmlUtils.NS_WEBDAV, "href") serializer.text(url.encodedPath) serializer.endTag(XmlUtils.NS_WEBDAV, "href") } serializer.endTag(XmlUtils.NS_CARDDAV, "addressbook-multiget") serializer.endDocument() followRedirects { Loading src/main/kotlin/at/bitfire/dav4jvm/DavCalendar.kt +43 −40 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ package at.bitfire.dav4jvm import at.bitfire.dav4jvm.XmlUtils.insertTag import at.bitfire.dav4jvm.exception.DavException import at.bitfire.dav4jvm.exception.HttpException import at.bitfire.dav4jvm.property.CalendarData Loading @@ -17,7 +18,6 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody import org.xmlpull.v1.XmlSerializer import java.io.IOException import java.io.StringWriter import java.text.SimpleDateFormat Loading @@ -34,9 +34,19 @@ class DavCalendar @JvmOverloads constructor( val MIME_ICALENDAR = "text/calendar".toMediaType() val MIME_ICALENDAR_UTF8 = "text/calendar;charset=utf-8".toMediaType() val CALENDAR_QUERY = Property.Name(XmlUtils.NS_CALDAV, "calendar-query") val CALENDAR_MULTIGET = Property.Name(XmlUtils.NS_CALDAV, "calendar-multiget") val FILTER = Property.Name(XmlUtils.NS_CALDAV, "filter") val COMP_FILTER = Property.Name(XmlUtils.NS_CALDAV, "comp-filter") const val COMP_FILTER_NAME = "name" val TIME_RANGE = Property.Name(XmlUtils.NS_CALDAV, "time-range") const val TIME_RANGE_START = "start" const val TIME_RANGE_END = "end" private val timeFormatUTC = SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'", Locale.US) init { timeFormatUTC.timeZone = TimeZone.getTimeZone("UTC") timeFormatUTC.timeZone = TimeZone.getTimeZone("Etc/UTC") } } Loading Loading @@ -74,28 +84,27 @@ class DavCalendar @JvmOverloads constructor( serializer.startDocument("UTF-8", null) serializer.setPrefix("", XmlUtils.NS_WEBDAV) serializer.setPrefix("CAL", XmlUtils.NS_CALDAV) serializer.startTag(XmlUtils.NS_CALDAV, "calendar-query") serializer.startTag(XmlUtils.NS_WEBDAV, "prop") serializer.startTag(XmlUtils.NS_WEBDAV, "getetag") serializer.endTag(XmlUtils.NS_WEBDAV, "getetag") serializer.endTag(XmlUtils.NS_WEBDAV, "prop") serializer.startTag(XmlUtils.NS_CALDAV, "filter") serializer.startTag(XmlUtils.NS_CALDAV, "comp-filter") serializer.attribute(null, "name", "VCALENDAR") serializer.startTag(XmlUtils.NS_CALDAV, "comp-filter") serializer.attribute(null, "name", component) serializer.insertTag(CALENDAR_QUERY) { insertTag(PROP) { insertTag(GetETag.NAME) } insertTag(FILTER) { insertTag(COMP_FILTER) { attribute(null, COMP_FILTER_NAME, "VCALENDAR") insertTag(COMP_FILTER) { attribute(null, COMP_FILTER_NAME, component) if (start != null || end != null) { serializer.startTag(XmlUtils.NS_CALDAV, "time-range") insertTag(TIME_RANGE) { if (start != null) serializer.attribute(null, "start", timeFormatUTC.format(start)) attribute(null, TIME_RANGE_START, timeFormatUTC.format(start)) if (end != null) serializer.attribute(null, "end", timeFormatUTC.format(end)) serializer.endTag(XmlUtils.NS_CALDAV, "time-range") attribute(null, TIME_RANGE_END, timeFormatUTC.format(end)) } } } } } } serializer.endTag(XmlUtils.NS_CALDAV, "comp-filter") serializer.endTag(XmlUtils.NS_CALDAV, "comp-filter") serializer.endTag(XmlUtils.NS_CALDAV, "filter") serializer.endTag(XmlUtils.NS_CALDAV, "calendar-query") serializer.endDocument() followRedirects { Loading Loading @@ -124,11 +133,6 @@ class DavCalendar @JvmOverloads constructor( * @throws DavException on WebDAV error */ fun multiget(urls: List<HttpUrl>, callback: DavResponseCallback): List<Property> { fun XmlSerializer.emptyTag(propertyName: Property.Name) { startTag(propertyName.namespace, propertyName.name) endTag(propertyName.namespace, propertyName.name) } /* <!ELEMENT calendar-multiget ((DAV:allprop | DAV:propname | DAV:prop)?, DAV:href+)> Loading @@ -139,19 +143,18 @@ class DavCalendar @JvmOverloads constructor( serializer.startDocument("UTF-8", null) serializer.setPrefix("", XmlUtils.NS_WEBDAV) serializer.setPrefix("CAL", XmlUtils.NS_CALDAV) serializer.startTag(XmlUtils.NS_CALDAV, "calendar-multiget") serializer.startTag(XmlUtils.NS_WEBDAV, "prop") serializer.emptyTag(GetContentType.NAME) // to determine the character set serializer.emptyTag(GetETag.NAME) serializer.emptyTag(ScheduleTag.NAME) serializer.emptyTag(CalendarData.NAME) serializer.endTag(XmlUtils.NS_WEBDAV, "prop") for (url in urls) { serializer.startTag(XmlUtils.NS_WEBDAV, "href") serializer.insertTag(CALENDAR_MULTIGET) { insertTag(PROP) { insertTag(GetContentType.NAME) // to determine the character set insertTag(GetETag.NAME) insertTag(ScheduleTag.NAME) insertTag(CalendarData.NAME) } for (url in urls) insertTag(HREF) { serializer.text(url.encodedPath) serializer.endTag(XmlUtils.NS_WEBDAV, "href") } serializer.endTag(XmlUtils.NS_CALDAV, "calendar-multiget") } serializer.endDocument() followRedirects { Loading src/main/kotlin/at/bitfire/dav4jvm/DavCollection.kt +25 −19 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ package at.bitfire.dav4jvm import at.bitfire.dav4jvm.XmlUtils.insertTag import at.bitfire.dav4jvm.exception.DavException import at.bitfire.dav4jvm.exception.HttpException import at.bitfire.dav4jvm.property.SyncToken Loading @@ -25,6 +26,13 @@ open class DavCollection @JvmOverloads constructor( log: Logger = Dav4jvm.log ): DavResource(httpClient, location, log) { companion object { val SYNC_COLLECTION = Property.Name(XmlUtils.NS_WEBDAV, "sync-collection") val SYNC_LEVEL = Property.Name(XmlUtils.NS_WEBDAV, "sync-level") val LIMIT = Property.Name(XmlUtils.NS_WEBDAV, "limit") val NRESULTS = Property.Name(XmlUtils.NS_WEBDAV, "nresults") } /** * Sends a REPORT sync-collection request. * Loading Loading @@ -57,27 +65,25 @@ open class DavCollection @JvmOverloads constructor( serializer.setOutput(writer) serializer.startDocument("UTF-8", null) serializer.setPrefix("", XmlUtils.NS_WEBDAV) serializer.startTag(XmlUtils.NS_WEBDAV, "sync-collection") serializer.startTag(SyncToken.NAME.namespace, SyncToken.NAME.name) syncToken?.let { serializer.text(it) } serializer.endTag(SyncToken.NAME.namespace, SyncToken.NAME.name) serializer.startTag(XmlUtils.NS_WEBDAV, "sync-level") serializer.text(if (infiniteDepth) "infinite" else "1") serializer.endTag(XmlUtils.NS_WEBDAV, "sync-level") limit?.let { nresults -> serializer.startTag(XmlUtils.NS_WEBDAV, "limit") serializer.startTag(XmlUtils.NS_WEBDAV, "nresults") serializer.text(nresults.toString()) serializer.endTag(XmlUtils.NS_WEBDAV, "nresults") serializer.endTag(XmlUtils.NS_WEBDAV, "limit") serializer.insertTag(SYNC_COLLECTION) { insertTag(SyncToken.NAME) { if (syncToken != null) text(syncToken) } insertTag(SYNC_LEVEL) { text(if (infiniteDepth) "infinite" else "1") } if (limit != null) insertTag(LIMIT) { insertTag(NRESULTS) { text(limit.toString()) } } insertTag(PROP) { for (prop in properties) insertTag(prop) } serializer.startTag(XmlUtils.NS_WEBDAV, "prop") properties.forEach { serializer.startTag(it.namespace, it.name) serializer.endTag(it.namespace, it.name) } serializer.endTag(XmlUtils.NS_WEBDAV, "prop") serializer.endTag(XmlUtils.NS_WEBDAV, "sync-collection") serializer.endDocument() followRedirects { Loading src/main/kotlin/at/bitfire/dav4jvm/DavResource.kt +19 −13 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ package at.bitfire.dav4jvm import at.bitfire.dav4jvm.XmlUtils.insertTag import at.bitfire.dav4jvm.XmlUtils.propertyName import at.bitfire.dav4jvm.exception.* import at.bitfire.dav4jvm.property.SyncToken import okhttp3.* Loading @@ -20,6 +22,7 @@ import java.io.Reader import java.io.StringWriter import java.net.HttpURLConnection import java.util.logging.Logger import at.bitfire.dav4jvm.Response as DavResponse /** * Represents a WebDAV resource at the given location and allows WebDAV Loading @@ -41,7 +44,12 @@ open class DavResource @JvmOverloads constructor( companion object { const val MAX_REDIRECTS = 5 val MIME_XML = "application/xml; charset=utf-8".toMediaType() val PROPFIND = Property.Name(XmlUtils.NS_WEBDAV, "propfind") val PROP = Property.Name(XmlUtils.NS_WEBDAV, "prop") val HREF = Property.Name(XmlUtils.NS_WEBDAV, "href") } /** Loading Loading @@ -314,14 +322,12 @@ open class DavResource @JvmOverloads constructor( serializer.setPrefix("CAL", XmlUtils.NS_CALDAV) serializer.setPrefix("CARD", XmlUtils.NS_CARDDAV) serializer.startDocument("UTF-8", null) serializer.startTag(XmlUtils.NS_WEBDAV, "propfind") serializer.startTag(XmlUtils.NS_WEBDAV, "prop") for (prop in reqProp) { serializer.startTag(prop.namespace, prop.name) serializer.endTag(prop.namespace, prop.name) } serializer.endTag(XmlUtils.NS_WEBDAV, "prop") serializer.endTag(XmlUtils.NS_WEBDAV, "propfind") serializer.insertTag(PROPFIND) { insertTag(PROP) { for (prop in reqProp) insertTag(prop) } } serializer.endDocument() followRedirects { Loading Loading @@ -468,11 +474,11 @@ open class DavResource @JvmOverloads constructor( val depth = parser.depth var eventType = parser.eventType while (!(eventType == XmlPullParser.END_TAG && parser.depth == depth)) { if (eventType == XmlPullParser.START_TAG && parser.depth == depth + 1 && parser.namespace == XmlUtils.NS_WEBDAV) when (parser.name) { "response" -> if (eventType == XmlPullParser.START_TAG && parser.depth == depth + 1) when (parser.propertyName()) { DavResponse.RESPONSE -> at.bitfire.dav4jvm.Response.parse(parser, location, callback) "sync-token" -> SyncToken.NAME -> XmlUtils.readText(parser)?.let { responseProperties += SyncToken(it) } Loading @@ -489,7 +495,7 @@ open class DavResource @JvmOverloads constructor( var eventType = parser.eventType while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_TAG && parser.depth == 1) if (parser.namespace == XmlUtils.NS_WEBDAV && parser.name == "multistatus") if (parser.propertyName() == DavResponse.MULTISTATUS) return parseMultiStatus() // ignore further <multistatus> elements eventType = parser.next() Loading src/main/kotlin/at/bitfire/dav4jvm/Error.kt +2 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ class Error( companion object { val NAME = Property.Name(XmlUtils.NS_WEBDAV, "error") fun parseError(parser: XmlPullParser): List<Error> { val names = mutableSetOf<Property.Name>() Loading Loading
src/main/kotlin/at/bitfire/dav4jvm/DavAddressBook.kt +28 −25 Original line number Diff line number Diff line Loading @@ -6,8 +6,12 @@ package at.bitfire.dav4jvm import at.bitfire.dav4jvm.XmlUtils.insertTag import at.bitfire.dav4jvm.exception.DavException import at.bitfire.dav4jvm.exception.HttpException import at.bitfire.dav4jvm.property.AddressData import at.bitfire.dav4jvm.property.GetContentType import at.bitfire.dav4jvm.property.GetETag import okhttp3.HttpUrl import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient Loading @@ -26,6 +30,10 @@ class DavAddressBook @JvmOverloads constructor( companion object { val MIME_VCARD3_UTF8 = "text/vcard;charset=utf-8".toMediaType() val MIME_VCARD4 = "text/vcard;version=4.0".toMediaType() val ADDRESSBOOK_QUERY = Property.Name(XmlUtils.NS_CARDDAV, "addressbook-query") val ADDRESSBOOK_MULTIGET = Property.Name(XmlUtils.NS_CARDDAV, "addressbook-multiget") val FILTER = Property.Name(XmlUtils.NS_CARDDAV, "filter") } /** Loading @@ -52,14 +60,12 @@ class DavAddressBook @JvmOverloads constructor( serializer.startDocument("UTF-8", null) serializer.setPrefix("", XmlUtils.NS_WEBDAV) serializer.setPrefix("CARD", XmlUtils.NS_CARDDAV) serializer.startTag(XmlUtils.NS_CARDDAV, "addressbook-query") serializer.startTag(XmlUtils.NS_WEBDAV, "prop") serializer.startTag(XmlUtils.NS_WEBDAV, "getetag") serializer.endTag(XmlUtils.NS_WEBDAV, "getetag") serializer.endTag(XmlUtils.NS_WEBDAV, "prop") serializer.startTag(XmlUtils.NS_CARDDAV, "filter") serializer.endTag(XmlUtils.NS_CARDDAV, "filter") serializer.endTag(XmlUtils.NS_CARDDAV, "addressbook-query") serializer.insertTag(ADDRESSBOOK_QUERY) { insertTag(PROP) { insertTag(GetETag.NAME) } insertTag(FILTER) } serializer.endDocument() followRedirects { Loading Loading @@ -99,25 +105,22 @@ class DavAddressBook @JvmOverloads constructor( serializer.startDocument("UTF-8", null) serializer.setPrefix("", XmlUtils.NS_WEBDAV) serializer.setPrefix("CARD", XmlUtils.NS_CARDDAV) serializer.startTag(XmlUtils.NS_CARDDAV, "addressbook-multiget") serializer.startTag(XmlUtils.NS_WEBDAV, "prop") serializer.startTag(XmlUtils.NS_WEBDAV, "getcontenttype") // to determine the character set serializer.endTag(XmlUtils.NS_WEBDAV, "getcontenttype") serializer.startTag(XmlUtils.NS_WEBDAV, "getetag") serializer.endTag(XmlUtils.NS_WEBDAV, "getetag") serializer.startTag(XmlUtils.NS_CARDDAV, "address-data") serializer.insertTag(ADDRESSBOOK_MULTIGET) { insertTag(PROP) { insertTag(GetContentType.NAME) insertTag(GetETag.NAME) insertTag(AddressData.NAME) { if (vCard4) { serializer.attribute(null, "content-type", "text/vcard") serializer.attribute(null, "version", "4.0") attribute(null, AddressData.CONTENT_TYPE, "text/vcard") attribute(null, AddressData.VERSION, "4.0") } } } for (url in urls) insertTag(HREF) { text(url.encodedPath) } serializer.endTag(XmlUtils.NS_CARDDAV, "address-data") serializer.endTag(XmlUtils.NS_WEBDAV, "prop") for (url in urls) { serializer.startTag(XmlUtils.NS_WEBDAV, "href") serializer.text(url.encodedPath) serializer.endTag(XmlUtils.NS_WEBDAV, "href") } serializer.endTag(XmlUtils.NS_CARDDAV, "addressbook-multiget") serializer.endDocument() followRedirects { Loading
src/main/kotlin/at/bitfire/dav4jvm/DavCalendar.kt +43 −40 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ package at.bitfire.dav4jvm import at.bitfire.dav4jvm.XmlUtils.insertTag import at.bitfire.dav4jvm.exception.DavException import at.bitfire.dav4jvm.exception.HttpException import at.bitfire.dav4jvm.property.CalendarData Loading @@ -17,7 +18,6 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody import org.xmlpull.v1.XmlSerializer import java.io.IOException import java.io.StringWriter import java.text.SimpleDateFormat Loading @@ -34,9 +34,19 @@ class DavCalendar @JvmOverloads constructor( val MIME_ICALENDAR = "text/calendar".toMediaType() val MIME_ICALENDAR_UTF8 = "text/calendar;charset=utf-8".toMediaType() val CALENDAR_QUERY = Property.Name(XmlUtils.NS_CALDAV, "calendar-query") val CALENDAR_MULTIGET = Property.Name(XmlUtils.NS_CALDAV, "calendar-multiget") val FILTER = Property.Name(XmlUtils.NS_CALDAV, "filter") val COMP_FILTER = Property.Name(XmlUtils.NS_CALDAV, "comp-filter") const val COMP_FILTER_NAME = "name" val TIME_RANGE = Property.Name(XmlUtils.NS_CALDAV, "time-range") const val TIME_RANGE_START = "start" const val TIME_RANGE_END = "end" private val timeFormatUTC = SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'", Locale.US) init { timeFormatUTC.timeZone = TimeZone.getTimeZone("UTC") timeFormatUTC.timeZone = TimeZone.getTimeZone("Etc/UTC") } } Loading Loading @@ -74,28 +84,27 @@ class DavCalendar @JvmOverloads constructor( serializer.startDocument("UTF-8", null) serializer.setPrefix("", XmlUtils.NS_WEBDAV) serializer.setPrefix("CAL", XmlUtils.NS_CALDAV) serializer.startTag(XmlUtils.NS_CALDAV, "calendar-query") serializer.startTag(XmlUtils.NS_WEBDAV, "prop") serializer.startTag(XmlUtils.NS_WEBDAV, "getetag") serializer.endTag(XmlUtils.NS_WEBDAV, "getetag") serializer.endTag(XmlUtils.NS_WEBDAV, "prop") serializer.startTag(XmlUtils.NS_CALDAV, "filter") serializer.startTag(XmlUtils.NS_CALDAV, "comp-filter") serializer.attribute(null, "name", "VCALENDAR") serializer.startTag(XmlUtils.NS_CALDAV, "comp-filter") serializer.attribute(null, "name", component) serializer.insertTag(CALENDAR_QUERY) { insertTag(PROP) { insertTag(GetETag.NAME) } insertTag(FILTER) { insertTag(COMP_FILTER) { attribute(null, COMP_FILTER_NAME, "VCALENDAR") insertTag(COMP_FILTER) { attribute(null, COMP_FILTER_NAME, component) if (start != null || end != null) { serializer.startTag(XmlUtils.NS_CALDAV, "time-range") insertTag(TIME_RANGE) { if (start != null) serializer.attribute(null, "start", timeFormatUTC.format(start)) attribute(null, TIME_RANGE_START, timeFormatUTC.format(start)) if (end != null) serializer.attribute(null, "end", timeFormatUTC.format(end)) serializer.endTag(XmlUtils.NS_CALDAV, "time-range") attribute(null, TIME_RANGE_END, timeFormatUTC.format(end)) } } } } } } serializer.endTag(XmlUtils.NS_CALDAV, "comp-filter") serializer.endTag(XmlUtils.NS_CALDAV, "comp-filter") serializer.endTag(XmlUtils.NS_CALDAV, "filter") serializer.endTag(XmlUtils.NS_CALDAV, "calendar-query") serializer.endDocument() followRedirects { Loading Loading @@ -124,11 +133,6 @@ class DavCalendar @JvmOverloads constructor( * @throws DavException on WebDAV error */ fun multiget(urls: List<HttpUrl>, callback: DavResponseCallback): List<Property> { fun XmlSerializer.emptyTag(propertyName: Property.Name) { startTag(propertyName.namespace, propertyName.name) endTag(propertyName.namespace, propertyName.name) } /* <!ELEMENT calendar-multiget ((DAV:allprop | DAV:propname | DAV:prop)?, DAV:href+)> Loading @@ -139,19 +143,18 @@ class DavCalendar @JvmOverloads constructor( serializer.startDocument("UTF-8", null) serializer.setPrefix("", XmlUtils.NS_WEBDAV) serializer.setPrefix("CAL", XmlUtils.NS_CALDAV) serializer.startTag(XmlUtils.NS_CALDAV, "calendar-multiget") serializer.startTag(XmlUtils.NS_WEBDAV, "prop") serializer.emptyTag(GetContentType.NAME) // to determine the character set serializer.emptyTag(GetETag.NAME) serializer.emptyTag(ScheduleTag.NAME) serializer.emptyTag(CalendarData.NAME) serializer.endTag(XmlUtils.NS_WEBDAV, "prop") for (url in urls) { serializer.startTag(XmlUtils.NS_WEBDAV, "href") serializer.insertTag(CALENDAR_MULTIGET) { insertTag(PROP) { insertTag(GetContentType.NAME) // to determine the character set insertTag(GetETag.NAME) insertTag(ScheduleTag.NAME) insertTag(CalendarData.NAME) } for (url in urls) insertTag(HREF) { serializer.text(url.encodedPath) serializer.endTag(XmlUtils.NS_WEBDAV, "href") } serializer.endTag(XmlUtils.NS_CALDAV, "calendar-multiget") } serializer.endDocument() followRedirects { Loading
src/main/kotlin/at/bitfire/dav4jvm/DavCollection.kt +25 −19 Original line number Diff line number Diff line Loading @@ -6,6 +6,7 @@ package at.bitfire.dav4jvm import at.bitfire.dav4jvm.XmlUtils.insertTag import at.bitfire.dav4jvm.exception.DavException import at.bitfire.dav4jvm.exception.HttpException import at.bitfire.dav4jvm.property.SyncToken Loading @@ -25,6 +26,13 @@ open class DavCollection @JvmOverloads constructor( log: Logger = Dav4jvm.log ): DavResource(httpClient, location, log) { companion object { val SYNC_COLLECTION = Property.Name(XmlUtils.NS_WEBDAV, "sync-collection") val SYNC_LEVEL = Property.Name(XmlUtils.NS_WEBDAV, "sync-level") val LIMIT = Property.Name(XmlUtils.NS_WEBDAV, "limit") val NRESULTS = Property.Name(XmlUtils.NS_WEBDAV, "nresults") } /** * Sends a REPORT sync-collection request. * Loading Loading @@ -57,27 +65,25 @@ open class DavCollection @JvmOverloads constructor( serializer.setOutput(writer) serializer.startDocument("UTF-8", null) serializer.setPrefix("", XmlUtils.NS_WEBDAV) serializer.startTag(XmlUtils.NS_WEBDAV, "sync-collection") serializer.startTag(SyncToken.NAME.namespace, SyncToken.NAME.name) syncToken?.let { serializer.text(it) } serializer.endTag(SyncToken.NAME.namespace, SyncToken.NAME.name) serializer.startTag(XmlUtils.NS_WEBDAV, "sync-level") serializer.text(if (infiniteDepth) "infinite" else "1") serializer.endTag(XmlUtils.NS_WEBDAV, "sync-level") limit?.let { nresults -> serializer.startTag(XmlUtils.NS_WEBDAV, "limit") serializer.startTag(XmlUtils.NS_WEBDAV, "nresults") serializer.text(nresults.toString()) serializer.endTag(XmlUtils.NS_WEBDAV, "nresults") serializer.endTag(XmlUtils.NS_WEBDAV, "limit") serializer.insertTag(SYNC_COLLECTION) { insertTag(SyncToken.NAME) { if (syncToken != null) text(syncToken) } insertTag(SYNC_LEVEL) { text(if (infiniteDepth) "infinite" else "1") } if (limit != null) insertTag(LIMIT) { insertTag(NRESULTS) { text(limit.toString()) } } insertTag(PROP) { for (prop in properties) insertTag(prop) } serializer.startTag(XmlUtils.NS_WEBDAV, "prop") properties.forEach { serializer.startTag(it.namespace, it.name) serializer.endTag(it.namespace, it.name) } serializer.endTag(XmlUtils.NS_WEBDAV, "prop") serializer.endTag(XmlUtils.NS_WEBDAV, "sync-collection") serializer.endDocument() followRedirects { Loading
src/main/kotlin/at/bitfire/dav4jvm/DavResource.kt +19 −13 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ package at.bitfire.dav4jvm import at.bitfire.dav4jvm.XmlUtils.insertTag import at.bitfire.dav4jvm.XmlUtils.propertyName import at.bitfire.dav4jvm.exception.* import at.bitfire.dav4jvm.property.SyncToken import okhttp3.* Loading @@ -20,6 +22,7 @@ import java.io.Reader import java.io.StringWriter import java.net.HttpURLConnection import java.util.logging.Logger import at.bitfire.dav4jvm.Response as DavResponse /** * Represents a WebDAV resource at the given location and allows WebDAV Loading @@ -41,7 +44,12 @@ open class DavResource @JvmOverloads constructor( companion object { const val MAX_REDIRECTS = 5 val MIME_XML = "application/xml; charset=utf-8".toMediaType() val PROPFIND = Property.Name(XmlUtils.NS_WEBDAV, "propfind") val PROP = Property.Name(XmlUtils.NS_WEBDAV, "prop") val HREF = Property.Name(XmlUtils.NS_WEBDAV, "href") } /** Loading Loading @@ -314,14 +322,12 @@ open class DavResource @JvmOverloads constructor( serializer.setPrefix("CAL", XmlUtils.NS_CALDAV) serializer.setPrefix("CARD", XmlUtils.NS_CARDDAV) serializer.startDocument("UTF-8", null) serializer.startTag(XmlUtils.NS_WEBDAV, "propfind") serializer.startTag(XmlUtils.NS_WEBDAV, "prop") for (prop in reqProp) { serializer.startTag(prop.namespace, prop.name) serializer.endTag(prop.namespace, prop.name) } serializer.endTag(XmlUtils.NS_WEBDAV, "prop") serializer.endTag(XmlUtils.NS_WEBDAV, "propfind") serializer.insertTag(PROPFIND) { insertTag(PROP) { for (prop in reqProp) insertTag(prop) } } serializer.endDocument() followRedirects { Loading Loading @@ -468,11 +474,11 @@ open class DavResource @JvmOverloads constructor( val depth = parser.depth var eventType = parser.eventType while (!(eventType == XmlPullParser.END_TAG && parser.depth == depth)) { if (eventType == XmlPullParser.START_TAG && parser.depth == depth + 1 && parser.namespace == XmlUtils.NS_WEBDAV) when (parser.name) { "response" -> if (eventType == XmlPullParser.START_TAG && parser.depth == depth + 1) when (parser.propertyName()) { DavResponse.RESPONSE -> at.bitfire.dav4jvm.Response.parse(parser, location, callback) "sync-token" -> SyncToken.NAME -> XmlUtils.readText(parser)?.let { responseProperties += SyncToken(it) } Loading @@ -489,7 +495,7 @@ open class DavResource @JvmOverloads constructor( var eventType = parser.eventType while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_TAG && parser.depth == 1) if (parser.namespace == XmlUtils.NS_WEBDAV && parser.name == "multistatus") if (parser.propertyName() == DavResponse.MULTISTATUS) return parseMultiStatus() // ignore further <multistatus> elements eventType = parser.next() Loading
src/main/kotlin/at/bitfire/dav4jvm/Error.kt +2 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ class Error( companion object { val NAME = Property.Name(XmlUtils.NS_WEBDAV, "error") fun parseError(parser: XmlPullParser): List<Error> { val names = mutableSetOf<Property.Name>() Loading