/************************************************************** * * 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 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_connectivity.hxx" #include "resource/sharedresources.hxx" #include #include /** === begin UNO includes === **/ #include #include /** === end UNO includes === **/ #include #include //........................................................................ namespace connectivity { //........................................................................ /** === begin UNO using === **/ using ::com::sun::star::uno::Reference; using ::com::sun::star::beans::XPropertySet; using ::com::sun::star::uno::UNO_QUERY_THROW; using ::com::sun::star::uno::XComponentContext; using ::com::sun::star::uno::Exception; /** === end UNO using === **/ //==================================================================== //= SharedResources_Impl //==================================================================== class SharedResources_Impl { private: static SharedResources_Impl* s_pInstance; static oslInterlockedCount s_nClients; private: ::std::auto_ptr< ::comphelper::OfficeResourceBundle > m_pResourceBundle; public: static void registerClient(); static void revokeClient(); static SharedResources_Impl& getInstance(); ::rtl::OUString getResourceString( ResourceId _nId ); private: SharedResources_Impl(); static ::osl::Mutex& getMutex() { static ::osl::Mutex s_aMutex; return s_aMutex; } }; //-------------------------------------------------------------------- SharedResources_Impl* SharedResources_Impl::s_pInstance( NULL ); oslInterlockedCount SharedResources_Impl::s_nClients( 0 ); //-------------------------------------------------------------------- SharedResources_Impl::SharedResources_Impl() { try { Reference< XPropertySet > xFactoryProps( ::comphelper::getProcessServiceFactory(), UNO_QUERY_THROW ); Reference< XComponentContext > xContext( xFactoryProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ) ), UNO_QUERY_THROW ); m_pResourceBundle.reset( new ::comphelper::OfficeResourceBundle( xContext, "cnr" ) ); } catch( const Exception& ) { DBG_UNHANDLED_EXCEPTION(); } } //-------------------------------------------------------------------- ::rtl::OUString SharedResources_Impl::getResourceString( ResourceId _nId ) { if ( m_pResourceBundle.get() == NULL ) // this should never happen, but we gracefully ignore it. It has been reported // in the constructor in non-product builds. return ::rtl::OUString(); return m_pResourceBundle->loadString( _nId ); } //-------------------------------------------------------------------- void SharedResources_Impl::registerClient() { osl_incrementInterlockedCount( &s_nClients ); } //-------------------------------------------------------------------- void SharedResources_Impl::revokeClient() { ::osl::MutexGuard aGuard( getMutex() ); if ( 0 == osl_decrementInterlockedCount( &s_nClients ) ) { delete s_pInstance; s_pInstance = NULL; } } //-------------------------------------------------------------------- SharedResources_Impl& SharedResources_Impl::getInstance() { ::osl::MutexGuard aGuard( getMutex() ); OSL_ENSURE( s_nClients > 0, "SharedResources_Impl::getInstance: no active clients!" ); if ( !s_pInstance ) s_pInstance = new SharedResources_Impl; return *s_pInstance; } //==================================================================== //= helpers //==================================================================== namespace { size_t lcl_substitute( ::rtl::OUString& _inout_rString, const sal_Char* _pAsciiPattern, const ::rtl::OUString& _rReplace ) { size_t nOccurences = 0; ::rtl::OUString sPattern( ::rtl::OUString::createFromAscii( _pAsciiPattern ) ); sal_Int32 nIndex = 0; while ( ( nIndex = _inout_rString.indexOf( sPattern ) ) > -1 ) { ++nOccurences; _inout_rString = _inout_rString.replaceAt( nIndex, sPattern.getLength(), _rReplace ); } return nOccurences; } } //==================================================================== //= SharedResources //==================================================================== //-------------------------------------------------------------------- SharedResources::SharedResources() { SharedResources_Impl::registerClient(); } //-------------------------------------------------------------------- SharedResources::~SharedResources() { SharedResources_Impl::revokeClient(); } //-------------------------------------------------------------------- ::rtl::OUString SharedResources::getResourceString( ResourceId _nResId ) const { return SharedResources_Impl::getInstance().getResourceString( _nResId ); } //-------------------------------------------------------------------- ::rtl::OUString SharedResources::getResourceStringWithSubstitution( ResourceId _nResId, const sal_Char* _pAsciiPatternToReplace, const ::rtl::OUString& _rStringToSubstitute ) const { ::rtl::OUString sString( SharedResources_Impl::getInstance().getResourceString( _nResId ) ); OSL_VERIFY( lcl_substitute( sString, _pAsciiPatternToReplace, _rStringToSubstitute ) ); return sString; } //-------------------------------------------------------------------- ::rtl::OUString SharedResources::getResourceStringWithSubstitution( ResourceId _nResId, const sal_Char* _pAsciiPatternToReplace1, const ::rtl::OUString& _rStringToSubstitute1, const sal_Char* _pAsciiPatternToReplace2, const ::rtl::OUString& _rStringToSubstitute2 ) const { ::rtl::OUString sString( SharedResources_Impl::getInstance().getResourceString( _nResId ) ); OSL_VERIFY( lcl_substitute( sString, _pAsciiPatternToReplace1, _rStringToSubstitute1 ) ); OSL_VERIFY( lcl_substitute( sString, _pAsciiPatternToReplace2, _rStringToSubstitute2 ) ); return sString; } //-------------------------------------------------------------------- ::rtl::OUString SharedResources::getResourceStringWithSubstitution( ResourceId _nResId, const sal_Char* _pAsciiPatternToReplace1, const ::rtl::OUString& _rStringToSubstitute1, const sal_Char* _pAsciiPatternToReplace2, const ::rtl::OUString& _rStringToSubstitute2, const sal_Char* _pAsciiPatternToReplace3, const ::rtl::OUString& _rStringToSubstitute3 ) const { ::rtl::OUString sString( SharedResources_Impl::getInstance().getResourceString( _nResId ) ); OSL_VERIFY( lcl_substitute( sString, _pAsciiPatternToReplace1, _rStringToSubstitute1 ) ); OSL_VERIFY( lcl_substitute( sString, _pAsciiPatternToReplace2, _rStringToSubstitute2 ) ); OSL_VERIFY( lcl_substitute( sString, _pAsciiPatternToReplace3, _rStringToSubstitute3 ) ); return sString; } //-------------------------------------------------------------------- ::rtl::OUString SharedResources::getResourceStringWithSubstitution( ResourceId _nResId, const ::std::list< ::std::pair > _aStringToSubstitutes) const { ::rtl::OUString sString( SharedResources_Impl::getInstance().getResourceString( _nResId ) ); ::std::list< ::std::pair >::const_iterator aIter = _aStringToSubstitutes.begin(); ::std::list< ::std::pair >::const_iterator aEnd = _aStringToSubstitutes.end(); for(;aIter != aEnd; ++aIter) OSL_VERIFY( lcl_substitute( sString, aIter->first, aIter->second ) ); return sString; } //........................................................................ } // namespace connectivity //........................................................................