summaryrefslogtreecommitdiff
path: root/connectivity/source/resource/sharedresources.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'connectivity/source/resource/sharedresources.cxx')
-rw-r--r--connectivity/source/resource/sharedresources.cxx242
1 files changed, 242 insertions, 0 deletions
diff --git a/connectivity/source/resource/sharedresources.cxx b/connectivity/source/resource/sharedresources.cxx
new file mode 100644
index 000000000000..1c27207223c0
--- /dev/null
+++ b/connectivity/source/resource/sharedresources.cxx
@@ -0,0 +1,242 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_connectivity.hxx"
+#include "resource/sharedresources.hxx"
+
+#include <comphelper/processfactory.hxx>
+#include <comphelper/officeresourcebundle.hxx>
+
+/** === begin UNO includes === **/
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+/** === end UNO includes === **/
+
+#include <tools/diagnose_ex.h>
+#include <osl/diagnose.h>
+
+//........................................................................
+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<const sal_Char* , ::rtl::OUString > > _aStringToSubstitutes) const
+ {
+ ::rtl::OUString sString( SharedResources_Impl::getInstance().getResourceString( _nResId ) );
+ ::std::list< ::std::pair<const sal_Char* , ::rtl::OUString > >::const_iterator aIter = _aStringToSubstitutes.begin();
+ ::std::list< ::std::pair<const sal_Char* , ::rtl::OUString > >::const_iterator aEnd = _aStringToSubstitutes.end();
+ for(;aIter != aEnd; ++aIter)
+ OSL_VERIFY( lcl_substitute( sString, aIter->first, aIter->second ) );
+
+ return sString;
+ }
+
+//........................................................................
+} // namespace connectivity
+//........................................................................
+