1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_extensions.hxx" 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #ifndef EXTENSIONS_SOURCE_RESOURCE_OOORESOURCELOADER_CXX 28*b1cdbd2cSJim Jagielski #define EXTENSIONS_SOURCE_RESOURCE_OOORESOURCELOADER_CXX 29*b1cdbd2cSJim Jagielski #include "res_services.hxx" 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/ 32*b1cdbd2cSJim Jagielski #include <com/sun/star/resource/XResourceBundleLoader.hpp> 33*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp> 34*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XComponentContext.hpp> 35*b1cdbd2cSJim Jagielski /** === end UNO includes === **/ 36*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx> 37*b1cdbd2cSJim Jagielski #include <tools/simplerm.hxx> 38*b1cdbd2cSJim Jagielski #include <tools/rcid.h> 39*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx> 40*b1cdbd2cSJim Jagielski #include <cppuhelper/weakref.hxx> 41*b1cdbd2cSJim Jagielski 42*b1cdbd2cSJim Jagielski #include <boost/shared_ptr.hpp> 43*b1cdbd2cSJim Jagielski #include <map> 44*b1cdbd2cSJim Jagielski 45*b1cdbd2cSJim Jagielski //........................................................................ 46*b1cdbd2cSJim Jagielski namespace res 47*b1cdbd2cSJim Jagielski { 48*b1cdbd2cSJim Jagielski //........................................................................ 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielski /** === begin UNO using === **/ 51*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference; 52*b1cdbd2cSJim Jagielski using ::com::sun::star::resource::XResourceBundleLoader; 53*b1cdbd2cSJim Jagielski using ::com::sun::star::resource::XResourceBundle; 54*b1cdbd2cSJim Jagielski using ::com::sun::star::resource::MissingResourceException; 55*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::XComponentContext; 56*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Sequence; 57*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::XInterface; 58*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::RuntimeException; 59*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::Locale; 60*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Any; 61*b1cdbd2cSJim Jagielski using ::com::sun::star::container::NoSuchElementException; 62*b1cdbd2cSJim Jagielski using ::com::sun::star::lang::WrappedTargetException; 63*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Type; 64*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::WeakReference; 65*b1cdbd2cSJim Jagielski /** === end UNO using === **/ 66*b1cdbd2cSJim Jagielski 67*b1cdbd2cSJim Jagielski //==================================================================== 68*b1cdbd2cSJim Jagielski //= helper 69*b1cdbd2cSJim Jagielski //==================================================================== 70*b1cdbd2cSJim Jagielski typedef ::std::pair< ::rtl::OUString, Locale > ResourceBundleDescriptor; 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski struct ResourceBundleDescriptorLess : public ::std::binary_function< ResourceBundleDescriptor, ResourceBundleDescriptor, bool > 73*b1cdbd2cSJim Jagielski { operator ()res::ResourceBundleDescriptorLess74*b1cdbd2cSJim Jagielski bool operator()( const ResourceBundleDescriptor& _lhs, const ResourceBundleDescriptor& _rhs ) const 75*b1cdbd2cSJim Jagielski { 76*b1cdbd2cSJim Jagielski if ( _lhs.first < _rhs.first ) 77*b1cdbd2cSJim Jagielski return true; 78*b1cdbd2cSJim Jagielski if ( _lhs.second.Language < _rhs.second.Language ) 79*b1cdbd2cSJim Jagielski return true; 80*b1cdbd2cSJim Jagielski if ( _lhs.second.Country < _rhs.second.Country ) 81*b1cdbd2cSJim Jagielski return true; 82*b1cdbd2cSJim Jagielski if ( _lhs.second.Variant < _rhs.second.Variant ) 83*b1cdbd2cSJim Jagielski return true; 84*b1cdbd2cSJim Jagielski return false; 85*b1cdbd2cSJim Jagielski } 86*b1cdbd2cSJim Jagielski }; 87*b1cdbd2cSJim Jagielski 88*b1cdbd2cSJim Jagielski //==================================================================== 89*b1cdbd2cSJim Jagielski //= OpenOfficeResourceLoader 90*b1cdbd2cSJim Jagielski //==================================================================== 91*b1cdbd2cSJim Jagielski typedef ::cppu::WeakImplHelper1 < XResourceBundleLoader 92*b1cdbd2cSJim Jagielski > OpenOfficeResourceLoader_Base; 93*b1cdbd2cSJim Jagielski class OpenOfficeResourceLoader : public OpenOfficeResourceLoader_Base 94*b1cdbd2cSJim Jagielski { 95*b1cdbd2cSJim Jagielski private: 96*b1cdbd2cSJim Jagielski typedef ::std::map< ResourceBundleDescriptor, WeakReference< XResourceBundle >, ResourceBundleDescriptorLess > 97*b1cdbd2cSJim Jagielski ResourceBundleCache; 98*b1cdbd2cSJim Jagielski 99*b1cdbd2cSJim Jagielski private: 100*b1cdbd2cSJim Jagielski Reference< XComponentContext > m_xContext; 101*b1cdbd2cSJim Jagielski ::osl::Mutex m_aMutex; 102*b1cdbd2cSJim Jagielski ResourceBundleCache m_aBundleCache; 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski protected: 105*b1cdbd2cSJim Jagielski OpenOfficeResourceLoader( const Reference< XComponentContext >& _rxContext ); 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski public: 108*b1cdbd2cSJim Jagielski static Sequence< ::rtl::OUString > getSupportedServiceNames_static(); 109*b1cdbd2cSJim Jagielski static ::rtl::OUString getImplementationName_static(); 110*b1cdbd2cSJim Jagielski static ::rtl::OUString getSingletonName_static(); 111*b1cdbd2cSJim Jagielski static Reference< XInterface > Create( const Reference< XComponentContext >& _rxContext ); 112*b1cdbd2cSJim Jagielski 113*b1cdbd2cSJim Jagielski // XResourceBundleLoader 114*b1cdbd2cSJim Jagielski virtual Reference< XResourceBundle > SAL_CALL loadBundle_Default( const ::rtl::OUString& aBaseName ) throw (MissingResourceException, RuntimeException); 115*b1cdbd2cSJim Jagielski virtual Reference< XResourceBundle > SAL_CALL loadBundle( const ::rtl::OUString& abaseName, const Locale& aLocale ) throw (MissingResourceException, RuntimeException); 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski private: 118*b1cdbd2cSJim Jagielski OpenOfficeResourceLoader(); // never implemented 119*b1cdbd2cSJim Jagielski OpenOfficeResourceLoader( const OpenOfficeResourceLoader& ); // never implemented 120*b1cdbd2cSJim Jagielski OpenOfficeResourceLoader& operator=( const OpenOfficeResourceLoader& ); // never implemented 121*b1cdbd2cSJim Jagielski }; 122*b1cdbd2cSJim Jagielski 123*b1cdbd2cSJim Jagielski //==================================================================== 124*b1cdbd2cSJim Jagielski //= IResourceType 125*b1cdbd2cSJim Jagielski //==================================================================== 126*b1cdbd2cSJim Jagielski /** encapsulates access to a fixed resource type 127*b1cdbd2cSJim Jagielski */ 128*b1cdbd2cSJim Jagielski class IResourceType 129*b1cdbd2cSJim Jagielski { 130*b1cdbd2cSJim Jagielski public: 131*b1cdbd2cSJim Jagielski /** returns the RESOURCE_TYPE associated with this instance 132*b1cdbd2cSJim Jagielski */ 133*b1cdbd2cSJim Jagielski virtual RESOURCE_TYPE getResourceType() const = 0; 134*b1cdbd2cSJim Jagielski 135*b1cdbd2cSJim Jagielski /** reads a single resource from the given resource manager 136*b1cdbd2cSJim Jagielski @param _resourceManager 137*b1cdbd2cSJim Jagielski the resource manager to read from 138*b1cdbd2cSJim Jagielski @param _resourceId 139*b1cdbd2cSJim Jagielski the id of the resource to read 140*b1cdbd2cSJim Jagielski @return 141*b1cdbd2cSJim Jagielski the required resource 142*b1cdbd2cSJim Jagielski @precond 143*b1cdbd2cSJim Jagielski the caler checked via <code>_resourceManager.IsAvailable( getResourceType(), _resourceId )</code> 144*b1cdbd2cSJim Jagielski that the required resource really exists 145*b1cdbd2cSJim Jagielski */ 146*b1cdbd2cSJim Jagielski virtual Any getResource( SimpleResMgr& _resourceManager, sal_Int32 _resourceId ) const = 0; 147*b1cdbd2cSJim Jagielski ~IResourceType()148*b1cdbd2cSJim Jagielski virtual ~IResourceType() { }; 149*b1cdbd2cSJim Jagielski }; 150*b1cdbd2cSJim Jagielski 151*b1cdbd2cSJim Jagielski //==================================================================== 152*b1cdbd2cSJim Jagielski //= StringResourceAccess 153*b1cdbd2cSJim Jagielski //==================================================================== 154*b1cdbd2cSJim Jagielski class StringResourceAccess : public IResourceType 155*b1cdbd2cSJim Jagielski { 156*b1cdbd2cSJim Jagielski public: 157*b1cdbd2cSJim Jagielski StringResourceAccess(); 158*b1cdbd2cSJim Jagielski 159*b1cdbd2cSJim Jagielski // IResourceType 160*b1cdbd2cSJim Jagielski virtual RESOURCE_TYPE getResourceType() const; 161*b1cdbd2cSJim Jagielski virtual Any getResource( SimpleResMgr& _resourceManager, sal_Int32 _resourceId ) const; 162*b1cdbd2cSJim Jagielski }; 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- StringResourceAccess()165*b1cdbd2cSJim Jagielski StringResourceAccess::StringResourceAccess() 166*b1cdbd2cSJim Jagielski { 167*b1cdbd2cSJim Jagielski } 168*b1cdbd2cSJim Jagielski 169*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getResourceType() const170*b1cdbd2cSJim Jagielski RESOURCE_TYPE StringResourceAccess::getResourceType() const 171*b1cdbd2cSJim Jagielski { 172*b1cdbd2cSJim Jagielski return RSC_STRING; 173*b1cdbd2cSJim Jagielski } 174*b1cdbd2cSJim Jagielski 175*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getResource(SimpleResMgr & _resourceManager,sal_Int32 _resourceId) const176*b1cdbd2cSJim Jagielski Any StringResourceAccess::getResource( SimpleResMgr& _resourceManager, sal_Int32 _resourceId ) const 177*b1cdbd2cSJim Jagielski { 178*b1cdbd2cSJim Jagielski OSL_PRECOND( _resourceManager.IsAvailable( getResourceType(), _resourceId ), "StringResourceAccess::getResource: precondition not met!" ); 179*b1cdbd2cSJim Jagielski Any aResource; 180*b1cdbd2cSJim Jagielski aResource <<= ::rtl::OUString( _resourceManager.ReadString( _resourceId ) ); 181*b1cdbd2cSJim Jagielski return aResource; 182*b1cdbd2cSJim Jagielski } 183*b1cdbd2cSJim Jagielski 184*b1cdbd2cSJim Jagielski //==================================================================== 185*b1cdbd2cSJim Jagielski //= OpenOfficeResourceBundle 186*b1cdbd2cSJim Jagielski //==================================================================== 187*b1cdbd2cSJim Jagielski typedef ::cppu::WeakImplHelper1 < XResourceBundle 188*b1cdbd2cSJim Jagielski > OpenOfficeResourceBundle_Base; 189*b1cdbd2cSJim Jagielski class OpenOfficeResourceBundle : public OpenOfficeResourceBundle_Base 190*b1cdbd2cSJim Jagielski { 191*b1cdbd2cSJim Jagielski private: 192*b1cdbd2cSJim Jagielski typedef ::boost::shared_ptr< IResourceType > ResourceTypePtr; 193*b1cdbd2cSJim Jagielski typedef ::std::map< ::rtl::OUString, ResourceTypePtr > ResourceTypes; 194*b1cdbd2cSJim Jagielski 195*b1cdbd2cSJim Jagielski ::osl::Mutex m_aMutex; 196*b1cdbd2cSJim Jagielski Reference< XResourceBundle > m_xParent; 197*b1cdbd2cSJim Jagielski Locale m_aLocale; 198*b1cdbd2cSJim Jagielski SimpleResMgr* m_pResourceManager; 199*b1cdbd2cSJim Jagielski ResourceTypes m_aResourceTypes; 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski public: 202*b1cdbd2cSJim Jagielski OpenOfficeResourceBundle( 203*b1cdbd2cSJim Jagielski const Reference< XComponentContext >& _rxContext, 204*b1cdbd2cSJim Jagielski const ::rtl::OUString& _rBaseName, 205*b1cdbd2cSJim Jagielski const Locale& _rLocale 206*b1cdbd2cSJim Jagielski ); 207*b1cdbd2cSJim Jagielski 208*b1cdbd2cSJim Jagielski protected: 209*b1cdbd2cSJim Jagielski ~OpenOfficeResourceBundle(); 210*b1cdbd2cSJim Jagielski 211*b1cdbd2cSJim Jagielski public: 212*b1cdbd2cSJim Jagielski // XResourceBundle 213*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::resource::XResourceBundle > SAL_CALL getParent() throw (::com::sun::star::uno::RuntimeException); 214*b1cdbd2cSJim Jagielski virtual void SAL_CALL setParent( const ::com::sun::star::uno::Reference< ::com::sun::star::resource::XResourceBundle >& _parent ) throw (::com::sun::star::uno::RuntimeException); 215*b1cdbd2cSJim Jagielski virtual ::com::sun::star::lang::Locale SAL_CALL getLocale( ) throw (::com::sun::star::uno::RuntimeException); 216*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Any SAL_CALL getDirectElement( const ::rtl::OUString& key ) throw (::com::sun::star::uno::RuntimeException); 217*b1cdbd2cSJim Jagielski 218*b1cdbd2cSJim Jagielski // XNameAccess (base of XResourceBundle) 219*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 220*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames( ) throw (::com::sun::star::uno::RuntimeException); 221*b1cdbd2cSJim Jagielski virtual ::sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw (::com::sun::star::uno::RuntimeException); 222*b1cdbd2cSJim Jagielski 223*b1cdbd2cSJim Jagielski // XElementAccess (base of XNameAccess) 224*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) throw (::com::sun::star::uno::RuntimeException); 225*b1cdbd2cSJim Jagielski virtual ::sal_Bool SAL_CALL hasElements( ) throw (::com::sun::star::uno::RuntimeException); 226*b1cdbd2cSJim Jagielski 227*b1cdbd2cSJim Jagielski private: 228*b1cdbd2cSJim Jagielski /** retrievs the element with the given key, without asking our parent bundle 229*b1cdbd2cSJim Jagielski @param _key 230*b1cdbd2cSJim Jagielski the key of the element to retrieve 231*b1cdbd2cSJim Jagielski @param _out_Element 232*b1cdbd2cSJim Jagielski will contained the retrieved element upon successful return. If the method is unsuccessful, the 233*b1cdbd2cSJim Jagielski value will not be touched. 234*b1cdbd2cSJim Jagielski @return 235*b1cdbd2cSJim Jagielski <TRUE/> if and only if the element could be retrieved 236*b1cdbd2cSJim Jagielski @precond 237*b1cdbd2cSJim Jagielski our mutex is locked 238*b1cdbd2cSJim Jagielski */ 239*b1cdbd2cSJim Jagielski bool impl_getDirectElement_nothrow( const ::rtl::OUString& _key, Any& _out_Element ) const; 240*b1cdbd2cSJim Jagielski 241*b1cdbd2cSJim Jagielski /** retrieves the resource type and id from a given resource key, which assembles those two 242*b1cdbd2cSJim Jagielski @param _key 243*b1cdbd2cSJim Jagielski the resource key as got via a public API call 244*b1cdbd2cSJim Jagielski @param _out_resourceType 245*b1cdbd2cSJim Jagielski the resource type, if successful 246*b1cdbd2cSJim Jagielski @param _out_resourceId 247*b1cdbd2cSJim Jagielski the resource id, if successful 248*b1cdbd2cSJim Jagielski @return 249*b1cdbd2cSJim Jagielski <TRUE/> if and only if the given key specifies a known resource type, and contains a valid 250*b1cdbd2cSJim Jagielski resource id 251*b1cdbd2cSJim Jagielski */ 252*b1cdbd2cSJim Jagielski bool impl_getResourceTypeAndId_nothrow( const ::rtl::OUString& _key, ResourceTypePtr& _out_resourceType, sal_Int32& _out_resourceId ) const; 253*b1cdbd2cSJim Jagielski }; 254*b1cdbd2cSJim Jagielski 255*b1cdbd2cSJim Jagielski //==================================================================== 256*b1cdbd2cSJim Jagielski //= OpenOfficeResourceLoader 257*b1cdbd2cSJim Jagielski //==================================================================== 258*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- OpenOfficeResourceLoader(const Reference<XComponentContext> & _rxContext)259*b1cdbd2cSJim Jagielski OpenOfficeResourceLoader::OpenOfficeResourceLoader( const Reference< XComponentContext >& _rxContext ) 260*b1cdbd2cSJim Jagielski :m_xContext( _rxContext ) 261*b1cdbd2cSJim Jagielski { 262*b1cdbd2cSJim Jagielski } 263*b1cdbd2cSJim Jagielski 264*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getSupportedServiceNames_static()265*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > OpenOfficeResourceLoader::getSupportedServiceNames_static() 266*b1cdbd2cSJim Jagielski { 267*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > aServices( 1 ); 268*b1cdbd2cSJim Jagielski aServices[ 0 ] = getSingletonName_static(); 269*b1cdbd2cSJim Jagielski return aServices; 270*b1cdbd2cSJim Jagielski } 271*b1cdbd2cSJim Jagielski 272*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getImplementationName_static()273*b1cdbd2cSJim Jagielski ::rtl::OUString OpenOfficeResourceLoader::getImplementationName_static() 274*b1cdbd2cSJim Jagielski { 275*b1cdbd2cSJim Jagielski return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.resource.OpenOfficeResourceLoader" ) ); 276*b1cdbd2cSJim Jagielski } 277*b1cdbd2cSJim Jagielski 278*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getSingletonName_static()279*b1cdbd2cSJim Jagielski ::rtl::OUString OpenOfficeResourceLoader::getSingletonName_static() 280*b1cdbd2cSJim Jagielski { 281*b1cdbd2cSJim Jagielski return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.resource.OfficeResourceLoader" ) ); 282*b1cdbd2cSJim Jagielski } 283*b1cdbd2cSJim Jagielski 284*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- Create(const Reference<XComponentContext> & _rxContext)285*b1cdbd2cSJim Jagielski Reference< XInterface > OpenOfficeResourceLoader::Create( const Reference< XComponentContext >& _rxContext ) 286*b1cdbd2cSJim Jagielski { 287*b1cdbd2cSJim Jagielski return *( new OpenOfficeResourceLoader( _rxContext ) ); 288*b1cdbd2cSJim Jagielski } 289*b1cdbd2cSJim Jagielski 290*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- loadBundle_Default(const::rtl::OUString & _baseName)291*b1cdbd2cSJim Jagielski Reference< XResourceBundle > SAL_CALL OpenOfficeResourceLoader::loadBundle_Default( const ::rtl::OUString& _baseName ) throw (MissingResourceException, RuntimeException) 292*b1cdbd2cSJim Jagielski { 293*b1cdbd2cSJim Jagielski return loadBundle( _baseName, Application::GetSettings().GetUILocale() ); 294*b1cdbd2cSJim Jagielski } 295*b1cdbd2cSJim Jagielski 296*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- loadBundle(const::rtl::OUString & _baseName,const Locale & _locale)297*b1cdbd2cSJim Jagielski Reference< XResourceBundle > SAL_CALL OpenOfficeResourceLoader::loadBundle( const ::rtl::OUString& _baseName, const Locale& _locale ) throw (MissingResourceException, RuntimeException) 298*b1cdbd2cSJim Jagielski { 299*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 300*b1cdbd2cSJim Jagielski 301*b1cdbd2cSJim Jagielski Reference< XResourceBundle > xBundle; 302*b1cdbd2cSJim Jagielski 303*b1cdbd2cSJim Jagielski ResourceBundleDescriptor resourceDescriptor( _baseName, _locale ); 304*b1cdbd2cSJim Jagielski ResourceBundleCache::iterator cachePos = m_aBundleCache.find( resourceDescriptor ); 305*b1cdbd2cSJim Jagielski if ( cachePos != m_aBundleCache.end() ) 306*b1cdbd2cSJim Jagielski xBundle = cachePos->second; 307*b1cdbd2cSJim Jagielski 308*b1cdbd2cSJim Jagielski if ( !xBundle.is() ) 309*b1cdbd2cSJim Jagielski { // not in the cache, or already died 310*b1cdbd2cSJim Jagielski xBundle = new OpenOfficeResourceBundle( m_xContext, _baseName, _locale ); 311*b1cdbd2cSJim Jagielski m_aBundleCache.insert( ResourceBundleCache::value_type( resourceDescriptor, xBundle ) ); 312*b1cdbd2cSJim Jagielski } 313*b1cdbd2cSJim Jagielski 314*b1cdbd2cSJim Jagielski return xBundle; 315*b1cdbd2cSJim Jagielski } 316*b1cdbd2cSJim Jagielski 317*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getComponentInfo_OpenOfficeResourceLoader()318*b1cdbd2cSJim Jagielski ComponentInfo getComponentInfo_OpenOfficeResourceLoader() 319*b1cdbd2cSJim Jagielski { 320*b1cdbd2cSJim Jagielski ComponentInfo aInfo; 321*b1cdbd2cSJim Jagielski aInfo.aSupportedServices = OpenOfficeResourceLoader::getSupportedServiceNames_static(); 322*b1cdbd2cSJim Jagielski aInfo.sImplementationName = OpenOfficeResourceLoader::getImplementationName_static(); 323*b1cdbd2cSJim Jagielski aInfo.sSingletonName = OpenOfficeResourceLoader::getSingletonName_static(); 324*b1cdbd2cSJim Jagielski aInfo.pFactory = &OpenOfficeResourceLoader::Create; 325*b1cdbd2cSJim Jagielski return aInfo; 326*b1cdbd2cSJim Jagielski } 327*b1cdbd2cSJim Jagielski 328*b1cdbd2cSJim Jagielski //==================================================================== 329*b1cdbd2cSJim Jagielski //= OpenOfficeResourceBundle 330*b1cdbd2cSJim Jagielski //==================================================================== 331*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- OpenOfficeResourceBundle(const Reference<XComponentContext> &,const::rtl::OUString & _rBaseName,const Locale & _rLocale)332*b1cdbd2cSJim Jagielski OpenOfficeResourceBundle::OpenOfficeResourceBundle( const Reference< XComponentContext >& /*_rxContext*/, const ::rtl::OUString& _rBaseName, const Locale& _rLocale ) 333*b1cdbd2cSJim Jagielski :m_aLocale( _rLocale ) 334*b1cdbd2cSJim Jagielski ,m_pResourceManager( NULL ) 335*b1cdbd2cSJim Jagielski { 336*b1cdbd2cSJim Jagielski ::rtl::OUString sBaseName( _rBaseName ); 337*b1cdbd2cSJim Jagielski m_pResourceManager = new SimpleResMgr( sBaseName, m_aLocale ); 338*b1cdbd2cSJim Jagielski 339*b1cdbd2cSJim Jagielski if ( !m_pResourceManager->IsValid() ) 340*b1cdbd2cSJim Jagielski { 341*b1cdbd2cSJim Jagielski delete m_pResourceManager, m_pResourceManager = NULL; 342*b1cdbd2cSJim Jagielski throw MissingResourceException(); 343*b1cdbd2cSJim Jagielski } 344*b1cdbd2cSJim Jagielski 345*b1cdbd2cSJim Jagielski // supported resource types so far: strings 346*b1cdbd2cSJim Jagielski m_aResourceTypes[ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "string" ) ) ] = 347*b1cdbd2cSJim Jagielski ResourceTypePtr( new StringResourceAccess ); 348*b1cdbd2cSJim Jagielski } 349*b1cdbd2cSJim Jagielski 350*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- ~OpenOfficeResourceBundle()351*b1cdbd2cSJim Jagielski OpenOfficeResourceBundle::~OpenOfficeResourceBundle() 352*b1cdbd2cSJim Jagielski { 353*b1cdbd2cSJim Jagielski delete m_pResourceManager; 354*b1cdbd2cSJim Jagielski } 355*b1cdbd2cSJim Jagielski 356*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getParent()357*b1cdbd2cSJim Jagielski Reference< XResourceBundle > SAL_CALL OpenOfficeResourceBundle::getParent() throw (RuntimeException) 358*b1cdbd2cSJim Jagielski { 359*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 360*b1cdbd2cSJim Jagielski return m_xParent; 361*b1cdbd2cSJim Jagielski } 362*b1cdbd2cSJim Jagielski 363*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- setParent(const Reference<XResourceBundle> & _parent)364*b1cdbd2cSJim Jagielski void SAL_CALL OpenOfficeResourceBundle::setParent( const Reference< XResourceBundle >& _parent ) throw (RuntimeException) 365*b1cdbd2cSJim Jagielski { 366*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 367*b1cdbd2cSJim Jagielski m_xParent = _parent; 368*b1cdbd2cSJim Jagielski } 369*b1cdbd2cSJim Jagielski 370*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getLocale()371*b1cdbd2cSJim Jagielski Locale SAL_CALL OpenOfficeResourceBundle::getLocale( ) throw (RuntimeException) 372*b1cdbd2cSJim Jagielski { 373*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 374*b1cdbd2cSJim Jagielski return m_aLocale; 375*b1cdbd2cSJim Jagielski } 376*b1cdbd2cSJim Jagielski 377*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_getResourceTypeAndId_nothrow(const::rtl::OUString & _key,ResourceTypePtr & _out_resourceType,sal_Int32 & _out_resourceId) const378*b1cdbd2cSJim Jagielski bool OpenOfficeResourceBundle::impl_getResourceTypeAndId_nothrow( const ::rtl::OUString& _key, ResourceTypePtr& _out_resourceType, sal_Int32& _out_resourceId ) const 379*b1cdbd2cSJim Jagielski { 380*b1cdbd2cSJim Jagielski sal_Int32 typeSeparatorPos = _key.indexOf( ':' ); 381*b1cdbd2cSJim Jagielski if ( typeSeparatorPos == -1 ) 382*b1cdbd2cSJim Jagielski // invalid key 383*b1cdbd2cSJim Jagielski return false; 384*b1cdbd2cSJim Jagielski 385*b1cdbd2cSJim Jagielski ::rtl::OUString resourceType = _key.copy( 0, typeSeparatorPos ); 386*b1cdbd2cSJim Jagielski 387*b1cdbd2cSJim Jagielski ResourceTypes::const_iterator typePos = m_aResourceTypes.find( resourceType ); 388*b1cdbd2cSJim Jagielski if ( typePos == m_aResourceTypes.end() ) 389*b1cdbd2cSJim Jagielski // don't know this resource type 390*b1cdbd2cSJim Jagielski return false; 391*b1cdbd2cSJim Jagielski 392*b1cdbd2cSJim Jagielski _out_resourceType = typePos->second; 393*b1cdbd2cSJim Jagielski _out_resourceId = _key.copy( typeSeparatorPos + 1 ).toInt32(); 394*b1cdbd2cSJim Jagielski return true; 395*b1cdbd2cSJim Jagielski } 396*b1cdbd2cSJim Jagielski 397*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- impl_getDirectElement_nothrow(const::rtl::OUString & _key,Any & _out_Element) const398*b1cdbd2cSJim Jagielski bool OpenOfficeResourceBundle::impl_getDirectElement_nothrow( const ::rtl::OUString& _key, Any& _out_Element ) const 399*b1cdbd2cSJim Jagielski { 400*b1cdbd2cSJim Jagielski ResourceTypePtr resourceType; 401*b1cdbd2cSJim Jagielski sal_Int32 resourceId( 0 ); 402*b1cdbd2cSJim Jagielski if ( !impl_getResourceTypeAndId_nothrow( _key, resourceType, resourceId ) ) 403*b1cdbd2cSJim Jagielski return false; 404*b1cdbd2cSJim Jagielski 405*b1cdbd2cSJim Jagielski if ( !m_pResourceManager->IsAvailable( resourceType->getResourceType(), resourceId ) ) 406*b1cdbd2cSJim Jagielski // no such resource with the given type/id 407*b1cdbd2cSJim Jagielski return false; 408*b1cdbd2cSJim Jagielski 409*b1cdbd2cSJim Jagielski _out_Element = resourceType->getResource( *m_pResourceManager, resourceId ); 410*b1cdbd2cSJim Jagielski return _out_Element.hasValue(); 411*b1cdbd2cSJim Jagielski } 412*b1cdbd2cSJim Jagielski 413*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getDirectElement(const::rtl::OUString & _key)414*b1cdbd2cSJim Jagielski Any SAL_CALL OpenOfficeResourceBundle::getDirectElement( const ::rtl::OUString& _key ) throw (RuntimeException) 415*b1cdbd2cSJim Jagielski { 416*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 417*b1cdbd2cSJim Jagielski 418*b1cdbd2cSJim Jagielski Any aElement; 419*b1cdbd2cSJim Jagielski impl_getDirectElement_nothrow( _key, aElement ); 420*b1cdbd2cSJim Jagielski return aElement; 421*b1cdbd2cSJim Jagielski } 422*b1cdbd2cSJim Jagielski 423*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getByName(const::rtl::OUString & _key)424*b1cdbd2cSJim Jagielski Any SAL_CALL OpenOfficeResourceBundle::getByName( const ::rtl::OUString& _key ) throw (NoSuchElementException, WrappedTargetException, RuntimeException) 425*b1cdbd2cSJim Jagielski { 426*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 427*b1cdbd2cSJim Jagielski 428*b1cdbd2cSJim Jagielski Any aElement; 429*b1cdbd2cSJim Jagielski if ( !impl_getDirectElement_nothrow( _key, aElement ) ) 430*b1cdbd2cSJim Jagielski { 431*b1cdbd2cSJim Jagielski if ( m_xParent.is() ) 432*b1cdbd2cSJim Jagielski aElement = m_xParent->getByName( _key ); 433*b1cdbd2cSJim Jagielski } 434*b1cdbd2cSJim Jagielski 435*b1cdbd2cSJim Jagielski if ( !aElement.hasValue() ) 436*b1cdbd2cSJim Jagielski throw NoSuchElementException( ::rtl::OUString(), *this ); 437*b1cdbd2cSJim Jagielski 438*b1cdbd2cSJim Jagielski return aElement; 439*b1cdbd2cSJim Jagielski } 440*b1cdbd2cSJim Jagielski 441*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getElementNames()442*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > SAL_CALL OpenOfficeResourceBundle::getElementNames( ) throw (RuntimeException) 443*b1cdbd2cSJim Jagielski { 444*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 445*b1cdbd2cSJim Jagielski OSL_ENSURE( false, "OpenOfficeResourceBundle::getElementNames: not implemented!" ); 446*b1cdbd2cSJim Jagielski // the (Simple)ResManager does not provide an API to enumerate the resources 447*b1cdbd2cSJim Jagielski return Sequence< ::rtl::OUString >( ); 448*b1cdbd2cSJim Jagielski } 449*b1cdbd2cSJim Jagielski 450*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- hasByName(const::rtl::OUString & _key)451*b1cdbd2cSJim Jagielski ::sal_Bool SAL_CALL OpenOfficeResourceBundle::hasByName( const ::rtl::OUString& _key ) throw (RuntimeException) 452*b1cdbd2cSJim Jagielski { 453*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 454*b1cdbd2cSJim Jagielski 455*b1cdbd2cSJim Jagielski ResourceTypePtr resourceType; 456*b1cdbd2cSJim Jagielski sal_Int32 resourceId( 0 ); 457*b1cdbd2cSJim Jagielski if ( !impl_getResourceTypeAndId_nothrow( _key, resourceType, resourceId ) ) 458*b1cdbd2cSJim Jagielski return sal_False; 459*b1cdbd2cSJim Jagielski 460*b1cdbd2cSJim Jagielski if ( !m_pResourceManager->IsAvailable( resourceType->getResourceType(), resourceId ) ) 461*b1cdbd2cSJim Jagielski return sal_False; 462*b1cdbd2cSJim Jagielski 463*b1cdbd2cSJim Jagielski return sal_True; 464*b1cdbd2cSJim Jagielski } 465*b1cdbd2cSJim Jagielski 466*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getElementType()467*b1cdbd2cSJim Jagielski Type SAL_CALL OpenOfficeResourceBundle::getElementType( ) throw (RuntimeException) 468*b1cdbd2cSJim Jagielski { 469*b1cdbd2cSJim Jagielski return ::cppu::UnoType< Any >::get(); 470*b1cdbd2cSJim Jagielski } 471*b1cdbd2cSJim Jagielski 472*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- hasElements()473*b1cdbd2cSJim Jagielski ::sal_Bool SAL_CALL OpenOfficeResourceBundle::hasElements( ) throw (RuntimeException) 474*b1cdbd2cSJim Jagielski { 475*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( m_aMutex ); 476*b1cdbd2cSJim Jagielski OSL_ENSURE( false, "OpenOfficeResourceBundle::hasElements: not implemented!" ); 477*b1cdbd2cSJim Jagielski // the (Simple)ResManager does not provide an API to enumerate the resources 478*b1cdbd2cSJim Jagielski return ::sal_Bool( ); 479*b1cdbd2cSJim Jagielski } 480*b1cdbd2cSJim Jagielski 481*b1cdbd2cSJim Jagielski //........................................................................ 482*b1cdbd2cSJim Jagielski } // namespace res 483*b1cdbd2cSJim Jagielski //........................................................................ 484*b1cdbd2cSJim Jagielski 485*b1cdbd2cSJim Jagielski #endif // EXTENSIONS_SOURCE_RESOURCE_OOORESOURCELOADER_CXX 486