22#include <osl/diagnose.h>
23#include <osl/file.hxx>
24#include <rtl/character.hxx>
26#include <rtl/ustrbuf.hxx>
28#include <com/sun/star/lang/Locale.hpp>
29#include <com/sun/star/awt/Toolkit.hpp>
30#include <com/sun/star/i18n/Collator.hpp>
41#include <com/sun/star/deployment/ExtensionManager.hpp>
42#include <com/sun/star/deployment/ExtensionRemovedException.hpp>
44#include <com/sun/star/uno/XComponentContext.hpp>
45#include <com/sun/star/ucb/XCommandEnvironment.hpp>
46#include <com/sun/star/beans/Optional.hpp>
47#include <com/sun/star/beans/NamedValue.hpp>
48#include <com/sun/star/configuration/theDefaultProvider.hpp>
49#include <com/sun/star/ucb/SimpleFileAccess.hpp>
50#include <com/sun/star/util/theMacroExpander.hpp>
51#include <com/sun/star/uri/UriReferenceFactory.hpp>
52#include <com/sun/star/uri/XVndSunStarExpandUrl.hpp>
55#include <com/sun/star/awt/XVclWindowPeer.hpp>
56#include <com/sun/star/awt/XTopWindow.hpp>
66#if !defined WIN32_LEAN_AND_MEAN
67# define WIN32_LEAN_AND_MEAN
82OUString Databases::expandURL(
const OUString& aURL )
99 if( !xMacroExpander.is() || !xFac.is() )
101 xFac = uri::UriReferenceFactory::create( xContext );
103 xMacroExpander = util::theMacroExpander::get(xContext);
106 OUString aRetURL =
aURL;
107 if( xMacroExpander.is() )
112 uriRef = xFac->parse( aRetURL );
119 aRetURL = sxUri->expand( xMacroExpander );
135 const OUString& instPath,
136 const OUString& productName,
137 const OUString& productVersion,
138 const OUString& styleSheet,
141 m_bShowBasic(showBasic),
142 m_aCSS(styleSheet.toAsciiLowerCase())
181 uno::Reference< lang::XMultiServiceFactory > xConfigProvider =
182 configuration::theDefaultProvider::get(
m_xContext);
187 {
"nodepath",
uno::Any(OUString(
"org.openoffice.Office.Common"))}
191 uno::Reference< uno::XInterface > xCFG( xConfigProvider->createInstanceWithArguments(
192 "com.sun.star.configuration.ConfigurationAccess",
195 uno::Reference< container::XHierarchicalNameAccess > xAccess(xCFG, uno::UNO_QUERY_THROW);
196 uno::Any aResult = xAccess->getByHierarchicalName(
"Misc/SymbolStyle");
197 OUString aSymbolsStyleName;
198 aResult >>= aSymbolsStyleName;
200 if ( aSymbolsStyleName.isEmpty() || aSymbolsStyleName ==
"auto" )
202 aSymbolsStyleName =
"colibre";
204 return aSymbolsStyleName.toUtf8();
209 sal_Int32
idx = -1,idx1 = -1,idx2 = -1,k = 0,off;
211 OUStringBuffer aStrBuf( 0 );
216 idx1 = oustring.indexOf(
'%',
idx);
217 idx2 = oustring.indexOf(
'$',
idx);
219 if(idx1 == -1 && idx2 == -1)
230 else if(idx2 < idx1 )
256 aStrBuf.ensureCapacity( 256 );
259 aStrBuf.append( &oustring.getStr()[k],
idx - k );
267 if( k < oustring.getLength() )
268 aStrBuf.append( &oustring.getStr()[k],oustring.getLength()-k );
269 oustring = aStrBuf.makeStringAndClear();
275 std::unique_lock aGuard(
m_aMutex );
290 osl::Directory dirFile( dirName );
292 osl::DirectoryItem aDirItem;
293 osl::FileStatus aStatus( osl_FileStatus_Mask_FileName );
295 if( osl::FileBase::E_None != dirFile.open() )
298 while( dirFile.getNextItem( aDirItem ) == osl::FileBase::E_None &&
299 aDirItem.getFileStatus( aStatus ) == osl::FileBase::E_None )
301 if( ! aStatus.isValid( osl_FileStatus_Mask_FileName ) )
304 fileName = aStatus.getFileName();
307 if (!fileName.endsWithIgnoreAsciiCase(
".cfg", &fileName)) {
310 fileName = fileName.toAsciiLowerCase();
311 if (fileName ==
"picture"
324 const OUString& Language )
326 std::unique_lock aGuard(
m_aMutex );
330 std::pair< ModInfoTable::iterator,bool > aPair =
333 ModInfoTable::iterator it = aPair.first;
335 if( aPair.second && ! it->second )
339 if( osl::FileBase::E_None != cfgFile.open( osl_File_OpenFlag_Read ) )
340 it->second =
nullptr;
347 OUStringBuffer fileContent;
349 while( osl::FileBase::E_None == cfgFile.read( &buffer,2048,nRead ) && nRead )
350 fileContent.append(OUString( buffer,sal_Int32( nRead ),RTL_TEXTENCODING_UTF8 ));
355 OUString current,program,startid,title;
356 OUString order(
"1" );
358 for( sal_Int32
i = 0;
i < fileContent.getLength();
i++ )
361 if(
ch ==
'\n' ||
ch ==
'\r' )
365 current = OUString( lineBuffer,
pos );
367 if( current.startsWith(
"Title") )
369 title = current.copy( current.indexOf(
'=' ) + 1 );
371 else if( current.startsWith(
"Start") )
373 startid = current.copy( current.indexOf(
'=') + 1 );
375 else if( current.startsWith(
"Program") )
377 program = current.copy( current.indexOf(
'=') + 1 );
379 else if( current.startsWith(
"Order") )
381 order = current.copy( current.indexOf(
'=') + 1 );
387 lineBuffer[
pos++ ] =
ch;
397 return it->second.get();
402 std::unique_lock aGuard(
m_aMutex );
409 LangSetTable::iterator it =
m_aLangSet.find( Language );
417 const OUString aBcp47( Language.replaceAll(
"_",
"-"));
420 osl::DirectoryItem aDirItem;
421 std::vector<OUString> aFallbacks(
LanguageTag( aBcp47).getFallbackStrings(
true));
422 for (
auto const & rFB : aFallbacks)
424 if (osl::FileBase::E_None == osl::DirectoryItem::get(
m_aInstallDirectory + rFB, aDirItem))
439 const OUString& Language,
bool helpText,
440 const OUString* pExtensionPath )
442 std::unique_lock aGuard(
m_aMutex );
448 std::u16string_view Database,
449 const OUString& Language,
bool helpText,
450 const OUString* pExtensionPath )
453 if(
Database.empty() || Language.isEmpty() )
456 OUString
aFileExt( helpText ? OUString(
".ht") : OUString(
".db") );
459 if( pExtensionPath ==
nullptr )
460 key =
processLang( rGuard, Language ) + dbFileName;
462 key = *pExtensionPath + Language + dbFileName;
464 std::pair< DatabasesTable::iterator,bool > aPair =
467 DatabasesTable::iterator it = aPair.first;
469 if( aPair.second && ! it->second )
471 std::unique_ptr<helpdatafileproxy::Hdf> pHdf;
475 fileURL =
expandURL(rGuard, *pExtensionPath) + Language + dbFileName;
479 OUString fileNameHDFHelp( fileURL );
481 if( pExtensionPath !=
nullptr )
482 fileNameHDFHelp +=
"_";
485 if(
m_xSFA->exists( fileNameHDFHelp ) )
490 it->second = std::move(pHdf);
493 return it->second.get();
499 OUString key = Language;
501 CollatorTable::iterator it =
504 if( ! it->second.is() )
508 OUString countryStr = aLanguageTag.
getCountry();
509 if( countryStr.isEmpty() )
511 const OUString langStr = aLanguageTag.
getLanguage();
512 if( langStr ==
"de" )
514 else if( langStr ==
"en" )
516 else if( langStr ==
"es" )
518 else if( langStr ==
"it" )
520 else if( langStr ==
"fr" )
522 else if( langStr ==
"sv" )
524 else if( langStr ==
"ja" )
526 else if( langStr ==
"ko" )
532 if (!countryStr.isEmpty())
533 aLanguageTag.
reset( langStr +
"-" + countryStr);
535 it->second->loadDefaultCollator( aLanguageTag.
getLocale(), 0);
550 const KeywordInfo::KeywordElement& ra )
const
552 const OUString& l = la.key;
553 const OUString& r = ra.key;
559 sal_Int32 l1 = l.indexOf(
';' );
560 sal_Int32 l3 = ( l1 == -1 ? l.getLength() : l1 );
562 sal_Int32 r1 = r.indexOf(
';' );
563 sal_Int32 r3 = ( r1 == -1 ? r.getLength() : r1 );
565 sal_Int32 c1 =
m_xCollator->compareSubstring( l,0,l3,r,0,r3 );
571 sal_Int32 l2 = l.getLength() - l1 - 1;
572 sal_Int32 r2 = r.getLength() - r1 - 1;
573 ret = (
m_xCollator->compareSubstring( l,1+l1,l2,r,1+r1,r2 ) < 0 );
592 std::u16string_view data )
593 : key(
std::move( ky ))
596 init( pDatabases,pHdf,data );
601 std::vector< OUString > id,
anchor;
602 size_t idx = std::u16string_view::npos;
606 idx = ids.find(
';', k );
607 if(
idx == std::u16string_view::npos )
609 size_t h = ids.find(
'#', k );
610 if(
h == std::u16string_view::npos ||
h <
idx )
613 id.push_back( OUString(ids.substr( k,
h-k )) );
614 anchor.push_back( OUString(ids.substr(
h+1,
idx-
h-1 )) );
618 id.push_back( OUString(ids.substr( k,
idx-k )) );
625 auto plistId =
listId.getArray();
631 for(
size_t i = 0;
i <
id.size(); ++
i )
637 const char*
pData =
nullptr;
649 OUString title = converter.
getTitle();
651 plistTitle[
i] = title;
661 auto listKeyRange = asNonConstRange(
listKey);
662 auto listIdRange = asNonConstRange(
listId);
663 auto listAnchorRange = asNonConstRange(
listAnchor);
664 auto listTitleRange = asNonConstRange(
listTitle);
665 for(
size_t i = 0;
i < aVec.size(); ++
i )
667 listKeyRange[
i] = aVec[
i].key;
668 listIdRange[
i] = aVec[
i].listId;
669 listAnchorRange[
i] = aVec[
i].listAnchor;
670 listTitleRange[
i] = aVec[
i].listTitle;
675 ( std::u16string_view Database,
const OUString& doclist )
677 bool bBelongsToDatabase =
true;
680 bool bFoundAtLeastOneModule =
false;
681 bool bModuleMatch =
false;
682 sal_Int32 nLen = doclist.getLength();
683 sal_Int32 nLastFound = doclist.lastIndexOf(
';' );
684 if( nLastFound == -1 )
687 sal_Int32 nFound = doclist.lastIndexOf(
'_' );
688 while( nFound != -1 )
691 if( nLen - nFound > 2 )
693 if( pStr[ nFound + 1 ] ==
'i' &&
694 pStr[ nFound + 2 ] ==
'd' )
698 OUString aModule = doclist.copy( nFound + 1, nLastFound - nFound - 1 );
702 bFoundAtLeastOneModule =
true;
711 if( nLastFound == 0 )
713 nFound = doclist.lastIndexOf(
'_', nLastFound - 1 );
716 if( bFoundAtLeastOneModule && !bModuleMatch )
717 bBelongsToDatabase =
false;
719 return bBelongsToDatabase;
723 const OUString& Language )
725 std::unique_lock aGuard(
m_aMutex );
729 std::pair< KeywordInfoTable::iterator,bool > aPair =
732 KeywordInfoTable::iterator it = aPair.first;
734 if( aPair.second && ! it->second )
736 std::vector<KeywordInfo::KeywordElement> aVector;
740 bool bExtension =
false;
743 fileURL = aDbFileIt.
nextDbFile(aGuard, bExtension);
744 if( fileURL.isEmpty() )
746 OUString fileNameHDFHelp( fileURL );
748 fileNameHDFHelp +=
"_";
749 if(
m_xSFA->exists( fileNameHDFHelp ) )
757 if( pHdf !=
nullptr )
766 RTL_TEXTENCODING_UTF8 );
768 RTL_TEXTENCODING_UTF8 );
770 bool bBelongsToDatabase =
true;
774 if( !bBelongsToDatabase )
777 aVector.emplace_back(
this,
784 if( pHdf !=
nullptr )
793 std::sort(aVector.begin(),aVector.end(),aComparator);
798 return it->second.get();
802 std::unique_lock<std::mutex>& rGuard, std::u16string_view jar,
803 const OUString& Language )
805 if( jar.empty() || Language.isEmpty() )
810 OUString key =
processLang(rGuard, Language) +
"/" + jar;
812 ZipFileTable::iterator it =
815 if( ! it->second.is() )
821 size_t nQuestionMark1 = jar.find(
'?' );
822 size_t nQuestionMark2 = jar.rfind(
'?' );
823 if( nQuestionMark1 != std::u16string_view::npos && nQuestionMark2 != std::u16string_view::npos && nQuestionMark1 != nQuestionMark2 )
825 std::u16string_view aExtensionPath = jar.substr( nQuestionMark1 + 1, nQuestionMark2 - nQuestionMark1 - 1 );
826 std::u16string_view aPureJar = jar.substr( nQuestionMark2 + 1 );
828 zipFile =
expandURL(rGuard, OUString::Concat(aExtensionPath) +
"/" + aPureJar);
839 if(
p->CtorSuccess() )
846 pArguments[ 0 ] <<= zipFile;
850 beans::NamedValue aArg;
851 aArg.Name =
"StorageFormat";
853 pArguments[ 1 ] <<= aArg;
856 =
m_xSMgr->createInstanceWithArgumentsAndContext(
857 "com.sun.star.packages.comp.ZipPackage",
862 it->second.set( xIfc, UNO_QUERY );
864 OSL_ENSURE( it->second.is(),
865 "ContentProvider::createPackage - "
866 "Got no hierarchical name access!" );
882 (
const OUString& jar,
const OUString& Language,
883 const OUString& path, OUString* o_pExtensionPath,
884 OUString* o_pExtensionRegistryPath )
887 if( jar.isEmpty() || Language.isEmpty() )
892 ::std::unique_lock aGuard(
m_aMutex);
899 xTestNA = aJarFileIt.
nextJarFile(aGuard, xParentPackageBundle, o_pExtensionPath, o_pExtensionRegistryPath);
902 if( xTestNA.is() && xTestNA->hasByHierarchicalName( path ) )
904 bool bSuccess =
true;
905 if( xParentPackageBundle.is() )
907 OUString aIdentifierInPath;
908 sal_Int32 nFindSlash = path.indexOf(
'/' );
909 if( nFindSlash != -1 )
910 aIdentifierInPath = path.copy( 0, nFindSlash );
912 beans::Optional<OUString> aIdentifierOptional = xParentPackageBundle->getIdentifier();
913 if( !aIdentifierInPath.isEmpty() && aIdentifierOptional.IsPresent )
915 OUString aUnencodedIdentifier = aIdentifierOptional.Value;
916 OUString aIdentifier = rtl::Uri::encode( aUnencodedIdentifier,
917 rtl_UriCharClassPchar, rtl_UriEncodeIgnoreEscapes, RTL_TEXTENCODING_UTF8 );
919 if( aIdentifierInPath != aIdentifier )
945 m_aCSS = newStyleSheet.toAsciiLowerCase();
950 OStringBuffer& buffer )
958 bool bHighContrastMode =
false;
960 if ( aCSS ==
"default" )
963 uno::Reference< awt::XToolkit2 > xToolkit =
964 awt::Toolkit::create( ::comphelper::getProcessComponentContext() );
965 uno::Reference< awt::XTopWindow > xTopWindow = xToolkit->getActiveTopWindow();
966 if ( xTopWindow.is() )
968 uno::Reference< awt::XVclWindowPeer > xVclWindowPeer( xTopWindow, uno::UNO_QUERY );
969 if ( xVclWindowPeer.is() )
971 uno::Any aHCMode = xVclWindowPeer->getProperty(
"HighContrastMode" );
972 if ( ( aHCMode >>= bHighContrastMode ) && bHighContrastMode )
974 aCSS =
"highcontrastblack";
977 LONG lResult = RegOpenKeyExW( HKEY_CURRENT_USER, L
"Control Panel\\Accessibility\\HighContrast", 0, KEY_QUERY_VALUE, &hKey );
978 if ( ERROR_SUCCESS == lResult )
980 WCHAR szBuffer[1024];
981 DWORD nSize =
sizeof( szBuffer );
982 lResult = RegQueryValueExW( hKey, L
"High Contrast Scheme",
nullptr,
nullptr,
reinterpret_cast<LPBYTE
>(szBuffer), &nSize );
983 if ( ERROR_SUCCESS == lResult && nSize > 0 )
985 szBuffer[nSize] =
'\0';
986 if ( wcscmp( szBuffer, L
"High Contrast #1" ) == 0 )
987 aCSS =
"highcontrast1";
988 if ( wcscmp( szBuffer, L
"High Contrast #2" ) == 0 )
989 aCSS =
"highcontrast2";
990 if ( wcscmp( szBuffer, L
"High Contrast White" ) == 0 )
991 aCSS =
"highcontrastwhite";
1001 while( error && retry )
1011 else if( retry == 1 )
1017 osl::DirectoryItem aDirItem;
1018 osl::File aFile( fileURL );
1019 osl::FileStatus aStatus( osl_FileStatus_Mask_FileSize );
1021 if( osl::FileBase::E_None == osl::DirectoryItem::get( fileURL,aDirItem ) &&
1022 osl::FileBase::E_None == aFile.open( osl_File_OpenFlag_Read ) &&
1023 osl::FileBase::E_None == aDirItem.getFileStatus( aStatus ) )
1026 aFile.getSize( nSize );
1029 sal_uInt64
a = nSize,b = nSize;
1036 if ( !retry && error && bHighContrastMode )
1041 bHighContrastMode =
false;
1056 const OUString& Language,
1057 std::u16string_view
Id,
1058 OStringBuffer& buffer )
1069 const char*
pData =
nullptr;
1071 bool bSuccess =
false;
1072 if( !bFoundAsEmpty )
1089 for(
int i = 0;
i < nSize; ++
i )
1093 OUString temp(
pData, nSize, RTL_TEXTENCODING_UTF8 );
1095 tmp = OString( temp.getStr(),
1097 RTL_TEXTENCODING_UTF8 );
1098 nSize = tmp.getLength();
1099 pData = tmp.getStr();
1103 buffer.append(
pData, nSize );
1107 if( !bFoundAsEmpty )
1114 std::unique_lock aGuard(
m_aMutex );
1127 Databases& rDatabases, OUString aInitialModule, OUString aLanguage )
1129 , m_rDatabases( rDatabases )
1131 , m_aInitialModule(
std::move( aInitialModule ))
1132 , m_aLanguage(
std::move( aLanguage ))
1139 OUString aInitialModule, OUString aLanguage )
1141 , m_rDatabases( rDatabases )
1143 , m_aInitialModule(
std::move( aInitialModule ))
1144 , m_aLanguage(
std::move( aLanguage ))
1164 o_xParentPackageBundle.clear();
1167 if( !xPackage.is() )
1168 return xHelpPackage;
1171 OUString aExtensionPath = xPackage->getURL();
1172 ExtensionHelpExistenceMap::iterator it =
aHelpExistenceMap.find( aExtensionPath );
1174 bool bHasHelp = bFound && it->second;
1175 if( bFound && !bHasHelp )
1176 return xHelpPackage;
1179 beans::Optional< beans::Ambiguous<sal_Bool> >
option( xPackage->isRegistered
1181 bool bRegistered =
false;
1184 beans::Ambiguous<sal_Bool>
const & reg =
option.Value;
1185 if( !reg.IsAmbiguous && reg.Value )
1191 if( xPackage->isBundle() )
1195 auto pSubPkg = std::find_if(aPkgSeq.begin(), aPkgSeq.end(),
1197 const Reference< deployment::XPackageTypeInfo > xPackageTypeInfo = xSubPkg->getPackageType();
1198 OUString aMediaType = xPackageTypeInfo->getMediaType();
1199 return aMediaType == aHelpMediaType;
1201 if (pSubPkg != aPkgSeq.end())
1203 xHelpPackage = *pSubPkg;
1204 o_xParentPackageBundle = xPackage;
1210 OUString aMediaType = xPackageTypeInfo->getMediaType();
1212 xHelpPackage = xPackage;
1219 return xHelpPackage;
1243 OSL_ENSURE( xPackage.is(),
"ExtensionIteratorBase::implGetNextUserHelpPackage(): Invalid package" );
1247 return xHelpPackage;
1271 OSL_ENSURE( xPackage.is(),
"ExtensionIteratorBase::implGetNextSharedHelpPackage(): Invalid package" );
1275 return xHelpPackage;
1300 OSL_ENSURE( xPackage.is(),
"ExtensionIteratorBase::implGetNextBundledHelpPackage(): Invalid package" );
1304 return xHelpPackage;
1308 std::unique_lock<std::mutex> & rGuard,
1312 bool bLangFolderOnly = rFileExtension.empty();
1316 for( sal_Int32 iPass = 0 ; iPass < 2 ; ++iPass )
1318 OUString
aStr = xPackage->getRegistrationDataURL().Value +
"/" + aLanguage;
1319 if( !bLangFolderOnly )
1321 aStr += OUString::Concat(
"/help") + rFileExtension;
1327 if(
m_xSFA->exists( aFile ) )
1330 ::std::vector< OUString > av;
1333 if( pFound != av.end() )
1334 aLanguage = *pFound;
1345 bool bLangFolderOnly = rFileExtension.empty();
1349 for( sal_Int32 iPass = 0 ; iPass < 2 ; ++iPass )
1351 OUString
aStr = xPackage->getRegistrationDataURL().Value +
"/" + aLanguage;
1352 if( !bLangFolderOnly )
1354 aStr += OUString::Concat(
"/help") + rFileExtension;
1360 if(
m_xSFA->exists( aFile ) )
1363 ::std::vector< OUString > av;
1366 if( pFound != av.end() )
1367 aLanguage = *pFound;
1375 return rtl::isAsciiAlpha(c);
1379 const css::uno::Reference< css::deployment::XPackage >& xPackage )
1382 OUString aExtensionPath = xPackage->getURL();
1385 for(
const OUString& aEntry : aEntrySeq )
1387 if(
m_xSFA->isFolder( aEntry ) )
1389 sal_Int32 nLastSlash = aEntry.lastIndexOf(
'/' );
1390 if( nLastSlash != -1 )
1392 OUString aPureEntry = aEntry.copy( nLastSlash + 1 );
1395 int nLen = aPureEntry.getLength();
1398 bool bIsLanguage = bStartCanBeLanguage &&
1401 rv.push_back( aPureEntry );
1429 if( !xHelpPackage.is() )
1439 if( !xHelpPackage.is() )
1450 if( !xHelpPackage.is() )
1458 OSL_FAIL(
"DataBaseIterator::nextDb(): Invalid case IteratorState::EndReached" );
1467 OUString* o_pExtensionPath, OUString* o_pExtensionRegistryPath )
1470 beans::Optional< OUString> optRegData;
1473 optRegData = xPackage->getRegistrationDataURL();
1475 catch ( deployment::ExtensionRemovedException&)
1481 if (optRegData.IsPresent && !optRegData.Value.isEmpty())
1483 OUString aRegDataUrl = optRegData.Value +
"/";
1485 OUString aHelpFilesBaseName(
"help");
1489 aHelpFilesBaseName, aUsedLanguage,
m_bHelpText, &aRegDataUrl);
1494 ::std::vector< OUString > av;
1497 if( pFound != av.end() )
1499 aUsedLanguage = *pFound;
1501 aHelpFilesBaseName, aUsedLanguage,
m_bHelpText, &aRegDataUrl);
1505 if( o_pExtensionPath )
1506 *o_pExtensionPath = aRegDataUrl + aUsedLanguage;
1508 if( o_pExtensionRegistryPath )
1509 *o_pExtensionRegistryPath = xPackage->getURL() +
"/" + aUsedLanguage;
1531 o_rbExtension =
false;
1544 if( !xHelpPackage.is() )
1548 o_rbExtension =
true;
1556 if( !xHelpPackage.is() )
1560 o_rbExtension =
true;
1568 if( !xHelpPackage.is() )
1572 o_rbExtension =
true;
1577 OSL_FAIL(
"DataBaseIterator::nextDbFile(): Invalid case IteratorState::EndReached" );
1587 std::unique_lock<std::mutex>& rGuard,
1590 OUString aExpandedURL =
1593 return aExpandedURL;
1598 std::unique_lock<std::mutex>& rGuard,
1600 OUString* o_pExtensionPath, OUString* o_pExtensionRegistryPath )
1620 if( !xHelpPackage.is() )
1630 if( !xHelpPackage.is() )
1640 if( !xHelpPackage.is() )
1648 OSL_FAIL(
"JarFileIterator::nextJarFile(): Invalid case IteratorState::EndReached" );
1657 std::unique_lock<std::mutex>& rGuard,
1676 =
xSMgr->createInstanceWithArgumentsAndContext(
1677 "com.sun.star.packages.comp.ZipPackage",
1682 xNA.set( xIfc, UNO_QUERY );
1684 OSL_ENSURE( xNA.is(),
1685 "JarFileIterator::implGetJarFromPackage() - "
1686 "Got no hierarchical name access!" );
1694 if( xNA.is() && o_pExtensionPath !=
nullptr )
1697 sal_Int32 nLastSlash = zipFile.lastIndexOf(
'/' );
1698 if( nLastSlash != -1 )
1699 *o_pExtensionPath = zipFile.copy( 0, nLastSlash );
1701 if( o_pExtensionRegistryPath !=
nullptr )
1703 OUString& rPath = *o_pExtensionPath;
1704 sal_Int32 nLastSlashInPath = rPath.lastIndexOf(
'/', rPath.getLength() - 1 );
1706 *o_pExtensionRegistryPath = xPackage->getURL();
1707 *o_pExtensionRegistryPath += rPath.subView( nLastSlashInPath);
1717 OUString aIndexFolder;
1728 o_rbTemporary =
false;
1729 o_rbExtension =
false;
1742 if( !xHelpPackage.is() )
1746 o_rbExtension =
true;
1754 if( !xHelpPackage.is() )
1758 o_rbExtension =
true;
1766 if( !xHelpPackage.is() )
1770 o_rbExtension =
true;
1775 OSL_FAIL(
"IndexFolderIterator::nextIndexFolder(): Invalid case IteratorState::EndReached" );
1780 return aIndexFolder;
1785 OUString aIndexFolder =
1788 o_rbTemporary =
false;
1789 if( !
m_xSFA->isFolder( aIndexFolder ) )
1793 if(
m_xSFA->isFolder( aLangURL ) )
1796 bool bIsWriteAccess =
false;
1799 OUString aCreateTestFolder = aLangURL +
"CreateTestFolder";
1800 m_xSFA->createFolder( aCreateTestFolder );
1801 if(
m_xSFA->isFolder( aCreateTestFolder ) )
1802 bIsWriteAccess =
true;
1804 m_xSFA->kill( aCreateTestFolder );
1816 sal_Int32 nLastSlash = aLangURL.lastIndexOf(
'/' );
1817 if( nLastSlash != -1 )
1818 aLang = aLangURL.copy( nLastSlash + 1 );
1822 OUString aZipDir = aLangURL;
1823 if( !bIsWriteAccess )
1825 OUString aTempFileURL;
1826 ::osl::FileBase::RC eErr = ::osl::File::createTempFile(
nullptr,
nullptr, &aTempFileURL );
1827 if( eErr == ::osl::FileBase::E_None )
1831 m_xSFA->kill( aTempFileURL );
1836 m_xSFA->createFolder( aTempFileURL );
1838 aZipDir = aTempFileURL;
1839 o_rbTemporary =
true;
1843 HelpIndexer aIndexer(aLang,
"help", aLangURL, aZipDir);
1846 if( bIsWriteAccess )
1849 aIndexFolder = aZipDir +
"/help.idxl";
1857 return aIndexFolder;
1862 size_t nLastSlash = aIndexFolder.rfind(
'/' );
1863 if( nLastSlash != std::u16string_view::npos )
1865 OUString aTmpFolder( aIndexFolder.substr( 0, nLastSlash ) );
1868 m_xSFA->kill( aTmpFolder );
Reference< XComponentContext > m_xContext
FILE * init(int, char **)
const css::lang::Locale & getLocale(bool bResolveSystem=true) const
OUString getLanguage() const
OUString getCountry() const
::std::vector< OUString >::const_iterator getFallback(const ::std::vector< OUString > &rList, const OUString &rReference)
LanguageTag & reset(const OUString &rBcp47LanguageTag)
helpdatafileproxy::Hdf * nextHdf(OUString *o_pExtensionPath=nullptr, OUString *o_pExtensionRegistryPath=nullptr)
helpdatafileproxy::Hdf * implGetHdfFromPackage(const css::uno::Reference< css::deployment::XPackage > &xPackage, OUString *o_pExtensionPath, OUString *o_pExtensionRegistryPath)
css::uno::Reference< css::container::XHierarchicalNameAccess > findJarFileForPath(const OUString &jar, const OUString &Language, const OUString &path, OUString *o_pExtensionPath=nullptr, OUString *o_pExtensionRegistryPath=nullptr)
KeywordInfo * getKeyword(const OUString &Module, const OUString &Language)
OString getImageTheme() const
void cascadingStylesheet(const OUString &Language, OStringBuffer &buffer)
Returns the cascading style sheet used to format the HTML-output.
OUString m_aInstallDirectory
KeywordInfoTable m_aKeywordInfo
helpdatafileproxy::Hdf * getHelpDataFile(std::u16string_view Module, const OUString &Language, bool helpText=false, const OUString *pExtensionPath=nullptr)
OUString getInstallPathAsURL()
ZipFileTable m_aZipFileTable
std::vector< char > m_vCustomCSSDoc
StaticModuleInformation * getStaticInformationForModule(std::u16string_view Module, const OUString &Language)
css::uno::Reference< css::i18n::XCollator > getCollator(std::unique_lock< std::mutex > &rGuard, const OUString &Language)
The following method returns the Collator for the given language-country combination.
OUString m_vReplacement[7]
css::uno::Reference< css::lang::XMultiComponentFactory > m_xSMgr
std::vector< OUString > m_avModules
void changeCSS(const OUString &newStyleSheet)
Changes the stylesheet for further reads.
const std::vector< OUString > & getModuleList(const OUString &Language)
css::uno::Reference< css::container::XHierarchicalNameAccess > jarFile(std::unique_lock< std::mutex > &rGuard, std::u16string_view jar, const OUString &Language)
Has the purpose of forcing the jarfile to stay open.
void replaceName(OUString &oustring) const
Databases(bool showBasic, const OUString &instPath, const OUString &productName, const OUString &productVersion, const OUString &styleSheet, css::uno::Reference< css::uno::XComponentContext > const &xContext)
Input is the installdirectory in system dependent notation.
DatabasesTable m_aDatabases
css::uno::Reference< css::ucb::XSimpleFileAccess3 > m_xSFA
CollatorTable m_aCollatorTable
css::uno::Reference< css::uno::XComponentContext > m_xContext
void setActiveText(const OUString &Module, const OUString &Language, std::u16string_view Id, OStringBuffer &buffer)
Returns the active help text for the given module, language and id.
void setInstallPath(const OUString &aInstallDirectory)
OUString expandURL(const OUString &aURL)
EmptyActiveTextSet m_aEmptyActiveTextSet
bool checkModuleMatchForExtension(std::u16string_view Database, const OUString &doclist)
OUString processLang(const OUString &Language)
Maps a given language-locale combination to language or locale.
OUString getTitle() const
css::uno::Sequence< css::uno::Reference< css::deployment::XPackage > > m_aUserPackagesSeq
css::uno::Reference< css::deployment::XPackage > implGetNextUserHelpPackage(css::uno::Reference< css::deployment::XPackage > &o_xParentPackageBundle)
css::uno::Reference< css::deployment::XPackage > implGetNextSharedHelpPackage(css::uno::Reference< css::deployment::XPackage > &o_xParentPackageBundle)
css::uno::Reference< css::ucb::XSimpleFileAccess3 > m_xSFA
css::uno::Reference< css::uno::XComponentContext > m_xContext
static css::uno::Reference< css::deployment::XPackage > implGetHelpPackageFromPackage(const css::uno::Reference< css::deployment::XPackage > &xPackage, css::uno::Reference< css::deployment::XPackage > &o_xParentPackageBundle)
css::uno::Sequence< css::uno::Reference< css::deployment::XPackage > > m_aBundledPackagesSeq
OUString implGetFileFromPackage(std::u16string_view rFileExtension, const css::uno::Reference< css::deployment::XPackage > &xPackage)
css::uno::Sequence< css::uno::Reference< css::deployment::XPackage > > m_aSharedPackagesSeq
ExtensionIteratorBase(css::uno::Reference< css::uno::XComponentContext > const &xContext, Databases &rDatabases, OUString aInitialModule, OUString aLanguage)
bool m_bBundledPackagesLoaded
OUString m_aInitialModule
void implGetLanguageVectorFromPackage(::std::vector< OUString > &rv, const css::uno::Reference< css::deployment::XPackage > &xPackage)
bool m_bUserPackagesLoaded
css::uno::Reference< css::deployment::XPackage > implGetNextBundledHelpPackage(css::uno::Reference< css::deployment::XPackage > &o_xParentPackageBundle)
bool m_bSharedPackagesLoaded
static ExtensionHelpExistenceMap aHelpExistenceMap
void deleteTempIndexFolder(std::u16string_view aIndexFolder)
OUString nextIndexFolder(bool &o_rbExtension, bool &o_rbTemporary)
OUString implGetIndexFolderFromPackage(bool &o_rbTemporary, const css::uno::Reference< css::deployment::XPackage > &xPackage)
css::uno::Reference< css::container::XHierarchicalNameAccess > nextJarFile(std::unique_lock< std::mutex > &rGuard, css::uno::Reference< css::deployment::XPackage > &o_xParentPackageBundle, OUString *o_pExtensionPath, OUString *o_pExtensionRegistryPath)
css::uno::Reference< css::container::XHierarchicalNameAccess > implGetJarFromPackage(std::unique_lock< std::mutex > &rGuard, const css::uno::Reference< css::deployment::XPackage > &xPackage, OUString *o_pExtensionPath, OUString *o_pExtensionRegistryPath)
OUString implGetDbFileFromPackage(std::unique_lock< std::mutex > &rGuard, const css::uno::Reference< css::deployment::XPackage > &xPackage)
OUString nextDbFile(std::unique_lock< std::mutex > &rGuard, bool &o_rbExtension)
KeywordElement(Databases const *pDatabases, helpdatafileproxy::Hdf *pHdf, OUString key, std::u16string_view ids)
void init(Databases const *pDatabases, helpdatafileproxy::Hdf *pHdf, std::u16string_view ids)
css::uno::Sequence< css::uno::Sequence< OUString > > listId
css::uno::Sequence< css::uno::Sequence< OUString > > listAnchor
css::uno::Sequence< css::uno::Sequence< OUString > > listTitle
KeywordInfo(const std::vector< KeywordElement > &aVector)
css::uno::Sequence< OUString > listKey
const char * getData() const
bool getNextKeyAndValue(HDFData &rKey, HDFData &rValue)
bool getValueForKey(const OString &rKey, HDFData &rValue)
void createHashMap(bool bOptimizeForPerformance)
static bool isLetter(sal_Unicode c)
const char newProdVersion[]
Reference< XMultiServiceFactory > xSMgr
Sequence< PropertyValue > aArguments
std::unique_ptr< sal_Int32[]> pData
std::unordered_map< OUString, bool > ExtensionHelpExistenceMap
css::uno::Sequence< css::uno::Any > InitAnyPropertySequence(::std::initializer_list< ::std::pair< OUString, css::uno::Any > > vInit)
Reference< XComponentContext > getProcessComponentContext()
css::beans::PropertyValue makePropertyValue(const OUString &rName, T &&rValue)
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
const char *const aFileExt[]
constexpr OUStringLiteral ZIP_STORAGE_FORMAT_STRING
KeywordElementComparator(const Reference< XCollator > &xCollator)
bool operator()(const KeywordInfo::KeywordElement &la, const KeywordInfo::KeywordElement &ra) const
Reference< XCollator > m_xCollator
const char aHelpMediaType[]