1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_connectivity.hxx" 30*cdf0e10cSrcweir #include "resource/sharedresources.hxx" 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 33*cdf0e10cSrcweir #include <comphelper/officeresourcebundle.hxx> 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir /** === begin UNO includes === **/ 36*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 37*cdf0e10cSrcweir #include <com/sun/star/uno/XComponentContext.hpp> 38*cdf0e10cSrcweir /** === end UNO includes === **/ 39*cdf0e10cSrcweir 40*cdf0e10cSrcweir #include <tools/diagnose_ex.h> 41*cdf0e10cSrcweir #include <osl/diagnose.h> 42*cdf0e10cSrcweir 43*cdf0e10cSrcweir //........................................................................ 44*cdf0e10cSrcweir namespace connectivity 45*cdf0e10cSrcweir { 46*cdf0e10cSrcweir //........................................................................ 47*cdf0e10cSrcweir 48*cdf0e10cSrcweir /** === begin UNO using === **/ 49*cdf0e10cSrcweir using ::com::sun::star::uno::Reference; 50*cdf0e10cSrcweir using ::com::sun::star::beans::XPropertySet; 51*cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY_THROW; 52*cdf0e10cSrcweir using ::com::sun::star::uno::XComponentContext; 53*cdf0e10cSrcweir using ::com::sun::star::uno::Exception; 54*cdf0e10cSrcweir /** === end UNO using === **/ 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir //==================================================================== 57*cdf0e10cSrcweir //= SharedResources_Impl 58*cdf0e10cSrcweir //==================================================================== 59*cdf0e10cSrcweir class SharedResources_Impl 60*cdf0e10cSrcweir { 61*cdf0e10cSrcweir private: 62*cdf0e10cSrcweir static SharedResources_Impl* s_pInstance; 63*cdf0e10cSrcweir static oslInterlockedCount s_nClients; 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir private: 66*cdf0e10cSrcweir ::std::auto_ptr< ::comphelper::OfficeResourceBundle > 67*cdf0e10cSrcweir m_pResourceBundle; 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir public: 70*cdf0e10cSrcweir static void registerClient(); 71*cdf0e10cSrcweir static void revokeClient(); 72*cdf0e10cSrcweir 73*cdf0e10cSrcweir static SharedResources_Impl& 74*cdf0e10cSrcweir getInstance(); 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir ::rtl::OUString getResourceString( ResourceId _nId ); 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir private: 79*cdf0e10cSrcweir SharedResources_Impl(); 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir static ::osl::Mutex& getMutex() 82*cdf0e10cSrcweir { 83*cdf0e10cSrcweir static ::osl::Mutex s_aMutex; 84*cdf0e10cSrcweir return s_aMutex; 85*cdf0e10cSrcweir } 86*cdf0e10cSrcweir }; 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir //-------------------------------------------------------------------- 89*cdf0e10cSrcweir SharedResources_Impl* SharedResources_Impl::s_pInstance( NULL ); 90*cdf0e10cSrcweir oslInterlockedCount SharedResources_Impl::s_nClients( 0 ); 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir //-------------------------------------------------------------------- 93*cdf0e10cSrcweir SharedResources_Impl::SharedResources_Impl() 94*cdf0e10cSrcweir { 95*cdf0e10cSrcweir try 96*cdf0e10cSrcweir { 97*cdf0e10cSrcweir Reference< XPropertySet > xFactoryProps( 98*cdf0e10cSrcweir ::comphelper::getProcessServiceFactory(), UNO_QUERY_THROW ); 99*cdf0e10cSrcweir Reference< XComponentContext > xContext( 100*cdf0e10cSrcweir xFactoryProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ) ), 101*cdf0e10cSrcweir UNO_QUERY_THROW 102*cdf0e10cSrcweir ); 103*cdf0e10cSrcweir m_pResourceBundle.reset( new ::comphelper::OfficeResourceBundle( xContext, "cnr" ) ); 104*cdf0e10cSrcweir } 105*cdf0e10cSrcweir catch( const Exception& ) 106*cdf0e10cSrcweir { 107*cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 108*cdf0e10cSrcweir } 109*cdf0e10cSrcweir } 110*cdf0e10cSrcweir 111*cdf0e10cSrcweir //-------------------------------------------------------------------- 112*cdf0e10cSrcweir ::rtl::OUString SharedResources_Impl::getResourceString( ResourceId _nId ) 113*cdf0e10cSrcweir { 114*cdf0e10cSrcweir if ( m_pResourceBundle.get() == NULL ) 115*cdf0e10cSrcweir // this should never happen, but we gracefully ignore it. It has been reported 116*cdf0e10cSrcweir // in the constructor in non-product builds. 117*cdf0e10cSrcweir return ::rtl::OUString(); 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir return m_pResourceBundle->loadString( _nId ); 120*cdf0e10cSrcweir } 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir //-------------------------------------------------------------------- 123*cdf0e10cSrcweir void SharedResources_Impl::registerClient() 124*cdf0e10cSrcweir { 125*cdf0e10cSrcweir osl_incrementInterlockedCount( &s_nClients ); 126*cdf0e10cSrcweir } 127*cdf0e10cSrcweir 128*cdf0e10cSrcweir //-------------------------------------------------------------------- 129*cdf0e10cSrcweir void SharedResources_Impl::revokeClient() 130*cdf0e10cSrcweir { 131*cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 132*cdf0e10cSrcweir if ( 0 == osl_decrementInterlockedCount( &s_nClients ) ) 133*cdf0e10cSrcweir { 134*cdf0e10cSrcweir delete s_pInstance; 135*cdf0e10cSrcweir s_pInstance = NULL; 136*cdf0e10cSrcweir } 137*cdf0e10cSrcweir } 138*cdf0e10cSrcweir 139*cdf0e10cSrcweir //-------------------------------------------------------------------- 140*cdf0e10cSrcweir SharedResources_Impl& SharedResources_Impl::getInstance() 141*cdf0e10cSrcweir { 142*cdf0e10cSrcweir ::osl::MutexGuard aGuard( getMutex() ); 143*cdf0e10cSrcweir OSL_ENSURE( s_nClients > 0, "SharedResources_Impl::getInstance: no active clients!" ); 144*cdf0e10cSrcweir 145*cdf0e10cSrcweir if ( !s_pInstance ) 146*cdf0e10cSrcweir s_pInstance = new SharedResources_Impl; 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir return *s_pInstance; 149*cdf0e10cSrcweir } 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir //==================================================================== 152*cdf0e10cSrcweir //= helpers 153*cdf0e10cSrcweir //==================================================================== 154*cdf0e10cSrcweir namespace 155*cdf0e10cSrcweir { 156*cdf0e10cSrcweir size_t lcl_substitute( ::rtl::OUString& _inout_rString, 157*cdf0e10cSrcweir const sal_Char* _pAsciiPattern, const ::rtl::OUString& _rReplace ) 158*cdf0e10cSrcweir { 159*cdf0e10cSrcweir size_t nOccurences = 0; 160*cdf0e10cSrcweir 161*cdf0e10cSrcweir ::rtl::OUString sPattern( ::rtl::OUString::createFromAscii( _pAsciiPattern ) ); 162*cdf0e10cSrcweir sal_Int32 nIndex = 0; 163*cdf0e10cSrcweir while ( ( nIndex = _inout_rString.indexOf( sPattern ) ) > -1 ) 164*cdf0e10cSrcweir { 165*cdf0e10cSrcweir ++nOccurences; 166*cdf0e10cSrcweir _inout_rString = _inout_rString.replaceAt( nIndex, sPattern.getLength(), _rReplace ); 167*cdf0e10cSrcweir } 168*cdf0e10cSrcweir 169*cdf0e10cSrcweir return nOccurences; 170*cdf0e10cSrcweir } 171*cdf0e10cSrcweir } 172*cdf0e10cSrcweir 173*cdf0e10cSrcweir //==================================================================== 174*cdf0e10cSrcweir //= SharedResources 175*cdf0e10cSrcweir //==================================================================== 176*cdf0e10cSrcweir //-------------------------------------------------------------------- 177*cdf0e10cSrcweir SharedResources::SharedResources() 178*cdf0e10cSrcweir { 179*cdf0e10cSrcweir SharedResources_Impl::registerClient(); 180*cdf0e10cSrcweir } 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir //-------------------------------------------------------------------- 183*cdf0e10cSrcweir SharedResources::~SharedResources() 184*cdf0e10cSrcweir { 185*cdf0e10cSrcweir SharedResources_Impl::revokeClient(); 186*cdf0e10cSrcweir } 187*cdf0e10cSrcweir 188*cdf0e10cSrcweir //-------------------------------------------------------------------- 189*cdf0e10cSrcweir ::rtl::OUString SharedResources::getResourceString( ResourceId _nResId ) const 190*cdf0e10cSrcweir { 191*cdf0e10cSrcweir return SharedResources_Impl::getInstance().getResourceString( _nResId ); 192*cdf0e10cSrcweir } 193*cdf0e10cSrcweir 194*cdf0e10cSrcweir //-------------------------------------------------------------------- 195*cdf0e10cSrcweir ::rtl::OUString SharedResources::getResourceStringWithSubstitution( ResourceId _nResId, 196*cdf0e10cSrcweir const sal_Char* _pAsciiPatternToReplace, const ::rtl::OUString& _rStringToSubstitute ) const 197*cdf0e10cSrcweir { 198*cdf0e10cSrcweir ::rtl::OUString sString( SharedResources_Impl::getInstance().getResourceString( _nResId ) ); 199*cdf0e10cSrcweir OSL_VERIFY( lcl_substitute( sString, _pAsciiPatternToReplace, _rStringToSubstitute ) ); 200*cdf0e10cSrcweir return sString; 201*cdf0e10cSrcweir } 202*cdf0e10cSrcweir 203*cdf0e10cSrcweir //-------------------------------------------------------------------- 204*cdf0e10cSrcweir ::rtl::OUString SharedResources::getResourceStringWithSubstitution( ResourceId _nResId, 205*cdf0e10cSrcweir const sal_Char* _pAsciiPatternToReplace1, const ::rtl::OUString& _rStringToSubstitute1, 206*cdf0e10cSrcweir const sal_Char* _pAsciiPatternToReplace2, const ::rtl::OUString& _rStringToSubstitute2 ) const 207*cdf0e10cSrcweir { 208*cdf0e10cSrcweir ::rtl::OUString sString( SharedResources_Impl::getInstance().getResourceString( _nResId ) ); 209*cdf0e10cSrcweir OSL_VERIFY( lcl_substitute( sString, _pAsciiPatternToReplace1, _rStringToSubstitute1 ) ); 210*cdf0e10cSrcweir OSL_VERIFY( lcl_substitute( sString, _pAsciiPatternToReplace2, _rStringToSubstitute2 ) ); 211*cdf0e10cSrcweir return sString; 212*cdf0e10cSrcweir } 213*cdf0e10cSrcweir 214*cdf0e10cSrcweir //-------------------------------------------------------------------- 215*cdf0e10cSrcweir ::rtl::OUString SharedResources::getResourceStringWithSubstitution( ResourceId _nResId, 216*cdf0e10cSrcweir const sal_Char* _pAsciiPatternToReplace1, const ::rtl::OUString& _rStringToSubstitute1, 217*cdf0e10cSrcweir const sal_Char* _pAsciiPatternToReplace2, const ::rtl::OUString& _rStringToSubstitute2, 218*cdf0e10cSrcweir const sal_Char* _pAsciiPatternToReplace3, const ::rtl::OUString& _rStringToSubstitute3 ) const 219*cdf0e10cSrcweir { 220*cdf0e10cSrcweir ::rtl::OUString sString( SharedResources_Impl::getInstance().getResourceString( _nResId ) ); 221*cdf0e10cSrcweir OSL_VERIFY( lcl_substitute( sString, _pAsciiPatternToReplace1, _rStringToSubstitute1 ) ); 222*cdf0e10cSrcweir OSL_VERIFY( lcl_substitute( sString, _pAsciiPatternToReplace2, _rStringToSubstitute2 ) ); 223*cdf0e10cSrcweir OSL_VERIFY( lcl_substitute( sString, _pAsciiPatternToReplace3, _rStringToSubstitute3 ) ); 224*cdf0e10cSrcweir return sString; 225*cdf0e10cSrcweir } 226*cdf0e10cSrcweir //-------------------------------------------------------------------- 227*cdf0e10cSrcweir ::rtl::OUString SharedResources::getResourceStringWithSubstitution( ResourceId _nResId, 228*cdf0e10cSrcweir const ::std::list< ::std::pair<const sal_Char* , ::rtl::OUString > > _aStringToSubstitutes) const 229*cdf0e10cSrcweir { 230*cdf0e10cSrcweir ::rtl::OUString sString( SharedResources_Impl::getInstance().getResourceString( _nResId ) ); 231*cdf0e10cSrcweir ::std::list< ::std::pair<const sal_Char* , ::rtl::OUString > >::const_iterator aIter = _aStringToSubstitutes.begin(); 232*cdf0e10cSrcweir ::std::list< ::std::pair<const sal_Char* , ::rtl::OUString > >::const_iterator aEnd = _aStringToSubstitutes.end(); 233*cdf0e10cSrcweir for(;aIter != aEnd; ++aIter) 234*cdf0e10cSrcweir OSL_VERIFY( lcl_substitute( sString, aIter->first, aIter->second ) ); 235*cdf0e10cSrcweir 236*cdf0e10cSrcweir return sString; 237*cdf0e10cSrcweir } 238*cdf0e10cSrcweir 239*cdf0e10cSrcweir //........................................................................ 240*cdf0e10cSrcweir } // namespace connectivity 241*cdf0e10cSrcweir //........................................................................ 242*cdf0e10cSrcweir 243