summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <michael.stahl@allotropia.de>2021-12-14 16:44:14 +0100
committerMichael Stahl <michael.stahl@allotropia.de>2021-12-15 15:24:52 +0100
commit023ebf17898db4bca63129f079fd90b5cf76c1a9 (patch)
treef0c72239af05ea4b1435b69ebf38d9ab88c49e47
parentf45b7871e7d31dfc6ed31d1b79928990bba0d0dd (diff)
ucb: remove --with-webdav=neon
Remove code in ucb/source/ucp/webdav-neon, and now unused external neon. The --with-webdav=no option is retained for now. Change-Id: I4ce429587e3991fa82009da2f8e4a068abe36435 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/126839 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
-rw-r--r--Makefile.fetch1
-rw-r--r--RepositoryExternal.mk40
-rw-r--r--compilerplugins/clang/stringstatic.cxx3
-rw-r--r--compilerplugins/clang/toolslong.cxx3
-rw-r--r--compilerplugins/clang/unusedvariableplus.cxx3
-rw-r--r--config_host.mk.in4
-rw-r--r--configure.ac18
-rw-r--r--distro-configs/LibreOfficeFlatpak.conf1
-rw-r--r--distro-configs/LibreOfficeOpenBSD.conf1
-rw-r--r--download.lst2
-rw-r--r--external/Module_external.mk1
-rw-r--r--external/neon/Library_neon.mk100
-rw-r--r--external/neon/Makefile7
-rw-r--r--external/neon/Module_neon.mk17
-rw-r--r--external/neon/README1
-rw-r--r--external/neon/UnpackedTarball_neon.mk27
-rw-r--r--external/neon/configs/config.h603
-rw-r--r--external/neon/neon.def292
-rw-r--r--external/neon/neon.patch311
-rw-r--r--external/neon/neon_fix_lock_token_on_if.patch12
-rw-r--r--external/neon/neon_fix_no_OPENSSL_Applink.patch11
-rw-r--r--external/neon/neon_with_gnutls.patch29
-rw-r--r--readlicense_oo/license/license.xml14
-rw-r--r--solenv/clang-format/excludelist50
-rw-r--r--ucb/IwyuFilter_ucb.yaml67
-rw-r--r--ucb/Library_ucpdav1.mk46
-rw-r--r--ucb/README.md5
-rw-r--r--ucb/source/ucp/webdav-neon/ContentProperties.cxx558
-rw-r--r--ucb/source/ucp/webdav-neon/ContentProperties.hxx183
-rw-r--r--ucb/source/ucp/webdav-neon/DAVAuthListener.hxx50
-rw-r--r--ucb/source/ucp/webdav-neon/DAVAuthListenerImpl.hxx69
-rw-r--r--ucb/source/ucp/webdav-neon/DAVException.hxx174
-rw-r--r--ucb/source/ucp/webdav-neon/DAVProperties.cxx193
-rw-r--r--ucb/source/ucp/webdav-neon/DAVProperties.hxx69
-rw-r--r--ucb/source/ucp/webdav-neon/DAVRequestEnvironment.hxx64
-rw-r--r--ucb/source/ucp/webdav-neon/DAVResource.hxx70
-rw-r--r--ucb/source/ucp/webdav-neon/DAVResourceAccess.cxx1192
-rw-r--r--ucb/source/ucp/webdav-neon/DAVResourceAccess.hxx231
-rw-r--r--ucb/source/ucp/webdav-neon/DAVSession.hxx213
-rw-r--r--ucb/source/ucp/webdav-neon/DAVSessionFactory.cxx99
-rw-r--r--ucb/source/ucp/webdav-neon/DAVSessionFactory.hxx85
-rw-r--r--ucb/source/ucp/webdav-neon/DAVTypes.cxx189
-rw-r--r--ucb/source/ucp/webdav-neon/DAVTypes.hxx208
-rw-r--r--ucb/source/ucp/webdav-neon/DateTimeHelper.cxx247
-rw-r--r--ucb/source/ucp/webdav-neon/DateTimeHelper.hxx61
-rw-r--r--ucb/source/ucp/webdav-neon/LinkSequence.cxx214
-rw-r--r--ucb/source/ucp/webdav-neon/LinkSequence.hxx49
-rw-r--r--ucb/source/ucp/webdav-neon/LockEntrySequence.cxx246
-rw-r--r--ucb/source/ucp/webdav-neon/LockEntrySequence.hxx45
-rw-r--r--ucb/source/ucp/webdav-neon/LockSequence.cxx360
-rw-r--r--ucb/source/ucp/webdav-neon/LockSequence.hxx48
-rw-r--r--ucb/source/ucp/webdav-neon/NeonHeadRequest.cxx139
-rw-r--r--ucb/source/ucp/webdav-neon/NeonHeadRequest.hxx53
-rw-r--r--ucb/source/ucp/webdav-neon/NeonInputStream.cxx136
-rw-r--r--ucb/source/ucp/webdav-neon/NeonInputStream.hxx95
-rw-r--r--ucb/source/ucp/webdav-neon/NeonLockStore.cxx241
-rw-r--r--ucb/source/ucp/webdav-neon/NeonLockStore.hxx97
-rw-r--r--ucb/source/ucp/webdav-neon/NeonPropFindRequest.cxx320
-rw-r--r--ucb/source/ucp/webdav-neon/NeonPropFindRequest.hxx63
-rw-r--r--ucb/source/ucp/webdav-neon/NeonSession.cxx2359
-rw-r--r--ucb/source/ucp/webdav-neon/NeonSession.hxx285
-rw-r--r--ucb/source/ucp/webdav-neon/NeonTypes.hxx54
-rw-r--r--ucb/source/ucp/webdav-neon/NeonUri.cxx291
-rw-r--r--ucb/source/ucp/webdav-neon/NeonUri.hxx103
-rw-r--r--ucb/source/ucp/webdav-neon/PropertyMap.hxx65
-rw-r--r--ucb/source/ucp/webdav-neon/PropfindCache.cxx86
-rw-r--r--ucb/source/ucp/webdav-neon/PropfindCache.hxx77
-rw-r--r--ucb/source/ucp/webdav-neon/UCBDeadPropertyValue.cxx509
-rw-r--r--ucb/source/ucp/webdav-neon/UCBDeadPropertyValue.hxx50
-rw-r--r--ucb/source/ucp/webdav-neon/ucpdav1.component35
-rw-r--r--ucb/source/ucp/webdav-neon/webdavcontent.cxx4197
-rw-r--r--ucb/source/ucp/webdav-neon/webdavcontent.hxx317
-rw-r--r--ucb/source/ucp/webdav-neon/webdavcontentcaps.cxx646
-rw-r--r--ucb/source/ucp/webdav-neon/webdavdatasupplier.cxx487
-rw-r--r--ucb/source/ucp/webdav-neon/webdavdatasupplier.hxx78
-rw-r--r--ucb/source/ucp/webdav-neon/webdavprovider.cxx189
-rw-r--r--ucb/source/ucp/webdav-neon/webdavprovider.hxx105
-rw-r--r--ucb/source/ucp/webdav-neon/webdavresultset.cxx86
-rw-r--r--ucb/source/ucp/webdav-neon/webdavresultset.hxx57
79 files changed, 3 insertions, 17803 deletions
diff --git a/Makefile.fetch b/Makefile.fetch
index ba8e58d5f4be..b988fbf7e717 100644
--- a/Makefile.fetch
+++ b/Makefile.fetch
@@ -192,7 +192,6 @@ $(WORKDIR)/download: $(BUILDDIR)/config_$(gb_Side).mk $(SRCDIR)/download.lst $(S
$(call fetch_Optional,MSPUB,MSPUB_TARBALL) \
$(call fetch_Optional,MWAW,MWAW_TARBALL) \
$(call fetch_Optional,MYTHES,MYTHES_TARBALL) \
- $(call fetch_Optional,NEON,NEON_TARBALL) \
$(call fetch_Optional,NSS,NSS_TARBALL) \
$(call fetch_Optional_pack,NUMBERTEXT_EXTENSION_PACK) \
$(call fetch_Optional,ODFGEN,ODFGEN_TARBALL) \
diff --git a/RepositoryExternal.mk b/RepositoryExternal.mk
index dbe4d8e28ba4..5569aa0f1027 100644
--- a/RepositoryExternal.mk
+++ b/RepositoryExternal.mk
@@ -1080,46 +1080,6 @@ endef
endif # SYSTEM_LIBLANGTAG
-ifeq ($(WITH_WEBDAV),neon)
-
-ifneq ($(SYSTEM_NEON),)
-
-define gb_LinkTarget__use_neon
-$(call gb_LinkTarget_add_defs,$(1),\
- -DNEON_VERSION=0x$(NEON_VERSION) \
- -DSYSTEM_NEON \
-)
-$(call gb_LinkTarget_set_include,$(1),\
- $$(INCLUDE) \
- $(NEON_CFLAGS) \
-)
-
-$(call gb_LinkTarget_add_libs,$(1),$(NEON_LIBS))
-
-endef
-
-else # !SYSTEM_NEON
-
-$(eval $(call gb_Helper_register_libraries_for_install,PLAINLIBS_OOO,ooo,\
- neon \
-))
-
-define gb_LinkTarget__use_neon
-$(call gb_LinkTarget_use_unpacked,$(1),neon)
-$(call gb_LinkTarget_set_include,$(1),\
- -I$(call gb_UnpackedTarball_get_dir,neon/src) \
- $$(INCLUDE) \
-)
-$(call gb_LinkTarget_use_libraries,$(1),\
- neon \
-)
-
-endef
-
-endif # SYSTEM_NEON
-
-endif # WITH_WEBDAV
-
ifneq ($(SYSTEM_REDLAND),)
define gb_LinkTarget__use_librdf
diff --git a/compilerplugins/clang/stringstatic.cxx b/compilerplugins/clang/stringstatic.cxx
index 364bc566aa97..a6b5b7d2e8fe 100644
--- a/compilerplugins/clang/stringstatic.cxx
+++ b/compilerplugins/clang/stringstatic.cxx
@@ -58,9 +58,6 @@ bool StringStatic::preRun()
// passing around pointers to global OUString
if (loplugin::hasPathnamePrefix(fn, SRCDIR "/filter/source/svg/"))
return false;
- // has a mix of literals and refs to external OUStrings
- if (loplugin::isSamePathname(fn, SRCDIR "/ucb/source/ucp/webdav-neon/ContentProperties.cxx"))
- return false;
return true;
}
diff --git a/compilerplugins/clang/toolslong.cxx b/compilerplugins/clang/toolslong.cxx
index 9a762c99af76..38beb8ed19b0 100644
--- a/compilerplugins/clang/toolslong.cxx
+++ b/compilerplugins/clang/toolslong.cxx
@@ -156,8 +156,7 @@ void ToolsLong::run()
|| loplugin::isSamePathname(fn, SRCDIR
"/shell/source/win32/shlxthandler/ooofilt/stream_helper.cxx")
|| loplugin::isSamePathname(fn, SRCDIR "/shell/source/win32/zipfile/zipfile.cxx")
- || loplugin::isSamePathname(fn, SRCDIR "/ucb/source/ucp/webdav-curl/CurlSession.cxx")
- || loplugin::isSamePathname(fn, SRCDIR "/ucb/source/ucp/webdav-neon/NeonSession.cxx"))
+ || loplugin::isSamePathname(fn, SRCDIR "/ucb/source/ucp/webdav-curl/CurlSession.cxx"))
return;
// these are places where the external API is actually "long"
if (loplugin::isSamePathname(fn, SRCDIR "/vcl/source/filter/jpeg/JpegReader.cxx"))
diff --git a/compilerplugins/clang/unusedvariableplus.cxx b/compilerplugins/clang/unusedvariableplus.cxx
index b5c92082c400..845a4eedb2a7 100644
--- a/compilerplugins/clang/unusedvariableplus.cxx
+++ b/compilerplugins/clang/unusedvariableplus.cxx
@@ -435,9 +435,6 @@ public:
"VersionCompatRead",
"VersionCompatWrite",
"SlideShowImpl::WaitSymbolLock",
- "webdav_ucp::NeonHeadRequest",
- "webdav_ucp::NeonPropFindRequest",
- "webdav_ucp::NeonUri",
"weld::WaitObject",
"writerfilter::ooxml::(anonymous namespace)::StatusIndicatorGuard",
"WriterSpecificAutoFormatBlock",
diff --git a/config_host.mk.in b/config_host.mk.in
index 3ad4b010ef48..2717ef888d13 100644
--- a/config_host.mk.in
+++ b/config_host.mk.in
@@ -455,9 +455,6 @@ export MYTHES_CFLAGS=$(gb_SPACE)@MYTHES_CFLAGS@
export MYTHES_LIBS=$(gb_SPACE)@MYTHES_LIBS@
export NASM=@NASM@
export NAFLAGS=@NAFLAGS@
-export NEON_CFLAGS=$(gb_SPACE)@NEON_CFLAGS@
-export NEON_LIBS=$(gb_SPACE)@NEON_LIBS@
-export NEON_VERSION=@NEON_VERSION@
export NM=@NM@
export NSS_CFLAGS=$(gb_SPACE)@NSS_CFLAGS@
export NSS_LIBS=$(gb_SPACE)@NSS_LIBS@
@@ -633,7 +630,6 @@ export SYSTEM_MARIADB_CONNECTOR_C=@SYSTEM_MARIADB_CONNECTOR_C@
export SYSTEM_MSPUB=@SYSTEM_MSPUB@
export SYSTEM_MWAW=@SYSTEM_MWAW@
export SYSTEM_MYTHES=@SYSTEM_MYTHES@
-export SYSTEM_NEON=@SYSTEM_NEON@
export SYSTEM_NSS=@SYSTEM_NSS@
export SYSTEM_ODBC_HEADERS=@SYSTEM_ODBC_HEADERS@
export SYSTEM_ODFGEN=@SYSTEM_ODFGEN@
diff --git a/configure.ac b/configure.ac
index c259558abc87..12e90717037f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2070,7 +2070,7 @@ AC_ARG_WITH(tls,
AS_HELP_STRING([--with-tls],
[Decides which TLS/SSL and cryptographic implementations to use for
LibreOffice's code. Notice that this doesn't apply for depending
- libraries like "neon", for example. Default is to use NSS
+ libraries like "curl", for example. Default is to use NSS
although OpenSSL is also possible. Notice that selecting NSS restricts
the usage of OpenSSL in LO's code but selecting OpenSSL doesn't
restrict by now the usage of NSS in LO's code. Possible values:
@@ -2429,7 +2429,7 @@ AC_ARG_WITH(system-lockfile,
AC_ARG_WITH(webdav,
AS_HELP_STRING([--with-webdav],
[Specify which library to use for webdav implementation.
- Possible values: "neon", "curl", "no". The default value is "neon".
+ Possible values: "curl", "no". The default value is "curl".
Example: --with-webdav="curl"]))
AC_ARG_WITH(linker-hash-style,
@@ -10848,17 +10848,6 @@ curl)
AC_MSG_ERROR(["--with-webdav=curl conflicts with --disable-curl"])
fi
;;
-neon)
- AC_MSG_RESULT([neon])
- # Check for system neon
- libo_CHECK_SYSTEM_MODULE([neon],[NEON],[neon >= 0.31.2])
- if test "$with_system_neon" = "yes"; then
- NEON_VERSION="`$PKG_CONFIG --modversion neon | $SED 's/\.//g'`"
- else
- NEON_VERSION=0312
- fi
- AC_SUBST(NEON_VERSION)
- ;;
*)
AC_MSG_RESULT([none, disabled])
WITH_WEBDAV=""
@@ -14337,9 +14326,6 @@ if test "$enable_mpl_subset" = "yes"; then
if test "$enable_lotuswordpro" = "yes"; then
AC_MSG_ERROR([need to --disable-lotuswordpro - a Lotus Word Pro file format import filter.])
fi
- if test "$WITH_WEBDAV" = "neon"; then
- AC_MSG_ERROR([need --with-webdav=curl or --without-webdav - webdav support.])
- fi
if test -n "$ENABLE_POPPLER"; then
if test "x$SYSTEM_POPPLER" = "x"; then
AC_MSG_ERROR([need to disable PDF import via poppler or use system library])
diff --git a/distro-configs/LibreOfficeFlatpak.conf b/distro-configs/LibreOfficeFlatpak.conf
index 438252c6c408..beb3353c6aec 100644
--- a/distro-configs/LibreOfficeFlatpak.conf
+++ b/distro-configs/LibreOfficeFlatpak.conf
@@ -51,7 +51,6 @@
--without-system-lpsolve
--without-system-mariadb
--without-system-mdds
---without-system-neon
--without-system-odbc
--without-system-openldap
--without-system-orcus
diff --git a/distro-configs/LibreOfficeOpenBSD.conf b/distro-configs/LibreOfficeOpenBSD.conf
index 241b0153b605..2af93a64202a 100644
--- a/distro-configs/LibreOfficeOpenBSD.conf
+++ b/distro-configs/LibreOfficeOpenBSD.conf
@@ -22,7 +22,6 @@
--with-system-jars
--with-system-jpeg
--with-system-libxml
---with-system-neon
--with-system-openssl
--with-system-poppler
--with-system-redland
diff --git a/download.lst b/download.lst
index 0288736795ac..3d5f8917b286 100644
--- a/download.lst
+++ b/download.lst
@@ -185,8 +185,6 @@ export MWAW_VERSION_MICRO := 21
export MWAW_TARBALL := libmwaw-0.3.$(MWAW_VERSION_MICRO).tar.xz
export MYTHES_SHA256SUM := 1e81f395d8c851c3e4e75b568e20fa2fa549354e75ab397f9de4b0e0790a305f
export MYTHES_TARBALL := a8c2c5b8f09e7ede322d5c602ff6a4b6-mythes-1.2.4.tar.gz
-export NEON_SHA256SUM := cf1ee3ac27a215814a9c80803fcee4f0ede8466ebead40267a9bd115e16a8678
-export NEON_TARBALL := neon-0.31.2.tar.gz
export NSS_SHA256SUM := 07a9e5b70f121a62706140d4cacc3006d3efb869da40f3a2bf7a65d37847f4d9
export NSS_TARBALL := nss-3.73-with-nspr-4.32.tar.gz
export ODFGEN_SHA256SUM := 55200027fd46623b9bdddd38d275e7452d1b0ff8aeddcad6f9ae6dc25f610625
diff --git a/external/Module_external.mk b/external/Module_external.mk
index 121be4f8e106..66759274caa8 100644
--- a/external/Module_external.mk
+++ b/external/Module_external.mk
@@ -75,7 +75,6 @@ $(eval $(call gb_Module_add_moduledirs,external,\
$(call gb_Helper_optional,MSPUB,libmspub) \
$(call gb_Helper_optional,MWAW,libmwaw) \
$(call gb_Helper_optional,MYTHES,mythes) \
- $(call gb_Helper_optional,NEON,neon) \
$(call gb_Helper_optional,NSS,nss) \
$(call gb_Helper_optional,ODFGEN,libodfgen) \
$(call gb_Helper_optional,OPENLDAP,openldap) \
diff --git a/external/neon/Library_neon.mk b/external/neon/Library_neon.mk
deleted file mode 100644
index 4a0e069b39fa..000000000000
--- a/external/neon/Library_neon.mk
+++ /dev/null
@@ -1,100 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-$(eval $(call gb_Library_Library,neon))
-
-$(eval $(call gb_Library_use_unpacked,neon,neon))
-
-$(eval $(call gb_Library_use_externals,neon,\
- gnutls \
- libxml2 \
- libgcrypt \
- openssl \
- openssl_headers \
- zlib \
-))
-
-$(eval $(call gb_Library_set_visibility_default,neon))
-
-$(eval $(call gb_Library_set_warnings_disabled,neon))
-
-$(eval $(call gb_Library_add_generated_cobjects,neon,\
- UnpackedTarball/neon/src/ne_207 \
- UnpackedTarball/neon/src/ne_acl3744 \
- UnpackedTarball/neon/src/ne_alloc \
- UnpackedTarball/neon/src/ne_auth \
- UnpackedTarball/neon/src/ne_basic \
- UnpackedTarball/neon/src/ne_compress \
- UnpackedTarball/neon/src/ne_dates \
- UnpackedTarball/neon/src/ne_i18n \
- UnpackedTarball/neon/src/ne_locks \
- UnpackedTarball/neon/src/ne_md5 \
- UnpackedTarball/neon/src/ne_props \
- UnpackedTarball/neon/src/ne_redirect \
- UnpackedTarball/neon/src/ne_request \
- UnpackedTarball/neon/src/ne_session \
- UnpackedTarball/neon/src/ne_socket \
- UnpackedTarball/neon/src/ne_socks \
- UnpackedTarball/neon/src/ne_string \
- UnpackedTarball/neon/src/ne_uri \
- UnpackedTarball/neon/src/ne_utils \
- UnpackedTarball/neon/src/ne_xml \
- UnpackedTarball/neon/src/ne_xmlreq \
-))
-
-
-ifeq ($(ENABLE_OPENSSL),TRUE)
-$(eval $(call gb_Library_add_generated_cobjects,neon,\
- UnpackedTarball/neon/src/ne_openssl \
-))
-else
-$(eval $(call gb_Library_add_generated_cobjects,neon,\
- UnpackedTarball/neon/src/ne_gnutls \
-))
-endif
-
-
-ifeq ($(OS),WNT)
-$(eval $(call gb_Library_use_system_win32_libs,neon,\
- ws2_32 \
- crypt32 \
-))
-
-ifeq ($(COM),MSC)
-$(eval $(call gb_Library_add_ldflags,neon,\
- /DEF:$(SRCDIR)/external/neon/neon.def \
-))
-endif
-
-$(eval $(call gb_Library_add_generated_cobjects,neon,\
- UnpackedTarball/neon/src/ne_sspi \
-))
-
-else
-ifeq ($(ENABLE_OPENSSL),TRUE)
-$(eval $(call gb_Library_add_generated_cobjects,neon,\
- UnpackedTarball/neon/src/ne_ntlm \
-))
-endif
-
-endif
-
-ifeq ($(OS),LINUX)
-$(eval $(call gb_Library_add_libs,neon,\
- -ldl \
-))
-endif
-
-ifneq (,$(gb_ENABLE_DBGUTIL))
-$(eval $(call gb_Library_add_cflags,neon,\
- -DNE_DEBUGGING \
-))
-endif
-
-# vim: set noet sw=4 ts=4:
diff --git a/external/neon/Makefile b/external/neon/Makefile
deleted file mode 100644
index e4968cf85fb6..000000000000
--- a/external/neon/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-
-module_directory:=$(dir $(realpath $(firstword $(MAKEFILE_LIST))))
-
-include $(module_directory)/../../solenv/gbuild/partial_build.mk
-
-# vim: set noet sw=4 ts=4:
diff --git a/external/neon/Module_neon.mk b/external/neon/Module_neon.mk
deleted file mode 100644
index cc2e0cb5e2a6..000000000000
--- a/external/neon/Module_neon.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-$(eval $(call gb_Module_Module,neon))
-
-$(eval $(call gb_Module_add_targets,neon,\
- Library_neon \
- UnpackedTarball_neon \
-))
-
-# vim: set noet sw=4 ts=4:
diff --git a/external/neon/README b/external/neon/README
deleted file mode 100644
index e983ae8223b5..000000000000
--- a/external/neon/README
+++ /dev/null
@@ -1 +0,0 @@
-Web library to help deal with WebDAV or other protocols, from [https://notroj.github.io/neon/].
diff --git a/external/neon/UnpackedTarball_neon.mk b/external/neon/UnpackedTarball_neon.mk
deleted file mode 100644
index 73cdd81f2e18..000000000000
--- a/external/neon/UnpackedTarball_neon.mk
+++ /dev/null
@@ -1,27 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-$(eval $(call gb_UnpackedTarball_UnpackedTarball,neon))
-
-$(eval $(call gb_UnpackedTarball_set_tarball,neon,$(NEON_TARBALL)))
-
-$(eval $(call gb_UnpackedTarball_add_files,neon,src,\
- external/neon/configs/config.h \
-))
-
-$(eval $(call gb_UnpackedTarball_set_patchlevel,neon,0))
-
-$(eval $(call gb_UnpackedTarball_add_patches,neon,\
- external/neon/neon.patch \
- external/neon/neon_with_gnutls.patch \
- external/neon/neon_fix_lock_token_on_if.patch \
- $(if $(filter WNT,$(OS)),external/neon/neon_fix_no_OPENSSL_Applink.patch) \
-))
-
-# vim: set noet sw=4 ts=4:
diff --git a/external/neon/configs/config.h b/external/neon/configs/config.h
deleted file mode 100644
index 9ac5f6ce4c3f..000000000000
--- a/external/neon/configs/config.h
+++ /dev/null
@@ -1,603 +0,0 @@
-/* Contents kept in sync with config.h.in from neon 0.31.2 */
-
-/* Define if building universal (internal helper macro) */
-/* #undef AC_APPLE_UNIVERSAL_BUILD */
-
-/* Define to specific EGD socket path */
-/* #undef EGD_PATH */
-
-/* Define if EGD should be supported */
-/* #undef ENABLE_EGD */
-
-/* Define if GSS_C_NT_HOSTBASED_SERVICE is not defined otherwise */
-/* #undef GSS_C_NT_HOSTBASED_SERVICE */
-
-/* Define to 1 if you have the <arpa/inet.h> header file. */
-#ifdef UNX
-#define HAVE_ARPA_INET_H 1
-#endif
-
-/* Define to 1 if you have the `bind_textdomain_codeset' function. */
-/* #undef HAVE_BIND_TEXTDOMAIN_CODESET */
-
-/* Define to 1 if you have the `CRYPTO_set_idptr_callback' function. */
-/* #undef HAVE_CRYPTO_SET_IDPTR_CALLBACK */
-
-/* Define to 1 if you have the declaration of `h_errno', and to 0 if you
- don't. */
-#ifdef _WIN32
-#define HAVE_DECL_H_ERRNO 1
-#endif
-
-/* Define to 1 if you have the declaration of `stpcpy', and to 0 if you don't.
- */
-#ifdef LINUX
-#define HAVE_DECL_STPCPY 1
-#endif
-
-/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you
- don't. */
-#ifdef LINUX
-#define HAVE_DECL_STRERROR_R 1
-#endif
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#ifdef UNX
-#define HAVE_DLFCN_H 1
-#endif
-
-/* Define to 1 if you have the <errno.h> header file. */
-#define HAVE_ERRNO_H 1
-
-/* Define if you have expat */
-/* #undef HAVE_EXPAT */
-
-/* Define to 1 if you have the `fcntl' function. */
-#ifdef UNX
-#define HAVE_FCNTL 1
-#endif
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#ifdef UNX
-#define HAVE_FCNTL_H 1
-#endif
-
-/* Define to 1 if you have the `fstat64' function. */
-#define HAVE_FSTAT64
-
-/* Define to 1 if you have the `gai_strerror' function. */
-#define HAVE_GAI_STRERROR 1
-
-/* Define to 1 if you have the `gethostname' function. */
-/* #undef HAVE_GETHOSTNAME */
-
-/* Define to 1 if you have the `getnameinfo' function. */
-/* #undef HAVE_GETNAMEINFO */
-
-/* Define to 1 if you have the `getsockopt' function. */
-#ifdef UNX
-#define HAVE_GETSOCKOPT 1
-#endif
-
-#ifdef DISABLE_OPENSSL
-/* Define if GnuTLS support is enabled */
-#define HAVE_GNUTLS
-
-/* Define to 1 if you have the `gnutls_certificate_get_x509_cas' function. */
-/* #undef HAVE_GNUTLS_CERTIFICATE_GET_X509_CAS */
-
-/* Define to 1 if you have the `gnutls_certificate_verify_peers2' function. */
-#define HAVE_GNUTLS_CERTIFICATE_VERIFY_PEERS2
-
-/* Define to 1 if you have the `gnutls_session_get_data2' function. */
-#define HAVE_GNUTLS_SESSION_GET_DATA2
-
-/* Define to 1 if you have the `gnutls_sign_callback_set' function. */
-#define HAVE_GNUTLS_SIGN_CALLBACK_SET
-
-/* Define to 1 if you have the `gnutls_x509_dn_get_rdn_ava' function. */
-#define HAVE_GNUTLS_X509_DN_GET_RDN_AVA
-#endif /* DISABLE_OPENSSL */
-
-/* Define if GSSAPI support is enabled */
-/* #undef HAVE_GSSAPI */
-
-/* Define to 1 if you have the <gssapi/gssapi_generic.h> header file. */
-/* #undef HAVE_GSSAPI_GSSAPI_GENERIC_H */
-
-/* Define to 1 if you have the <gssapi/gssapi.h> header file. */
-/* #undef HAVE_GSSAPI_GSSAPI_H */
-
-/* Define to 1 if you have the <gssapi.h> header file. */
-/* #undef HAVE_GSSAPI_H */
-
-/* Define to 1 if you have the `gss_init_sec_context' function. */
-/* #undef HAVE_GSS_INIT_SEC_CONTEXT */
-
-/* Define to 1 if you have the `hstrerror' function. */
-/* #undef HAVE_HSTRERROR */
-
-/* Define to 1 if you have the `iconv' function. */
-/* #undef HAVE_ICONV */
-
-/* Define to 1 if you have the <iconv.h> header file. */
-/* #undef HAVE_ICONV_H */
-
-/* Define to 1 if you have the `inet_ntop' function. */
-#ifdef UNX
-#define HAVE_INET_NTOP 1
-#endif
-
-/* Define to 1 if you have the `inet_pton' function. */
-/* #undef HAVE_INET_PTON */
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#ifdef UNX
-#define HAVE_INTTYPES_H 1
-#endif
-
-/* Define to 1 if you have the `isatty' function. */
-#define HAVE_ISATTY 1
-
-/* Define to 1 if you have the <libintl.h> header file. */
-/* #undef HAVE_LIBINTL_H */
-
-/* Define if libproxy is supported */
-/* #undef HAVE_LIBPROXY */
-
-/* Define if you have libxml */
-#define HAVE_LIBXML 1
-
-/* Define to 1 if you have the <libxml/parser.h> header file. */
-#define HAVE_LIBXML_PARSER_H 1
-
-/* Define to 1 if you have the <libxml/xmlversion.h> header file. */
-#define HAVE_LIBXML_XMLVERSION_H 1
-
-/* Define to 1 if you have the <limits.h> header file. */
-#define HAVE_LIMITS_H 1
-
-/* Define to 1 if you have the <locale.h> header file. */
-#define HAVE_LOCALE_H 1
-
-/* Define to 1 if you have the `lseek64' function. */
-#define HAVE_LSEEK64 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the <netdb.h> header file. */
-#ifdef UNX
-#define HAVE_NETDB_H 1
-#endif
-
-/* Define to 1 if you have the <netinet/in.h> header file. */
-#ifdef UNX
-#define HAVE_NETINET_IN_H 1
-#endif
-
-/* Define to 1 if you have the <netinet/tcp.h> header file. */
-#ifdef UNX
-#define HAVE_NETINET_TCP_H 1
-#endif
-
-#ifndef DISABLE_OPENSSL
-/* Define if NTLM is supported */
-#ifndef _WIN32
-#define HAVE_NTLM 1
-#endif
-
-/* Define if OpenSSL support is enabled */
-#define HAVE_OPENSSL 1
-
-/* Define to 1 if you have the <openssl/opensslv.h> header file. */
-#define HAVE_OPENSSL_OPENSSLV_H 1
-
-/* Define to 1 if you have the <openssl/ssl.h> header file. */
-#define HAVE_OPENSSL_SSL_H 1
-#endif /* !DISABLE_OPENSSL */
-
-/* Define if pakchois library supported */
-/* #undef HAVE_PAKCHOIS */
-
-/* Define to 1 if you have the `pipe' function. */
-#define HAVE_PIPE 1
-
-/* Define to 1 if you have the `poll' function. */
-#define HAVE_POLL 1
-
-/* Define to 1 if you have the `pthread_mutex_init' function. */
-/* #undef HAVE_PTHREAD_MUTEX_INIT */
-
-/* Define to 1 if you have the `pthread_mutex_lock' function. */
-/* #undef HAVE_PTHREAD_MUTEX_LOCK */
-
-/* Define to 1 if you have the `setlocale' function. */
-#define HAVE_SETLOCALE 1
-
-/* Define to 1 if you have the `setsockopt' function. */
-#if defined(LINUX) || defined(_WIN32)
-#define HAVE_SETSOCKOPT 1
-#endif
-
-/* Define to 1 if you have the `setvbuf' function. */
-#define HAVE_SETVBUF 1
-
-/* Define to 1 if you have the `shutdown' function. */
-#ifdef LINUX
-#define HAVE_SHUTDOWN 1
-#endif
-
-/* Define to 1 if you have the `signal' function. */
-#define HAVE_SIGNAL 1
-
-/* Define to 1 if you have the <signal.h> header file. */
-#define HAVE_SIGNAL_H 1
-
-/* Define to 1 if you have the `snprintf' function. */
-#if defined(UNX) || defined(_MSC_VER)
-#define HAVE_SNPRINTF 1
-#endif
-
-/* Define to 1 if the system has the type `socklen_t'. */
-#ifdef UNX
-#define HAVE_SOCKLEN_T 1
-#endif
-
-/* Define to 1 if you have the `SSL_SESSION_cmp' function. */
-/* #undef HAVE_SSL_SESSION_CMP */
-
-/* Define to 1 if you have the <stdarg.h> header file. */
-#define HAVE_STDARG_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the `stpcpy' function. */
-#ifdef LINUX
-#define HAVE_STPCPY 1
-#endif
-
-/* Define to 1 if you have the `strcasecmp' function. */
-#ifdef UNX
-#define HAVE_STRCASECMP 1
-#endif
-
-#ifdef _WIN32
-#define strcasecmp strcmpi
-#endif
-
-/* Define to 1 if you have the `strerror_r' function. */
-#ifdef LINUX
-#define HAVE_STRERROR_R 1
-#endif
-
-/* Define to 1 if you have the <strings.h> header file. */
-#ifdef UNX
-#define HAVE_STRINGS_H 1
-#endif
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the `strtoll' function. */
-#define HAVE_STRTOLL 1
-
-/* Define to 1 if you have the `strtoq' function. */
-/* #undef HAVE_STRTOQ */
-
-/* Define to 1 if `tm_gmtoff' is member of `struct tm'. */
-#ifdef LINUX
-#define HAVE_STRUCT_TM_TM_GMTOFF 1
-#endif
-
-/* Define to 1 if `__tm_gmtoff' is member of `struct tm'. */
-/* #undef HAVE_STRUCT_TM___TM_GMTOFF */
-
-/* Define to 1 if you have the <sys/limits.h> header file. */
-/* #undef HAVE_SYS_LIMITS_H */
-
-/* Define to 1 if you have the <sys/poll.h> header file. */
-#ifdef UNX
-#define HAVE_SYS_POLL_H 1
-#endif
-
-/* Define to 1 if you have the <sys/select.h> header file. */
-#ifdef UNX
-#define HAVE_SYS_SELECT_H 1
-#endif
-
-/* Define to 1 if you have the <sys/socket.h> header file. */
-#ifdef UNX
-#define HAVE_SYS_SOCKET_H 1
-#endif
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#ifdef UNX
-#define HAVE_SYS_TIME_H 1
-#endif
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define if the timezone global is available */
-#ifndef MACOSX
-#define HAVE_TIMEZONE 1
-#if defined(_MSC_VER)
-#define timezone _timezone
-#endif
-#endif
-
-/* Use trio printf replacement library */
-/* #undef HAVE_TRIO */
-
-/* Define to 1 if you have the <trio.h> header file. */
-/* #undef HAVE_TRIO_H */
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#ifdef UNX
-#define HAVE_UNISTD_H 1
-#endif
-
-/* Define to 1 if you have the `usleep' function. */
-#ifdef UNX
-#define HAVE_USLEEP 1
-#endif
-
-/* Define to 1 if you have the `vsnprintf' function. */
-#if defined(UNX) || defined(_MSC_VER)
-#define HAVE_VSNPRINTF 1
-#endif
-
-#ifdef __MINGW32__
-#define vsnprintf _vsnprintf
-#endif
-
-/* Define to be location of localedir */
-/* #undef LOCALEDIR */
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
- */
-/* #undef LT_OBJDIR */
-
-/* Defined when neon is built as a library */
-#define NEON_IS_LIBRARY 1
-
-/* Define to be the neon version string */
-#define NEON_VERSION "0.31.2"
-
-/* Define to enable debugging */
-/* #undef NE_DEBUGGING */
-
-/* Define to be printf format string for ne_off_t */
-/* #undef NE_FMT_NE_OFF_T */
-
-/* Define to be printf format string for off64_t */
-#define NE_FMT_OFF64_T "lld"
-
-/* Define to be printf format string for off_t */
-#define NE_FMT_OFF_T "ld"
-
-/* Define to be printf format string for size_t */
-#define NE_FMT_SIZE_T "u"
-
-/* Define to be printf format string for ssize_t */
-#define NE_FMT_SSIZE_T "d"
-
-/* Define to be printf format string for time_t */
-#define NE_FMT_TIME_T "ld"
-
-/* Define to be printf format string for XML_Size */
-/* #undef NE_FMT_XML_SIZE */
-
-/* Defined if DAV is supported */
-#define NE_HAVE_DAV 1
-
-/* Defined if I18N is supported */
-/* #undef NE_HAVE_I18N */
-
-/* Defined if IPV6 is supported */
-#define NE_HAVE_IPV6 1
-
-/* Defined if LFS is supported */
-#define NE_HAVE_LFS 1
-
-/* Defined if LIBPXY is supported */
-/* #undef NE_HAVE_LIBPXY */
-
-/* Defined if SSL is supported */
-#define NE_HAVE_SSL
-
-/* Defined if TS_SSL is supported */
-/* #undef NE_HAVE_TS_SSL */
-
-/* Defined if ZLIB is supported */
-#define NE_HAVE_ZLIB 1
-
-/* Define to be filename of an SSL CA root bundle */
-/* #undef NE_SSL_CA_BUNDLE */
-
-/* Define if poll() should be used */
-#ifdef UNX
-#define NE_USE_POLL 1
-#endif
-
-/* Define to be neon library major version */
-#define NE_VERSION_MAJOR (0)
-
-/* Define to be neon library minor version */
-#define NE_VERSION_MINOR (31)
-
-/* Define to be neon library patch version */
-#define NE_VERSION_PATCH (2)
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "neon@webdav.org"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "neon"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "neon 0.31.2"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "neon"
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "0.31.2"
-
-/* The size of `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-
-/* The size of `long', as computed by sizeof. */
-#define SIZEOF_LONG 4
-
-/* The size of `long long', as computed by sizeof. */
-#define SIZEOF_LONG_LONG 8
-
-/* The size of `off64_t', as computed by sizeof. */
-#define SIZEOF_OFF64_T 8
-
-/* The size of `off_t', as computed by sizeof. */
-#define SIZEOF_OFF_T 4
-
-/* The size of `size_t', as computed by sizeof. */
-#define SIZEOF_SIZE_T 4
-
-/* The size of `ssize_t', as computed by sizeof. */
-#define SIZEOF_SSIZE_T 4
-
-/* The size of `time_t', as computed by sizeof. */
-#define SIZEOF_TIME_T 4
-
-/* The size of `XML_Size', as computed by sizeof. */
-/* #undef SIZEOF_XML_SIZE */
-
-/* Define to 1 if you have the ANSI C header files. */
-#ifdef __sun
-#define STDC_HEADERS 1
-#endif
-
-/* Define to 1 if strerror_r returns char *. */
-#ifdef LINUX
-#define STRERROR_R_CHAR_P 1
-#endif
-
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#define TIME_WITH_SYS_TIME 1
-
-/* Define if getaddrinfo supports AI_ADDRCONFIG */
-/* #undef USE_GAI_ADDRCONFIG */
-
-/* Define if getaddrinfo() should be used */
-#define USE_GETADDRINFO 1
-
-/* Enable extensions on AIX 3, Interix. */
-#ifndef _ALL_SOURCE
-#undef _ALL_SOURCE
-#endif
-/* Enable GNU extensions on systems that have them. */
-#ifndef _GNU_SOURCE
-#undef _GNU_SOURCE
-#endif
-/* Enable threading extensions on Solaris. */
-#ifndef _POSIX_PTHREAD_SEMANTICS
-#undef _POSIX_PTHREAD_SEMANTICS
-#endif
-/* Enable extensions on HP NonStop. */
-#ifndef _TANDEM_SOURCE
-#undef _TANDEM_SOURCE
-#endif
-/* Enable general extensions on Solaris. */
-#ifndef __EXTENSIONS__
-#undef __EXTENSIONS__
-#endif
-
-/* Always defined to enable GNU extensions */
-#define _GNU_SOURCE 1
-
-/*
- include osl/endian.h after _GNU_SOURCE because it includes other headers and we need
- to ensure we get the strerror_r variant that returns char*
-*/
-#include <osl/endian.h>
-
-/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
- significant byte first (like Motorola and SPARC, unlike Intel). */
-#if defined OSL_BIGENDIAN
-#define WORDS_BIGENDIAN 1
-#endif
-
-/* Define to 1 if on MINIX. */
-/* #undef _MINIX */
-
-/* Define to 2 if the system does not provide POSIX.1 features except with
- this defined. */
-/* #undef _POSIX_1_SOURCE */
-
-/* Define to 1 if you need to in order for `stat' and other things to work. */
-/* #undef _POSIX_SOURCE */
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
-
-/* Define if in_addr_t is not available */
-/* #undef in_addr_t */
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-#ifndef __cplusplus
-#if defined(__sun) && defined(__SUNPRO_C)
-#define inline
-#endif
-#endif
-
-/* Define to `long int' if <sys/types.h> does not define. */
-/* #undef off_t */
-
-/* Define to `int' if <sys/types.h> does not define. */
-/* #undef pid_t */
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-/* #undef size_t */
-
-/* Define if socklen_t is not available */
-/* #undef socklen_t */
-
-/* MS IIS does not send Lock-Token response header after creation of a */
-/* new lock. This violates RFC, but... if we want to talk with this */
-/* beast we need a workaround */
-#define IIS_LOCK_BUG_WORKAROUND 1
-
-/* Enable leak-tracking versions of ne_*alloc when NEON_MEMLEAK is enabled */
-#ifdef NEON_MEMLEAK
-#include "memleak.h"
-#endif
-
-#if defined(HAVE_STPCPY) && defined(HAVE_DECL_STPCPY) && !HAVE_DECL_STPCPY && !defined(stpcpy)
-char* stpcpy(char*, const char*);
-#endif
-
-#ifdef _WIN32
-
-#include <io.h>
-
-#define HAVE_MEMCPY 1
-
-#define strncasecmp strnicmp
-#define inline __inline
-#define WIN32_LEAN_AND_MEAN
-#define NOUSER
-#define NOGDI
-#define NONLS
-#define NOCRYPT
-
-#define HAVE_SSPI 1
-
-#endif
diff --git a/external/neon/neon.def b/external/neon/neon.def
deleted file mode 100644
index 3a14d66fbdfe..000000000000
--- a/external/neon/neon.def
+++ /dev/null
@@ -1,292 +0,0 @@
-LIBRARY "neon.dll"
-HEAPSIZE 0
-EXPORTS
- ne_sspi_authenticate;
- ne_sspi_clear_context;
- ne_sspi_create_context;
- ne_sspi_deinit;
- ne_sspi_destroy_context;
- ne_sspi_init;
- ne__negotiate_ssl;
- ne__ssl_exit;
- ne__ssl_init;
- ne_ssl_cert_cmp;
- ne_ssl_cert_digest;
- ne_ssl_cert_export;
- ne_ssl_cert_free;
- ne_ssl_cert_identity;
- ne_ssl_cert_import;
- ne_ssl_cert_issuer;
- ne_ssl_cert_read;
- ne_ssl_cert_signedby;
- ne_ssl_cert_subject;
- ne_ssl_cert_validity_time;
- ne_ssl_cert_write;
- ne_ssl_clicert_decrypt;
- ne_ssl_clicert_encrypted;
- ne_ssl_clicert_free;
- ne_ssl_clicert_name;
- ne_ssl_clicert_owner;
- ne_ssl_clicert_read;
- ne_ssl_context_create;
- ne_ssl_context_destroy;
- ne_ssl_context_keypair;
- ne_ssl_context_set_flag;
- ne_ssl_context_set_verify;
- ne_ssl_context_trustcert;
- ne_ssl_dname_cmp;
- ne_ssl_readable_dname;
- ne_ssl_set_clicert;
- ne_ssl_trust_default_ca;
- ne_xml_dispatch_request;
- ne_xml_parse_response;
- ne_xml_create;
- ne_xml_currentline;
- ne_xml_destroy;
- ne_xml_doc_encoding;
- ne_xml_failed;
- ne_xml_get_attr;
- ne_xml_get_error;
- ne_xml_mapid;
- ne_xml_parse;
- ne_xml_parse_v;
- ne_xml_push_handler;
- ne_xml_resolve_nspace;
- ne_xml_set_error;
- ne_debug;
- ne_debug_init;
- ne_debug_mask;
- ne_debug_stream;
- ne_has_support;
- ne_parse_statusline;
- ne_version_match;
- ne_version_string;
- ne_path_childof;
- ne_path_compare;
- ne_path_escape;
- ne_path_has_trailing_slash;
- ne_path_parent;
- ne_path_unescape;
- ne_uri_cmp;
- ne_uri_copy;
- ne_uri_defaultport;
- ne_uri_free;
- ne_uri_parse;
- ne_uri_resolve;
- ne_uri_unparse;
- ne_base64;
- ne_buffer_altered;
- ne_buffer_append;
- ne_buffer_clear;
- ne_buffer_concat;
- ne_buffer_create;
- ne_buffer_destroy;
- ne_buffer_finish;
- ne_buffer_grow;
- ne_buffer_ncreate;
- ne_buffer_snprintf;
- ne_buffer_zappend;
- ne_concat;
- ne_qtoken;
- ne_shave;
- ne_snprintf;
- ne_strcasecmp;
- ne_strclean;
- ne_strerror;
- ne_strncasecmp;
- ne_token;
- ne_tolower_array;
- ne_unbase64;
- ne_vsnprintf;
- ne__sock_sslsock;
- ne_addr_destroy;
- ne_addr_error;
- ne_addr_first;
- ne_addr_next;
- ne_addr_resolve;
- ne_addr_result;
- ne_iaddr_cmp;
- ne_iaddr_free;
- ne_iaddr_make;
- ne_iaddr_print;
- ne_iaddr_reverse;
- ne_iaddr_typeof;
- ne_sock_accept;
- ne_sock_accept_ssl;
- ne_sock_block;
- ne_sock_cipher;
- ne_sock_close;
- ne_sock_connect;
- ne_sock_connect_ssl;
- ne_sock_connect_timeout;
- ne_sock_create;
- ne_sock_error;
- ne_sock_exit;
- ne_sock_fd;
- ne_sock_fullread;
- ne_sock_fullwrite;
- ne_sock_init;
- ne_sock_peek;
- ne_sock_peer;
- ne_sock_prebind;
- ne_sock_proxy;
- ne_sock_read;
- ne_sock_read_timeout;
- ne_sock_readline;
- ne_sock_sessid;
- ne__ssl_set_verify_err;
- ne_close_connection;
- ne_fill_proxy_uri;
- ne_fill_server_uri;
- ne_get_error;
- ne_get_scheme;
- ne_get_server_hostport;
- ne_get_session_flag;
- ne_hook_close_conn;
- ne_hook_create_request;
- ne_hook_destroy_request;
- ne_hook_destroy_session;
- ne_hook_post_headers;
- ne_hook_post_send;
- ne_hook_pre_send;
- ne_session_create;
- ne_session_destroy;
- ne_session_proxy;
- ne_set_addrlist;
- ne_set_connect_timeout;
- ne_set_error;
- ne_set_localaddr;
- ne_set_notifier;
- ne_set_progress;
- ne_set_read_timeout;
- ne_set_session_flag;
- ne_set_session_private;
- ne_set_useragent;
- ne_ssl_cert_validity;
- ne_ssl_provide_clicert;
- ne_ssl_set_verify;
- ne_ssl_trust_cert;
- ne_unhook_close_conn;
- ne_unhook_create_request;
- ne_unhook_destroy_request;
- ne_unhook_destroy_session;
- ne_unhook_post_headers;
- ne_unhook_post_send;
- ne_unhook_pre_send;
- ne_version_pre_http11;
- ne_accept_2xx;
- ne_accept_always;
- ne_add_request_header;
- ne_add_response_body_reader;
- ne_begin_request;
- ne_discard_response;
- ne_end_request;
- ne_get_request_flag;
- ne_get_request_private;
- ne_get_response_header;
- ne_get_session;
- ne_get_session_private;
- ne_get_status;
- ne_print_request_header;
- ne_read_response_block;
- ne_read_response_to_fd;
- ne_request_create;
- ne_request_destroy;
- ne_request_dispatch;
- ne_response_header_iterate;
- ne_set_request_body_buffer;
- ne_set_request_body_fd;
- ne_set_request_body_provider;
- ne_set_request_flag;
- ne_set_request_private;
- ne_redirect_location;
- ne_redirect_register;
- ne_propfind_allprop;
- ne_propfind_create;
- ne_propfind_current_private;
- ne_propfind_destroy;
- ne_propfind_get_parser;
- ne_propfind_get_request;
- ne_propfind_named;
- ne_propfind_set_private;
- ne_propnames;
- ne_proppatch;
- ne_propset_iterate;
- ne_propset_lang;
- ne_propset_private;
- ne_propset_status;
- ne_propset_value;
- ne_simple_propfind;
- ne_ascii_to_md5;
- ne_md5_create_ctx;
- ne_md5_destroy_ctx;
- ne_md5_dup_ctx;
- ne_md5_finish_ascii;
- ne_md5_finish_ctx;
- ne_md5_process_block;
- ne_md5_process_bytes;
- ne_md5_read_ctx;
- ne_md5_reset_ctx;
- ne_md5_stream;
- ne_md5_to_ascii;
- ne_lock;
- ne_lock_copy;
- ne_lock_create;
- ne_lock_destroy;
- ne_lock_discover;
- ne_lock_free;
- ne_lock_refresh;
- ne_lock_using_parent;
- ne_lock_using_resource;
- ne_lockstore_add;
- ne_lockstore_create;
- ne_lockstore_destroy;
- ne_lockstore_findbyuri;
- ne_lockstore_first;
- ne_lockstore_next;
- ne_lockstore_register;
- ne_lockstore_remove;
- ne_unlock;
- ne_i18n_init;
- ne_asctime_parse;
- ne_httpdate_parse;
- ne_iso8601_parse;
- ne_rfc1036_parse;
- ne_rfc1123_date;
- ne_rfc1123_parse;
- ne_decompress_destroy;
- ne_decompress_reader;
- ne_add_depth_header;
- ne_copy;
- ne_delete;
- ne_get;
- ne_get_content_type;
- ne_get_range;
- ne_getmodtime;
- ne_mkcol;
- ne_move;
- ne_options;
- ne_options2;
- ne_post;
- ne_put;
- ne_add_proxy_auth;
- ne_add_server_auth;
- ne_forget_auth;
- ne_set_proxy_auth;
- ne_set_server_auth;
- ne_calloc;
- ne_malloc;
- ne_oom_callback;
- ne_realloc;
- ne_strdup;
- ne_strndup;
- ne_free;
- ne_acl3744_set;
- ne_207_create;
- ne_207_destroy;
- ne_207_get_current_propstat;
- ne_207_get_current_response;
- ne_207_set_propstat_handlers;
- ne_207_set_response_handlers;
- ne_accept_207;
- ne_simple_request;
diff --git a/external/neon/neon.patch b/external/neon/neon.patch
deleted file mode 100644
index 23aef0d0fe85..000000000000
--- a/external/neon/neon.patch
+++ /dev/null
@@ -1,311 +0,0 @@
---- src/ne_auth.c 2010-10-14 17:00:53.000000000 +0200
-+++ src/ne_auth.c 2011-02-03 10:31:22.000000000 +0100
-@@ -367,7 +367,7 @@
- static int get_credentials(auth_session *sess, ne_buffer **errmsg, int attempt,
- struct auth_challenge *chall, char *pwbuf)
- {
-- if (chall->handler->creds(chall->handler->userdata, sess->realm,
-+ if (chall->handler->creds(chall->handler->userdata, chall->protocol->name, sess->realm,
- chall->handler->attempt++, sess->username, pwbuf) == 0) {
- return 0;
- } else {
-@@ -385,15 +385,19 @@
- {
- char *tmp, password[NE_ABUFSIZ];
-
-+#if 0 /* Workaround - IIS sends challenge without realm. */
-+
- /* Verify challenge... must have a realm */
- if (parms->realm == NULL) {
- challenge_error(errmsg, _("missing realm in Basic challenge"));
- return -1;
- }
-+#endif
-
- clean_session(sess);
-
-- sess->realm = ne_strdup(parms->realm);
-+ if (parms->realm != NULL)
-+ sess->realm = ne_strdup(parms->realm);
-
- if (get_credentials(sess, errmsg, attempt, parms, password)) {
- /* Failed to get credentials */
-@@ -610,10 +614,12 @@
- return NULL;
- }
-
--static int continue_sspi(auth_session *sess, int ntlm, const char *hdr)
-+static int continue_sspi(auth_session *sess, int ntlm, const char *hdr,
-+ int attempt, struct auth_challenge *parms, ne_buffer **errmsg)
- {
- int status;
- char *response = NULL;
-+ char password[NE_ABUFSIZ];
-
- NE_DEBUG(NE_DBG_HTTPAUTH, "auth: SSPI challenge.\n");
-
-@@ -630,8 +636,17 @@
- return status;
- }
- }
--
-- status = ne_sspi_authenticate(sess->sspi_context, hdr, &response);
-+
-+ /* Authentification needs more than one http request.
-+ * As long as authentification in progress use the existing credentials.
-+ * Otherwise get new credentials.*/
-+ if (!hdr)
-+ if (get_credentials(sess, errmsg, attempt, parms, password)) {
-+ /* Failed to get credentials */
-+ return -1;
-+ }
-+
-+ status = ne_sspi_authenticate(sess->sspi_context, hdr, &response, sess->username, password);
- if (status) {
- return status;
- }
-@@ -651,7 +666,7 @@
- {
- int ntlm = ne_strcasecmp(parms->protocol->name, "NTLM") == 0;
-
-- return continue_sspi(sess, ntlm, parms->opaque);
-+ return continue_sspi(sess, ntlm, parms->opaque, attempt, parms, errmsg);
- }
-
- static int verify_sspi(struct auth_request *req, auth_session *sess,
-@@ -674,7 +689,7 @@
- return NE_OK;
- }
-
-- return continue_sspi(sess, ntlm, ptr);
-+ return continue_sspi(sess, ntlm, ptr, 0, NULL, NULL);
- }
-
- #endif
---- src/ne_auth.h 2009-09-01 22:13:12.000000000 +0200
-+++ src/ne_auth.h 2011-02-03 10:26:20.000000000 +0100
-@@ -47,8 +47,8 @@
- * Hint: if you just wish to attempt authentication just once (even if
- * the user gets the username/password wrong), have the callback
- * function use 'attempt' value as the function return value. */
--typedef int (*ne_auth_creds)(void *userdata, const char *realm, int attempt,
-- char *username, char *password);
-+typedef int (*ne_auth_creds)(void *userdata, const char * auth_protocol,
-+ const char *realm, int attempt, char *username, char *password);
-
- /* Set callbacks to provide credentials for server and proxy
- * authentication, using the default set of authentication protocols.
---- src/ne_locks.c 2007-02-05 11:09:27.000000000 +0100
-+++ src/ne_locks.c 2011-02-03 10:26:21.000000000 +0100
-@@ -579,6 +579,23 @@
- const char *token = ne_get_response_header(ctx->req, "Lock-Token");
- /* at the root element; retrieve the Lock-Token header,
- * and bail if it wasn't given. */
-+#ifdef IIS_LOCK_BUG_WORKAROUND
-+ /* MS IIS violates RFC 2518/4918. It does not send a Lock-Token response
-+ header upon successful creation of a new lock. As a workaround, we
-+ will try to pick the lock token from the response body (although
-+ this is not 100% safe in case of multiple activelocks). */
-+ if (token == NULL)
-+ NE_DEBUG(NE_DBG_LOCKS,
-+ "Ignoring missing LOCK response Lock-Token header\n");
-+
-+ if (token != NULL) {
-+ if (token[0] == '<') token++;
-+ ctx->token = ne_strdup(token);
-+ ne_shave(ctx->token, ">");
-+ NE_DEBUG(NE_DBG_LOCKS, "lk_startelm: Finding token %s\n",
-+ ctx->token);
-+ }
-+#else
- if (token == NULL) {
- ne_xml_set_error(ctx->parser,
- _("LOCK response missing Lock-Token header"));
-@@ -590,12 +607,28 @@
- ne_shave(ctx->token, ">");
- NE_DEBUG(NE_DBG_LOCKS, "lk_startelm: Finding token %s\n",
- ctx->token);
-+#endif
- }
-
- /* TODO: only accept 'prop' as root for LOCK response */
- if (!can_accept(parent, id))
- return NE_XML_DECLINE;
-
-+#ifdef IIS_LOCK_BUG_WORKAROUND
-+ if (id == ELM_activelock && ctx->found) {
-+ /* Found another activelock... */
-+ const char *token = ne_get_response_header(ctx->req, "Lock-Token");
-+ if (token == NULL) {
-+ /* Response contains more than one activelock and no Lock-Token
-+ * response header. We are doomed. No safe workaround for IIS
-+ * lock bug possible. */
-+ ne_xml_set_error(ctx->parser,
-+ _("LOCK response missing Lock-Token header and more than one activelock"));
-+ return NE_XML_ABORT;
-+ }
-+ }
-+#endif
-+
- if (id == ELM_activelock && !ctx->found) {
- /* a new activelock */
- ne_lock_free(&ctx->active);
-@@ -621,7 +654,12 @@
- return -1;
-
- if (state == ELM_activelock) {
-+#ifdef IIS_LOCK_BUG_WORKAROUND
-+ if (ctx->active.token) {
-+ ctx->token = ne_strdup(ctx->active.token);
-+#else
- if (ctx->active.token && strcmp(ctx->active.token, ctx->token) == 0) {
-+#endif
- ctx->found = 1;
- }
- }
---- src/ne_sspi.c 2007-08-10 17:26:08.000000000 +0200
-+++ src/ne_sspi.c 2011-02-03 10:26:21.000000000 +0100
-@@ -206,6 +206,45 @@
- }
-
- /*
-+ * Simplification wrapper arround AcquireCredentialsHandle as most of
-+ * the parameters do not change.
-+ */
-+static int acquireCredentialsHandleForUsername(CredHandle * credentials, char *package, const char *username, const char *password)
-+{
-+ SECURITY_STATUS status;
-+ TimeStamp timestamp;
-+
-+ const char *domain = "";
-+
-+ int rc, rcISC;
-+ SecPkgInfo *secPackInfo;
-+ SEC_WINNT_AUTH_IDENTITY *nameAndPwd = NULL;
-+ int bytesReceived = 0, bytesSent = 0;
-+
-+ nameAndPwd = (SEC_WINNT_AUTH_IDENTITY *) malloc( sizeof(SEC_WINNT_AUTH_IDENTITY) );
-+ memset( nameAndPwd, '\0', sizeof (*nameAndPwd) );
-+ nameAndPwd->Domain = (unsigned char *) _strdup( domain? domain: "" );
-+ nameAndPwd->DomainLength = domain? strlen( domain ): 0;
-+ nameAndPwd->User = (unsigned char *) _strdup( username? username: "" );
-+ nameAndPwd->UserLength = username? strlen( username ): 0;
-+ nameAndPwd->Password = (unsigned char *) _strdup( password? password: "" );
-+ nameAndPwd->PasswordLength = password? strlen( password ): 0;
-+ nameAndPwd->Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;
-+
-+ status = pSFT->AcquireCredentialsHandle( NULL, package, SECPKG_CRED_OUTBOUND,
-+ NULL, nameAndPwd, NULL, NULL, credentials, &timestamp );
-+
-+ if (status != SEC_E_OK) {
-+ NE_DEBUG(NE_DBG_HTTPAUTH,
-+ "sspi: AcquireCredentialsHandle [fail] [%x].\n", status);
-+ return -1;
-+ }
-+
-+ return 0;
-+}
-+
-+
-+/*
- * Wrapper around initializeSecurityContext. Supplies several
- * default parameters as well as logging in case of errors.
- */
-@@ -483,7 +522,7 @@
- * Processes received authentication tokens as well as supplies the
- * response token.
- */
--int ne_sspi_authenticate(void *context, const char *base64Token, char **responseToken)
-+int ne_sspi_authenticate(void *context, const char *base64Token, char **responseToken, const char* username, const char* password)
- {
- SecBufferDesc outBufferDesc;
- SecBuffer outBuffer;
-@@ -561,13 +600,22 @@
- /* Reset any existing context since we are starting over */
- resetContext(sspiContext);
-
-- if (acquireCredentialsHandle
-- (&sspiContext->credentials, sspiContext->mechanism) != SEC_E_OK) {
-- freeBuffer(&outBufferDesc);
-- NE_DEBUG(NE_DBG_HTTPAUTH,
-- "sspi: acquireCredentialsHandle failed.\n");
-- return -1;
-- }
-+ if (strlen(username) != 0) {
-+ if (acquireCredentialsHandleForUsername
-+ (&sspiContext->credentials, sspiContext->mechanism, username, password) != SEC_E_OK) {
-+ freeBuffer(&outBufferDesc);
-+ NE_DEBUG(NE_DBG_HTTPAUTH, "sspi: acquireCredentialsHandleForUsername failed.\n");
-+ return -1;
-+ }
-+ } else {
-+ if (acquireCredentialsHandle
-+ (&sspiContext->credentials, sspiContext->mechanism) != SEC_E_OK) {
-+ freeBuffer(&outBufferDesc);
-+ NE_DEBUG(NE_DBG_HTTPAUTH, "sspi: acquireCredentialsHandle failed.\n");
-+ return -1;
-+ }
-+ }
-+
-
- securityStatus =
- initializeSecurityContext(&sspiContext->credentials, NULL,
---- src/ne_sspi.h 2006-02-12 13:05:14.000000000 +0100
-+++ src/ne_sspi.h 2011-02-03 10:26:21.000000000 +0100
-@@ -41,7 +41,7 @@
- int ne_sspi_clear_context(void *context);
-
- int ne_sspi_authenticate(void *context, const char *base64Token,
-- char **responseToken);
-+ char **responseToken, const char* username, const char* password);
-
- #endif /* HAVE_SSPI */
-
---- src/ne_openssl.c
-+++ src/ne_openssl.c
-@@ -43,6 +43,13 @@
- #endif
- #endif
-
-+#ifdef _WIN32
-+#define X509_NAME WIN32_X509_NAME
-+#include <windows.h>
-+#include <wincrypt.h>
-+#undef X509_NAME
-+#endif
-+
- #include "ne_ssl.h"
- #include "ne_string.h"
- #include "ne_session.h"
-@@ -798,6 +805,31 @@
- X509_STORE_load_locations(store, NE_SSL_CA_BUNDLE, NULL);
- #else
- X509_STORE_set_default_paths(store);
-+#ifdef _WIN32
-+ {
-+ HCERTSTORE hStore;
-+ PCCERT_CONTEXT pContext = NULL;
-+ X509 *x509;
-+
-+ hStore = CertOpenSystemStore(0, "ROOT");
-+ if (hStore)
-+ {
-+ while (pContext = CertEnumCertificatesInStore(hStore, pContext))
-+ {
-+ x509 = d2i_X509(NULL, &pContext->pbCertEncoded, pContext->cbCertEncoded);
-+ if (x509)
-+ {
-+ X509_STORE_add_cert(store, x509);
-+ X509_free(x509);
-+ }
-+ }
-+ }
-+
-+ CertFreeCertificateContext(pContext);
-+ CertCloseStore(hStore, 0);
-+ }
-+#endif
-+
- #endif
- }
-
diff --git a/external/neon/neon_fix_lock_token_on_if.patch b/external/neon/neon_fix_lock_token_on_if.patch
deleted file mode 100644
index a60303789f53..000000000000
--- a/external/neon/neon_fix_lock_token_on_if.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -aru src.origin/ne_locks.c src/ne_locks.c
---- src.origin/ne_locks.c 2007-02-05 11:09:27.000000000 +0100
-+++ src/ne_locks.c 2015-07-29 10:33:55.724753920 +0200
-@@ -137,7 +137,7 @@
- }
- else {
- char *uri = ne_uri_unparse(&item->lock->uri);
-- ne_buffer_concat(req, " <", uri, "> (<",
-+ ne_buffer_concat(req, " (<",
- item->lock->token, ">)", NULL);
- ne_free(uri);
- }
diff --git a/external/neon/neon_fix_no_OPENSSL_Applink.patch b/external/neon/neon_fix_no_OPENSSL_Applink.patch
deleted file mode 100644
index 40291ff412bf..000000000000
--- a/external/neon/neon_fix_no_OPENSSL_Applink.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- src/ne_openssl.c
-+++ src/ne_openssl.c
-@@ -440,7 +440,7 @@
- #ifdef NE_DEBUGGING
- if (ne_debug_mask & NE_DBG_SSL) {
- fprintf(ne_debug_stream, "Cert #%d:\n", n);
-- X509_print_fp(ne_debug_stream, cert->subject);
-+ // X509_print_fp(ne_debug_stream, cert->subject);
- }
- #endif
- if (top == NULL) {
diff --git a/external/neon/neon_with_gnutls.patch b/external/neon/neon_with_gnutls.patch
deleted file mode 100644
index ed8b7faadebf..000000000000
--- a/external/neon/neon_with_gnutls.patch
+++ /dev/null
@@ -1,29 +0,0 @@
---- src/ne_gnutls.c 2009-12-02 23:40:41.000000000 +0200
-+++ src/ne_gnutls.c 2013-03-29 13:41:00.429857276 +0200
-@@ -48,6 +48,26 @@
- #include <iconv.h>
- #endif
-
-+
-+/* GnuTLS removed these symbols from 2.99.0.
-+ *
-+ * This is a dodgy solution to avoid further patching of neon
-+ * sources */
-+#if LIBGNUTLS_VERSION_NUMBER >= 0x026300
-+# define gnutls_pkcs12 gnutls_pkcs12_t
-+# define gnutls_pkcs12_bag gnutls_pkcs12_bag_t
-+# define gnutls_pkcs12_bag_type gnutls_pkcs12_bag_type_t
-+# define gnutls_certificate_verify_peers(_ssl) ({ \
-+ int __status_ ## __LINE__ = 0; \
-+ gnutls_certificate_verify_peers2((_ssl), &__status_ ## __LINE__) == 0 \
-+ ? __status_ ## __LINE__ : -1; \
-+ })
-+#elif LIBGNUTLS_VERSION_NUMBER >= 0x020303
-+/* GnuTLS had these symbols since 2.3.3. */
-+# define HAVE_GNUTLS_CERTIFICATE_GET_X509_CAS
-+#endif /* LIBGNUTLS_VERSION_NUMBER */
-+
-+
- #include "ne_ssl.h"
- #include "ne_string.h"
- #include "ne_session.h"
diff --git a/readlicense_oo/license/license.xml b/readlicense_oo/license/license.xml
index 1cda802b8b92..cdbecd828533 100644
--- a/readlicense_oo/license/license.xml
+++ b/readlicense_oo/license/license.xml
@@ -1433,20 +1433,6 @@
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.</p>
</div>
- <div class="NEON">
- <h2>neon</h2>
- <p>The following software may be included in this product: neon. Use of any of this software is governed by the
- terms of the license below:</p>
- <p>neon is Copyright (C) 1999-2007 Joe Orton &lt;joe@manyfish.co.uk&gt;<br />
- Portions are:<br />
- Copyright (C) 1999-2000 Tommi Komulainen &lt;Tommi.Komulainen@iki.fi&gt;<br />
- Copyright (C) 1999-2000 Peter Boos &lt;pedib@colorfullife.com&gt;<br />
- Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc.<br />
- Copyright (C) 2004 Aleix Conchillo Flaque &lt;aleix@member.fsf.org&gt;<br />
- Copyright (C) 2004 Jiang Lei &lt;tristone@deluxe.ocn.ne.jp&gt;<br />
- Copyright (C) 2004-2005 Vladimir Berezniker @ http://public.xdi.org/=vmpn</p>
- <p><a href="#a__LGPL_version_2_1">Jump to LGPL Version 2.1</a></p>
- </div>
<div class="NSS" >
<h2>Network Security Services (NSS)</h2>
<p>The following software may be included in this product: Network Security Services (NSS). Use of any of this
diff --git a/solenv/clang-format/excludelist b/solenv/clang-format/excludelist
index 6aa756c4a795..b0d534e3773a 100644
--- a/solenv/clang-format/excludelist
+++ b/solenv/clang-format/excludelist
@@ -14024,56 +14024,6 @@ ucb/source/ucp/webdav-curl/webdavresponseparser.cxx
ucb/source/ucp/webdav-curl/webdavresultset.cxx
ucb/source/ucp/webdav-curl/webdavresultset.hxx
ucb/source/ucp/webdav-curl/webdavservices.cxx
-ucb/source/ucp/webdav-neon/ContentProperties.cxx
-ucb/source/ucp/webdav-neon/ContentProperties.hxx
-ucb/source/ucp/webdav-neon/DAVAuthListener.hxx
-ucb/source/ucp/webdav-neon/DAVAuthListenerImpl.hxx
-ucb/source/ucp/webdav-neon/DAVException.hxx
-ucb/source/ucp/webdav-neon/DAVProperties.cxx
-ucb/source/ucp/webdav-neon/DAVProperties.hxx
-ucb/source/ucp/webdav-neon/DAVRequestEnvironment.hxx
-ucb/source/ucp/webdav-neon/DAVResource.hxx
-ucb/source/ucp/webdav-neon/DAVResourceAccess.cxx
-ucb/source/ucp/webdav-neon/DAVResourceAccess.hxx
-ucb/source/ucp/webdav-neon/DAVSession.hxx
-ucb/source/ucp/webdav-neon/DAVSessionFactory.cxx
-ucb/source/ucp/webdav-neon/DAVSessionFactory.hxx
-ucb/source/ucp/webdav-neon/DAVTypes.cxx
-ucb/source/ucp/webdav-neon/DAVTypes.hxx
-ucb/source/ucp/webdav-neon/DateTimeHelper.cxx
-ucb/source/ucp/webdav-neon/DateTimeHelper.hxx
-ucb/source/ucp/webdav-neon/LinkSequence.cxx
-ucb/source/ucp/webdav-neon/LinkSequence.hxx
-ucb/source/ucp/webdav-neon/LockEntrySequence.cxx
-ucb/source/ucp/webdav-neon/LockSequence.cxx
-ucb/source/ucp/webdav-neon/LockSequence.hxx
-ucb/source/ucp/webdav-neon/NeonHeadRequest.cxx
-ucb/source/ucp/webdav-neon/NeonHeadRequest.hxx
-ucb/source/ucp/webdav-neon/NeonInputStream.cxx
-ucb/source/ucp/webdav-neon/NeonInputStream.hxx
-ucb/source/ucp/webdav-neon/NeonLockStore.cxx
-ucb/source/ucp/webdav-neon/NeonLockStore.hxx
-ucb/source/ucp/webdav-neon/NeonPropFindRequest.cxx
-ucb/source/ucp/webdav-neon/NeonPropFindRequest.hxx
-ucb/source/ucp/webdav-neon/NeonSession.cxx
-ucb/source/ucp/webdav-neon/NeonSession.hxx
-ucb/source/ucp/webdav-neon/NeonTypes.hxx
-ucb/source/ucp/webdav-neon/NeonUri.cxx
-ucb/source/ucp/webdav-neon/NeonUri.hxx
-ucb/source/ucp/webdav-neon/PropertyMap.hxx
-ucb/source/ucp/webdav-neon/PropfindCache.cxx
-ucb/source/ucp/webdav-neon/PropfindCache.hxx
-ucb/source/ucp/webdav-neon/UCBDeadPropertyValue.cxx
-ucb/source/ucp/webdav-neon/UCBDeadPropertyValue.hxx
-ucb/source/ucp/webdav-neon/webdavcontent.cxx
-ucb/source/ucp/webdav-neon/webdavcontent.hxx
-ucb/source/ucp/webdav-neon/webdavcontentcaps.cxx
-ucb/source/ucp/webdav-neon/webdavdatasupplier.cxx
-ucb/source/ucp/webdav-neon/webdavdatasupplier.hxx
-ucb/source/ucp/webdav-neon/webdavprovider.cxx
-ucb/source/ucp/webdav-neon/webdavprovider.hxx
-ucb/source/ucp/webdav-neon/webdavresultset.cxx
-ucb/source/ucp/webdav-neon/webdavresultset.hxx
ucbhelper/source/client/commandenvironment.cxx
ucbhelper/source/client/content.cxx
ucbhelper/source/client/interceptedinteraction.cxx
diff --git a/ucb/IwyuFilter_ucb.yaml b/ucb/IwyuFilter_ucb.yaml
index 27115f812783..1b242fd561b3 100644
--- a/ucb/IwyuFilter_ucb.yaml
+++ b/ucb/IwyuFilter_ucb.yaml
@@ -10,48 +10,6 @@ excludelist:
ucb/source/ucp/ftp/ftpcontentprovider.hxx:
# Wrapper for external lib
- curl.hxx
- ucb/source/ucp/webdav-neon/ContentProperties.hxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/DateTimeHelper.hxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/DAVException.hxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/LockSequence.hxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/DAVAuthListenerImpl.hxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/DAVAuthListener.hxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/DAVResource.hxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/NeonInputStream.hxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/DAVTypes.hxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/DAVSessionFactory.hxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/DAVRequestEnvironment.hxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/PropertyMap.hxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/webdavdatasupplier.hxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/webdavprovider.hxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
ucb/source/core/ucb.cxx:
# Needed for UnoType
- com/sun/star/ucb/XCommandInfo.hpp
@@ -97,31 +55,6 @@ excludelist:
ucb/source/ucp/tdoc/tdoc_content.cxx:
# Needed for UnoType
- com/sun/star/ucb/XCommandInfo.hpp
- ucb/source/ucp/webdav-neon/DateTimeHelper.cxx:
- # Actually in use
- - com/sun/star/util/DateTime.hpp
- ucb/source/ucp/webdav-neon/LockEntrySequence.cxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/LinkSequence.cxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/LinkSequence.cxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/LockSequence.cxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/NeonSession.cxx:
- # Needed for UnoType
- - com/sun/star/ucb/Lock.hpp
- - com/sun/star/beans/NamedValue.hpp
- ucb/source/ucp/webdav-neon/UCBDeadPropertyValue.cxx:
- # Needed for LGPL code licensing
- - config_lgpl.h
- ucb/source/ucp/webdav-neon/webdavcontent.cxx:
- # Needed for UnoType
- - com/sun/star/ucb/XCommandInfo.hpp
ucb/source/ucp/webdav-curl/DateTimeHelper.cxx:
# Actually in use
- com/sun/star/util/DateTime.hpp
diff --git a/ucb/Library_ucpdav1.mk b/ucb/Library_ucpdav1.mk
index c2a36d7fcef7..b3c9a2342d6e 100644
--- a/ucb/Library_ucpdav1.mk
+++ b/ucb/Library_ucpdav1.mk
@@ -27,8 +27,6 @@ $(eval $(call gb_Library_use_libraries,ucpdav1,\
tl \
))
-ifeq ($(WITH_WEBDAV),curl)
-
$(eval $(call gb_Library_set_componentfile,ucpdav1,ucb/source/ucp/webdav-curl/ucpdav1,services))
$(eval $(call gb_Library_use_externals,ucpdav1,\
@@ -59,50 +57,6 @@ $(eval $(call gb_Library_add_exception_objects,ucpdav1,\
ucb/source/ucp/webdav-curl/webdavresultset \
))
-else
-ifeq ($(WITH_WEBDAV),neon)
-
-$(eval $(call gb_Library_set_componentfile,ucpdav1,ucb/source/ucp/webdav-neon/ucpdav1,services))
-
-$(eval $(call gb_Library_use_externals,ucpdav1,\
- boost_headers \
- libxml2 \
- neon \
- openssl \
-))
-
-$(eval $(call gb_Library_use_custom_headers,ucpdav1,\
- officecfg/registry \
-))
-
-$(eval $(call gb_Library_add_exception_objects,ucpdav1,\
- ucb/source/ucp/webdav-neon/ContentProperties \
- ucb/source/ucp/webdav-neon/DateTimeHelper \
- ucb/source/ucp/webdav-neon/DAVProperties \
- ucb/source/ucp/webdav-neon/DAVResourceAccess \
- ucb/source/ucp/webdav-neon/DAVSessionFactory \
- ucb/source/ucp/webdav-neon/DAVTypes \
- ucb/source/ucp/webdav-neon/LinkSequence \
- ucb/source/ucp/webdav-neon/LockEntrySequence \
- ucb/source/ucp/webdav-neon/LockSequence \
- ucb/source/ucp/webdav-neon/NeonHeadRequest \
- ucb/source/ucp/webdav-neon/NeonInputStream \
- ucb/source/ucp/webdav-neon/NeonLockStore \
- ucb/source/ucp/webdav-neon/NeonPropFindRequest \
- ucb/source/ucp/webdav-neon/NeonSession \
- ucb/source/ucp/webdav-neon/NeonUri \
- ucb/source/ucp/webdav-neon/PropfindCache \
- ucb/source/ucp/webdav-neon/UCBDeadPropertyValue \
- ucb/source/ucp/webdav-neon/webdavcontentcaps \
- ucb/source/ucp/webdav-neon/webdavcontent \
- ucb/source/ucp/webdav-neon/webdavdatasupplier \
- ucb/source/ucp/webdav-neon/webdavprovider \
- ucb/source/ucp/webdav-neon/webdavresultset \
-))
-
-endif # WITH_WEBDAV
-endif # WITH_WEBDAV
-
ifeq ($(OS),WNT)
$(eval $(call gb_Library_use_system_win32_libs,ucpdav1,\
ws2_32 \
diff --git a/ucb/README.md b/ucb/README.md
index 5af5487d7c5d..23d5fefb6db5 100644
--- a/ucb/README.md
+++ b/ucb/README.md
@@ -2,8 +2,3 @@
Universal Content Broker (has ucp) which do things like convert files to strings in content broker world.
-mmeeks: so - I renamed the old LGPLv3 webdav code to `webdav-neon`, and imported
-the (not built) serf webdav ucp into the old space. so that in future, we can
-merge changes more easily - and still choose which to use. cbosdonnat kindly
-volunteered to do some comparative analysis of the two codebases to decide which
-is best for what etc.
diff --git a/ucb/source/ucp/webdav-neon/ContentProperties.cxx b/ucb/source/ucp/webdav-neon/ContentProperties.cxx
deleted file mode 100644
index faee90874f5b..000000000000
--- a/ucb/source/ucp/webdav-neon/ContentProperties.cxx
+++ /dev/null
@@ -1,558 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-
-/**************************************************************************
- TODO
- **************************************************************************
-
- *************************************************************************/
-#include <memory>
-#include <com/sun/star/util/DateTime.hpp>
-#include "NeonUri.hxx"
-#include "DAVResource.hxx"
-#include "DAVProperties.hxx"
-#include "DateTimeHelper.hxx"
-#include "webdavprovider.hxx"
-#include "ContentProperties.hxx"
-
-using namespace com::sun::star;
-using namespace webdav_ucp;
-
-/*
-=============================================================================
-
- Property Mapping
-
-=============================================================================
-HTTP (entity header) WebDAV (property) UCB (property)
-=============================================================================
-
-Allow
-Content-Encoding
-Content-Language getcontentlanguage
-Content-Length getcontentlength Size
-Content-Location
-Content-MD5
-Content-Range
-Content-Type getcontenttype MediaType
-Expires
-Last-Modified getlastmodified DateModified
- creationdate DateCreated
- resourcetype IsFolder,IsDocument,ContentType
- displayname
-ETag (actually getetag
-a response header )
- lockdiscovery
- supportedlock
- source
- Title (always taken from URI)
-
-=============================================================================
-
-Important: HTTP headers will not be mapped to DAV properties; only to UCB
- properties. (Content-Length,Content-Type,Last-Modified)
-*/
-
-
-// ContentProperties Implementation.
-
-
-// static member!
-uno::Any ContentProperties::m_aEmptyAny;
-
-ContentProperties::ContentProperties( const DAVResource& rResource )
-: m_xProps( new PropertyValueMap ),
- m_bTrailingSlash( false )
-{
- assert( !rResource.uri.isEmpty() && "ContentProperties ctor - Empty resource URI!" );
-
- // Title
- try
- {
- NeonUri aURI( rResource.uri );
- m_aEscapedTitle = aURI.GetPathBaseName();
-
- (*m_xProps)[ OUString("Title") ]
- = PropertyValue(
- uno::makeAny( aURI.GetPathBaseNameUnescaped() ), true );
- }
- catch ( DAVException const & )
- {
- (*m_xProps)[ OUString("Title") ]
- = PropertyValue(
- uno::makeAny(
- OUString(
- "*** unknown ***" ) ),
- true );
- }
-
- for ( const auto& rProp : rResource.properties )
- {
- addProperty( rProp );
- }
-
- if ( rResource.uri.endsWith("/") )
- m_bTrailingSlash = true;
-}
-
-
-ContentProperties::ContentProperties(
- const OUString & rTitle, bool bFolder )
-: m_xProps( new PropertyValueMap ),
- m_bTrailingSlash( false )
-{
- (*m_xProps)[ OUString("Title") ]
- = PropertyValue( uno::makeAny( rTitle ), true );
- (*m_xProps)[ OUString("IsFolder") ]
- = PropertyValue( uno::makeAny( bFolder ), true );
- (*m_xProps)[ OUString("IsDocument") ]
- = PropertyValue( uno::makeAny( !bFolder ), true );
-}
-
-
-ContentProperties::ContentProperties( const OUString & rTitle )
-: m_xProps( new PropertyValueMap ),
- m_bTrailingSlash( false )
-{
- (*m_xProps)[ OUString("Title") ]
- = PropertyValue( uno::makeAny( rTitle ), true );
-}
-
-
-ContentProperties::ContentProperties()
-: m_xProps( new PropertyValueMap ),
- m_bTrailingSlash( false )
-{
-}
-
-ContentProperties::ContentProperties(const ContentProperties& rOther)
- : m_aEscapedTitle(rOther.m_aEscapedTitle)
- , m_xProps(rOther.m_xProps ? new PropertyValueMap(*rOther.m_xProps) : new PropertyValueMap)
- , m_bTrailingSlash(rOther.m_bTrailingSlash)
-{
-}
-
-
-bool ContentProperties::contains( const OUString & rName ) const
-{
- return get( rName ) != nullptr;
-}
-
-
-const uno::Any & ContentProperties::getValue(
- const OUString & rName ) const
-{
- const PropertyValue * pProp = get( rName );
- if ( pProp )
- return pProp->value();
- else
- return m_aEmptyAny;
-}
-
-
-const PropertyValue * ContentProperties::get(
- const OUString & rName ) const
-{
- PropertyValueMap::const_iterator it = m_xProps->find( rName );
- const PropertyValueMap::const_iterator end = m_xProps->end();
-
- if ( it == end )
- {
- it = std::find_if(m_xProps->cbegin(), end,
- [&rName](const PropertyValueMap::value_type& rEntry) {
- return rEntry.first.equalsIgnoreAsciiCase( rName );
- });
- if ( it != end )
- return &(*it).second;
-
- return nullptr;
- }
- else
- return &(*it).second;
-}
-
-
-// static
-void ContentProperties::UCBNamesToDAVNames(
- const uno::Sequence< beans::Property > & rProps,
- std::vector< OUString > & propertyNames )
-{
-
- // Assemble list of DAV properties to obtain from server.
- // Append DAV properties needed to obtain requested UCB props.
-
-
- // DAV UCB
- // creationdate <- DateCreated
- // getlastmodified <- DateModified
- // getcontenttype <- MediaType
- // getcontentlength <- Size
- // resourcetype <- IsFolder, IsDocument, ContentType
- // (taken from URI) <- Title
-
- bool bCreationDate = false;
- bool bLastModified = false;
- bool bContentType = false;
- bool bContentLength = false;
- bool bResourceType = false;
-
- for ( const beans::Property & rProp : rProps )
- {
- if ( rProp.Name == "Title" )
- {
- // Title is always obtained from resource's URI.
- continue;
- }
- else if ( rProp.Name == "DateCreated" || rProp.Name == DAVProperties::CREATIONDATE )
- {
- if ( !bCreationDate )
- {
- propertyNames.push_back( DAVProperties::CREATIONDATE );
- bCreationDate = true;
- }
- }
- else if ( rProp.Name == "DateModified" || rProp.Name == DAVProperties::GETLASTMODIFIED )
- {
- if ( !bLastModified )
- {
- propertyNames.push_back( DAVProperties::GETLASTMODIFIED );
- bLastModified = true;
- }
- }
- else if ( rProp.Name == "MediaType" || rProp.Name == DAVProperties::GETCONTENTTYPE )
- {
- if ( !bContentType )
- {
- propertyNames.push_back( DAVProperties::GETCONTENTTYPE );
- bContentType = true;
- }
- }
- else if ( rProp.Name == "Size" || rProp.Name == DAVProperties::GETCONTENTLENGTH )
- {
- if ( !bContentLength )
- {
- propertyNames.push_back( DAVProperties::GETCONTENTLENGTH );
- bContentLength = true;
- }
- }
- else if ( rProp.Name == "ContentType" || rProp.Name == "IsDocument" || rProp.Name == "IsFolder" || rProp.Name == DAVProperties::RESOURCETYPE )
- {
- if ( !bResourceType )
- {
- propertyNames.push_back( DAVProperties::RESOURCETYPE );
- bResourceType = true;
- }
- }
- else
- {
- propertyNames.push_back( rProp.Name );
- }
- }
-}
-
-
-// static
-void ContentProperties::UCBNamesToHTTPNames(
- const uno::Sequence< beans::Property > & rProps,
- std::vector< OUString > & propertyNames )
-{
-
- // Assemble list of HTTP header names to obtain from server.
- // Append HTTP headers needed to obtain requested UCB props.
-
-
- // HTTP UCB
- // Last-Modified <- DateModified
- // Content-Type <- MediaType
- // Content-Length <- Size
-
- for ( const beans::Property & rProp : rProps )
- {
- if ( rProp.Name == "DateModified" )
- {
- propertyNames.emplace_back("Last-Modified" );
- }
- else if ( rProp.Name == "MediaType" )
- {
- propertyNames.emplace_back("Content-Type" );
- }
- else if ( rProp.Name == "Size" )
- {
- propertyNames.emplace_back("Content-Length" );
- }
- else
- {
- propertyNames.push_back( rProp.Name );
- }
- }
-}
-
-
-bool ContentProperties::containsAllNames(
- const uno::Sequence< beans::Property >& rProps,
- std::vector< OUString > & rNamesNotContained ) const
-{
- rNamesNotContained.clear();
-
- for ( const auto& rProp : rProps )
- {
- const OUString & rName = rProp.Name;
- if ( !contains( rName ) )
- {
- // Not found.
- rNamesNotContained.push_back( rName );
- }
- }
-
- return rNamesNotContained.empty();
-}
-
-
-void ContentProperties::addProperties(
- const std::vector< OUString > & rProps,
- const ContentProperties & rContentProps )
-{
- for ( const OUString & rName : rProps )
- {
- if ( !contains( rName ) ) // ignore duplicates
- {
- const PropertyValue * pProp = rContentProps.get( rName );
- if ( pProp )
- {
- // Add it.
- addProperty( rName, pProp->value(), pProp->isCaseSensitive() );
- }
- else
- {
- addProperty( rName, uno::Any(), false );
- }
- }
- }
-}
-
-
-void ContentProperties::addProperty( const DAVPropertyValue & rProp )
-{
- addProperty( rProp.Name, rProp.Value, rProp.IsCaseSensitive );
-}
-
-
-void ContentProperties::addProperty( const OUString & rName,
- const css::uno::Any & rValue,
- bool bIsCaseSensitive )
-{
- if ( rName == DAVProperties::CREATIONDATE )
- {
- // Map DAV:creationdate to UCP:DateCreated
- OUString aValue;
- rValue >>= aValue;
- util::DateTime aDate;
- DateTimeHelper::convert( aValue, aDate );
-
- (*m_xProps)[ OUString("DateCreated") ]
- = PropertyValue( uno::makeAny( aDate ), true );
- }
- // else if ( rName.equals( DAVProperties::DISPLAYNAME ) )
- // {
- // }
- // else if ( rName.equals( DAVProperties::GETCONTENTLANGUAGE ) )
- // {
- // }
- else if ( rName == DAVProperties::GETCONTENTLENGTH )
- {
- // Map DAV:getcontentlength to UCP:Size
- OUString aValue;
- rValue >>= aValue;
-
- (*m_xProps)[ OUString("Size") ]
- = PropertyValue( uno::makeAny( aValue.toInt64() ), true );
- }
- else if ( rName.equalsIgnoreAsciiCase( "Content-Length" ) )
- {
- // Do NOT map Content-length entity header to DAV:getcontentlength!
- // Only DAV resources have this property.
-
- // Map Content-Length entity header to UCP:Size
- OUString aValue;
- rValue >>= aValue;
-
- (*m_xProps)[ OUString("Size") ]
- = PropertyValue( uno::makeAny( aValue.toInt64() ), true );
- }
- else if ( rName == DAVProperties::GETCONTENTTYPE )
- {
- // Map DAV:getcontenttype to UCP:MediaType (1:1)
- (*m_xProps)[ OUString("MediaType") ]
- = PropertyValue( rValue, true );
- }
- else if ( rName.equalsIgnoreAsciiCase( "Content-Type" ) )
- {
- // Do NOT map Content-Type entity header to DAV:getcontenttype!
- // Only DAV resources have this property.
-
- // Map DAV:getcontenttype to UCP:MediaType (1:1)
- (*m_xProps)[ OUString("MediaType") ]
- = PropertyValue( rValue, true );
- }
- // else if ( rName.equals( DAVProperties::GETETAG ) )
- // {
- // }
- else if ( rName == DAVProperties::GETLASTMODIFIED )
- {
- // Map the DAV:getlastmodified entity header to UCP:DateModified
- OUString aValue;
- rValue >>= aValue;
- util::DateTime aDate;
- DateTimeHelper::convert( aValue, aDate );
-
- (*m_xProps)[ OUString("DateModified") ]
- = PropertyValue( uno::makeAny( aDate ), true );
- }
- else if ( rName.equalsIgnoreAsciiCase( "Last-Modified" ) )
- {
- // Do not map Last-Modified entity header to DAV:getlastmodified!
- // Only DAV resources have this property.
-
- // Map the Last-Modified entity header to UCP:DateModified
- OUString aValue;
- rValue >>= aValue;
- util::DateTime aDate;
- DateTimeHelper::convert( aValue, aDate );
-
- (*m_xProps)[ OUString("DateModified") ]
- = PropertyValue( uno::makeAny( aDate ), true );
- }
- // else if ( rName.equals( DAVProperties::LOCKDISCOVERY ) )
- // {
- // }
- else if ( rName == DAVProperties::RESOURCETYPE )
- {
- OUString aValue;
- rValue >>= aValue;
-
- // Map DAV:resourcetype to UCP:IsFolder, UCP:IsDocument, UCP:ContentType
- bool bFolder = aValue.equalsIgnoreAsciiCase( "collection" );
-
- (*m_xProps)[ OUString("IsFolder") ]
- = PropertyValue( uno::makeAny( bFolder ), true );
- (*m_xProps)[ OUString("IsDocument") ]
- = PropertyValue( uno::makeAny( !bFolder ), true );
- (*m_xProps)[ OUString("ContentType") ]
- = PropertyValue( uno::makeAny( bFolder
- ? OUString( WEBDAV_COLLECTION_TYPE )
- : OUString( WEBDAV_CONTENT_TYPE ) ), true );
- }
- // else if ( rName.equals( DAVProperties::SOURCE ) )
- // {
- // }
- // else if ( rName.equals( DAVProperties::SUPPORTEDLOCK ) )
- // {
- // }
-
- // Save property.
- (*m_xProps)[ rName ] = PropertyValue( rValue, bIsCaseSensitive );
-}
-
-
-// CachableContentProperties Implementation.
-
-
-namespace
-{
- bool isCachable( OUString const & rName,
- bool isCaseSensitive )
- {
- static const OUString aNonCachableProps [] =
- {
- DAVProperties::LOCKDISCOVERY,
-
- DAVProperties::GETETAG,
- OUString( "ETag" ),
-
- OUString( "DateModified" ),
- OUString( "Last-Modified" ),
- DAVProperties::GETLASTMODIFIED,
-
- OUString( "Size" ),
- OUString( "Content-Length" ),
- DAVProperties::GETCONTENTLENGTH,
-
- OUString( "Date" )
- };
-
- for (const auto & rNonCachableProp : aNonCachableProps)
- {
- if ( isCaseSensitive )
- {
- if ( rName == rNonCachableProp )
- return false;
- }
- else
- if ( rName.equalsIgnoreAsciiCase( rNonCachableProp ) )
- return false;
- }
- return true;
- }
-
-} // namespace
-
-
-CachableContentProperties::CachableContentProperties(
- const ContentProperties & rProps )
-{
- addProperties( rProps );
-}
-
-
-void CachableContentProperties::addProperties(
- const ContentProperties & rProps )
-{
- const std::unique_ptr< PropertyValueMap > & props = rProps.getProperties();
-
- for ( const auto& rProp : *props )
- {
- if ( isCachable( rProp.first, rProp.second.isCaseSensitive() ) )
- m_aProps.addProperty( rProp.first,
- rProp.second.value(),
- rProp.second.isCaseSensitive() );
- }
-}
-
-
-void CachableContentProperties::addProperties(
- const std::vector< DAVPropertyValue > & rProps )
-{
- for ( const auto& rProp : rProps )
- {
- if ( isCachable( rProp.Name, rProp.IsCaseSensitive ) )
- m_aProps.addProperty( rProp );
- }
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/ContentProperties.hxx b/ucb/source/ucp/webdav-neon/ContentProperties.hxx
deleted file mode 100644
index 8f11e8726286..000000000000
--- a/ucb/source/ucp/webdav-neon/ContentProperties.hxx
+++ /dev/null
@@ -1,183 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <memory>
-#include <unordered_map>
-#include <vector>
-#include <rtl/ustring.hxx>
-#include <com/sun/star/uno/Any.hxx>
-#include <com/sun/star/uno/Sequence.hxx>
-#include "DAVResource.hxx"
-
-namespace com::sun::star::beans {
- struct Property;
-}
-
-namespace webdav_ucp
-{
-
-struct DAVResource;
-
-// PropertyValueMap.
-class PropertyValue
-{
-private:
- css::uno::Any m_aValue;
- bool m_bIsCaseSensitive;
-
-public:
- PropertyValue()
- : m_bIsCaseSensitive( true ) {}
-
- PropertyValue( const css::uno::Any & rValue,
- bool bIsCaseSensitive )
- : m_aValue( rValue),
- m_bIsCaseSensitive( bIsCaseSensitive ) {}
-
- bool isCaseSensitive() const { return m_bIsCaseSensitive; }
- const css::uno::Any & value() const { return m_aValue; }
-
-};
-
-typedef std::unordered_map< OUString, PropertyValue> PropertyValueMap;
-
-class ContentProperties
-{
-public:
- ContentProperties();
-
- explicit ContentProperties( const DAVResource& rResource );
-
- // Mini props for transient contents.
- ContentProperties( const OUString & rTitle, bool bFolder );
-
- // Micro props for non-existing contents.
- explicit ContentProperties( const OUString & rTitle );
-
- ContentProperties( const ContentProperties & rOther );
-
- bool contains( const OUString & rName ) const;
-
- const css::uno::Any &
- getValue( const OUString & rName ) const;
-
- // Maps the UCB property names contained in rProps with their DAV property
- // counterparts, if possible. All unmappable properties will be included
- // unchanged in resulting vector.
- // The vector filled by this method can directly be handed over to
- // DAVResourceAccess::PROPFIND. The result from PROPFIND
- // (vector< DAVResource >) can be used to create a ContentProperties
- // instance which can map DAV properties back to UCB properties.
- static void UCBNamesToDAVNames( const css::uno::Sequence< css::beans::Property > & rProps,
- std::vector< OUString > & resources );
-
- // Maps the UCB property names contained in rProps with their HTTP header
- // counterparts, if possible. All unmappable properties will be included
- // unchanged in resulting vector.
- // The vector filled by this method can directly be handed over to
- // DAVResourceAccess::HEAD. The result from HEAD (vector< DAVResource >)
- // can be used to create a ContentProperties instance which can map header
- // names back to UCB properties.
- static void UCBNamesToHTTPNames( const css::uno::Sequence< css::beans::Property > & rProps,
- std::vector< OUString > & resources );
-
- // return true, if all properties contained in rProps are contained in
- // this ContentProperties instance. Otherwise, false will be returned.
- // rNamesNotContained contain the missing names.
- bool containsAllNames(
- const css::uno::Sequence< css::beans::Property >& rProps,
- std::vector< OUString > & rNamesNotContained ) const;
-
- // adds all properties described by rProps that are actually contained in
- // rContentProps to this instance. In case of duplicates the value
- // already contained in this will left unchanged.
- void addProperties( const std::vector< OUString > & rProps,
- const ContentProperties & rContentProps );
-
- // overwrites probably existing entry.
- void addProperty( const OUString & rName,
- const css::uno::Any & rValue,
- bool bIsCaseSensitive );
-
- // overwrites probably existing entry.
- void addProperty( const DAVPropertyValue & rProp );
-
- bool isTrailingSlash() const { return m_bTrailingSlash; }
-
- const OUString & getEscapedTitle() const { return m_aEscapedTitle; }
-
- // Not good to expose implementation details, but this is actually an
- // internal class.
- const std::unique_ptr< PropertyValueMap > & getProperties() const
- { return m_xProps; }
-
-private:
- OUString m_aEscapedTitle;
- std::unique_ptr< PropertyValueMap > m_xProps;
- bool m_bTrailingSlash;
-
- static css::uno::Any m_aEmptyAny;
-
- ContentProperties & operator=( const ContentProperties & ) = delete;
-
- const PropertyValue * get( const OUString & rName ) const;
-};
-
-class CachableContentProperties
-{
-private:
- ContentProperties m_aProps;
-
- CachableContentProperties & operator=( const CachableContentProperties & ) = delete;
- CachableContentProperties( const CachableContentProperties & ) = delete;
-
-public:
- explicit CachableContentProperties( const ContentProperties & rProps );
-
- void addProperties( const ContentProperties & rProps );
-
- void addProperties( const std::vector< DAVPropertyValue > & rProps );
-
- bool containsAllNames(
- const css::uno::Sequence< css::beans::Property >& rProps,
- std::vector< OUString > & rNamesNotContained ) const
- { return m_aProps.containsAllNames( rProps, rNamesNotContained ); }
-
- const css::uno::Any &
- getValue( const OUString & rName ) const
- { return m_aProps.getValue( rName ); }
-
- operator const ContentProperties & () const { return m_aProps; }
-};
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/DAVAuthListener.hxx b/ucb/source/ucp/webdav-neon/DAVAuthListener.hxx
deleted file mode 100644
index 540ac788ca16..000000000000
--- a/ucb/source/ucp/webdav-neon/DAVAuthListener.hxx
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-#pragma once
-
-#include <config_lgpl.h>
-#include <salhelper/simplereferenceobject.hxx>
-#include <rtl/ustring.hxx>
-
-namespace webdav_ucp
-{
-
-class DAVAuthListener : public salhelper::SimpleReferenceObject
-{
- public:
- virtual int authenticate(
- const OUString & inRealm,
- const OUString & inHostName,
- OUString & inoutUserName,
- OUString & outPassWord,
- bool bCanUseSystemCredentials ) = 0;
-};
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/DAVAuthListenerImpl.hxx b/ucb/source/ucp/webdav-neon/DAVAuthListenerImpl.hxx
deleted file mode 100644
index b3d2a8ad601f..000000000000
--- a/ucb/source/ucp/webdav-neon/DAVAuthListenerImpl.hxx
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <com/sun/star/ucb/XCommandEnvironment.hpp>
-#include "DAVAuthListener.hxx"
-
-
-namespace webdav_ucp
-{
-
-
-
-
- class DAVAuthListener_Impl : public DAVAuthListener
- {
- public:
-
- DAVAuthListener_Impl(
- const css::uno::Reference< css::ucb::XCommandEnvironment>& xEnv,
- const OUString & inURL )
- : m_xEnv( xEnv ), m_aURL( inURL )
- {
- }
-
- virtual int authenticate( const OUString & inRealm,
- const OUString & inHostName,
- OUString & inoutUserName,
- OUString & outPassWord,
- bool bCanUseSystemCredentials ) override;
- private:
-
- const css::uno::Reference< css::ucb::XCommandEnvironment > m_xEnv;
- const OUString m_aURL;
-
- OUString m_aPrevPassword;
- OUString m_aPrevUsername;
- };
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/DAVException.hxx b/ucb/source/ucp/webdav-neon/DAVException.hxx
deleted file mode 100644
index 4fdcac3f4f8e..000000000000
--- a/ucb/source/ucp/webdav-neon/DAVException.hxx
+++ /dev/null
@@ -1,174 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <rtl/ustring.hxx>
-
-namespace webdav_ucp
-{
-
-
-// HTTP/WebDAV status codes
-
-
-const sal_uInt16 SC_NONE = 0;
-
-// 1xx (Informational - no errors)
-const sal_uInt16 SC_CONTINUE = 100;
-const sal_uInt16 SC_SWITCHING_PROTOCOLS = 101;
-// DAV extensions
-const sal_uInt16 SC_PROCESSING = 102;
-
-//2xx (Successful - no errors)
-const sal_uInt16 SC_OK = 200;
-const sal_uInt16 SC_CREATED = 201;
-const sal_uInt16 SC_ACCEPTED = 202;
-const sal_uInt16 SC_NON_AUTHORITATIVE_INFORMATION = 203;
-const sal_uInt16 SC_NO_CONTENT = 204;
-const sal_uInt16 SC_RESET_CONTENT = 205;
-const sal_uInt16 SC_PARTIAL_CONTENT = 206;
-// DAV extensions
-const sal_uInt16 SC_MULTISTATUS = 207;
-
-//3xx (Redirection)
-const sal_uInt16 SC_MULTIPLE_CHOICES = 300;
-const sal_uInt16 SC_MOVED_PERMANENTLY = 301;
-const sal_uInt16 SC_MOVED_TEMPORARILY = 302;
-const sal_uInt16 SC_SEE_OTHER = 303;
-const sal_uInt16 SC_NOT_MODIFIED = 304;
-const sal_uInt16 SC_USE_PROXY = 305;
-const sal_uInt16 SC_TEMPORARY_REDIRECT = 307;
-
-//4xx (Client error)
-const sal_uInt16 SC_BAD_REQUEST = 400;
-const sal_uInt16 SC_UNAUTHORIZED = 401;
-const sal_uInt16 SC_PAYMENT_REQUIRED = 402;
-const sal_uInt16 SC_FORBIDDEN = 403;
-const sal_uInt16 SC_NOT_FOUND = 404;
-const sal_uInt16 SC_METHOD_NOT_ALLOWED = 405;
-const sal_uInt16 SC_NOT_ACCEPTABLE = 406;
-const sal_uInt16 SC_PROXY_AUTHENTICATION_REQUIRED = 407;
-const sal_uInt16 SC_REQUEST_TIMEOUT = 408;
-const sal_uInt16 SC_CONFLICT = 409;
-const sal_uInt16 SC_GONE = 410;
-const sal_uInt16 SC_LENGTH_REQUIRED = 411;
-const sal_uInt16 SC_PRECONDITION_FAILED = 412;
-const sal_uInt16 SC_REQUEST_ENTITY_TOO_LARGE = 413;
-const sal_uInt16 SC_REQUEST_URI_TOO_LONG = 414;
-const sal_uInt16 SC_UNSUPPORTED_MEDIA_TYPE = 415;
-const sal_uInt16 SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
-const sal_uInt16 SC_EXPECTATION_FAILED = 417;
-// DAV extensions
-const sal_uInt16 SC_UNPROCESSABLE_ENTITY = 422;
-const sal_uInt16 SC_LOCKED = 423;
-const sal_uInt16 SC_FAILED_DEPENDENCY = 424;
-
-//5xx (Server error, general <https://tools.ietf.org/html/rfc7231#section-6.6>)
-const sal_uInt16 SC_INTERNAL_SERVER_ERROR = 500;
-const sal_uInt16 SC_NOT_IMPLEMENTED = 501;
-const sal_uInt16 SC_BAD_GATEWAY = 502;
-const sal_uInt16 SC_SERVICE_UNAVAILABLE = 503;
-const sal_uInt16 SC_GATEWAY_TIMEOUT = 504;
-const sal_uInt16 SC_HTTP_VERSION_NOT_SUPPORTED = 505;
-// DAV extensions (<https://tools.ietf.org/html/rfc4918#section-11>)
-const sal_uInt16 SC_INSUFFICIENT_STORAGE = 507;
-
-// unofficial status codes only used internally by LO
-// used to cache the connection time out event
-const sal_uInt16 USC_CONNECTION_TIMED_OUT = 908;
- // name resolution failed
-const sal_uInt16 USC_LOOKUP_FAILED = 909;
-const sal_uInt16 USC_AUTH_FAILED = 910;
-const sal_uInt16 USC_AUTHPROXY_FAILED = 911;
-
-
-
-class DAVException : public std::exception
-{
- public:
- enum ExceptionCode {
- DAV_HTTP_ERROR = 0, // Generic error,
- // mData = server error message,
- // mStatusCode = HTTP status code
- DAV_HTTP_LOOKUP, // Name lookup failed,
- // mData = server[:port]
- DAV_HTTP_AUTH, // User authentication failed on server,
- // mData = server[:port]
- DAV_HTTP_AUTHPROXY, // User authentication failed on proxy,
- // mData = proxy server[:port]
- DAV_HTTP_CONNECT, // Could not connect to server,
- // mData = server[:port]
- DAV_HTTP_TIMEOUT, // Connection timed out
- // mData = server[:port]
- DAV_HTTP_FAILED, // The precondition failed
- // mData = server[:port]
- DAV_HTTP_RETRY, // Retry request
- // mData = server[:port]
- DAV_HTTP_REDIRECT, // Request was redirected,
- // mData = new URL
- DAV_SESSION_CREATE, // session creation error,
- // mData = server[:port]
- DAV_INVALID_ARG, // invalid argument
-
- DAV_LOCK_EXPIRED, // DAV lock expired
-
- DAV_NOT_LOCKED, // not locked
-
- DAV_LOCKED_SELF, // locked by this OOo session
-
- DAV_LOCKED // locked by third party
- };
-
- private:
- ExceptionCode mExceptionCode;
- OUString mData;
- sal_uInt16 mStatusCode;
-
- public:
- explicit DAVException( ExceptionCode inExceptionCode ) :
- mExceptionCode( inExceptionCode ), mStatusCode( SC_NONE ) {};
- DAVException( ExceptionCode inExceptionCode,
- const OUString & rData ) :
- mExceptionCode( inExceptionCode ), mData( rData ),
- mStatusCode( SC_NONE ) {};
- DAVException( ExceptionCode inExceptionCode,
- const OUString & rData,
- sal_uInt16 nStatusCode ) :
- mExceptionCode( inExceptionCode ), mData( rData ),
- mStatusCode( nStatusCode ) {};
-
- const ExceptionCode & getError() const { return mExceptionCode; }
- const OUString & getData() const { return mData; }
- sal_uInt16 getStatus() const { return mStatusCode; }
-};
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/DAVProperties.cxx b/ucb/source/ucp/webdav-neon/DAVProperties.cxx
deleted file mode 100644
index b1a4a0273ef8..000000000000
--- a/ucb/source/ucp/webdav-neon/DAVProperties.cxx
+++ /dev/null
@@ -1,193 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-
-#include <string.h>
-
-#include <o3tl/string_view.hxx>
-
-#include "DAVProperties.hxx"
-
-using namespace webdav_ucp;
-
-void DAVProperties::createNeonPropName( std::u16string_view rFullName,
- NeonPropName & rName )
-{
- if ( o3tl::starts_with( rFullName, u"DAV:" ) )
- {
- rName.nspace = "DAV:";
- rName.name
- = strdup( OUStringToOString(
- rFullName.substr( RTL_CONSTASCII_LENGTH( "DAV:" ) ),
- RTL_TEXTENCODING_UTF8 ).getStr() );
- }
- else if ( o3tl::starts_with( rFullName, u"http://apache.org/dav/props/" ) )
- {
- rName.nspace = "http://apache.org/dav/props/";
- rName.name
- = strdup( OUStringToOString(
- rFullName.substr(
- RTL_CONSTASCII_LENGTH(
- "http://apache.org/dav/props/" ) ),
- RTL_TEXTENCODING_UTF8 ).getStr() );
- }
- else if ( o3tl::starts_with( rFullName, u"http://ucb.openoffice.org/dav/props/" ) )
- {
- rName.nspace = "http://ucb.openoffice.org/dav/props/";
- rName.name
- = strdup( OUStringToOString(
- rFullName.substr(
- RTL_CONSTASCII_LENGTH(
- "http://ucb.openoffice.org/dav/props/" ) ),
- RTL_TEXTENCODING_UTF8 ).getStr() );
- }
- else if ( o3tl::starts_with( rFullName, u"<prop:" ) )
- {
- // Support for 3rd party namespaces/props
-
- OString aFullName
- = OUStringToOString( rFullName, RTL_TEXTENCODING_UTF8 );
-
- // Format: <prop:the_propname xmlns:prop="the_namespace">
-
- sal_Int32 nStart = RTL_CONSTASCII_LENGTH( "<prop:" );
- sal_Int32 nLen = aFullName.indexOf( ' ' ) - nStart;
- rName.name = strdup( aFullName.copy( nStart, nLen ).getStr() );
-
- nStart = aFullName.indexOf( '=', nStart + nLen ) + 2; // after ="
- nLen = aFullName.getLength() - RTL_CONSTASCII_LENGTH( "\">" ) - nStart;
- rName.nspace = strdup( aFullName.copy( nStart, nLen ).getStr() );
- }
- else
- {
- // Add our namespace to our own properties.
- rName.nspace = "http://ucb.openoffice.org/dav/props/";
- rName.name
- = strdup( OUStringToOString( rFullName,
- RTL_TEXTENCODING_UTF8 ).getStr() );
- }
-}
-
-void DAVProperties::createUCBPropName( const char * nspace,
- const char * name,
- OUString & rFullName )
-{
- OUString aNameSpace
- = OStringToOUString( nspace, RTL_TEXTENCODING_UTF8 );
- OUString aName
- = OStringToOUString( name, RTL_TEXTENCODING_UTF8 );
-
- if ( aNameSpace.isEmpty() )
- {
- // Some servers send XML without proper namespaces. Assume "DAV:"
- // in this case, if name is a well-known dav property name.
- // Although this is not 100% correct, it solves many problems.
- if ( o3tl::equalsIgnoreAsciiCase(aName, std::u16string_view(DAVProperties::RESOURCETYPE).substr(4)) ||
- o3tl::equalsIgnoreAsciiCase(aName, std::u16string_view(DAVProperties::RESOURCETYPE).substr(4)) ||
- o3tl::equalsIgnoreAsciiCase(aName, std::u16string_view(DAVProperties::SUPPORTEDLOCK).substr(4)) ||
- o3tl::equalsIgnoreAsciiCase(aName, std::u16string_view(DAVProperties::LOCKDISCOVERY).substr(4)) ||
- o3tl::equalsIgnoreAsciiCase(aName, std::u16string_view(DAVProperties::CREATIONDATE).substr(4)) ||
- o3tl::equalsIgnoreAsciiCase(aName, std::u16string_view(DAVProperties::DISPLAYNAME).substr(4)) ||
- o3tl::equalsIgnoreAsciiCase(aName, std::u16string_view(DAVProperties::GETCONTENTLANGUAGE).substr(4)) ||
- o3tl::equalsIgnoreAsciiCase(aName, std::u16string_view(DAVProperties::GETCONTENTLENGTH).substr(4)) ||
- o3tl::equalsIgnoreAsciiCase(aName, std::u16string_view(DAVProperties::GETCONTENTTYPE).substr(4)) ||
- o3tl::equalsIgnoreAsciiCase(aName, std::u16string_view(DAVProperties::GETETAG).substr(4)) ||
- o3tl::equalsIgnoreAsciiCase(aName, std::u16string_view(DAVProperties::GETLASTMODIFIED).substr(4)) ||
- o3tl::equalsIgnoreAsciiCase(aName, std::u16string_view(DAVProperties::SOURCE).substr(4)) )
- aNameSpace = "DAV:";
- }
-
- // Note: Concatenating strings BEFORE comparing against known namespaces
- // is important. See RFC 2815 ( 23.4.2 Meaning of Qualified Names ).
- rFullName = aNameSpace;
- rFullName += aName;
-
- if ( rFullName.startsWith( "DAV:" ) )
- {
- // Okay, Just concat strings.
- }
- else if ( rFullName.startsWith( "http://apache.org/dav/props/" ) )
- {
- // Okay, Just concat strings.
- }
- else if ( rFullName.startsWith( "http://ucb.openoffice.org/dav/props/" ) )
- {
- // Remove namespace from our own properties.
- rFullName = rFullName.copy(
- RTL_CONSTASCII_LENGTH(
- "http://ucb.openoffice.org/dav/props/" ) );
- }
- else
- {
- // Create property name that encodes, namespace and name ( XML ).
- rFullName = "<prop:" + aName + " xmlns:prop=\"" + aNameSpace + "\">";
- }
-}
-
-bool DAVProperties::isUCBDeadProperty( const NeonPropName & rName )
-{
- return ( rName.nspace &&
- ( rtl_str_compareIgnoreAsciiCase(
- rName.nspace, "http://ucb.openoffice.org/dav/props/" )
- == 0 ) );
-}
-
-bool DAVProperties::isUCBSpecialProperty(
- const OUString& rFullName, OUString& rParsedName)
-{
- if ( !rFullName.startsWith( "<prop:" ) || !rFullName.endsWith( "\">" ) )
- return false;
-
- sal_Int32 nStart = strlen( "<prop:" );
- sal_Int32 nEnd = rFullName.indexOf( ' ', nStart );
- if ( nEnd <= nStart ) // incl. -1 for "not found"
- return false;
-
- OUString sPropName( rFullName.copy( nStart, nEnd - nStart ) );
-
- // TODO skip whitespaces?
- if ( !rFullName.match( "xmlns:prop=\"", ++nEnd ) )
- return false;
-
- nStart = nEnd + strlen( "xmlns:prop=\"" );
- nEnd = rFullName.indexOf( '"', nStart );
- if ( nEnd != rFullName.getLength() - sal_Int32( strlen( "\">" ) )
- || nEnd == nStart )
- {
- return false;
- }
-
- rParsedName = rFullName.copy( nStart, nEnd - nStart );
- if ( !rParsedName.endsWith( "/" ) )
- rParsedName += "/";
- rParsedName += sPropName;
-
- return rParsedName.getLength();
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/DAVProperties.hxx b/ucb/source/ucp/webdav-neon/DAVProperties.hxx
deleted file mode 100644
index 3eeddcb847e1..000000000000
--- a/ucb/source/ucp/webdav-neon/DAVProperties.hxx
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-#pragma once
-
-#include <sal/config.h>
-
-#include <string_view>
-
-#include <config_lgpl.h>
-#include <rtl/ustring.hxx>
-#include "NeonTypes.hxx"
-
-namespace webdav_ucp
-{
-
-struct DAVProperties
-{
- static constexpr OUStringLiteral CREATIONDATE = u"DAV:creationdate";
- static constexpr OUStringLiteral DISPLAYNAME = u"DAV:displayname";
- static constexpr OUStringLiteral GETCONTENTLANGUAGE = u"DAV:getcontentlanguage";
- static constexpr OUStringLiteral GETCONTENTLENGTH = u"DAV:getcontentlength";
- static constexpr OUStringLiteral GETCONTENTTYPE = u"DAV:getcontenttype";
- static constexpr OUStringLiteral GETETAG = u"DAV:getetag";
- static constexpr OUStringLiteral GETLASTMODIFIED = u"DAV:getlastmodified";
- static constexpr OUStringLiteral LOCKDISCOVERY = u"DAV:lockdiscovery";
- static constexpr OUStringLiteral RESOURCETYPE = u"DAV:resourcetype";
- static constexpr OUStringLiteral SOURCE = u"DAV:source";
- static constexpr OUStringLiteral SUPPORTEDLOCK = u"DAV:supportedlock";
- static constexpr OUStringLiteral EXECUTABLE = u"http://apache.org/dav/props/executable";
-
- static void createNeonPropName( std::u16string_view rFullName,
- NeonPropName & rName );
- static void createUCBPropName ( const char * nspace,
- const char * name,
- OUString & rFullName );
-
- static bool isUCBDeadProperty( const NeonPropName & rName );
- static bool isUCBSpecialProperty( const OUString & rFullName,
- OUString & rParsedName );
-};
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/DAVRequestEnvironment.hxx b/ucb/source/ucp/webdav-neon/DAVRequestEnvironment.hxx
deleted file mode 100644
index 9059f6162804..000000000000
--- a/ucb/source/ucp/webdav-neon/DAVRequestEnvironment.hxx
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-#pragma once
-
-#include <config_lgpl.h>
-#include <vector>
-#include <rtl/ref.hxx>
-#include <com/sun/star/ucb/XCommandEnvironment.hpp>
-#include "DAVAuthListener.hxx"
-
-namespace webdav_ucp
-{
- typedef std::pair< OUString, OUString > DAVRequestHeader;
- typedef std::vector< DAVRequestHeader > DAVRequestHeaders;
-
-struct DAVRequestEnvironment
-{
- OUString m_aRequestURI;
- rtl::Reference< DAVAuthListener > m_xAuthListener;
-// rtl::Reference< DAVStatusListener > m_xStatusListener;
-// rtl::Reference< DAVProgressListener > m_xStatusListener;
- DAVRequestHeaders m_aRequestHeaders;
- uno::Reference< ucb::XCommandEnvironment > m_xEnv;
-
-DAVRequestEnvironment( const OUString & rRequestURI,
- const rtl::Reference< DAVAuthListener > & xListener,
- DAVRequestHeaders && rRequestHeaders,
- const uno::Reference< ucb::XCommandEnvironment > & xEnv)
- : m_aRequestURI( rRequestURI ),
- m_xAuthListener( xListener ),
- m_aRequestHeaders( std::move(rRequestHeaders) ),
- m_xEnv( xEnv ){}
-
- DAVRequestEnvironment() {}
-};
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/DAVResource.hxx b/ucb/source/ucp/webdav-neon/DAVResource.hxx
deleted file mode 100644
index d26206de71e0..000000000000
--- a/ucb/source/ucp/webdav-neon/DAVResource.hxx
+++ /dev/null
@@ -1,70 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <vector>
-
-#include <rtl/ustring.hxx>
-#include <com/sun/star/uno/Any.hxx>
-
-namespace webdav_ucp
-{
-
-struct DAVPropertyValue
-{
- OUString Name;
- css::uno::Any Value;
- bool IsCaseSensitive;
-
- DAVPropertyValue() : IsCaseSensitive( true ) {}
-};
-
-struct DAVResource
-{
- OUString uri;
- std::vector< DAVPropertyValue > properties;
-
- DAVResource() {}
- explicit DAVResource( const OUString & inUri ) : uri( inUri ) {}
-};
-
-struct DAVResourceInfo
-{
- std::vector < OUString > properties;
-
- bool operator==( const struct DAVResourceInfo& a ) const
- {
- return (properties == a.properties );
- }
-};
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/DAVResourceAccess.cxx b/ucb/source/ucp/webdav-neon/DAVResourceAccess.cxx
deleted file mode 100644
index b13edc253c0c..000000000000
--- a/ucb/source/ucp/webdav-neon/DAVResourceAccess.cxx
+++ /dev/null
@@ -1,1192 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-
-#include <com/sun/star/io/IOException.hpp>
-#include <com/sun/star/lang/IllegalArgumentException.hpp>
-#include <com/sun/star/task/XInteractionAbort.hpp>
-#include <com/sun/star/ucb/XWebDAVCommandEnvironment.hpp>
-
-#include <ucbhelper/simpleauthenticationrequest.hxx>
-#include <comphelper/seekableinput.hxx>
-
-#include "DAVAuthListenerImpl.hxx"
-#include "DAVResourceAccess.hxx"
-
-using namespace webdav_ucp;
-using namespace com::sun::star;
-
-
-// DAVAuthListener_Impl Implementation.
-
-constexpr sal_uInt32 g_nRedirectLimit = 5;
-
-// virtual
-int DAVAuthListener_Impl::authenticate(
- const OUString & inRealm,
- const OUString & inHostName,
- OUString & inoutUserName,
- OUString & outPassWord,
- bool bCanUseSystemCredentials )
-{
- if ( m_xEnv.is() )
- {
- uno::Reference< task::XInteractionHandler > xIH
- = m_xEnv->getInteractionHandler();
-
- if ( xIH.is() )
- {
- // #102871# - Supply username and password from previous try.
- // Password container service depends on this!
- if ( inoutUserName.isEmpty() )
- inoutUserName = m_aPrevUsername;
-
- if ( outPassWord.isEmpty() )
- outPassWord = m_aPrevPassword;
-
- rtl::Reference< ucbhelper::SimpleAuthenticationRequest > xRequest
- = new ucbhelper::SimpleAuthenticationRequest(
- m_aURL, inHostName, inRealm, inoutUserName,
- outPassWord, bCanUseSystemCredentials );
- xIH->handle( xRequest );
-
- rtl::Reference< ucbhelper::InteractionContinuation > xSelection
- = xRequest->getSelection();
-
- if ( xSelection.is() )
- {
- // Handler handled the request.
- uno::Reference< task::XInteractionAbort > xAbort(
- xSelection.get(), uno::UNO_QUERY );
- if ( !xAbort.is() )
- {
- const rtl::Reference<
- ucbhelper::InteractionSupplyAuthentication > & xSupp
- = xRequest->getAuthenticationSupplier();
-
- bool bUseSystemCredentials = false;
-
- if ( bCanUseSystemCredentials )
- bUseSystemCredentials
- = xSupp->getUseSystemCredentials();
-
- if ( bUseSystemCredentials )
- {
- // This is the (strange) way to tell neon to use
- // system credentials.
- inoutUserName.clear();
- outPassWord.clear();
- }
- else
- {
- inoutUserName = xSupp->getUserName();
- outPassWord = xSupp->getPassword();
- }
-
- // #102871# - Remember username and password.
- m_aPrevUsername = inoutUserName;
- m_aPrevPassword = outPassWord;
-
- // go on.
- return 0;
- }
- }
- }
- }
- // Abort.
- return -1;
-}
-
-
-// DAVResourceAccess Implementation.
-
-
-DAVResourceAccess::DAVResourceAccess(
- const uno::Reference< uno::XComponentContext > & rxContext,
- rtl::Reference< DAVSessionFactory > const & rSessionFactory,
- const OUString & rURL )
-: m_aURL( rURL ),
- m_xSessionFactory( rSessionFactory ),
- m_xContext( rxContext )
-{
-}
-
-
-DAVResourceAccess::DAVResourceAccess( const DAVResourceAccess & rOther )
-: m_aURL( rOther.m_aURL ),
- m_aPath( rOther.m_aPath ),
- m_aFlags( rOther.m_aFlags ),
- m_xSession( rOther.m_xSession ),
- m_xSessionFactory( rOther.m_xSessionFactory ),
- m_xContext( rOther.m_xContext ),
- m_aRedirectURIs( rOther.m_aRedirectURIs )
-{
-}
-
-
-DAVResourceAccess & DAVResourceAccess::operator=(
- const DAVResourceAccess & rOther )
-{
- m_aURL = rOther.m_aURL;
- m_aPath = rOther.m_aPath;
- m_aFlags = rOther.m_aFlags;
- m_xSession = rOther.m_xSession;
- m_xSessionFactory = rOther.m_xSessionFactory;
- m_xContext = rOther.m_xContext;
- m_aRedirectURIs = rOther.m_aRedirectURIs;
-
- return *this;
-}
-
-void DAVResourceAccess::OPTIONS(
- DAVOptions & rOptions,
- const css::uno::Reference<
- css::ucb::XCommandEnvironment > & xEnv )
-{
- initialize();
-
- int errorCount = 0;
- bool bRetry;
- do
- {
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
-
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- css::ucb::WebDAVHTTPMethod_OPTIONS,
- aHeaders );
-
- m_xSession->OPTIONS( getRequestURI(),
- rOptions,
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl( xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-}
-
-void DAVResourceAccess::PROPFIND(
- const Depth nDepth,
- const std::vector< OUString > & rPropertyNames,
- std::vector< DAVResource > & rResources,
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- initialize();
-
- int errorCount = 0;
- bool bRetry;
- do
- {
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
-
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_PROPFIND,
- aHeaders );
-
- m_xSession->PROPFIND( getRequestURI(),
- nDepth,
- rPropertyNames,
- rResources,
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl( xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-}
-
-
-void DAVResourceAccess::PROPFIND(
- const Depth nDepth,
- std::vector< DAVResourceInfo > & rResInfo,
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- initialize();
-
- int errorCount = 0;
- bool bRetry;
- do
- {
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_PROPFIND,
- aHeaders );
-
- m_xSession->PROPFIND( getRequestURI(),
- nDepth,
- rResInfo,
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl( xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) ) ;
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-}
-
-
-void DAVResourceAccess::PROPPATCH(
- const std::vector< ProppatchValue >& rValues,
- const uno::Reference< ucb::XCommandEnvironment >& xEnv )
-{
- initialize();
-
- int errorCount = 0;
- bool bRetry;
- do
- {
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_PROPPATCH,
- aHeaders );
-
- m_xSession->PROPPATCH( getRequestURI(),
- rValues,
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl( xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-}
-
-
-void DAVResourceAccess::HEAD(
- const std::vector< OUString > & rHeaderNames,
- DAVResource & rResource,
- const uno::Reference< ucb::XCommandEnvironment >& xEnv )
-{
- initialize();
-
- int errorCount = 0;
- bool bRetry;
- do
- {
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_HEAD,
- aHeaders );
-
- m_xSession->HEAD( getRequestURI(),
- rHeaderNames,
- rResource,
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl( xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-}
-
-
-uno::Reference< io::XInputStream > DAVResourceAccess::GET(
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- initialize();
-
- uno::Reference< io::XInputStream > xStream;
- int errorCount = 0;
- bool bRetry;
- do
- {
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_GET,
- aHeaders );
-
- xStream = m_xSession->GET( getRequestURI(),
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl(
- xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-
- return xStream;
-}
-
-
-void DAVResourceAccess::GET(
- uno::Reference< io::XOutputStream > & rStream,
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- initialize();
-
- int errorCount = 0;
- bool bRetry;
- do
- {
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_GET,
- aHeaders );
-
- m_xSession->GET( getRequestURI(),
- rStream,
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl( xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-}
-
-uno::Reference< io::XInputStream > DAVResourceAccess::GET(
- const std::vector< OUString > & rHeaderNames,
- DAVResource & rResource,
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- initialize();
-
- uno::Reference< io::XInputStream > xStream;
- int errorCount = 0;
- bool bRetry;
- do
- {
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_GET,
- aHeaders );
-
- xStream = m_xSession->GET( getRequestURI(),
- rHeaderNames,
- rResource,
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl(
- xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-
- return xStream;
-}
-
-// used as HEAD substitute when HEAD is not implemented on server
-void DAVResourceAccess::GET0(
- DAVRequestHeaders &rRequestHeaders,
- const std::vector< OUString > & rHeaderNames,
- DAVResource & rResource,
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- initialize();
-
- int errorCount = 0;
- bool bRetry;
- do
- {
- bRetry = false;
- try
- {
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_GET,
- rRequestHeaders );
-
- m_xSession->GET0( getRequestURI(),
- rHeaderNames,
- rResource,
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl(
- xEnv, m_aURL ),
- DAVRequestHeaders(rRequestHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-}
-
-
-void DAVResourceAccess::GET(
- uno::Reference< io::XOutputStream > & rStream,
- const std::vector< OUString > & rHeaderNames,
- DAVResource & rResource,
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- initialize();
-
- bool bRetry;
- int errorCount = 0;
- do
- {
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_GET,
- aHeaders );
-
- m_xSession->GET( getRequestURI(),
- rStream,
- rHeaderNames,
- rResource,
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl( xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-}
-
-
-void DAVResourceAccess::abort()
-{
- initialize();
- m_xSession->abort();
-}
-
-
-namespace {
-
- /// @throws DAVException
- void resetInputStream( const uno::Reference< io::XInputStream > & rStream )
- {
- try
- {
- uno::Reference< io::XSeekable > xSeekable(
- rStream, uno::UNO_QUERY );
- if ( xSeekable.is() )
- {
- xSeekable->seek( 0 );
- return;
- }
- }
- catch ( lang::IllegalArgumentException const & )
- {
- }
- catch ( io::IOException const & )
- {
- }
-
- throw DAVException( DAVException::DAV_INVALID_ARG );
- }
-
-} // namespace
-
-
-void DAVResourceAccess::PUT(
- const uno::Reference< io::XInputStream > & rStream,
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- initialize();
-
- // Make stream seekable, if it not. Needed, if request must be retried.
- uno::Reference< io::XInputStream > xSeekableStream
- = comphelper::OSeekableInputWrapper::CheckSeekableCanWrap(
- rStream, m_xContext );
-
- int errorCount = 0;
- bool bRetry = false;
- do
- {
- if ( bRetry )
- resetInputStream( xSeekableStream );
-
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_PUT,
- aHeaders );
-
- m_xSession->PUT( getRequestURI(),
- xSeekableStream,
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl( xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-}
-
-
-uno::Reference< io::XInputStream > DAVResourceAccess::POST(
- const OUString & rContentType,
- const OUString & rReferer,
- const uno::Reference< io::XInputStream > & rInputStream,
- const uno::Reference< ucb::XCommandEnvironment >& xEnv )
-{
- initialize();
-
- // Make stream seekable, if it not. Needed, if request must be retried.
- uno::Reference< io::XInputStream > xSeekableStream
- = comphelper::OSeekableInputWrapper::CheckSeekableCanWrap(
- rInputStream, m_xContext );
-
- uno::Reference< io::XInputStream > xStream;
- int errorCount = 0;
- bool bRetry = false;
- do
- {
- if ( bRetry )
- {
- resetInputStream( xSeekableStream );
- bRetry = false;
- }
-
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_POST,
- aHeaders );
-
- xStream = m_xSession->POST( getRequestURI(),
- rContentType,
- rReferer,
- xSeekableStream,
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl(
- xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
-
- if ( e.getError() == DAVException::DAV_HTTP_REDIRECT )
- {
- // #i74980# - Upon POST redirect, do a GET.
- return GET( xEnv );
- }
- }
- }
- while ( bRetry );
-
- return xStream;
-}
-
-
-void DAVResourceAccess::POST(
- const OUString & rContentType,
- const OUString & rReferer,
- const uno::Reference< io::XInputStream > & rInputStream,
- uno::Reference< io::XOutputStream > & rOutputStream,
- const uno::Reference< ucb::XCommandEnvironment >& xEnv )
-{
- initialize();
-
- // Make stream seekable, if it not. Needed, if request must be retried.
- uno::Reference< io::XInputStream > xSeekableStream
- = comphelper::OSeekableInputWrapper::CheckSeekableCanWrap(
- rInputStream, m_xContext );
-
- int errorCount = 0;
- bool bRetry = false;
- do
- {
- if ( bRetry )
- {
- resetInputStream( xSeekableStream );
- bRetry = false;
- }
-
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_POST,
- aHeaders );
-
- m_xSession->POST( getRequestURI(),
- rContentType,
- rReferer,
- xSeekableStream,
- rOutputStream,
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl( xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
-
- if ( e.getError() == DAVException::DAV_HTTP_REDIRECT )
- {
- // #i74980# - Upon POST redirect, do a GET.
- GET( rOutputStream, xEnv );
- return;
- }
- }
- }
- while ( bRetry );
-}
-
-
-void DAVResourceAccess::MKCOL(
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- initialize();
-
- int errorCount = 0;
- bool bRetry;
- do
- {
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_MKCOL,
- aHeaders );
-
- m_xSession->MKCOL( getRequestURI(),
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl( xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-}
-
-
-void DAVResourceAccess::COPY(
- const OUString & rSourcePath,
- const OUString & rDestinationURI,
- bool bOverwrite,
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- initialize();
-
- int errorCount = 0;
- bool bRetry;
- do
- {
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_COPY,
- aHeaders );
-
- m_xSession->COPY( rSourcePath,
- rDestinationURI,
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl( xEnv, m_aURL ),
- std::move(aHeaders), xEnv ),
- bOverwrite );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-}
-
-
-void DAVResourceAccess::MOVE(
- const OUString & rSourcePath,
- const OUString & rDestinationURI,
- bool bOverwrite,
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- initialize();
-
- int errorCount = 0;
- bool bRetry;
- do
- {
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_MOVE,
- aHeaders );
-
- m_xSession->MOVE( rSourcePath,
- rDestinationURI,
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl( xEnv, m_aURL ),
- std::move(aHeaders), xEnv ),
- bOverwrite );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-}
-
-
-void DAVResourceAccess::DESTROY(
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- initialize();
-
- int errorCount = 0;
- bool bRetry;
- do
- {
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_DELETE,
- aHeaders );
-
- m_xSession->DESTROY( getRequestURI(),
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl( xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-}
-
-
-// set new lock.
-void DAVResourceAccess::LOCK(
- ucb::Lock & inLock,
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- initialize();
-
- int errorCount = 0;
- bool bRetry;
- do
- {
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_LOCK,
- aHeaders );
-
- m_xSession->LOCK( getRequestURI(),
- inLock,
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl( xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-}
-
-void DAVResourceAccess::UNLOCK(
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- initialize();
-
- int errorCount = 0;
- bool bRetry;
- do
- {
- bRetry = false;
- try
- {
- DAVRequestHeaders aHeaders;
- getUserRequestHeaders( xEnv,
- getRequestURI(),
- ucb::WebDAVHTTPMethod_UNLOCK,
- aHeaders );
-
- m_xSession->UNLOCK( getRequestURI(),
- DAVRequestEnvironment(
- getRequestURI(),
- new DAVAuthListener_Impl( xEnv, m_aURL ),
- std::move(aHeaders), xEnv ) );
- }
- catch ( const DAVException & e )
- {
- errorCount++;
- bRetry = handleException( e, errorCount );
- if ( !bRetry )
- throw;
- }
- }
- while ( bRetry );
-}
-
-
-void DAVResourceAccess::setFlags( const uno::Sequence< beans::NamedValue >& rFlags )
-{
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_aFlags = rFlags;
-}
-
-
-void DAVResourceAccess::setURL( const OUString & rNewURL )
-{
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_aURL = rNewURL;
- m_aPath.clear(); // Next initialize() will create new session.
-}
-
-
-// init dav session and path
-void DAVResourceAccess::initialize()
-{
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- if ( !m_aPath.isEmpty() )
- return;
-
- NeonUri aURI( m_aURL );
- const OUString& aPath( aURI.GetPath() );
-
- /* #134089# - Check URI */
- if ( aPath.isEmpty() )
- throw DAVException( DAVException::DAV_INVALID_ARG );
-
- /* #134089# - Check URI */
- if ( aURI.GetHost().isEmpty() )
- throw DAVException( DAVException::DAV_INVALID_ARG );
-
- if ( !m_xSession.is() || !m_xSession->CanUse( m_aURL, m_aFlags ) )
- {
- m_xSession.clear();
-
- // create new webdav session
- m_xSession
- = m_xSessionFactory->createDAVSession( m_aURL, m_aFlags, m_xContext );
-
- if ( !m_xSession.is() )
- return;
- }
-
- // Own URI is needed to redirect cycle detection.
- m_aRedirectURIs.push_back( aURI );
-
- // Success.
- m_aPath = aPath;
-
- // Not only the path has to be encoded
- m_aURL = aURI.GetURI();
-}
-
-
-const OUString & DAVResourceAccess::getRequestURI() const
-{
- assert( m_xSession.is() && "DAVResourceAccess::getRequestURI - Not initialized!" );
-
- // In case a proxy is used we have to use the absolute URI for a request.
- if ( m_xSession->UsesProxy() )
- return m_aURL;
-
- return m_aPath;
-}
-
-
-// static
-void DAVResourceAccess::getUserRequestHeaders(
- const uno::Reference< ucb::XCommandEnvironment > & xEnv,
- const OUString & rURI,
- ucb::WebDAVHTTPMethod eMethod,
- DAVRequestHeaders & rRequestHeaders )
-{
- if ( xEnv.is() )
- {
- uno::Reference< ucb::XWebDAVCommandEnvironment > xDAVEnv(
- xEnv, uno::UNO_QUERY );
-
- if ( xDAVEnv.is() )
- {
- const uno::Sequence< beans::StringPair > aRequestHeaders
- = xDAVEnv->getUserRequestHeaders( rURI, eMethod );
-
- for ( const auto& rRequestHeader : aRequestHeaders )
- {
- rRequestHeaders.emplace_back(
- rRequestHeader.First,
- rRequestHeader.Second );
- }
- }
- }
-
- // Make sure a User-Agent header is always included, as at least
- // en.wikipedia.org:80 forces back 403 "Scripts should use an informative
- // User-Agent string with contact information, or they may be IP-blocked
- // without notice" otherwise:
- if ( std::any_of(rRequestHeaders.begin(), rRequestHeaders.end(),
- [](const DAVRequestHeader& rHeader) { return rHeader.first.equalsIgnoreAsciiCase( "User-Agent" ); }) )
- {
- return;
- }
- rRequestHeaders.emplace_back( "User-Agent", "LibreOffice" );
-}
-
-// This function member implements the control on cyclical redirections
-bool DAVResourceAccess::detectRedirectCycle(
- const OUString& rRedirectURL )
-{
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
-
- NeonUri aUri( rRedirectURL );
-
- // Check for maximum number of redirections
- // according to <https://tools.ietf.org/html/rfc7231#section-6.4>.
- // A practical limit may be 5, due to earlier specifications:
- // <https://tools.ietf.org/html/rfc2068#section-10.3>
- // it can be raised keeping in mind the added net activity.
- if( static_cast< size_t >( g_nRedirectLimit ) <= m_aRedirectURIs.size() )
- return true;
-
- // try to detect a cyclical redirection
- return std::any_of(m_aRedirectURIs.begin(), m_aRedirectURIs.end(),
- [&aUri](const NeonUri& rUri) {
- // if equal, cyclical redirection detected
- return aUri == rUri; });
-}
-
-
-void DAVResourceAccess::resetUri()
-{
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- if ( !m_aRedirectURIs.empty() )
- {
- std::vector< NeonUri >::const_iterator it = m_aRedirectURIs.begin();
-
- NeonUri aUri( *it );
- m_aRedirectURIs.clear();
- setURL ( aUri.GetURI() );
- initialize();
- }
-}
-
-
-bool DAVResourceAccess::handleException( const DAVException & e, int errorCount )
-{
- switch ( e.getError() )
- {
- case DAVException::DAV_HTTP_REDIRECT:
- if ( !detectRedirectCycle( e.getData() ) )
- {
- // set new URL and path.
- setURL( e.getData() );
- initialize();
- return true;
- }
- return false;
- // #67048# copy & paste images doesn't display. This bug refers
- // to an old OOo problem about getting resources from sites with a bad connection.
- // If we have a bad connection try again. Up to three times.
- case DAVException::DAV_HTTP_ERROR:
- // retry up to three times, if not a client-side error (4xx error codes)
- if ( e.getStatus() < SC_BAD_REQUEST && errorCount < 3 )
- return true;
- // check the server side errors
- switch( e.getStatus() )
- {
- // the HTTP server side response status codes that can be retried
- case SC_BAD_GATEWAY: // retry, can be an excessive load
- case SC_GATEWAY_TIMEOUT: // retry, may be we get lucky
- case SC_SERVICE_UNAVAILABLE: // retry, the service may become available
- case SC_INSUFFICIENT_STORAGE: // space may be freed, retry
- {
- return errorCount < 3;
- }
- break;
- // all the other HTTP server response status codes are NOT retry
- default:
- return false;
- }
- break;
- // if connection has said retry then retry!
- case DAVException::DAV_HTTP_RETRY:
- return true;
- default:
- return false; // Abort
- }
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/DAVResourceAccess.hxx b/ucb/source/ucp/webdav-neon/DAVResourceAccess.hxx
deleted file mode 100644
index 03eeb879696b..000000000000
--- a/ucb/source/ucp/webdav-neon/DAVResourceAccess.hxx
+++ /dev/null
@@ -1,231 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <vector>
-#include <rtl/ustring.hxx>
-#include <rtl/ref.hxx>
-#include <osl/mutex.hxx>
-#include <com/sun/star/io/XInputStream.hpp>
-#include <com/sun/star/io/XOutputStream.hpp>
-#include <com/sun/star/beans/NamedValue.hpp>
-#include <com/sun/star/ucb/Lock.hpp>
-#include <com/sun/star/ucb/WebDAVHTTPMethod.hpp>
-#include <com/sun/star/ucb/XCommandEnvironment.hpp>
-#include "DAVAuthListener.hxx"
-#include "DAVException.hxx"
-#include "DAVSession.hxx"
-#include "DAVResource.hxx"
-#include "DAVTypes.hxx"
-#include "NeonUri.hxx"
-
-namespace webdav_ucp
-{
-
-class DAVSessionFactory;
-
-class DAVResourceAccess
-{
- osl::Mutex m_aMutex;
- OUString m_aURL;
- OUString m_aPath;
- css::uno::Sequence< css::beans::NamedValue > m_aFlags;
- rtl::Reference< DAVSession > m_xSession;
- rtl::Reference< DAVSessionFactory > m_xSessionFactory;
- css::uno::Reference< css::uno::XComponentContext > m_xContext;
- std::vector< NeonUri > m_aRedirectURIs;
-
-public:
- DAVResourceAccess( const css::uno::Reference< css::uno::XComponentContext > & rxContext,
- rtl::Reference< DAVSessionFactory > const & rSessionFactory,
- const OUString & rURL );
- DAVResourceAccess( const DAVResourceAccess & rOther );
-
- DAVResourceAccess & operator=( const DAVResourceAccess & rOther );
-
- /// @throws DAVException
- void setFlags( const css::uno::Sequence< css::beans::NamedValue >& rFlags );
-
- /// @throws DAVException
- void setURL( const OUString & rNewURL );
-
- void resetUri();
-
- const OUString & getURL() const { return m_aURL; }
-
- const rtl::Reference< DAVSessionFactory >& getSessionFactory() const
- { return m_xSessionFactory; }
-
- // DAV methods
-
- /// @throws DAVException
- void
- OPTIONS( DAVOptions & rOptions,
- const css::uno::Reference<
- css::ucb::XCommandEnvironment > & xEnv );
-
- // allprop & named
- /// @throws DAVException
- void
- PROPFIND( const Depth nDepth,
- const std::vector< OUString > & rPropertyNames,
- std::vector< DAVResource > & rResources,
- const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- // propnames
- /// @throws DAVException
- void
- PROPFIND( const Depth nDepth,
- std::vector< DAVResourceInfo > & rResInfo,
- const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- /// @throws DAVException
- void
- PROPPATCH( const std::vector< ProppatchValue > & rValues,
- const css::uno::Reference< css::ucb::XCommandEnvironment >& xEnv );
-
- /// @throws DAVException
- void
- HEAD( const std::vector< OUString > & rHeaderNames, // empty == 'all'
- DAVResource & rResource,
- const css::uno::Reference< css::ucb::XCommandEnvironment >& xEnv );
-
- /// @throws DAVException
- css::uno::Reference< css::io::XInputStream >
- GET( const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- /// @throws DAVException
- void
- GET( css::uno::Reference< css::io::XOutputStream > & rStream,
- const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- /// @throws css::uno::RuntimeException
- /// @throws DAVException
- css::uno::Reference< css::io::XInputStream >
- GET( const std::vector< OUString > & rHeaderNames, // empty == 'all'
- DAVResource & rResource,
- const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- // used as HEAD substitute when HEAD is not implemented on server
- /// @throws DAVException
- void
- GET0( DAVRequestHeaders & rRequestHeaders,
- const std::vector< OUString > & rHeaderNames, // empty == 'all'
- DAVResource & rResource,
- const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- /// @throws DAVException
- void
- GET( css::uno::Reference< css::io::XOutputStream > & rStream,
- const std::vector< OUString > & rHeaderNames, // empty == 'all'
- DAVResource & rResource,
- const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- /// @throws css::uno::RuntimeException
- /// @throws DAVException
- void
- PUT( const css::uno::Reference< css::io::XInputStream > & rStream,
- const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- /// @throws css::uno::RuntimeException
- /// @throws DAVException
- css::uno::Reference< css::io::XInputStream >
- POST( const OUString & rContentType,
- const OUString & rReferer,
- const css::uno::Reference< css::io::XInputStream > & rInputStream,
- const css::uno::Reference< css::ucb::XCommandEnvironment >& xEnv );
-
- /// @throws css::uno::RuntimeException
- /// @throws DAVException
- void
- POST( const OUString & rContentType,
- const OUString & rReferer,
- const css::uno::Reference< css::io::XInputStream > & rInputStream,
- css::uno::Reference< css::io::XOutputStream > & rOutputStream,
- const css::uno::Reference< css::ucb::XCommandEnvironment >& xEnv );
-
- /// @throws DAVException
- void
- MKCOL( const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- /// @throws DAVException
- void
- COPY( const OUString & rSourcePath,
- const OUString & rDestinationURI,
- bool bOverwrite,
- const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- /// @throws DAVException
- void
- MOVE( const OUString & rSourcePath,
- const OUString & rDestinationURI,
- bool bOverwrite,
- const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- /// @throws DAVException
- void
- DESTROY( const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- // set new lock.
- /// @throws DAVException
- void
- LOCK( css::ucb::Lock & inLock,
- const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- /// @throws DAVException
- void
- UNLOCK( const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- /// @throws DAVException
- void
- abort();
-
- // helper
- static void
- getUserRequestHeaders(
- const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv,
- const OUString & rURI,
- css::ucb::WebDAVHTTPMethod eMethod,
- DAVRequestHeaders & rRequestHeaders );
-
- /// @throws DAVException
- bool handleException( const DAVException & e, int errorCount );
-
-private:
- const OUString & getRequestURI() const;
- /// @throws DAVException
- bool detectRedirectCycle( const OUString& rRedirectURL );
- /// @throws DAVException
- void initialize();
-};
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/DAVSession.hxx b/ucb/source/ucp/webdav-neon/DAVSession.hxx
deleted file mode 100644
index f61bbdb6ad90..000000000000
--- a/ucb/source/ucp/webdav-neon/DAVSession.hxx
+++ /dev/null
@@ -1,213 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <memory>
-#include <rtl/ustring.hxx>
-#include <com/sun/star/io/XInputStream.hpp>
-#include <com/sun/star/io/XOutputStream.hpp>
-#include "DAVProperties.hxx"
-#include "DAVResource.hxx"
-#include "DAVSessionFactory.hxx"
-#include "DAVTypes.hxx"
-#include "DAVRequestEnvironment.hxx"
-
-namespace com::sun::star::beans {
- struct NamedValue;
-}
-
-namespace com::sun::star::ucb {
- struct Lock;
-}
-
-namespace webdav_ucp
-{
-
-class DAVSession
-{
-public:
- void acquire()
- {
- osl_atomic_increment( &m_nRefCount );
- }
-
- void release()
- {
- if ( osl_atomic_decrement( &m_nRefCount ) == 0 )
- {
- m_xFactory->releaseElement( this );
- delete this;
- }
- }
-
- virtual bool CanUse( const OUString & inPath,
- const css::uno::Sequence< css::beans::NamedValue >& rFlags ) = 0;
-
- virtual bool UsesProxy() = 0;
-
- // DAV methods
-
- /// @throws std::exception
- virtual void OPTIONS( const OUString & inPath,
- DAVOptions& rOptions,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- // allprop & named
- /// @throws std::exception
- virtual void PROPFIND( const OUString & inPath,
- const Depth inDepth,
- const std::vector< OUString > & inPropertyNames,
- std::vector< DAVResource > & ioResources,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- // propnames
- /// @throws std::exception
- virtual void PROPFIND( const OUString & inPath,
- const Depth inDepth,
- std::vector< DAVResourceInfo > & ioResInfo,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- /// @throws std::exception
- virtual void PROPPATCH( const OUString & inPath,
- const std::vector< ProppatchValue > & inValues,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- /// @throws std::exception
- virtual void HEAD( const OUString & inPath,
- const std::vector< OUString > & inHeaderNames,
- DAVResource & ioResource,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- /// @throws std::exception
- virtual css::uno::Reference< css::io::XInputStream >
- GET( const OUString & inPath,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- /// @throws std::exception
- virtual void GET( const OUString & inPath,
- css::uno::Reference< css::io::XOutputStream >& o,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- /// @throws std::exception
- virtual css::uno::Reference< css::io::XInputStream >
- GET( const OUString & inPath,
- const std::vector< OUString > & inHeaderNames,
- DAVResource & ioResource,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- // used as HEAD substitute when HEAD is not implemented on server
- /// @throws std::exception
- virtual void
- GET0( const OUString & inPath,
- const std::vector< OUString > & inHeaderNames,
- DAVResource & ioResource,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- /// @throws std::exception
- virtual void
- GET( const OUString & inPath,
- css::uno::Reference< css::io::XOutputStream >& o,
- const std::vector< OUString > & inHeaderNames,
- DAVResource & ioResource,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- /// @throws std::exception
- virtual void PUT( const OUString & inPath,
- const css::uno::Reference< css::io::XInputStream >& s,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- /// @throws std::exception
- virtual css::uno::Reference< css::io::XInputStream >
- POST( const OUString & inPath,
- const OUString & rContentType,
- const OUString & rReferer,
- const css::uno::Reference< css::io::XInputStream > & inInputStream,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- /// @throws std::exception
- virtual void POST( const OUString & inPath,
- const OUString & rContentType,
- const OUString & rReferer,
- const css::uno::Reference< css::io::XInputStream > & inInputStream,
- css::uno::Reference< css::io::XOutputStream > & oOutputStream,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- /// @throws std::exception
- virtual void MKCOL( const OUString & inPath,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- /// @throws std::exception
- virtual void COPY( const OUString & inSource,
- const OUString & inDestination,
- const DAVRequestEnvironment & rEnv,
- bool inOverwrite ) = 0;
-
- /// @throws std::exception
- virtual void MOVE( const OUString & inSource,
- const OUString & inDestination,
- const DAVRequestEnvironment & rEnv,
- bool inOverwrite ) = 0;
-
- /// @throws std::exception
- virtual void DESTROY( const OUString & inPath,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- // set new lock.
- /// @throws std::exception
- virtual void LOCK( const OUString & inPath,
- css::ucb::Lock & inLock,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- /// @throws std::exception
- virtual void UNLOCK( const OUString & inPath,
- const DAVRequestEnvironment & rEnv ) = 0;
-
- /// @throws std::exception
- virtual void abort() = 0;
-
-protected:
- rtl::Reference< DAVSessionFactory > m_xFactory;
-
- explicit DAVSession( rtl::Reference< DAVSessionFactory > const & rFactory )
- : m_xFactory( rFactory ), m_nRefCount( 0 ) {}
-
- virtual ~DAVSession() {}
-
-private:
- DAVSessionFactory::Map::iterator m_aContainerIt;
- oslInterlockedCount m_nRefCount;
-
- friend class DAVSessionFactory;
- friend struct std::default_delete< DAVSession >;
-};
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/DAVSessionFactory.cxx b/ucb/source/ucp/webdav-neon/DAVSessionFactory.cxx
deleted file mode 100644
index d58171bdef6e..000000000000
--- a/ucb/source/ucp/webdav-neon/DAVSessionFactory.cxx
+++ /dev/null
@@ -1,99 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include <memory>
-#include "DAVSessionFactory.hxx"
-#include "NeonSession.hxx"
-#include "NeonUri.hxx"
-#include <osl/diagnose.h>
-
-using namespace webdav_ucp;
-using namespace com::sun::star;
-
-DAVSessionFactory::~DAVSessionFactory()
-{
-}
-
-rtl::Reference< DAVSession > DAVSessionFactory::createDAVSession(
- const OUString & inUri,
- const uno::Sequence< beans::NamedValue >& rFlags,
- const uno::Reference< uno::XComponentContext > & rxContext )
-{
- std::scoped_lock aGuard( m_aMutex );
-
- m_xContext = rxContext;
-
- if (!m_xProxyDecider)
- m_xProxyDecider.reset( new ucbhelper::InternetProxyDecider( rxContext ) );
-
- Map::iterator aIt = std::find_if(m_aMap.begin(), m_aMap.end(),
- [&inUri, &rFlags](const Map::value_type& rEntry) { return rEntry.second->CanUse( inUri, rFlags ); });
-
- if ( aIt == m_aMap.end() )
- {
- NeonUri aURI( inUri );
-
- std::unique_ptr<DAVSession> xElement(
- new NeonSession(this, inUri, rFlags, *m_xProxyDecider));
-
- aIt = m_aMap.emplace( inUri, xElement.get() ).first;
- aIt->second->m_aContainerIt = aIt;
- xElement.release();
- return aIt->second;
- }
- else if ( osl_atomic_increment( &aIt->second->m_nRefCount ) > 1 )
- {
- rtl::Reference< DAVSession > xElement( aIt->second );
- osl_atomic_decrement( &aIt->second->m_nRefCount );
- return xElement;
- }
- else
- {
- osl_atomic_decrement( &aIt->second->m_nRefCount );
- aIt->second->m_aContainerIt = m_aMap.end();
-
- // If URL scheme is different from http or https we definitely
- // have to use a proxy and therefore can optimize the getProxy
- // call a little:
- NeonUri aURI( inUri );
-
- aIt->second = new NeonSession(this, inUri, rFlags, *m_xProxyDecider);
- aIt->second->m_aContainerIt = aIt;
- return aIt->second;
- }
-}
-
-void DAVSessionFactory::releaseElement( DAVSession const * pElement )
-{
- OSL_ASSERT( pElement );
- std::scoped_lock aGuard( m_aMutex );
- if ( pElement->m_aContainerIt != m_aMap.end() )
- m_aMap.erase( pElement->m_aContainerIt );
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/DAVSessionFactory.hxx b/ucb/source/ucp/webdav-neon/DAVSessionFactory.hxx
deleted file mode 100644
index fd185d11ae8a..000000000000
--- a/ucb/source/ucp/webdav-neon/DAVSessionFactory.hxx
+++ /dev/null
@@ -1,85 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-#pragma once
-
-#ifdef min
-#undef min // GNU libstdc++ <memory> includes <limit> which defines methods called min...
-#endif
-#include <config_lgpl.h>
-#include <map>
-#include <memory>
-#include <mutex>
-#include <salhelper/simplereferenceobject.hxx>
-#include <rtl/ref.hxx>
-#include <com/sun/star/uno/Reference.hxx>
-#include <ucbhelper/proxydecider.hxx>
-
-using namespace com::sun::star;
-
-namespace com::sun::star::beans {
- struct NamedValue;
-}
-
-namespace com::sun::star::lang {
- class XMultiServiceFactory;
-}
-
-namespace webdav_ucp
-{
-
-class DAVSession;
-
-class DAVSessionFactory : public salhelper::SimpleReferenceObject
-{
-public:
- virtual ~DAVSessionFactory() override;
-
- /// @throws DAVException
- rtl::Reference< DAVSession >
- createDAVSession( const OUString & inUri,
- const ::uno::Sequence< css::beans::NamedValue >& rFlags,
- const ::uno::Reference< ::uno::XComponentContext >& rxContext );
-
- const ::uno::Reference< ::uno::XComponentContext >& getComponentContext() const { return m_xContext; }
-private:
- typedef std::map< OUString, DAVSession * > Map;
-
- Map m_aMap;
- std::mutex m_aMutex;
- std::unique_ptr< ucbhelper::InternetProxyDecider > m_xProxyDecider;
-
- ::uno::Reference< ::uno::XComponentContext > m_xContext;
-
- void releaseElement( DAVSession const * pElement );
-
- friend class DAVSession;
-};
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/DAVTypes.cxx b/ucb/source/ucp/webdav-neon/DAVTypes.cxx
deleted file mode 100644
index e39f5b2cf946..000000000000
--- a/ucb/source/ucp/webdav-neon/DAVTypes.cxx
+++ /dev/null
@@ -1,189 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-
-#include <osl/time.h>
-
-#include "DAVTypes.hxx"
-#include "../inc/urihelper.hxx"
-#include "NeonUri.hxx"
-
-using namespace webdav_ucp;
-using namespace com::sun::star;
-
-// DAVOptions implementation
-
-DAVOptions::DAVOptions() :
- m_isClass1( false ),
- m_isClass2( false ),
- m_isClass3( false ),
- m_isHeadAllowed( true ),
- m_isLocked( false ),
- m_nStaleTime( 0 ),
- m_nRequestedTimeLife( 0 ),
- m_nHttpResponseStatusCode( 0 )
-{
-}
-
-DAVOptions::DAVOptions( const DAVOptions & rOther ) :
- m_isClass1( rOther.m_isClass1 ),
- m_isClass2( rOther.m_isClass2 ),
- m_isClass3( rOther.m_isClass3 ),
- m_isHeadAllowed( rOther.m_isHeadAllowed ),
- m_isLocked( rOther.m_isLocked ),
- m_aAllowedMethods( rOther.m_aAllowedMethods ),
- m_nStaleTime( rOther.m_nStaleTime ),
- m_nRequestedTimeLife( rOther.m_nRequestedTimeLife ),
- m_sURL( rOther.m_sURL ),
- m_sRedirectedURL( rOther.m_sRedirectedURL),
- m_nHttpResponseStatusCode( rOther.m_nHttpResponseStatusCode ),
- m_sHttpResponseStatusText( rOther.m_sHttpResponseStatusText )
-{
-}
-
-DAVOptions::~DAVOptions()
-{
-}
-
-DAVOptions & DAVOptions::operator=( const DAVOptions& rOpts )
-{
- m_isClass1 = rOpts.m_isClass1;
- m_isClass2 = rOpts.m_isClass2;
- m_isClass3 = rOpts.m_isClass3;
- m_isLocked = rOpts.m_isLocked;
- m_isHeadAllowed = rOpts.m_isHeadAllowed;
- m_aAllowedMethods = rOpts.m_aAllowedMethods;
- m_nStaleTime = rOpts.m_nStaleTime;
- m_nRequestedTimeLife = rOpts.m_nRequestedTimeLife;
- m_sURL = rOpts.m_sURL;
- m_sRedirectedURL = rOpts.m_sRedirectedURL;
- m_nHttpResponseStatusCode = rOpts.m_nHttpResponseStatusCode;
- m_sHttpResponseStatusText = rOpts.m_sHttpResponseStatusText;
- return *this;
-}
-
-bool DAVOptions::operator==( const DAVOptions& rOpts ) const
-{
- return
- m_isClass1 == rOpts.m_isClass1 &&
- m_isClass2 == rOpts.m_isClass2 &&
- m_isClass3 == rOpts.m_isClass3 &&
- m_isLocked == rOpts.m_isLocked &&
- m_isHeadAllowed == rOpts.m_isHeadAllowed &&
- m_aAllowedMethods == rOpts.m_aAllowedMethods &&
- m_nStaleTime == rOpts.m_nStaleTime &&
- m_nRequestedTimeLife == rOpts.m_nRequestedTimeLife &&
- m_sURL == rOpts.m_sURL &&
- m_sRedirectedURL == rOpts.m_sRedirectedURL &&
- m_nHttpResponseStatusCode == rOpts.m_nHttpResponseStatusCode &&
- m_sHttpResponseStatusText == rOpts.m_sHttpResponseStatusText;
-}
-
-
-// DAVOptionsCache implementation
-
-DAVOptionsCache::DAVOptionsCache()
-{
-}
-
-DAVOptionsCache::~DAVOptionsCache()
-{
-}
-
-bool DAVOptionsCache::getDAVOptions( const OUString & rURL, DAVOptions & rDAVOptions )
-{
- osl::MutexGuard aGuard( m_aMutex );
- OUString aEncodedUrl( ucb_impl::urihelper::encodeURI( NeonUri::unescape( rURL ) ) );
- normalizeURLLastChar( aEncodedUrl );
-
- // search the URL in the static map
- DAVOptionsMap::iterator it = m_aTheCache.find( aEncodedUrl );
- if ( it == m_aTheCache.end() )
- return false;
- else
- {
- // check if the capabilities are stale, before restoring
- TimeValue t1;
- osl_getSystemTime( &t1 );
- if ( (*it).second.getStaleTime() < t1.Seconds )
- {
- // if stale, remove from cache, do not restore
- m_aTheCache.erase( it );
- return false;
- // return false instead
- }
- rDAVOptions = (*it).second;
- return true;
- }
-}
-
-void DAVOptionsCache::removeDAVOptions( const OUString & rURL )
-{
- osl::MutexGuard aGuard( m_aMutex );
- OUString aEncodedUrl( ucb_impl::urihelper::encodeURI( NeonUri::unescape( rURL ) ) );
- normalizeURLLastChar( aEncodedUrl );
-
- DAVOptionsMap::iterator it = m_aTheCache.find( aEncodedUrl );
- if ( it != m_aTheCache.end() )
- {
- m_aTheCache.erase( it );
- }
-}
-
-void DAVOptionsCache::addDAVOptions( DAVOptions & rDAVOptions, const sal_uInt32 nLifeTime )
-{
- osl::MutexGuard aGuard( m_aMutex );
- OUString aURL( rDAVOptions.getURL() );
-
- OUString aEncodedUrl( ucb_impl::urihelper::encodeURI( NeonUri::unescape( aURL ) ) );
- normalizeURLLastChar( aEncodedUrl );
- rDAVOptions.setURL( aEncodedUrl );
-
-// unchanged, it may be used to access a server
- OUString aRedirURL( rDAVOptions.getRedirectedURL() );
- rDAVOptions.setRedirectedURL( aRedirURL );
-
- // check if already cached
- DAVOptionsMap::iterator it = m_aTheCache.find( aEncodedUrl );
- if ( it != m_aTheCache.end() )
- { // already in cache, check LifeTime
- if ( (*it).second.getRequestedTimeLife() == nLifeTime )
- return; // same lifetime, do nothing
- }
- // not in cache, add it
- TimeValue t1;
- osl_getSystemTime( &t1 );
- rDAVOptions.setStaleTime( t1.Seconds + nLifeTime );
-
- m_aTheCache[ aEncodedUrl ] = rDAVOptions;
-}
-
-void DAVOptionsCache::setHeadAllowed( const OUString & rURL, const bool HeadAllowed )
-{
- osl::MutexGuard aGuard( m_aMutex );
- OUString aEncodedUrl( ucb_impl::urihelper::encodeURI( NeonUri::unescape( rURL ) ) );
- normalizeURLLastChar( aEncodedUrl );
-
- DAVOptionsMap::iterator it = m_aTheCache.find( aEncodedUrl );
- if ( it == m_aTheCache.end() )
- return;
-
- // first check for stale
- TimeValue t1;
- osl_getSystemTime( &t1 );
- if( (*it).second.getStaleTime() < t1.Seconds )
- {
- m_aTheCache.erase( it );
- return;
- }
- // check if the resource was present on server
- (*it).second.setHeadAllowed( HeadAllowed );
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/ucb/source/ucp/webdav-neon/DAVTypes.hxx b/ucb/source/ucp/webdav-neon/DAVTypes.hxx
deleted file mode 100644
index ceee3dbee0b6..000000000000
--- a/ucb/source/ucp/webdav-neon/DAVTypes.hxx
+++ /dev/null
@@ -1,208 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <map>
-#include <osl/mutex.hxx>
-#include <rtl/ustring.hxx>
-#include <com/sun/star/uno/Any.hxx>
-
-namespace webdav_ucp
-{
-/* Excerpt from RFC 4918
- <https://tools.ietf.org/html/rfc4918#section-18>
-
- 18.1 Class 1
-
- A class 1 compliant resource MUST meet all "MUST" requirements in all
- sections of this document.
-
- Class 1 compliant resources MUST return, at minimum, the value "1" in
- the DAV header on all responses to the OPTIONS method.
-
- 18.2 Class 2
-
- A class 2 compliant resource MUST meet all class 1 requirements and
- support the LOCK method, the DAV:supportedlock property, the DAV:
- lockdiscovery property, the Time-Out response header and the Lock-
- Token request header. A class 2 compliant resource SHOULD also
- support the Timeout request header and the 'owner' XML element.
-
- Class 2 compliant resources MUST return, at minimum, the values "1"
- and "2" in the DAV header on all responses to the OPTIONS method.
-
- 18.3. Class 3
-
- A resource can explicitly advertise its support for the revisions to
- [RFC2518] made in this document. Class 1 MUST be supported as well.
- Class 2 MAY be supported. Advertising class 3 support in addition to
- class 1 and 2 means that the server supports all the requirements in
- this specification. Advertising class 3 and class 1 support, but not
- class 2, means that the server supports all the requirements in this
- specification except possibly those that involve locking support.
-
-*/
-
- class DAVOptions final
- {
- private:
- bool m_isClass1;
- bool m_isClass2;
- bool m_isClass3;
- /// for server that do not implement it
- bool m_isHeadAllowed;
- /// Internally used to maintain the locked state of the resource, only if it's a Class 2 resource
- bool m_isLocked;
- /// contains the methods allowed on this resource
- OUString m_aAllowedMethods;
-
- /// target time when this capability becomes stale
- sal_uInt32 m_nStaleTime;
- sal_uInt32 m_nRequestedTimeLife;
- OUString m_sURL;
- OUString m_sRedirectedURL;
-
- /// The cached HTT response status code. It's 0 if the code was dealt with and there is no need to cache it
- sal_uInt16 m_nHttpResponseStatusCode;
- /// The cached string with the server returned HTTP response status code string, corresponds to m_nHttpResponseStatusCode.
- OUString m_sHttpResponseStatusText;
-
- public:
- DAVOptions();
-
- DAVOptions( const DAVOptions & rOther );
-
- ~DAVOptions();
-
- bool isClass1() const { return m_isClass1; };
- void setClass1( bool Class1 = true ) { m_isClass1 = Class1; };
-
- bool isClass2() const { return m_isClass2; };
- void setClass2( bool Class2 = true ) { m_isClass2 = Class2; };
-
- bool isClass3() const { return m_isClass3; };
- void setClass3( bool Class3 = true ) { m_isClass3 = Class3; };
-
- bool isHeadAllowed() const { return m_isHeadAllowed; };
- void setHeadAllowed( bool HeadAllowed = true ) { m_isHeadAllowed = HeadAllowed; };
-
- sal_uInt32 getStaleTime() const { return m_nStaleTime ; };
- void setStaleTime( const sal_uInt32 nStaleTime ) { m_nStaleTime = nStaleTime; };
-
- sal_uInt32 getRequestedTimeLife() const { return m_nRequestedTimeLife; };
- void setRequestedTimeLife( const sal_uInt32 nRequestedTimeLife ) { m_nRequestedTimeLife = nRequestedTimeLife; };
-
- const OUString & getURL() const { return m_sURL; };
- void setURL( const OUString & sURL ) { m_sURL = sURL; };
-
- const OUString & getRedirectedURL() const { return m_sRedirectedURL; };
- void setRedirectedURL( const OUString & sRedirectedURL ) { m_sRedirectedURL = sRedirectedURL; };
-
- void setAllowedMethods( const OUString & aAllowedMethods ) { m_aAllowedMethods = aAllowedMethods; } ;
- const OUString & getAllowedMethods() const { return m_aAllowedMethods; } ;
- bool isLockAllowed() const { return ( m_aAllowedMethods.indexOf( "LOCK" ) != -1 ); };
-
- void setLocked( bool locked = true ) { m_isLocked = locked; } ;
- bool isLocked() const { return m_isLocked; };
-
- sal_uInt16 getHttpResponseStatusCode() const { return m_nHttpResponseStatusCode; };
- void setHttpResponseStatusCode( const sal_uInt16 nHttpResponseStatusCode ) { m_nHttpResponseStatusCode = nHttpResponseStatusCode; };
-
- const OUString & getHttpResponseStatusText() const { return m_sHttpResponseStatusText; };
- void setHttpResponseStatusText( const OUString & rHttpResponseStatusText ) { m_sHttpResponseStatusText = rHttpResponseStatusText; };
-
- void init() {
- m_isClass1 = false;
- m_isClass2 = false;
- m_isClass3 = false;
- m_isHeadAllowed = true;
- m_isLocked = false;
- m_aAllowedMethods.clear();
- m_nStaleTime = 0;
- m_nRequestedTimeLife = 0;
- m_sURL.clear();
- m_sRedirectedURL.clear();
- m_nHttpResponseStatusCode = 0;
- m_sHttpResponseStatusText.clear();
- };
-
- DAVOptions & operator=( const DAVOptions& rOpts );
- bool operator==( const DAVOptions& rOpts ) const;
-
- };
-
- // TODO: the OUString key element in std::map needs to be changed with a URI representation
- // along with a specific compare (std::less) implementation, as suggested in
- // <https://tools.ietf.org/html/rfc3986#section-6>, to find by URI and not by string comparison
- typedef std::map< OUString, DAVOptions,
- std::less< OUString > > DAVOptionsMap;
-
- class DAVOptionsCache
- {
- DAVOptionsMap m_aTheCache;
- osl::Mutex m_aMutex;
- public:
- explicit DAVOptionsCache();
- ~DAVOptionsCache();
-
- bool getDAVOptions( const OUString & rURL, DAVOptions & rDAVOptions );
- void removeDAVOptions( const OUString & rURL );
- void addDAVOptions( DAVOptions & rDAVOptions, const sal_uInt32 nLifeTime );
-
- void setHeadAllowed( const OUString & rURL, bool HeadAllowed = true );
-
- private:
-
- /// remove the last '/' in aUrl, if it exists
- static void normalizeURLLastChar( OUString& aUrl ) {
- if ( aUrl.getLength() > 1 &&
- ( ( aUrl.lastIndexOf( '/' ) + 1 ) == aUrl.getLength() ) )
- aUrl = aUrl.copy(0, aUrl.getLength() - 1 );
- };
- };
-
- enum Depth { DAVZERO = 0, DAVONE = 1, DAVINFINITY = -1 };
-
- enum ProppatchOperation { PROPSET = 0, PROPREMOVE = 1 };
-
- struct ProppatchValue
- {
- ProppatchOperation operation;
- OUString name;
- css::uno::Any value;
-
- ProppatchValue( const ProppatchOperation o,
- const OUString & n,
- const css::uno::Any & v )
- : operation( o ), name( n ), value( v ) {}
- };
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/DateTimeHelper.cxx b/ucb/source/ucp/webdav-neon/DateTimeHelper.cxx
deleted file mode 100644
index 649838aaaae4..000000000000
--- a/ucb/source/ucp/webdav-neon/DateTimeHelper.cxx
+++ /dev/null
@@ -1,247 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-
-#include <osl/time.h>
-#include <com/sun/star/util/DateTime.hpp>
-#include "DateTimeHelper.hxx"
-
-using namespace com::sun::star::util;
-
-using namespace webdav_ucp;
-
-
-bool DateTimeHelper::ISO8601_To_DateTime (const OUString& s,
- DateTime& dateTime)
-{
- OString aDT (s.getStr(), s.getLength(), RTL_TEXTENCODING_ASCII_US);
-
- int year, month, day, hours, minutes, off_hours, off_minutes, fix;
- double seconds;
-
- // 2001-01-01T12:30:00Z
- int n = sscanf( aDT.getStr(), "%04d-%02d-%02dT%02d:%02d:%lfZ",
- &year, &month, &day, &hours, &minutes, &seconds );
- if ( n == 6 )
- {
- fix = 0;
- }
- else
- {
- // 2001-01-01T12:30:00+03:30
- n = sscanf( aDT.getStr(), "%04d-%02d-%02dT%02d:%02d:%lf+%02d:%02d",
- &year, &month, &day, &hours, &minutes, &seconds,
- &off_hours, &off_minutes );
- if ( n == 8 )
- {
- fix = - off_hours * 3600 - off_minutes * 60;
- }
- else
- {
- // 2001-01-01T12:30:00-03:30
- n = sscanf( aDT.getStr(), "%04d-%02d-%02dT%02d:%02d:%lf-%02d:%02d",
- &year, &month, &day, &hours, &minutes, &seconds,
- &off_hours, &off_minutes );
- if ( n == 8 )
- {
- fix = off_hours * 3600 + off_minutes * 60;
- }
- else
- {
- return false;
- }
- }
- }
-
- // Convert to local time...
-
- oslDateTime aDateTime;
- aDateTime.NanoSeconds = 0;
- aDateTime.Seconds = sal::static_int_cast< sal_uInt16 >(seconds); // 0-59
- aDateTime.Minutes = sal::static_int_cast< sal_uInt16 >(minutes); // 0-59
- aDateTime.Hours = sal::static_int_cast< sal_uInt16 >(hours); // 0-23
- aDateTime.Day = sal::static_int_cast< sal_uInt16 >(day); // 1-31
- aDateTime.DayOfWeek = 0; // 0-6, 0 = Sunday
- aDateTime.Month = sal::static_int_cast< sal_uInt16 >(month); // 1-12
- aDateTime.Year = sal::static_int_cast< sal_Int16 >(year);
-
- TimeValue aTimeValue;
- if ( osl_getTimeValueFromDateTime( &aDateTime, &aTimeValue ) )
- {
- aTimeValue.Seconds += fix;
-
- if ( osl_getLocalTimeFromSystemTime( &aTimeValue, &aTimeValue ) )
- {
- if ( osl_getDateTimeFromTimeValue( &aTimeValue, &aDateTime ) )
- {
- dateTime.Year = aDateTime.Year;
- dateTime.Month = aDateTime.Month;
- dateTime.Day = aDateTime.Day;
- dateTime.Hours = aDateTime.Hours;
- dateTime.Minutes = aDateTime.Minutes;
- dateTime.Seconds = aDateTime.Seconds;
-
- return true;
- }
- }
- }
-
- return false;
-}
-
-sal_Int32 DateTimeHelper::convertMonthToInt (std::u16string_view month)
-{
- if (month == u"Jan")
- return 1;
- else if (month == u"Feb")
- return 2;
- else if (month == u"Mar")
- return 3;
- else if (month == u"Apr")
- return 4;
- else if (month == u"May")
- return 5;
- else if (month == u"Jun")
- return 6;
- else if (month == u"Jul")
- return 7;
- else if (month == u"Aug")
- return 8;
- else if (month == u"Sep")
- return 9;
- else if (month == u"Oct")
- return 10;
- else if (month == u"Nov")
- return 11;
- else if (month == u"Dec")
- return 12;
- else
- return 0;
-}
-
-bool DateTimeHelper::RFC2068_To_DateTime (const OUString& s,
- DateTime& dateTime)
-{
- int year;
- int day;
- int hours;
- int minutes;
- int seconds;
- char string_month[3 + 1];
- char string_day[3 + 1];
-
- sal_Int32 found = s.indexOf (',');
- if (found != -1)
- {
- OString aDT (s.getStr(), s.getLength(), RTL_TEXTENCODING_ASCII_US);
-
- // RFC 1123
- found = sscanf (aDT.getStr(), "%3s, %2d %3s %4d %2d:%2d:%2d GMT",
- string_day, &day, string_month, &year, &hours, &minutes, &seconds);
- if (found != 7)
- {
- // RFC 1036
- found = sscanf (aDT.getStr(), "%3s, %2d-%3s-%2d %2d:%2d:%2d GMT",
- string_day, &day, string_month, &year, &hours, &minutes, &seconds);
- }
- found = (found == 7) ? 1 : 0;
- }
- else
- {
- OString aDT (s.getStr(), s.getLength(), RTL_TEXTENCODING_ASCII_US);
-
- // ANSI C's asctime () format
- found = sscanf (aDT.getStr(), "%3s %3s %d %2d:%2d:%2d %4d",
- string_day, string_month,
- &day, &hours, &minutes, &seconds, &year);
- found = (found == 7) ? 1 : 0;
- }
-
- if (found)
- {
- found = 0;
-
- int month = DateTimeHelper::convertMonthToInt (
- OUString::createFromAscii (string_month));
- if (month)
- {
- // Convert to local time...
-
- oslDateTime aDateTime;
- aDateTime.NanoSeconds = 0;
- aDateTime.Seconds = sal::static_int_cast< sal_uInt16 >(seconds);
- // 0-59
- aDateTime.Minutes = sal::static_int_cast< sal_uInt16 >(minutes);
- // 0-59
- aDateTime.Hours = sal::static_int_cast< sal_uInt16 >(hours);
- // 0-23
- aDateTime.Day = sal::static_int_cast< sal_uInt16 >(day);
- // 1-31
- aDateTime.DayOfWeek = 0; //dayofweek; // 0-6, 0 = Sunday
- aDateTime.Month = sal::static_int_cast< sal_uInt16 >(month);
- // 1-12
- aDateTime.Year = sal::static_int_cast< sal_Int16 >(year);
-
- TimeValue aTimeValue;
- if ( osl_getTimeValueFromDateTime( &aDateTime,
- &aTimeValue ) )
- {
- if ( osl_getLocalTimeFromSystemTime( &aTimeValue,
- &aTimeValue ) )
- {
- if ( osl_getDateTimeFromTimeValue( &aTimeValue,
- &aDateTime ) )
- {
- dateTime.Year = aDateTime.Year;
- dateTime.Month = aDateTime.Month;
- dateTime.Day = aDateTime.Day;
- dateTime.Hours = aDateTime.Hours;
- dateTime.Minutes = aDateTime.Minutes;
- dateTime.Seconds = aDateTime.Seconds;
-
- found = 1;
- }
- }
- }
- }
- }
-
- return found != 0;
-}
-
-bool DateTimeHelper::convert (const OUString& s, DateTime& dateTime)
-{
- if (ISO8601_To_DateTime (s, dateTime))
- return true;
- else if (RFC2068_To_DateTime (s, dateTime))
- return true;
- else
- return false;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/DateTimeHelper.hxx b/ucb/source/ucp/webdav-neon/DateTimeHelper.hxx
deleted file mode 100644
index 6794aa2510a8..000000000000
--- a/ucb/source/ucp/webdav-neon/DateTimeHelper.hxx
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <sal/types.h>
-#include <rtl/ustring.hxx>
-
-namespace com::sun::star::util {
- struct DateTime;
-}
-
-
-namespace webdav_ucp
-{
-
-class DateTimeHelper
-{
-private:
- static sal_Int32 convertMonthToInt (std::u16string_view );
-
- static bool ISO8601_To_DateTime (const OUString&,
- css::util::DateTime& );
-
- static bool RFC2068_To_DateTime (const OUString&,
- css::util::DateTime& );
-
-public:
- static bool convert (const OUString&,
- css::util::DateTime& );
-};
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/LinkSequence.cxx b/ucb/source/ucp/webdav-neon/LinkSequence.cxx
deleted file mode 100644
index 9ff9d877ec30..000000000000
--- a/ucb/source/ucp/webdav-neon/LinkSequence.cxx
+++ /dev/null
@@ -1,214 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include <config_lgpl.h>
-#include <string.h>
-#include <ne_xml.h>
-#include <memory>
-
-#include "LinkSequence.hxx"
-
-using namespace webdav_ucp;
-using namespace com::sun::star;
-
-namespace {
-
-struct LinkSequenceParseContext
-{
- std::unique_ptr<ucb::Link> pLink;
- bool hasSource;
- bool hasDestination;
-
- LinkSequenceParseContext()
- : hasSource( false ), hasDestination( false ) {}
-};
-
-}
-
-#define STATE_TOP (1)
-
-#define STATE_LINK (STATE_TOP)
-#define STATE_DST (STATE_TOP + 1)
-#define STATE_SRC (STATE_TOP + 2)
-
-
-extern "C" {
-
-static int LinkSequence_startelement_callback(
- void *,
- int parent,
- const char * /*nspace*/,
- const char *name,
- const char ** )
-{
- if ( name != nullptr )
- {
- switch ( parent )
- {
- case NE_XML_STATEROOT:
- if ( strcmp( name, "link" ) == 0 )
- return STATE_LINK;
- break;
-
- case STATE_LINK:
- if ( strcmp( name, "dst" ) == 0 )
- return STATE_DST;
- else if ( strcmp( name, "src" ) == 0 )
- return STATE_SRC;
- break;
- }
- }
- return NE_XML_DECLINE;
-}
-
-
-static int LinkSequence_chardata_callback(
- void *userdata,
- int state,
- const char *buf,
- size_t len )
-{
- LinkSequenceParseContext * pCtx
- = static_cast< LinkSequenceParseContext * >( userdata );
- if ( !pCtx->pLink )
- pCtx->pLink.reset( new ucb::Link );
-
- switch ( state )
- {
- case STATE_DST:
- pCtx->pLink->Destination
- = OUString( buf, len, RTL_TEXTENCODING_ASCII_US );
- pCtx->hasDestination = true;
- break;
-
- case STATE_SRC:
- pCtx->pLink->Source
- = OUString( buf, len, RTL_TEXTENCODING_ASCII_US );
- pCtx->hasSource = true;
- break;
- }
- return 0; // zero to continue, non-zero to abort parsing
-}
-
-
-static int LinkSequence_endelement_callback(
- void *userdata,
- int state,
- const char *,
- const char * )
-{
- LinkSequenceParseContext * pCtx
- = static_cast< LinkSequenceParseContext * >( userdata );
- if ( !pCtx->pLink )
- pCtx->pLink.reset( new ucb::Link );
-
- switch ( state )
- {
- case STATE_LINK:
- if ( !pCtx->hasDestination || !pCtx->hasSource )
- return 1; // abort
- break;
- }
- return 0; // zero to continue, non-zero to abort parsing
-}
-
-}
-
-// static
-bool LinkSequence::createFromXML( const OString & rInData,
- uno::Sequence< ucb::Link > & rOutData )
-{
- const sal_Int32 TOKEN_LENGTH = 7; // </link>
- bool success = true;
-
- // rInData may contain multiple <link>...</link> tags.
- sal_Int32 nCount = 0;
- sal_Int32 nStart = 0;
- sal_Int32 nEnd = rInData.indexOf( "</link>" );
- while ( nEnd > -1 )
- {
- ne_xml_parser * parser = ne_xml_create();
- if ( !parser )
- {
- success = false;
- break;
- }
-
- LinkSequenceParseContext aCtx;
- ne_xml_push_handler( parser,
- LinkSequence_startelement_callback,
- LinkSequence_chardata_callback,
- LinkSequence_endelement_callback,
- &aCtx );
-
- ne_xml_parse( parser,
- rInData.getStr() + nStart,
- nEnd - nStart + TOKEN_LENGTH );
-
- success = !ne_xml_failed( parser );
-
- ne_xml_destroy( parser );
-
- if ( !success )
- break;
-
- if ( aCtx.pLink )
- {
- nCount++;
- if ( nCount > rOutData.getLength() )
- rOutData.realloc( rOutData.getLength() + 1 );
-
- rOutData.getArray()[ nCount - 1 ] = *aCtx.pLink;
- }
-
- nStart = nEnd + TOKEN_LENGTH;
- nEnd = rInData.indexOf( "</link>", nStart );
- }
-
- return success;
-}
-
-
-// static
-bool LinkSequence::toXML( const uno::Sequence< ucb::Link > & rInData,
- OUString & rOutData )
-{
- // <link><src>value</src><dst>value</dst></link><link><src>...
-
- for ( const auto& rLink : rInData )
- {
- rOutData += "<link><src>";
- rOutData += rLink.Source;
- rOutData += "</src><dst>";
- rOutData += rLink.Destination;
- rOutData += "</dst></link>";
- }
- return rInData.hasElements();
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/LinkSequence.hxx b/ucb/source/ucp/webdav-neon/LinkSequence.hxx
deleted file mode 100644
index d081fc4e65d9..000000000000
--- a/ucb/source/ucp/webdav-neon/LinkSequence.hxx
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <rtl/string.hxx>
-#include <com/sun/star/uno/Sequence.hxx>
-#include <com/sun/star/ucb/Link.hpp>
-
-namespace webdav_ucp
-{
-
-class LinkSequence
-{
-public:
- static bool createFromXML( const OString & rInData,
- css::uno::Sequence< css::ucb::Link > & rOutData );
- static bool toXML( const css::uno::Sequence< css::ucb::Link > & rInData,
- OUString & rOutData );
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/LockEntrySequence.cxx b/ucb/source/ucp/webdav-neon/LockEntrySequence.cxx
deleted file mode 100644
index 1ba2466d5aa2..000000000000
--- a/ucb/source/ucp/webdav-neon/LockEntrySequence.cxx
+++ /dev/null
@@ -1,246 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include <config_lgpl.h>
-#include <string.h>
-#include <ne_xml.h>
-#include "LockEntrySequence.hxx"
-#include <memory>
-
-using namespace webdav_ucp;
-using namespace com::sun::star;
-
-namespace {
-
-struct LockEntrySequenceParseContext
-{
- std::unique_ptr<ucb::LockEntry> pEntry;
- bool hasScope;
- bool hasType;
-
- LockEntrySequenceParseContext()
- : hasScope( false ), hasType( false ) {}
-};
-
-}
-
-#define STATE_TOP (1)
-
-#define STATE_LOCKENTRY (STATE_TOP)
-#define STATE_LOCKSCOPE (STATE_TOP + 1)
-#define STATE_EXCLUSIVE (STATE_TOP + 2)
-#define STATE_SHARED (STATE_TOP + 3)
-#define STATE_LOCKTYPE (STATE_TOP + 4)
-#define STATE_WRITE (STATE_TOP + 5)
-
-
-extern "C" {
-
-static int LockEntrySequence_startelement_callback(
- void *,
- int parent,
- const char * /*nspace*/,
- const char *name,
- const char ** )
-{
- if ( name != nullptr )
- {
- switch ( parent )
- {
- case NE_XML_STATEROOT:
- if ( strcmp( name, "lockentry" ) == 0 )
- return STATE_LOCKENTRY;
- break;
-
- case STATE_LOCKENTRY:
- if ( strcmp( name, "lockscope" ) == 0 )
- return STATE_LOCKSCOPE;
- else if ( strcmp( name, "locktype" ) == 0 )
- return STATE_LOCKTYPE;
-
-#define IIS_BUGS_WORKAROUND
-
-#ifdef IIS_BUGS_WORKAROUND
- /* IIS (6) returns XML violating RFC 4918
- for DAV:supportedlock property value.
-
- <lockentry>
- <write></write>
- <shared></shared>
- </lockentry>
- <lockentry>
- <write></write>
- <exclusive></exclusive>
- </lockentry>
-
- Bother...
- */
- else if ( strcmp( name, "exclusive" ) == 0 )
- return STATE_EXCLUSIVE;
- else if ( strcmp( name, "shared" ) == 0 )
- return STATE_SHARED;
- else if ( strcmp( name, "write" ) == 0 )
- return STATE_WRITE;
-#endif
- break;
-
- case STATE_LOCKSCOPE:
- if ( strcmp( name, "exclusive" ) == 0 )
- return STATE_EXCLUSIVE;
- else if ( strcmp( name, "shared" ) == 0 )
- return STATE_SHARED;
- break;
-
- case STATE_LOCKTYPE:
- if ( strcmp( name, "write" ) == 0 )
- return STATE_WRITE;
- break;
- }
- }
- return NE_XML_DECLINE;
-}
-
-
-static int LockEntrySequence_chardata_callback(
- void *,
- int,
- const char *,
- size_t )
-{
- return 0; // zero to continue, non-zero to abort parsing
-}
-
-
-static int LockEntrySequence_endelement_callback(
- void *userdata,
- int state,
- const char *,
- const char * )
-{
- LockEntrySequenceParseContext * pCtx
- = static_cast< LockEntrySequenceParseContext * >( userdata );
- if ( !pCtx->pEntry )
- pCtx->pEntry.reset( new ucb::LockEntry );
-
- switch ( state )
- {
- case STATE_EXCLUSIVE:
- pCtx->pEntry->Scope = ucb::LockScope_EXCLUSIVE;
- pCtx->hasScope = true;
- break;
-
- case STATE_SHARED:
- pCtx->pEntry->Scope = ucb::LockScope_SHARED;
- pCtx->hasScope = true;
- break;
-
- case STATE_WRITE:
- pCtx->pEntry->Type = ucb::LockType_WRITE;
- pCtx->hasType = true;
- break;
-
- case STATE_LOCKSCOPE:
- if ( !pCtx->hasScope )
- return 1; // abort
- break;
-
- case STATE_LOCKTYPE:
- if ( !pCtx->hasType )
- return 1; // abort
- break;
-
- case STATE_LOCKENTRY:
- if ( !pCtx->hasType || !pCtx->hasScope )
- return 1; // abort
- break;
-
- default:
- break;
- }
- return 0; // zero to continue, non-zero to abort parsing
-}
-
-}
-
-// static
-bool LockEntrySequence::createFromXML( const OString & rInData,
- uno::Sequence<
- ucb::LockEntry > & rOutData )
-{
- const sal_Int32 TOKEN_LENGTH = 12; // </lockentry>
- bool success = true;
-
- // rInData may contain multiple <lockentry>...</lockentry> tags.
- sal_Int32 nCount = 0;
- sal_Int32 nStart = 0;
- sal_Int32 nEnd = rInData.indexOf( "</lockentry>" );
- while ( nEnd > -1 )
- {
- ne_xml_parser * parser = ne_xml_create();
- if ( !parser )
- {
- success = false;
- break;
- }
-
- LockEntrySequenceParseContext aCtx;
- ne_xml_push_handler( parser,
- LockEntrySequence_startelement_callback,
- LockEntrySequence_chardata_callback,
- LockEntrySequence_endelement_callback,
- &aCtx );
-
- ne_xml_parse( parser,
- rInData.getStr() + nStart,
- nEnd - nStart + TOKEN_LENGTH );
-
- success = !ne_xml_failed( parser );
-
- ne_xml_destroy( parser );
-
- if ( !success )
- break;
-
- if ( aCtx.pEntry )
- {
- nCount++;
- if ( nCount > rOutData.getLength() )
- rOutData.realloc( rOutData.getLength() + 2 );
-
- rOutData.getArray()[ nCount - 1 ] = *aCtx.pEntry;
- }
-
- nStart = nEnd + TOKEN_LENGTH;
- nEnd = rInData.indexOf( "</lockentry>", nStart );
- }
-
- rOutData.realloc( nCount );
- return success;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/LockEntrySequence.hxx b/ucb/source/ucp/webdav-neon/LockEntrySequence.hxx
deleted file mode 100644
index 7674c2de1cb7..000000000000
--- a/ucb/source/ucp/webdav-neon/LockEntrySequence.hxx
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <rtl/string.hxx>
-#include <com/sun/star/uno/Sequence.hxx>
-#include <com/sun/star/ucb/LockEntry.hpp>
-
-namespace webdav_ucp
-{
-class LockEntrySequence
-{
-public:
- static bool createFromXML(const OString& rInData,
- css::uno::Sequence<css::ucb::LockEntry>& rOutData);
-};
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/LockSequence.cxx b/ucb/source/ucp/webdav-neon/LockSequence.cxx
deleted file mode 100644
index 8680a31363d7..000000000000
--- a/ucb/source/ucp/webdav-neon/LockSequence.cxx
+++ /dev/null
@@ -1,360 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include <config_lgpl.h>
-#include <string.h>
-#include <ne_xml.h>
-#include "LockSequence.hxx"
-#include <memory>
-#include <sal/log.hxx>
-
-using namespace webdav_ucp;
-using namespace com::sun::star;
-
-namespace {
-
-struct LockSequenceParseContext
-{
- std::unique_ptr<ucb::Lock> pLock;
- bool hasLockScope;
- bool hasLockType;
- bool hasDepth;
- bool hasHREF;
- bool hasTimeout;
-
- LockSequenceParseContext()
- : hasLockScope( false ), hasLockType( false ),
- hasDepth( false ), hasHREF( false ), hasTimeout( false ) {}
-};
-
-}
-
-#define STATE_TOP (1)
-
-#define STATE_ACTIVELOCK (STATE_TOP)
-#define STATE_LOCKSCOPE (STATE_TOP + 1)
-#define STATE_LOCKTYPE (STATE_TOP + 2)
-#define STATE_DEPTH (STATE_TOP + 3)
-#define STATE_OWNER (STATE_TOP + 4)
-#define STATE_TIMEOUT (STATE_TOP + 5)
-#define STATE_LOCKTOKEN (STATE_TOP + 6)
-#define STATE_EXCLUSIVE (STATE_TOP + 7)
-#define STATE_SHARED (STATE_TOP + 8)
-#define STATE_WRITE (STATE_TOP + 9)
-#define STATE_HREF (STATE_TOP + 10)
-
-
-extern "C" {
-
-static int LockSequence_startelement_callback(
- void *,
- int parent,
- const char * /*nspace*/,
- const char *name,
- const char ** )
-{
- if ( name != nullptr )
- {
- switch ( parent )
- {
- case NE_XML_STATEROOT:
- if ( strcmp( name, "activelock" ) == 0 )
- return STATE_ACTIVELOCK;
- break;
-
- case STATE_ACTIVELOCK:
- if ( strcmp( name, "lockscope" ) == 0 )
- return STATE_LOCKSCOPE;
- else if ( strcmp( name, "locktype" ) == 0 )
- return STATE_LOCKTYPE;
- else if ( strcmp( name, "depth" ) == 0 )
- return STATE_DEPTH;
- else if ( strcmp( name, "owner" ) == 0 )
- return STATE_OWNER;
- else if ( strcmp( name, "timeout" ) == 0 )
- return STATE_TIMEOUT;
- else if ( strcmp( name, "locktoken" ) == 0 )
- return STATE_LOCKTOKEN;
- break;
-
- case STATE_LOCKSCOPE:
- if ( strcmp( name, "exclusive" ) == 0 )
- return STATE_EXCLUSIVE;
- else if ( strcmp( name, "shared" ) == 0 )
- return STATE_SHARED;
- break;
-
- case STATE_LOCKTYPE:
- if ( strcmp( name, "write" ) == 0 )
- return STATE_WRITE;
- break;
-
- case STATE_LOCKTOKEN:
- if ( strcmp( name, "href" ) == 0 )
- return STATE_HREF;
- break;
-
- case STATE_OWNER:
- // owner elem contains ANY. Accept anything; no state change.
- return STATE_OWNER;
- }
- }
- return NE_XML_DECLINE;
-}
-
-
-static int LockSequence_chardata_callback(
- void *userdata,
- int state,
- const char *buf,
- size_t len )
-{
- LockSequenceParseContext * pCtx
- = static_cast< LockSequenceParseContext * >( userdata );
- if ( !pCtx->pLock )
- pCtx->pLock.reset( new ucb::Lock );
-
- // Beehive sends XML values containing trailing newlines.
- if ( buf[ len - 1 ] == 0x0a )
- len--;
-
- switch ( state )
- {
- case STATE_DEPTH:
- if ( rtl_str_compareIgnoreAsciiCase_WithLength(
- buf, len, "0", 1 ) == 0 )
- {
- pCtx->pLock->Depth = ucb::LockDepth_ZERO;
- pCtx->hasDepth = true;
- }
- else if ( rtl_str_compareIgnoreAsciiCase_WithLength(
- buf, len, "1", 1 ) == 0 )
- {
- pCtx->pLock->Depth = ucb::LockDepth_ONE;
- pCtx->hasDepth = true;
- }
- else if ( rtl_str_compareIgnoreAsciiCase_WithLength(
- buf, len, "infinity", 8 ) == 0 )
- {
- pCtx->pLock->Depth = ucb::LockDepth_INFINITY;
- pCtx->hasDepth = true;
- }
- else
- SAL_WARN( "ucb.ucp.webdav", "LockSequence_chardata_callback - Unknown depth!" );
- break;
-
- case STATE_OWNER:
- {
- // collect raw XML data... (owner contains ANY)
- OUString aValue;
- pCtx->pLock->Owner >>= aValue;
- aValue += OUString( buf, len, RTL_TEXTENCODING_ASCII_US );
- pCtx->pLock->Owner <<= aValue;
- break;
- }
-
- case STATE_TIMEOUT:
-
- // RFC2518, RFC2616:
-
- // TimeType = ("Second-" DAVTimeOutVal | "Infinite" | Other)
- // DAVTimeOutVal = 1*digit
- // Other = "Extend" field-value
- // field-value = *( field-content | LWS )
- // field-content = <the OCTETs making up the field-value
- // and consisting of either *TEXT or combinations
- // of token, separators, and quoted-string>
- //
- // RFC4918, <http://tools.ietf.org/html/rfc4918#section-10.7>
- // "The timeout value for TimeType "Second" MUST
- // NOT be greater than 2^32-1."
-
- if ( rtl_str_compareIgnoreAsciiCase_WithLength(
- buf, len, "Infinite", 8 ) == 0 )
- {
- pCtx->pLock->Timeout = sal_Int64( -1 );
- pCtx->hasTimeout = true;
- }
- else if ( rtl_str_shortenedCompareIgnoreAsciiCase_WithLength(
- buf, len, "Second-", 7, 7 ) == 0 )
- {
- pCtx->pLock->Timeout
- = OString( buf + 7, len - 7 ).toInt64();
- pCtx->hasTimeout = true;
- }
-// else if ( rtl_str_shortenedCompareIgnoreCase_WithLength(
-// buf, len, "Extend", 6, 6 ) == 0 )
-// {
-// @@@
-// }
- else
- {
- pCtx->pLock->Timeout = sal_Int64( -1 );
- pCtx->hasTimeout = true;
- SAL_WARN( "ucb.ucp.webdav", "LockSequence_chardata_callback - Unknown timeout!" );
- }
- break;
-
- case STATE_HREF:
- {
- // collect hrefs.
- sal_Int32 nPos = pCtx->pLock->LockTokens.getLength();
- pCtx->pLock->LockTokens.realloc( nPos + 1 );
- pCtx->pLock->LockTokens.getArray()[ nPos ]
- = OUString( buf, len, RTL_TEXTENCODING_ASCII_US );
- pCtx->hasHREF = true;
- break;
- }
-
- }
-
- return 0; // zero to continue, non-zero to abort parsing
-}
-
-
-static int LockSequence_endelement_callback(
- void *userdata,
- int state,
- const char *,
- const char * )
-{
- LockSequenceParseContext * pCtx
- = static_cast< LockSequenceParseContext * >( userdata );
- if ( !pCtx->pLock )
- pCtx->pLock.reset( new ucb::Lock );
-
- switch ( state )
- {
- case STATE_EXCLUSIVE:
- pCtx->pLock->Scope = ucb::LockScope_EXCLUSIVE;
- pCtx->hasLockScope = true;
- break;
-
- case STATE_SHARED:
- pCtx->pLock->Scope = ucb::LockScope_SHARED;
- pCtx->hasLockScope = true;
- break;
-
- case STATE_WRITE:
- pCtx->pLock->Type = ucb::LockType_WRITE;
- pCtx->hasLockType = true;
- break;
-
- case STATE_DEPTH:
- if ( !pCtx->hasDepth )
- return 1; // abort
- break;
-
- case STATE_HREF:
- if ( !pCtx->hasHREF )
- return 1; // abort
- break;
-
- case STATE_TIMEOUT:
- if ( !pCtx->hasTimeout )
- return 1; // abort
- break;
-
- case STATE_LOCKSCOPE:
- if ( !pCtx->hasLockScope )
- return 1; // abort
- break;
-
- case STATE_LOCKTYPE:
- if ( !pCtx->hasLockType )
- return 1; // abort
- break;
-
- case STATE_ACTIVELOCK:
- if ( !pCtx->hasLockType || !pCtx->hasDepth )
- return 1; // abort
- break;
-
- default:
- break;
- }
- return 0; // zero to continue, non-zero to abort parsing
-}
-
-}
-
-// static
-bool LockSequence::createFromXML( const OString & rInData,
- uno::Sequence< ucb::Lock > & rOutData )
-{
- const sal_Int32 TOKEN_LENGTH = 13; // </activelock>
- bool success = true;
-
- // rInData may contain multiple <activelock>...</activelock> tags.
- sal_Int32 nCount = 0;
- sal_Int32 nStart = 0;
- sal_Int32 nEnd = rInData.indexOf( "</activelock>" );
- while ( nEnd > -1 )
- {
- ne_xml_parser * parser = ne_xml_create();
- if ( !parser )
- {
- success = false;
- break;
- }
-
- LockSequenceParseContext aCtx;
- ne_xml_push_handler( parser,
- LockSequence_startelement_callback,
- LockSequence_chardata_callback,
- LockSequence_endelement_callback,
- &aCtx );
-
- ne_xml_parse( parser,
- rInData.getStr() + nStart,
- nEnd - nStart + TOKEN_LENGTH );
-
- success = !ne_xml_failed( parser );
-
- ne_xml_destroy( parser );
-
- if ( !success )
- break;
-
- if ( aCtx.pLock )
- {
- nCount++;
- if ( nCount > rOutData.getLength() )
- rOutData.realloc( rOutData.getLength() + 1 );
-
- rOutData.getArray()[ nCount - 1 ] = *aCtx.pLock;
- }
-
- nStart = nEnd + TOKEN_LENGTH;
- nEnd = rInData.indexOf( "</activelock>", nStart );
- }
-
- return success;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/LockSequence.hxx b/ucb/source/ucp/webdav-neon/LockSequence.hxx
deleted file mode 100644
index dc14064410f3..000000000000
--- a/ucb/source/ucp/webdav-neon/LockSequence.hxx
+++ /dev/null
@@ -1,48 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <rtl/string.hxx>
-#include <com/sun/star/uno/Sequence.hxx>
-#include <com/sun/star/ucb/Lock.hpp>
-
-namespace webdav_ucp
-{
-
-class LockSequence
-{
-public:
- static bool createFromXML( const OString & rInData,
- css::uno::Sequence< css::ucb::Lock > & rOutData );
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/NeonHeadRequest.cxx b/ucb/source/ucp/webdav-neon/NeonHeadRequest.cxx
deleted file mode 100644
index 68f24f440d94..000000000000
--- a/ucb/source/ucp/webdav-neon/NeonHeadRequest.cxx
+++ /dev/null
@@ -1,139 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include <osl/mutex.hxx>
-#include <sal/log.hxx>
-#include "NeonHeadRequest.hxx"
-#include "NeonSession.hxx"
-
-using namespace webdav_ucp;
-using namespace com::sun::star;
-
-namespace {
-
-void process_headers( ne_request * req,
- DAVResource & rResource,
- const std::vector< OUString > & rHeaderNames )
-{
- void * cursor = nullptr;
- const char * name, *value;
-
-#if defined SAL_LOG_INFO
- {
- for ( const auto& rHeader : rHeaderNames )
- {
- SAL_INFO( "ucb.ucp.webdav", "HEAD - requested header: " << rHeader );
- }
- }
-#endif
- while ( ( cursor = ne_response_header_iterate( req, cursor,
- &name, &value ) ) != nullptr ) {
- // The HTTP header `field-name` must be a `token`, which can only contain a subset of ASCII;
- // assume that Neon will already have rejected any invalid data, so that it is guaranteed
- // that `name` is ASCII-only:
- OUString aHeaderName( OUString::createFromAscii( name ) );
- // The HTTP header `field-value` may contain obsolete (as per RFC 7230) `obs-text` non-ASCII
- // %x80-FF octets, lets preserve them as individual characters in `aHeaderValue` by treating
- // `value` as ISO 8859-1:
- OUString aHeaderValue(value, strlen(value), RTL_TEXTENCODING_ISO_8859_1);
-
- SAL_INFO( "ucb.ucp.webdav", "HEAD - received header: " << aHeaderName << ":" << aHeaderValue);
-
- // Note: Empty vector means that all headers are requested.
- bool bIncludeIt = rHeaderNames.empty();
-
- if ( !bIncludeIt )
- {
- // Check whether this header was requested.
- auto it = std::find_if(rHeaderNames.begin(), rHeaderNames.end(),
- [&aHeaderName](const OUString& rName) {
- // header names are case insensitive
- return rName.equalsIgnoreAsciiCase( aHeaderName );
- });
-
- if ( it != rHeaderNames.end() )
- {
- aHeaderName = *it;
- bIncludeIt = true;
- }
- }
-
- if ( bIncludeIt )
- {
- // Create & set the PropertyValue
- DAVPropertyValue thePropertyValue;
- // header names are case insensitive, so are the
- // corresponding property names
- thePropertyValue.Name = aHeaderName.toAsciiLowerCase();
- thePropertyValue.IsCaseSensitive = false;
- thePropertyValue.Value <<= aHeaderValue;
-
- // Add the newly created PropertyValue
- rResource.properties.push_back( thePropertyValue );
- }
- }
-}
-
-} // namespace
-
-NeonHeadRequest::NeonHeadRequest( HttpSession * inSession,
- const OUString & inPath,
- const std::vector< OUString > &
- inHeaderNames,
- DAVResource & ioResource,
- int & nError )
-{
- ioResource.uri = inPath;
- ioResource.properties.clear();
-
- // Create and dispatch HEAD request. Install catcher for all response
- // header fields.
- ne_request * req = ne_request_create( inSession,
- "HEAD",
- OUStringToOString(
- inPath,
- RTL_TEXTENCODING_UTF8 ).getStr() );
-
- {
- osl::Guard< osl::Mutex > theGlobalGuard(getGlobalNeonMutex());
- nError = ne_request_dispatch( req );
- }
-
- process_headers( req, ioResource, inHeaderNames );
-
- if ( nError == NE_OK && ne_get_status( req )->klass != 2 )
- nError = NE_ERROR;
-
- ne_request_destroy( req );
-}
-
-NeonHeadRequest::~NeonHeadRequest()
-{
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/NeonHeadRequest.hxx b/ucb/source/ucp/webdav-neon/NeonHeadRequest.hxx
deleted file mode 100644
index 943d4138a41d..000000000000
--- a/ucb/source/ucp/webdav-neon/NeonHeadRequest.hxx
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <vector>
-#include "NeonTypes.hxx"
-#include "DAVResource.hxx"
-
-namespace webdav_ucp
-{
-
-class NeonHeadRequest
-{
-public:
- // named / allprop
- NeonHeadRequest( HttpSession* inSession,
- const OUString & inPath,
- const std::vector< OUString > & inHeaderNames,
- DAVResource & ioResource,
- int & nError );
- ~NeonHeadRequest();
-};
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/NeonInputStream.cxx b/ucb/source/ucp/webdav-neon/NeonInputStream.cxx
deleted file mode 100644
index 848dc2b81cf8..000000000000
--- a/ucb/source/ucp/webdav-neon/NeonInputStream.cxx
+++ /dev/null
@@ -1,136 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include "NeonInputStream.hxx"
-
-#include <com/sun/star/lang/IllegalArgumentException.hpp>
-#include <cppuhelper/queryinterface.hxx>
-
-#include <string.h>
-
-using namespace cppu;
-using namespace com::sun::star::io;
-using namespace com::sun::star::uno;
-using namespace webdav_ucp;
-
-NeonInputStream::NeonInputStream()
-: mLen( 0 ),
- mPos( 0 )
-{
-}
-
-NeonInputStream::~NeonInputStream()
-{
-}
-
-// Allows the caller to add some data to the "end" of the stream
-void NeonInputStream::AddToStream( const char * inBuf, sal_Int32 inLen )
-{
- mInputBuffer.realloc( sal::static_int_cast<sal_Int32>(mLen) + inLen );
- memcpy( mInputBuffer.getArray() + mLen, inBuf, inLen );
- mLen += inLen;
-}
-
-Any NeonInputStream::queryInterface( const Type &type )
-{
- Any aRet = ::cppu::queryInterface( type,
- static_cast< XInputStream * >( this ),
- static_cast< XSeekable * >( this ) );
- return aRet.hasValue() ? aRet : OWeakObject::queryInterface( type );
-}
-
-// "Reads" the specified number of bytes from the stream
-sal_Int32 SAL_CALL NeonInputStream::readBytes(
- css::uno::Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead )
-{
- // Work out how much we're actually going to write
- sal_Int32 theBytes2Read = nBytesToRead;
- sal_Int32 theBytesLeft = sal::static_int_cast<sal_Int32>(mLen - mPos);
- if ( theBytes2Read > theBytesLeft )
- theBytes2Read = theBytesLeft;
-
- // Realloc buffer.
- aData.realloc( theBytes2Read );
-
- // Write the data
- memcpy(
- aData.getArray(), mInputBuffer.getConstArray() + mPos, theBytes2Read );
-
- // Update our stream position for next time
- mPos += theBytes2Read;
-
- return theBytes2Read;
-}
-
-sal_Int32 SAL_CALL NeonInputStream::readSomeBytes(
- css::uno::Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead )
-{
- // Warning: What should this be doing ?
- return readBytes( aData, nMaxBytesToRead );
-}
-
-// Moves the current stream position forward
-void SAL_CALL NeonInputStream::skipBytes( sal_Int32 nBytesToSkip )
-{
- mPos += nBytesToSkip;
- if ( mPos >= mLen )
- mPos = mLen;
-}
-
-// Returns the number of unread bytes currently remaining on the stream
-sal_Int32 SAL_CALL NeonInputStream::available( )
-{
- return std::min<sal_Int64>(SAL_MAX_INT32, mLen - mPos);
-}
-
-void SAL_CALL NeonInputStream::closeInput()
-{
-}
-
-void SAL_CALL NeonInputStream::seek( sal_Int64 location )
-{
- if ( location < 0 )
- throw css::lang::IllegalArgumentException();
-
- if ( location > mLen )
- throw css::lang::IllegalArgumentException();
-
- mPos = location;
-}
-
-sal_Int64 SAL_CALL NeonInputStream::getPosition()
-{
- return mPos;
-}
-
-sal_Int64 SAL_CALL NeonInputStream::getLength()
-{
- return mLen;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/NeonInputStream.hxx b/ucb/source/ucp/webdav-neon/NeonInputStream.hxx
deleted file mode 100644
index aa685e28335f..000000000000
--- a/ucb/source/ucp/webdav-neon/NeonInputStream.hxx
+++ /dev/null
@@ -1,95 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-#pragma once
-
-#include <config_lgpl.h>
-#include <sal/types.h>
-#include <cppuhelper/weak.hxx>
-#include <com/sun/star/io/XInputStream.hpp>
-#include <com/sun/star/io/XSeekable.hpp>
-
-
-namespace webdav_ucp
-{
-
-// A simple XInputStream implementation provided specifically for use
-// by the DAVSession::GET method.
-class NeonInputStream : public css::io::XInputStream,
- public css::io::XSeekable,
- public ::cppu::OWeakObject
-{
- private:
- css::uno::Sequence< sal_Int8 > mInputBuffer;
- sal_Int64 mLen;
- sal_Int64 mPos;
-
- public:
- NeonInputStream();
- virtual ~NeonInputStream() override;
-
- // Add some data to the end of the stream
- void AddToStream( const char * inBuf, sal_Int32 inLen );
-
- // XInterface
- virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & type ) override;
-
- virtual void SAL_CALL acquire()
- noexcept override
- { OWeakObject::acquire(); }
-
- virtual void SAL_CALL release()
- noexcept override
- { OWeakObject::release(); }
-
-
- // XInputStream
- virtual sal_Int32 SAL_CALL readBytes(
- css::uno::Sequence< sal_Int8 > & aData,
- sal_Int32 nBytesToRead ) override;
-
- virtual sal_Int32 SAL_CALL readSomeBytes(
- css::uno::Sequence< sal_Int8 > & aData,
- sal_Int32 nMaxBytesToRead ) override;
-
- virtual void SAL_CALL skipBytes( sal_Int32 nBytesToSkip ) override;
-
- virtual sal_Int32 SAL_CALL available() override;
-
- virtual void SAL_CALL closeInput() override;
-
- // XSeekable
- virtual void SAL_CALL seek( sal_Int64 location ) override;
-
- virtual sal_Int64 SAL_CALL getPosition() override;
-
- virtual sal_Int64 SAL_CALL getLength() override;
-};
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/NeonLockStore.cxx b/ucb/source/ucp/webdav-neon/NeonLockStore.cxx
deleted file mode 100644
index c00f18627fa0..000000000000
--- a/ucb/source/ucp/webdav-neon/NeonLockStore.cxx
+++ /dev/null
@@ -1,241 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-
-#include <ne_uri.h>
-#include <rtl/ustring.hxx>
-#include <osl/time.h>
-#include <osl/thread.hxx>
-#include <sal/log.hxx>
-#include <salhelper/thread.hxx>
-#include "NeonSession.hxx"
-#include "NeonLockStore.hxx"
-
-using namespace webdav_ucp;
-
-namespace webdav_ucp {
-
-class TickerThread : public salhelper::Thread
-{
- bool m_bFinish;
- NeonLockStore & m_rLockStore;
-
-public:
-
- explicit TickerThread( NeonLockStore & rLockStore )
- : Thread( "NeonTickerThread" ), m_bFinish( false )
- , m_rLockStore( rLockStore )
- {
- }
-
- void finish() { m_bFinish = true; }
-
-private:
-
- virtual void execute() override;
-};
-
-} // namespace webdav_ucp
-
-void TickerThread::execute()
-{
- SAL_INFO( "ucb.ucp.webdav", "TickerThread: start." );
-
- // we have to go through the loop more often to be able to finish ~quickly
- const int nNth = 25;
-
- int nCount = nNth;
- while ( !m_bFinish )
- {
- if (--nCount < 0)
- {
- m_rLockStore.refreshLocks();
- nCount = nNth;
- }
-
- salhelper::Thread::wait(TimeValue(0, 1000000000 / nNth));
- }
-
- SAL_INFO( "ucb.ucp.webdav", "TickerThread: stop." );
-}
-
-NeonLockStore::NeonLockStore()
- : m_pNeonLockStore( ne_lockstore_create() )
-{
- /*
- * ne_lockstore_create() never returns a NULL; neon calls abort() in case of an out-of-memory
- * situation.
- * Please see:
- * <http://www.webdav.org/neon/doc/html/refneon.html>
- * topic title "Memory handling", copied here verbatim:
- *
- * "neon does not attempt to cope gracefully with an out-of-memory situation;
- * instead, by default, the abort function is called to immediately terminate
- * the process. An application may register a custom function which will be
- * called before abort in such a situation; see ne_oom_callback."
- */
-}
-
-NeonLockStore::~NeonLockStore()
-{
- {
- osl::ClearableMutexGuard aGuard(m_aMutex);
- stopTicker(aGuard);
- } // actually no threads should even try to access members now
-
- // release active locks, if any.
- SAL_WARN_IF( !m_aLockInfoMap.empty(), "ucb.ucp.webdav", "NeonLockStore::~NeonLockStore - Releasing active locks!" );
-
- for ( auto& rLockInfo : m_aLockInfoMap )
- {
- NeonLock * pLock = rLockInfo.first;
- rLockInfo.second.xSession->UNLOCK( pLock );
-
- ne_lockstore_remove( m_pNeonLockStore, pLock );
- ne_lock_destroy( pLock );
- }
-
- ne_lockstore_destroy( m_pNeonLockStore );
-}
-
-void NeonLockStore::startTicker()
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- if ( !m_pTickerThread.is() )
- {
- m_pTickerThread = new TickerThread( *this );
- m_pTickerThread->launch();
- }
-}
-
-void NeonLockStore::stopTicker(osl::ClearableMutexGuard & rGuard)
-{
- rtl::Reference<TickerThread> pTickerThread;
-
- if (m_pTickerThread.is())
- {
- m_pTickerThread->finish(); // needs mutex
- // the TickerThread may run refreshLocks() at most once after this
- pTickerThread = m_pTickerThread;
- m_pTickerThread.clear();
- }
-
- rGuard.clear();
-
- if (pTickerThread.is() && pTickerThread->getIdentifier() != osl::Thread::getCurrentIdentifier())
- pTickerThread->join(); // without m_aMutex locked (to prevent deadlock)
-}
-
-void NeonLockStore::registerSession( HttpSession * pHttpSession )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- ne_lockstore_register( m_pNeonLockStore, pHttpSession );
-}
-
-NeonLock * NeonLockStore::findByUri( std::u16string_view rUri )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- ne_uri aUri;
- ne_uri_parse( OUStringToOString(
- rUri, RTL_TEXTENCODING_UTF8 ).getStr(), &aUri );
- return ne_lockstore_findbyuri( m_pNeonLockStore, &aUri );
-}
-
-void NeonLockStore::addLock( NeonLock * pLock,
- rtl::Reference< NeonSession > const & xSession,
- sal_Int32 nLastChanceToSendRefreshRequest )
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- ne_lockstore_add( m_pNeonLockStore, pLock );
- m_aLockInfoMap[ pLock ]
- = LockInfo( xSession, nLastChanceToSendRefreshRequest );
-
- startTicker();
-}
-
-void NeonLockStore::removeLock( NeonLock * pLock )
-{
- osl::ClearableMutexGuard aGuard( m_aMutex );
-
- m_aLockInfoMap.erase( pLock );
- ne_lockstore_remove( m_pNeonLockStore, pLock );
-
- if ( m_aLockInfoMap.empty() )
- stopTicker(aGuard);
-}
-
-void NeonLockStore::removeLockDeferred(NeonLock* pLock)
-{
- osl::MutexGuard aGuard(m_aMutex);
-
- m_aRemoveDeferred.push_back(pLock);
-}
-
-void NeonLockStore::refreshLocks()
-{
- osl::MutexGuard aGuard( m_aMutex );
-
- for ( auto& rLockInfo : m_aLockInfoMap )
- {
- LockInfo & rInfo = rLockInfo.second;
- if ( rInfo.nLastChanceToSendRefreshRequest != -1 )
- {
- // 30 seconds or less remaining until lock expires?
- TimeValue t1;
- osl_getSystemTime( &t1 );
- if ( rInfo.nLastChanceToSendRefreshRequest - 30
- <= sal_Int32( t1.Seconds ) )
- {
- // refresh the lock.
- sal_Int32 nlastChanceToSendRefreshRequest = -1;
- if ( rInfo.xSession->LOCK(
- rLockInfo.first,
- /* out param */ nlastChanceToSendRefreshRequest ) )
- {
- rInfo.nLastChanceToSendRefreshRequest
- = nlastChanceToSendRefreshRequest;
- }
- else
- {
- // refresh failed. stop auto-refresh.
- rInfo.nLastChanceToSendRefreshRequest = -1;
- }
- }
- }
- }
- // removeLock will not need to actually release the lock, because this is run from TickerThread
- for (auto pLock : m_aRemoveDeferred)
- removeLock(pLock);
- m_aRemoveDeferred.clear();
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/NeonLockStore.hxx b/ucb/source/ucp/webdav-neon/NeonLockStore.hxx
deleted file mode 100644
index d6e37f4e8d84..000000000000
--- a/ucb/source/ucp/webdav-neon/NeonLockStore.hxx
+++ /dev/null
@@ -1,97 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-#pragma once
-
-#include <config_lgpl.h>
-#include <map>
-#include <string_view>
-
-#include <ne_locks.h>
-
-#include <osl/mutex.hxx>
-#include <rtl/ref.hxx>
-#include "NeonTypes.hxx"
-
-namespace webdav_ucp
-{
-
-class TickerThread;
-class NeonSession;
-
-struct LockInfo
-{
- rtl::Reference< NeonSession > xSession;
- sal_Int32 nLastChanceToSendRefreshRequest;
-
- LockInfo()
- : nLastChanceToSendRefreshRequest( -1 ) {}
-
- LockInfo( rtl::Reference< NeonSession > const & _xSession,
- sal_Int32 _nLastChanceToSendRefreshRequest )
- : xSession( _xSession ),
- nLastChanceToSendRefreshRequest( _nLastChanceToSendRefreshRequest ) {}
-
-};
-
-typedef std::map< NeonLock *, LockInfo > LockInfoMap;
-
-class NeonLockStore
-{
- osl::Mutex m_aMutex;
- ne_lock_store * m_pNeonLockStore;
- rtl::Reference< TickerThread > m_pTickerThread;
- LockInfoMap m_aLockInfoMap;
- std::vector<NeonLock*> m_aRemoveDeferred;
-
-public:
- NeonLockStore();
- ~NeonLockStore();
-
- void registerSession( HttpSession * pHttpSession );
-
- NeonLock * findByUri( std::u16string_view rUri );
-
- void addLock( NeonLock * pLock,
- rtl::Reference< NeonSession > const & xSession,
- // time in seconds since Jan 1 1970
- // -1: infinite lock, no refresh
- sal_Int32 nLastChanceToSendRefreshRequest );
-
- void removeLock( NeonLock * pLock );
- void removeLockDeferred(NeonLock* pLock);
-
- void refreshLocks();
-
-private:
- void startTicker();
- void stopTicker(osl::ClearableMutexGuard & rGuard);
-};
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/NeonPropFindRequest.cxx b/ucb/source/ucp/webdav-neon/NeonPropFindRequest.cxx
deleted file mode 100644
index 83252bf837aa..000000000000
--- a/ucb/source/ucp/webdav-neon/NeonPropFindRequest.cxx
+++ /dev/null
@@ -1,320 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-
-#include <osl/mutex.hxx>
-#include <rtl/strbuf.hxx>
-#include <sal/log.hxx>
-#include "NeonSession.hxx"
-#include "NeonTypes.hxx"
-#include "DAVProperties.hxx"
-#include "NeonPropFindRequest.hxx"
-#include "LinkSequence.hxx"
-#include "LockSequence.hxx"
-#include "LockEntrySequence.hxx"
-#include "UCBDeadPropertyValue.hxx"
-#include <memory>
-
-using namespace com::sun::star::uno;
-using namespace com::sun::star::ucb;
-using namespace webdav_ucp;
-
-
-namespace
-{
- // strip "DAV:" namespace from XML snippets to avoid
- // parser error (undeclared namespace) later on.
- OString stripDavNamespace( const OString & in )
- {
- const OString inXML( in.toAsciiLowerCase() );
-
- OStringBuffer buf;
- sal_Int32 start = 0;
- sal_Int32 end = inXML.indexOf( "dav:" );
- while ( end != -1 )
- {
- if ( inXML[ end - 1 ] == '<' ||
- inXML[ end - 1 ] == '/' )
- {
- // copy from original buffer - preserve case.
- buf.append( in.subView( start, end - start ) );
- }
- else
- {
- // copy from original buffer - preserve case.
- buf.append( in.subView( start, end - start + 4 ) );
- }
- start = end + 4;
- end = inXML.indexOf( "dav:", start );
- }
- buf.append( inXML.subView( start ) );
-
- return buf.makeStringAndClear();
- }
-}
-
-extern "C" {
-
-static int NPFR_propfind_iter( void* userdata,
- const NeonPropName* pname,
- const char* value,
- const HttpStatus* status )
-{
- /*
- HTTP Response Status Classes:
-
- - 1: Informational - Request received, continuing process
-
- - 2: Success - The action was successfully received,
- understood, and accepted
-
- - 3: Redirection - Further action must be taken in order to
- complete the request
-
- - 4: Client Error - The request contains bad syntax or cannot
- be fulfilled
-
- - 5: Server Error - The server failed to fulfill an apparently
- valid request
- */
-
- if ( status->klass > 2 )
- return 0; // Error getting this property. Go on.
-
- // Create & set the PropertyValue
- DAVPropertyValue thePropertyValue;
- thePropertyValue.IsCaseSensitive = true;
-
- SAL_WARN_IF( !pname->nspace, "ucb.ucp.webdav", "NPFR_propfind_iter - No XML namespace!" );
-
- DAVProperties::createUCBPropName( pname->nspace,
- pname->name,
- thePropertyValue.Name );
- bool bHasValue = false;
- if ( DAVProperties::isUCBDeadProperty( *pname ) )
- {
- // DAV dead property added by WebDAV UCP?
- if ( UCBDeadPropertyValue::createFromXML(
- value, thePropertyValue.Value ) )
- {
- SAL_WARN_IF( !thePropertyValue.Value.hasValue(),
- "ucb.ucp.webdav", "NPFR_propfind_iter - No value for UCBDeadProperty!" );
- bHasValue = true;
- }
- }
-
- if ( !bHasValue )
- {
- if ( rtl_str_compareIgnoreAsciiCase(
- pname->name, "resourcetype" ) == 0 )
- {
- OString aValue( value );
- aValue = aValue.trim(); // #107358# remove leading/trailing spaces
- if ( !aValue.isEmpty() )
- {
- aValue = stripDavNamespace( aValue ).toAsciiLowerCase();
- if ( aValue.startsWith("<collection") )
- {
- thePropertyValue.Value
- <<= OUString("collection");
- }
- }
-
- if ( !thePropertyValue.Value.hasValue() )
- {
- // Take over the value exactly as supplied by the server.
- thePropertyValue.Value <<= OUString::createFromAscii( value );
- }
- }
- else if ( rtl_str_compareIgnoreAsciiCase(
- pname->name, "supportedlock" ) == 0 )
- {
- Sequence< LockEntry > aEntries;
- LockEntrySequence::createFromXML(
- stripDavNamespace( value ), aEntries );
- thePropertyValue.Value <<= aEntries;
- }
- else if ( rtl_str_compareIgnoreAsciiCase(
- pname->name, "lockdiscovery" ) == 0 )
- {
- Sequence< Lock > aLocks;
- LockSequence::createFromXML(
- stripDavNamespace( value ), aLocks );
- thePropertyValue.Value <<= aLocks;
- }
- else if ( rtl_str_compareIgnoreAsciiCase( pname->name, "source" ) == 0 )
- {
- Sequence< Link > aLinks;
- LinkSequence::createFromXML(
- stripDavNamespace( value ), aLinks );
- thePropertyValue.Value <<= aLinks;
- }
- else
- {
- thePropertyValue.Value
- <<= OStringToOUString( value, RTL_TEXTENCODING_UTF8 );
- }
- }
-
- // Add the newly created PropertyValue
- DAVResource* theResource = static_cast< DAVResource * >( userdata );
- theResource->properties.push_back( thePropertyValue );
-
- return 0; // Go on.
-}
-
-static void NPFR_propfind_results( void* userdata,
- const ne_uri* uri,
- const NeonPropFindResultSet* set )
-{
- // @@@ href is not the uri! DAVResource ctor wants uri!
-
- DAVResource theResource(
- OStringToOUString( uri->path, RTL_TEXTENCODING_UTF8 ) );
-
- ne_propset_iterate( set, NPFR_propfind_iter, &theResource );
-
- // Add entry to resources list.
- std::vector< DAVResource > * theResources
- = static_cast< std::vector< DAVResource > * >( userdata );
- theResources->push_back( theResource );
-}
-
-static int NPFR_propnames_iter( void* userdata,
- const NeonPropName* pname,
- const char* /*value*/,
- const HttpStatus* /*status*/ )
-{
- OUString aFullName;
- DAVProperties::createUCBPropName( pname->nspace,
- pname->name,
- aFullName );
-
- DAVResourceInfo* theResource = static_cast< DAVResourceInfo * >( userdata );
- theResource->properties.push_back( aFullName );
- return 0;
-}
-
-static void NPFR_propnames_results( void* userdata,
- const ne_uri* /*uri*/,
- const NeonPropFindResultSet* results )
-{
- // @@@ href is not the uri! DAVResourceInfo ctor wants uri!
- // Create entry for the resource.
- DAVResourceInfo theResource;
-
- // Fill entry.
- ne_propset_iterate( results, NPFR_propnames_iter, &theResource );
-
- // Add entry to resources list.
- std::vector< DAVResourceInfo > * theResources
- = static_cast< std::vector< DAVResourceInfo > * >( userdata );
- theResources->push_back( theResource );
-}
-
-}
-
-NeonPropFindRequest::NeonPropFindRequest( HttpSession* inSession,
- const char* inPath,
- const Depth inDepth,
- const std::vector< OUString >& inPropNames,
- std::vector< DAVResource >& ioResources,
- int & nError )
-{
- // Generate the list of properties we're looking for
- int thePropCount = inPropNames.size();
- if ( thePropCount > 0 )
- {
- std::unique_ptr<NeonPropName[]> thePropNames(new NeonPropName[ thePropCount + 1 ]);
- int theIndex;
-
- for ( theIndex = 0; theIndex < thePropCount; theIndex ++ )
- {
- // Split fullname into namespace and name!
- DAVProperties::createNeonPropName(
- inPropNames[ theIndex ], thePropNames[ theIndex ] );
- }
- thePropNames[ theIndex ].nspace = nullptr;
- thePropNames[ theIndex ].name = nullptr;
-
- {
- osl::Guard< osl::Mutex > theGlobalGuard(getGlobalNeonMutex());
- nError = ne_simple_propfind( inSession,
- inPath,
- inDepth,
- thePropNames.get(),
- NPFR_propfind_results,
- &ioResources );
- }
-
- for ( theIndex = 0; theIndex < thePropCount; theIndex ++ )
- free( const_cast<char *>(thePropNames[ theIndex ].name) );
- }
- else
- {
- // ALLPROP
- osl::Guard< osl::Mutex > theGlobalGuard(getGlobalNeonMutex());
- nError = ne_simple_propfind( inSession,
- inPath,
- inDepth,
- nullptr, // 0 == allprop
- NPFR_propfind_results,
- &ioResources );
- }
-
- // #87585# - Sometimes neon lies (because some servers lie).
- if ( ( nError == NE_OK ) && ioResources.empty() )
- nError = NE_ERROR;
-}
-
-NeonPropFindRequest::NeonPropFindRequest(
- HttpSession* inSession,
- const char* inPath,
- const Depth inDepth,
- std::vector< DAVResourceInfo > & ioResInfo,
- int & nError )
-{
- {
- osl::Guard< osl::Mutex > theGlobalGuard(getGlobalNeonMutex());
- nError = ne_propnames( inSession,
- inPath,
- inDepth,
- NPFR_propnames_results,
- &ioResInfo );
- }
-
- // #87585# - Sometimes neon lies (because some servers lie).
- if ( ( nError == NE_OK ) && ioResInfo.empty() )
- nError = NE_ERROR;
-}
-
-NeonPropFindRequest::~NeonPropFindRequest( )
-{
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/NeonPropFindRequest.hxx b/ucb/source/ucp/webdav-neon/NeonPropFindRequest.hxx
deleted file mode 100644
index b1a2d2b69b16..000000000000
--- a/ucb/source/ucp/webdav-neon/NeonPropFindRequest.hxx
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <vector>
-#include <rtl/ustring.hxx>
-#include "NeonTypes.hxx"
-#include "DAVTypes.hxx"
-#include "DAVResource.hxx"
-
-namespace webdav_ucp
-{
-
-class NeonPropFindRequest
-{
-public:
- // named / allprop
- NeonPropFindRequest( HttpSession* inSession,
- const char* inPath,
- const Depth inDepth,
- const std::vector< OUString > & inPropNames,
- std::vector< DAVResource > & ioResources,
- int & nError );
- // propnames
- NeonPropFindRequest( HttpSession* inSession,
- const char* inPath,
- const Depth inDepth,
- std::vector< DAVResourceInfo > & ioResInfo,
- int & nError );
-
- ~NeonPropFindRequest();
-};
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/NeonSession.cxx b/ucb/source/ucp/webdav-neon/NeonSession.cxx
deleted file mode 100644
index f08e41a4646f..000000000000
--- a/ucb/source/ucp/webdav-neon/NeonSession.cxx
+++ /dev/null
@@ -1,2359 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-
-#include <unordered_map>
-#include <vector>
-#include <string.h>
-#include <sal/log.hxx>
-#include <osl/diagnose.h>
-#include <osl/thread.h>
-#include <osl/time.h>
-#include <ne_socket.h>
-#include <ne_auth.h>
-#include <ne_redirect.h>
-#include <ne_ssl.h>
-
-// old neon versions forgot to set this
-extern "C" {
-#include <ne_compress.h>
-}
-
-#include <libxml/parser.h>
-#include <comphelper/sequence.hxx>
-#include <ucbhelper/simplecertificatevalidationrequest.hxx>
-
-#include "DAVAuthListener.hxx"
-#include "NeonTypes.hxx"
-#include "NeonSession.hxx"
-#include "NeonInputStream.hxx"
-#include "NeonPropFindRequest.hxx"
-#include "NeonHeadRequest.hxx"
-#include "NeonUri.hxx"
-#include "LinkSequence.hxx"
-#include "UCBDeadPropertyValue.hxx"
-
-#include <officecfg/Inet.hxx>
-#include <com/sun/star/io/BufferSizeExceededException.hpp>
-#include <com/sun/star/io/IOException.hpp>
-#include <com/sun/star/io/NotConnectedException.hpp>
-#include <com/sun/star/xml/crypto/XSecurityEnvironment.hpp>
-#include <com/sun/star/security/XCertificate.hpp>
-#include <com/sun/star/security/CertificateValidity.hpp>
-#include <com/sun/star/security/CertificateContainerStatus.hpp>
-#include <com/sun/star/security/CertificateContainer.hpp>
-#include <com/sun/star/security/XCertificateContainer.hpp>
-#include <com/sun/star/ucb/Lock.hpp>
-#include <com/sun/star/beans/NamedValue.hpp>
-#include <com/sun/star/xml/crypto/SEInitializer.hpp>
-
-
-using namespace com::sun::star;
-using namespace webdav_ucp;
-
-#ifndef EOL
-# define EOL "\r\n"
-#endif
-
-namespace {
-
-struct RequestData
-{
- // POST
- OUString aContentType;
- OUString aReferer;
-
- RequestData() {}
- RequestData( const OUString & rContentType,
- const OUString & rReferer )
- : aContentType( rContentType ), aReferer( rReferer ) {}
-};
-
-struct equalPtr
-{
- bool operator()( const ne_request* p1, const ne_request* p2 ) const
- {
- return p1 == p2;
- }
-};
-
-struct hashPtr
-{
- size_t operator()( const ne_request* p ) const
- {
- return reinterpret_cast<size_t>(p);
- }
-};
-
-}
-
-typedef std::unordered_map
-<
- ne_request*,
- RequestData,
- hashPtr,
- equalPtr
->
-RequestDataMap;
-
-static sal_uInt16 makeStatusCode( const OUString & rStatusText )
-{
- // Extract status code from session error string. Unfortunately
- // neon provides no direct access to the status code...
-
- if ( rStatusText.getLength() < 3 )
- {
- SAL_WARN( "ucb.ucp.webdav", "makeStatusCode - status text string to short!" );
- return 0;
- }
-
- sal_Int32 nPos = rStatusText.indexOf( ' ' );
- if ( nPos == -1 )
- {
- SAL_WARN( "ucb.ucp.webdav", "makeStatusCode - wrong status text format!" );
- return 0;
- }
-
- return sal_uInt16( rStatusText.copy( 0, nPos ).toInt32() );
-}
-
-static bool noKeepAlive( const uno::Sequence< beans::NamedValue >& rFlags )
-{
- if ( !rFlags.hasElements() )
- return false;
-
- // find "KeepAlive" property
- const beans::NamedValue* pValue(
- std::find_if(rFlags.begin(), rFlags.end(),
- [] (beans::NamedValue const& rNV) { return rNV.Name == "KeepAlive"; } ));
- return pValue != rFlags.end() && !pValue->Value.get<bool>();
-}
-
-namespace {
-
-struct NeonRequestContext
-{
- uno::Reference< io::XOutputStream > xOutputStream;
- rtl::Reference< NeonInputStream > xInputStream;
- const std::vector< OUString > * pHeaderNames;
- DAVResource * pResource;
-
- explicit NeonRequestContext( uno::Reference< io::XOutputStream > const & xOutStrm )
- : xOutputStream( xOutStrm ),
- pHeaderNames( nullptr ), pResource( nullptr ) {}
-
- explicit NeonRequestContext( const rtl::Reference< NeonInputStream > & xInStrm )
- : xInputStream( xInStrm ),
- pHeaderNames( nullptr ), pResource( nullptr ) {}
-
- NeonRequestContext( uno::Reference< io::XOutputStream > const & xOutStrm,
- const std::vector< OUString > & inHeaderNames,
- DAVResource & ioResource )
- : xOutputStream( xOutStrm ),
- pHeaderNames( &inHeaderNames ), pResource( &ioResource ) {}
-
- NeonRequestContext( const rtl::Reference< NeonInputStream > & xInStrm,
- const std::vector< OUString > & inHeaderNames,
- DAVResource & ioResource )
- : xInputStream( xInStrm ),
- pHeaderNames( &inHeaderNames ), pResource( &ioResource ) {}
-
- void ResponseBlockReader(const char * inBuf, size_t inLen)
- {
- if (xInputStream.is())
- xInputStream->AddToStream( inBuf, inLen );
- }
-
- void ResponseBlockWriter(const char * inBuf, size_t inLen)
- {
- if (xOutputStream.is())
- {
- const uno::Sequence< sal_Int8 > aSeq( reinterpret_cast<sal_Int8 const *>(inBuf), inLen );
- xOutputStream->writeBytes( aSeq );
- }
- }
-
-};
-
-}
-
-// A simple Neon response_block_reader for use with an XInputStream
-extern "C" {
-
-static int NeonSession_ResponseBlockReader(void * inUserData,
- const char * inBuf,
- size_t inLen )
-{
- // neon sometimes calls this function with (inLen == 0)...
- if ( inLen > 0 )
- {
- NeonRequestContext * pCtx = static_cast<NeonRequestContext*>(inUserData);
- pCtx->ResponseBlockReader(inBuf, inLen);
- }
- return 0;
-}
-
-// A simple Neon response_block_reader for use with an XOutputStream
-static int NeonSession_ResponseBlockWriter( void * inUserData,
- const char * inBuf,
- size_t inLen )
-{
- // neon calls this function with (inLen == 0)...
- if ( inLen > 0 )
- {
- NeonRequestContext * pCtx = static_cast<NeonRequestContext*>(inUserData);
- pCtx->ResponseBlockWriter(inBuf, inLen);
- }
- return 0;
-}
-
-static int NeonSession_NeonAuth( void * inUserData,
-#if defined NE_FEATURE_SSPI && ! defined SYSTEM_NEON
- const char * inAuthProtocol,
-#endif
- const char * inRealm,
- int attempt,
- char * inoutUserName,
- char * inoutPassWord )
-{
-/* The callback used to request the username and password in the given
- * realm. The username and password must be copied into the buffers
- * which are both of size NE_ABUFSIZ. The 'attempt' parameter is zero
- * on the first call to the callback, and increases by one each time
- * an attempt to authenticate fails.
- *
- * The callback must return zero to indicate that authentication
- * should be attempted with the username/password, or non-zero to
- * cancel the request. (if non-zero, username and password are
- * ignored.) */
-
- NeonSession * theSession = static_cast<NeonSession*>(inUserData);
- const char * pAuthProtocol;
-#if defined NE_FEATURE_SSPI && ! defined SYSTEM_NEON
- pAuthProtocol = inAuthProtocol;
-#else
- pAuthProtocol = nullptr;
-#endif
- return theSession->NeonAuth(pAuthProtocol, inRealm, attempt, inoutUserName, inoutPassWord);
-}
-
-}
-
-int NeonSession::NeonAuth(const char* inAuthProtocol, const char* inRealm,
- int attempt, char* inoutUserName, char * inoutPassWord)
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
-
-/* The callback used to request the username and password in the given
- * realm. The username and password must be copied into the buffers
- * which are both of size NE_ABUFSIZ. The 'attempt' parameter is zero
- * on the first call to the callback, and increases by one each time
- * an attempt to authenticate fails.
- *
- * The callback must return zero to indicate that authentication
- * should be attempted with the username/password, or non-zero to
- * cancel the request. (if non-zero, username and password are
- * ignored.) */
-
- DAVAuthListener * pListener
- = getRequestEnvironment().m_xAuthListener.get();
- if ( !pListener )
- {
- // abort
- return -1;
- }
- OUString theUserName;
- OUString thePassWord;
-
- if ( attempt == 0 )
- {
- // neon does not handle username supplied with request URI (for
- // instance when doing FTP over proxy - last checked: 0.23.5 )
-
- try
- {
- NeonUri uri( getRequestEnvironment().m_aRequestURI );
- const OUString& aUserInfo( uri.GetUserInfo() );
- if ( !aUserInfo.isEmpty() )
- {
- sal_Int32 nPos = aUserInfo.indexOf( '@' );
- if ( nPos == -1 )
- {
- theUserName = aUserInfo;
- }
- else
- {
- theUserName = aUserInfo.copy( 0, nPos );
- thePassWord = aUserInfo.copy( nPos + 1 );
- }
- }
- }
- catch ( DAVException const & )
- {
- // abort
- return -1;
- }
- }
- else
- {
- // username buffer is prefilled with user name from last attempt.
- theUserName = OUString::createFromAscii( inoutUserName );
- // @@@ Neon does not initialize password buffer (last checked: 0.22.0).
- //thePassWord = OUString::createFromAscii( inoutPassWord );
- }
-
-#if defined NE_FEATURE_SSPI && ! defined SYSTEM_NEON
- const bool bCanUseSystemCreds
- = (attempt == 0) && // avoid endless loops
- ne_has_support( NE_FEATURE_SSPI ) && // Windows-only feature.
- ( ( ne_strcasecmp( inAuthProtocol, "NTLM" ) == 0 ) ||
- ( ne_strcasecmp( inAuthProtocol, "Negotiate" ) == 0 ) );
-#else
- (void)inAuthProtocol;
- const bool bCanUseSystemCreds = false;
-#endif
-
- int theRetVal = pListener->authenticate(
- OUString::createFromAscii( inRealm ),
- getHostName(),
- theUserName,
- thePassWord,
- bCanUseSystemCreds);
-
- OString aUser( OUStringToOString( theUserName, RTL_TEXTENCODING_UTF8 ) );
- if ( aUser.getLength() > ( NE_ABUFSIZ - 1 ) )
- {
- SAL_WARN( "ucb.ucp.webdav", "NeonSession_NeonAuth - username too long!" );
- return -1;
- }
-
- OString aPass( OUStringToOString( thePassWord, RTL_TEXTENCODING_UTF8 ) );
- if ( aPass.getLength() > ( NE_ABUFSIZ - 1 ) )
- {
- SAL_WARN( "ucb.ucp.webdav", "NeonSession_NeonAuth - password too long!" );
- return -1;
- }
-
- // #100211# - checked
- strcpy( inoutUserName, aUser.getStr() );
- strcpy( inoutPassWord, aPass.getStr() );
-
- return theRetVal;
-}
-
-namespace {
- OUString GetHostnamePart( const OUString& _rRawString )
- {
- OUString sPart;
- OUString sPartId("CN=");
- sal_Int32 nContStart = _rRawString.indexOf( sPartId );
- if ( nContStart != -1 )
- {
- nContStart += sPartId.getLength();
- sal_Int32 nContEnd = _rRawString.indexOf( ',', nContStart );
- sPart = nContEnd != -1 ?
- _rRawString.copy(nContStart, nContEnd - nContStart) :
- _rRawString.copy(nContStart);
- }
- return sPart;
- }
-} // namespace
-
-extern "C" {
-
-static int NeonSession_CertificationNotify( void *userdata,
- int,
- const ne_ssl_certificate *cert )
-{
- NeonSession * pSession = static_cast< NeonSession * >( userdata );
- return pSession->CertificationNotify(cert);
-}
-
-}
-
-int NeonSession::CertificationNotify(const ne_ssl_certificate *cert)
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
-
- OSL_ASSERT( cert );
-
- uno::Reference< security::XCertificateContainer > xCertificateContainer;
- try
- {
- xCertificateContainer = security::CertificateContainer::create( getComponentContext() );
- }
- catch ( uno::Exception const & )
- {
- }
-
- if ( !xCertificateContainer.is() )
- return 1;
-
- char * dn = ne_ssl_readable_dname( ne_ssl_cert_subject( cert ) );
- OUString cert_subject( dn, strlen( dn ), RTL_TEXTENCODING_UTF8, 0 );
-
- ne_free( dn );
-
- security::CertificateContainerStatus certificateContainer(
- xCertificateContainer->hasCertificate(
- getHostName(), cert_subject ) );
-
- if ( certificateContainer != security::CertificateContainerStatus_NOCERT )
- return
- certificateContainer == security::CertificateContainerStatus_TRUSTED
- ? 0
- : 1;
-
- uno::Reference< xml::crypto::XSEInitializer > xSEInitializer;
- try
- {
- xSEInitializer = xml::crypto::SEInitializer::create( getComponentContext() );
- }
- catch ( uno::Exception const & )
- {
- }
-
- if ( !xSEInitializer.is() )
- return 1;
-
- uno::Reference< xml::crypto::XXMLSecurityContext > xSecurityContext(
- xSEInitializer->createSecurityContext( OUString() ) );
-
- uno::Reference< xml::crypto::XSecurityEnvironment > xSecurityEnv(
- xSecurityContext->getSecurityEnvironment() );
-
- //The end entity certificate
- char * eeCertB64 = ne_ssl_cert_export( cert );
-
- OString sEECertB64( eeCertB64 );
-
- uno::Reference< security::XCertificate > xEECert(
- xSecurityEnv->createCertificateFromAscii(
- OStringToOUString( sEECertB64, RTL_TEXTENCODING_ASCII_US ) ) );
-
- ne_free( eeCertB64 );
- eeCertB64 = nullptr;
-
- std::vector< uno::Reference< security::XCertificate > > vecCerts;
- const ne_ssl_certificate * issuerCert = cert;
- do
- {
- //get the intermediate certificate
- //the returned value is const ! Therefore it does not need to be freed
- //with ne_ssl_cert_free, which takes a non-const argument
- issuerCert = ne_ssl_cert_signedby( issuerCert );
- if ( nullptr == issuerCert )
- break;
-
- char * imCertB64 = ne_ssl_cert_export( issuerCert );
- OString sInterMediateCertB64( imCertB64 );
- ne_free( imCertB64 );
-
- uno::Reference< security::XCertificate> xImCert(
- xSecurityEnv->createCertificateFromAscii(
- OStringToOUString( sInterMediateCertB64, RTL_TEXTENCODING_ASCII_US ) ) );
- if ( xImCert.is() )
- vecCerts.push_back( xImCert );
- }
- while ( true );
-
- sal_Int64 certValidity = xSecurityEnv->verifyCertificate( xEECert,
- ::comphelper::containerToSequence( vecCerts ) );
-
- if ( isDomainMatch(
- GetHostnamePart( xEECert->getSubjectName() ) ) )
- {
- // if host name matched with certificate then look if the
- // certificate was ok
- if( certValidity == security::CertificateValidity::VALID )
- return 0;
- }
-
- const uno::Reference< ucb::XCommandEnvironment > xEnv(
- getRequestEnvironment().m_xEnv );
- if ( xEnv.is() )
- {
- uno::Reference< task::XInteractionHandler > xIH(
- xEnv->getInteractionHandler() );
- if ( xIH.is() )
- {
- rtl::Reference< ucbhelper::SimpleCertificateValidationRequest >
- xRequest( new ucbhelper::SimpleCertificateValidationRequest(
- static_cast<sal_Int32>(certValidity), xEECert, getHostName() ) );
- xIH->handle( xRequest );
-
- rtl::Reference< ucbhelper::InteractionContinuation > xSelection
- = xRequest->getSelection();
-
- if ( xSelection.is() )
- {
- uno::Reference< task::XInteractionApprove > xApprove(
- xSelection.get(), uno::UNO_QUERY );
- if ( xApprove.is() )
- {
- xCertificateContainer->addCertificate(
- getHostName(), cert_subject, true );
- return 0;
- }
- else
- {
- // Don't trust cert
- xCertificateContainer->addCertificate(
- getHostName(), cert_subject, false );
- return 1;
- }
- }
- }
- else
- {
- // Don't trust cert
- xCertificateContainer->addCertificate(
- getHostName(), cert_subject, false );
- return 1;
- }
- }
- return 1;
-}
-
-extern "C" {
-
-static void NeonSession_PreSendRequest( ne_request * req,
- void * userdata,
- ne_buffer * headers )
-{
- // userdata -> value returned by 'create'
- NeonSession * pSession = static_cast< NeonSession * >( userdata );
- if (!pSession)
- return;
- pSession->PreSendRequest(req, headers);
-}
-
-}
-
-void NeonSession::PreSendRequest(ne_request* req, ne_buffer* headers)
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
-
- // If there is a proxy server in between, it shall never use
- // cached data. We always want 'up-to-date' data.
- ne_buffer_concat( headers, "Pragma: no-cache", EOL, nullptr );
- // alternative, but understood by HTTP 1.1 servers only:
- // ne_buffer_concat( headers, "Cache-Control: max-age=0", EOL, NULL );
-
- const RequestDataMap * pRequestData
- = static_cast< const RequestDataMap* >(
- getRequestData() );
-
- RequestDataMap::const_iterator it = pRequestData->find( req );
- if ( it != pRequestData->end() )
- {
- if ( !(*it).second.aContentType.isEmpty() )
- {
- char * pData = headers->data;
- if ( strstr( pData, "Content-Type:" ) == nullptr )
- {
- OString aType
- = OUStringToOString( (*it).second.aContentType,
- RTL_TEXTENCODING_UTF8 );
- ne_buffer_concat( headers, "Content-Type: ",
- aType.getStr(), EOL, nullptr );
- }
- }
-
- if ( !(*it).second.aReferer.isEmpty() )
- {
- char * pData = headers->data;
- if ( strstr( pData, "Referer:" ) == nullptr )
- {
- OString aReferer
- = OUStringToOString( (*it).second.aReferer,
- RTL_TEXTENCODING_UTF8 );
- ne_buffer_concat( headers, "Referer: ",
- aReferer.getStr(), EOL, nullptr );
- }
- }
- }
-
- const DAVRequestHeaders & rHeaders
- = getRequestEnvironment().m_aRequestHeaders;
-
- for ( const auto& rHeader : rHeaders )
- {
- OString aHeader
- = OUStringToOString( rHeader.first,
- RTL_TEXTENCODING_UTF8 );
- OString aValue
- = OUStringToOString( rHeader.second,
- RTL_TEXTENCODING_UTF8 );
- ne_buffer_concat( headers, aHeader.getStr(), ": ",
- aValue.getStr(), EOL, nullptr );
- }
-}
-
-//See https://bugzilla.redhat.com/show_bug.cgi?id=544619#c4
-//neon is threadsafe, but uses gnutls which is only thread-safe
-//if initialized to be thread-safe. cups, unfortunately, generally
-//initializes it first, and as non-thread-safe, leaving the entire
-//stack unsafe
-namespace webdav_ucp
-{
- osl::Mutex& getGlobalNeonMutex()
- {
- static osl::Mutex aMutex;
- return aMutex;
- }
-}
-
-// static members
-bool NeonSession::m_bGlobalsInited = false;
-NeonLockStore NeonSession::m_aNeonLockStore;
-
-NeonSession::NeonSession( const rtl::Reference< DAVSessionFactory > & rSessionFactory,
- const OUString& inUri,
- const uno::Sequence< beans::NamedValue >& rFlags,
- const ucbhelper::InternetProxyDecider & rProxyDecider )
- : DAVSession( rSessionFactory )
- , m_nProxyPort( 0 )
- , m_aFlags( rFlags )
- , m_pHttpSession( nullptr )
- , m_pRequestData( new RequestDataMap )
- , m_rProxyDecider( rProxyDecider )
-{
- NeonUri theUri( inUri );
- m_aScheme = theUri.GetScheme();
- m_aHostName = theUri.GetHost();
- m_nPort = theUri.GetPort();
- SAL_INFO( "ucb.ucp.webdav", "NeonSession ctor - URL <" << inUri << ">" );
-}
-
-NeonSession::~NeonSession( )
-{
- if ( m_pHttpSession )
- {
- {
- osl::Guard< osl::Mutex > theGlobalGuard(getGlobalNeonMutex());
- ne_session_destroy( m_pHttpSession );
- }
- m_pHttpSession = nullptr;
- }
- delete static_cast< RequestDataMap * >( m_pRequestData );
-}
-
-void NeonSession::Init( const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- m_aEnv = rEnv;
- Init();
-}
-
-void NeonSession::Init()
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
-
- bool bCreateNewSession = m_bNeedNewSession;
- m_bNeedNewSession = false;
-
- if ( m_pHttpSession == nullptr )
- {
- // Ensure that Neon sockets are initialized
- osl::Guard< osl::Mutex > theGlobalGuard(getGlobalNeonMutex());
- if (!m_bGlobalsInited )
- {
- if ( ne_sock_init() != 0 )
- throw DAVException( DAVException::DAV_SESSION_CREATE,
- NeonUri::makeConnectionEndPointString(
- m_aHostName, m_nPort ) );
-
- // #122205# - libxml2 needs to be initialized once if used by
- // multithreaded programs like OOo.
- xmlInitParser();
-#if OSL_DEBUG_LEVEL > 0
- // for more debug flags see ne_utils.h; NE_DEBUGGING must be defined
- // while compiling neon in order to actually activate neon debug
- // output.
- ne_debug_init( stderr, NE_DBG_FLUSH
- | NE_DBG_HTTP
- // | NE_DBG_HTTPBODY
- // | NE_DBG_HTTPAUTH
- // | NE_DBG_XML
- // | NE_DBG_XMLPARSE
- | NE_DBG_LOCKS
- | NE_DBG_SSL
- );
-#endif
- m_bGlobalsInited = true;
- }
-
- const ucbhelper::InternetProxyServer & rProxyCfg = getProxySettings();
-
- m_aProxyName = rProxyCfg.aName;
- m_nProxyPort = rProxyCfg.nPort;
-
- // Not yet initialized. Create new session.
- bCreateNewSession = true;
- }
- else
- {
- // #112271# Check whether proxy settings are still valid (They may
- // change at any time). If not, create new Neon session.
-
- const ucbhelper::InternetProxyServer & rProxyCfg = getProxySettings();
-
- if ( ( rProxyCfg.aName != m_aProxyName )
- || ( rProxyCfg.nPort != m_nProxyPort ) )
- {
- m_aProxyName = rProxyCfg.aName;
- m_nProxyPort = rProxyCfg.nPort;
-
- bCreateNewSession = true;
- }
-
- if (bCreateNewSession)
- {
- // new session needed, destroy old first
- {
- osl::Guard< osl::Mutex > theGlobalGuard(getGlobalNeonMutex());
- ne_session_destroy( m_pHttpSession );
- }
- m_pHttpSession = nullptr;
- }
- }
-
- if ( !bCreateNewSession )
- return;
-
- const sal_Int32 nConnectTimeoutMax = 180;
- const sal_Int32 nConnectTimeoutMin = 2;
- const sal_Int32 nReadTimeoutMax = 180;
- const sal_Int32 nReadTimeoutMin = 20;
-
- // @@@ For FTP over HTTP proxy inUserInfo is needed to be able to
- // build the complete request URI (including user:pass), but
- // currently (0.22.0) neon does not allow to pass the user info
- // to the session
-
- {
- osl::Guard< osl::Mutex > theGlobalGuard(getGlobalNeonMutex());
- m_pHttpSession = ne_session_create(
- OUStringToOString( m_aScheme, RTL_TEXTENCODING_UTF8 ).getStr(),
- /* theUri.GetUserInfo(),
- @@@ for FTP via HTTP proxy, but not supported by Neon */
- OUStringToOString( m_aHostName, RTL_TEXTENCODING_UTF8 ).getStr(),
- m_nPort );
- }
-
- if ( m_pHttpSession == nullptr )
- throw DAVException( DAVException::DAV_SESSION_CREATE,
- NeonUri::makeConnectionEndPointString(
- m_aHostName, m_nPort ) );
-
- // Register the session with the lock store
- m_aNeonLockStore.registerSession( m_pHttpSession );
-
- if ( m_aScheme.equalsIgnoreAsciiCase("https") )
- {
- // Set a failure callback for certificate check
- ne_ssl_set_verify(
- m_pHttpSession, NeonSession_CertificationNotify, this);
-
- // Tell Neon to tell the SSL library used (OpenSSL or
- // GnuTLS, I guess) to use a default set of root
- // certificates.
- ne_ssl_trust_default_ca(m_pHttpSession);
- }
-
- // Add hooks (i.e. for adding additional headers to the request)
- ne_hook_pre_send( m_pHttpSession, NeonSession_PreSendRequest, this );
-
- if ( !m_aProxyName.isEmpty() )
- {
- ne_session_proxy( m_pHttpSession,
- OUStringToOString(
- m_aProxyName,
- RTL_TEXTENCODING_UTF8 ).getStr(),
- m_nProxyPort );
- }
-
- // avoid KeepAlive?
- if ( noKeepAlive(m_aFlags) )
- ne_set_session_flag( m_pHttpSession, NE_SESSFLAG_PERSIST, 0 );
-
- // Register for redirects.
- ne_redirect_register( m_pHttpSession );
-
- // authentication callbacks.
- ne_add_server_auth( m_pHttpSession, NE_AUTH_ALL, NeonSession_NeonAuth, this );
- ne_add_proxy_auth ( m_pHttpSession, NE_AUTH_ALL, NeonSession_NeonAuth, this );
-
- // set timeout to connect
- // if connect_timeout is not set, neon returns NE_CONNECT when the TCP socket default
- // timeout elapses
- // with connect_timeout set neon returns NE_TIMEOUT if elapsed when the connection
- // didn't succeed
- // grab it from configuration
- uno::Reference< uno::XComponentContext > rContext = m_xFactory->getComponentContext();
-
- // set the timeout (in seconds) used when making a connection
- sal_Int32 nConnectTimeout = officecfg::Inet::Settings::ConnectTimeout::get( rContext );
- ne_set_connect_timeout( m_pHttpSession,
- std::max( nConnectTimeoutMin,
- std::min( nConnectTimeout, nConnectTimeoutMax ) ) );
-
- // provides a read time out facility as well
- // set the timeout (in seconds) used when reading from a socket.
- sal_Int32 nReadTimeout = officecfg::Inet::Settings::ReadTimeout::get( rContext );
- ne_set_read_timeout( m_pHttpSession,
- std::max( nReadTimeoutMin,
- std::min( nReadTimeout, nReadTimeoutMax ) ) );
-
- ne_set_session_flag(m_pHttpSession, NE_SESSFLAG_SHAREPOINT, 1);
-}
-
-bool NeonSession::CanUse( const OUString & inUri,
- const uno::Sequence< beans::NamedValue >& rFlags )
-{
- try
- {
- NeonUri theUri( inUri );
- if ( ( theUri.GetPort() == m_nPort ) &&
- ( theUri.GetHost() == m_aHostName ) &&
- ( theUri.GetScheme() == m_aScheme ) &&
- ( rFlags == m_aFlags ) )
- return true;
- }
- catch ( DAVException const & )
- {
- return false;
- }
- return false;
-}
-
-bool NeonSession::UsesProxy()
-{
- Init();
- return !m_aProxyName.isEmpty() ;
-}
-
-void NeonSession::OPTIONS( const OUString & inPath,
- DAVOptions & rOptions, // contains the name+values of every header
- const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
-
- SAL_INFO( "ucb.ucp.webdav", "OPTIONS - relative URL <" << inPath << ">" );
-
- rOptions.init();
-
- Init( rEnv );
- int theRetVal;
-
- ne_request *req = ne_request_create(m_pHttpSession, "OPTIONS", OUStringToOString(
- inPath, RTL_TEXTENCODING_UTF8 ).getStr());
- {
- osl::Guard< osl::Mutex > theGlobalGuard(getGlobalNeonMutex());
- theRetVal = ne_request_dispatch(req);
- }
-
- //check if http error is in the 200 class (no error)
- if (theRetVal == NE_OK && ne_get_status(req)->klass != 2) {
- theRetVal = NE_ERROR;
- }
-
- if ( theRetVal == NE_OK )
- {
- void *cursor = nullptr;
- const char *name, *value;
- while ( ( cursor = ne_response_header_iterate(
- req, cursor, &name, &value ) ) != nullptr )
- {
- OUString aHeaderName(OUString(name, strlen(name), RTL_TEXTENCODING_ASCII_US).toAsciiLowerCase());
- OUString aHeaderValue(value, strlen(value), RTL_TEXTENCODING_ASCII_US);
-
- // display the single header
- SAL_INFO( "ucb.ucp.webdav", "OPTIONS - received header: " << aHeaderName << ":" << aHeaderValue );
-
- if ( aHeaderName == "allow" )
- {
- rOptions.setAllowedMethods( aHeaderValue );
- }
- else if ( aHeaderName == "dav" )
- {
- // check type of dav capability
- // need to parse the value, token separator: ","
- // see <http://tools.ietf.org/html/rfc4918#section-10.1>,
- // <http://tools.ietf.org/html/rfc4918#section-18>,
- // and <http://tools.ietf.org/html/rfc7230#section-3.2>
- // we detect the class (1, 2 and 3), other elements (token, URL)
- // are not used for now
- // silly parser written using OUString, not very efficient
- // but quick and easy to write...
- sal_Int32 nFromIndex = 0;
- sal_Int32 nNextIndex = 0;
- while( ( nNextIndex = aHeaderValue.indexOf( ",", nFromIndex ) ) != -1 )
- { // found a comma
- // try to convert from nFromIndex to nNextIndex -1 in a number
- // if this is 1 or 2 or 3, use for class setting
- sal_Int32 nClass =
- aHeaderValue.copy( nFromIndex, nNextIndex - nFromIndex ).toInt32();
- switch( nClass )
- {
- case 1:
- rOptions.setClass1();
- break;
- case 2:
- rOptions.setClass2();
- break;
- case 3:
- rOptions.setClass3();
- break;
- default:
- ;
- }
- // next starting point
- nFromIndex = nNextIndex + 1;
- }
- // check for last fragment
- if ( nFromIndex < aHeaderValue.getLength() )
- {
- sal_Int32 nClass = aHeaderValue.copy( nFromIndex ).toInt32();
- switch( nClass )
- {
- case 1:
- rOptions.setClass1();
- break;
- case 2:
- rOptions.setClass2();
- break;
- case 3:
- rOptions.setClass3();
- break;
- default:
- ;
- }
- }
- }
- }
- // if applicable, check for lock state:
- if( rOptions.isClass2() || rOptions.isClass3() )
- {
- //dav with lock possible, check for locked state
- if ( m_aNeonLockStore.findByUri(
- makeAbsoluteURL( inPath ) ) != nullptr )
- {
- // we own a lock for this URL,
- // set locked state
- rOptions.setLocked();
- }
- }
- }
-
- ne_request_destroy(req);
-
- HandleError( theRetVal, inPath, rEnv );
-}
-
-void NeonSession::PROPFIND( const OUString & inPath,
- const Depth inDepth,
- const std::vector< OUString > & inPropNames,
- std::vector< DAVResource > & ioResources,
- const DAVRequestEnvironment & rEnv )
-{
-
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
-
-#if defined SAL_LOG_INFO
- { //debug
- SAL_INFO( "ucb.ucp.webdav", "PROPFIND - relative URL: <" << inPath << "> Depth: " << inDepth );
- for(const auto& rPropName : inPropNames)
- {
- SAL_INFO( "ucb.ucp.webdav", "PROPFIND - property requested: " << rPropName );
- }
- } //debug
-#endif
-
- Init( rEnv );
-
- int theRetVal = NE_OK;
- NeonPropFindRequest theRequest( m_pHttpSession,
- OUStringToOString(
- inPath, RTL_TEXTENCODING_UTF8 ).getStr(),
- inDepth,
- inPropNames,
- ioResources,
- theRetVal );
-
- HandleError( theRetVal, inPath, rEnv );
-}
-
-void NeonSession::PROPFIND( const OUString & inPath,
- const Depth inDepth,
- std::vector< DAVResourceInfo > & ioResInfo,
- const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- SAL_INFO( "ucb.ucp.webdav", "PROPFIND - relative URL: <" << inPath << "> Depth: " << inDepth );
-
- Init( rEnv );
-
- int theRetVal = NE_OK;
- NeonPropFindRequest theRequest( m_pHttpSession,
- OUStringToOString(
- inPath, RTL_TEXTENCODING_UTF8 ).getStr(),
- inDepth,
- ioResInfo,
- theRetVal );
-
-#if defined SAL_LOG_INFO
- { //debug
- for ( const auto& rResInfo : ioResInfo )
- {
- for ( const auto& rProp : rResInfo.properties )
- {
- SAL_INFO( "ucb.ucp.webdav", "PROPFIND - returned property (name only): " << rProp );
- }
- }
- } //debug
-#endif
-
- HandleError( theRetVal, inPath, rEnv );
-}
-
-void NeonSession::PROPPATCH( const OUString & inPath,
- const std::vector< ProppatchValue > & inValues,
- const DAVRequestEnvironment & rEnv )
-{
- SAL_INFO( "ucb.ucp.webdav", "PROPPATCH - relative URL <" << inPath << ">" );
-
- /* @@@ Which standard live properties can be set by the client?
- This is a known WebDAV RFC issue ( verified: 04/10/2001 )
- --> http://www.ics.uci.edu/pub/ietf/webdav/protocol/issues.html
-
- mod_dav implementation:
-
- creationdate r ( File System prop )
- displayname w
- getcontentlanguage r ( #ifdef DAV_DISABLE_WRITEABLE_PROPS )
- getcontentlength r ( File System prop )
- getcontenttype r ( #ifdef DAV_DISABLE_WRITEABLE_PROPS )
- getetag r ( File System prop )
- getlastmodified r ( File System prop )
- lockdiscovery r
- resourcetype r
- source w
- supportedlock r
- executable w ( #ifndef WIN32 )
-
- All dead properties are of course writable.
- */
-
- int theRetVal = NE_OK;
-
- int n; // for the "for" loop
-
- // Generate the list of properties we want to set.
- int nPropCount = inValues.size();
- std::unique_ptr<ne_proppatch_operation[]> pItems(
- new ne_proppatch_operation[ nPropCount + 1 ]);
- for ( n = 0; n < nPropCount; ++n )
- {
- const ProppatchValue & rValue = inValues[ n ];
-
- // Split fullname into namespace and name!
- ne_propname * pName = new ne_propname;
- DAVProperties::createNeonPropName( rValue.name, *pName );
- pItems[ n ].name = pName;
-
- if ( rValue.operation == PROPSET )
- {
- pItems[ n ].type = ne_propset;
-
- OUString aStringValue;
- if ( DAVProperties::isUCBDeadProperty( *pName ) )
- {
- // DAV dead property added by WebDAV UCP?
- if ( !UCBDeadPropertyValue::toXML( rValue.value,
- aStringValue ) )
- {
- // Error!
- pItems[ n ].value = nullptr;
- theRetVal = NE_ERROR;
- nPropCount = n + 1;
- break;
- }
- }
- else if ( !( rValue.value >>= aStringValue ) )
- {
- // complex properties...
- if ( rValue.name == DAVProperties::SOURCE )
- {
- uno::Sequence< ucb::Link > aLinks;
- if ( rValue.value >>= aLinks )
- {
- LinkSequence::toXML( aLinks, aStringValue );
- }
- else
- {
- // Error!
- pItems[ n ].value = nullptr;
- theRetVal = NE_ERROR;
- nPropCount = n + 1;
- break;
- }
- }
- else
- {
- SAL_WARN( "ucb.ucp.webdav", "PROPPATCH - Unsupported type!" );
- // Error!
- pItems[ n ].value = nullptr;
- theRetVal = NE_ERROR;
- nPropCount = n + 1;
- break;
- }
- }
- pItems[ n ].value
- = strdup( OUStringToOString( aStringValue,
- RTL_TEXTENCODING_UTF8 ).getStr() );
- }
- else
- {
- pItems[ n ].type = ne_propremove;
- pItems[ n ].value = nullptr;
- }
- }
-
- if ( theRetVal == NE_OK )
- {
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
-
- Init( rEnv );
-
- pItems[ n ].name = nullptr;
-
- theRetVal = ne_proppatch( m_pHttpSession,
- OUStringToOString(
- inPath, RTL_TEXTENCODING_UTF8 ).getStr(),
- pItems.get() );
- }
-
- for ( n = 0; n < nPropCount; ++n )
- {
- free( const_cast<char *>(pItems[ n ].name->name) );
- delete pItems[ n ].name;
- free( const_cast<char *>(pItems[ n ].value) );
- }
-
- HandleError( theRetVal, inPath, rEnv );
-}
-
-void NeonSession::HEAD( const OUString & inPath,
- const std::vector< OUString > & inHeaderNames,
- DAVResource & ioResource,
- const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- SAL_INFO( "ucb.ucp.webdav", "HEAD - relative URL <" << inPath << ">" );
-
- Init( rEnv );
-
- int theRetVal = NE_OK;
- NeonHeadRequest theRequest( m_pHttpSession,
- inPath,
- inHeaderNames,
- ioResource,
- theRetVal );
-
- HandleError( theRetVal, inPath, rEnv );
-}
-
-uno::Reference< io::XInputStream >
-NeonSession::GET( const OUString & inPath,
- const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- SAL_INFO( "ucb.ucp.webdav", "GET - relative URL <" << inPath << ">" );
-
- Init( rEnv );
-
- rtl::Reference< NeonInputStream > xInputStream( new NeonInputStream );
- NeonRequestContext aCtx( xInputStream );
- int theRetVal = GET( m_pHttpSession,
- OUStringToOString(
- inPath, RTL_TEXTENCODING_UTF8 ).getStr(),
- NeonSession_ResponseBlockReader,
- false,
- &aCtx );
-
- HandleError( theRetVal, inPath, rEnv );
-
- return xInputStream;
-}
-
-void NeonSession::GET( const OUString & inPath,
- uno::Reference< io::XOutputStream > & ioOutputStream,
- const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- SAL_INFO( "ucb.ucp.webdav", "GET - relative URL <" << inPath << ">" );
-
- Init( rEnv );
-
- NeonRequestContext aCtx( ioOutputStream );
- int theRetVal = GET( m_pHttpSession,
- OUStringToOString(
- inPath, RTL_TEXTENCODING_UTF8 ).getStr(),
- NeonSession_ResponseBlockWriter,
- false,
- &aCtx );
-
- HandleError( theRetVal, inPath, rEnv );
-}
-
-uno::Reference< io::XInputStream >
-NeonSession::GET( const OUString & inPath,
- const std::vector< OUString > & inHeaderNames,
- DAVResource & ioResource,
- const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- SAL_INFO( "ucb.ucp.webdav", "GET - relative URL <" << inPath << ">" );
-
- Init( rEnv );
-
- ioResource.uri = inPath;
- ioResource.properties.clear();
-
- rtl::Reference< NeonInputStream > xInputStream( new NeonInputStream );
- NeonRequestContext aCtx( xInputStream, inHeaderNames, ioResource );
- int theRetVal = GET( m_pHttpSession,
- OUStringToOString(
- inPath, RTL_TEXTENCODING_UTF8 ).getStr(),
- NeonSession_ResponseBlockReader,
- true,
- &aCtx );
-
- HandleError( theRetVal, inPath, rEnv );
-
- return xInputStream;
-}
-
-void NeonSession::GET0( const OUString & inPath,
- const std::vector< OUString > & inHeaderNames,
- DAVResource & ioResource,
- const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- SAL_INFO( "ucb.ucp.webdav", "GET - relative URL <" << inPath << ">" );
-
- Init( rEnv );
-
- ioResource.uri = inPath;
- ioResource.properties.clear();
-
- rtl::Reference< NeonInputStream > xInputStream( new NeonInputStream );
- NeonRequestContext aCtx( xInputStream, inHeaderNames, ioResource );
- int theRetVal = GET0( m_pHttpSession,
- OUStringToOString(
- inPath, RTL_TEXTENCODING_UTF8 ).getStr(),
- true,
- &aCtx );
-
- HandleError( theRetVal, inPath, rEnv );
-}
-
-void NeonSession::GET( const OUString & inPath,
- uno::Reference< io::XOutputStream > & ioOutputStream,
- const std::vector< OUString > & inHeaderNames,
- DAVResource & ioResource,
- const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- SAL_INFO( "ucb.ucp.webdav", "GET - relative URL <" << inPath << ">" );
-
- Init( rEnv );
-
- ioResource.uri = inPath;
- ioResource.properties.clear();
-
- NeonRequestContext aCtx( ioOutputStream, inHeaderNames, ioResource );
- int theRetVal = GET( m_pHttpSession,
- OUStringToOString(
- inPath, RTL_TEXTENCODING_UTF8 ).getStr(),
- NeonSession_ResponseBlockWriter,
- true,
- &aCtx );
-
- HandleError( theRetVal, inPath, rEnv );
-}
-
-void NeonSession::PUT( const OUString & inPath,
- const uno::Reference< io::XInputStream > & inInputStream,
- const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- SAL_INFO( "ucb.ucp.webdav", "PUT - relative URL <" << inPath << ">" );
-
- uno::Sequence< sal_Int8 > aDataToSend;
- if ( !getDataFromInputStream( inInputStream, aDataToSend, false ) )
- throw DAVException( DAVException::DAV_INVALID_ARG );
-
- Init( rEnv );
-
- int theRetVal = PUT( m_pHttpSession,
- OUStringToOString(
- inPath, RTL_TEXTENCODING_UTF8 ).getStr(),
- reinterpret_cast< const char * >(
- aDataToSend.getConstArray() ),
- aDataToSend.getLength() );
-
- HandleError( theRetVal, inPath, rEnv );
-}
-
-uno::Reference< io::XInputStream >
-NeonSession::POST( const OUString & inPath,
- const OUString & rContentType,
- const OUString & rReferer,
- const uno::Reference< io::XInputStream > & inInputStream,
- const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- SAL_INFO( "ucb.ucp.webdav", "POST - relative URL <" << inPath << ">" );
-
- uno::Sequence< sal_Int8 > aDataToSend;
- if ( !getDataFromInputStream( inInputStream, aDataToSend, true ) )
- throw DAVException( DAVException::DAV_INVALID_ARG );
-
- Init( rEnv );
-
- rtl::Reference< NeonInputStream > xInputStream( new NeonInputStream );
- NeonRequestContext aCtx( xInputStream );
- int theRetVal = POST( m_pHttpSession,
- OUStringToOString(
- inPath, RTL_TEXTENCODING_UTF8 ).getStr(),
- reinterpret_cast< const char * >(
- aDataToSend.getConstArray() ),
- NeonSession_ResponseBlockReader,
- &aCtx,
- rContentType,
- rReferer );
-
- HandleError( theRetVal, inPath, rEnv );
-
- return xInputStream;
-}
-
-void NeonSession::POST( const OUString & inPath,
- const OUString & rContentType,
- const OUString & rReferer,
- const uno::Reference< io::XInputStream > & inInputStream,
- uno::Reference< io::XOutputStream > & oOutputStream,
- const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- SAL_INFO( "ucb.ucp.webdav", "POST - relative URL <" << inPath << ">" );
-
- uno::Sequence< sal_Int8 > aDataToSend;
- if ( !getDataFromInputStream( inInputStream, aDataToSend, true ) )
- throw DAVException( DAVException::DAV_INVALID_ARG );
-
- Init( rEnv );
-
- NeonRequestContext aCtx( oOutputStream );
- int theRetVal = POST( m_pHttpSession,
- OUStringToOString(
- inPath, RTL_TEXTENCODING_UTF8 ).getStr(),
- reinterpret_cast< const char * >(
- aDataToSend.getConstArray() ),
- NeonSession_ResponseBlockWriter,
- &aCtx,
- rContentType,
- rReferer );
-
- HandleError( theRetVal, inPath, rEnv );
-}
-
-void NeonSession::MKCOL( const OUString & inPath,
- const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- SAL_INFO( "ucb.ucp.webdav", "MKCOL - relative URL <" << inPath << ">" );
-
- Init( rEnv );
-
- int theRetVal = ne_mkcol( m_pHttpSession,
- OUStringToOString(
- inPath, RTL_TEXTENCODING_UTF8 ).getStr() );
-
- HandleError( theRetVal, inPath, rEnv );
-}
-
-void NeonSession::COPY( const OUString & inSourceURL,
- const OUString & inDestinationURL,
- const DAVRequestEnvironment & rEnv,
- bool inOverWrite )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- SAL_INFO( "ucb.ucp.webdav", "COPY - inSourceURL: "<<inSourceURL<<" inDestinationURL: "<<inDestinationURL);
-
- Init( rEnv );
-
- NeonUri theSourceUri( inSourceURL );
- NeonUri theDestinationUri( inDestinationURL );
-
- int theRetVal = ne_copy( m_pHttpSession,
- inOverWrite ? 1 : 0,
- NE_DEPTH_INFINITE,
- OUStringToOString(
- theSourceUri.GetPath(),
- RTL_TEXTENCODING_UTF8 ).getStr(),
- OUStringToOString(
- theDestinationUri.GetPath(),
- RTL_TEXTENCODING_UTF8 ).getStr() );
-
- HandleError( theRetVal, inSourceURL, rEnv );
-}
-
-void NeonSession::MOVE( const OUString & inSourceURL,
- const OUString & inDestinationURL,
- const DAVRequestEnvironment & rEnv,
- bool inOverWrite )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- SAL_INFO( "ucb.ucp.webdav", "MOVE - inSourceURL: "<<inSourceURL<<" inDestinationURL: "<<inDestinationURL);
-
- Init( rEnv );
-
- NeonUri theSourceUri( inSourceURL );
- NeonUri theDestinationUri( inDestinationURL );
- int theRetVal = ne_move( m_pHttpSession,
- inOverWrite ? 1 : 0,
- OUStringToOString(
- theSourceUri.GetPath(),
- RTL_TEXTENCODING_UTF8 ).getStr(),
- OUStringToOString(
- theDestinationUri.GetPath(),
- RTL_TEXTENCODING_UTF8 ).getStr() );
-
- HandleError( theRetVal, inSourceURL, rEnv );
-}
-
-void NeonSession::DESTROY( const OUString & inPath,
- const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- SAL_INFO( "ucb.ucp.webdav", "DESTROY - relative URL <" << inPath << ">" );
-
- Init( rEnv );
-
- int theRetVal = ne_delete( m_pHttpSession,
- OUStringToOString(
- inPath, RTL_TEXTENCODING_UTF8 ).getStr() );
-
- HandleError( theRetVal, inPath, rEnv );
-}
-
-namespace
-{
- sal_Int32 lastChanceToSendRefreshRequest( TimeValue const & rStart,
- int timeout )
- {
- TimeValue aEnd;
- osl_getSystemTime( &aEnd );
-
- // Try to estimate a safe absolute time for sending the
- // lock refresh request.
- sal_Int32 lastChanceToSendRefreshRequest = -1;
- if ( timeout != NE_TIMEOUT_INFINITE )
- {
- sal_Int32 calltime = aEnd.Seconds - rStart.Seconds;
- if ( calltime <= timeout )
- {
- lastChanceToSendRefreshRequest = rStart.Seconds + timeout;
- }
- else
- {
- SAL_WARN( "ucb.ucp.webdav", "LOCK - no chance to refresh lock before timeout!" );
- }
- }
- return lastChanceToSendRefreshRequest;
- }
-
-} // namespace
-
-// Set new lock
-void NeonSession::LOCK( const OUString & inPath,
- ucb::Lock & rLock,
- const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
- SAL_INFO( "ucb.ucp.webdav", "LOCK (create) - relative URL: <" << inPath << ">" );
-
- // before issuing the lock command,
- // better check first if we already have one on this href
- if ( m_aNeonLockStore.findByUri(
- makeAbsoluteURL( inPath ) ) != nullptr )
- {
- // we already own a lock for this href
- // no need to ask for another
- // TODO: add a lockdiscovery request for confirmation
- // checking the locktoken, the only item that's unique
- return;
- }
-
- Init( rEnv );
-
- /* Create a depth zero, exclusive write lock, with default timeout
- * (allowing a server to pick a default). token, owner and uri are
- * unset. */
- NeonLock * theLock = ne_lock_create();
-
- // Set the lock uri
- ne_uri aUri;
- ne_uri_parse( OUStringToOString( makeAbsoluteURL( inPath ),
- RTL_TEXTENCODING_UTF8 ).getStr(),
- &aUri );
- theLock->uri = aUri;
-
- // Set the lock depth
- switch( rLock.Depth )
- {
- case ucb::LockDepth_ZERO:
- theLock->depth = NE_DEPTH_ZERO;
- break;
- case ucb::LockDepth_ONE:
- theLock->depth = NE_DEPTH_ONE;
- break;
- case ucb::LockDepth_INFINITY:
- theLock->depth = NE_DEPTH_INFINITE;
- break;
- default:
- throw DAVException( DAVException::DAV_INVALID_ARG );
- }
-
- // Set the lock scope
- switch ( rLock.Scope )
- {
- case ucb::LockScope_EXCLUSIVE:
- theLock->scope = ne_lockscope_exclusive;
- break;
- case ucb::LockScope_SHARED:
- theLock->scope = ne_lockscope_shared;
- break;
- default:
- throw DAVException( DAVException::DAV_INVALID_ARG );
- }
-
- // Set the lock timeout
- theLock->timeout = static_cast<long>(rLock.Timeout);
-
- // Set the lock owner
- OUString aValue;
- rLock.Owner >>= aValue;
- theLock->owner =
- ne_strdup( OUStringToOString( aValue,
- RTL_TEXTENCODING_UTF8 ).getStr() );
- TimeValue startCall;
- osl_getSystemTime( &startCall );
-
- int theRetVal = ne_lock( m_pHttpSession, theLock );
-
- if ( theRetVal == NE_OK )
- {
- m_aNeonLockStore.addLock( theLock,
- this,
- lastChanceToSendRefreshRequest(
- startCall, theLock->timeout ) );
-
- uno::Sequence< OUString > aTokens{ OUString::createFromAscii( theLock->token ) };
- rLock.LockTokens = aTokens;
-
- SAL_INFO( "ucb.ucp.webdav", "LOCK (create) - Created lock for <" << makeAbsoluteURL( inPath )
- << "> token: <" << theLock->token << "> timeout: " << theLock->timeout << " sec.");
- }
- else
- {
- ne_lock_destroy( theLock );
-
- SAL_INFO( "ucb.ucp.webdav", "LOCK (create) - Obtaining lock for <"
- << makeAbsoluteURL( inPath ) << " failed!" );
- }
-
- HandleError( theRetVal, inPath, rEnv );
-}
-
-// Refresh existing lock
-bool NeonSession::LOCK( NeonLock * pLock,
- sal_Int32 & rlastChanceToSendRefreshRequest )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
-
-#if defined SAL_LOG_INFO
- {
- char * p = ne_uri_unparse( &(pLock->uri) );
- SAL_INFO( "ucb.ucp.webdav", "LOCK (refresh) - relative URL: <" << p << "> token: <" << pLock->token << ">" );
- ne_free( p );
- }
-#endif
-
- // refresh existing lock.
-
- TimeValue startCall;
- osl_getSystemTime( &startCall );
-
- // save the current requested timeout, because ne_lock_refresh uses
- // pLock->timeout as an out parameter. This prevents a feedback-loop,
- // where we would request a shorter timeout on each refresh.
- long timeout = pLock->timeout;
- const int theRetVal = ne_lock_refresh(m_pHttpSession, pLock);
- if (theRetVal == NE_OK)
- {
- rlastChanceToSendRefreshRequest
- = lastChanceToSendRefreshRequest( startCall, pLock->timeout );
-
- SAL_INFO( "ucb.ucp.webdav", "LOCK (refresh) - Lock successfully refreshed." );
- pLock->timeout = timeout;
- return true;
- }
- else
- {
-#if defined SAL_LOG_WARN
- char * p = ne_uri_unparse( &(pLock->uri) );
- SAL_WARN( "ucb.ucp.webdav", "LOCK (refresh) - not refreshed! Relative URL: <" << p << "> token: <" << pLock->token << ">" );
- ne_free( p );
-#endif
- if (theRetVal == NE_AUTH)
- {
- // tdf#126279: see handling of NE_AUTH in HandleError
- m_bNeedNewSession = true;
- m_aNeonLockStore.removeLockDeferred(pLock);
- }
- return false;
- }
-}
-
-void NeonSession::UNLOCK( const OUString & inPath,
- const DAVRequestEnvironment & rEnv )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
-
- // get the neon lock from lock store
- NeonLock * theLock
- = m_aNeonLockStore.findByUri( makeAbsoluteURL( inPath ) );
- if ( !theLock )
- throw DAVException( DAVException::DAV_NOT_LOCKED );
-
- SAL_INFO( "ucb.ucp.webdav", "UNLOCK - relative URL: <" << inPath << "> token: <" << theLock->token << ">" );
- Init( rEnv );
-
- int theRetVal = ne_unlock( m_pHttpSession, theLock );
-
- if ( theRetVal == NE_OK )
- {
- m_aNeonLockStore.removeLock( theLock );
- ne_lock_destroy( theLock );
- }
- else
- {
- SAL_INFO( "ucb.ucp.webdav", "UNLOCK - Unlocking of <"
- << makeAbsoluteURL( inPath ) << "> failed." );
- }
-
- HandleError( theRetVal, inPath, rEnv );
-}
-
-bool NeonSession::UNLOCK( NeonLock * pLock )
-{
- osl::Guard< osl::Mutex > theGuard( m_aMutex );
-
-#if defined SAL_LOG_INFO
- {
- char * p = ne_uri_unparse( &(pLock->uri) );
- SAL_INFO( "ucb.ucp.webdav", "UNLOCK (from store) - relative URL: <" << p << "> token: <" << pLock->token << ">" );
- ne_free( p );
- }
-#endif
-
- const int theRetVal = ne_unlock(m_pHttpSession, pLock);
- if (theRetVal == NE_OK)
- {
-#if defined SAL_LOG_INFO
- {
- char * p = ne_uri_unparse( &(pLock->uri) );
- SAL_INFO( "ucb.ucp.webdav", "UNLOCK (from store) - relative URL: <" << p << "> token: <" << pLock->token << "> succeeded." );
- ne_free( p );
- }
-#endif
- return true;
- }
- else
- {
-#if defined SAL_LOG_INFO
- {
- char * p = ne_uri_unparse( &(pLock->uri) );
- SAL_INFO( "ucb.ucp.webdav", "UNLOCK (from store) - relative URL: <" << p << "> token: <" << pLock->token << "> failed!" );
- ne_free( p );
- }
-#endif
- if (theRetVal == NE_AUTH)
- {
- // tdf#126279: see handling of NE_AUTH in HandleError
- m_bNeedNewSession = true;
- }
- return false;
- }
-}
-
-void NeonSession::abort()
-{
- SAL_INFO( "ucb.ucp.webdav", "neon commands cannot be aborted" );
-}
-
-ucbhelper::InternetProxyServer NeonSession::getProxySettings() const
-{
- if ( m_aScheme == "http" || m_aScheme == "https" )
- {
- return m_rProxyDecider.getProxy( m_aScheme,
- m_aHostName,
- m_nPort );
- }
- else
- {
- return m_rProxyDecider.getProxy( m_aScheme,
- OUString() /* not used */,
- -1 /* not used */ );
- }
-}
-
-namespace {
-
-bool containsLocktoken( const uno::Sequence< ucb::Lock > & rLocks,
- const char * token )
-{
- return std::any_of(rLocks.begin(), rLocks.end(), [&token](const ucb::Lock& rLock) {
- const uno::Sequence< OUString > & rTokens = rLock.LockTokens;
- return std::any_of(rTokens.begin(), rTokens.end(),
- [&token](const OUString& rToken) { return rToken.equalsAscii( token ); });
- });
-}
-
-} // namespace
-
-bool NeonSession::removeExpiredLocktoken( const OUString & inURL,
- const DAVRequestEnvironment & rEnv )
-{
- NeonLock * theLock = m_aNeonLockStore.findByUri( inURL );
- if ( !theLock )
- return false;
-
- // do a lockdiscovery to check whether this lock is still valid.
- try
- {
- // @@@ Alternative: use ne_lock_discover() => less overhead
-
- std::vector< DAVResource > aResources;
-
- PROPFIND( rEnv.m_aRequestURI, DAVZERO, { DAVProperties::LOCKDISCOVERY }, aResources, rEnv );
-
- if ( aResources.empty() )
- return false;
-
- for ( const auto& rProp : aResources[ 0 ].properties )
- {
- if ( rProp.Name == DAVProperties::LOCKDISCOVERY )
- {
- uno::Sequence< ucb::Lock > aLocks;
- if ( !( rProp.Value >>= aLocks ) )
- return false;
-
- if ( !containsLocktoken( aLocks, theLock->token ) )
- {
- // expired!
- break;
- }
-
- // still valid.
- return false;
- }
- }
-
- // No lockdiscovery prop in propfind result / locktoken not found
- // in propfind result -> not locked
- SAL_WARN( "ucb.ucp.webdav", "Removing expired lock token for <" << inURL
- << "> token: " << theLock->token );
-
- m_aNeonLockStore.removeLock( theLock );
- ne_lock_destroy( theLock );
- return true;
- }
- catch ( DAVException const & )
- {
- }
- return false;
-}
-
-// Common error handler
-void NeonSession::HandleError( int nError,
- const OUString & inPath,
- const DAVRequestEnvironment & rEnv )
-{
- // Map error code to DAVException.
- switch ( nError )
- {
- case NE_OK:
- return;
-
- case NE_ERROR: // Generic error
- {
- const char* sErr = ne_get_error(m_pHttpSession);
- OUString aText(sErr, strlen(sErr), osl_getThreadTextEncoding());
-
- sal_uInt16 code = makeStatusCode( aText );
-
- SAL_WARN( "ucb.ucp.webdav", "Neon returned NE_ERROR, http response status code was: " << code << " '" << aText << "'" );
- if ( SC_BAD_REQUEST <= code && code < SC_INTERNAL_SERVER_ERROR )
- {
- // error codes in the range 4xx
- switch ( code )
- {
- case SC_LOCKED:
- {
- if ( m_aNeonLockStore.findByUri(
- makeAbsoluteURL( inPath ) ) == nullptr )
- {
- // locked by 3rd party
- throw DAVException( DAVException::DAV_LOCKED );
- }
- else
- {
- // locked by ourself
- throw DAVException( DAVException::DAV_LOCKED_SELF );
- }
- }
- break;
- case SC_PRECONDITION_FAILED:
- case SC_BAD_REQUEST:
- {
- // Special handling for 400 and 412 status codes, which may indicate
- // that a lock previously obtained by us has been released meanwhile
- // by the server. Unfortunately, RFC is not clear at this point,
- // thus server implementations behave different...
- if ( removeExpiredLocktoken( makeAbsoluteURL( inPath ), rEnv ) )
- throw DAVException( DAVException::DAV_LOCK_EXPIRED );
- }
- break;
- case SC_REQUEST_TIMEOUT:
- {
- throw DAVException( DAVException::DAV_HTTP_TIMEOUT,
- NeonUri::makeConnectionEndPointString(
- m_aHostName, m_nPort ) );
- }
- break;
- case SC_UNAUTHORIZED: // User authentication failed on server
- {
- throw DAVException( DAVException::DAV_HTTP_AUTH,
- NeonUri::makeConnectionEndPointString(
- m_aHostName, m_nPort ) );
- }
- break;
- case SC_GONE:
- case SC_LENGTH_REQUIRED:
- case SC_REQUEST_ENTITY_TOO_LARGE:
- case SC_REQUEST_URI_TOO_LONG:
- case SC_UNSUPPORTED_MEDIA_TYPE:
- case SC_REQUESTED_RANGE_NOT_SATISFIABLE:
- case SC_EXPECTATION_FAILED:
- case SC_UNPROCESSABLE_ENTITY:
- case SC_FAILED_DEPENDENCY:
- case SC_CONFLICT:
- case SC_NOT_ACCEPTABLE:
- case SC_PAYMENT_REQUIRED:
- case SC_PROXY_AUTHENTICATION_REQUIRED:
- default:
- // set 400 error, if not one of others
- code = SC_BAD_REQUEST;
- [[fallthrough]];
- case SC_FORBIDDEN:
- case SC_NOT_FOUND:
- case SC_METHOD_NOT_ALLOWED:
- throw DAVException( DAVException::DAV_HTTP_ERROR, aText, code );
- break;
- }
- }
- else if ( SC_INTERNAL_SERVER_ERROR <= code )
- {
- // deal with HTTP response status codes higher then 500
- // error codes in the range 5xx, server errors
- // but there exists unofficial code in the range 1000 and up
- // for example see:
- // <https://support.cloudflare.com/hc/en-us/sections/200820298-Error-Pages> (retrieved 2016-10-05)
- switch ( code )
- {
- // the error codes case before the default case are not actively
- // managed by LO
- case SC_BAD_GATEWAY:
- case SC_SERVICE_UNAVAILABLE:
- case SC_GATEWAY_TIMEOUT:
- case SC_HTTP_VERSION_NOT_SUPPORTED:
- case SC_INSUFFICIENT_STORAGE:
- default:
- // set 500 error, if not one of others
- // expand the error code
- code = SC_INTERNAL_SERVER_ERROR;
- [[fallthrough]];
- case SC_INTERNAL_SERVER_ERROR:
- case SC_NOT_IMPLEMENTED:
- throw DAVException( DAVException::DAV_HTTP_ERROR, aText, code );
- break;
- }
- }
- else
- throw DAVException( DAVException::DAV_HTTP_ERROR, aText, code );
- }
- break;
- case NE_LOOKUP: // Name lookup failed.
- SAL_WARN( "ucb.ucp.webdav", "Name lookup failed" );
- throw DAVException( DAVException::DAV_HTTP_LOOKUP,
- NeonUri::makeConnectionEndPointString(
- m_aHostName, m_nPort ) );
-
- case NE_AUTH: // User authentication failed on server
- // m_pHttpSession could get invalidated, e.g., as result of clean_session called in
- // ah_post_send in case when auth_challenge failed, which invalidates the auth_session
- // which we established in Init(): the auth_session's sspi_host gets disposed, and
- // next attempt to authenticate would crash in continue_sspi trying to dereference it
- m_bNeedNewSession = true;
- throw DAVException( DAVException::DAV_HTTP_AUTH,
- NeonUri::makeConnectionEndPointString(
- m_aHostName, m_nPort ) );
-
- case NE_PROXYAUTH: // User authentication failed on proxy
- SAL_WARN( "ucb.ucp.webdav", "DAVException::DAV_HTTP_AUTHPROXY" );
- throw DAVException( DAVException::DAV_HTTP_AUTHPROXY,
- NeonUri::makeConnectionEndPointString(
- m_aProxyName, m_nProxyPort ) );
-
- case NE_CONNECT: // Could not connect to server
- SAL_WARN( "ucb.ucp.webdav", "DAVException::DAV_HTTP_CONNECT" );
- throw DAVException( DAVException::DAV_HTTP_CONNECT,
- NeonUri::makeConnectionEndPointString(
- m_aHostName, m_nPort ) );
-
- case NE_TIMEOUT: // Connection timed out
- SAL_WARN( "ucb.ucp.webdav", "DAVException::DAV_HTTP_TIMEOUT" );
- throw DAVException( DAVException::DAV_HTTP_TIMEOUT,
- NeonUri::makeConnectionEndPointString(
- m_aHostName, m_nPort ) );
-
- case NE_FAILED: // The precondition failed
- SAL_WARN( "ucb.ucp.webdav", "The precondition failed" );
- throw DAVException( DAVException::DAV_HTTP_FAILED,
- NeonUri::makeConnectionEndPointString(
- m_aHostName, m_nPort ) );
-
- case NE_RETRY: // Retry request (ne_end_request ONLY)
- throw DAVException( DAVException::DAV_HTTP_RETRY,
- NeonUri::makeConnectionEndPointString(
- m_aHostName, m_nPort ) );
-
- case NE_REDIRECT:
- {
- NeonUri aUri( ne_redirect_location( m_pHttpSession ) );
- SAL_INFO( "ucb.ucp.webdav", "DAVException::DAV_HTTP_REDIRECT: new URI: " << aUri.GetURI() );
- throw DAVException(
- DAVException::DAV_HTTP_REDIRECT, aUri.GetURI() );
- }
- default:
- {
- SAL_WARN( "ucb.ucp.webdav", "Unknown Neon error code!" );
- const char* sErr = ne_get_error(m_pHttpSession);
- throw DAVException( DAVException::DAV_HTTP_ERROR,
- OUString(sErr, strlen(sErr), osl_getThreadTextEncoding()) );
- }
- }
-}
-
-namespace {
-
-void runResponseHeaderHandler( void * userdata,
- const char * value )
-{
- OUString aHeader(value, strlen(value), RTL_TEXTENCODING_ASCII_US);
- sal_Int32 nPos = aHeader.indexOf( ':' );
-
- if ( nPos == -1 )
- return;
-
- OUString aHeaderName( aHeader.copy( 0, nPos ) );
-
- NeonRequestContext * pCtx
- = static_cast< NeonRequestContext * >( userdata );
-
- // Note: Empty vector means that all headers are requested.
- bool bIncludeIt = pCtx->pHeaderNames->empty();
-
- if ( !bIncludeIt )
- {
- // Check whether this header was requested.
- auto it = std::find_if(pCtx->pHeaderNames->cbegin(), pCtx->pHeaderNames->cend(),
- [&aHeaderName](const OUString& rName) {
- // header names are case insensitive
- return rName.equalsIgnoreAsciiCase( aHeaderName ); });
-
- if ( it != pCtx->pHeaderNames->end() )
- {
- aHeaderName = *it;
- bIncludeIt = true;
- }
- }
-
- if ( !bIncludeIt )
- return;
-
- // Create & set the PropertyValue
- DAVPropertyValue thePropertyValue;
- // header names are case insensitive, so are the
- // corresponding property names.
- thePropertyValue.Name = aHeaderName.toAsciiLowerCase();
- thePropertyValue.IsCaseSensitive = false;
-
- if ( nPos < aHeader.getLength() )
- thePropertyValue.Value <<= aHeader.copy( nPos + 1 ).trim();
-
- // Add the newly created PropertyValue
- pCtx->pResource->properties.push_back( thePropertyValue );
-}
-
-} // namespace
-
-int NeonSession::GET( ne_session * sess,
- const char * uri,
- ne_block_reader reader,
- bool getheaders,
- void * userdata )
-{
- //struct get_context ctx;
- ne_request * req = ne_request_create( sess, "GET", uri );
- int ret;
-
- ne_decompress * dc
- = ne_decompress_reader( req, ne_accept_2xx, reader, userdata );
-
- {
- osl::Guard< osl::Mutex > theGlobalGuard(getGlobalNeonMutex());
- ret = ne_request_dispatch( req );
- }
-
- if ( getheaders )
- {
- void *cursor = nullptr;
- const char *name, *value;
- while ( ( cursor = ne_response_header_iterate(
- req, cursor, &name, &value ) ) != nullptr )
- {
- char buffer[8192];
-
- SAL_INFO( "ucb.ucp.webdav", "GET - received header: " << name << ": " << value );
- ne_snprintf(buffer, sizeof buffer, "%s: %s", name, value);
- runResponseHeaderHandler(userdata, buffer);
- }
- }
-
- if ( ret == NE_OK && ne_get_status( req )->klass != 2 )
- ret = NE_ERROR;
-
- if ( dc != nullptr )
- ne_decompress_destroy(dc);
-
- ne_request_destroy( req );
- return ret;
-}
-
-int NeonSession::GET0( ne_session * sess,
- const char * uri,
- bool getheaders,
- void * userdata )
-{
- //struct get_context ctx;
- ne_request * req = ne_request_create( sess, "GET", uri );
- int ret;
-
- {
- osl::Guard< osl::Mutex > theGlobalGuard(getGlobalNeonMutex());
- ret = ne_request_dispatch( req );
- }
-
- if ( getheaders )
- {
- void *cursor = nullptr;
- const char *name, *value;
- while ( ( cursor = ne_response_header_iterate(
- req, cursor, &name, &value ) ) != nullptr )
- {
- char buffer[8192];
-
- SAL_INFO( "ucb.ucp.webdav", "GET - received header: " << name << ": " << value );
- ne_snprintf(buffer, sizeof buffer, "%s: %s", name, value);
- runResponseHeaderHandler(userdata, buffer);
- }
- }
-
- if ( ret == NE_OK && ne_get_status( req )->klass != 2 )
- ret = NE_ERROR;
-
- ne_request_destroy( req );
- return ret;
-}
-
-int NeonSession::PUT( ne_session * sess,
- const char * uri,
- const char * buffer,
- size_t size)
-{
- ne_request * req = ne_request_create( sess, "PUT", uri );
- int ret;
-
- // tdf#99246
- // extract the path of uri
- // ne_lock_using_resource below compares path, ignores all the rest.
- // in case of Web proxy active, this function uri parameter is instead absolute
- ne_uri aUri;
- ne_uri_parse( uri, &aUri );
- ne_lock_using_resource( req, aUri.path, 0 );
- ne_lock_using_parent( req, uri );
-
- ne_set_request_body_buffer( req, buffer, size );
-
- {
- osl::Guard< osl::Mutex > theGlobalGuard(getGlobalNeonMutex());
- ret = ne_request_dispatch( req );
- }
-
- if ( ret == NE_OK && ne_get_status( req )->klass != 2 )
- ret = NE_ERROR;
-
- ne_request_destroy( req );
- return ret;
-}
-
-int NeonSession::POST( ne_session * sess,
- const char * uri,
- const char * buffer,
- ne_block_reader reader,
- void * userdata,
- const OUString & rContentType,
- const OUString & rReferer )
-{
- ne_request * req = ne_request_create( sess, "POST", uri );
- //struct get_context ctx;
- int ret;
-
- RequestDataMap * pData = nullptr;
-
- if ( !rContentType.isEmpty() || !rReferer.isEmpty() )
- {
- // Remember contenttype and referer. Data will be added to HTTP request
- // header in 'PreSendRequest' callback.
- pData = static_cast< RequestDataMap* >( m_pRequestData );
- (*pData)[ req ] = RequestData( rContentType, rReferer );
- }
-
- //ctx.total = -1;
- //ctx.fd = fd;
- //ctx.error = 0;
- //ctx.session = sess;
-
- ///* Read the value of the Content-Length header into ctx.total */
- //ne_add_response_header_handler( req, "Content-Length",
- // ne_handle_numeric_header, &ctx.total );
-
- ne_add_response_body_reader( req, ne_accept_2xx, reader, userdata );
-
- ne_set_request_body_buffer( req, buffer, strlen( buffer ) );
-
- {
- osl::Guard< osl::Mutex > theGlobalGuard(getGlobalNeonMutex());
- ret = ne_request_dispatch( req );
- }
-
- //if ( ctx.error )
- // ret = NE_ERROR;
- //else
- if ( ret == NE_OK && ne_get_status( req )->klass != 2 )
- ret = NE_ERROR;
-
- ne_request_destroy( req );
-
- if ( pData )
- {
- // Remove request data from session's list.
- RequestDataMap::iterator it = pData->find( req );
- if ( it != pData->end() )
- pData->erase( it );
- }
-
- return ret;
-}
-
-bool
-NeonSession::getDataFromInputStream(
- const uno::Reference< io::XInputStream > & xStream,
- uno::Sequence< sal_Int8 > & rData,
- bool bAppendTrailingZeroByte )
-{
- if ( xStream.is() )
- {
- uno::Reference< io::XSeekable > xSeekable( xStream, uno::UNO_QUERY );
- if ( xSeekable.is() )
- {
- try
- {
- sal_Int32 nSize
- = sal::static_int_cast<sal_Int32>(xSeekable->getLength());
- sal_Int32 nRead
- = xStream->readBytes( rData, nSize );
-
- if ( nRead == nSize )
- {
- if ( bAppendTrailingZeroByte )
- {
- rData.realloc( nSize + 1 );
- rData.getArray()[ nSize ] = sal_Int8( 0 );
- }
- return true;
- }
- }
- catch ( io::NotConnectedException const & )
- {
- // readBytes
- }
- catch ( io::BufferSizeExceededException const & )
- {
- // readBytes
- }
- catch ( io::IOException const & )
- {
- // getLength, readBytes
- }
- }
- else
- {
- try
- {
- uno::Sequence< sal_Int8 > aBuffer;
- sal_Int32 nPos = 0;
-
- sal_Int32 nRead = xStream->readSomeBytes( aBuffer, 65536 );
- while ( nRead > 0 )
- {
- if ( rData.getLength() < ( nPos + nRead ) )
- rData.realloc( nPos + nRead );
-
- aBuffer.realloc( nRead );
- memcpy( static_cast<void*>( rData.getArray() + nPos ),
- static_cast<const void*>(aBuffer.getConstArray()),
- nRead );
- nPos += nRead;
-
- aBuffer.realloc( 0 );
- nRead = xStream->readSomeBytes( aBuffer, 65536 );
- }
-
- if ( bAppendTrailingZeroByte )
- {
- rData.realloc( nPos + 1 );
- rData.getArray()[ nPos ] = sal_Int8( 0 );
- }
- return true;
- }
- catch ( io::NotConnectedException const & )
- {
- // readBytes
- }
- catch ( io::BufferSizeExceededException const & )
- {
- // readBytes
- }
- catch ( io::IOException const & )
- {
- // readBytes
- }
- }
- }
- return false;
-}
-
-bool
-NeonSession::isDomainMatch( const OUString& certHostName ) const
-{
- OUString hostName = getHostName();
-
- if (hostName.equalsIgnoreAsciiCase( certHostName ) )
- return true;
-
- if ( certHostName.startsWith( "*" ) &&
- hostName.getLength() >= certHostName.getLength() )
- {
- OUString cmpStr = certHostName.copy( 1 );
-
- if ( hostName.matchIgnoreAsciiCase(
- cmpStr, hostName.getLength() - cmpStr.getLength() ) )
- return true;
- }
- return false;
-}
-
-OUString NeonSession::makeAbsoluteURL( OUString const & rURL ) const
-{
- try
- {
- // Is URL relative or already absolute?
- if ( !rURL.isEmpty() && rURL[ 0 ] != '/' )
- {
- // absolute.
- return rURL;
- }
- else
- {
- ne_uri aUri = {};
-
- ne_fill_server_uri( m_pHttpSession, &aUri );
- aUri.path
- = ne_strdup( OUStringToOString(
- rURL, RTL_TEXTENCODING_UTF8 ).getStr() );
- NeonUri aNeonUri( &aUri );
- ne_uri_free( &aUri );
- return aNeonUri.GetURI();
- }
- }
- catch ( DAVException const & )
- {
- }
- // error.
- return OUString();
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/NeonSession.hxx b/ucb/source/ucp/webdav-neon/NeonSession.hxx
deleted file mode 100644
index 615f750a11aa..000000000000
--- a/ucb/source/ucp/webdav-neon/NeonSession.hxx
+++ /dev/null
@@ -1,285 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <vector>
-#include <osl/mutex.hxx>
-#include "DAVSession.hxx"
-#include "NeonTypes.hxx"
-#include "NeonLockStore.hxx"
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-
-namespace ucbhelper { class ProxyDecider; }
-
-namespace webdav_ucp
-{
-
-// A DAVSession implementation using the neon/expat library
-class NeonSession : public DAVSession
-{
-private:
- osl::Mutex m_aMutex;
- OUString m_aScheme;
- OUString m_aHostName;
- OUString m_aProxyName;
- sal_Int32 m_nPort;
- sal_Int32 m_nProxyPort;
- css::uno::Sequence< css::beans::NamedValue > m_aFlags;
- HttpSession * m_pHttpSession;
- bool m_bNeedNewSession = false; // Something happened that could invalidate m_pHttpSession
- void * m_pRequestData;
- const ucbhelper::InternetProxyDecider & m_rProxyDecider;
-
- // @@@ This should really be per-request data. But Neon currently
- // (0.23.5) has no interface for passing per-request user data.
- // Theoretically, a NeonSession instance could handle multiple requests
- // at a time --currently it doesn't. Thus this is not an issue at the
- // moment.
- DAVRequestEnvironment m_aEnv;
-
- static bool m_bGlobalsInited;
- static NeonLockStore m_aNeonLockStore;
-
-protected:
- virtual ~NeonSession() override;
-
-public:
- /// @throws std::exception
- NeonSession( const rtl::Reference< DAVSessionFactory > & rSessionFactory,
- const OUString& inUri,
- const css::uno::Sequence< css::beans::NamedValue >& rFlags,
- const ucbhelper::InternetProxyDecider & rProxyDecider );
-
- // DAVSession methods
- virtual bool CanUse( const OUString & inPath,
- const css::uno::Sequence< css::beans::NamedValue >& rFlags ) override;
-
- virtual bool UsesProxy() override;
-
- const DAVRequestEnvironment & getRequestEnvironment() const
- { return m_aEnv; }
-
- virtual void
- OPTIONS( const OUString & inPath,
- DAVOptions& rOptions, // contains the name+values
- const DAVRequestEnvironment & rEnv ) override;
-
- // allprop & named
- virtual void
- PROPFIND( const OUString & inPath,
- const Depth inDepth,
- const std::vector< OUString > & inPropNames,
- std::vector< DAVResource > & ioResources,
- const DAVRequestEnvironment & rEnv ) override;
-
- // propnames
- virtual void
- PROPFIND( const OUString & inPath,
- const Depth inDepth,
- std::vector< DAVResourceInfo >& ioResInfo,
- const DAVRequestEnvironment & rEnv ) override;
-
- virtual void
- PROPPATCH( const OUString & inPath,
- const std::vector< ProppatchValue > & inValues,
- const DAVRequestEnvironment & rEnv ) override;
-
- virtual void
- HEAD( const OUString & inPath,
- const std::vector< OUString > & inHeaderNames,
- DAVResource & ioResource,
- const DAVRequestEnvironment & rEnv ) override;
-
- virtual css::uno::Reference< css::io::XInputStream >
- GET( const OUString & inPath,
- const DAVRequestEnvironment & rEnv ) override;
-
- virtual void
- GET( const OUString & inPath,
- css::uno::Reference< css::io::XOutputStream > & ioOutputStream,
- const DAVRequestEnvironment & rEnv ) override;
-
- virtual css::uno::Reference< css::io::XInputStream >
- GET( const OUString & inPath,
- const std::vector< OUString > & inHeaderNames,
- DAVResource & ioResource,
- const DAVRequestEnvironment & rEnv ) override;
-
- virtual void
- GET0( const OUString & inPath,
- const std::vector< OUString > & inHeaderNames,
- DAVResource & ioResource,
- const DAVRequestEnvironment & rEnv ) override;
-
- virtual void
- GET( const OUString & inPath,
- css::uno::Reference< css::io::XOutputStream > & ioOutputStream,
- const std::vector< OUString > & inHeaderNames,
- DAVResource & ioResource,
- const DAVRequestEnvironment & rEnv ) override;
-
- virtual void
- PUT( const OUString & inPath,
- const css::uno::Reference< css::io::XInputStream > & inInputStream,
- const DAVRequestEnvironment & rEnv ) override;
-
- virtual css::uno::Reference< css::io::XInputStream >
- POST( const OUString & inPath,
- const OUString & rContentType,
- const OUString & rReferer,
- const css::uno::Reference< css::io::XInputStream > & inInputStream,
- const DAVRequestEnvironment & rEnv ) override;
-
- virtual void
- POST( const OUString & inPath,
- const OUString & rContentType,
- const OUString & rReferer,
- const css::uno::Reference< css::io::XInputStream > & inInputStream,
- css::uno::Reference< css::io::XOutputStream > & oOutputStream,
- const DAVRequestEnvironment & rEnv ) override;
-
- virtual void
- MKCOL( const OUString & inPath,
- const DAVRequestEnvironment & rEnv ) override;
-
- virtual void
- COPY( const OUString & inSourceURL,
- const OUString & inDestinationURL,
- const DAVRequestEnvironment & rEnv,
- bool inOverWrite ) override;
-
- virtual void
- MOVE( const OUString & inSourceURL,
- const OUString & inDestinationURL,
- const DAVRequestEnvironment & rEnv,
- bool inOverWrite ) override;
-
- virtual void DESTROY( const OUString & inPath,
- const DAVRequestEnvironment & rEnv ) override;
-
- // set new lock.
- virtual void LOCK( const OUString & inURL,
- css::ucb::Lock & inLock,
- const DAVRequestEnvironment & rEnv ) override;
-
- virtual void UNLOCK( const OUString & inURL,
- const DAVRequestEnvironment & rEnv ) override;
-
- // helpers
- virtual void abort() override;
-
- const OUString & getHostName() const { return m_aHostName; }
-
- ::uno::Reference< ::uno::XComponentContext > const & getComponentContext() const
- { return m_xFactory->getComponentContext(); }
-
- const void * getRequestData() const { return m_pRequestData; }
-
- bool isDomainMatch( const OUString& certHostName ) const;
-
- int CertificationNotify(const ne_ssl_certificate *cert);
-
- int NeonAuth(const char* inAuthProtocol, const char* inRealm,
- int attempt, char* inoutUserName, char * inoutPassWord);
-
- void PreSendRequest(ne_request* req, ne_buffer* headers);
-
-private:
- friend class NeonLockStore;
-
- /// @throws css::uno::RuntimeException
- void Init();
-
- /// @throws css::uno::RuntimeException
- void Init( const DAVRequestEnvironment & rEnv );
-
- // ret: true => retry request.
- /// @throws std::exception
- void HandleError( int nError,
- const OUString & inPath,
- const DAVRequestEnvironment & rEnv );
-
- ucbhelper::InternetProxyServer getProxySettings() const;
-
- bool removeExpiredLocktoken( const OUString & inURL,
- const DAVRequestEnvironment & rEnv );
-
- // refresh lock, called by NeonLockStore::refreshLocks
- bool LOCK( NeonLock * pLock,
- sal_Int32 & rlastChanceToSendRefreshRequest );
-
- // unlock, called by NeonLockStore::~NeonLockStore
- bool UNLOCK( NeonLock * pLock );
-
- // low level GET implementation, used by public GET implementations
- static int GET( ne_session * sess,
- const char * uri,
- ne_block_reader reader,
- bool getheaders,
- void * userdata );
-
- // low level GET implementation, used by public GET implementations
- // used as a HEAD substitute when head is not available
- static int GET0( ne_session * sess,
- const char * uri,
- bool getheaders,
- void * userdata );
-
- // Buffer-based PUT implementation. Neon only has file descriptor-
- // based API.
- static int PUT( ne_session * sess,
- const char * uri,
- const char * buffer,
- size_t size );
-
- // Buffer-based POST implementation. Neon only has file descriptor-
- // based API.
- int POST( ne_session * sess,
- const char * uri,
- const char * buffer,
- ne_block_reader reader,
- void * userdata,
- const OUString & rContentType,
- const OUString & rReferer );
-
- // Helper: XInputStream -> Sequence< sal_Int8 >
- static bool getDataFromInputStream(
- const css::uno::Reference< css::io::XInputStream > & xStream,
- css::uno::Sequence< sal_Int8 > & rData,
- bool bAppendTrailingZeroByte );
-
- OUString makeAbsoluteURL( OUString const & rURL ) const;
-};
-
-osl::Mutex& getGlobalNeonMutex();
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/NeonTypes.hxx b/ucb/source/ucp/webdav-neon/NeonTypes.hxx
deleted file mode 100644
index eb40c03a6f4a..000000000000
--- a/ucb/source/ucp/webdav-neon/NeonTypes.hxx
+++ /dev/null
@@ -1,54 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <ne_session.h>
-#include <ne_utils.h>
-#include <ne_basic.h>
-#include <ne_props.h>
-
-#if defined(__GNUC__)
-# pragma GCC diagnostic push
-# pragma GCC diagnostic ignored "-Wshadow"
-#endif
-#include <ne_locks.h>
-#if defined(__GNUC__)
-# pragma GCC diagnostic pop
-#endif
-
-typedef ne_session HttpSession;
-typedef ne_status HttpStatus;
-
-typedef ne_propname NeonPropName;
-typedef ne_prop_result_set NeonPropFindResultSet;
-
-typedef struct ne_lock NeonLock;
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/NeonUri.cxx b/ucb/source/ucp/webdav-neon/NeonUri.cxx
deleted file mode 100644
index df641fce518d..000000000000
--- a/ucb/source/ucp/webdav-neon/NeonUri.cxx
+++ /dev/null
@@ -1,291 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include <sal/config.h>
-
-#include <rtl/uri.hxx>
-#include <rtl/ustring.hxx>
-#include <rtl/ustrbuf.hxx>
-#include <ne_alloc.h>
-#include "NeonUri.hxx"
-#include "DAVException.hxx"
-
-#include "../inc/urihelper.hxx"
-
-using namespace webdav_ucp;
-
-// FIXME: not sure whether initializing a ne_uri statically is supposed to work
-// the string fields of ne_uri are char*, not const char*
-
-#ifdef __GNUC__
-#pragma GCC diagnostic ignored "-Wwrite-strings"
-#endif
-
-namespace {
-
-const ne_uri g_sUriDefaultsHTTP = { const_cast<char *>("http"),
- const_cast<char *>(""),
- const_cast<char *>(""),
- DEFAULT_HTTP_PORT,
- const_cast<char *>(""),
- nullptr,
- nullptr };
-const ne_uri g_sUriDefaultsHTTPS = { const_cast<char *>("https"),
- const_cast<char *>(""),
- const_cast<char *>(""),
- DEFAULT_HTTPS_PORT,
- const_cast<char *>(""),
- nullptr,
- nullptr };
-const ne_uri g_sUriDefaultsFTP = { const_cast<char *>("ftp"),
- const_cast<char *>(""),
- const_cast<char *>(""),
- DEFAULT_FTP_PORT,
- const_cast<char *>(""),
- nullptr,
- nullptr };
-} // namespace
-
-NeonUri::NeonUri( const ne_uri * inUri )
-{
- if ( inUri == nullptr )
- throw DAVException( DAVException::DAV_INVALID_ARG );
-
- char * uri = ne_uri_unparse( inUri );
-
- if ( uri == nullptr )
- throw DAVException( DAVException::DAV_INVALID_ARG );
-
- init( OString( uri ), inUri );
- ne_free( uri );
-
- calculateURI();
-}
-
-NeonUri::NeonUri( const OUString & inUri )
-{
- if ( inUri.isEmpty() )
- throw DAVException( DAVException::DAV_INVALID_ARG );
-
- // #i77023#
- OUString aEscapedUri( ucb_impl::urihelper::encodeURI( inUri ) );
-
- OString theInputUri(
- aEscapedUri.getStr(), aEscapedUri.getLength(), RTL_TEXTENCODING_UTF8 );
-
- ne_uri theUri;
- if ( ne_uri_parse( theInputUri.getStr(), &theUri ) != 0 )
- {
- ne_uri_free( &theUri );
- throw DAVException( DAVException::DAV_INVALID_ARG );
- }
-
- init( theInputUri, &theUri );
- ne_uri_free( &theUri );
-
- calculateURI();
-}
-
-void NeonUri::init( const OString & rUri, const ne_uri * pUri )
-{
- // Complete URI.
- const ne_uri * pUriDefs
- = rUri.matchIgnoreAsciiCase( "ftp:" ) ?
- &g_sUriDefaultsFTP :
- rUri.matchIgnoreAsciiCase( "https:" ) ?
- &g_sUriDefaultsHTTPS :
- &g_sUriDefaultsHTTP;
-
- mScheme = OStringToOUString(
- pUri->scheme ? pUri->scheme : pUriDefs->scheme,
- RTL_TEXTENCODING_UTF8 );
- mUserInfo = OStringToOUString(
- pUri->userinfo ? pUri->userinfo : pUriDefs->userinfo,
- RTL_TEXTENCODING_UTF8 );
- mHostName = OStringToOUString(
- pUri->host ? pUri->host : pUriDefs->host,
- RTL_TEXTENCODING_UTF8 );
- mPort = pUri->port > 0 ? pUri->port : pUriDefs->port;
- mPath = OStringToOUString(
- pUri->path ? pUri->path : pUriDefs->path,
- RTL_TEXTENCODING_UTF8 );
-
- if ( pUri->query )
- {
- mPath += "?" + OStringToOUString( pUri->query, RTL_TEXTENCODING_UTF8 );
- }
-
- if ( pUri->fragment )
- {
- mPath += "#" + OStringToOUString( pUri->fragment, RTL_TEXTENCODING_UTF8 );
- }
-}
-
-void NeonUri::calculateURI ()
-{
- OUStringBuffer aBuf( 256 );
- aBuf.append( mScheme );
- aBuf.append( "://" );
- if ( !mUserInfo.isEmpty() )
- {
- //TODO! differentiate between empty and missing userinfo
- aBuf.append( mUserInfo );
- aBuf.append( "@" );
- }
- // Is host a numeric IPv6 address?
- if ( ( mHostName.indexOf( ':' ) != -1 ) &&
- ( mHostName[ 0 ] != '[' ) )
- {
- aBuf.append( "[" );
- aBuf.append( mHostName );
- aBuf.append( "]" );
- }
- else
- {
- aBuf.append( mHostName );
- }
-
- // append port, but only, if not default port.
- bool bAppendPort = true;
- switch ( mPort )
- {
- case DEFAULT_HTTP_PORT:
- bAppendPort = mScheme != "http";
- break;
-
- case DEFAULT_HTTPS_PORT:
- bAppendPort = mScheme != "https";
- break;
-
- case DEFAULT_FTP_PORT:
- bAppendPort = mScheme != "ftp";
- break;
- }
- if ( bAppendPort )
- {
- aBuf.append( ":" );
- aBuf.append( mPort );
- }
- aBuf.append( mPath );
-
- mURI = aBuf.makeStringAndClear();
-}
-
-OUString NeonUri::GetPathBaseName () const
-{
- sal_Int32 nPos = mPath.lastIndexOf ('/');
- sal_Int32 nTrail = 0;
- if (nPos == mPath.getLength () - 1)
- {
- // Trailing slash found. Skip.
- nTrail = 1;
- nPos = mPath.lastIndexOf ('/', nPos);
- }
- if (nPos != -1)
- {
- OUString aTemp(
- mPath.copy (nPos + 1, mPath.getLength () - nPos - 1 - nTrail) );
-
- // query, fragment present?
- nPos = aTemp.indexOf( '?' );
- if ( nPos == -1 )
- nPos = aTemp.indexOf( '#' );
-
- if ( nPos != -1 )
- aTemp = aTemp.copy( 0, nPos );
-
- return aTemp;
- }
- else
- return "/";
-}
-
-bool NeonUri::operator== ( const NeonUri & rOther ) const
-{
- return ( mURI == rOther.mURI );
-}
-
-OUString NeonUri::GetPathBaseNameUnescaped () const
-{
- return unescape( GetPathBaseName() );
-}
-
-void NeonUri::AppendPath (std::u16string_view rPath)
-{
- if (mPath.lastIndexOf ('/') != mPath.getLength () - 1)
- mPath += "/";
-
- mPath += rPath;
- calculateURI ();
-};
-
-// static
-OUString NeonUri::escapeSegment( const OUString& segment )
-{
- return rtl::Uri::encode( segment,
- rtl_UriCharClassPchar,
- rtl_UriEncodeIgnoreEscapes,
- RTL_TEXTENCODING_UTF8 );
-}
-
-// static
-OUString NeonUri::unescape( const OUString& segment )
-{
- return rtl::Uri::decode( segment,
- rtl_UriDecodeWithCharset,
- RTL_TEXTENCODING_UTF8 );
-}
-
-// static
-OUString NeonUri::makeConnectionEndPointString(
- const OUString & rHostName, int nPort )
-{
- OUStringBuffer aBuf;
-
- // Is host a numeric IPv6 address?
- if ( ( rHostName.indexOf( ':' ) != -1 ) &&
- ( rHostName[ 0 ] != '[' ) )
- {
- aBuf.append( "[" );
- aBuf.append( rHostName );
- aBuf.append( "]" );
- }
- else
- {
- aBuf.append( rHostName );
- }
-
- if ( ( nPort != DEFAULT_HTTP_PORT ) && ( nPort != DEFAULT_HTTPS_PORT ) )
- {
- aBuf.append( ":" );
- aBuf.append( static_cast<sal_Int32>(nPort) );
- }
- return aBuf.makeStringAndClear();
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/NeonUri.hxx b/ucb/source/ucp/webdav-neon/NeonUri.hxx
deleted file mode 100644
index 319026250047..000000000000
--- a/ucb/source/ucp/webdav-neon/NeonUri.hxx
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-#pragma once
-
-#include <sal/config.h>
-
-#include <string_view>
-
-#include <config_lgpl.h>
-#include <ne_uri.h>
-#include <rtl/ustring.hxx>
-#include "DAVException.hxx"
-
-namespace webdav_ucp
-{
-
-#define DEFAULT_HTTP_PORT 80
-#define DEFAULT_HTTPS_PORT 443
-#define DEFAULT_FTP_PORT 21
-
-// A URI implementation for use with the neon/expat library
-class NeonUri
-{
- private:
- OUString mURI;
- OUString mScheme;
- OUString mUserInfo;
- OUString mHostName;
- sal_Int32 mPort;
- OUString mPath;
-
- void init( const OString & rUri, const ne_uri * pUri );
- void calculateURI ();
-
- public:
- /// @throws DAVException
- explicit NeonUri( const OUString & inUri );
- /// @throws DAVException
- explicit NeonUri( const ne_uri * inUri );
-
- bool operator== ( const NeonUri & rOther ) const;
- bool operator!= ( const NeonUri & rOther ) const
- { return !operator==( rOther ); }
-
- const OUString & GetURI() const
- { return mURI; };
- const OUString & GetScheme() const
- { return mScheme; };
- const OUString & GetUserInfo() const
- { return mUserInfo; };
- const OUString & GetHost() const
- { return mHostName; };
- sal_Int32 GetPort() const
- { return mPort; };
- const OUString & GetPath() const
- { return mPath; };
-
- OUString GetPathBaseName() const;
-
- OUString GetPathBaseNameUnescaped() const;
-
- void SetScheme (const OUString& scheme)
- { mScheme = scheme; calculateURI (); };
-
- void AppendPath (std::u16string_view rPath);
-
- static OUString escapeSegment( const OUString& segment );
- static OUString unescape( const OUString& string );
-
- // "host:port", omit ":port" for port 80 and 443
- static OUString makeConnectionEndPointString(
- const OUString & rHostName,
- int nPort );
-};
-
-} // namespace webdav_ucp
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/PropertyMap.hxx b/ucb/source/ucp/webdav-neon/PropertyMap.hxx
deleted file mode 100644
index 508823a8d199..000000000000
--- a/ucb/source/ucp/webdav-neon/PropertyMap.hxx
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <com/sun/star/beans/Property.hpp>
-#include <unordered_set>
-
-namespace webdav_ucp {
-
-
-struct equalPropertyName
-{
- bool operator()( const css::beans::Property & p1,
- const css::beans::Property & p2 ) const
- {
- return p1.Name == p2.Name;
- }
-};
-
-struct hashPropertyName
-{
- size_t operator()( const css::beans::Property & p ) const
- {
- return p.Name.hashCode();
- }
-};
-
-typedef std::unordered_set
-<
- css::beans::Property,
- hashPropertyName,
- equalPropertyName
->
-PropertyMap;
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/PropfindCache.cxx b/ucb/source/ucp/webdav-neon/PropfindCache.cxx
deleted file mode 100644
index 951f4a201790..000000000000
--- a/ucb/source/ucp/webdav-neon/PropfindCache.cxx
+++ /dev/null
@@ -1,86 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-#include <osl/time.h>
-#include "PropfindCache.hxx"
-
-namespace webdav_ucp
-{
-
- // PropertyNames implementation
-
- PropertyNames::PropertyNames() :
- m_nStaleTime( 0 )
- {
- }
-
- PropertyNames::PropertyNames( const OUString& rURL ) :
- m_nStaleTime( 0 ),
- m_sURL( rURL )
- {
- }
-
- //PropertyNamesCache implementation
-
- PropertyNamesCache::PropertyNamesCache()
- {
- }
-
- PropertyNamesCache::~PropertyNamesCache()
- {
- }
-
- bool PropertyNamesCache::getCachedPropertyNames( const OUString& rURL, PropertyNames& rCacheElement )
- {
- // search the URL in the static map
- std::scoped_lock aGuard( m_aMutex );
- PropNameCache::const_iterator it = m_aTheCache.find( rURL );
- if ( it == m_aTheCache.end() )
- return false;
- else
- {
- // check if the element is stale, before restoring
- TimeValue t1;
- osl_getSystemTime( &t1 );
- if ( (*it).second.getStaleTime() < t1.Seconds )
- {
- // if stale, remove from cache, do not restore
- m_aTheCache.erase( it );
- return false;
- // return false instead
- }
- rCacheElement = (*it).second;
- return true;
- }
- }
-
- void PropertyNamesCache::removeCachedPropertyNames( const OUString& rURL )
- {
- std::scoped_lock aGuard( m_aMutex );
- PropNameCache::const_iterator it = m_aTheCache.find( rURL );
- if ( it != m_aTheCache.end() )
- {
- m_aTheCache.erase( it );
- }
- }
-
- void PropertyNamesCache::addCachePropertyNames( PropertyNames& rCacheElement )
- {
- std::scoped_lock aGuard( m_aMutex );
- OUString aURL( rCacheElement.getURL() );
- TimeValue t1;
- osl_getSystemTime( &t1 );
- rCacheElement.setStaleTime( t1.Seconds + 10 );
-
- m_aTheCache[ aURL ] = rCacheElement;
- }
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/ucb/source/ucp/webdav-neon/PropfindCache.hxx b/ucb/source/ucp/webdav-neon/PropfindCache.hxx
deleted file mode 100644
index f78d526a7fe0..000000000000
--- a/ucb/source/ucp/webdav-neon/PropfindCache.hxx
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-#pragma once
-
-#include <sal/types.h>
-#include <rtl/ustring.hxx>
-#include <mutex>
-#include <map>
-#include <vector>
-
-#include "DAVResource.hxx"
-
-namespace webdav_ucp
-{
- // A property names cache mechanism, URL driven.
- // It is used to cache the property names received
- // from the WebDAV server, to minimize the need of
- // net transactions (e.g. PROPFIND).
- // The cache lifetime should be short
- // just to remove the annoying slowness when
- // typing text or moving cursor around when the
- // net link is slow.
-
- // Define the properties cache element
- class PropertyNames final
- {
- /// target time when this element becomes stale
- sal_uInt32 m_nStaleTime;
- OUString m_sURL;
- // the property name list received from WebDAV server
- std::vector< DAVResourceInfo > m_aPropertiesNames;
-
- public:
- PropertyNames();
- explicit PropertyNames( const OUString& rURL );
-
- sal_uInt32 getStaleTime() const { return m_nStaleTime; };
- void setStaleTime( const sal_uInt32 nStaleTime ) { m_nStaleTime = nStaleTime; };
-
- OUString& getURL() { return m_sURL; };
-
- const std::vector< DAVResourceInfo >& getPropertiesNames() const { return m_aPropertiesNames; };
- void setPropertiesNames( std::vector< DAVResourceInfo >&& aPropertiesNames ) { m_aPropertiesNames = std::move(aPropertiesNames); };
- };
-
- // Define the PropertyNames cache
- // TODO: the OUString key element in std::map needs to be changed with a URI representation
- // with a specific compare (std::less) implementation, this last one implementing
- // as suggested in <https://tools.ietf.org/html/rfc3986#section-6>.
- // To find by URI and not by string equality.
- typedef std::map< OUString, PropertyNames,
- std::less< OUString > >PropNameCache;
-
- class PropertyNamesCache final
- {
- PropNameCache m_aTheCache;
- std::mutex m_aMutex;
-
- public:
- PropertyNamesCache();
- ~PropertyNamesCache();
-
- bool getCachedPropertyNames( const OUString& URL, PropertyNames& rCacheElement );
- void removeCachedPropertyNames( const OUString& URL );
- void addCachePropertyNames( PropertyNames& rCacheElement );
- };
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/ucb/source/ucp/webdav-neon/UCBDeadPropertyValue.cxx b/ucb/source/ucp/webdav-neon/UCBDeadPropertyValue.cxx
deleted file mode 100644
index 967d1f36debe..000000000000
--- a/ucb/source/ucp/webdav-neon/UCBDeadPropertyValue.cxx
+++ /dev/null
@@ -1,509 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include <config_lgpl.h>
-#include <string.h>
-#include <ne_xml.h>
-#include <rtl/ustrbuf.hxx>
-#include <sal/log.hxx>
-#include "UCBDeadPropertyValue.hxx"
-#include <memory>
-
-using namespace webdav_ucp;
-using namespace com::sun::star;
-
-namespace {
-
-struct UCBDeadPropertyValueParseContext
-{
- std::unique_ptr<OUString> pType;
- std::unique_ptr<OUString> pValue;
-
- UCBDeadPropertyValueParseContext() {}
-};
-
-}
-
-constexpr OUStringLiteral aTypeString = u"string";
-constexpr OUStringLiteral aTypeLong = u"long";
-constexpr OUStringLiteral aTypeShort = u"short";
-constexpr OUStringLiteral aTypeBoolean = u"boolean";
-constexpr OUStringLiteral aTypeChar = u"char";
-constexpr OUStringLiteral aTypeByte = u"byte";
-constexpr OUStringLiteral aTypeHyper = u"hyper";
-constexpr OUStringLiteral aTypeFloat = u"float";
-constexpr OUStringLiteral aTypeDouble = u"double";
-
-constexpr OUStringLiteral aXMLPre = u"<ucbprop><type>";
-constexpr OUStringLiteral aXMLMid = u"</type><value>";
-constexpr OUStringLiteral aXMLEnd = u"</value></ucbprop>";
-
-
-#define STATE_TOP (1)
-
-#define STATE_UCBPROP (STATE_TOP)
-#define STATE_TYPE (STATE_TOP + 1)
-#define STATE_VALUE (STATE_TOP + 2)
-
-
-extern "C" {
-
-static int UCBDeadPropertyValue_startelement_callback(
- void *,
- int parent,
- const char * /*nspace*/,
- const char *name,
- const char ** )
-{
- if ( name != nullptr )
- {
- switch ( parent )
- {
- case NE_XML_STATEROOT:
- if ( strcmp( name, "ucbprop" ) == 0 )
- return STATE_UCBPROP;
- break;
-
- case STATE_UCBPROP:
- if ( strcmp( name, "type" ) == 0 )
- return STATE_TYPE;
- else if ( strcmp( name, "value" ) == 0 )
- return STATE_VALUE;
- break;
- }
- }
- return NE_XML_DECLINE;
-}
-
-
-static int UCBDeadPropertyValue_chardata_callback(
- void *userdata,
- int state,
- const char *buf,
- size_t len )
-{
- UCBDeadPropertyValueParseContext * pCtx
- = static_cast< UCBDeadPropertyValueParseContext * >( userdata );
-
- switch ( state )
- {
- case STATE_TYPE:
- assert( !pCtx->pType &&
- "UCBDeadPropertyValue_endelement_callback - "
- "Type already set!" );
- pCtx->pType.reset( new OUString( buf, len, RTL_TEXTENCODING_ASCII_US ) );
- break;
-
- case STATE_VALUE:
- assert( !pCtx->pValue &&
- "UCBDeadPropertyValue_endelement_callback - "
- "Value already set!" );
- pCtx->pValue.reset( new OUString( buf, len, RTL_TEXTENCODING_ASCII_US ) );
- break;
- }
- return 0; // zero to continue, non-zero to abort parsing
-}
-
-
-static int UCBDeadPropertyValue_endelement_callback(
- void *userdata,
- int state,
- const char *,
- const char * )
-{
- UCBDeadPropertyValueParseContext * pCtx
- = static_cast< UCBDeadPropertyValueParseContext * >( userdata );
-
- switch ( state )
- {
- case STATE_TYPE:
- if ( !pCtx->pType )
- return 1; // abort
- break;
-
- case STATE_VALUE:
- if ( !pCtx->pValue )
- return 1; // abort
- break;
-
- case STATE_UCBPROP:
- if ( !pCtx->pType || ! pCtx->pValue )
- return 1; // abort
- break;
- }
- return 0; // zero to continue, non-zero to abort parsing
-}
-
-}
-
-static OUString encodeValue( const OUString & rValue )
-{
- // Note: I do not use the usual &amp; + &lt; + &gt; encoding, because
- // I want to prevent any XML parser from trying to 'understand'
- // the value. This caused problems:
-
- // Example:
- // - Unencoded property value: x<z
- // PROPPATCH:
- // - Encoded property value: x&lt;z
- // - UCBDeadPropertyValue::toXML result:
- // <ucbprop><type>string</type><value>x&lt;z</value></ucbprop>
- // PROPFIND:
- // - parser replaces &lt; by > ==> error (not well formed)
-
- OUStringBuffer aResult;
- const sal_Unicode * pValue = rValue.getStr();
-
- sal_Int32 nCount = rValue.getLength();
- for ( sal_Int32 n = 0; n < nCount; ++n )
- {
- const sal_Unicode c = pValue[ n ];
-
- if ( '%' == c )
- aResult.append( "%per;" );
- else if ( '<' == c )
- aResult.append( "%lt;" );
- else if ( '>' == c )
- aResult.append( "%gt;" );
- else
- aResult.append( c );
- }
- return aResult.makeStringAndClear();
-}
-
-
-static OUString decodeValue( const OUString & rValue )
-{
- OUStringBuffer aResult;
- const sal_Unicode * pValue = rValue.getStr();
-
- sal_Int32 nPos = 0;
- sal_Int32 nEnd = rValue.getLength();
-
- while ( nPos < nEnd )
- {
- sal_Unicode c = pValue[ nPos ];
-
- if ( '%' == c )
- {
- nPos++;
-
- if ( nPos == nEnd )
- {
- SAL_WARN( "ucb.ucp.webdav", "decodeValue() - syntax error!" );
- return OUString();
- }
-
- c = pValue[ nPos ];
-
- if ( 'p' == c )
- {
- // %per;
-
- if ( nPos > nEnd - 4 )
- {
- SAL_WARN( "ucb.ucp.webdav", "decodeValue() - syntax error!" );
- return OUString();
- }
-
- if ( ( 'e' == pValue[ nPos + 1 ] )
- &&
- ( 'r' == pValue[ nPos + 2 ] )
- &&
- ( ';' == pValue[ nPos + 3 ] ) )
- {
- aResult.append( '%' );
- nPos += 3;
- }
- else
- {
- SAL_WARN( "ucb.ucp.webdav", "decodeValue() - syntax error!" );
- return OUString();
- }
- }
- else if ( 'l' == c )
- {
- // %lt;
-
- if ( nPos > nEnd - 3 )
- {
- SAL_WARN( "ucb.ucp.webdav", "decodeValue() - syntax error!" );
- return OUString();
- }
-
- if ( ( 't' == pValue[ nPos + 1 ] )
- &&
- ( ';' == pValue[ nPos + 2 ] ) )
- {
- aResult.append( '<' );
- nPos += 2;
- }
- else
- {
- SAL_WARN( "ucb.ucp.webdav", "decodeValue() - syntax error!" );
- return OUString();
- }
- }
- else if ( 'g' == c )
- {
- // %gt;
-
- if ( nPos > nEnd - 3 )
- {
- SAL_WARN( "ucb.ucp.webdav", "decodeValue() - syntax error!" );
- return OUString();
- }
-
- if ( ( 't' == pValue[ nPos + 1 ] )
- &&
- ( ';' == pValue[ nPos + 2 ] ) )
- {
- aResult.append( '>' );
- nPos += 2;
- }
- else
- {
- SAL_WARN( "ucb.ucp.webdav", "decodeValue() - syntax error!" );
- return OUString();
- }
- }
- else
- {
- SAL_WARN( "ucb.ucp.webdav", "decodeValue() - syntax error!" );
- return OUString();
- }
- }
- else
- aResult.append( c );
-
- nPos++;
- }
-
- return aResult.makeStringAndClear();
-}
-
-
-// static
-bool UCBDeadPropertyValue::supportsType( const uno::Type & rType )
-{
- return rType == cppu::UnoType<OUString>::get()
- || rType == cppu::UnoType<sal_Int32>::get()
- || rType == cppu::UnoType<sal_Int16>::get()
- || rType == cppu::UnoType<bool>::get()
- || rType == cppu::UnoType<cppu::UnoCharType>::get()
- || rType == cppu::UnoType<sal_Int8>::get()
- || rType == cppu::UnoType<sal_Int64>::get()
- || rType == cppu::UnoType<float>::get()
- || rType == cppu::UnoType<double>::get();
-}
-
-
-// static
-bool UCBDeadPropertyValue::createFromXML( const OString & rInData,
- uno::Any & rOutData )
-{
- bool success = false;
-
- ne_xml_parser * parser = ne_xml_create();
- if ( parser )
- {
- UCBDeadPropertyValueParseContext aCtx;
- ne_xml_push_handler( parser,
- UCBDeadPropertyValue_startelement_callback,
- UCBDeadPropertyValue_chardata_callback,
- UCBDeadPropertyValue_endelement_callback,
- &aCtx );
-
- ne_xml_parse( parser, rInData.getStr(), rInData.getLength() );
-
- success = !ne_xml_failed( parser );
-
- ne_xml_destroy( parser );
-
- if ( success )
- {
- if ( aCtx.pType && aCtx.pValue )
- {
- // Decode aCtx.pValue! It may contain XML reserved chars.
- OUString aStringValue = decodeValue( *aCtx.pValue );
- if ( aCtx.pType->equalsIgnoreAsciiCase( aTypeString ) )
- {
- rOutData <<= aStringValue;
- }
- else if ( aCtx.pType->equalsIgnoreAsciiCase( aTypeLong ) )
- {
- rOutData <<= aStringValue.toInt32();
- }
- else if ( aCtx.pType->equalsIgnoreAsciiCase( aTypeShort ) )
- {
- rOutData <<= sal_Int16( aStringValue.toInt32() );
- }
- else if ( aCtx.pType->equalsIgnoreAsciiCase( aTypeBoolean ) )
- {
- if ( aStringValue.equalsIgnoreAsciiCase("true") )
- rOutData <<= true;
- else
- rOutData <<= false;
- }
- else if ( aCtx.pType->equalsIgnoreAsciiCase( aTypeChar ) )
- {
- rOutData <<= aStringValue.toChar();
- }
- else if ( aCtx.pType->equalsIgnoreAsciiCase( aTypeByte ) )
- {
- rOutData <<= sal_Int8( aStringValue.toChar() );
- }
- else if ( aCtx.pType->equalsIgnoreAsciiCase( aTypeHyper ) )
- {
- rOutData <<= aStringValue.toInt64();
- }
- else if ( aCtx.pType->equalsIgnoreAsciiCase( aTypeFloat ) )
- {
- rOutData <<= aStringValue.toFloat();
- }
- else if ( aCtx.pType->equalsIgnoreAsciiCase( aTypeDouble ) )
- {
- rOutData <<= aStringValue.toDouble();
- }
- else
- {
- SAL_WARN( "ucb.ucp.webdav", "createFromXML() - "
- "Unsupported property type!" );
- success = false;
- }
- }
- else
- success = false;
- }
- }
-
- return success;
-}
-
-
-// static
-bool UCBDeadPropertyValue::toXML( const uno::Any & rInData,
- OUString & rOutData )
-{
- // <ucbprop><type>the_type</type><value>the_value</value></ucbprop>
-
- // Check property type. Extract type and value as string.
-
- const uno::Type& rType = rInData.getValueType();
- OUString aStringValue;
- OUString aStringType;
-
- if ( rType == cppu::UnoType<OUString>::get() )
- {
- // string
- rInData >>= aStringValue;
- aStringType = aTypeString;
- }
- else if ( rType == cppu::UnoType<sal_Int32>::get() )
- {
- // long
- sal_Int32 nValue = 0;
- rInData >>= nValue;
- aStringValue = OUString::number( nValue );
- aStringType = aTypeLong;
- }
- else if ( rType == cppu::UnoType<sal_Int16>::get() )
- {
- // short
- sal_Int32 nValue = 0;
- rInData >>= nValue;
- aStringValue = OUString::number( nValue );
- aStringType = aTypeShort;
- }
- else if ( rType == cppu::UnoType<bool>::get() )
- {
- // boolean
- bool bValue = false;
- rInData >>= bValue;
- aStringValue = OUString::boolean( bValue );
- aStringType = aTypeBoolean;
- }
- else if ( rType == cppu::UnoType<cppu::UnoCharType>::get() )
- {
- // char
- sal_Unicode cValue = 0;
- rInData >>= cValue;
- aStringValue = OUString( cValue );
- aStringType = aTypeChar;
- }
- else if ( rType == cppu::UnoType<sal_Int8>::get() )
- {
- // byte
- sal_Int8 nValue = 0;
- rInData >>= nValue;
- aStringValue = OUString( sal_Unicode( nValue ) );
- aStringType = aTypeByte;
- }
- else if ( rType == cppu::UnoType<sal_Int64>::get() )
- {
- // hyper
- sal_Int64 nValue = 0;
- rInData >>= nValue;
- aStringValue = OUString::number( nValue );
- aStringType = aTypeHyper;
- }
- else if ( rType == cppu::UnoType<float>::get() )
- {
- // float
- float nValue = 0;
- rInData >>= nValue;
- aStringValue = OUString::number( nValue );
- aStringType = aTypeFloat;
- }
- else if ( rType == cppu::UnoType<double>::get() )
- {
- // double
- double nValue = 0;
- rInData >>= nValue;
- aStringValue = OUString::number( nValue );
- aStringType = aTypeDouble;
- }
- else
- {
- SAL_WARN( "ucb.ucp.webdav", "toXML() - unsupported property type!" );
- return false;
- }
-
- // Encode value! It must not contain XML reserved chars!
- aStringValue = encodeValue( aStringValue );
-
- rOutData = aXMLPre;
- rOutData += aStringType;
- rOutData += aXMLMid;
- rOutData += aStringValue;
- rOutData += aXMLEnd;
-
- return true;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/UCBDeadPropertyValue.hxx b/ucb/source/ucp/webdav-neon/UCBDeadPropertyValue.hxx
deleted file mode 100644
index 5f2b38ed1f9e..000000000000
--- a/ucb/source/ucp/webdav-neon/UCBDeadPropertyValue.hxx
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <rtl/string.hxx>
-#include <com/sun/star/uno/Any.hxx>
-
-namespace webdav_ucp
-{
-
-class UCBDeadPropertyValue
-{
-public:
- static bool supportsType( const css::uno::Type & rType );
-
- static bool createFromXML( const OString & rInData,
- css::uno::Any & rOutData );
- static bool toXML( const css::uno::Any & rInData,
- OUString & rOutData );
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/ucpdav1.component b/ucb/source/ucp/webdav-neon/ucpdav1.component
deleted file mode 100644
index 23be195bf453..000000000000
--- a/ucb/source/ucp/webdav-neon/ucpdav1.component
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--**********************************************************************
-*
-* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-*
-* Copyright 2000, 2010 Oracle and/or its affiliates.
-*
-* OpenOffice.org - a multi-platform office productivity suite
-*
-* This file is part of OpenOffice.org.
-*
-* OpenOffice.org is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License version 3
-* only, as published by the Free Software Foundation.
-*
-* OpenOffice.org is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU Lesser General Public License version 3 for more details
-* (a copy is included in the LICENSE file that accompanied this code).
-*
-* You should have received a copy of the GNU Lesser General Public License
-* version 3 along with OpenOffice.org. If not, see
-* <http://www.openoffice.org/license.html>
-* for a copy of the LGPLv3 License.
-*
-**********************************************************************-->
-
-<component loader="com.sun.star.loader.SharedLibrary" environment="@CPPU_ENV@"
- xmlns="http://openoffice.org/2010/uno-components">
- <implementation name="com.sun.star.comp.WebDAVContentProvider"
- constructor="ucb_webdav_neon_ContentProvider_get_implementation">
- <service name="com.sun.star.ucb.WebDAVContentProvider"/>
- </implementation>
-</component>
diff --git a/ucb/source/ucp/webdav-neon/webdavcontent.cxx b/ucb/source/ucp/webdav-neon/webdavcontent.cxx
deleted file mode 100644
index c3310e24f9cc..000000000000
--- a/ucb/source/ucp/webdav-neon/webdavcontent.cxx
+++ /dev/null
@@ -1,4197 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-
-/**************************************************************************
- TODO
- **************************************************************************
-
- *************************************************************************/
-
-#include <memory>
-#include <rtl/uri.hxx>
-#include <rtl/ustrbuf.hxx>
-#include <sal/log.hxx>
-#include <cppuhelper/queryinterface.hxx>
-#include <officecfg/Inet.hxx>
-#include <ucbhelper/contentidentifier.hxx>
-#include <ucbhelper/propertyvalueset.hxx>
-#include <ucbhelper/simpleinteractionrequest.hxx>
-#include <ucbhelper/cancelcommandexecution.hxx>
-#include <com/sun/star/beans/IllegalTypeException.hpp>
-#include <com/sun/star/beans/NotRemoveableException.hpp>
-#include <com/sun/star/beans/PropertyAttribute.hpp>
-#include <com/sun/star/beans/PropertyExistException.hpp>
-#include <com/sun/star/beans/PropertySetInfoChange.hpp>
-#include <com/sun/star/beans/PropertySetInfoChangeEvent.hpp>
-#include <com/sun/star/beans/PropertyValue.hpp>
-#include <com/sun/star/io/XActiveDataSink.hpp>
-#include <com/sun/star/io/XOutputStream.hpp>
-#include <com/sun/star/lang/IllegalAccessException.hpp>
-#include <com/sun/star/sdbc/SQLException.hpp>
-#include <com/sun/star/task/PasswordContainerInteractionHandler.hpp>
-#include <com/sun/star/ucb/CommandEnvironment.hpp>
-#include <com/sun/star/ucb/CommandFailedException.hpp>
-#include <com/sun/star/ucb/ContentInfoAttribute.hpp>
-#include <com/sun/star/ucb/IllegalIdentifierException.hpp>
-#include <com/sun/star/ucb/InsertCommandArgument.hpp>
-#include <com/sun/star/ucb/InteractiveBadTransferURLException.hpp>
-#include <com/sun/star/ucb/InteractiveAugmentedIOException.hpp>
-#include <com/sun/star/ucb/InteractiveLockingLockedException.hpp>
-#include <com/sun/star/ucb/InteractiveLockingLockExpiredException.hpp>
-#include <com/sun/star/ucb/InteractiveLockingNotLockedException.hpp>
-#include <com/sun/star/ucb/InteractiveNetworkConnectException.hpp>
-#include <com/sun/star/ucb/InteractiveNetworkGeneralException.hpp>
-#include <com/sun/star/ucb/InteractiveNetworkReadException.hpp>
-#include <com/sun/star/ucb/InteractiveNetworkResolveNameException.hpp>
-#include <com/sun/star/ucb/InteractiveNetworkWriteException.hpp>
-#include <com/sun/star/ucb/MissingInputStreamException.hpp>
-#include <com/sun/star/ucb/MissingPropertiesException.hpp>
-#include <com/sun/star/ucb/NameClash.hpp>
-#include <com/sun/star/ucb/NameClashException.hpp>
-#include <com/sun/star/ucb/OpenCommandArgument3.hpp>
-#include <com/sun/star/ucb/OpenMode.hpp>
-#include <com/sun/star/ucb/PostCommandArgument2.hpp>
-#include <com/sun/star/ucb/PropertyCommandArgument.hpp>
-#include <com/sun/star/ucb/TransferInfo.hpp>
-#include <com/sun/star/ucb/UnsupportedCommandException.hpp>
-#include <com/sun/star/ucb/UnsupportedDataSinkException.hpp>
-#include <com/sun/star/ucb/UnsupportedNameClashException.hpp>
-#include <com/sun/star/ucb/UnsupportedOpenModeException.hpp>
-#include <com/sun/star/ucb/XCommandInfo.hpp>
-#include <com/sun/star/ucb/XPersistentPropertySet.hpp>
-#include <ucbhelper/macros.hxx>
-
-#include "webdavcontent.hxx"
-#include "webdavprovider.hxx"
-#include "webdavresultset.hxx"
-#include "ContentProperties.hxx"
-#include "NeonUri.hxx"
-#include "UCBDeadPropertyValue.hxx"
-
-using namespace com::sun::star;
-using namespace webdav_ucp;
-
-namespace
-{
- // implement a GET to substitute HEAD, when HEAD not available
- void lcl_sendPartialGETRequest( bool &bError,
- DAVException &aLastException,
- const std::vector< OUString >& rProps,
- std::vector< OUString > &aHeaderNames,
- const std::unique_ptr< DAVResourceAccess > &xResAccess,
- std::unique_ptr< ContentProperties > &xProps,
- const uno::Reference< ucb::XCommandEnvironment >& xEnv )
- {
- DAVResource aResource;
- DAVRequestHeaders aPartialGet;
- aPartialGet.emplace_back( OUString( "Range" ), // see <https://tools.ietf.org/html/rfc7233#section-3.1>
- OUString( "bytes=0-0" ) );
-
- bool bIsRequestSize = std::any_of(aHeaderNames.begin(), aHeaderNames.end(),
- [](const OUString& rHeaderName) { return rHeaderName == "Content-Length"; });
-
- if ( bIsRequestSize )
- {
- // we need to know if the server accepts range requests for a resource
- // and the range unit it uses
- aHeaderNames.emplace_back( "Accept-Ranges" ); // see <https://tools.ietf.org/html/rfc7233#section-2.3>
- aHeaderNames.emplace_back( "Content-Range" ); // see <https://tools.ietf.org/html/rfc7233#section-4.2>
- }
- try
- {
- xResAccess->GET0( aPartialGet, aHeaderNames, aResource, xEnv );
- bError = false;
-
- if ( bIsRequestSize )
- {
- // the ContentProperties maps "Content-Length" to the UCB "Size" property
- // This would have an unrealistic value of 1 byte because we did only a partial GET
- // Solution: if "Content-Range" is present, map it with UCB "Size" property
- OUString aAcceptRanges, aContentRange, aContentLength;
- std::vector< DAVPropertyValue > &aResponseProps = aResource.properties;
- for ( const auto& rResponseProp : aResponseProps )
- {
- if ( rResponseProp.Name == "Accept-Ranges" )
- rResponseProp.Value >>= aAcceptRanges;
- else if ( rResponseProp.Name == "Content-Range" )
- rResponseProp.Value >>= aContentRange;
- else if ( rResponseProp.Name == "Content-Length" )
- rResponseProp.Value >>= aContentLength;
- }
-
- sal_Int64 nSize = 1;
- if ( aContentLength.getLength() )
- {
- nSize = aContentLength.toInt64();
- }
-
- // according to <> http://tools.ietf.org/html/rfc2616#section-3.12
- // <https://tools.ietf.org/html/rfc7233#section-2>
- // needs some explanation for this
- // probably some changes?
- // the only range unit defined is "bytes" and implementations
- // MAY ignore ranges specified using other units.
- if ( nSize == 1 &&
- aContentRange.getLength() &&
- aAcceptRanges == "bytes" )
- {
- // Parse the Content-Range to get the size
- // vid. http://tools.ietf.org/html/rfc2616#section-14.16
- // Content-Range: <range unit> <bytes range>/<size>
- sal_Int32 nSlash = aContentRange.lastIndexOf( '/' );
- if ( nSlash != -1 )
- {
- OUString aSize = aContentRange.copy( nSlash + 1 );
- // "*" means that the instance-length is unknown at the time when the response was generated
- if ( aSize != "*" )
- {
- auto it = std::find_if(aResponseProps.begin(), aResponseProps.end(),
- [](const DAVPropertyValue& rProp) { return rProp.Name == "Content-Length"; });
- if (it != aResponseProps.end())
- {
- it->Value <<= aSize;
- }
- }
- }
- }
- }
-
- if (xProps)
- xProps->addProperties(
- rProps,
- ContentProperties( aResource ) );
- else
- xProps.reset ( new ContentProperties( aResource ) );
- }
- catch ( DAVException const & ex )
- {
- aLastException = ex;
- }
- }
-}
-
-
-// Static value, to manage a simple OPTIONS cache
-// Key is the URL, element is the DAVOptions resulting from an OPTIONS call.
-// Cached DAVOptions have a lifetime that depends on the errors received or not received
-// and on the value of received options.
-static DAVOptionsCache aStaticDAVOptionsCache;
-
-
-// Content Implementation.
-
-
-// ctr for content on an existing webdav resource
-Content::Content(
- const uno::Reference< uno::XComponentContext >& rxContext,
- ContentProvider* pProvider,
- const uno::Reference< ucb::XContentIdentifier >& Identifier,
- rtl::Reference< DAVSessionFactory > const & rSessionFactory )
-: ContentImplHelper( rxContext, pProvider, Identifier ),
- m_eResourceType( UNKNOWN ),
- m_eResourceTypeForLocks( UNKNOWN ),
- m_pProvider( pProvider ),
- m_bTransient( false ),
- m_bCollection( false ),
- m_bDidGetOrHead( false )
-{
- try
- {
- initOptsCacheLifeTime();
- m_xResAccess.reset( new DAVResourceAccess(
- rxContext,
- rSessionFactory,
- Identifier->getContentIdentifier() ) );
-
- NeonUri aURI( Identifier->getContentIdentifier() );
- m_aEscapedTitle = aURI.GetPathBaseName();
- }
- catch ( DAVException const & )
- {
- throw ucb::ContentCreationException();
- }
-}
-
-
-// ctr for content on a non-existing webdav resource
-Content::Content(
- const uno::Reference< uno::XComponentContext >& rxContext,
- ContentProvider* pProvider,
- const uno::Reference< ucb::XContentIdentifier >& Identifier,
- rtl::Reference< DAVSessionFactory > const & rSessionFactory,
- bool isCollection )
-: ContentImplHelper( rxContext, pProvider, Identifier ),
- m_eResourceType( UNKNOWN ),
- m_eResourceTypeForLocks( UNKNOWN ),
- m_pProvider( pProvider ),
- m_bTransient( true ),
- m_bCollection( isCollection ),
- m_bDidGetOrHead( false )
-{
- try
- {
- initOptsCacheLifeTime();
- m_xResAccess.reset( new DAVResourceAccess(
- rxContext, rSessionFactory, Identifier->getContentIdentifier() ) );
- }
- catch ( DAVException const & )
- {
- throw ucb::ContentCreationException();
- }
-
- // Do not set m_aEscapedTitle here! Content::insert relays on this!!!
-}
-
-
-// virtual
-Content::~Content()
-{
-}
-
-
-// XInterface methods.
-
-
-// virtual
-void SAL_CALL Content::acquire()
- noexcept
-{
- ContentImplHelper::acquire();
-}
-
-
-// virtual
-void SAL_CALL Content::release()
- noexcept
-{
- ContentImplHelper::release();
-}
-
-
-// virtual
-uno::Any SAL_CALL Content::queryInterface( const uno::Type & rType )
-{
- // Note: isFolder may require network activities! So call it only
- // if it is really necessary!!!
- uno::Any aRet = cppu::queryInterface(
- rType,
- static_cast< ucb::XContentCreator * >( this ) );
- if ( aRet.hasValue() )
- {
- try
- {
- uno::Reference< task::XInteractionHandler > xIH(
- task::PasswordContainerInteractionHandler::create( m_xContext ) );
-
- // Supply a command env to isFolder() that contains an interaction
- // handler that uses the password container service to obtain
- // credentials without displaying a password gui.
-
- uno::Reference< ucb::XCommandEnvironment > xCmdEnv(
- ucb::CommandEnvironment::create(
- m_xContext,
- xIH,
- uno::Reference< ucb::XProgressHandler >() ) );
-
- return isFolder( xCmdEnv ) ? aRet : uno::Any();
- }
- catch ( uno::RuntimeException const & )
- {
- throw;
- }
- catch ( uno::Exception const & )
- {
- return uno::Any();
- }
- }
- return aRet.hasValue() ? aRet : ContentImplHelper::queryInterface( rType );
-}
-
-
-// XTypeProvider methods.
-
-
-XTYPEPROVIDER_COMMON_IMPL( Content );
-
-
-// virtual
-uno::Sequence< uno::Type > SAL_CALL Content::getTypes()
-{
- bool bFolder = false;
- try
- {
- bFolder
- = isFolder( uno::Reference< ucb::XCommandEnvironment >() );
- }
- catch ( uno::RuntimeException const & )
- {
- throw;
- }
- catch ( uno::Exception const & )
- {
- }
-
- if ( bFolder )
- {
- static cppu::OTypeCollection s_aFolderTypes(
- CPPU_TYPE_REF( lang::XTypeProvider ),
- CPPU_TYPE_REF( lang::XServiceInfo ),
- CPPU_TYPE_REF( lang::XComponent ),
- CPPU_TYPE_REF( ucb::XContent ),
- CPPU_TYPE_REF( ucb::XCommandProcessor ),
- CPPU_TYPE_REF( beans::XPropertiesChangeNotifier ),
- CPPU_TYPE_REF( ucb::XCommandInfoChangeNotifier ),
- CPPU_TYPE_REF( beans::XPropertyContainer ),
- CPPU_TYPE_REF( beans::XPropertySetInfoChangeNotifier ),
- CPPU_TYPE_REF( container::XChild ),
- CPPU_TYPE_REF( ucb::XContentCreator ) );
-
- return s_aFolderTypes.getTypes();
- }
- else
- {
- static cppu::OTypeCollection s_aDocumentTypes(
- CPPU_TYPE_REF( lang::XTypeProvider ),
- CPPU_TYPE_REF( lang::XServiceInfo ),
- CPPU_TYPE_REF( lang::XComponent ),
- CPPU_TYPE_REF( ucb::XContent ),
- CPPU_TYPE_REF( ucb::XCommandProcessor ),
- CPPU_TYPE_REF( beans::XPropertiesChangeNotifier ),
- CPPU_TYPE_REF( ucb::XCommandInfoChangeNotifier ),
- CPPU_TYPE_REF( beans::XPropertyContainer ),
- CPPU_TYPE_REF( beans::XPropertySetInfoChangeNotifier ),
- CPPU_TYPE_REF( container::XChild ) );
-
- return s_aDocumentTypes.getTypes();
- }
-}
-
-
-// XServiceInfo methods.
-
-
-// virtual
-OUString SAL_CALL Content::getImplementationName()
-{
- return "com.sun.star.comp.ucb.WebDAVContent";
-}
-
-
-// virtual
-uno::Sequence< OUString > SAL_CALL Content::getSupportedServiceNames()
-{
- return { WEBDAV_CONTENT_SERVICE_NAME };
-}
-
-
-// XContent methods.
-
-
-// virtual
-OUString SAL_CALL Content::getContentType()
-{
- bool bFolder = false;
- try
- {
- bFolder
- = isFolder( uno::Reference< ucb::XCommandEnvironment >() );
- }
- catch ( uno::RuntimeException const & )
- {
- throw;
- }
- catch ( uno::Exception const & )
- {
- }
-
- if ( bFolder )
- return WEBDAV_COLLECTION_TYPE;
-
- return WEBDAV_CONTENT_TYPE;
-}
-
-
-// XCommandProcessor methods.
-
-
-// virtual
-uno::Any SAL_CALL Content::execute(
- const ucb::Command& aCommand,
- sal_Int32 /*CommandId*/,
- const uno::Reference< ucb::XCommandEnvironment >& Environment )
-{
- SAL_INFO( "ucb.ucp.webdav", "Content::execute: start: command: " <<
- aCommand.Name << ", env: " <<
- (Environment.is() ? "present" : "missing") );
-
- uno::Any aRet;
-
- if ( aCommand.Name == "getPropertyValues" )
- {
-
- // getPropertyValues
-
-
- uno::Sequence< beans::Property > Properties;
- if ( !( aCommand.Argument >>= Properties ) )
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny( lang::IllegalArgumentException(
- "Wrong argument type!",
- static_cast< cppu::OWeakObject * >( this ),
- -1 ) ),
- Environment );
- // Unreachable
- }
-
- aRet <<= getPropertyValues( Properties, Environment );
- }
- else if ( aCommand.Name == "setPropertyValues" )
- {
-
- // setPropertyValues
-
-
- uno::Sequence< beans::PropertyValue > aProperties;
- if ( !( aCommand.Argument >>= aProperties ) )
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny( lang::IllegalArgumentException(
- "Wrong argument type!",
- static_cast< cppu::OWeakObject * >( this ),
- -1 ) ),
- Environment );
- // Unreachable
- }
-
- if ( !aProperties.hasElements() )
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny( lang::IllegalArgumentException(
- "No properties!",
- static_cast< cppu::OWeakObject * >( this ),
- -1 ) ),
- Environment );
- // Unreachable
- }
-
- aRet <<= setPropertyValues( aProperties, Environment );
- }
- else if ( aCommand.Name == "getPropertySetInfo" )
- {
-
- // getPropertySetInfo
-
-
- // Note: Implemented by base class.
- aRet <<= getPropertySetInfo( Environment,
- false /* don't cache data */ );
- }
- else if ( aCommand.Name == "getCommandInfo" )
- {
-
- // getCommandInfo
-
-
- // Note: Implemented by base class.
- aRet <<= getCommandInfo( Environment, false );
- }
- else if ( aCommand.Name == "open" )
- {
-
- // open
-
-
- ucb::OpenCommandArgument3 aOpenCommand;
- ucb::OpenCommandArgument2 aTmp;
- if ( !( aCommand.Argument >>= aTmp ) )
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny( lang::IllegalArgumentException(
- "Wrong argument type!",
- static_cast< cppu::OWeakObject * >( this ),
- -1 ) ),
- Environment );
- // Unreachable
- }
- if ( !( aCommand.Argument >>= aOpenCommand ) )
- {
- // compat mode, extract Arg2 info into newer structure
- aOpenCommand.Mode = aTmp.Mode;
- aOpenCommand.Priority = aTmp.Priority;
- aOpenCommand.Sink = aTmp.Sink;
- aOpenCommand.Properties = aTmp.Properties;
- aOpenCommand.SortingInfo = aTmp.SortingInfo;
- }
-
- aRet = open( aOpenCommand, Environment );
-
- }
- else if ( aCommand.Name == "insert" )
- {
-
- // insert
-
-
- ucb::InsertCommandArgument arg;
- if ( !( aCommand.Argument >>= arg ) )
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny( lang::IllegalArgumentException(
- "Wrong argument type!",
- static_cast< cppu::OWeakObject * >( this ),
- -1 ) ),
- Environment );
- // Unreachable
- }
-
- insert( arg.Data, arg.ReplaceExisting, Environment );
- }
- else if ( aCommand.Name == "delete" )
- {
-
- // delete
-
-
- bool bDeletePhysical = false;
- aCommand.Argument >>= bDeletePhysical;
-
-// KSO: Ignore parameter and destroy the content, if you don't support
-// putting objects into trashcan. ( Since we do not have a trash can
-// service yet (src603), you actually have no other choice. )
-// if ( bDeletePhysical )
-// {
- try
- {
- std::unique_ptr< DAVResourceAccess > xResAccess;
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- }
- aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() );
- // clean cached value of PROPFIND property names
- removeCachedPropertyNames( xResAccess->getURL() );
- xResAccess->DESTROY( Environment );
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
- }
- catch ( DAVException const & e )
- {
- cancelCommandExecution( e, Environment, true );
- // Unreachable
- }
-// }
-
- // Propagate destruction.
- destroy( bDeletePhysical );
-
- // Remove own and all children's Additional Core Properties.
- removeAdditionalPropertySet();
- }
- else if ( aCommand.Name == "transfer" && isFolder( Environment ) )
- {
-
- // transfer
- // ( Not available at documents )
-
-
- ucb::TransferInfo transferArgs;
- if ( !( aCommand.Argument >>= transferArgs ) )
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny( lang::IllegalArgumentException(
- "Wrong argument type!",
- static_cast< cppu::OWeakObject * >( this ),
- -1 ) ),
- Environment );
- // Unreachable
- }
-
- transfer( transferArgs, Environment );
- }
- else if ( aCommand.Name == "post" )
- {
-
- // post
-
-
- ucb::PostCommandArgument2 aArg;
- if ( !( aCommand.Argument >>= aArg ) )
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny( lang::IllegalArgumentException(
- "Wrong argument type!",
- static_cast< cppu::OWeakObject * >( this ),
- -1 ) ),
- Environment );
- // Unreachable
- }
-
- post( aArg, Environment );
- }
- else if ( aCommand.Name == "lock" )
- {
-
- // lock
-
- ResourceType eType = resourceTypeForLocks( Environment );
- // when the resource is not yet present the lock is used to create it
- // see: http://tools.ietf.org/html/rfc4918#section-7.3
- // If the resource doesn't exists and the lock is not enabled (DAV with
- // no lock or a simple web) the error will be dealt with inside lock() method
- if ( eType == NOT_FOUND ||
- eType == DAV )
- {
- lock( Environment );
- if ( eType == NOT_FOUND )
- {
- m_eResourceType = UNKNOWN; // lock may have created it, need to check again
- m_eResourceTypeForLocks = UNKNOWN;
- }
- }
- }
- else if ( aCommand.Name == "unlock" )
- {
-
- // unlock
- // do not check for a DAV resource
- // the lock store will be checked before sending
- unlock( Environment );
- }
- else if ( aCommand.Name == "createNewContent" && isFolder( Environment ) )
- {
-
- // createNewContent
-
-
- ucb::ContentInfo aArg;
- if ( !( aCommand.Argument >>= aArg ) )
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny( lang::IllegalArgumentException(
- "Wrong argument type!",
- static_cast< cppu::OWeakObject * >( this ),
- -1 ) ),
- Environment );
- // Unreachable
- }
-
- aRet <<= createNewContent( aArg );
- }
- else if ( aCommand.Name == "addProperty" )
- {
- ucb::PropertyCommandArgument aPropArg;
- if ( !( aCommand.Argument >>= aPropArg ))
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny( lang::IllegalArgumentException(
- "Wrong argument type!",
- static_cast< cppu::OWeakObject * >( this ),
- -1 ) ),
- Environment );
- }
-
- // TODO when/if XPropertyContainer is removed,
- // the command execution can be canceled in addProperty
- try
- {
- addProperty( aPropArg, Environment );
- }
- catch ( const beans::PropertyExistException &e )
- {
- ucbhelper::cancelCommandExecution( uno::makeAny( e ), Environment );
- }
- catch ( const beans::IllegalTypeException&e )
- {
- ucbhelper::cancelCommandExecution( uno::makeAny( e ), Environment );
- }
- catch ( const lang::IllegalArgumentException&e )
- {
- ucbhelper::cancelCommandExecution( uno::makeAny( e ), Environment );
- }
- }
- else if ( aCommand.Name == "removeProperty" )
- {
- OUString sPropName;
- if ( !( aCommand.Argument >>= sPropName ) )
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny( lang::IllegalArgumentException(
- "Wrong argument type!",
- static_cast< cppu::OWeakObject * >( this ),
- -1 ) ),
- Environment );
- }
-
- // TODO when/if XPropertyContainer is removed,
- // the command execution can be canceled in removeProperty
- try
- {
- removeProperty( sPropName, Environment );
- }
- catch( const beans::UnknownPropertyException &e )
- {
- ucbhelper::cancelCommandExecution( uno::makeAny( e ), Environment );
- }
- catch( const beans::NotRemoveableException &e )
- {
- ucbhelper::cancelCommandExecution( uno::makeAny( e ), Environment );
- }
- }
- else
- {
-
- // Unsupported command
-
-
- ucbhelper::cancelCommandExecution(
- uno::makeAny( ucb::UnsupportedCommandException(
- aCommand.Name,
- static_cast< cppu::OWeakObject * >( this ) ) ),
- Environment );
- // Unreachable
- }
-
- SAL_INFO( "ucb.ucp.webdav", "Content::execute: end: command: " << aCommand.Name );
-
- return aRet;
-}
-
-
-// virtual
-void SAL_CALL Content::abort( sal_Int32 /*CommandId*/ )
-{
- try
- {
- std::unique_ptr< DAVResourceAccess > xResAccess;
- {
- osl::MutexGuard aGuard( m_aMutex );
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- }
- xResAccess->abort();
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
- }
- catch ( DAVException const & )
- {
- // abort failed!
- }
-}
-
-
-// XPropertyContainer methods.
-
-
-void Content::addProperty( const ucb::PropertyCommandArgument& aCmdArg,
- const uno::Reference< ucb::XCommandEnvironment >& xEnv )
-{
-// if ( m_bTransient )
-// @@@ ???
-
- if ( aCmdArg.Property.Name.isEmpty() )
- throw lang::IllegalArgumentException(
- "\"addProperty\" with empty Property.Name",
- static_cast< cppu::OWeakObject * >( this ),
- -1 );
-
- // Check property type.
- if ( !UCBDeadPropertyValue::supportsType( aCmdArg.Property.Type ) )
- {
- throw beans::IllegalTypeException(
- "\"addProperty\" unsupported Property.Type",
- static_cast< cppu::OWeakObject * >( this ) );
- }
-
- if ( aCmdArg.DefaultValue.hasValue()
- && aCmdArg.DefaultValue.getValueType() != aCmdArg.Property.Type )
- {
- throw beans::IllegalTypeException(
- "\"addProperty\" DefaultValue does not match Property.Type",
- static_cast< ::cppu::OWeakObject * >( this ) );
- }
-
-
- // Make sure a property with the requested name does not already
- // exist in dynamic and static(!) properties.
-
-
- // Take into account special properties with custom namespace
- // using <prop:the_propname xmlns:prop="the_namespace">
- OUString aSpecialName;
- bool bIsSpecial = DAVProperties::isUCBSpecialProperty(
- aCmdArg.Property.Name, aSpecialName );
-
- // Note: This requires network access!
- if ( getPropertySetInfo( xEnv, false /* don't cache data */ )
- ->hasPropertyByName(
- bIsSpecial ? aSpecialName : aCmdArg.Property.Name ) )
- {
- // Property does already exist.
- throw beans::PropertyExistException();
- }
-
-
- // Add a new dynamic property.
-
-
- ProppatchValue aValue(
- PROPSET, aCmdArg.Property.Name, aCmdArg.DefaultValue );
-
- try
- {
- // Set property value at server.
- std::unique_ptr< DAVResourceAccess > xResAccess;
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- }
- aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() );
- // clean cached value of PROPFIND property names
- // PROPPATCH can change them
- removeCachedPropertyNames( xResAccess->getURL() );
- xResAccess->PROPPATCH( { aValue }, xEnv );
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
-
- // Notify propertyset info change listeners.
- beans::PropertySetInfoChangeEvent evt(
- static_cast< cppu::OWeakObject * >( this ),
- bIsSpecial ? aSpecialName : aCmdArg.Property.Name,
- -1, // No handle available
- beans::PropertySetInfoChange::PROPERTY_INSERTED );
- notifyPropertySetInfoChange( evt );
- }
- catch ( DAVException const & e )
- {
- if ( e.getStatus() == SC_FORBIDDEN )
- {
- // Support for setting arbitrary dead properties is optional!
-
- // Store property locally.
- ContentImplHelper::addProperty(
- bIsSpecial ? aSpecialName : aCmdArg.Property.Name,
- aCmdArg.Property.Attributes, aCmdArg.DefaultValue );
- }
- else
- {
- if ( shouldAccessNetworkAfterException( e ) )
- {
- try
- {
- ResourceType eType = getResourceType( xEnv );
- switch ( eType )
- {
- case UNKNOWN:
- case DAV:
- throw lang::IllegalArgumentException();
-
- case FTP:
- case NON_DAV:
- // Store property locally.
- ContentImplHelper::addProperty(
- bIsSpecial ? aSpecialName : aCmdArg.Property.Name,
- aCmdArg.Property.Attributes, aCmdArg.DefaultValue );
- break;
-
- default:
- SAL_WARN( "ucb.ucp.webdav", "Content::addProperty - "
- "Unsupported resource type!" );
- break;
- }
- }
- catch ( uno::Exception const & )
- {
- SAL_WARN( "ucb.ucp.webdav", "Content::addProperty - "
- "Unable to determine resource type!" );
- }
- }
- else
- {
- SAL_WARN( "ucb.ucp.webdav", "Content::addProperty - "
- "Unable to determine resource type!" );
- }
- }
- }
-}
-
-void Content::removeProperty( const OUString& Name,
- const uno::Reference< ucb::XCommandEnvironment >& xEnv )
-{
-
- // Try to remove property from server.
-
-
- try
- {
- ProppatchValue aValue( PROPREMOVE, Name, uno::Any() );
-
- // Remove property value from server.
- std::unique_ptr< DAVResourceAccess > xResAccess;
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- }
- aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() );
- // clean cached value of PROPFIND property names
- // PROPPATCH can change them
- removeCachedPropertyNames( xResAccess->getURL() );
- xResAccess->PROPPATCH( { aValue }, xEnv );
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
-
- // Notify propertyset info change listeners.
- beans::PropertySetInfoChangeEvent evt(
- static_cast< cppu::OWeakObject * >( this ),
- Name,
- -1, // No handle available
- beans::PropertySetInfoChange::PROPERTY_REMOVED );
- notifyPropertySetInfoChange( evt );
- }
- catch ( DAVException const & e )
- {
- if ( e.getStatus() == SC_FORBIDDEN )
- {
- // Support for setting arbitrary dead properties is optional!
-
- // Try to remove property from local store.
- ContentImplHelper::removeProperty( Name );
- }
- else
- {
- if ( shouldAccessNetworkAfterException( e ) )
- {
- try
- {
- ResourceType eType = getResourceType( xEnv );
- switch ( eType )
- {
- case UNKNOWN:
- case DAV:
- throw beans::UnknownPropertyException(Name);
-
- case FTP:
- case NON_DAV:
- // Try to remove property from local store.
- ContentImplHelper::removeProperty( Name );
- break;
-
- default:
- SAL_WARN( "ucb.ucp.webdav", "Content::removeProperty - "
- "Unsupported resource type!" );
- break;
- }
- }
- catch ( uno::Exception const & )
- {
- SAL_WARN( "ucb.ucp.webdav", "Content::removeProperty - "
- "Unable to determine resource type!" );
- }
- }
- else
- {
- SAL_WARN( "ucb.ucp.webdav", "Content::removeProperty - "
- "Unable to determine resource type!" );
-// throw beans::UnknownPropertyException();
- }
- }
- }
-}
-
-// virtual
-void SAL_CALL Content::addProperty( const OUString& Name,
- sal_Int16 Attributes,
- const uno::Any& DefaultValue )
-{
- beans::Property aProperty;
- aProperty.Name = Name;
- aProperty.Type = DefaultValue.getValueType();
- aProperty.Attributes = Attributes;
- aProperty.Handle = -1;
-
- addProperty( ucb::PropertyCommandArgument( aProperty, DefaultValue ),
- uno::Reference< ucb::XCommandEnvironment >());
-}
-
-// virtual
-void SAL_CALL Content::removeProperty( const OUString& Name )
-{
- removeProperty( Name,
- uno::Reference< ucb::XCommandEnvironment >() );
-}
-
-
-// XContentCreator methods.
-
-
-// virtual
-uno::Sequence< ucb::ContentInfo > SAL_CALL
-Content::queryCreatableContentsInfo()
-{
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
-
- uno::Sequence< ucb::ContentInfo > aSeq( 2 );
-
- // document.
- aSeq.getArray()[ 0 ].Type = WEBDAV_CONTENT_TYPE;
- aSeq.getArray()[ 0 ].Attributes
- = ucb::ContentInfoAttribute::INSERT_WITH_INPUTSTREAM
- | ucb::ContentInfoAttribute::KIND_DOCUMENT;
-
- beans::Property aProp;
- m_pProvider->getProperty(
- "Title", aProp );
-
- uno::Sequence< beans::Property > aDocProps( 1 );
- aDocProps.getArray()[ 0 ] = aProp;
- aSeq.getArray()[ 0 ].Properties = aDocProps;
-
- // folder.
- aSeq.getArray()[ 1 ].Type = WEBDAV_COLLECTION_TYPE;
- aSeq.getArray()[ 1 ].Attributes
- = ucb::ContentInfoAttribute::KIND_FOLDER;
-
- uno::Sequence< beans::Property > aFolderProps( 1 );
- aFolderProps.getArray()[ 0 ] = aProp;
- aSeq.getArray()[ 1 ].Properties = aFolderProps;
- return aSeq;
-}
-
-
-// virtual
-uno::Reference< ucb::XContent > SAL_CALL
-Content::createNewContent( const ucb::ContentInfo& Info )
-{
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
-
- if ( Info.Type.isEmpty() )
- return uno::Reference< ucb::XContent >();
-
- if ( ( Info.Type != WEBDAV_COLLECTION_TYPE ) && ( Info.Type != WEBDAV_CONTENT_TYPE ) )
- return uno::Reference< ucb::XContent >();
-
- OUString aURL = m_xIdentifier->getContentIdentifier();
-
- assert( !aURL.isEmpty() && "WebdavContent::createNewContent - empty identifier!" );
-
- if ( ( aURL.lastIndexOf( '/' ) + 1 ) != aURL.getLength() )
- aURL += "/";
-
- bool isCollection;
- if ( Info.Type == WEBDAV_COLLECTION_TYPE )
- {
- aURL += "New_Collection";
- isCollection = true;
- }
- else
- {
- aURL += "New_Content";
- isCollection = false;
- }
-
- uno::Reference< ucb::XContentIdentifier > xId(
- new ::ucbhelper::ContentIdentifier( aURL ) );
-
- // create the local content
- try
- {
- return new ::webdav_ucp::Content( m_xContext,
- m_pProvider,
- xId,
- m_xResAccess->getSessionFactory(),
- isCollection );
- }
- catch ( ucb::ContentCreationException & )
- {
- return uno::Reference< ucb::XContent >();
- }
-}
-
-
-// virtual
-OUString Content::getParentURL()
-{
- // <scheme>:// -> ""
- // <scheme>://foo -> ""
- // <scheme>://foo/ -> ""
- // <scheme>://foo/bar -> <scheme>://foo/
- // <scheme>://foo/bar/ -> <scheme>://foo/
- // <scheme>://foo/bar/abc -> <scheme>://foo/bar/
-
- OUString aURL = m_xIdentifier->getContentIdentifier();
-
- sal_Int32 nPos = aURL.lastIndexOf( '/' );
- if ( nPos == ( aURL.getLength() - 1 ) )
- {
- // Trailing slash found. Skip.
- nPos = aURL.lastIndexOf( '/', nPos );
- }
-
- sal_Int32 nPos1 = aURL.lastIndexOf( '/', nPos );
- if ( nPos1 != -1 )
- nPos1 = aURL.lastIndexOf( '/', nPos1 );
-
- if ( nPos1 == -1 )
- return OUString();
-
- return aURL.copy( 0, nPos + 1 );
-}
-
-
-// Non-interface methods.
-
-
-// static
-uno::Reference< sdbc::XRow > Content::getPropertyValues(
- const uno::Reference< uno::XComponentContext >& rxContext,
- const uno::Sequence< beans::Property >& rProperties,
- const ContentProperties& rData,
- const rtl::Reference< ::ucbhelper::ContentProviderImplHelper >& rProvider,
- const OUString& rContentId )
-{
- // Note: Empty sequence means "get values of all supported properties".
-
- rtl::Reference< ::ucbhelper::PropertyValueSet > xRow
- = new ::ucbhelper::PropertyValueSet( rxContext );
-
- if ( rProperties.hasElements() )
- {
- uno::Reference< beans::XPropertySet > xAdditionalPropSet;
- bool bTriedToGetAdditionalPropSet = false;
-
- for ( const beans::Property& rProp : rProperties )
- {
- // Process standard UCB, DAV and HTTP properties.
- const uno::Any & rValue = rData.getValue( rProp.Name );
- if ( rValue.hasValue() )
- {
- xRow->appendObject( rProp, rValue );
- }
- else
- {
- // Process local Additional Properties.
- if ( !bTriedToGetAdditionalPropSet && !xAdditionalPropSet.is() )
- {
- xAdditionalPropSet =
- rProvider->getAdditionalPropertySet( rContentId,
- false );
- bTriedToGetAdditionalPropSet = true;
- }
-
- if ( !xAdditionalPropSet.is() ||
- !xRow->appendPropertySetValue(
- xAdditionalPropSet, rProp ) )
- {
- // Append empty entry.
- xRow->appendVoid( rProp );
- }
- }
- }
- }
- else
- {
- // Append all standard UCB, DAV and HTTP properties.
- const std::unique_ptr< PropertyValueMap > & xProps = rData.getProperties();
-
- ContentProvider * pProvider
- = static_cast< ContentProvider * >( rProvider.get() );
- beans::Property aProp;
-
- for ( const auto& rProp : *xProps )
- {
- pProvider->getProperty( rProp.first, aProp );
- xRow->appendObject( aProp, rProp.second.value() );
- }
-
- // Append all local Additional Properties.
- uno::Reference< beans::XPropertySet > xSet =
- rProvider->getAdditionalPropertySet( rContentId, false );
- xRow->appendPropertySet( xSet );
- }
-
- return xRow;
-}
-
-namespace {
-void GetPropsUsingHeadRequest(DAVResource& resource,
- const std::unique_ptr< DAVResourceAccess >& xResAccess,
- const std::vector< OUString >& aHTTPNames,
- const uno::Reference< ucb::XCommandEnvironment >& xEnv)
-{
- if (aHTTPNames.empty())
- return;
-
- DAVOptions aDAVOptions;
- OUString aTargetURL = xResAccess->getURL();
- // retrieve the cached options if any
- aStaticDAVOptionsCache.getDAVOptions(aTargetURL, aDAVOptions);
-
- // clean cached value of PROPFIND property names
- // PROPPATCH can change them
- Content::removeCachedPropertyNames(aTargetURL);
- // test if HEAD allowed, if not, throw, should be caught immediately
- // SC_GONE used internally by us, see comment in Content::getPropertyValues
- // in the catch scope
- if (aDAVOptions.getHttpResponseStatusCode() != SC_GONE &&
- !aDAVOptions.isHeadAllowed())
- {
- throw DAVException(DAVException::DAV_HTTP_ERROR, "405 Not Implemented", SC_METHOD_NOT_ALLOWED);
- }
- // if HEAD is enabled on this site
- // check if there is a relevant HTTP response status code cached
- if (aDAVOptions.getHttpResponseStatusCode() != SC_NONE)
- {
- // throws exception as if there was a server error, a DAV exception
- throw DAVException(DAVException::DAV_HTTP_ERROR,
- aDAVOptions.getHttpResponseStatusText(),
- aDAVOptions.getHttpResponseStatusCode());
- // Unreachable
- }
-
- xResAccess->HEAD(aHTTPNames, resource, xEnv);
-}
-}
-
-uno::Reference< sdbc::XRow > Content::getPropertyValues(
- const uno::Sequence< beans::Property >& rProperties,
- const uno::Reference< ucb::XCommandEnvironment >& xEnv )
-{
- std::unique_ptr< ContentProperties > xProps;
- std::unique_ptr< ContentProperties > xCachedProps;
- std::unique_ptr< DAVResourceAccess > xResAccess;
- OUString aUnescapedTitle;
- bool bHasAll = false;
- uno::Reference< ucb::XContentIdentifier > xIdentifier;
- rtl::Reference< ::ucbhelper::ContentProviderImplHelper > xProvider;
-
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
-
- aUnescapedTitle = NeonUri::unescape( m_aEscapedTitle );
- xIdentifier.set( m_xIdentifier );
- xProvider = m_xProvider;
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
-
- // First, ask cache...
- if (m_xCachedProps)
- {
- xCachedProps.reset(new ContentProperties(*m_xCachedProps));
-
- std::vector< OUString > aMissingProps;
- if ( xCachedProps->containsAllNames( rProperties, aMissingProps ) )
- {
- // All properties are already in cache! No server access needed.
- bHasAll = true;
- }
-
- // use the cached ContentProperties instance
- xProps.reset(new ContentProperties(*xCachedProps));
- }
- }
-
- if ( !m_bTransient && !bHasAll )
- {
-
- // Obtain values from server...
-
-
- // First, identify whether resource is DAV or not
- bool bNetworkAccessAllowed = true;
- ResourceType eType = getResourceType(
- xEnv, xResAccess, &bNetworkAccessAllowed );
-
- if ( eType == DAV )
- {
- // cache lookup... getResourceType may fill the props cache via
- // PROPFIND!
- if (m_xCachedProps)
- {
- xCachedProps.reset(new ContentProperties(*m_xCachedProps));
-
- std::vector< OUString > aMissingProps;
- if ( xCachedProps->containsAllNames(
- rProperties, aMissingProps ) )
- {
- // All properties are already in cache! No server access
- // needed.
- bHasAll = true;
- }
-
- // use the cached ContentProperties instance
- xProps.reset(new ContentProperties(*xCachedProps));
- }
-
- if ( !bHasAll )
- {
- // Only DAV resources support PROPFIND
- std::vector< OUString > aPropNames;
-
- // FIXME: Should m_aFailedPropNames be checked here? It got effectively
- // ignored since commit 26e6d4b05ab444e6a7529ffcac7fbe592fc94833.
- if ( rProperties.hasElements() )
- ContentProperties::UCBNamesToDAVNames(
- rProperties, aPropNames );
-
- if ( !aPropNames.empty() )
- {
- std::vector< DAVResource > resources;
- try
- {
- xResAccess->PROPFIND(
- DAVZERO, aPropNames, resources, xEnv );
-
- if ( 1 == resources.size() )
- {
-#if defined SAL_LOG_INFO
- {//debug
- // print received resources
- for ( const auto& rProp : resources[0].properties )
- {
- OUString aPropValue;
- bool bValue;
- uno::Sequence< ucb::LockEntry > aSupportedLocks;
- if( rProp.Value >>= aPropValue )
- SAL_INFO( "ucb.ucp.webdav", "PROPFIND (getPropertyValues) - returned property: " << rProp.Name << ":" << aPropValue );
- else if( rProp.Value >>= bValue )
- SAL_INFO( "ucb.ucp.webdav", "PROPFIND (getPropertyValues) - returned property: " << rProp.Name << ":" <<
- ( bValue ? "true" : "false" ) );
- else if( rProp.Value >>= aSupportedLocks )
- {
- SAL_INFO( "ucb.ucp.webdav", "PROPFIND (getPropertyValues) - returned property: " << rProp.Name << ":" );
- for ( sal_Int32 n = 0; n < aSupportedLocks.getLength(); ++n )
- {
- SAL_INFO( "ucb.ucp.webdav"," scope: "
- << ( aSupportedLocks[ n ].Scope == css::ucb::LockScope_SHARED ? "shared" : "exclusive" )
- << ", type: "
- << ( aSupportedLocks[ n ].Type != css::ucb::LockType_WRITE ? "" : "write" ) );
- }
- }
- }
- }
-#endif
- if (xProps)
- xProps->addProperties(
- aPropNames,
- ContentProperties( resources[ 0 ] ));
- else
- xProps.reset(
- new ContentProperties( resources[ 0 ] ) );
- }
- }
- catch ( DAVException const & e )
- {
- bNetworkAccessAllowed = bNetworkAccessAllowed
- && shouldAccessNetworkAfterException( e );
-
- if ( !bNetworkAccessAllowed )
- {
- cancelCommandExecution( e, xEnv );
- // unreachable
- }
- }
- }
- }
- }
-
- if ( bNetworkAccessAllowed )
- {
- // All properties obtained already?
- std::vector< OUString > aMissingProps;
- if ( !( xProps
- && xProps->containsAllNames(
- rProperties, aMissingProps ) )
- && !m_bDidGetOrHead )
- {
- // Possibly the missing props can be obtained using a HEAD
- // request.
-
- std::vector< OUString > aHeaderNames;
- ContentProperties::UCBNamesToHTTPNames(
- rProperties,
- aHeaderNames );
-
- if( eType != DAV )
- {
- // in case of not DAV PROFIND (previously in program flow) failed
- // so we need to add the only prop that's common
- // to DAV and NON_DAV: MediaType, that maps to Content-Type
- aHeaderNames.emplace_back("Content-Type" );
- }
-
- if (!aHeaderNames.empty()) try
- {
- DAVResource resource;
- GetPropsUsingHeadRequest(resource, xResAccess, aHeaderNames, xEnv);
- m_bDidGetOrHead = true;
-
- if (xProps)
- xProps->addProperties(
- aMissingProps,
- ContentProperties(resource));
- else
- xProps.reset(new ContentProperties(resource));
-
- if (m_eResourceType == NON_DAV)
- xProps->addProperties(aMissingProps,
- ContentProperties(
- aUnescapedTitle,
- false));
- }
- catch ( DAVException const & e )
- {
- // non "general-purpose servers" may not support HEAD requests
- // see http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.1
- // In this case, perform a partial GET only to get the header info
- // vid. http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35
- // WARNING if the server does not support partial GETs,
- // the GET will transfer the whole content
- bool bError = true;
- DAVException aLastException = e;
- OUString aTargetURL = xResAccess->getURL();
-
- if ( e.getError() == DAVException::DAV_HTTP_ERROR )
- {
- // According to the spec. the origin server SHOULD return
- // * 405 (Method Not Allowed):
- // the method is known but not allowed for the requested resource
- // * 501 (Not Implemented):
- // the method is unrecognized or not implemented
- // * 404 (SC_NOT_FOUND)
- // is for google-code server and for MS IIS 10.0 Web server
- // when only GET is enabled
- if ( aLastException.getStatus() == SC_NOT_IMPLEMENTED ||
- aLastException.getStatus() == SC_METHOD_NOT_ALLOWED ||
- aLastException.getStatus() == SC_NOT_FOUND )
- {
- SAL_WARN( "ucb.ucp.webdav", "HEAD probably not implemented: fall back to a partial GET" );
- aStaticDAVOptionsCache.setHeadAllowed( aTargetURL, false );
- lcl_sendPartialGETRequest( bError,
- aLastException,
- aMissingProps,
- aHeaderNames,
- xResAccess,
- xProps,
- xEnv );
- m_bDidGetOrHead = !bError;
- }
- }
-
- if ( bError )
- {
- DAVOptions aDAVOptionsException;
-
- aDAVOptionsException.setURL( aTargetURL );
- // check if the error was SC_NOT_FOUND, meaning that the
- // GET fall back didn't succeeded and the element is really missing
- // we will consider the resource SC_GONE (410) for some time
- // we use SC_GONE because has the same meaning of SC_NOT_FOUND (404)
- // see:
- // <https://tools.ietf.org/html/rfc7231#section-6.5.9> (retrieved 2016-10-09)
- // apparently it's not used to mark the missing HEAD method (so far...)
- sal_uInt16 ResponseStatusCode =
- ( aLastException.getStatus() == SC_NOT_FOUND ) ?
- SC_GONE :
- aLastException.getStatus();
- aDAVOptionsException.setHttpResponseStatusCode( ResponseStatusCode );
- aDAVOptionsException.setHttpResponseStatusText( aLastException.getData() );
- aStaticDAVOptionsCache.addDAVOptions( aDAVOptionsException,
- m_nOptsCacheLifeNotFound );
-
- if ( !shouldAccessNetworkAfterException( aLastException ) )
- {
- cancelCommandExecution( aLastException, xEnv );
- // unreachable
- }
- }
- }
- }
- }
-
- // might trigger HTTP redirect.
- // Therefore, title must be updated here.
- NeonUri aUri( xResAccess->getURL() );
- aUnescapedTitle = aUri.GetPathBaseNameUnescaped();
-
- if ( eType == UNKNOWN )
- {
- xProps.reset( new ContentProperties( aUnescapedTitle ) );
- }
-
- // For DAV resources we only know the Title, for non-DAV
- // resources we additionally know that it is a document.
-
- if ( eType == DAV )
- {
- if (!xProps)
- xProps.reset(new ContentProperties(aUnescapedTitle));
- else
- xProps->addProperty("Title", uno::makeAny(aUnescapedTitle), true);
- }
- else
- {
- if (!xProps)
- xProps.reset( new ContentProperties( aUnescapedTitle, false ) );
- else
- xProps->addProperty(
- "Title",
- uno::makeAny( aUnescapedTitle ),
- true );
-
- xProps->addProperty(
- "IsFolder",
- uno::makeAny( false ),
- true );
- xProps->addProperty(
- "IsDocument",
- uno::makeAny( true ),
- true );
- }
- }
- else
- {
- // No server access for just created (not yet committed) objects.
- // Only a minimal set of properties supported at this stage.
- if (m_bTransient)
- xProps.reset( new ContentProperties( aUnescapedTitle,
- m_bCollection ) );
- }
-
- // Add a default for the properties requested but not found.
- // Determine still missing properties, add a default.
- // Some client function doesn't expect a void uno::Any,
- // but instead wants some sort of default.
- std::vector< OUString > aMissingProps;
- if ( !xProps->containsAllNames(
- rProperties, aMissingProps ) )
- {
- //
- for ( const auto& rProp : aMissingProps )
- {
- // For the time being only a couple of properties need to be added
- if ( rProp == "DateModified" || rProp == "DateCreated" )
- {
- util::DateTime aDate;
- xProps->addProperty(
- rProp,
- uno::makeAny( aDate ),
- true );
- }
- // If WebDAV didn't return the resource type, assume default
- // This happens e.g. for lists exported by SharePoint
- else if ( rProp == "IsFolder" )
- {
- xProps->addProperty(
- rProp,
- uno::makeAny( false ),
- true );
- }
- else if ( rProp == "IsDocument" )
- {
- xProps->addProperty(
- rProp,
- uno::makeAny( true ),
- true );
- }
- }
- }
-
- for ( const auto& rProperty : rProperties )
- {
- const OUString rName = rProperty.Name;
- if ( rName == "BaseURI" )
- {
- // Add BaseURI property, if requested.
- xProps->addProperty(
- "BaseURI",
- uno::makeAny( getBaseURI( xResAccess ) ),
- true );
- }
- else if ( rName == "CreatableContentsInfo" )
- {
- // Add CreatableContentsInfo property, if requested.
- bool bFolder = false;
- xProps->getValue(
- "IsFolder" )
- >>= bFolder;
- xProps->addProperty(
- "CreatableContentsInfo",
- uno::makeAny( bFolder
- ? queryCreatableContentsInfo()
- : uno::Sequence< ucb::ContentInfo >() ),
- true );
- }
- }
-
- uno::Reference< sdbc::XRow > xResultRow
- = getPropertyValues( m_xContext,
- rProperties,
- *xProps,
- xProvider,
- xIdentifier->getContentIdentifier() );
-
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
-
- if (!m_xCachedProps)
- m_xCachedProps.reset(new CachableContentProperties(*xProps));
- else
- m_xCachedProps->addProperties(*xProps);
-
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- m_aEscapedTitle = NeonUri::escapeSegment( aUnescapedTitle );
- }
-
- return xResultRow;
-}
-
-
-uno::Sequence< uno::Any > Content::setPropertyValues(
- const uno::Sequence< beans::PropertyValue >& rValues,
- const uno::Reference< ucb::XCommandEnvironment >& xEnv )
-{
- uno::Reference< ucb::XContentIdentifier > xIdentifier;
- rtl::Reference< ContentProvider > xProvider;
- bool bTransient;
- std::unique_ptr< DAVResourceAccess > xResAccess;
-
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
-
- xProvider.set( m_pProvider );
- xIdentifier.set( m_xIdentifier );
- bTransient = m_bTransient;
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- }
-
- uno::Sequence< uno::Any > aRet( rValues.getLength() );
- auto aRetRange = asNonConstRange(aRet);
- uno::Sequence< beans::PropertyChangeEvent > aChanges( rValues.getLength() );
- sal_Int32 nChanged = 0;
-
- beans::PropertyChangeEvent aEvent;
- aEvent.Source = static_cast< cppu::OWeakObject * >( this );
- aEvent.Further = false;
- // aEvent.PropertyName =
- aEvent.PropertyHandle = -1;
- // aEvent.OldValue =
- // aEvent.NewValue =
-
- std::vector< ProppatchValue > aProppatchValues;
-
- uno::Reference< ucb::XPersistentPropertySet > xAdditionalPropSet;
- bool bTriedToGetAdditionalPropSet = false;
-
- bool bExchange = false;
- OUString aNewTitle;
- OUString aOldTitle;
- sal_Int32 nTitlePos = -1;
-
- uno::Reference< beans::XPropertySetInfo > xInfo;
-
- const beans::PropertyValue* pValues = rValues.getConstArray();
- sal_Int32 nCount = rValues.getLength();
- for ( sal_Int32 n = 0; n < nCount; ++n )
- {
- const beans::PropertyValue& rValue = pValues[ n ];
- const OUString & rName = rValue.Name;
-
- beans::Property aTmpProp;
- xProvider->getProperty( rName, aTmpProp );
-
- if ( aTmpProp.Attributes & beans::PropertyAttribute::READONLY )
- {
- // Read-only property!
- aRetRange[ n ] <<= lang::IllegalAccessException(
- "Property is read-only!",
- static_cast< cppu::OWeakObject * >( this ) );
- continue;
- }
-
-
- // Mandatory props.
-
-
- if ( rName == "ContentType" )
- {
- // Read-only property!
- aRetRange[ n ] <<= lang::IllegalAccessException(
- "Property is read-only!",
- static_cast< cppu::OWeakObject * >( this ) );
- }
- else if ( rName == "IsDocument" )
- {
- // Read-only property!
- aRetRange[ n ] <<= lang::IllegalAccessException(
- "Property is read-only!",
- static_cast< cppu::OWeakObject * >( this ) );
- }
- else if ( rName == "IsFolder" )
- {
- // Read-only property!
- aRetRange[ n ] <<= lang::IllegalAccessException(
- "Property is read-only!",
- static_cast< cppu::OWeakObject * >( this ) );
- }
- else if ( rName == "Title" )
- {
- OUString aNewValue;
- if ( rValue.Value >>= aNewValue )
- {
- // No empty titles!
- if ( !aNewValue.isEmpty() )
- {
- try
- {
- NeonUri aURI( xIdentifier->getContentIdentifier() );
- aOldTitle = aURI.GetPathBaseNameUnescaped();
-
- if ( aNewValue != aOldTitle )
- {
- // modified title -> modified URL -> exchange !
- if ( !bTransient )
- bExchange = true;
-
- // new value will be set later...
- aNewTitle = aNewValue;
-
- // remember position within sequence of values (for
- // error handling).
- nTitlePos = n;
- }
- }
- catch ( DAVException const & )
- {
- aRetRange[ n ] <<= lang::IllegalArgumentException(
- "Invalid content identifier!",
- static_cast< cppu::OWeakObject * >( this ),
- -1 );
- }
- }
- else
- {
- aRetRange[ n ] <<= lang::IllegalArgumentException(
- "Empty title not allowed!",
- static_cast< cppu::OWeakObject * >( this ),
- -1 );
- }
- }
- else
- {
- aRetRange[ n ] <<= beans::IllegalTypeException(
- "Property value has wrong type!",
- static_cast< cppu::OWeakObject * >( this ) );
- }
- }
- else
- {
-
- // Optional props.
-
-
- OUString aSpecialName;
- bool bIsSpecial = DAVProperties::isUCBSpecialProperty(
- rName, aSpecialName );
-
- if ( !xInfo.is() )
- xInfo = getPropertySetInfo( xEnv,
- false /* don't cache data */ );
-
- if ( !xInfo->hasPropertyByName(
- bIsSpecial ? aSpecialName : rName ) )
- {
- // Check, whether property exists. Skip otherwise.
- // PROPPATCH::set would add the property automatically, which
- // is not allowed for "setPropertyValues" command!
- aRetRange[ n ] <<= beans::UnknownPropertyException(
- "Property is unknown!",
- static_cast< cppu::OWeakObject * >( this ) );
- continue;
- }
-
- if ( rName == "Size" )
- {
- // Read-only property!
- aRetRange[ n ] <<= lang::IllegalAccessException(
- "Property is read-only!",
- static_cast< cppu::OWeakObject * >( this ) );
- }
- else if ( rName == "DateCreated" )
- {
- // Read-only property!
- aRetRange[ n ] <<= lang::IllegalAccessException(
- "Property is read-only!",
- static_cast< cppu::OWeakObject * >( this ) );
- }
- else if ( rName == "DateModified" )
- {
- // Read-only property!
- aRetRange[ n ] <<= lang::IllegalAccessException(
- "Property is read-only!",
- static_cast< cppu::OWeakObject * >( this ) );
- }
- else if ( rName == "MediaType" )
- {
- // Read-only property!
- // (but could be writable, if 'getcontenttype' would be)
- aRetRange[ n ] <<= lang::IllegalAccessException(
- "Property is read-only!",
- static_cast< cppu::OWeakObject * >( this ) );
- }
- if ( rName == "CreatableContentsInfo" )
- {
- // Read-only property!
- aRetRange[ n ] <<= lang::IllegalAccessException(
- "Property is read-only!",
- static_cast< cppu::OWeakObject * >( this ) );
- }
- else
- {
- if ( getResourceType( xEnv, xResAccess ) == DAV )
- {
- // Property value will be set on server.
- ProppatchValue aValue( PROPSET, rName, rValue.Value );
- aProppatchValues.push_back( aValue );
- }
- else
- {
- // Property value will be stored in local property store.
- if ( !bTriedToGetAdditionalPropSet &&
- !xAdditionalPropSet.is() )
- {
- xAdditionalPropSet
- = getAdditionalPropertySet( false );
- bTriedToGetAdditionalPropSet = true;
- }
-
- if ( xAdditionalPropSet.is() )
- {
- try
- {
- uno::Any aOldValue
- = xAdditionalPropSet->getPropertyValue( rName );
- if ( aOldValue != rValue.Value )
- {
- xAdditionalPropSet->setPropertyValue(
- rName, rValue.Value );
-
- aEvent.PropertyName = rName;
- aEvent.OldValue = aOldValue;
- aEvent.NewValue = rValue.Value;
-
- aChanges.getArray()[ nChanged ] = aEvent;
- nChanged++;
- }
- }
- catch ( beans::UnknownPropertyException const & e )
- {
- aRetRange[ n ] <<= e;
- }
- catch ( lang::WrappedTargetException const & e )
- {
- aRetRange[ n ] <<= e;
- }
- catch ( beans::PropertyVetoException const & e )
- {
- aRetRange[ n ] <<= e;
- }
- catch ( lang::IllegalArgumentException const & e )
- {
- aRetRange[ n ] <<= e;
- }
- }
- else
- {
- aRetRange[ n ] <<= uno::Exception(
- "No property set for storing the value!",
- static_cast< cppu::OWeakObject * >( this ) );
- }
- }
- }
- }
- } // for
-
- if ( !bTransient && !aProppatchValues.empty() )
- {
- try
- {
- // clean cached value of PROPFIND property names
- // PROPPATCH can change them
- removeCachedPropertyNames( xResAccess->getURL() );
- // Set property values at server.
- aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() );
- xResAccess->PROPPATCH( aProppatchValues, xEnv );
-
- for ( const auto& rProppatchValue : aProppatchValues )
- {
- aEvent.PropertyName = rProppatchValue.name;
- aEvent.OldValue = uno::Any(); // @@@ too expensive to obtain!
- aEvent.NewValue = rProppatchValue.value;
-
- aChanges.getArray()[ nChanged ] = aEvent;
- nChanged++;
- }
- }
- catch ( DAVException const & e )
- {
- SAL_WARN( "ucb.ucp.webdav", "Content::setPropertyValues - PROPPATCH failed!" );
- cancelCommandExecution( e, xEnv );
- // unreachable
- }
- }
-
- if ( bExchange )
- {
- // Assemble new content identifier...
-
- OUString aNewURL = getParentURL();
- if ( aNewURL.lastIndexOf( '/' ) != ( aNewURL.getLength() - 1 ) )
- aNewURL += "/";
-
- aNewURL += NeonUri::escapeSegment( aNewTitle );
-
- uno::Reference< ucb::XContentIdentifier > xNewId
- = new ::ucbhelper::ContentIdentifier( aNewURL );
-
- NeonUri sourceURI( xIdentifier->getContentIdentifier() );
- NeonUri targetURI( xNewId->getContentIdentifier() );
-
- try
- {
- targetURI.SetScheme( sourceURI.GetScheme() );
-
- // clean cached value of PROPFIND property names
- removeCachedPropertyNames( sourceURI.GetURI() );
- removeCachedPropertyNames( targetURI.GetURI() );
- aStaticDAVOptionsCache.removeDAVOptions( sourceURI.GetURI() );
- aStaticDAVOptionsCache.removeDAVOptions( targetURI.GetURI() );
- xResAccess->MOVE(
- sourceURI.GetPath(), targetURI.GetURI(), false, xEnv );
-
- // @@@ Should check for resources that could not be moved
- // (due to source access or target overwrite) and send
- // this information through the interaction handler.
-
- // @@@ Existing content should be checked to see if it needs
- // to be deleted at the source
-
- // @@@ Existing content should be checked to see if it has
- // been overwritten at the target
-
- if ( exchangeIdentity( xNewId ) )
- {
- xResAccess->setURL( aNewURL );
-
-// DAV resources store all additional props on server!
-// // Adapt Additional Core Properties.
-// renameAdditionalPropertySet( xOldId->getContentIdentifier(),
-// xNewId->getContentIdentifier(),
-// sal_True );
- }
- else
- {
- // Do not set new title!
- aNewTitle.clear();
-
- // Set error .
- aRetRange[ nTitlePos ] <<= uno::Exception(
- "Exchange failed!",
- static_cast< cppu::OWeakObject * >( this ) );
- }
- }
- catch ( DAVException const & e )
- {
- // Do not set new title!
- aNewTitle.clear();
-
- // Set error .
- aRetRange[ nTitlePos ] = MapDAVException( e, true );
- }
- }
-
- if ( !aNewTitle.isEmpty() )
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
-
- aEvent.PropertyName = "Title";
- aEvent.OldValue <<= aOldTitle;
- aEvent.NewValue <<= aNewTitle;
-
- m_aEscapedTitle = NeonUri::escapeSegment( aNewTitle );
-
- aChanges.getArray()[ nChanged ] = aEvent;
- nChanged++;
- }
-
- if ( nChanged > 0 )
- {
- aChanges.realloc( nChanged );
- notifyPropertiesChange( aChanges );
- }
-
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
-
- return aRet;
-}
-
-
-uno::Any Content::open(
- const ucb::OpenCommandArgument3 & rArg,
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- uno::Any aRet;
-
- bool bOpenFolder = ( ( rArg.Mode == ucb::OpenMode::ALL ) ||
- ( rArg.Mode == ucb::OpenMode::FOLDERS ) ||
- ( rArg.Mode == ucb::OpenMode::DOCUMENTS ) );
- if ( bOpenFolder )
- {
- if ( isFolder( xEnv ) )
- {
- // Open collection.
-
- uno::Reference< ucb::XDynamicResultSet > xSet
- = new DynamicResultSet( m_xContext, this, rArg, xEnv );
- aRet <<= xSet;
- }
- else
- {
- // Error: Not a folder!
-
- OUStringBuffer aMsg;
- if ( getResourceType( xEnv ) == FTP )
- {
- aMsg.append( "FTP over HTTP proxy: resource cannot "
- "be opened as folder! Wrong Open Mode!" );
- }
- else
- {
- aMsg.append( "Non-folder resource cannot be "
- "opened as folder! Wrong Open Mode!" );
- }
-
- ucbhelper::cancelCommandExecution(
- uno::makeAny(
- lang::IllegalArgumentException(
- aMsg.makeStringAndClear(),
- static_cast< cppu::OWeakObject * >( this ),
- -1 ) ),
- xEnv );
- // Unreachable
- }
- }
-
- if ( rArg.Sink.is() )
- {
- // Open document.
-
- if ( ( rArg.Mode == ucb::OpenMode::DOCUMENT_SHARE_DENY_NONE ) ||
- ( rArg.Mode == ucb::OpenMode::DOCUMENT_SHARE_DENY_WRITE ) )
- {
- // Currently(?) unsupported.
- ucbhelper::cancelCommandExecution(
- uno::makeAny(
- ucb::UnsupportedOpenModeException(
- OUString(),
- static_cast< cppu::OWeakObject * >( this ),
- sal_Int16( rArg.Mode ) ) ),
- xEnv );
- // Unreachable
- }
-
- uno::Reference< io::XOutputStream > xOut( rArg.Sink, uno::UNO_QUERY );
- if ( xOut.is() )
- {
- // PUSH: write data
- try
- {
- std::unique_ptr< DAVResourceAccess > xResAccess;
-
- {
- osl::MutexGuard aGuard( m_aMutex );
-
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- }
-
- xResAccess->setFlags( rArg.OpeningFlags );
- DAVResource aResource;
- std::vector< OUString > aHeaders;
-
- removeCachedPropertyNames( xResAccess->getURL() );
- xResAccess->GET( xOut, aHeaders, aResource, xEnv );
- m_bDidGetOrHead = true;
-
- {
- osl::MutexGuard aGuard( m_aMutex );
-
- // cache headers.
- if (!m_xCachedProps)
- m_xCachedProps.reset(
- new CachableContentProperties( ContentProperties( aResource ) ) );
- else
- m_xCachedProps->addProperties( ContentProperties( aResource ) );
-
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
- }
- catch ( DAVException const & e )
- {
- cancelCommandExecution( e, xEnv );
- // Unreachable
- }
- }
- else
- {
- uno::Reference< io::XActiveDataSink > xDataSink( rArg.Sink, uno::UNO_QUERY );
- if ( xDataSink.is() )
- {
- // PULL: wait for client read
- OUString aTargetURL = m_xIdentifier->getContentIdentifier();
- try
- {
- std::unique_ptr< DAVResourceAccess > xResAccess;
- {
- osl::MutexGuard aGuard( m_aMutex );
-
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- }
- xResAccess->setFlags( rArg.OpeningFlags );
-
- // fill inputstream sync; return if all data present
- DAVResource aResource;
- std::vector< OUString > aHeaders;
-
- aTargetURL = xResAccess->getURL();
- removeCachedPropertyNames( aTargetURL );
- // check if the resource was present on the server
- // first update it, if necessary
- // if the open is called directly, without the default open sequence,
- // e.g. the one used when opening a file looking for properties
- // first this call will have no effect, since OPTIONS would have already been called
- // as a consequence of getPropertyValues()
- DAVOptions aDAVOptions;
- getResourceOptions( xEnv, aDAVOptions, xResAccess );
-
- if ( aDAVOptions.getHttpResponseStatusCode() != SC_NONE )
- {
- // throws exception as if there was a server error, a DAV exception
- throw DAVException( DAVException::DAV_HTTP_ERROR,
- aDAVOptions.getHttpResponseStatusText(),
- aDAVOptions.getHttpResponseStatusCode() );
- }
- uno::Reference< io::XInputStream > xIn
- = xResAccess->GET( aHeaders, aResource, xEnv );
- m_bDidGetOrHead = true;
-
- {
- osl::MutexGuard aGuard( m_aMutex );
-
- // cache headers.
- if (!m_xCachedProps)
- m_xCachedProps.reset(
- new CachableContentProperties( ContentProperties( aResource ) ) );
- else
- m_xCachedProps->addProperties(
- aResource.properties );
-
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
-
- xDataSink->setInputStream( xIn );
- }
- catch ( DAVException const & e )
- {
- //TODO cache the http error if not yet cached
- cancelCommandExecution( e, xEnv );
- // Unreachable
- }
- }
- else
- {
- // Note: aOpenCommand.Sink may contain an XStream
- // implementation. Support for this type of
- // sink is optional...
- ucbhelper::cancelCommandExecution(
- uno::makeAny(
- ucb::UnsupportedDataSinkException(
- OUString(),
- static_cast< cppu::OWeakObject * >( this ),
- rArg.Sink ) ),
- xEnv );
- // Unreachable
- }
- }
- }
-
- return aRet;
-}
-
-void Content::post(
- const ucb::PostCommandArgument2 & rArg,
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- uno::Reference< io::XActiveDataSink > xSink( rArg.Sink, uno::UNO_QUERY );
- if ( xSink.is() )
- {
- try
- {
- std::unique_ptr< DAVResourceAccess > xResAccess;
- {
- osl::MutexGuard aGuard( m_aMutex );
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- }
-
- removeCachedPropertyNames( xResAccess->getURL() );
- uno::Reference< io::XInputStream > xResult
- = xResAccess->POST( rArg.MediaType,
- rArg.Referer,
- rArg.Source,
- xEnv );
-
- {
- osl::MutexGuard aGuard( m_aMutex );
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
-
- xSink->setInputStream( xResult );
- }
- catch ( DAVException const & e )
- {
- cancelCommandExecution( e, xEnv, true );
- // Unreachable
- }
- }
- else
- {
- uno::Reference< io::XOutputStream > xResult( rArg.Sink, uno::UNO_QUERY );
- if ( xResult.is() )
- {
- try
- {
- std::unique_ptr< DAVResourceAccess > xResAccess;
- {
- osl::MutexGuard aGuard( m_aMutex );
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- }
-
- removeCachedPropertyNames( xResAccess->getURL() );
- xResAccess->POST( rArg.MediaType,
- rArg.Referer,
- rArg.Source,
- xResult,
- xEnv );
-
- {
- osl::MutexGuard aGuard( m_aMutex );
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
- }
- catch ( DAVException const & e )
- {
- cancelCommandExecution( e, xEnv, true );
- // Unreachable
- }
- }
- else
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny(
- ucb::UnsupportedDataSinkException(
- OUString(),
- static_cast< cppu::OWeakObject * >( this ),
- rArg.Sink ) ),
- xEnv );
- // Unreachable
- }
- }
-}
-
-
-void Content::queryChildren( ContentRefList& rChildren )
-{
- // Obtain a list with a snapshot of all currently instantiated contents
- // from provider and extract the contents which are direct children
- // of this content.
-
- ::ucbhelper::ContentRefList aAllContents;
- m_xProvider->queryExistingContents( aAllContents );
-
- OUString aURL = m_xIdentifier->getContentIdentifier();
- sal_Int32 nURLPos = aURL.lastIndexOf( '/' );
-
- if ( nURLPos != ( aURL.getLength() - 1 ) )
- {
- // No trailing slash found. Append.
- aURL += "/";
- }
-
- sal_Int32 nLen = aURL.getLength();
-
- for ( const auto& rChild : aAllContents )
- {
- ::ucbhelper::ContentImplHelperRef xChild = rChild;
- OUString aChildURL
- = xChild->getIdentifier()->getContentIdentifier();
-
- // Is aURL a prefix of aChildURL?
- if ( ( aChildURL.getLength() > nLen ) &&
- ( aChildURL.startsWith( aURL ) ) )
- {
- sal_Int32 nPos = aChildURL.indexOf( '/', nLen );
-
- if ( ( nPos == -1 ) ||
- ( nPos == ( aChildURL.getLength() - 1 ) ) )
- {
- // No further slashes / only a final slash. It's a child!
- rChildren.emplace_back(
- static_cast< ::webdav_ucp::Content * >(
- xChild.get() ) );
- }
- }
- }
-}
-
-
-void Content::insert(
- const uno::Reference< io::XInputStream > & xInputStream,
- bool bReplaceExisting,
- const uno::Reference< ucb::XCommandEnvironment >& Environment )
-{
- bool bTransient, bCollection;
- OUString aEscapedTitle;
- std::unique_ptr< DAVResourceAccess > xResAccess;
-
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
-
- bTransient = m_bTransient;
- bCollection = m_bCollection;
- aEscapedTitle = m_aEscapedTitle;
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- }
-
- // Check, if all required properties are present.
-
- if ( aEscapedTitle.isEmpty() )
- {
- SAL_WARN( "ucb.ucp.webdav", "Content::insert - Title missing!" );
-
- uno::Sequence<OUString> aProps { "Title" };
- ucbhelper::cancelCommandExecution(
- uno::makeAny( ucb::MissingPropertiesException(
- OUString(),
- static_cast< cppu::OWeakObject * >( this ),
- aProps ) ),
- Environment );
- // Unreachable
- }
-
- if ( !bReplaceExisting )
- {
- /* [RFC 2616] - HTTP
-
- The PUT method requests that the enclosed entity be stored under the
- supplied Request-URI. If the Request-URI refers to an already
- existing resource, the enclosed entity SHOULD be considered as a
- modified version of the one residing on the origin server.
- */
-
- /* [RFC 2518] - WebDAV
-
- MKCOL creates a new collection resource at the location specified by
- the Request-URI. If the resource identified by the Request-URI is
- non-null then the MKCOL MUST fail.
- */
-
- // ==> Complain on PUT, continue on MKCOL.
- if ( !bTransient || !bCollection )
- {
- ucb::UnsupportedNameClashException aEx(
- "Unable to write without overwrite!",
- static_cast< cppu::OWeakObject * >( this ),
- ucb::NameClash::ERROR );
-
- uno::Reference< task::XInteractionHandler > xIH;
-
- if ( Environment.is() )
- xIH = Environment->getInteractionHandler();
-
- if ( !xIH.is() )
- {
- // No IH; throw.
- throw aEx;
- }
-
- uno::Any aExAsAny( uno::makeAny( aEx ) );
-
- rtl::Reference< ucbhelper::SimpleInteractionRequest > xRequest
- = new ucbhelper::SimpleInteractionRequest(
- aExAsAny,
- ContinuationFlags::Approve | ContinuationFlags::Disapprove );
- xIH->handle( xRequest );
-
- const ContinuationFlags nResp = xRequest->getResponse();
-
- switch ( nResp )
- {
- case ContinuationFlags::NONE:
- // Not handled; throw.
- throw aEx;
-// break;
-
- case ContinuationFlags::Approve:
- // Continue -> Overwrite.
- bReplaceExisting = true;
- break;
-
- case ContinuationFlags::Disapprove:
- // Abort.
- throw ucb::CommandFailedException(
- OUString(),
- uno::Reference< uno::XInterface >(),
- aExAsAny );
-// break;
-
- default:
- SAL_WARN( "ucb.ucp.webdav", "Content::insert - "
- "Unknown interaction selection!" );
- throw ucb::CommandFailedException(
- "Unknown interaction selection!",
- uno::Reference< uno::XInterface >(),
- aExAsAny );
-// break;
- }
-
- }
- }
-
- if ( bTransient )
- {
- // Assemble new content identifier...
- OUString aURL = getParentURL();
- if ( aURL.lastIndexOf( '/' ) != ( aURL.getLength() - 1 ) )
- aURL += "/";
-
- aURL += aEscapedTitle;
-
- try
- {
- xResAccess->setURL( aURL );
-
- if ( bCollection )
- {
- aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() );
- removeCachedPropertyNames( xResAccess->getURL() );
- xResAccess->MKCOL( Environment );
- }
- else
- {
- // remove options from cache, PUT may change it
- // it will be refreshed when needed
- aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() );
- removeCachedPropertyNames( xResAccess->getURL() );
- xResAccess->PUT( xInputStream, Environment );
- // clean cached value of PROPFIND properties names
- }
- // no error , set the resourcetype to unknown type
- // the resource may have transitioned from NOT FOUND or UNKNOWN to something else
- // depending on the server behaviour
- // this will force a recheck of the resource type
- m_eResourceType = UNKNOWN;
- m_eResourceTypeForLocks = UNKNOWN;
- }
- catch ( DAVException const & except )
- {
- if ( bCollection )
- {
- if ( except.getStatus() == SC_METHOD_NOT_ALLOWED )
- {
- // [RFC 2518] - WebDAV
- // 405 (Method Not Allowed) - MKCOL can only be
- // executed on a deleted/non-existent resource.
-
- if ( bReplaceExisting )
- {
- // Destroy old resource.
- try
- {
- removeCachedPropertyNames( xResAccess->getURL() );
- xResAccess->DESTROY( Environment );
- }
- catch ( DAVException const & e )
- {
- cancelCommandExecution( e, Environment, true );
- // Unreachable
- }
-
- // Insert (recursion!).
- insert( xInputStream, bReplaceExisting, Environment );
-
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
-
- // Success!
- return;
- }
- else
- {
- OUString aTitle;
- try
- {
- NeonUri aURI( aURL );
- aTitle = aURI.GetPathBaseNameUnescaped();
- }
- catch ( DAVException const & )
- {
- }
-
- ucbhelper::cancelCommandExecution(
- uno::makeAny(
- ucb::NameClashException(
- OUString(),
- static_cast< cppu::OWeakObject * >( this ),
- task::InteractionClassification_ERROR,
- aTitle ) ),
- Environment );
- // Unreachable
- }
- }
- }
-
- cancelCommandExecution( except, Environment, true );
- // Unreachable
- }
-
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_xIdentifier = new ::ucbhelper::ContentIdentifier( aURL );
- }
-
- inserted();
-
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_bTransient = false;
- }
- }
- else
- {
- if ( !xInputStream.is() )
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny(
- ucb::MissingInputStreamException(
- OUString(),
- static_cast< cppu::OWeakObject * >( this ) ) ),
- Environment );
- // Unreachable
- }
-
- // save the URL since it may change due to redirection
- OUString aTargetUrl = xResAccess->getURL();
- try
- {
- removeCachedPropertyNames( xResAccess->getURL() );
- // remove options from cache, PUT may change it
- // it will be refreshed when needed
- aStaticDAVOptionsCache.removeDAVOptions( aTargetUrl );
- xResAccess->PUT( xInputStream, Environment );
- }
- catch ( DAVException const & e )
- {
- cancelCommandExecution( e, Environment, true );
- // Unreachable
- }
- }
-
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
-}
-
-
-void Content::transfer(
- const ucb::TransferInfo & rArgs,
- const uno::Reference< ucb::XCommandEnvironment >& Environment )
-{
- uno::Reference< ucb::XContentIdentifier > xIdentifier;
- uno::Reference< ucb::XContentProvider > xProvider;
- std::unique_ptr< DAVResourceAccess > xResAccess;
-
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
-
- xIdentifier.set( m_xIdentifier );
- xProvider = m_xProvider;
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- }
-
- NeonUri sourceURI( rArgs.SourceURL );
- NeonUri targetURI( xIdentifier->getContentIdentifier() );
-
- OUString aTargetURI;
- try
- {
- aTargetURI = targetURI.GetPathBaseNameUnescaped();
-
- // Check source's and target's URL scheme
-
- OUString aScheme = sourceURI.GetScheme().toAsciiLowerCase();
- if ( aScheme == VNDSUNSTARWEBDAV_URL_SCHEME)
- {
- sourceURI.SetScheme( HTTP_URL_SCHEME );
- }
- else if ( aScheme == VNDSUNSTARWEBDAVS_URL_SCHEME)
- {
- sourceURI.SetScheme( HTTPS_URL_SCHEME );
- }
- else if ( aScheme == DAV_URL_SCHEME )
- {
- sourceURI.SetScheme( HTTP_URL_SCHEME );
- }
- else if ( aScheme == DAVS_URL_SCHEME )
- {
- sourceURI.SetScheme( HTTPS_URL_SCHEME );
- }
- else if ( aScheme == WEBDAV_URL_SCHEME )
- {
- sourceURI.SetScheme( HTTP_URL_SCHEME );
- }
- else if ( aScheme == WEBDAVS_URL_SCHEME )
- {
- sourceURI.SetScheme( HTTPS_URL_SCHEME );
- }
- else
- {
- if ( aScheme != HTTP_URL_SCHEME && aScheme != HTTPS_URL_SCHEME )
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny(
- ucb::InteractiveBadTransferURLException(
- "Unsupported URL scheme!",
- static_cast< cppu::OWeakObject * >( this ) ) ),
- Environment );
- // Unreachable
- }
- }
-
- aScheme = targetURI.GetScheme().toAsciiLowerCase();
- if ( aScheme == VNDSUNSTARWEBDAV_URL_SCHEME)
- targetURI.SetScheme( HTTP_URL_SCHEME );
- else if ( aScheme == VNDSUNSTARWEBDAVS_URL_SCHEME)
- targetURI.SetScheme( HTTPS_URL_SCHEME );
- else if ( aScheme == DAV_URL_SCHEME )
- targetURI.SetScheme( HTTP_URL_SCHEME );
- else if ( aScheme == DAVS_URL_SCHEME )
- targetURI.SetScheme( HTTPS_URL_SCHEME );
- else if ( aScheme == WEBDAV_URL_SCHEME )
- targetURI.SetScheme( HTTP_URL_SCHEME );
- else if ( aScheme == WEBDAVS_URL_SCHEME )
- targetURI.SetScheme( HTTPS_URL_SCHEME );
-
- // @@@ This implementation of 'transfer' only works
- // if the source and target are located at same host.
- // (Neon does not support cross-server copy/move)
-
- // Check for same host
-
- if ( !sourceURI.GetHost().isEmpty() &&
- ( sourceURI.GetHost() != targetURI.GetHost() ) )
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny( ucb::InteractiveBadTransferURLException(
- "Different hosts!",
- static_cast< cppu::OWeakObject * >( this ) ) ),
- Environment );
- // Unreachable
- }
-
- OUString aTitle = rArgs.NewTitle;
-
- if ( aTitle.isEmpty() )
- aTitle = sourceURI.GetPathBaseNameUnescaped();
-
- if ( aTitle == "/" )
- {
- // kso: ???
- aTitle.clear();
- }
-
- targetURI.AppendPath( aTitle );
-
- OUString aTargetURL = xIdentifier->getContentIdentifier();
- if ( ( aTargetURL.lastIndexOf( '/' ) + 1 )
- != aTargetURL.getLength() )
- aTargetURL += "/";
-
- aTargetURL += aTitle;
-
- uno::Reference< ucb::XContentIdentifier > xTargetId
- = new ::ucbhelper::ContentIdentifier( aTargetURL );
-
- DAVResourceAccess aSourceAccess( m_xContext,
- xResAccess->getSessionFactory(),
- sourceURI.GetURI() );
-
- if ( rArgs.MoveData )
- {
- uno::Reference< ucb::XContentIdentifier > xId
- = new ::ucbhelper::ContentIdentifier( rArgs.SourceURL );
-
- // Note: The static cast is okay here, because its sure that
- // xProvider is always the WebDAVContentProvider.
- rtl::Reference< Content > xSource
- = static_cast< Content * >(
- xProvider->queryContent( xId ).get() );
-
- // [RFC 2518] - WebDAV
- // If a resource exists at the destination and the Overwrite
- // header is "T" then prior to performing the move the server
- // MUST perform a DELETE with "Depth: infinity" on the
- // destination resource. If the Overwrite header is set to
- // "F" then the operation will fail.
-
- aStaticDAVOptionsCache.removeDAVOptions( sourceURI.GetURI() );
- aStaticDAVOptionsCache.removeDAVOptions( targetURI.GetURI() );
- aSourceAccess.MOVE( sourceURI.GetPath(),
- targetURI.GetURI(),
- rArgs.NameClash
- == ucb::NameClash::OVERWRITE,
- Environment );
-
- if ( xSource.is() )
- {
- // Propagate destruction to listeners.
- xSource->destroy( true );
- }
-
-// DAV resources store all additional props on server!
-// // Rename own and all children's Additional Core Properties.
-// renameAdditionalPropertySet( xId->getContentIdentifier(),
-// xTargetId->getContentIdentifier(),
-// sal_True );
- }
- else
- {
- // [RFC 2518] - WebDAV
- // If a resource exists at the destination and the Overwrite
- // header is "T" then prior to performing the copy the server
- // MUST perform a DELETE with "Depth: infinity" on the
- // destination resource. If the Overwrite header is set to
- // "F" then the operation will fail.
-
- aStaticDAVOptionsCache.removeDAVOptions( sourceURI.GetURI() );
- aStaticDAVOptionsCache.removeDAVOptions( targetURI.GetURI() );
- aSourceAccess.COPY( sourceURI.GetPath(),
- targetURI.GetURI(),
- rArgs.NameClash
- == ucb::NameClash::OVERWRITE,
- Environment );
-
-// DAV resources store all additional props on server!
-// // Copy own and all children's Additional Core Properties.
-// copyAdditionalPropertySet( xId->getContentIdentifier(),
-// xTargetId->getContentIdentifier(),
-// sal_True );
- }
-
- // Note: The static cast is okay here, because its sure that
- // xProvider is always the WebDAVContentProvider.
- rtl::Reference< Content > xTarget
- = static_cast< Content * >(
- xProvider->queryContent( xTargetId ).get() );
-
- // Announce transferred content in its new folder.
- xTarget->inserted();
- }
- catch ( ucb::IllegalIdentifierException const & )
- {
- // queryContent
- }
- catch ( DAVException const & e )
- {
- // [RFC 2518] - WebDAV
- // 412 (Precondition Failed) - The server was unable to maintain
- // the liveness of the properties listed in the propertybehavior
- // XML element or the Overwrite header is "F" and the state of
- // the destination resource is non-null.
-
- if ( e.getStatus() == SC_PRECONDITION_FAILED )
- {
- switch ( rArgs.NameClash )
- {
- case ucb::NameClash::ERROR:
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny(
- ucb::NameClashException(
- OUString(),
- static_cast< cppu::OWeakObject * >( this ),
- task::InteractionClassification_ERROR,
- aTargetURI ) ),
- Environment );
- [[fallthrough]]; // Unreachable
- }
-
- case ucb::NameClash::OVERWRITE:
- break;
-
- case ucb::NameClash::KEEP: // deprecated
- case ucb::NameClash::RENAME:
- case ucb::NameClash::ASK:
- default:
- {
- ucbhelper::cancelCommandExecution(
- uno::makeAny(
- ucb::UnsupportedNameClashException(
- OUString(),
- static_cast< cppu::OWeakObject * >( this ),
- rArgs.NameClash ) ),
- Environment );
- // Unreachable
- }
- }
- }
-
- cancelCommandExecution( e, Environment, true );
- // Unreachable
- }
-
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
-}
-
-
-void Content::destroy( bool bDeletePhysical )
-{
- // @@@ take care about bDeletePhysical -> trashcan support
- uno::Reference< ucb::XContent > xThis = this;
-
- deleted();
-
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
-
- // Process instantiated children...
-
- ::webdav_ucp::Content::ContentRefList aChildren;
- queryChildren( aChildren );
-
- for ( auto& rChild : aChildren )
- {
- rChild->destroy( bDeletePhysical );
- }
-}
-
-// returns the resource type, to be checked for locks
-Content::ResourceType Content::resourceTypeForLocks(
- const uno::Reference< ucb::XCommandEnvironment >& Environment,
- const std::unique_ptr< DAVResourceAccess > & rResAccess)
-{
- ResourceType eResourceTypeForLocks = UNKNOWN;
- {
- osl::MutexGuard g(m_aMutex);
- //check if cache contains what we need, usually the first PROPFIND on the URI has supported lock
- if (m_xCachedProps)
- {
- uno::Sequence< ucb::LockEntry > aSupportedLocks;
- if ( m_xCachedProps->getValue( DAVProperties::SUPPORTEDLOCK )
- >>= aSupportedLocks ) //get the cached value for supportedlock
- {
- for ( const auto& rSupportedLock : std::as_const(aSupportedLocks) )
- {
- if ( rSupportedLock.Scope
- == ucb::LockScope_EXCLUSIVE &&
- rSupportedLock.Type
- == ucb::LockType_WRITE )
- eResourceTypeForLocks = DAV;
- }
- }
- }
- }
-
- const OUString & rURL = m_xIdentifier->getContentIdentifier();
-
- if ( eResourceTypeForLocks == UNKNOWN )
- {
- // resource type for lock/unlock operations still unknown, need to ask the server
-
- const OUString aScheme(
- rURL.copy( 0, rURL.indexOf( ':' ) ).toAsciiLowerCase() );
-
- if ( aScheme == FTP_URL_SCHEME )
- {
- eResourceTypeForLocks = FTP;
- }
- else
- {
- DAVOptions aDAVOptions;
- getResourceOptions( Environment, aDAVOptions, rResAccess );
- if( aDAVOptions.isClass1() ||
- aDAVOptions.isClass2() ||
- aDAVOptions.isClass3() )
- {
- // this is at least a DAV, lock to be confirmed
- // class 2 is needed for full lock support
- // see
- // <https://tools.ietf.org/html/rfc4918#section-18.2>
- eResourceTypeForLocks = DAV_NOLOCK;
- if( aDAVOptions.isClass2() )
- {
- // ok, possible lock, check for it
- try
- {
- // we need only DAV:supportedlock
- std::vector< DAVResource > resources;
- std::vector< OUString > aPropNames;
- uno::Sequence< beans::Property > aProperties{
- { /* Name */ DAVProperties::SUPPORTEDLOCK, {}, {}, {} }
- };
-
- ContentProperties::UCBNamesToDAVNames( aProperties, aPropNames );
- rResAccess->PROPFIND( DAVZERO, aPropNames, resources, Environment );
-
- bool wasSupportedlockFound = false;
-
- // only one resource should be returned
- if ( resources.size() == 1 )
- {
- // we may have received a bunch of other properties
- // (some servers seems to do so)
- // but we need only supported lock for this check
- // all returned properties are in
- // resources.properties[n].Name/.Value
-
- for ( const auto& rProp : resources[0].properties )
- {
- if ( rProp.Name == DAVProperties::SUPPORTEDLOCK )
- {
- wasSupportedlockFound = true;
- uno::Sequence< ucb::LockEntry > aSupportedLocks;
- if ( rProp.Value >>= aSupportedLocks )
- {
- bool isSupported = std::any_of(std::cbegin(aSupportedLocks), std::cend(aSupportedLocks),
- [](const ucb::LockEntry& rLock) {
- // TODO: if the lock type is changed from 'exclusive write' to 'shared write'
- // e.g. to implement 'Calc shared file feature', the ucb::LockScope_EXCLUSIVE
- // value should be checked as well, adaptation the code may be needed
- return rLock.Scope == ucb::LockScope_EXCLUSIVE
- && rLock.Type == ucb::LockType_WRITE;
- });
- if (isSupported)
- {
- // requested locking mode is supported
- eResourceTypeForLocks = DAV;
- SAL_INFO( "ucb.ucp.webdav", "resourceTypeForLocks - URL: <"
- << m_xIdentifier->getContentIdentifier() << ">, DAV lock/unlock supported");
- }
- break;
- }
- }
- }
- }
- else
- {
- // PROPFIND failed; check if HEAD contains Content-Disposition: attachment (RFC1806, HTTP/1.1 19.5.1),
- // which supposedly means no lock for the resource (happens e.g. with SharePoint exported lists)
- OUString sContentDisposition;
- // First, check cached properties
- if (m_xCachedProps)
- {
- if ((m_xCachedProps->getValue("Content-Disposition") >>= sContentDisposition)
- && sContentDisposition.startsWithIgnoreAsciiCase("attachment"))
- {
- eResourceTypeForLocks = DAV_NOLOCK;
- wasSupportedlockFound = true;
- }
- }
- // If no data in cache, try HEAD request
- if (sContentDisposition.isEmpty() && !m_bDidGetOrHead) try
- {
- DAVResource resource;
- GetPropsUsingHeadRequest(resource, rResAccess, {"Content-Disposition"}, Environment);
- m_bDidGetOrHead = true;
- for (const auto& it : resource.properties)
- {
- if (it.Name.equalsIgnoreAsciiCase("Content-Disposition"))
- {
- if ((it.Value >>= sContentDisposition) && sContentDisposition.equalsIgnoreAsciiCase("attachment"))
- {
- eResourceTypeForLocks = DAV_NOLOCK;
- wasSupportedlockFound = true;
- }
- break;
- }
- }
- }
- catch (...){}
- }
- // check if this is still only a DAV_NOLOCK
- // a fallback for resources that do not have DAVProperties::SUPPORTEDLOCK property
- // we check for the returned OPTION if LOCK is allowed on the resource
- if ( !wasSupportedlockFound && eResourceTypeForLocks == DAV_NOLOCK )
- {
- SAL_INFO( "ucb.ucp.webdav", "This WebDAV server has no supportedlock property, check for allowed LOCK method in OPTIONS" );
- // ATTENTION: if the lock type is changed from 'exclusive write' to 'shared write'
- // e.g. to implement 'Calc shared file feature' on WebDAV directly, and we arrive to this fallback
- // and the LOCK is allowed, we should assume that only exclusive write lock is available
- // this is just a reminder...
- if ( aDAVOptions.isLockAllowed() )
- eResourceTypeForLocks = DAV;
- }
- }
- catch ( DAVException const & e )
- {
- rResAccess->resetUri();
- //grab the error code
- switch( e.getStatus() )
- {
- case SC_NOT_FOUND:
- SAL_WARN( "ucb.ucp.webdav", "resourceTypeForLocks() - URL: <"
- << m_xIdentifier->getContentIdentifier() << "> was not found. ");
- eResourceTypeForLocks = NOT_FOUND;
- break;
- // some servers returns SC_FORBIDDEN, instead
- // the meaning of SC_FORBIDDEN is, according to <http://tools.ietf.org/html/rfc7231#section-6.5.3>:
- // The 403 (Forbidden) status code indicates that the server understood
- // the request but refuses to authorize it
- case SC_FORBIDDEN:
- // Errors SC_NOT_IMPLEMENTED and SC_METHOD_NOT_ALLOWED are
- // part of base http 1.1 RFCs
- case SC_NOT_IMPLEMENTED: // <http://tools.ietf.org/html/rfc7231#section-6.6.2>
- case SC_METHOD_NOT_ALLOWED: // <http://tools.ietf.org/html/rfc7231#section-6.5.5>
- // they all mean the resource is NON_DAV
- SAL_WARN( "ucb.ucp.webdav", "resourceTypeForLocks() DAVException (SC_FORBIDDEN, SC_NOT_IMPLEMENTED or SC_METHOD_NOT_ALLOWED) - URL: <"
- << m_xIdentifier->getContentIdentifier() << ">, DAV ExceptionCode: " << e.getError() << ", HTTP error: " << e.getStatus() );
- eResourceTypeForLocks = NON_DAV;
- break;
- default:
- //fallthrough
- SAL_WARN( "ucb.ucp.webdav", "resourceTypeForLocks() DAVException - URL: <"
- << m_xIdentifier->getContentIdentifier() << ">, DAV ExceptionCode: " << e.getError() << ", HTTP error: " << e.getStatus() );
- eResourceTypeForLocks = UNKNOWN;
- }
- }
- }
- }
- else
- eResourceTypeForLocks = NON_DAV;
-
- }
- }
- osl::MutexGuard g(m_aMutex);
- if (m_eResourceTypeForLocks == UNKNOWN)
- {
- m_eResourceTypeForLocks = eResourceTypeForLocks;
- }
- else
- {
- SAL_WARN_IF(
- eResourceTypeForLocks != m_eResourceTypeForLocks, "ucb.ucp.webdav",
- "different resource types for <" << rURL << ">: "
- << +eResourceTypeForLocks << " vs. " << +m_eResourceTypeForLocks);
- }
- SAL_INFO( "ucb.ucp.webdav", "resourceTypeForLocks() - URL: <"
- << m_xIdentifier->getContentIdentifier() << ">, m_eResourceTypeForLocks: " << m_eResourceTypeForLocks );
- return m_eResourceTypeForLocks;
-}
-
-Content::ResourceType Content::resourceTypeForLocks(
- const uno::Reference< ucb::XCommandEnvironment >& Environment )
-{
- std::unique_ptr< DAVResourceAccess > xResAccess;
- {
- osl::MutexGuard aGuard( m_aMutex );
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- }
- Content::ResourceType ret = resourceTypeForLocks( Environment, xResAccess );
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
- return ret;
-}
-
-void Content::lock(
- const uno::Reference< ucb::XCommandEnvironment >& Environment )
-{
-// prepare aURL to be used in exception, see below
- OUString aURL;
- if ( m_bTransient )
- {
- aURL = getParentURL();
- if ( aURL.lastIndexOf('/') != ( aURL.getLength() - 1 ) )
- aURL += "/";
-
- aURL += m_aEscapedTitle;
- }
- else
- {
- aURL = m_xIdentifier->getContentIdentifier();
- }
-
- try
- {
- std::unique_ptr< DAVResourceAccess > xResAccess;
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- }
-
- uno::Any aOwnerAny;
- aOwnerAny
- <<= OUString("LibreOffice - http://www.libreoffice.org/");
-
- ucb::Lock aLock(
- ucb::LockScope_EXCLUSIVE,
- ucb::LockType_WRITE,
- ucb::LockDepth_ZERO,
- aOwnerAny,
- 180, // lock timeout in secs
- //-1, // infinite lock
- uno::Sequence< OUString >() );
-
- // OPTIONS may change as a consequence of the lock operation
- aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() );
- removeCachedPropertyNames( xResAccess->getURL() );
- xResAccess->LOCK( aLock, Environment );
-
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
- }
- catch ( DAVException const & e )
- {
- // check if the exception thrown is 'already locked'
- // this exception is mapped directly to the ucb correct one, without
- // going into the cancelCommandExecution() user interaction
- // this exception should be managed by the issuer of 'lock' command
- switch( e.getError() )
- {
- case DAVException::DAV_LOCKED:
- {
- SAL_WARN( "ucb.ucp.webdav", "lock() resource already locked - URL: <"
- << m_xIdentifier->getContentIdentifier() << ">");
- throw
- ucb::InteractiveLockingLockedException(
- "Locked!",
- static_cast< cppu::OWeakObject * >( this ),
- task::InteractionClassification_ERROR,
- aURL,
- false );
- }
- break;
- case DAVException::DAV_HTTP_AUTH:
- {
- SAL_WARN( "ucb.ucp.webdav", "lock() DAVException Authentication error - URL: <"
- << m_xIdentifier->getContentIdentifier() << ">" );
- // DAVException::DAV_HTTP_AUTH exception can mean:
- // - interaction handler for credential management not present (happens, depending
- // on the LO framework processing)
- // - the remote site is a WebDAV with special configuration: read/only for read operations
- // and read/write for write operations, the user is not allowed to lock/write and
- // she cancelled the credentials request.
- // this is not actually an error, but the exception is sent directly from here, avoiding the automatic
- // management that takes part in cancelCommandExecution() below
- // Unfortunately there is no InteractiveNetwork*Exception available to signal this
- // since it mostly happens on read/only part of webdav, this appears to be the most correct exception available
- throw
- ucb::InteractiveNetworkWriteException(
- "Authentication error while trying to lock! Write only WebDAV perhaps?",
- static_cast< cppu::OWeakObject * >( this ),
- task::InteractionClassification_ERROR,
- e.getData() );
- }
- break;
- case DAVException::DAV_HTTP_ERROR:
- //grab the error code
- switch( e.getStatus() )
- {
- // The 'case SC_NOT_FOUND' just below tries to solve a problem in eXo Platform
- // WebDAV connector which apparently fail on resource first creation
- // rfc4918 section-7.3 (see link below)
- case SC_NOT_FOUND: // <http://tools.ietf.org/html/rfc7231#section-6.5.4>
- // The 'case SC_PRECONDITION_FAILED' just below tries to solve a problem
- // in SharePoint when locking the resource on first creation fails due to this:
- // <https://msdn.microsoft.com/en-us/library/jj575265%28v=office.12%29.aspx#id15>
- // (retrieved on 2015-08-14)
- case SC_PRECONDITION_FAILED: // <http://tools.ietf.org/html/rfc7232#section-4.2>
- // Errors SC_NOT_IMPLEMENTED and SC_METHOD_NOT_ALLOWED are
- // part of base http 1.1 RFCs
- case SC_NOT_IMPLEMENTED: // <http://tools.ietf.org/html/rfc7231#section-6.6.2>
- case SC_METHOD_NOT_ALLOWED: // <http://tools.ietf.org/html/rfc7231#section-6.5.5>
- SAL_WARN( "ucb.ucp.webdav", "lock() DAVException (SC_NOT_FOUND, SC_PRECONDITION_FAILED, SC_NOT_IMPLEMENTED or SC_METHOD_NOT_ALLOWED) - URL: <"
- << m_xIdentifier->getContentIdentifier() << ">, DAV ExceptionCode: " << e.getError() << ", HTTP error: " << e.getStatus() );
- // act as nothing happened
- // that's because when a resource is first created
- // the lock is sent before the put, so the resource
- // is actually created by LOCK, locking it before
- // the first PUT, but if LOCK is not supported
- // (simple web or DAV with lock disabled) we end with one of these http
- // errors.
- // These same errors may be reported when the LOCK on an unmapped
- // (i.e. non existent) resource is not implemented.
- // Detailed specification in:
- // <http://tools.ietf.org/html/rfc4918#section-7.3>
- return;
- default:
- //fallthrough
- ;
- }
- break;
- case DAVException::DAV_LOCKED_SELF:
- // we already hold the lock and it is in our internal lockstore
- // just return as if the lock was successful
- return;
- default:
- //fallthrough
- ;
- }
-
- SAL_WARN( "ucb.ucp.webdav","lock() DAVException - URL: <"
- << m_xIdentifier->getContentIdentifier() << ">, DAV ExceptionCode: " << e.getError() << ", HTTP error: " << e.getStatus() );
- cancelCommandExecution( e, Environment );
- // Unreachable
- }
-}
-
-
-void Content::unlock(
- const uno::Reference< ucb::XCommandEnvironment >& Environment )
-{
-
- try
- {
- std::unique_ptr< DAVResourceAccess > xResAccess;
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- }
-
- // check if the target URL is a Class1 DAV
- DAVOptions aDAVOptions;
- getResourceOptions( Environment, aDAVOptions, xResAccess );
-
- // at least class one is needed
- if( aDAVOptions.isClass1() )
- {
- // remove options from cache, unlock may change it
- // it will be refreshed when needed
- aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() );
- // clean cached value of PROPFIND properties names
- removeCachedPropertyNames( xResAccess->getURL() );
- xResAccess->UNLOCK( Environment );
- }
-
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
- }
- catch ( DAVException const & e )
- {
- switch( e.getError() )
- {
- case DAVException::DAV_NOT_LOCKED:
- SAL_WARN( "ucb.ucp.webdav", "unlock() DAVException::DAV_NOT_LOCKED - URL: <"
- << m_xIdentifier->getContentIdentifier() << ">");
- // means that we don't own any lock on this resource
- // intercepted here to remove a confusing indication to the user
- // unfortunately this happens in some WebDAV server configuration
- // acting as WebDAV and having lock/unlock enabled only
- // for authorized user.
- return;
- case DAVException::DAV_HTTP_ERROR:
- //grab the error code
- switch( e.getStatus() )
- {
- // Errors SC_NOT_IMPLEMENTED and SC_METHOD_NOT_ALLOWED are
- // part of base http 1.1 RFCs
- case SC_NOT_IMPLEMENTED: // <http://tools.ietf.org/html/rfc7231#section-6.6.2>
- case SC_METHOD_NOT_ALLOWED: // <http://tools.ietf.org/html/rfc7231#section-6.5.5>
- SAL_WARN( "ucb.ucp.webdav", "unlock() DAVException (SC_NOT_IMPLEMENTED or SC_METHOD_NOT_ALLOWED) - URL: <"
- << m_xIdentifier->getContentIdentifier() << ">, DAV ExceptionCode: " << e.getError() << ", HTTP error: " << e.getStatus() );
- return;
- default:
- //fallthrough
- ;
- }
- break;
- default:
- //fallthrough
- ;
- }
- SAL_WARN( "ucb.ucp.webdav","unlock() DAVException - URL: <"
- << m_xIdentifier->getContentIdentifier() << ">, DAV ExceptionCode: " << e.getError() << ", HTTP error: " << e.getStatus() );
- cancelCommandExecution( e, Environment );
- // Unreachable
- }
-}
-
-
-bool Content::exchangeIdentity(
- const uno::Reference< ucb::XContentIdentifier >& xNewId )
-{
- if ( !xNewId.is() )
- return false;
-
- osl::ClearableGuard< osl::Mutex > aGuard( m_aMutex );
-
- uno::Reference< ucb::XContent > xThis = this;
-
- // Already persistent?
- if ( m_bTransient )
- {
- SAL_WARN( "ucb.ucp.webdav", "Content::exchangeIdentity - Not persistent!" );
- return false;
- }
-
- // Exchange own identity.
-
- // Fail, if a content with given id already exists.
-// if ( !hasData( xNewId ) )
- {
- OUString aOldURL = m_xIdentifier->getContentIdentifier();
-
- aGuard.clear();
- if ( exchange( xNewId ) )
- {
- // Process instantiated children...
-
- ContentRefList aChildren;
- queryChildren( aChildren );
-
- for ( const auto& rChild : aChildren )
- {
- ContentRef xChild = rChild;
-
- // Create new content identifier for the child...
- uno::Reference< ucb::XContentIdentifier >
- xOldChildId = xChild->getIdentifier();
- OUString aOldChildURL
- = xOldChildId->getContentIdentifier();
- OUString aNewChildURL
- = aOldChildURL.replaceAt(
- 0,
- aOldURL.getLength(),
- xNewId->getContentIdentifier() );
- uno::Reference< ucb::XContentIdentifier > xNewChildId
- = new ::ucbhelper::ContentIdentifier( aNewChildURL );
-
- if ( !xChild->exchangeIdentity( xNewChildId ) )
- return false;
- }
- return true;
- }
- }
-
- SAL_WARN( "ucb.ucp.webdav", "Content::exchangeIdentity - "
- "Panic! Cannot exchange identity!" );
- return false;
-}
-
-
-bool Content::isFolder(
- const uno::Reference< ucb::XCommandEnvironment >& xEnv )
-{
- {
- osl::MutexGuard aGuard( m_aMutex );
-
- if ( m_bTransient )
- return m_bCollection;
- }
-
- uno::Sequence< beans::Property > aProperties{
- { /* Name */ "IsFolder", /* Handle */ -1, {}, {} }
- };
- uno::Reference< sdbc::XRow > xRow( getPropertyValues( aProperties, xEnv ) );
- if ( xRow.is() )
- {
- try
- {
- return xRow->getBoolean( 1 );
- }
- catch ( sdbc::SQLException const & )
- {
- }
- }
-
- return false;
-}
-
-
-uno::Any Content::MapDAVException( const DAVException & e, bool bWrite )
-{
- // Map DAVException...
- uno::Any aException;
-
- OUString aURL;
- if ( m_bTransient )
- {
- aURL = getParentURL();
- if ( aURL.lastIndexOf('/') != ( aURL.getLength() - 1 ) )
- aURL += "/";
-
- aURL += m_aEscapedTitle;
- }
- else
- {
- aURL = m_xIdentifier->getContentIdentifier();
- }
-
- switch ( e.getStatus() )
- {
- case SC_NOT_FOUND:
- {
- uno::Sequence< uno::Any > aArgs{ uno::Any(beans::PropertyValue(
- "Uri", -1,
- uno::makeAny(aURL),
- beans::PropertyState_DIRECT_VALUE)) };
-
- aException <<=
- ucb::InteractiveAugmentedIOException(
- "Not found!",
- static_cast< cppu::OWeakObject * >( this ),
- task::InteractionClassification_ERROR,
- ucb::IOErrorCode_NOT_EXISTING,
- aArgs );
- return aException;
- }
- default:
- break;
- }
-
- switch ( e.getError() )
- {
- case DAVException::DAV_HTTP_ERROR:
- {
- if ( bWrite )
- aException <<=
- ucb::InteractiveNetworkWriteException(
- e.getData(),
- static_cast< cppu::OWeakObject * >( this ),
- task::InteractionClassification_ERROR,
- e.getData() );
- else
- aException <<=
- ucb::InteractiveNetworkReadException(
- e.getData(),
- static_cast< cppu::OWeakObject * >( this ),
- task::InteractionClassification_ERROR,
- e.getData() );
- break;
- }
-
- case DAVException::DAV_HTTP_LOOKUP:
- aException <<=
- ucb::InteractiveNetworkResolveNameException(
- OUString(),
- static_cast< cppu::OWeakObject * >( this ),
- task::InteractionClassification_ERROR,
- e.getData() );
- break;
-
-// @@@ No matching InteractiveNetwork*Exception
-// case DAVException::DAV_HTTP_AUTH:
-// break;
-
-// @@@ No matching InteractiveNetwork*Exception
-// case DAVException::DAV_HTTP_AUTHPROXY:
-// break;
-
- case DAVException::DAV_HTTP_TIMEOUT:
- case DAVException::DAV_HTTP_CONNECT:
- aException <<=
- ucb::InteractiveNetworkConnectException(
- OUString(),
- static_cast< cppu::OWeakObject * >( this ),
- task::InteractionClassification_ERROR,
- e.getData() );
- break;
-
-// @@@ No matching InteractiveNetwork*Exception
-// case DAVException::DAV_HTTP_REDIRECT:
-// break;
-
-// @@@ No matching InteractiveNetwork*Exception
-// case DAVException::DAV_SESSION_CREATE:
-// break;
-
- case DAVException::DAV_INVALID_ARG:
- aException <<=
- lang::IllegalArgumentException(
- OUString(),
- static_cast< cppu::OWeakObject * >( this ),
- -1 );
- break;
-
- case DAVException::DAV_LOCKED:
- aException <<=
- ucb::InteractiveLockingLockedException(
- "Locked!",
- static_cast< cppu::OWeakObject * >( this ),
- task::InteractionClassification_ERROR,
- aURL,
- false ); // not SelfOwned
- break;
-
- case DAVException::DAV_LOCKED_SELF:
- aException <<=
- ucb::InteractiveLockingLockedException(
- "Locked (self!)",
- static_cast< cppu::OWeakObject * >( this ),
- task::InteractionClassification_ERROR,
- aURL,
- true ); // SelfOwned
- break;
-
- case DAVException::DAV_NOT_LOCKED:
- aException <<=
- ucb::InteractiveLockingNotLockedException(
- "Not locked!",
- static_cast< cppu::OWeakObject * >( this ),
- task::InteractionClassification_ERROR,
- aURL );
- break;
-
- case DAVException::DAV_LOCK_EXPIRED:
- aException <<=
- ucb::InteractiveLockingLockExpiredException(
- "Lock expired!",
- static_cast< cppu::OWeakObject * >( this ),
- task::InteractionClassification_ERROR,
- aURL );
- break;
-
- default:
- aException <<=
- ucb::InteractiveNetworkGeneralException(
- OUString(),
- static_cast< cppu::OWeakObject * >( this ),
- task::InteractionClassification_ERROR );
- break;
- }
-
- return aException;
-}
-
-
-// static
-bool Content::shouldAccessNetworkAfterException( const DAVException & e )
-{
- return !(( e.getStatus() == SC_NOT_FOUND ) ||
- ( e.getStatus() == SC_GONE ) ||
- ( e.getError() == DAVException::DAV_HTTP_TIMEOUT ) ||
- ( e.getError() == DAVException::DAV_HTTP_LOOKUP ) ||
- ( e.getError() == DAVException::DAV_HTTP_CONNECT ) ||
- ( e.getError() == DAVException::DAV_HTTP_AUTH ) ||
- ( e.getError() == DAVException::DAV_HTTP_AUTHPROXY ));
-}
-
-
-void Content::cancelCommandExecution(
- const DAVException & e,
- const uno::Reference< ucb::XCommandEnvironment > & xEnv,
- bool bWrite /* = sal_False */ )
-{
- ucbhelper::cancelCommandExecution( MapDAVException( e, bWrite ), xEnv );
- // Unreachable
-}
-
-
-OUString
-Content::getBaseURI( const std::unique_ptr< DAVResourceAccess > & rResAccess )
-{
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
-
- // First, try to obtain value of response header "Content-Location".
- if (m_xCachedProps)
- {
- OUString aLocation;
- m_xCachedProps->getValue( "Content-Location" ) >>= aLocation;
- if ( !aLocation.isEmpty() )
- {
- try
- {
- // Do not use m_xIdentifier->getContentIdentifier() because it
- // for example does not reflect redirects applied to requests
- // done using the original URI but m_xResAccess' URI does.
- return rtl::Uri::convertRelToAbs( rResAccess->getURL(),
- aLocation );
- }
- catch ( rtl::MalformedUriException const & )
- {
- }
- }
- }
-
- return rResAccess->getURL();
-}
-
-// resource type is the type of the WebDAV resource
-Content::ResourceType Content::getResourceType(
- const uno::Reference< ucb::XCommandEnvironment >& xEnv,
- const std::unique_ptr< DAVResourceAccess > & rResAccess,
- bool * networkAccessAllowed)
-{
- {
- osl::MutexGuard g(m_aMutex);
- if (m_eResourceType != UNKNOWN) {
- return m_eResourceType;
- }
- }
-
- ResourceType eResourceType = UNKNOWN;
- DAVOptions aDAVOptions;
-
- const OUString & rURL = rResAccess->getURL();
- const OUString aScheme(
- rURL.copy( 0, rURL.indexOf( ':' ) ).toAsciiLowerCase() );
-
- if ( aScheme == FTP_URL_SCHEME )
- {
- eResourceType = FTP;
- }
- else
- {
- getResourceOptions( xEnv, aDAVOptions, rResAccess, networkAccessAllowed );
-
- // at least class one is needed
- if( aDAVOptions.isClass1() )
- {
- try
- {
- // Try to fetch some frequently used property value, e.g. those
- // used when loading documents... along with identifying whether
- // this is a DAV resource.
- std::vector< DAVResource > resources;
- std::vector< OUString > aPropNames;
- uno::Sequence< beans::Property > aProperties{
- { /* Name */ "IsFolder", {}, {}, {} },
- { /* Name */ "IsDocument", {}, {}, {} },
- { /* Name */ "IsReadOnly", {}, {}, {} },
- { /* Name */ "MediaType", {}, {}, {} },
- { /* Name */ DAVProperties::SUPPORTEDLOCK, {}, {}, {} }
- };
-
- ContentProperties::UCBNamesToDAVNames( aProperties, aPropNames );
-
- rResAccess->PROPFIND( DAVZERO, aPropNames, resources, xEnv );
-
- if ( resources.size() == 1 )
- {
-#if defined SAL_LOG_INFO
- {//debug
- // print received resources
- for ( const auto& rProp : resources[0].properties )
- {
- OUString aPropValue;
- bool bValue;
- uno::Sequence< ucb::LockEntry > aSupportedLocks;
- if(rProp.Value >>= aPropValue )
- SAL_INFO( "ucb.ucp.webdav", "PROPFIND (getResourceType) - ret'd prop: " << rProp.Name << ":" << aPropValue );
- else if( rProp.Value >>= bValue )
- SAL_INFO( "ucb.ucp.webdav", "PROPFIND (getResourceType) - ret'd prop: " << rProp.Name << ":" <<
- ( bValue ? "true" : "false" ) );
- else if( rProp.Value >>= aSupportedLocks )
- {
- SAL_INFO( "ucb.ucp.webdav", "PROPFIND (getResourceType) - ret'd prop: " << rProp.Name << ":" );
- for ( sal_Int32 n = 0; n < aSupportedLocks.getLength(); ++n )
- {
- SAL_INFO( "ucb.ucp.webdav","PROPFIND (getResourceType) - supportedlock[" << n <<"]: scope: "
- << ( aSupportedLocks[ n ].Scope == css::ucb::LockScope_SHARED ? "shared" : "exclusive" )
- << ", type: "
- << ( aSupportedLocks[ n ].Type != css::ucb::LockType_WRITE ? "" : "write" ) );
- }
- }
- }
- }
-#endif
- osl::MutexGuard g(m_aMutex);
- m_xCachedProps.reset(
- new CachableContentProperties( ContentProperties( resources[ 0 ] ) ) );
- m_xCachedProps->containsAllNames(
- aProperties, m_aFailedPropNames );
- }
- eResourceType = DAV;
- }
- catch ( DAVException const & e )
- {
- rResAccess->resetUri();
-
- SAL_WARN( "ucb.ucp.webdav", "Content::getResourceType returned errors, DAV ExceptionCode: " << e.getError() << ", HTTP error: " << e.getStatus() );
-
- if ( e.getStatus() == SC_METHOD_NOT_ALLOWED )
- {
- // Status SC_METHOD_NOT_ALLOWED is a safe indicator that the
- // resource is NON_DAV
- eResourceType = NON_DAV;
- }
- else if (networkAccessAllowed != nullptr)
- {
- *networkAccessAllowed = *networkAccessAllowed
- && shouldAccessNetworkAfterException(e);
- }
- if ( e.getStatus() == SC_NOT_FOUND )
- {
- // arrives here if OPTIONS is still cached for a resource previously available
- // operate on the OPTIONS cache:
- // if OPTIONS was not found, do nothing
- // else OPTIONS returned on a resource not existent (example a server that allows lock on null resource) set
- // not found and adjust lifetime accordingly
- DAVOptions aDAVOptionsInner;
- if( aStaticDAVOptionsCache.getDAVOptions( rURL, aDAVOptionsInner ) )
- {
- // TODO? get redirected url
- aDAVOptionsInner.setHttpResponseStatusCode( e.getStatus() );
- aDAVOptionsInner.setHttpResponseStatusText( e.getData() );
- aStaticDAVOptionsCache.addDAVOptions( aDAVOptionsInner,
- m_nOptsCacheLifeNotFound );
- }
- }
- // if the two net events below happen, something
- // is going on to the connection so break the command flow
- if ( ( e.getError() == DAVException::DAV_HTTP_TIMEOUT ) ||
- ( e.getError() == DAVException::DAV_HTTP_CONNECT ) )
- {
- cancelCommandExecution( e, xEnv );
- // unreachable
- }
- }
- }
- else
- {
- rResAccess->resetUri();
-
- // first check if the cached error can be mapped to DAVException::DAV_HTTP_TIMEOUT or mapped to DAVException::DAV_HTTP_CONNECT
- if ( aDAVOptions.getHttpResponseStatusCode() == USC_CONNECTION_TIMED_OUT )
- {
- // behave same as DAVException::DAV_HTTP_TIMEOUT or DAVException::DAV_HTTP_CONNECT was thrown
- try
- {
- // extract host name and connection port
- NeonUri theUri( rURL );
- const OUString& aHostName = theUri.GetHost();
- sal_Int32 nPort = theUri.GetPort();
- throw DAVException( DAVException::DAV_HTTP_TIMEOUT,
- NeonUri::makeConnectionEndPointString( aHostName,
- nPort ) );
- }
- catch ( DAVException& exp )
- {
- cancelCommandExecution( exp, xEnv );
- }
- }
-
- if ( aDAVOptions.getHttpResponseStatusCode() != SC_NOT_FOUND &&
- aDAVOptions.getHttpResponseStatusCode() != SC_GONE ) // the cached OPTIONS can have SC_GONE
- {
- eResourceType = NON_DAV;
- }
- else
- {
- //resource doesn't exist
- if ( networkAccessAllowed != nullptr )
- *networkAccessAllowed = false; }
- }
- }
-
- osl::MutexGuard g(m_aMutex);
- if (m_eResourceType == UNKNOWN) {
- m_eResourceType = eResourceType;
- } else {
- SAL_WARN_IF(
- eResourceType != m_eResourceType, "ucb.ucp.webdav",
- "different resource types for <" << rURL << ">: "
- << +eResourceType << " vs. " << +m_eResourceType);
- }
- SAL_INFO( "ucb.ucp.webdav", "m_eResourceType for <"<<rURL<<">: " << m_eResourceType );
- return m_eResourceType;
-}
-
-
-Content::ResourceType Content::getResourceType(
- const uno::Reference< ucb::XCommandEnvironment >& xEnv )
-{
- std::unique_ptr< DAVResourceAccess > xResAccess;
- {
- osl::MutexGuard aGuard( m_aMutex );
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- }
- Content::ResourceType const ret = getResourceType( xEnv, xResAccess );
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
- m_xResAccess.reset(new DAVResourceAccess(*xResAccess));
- }
- return ret;
-}
-
-
-void Content::initOptsCacheLifeTime()
-{
- // see description in
- // officecfg/registry/schema/org/openoffice/Inet.xcs
- // for use of these field values.
- sal_uInt32 nAtime;
- nAtime = officecfg::Inet::Settings::OptsCacheLifeImplWeb::get( m_xContext );
- m_nOptsCacheLifeImplWeb = std::max( sal_uInt32( 0 ),
- std::min( nAtime, sal_uInt32( 3600 ) ) );
-
- nAtime = officecfg::Inet::Settings::OptsCacheLifeDAV::get( m_xContext );
- m_nOptsCacheLifeDAV = std::max( sal_uInt32( 0 ),
- std::min( nAtime, sal_uInt32( 3600 ) ) );
-
- nAtime = officecfg::Inet::Settings::OptsCacheLifeDAVLocked::get( m_xContext );
- m_nOptsCacheLifeDAVLocked = std::max( sal_uInt32( 0 ),
- std::min( nAtime, sal_uInt32( 3600 ) ) );
-
- nAtime = officecfg::Inet::Settings::OptsCacheLifeNotImpl::get( m_xContext );
- m_nOptsCacheLifeNotImpl = std::max( sal_uInt32( 0 ),
- std::min( nAtime, sal_uInt32( 43200 ) ) );
-
- nAtime = officecfg::Inet::Settings::OptsCacheLifeNotFound::get( m_xContext );
- m_nOptsCacheLifeNotFound = std::max( sal_uInt32( 0 ),
- std::min( nAtime, sal_uInt32( 30 ) ) );
-}
-
-
-void Content::getResourceOptions(
- const css::uno::Reference< css::ucb::XCommandEnvironment >& xEnv,
- DAVOptions& rDAVOptions,
- const std::unique_ptr< DAVResourceAccess > & rResAccess,
- bool * networkAccessAllowed )
-{
- OUString aTargetURL = rResAccess->getURL();
- DAVOptions aDAVOptions;
- // first check if in cache, if not, then send method to server
- if ( !aStaticDAVOptionsCache.getDAVOptions( aTargetURL, aDAVOptions ) )
- {
- OUString aRedirURL;
- try
- {
- rResAccess->OPTIONS( aDAVOptions, xEnv );
- // IMPORTANT:the correctly implemented server will answer without errors, even if the resource is not present
- sal_uInt32 nLifeTime = ( aDAVOptions.isClass1() ||
- aDAVOptions.isClass2() ||
- aDAVOptions.isClass3() ) ?
- m_nOptsCacheLifeDAV : // a WebDAV site
- m_nOptsCacheLifeImplWeb; // a site implementing OPTIONS but
- // it's not DAV
- // if resource is locked, will use a
- // different lifetime
- if( aDAVOptions.isLocked() )
- nLifeTime = m_nOptsCacheLifeDAVLocked;
-
- // check if redirected
- aRedirURL = rResAccess->getURL();
- if( aRedirURL == aTargetURL)
- { // no redirection
- aRedirURL.clear();
- }
- // cache this URL's option
- aDAVOptions.setURL( aTargetURL );
- aDAVOptions.setRedirectedURL( aRedirURL );
- aStaticDAVOptionsCache.addDAVOptions( aDAVOptions,
- nLifeTime );
- }
- catch ( DAVException const & e )
- {
- // first, remove from cache, will be added if needed, depending on the error received
- aStaticDAVOptionsCache.removeDAVOptions( aTargetURL );
- rResAccess->resetUri();
-
- aDAVOptions.setURL( aTargetURL );
- aDAVOptions.setRedirectedURL( aRedirURL );
- switch( e.getError() )
- {
- case DAVException::DAV_HTTP_TIMEOUT:
- case DAVException::DAV_HTTP_CONNECT:
- {
- // something bad happened to the connection
- // not same as not found, this instead happens when the server doesn't exist or doesn't answer at all
- // probably a new bit stating 'timed out' should be added to opts var?
- // in any case abort the command
- SAL_WARN( "ucb.ucp.webdav", "OPTIONS - DAVException: DAV_HTTP_TIMEOUT or DAV_HTTP_CONNECT for URL <" << m_xIdentifier->getContentIdentifier() << ">" );
- // cache the internal unofficial status code
-
- aDAVOptions.setHttpResponseStatusCode( USC_CONNECTION_TIMED_OUT );
- // used only internally, so the text doesn't really matter...
- aStaticDAVOptionsCache.addDAVOptions( aDAVOptions,
- m_nOptsCacheLifeNotFound );
- if ( networkAccessAllowed != nullptr )
- {
- *networkAccessAllowed = *networkAccessAllowed
- && shouldAccessNetworkAfterException(e);
- }
- }
- break;
- case DAVException::DAV_HTTP_LOOKUP:
- {
- SAL_WARN( "ucb.ucp.webdav", "OPTIONS - DAVException: DAV_HTTP_LOOKUP for URL <" << m_xIdentifier->getContentIdentifier() << ">" );
- aDAVOptions.setHttpResponseStatusCode( USC_LOOKUP_FAILED );
- // used only internally, so the text doesn't really matter...
- aStaticDAVOptionsCache.addDAVOptions( aDAVOptions,
- m_nOptsCacheLifeNotFound );
- if ( networkAccessAllowed != nullptr )
- {
- *networkAccessAllowed = *networkAccessAllowed
- && shouldAccessNetworkAfterException(e);
- }
- }
- break;
- case DAVException::DAV_HTTP_AUTH:
- {
- SAL_WARN( "ucb.ucp.webdav", "OPTIONS - DAVException: DAV_HTTP_AUTH for URL <" << m_xIdentifier->getContentIdentifier() << ">" );
- // - the remote site is a WebDAV with special configuration: read/only for read operations
- // and read/write for write operations, the user is not allowed to lock/write and
- // she cancelled the credentials request.
- // this is not actually an error, it means only that for current user this is a standard web,
- // though possibly DAV enabled
- aDAVOptions.setHttpResponseStatusCode( USC_AUTH_FAILED );
- // used only internally, so the text doesn't really matter...
- aStaticDAVOptionsCache.addDAVOptions( aDAVOptions,
- m_nOptsCacheLifeNotFound );
- if ( networkAccessAllowed != nullptr )
- {
- *networkAccessAllowed = *networkAccessAllowed
- && shouldAccessNetworkAfterException(e);
- }
- }
- break;
- case DAVException::DAV_HTTP_AUTHPROXY:
- {
- SAL_WARN( "ucb.ucp.webdav", "OPTIONS - DAVException: DAV_HTTP_AUTHPROXY for URL <" << m_xIdentifier->getContentIdentifier() << ">" );
- aDAVOptions.setHttpResponseStatusCode( USC_AUTHPROXY_FAILED );
- // used only internally, so the text doesn't really matter...
- aStaticDAVOptionsCache.addDAVOptions( aDAVOptions,
- m_nOptsCacheLifeNotFound );
- if ( networkAccessAllowed != nullptr )
- {
- *networkAccessAllowed = *networkAccessAllowed
- && shouldAccessNetworkAfterException(e);
- }
- }
- break;
- case DAVException::DAV_HTTP_ERROR:
- {
- switch( e.getStatus() )
- {
- case SC_FORBIDDEN:
- {
- SAL_WARN( "ucb.ucp.webdav","OPTIONS - SC_FORBIDDEN for URL <" << m_xIdentifier->getContentIdentifier() << ">" );
- // cache it, so OPTIONS won't be called again, this URL does not support it
- aStaticDAVOptionsCache.addDAVOptions( aDAVOptions,
- m_nOptsCacheLifeNotImpl );
- }
- break;
- case SC_BAD_REQUEST:
- case SC_INTERNAL_SERVER_ERROR:
- {
- SAL_WARN( "ucb.ucp.webdav","OPTIONS - SC_BAD_REQUEST or SC_INTERNAL_SERVER_ERROR for URL <" << m_xIdentifier->getContentIdentifier() << ">, HTTP error: "<< e.getStatus()
- << ", '" << e.getData() << "'" );
- // cache it, so OPTIONS won't be called again, this URL detect some problem while answering the method
- aDAVOptions.setHttpResponseStatusCode( e.getStatus() );
- aDAVOptions.setHttpResponseStatusText( e.getData() );
- aStaticDAVOptionsCache.addDAVOptions( aDAVOptions,
- m_nOptsCacheLifeNotFound );
- }
- break;
- case SC_NOT_IMPLEMENTED:
- case SC_METHOD_NOT_ALLOWED:
- {
- // OPTIONS method must be implemented in DAV
- // resource is NON_DAV, or not advertising it
- SAL_WARN( "ucb.ucp.webdav","OPTIONS - SC_NOT_IMPLEMENTED or SC_METHOD_NOT_ALLOWED for URL <" << m_xIdentifier->getContentIdentifier() << ">, HTTP error: "<< e.getStatus()
- << ", '" << e.getData() << "'" );
- // cache it, so OPTIONS won't be called again, this URL does not support it
- aStaticDAVOptionsCache.addDAVOptions( aDAVOptions,
- m_nOptsCacheLifeNotImpl );
- }
- break;
- case SC_NOT_FOUND:
- {
- // Apparently on IIS 10.0, if you disabled OPTIONS method, this error is the one reported,
- // instead of SC_NOT_IMPLEMENTED or SC_METHOD_NOT_ALLOWED.
- // So check if this is an available resource, or a real 'Not Found' event.
- sal_uInt32 nLifeTime = m_nOptsCacheLifeNotFound;
- if( isResourceAvailable( xEnv, rResAccess, aDAVOptions ) )
- {
- SAL_WARN( "ucb.ucp.webdav", "OPTIONS - Got an SC_NOT_FOUND, but the URL <" << m_xIdentifier->getContentIdentifier() << "> resource exists" );
- nLifeTime = m_nOptsCacheLifeNotImpl;
- }
- else
- {
- SAL_WARN( "ucb.ucp.webdav", "OPTIONS - SC_NOT_FOUND for URL <" << m_xIdentifier->getContentIdentifier() << ">" );
- if ( networkAccessAllowed != nullptr )
- {
- *networkAccessAllowed = *networkAccessAllowed
- && shouldAccessNetworkAfterException(e);
- }
- }
- aStaticDAVOptionsCache.addDAVOptions( aDAVOptions,
- nLifeTime );
- }
- break;
- default:
- {
- SAL_WARN( "ucb.ucp.webdav", "OPTIONS - DAV_HTTP_ERROR, for URL <" << m_xIdentifier->getContentIdentifier() << ">, HTTP error: "<< e.getStatus()
- << ", '" << e.getData() << "'" );
- aDAVOptions.setHttpResponseStatusCode( e.getStatus() );
- aDAVOptions.setHttpResponseStatusText( e.getData() );
- // cache it, so OPTIONS won't be called again, this URL does not support it
- aStaticDAVOptionsCache.addDAVOptions( aDAVOptions,
- m_nOptsCacheLifeNotImpl );
- }
- break;
- }
- }
- break;
- // The 'DAVException::DAV_HTTP_REDIRECT' means we reached the maximum
- // number of redirections, consider the resource type as UNKNOWN
- // possibly a normal web site, not DAV
- case DAVException::DAV_HTTP_REDIRECT:
- default:
- {
- SAL_WARN( "ucb.ucp.webdav","OPTIONS - General DAVException (or max DAV_HTTP_REDIRECT reached) for URL <" << m_xIdentifier->getContentIdentifier() << ">, DAV ExceptionCode: "
- << e.getError() << ", HTTP error: "<< e.getStatus() );
- aStaticDAVOptionsCache.addDAVOptions( aDAVOptions,
- m_nOptsCacheLifeNotImpl );
- }
- break;
- }
- }
- }
- else
- {
- // check current response status code, perhaps we need to set networkAccessAllowed
- sal_uInt16 CachedResponseStatusCode = aDAVOptions.getHttpResponseStatusCode();
- if ( networkAccessAllowed != nullptr &&
- ( ( CachedResponseStatusCode == SC_NOT_FOUND ) ||
- ( CachedResponseStatusCode == SC_GONE ) ||
- ( CachedResponseStatusCode == USC_CONNECTION_TIMED_OUT ) ||
- ( CachedResponseStatusCode == USC_LOOKUP_FAILED ) ||
- ( CachedResponseStatusCode == USC_AUTH_FAILED ) ||
- ( CachedResponseStatusCode == USC_AUTHPROXY_FAILED )
- )
- )
- {
- *networkAccessAllowed = false;
- }
- }
- rDAVOptions = aDAVOptions;
-}
-
-
-//static
-bool Content::isResourceAvailable( const css::uno::Reference< css::ucb::XCommandEnvironment >& xEnv,
- const std::unique_ptr< DAVResourceAccess > & rResAccess,
- DAVOptions& rDAVOptions )
-{
- std::vector< OUString > aHeaderNames;
- DAVResource aResource;
-
- try
- {
- // To check for the physical URL resource availability, first
- // try using a simple HEAD command
- // if HEAD is successful, set element found,
- rResAccess->HEAD( aHeaderNames, aResource, xEnv );
- rDAVOptions.setHttpResponseStatusCode( 0 );
- rDAVOptions.setHttpResponseStatusText( OUString() );
- return true;
- }
- catch ( DAVException const & e )
- {
- if ( e.getError() == DAVException::DAV_HTTP_ERROR )
- {
- if ( e.getStatus() == SC_NOT_IMPLEMENTED ||
- e.getStatus() == SC_METHOD_NOT_ALLOWED ||
- e.getStatus() == SC_NOT_FOUND )
- {
- SAL_WARN( "ucb.ucp.webdav", "HEAD probably not implemented: fall back to a partial GET" );
- // set in cached OPTIONS "HEAD not implemented"
- // so it won't be used again on this resource
- rDAVOptions.setHeadAllowed( false );
- try
- {
- // do a GET with a payload of 0, the server does not
- // support HEAD (or has HEAD disabled)
- DAVRequestHeaders aPartialGet;
- aPartialGet.emplace_back(
- OUString( "Range" ),
- OUString( "bytes=0-0" ));
-
- rResAccess->GET0( aPartialGet,
- aHeaderNames,
- aResource,
- xEnv );
- return true;
- }
- catch ( DAVException const & ex )
- {
- if ( ex.getError() == DAVException::DAV_HTTP_ERROR )
- {
- rDAVOptions.setHttpResponseStatusCode( ex.getStatus() );
- rDAVOptions.setHttpResponseStatusText( ex.getData() );
- }
- }
- }
- else
- {
- rDAVOptions.setHttpResponseStatusCode( e.getStatus() );
- rDAVOptions.setHttpResponseStatusText( e.getData() );
- }
- }
- return false;
- }
- catch ( ... )
- {
- }
- // set SC_NOT_IMPLEMENTED since at a minimum GET must be implemented in a basic Web server
- rDAVOptions.setHttpResponseStatusCode( SC_NOT_IMPLEMENTED );
- rDAVOptions.setHttpResponseStatusText( OUString() );
- return false;
-}
-
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/webdavcontent.hxx b/ucb/source/ucp/webdav-neon/webdavcontent.hxx
deleted file mode 100644
index 74dfb1624b75..000000000000
--- a/ucb/source/ucp/webdav-neon/webdavcontent.hxx
+++ /dev/null
@@ -1,317 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <memory>
-#include <list>
-#include <rtl/ref.hxx>
-#include <com/sun/star/ucb/ContentCreationException.hpp>
-#include <com/sun/star/ucb/XContentCreator.hpp>
-#include <ucbhelper/contenthelper.hxx>
-#include "DAVResourceAccess.hxx"
-#include "PropertyMap.hxx"
-
-namespace com::sun::star::beans {
- struct Property;
- struct PropertyValue;
-}
-
-namespace com::sun::star::io {
- class XInputStream;
-}
-
-namespace com::sun::star::sdbc {
- class XRow;
-}
-
-namespace com::sun::star::ucb {
- struct OpenCommandArgument3;
- struct PostCommandArgument2;
- struct PropertyCommandArgument;
- struct TransferInfo;
-}
-
-namespace webdav_ucp
-{
-
-
-// UNO service name for the content.
-inline constexpr OUStringLiteral WEBDAV_CONTENT_SERVICE_NAME = u"com.sun.star.ucb.WebDAVContent";
-
-
-class ContentProvider;
-class ContentProperties;
-class CachableContentProperties;
-
-class Content : public ::ucbhelper::ContentImplHelper,
- public css::ucb::XContentCreator
-{
- enum ResourceType
- {
- UNKNOWN, // the type of the Web resource is unknown
- NOT_FOUND, // the Web resource does not exists
- FTP, // the Web resource exists but it's ftp
- NON_DAV, // the Web resource exists but it's not DAV
- DAV, // the type of the Web resource is DAV with lock/unlock available
- DAV_NOLOCK // the type of the Web resource is DAV with no lock/unlock available
- };
-
- std::unique_ptr< DAVResourceAccess > m_xResAccess;
- std::unique_ptr< CachableContentProperties >
- m_xCachedProps; // locally cached props
- OUString m_aEscapedTitle;
- // resource type for general DAV methods
- ResourceType m_eResourceType;
- // resource type for general LOCK method only
- ResourceType m_eResourceTypeForLocks;
- ContentProvider* m_pProvider; // No need for a ref, base class holds object
- bool m_bTransient;
- bool m_bCollection;
- bool m_bDidGetOrHead;
- std::vector< OUString > m_aFailedPropNames;
- // Options Cache lifetime
- // for web site implementing OPTIONS, but not dav
- sal_uInt32 m_nOptsCacheLifeImplWeb;
- // for WebDAV site where OPTIONS is mandatory
- sal_uInt32 m_nOptsCacheLifeDAV;
- // same as above, but when the resource is locked by us
- sal_uInt32 m_nOptsCacheLifeDAVLocked;
-// For web site not implementing OPTIONS
- // during this time we assume the site doesn't turn to WebDAV
- // but remains a simple Web
- sal_uInt32 m_nOptsCacheLifeNotImpl;
- // When resource is not found
- // may be the resource is unavailable only briefly?
- // so better have this small
- sal_uInt32 m_nOptsCacheLifeNotFound;
-
- void initOptsCacheLifeTime();
-
-private:
- virtual css::uno::Sequence< css::beans::Property >
- getProperties( const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv ) override;
- virtual css::uno::Sequence< css::ucb::CommandInfo >
- getCommands( const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv ) override;
- virtual OUString getParentURL() override;
-
- /// @throws css::uno::Exception
- bool isFolder( const css::uno::Reference< css::ucb::XCommandEnvironment >& xEnv );
-
- /// @throws css::uno::Exception
- css::uno::Reference< css::sdbc::XRow >
- getPropertyValues( const css::uno::Sequence< css::beans::Property >& rProperties,
- const css::uno::Reference< css::ucb::XCommandEnvironment >& xEnv );
-
- /// @throws css::uno::Exception
- css::uno::Sequence< css::uno::Any >
- setPropertyValues( const css::uno::Sequence< css::beans::PropertyValue >& rValues,
- const css::uno::Reference< css::ucb::XCommandEnvironment >& xEnv );
-
- typedef rtl::Reference< Content > ContentRef;
- typedef std::vector< ContentRef > ContentRefList;
- void queryChildren( ContentRefList& rChildren);
-
- bool
- exchangeIdentity( const css::uno::Reference< css::ucb::XContentIdentifier >& xNewId );
-
- OUString
- getBaseURI( const std::unique_ptr< DAVResourceAccess > & rResAccess );
-
- /// @throws css::uno::Exception
- ResourceType
- getResourceType( const css::uno::Reference< css::ucb::XCommandEnvironment >& xEnv );
-
- /// @throws css::uno::Exception
- ResourceType
- getResourceType( const css::uno::Reference< css::ucb::XCommandEnvironment >& xEnv,
- const std::unique_ptr< DAVResourceAccess > & rResAccess,
- bool * networkAccessAllowed = nullptr);
-
- // Command "open"
- /// @throws css::uno::Exception
- css::uno::Any open(
- const css::ucb::OpenCommandArgument3 & rArg,
- const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- // Command "post"
- /// @throws css::uno::Exception
- void post( const css::ucb::PostCommandArgument2 & rArg,
- const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
-
- // Command "insert"
- /// @throws css::uno::Exception
- void insert( const css::uno::Reference< css::io::XInputStream > & xInputStream,
- bool bReplaceExisting,
- const css::uno::Reference< css::ucb::XCommandEnvironment >& Environment );
-
- // Command "transfer"
- /// @throws css::uno::Exception
- void transfer( const css::ucb::TransferInfo & rArgs,
- const css::uno::Reference< css::ucb::XCommandEnvironment >& Environment );
-
- // Command "delete"
- /// @throws css::uno::Exception
- void destroy( bool bDeletePhysical );
-
- // Command "lock"
- /// @throws css::uno::Exception
- void lock( const css::uno::Reference< css::ucb::XCommandEnvironment >& Environment );
-
- // Command "unlock"
- /// @throws css::uno::Exception
- void unlock( const css::uno::Reference< css::ucb::XCommandEnvironment >& Environment );
-
- css::uno::Any MapDAVException( const DAVException & e,
- bool bWrite );
- /// @throws css::uno::Exception
- void cancelCommandExecution(
- const DAVException & e,
- const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv,
- bool bWrite = false );
-
- static bool shouldAccessNetworkAfterException( const DAVException & e );
-
- ResourceType resourceTypeForLocks(
- const css::uno::Reference< css::ucb::XCommandEnvironment >& rEnvironment,
- const std::unique_ptr< DAVResourceAccess > & rResAccess );
-
- ResourceType resourceTypeForLocks(
- const css::uno::Reference< css::ucb::XCommandEnvironment >& rEnvironment );
-
- /// @throws css::beans::PropertyExistException
- /// @throws css::beans::IllegalTypeException
- /// @throws css::lang::IllegalArgumentException
- /// @throws css::uno::RuntimeException
- void addProperty( const css::ucb::PropertyCommandArgument &aCmdArg,
- const css::uno::Reference< css::ucb::XCommandEnvironment >& Environment );
-
- /// @throws css::beans::UnknownPropertyException
- /// @throws css::beans::NotRemoveableException
- /// @throws css::uno::RuntimeException
- void removeProperty( const OUString& Name,
- const css::uno::Reference< css::ucb::XCommandEnvironment >& Environment );
-
-public:
- /// @throws css::ucb::ContentCreationException
- /// @throws css::uno::RuntimeException
- Content( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
- ContentProvider* pProvider,
- const css::uno::Reference< css::ucb::XContentIdentifier >& Identifier,
- rtl::Reference< DAVSessionFactory > const & rSessionFactory );
- /// @throws css::ucb::ContentCreationException
- /// @throws css::uno::RuntimeException
- Content( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
- ContentProvider* pProvider,
- const css::uno::Reference< css::ucb::XContentIdentifier >& Identifier,
- rtl::Reference< DAVSessionFactory > const & rSessionFactory,
- bool isCollection );
- virtual ~Content() override;
-
- // XInterface
- virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override;
- virtual void SAL_CALL acquire()
- noexcept override;
- virtual void SAL_CALL release()
- noexcept override;
-
- // XTypeProvider
- virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override;
- virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override;
-
- // XServiceInfo
- virtual OUString SAL_CALL
- getImplementationName() override;
-
- virtual css::uno::Sequence< OUString > SAL_CALL
- getSupportedServiceNames() override;
-
- // XContent
- virtual OUString SAL_CALL
- getContentType() override;
-
- // XCommandProcessor
- virtual css::uno::Any SAL_CALL
- execute( const css::ucb::Command& aCommand,
- sal_Int32 CommandId,
- const css::uno::Reference< css::ucb::XCommandEnvironment >& Environment ) override;
- virtual void SAL_CALL
- abort( sal_Int32 CommandId ) override;
-
- // XPropertyContainer
- virtual void SAL_CALL
- addProperty( const OUString& Name,
- sal_Int16 Attributes,
- const css::uno::Any& DefaultValue ) override;
-
- virtual void SAL_CALL
- removeProperty( const OUString& Name ) override;
-
-
- // Additional interfaces
-
-
- // XContentCreator
- virtual css::uno::Sequence< css::ucb::ContentInfo > SAL_CALL
- queryCreatableContentsInfo() override;
- virtual css::uno::Reference< css::ucb::XContent > SAL_CALL
- createNewContent( const css::ucb::ContentInfo& Info ) override;
-
-
- // Non-interface methods.
-
-
- DAVResourceAccess & getResourceAccess() { return *m_xResAccess; }
-
- // Called from resultset data supplier.
- static css::uno::Reference< css::sdbc::XRow >
- getPropertyValues( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
- const css::uno::Sequence< css::beans::Property >& rProperties,
- const ContentProperties& rData,
- const rtl::Reference< ::ucbhelper::ContentProviderImplHelper >& rProvider,
- const OUString& rContentId );
-
- // Use OPTIONS method to retrieve the type of the Web resource
- /// @throws css::uno::Exception
- void getResourceOptions( const css::uno::Reference< css::ucb::XCommandEnvironment >& xEnv,
- DAVOptions& rDAVOptions,
- const std::unique_ptr< DAVResourceAccess > & rResAccess,
- bool * networkAccessAllowed = nullptr);
-
- static bool isResourceAvailable( const css::uno::Reference< css::ucb::XCommandEnvironment >& xEnv,
- const std::unique_ptr< DAVResourceAccess > & rResAccess,
- DAVOptions& rDAVOptions );
-
- static void removeCachedPropertyNames( const OUString & rURL );
-
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/webdavcontentcaps.cxx b/ucb/source/ucp/webdav-neon/webdavcontentcaps.cxx
deleted file mode 100644
index f3e3abe8783d..000000000000
--- a/ucb/source/ucp/webdav-neon/webdavcontentcaps.cxx
+++ /dev/null
@@ -1,646 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-/**************************************************************************
- TODO
- **************************************************************************
-
- *************************************************************************/
-
-#include <memory>
-#include <set>
-#include <com/sun/star/beans/Property.hpp>
-#include <com/sun/star/beans/PropertyAttribute.hpp>
-#include <com/sun/star/beans/PropertyValue.hpp>
-#include <com/sun/star/ucb/CommandInfo.hpp>
-#include <com/sun/star/ucb/ContentInfo.hpp>
-#include <com/sun/star/ucb/OpenCommandArgument2.hpp>
-#include <com/sun/star/ucb/InsertCommandArgument.hpp>
-#include <com/sun/star/ucb/PostCommandArgument2.hpp>
-#include <com/sun/star/ucb/PropertyCommandArgument.hpp>
-#include <com/sun/star/ucb/TransferInfo.hpp>
-#include <com/sun/star/uno/Sequence.hxx>
-#include <com/sun/star/util/DateTime.hpp>
-#include <com/sun/star/ucb/Link.hpp>
-#include <com/sun/star/ucb/Lock.hpp>
-#include <com/sun/star/ucb/LockEntry.hpp>
-#include "webdavcontent.hxx"
-#include "webdavprovider.hxx"
-#include "ContentProperties.hxx"
-#include "PropfindCache.hxx"
-
-using namespace com::sun::star;
-using namespace webdav_ucp;
-
-
-// ContentProvider implementation.
-
-
-void ContentProvider::getProperty(
- const OUString & rPropName, beans::Property & rProp )
-{
- if ( !m_pProps )
- {
- osl::MutexGuard aGuard( m_aMutex );
- if ( !m_pProps )
- {
- m_pProps.reset( new PropertyMap );
-
-
- // Fill map of known properties...
-
-
- // Mandatory UCB properties.
- m_pProps->insert(
- beans::Property(
- "ContentType",
- -1,
- cppu::UnoType<OUString>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- "IsDocument",
- -1,
- cppu::UnoType<bool>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- "IsFolder",
- -1,
- cppu::UnoType<bool>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- "Title",
- -1,
- cppu::UnoType<OUString>::get(),
- beans::PropertyAttribute::BOUND ) );
-
- // Optional UCB properties.
-
- m_pProps->insert(
- beans::Property(
- "DateCreated",
- -1,
- cppu::UnoType<util::DateTime>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- "DateModified",
- -1,
- cppu::UnoType<util::DateTime>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- "MediaType",
- -1,
- cppu::UnoType<OUString>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- "Size",
- -1,
- cppu::UnoType<sal_Int64>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- "BaseURI",
- -1,
- cppu::UnoType<OUString>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- "CreatableContentsInfo",
- -1,
- cppu::UnoType<
- uno::Sequence< ucb::ContentInfo >>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- // Standard DAV properties.
-
- m_pProps->insert(
- beans::Property(
- DAVProperties::CREATIONDATE,
- -1,
- cppu::UnoType<OUString>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- DAVProperties::DISPLAYNAME,
- -1,
- cppu::UnoType<OUString>::get(),
- beans::PropertyAttribute::BOUND ) );
-
- m_pProps->insert(
- beans::Property(
- DAVProperties::GETCONTENTLANGUAGE,
- -1,
- cppu::UnoType<OUString>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- DAVProperties::GETCONTENTLENGTH,
- -1,
- cppu::UnoType<OUString>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- DAVProperties::GETCONTENTTYPE ,
- -1,
- cppu::UnoType<OUString>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- DAVProperties::GETETAG,
- -1,
- cppu::UnoType<OUString>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- DAVProperties::GETLASTMODIFIED,
- -1,
- cppu::UnoType<OUString>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- DAVProperties::LOCKDISCOVERY,
- -1,
- cppu::UnoType<
- uno::Sequence< ucb::Lock >>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- DAVProperties::RESOURCETYPE,
- -1,
- cppu::UnoType<OUString>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- DAVProperties::SOURCE,
- -1,
- cppu::UnoType<uno::Sequence< ucb::Link >>::get(),
- beans::PropertyAttribute::BOUND ) );
-
- m_pProps->insert(
- beans::Property(
- DAVProperties::SUPPORTEDLOCK,
- -1,
- cppu::UnoType<uno::Sequence< ucb::LockEntry >>::get(),
- beans::PropertyAttribute::BOUND
- | beans::PropertyAttribute::READONLY ) );
-
- m_pProps->insert(
- beans::Property(
- DAVProperties::EXECUTABLE,
- -1,
- cppu::UnoType<OUString>::get(),
- beans::PropertyAttribute::BOUND ) );
- }
- }
-
-
- // Lookup property.
-
-
- beans::Property aProp;
- aProp.Name = rPropName;
- const PropertyMap::const_iterator it = m_pProps->find( aProp );
- if ( it != m_pProps->end() )
- {
- rProp = *it;
- }
- else
- {
- // All unknown props are treated as:
- rProp = beans::Property(
- rPropName,
- - 1,
- cppu::UnoType<OUString>::get(),
- beans::PropertyAttribute::BOUND );
- }
-}
-
-
-static PropertyNamesCache aStaticPropertyNamesCache;
-
-// static
-void Content::removeCachedPropertyNames( const OUString & rURL )
-{
- aStaticPropertyNamesCache.removeCachedPropertyNames( rURL );
-}
-
-// Content implementation.
-
-
-// virtual
-uno::Sequence< beans::Property > Content::getProperties(
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- bool bTransient;
- std::unique_ptr< DAVResourceAccess > xResAccess;
- std::unique_ptr< ContentProperties > xCachedProps;
- rtl::Reference< ContentProvider > xProvider;
-
- {
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
-
- bTransient = m_bTransient;
- xResAccess.reset(new DAVResourceAccess(*m_xResAccess));
- if (m_xCachedProps)
- xCachedProps.reset(new ContentProperties(*m_xCachedProps));
- xProvider.set( m_pProvider );
- }
-
- std::set< OUString > aPropSet;
-
- // No server access for just created (not yet committed) objects.
- // Only a minimal set of properties supported at this stage.
- if ( !bTransient )
- {
- // Obtain all properties supported for this resource from server.
- DAVOptions aDAVOptions;
- getResourceOptions( xEnv, aDAVOptions, xResAccess );
- // only Class 1 is needed for PROPFIND
- if ( aDAVOptions.isClass1() )
- {
- try
- {
- std::vector< DAVResourceInfo > props;
- OUString aTheURL( xResAccess->getURL() );
- PropertyNames aPropsNames( aTheURL );
-
- if( !aStaticPropertyNamesCache.getCachedPropertyNames( aTheURL, aPropsNames ) )
- {
-
- xResAccess->PROPFIND( DAVZERO, props, xEnv );
- aPropsNames.setPropertiesNames( std::vector(props) );
-
- aStaticPropertyNamesCache.addCachePropertyNames( aPropsNames );
- }
- else
- {
- props = aPropsNames.getPropertiesNames();
- }
-
- // Note: vector should contain exactly one resource info, because
- // we used a depth of DAVZERO for PROPFIND.
- if (props.size() == 1)
- {
- aPropSet.insert( (*props.begin()).properties.begin(),
- (*props.begin()).properties.end() );
- }
- }
- catch ( DAVException const & )
- {
- }
- }
- }
-
- // Add DAV properties, map DAV properties to UCB properties.
- bool bHasCreationDate = false; // creationdate <-> DateCreated
- bool bHasGetLastModified = false; // getlastmodified <-> DateModified
- bool bHasGetContentType = false; // getcontenttype <-> MediaType
- bool bHasGetContentLength = false; // getcontentlength <-> Size
-
- bool bHasContentType = false;
- bool bHasIsDocument = false;
- bool bHasIsFolder = false;
- bool bHasTitle = false;
- bool bHasBaseURI = false;
- bool bHasDateCreated = false;
- bool bHasDateModified = false;
- bool bHasMediaType = false;
- bool bHasSize = false;
- bool bHasCreatableInfos = false;
-
- {
- for ( const auto& rProp : aPropSet )
- {
- if ( !bHasCreationDate &&
- ( rProp == DAVProperties::CREATIONDATE ) )
- {
- bHasCreationDate = true;
- }
- else if ( !bHasGetLastModified &&
- ( rProp == DAVProperties::GETLASTMODIFIED ) )
- {
- bHasGetLastModified = true;
- }
- else if ( !bHasGetContentType &&
- ( rProp == DAVProperties::GETCONTENTTYPE ) )
- {
- bHasGetContentType = true;
- }
- else if ( !bHasGetContentLength &&
- ( rProp == DAVProperties::GETCONTENTLENGTH ) )
- {
- bHasGetContentLength = true;
- }
- else if ( !bHasContentType && rProp == "ContentType" )
- {
- bHasContentType = true;
- }
- else if ( !bHasIsDocument && rProp == "IsDocument" )
- {
- bHasIsDocument = true;
- }
- else if ( !bHasIsFolder && rProp == "IsFolder" )
- {
- bHasIsFolder = true;
- }
- else if ( !bHasTitle && rProp == "Title" )
- {
- bHasTitle = true;
- }
- else if ( !bHasBaseURI && rProp == "BaseURI" )
- {
- bHasBaseURI = true;
- }
- else if ( !bHasDateCreated && rProp == "DateCreated" )
- {
- bHasDateCreated = true;
- }
- else if ( !bHasDateModified && rProp == "DateModified" )
- {
- bHasDateModified = true;
- }
- else if ( !bHasMediaType && rProp == "MediaType" )
- {
- bHasMediaType = true;
- }
- else if ( !bHasSize && rProp == "Size" )
- {
- bHasSize = true;
- }
- else if ( !bHasCreatableInfos && rProp == "CreatableContentsInfo" )
- {
- bHasCreatableInfos = true;
- }
- }
- }
-
- // Add mandatory properties.
- if ( !bHasContentType )
- aPropSet.insert(
- OUString( "ContentType" ) );
-
- if ( !bHasIsDocument )
- aPropSet.insert(
- OUString( "IsDocument" ) );
-
- if ( !bHasIsFolder )
- aPropSet.insert(
- OUString( "IsFolder" ) );
-
- if ( !bHasTitle )
- {
- // Always present since it can be calculated from content's URI.
- aPropSet.insert(
- OUString( "Title" ) );
- }
-
- // Add optional properties.
-
- if ( !bHasBaseURI )
- {
- // Always present since it can be calculated from content's URI.
- aPropSet.insert(
- OUString( "BaseURI" ) );
- }
-
- if ( !bHasDateCreated && bHasCreationDate )
- aPropSet.insert(
- OUString( "DateCreated" ) );
-
- if ( !bHasDateModified && bHasGetLastModified )
- aPropSet.insert(
- OUString( "DateModified" ) );
-
- if ( !bHasMediaType && bHasGetContentType )
- aPropSet.insert(
- OUString( "MediaType" ) );
-
- if ( !bHasSize && bHasGetContentLength )
- aPropSet.insert(
- OUString( "Size" ) );
-
- if ( !bHasCreatableInfos )
- aPropSet.insert(
- OUString(
- "CreatableContentsInfo" ) );
-
- // Add cached properties, if present and still missing.
- if (xCachedProps)
- {
- const std::unique_ptr< PropertyValueMap > & xProps
- = xCachedProps->getProperties();
-
- for ( const auto& rEntry : *xProps )
- aPropSet.insert( rEntry.first );
- }
-
- // std::set -> uno::Sequence
- sal_Int32 nCount = aPropSet.size();
- uno::Sequence< beans::Property > aProperties( nCount );
- auto aPropertiesRange = asNonConstRange(aProperties);
-
- sal_Int32 n = 0;
- beans::Property aProp;
-
- for ( const auto& rProp : aPropSet )
- {
- xProvider->getProperty( rProp, aProp );
- aPropertiesRange[ n++ ] = aProp;
- }
-
- return aProperties;
-}
-
-
-// virtual
-uno::Sequence< ucb::CommandInfo > Content::getCommands(
- const uno::Reference< ucb::XCommandEnvironment > & xEnv )
-{
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
-
- uno::Sequence< ucb::CommandInfo > aCmdInfo{
-
-
- // Mandatory commands
-
-
- ucb::CommandInfo(
- "getCommandInfo",
- -1,
- cppu::UnoType<void>::get() ),
- ucb::CommandInfo(
- "getPropertySetInfo",
- -1,
- cppu::UnoType<void>::get() ),
- ucb::CommandInfo(
- "getPropertyValues",
- -1,
- cppu::UnoType<uno::Sequence< beans::Property >>::get() ),
- ucb::CommandInfo(
- "setPropertyValues",
- -1,
- cppu::UnoType<uno::Sequence< beans::PropertyValue >>::get() ),
-
-
- // Optional standard commands
-
-
- ucb::CommandInfo(
- "delete",
- -1,
- cppu::UnoType<bool>::get() ),
- ucb::CommandInfo(
- "insert",
- -1,
- cppu::UnoType<ucb::InsertCommandArgument>::get() ),
- ucb::CommandInfo(
- "open",
- -1,
- cppu::UnoType<ucb::OpenCommandArgument2>::get() ),
-
-
- // New commands
-
-
- ucb::CommandInfo(
- "post",
- -1,
- cppu::UnoType<ucb::PostCommandArgument2>::get() ),
- ucb::CommandInfo(
- "addProperty",
- -1,
- cppu::UnoType<ucb::PropertyCommandArgument>::get() ),
- ucb::CommandInfo(
- "removeProperty",
- -1,
- cppu::UnoType<OUString>::get() ),
- };
-
- bool bFolder = false;
-
- try
- {
- bFolder = isFolder( xEnv );
- }
- catch ( uno::Exception const & )
- {
- return aCmdInfo;
- }
-
- ResourceType eType = resourceTypeForLocks( xEnv );
- bool bSupportsLocking = ( eType == NOT_FOUND || eType == DAV );
-
- sal_Int32 nPos = aCmdInfo.getLength();
- sal_Int32 nMoreCmds = ( bFolder ? 2 : 0 ) + ( bSupportsLocking ? 2 : 0 );
- if ( nMoreCmds )
- aCmdInfo.realloc( nPos + nMoreCmds );
- else
- return aCmdInfo;
-
- auto pCmdInfo = aCmdInfo.getArray();
- if ( bFolder )
- {
-
- // Optional standard commands
-
-
- pCmdInfo[ nPos ] =
- ucb::CommandInfo(
- "transfer",
- -1,
- cppu::UnoType<ucb::TransferInfo>::get() );
- nPos++;
- pCmdInfo[ nPos ] =
- ucb::CommandInfo(
- "createNewContent",
- -1,
- cppu::UnoType<ucb::ContentInfo>::get() );
- nPos++;
- }
- else
- {
- // no document-only commands at the moment.
- }
-
- if ( bSupportsLocking )
- {
- pCmdInfo[ nPos ] =
- ucb::CommandInfo(
- "lock",
- -1,
- cppu::UnoType<void>::get() );
- nPos++;
- pCmdInfo[ nPos ] =
- ucb::CommandInfo(
- "unlock",
- -1,
- cppu::UnoType<void>::get() );
- nPos++;
- }
- return aCmdInfo;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/webdavdatasupplier.cxx b/ucb/source/ucp/webdav-neon/webdavdatasupplier.cxx
deleted file mode 100644
index 6acadda6a6fd..000000000000
--- a/ucb/source/ucp/webdav-neon/webdavdatasupplier.cxx
+++ /dev/null
@@ -1,487 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-
-/**************************************************************************
- TODO
- **************************************************************************
-
- *************************************************************************/
-
-#include <sal/log.hxx>
-#include <com/sun/star/ucb/IllegalIdentifierException.hpp>
-#include <com/sun/star/ucb/OpenMode.hpp>
-#include <com/sun/star/ucb/ResultSetException.hpp>
-#include <ucbhelper/contentidentifier.hxx>
-#include <ucbhelper/providerhelper.hxx>
-#include <tools/diagnose_ex.h>
-#include <memory>
-#include <vector>
-#include "webdavdatasupplier.hxx"
-#include "webdavcontent.hxx"
-#include "ContentProperties.hxx"
-#include "NeonUri.hxx"
-
-using namespace com::sun::star;
-using namespace webdav_ucp;
-
-namespace webdav_ucp
-{
-
-
-// struct ResultListEntry.
-
-namespace {
-
-struct ResultListEntry
-{
- OUString aId;
- uno::Reference< ucb::XContentIdentifier > xId;
- uno::Reference< ucb::XContent > xContent;
- uno::Reference< sdbc::XRow > xRow;
- std::shared_ptr<ContentProperties> const pData;
-
- explicit ResultListEntry(std::shared_ptr<ContentProperties> const& pEntry)
- : pData(pEntry)
- {}
-};
-
-}
-
-// ResultList.
-
-
-typedef std::vector<std::unique_ptr<ResultListEntry>> ResultList;
-
-
-// struct DataSupplier_Impl.
-
-
-struct DataSupplier_Impl
-{
- osl::Mutex m_aMutex;
- ResultList m_Results;
- rtl::Reference< Content > m_xContent;
- uno::Reference< uno::XComponentContext > m_xContext;
- sal_Int32 m_nOpenMode;
- bool m_bCountFinal;
- bool m_bThrowException;
-
- DataSupplier_Impl(
- const uno::Reference< uno::XComponentContext >& rxContext,
- const rtl::Reference< Content >& rContent,
- sal_Int32 nOpenMode )
- : m_xContent( rContent ), m_xContext( rxContext ), m_nOpenMode( nOpenMode ),
- m_bCountFinal( false ), m_bThrowException( false ) {}
-};
-
-}
-
-
-// DataSupplier Implementation.
-
-
-DataSupplier::DataSupplier(
- const uno::Reference< uno::XComponentContext >& rxContext,
- const rtl::Reference< Content >& rContent,
- sal_Int32 nOpenMode )
-: m_pImpl( new DataSupplier_Impl( rxContext, rContent, nOpenMode ) )
-{
-}
-
-
-// virtual
-DataSupplier::~DataSupplier()
-{
-}
-
-
-// virtual
-OUString DataSupplier::queryContentIdentifierString( sal_uInt32 nIndex )
-{
- osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex );
-
- if (nIndex < m_pImpl->m_Results.size())
- {
- OUString aId = m_pImpl->m_Results[ nIndex ]->aId;
- if ( !aId.isEmpty() )
- {
- // Already cached.
- return aId;
- }
- }
-
- if ( getResult( nIndex ) )
- {
- OUString aId = m_pImpl->m_xContent->getResourceAccess().getURL();
-
- const ContentProperties& props(*(m_pImpl->m_Results[ nIndex ]->pData));
-
- if ( ( aId.lastIndexOf( '/' ) + 1 ) != aId.getLength() )
- aId += "/";
-
- aId += props.getEscapedTitle();
-
- if ( props.isTrailingSlash() )
- aId += "/";
-
- m_pImpl->m_Results[ nIndex ]->aId = aId;
- return aId;
- }
- return OUString();
-}
-
-
-// virtual
-uno::Reference< ucb::XContentIdentifier >
-DataSupplier::queryContentIdentifier( sal_uInt32 nIndex )
-{
- osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex );
-
- if (nIndex < m_pImpl->m_Results.size())
- {
- uno::Reference< ucb::XContentIdentifier > xId
- = m_pImpl->m_Results[ nIndex ]->xId;
- if ( xId.is() )
- {
- // Already cached.
- return xId;
- }
- }
-
- OUString aId = queryContentIdentifierString( nIndex );
- if ( !aId.isEmpty() )
- {
- uno::Reference< ucb::XContentIdentifier > xId
- = new ::ucbhelper::ContentIdentifier( aId );
- m_pImpl->m_Results[ nIndex ]->xId = xId;
- return xId;
- }
- return uno::Reference< ucb::XContentIdentifier >();
-}
-
-
-// virtual
-uno::Reference< ucb::XContent >
-DataSupplier::queryContent( sal_uInt32 nIndex )
-{
- osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex );
-
- if (nIndex < m_pImpl->m_Results.size())
- {
- uno::Reference< ucb::XContent > xContent
- = m_pImpl->m_Results[ nIndex ]->xContent;
- if ( xContent.is() )
- {
- // Already cached.
- return xContent;
- }
- }
-
- uno::Reference< ucb::XContentIdentifier > xId
- = queryContentIdentifier( nIndex );
- if ( xId.is() )
- {
- try
- {
- uno::Reference< ucb::XContent > xContent
- = m_pImpl->m_xContent->getProvider()->queryContent( xId );
- m_pImpl->m_Results[ nIndex ]->xContent = xContent;
- return xContent;
-
- }
- catch ( ucb::IllegalIdentifierException& )
- {
- }
- }
- return uno::Reference< ucb::XContent >();
-}
-
-
-// virtual
-bool DataSupplier::getResult( sal_uInt32 nIndex )
-{
- osl::ClearableGuard< osl::Mutex > aGuard( m_pImpl->m_aMutex );
-
- if (nIndex < m_pImpl->m_Results.size())
- {
- // Result already present.
- return true;
- }
-
- // Obtain values...
- if ( getData() )
- {
- if (nIndex < m_pImpl->m_Results.size())
- {
- // Result already present.
- return true;
- }
- }
-
- return false;
-}
-
-
-// virtual
-sal_uInt32 DataSupplier::totalCount()
-{
- // Obtain values...
- getData();
-
- return m_pImpl->m_Results.size();
-}
-
-
-// virtual
-sal_uInt32 DataSupplier::currentCount()
-{
- return m_pImpl->m_Results.size();
-}
-
-
-// virtual
-bool DataSupplier::isCountFinal()
-{
- return m_pImpl->m_bCountFinal;
-}
-
-
-// virtual
-uno::Reference< sdbc::XRow > DataSupplier::queryPropertyValues(
- sal_uInt32 nIndex )
-{
- osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex );
-
- if (nIndex < m_pImpl->m_Results.size())
- {
- uno::Reference< sdbc::XRow > xRow = m_pImpl->m_Results[ nIndex ]->xRow;
- if ( xRow.is() )
- {
- // Already cached.
- return xRow;
- }
- }
-
- if ( getResult( nIndex ) )
- {
- uno::Reference< sdbc::XRow > xRow
- = Content::getPropertyValues(
- m_pImpl->m_xContext,
- getResultSet()->getProperties(),
- *(m_pImpl->m_Results[ nIndex ]->pData),
- m_pImpl->m_xContent->getProvider(),
- queryContentIdentifierString( nIndex ) );
- m_pImpl->m_Results[ nIndex ]->xRow = xRow;
- return xRow;
- }
-
- return uno::Reference< sdbc::XRow >();
-}
-
-
-// virtual
-void DataSupplier::releasePropertyValues( sal_uInt32 nIndex )
-{
- osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex );
-
- if (nIndex < m_pImpl->m_Results.size())
- m_pImpl->m_Results[ nIndex ]->xRow.clear();
-}
-
-
-// virtual
-void DataSupplier::close()
-{
-}
-
-
-// virtual
-void DataSupplier::validate()
-{
- if ( m_pImpl->m_bThrowException )
- throw ucb::ResultSetException();
-}
-
-
-bool DataSupplier::getData()
-{
- osl::ClearableGuard< osl::Mutex > aGuard( m_pImpl->m_aMutex );
-
- if ( !m_pImpl->m_bCountFinal )
- {
- std::vector< OUString > propertyNames;
- ContentProperties::UCBNamesToDAVNames(
- getResultSet()->getProperties(), propertyNames );
-
- // Append "resourcetype", if not already present. It's value is
- // needed to get a valid ContentProperties::pIsFolder value, which
- // is needed for OpenMode handling.
-
- bool isNoResourceType = std::none_of(propertyNames.begin(), propertyNames.end(),
- [](const OUString& rName) { return rName == DAVProperties::RESOURCETYPE; });
-
- if ( isNoResourceType )
- propertyNames.push_back( DAVProperties::RESOURCETYPE );
-
- std::vector< DAVResource > resources;
- try
- {
- // propfind depth 1, get property values for parent AND for each
- // child
- m_pImpl->m_xContent->getResourceAccess()
- .PROPFIND( DAVONE,
- propertyNames,
- resources,
- getResultSet()->getEnvironment() );
-#if defined SAL_LOG_INFO
- {
- //print the resource for every URI returned
- for ( const auto& rResource : resources )
- {
- NeonUri aCurrURI( rResource.uri );
- OUString aCurrPath = aCurrURI.GetPath();
- aCurrPath = NeonUri::unescape( aCurrPath );
- SAL_INFO( "ucb.ucp.webdav", "getData() - resource URL: <" << rResource.uri << ">, unescaped to: <" << aCurrPath << "> )" );
- for ( const auto& rProp : rResource.properties )
- {
- SAL_INFO( "ucb.ucp.webdav", "PROPFIND - property name: " << rProp.Name );
- }
- }
- }
-#endif
- }
- catch ( DAVException & )
- {
- TOOLS_WARN_EXCEPTION( "ucb.ucp.webdav", "Running PROPFIND: DAVException" );
- m_pImpl->m_bThrowException = true;
- }
-
- if ( !m_pImpl->m_bThrowException )
- {
- try
- {
- NeonUri aURI(
- m_pImpl->m_xContent->getResourceAccess().getURL() );
- OUString aPath = aURI.GetPath();
-
- if ( aPath.endsWith("/") )
- aPath = aPath.copy( 0, aPath.getLength() - 1 );
-
- aPath = NeonUri::unescape( aPath );
- bool bFoundParent = false;
-
- for (DAVResource & rRes : resources)
- {
- // Filter parent, which is contained somewhere(!) in
- // the vector.
- if ( !bFoundParent )
- {
- try
- {
- NeonUri aCurrURI( rRes.uri );
- OUString aCurrPath = aCurrURI.GetPath();
- if ( aCurrPath.endsWith("/") )
- aCurrPath
- = aCurrPath.copy(
- 0,
- aCurrPath.getLength() - 1 );
-
- aCurrPath = NeonUri::unescape( aCurrPath );
- if ( aPath == aCurrPath )
- {
- bFoundParent = true;
- continue;
- }
- }
- catch ( DAVException const & )
- {
- // do nothing, ignore error. continue.
- }
- }
-
- std::shared_ptr<ContentProperties> const
- pContentProperties = std::make_shared<ContentProperties>(rRes);
-
- // Check resource against open mode.
- switch ( m_pImpl->m_nOpenMode )
- {
- case ucb::OpenMode::FOLDERS:
- {
- bool bFolder = false;
-
- const uno::Any & rValue
- = pContentProperties->getValue(
- "IsFolder" );
- rValue >>= bFolder;
-
- if ( !bFolder )
- continue;
-
- break;
- }
-
- case ucb::OpenMode::DOCUMENTS:
- {
- bool bDocument = false;
-
- const uno::Any & rValue
- = pContentProperties->getValue(
- "IsDocument" );
- rValue >>= bDocument;
-
- if ( !bDocument )
- continue;
-
- break;
- }
-
- case ucb::OpenMode::ALL:
- default:
- break;
- }
-
- m_pImpl->m_Results.push_back(
- std::make_unique<ResultListEntry>(pContentProperties));
- }
- }
- catch ( DAVException const & )
- {
- }
- }
-
- m_pImpl->m_bCountFinal = true;
-
- // Callback possible, because listeners may be informed!
- aGuard.clear();
- getResultSet()->rowCountFinal();
- }
- return !m_pImpl->m_bThrowException;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/webdavdatasupplier.hxx b/ucb/source/ucp/webdav-neon/webdavdatasupplier.hxx
deleted file mode 100644
index 5c820364028c..000000000000
--- a/ucb/source/ucp/webdav-neon/webdavdatasupplier.hxx
+++ /dev/null
@@ -1,78 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <memory>
-#include <rtl/ref.hxx>
-#include <ucbhelper/resultset.hxx>
-
-namespace webdav_ucp {
-
-struct DataSupplier_Impl;
-class Content;
-
-class DataSupplier : public ucbhelper::ResultSetDataSupplier
-{
- std::unique_ptr<DataSupplier_Impl> m_pImpl;
-
-private:
- bool getData();
-
-public:
- DataSupplier( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
- const rtl::Reference< Content >& rContent,
- sal_Int32 nOpenMode);
-
- virtual ~DataSupplier() override;
-
- virtual OUString queryContentIdentifierString( sal_uInt32 nIndex ) override;
- virtual css::uno::Reference< css::ucb::XContentIdentifier >
- queryContentIdentifier( sal_uInt32 nIndex ) override;
- virtual css::uno::Reference< css::ucb::XContent >
- queryContent( sal_uInt32 nIndex ) override;
-
- virtual bool getResult( sal_uInt32 nIndex ) override;
-
- virtual sal_uInt32 totalCount() override;
- virtual sal_uInt32 currentCount() override;
- virtual bool isCountFinal() override;
-
- virtual css::uno::Reference< css::sdbc::XRow >
- queryPropertyValues( sal_uInt32 nIndex ) override;
- virtual void releasePropertyValues( sal_uInt32 nIndex ) override;
-
- virtual void close() override;
-
- virtual void validate() override;
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/webdavprovider.cxx b/ucb/source/ucp/webdav-neon/webdavprovider.cxx
deleted file mode 100644
index 87dc8b03188b..000000000000
--- a/ucb/source/ucp/webdav-neon/webdavprovider.cxx
+++ /dev/null
@@ -1,189 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include <sal/config.h>
-
-#include <com/sun/star/ucb/IllegalIdentifierException.hpp>
-#include <comphelper/processfactory.hxx>
-#include <ucbhelper/contentidentifier.hxx>
-#include <ucbhelper/macros.hxx>
-#include <cppuhelper/queryinterface.hxx>
-#include "webdavprovider.hxx"
-#include "webdavcontent.hxx"
-
-#include <osl/mutex.hxx>
-#include <tools/urlobj.hxx>
-
-using namespace com::sun::star;
-using namespace webdav_ucp;
-
-
-// ContentProvider Implementation.
-
-
-ContentProvider::ContentProvider(
- const uno::Reference< uno::XComponentContext >& rxContext )
-: ::ucbhelper::ContentProviderImplHelper( rxContext ),
- m_xDAVSessionFactory( new DAVSessionFactory )
-{
-}
-
-
-// virtual
-ContentProvider::~ContentProvider()
-{
-}
-
-
-// XInterface methods.
-
-void SAL_CALL ContentProvider::acquire()
- noexcept
-{
- OWeakObject::acquire();
-}
-
-void SAL_CALL ContentProvider::release()
- noexcept
-{
- OWeakObject::release();
-}
-
-css::uno::Any SAL_CALL ContentProvider::queryInterface( const css::uno::Type & rType )
-{
- css::uno::Any aRet = cppu::queryInterface( rType,
- static_cast< lang::XTypeProvider* >(this),
- static_cast< lang::XServiceInfo* >(this),
- static_cast< ucb::XContentProvider* >(this)
- );
- return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
-}
-
-// XTypeProvider methods.
-
-
-XTYPEPROVIDER_IMPL_3( ContentProvider,
- lang::XTypeProvider,
- lang::XServiceInfo,
- ucb::XContentProvider );
-
-
-// XServiceInfo methods.
-
-OUString
-ContentProvider::getImplementationName()
-{
- return "com.sun.star.comp.WebDAVContentProvider";
-}
-
-css::uno::Sequence< OUString >
-ContentProvider::getSupportedServiceNames()
-{
- return { WEBDAV_CONTENT_PROVIDER_SERVICE_NAME };
-}
-
-sal_Bool
-ContentProvider::supportsService(const OUString& s)
-{
- return cppu::supportsService(this, s);
-}
-
-// XContentProvider methods.
-
-
-// virtual
-uno::Reference< ucb::XContent > SAL_CALL
-ContentProvider::queryContent(
- const uno::Reference<
- ucb::XContentIdentifier >& Identifier )
-{
- // Check URL scheme...
- INetURLObject aURL( Identifier->getContentIdentifier() );
-
- if ( aURL.isSchemeEqualTo( INetProtocol::NotValid ) )
- throw ucb::IllegalIdentifierException();
-
- if ( !aURL.isAnyKnownWebDAVScheme() )
- throw ucb::IllegalIdentifierException();
-
- uno::Reference< ucb::XContentIdentifier > xCanonicId;
-
- if (aURL.isSchemeEqualTo( INetProtocol::VndSunStarWebdav ) ||
- aURL.isSchemeEqualTo(DAV_URL_SCHEME) ||
- aURL.isSchemeEqualTo( WEBDAV_URL_SCHEME ) )
- {
- aURL.changeScheme( INetProtocol::Http );
- xCanonicId = new ::ucbhelper::ContentIdentifier( aURL.getExternalURL() );
- }
- else if ( aURL.isSchemeEqualTo( VNDSUNSTARWEBDAVS_URL_SCHEME ) ||
- aURL.isSchemeEqualTo( DAVS_URL_SCHEME ) ||
- aURL.isSchemeEqualTo( WEBDAVS_URL_SCHEME ))
- {
- aURL.changeScheme( INetProtocol::Https );
- xCanonicId = new ::ucbhelper::ContentIdentifier( aURL.getExternalURL() );
- }
- else
- {
- xCanonicId = Identifier;
- }
-
- osl::MutexGuard aGuard( m_aMutex );
-
- // Check, if a content with given id already exists...
- uno::Reference< ucb::XContent > xContent
- = queryExistingContent( xCanonicId );
- if ( xContent.is() )
- return xContent;
-
- // Create a new content.
-
- try
- {
- xContent = new ::webdav_ucp::Content(
- m_xContext, this, xCanonicId, m_xDAVSessionFactory );
- registerNewContent( xContent );
- }
- catch ( ucb::ContentCreationException const & )
- {
- throw ucb::IllegalIdentifierException();
- }
-
- if ( !xContent->getIdentifier().is() )
- throw ucb::IllegalIdentifierException();
-
- return xContent;
-}
-
-extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
-ucb_webdav_neon_ContentProvider_get_implementation(
- css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any> const&)
-{
- return cppu::acquire(new ContentProvider(context));
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/webdavprovider.hxx b/ucb/source/ucp/webdav-neon/webdavprovider.hxx
deleted file mode 100644
index 7aca1b48a2b9..000000000000
--- a/ucb/source/ucp/webdav-neon/webdavprovider.hxx
+++ /dev/null
@@ -1,105 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <memory>
-#include <config_lgpl.h>
-#include <rtl/ref.hxx>
-#include <com/sun/star/beans/Property.hpp>
-#include <com/sun/star/lang/XSingleServiceFactory.hpp>
-#include "DAVSessionFactory.hxx"
-#include <ucbhelper/providerhelper.hxx>
-#include "PropertyMap.hxx"
-
-namespace webdav_ucp {
-
-
-// UNO service name for the provider. This name will be used by the UCB to
-// create instances of the provider.
-inline constexpr OUStringLiteral WEBDAV_CONTENT_PROVIDER_SERVICE_NAME =u"com.sun.star.ucb.WebDAVContentProvider";
-
-// URL scheme. This is the scheme the provider will be able to create
-// contents for. The UCB will select the provider ( i.e. in order to create
-// contents ) according to this scheme.
-#define VNDSUNSTARWEBDAV_URL_SCHEME "vnd.sun.star.webdav"
-#define VNDSUNSTARWEBDAVS_URL_SCHEME u"vnd.sun.star.webdavs"
-inline constexpr OUStringLiteral HTTP_URL_SCHEME = u"http";
-inline constexpr OUStringLiteral HTTPS_URL_SCHEME = u"https";
-#define DAV_URL_SCHEME u"dav"
-#define DAVS_URL_SCHEME u"davs"
-#define WEBDAV_URL_SCHEME u"webdav"
-#define WEBDAVS_URL_SCHEME u"webdavs"
-
-#define FTP_URL_SCHEME "ftp"
-
-#define HTTP_CONTENT_TYPE ("application/" + HTTP_URL_SCHEME + "-content")
-
-#define WEBDAV_CONTENT_TYPE HTTP_CONTENT_TYPE
-inline constexpr OUStringLiteral WEBDAV_COLLECTION_TYPE = u"application/" VNDSUNSTARWEBDAV_URL_SCHEME "-collection";
-
-
-class ContentProvider : public ::ucbhelper::ContentProviderImplHelper
-{
- rtl::Reference< DAVSessionFactory > m_xDAVSessionFactory;
- std::unique_ptr<PropertyMap> m_pProps;
-
-public:
- explicit ContentProvider( const css::uno::Reference< css::uno::XComponentContext >& rxContext );
- virtual ~ContentProvider() override;
-
- // XInterface
- virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override;
- virtual void SAL_CALL acquire()
- noexcept override;
- virtual void SAL_CALL release()
- noexcept override;
-
- // XTypeProvider
- virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override;
- virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override;
-
- // XServiceInfo
- virtual OUString SAL_CALL getImplementationName() override;
- virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
- virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
-
- // XContentProvider
- virtual css::uno::Reference< css::ucb::XContent > SAL_CALL
- queryContent( const css::uno::Reference< css::ucb::XContentIdentifier >& Identifier ) override;
-
-
- // Non-interface methods.
-
- void getProperty( const OUString & rPropName,
- css::beans::Property & rProp );
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/webdavresultset.cxx b/ucb/source/ucp/webdav-neon/webdavresultset.cxx
deleted file mode 100644
index be4fadc9bf39..000000000000
--- a/ucb/source/ucp/webdav-neon/webdavresultset.cxx
+++ /dev/null
@@ -1,86 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-
-/**************************************************************************
- TODO
- **************************************************************************
-
- - This implementation is not a dynamic result set!!! It only implements
- the necessary interfaces, but never recognizes/notifies changes!!!
-
- *************************************************************************/
-#include "webdavresultset.hxx"
-
-using namespace com::sun::star;
-using namespace webdav_ucp;
-
-
-// DynamicResultSet Implementation.
-
-
-DynamicResultSet::DynamicResultSet(
- const uno::Reference< uno::XComponentContext >& rxContext,
- const rtl::Reference< Content >& rxContent,
- const ucb::OpenCommandArgument2& rCommand,
- const uno::Reference< ucb::XCommandEnvironment >& rxEnv )
-: ResultSetImplHelper( rxContext, rCommand ),
- m_xContent( rxContent ),
- m_xEnv( rxEnv )
-{
-}
-
-
-// Non-interface methods.
-
-
-void DynamicResultSet::initStatic()
-{
- m_xResultSet1
- = new ::ucbhelper::ResultSet( m_xContext,
- m_aCommand.Properties,
- new DataSupplier( m_xContext,
- m_xContent,
- m_aCommand.Mode ),
- m_xEnv );
-}
-
-
-void DynamicResultSet::initDynamic()
-{
- m_xResultSet1
- = new ::ucbhelper::ResultSet( m_xContext,
- m_aCommand.Properties,
- new DataSupplier( m_xContext,
- m_xContent,
- m_aCommand.Mode ),
- m_xEnv );
- m_xResultSet2 = m_xResultSet1;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/ucb/source/ucp/webdav-neon/webdavresultset.hxx b/ucb/source/ucp/webdav-neon/webdavresultset.hxx
deleted file mode 100644
index c2f8e727ec04..000000000000
--- a/ucb/source/ucp/webdav-neon/webdavresultset.hxx
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#pragma once
-
-#include <config_lgpl.h>
-#include <rtl/ref.hxx>
-#include <ucbhelper/resultsethelper.hxx>
-#include "webdavcontent.hxx"
-#include "webdavdatasupplier.hxx"
-
-namespace webdav_ucp {
-
-class DynamicResultSet : public ::ucbhelper::ResultSetImplHelper
-{
- rtl::Reference< Content > m_xContent;
- css::uno::Reference< css::ucb::XCommandEnvironment > m_xEnv;
-
-private:
- virtual void initStatic() override;
- virtual void initDynamic() override;
-
-public:
- DynamicResultSet( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
- const rtl::Reference< Content >& rxContent,
- const css::ucb::OpenCommandArgument2& rCommand,
- const css::uno::Reference< css::ucb::XCommandEnvironment >& rxEnv );
-};
-
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */