From 319b160320a045b1a5b302dafbc2220ee1d4d3c3 Mon Sep 17 00:00:00 2001 From: Cao Cuong Ngo Date: Sat, 21 Sep 2013 23:36:06 +0200 Subject: [PATCH] CMIS file picker: it really does not like ID Mark The file picker can't go back folder if we use ID mark in the URL. Conflicts: ucb/source/ucp/cmis/cmis_content.cxx Change-Id: I6985feec71dc23848ee022e0bab9e8515a21ffd2 --- comphelper/source/misc/mediadescriptor.cxx | 35 ++++++++++++++++++++++ include/comphelper/mediadescriptor.hxx | 12 ++++++++ sfx2/source/doc/objserv.cxx | 1 - 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/comphelper/source/misc/mediadescriptor.cxx b/comphelper/source/misc/mediadescriptor.cxx index 21361f565dae..b5cd5b669a33 100644 --- a/comphelper/source/misc/mediadescriptor.cxx +++ b/comphelper/source/misc/mediadescriptor.cxx @@ -484,6 +484,7 @@ sal_Bool MediaDescriptor::impl_addInputStream( sal_Bool bLockFile ) css::uno::Reference< css::uno::XInterface >()); // Parse URL! Only the main part has to be used further. E.g. a jumpmark can make trouble + OUString sNormalizedURL = impl_normalizeURL( sURL ); return impl_openStreamWithURL( removeFragment(sURL), bLockFile ); } catch(const css::uno::Exception& ex) @@ -723,6 +724,40 @@ sal_Bool MediaDescriptor::impl_openStreamWithURL( const OUString& sURL, sal_Bool return xInputStream.is(); } +OUString MediaDescriptor::impl_normalizeURL(const OUString& sURL) +{ + /* Remove Jumpmarks (fragments) of an URL only here. + They are not part of any URL and as a result may be + no ucb content can be created then. + On the other side arguments must exists ... because + they are part of an URL. + + Do not use the URLTransformer service here. Because + it parses the URL in another way. It's main part isnt enough + and it's complete part contains the jumpmark (fragment) parameter ... + */ + + try + { + css::uno::Reference< css::uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext(); + css::uno::Reference< css::uri::XUriReferenceFactory > xUriFactory = css::uri::UriReferenceFactory::create(xContext);; + css::uno::Reference< css::uri::XUriReference > xUriRef = xUriFactory->parse(sURL); + if (xUriRef.is()) + { + xUriRef->clearFragment(); + return xUriRef->getUriReference(); + } + } + catch(const css::uno::RuntimeException&) + { throw; } + catch(const css::uno::Exception&) + {} + + // If an error ocurred ... return the original URL. + // It's a try .-) + return sURL; +} + } // namespace comphelper /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/comphelper/mediadescriptor.hxx b/include/comphelper/mediadescriptor.hxx index 5f353e552753..5409f14f9fab 100644 --- a/include/comphelper/mediadescriptor.hxx +++ b/include/comphelper/mediadescriptor.hxx @@ -289,6 +289,18 @@ class COMPHELPER_DLLPUBLIC MediaDescriptor : public SequenceAsHashMap be created as new item. FALSE otherwise. */ COMPHELPER_DLLPRIVATE sal_Bool impl_addInputStream( sal_Bool bLockFile ); + + /** @short some URL parts can make trouble for opening streams (e.g. jumpmarks.) + An URL should be "normalized" before its used. + + @param sURL + the original URL (e.g. including a jumpmark) + + @return [string] + the "normalized" URL (e.g. without jumpmark) + */ + COMPHELPER_DLLPRIVATE OUString impl_normalizeURL(const OUString& sURL); + }; } // namespace comphelper diff --git a/sfx2/source/doc/objserv.cxx b/sfx2/source/doc/objserv.cxx index 2fe263e2357f..dbac96116b63 100644 --- a/sfx2/source/doc/objserv.cxx +++ b/sfx2/source/doc/objserv.cxx @@ -994,7 +994,6 @@ void SfxObjectShell::GetState_Impl(SfxItemSet &rSet) uno::Sequence< sal_Bool > bTmp; aCmisProperties[i].Value >>= bTmp; bCheckedOut = bTmp[0]; - } } bShow = bCheckedOut;