Files
libreoffice/unotools/source/misc/syslocale.cxx
Stephan Bergmann 6ff2d84ade Various #include <sal/log.hxx> fixups
rtl/string.hxx and rtl/ustring.hxx both unnecessarily #include <sal/log.hxx>
(and don't make use of it themselves), but many other files happen to depend on
it.  Cleaned up some, but something like

  grep -FwL sal/log.hxx $(git grep -Elw \
    'SAL_INFO|SAL_INFO_IF|SAL_WARN|SAL_WARN_IF') -- \*.cxx)

shows lots more files that potentially need fixing before the include can be
removed from rtl/string.hxx and rtl/ustring.hxx.

Change-Id: Ibf033363e83d37851776f392dc0b077381cd8b90
2015-04-22 09:57:47 +02:00

222 lines
6.8 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <sal/config.h>
#include <sal/log.hxx>
#include <unotools/syslocale.hxx>
#include <unotools/syslocaleoptions.hxx>
#include <comphelper/processfactory.hxx>
#include <rtl/tencinfo.h>
#include <rtl/locale.h>
#include <osl/thread.h>
#include <osl/nlsupport.h>
#include <vector>
using namespace osl;
using namespace com::sun::star;
SvtSysLocale_Impl* SvtSysLocale::pImpl = NULL;
sal_Int32 SvtSysLocale::nRefCount = 0;
class SvtSysLocale_Impl : public utl::ConfigurationListener
{
public:
SvtSysLocaleOptions aSysLocaleOptions;
LocaleDataWrapper* pLocaleData;
CharClass* pCharClass;
SvtSysLocale_Impl();
virtual ~SvtSysLocale_Impl();
CharClass* GetCharClass();
virtual void ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 ) SAL_OVERRIDE;
private:
void setDateAcceptancePatternsConfig();
};
SvtSysLocale_Impl::SvtSysLocale_Impl() : pCharClass(NULL)
{
pLocaleData = new LocaleDataWrapper( aSysLocaleOptions.GetRealLanguageTag() );
setDateAcceptancePatternsConfig();
// listen for further changes
aSysLocaleOptions.AddListener( this );
}
SvtSysLocale_Impl::~SvtSysLocale_Impl()
{
aSysLocaleOptions.RemoveListener( this );
delete pCharClass;
delete pLocaleData;
}
CharClass* SvtSysLocale_Impl::GetCharClass()
{
if ( !pCharClass )
pCharClass = new CharClass( aSysLocaleOptions.GetRealLanguageTag() );
return pCharClass;
}
void SvtSysLocale_Impl::ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 nHint )
{
MutexGuard aGuard( SvtSysLocale::GetMutex() );
if ( nHint & SYSLOCALEOPTIONS_HINT_LOCALE )
{
const LanguageTag& rLanguageTag = aSysLocaleOptions.GetRealLanguageTag();
pLocaleData->setLanguageTag( rLanguageTag );
GetCharClass()->setLanguageTag( rLanguageTag );
}
if ( nHint & SYSLOCALEOPTIONS_HINT_DATEPATTERNS )
{
setDateAcceptancePatternsConfig();
}
}
void SvtSysLocale_Impl::setDateAcceptancePatternsConfig()
{
OUString aStr( aSysLocaleOptions.GetDatePatternsConfigString());
if (aStr.isEmpty())
pLocaleData->setDateAcceptancePatterns( uno::Sequence<OUString>()); // reset
else
{
::std::vector< OUString > aVec;
for (sal_Int32 nIndex = 0; nIndex >= 0; /*nop*/)
{
OUString aTok( aStr.getToken( 0, ';', nIndex));
if (!aTok.isEmpty())
aVec.push_back( aTok);
}
uno::Sequence< OUString > aSeq( aVec.size());
for (sal_Int32 i=0; i < aSeq.getLength(); ++i)
aSeq[i] = aVec[i];
pLocaleData->setDateAcceptancePatterns( aSeq);
}
}
SvtSysLocale::SvtSysLocale()
{
MutexGuard aGuard( GetMutex() );
if ( !pImpl )
pImpl = new SvtSysLocale_Impl;
++nRefCount;
}
SvtSysLocale::~SvtSysLocale()
{
MutexGuard aGuard( GetMutex() );
if ( !--nRefCount )
{
delete pImpl;
pImpl = NULL;
}
}
// static
Mutex& SvtSysLocale::GetMutex()
{
static Mutex* pMutex = NULL;
if( !pMutex )
{
MutexGuard aGuard( Mutex::getGlobalMutex() );
if( !pMutex )
{
// #i77768# Due to a static reference in the toolkit lib
// we need a mutex that lives longer than the svl library.
// Otherwise the dtor would use a destructed mutex!!
pMutex = new Mutex;
}
}
return *pMutex;
}
const LocaleDataWrapper& SvtSysLocale::GetLocaleData() const
{
return *(pImpl->pLocaleData);
}
const LocaleDataWrapper* SvtSysLocale::GetLocaleDataPtr() const
{
return pImpl->pLocaleData;
}
const CharClass& SvtSysLocale::GetCharClass() const
{
return *(pImpl->GetCharClass());
}
const CharClass* SvtSysLocale::GetCharClassPtr() const
{
return pImpl->GetCharClass();
}
SvtSysLocaleOptions& SvtSysLocale::GetOptions() const
{
return pImpl->aSysLocaleOptions;
}
const LanguageTag& SvtSysLocale::GetLanguageTag() const
{
return pImpl->aSysLocaleOptions.GetRealLanguageTag();
}
const LanguageTag& SvtSysLocale::GetUILanguageTag() const
{
return pImpl->aSysLocaleOptions.GetRealUILanguageTag();
}
// static
rtl_TextEncoding SvtSysLocale::GetBestMimeEncoding()
{
const sal_Char* pCharSet = rtl_getBestMimeCharsetFromTextEncoding(
osl_getThreadTextEncoding() );
if ( !pCharSet )
{
// If the system locale is unknown to us, e.g. LC_ALL=xx, match the UI
// language if possible.
SvtSysLocale aSysLocale;
const LanguageTag& rLanguageTag = aSysLocale.GetUILanguageTag();
// Converting blindly to Locale and then to rtl_Locale may feed the
// 'qlt' to rtl_locale_register() and the underlying system locale
// stuff, which doesn't know about it nor about BCP47 in the Variant
// field. So use the real language and for non-pure ISO cases hope for
// the best.. the fallback to UTF-8 should solve these cases nowadays.
/* FIXME-BCP47: the script needs to go in here as well, so actually
* we'd need some variant fiddling or glibc locale string and tweak
* rtl_locale_register() to know about it! But then again the Windows
* implementation still wouldn't know anything about it ... */
SAL_WARN_IF( !rLanguageTag.isIsoLocale(), "unotools.i18n",
"SvtSysLocale::GetBestMimeEncoding - non-ISO UI locale");
rtl_Locale * pLocale = rtl_locale_register( rLanguageTag.getLanguage().getStr(),
rLanguageTag.getCountry().getStr(), OUString().getStr() );
rtl_TextEncoding nEnc = osl_getTextEncodingFromLocale( pLocale );
pCharSet = rtl_getBestMimeCharsetFromTextEncoding( nEnc );
}
rtl_TextEncoding nRet;
if ( pCharSet )
nRet = rtl_getTextEncodingFromMimeCharset( pCharSet );
else
nRet = RTL_TEXTENCODING_UTF8;
return nRet;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */