On Mon, 2012-03-12 at 09:43 +0100, Stephan Bergmann wrote:
As discussed on IRC, the patch breaks smoketest/adding extensions (and
my attempt at a quick fix was futile).
Ah yes - it turns out that:
- ::ucbhelper::Content ucbStamp( stampURL, xCmdEnv );
- ::rtl::OString stamp(
- RTL_CONSTASCII_STRINGPARAM(CURRENT_STAMP) );
- Reference<io::XInputStream> xData(
- ::xmlscript::createInputStream(
- ::rtl::ByteSequence(
- reinterpret_cast<sal_Int8 const *>(stamp.getStr()),
- stamp.getLength() ) ) );
Creates a parent directory if it is not present, something not entirely
obvious when reading it ;-) Fixed on master.
I attach a unified patch:
fdo#40607 - osl_syncFile having written, and avoid doing that on start
Thanks,
Michael.
--
michael.meeks@suse.com <><, Pseudo Engineer, itinerant idiot
diff --git a/desktop/source/deployment/manager/dp_manager.cxx
b/desktop/source/deployment/manager/dp_manager.cxx
index 4f6f6c04..80a9522 100644
--- a/desktop/source/deployment/manager/dp_manager.cxx
+++ b/desktop/source/deployment/manager/dp_manager.cxx
@@ -32,6 +32,7 @@
#include "dp_platform.hxx"
#include "dp_manager.h"
#include "dp_identifier.hxx"
+#include "rtl/oustringostreaminserter.hxx"
#include "rtl/ustrbuf.hxx"
#include "rtl/string.hxx"
#include "rtl/uri.hxx"
@@ -311,6 +312,41 @@ void PackageManagerImpl::initRegistryBackends()
m_xComponentContext ) );
}
+// this overcomes previous rumours that the sal API is misleading
+// as to whether a directory is truly read-only or not
+static bool isMacroURLReadOnly( const OUString &rMacro )
+{
+ rtl::OUString aDirURL( rMacro );
+ ::rtl::Bootstrap::expandMacros( aDirURL );
+
+ ::osl::FileBase::RC aErr = ::osl::Directory::create( aDirURL );
+ if ( aErr == ::osl::FileBase::E_None )
+ return false; // it will be writeable
+ if ( aErr != ::osl::FileBase::E_EXIST )
+ return true; // some serious problem creating it
+
+ bool bError;
+ sal_uInt64 nWritten = 0;
+ rtl::OUString aFileURL( aDirURL + "/stamp.sys" );
+ ::osl::File aFile( aFileURL );
+
+ bError = aFile.open( osl_File_OpenFlag_Read |
+ osl_File_OpenFlag_Write |
+ osl_File_OpenFlag_Create ) != ::osl::FileBase::E_None;
+ if (!bError)
+ bError = aFile.write( "1", 1, nWritten ) != ::osl::FileBase::E_None;
+ if (aFile.close() != ::osl::FileBase::E_None)
+ bError = true;
+ if (osl::File::remove( aFileURL ) != ::osl::FileBase::E_None)
+ bError = true;
+
+ SAL_INFO(
+ "desktop.deployment",
+ "local url '" << rMacro << "' -> '" << aFileURL << "' "
+ << (bError ? "is" : "is not") << " readonly\n");
+ return bError;
+}
+
//______________________________________________________________________________
Reference<deployment::XPackageManager> PackageManagerImpl::create(
Reference<XComponentContext> const & xComponentContext,
@@ -320,7 +356,7 @@ Reference<deployment::XPackageManager> PackageManagerImpl::create(
xComponentContext, context );
Reference<deployment::XPackageManager> xPackageManager( that );
- OUString packages, logFile, stampURL;
+ OUString packages, logFile, stamp;
if (context.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("user") )) {
that->m_activePackages = OUSTR(
"vnd.sun.star.expand:$UNO_USER_PACKAGES_CACHE/uno_packages");
@@ -341,8 +377,7 @@ Reference<deployment::XPackageManager> PackageManagerImpl::create(
//using virtualization it appears that he/she can. Then a shared extension can
//be installed but is only visible for the user (because the extension is in
//the virtual store).
- stampURL = OUSTR(
- "vnd.sun.star.expand:$UNO_USER_PACKAGES_CACHE/stamp.sys");
+ stamp = OUSTR("$UNO_USER_PACKAGES_CACHE");
}
else if (context.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("shared") )) {
that->m_activePackages = OUSTR(
@@ -353,8 +388,7 @@ Reference<deployment::XPackageManager> PackageManagerImpl::create(
"vnd.sun.star.expand:$SHARED_EXTENSIONS_USER/registry");
logFile = OUSTR(
"vnd.sun.star.expand:$SHARED_EXTENSIONS_USER/log.txt");
- stampURL = OUSTR(
- "vnd.sun.star.expand:$UNO_SHARED_PACKAGES_CACHE/stamp.sys");
+ stamp = OUSTR("$UNO_SHARED_PACKAGES_CACHE");
}
else if (context.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("bundled") )) {
that->m_activePackages = OUSTR(
@@ -393,8 +427,7 @@ Reference<deployment::XPackageManager> PackageManagerImpl::create(
"vnd.sun.star.expand:$TMP_EXTENSIONS");
that->m_registryCache = OUSTR(
"vnd.sun.star.expand:$TMP_EXTENSIONS/registry");
- stampURL = OUSTR(
- "vnd.sun.star.expand:$TMP_EXTENSIONS/stamp.sys");
+ stamp = OUSTR("$TMP_EXTENSIONS");
}
else if (! context.matchAsciiL(
RTL_CONSTASCII_STRINGPARAM("vnd.sun.star.tdoc:/") )) {
@@ -406,39 +439,9 @@ Reference<deployment::XPackageManager> PackageManagerImpl::create(
Reference<XCommandEnvironment> xCmdEnv;
try {
- //There is no stampURL for the bundled folder
- if (!stampURL.isEmpty())
- {
-#define CURRENT_STAMP "1"
- try {
- //The osl file API does not allow to find out if one can write
- //into a folder. Therefore we try to write a file. Then we delete
- //it, so that it does not hinder uninstallation of OOo
- // probe writing:
- ::ucbhelper::Content ucbStamp( stampURL, xCmdEnv );
- ::rtl::OString stamp(
- RTL_CONSTASCII_STRINGPARAM(CURRENT_STAMP) );
- Reference<io::XInputStream> xData(
- ::xmlscript::createInputStream(
- ::rtl::ByteSequence(
- reinterpret_cast<sal_Int8 const *>(stamp.getStr()),
- stamp.getLength() ) ) );
- ucbStamp.writeStream( xData, true /* replace existing */ );
- that->m_readOnly = false;
- erase_path( stampURL, xCmdEnv );
- }
- catch (const RuntimeException &) {
- try {
- erase_path( stampURL, xCmdEnv );
- } catch (...)
- {
- }
- throw;
- }
- catch (const Exception &) {
- that->m_readOnly = true;
- }
- }
+ // There is no stamp for the bundled folder:
+ if (!stamp.isEmpty())
+ that->m_readOnly = isMacroURLReadOnly( stamp );
if (!that->m_readOnly && !logFile.isEmpty())
{
diff --git a/ucb/source/ucp/file/shell.cxx b/ucb/source/ucp/file/shell.cxx
index 725820d..86236f0 100644
--- a/ucb/source/ucp/file/shell.cxx
+++ b/ucb/source/ucp/file/shell.cxx
@@ -1909,6 +1909,10 @@ shell::write( sal_Int32 CommandId,
}
} while( nReadBytes == nRequestedBytes );
+ aFile.sync(); // fsync / flush it to disk.
+ OSL_TRACE( "fsync'd file '%s'\n",
+ rtl::OUStringToOString( aUnqPath, RTL_TEXTENCODING_UTF8 ).getStr() );
+
err = aFile.close();
if( err != osl::FileBase::E_None )
{
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.