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