From dd42f133f604ee2f7e0ffbca6a8d94fb8f95dfe5 Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Mon, 10 Jan 2022 19:37:05 +0200 Subject: [PATCH] tdf#146375 Cannot rename user-defined categories in template manager Regression from commit 3624a703361b108d22448bd60a97733f05e37820 tdf#135316 remove OTempFileService pessimisation So fix two things here (1) make it so the tempfile service flushes the SvStream buffer and resets the file position, so we can read the data after writing it. (2) Simplify the UCB usage to just write the contents of the tempfile via the tempfile InputStream, which is simpler and safer Change-Id: I15ed3b02c2d6415d10a9579f66374e6268188d5c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128195 Tested-by: Noel Grandin Reviewed-by: Noel Grandin --- sfx2/source/doc/doctemplates.cxx | 21 ++++++++------------- unotools/source/ucbhelper/xtempfile.cxx | 6 ++++++ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/sfx2/source/doc/doctemplates.cxx b/sfx2/source/doc/doctemplates.cxx index 9ac236b3b4f4..cbdbe676f6f1 100644 --- a/sfx2/source/doc/doctemplates.cxx +++ b/sfx2/source/doc/doctemplates.cxx @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -231,7 +232,7 @@ class SfxDocTplService_Impl const OUString& aNewGroupName ); void RemoveUINamesForTemplateDir_Impl( const OUString& aUserPath, std::u16string_view aGroupName ); - bool WriteUINamesForTemplateDir_Impl( const OUString& aUserPath, + bool WriteUINamesForTemplateDir_Impl( std::u16string_view aUserPath, const std::vector< beans::StringPair >& aUINames ); OUString CreateNewGroupFsys( const OUString& rGroupName, Content& aGroup ); @@ -1264,7 +1265,7 @@ void SfxDocTplService_Impl::RemoveUINamesForTemplateDir_Impl( const OUString& aU } -bool SfxDocTplService_Impl::WriteUINamesForTemplateDir_Impl( const OUString& aUserPath, +bool SfxDocTplService_Impl::WriteUINamesForTemplateDir_Impl( std::u16string_view aUserPath, const std::vector< beans::StringPair >& aUINames ) { bool bResult = false; @@ -1273,10 +1274,7 @@ bool SfxDocTplService_Impl::WriteUINamesForTemplateDir_Impl( const OUString& aUs io::TempFile::create(mxContext), uno::UNO_SET_THROW ); - OUString aTempURL = xTempFile->getUri(); - - uno::Reference< io::XStream > xStream( xTempFile ); - uno::Reference< io::XOutputStream > xOutStream = xStream->getOutputStream(); + uno::Reference< io::XOutputStream > xOutStream = xTempFile->getOutputStream(); if ( !xOutStream.is() ) throw uno::RuntimeException(); @@ -1287,17 +1285,14 @@ bool SfxDocTplService_Impl::WriteUINamesForTemplateDir_Impl( const OUString& aUs } catch( uno::Exception& ) {} - Content aTargetContent( aUserPath, maCmdEnv, comphelper::getProcessComponentContext() ); - Content aSourceContent( aTempURL, maCmdEnv, comphelper::getProcessComponentContext() ); - aTargetContent.transferContent( aSourceContent, - InsertOperation::Copy, - "groupuinames.xml", - ucb::NameClash::OVERWRITE, - "text/xml" ); + uno::Reference < ucb::XSimpleFileAccess3 > xAccess(ucb::SimpleFileAccess::create(mxContext)); + xAccess->writeFile(OUString::Concat(aUserPath) + "groupuinames.xml", xTempFile->getInputStream()); + bResult = true; } catch ( uno::Exception& ) { + TOOLS_WARN_EXCEPTION("sfx.doc", ""); } return bResult; diff --git a/unotools/source/ucbhelper/xtempfile.cxx b/unotools/source/ucbhelper/xtempfile.cxx index a8ace5da6725..a5772d8ba0c7 100644 --- a/unotools/source/ucbhelper/xtempfile.cxx +++ b/unotools/source/ucbhelper/xtempfile.cxx @@ -218,6 +218,12 @@ void SAL_CALL OTempFileService::closeOutput( ) throw css::io::NotConnectedException ( OUString(), static_cast < css::uno::XWeak * > (this ) ); mbOutClosed = true; + if (mpStream) + { + // so that if you then open the InputStream, you can read the content + mpStream->FlushBuffer(); + mpStream->Seek(0); + } if ( mbInClosed ) {