1*5b190011SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*5b190011SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*5b190011SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*5b190011SAndrew Rist  * distributed with this work for additional information
6*5b190011SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*5b190011SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*5b190011SAndrew Rist  * "License"); you may not use this file except in compliance
9*5b190011SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*5b190011SAndrew Rist  *
11*5b190011SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*5b190011SAndrew Rist  *
13*5b190011SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*5b190011SAndrew Rist  * software distributed under the License is distributed on an
15*5b190011SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5b190011SAndrew Rist  * KIND, either express or implied.  See the License for the
17*5b190011SAndrew Rist  * specific language governing permissions and limitations
18*5b190011SAndrew Rist  * under the License.
19*5b190011SAndrew Rist  *
20*5b190011SAndrew Rist  *************************************************************/
21*5b190011SAndrew Rist 
22*5b190011SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include "precompiled_sd.hxx"
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include "framework/Configuration.hxx"
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include "framework/FrameworkHelper.hxx"
29cdf0e10cSrcweir #include <comphelper/stl_types.hxx>
30cdf0e10cSrcweir 
31cdf0e10cSrcweir 
32cdf0e10cSrcweir 
33cdf0e10cSrcweir using namespace ::com::sun::star;
34cdf0e10cSrcweir using namespace ::com::sun::star::uno;
35cdf0e10cSrcweir using namespace ::com::sun::star::drawing::framework;
36cdf0e10cSrcweir using ::sd::framework::FrameworkHelper;
37cdf0e10cSrcweir using ::rtl::OUString;
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #undef VERBOSE
40cdf0e10cSrcweir 
41cdf0e10cSrcweir namespace {
42cdf0e10cSrcweir /** Use the XResourceId::compareTo() method to implement a compare operator
43cdf0e10cSrcweir     for STL containers.
44cdf0e10cSrcweir */
45cdf0e10cSrcweir class XResourceIdLess
46cdf0e10cSrcweir     : 	public ::std::binary_function <Reference<XResourceId>, Reference<XResourceId>, bool>
47cdf0e10cSrcweir {
48cdf0e10cSrcweir public:
operator ()(const Reference<XResourceId> & rId1,const Reference<XResourceId> & rId2) const49cdf0e10cSrcweir     bool operator () (const Reference<XResourceId>& rId1, const Reference<XResourceId>& rId2) const
50cdf0e10cSrcweir 	{
51cdf0e10cSrcweir         return rId1->compareTo(rId2) == -1;
52cdf0e10cSrcweir     }
53cdf0e10cSrcweir };
54cdf0e10cSrcweir 
55cdf0e10cSrcweir } // end of anonymous namespace
56cdf0e10cSrcweir 
57cdf0e10cSrcweir 
58cdf0e10cSrcweir 
59cdf0e10cSrcweir 
60cdf0e10cSrcweir namespace sd { namespace framework {
61cdf0e10cSrcweir 
62cdf0e10cSrcweir 
63cdf0e10cSrcweir class Configuration::ResourceContainer
64cdf0e10cSrcweir     : public ::std::set<Reference<XResourceId>, XResourceIdLess>
65cdf0e10cSrcweir {
66cdf0e10cSrcweir public:
ResourceContainer(void)67cdf0e10cSrcweir     ResourceContainer (void) {}
68cdf0e10cSrcweir };
69cdf0e10cSrcweir 
70cdf0e10cSrcweir 
71cdf0e10cSrcweir 
72cdf0e10cSrcweir 
73cdf0e10cSrcweir //----- Service ---------------------------------------------------------------
74cdf0e10cSrcweir 
Configuration_createInstance(const Reference<XComponentContext> & rxContext)75cdf0e10cSrcweir Reference<XInterface> SAL_CALL Configuration_createInstance (
76cdf0e10cSrcweir     const Reference<XComponentContext>& rxContext)
77cdf0e10cSrcweir {
78cdf0e10cSrcweir     (void)rxContext;
79cdf0e10cSrcweir     return Reference<XInterface>(static_cast<XWeak*>(new Configuration(NULL,false)));
80cdf0e10cSrcweir }
81cdf0e10cSrcweir 
82cdf0e10cSrcweir 
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 
Configuration_getImplementationName(void)85cdf0e10cSrcweir OUString Configuration_getImplementationName (void) throw(RuntimeException)
86cdf0e10cSrcweir {
87cdf0e10cSrcweir     return OUString(RTL_CONSTASCII_USTRINGPARAM(
88cdf0e10cSrcweir         "com.sun.star.comp.Draw.framework.configuration.Configuration"));
89cdf0e10cSrcweir }
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 
92cdf0e10cSrcweir 
93cdf0e10cSrcweir 
Configuration_getSupportedServiceNames(void)94cdf0e10cSrcweir Sequence<rtl::OUString> SAL_CALL Configuration_getSupportedServiceNames (void)
95cdf0e10cSrcweir     throw (RuntimeException)
96cdf0e10cSrcweir {
97cdf0e10cSrcweir 	static const OUString sServiceName(OUString::createFromAscii(
98cdf0e10cSrcweir         "com.sun.star.drawing.framework.Configuration"));
99cdf0e10cSrcweir 	return Sequence<rtl::OUString>(&sServiceName, 1);
100cdf0e10cSrcweir }
101cdf0e10cSrcweir 
102cdf0e10cSrcweir 
103cdf0e10cSrcweir 
104cdf0e10cSrcweir 
105cdf0e10cSrcweir //===== Configuration =========================================================
106cdf0e10cSrcweir 
Configuration(const Reference<XConfigurationControllerBroadcaster> & rxBroadcaster,bool bBroadcastRequestEvents)107cdf0e10cSrcweir Configuration::Configuration (
108cdf0e10cSrcweir     const Reference<XConfigurationControllerBroadcaster>& rxBroadcaster,
109cdf0e10cSrcweir     bool bBroadcastRequestEvents)
110cdf0e10cSrcweir     : ConfigurationInterfaceBase(MutexOwner::maMutex),
111cdf0e10cSrcweir       mpResourceContainer(new ResourceContainer()),
112cdf0e10cSrcweir       mxBroadcaster(rxBroadcaster),
113cdf0e10cSrcweir       mbBroadcastRequestEvents(bBroadcastRequestEvents)
114cdf0e10cSrcweir {
115cdf0e10cSrcweir }
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 
Configuration(const Reference<XConfigurationControllerBroadcaster> & rxBroadcaster,bool bBroadcastRequestEvents,const ResourceContainer & rResourceContainer)119cdf0e10cSrcweir Configuration::Configuration (
120cdf0e10cSrcweir     const Reference<XConfigurationControllerBroadcaster>& rxBroadcaster,
121cdf0e10cSrcweir     bool bBroadcastRequestEvents,
122cdf0e10cSrcweir     const ResourceContainer& rResourceContainer)
123cdf0e10cSrcweir     : ConfigurationInterfaceBase(MutexOwner::maMutex),
124cdf0e10cSrcweir       mpResourceContainer(new ResourceContainer(rResourceContainer)),
125cdf0e10cSrcweir       mxBroadcaster(rxBroadcaster),
126cdf0e10cSrcweir       mbBroadcastRequestEvents(bBroadcastRequestEvents)
127cdf0e10cSrcweir {
128cdf0e10cSrcweir }
129cdf0e10cSrcweir 
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 
132cdf0e10cSrcweir 
~Configuration(void)133cdf0e10cSrcweir Configuration::~Configuration (void)
134cdf0e10cSrcweir {
135cdf0e10cSrcweir }
136cdf0e10cSrcweir 
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 
139cdf0e10cSrcweir 
disposing(void)140cdf0e10cSrcweir void SAL_CALL Configuration::disposing (void)
141cdf0e10cSrcweir {
142cdf0e10cSrcweir     ::osl::MutexGuard aGuard (maMutex);
143cdf0e10cSrcweir     mpResourceContainer->clear();
144cdf0e10cSrcweir     mxBroadcaster = NULL;
145cdf0e10cSrcweir }
146cdf0e10cSrcweir 
147cdf0e10cSrcweir 
148cdf0e10cSrcweir 
149cdf0e10cSrcweir 
150cdf0e10cSrcweir //----- XConfiguration --------------------------------------------------------
151cdf0e10cSrcweir 
addResource(const Reference<XResourceId> & rxResourceId)152cdf0e10cSrcweir void SAL_CALL Configuration::addResource (const Reference<XResourceId>& rxResourceId)
153cdf0e10cSrcweir     throw (RuntimeException)
154cdf0e10cSrcweir {
155cdf0e10cSrcweir     ThrowIfDisposed();
156cdf0e10cSrcweir 
157cdf0e10cSrcweir     if ( ! rxResourceId.is() || rxResourceId->getResourceURL().getLength()==0)
158cdf0e10cSrcweir         throw ::com::sun::star::lang::IllegalArgumentException();
159cdf0e10cSrcweir 
160cdf0e10cSrcweir     if (mpResourceContainer->find(rxResourceId) == mpResourceContainer->end())
161cdf0e10cSrcweir     {
162cdf0e10cSrcweir #ifdef VERBOSE
163cdf0e10cSrcweir     OSL_TRACE("Configuration::addResource() %s",
164cdf0e10cSrcweir         OUStringToOString(
165cdf0e10cSrcweir             FrameworkHelper::ResourceIdToString(rxResourceId), RTL_TEXTENCODING_UTF8).getStr());
166cdf0e10cSrcweir #endif
167cdf0e10cSrcweir         mpResourceContainer->insert(rxResourceId);
168cdf0e10cSrcweir         PostEvent(rxResourceId, true);
169cdf0e10cSrcweir     }
170cdf0e10cSrcweir }
171cdf0e10cSrcweir 
172cdf0e10cSrcweir 
173cdf0e10cSrcweir 
174cdf0e10cSrcweir 
removeResource(const Reference<XResourceId> & rxResourceId)175cdf0e10cSrcweir void SAL_CALL Configuration::removeResource (const Reference<XResourceId>& rxResourceId)
176cdf0e10cSrcweir     throw (RuntimeException)
177cdf0e10cSrcweir {
178cdf0e10cSrcweir     ThrowIfDisposed();
179cdf0e10cSrcweir 
180cdf0e10cSrcweir     if ( ! rxResourceId.is() || rxResourceId->getResourceURL().getLength()==0)
181cdf0e10cSrcweir         throw ::com::sun::star::lang::IllegalArgumentException();
182cdf0e10cSrcweir 
183cdf0e10cSrcweir     ResourceContainer::iterator iResource (mpResourceContainer->find(rxResourceId));
184cdf0e10cSrcweir     if (iResource != mpResourceContainer->end())
185cdf0e10cSrcweir     {
186cdf0e10cSrcweir #ifdef VERBOSE
187cdf0e10cSrcweir     OSL_TRACE("Configuration::removeResource() %s",
188cdf0e10cSrcweir         OUStringToOString(
189cdf0e10cSrcweir             FrameworkHelper::ResourceIdToString(rxResourceId), RTL_TEXTENCODING_UTF8).getStr());
190cdf0e10cSrcweir #endif
191cdf0e10cSrcweir         PostEvent(rxResourceId,false);
192cdf0e10cSrcweir         mpResourceContainer->erase(iResource);
193cdf0e10cSrcweir     }
194cdf0e10cSrcweir }
195cdf0e10cSrcweir 
196cdf0e10cSrcweir 
197cdf0e10cSrcweir 
198cdf0e10cSrcweir 
getResources(const Reference<XResourceId> & rxAnchorId,const::rtl::OUString & rsResourceURLPrefix,AnchorBindingMode eMode)199cdf0e10cSrcweir Sequence<Reference<XResourceId> > SAL_CALL Configuration::getResources (
200cdf0e10cSrcweir     const Reference<XResourceId>& rxAnchorId,
201cdf0e10cSrcweir     const ::rtl::OUString& rsResourceURLPrefix,
202cdf0e10cSrcweir     AnchorBindingMode eMode)
203cdf0e10cSrcweir     throw (::com::sun::star::uno::RuntimeException)
204cdf0e10cSrcweir {
205cdf0e10cSrcweir     ::osl::MutexGuard aGuard (maMutex);
206cdf0e10cSrcweir     ThrowIfDisposed();
207cdf0e10cSrcweir 
208cdf0e10cSrcweir     bool bFilterResources (rsResourceURLPrefix.getLength() > 0);
209cdf0e10cSrcweir 
210cdf0e10cSrcweir     // Collect the matching resources in a vector.
211cdf0e10cSrcweir     ::std::vector<Reference<XResourceId> > aResources;
212cdf0e10cSrcweir     ResourceContainer::const_iterator iResource;
213cdf0e10cSrcweir     for (iResource=mpResourceContainer->begin();
214cdf0e10cSrcweir          iResource!=mpResourceContainer->end();
215cdf0e10cSrcweir          ++iResource)
216cdf0e10cSrcweir     {
217cdf0e10cSrcweir         if ( ! (*iResource)->isBoundTo(rxAnchorId,eMode))
218cdf0e10cSrcweir             continue;
219cdf0e10cSrcweir 
220cdf0e10cSrcweir 
221cdf0e10cSrcweir         if (bFilterResources)
222cdf0e10cSrcweir         {
223cdf0e10cSrcweir             // Apply the given resource prefix as filter.
224cdf0e10cSrcweir 
225cdf0e10cSrcweir             // Make sure that the resource is bound directly to the anchor.
226cdf0e10cSrcweir             if (eMode != AnchorBindingMode_DIRECT
227cdf0e10cSrcweir                 && ! (*iResource)->isBoundTo(rxAnchorId, AnchorBindingMode_DIRECT))
228cdf0e10cSrcweir             {
229cdf0e10cSrcweir                 continue;
230cdf0e10cSrcweir             }
231cdf0e10cSrcweir 
232cdf0e10cSrcweir             // Make sure that the resource URL matches the given prefix.
233cdf0e10cSrcweir             if ( ! (*iResource)->getResourceURL().match(rsResourceURLPrefix))
234cdf0e10cSrcweir             {
235cdf0e10cSrcweir                 continue;
236cdf0e10cSrcweir             }
237cdf0e10cSrcweir         }
238cdf0e10cSrcweir 
239cdf0e10cSrcweir         aResources.push_back(*iResource);
240cdf0e10cSrcweir     }
241cdf0e10cSrcweir 
242cdf0e10cSrcweir     // Copy the resources from the vector into a new sequence.
243cdf0e10cSrcweir     Sequence<Reference<XResourceId> > aResult (aResources.size());
244cdf0e10cSrcweir     for (sal_uInt32 nIndex=0; nIndex<aResources.size(); ++nIndex)
245cdf0e10cSrcweir         aResult[nIndex] = aResources[nIndex];
246cdf0e10cSrcweir 
247cdf0e10cSrcweir     return aResult;
248cdf0e10cSrcweir }
249cdf0e10cSrcweir 
250cdf0e10cSrcweir 
251cdf0e10cSrcweir 
252cdf0e10cSrcweir 
hasResource(const Reference<XResourceId> & rxResourceId)253cdf0e10cSrcweir sal_Bool SAL_CALL Configuration::hasResource (const Reference<XResourceId>& rxResourceId)
254cdf0e10cSrcweir     throw (RuntimeException)
255cdf0e10cSrcweir {
256cdf0e10cSrcweir     ::osl::MutexGuard aGuard (maMutex);
257cdf0e10cSrcweir     ThrowIfDisposed();
258cdf0e10cSrcweir 
259cdf0e10cSrcweir     return rxResourceId.is()
260cdf0e10cSrcweir         && mpResourceContainer->find(rxResourceId) != mpResourceContainer->end();
261cdf0e10cSrcweir }
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 
264cdf0e10cSrcweir 
265cdf0e10cSrcweir 
266cdf0e10cSrcweir //----- XCloneable ------------------------------------------------------------
267cdf0e10cSrcweir 
createClone(void)268cdf0e10cSrcweir Reference<util::XCloneable> SAL_CALL Configuration::createClone (void)
269cdf0e10cSrcweir     throw (RuntimeException)
270cdf0e10cSrcweir {
271cdf0e10cSrcweir     ::osl::MutexGuard aGuard (maMutex);
272cdf0e10cSrcweir     ThrowIfDisposed();
273cdf0e10cSrcweir 
274cdf0e10cSrcweir     Configuration* pConfiguration = new Configuration(
275cdf0e10cSrcweir         mxBroadcaster,
276cdf0e10cSrcweir         mbBroadcastRequestEvents,
277cdf0e10cSrcweir         *mpResourceContainer);
278cdf0e10cSrcweir 
279cdf0e10cSrcweir     return Reference<util::XCloneable>(pConfiguration);
280cdf0e10cSrcweir }
281cdf0e10cSrcweir 
282cdf0e10cSrcweir 
283cdf0e10cSrcweir 
284cdf0e10cSrcweir 
285cdf0e10cSrcweir //----- XNamed ----------------------------------------------------------------
286cdf0e10cSrcweir 
getName(void)287cdf0e10cSrcweir OUString SAL_CALL Configuration::getName (void)
288cdf0e10cSrcweir     throw (RuntimeException)
289cdf0e10cSrcweir {
290cdf0e10cSrcweir     ::osl::MutexGuard aGuard (maMutex);
291cdf0e10cSrcweir     OUString aString;
292cdf0e10cSrcweir 
293cdf0e10cSrcweir 	if (rBHelper.bDisposed || rBHelper.bInDispose)
294cdf0e10cSrcweir         aString += OUString::createFromAscii("DISPOSED ");
295cdf0e10cSrcweir     aString += OUString::createFromAscii("Configuration[");
296cdf0e10cSrcweir 
297cdf0e10cSrcweir     ResourceContainer::const_iterator iResource;
298cdf0e10cSrcweir     for (iResource=mpResourceContainer->begin();
299cdf0e10cSrcweir          iResource!=mpResourceContainer->end();
300cdf0e10cSrcweir          ++iResource)
301cdf0e10cSrcweir     {
302cdf0e10cSrcweir         if (iResource != mpResourceContainer->begin())
303cdf0e10cSrcweir             aString += OUString::createFromAscii(", ");
304cdf0e10cSrcweir         aString += FrameworkHelper::ResourceIdToString(*iResource);
305cdf0e10cSrcweir     }
306cdf0e10cSrcweir     aString += OUString::createFromAscii("]");
307cdf0e10cSrcweir 
308cdf0e10cSrcweir     return aString;
309cdf0e10cSrcweir }
310cdf0e10cSrcweir 
311cdf0e10cSrcweir 
312cdf0e10cSrcweir 
313cdf0e10cSrcweir 
setName(const OUString & rsName)314cdf0e10cSrcweir void SAL_CALL Configuration::setName (const OUString& rsName)
315cdf0e10cSrcweir     throw (RuntimeException)
316cdf0e10cSrcweir {
317cdf0e10cSrcweir     (void)rsName; // rsName is ignored.
318cdf0e10cSrcweir }
319cdf0e10cSrcweir 
320cdf0e10cSrcweir 
321cdf0e10cSrcweir 
322cdf0e10cSrcweir 
323cdf0e10cSrcweir 
324cdf0e10cSrcweir // ----------------------------------------------------------------------------
325cdf0e10cSrcweir 
PostEvent(const Reference<XResourceId> & rxResourceId,const bool bActivation)326cdf0e10cSrcweir void Configuration::PostEvent (
327cdf0e10cSrcweir     const Reference<XResourceId>& rxResourceId,
328cdf0e10cSrcweir     const bool bActivation)
329cdf0e10cSrcweir {
330cdf0e10cSrcweir     OSL_ASSERT(rxResourceId.is());
331cdf0e10cSrcweir 
332cdf0e10cSrcweir     if (mxBroadcaster.is())
333cdf0e10cSrcweir     {
334cdf0e10cSrcweir         ConfigurationChangeEvent aEvent;
335cdf0e10cSrcweir         aEvent.ResourceId = rxResourceId;
336cdf0e10cSrcweir         if (bActivation)
337cdf0e10cSrcweir             if (mbBroadcastRequestEvents)
338cdf0e10cSrcweir                 aEvent.Type = FrameworkHelper::msResourceActivationRequestEvent;
339cdf0e10cSrcweir             else
340cdf0e10cSrcweir                 aEvent.Type = FrameworkHelper::msResourceActivationEvent;
341cdf0e10cSrcweir         else
342cdf0e10cSrcweir             if (mbBroadcastRequestEvents)
343cdf0e10cSrcweir                 aEvent.Type = FrameworkHelper::msResourceDeactivationRequestEvent;
344cdf0e10cSrcweir             else
345cdf0e10cSrcweir                 aEvent.Type = FrameworkHelper::msResourceDeactivationEvent;
346cdf0e10cSrcweir         aEvent.Configuration = this;
347cdf0e10cSrcweir 
348cdf0e10cSrcweir         mxBroadcaster->notifyEvent(aEvent);
349cdf0e10cSrcweir     }
350cdf0e10cSrcweir }
351cdf0e10cSrcweir 
352cdf0e10cSrcweir 
353cdf0e10cSrcweir 
354cdf0e10cSrcweir 
ThrowIfDisposed(void) const355cdf0e10cSrcweir void Configuration::ThrowIfDisposed (void) const
356cdf0e10cSrcweir     throw (::com::sun::star::lang::DisposedException)
357cdf0e10cSrcweir {
358cdf0e10cSrcweir 	if (rBHelper.bDisposed || rBHelper.bInDispose)
359cdf0e10cSrcweir 	{
360cdf0e10cSrcweir         throw lang::DisposedException (
361cdf0e10cSrcweir             OUString(RTL_CONSTASCII_USTRINGPARAM(
362cdf0e10cSrcweir                 "Configuration object has already been disposed")),
363cdf0e10cSrcweir             const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
364cdf0e10cSrcweir     }
365cdf0e10cSrcweir }
366cdf0e10cSrcweir 
367cdf0e10cSrcweir 
368cdf0e10cSrcweir 
369cdf0e10cSrcweir 
370cdf0e10cSrcweir //=============================================================================
371cdf0e10cSrcweir 
AreConfigurationsEquivalent(const Reference<XConfiguration> & rxConfiguration1,const Reference<XConfiguration> & rxConfiguration2)372cdf0e10cSrcweir bool AreConfigurationsEquivalent (
373cdf0e10cSrcweir     const Reference<XConfiguration>& rxConfiguration1,
374cdf0e10cSrcweir     const Reference<XConfiguration>& rxConfiguration2)
375cdf0e10cSrcweir {
376cdf0e10cSrcweir     if (rxConfiguration1.is() != rxConfiguration2.is())
377cdf0e10cSrcweir         return false;
378cdf0e10cSrcweir     if ( ! rxConfiguration1.is() && ! rxConfiguration2.is())
379cdf0e10cSrcweir         return true;
380cdf0e10cSrcweir 
381cdf0e10cSrcweir     // Get the lists of resources from the two given configurations.
382cdf0e10cSrcweir     const Sequence<Reference<XResourceId> > aResources1(
383cdf0e10cSrcweir         rxConfiguration1->getResources(
384cdf0e10cSrcweir             NULL, OUString(), AnchorBindingMode_INDIRECT));
385cdf0e10cSrcweir     const Sequence<Reference<XResourceId> > aResources2(
386cdf0e10cSrcweir         rxConfiguration2->getResources(
387cdf0e10cSrcweir             NULL, OUString(), AnchorBindingMode_INDIRECT));
388cdf0e10cSrcweir 
389cdf0e10cSrcweir     // When the number of resources differ then the configurations can not
390cdf0e10cSrcweir     // be equivalent.
391cdf0e10cSrcweir     const sal_Int32 nCount (aResources1.getLength());
392cdf0e10cSrcweir     const sal_Int32 nCount2 (aResources2.getLength());
393cdf0e10cSrcweir     if (nCount != nCount2)
394cdf0e10cSrcweir         return false;
395cdf0e10cSrcweir 
396cdf0e10cSrcweir     // Comparison of the two lists of resource ids relies on their
397cdf0e10cSrcweir     // ordering.
398cdf0e10cSrcweir     for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
399cdf0e10cSrcweir     {
400cdf0e10cSrcweir         const Reference<XResourceId> xResource1 (aResources1[nIndex]);
401cdf0e10cSrcweir         const Reference<XResourceId> xResource2 (aResources2[nIndex]);
402cdf0e10cSrcweir         if (xResource1.is() && xResource2.is())
403cdf0e10cSrcweir         {
404cdf0e10cSrcweir             if (xResource1->compareTo(xResource2) != 0)
405cdf0e10cSrcweir                 return false;
406cdf0e10cSrcweir         }
407cdf0e10cSrcweir         else if (xResource1.is() != xResource2.is())
408cdf0e10cSrcweir         {
409cdf0e10cSrcweir             return false;
410cdf0e10cSrcweir         }
411cdf0e10cSrcweir     }
412cdf0e10cSrcweir 
413cdf0e10cSrcweir     return true;
414cdf0e10cSrcweir }
415cdf0e10cSrcweir 
416cdf0e10cSrcweir } } // end of namespace sd::framework
417