From bf2af8dbb892d5f6b66a786ce75459a0de4c9477 Mon Sep 17 00:00:00 2001 From: Joachim Lingner Date: Fri, 18 Feb 2011 17:17:49 +0100 Subject: jl64 #i109096# extensions do not work with long path names --- desktop/source/deployment/manager/dp_manager.cxx | 29 ++++++++++++++-------- .../source/deployment/registry/dp_backenddb.cxx | 5 +++- 2 files changed, 23 insertions(+), 11 deletions(-) mode change 100644 => 100755 desktop/source/deployment/manager/dp_manager.cxx mode change 100644 => 100755 desktop/source/deployment/registry/dp_backenddb.cxx diff --git a/desktop/source/deployment/manager/dp_manager.cxx b/desktop/source/deployment/manager/dp_manager.cxx old mode 100644 new mode 100755 index 2e2c5e2a2f53..ad01a9dbb79e --- a/desktop/source/deployment/manager/dp_manager.cxx +++ b/desktop/source/deployment/manager/dp_manager.cxx @@ -63,6 +63,7 @@ #include "com/sun/star/ucb/UnsupportedCommandException.hpp" #include "boost/bind.hpp" #include "tools/urlobj.hxx" +#include "unotools/tempfile.hxx" #include "osl/file.hxx" #include @@ -636,20 +637,28 @@ OUString PackageManagerImpl::insertToActivationLayer( ::ucbhelper::Content sourceContent(sourceContent_); Reference xCmdEnv( sourceContent.getCommandEnvironment() ); - OUString destFolder, tempEntry; - if (::osl::File::createTempFile( - m_activePackages_expanded.getLength() == 0 - ? 0 : &m_activePackages_expanded, - 0, &tempEntry ) != ::osl::File::E_None) - throw RuntimeException( - OUSTR("::osl::File::createTempFile() failed!"), 0 ); + OUString destFolder; + OUString tempEntry; + // if (::osl::File::createTempFile( + // m_activePackages_expanded.getLength() == 0 + // ? 0 : &m_activePackages_expanded, + // 0, &tempEntry ) != ::osl::File::E_None) + // throw RuntimeException( + // OUSTR("::osl::File::createTempFile() failed!"), 0 ); + //::utl::TempFile::SetTempNameBaseDirectory(m_activePackages_expanded); + String baseDir(m_activePackages_expanded); + ::utl::TempFile aTemp(OUSTR("jl123"), NULL, &baseDir, sal_False); if (m_activePackages_expanded.getLength() == 0) { - destFolder = tempEntry; +// destFolder = tempEntry; + destFolder = aTemp.GetFileName(); } else { - tempEntry = tempEntry.copy( tempEntry.lastIndexOf( '/' ) + 1 ); +// tempEntry = tempEntry.copy( tempEntry.lastIndexOf( '/' ) + 1 ); // tweak user|share to macrofied url: - destFolder = makeURL( m_activePackages, tempEntry ); +// destFolder = makeURL( m_activePackages, tempEntry ); + tempEntry = aTemp.GetURL(); + tempEntry = tempEntry.copy(tempEntry.lastIndexOf('/') + 1); + destFolder = makeURL( m_activePackages, tempEntry); } destFolder += OUSTR("_"); diff --git a/desktop/source/deployment/registry/dp_backenddb.cxx b/desktop/source/deployment/registry/dp_backenddb.cxx old mode 100644 new mode 100755 index 9629855aaf11..44e11efdef0e --- a/desktop/source/deployment/registry/dp_backenddb.cxx +++ b/desktop/source/deployment/registry/dp_backenddb.cxx @@ -91,7 +91,10 @@ css::uno::Reference BackendDb::getDocument() ::osl::File::RC err = ::osl::DirectoryItem::get(m_urlDb, item); if (err == ::osl::File::E_None) { - m_doc = xDocBuilder->parseURI(m_urlDb); + ::ucbhelper::Content descContent( + m_urlDb, css::uno::Reference()); + Reference xIn = descContent.openStream(); + m_doc = xDocBuilder->parse(xIn); } else if (err == ::osl::File::E_NOENT) { -- cgit From 1e65d22b7ce7d3f65f730dbd788fc4423b707a5e Mon Sep 17 00:00:00 2001 From: Joachim Lingner Date: Mon, 21 Feb 2011 15:37:12 +0100 Subject: jl164 #i109096# folders in configuration and help registry folders are now created with unotools::TempFile. --- desktop/source/deployment/manager/dp_manager.cxx | 2 +- desktop/source/deployment/registry/dp_backend.cxx | 59 ++++++++++++----------- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/desktop/source/deployment/manager/dp_manager.cxx b/desktop/source/deployment/manager/dp_manager.cxx index ad01a9dbb79e..0339cf599b34 100755 --- a/desktop/source/deployment/manager/dp_manager.cxx +++ b/desktop/source/deployment/manager/dp_manager.cxx @@ -647,7 +647,7 @@ OUString PackageManagerImpl::insertToActivationLayer( // OUSTR("::osl::File::createTempFile() failed!"), 0 ); //::utl::TempFile::SetTempNameBaseDirectory(m_activePackages_expanded); String baseDir(m_activePackages_expanded); - ::utl::TempFile aTemp(OUSTR("jl123"), NULL, &baseDir, sal_False); + ::utl::TempFile aTemp(&baseDir, sal_False); if (m_activePackages_expanded.getLength() == 0) { // destFolder = tempEntry; destFolder = aTemp.GetFileName(); diff --git a/desktop/source/deployment/registry/dp_backend.cxx b/desktop/source/deployment/registry/dp_backend.cxx index 266d4406cfde..32413f3d11ba 100755 --- a/desktop/source/deployment/registry/dp_backend.cxx +++ b/desktop/source/deployment/registry/dp_backend.cxx @@ -45,6 +45,7 @@ #include "com/sun/star/beans/StringPair.hpp" #include "com/sun/star/sdbc/XResultSet.hpp" #include "com/sun/star/sdbc/XRow.hpp" +#include "unotools/tempfile.hxx" using namespace ::dp_misc; @@ -225,42 +226,43 @@ OUString PackageRegistryBackend::createFolder( OUString const & relUrl, Reference const & xCmdEnv) { - OUString sDataFolder = makeURL(getCachePath(), relUrl); + const OUString sDataFolder = makeURL(getCachePath(), relUrl); //make sure the folder exist ucbhelper::Content dataContent; ::dp_misc::create_folder(&dataContent, sDataFolder, xCmdEnv); - OUString sDataFolderURL = dp_misc::expandUnoRcUrl(sDataFolder); - - OUString tempEntry; - if (::osl::File::createTempFile( - &sDataFolderURL, 0, &tempEntry ) != ::osl::File::E_None) - throw RuntimeException( - OUSTR("::osl::File::createTempFile() failed!"), 0 ); - tempEntry = tempEntry.copy( tempEntry.lastIndexOf( '/' ) + 1 ); - OUString destFolder= makeURL(sDataFolder, tempEntry) + OUSTR("_"); - ::ucbhelper::Content destFolderContent; - dp_misc::create_folder( &destFolderContent, destFolder, xCmdEnv ); - - return destFolder; + const OUString sDataFolderURL = dp_misc::expandUnoRcUrl(sDataFolder); + const String baseDir(sDataFolder); + const ::utl::TempFile aTemp(&baseDir, sal_True); + const OUString url = aTemp.GetURL(); + return sDataFolder + url.copy(url.lastIndexOf('/')); } +//folderURL can have the extension .tmp or .tmp_ +//Before OOo 3.4 the created a tmp file with osl_createTempFile and +//then created a Folder with a same name and a trailing '_' +//If the folderURL has no '_' then there is no corresponding tmp file. void PackageRegistryBackend::deleteTempFolder( OUString const & folderUrl) { - OSL_ASSERT(folderUrl.getLength() - && folderUrl[folderUrl.getLength() - 1] == '_'); - if (folderUrl.getLength() - && folderUrl[folderUrl.getLength() - 1] == '_') + if (folderUrl.getLength()) { - const OUString tempFile = folderUrl.copy(0, folderUrl.getLength() - 1); erase_path( folderUrl, Reference(), false /* no throw: ignore errors */ ); - erase_path( tempFile, Reference(), - false /* no throw: ignore errors */ ); + + if (folderUrl[folderUrl.getLength() - 1] == '_') + { + const OUString tempFile = folderUrl.copy(0, folderUrl.getLength() - 1); + erase_path( tempFile, Reference(), + false /* no throw: ignore errors */ ); + } } } +//usedFolders can contain folder names which have the extension .tmp or .tmp_ +//Before OOo 3.4 we created a tmp file with osl_createTempFile and +//then created a Folder with a same name and a trailing '_' +//If the folderURL has no '_' then there is no corresponding tmp file. void PackageRegistryBackend::deleteUnusedFolders( OUString const & relUrl, ::std::list< OUString> const & usedFolders) @@ -273,12 +275,14 @@ void PackageRegistryBackend::deleteUnusedFolders( Reference xResultSet( tempFolder.createCursor( Sequence( &StrTitle::get(), 1 ), - ::ucbhelper::INCLUDE_DOCUMENTS_ONLY ) ); + ::ucbhelper::INCLUDE_FOLDERS_ONLY ) ); // get all temp directories: ::std::vector tempEntries; char tmp[] = ".tmp"; + //Check for ".tmp_" can be removed after OOo 4.0 + char tmp_[] = ".tmp_"; while (xResultSet->next()) { OUString title( @@ -286,21 +290,18 @@ void PackageRegistryBackend::deleteUnusedFolders( xResultSet, UNO_QUERY_THROW )->getString( 1 /* Title */ ) ); - if (title.endsWithAsciiL(tmp, sizeof(tmp) - 1)) + if (title.endsWithAsciiL(tmp, sizeof(tmp) - 1) + || title.endsWithAsciiL(tmp_, sizeof(tmp_) - 1)) tempEntries.push_back( makeURLAppendSysPathSegment(sDataFolder, title)); } for ( ::std::size_t pos = 0; pos < tempEntries.size(); ++pos ) { - //usedFolders contains the urls to the folders which have - //a trailing underscore - const OUString tempFolderName = tempEntries[ pos ] + OUSTR("_"); - - if (::std::find( usedFolders.begin(), usedFolders.end(), tempFolderName ) == + if (::std::find( usedFolders.begin(), usedFolders.end(), tempEntries[pos] ) == usedFolders.end()) { - deleteTempFolder(tempFolderName); + deleteTempFolder(tempEntries[pos]); } } } -- cgit From 7eb98986f55c1eda30442a2fae60bc422f47861d Mon Sep 17 00:00:00 2001 From: Joachim Lingner Date: Thu, 24 Feb 2011 10:37:10 +0100 Subject: jl164 #i109096# java help indexer service did not work with long file paths --- xmlhelp/source/com/sun/star/help/HelpIndexer.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/xmlhelp/source/com/sun/star/help/HelpIndexer.java b/xmlhelp/source/com/sun/star/help/HelpIndexer.java index bd09982daa3e..abb866804b43 100644 --- a/xmlhelp/source/com/sun/star/help/HelpIndexer.java +++ b/xmlhelp/source/com/sun/star/help/HelpIndexer.java @@ -40,6 +40,14 @@ import java.io.IOException; import java.util.Date; import java.util.zip.ZipOutputStream; +/** + When this tool is used with long path names on Windows, that is paths which start + with \\?\, then the caller must make sure that the path is unique. This is achieved + by removing '.' and '..' from the path. Paths which are created by + osl_getSystemPathFromFileURL fulfill this requirement. This is necessary because + lucene is patched to not use File.getCanonicalPath. See long_path.patch in the lucene + module. + */ public class HelpIndexer extends WeakBase implements XServiceInfo, XInvocation { -- cgit From fd2597bbeb3f9ef2a803615ff4df1aea10242283 Mon Sep 17 00:00:00 2001 From: Joachim Lingner Date: Thu, 24 Feb 2011 15:28:48 +0100 Subject: jl164 #i109096# libxml2 fails when using long paths on windows --- desktop/source/deployment/manager/dp_manager.cxx | 25 ++++-------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/desktop/source/deployment/manager/dp_manager.cxx b/desktop/source/deployment/manager/dp_manager.cxx index 0339cf599b34..89ab4d0b7199 100755 --- a/desktop/source/deployment/manager/dp_manager.cxx +++ b/desktop/source/deployment/manager/dp_manager.cxx @@ -637,29 +637,12 @@ OUString PackageManagerImpl::insertToActivationLayer( ::ucbhelper::Content sourceContent(sourceContent_); Reference xCmdEnv( sourceContent.getCommandEnvironment() ); - OUString destFolder; - OUString tempEntry; - // if (::osl::File::createTempFile( - // m_activePackages_expanded.getLength() == 0 - // ? 0 : &m_activePackages_expanded, - // 0, &tempEntry ) != ::osl::File::E_None) - // throw RuntimeException( - // OUSTR("::osl::File::createTempFile() failed!"), 0 ); - //::utl::TempFile::SetTempNameBaseDirectory(m_activePackages_expanded); + String baseDir(m_activePackages_expanded); ::utl::TempFile aTemp(&baseDir, sal_False); - if (m_activePackages_expanded.getLength() == 0) { -// destFolder = tempEntry; - destFolder = aTemp.GetFileName(); - } - else { -// tempEntry = tempEntry.copy( tempEntry.lastIndexOf( '/' ) + 1 ); - // tweak user|share to macrofied url: -// destFolder = makeURL( m_activePackages, tempEntry ); - tempEntry = aTemp.GetURL(); - tempEntry = tempEntry.copy(tempEntry.lastIndexOf('/') + 1); - destFolder = makeURL( m_activePackages, tempEntry); - } + OUString tempEntry = aTemp.GetURL(); + tempEntry = tempEntry.copy(tempEntry.lastIndexOf('/') + 1); + OUString destFolder = makeURL( m_activePackages, tempEntry); destFolder += OUSTR("_"); // prepare activation folder: -- cgit From 9d42fad78d95f71c468f4ce874bd529e17225c1b Mon Sep 17 00:00:00 2001 From: Joachim Lingner Date: Fri, 25 Feb 2011 15:46:46 +0100 Subject: jl164 #i109096# Displaying help content fails for extensions when user installation has a long path on windows --- xmlhelp/source/cxxhelp/provider/databases.cxx | 52 +++++++++++---------------- xmlhelp/source/cxxhelp/provider/databases.hxx | 2 +- xmlhelp/source/cxxhelp/provider/db.cxx | 45 ++++++++++++++++------- xmlhelp/source/cxxhelp/provider/db.hxx | 21 ++++++++--- 4 files changed, 69 insertions(+), 51 deletions(-) mode change 100644 => 100755 xmlhelp/source/cxxhelp/provider/databases.cxx mode change 100644 => 100755 xmlhelp/source/cxxhelp/provider/db.cxx mode change 100644 => 100755 xmlhelp/source/cxxhelp/provider/db.hxx diff --git a/xmlhelp/source/cxxhelp/provider/databases.cxx b/xmlhelp/source/cxxhelp/provider/databases.cxx old mode 100644 new mode 100755 index d798f6c42f81..e3749fc1f694 --- a/xmlhelp/source/cxxhelp/provider/databases.cxx +++ b/xmlhelp/source/cxxhelp/provider/databases.cxx @@ -416,9 +416,6 @@ rtl::OUString Databases::getInstallPathAsSystemPath() return m_aInstallDirectoryAsSystemPath; } - - - rtl::OUString Databases::getInstallPathAsURL() { osl::MutexGuard aGuard( m_aMutex ); @@ -642,22 +639,18 @@ Db* Databases::getBerkeley( const rtl::OUString& Database, { Db* table = new Db(); - rtl::OUString fileNameOU; + rtl::OUString fileURL; if( pExtensionPath ) - { - rtl::OUString aExpandedURL = expandURL( *pExtensionPath ); - aExpandedURL += Language + dbFileName; - osl::FileBase::getSystemPathFromFileURL( aExpandedURL, fileNameOU ); - } + fileURL = expandURL(*pExtensionPath) + Language + dbFileName; else - fileNameOU = getInstallPathAsSystemPath() + key; - + fileURL = getInstallPathAsURL() + key; - rtl::OString fileName( fileNameOU.getStr(),fileNameOU.getLength(),osl_getThreadTextEncoding() ); - - rtl::OUString fileNameDBHelp( fileNameOU ); + rtl::OUString fileNameDBHelp( fileURL ); + //Extensions always use the new format if( pExtensionPath != NULL ) fileNameDBHelp += rtl::OUString::createFromAscii( "_" ); + //SimpleFileAccess takes file URLs as arguments!!! Using filenames works accidentally but + //fails for example when using long path names on Windows (starting with \\?\) if( m_xSFA->exists( fileNameDBHelp ) ) { DBHelp* pDBHelp = new DBHelp( fileNameDBHelp, m_xSFA ); @@ -666,13 +659,13 @@ Db* Databases::getBerkeley( const rtl::OUString& Database, #ifdef TEST_DBHELP bool bSuccess; bool bOldDbAccess = false; - bSuccess = pDBHelp->testAgainstDb( fileName, bOldDbAccess ); + bSuccess = pDBHelp->testAgainstDb( fileURL, bOldDbAccess ); bOldDbAccess = true; - bSuccess = pDBHelp->testAgainstDb( fileName, bOldDbAccess ); + bSuccess = pDBHelp->testAgainstDb( fileURL, bOldDbAccess ); #endif } - else if( table->open( 0,fileName.getStr(),0,DB_BTREE,DB_RDONLY,0644 ) ) + else if( table->open( 0,fileURL, DB_BTREE,DB_RDONLY,0644 ) ) { table->close( 0 ); delete table; @@ -950,17 +943,13 @@ KeywordInfo* Databases::getKeyword( const rtl::OUString& Database, std::vector aVector; KeyDataBaseFileIterator aDbFileIt( m_xContext, *this, Database, Language ); - rtl::OUString fileNameOU; + rtl::OUString fileURL; bool bExtension = false; - while( (fileNameOU = aDbFileIt.nextDbFile( bExtension )).getLength() > 0 ) + while( (fileURL = aDbFileIt.nextDbFile( bExtension )).getLength() > 0 ) { - rtl::OString fileName( fileNameOU.getStr(), - fileNameOU.getLength(), - osl_getThreadTextEncoding() ); - Db table; - rtl::OUString fileNameDBHelp( fileNameOU ); + rtl::OUString fileNameDBHelp( fileURL ); if( bExtension ) fileNameDBHelp += rtl::OUString::createFromAscii( "_" ); if( m_xSFA->exists( fileNameDBHelp ) ) @@ -1009,16 +998,16 @@ KeywordInfo* Databases::getKeyword( const rtl::OUString& Database, #ifdef TEST_DBHELP bool bSuccess; bool bOldDbAccess = false; - bSuccess = aDBHelp.testAgainstDb( fileName, bOldDbAccess ); + bSuccess = aDBHelp.testAgainstDb( fileURL, bOldDbAccess ); bOldDbAccess = true; - bSuccess = aDBHelp.testAgainstDb( fileName, bOldDbAccess ); + bSuccess = aDBHelp.testAgainstDb( fileURL, bOldDbAccess ); int nDummy = 0; #endif } - else if( 0 == table.open( 0,fileName.getStr(),0,DB_BTREE,DB_RDONLY,0644 ) ) + else if( 0 == table.open( 0,fileURL,DB_BTREE,DB_RDONLY,0644 ) ) { Db* idmap = getBerkeley( Database,Language ); @@ -1867,6 +1856,7 @@ Db* DataBaseIterator::implGetDbFromPackage( Reference< deployment::XPackage > xP //=================================================================== // class KeyDataBaseFileIterator +//returns a file URL rtl::OUString KeyDataBaseFileIterator::nextDbFile( bool& o_rbExtension ) { rtl::OUString aRetFile; @@ -1877,7 +1867,7 @@ rtl::OUString KeyDataBaseFileIterator::nextDbFile( bool& o_rbExtension ) { case INITIAL_MODULE: aRetFile = - m_rDatabases.getInstallPathAsSystemPath() + + m_rDatabases.getInstallPathAsURL() + m_rDatabases.processLang( m_aLanguage ) + aSlash + m_aInitialModule + rtl::OUString::createFromAscii( ".key" ); @@ -1935,16 +1925,14 @@ rtl::OUString KeyDataBaseFileIterator::nextDbFile( bool& o_rbExtension ) return aRetFile; } +//Returns a file URL, that does not contain macros rtl::OUString KeyDataBaseFileIterator::implGetDbFileFromPackage ( Reference< deployment::XPackage > xPackage ) { rtl::OUString aExpandedURL = implGetFileFromPackage( rtl::OUString::createFromAscii( ".key" ), xPackage ); - rtl::OUString aRetFile; - osl::FileBase::getSystemPathFromFileURL( aExpandedURL, aRetFile ); - - return aRetFile; + return aExpandedURL; } diff --git a/xmlhelp/source/cxxhelp/provider/databases.hxx b/xmlhelp/source/cxxhelp/provider/databases.hxx index aa80bf27405b..793edafb480f 100644 --- a/xmlhelp/source/cxxhelp/provider/databases.hxx +++ b/xmlhelp/source/cxxhelp/provider/databases.hxx @@ -506,7 +506,7 @@ namespace chelp { Databases& rDatabases, const rtl::OUString& aInitialModule, const rtl::OUString& aLanguage ) : ExtensionIteratorBase( xContext, rDatabases, aInitialModule, aLanguage ) {} - + //Returns a file URL rtl::OUString nextDbFile( bool& o_rbExtension ); private: diff --git a/xmlhelp/source/cxxhelp/provider/db.cxx b/xmlhelp/source/cxxhelp/provider/db.cxx old mode 100644 new mode 100755 index abc5acc6381c..3db8f5a3da87 --- a/xmlhelp/source/cxxhelp/provider/db.cxx +++ b/xmlhelp/source/cxxhelp/provider/db.cxx @@ -35,6 +35,8 @@ #include "com/sun/star/io/XSeekable.hpp" +#include "osl/file.hxx" +#include "osl/thread.hxx" #ifdef TEST_DBHELP #include #endif @@ -115,21 +117,25 @@ void testWriteKeyValue( FILE* pFile, const KeyValPair& rKeyValPair ) fprintf( pFile, "%c", cLF ); } -bool DBHelp::testAgainstDb( const rtl::OString& fileName, bool bOldDbAccess ) +bool DBHelp::testAgainstDb( const rtl::OUString& fileURL, bool bOldDbAccess ) { bool bSuccess = true; KeyValPairVector avKeyValPair; - rtl::OString aOutFileName = fileName; - aOutFileName += "_TestOut"; + rtl::OUString aOutFileName = fileURL; + aOutFileName += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_TestOut")); if( bOldDbAccess ) - aOutFileName += "_Old"; - FILE* pFile = fopen( aOutFileName.getStr(), "wb" ); - + aOutFileName += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_Old")); +#ifdef WNT + FILE* pFile = _wfopen( aOutFileName.getStr(), L"wb" ); +#else + rtl::OString sFile = rtl::OUStringToOString(aOutFileName, osl_getThreadTextEncoding()); + FILE* pFile = fopen( sFile.getStr(), "wb" ); +#endif // Get all values Db table; - if( 0 == table.open( 0,fileName.getStr(),0,DB_BTREE,DB_RDONLY,0644 ) ) + if( 0 == table.open( 0,fileURL,DB_BTREE,DB_RDONLY,0644 ) ) { bool first = true; @@ -206,7 +212,7 @@ bool DBHelp::testAgainstDb( const rtl::OString& fileName, bool bOldDbAccess ) { if( bFirst ) { - if( tableTest.open( 0,fileName.getStr(),0,DB_BTREE,DB_RDONLY,0644 ) ) + if( tableTest.open( 0,fileURL, DB_BTREE,DB_RDONLY,0644 ) ) { if( pFile != NULL ) fprintf( pFile, "Cannot open database\n" ); @@ -305,11 +311,11 @@ void DBHelp::createHashMap( bool bOptimizeForPerformance ) m_pStringToValPosMap = new StringToValPosMap(); } - Reference< XInputStream > xIn = m_xSFA->openFileRead( m_aFileName ); + Reference< XInputStream > xIn = m_xSFA->openFileRead( m_aFileURL ); if( xIn.is() ) { Sequence< sal_Int8 > aData; - sal_Int32 nSize = m_xSFA->getSize( m_aFileName ); + sal_Int32 nSize = m_xSFA->getSize( m_aFileURL ); sal_Int32 nRead = xIn->readBytes( aData, nSize ); const char* pData = (const char*)aData.getConstArray(); @@ -388,7 +394,7 @@ bool DBHelp::getValueForKey( const rtl::OString& rKey, DBData& rValue ) int iValuePos = rValPair.first; int nValueLen = rValPair.second; - Reference< XInputStream > xIn = m_xSFA->openFileRead( m_aFileName ); + Reference< XInputStream > xIn = m_xSFA->openFileRead( m_aFileURL ); if( xIn.is() ) { Reference< XSeekable > xXSeekable( xIn, UNO_QUERY ); @@ -436,9 +442,9 @@ bool DBHelp::startIteration( void ) { bool bSuccess = false; - sal_Int32 nSize = m_xSFA->getSize( m_aFileName ); + sal_Int32 nSize = m_xSFA->getSize( m_aFileURL ); - Reference< XInputStream > xIn = m_xSFA->openFileRead( m_aFileName ); + Reference< XInputStream > xIn = m_xSFA->openFileRead( m_aFileURL ); if( xIn.is() ) { m_nItRead = xIn->readBytes( m_aItData, nSize ); @@ -519,6 +525,19 @@ int Db::open(DB_TXN *txnid, return db_internal::check_error( err,"Db::open" ); } +int Db::open(DB_TXN *txnid, + ::rtl::OUString const & fileURL, + DBTYPE type, + u_int32_t flags, + int mode) +{ + ::rtl::OUString ouPath; + ::osl::FileBase::getSystemPathFromFileURL(fileURL, ouPath); + const ::rtl::OString sPath = ::rtl::OUStringToOString(ouPath, osl_getThreadTextEncoding()); + return open(txnid, sPath.getStr(), 0, type, flags, mode); +} + + int Db::get(DB_TXN *txnid, Dbt *key, Dbt *data, u_int32_t flags) { diff --git a/xmlhelp/source/cxxhelp/provider/db.hxx b/xmlhelp/source/cxxhelp/provider/db.hxx old mode 100644 new mode 100755 index eb867c0426d3..1e25ab1f579b --- a/xmlhelp/source/cxxhelp/provider/db.hxx +++ b/xmlhelp/source/cxxhelp/provider/db.hxx @@ -118,7 +118,7 @@ namespace berkeleydbproxy { class DBHelp { - rtl::OUString m_aFileName; + rtl::OUString m_aFileURL; StringToDataMap* m_pStringToDataMap; StringToValPosMap* m_pStringToValPosMap; com::sun::star::uno::Reference< com::sun::star::ucb::XSimpleFileAccess > @@ -133,16 +133,21 @@ namespace berkeleydbproxy { bool implReadLenAndData( const char* pData, int& riPos, DBData& rValue ); public: - DBHelp( const rtl::OUString& rFileName, + //DBHelp must get a fileURL which can then directly be used by simple file access. + //SimpleFileAccess requires file URLs as arguments. Passing file path may work but fails + //for example when using long file paths on Windows, which start with "\\?\" + DBHelp( const rtl::OUString& rFileURL, com::sun::star::uno::Reference< com::sun::star::ucb::XSimpleFileAccess > xSFA ) - : m_aFileName( rFileName ) + : m_aFileURL( rFileURL ) , m_pStringToDataMap( NULL ) , m_pStringToValPosMap( NULL ) , m_xSFA( xSFA ) , m_pItData( NULL ) , m_nItRead( -1 ) , m_iItPos( -1 ) - {} + { + OSL_ASSERT(!rFileURL.compareTo(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("file:")), 5)); + } ~DBHelp() { releaseHashMap(); } @@ -150,7 +155,7 @@ namespace berkeleydbproxy { void releaseHashMap( void ); #ifdef TEST_DBHELP - bool testAgainstDb( const rtl::OString& fileName, bool bOldDbAccess ); + bool testAgainstDb( const rtl::OUString& fileURL, bool bOldDbAccess ); #endif bool getValueForKey( const rtl::OString& rKey, DBData& rValue ); @@ -184,6 +189,12 @@ namespace berkeleydbproxy { u_int32_t flags, int mode); + int open(DB_TXN *txnid, + ::rtl::OUString const & fileURL, + DBTYPE type, + u_int32_t flags, + int mode); + int get(DB_TXN* txnid, Dbt *key, Dbt *data, u_int32_t flags); -- cgit From 271137c2c5d3bcacdee5cf15b8df9138345316ed Mon Sep 17 00:00:00 2001 From: Joachim Lingner Date: Thu, 3 Mar 2011 17:01:11 +0100 Subject: #i117186# call unopkg sync when building type installed or archive with the proper arguments, remove assertion from framework for the case that there is no user installation. --- framework/source/services/substitutepathvars.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) mode change 100644 => 100755 framework/source/services/substitutepathvars.cxx diff --git a/framework/source/services/substitutepathvars.cxx b/framework/source/services/substitutepathvars.cxx old mode 100644 new mode 100755 index 90c460b74298..7db60eb9dede --- a/framework/source/services/substitutepathvars.cxx +++ b/framework/source/services/substitutepathvars.cxx @@ -1170,12 +1170,12 @@ void SubstitutePathVariables::SetPredefinedPathVariables( PredefinedPathVariable } aState = utl::Bootstrap::locateUserData( sVal ); + //There can be the valid case that there is no user installation. For example, "unopkg sync" + //is currently (OOo3.4) run as part of the setup. Then no user installation is required. + //Therefore we do not assert here. if( aState == ::utl::Bootstrap::PATH_EXISTS ) { aPreDefPathVariables.m_FixedVar[ PREDEFVAR_USERPATH ] = ConvertOSLtoUCBURL( sVal ); } - else { - LOG_ERROR( "SubstitutePathVariables::SetPredefinedPathVariables", "Bootstrap code has no value for userpath"); - } // Set $(inst), $(instpath), $(insturl) aPreDefPathVariables.m_FixedVar[ PREDEFVAR_INSTURL ] = aPreDefPathVariables.m_FixedVar[ PREDEFVAR_INSTPATH ]; -- cgit