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 #include "precompiled_sd.hxx"
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include "framework/ConfigurationController.hxx"
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include "framework/Configuration.hxx"
29*b1cdbd2cSJim Jagielski #include "framework/FrameworkHelper.hxx"
30*b1cdbd2cSJim Jagielski #include "ConfigurationUpdater.hxx"
31*b1cdbd2cSJim Jagielski #include "ConfigurationControllerBroadcaster.hxx"
32*b1cdbd2cSJim Jagielski #include "ConfigurationTracer.hxx"
33*b1cdbd2cSJim Jagielski #include "GenericConfigurationChangeRequest.hxx"
34*b1cdbd2cSJim Jagielski #include "ResourceFactoryManager.hxx"
35*b1cdbd2cSJim Jagielski #include "UpdateRequest.hxx"
36*b1cdbd2cSJim Jagielski #include "ChangeRequestQueueProcessor.hxx"
37*b1cdbd2cSJim Jagielski #include "ConfigurationClassifier.hxx"
38*b1cdbd2cSJim Jagielski #include "ViewShellBase.hxx"
39*b1cdbd2cSJim Jagielski #include "UpdateLockManager.hxx"
40*b1cdbd2cSJim Jagielski #include "DrawController.hxx"
41*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/framework/XControllerManager.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XURLTransformer.hpp>
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski #include <comphelper/stl_types.hxx>
45*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
46*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
49*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
50*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::drawing::framework;
51*b1cdbd2cSJim Jagielski using rtl::OUString;
52*b1cdbd2cSJim Jagielski using ::sd::framework::FrameworkHelper;
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski #undef VERBOSE
55*b1cdbd2cSJim Jagielski //#define VERBOSE 3
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski namespace sd { namespace framework {
59*b1cdbd2cSJim Jagielski 
ConfigurationController_createInstance(const Reference<XComponentContext> & rxContext)60*b1cdbd2cSJim Jagielski Reference<XInterface> SAL_CALL ConfigurationController_createInstance (
61*b1cdbd2cSJim Jagielski     const Reference<XComponentContext>& rxContext)
62*b1cdbd2cSJim Jagielski {
63*b1cdbd2cSJim Jagielski     (void)rxContext;
64*b1cdbd2cSJim Jagielski     return static_cast<XWeak*>(new ConfigurationController());
65*b1cdbd2cSJim Jagielski }
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski 
ConfigurationController_getImplementationName(void)70*b1cdbd2cSJim Jagielski OUString ConfigurationController_getImplementationName (void) throw(RuntimeException)
71*b1cdbd2cSJim Jagielski {
72*b1cdbd2cSJim Jagielski     return OUString(RTL_CONSTASCII_USTRINGPARAM(
73*b1cdbd2cSJim Jagielski         "com.sun.star.comp.Draw.framework.configuration.ConfigurationController"));
74*b1cdbd2cSJim Jagielski }
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski 
ConfigurationController_getSupportedServiceNames(void)79*b1cdbd2cSJim Jagielski Sequence<rtl::OUString> SAL_CALL ConfigurationController_getSupportedServiceNames (void)
80*b1cdbd2cSJim Jagielski     throw (RuntimeException)
81*b1cdbd2cSJim Jagielski {
82*b1cdbd2cSJim Jagielski 	static const OUString sServiceName(OUString::createFromAscii(
83*b1cdbd2cSJim Jagielski         "com.sun.star.drawing.framework.ConfigurationController"));
84*b1cdbd2cSJim Jagielski 	return Sequence<rtl::OUString>(&sServiceName, 1);
85*b1cdbd2cSJim Jagielski }
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski //----- ConfigurationController::Implementation -------------------------------
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski class ConfigurationController::Implementation
93*b1cdbd2cSJim Jagielski {
94*b1cdbd2cSJim Jagielski public:
95*b1cdbd2cSJim Jagielski     Implementation (
96*b1cdbd2cSJim Jagielski         ConfigurationController& rController,
97*b1cdbd2cSJim Jagielski         const Reference<frame::XController>& rxController);
98*b1cdbd2cSJim Jagielski     ~Implementation (void);
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski     Reference<XControllerManager> mxControllerManager;
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski     /** The Broadcaster class implements storing and calling of listeners.
103*b1cdbd2cSJim Jagielski     */
104*b1cdbd2cSJim Jagielski     ::boost::shared_ptr<ConfigurationControllerBroadcaster> mpBroadcaster;
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski     /** The requested configuration which is modifed (asynchronously) by
107*b1cdbd2cSJim Jagielski         calls to requestResourceActivation() and
108*b1cdbd2cSJim Jagielski         requestResourceDeactivation().  The mpConfigurationUpdater makes the
109*b1cdbd2cSJim Jagielski         current configuration reflect the content of this one.
110*b1cdbd2cSJim Jagielski     */
111*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference<
112*b1cdbd2cSJim Jagielski         ::com::sun::star::drawing::framework::XConfiguration> mxRequestedConfiguration;
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski     ViewShellBase* mpBase;
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski     ::boost::shared_ptr<ResourceFactoryManager> mpResourceFactoryContainer;
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski     ::boost::shared_ptr<ConfigurationControllerResourceManager> mpResourceManager;
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski     ::boost::shared_ptr<ConfigurationUpdater> mpConfigurationUpdater;
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski     /** The queue processor ownes the queue of configuration change request
123*b1cdbd2cSJim Jagielski         objects and processes the objects.
124*b1cdbd2cSJim Jagielski     */
125*b1cdbd2cSJim Jagielski     ::boost::scoped_ptr<ChangeRequestQueueProcessor> mpQueueProcessor;
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski     ::boost::shared_ptr<ConfigurationUpdaterLock> mpConfigurationUpdaterLock;
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski     sal_Int32 mnLockCount;
130*b1cdbd2cSJim Jagielski };
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski //===== ConfigurationController::Lock =========================================
136*b1cdbd2cSJim Jagielski 
Lock(const Reference<XConfigurationController> & rxController)137*b1cdbd2cSJim Jagielski ConfigurationController::Lock::Lock (const Reference<XConfigurationController>& rxController)
138*b1cdbd2cSJim Jagielski     : mxController(rxController)
139*b1cdbd2cSJim Jagielski {
140*b1cdbd2cSJim Jagielski     OSL_ASSERT(mxController.is());
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski     if (mxController.is())
143*b1cdbd2cSJim Jagielski         mxController->lock();
144*b1cdbd2cSJim Jagielski }
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 
~Lock(void)149*b1cdbd2cSJim Jagielski ConfigurationController::Lock::~Lock (void)
150*b1cdbd2cSJim Jagielski {
151*b1cdbd2cSJim Jagielski     if (mxController.is())
152*b1cdbd2cSJim Jagielski         mxController->unlock();
153*b1cdbd2cSJim Jagielski }
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski //===== ConfigurationController ===============================================
159*b1cdbd2cSJim Jagielski 
ConfigurationController(void)160*b1cdbd2cSJim Jagielski ConfigurationController::ConfigurationController (void) throw()
161*b1cdbd2cSJim Jagielski     : ConfigurationControllerInterfaceBase(MutexOwner::maMutex),
162*b1cdbd2cSJim Jagielski       mpImplementation(),
163*b1cdbd2cSJim Jagielski       mbIsDisposed(false)
164*b1cdbd2cSJim Jagielski {
165*b1cdbd2cSJim Jagielski }
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski 
~ConfigurationController(void)170*b1cdbd2cSJim Jagielski ConfigurationController::~ConfigurationController (void) throw()
171*b1cdbd2cSJim Jagielski {
172*b1cdbd2cSJim Jagielski }
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski 
disposing(void)177*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationController::disposing (void)
178*b1cdbd2cSJim Jagielski {
179*b1cdbd2cSJim Jagielski     if (mpImplementation.get() == NULL)
180*b1cdbd2cSJim Jagielski         return;
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski #if defined VERBOSE && VERBOSE>=1
183*b1cdbd2cSJim Jagielski     OSL_TRACE("ConfigurationController::disposing\n");
184*b1cdbd2cSJim Jagielski     OSL_TRACE("    requesting empty configuration\n");
185*b1cdbd2cSJim Jagielski #endif
186*b1cdbd2cSJim Jagielski     // To destroy all resources an empty configuration is requested and then,
187*b1cdbd2cSJim Jagielski     // synchronously, all resulting requests are processed.
188*b1cdbd2cSJim Jagielski     mpImplementation->mpQueueProcessor->Clear();
189*b1cdbd2cSJim Jagielski     restoreConfiguration(new Configuration(this,false));
190*b1cdbd2cSJim Jagielski     mpImplementation->mpQueueProcessor->ProcessUntilEmpty();
191*b1cdbd2cSJim Jagielski #if defined VERBOSE && VERBOSE>=1
192*b1cdbd2cSJim Jagielski     OSL_TRACE("    all requests processed\n");
193*b1cdbd2cSJim Jagielski #endif
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski     // Now that all resources have been deactivated, mark the controller as
196*b1cdbd2cSJim Jagielski     // disposed.
197*b1cdbd2cSJim Jagielski     mbIsDisposed = true;
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski     // Release the listeners.
200*b1cdbd2cSJim Jagielski 	lang::EventObject aEvent;
201*b1cdbd2cSJim Jagielski 	aEvent.Source = uno::Reference<uno::XInterface>((cppu::OWeakObject*)this);
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski     {
204*b1cdbd2cSJim Jagielski         const ::vos::OGuard aSolarGuard (Application::GetSolarMutex());
205*b1cdbd2cSJim Jagielski         mpImplementation->mpBroadcaster->DisposeAndClear();
206*b1cdbd2cSJim Jagielski     }
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski     mpImplementation->mpQueueProcessor.reset();
209*b1cdbd2cSJim Jagielski     mpImplementation->mxRequestedConfiguration = NULL;
210*b1cdbd2cSJim Jagielski     mpImplementation.reset();
211*b1cdbd2cSJim Jagielski }
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 
ProcessEvent(void)216*b1cdbd2cSJim Jagielski void ConfigurationController::ProcessEvent (void)
217*b1cdbd2cSJim Jagielski {
218*b1cdbd2cSJim Jagielski     if (mpImplementation.get() != NULL)
219*b1cdbd2cSJim Jagielski     {
220*b1cdbd2cSJim Jagielski         OSL_ASSERT(mpImplementation->mpQueueProcessor.get()!=NULL);
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski         mpImplementation->mpQueueProcessor->ProcessOneEvent();
223*b1cdbd2cSJim Jagielski     }
224*b1cdbd2cSJim Jagielski }
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 
RequestSynchronousUpdate(void)229*b1cdbd2cSJim Jagielski void ConfigurationController::RequestSynchronousUpdate (void)
230*b1cdbd2cSJim Jagielski {
231*b1cdbd2cSJim Jagielski     if (mpImplementation.get() == NULL)
232*b1cdbd2cSJim Jagielski         return;
233*b1cdbd2cSJim Jagielski     if (mpImplementation->mpQueueProcessor.get() == 0)
234*b1cdbd2cSJim Jagielski         return;
235*b1cdbd2cSJim Jagielski     mpImplementation->mpQueueProcessor->ProcessUntilEmpty();
236*b1cdbd2cSJim Jagielski }
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski //----- XConfigurationControllerBroadcaster -----------------------------------
242*b1cdbd2cSJim Jagielski 
addConfigurationChangeListener(const Reference<XConfigurationChangeListener> & rxListener,const::rtl::OUString & rsEventType,const Any & rUserData)243*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationController::addConfigurationChangeListener (
244*b1cdbd2cSJim Jagielski     const Reference<XConfigurationChangeListener>& rxListener,
245*b1cdbd2cSJim Jagielski     const ::rtl::OUString& rsEventType,
246*b1cdbd2cSJim Jagielski     const Any& rUserData)
247*b1cdbd2cSJim Jagielski     throw (RuntimeException)
248*b1cdbd2cSJim Jagielski {
249*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski 	ThrowIfDisposed();
252*b1cdbd2cSJim Jagielski     OSL_ASSERT(mpImplementation.get()!=NULL);
253*b1cdbd2cSJim Jagielski     mpImplementation->mpBroadcaster->AddListener(rxListener, rsEventType, rUserData);
254*b1cdbd2cSJim Jagielski }
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski 
removeConfigurationChangeListener(const Reference<XConfigurationChangeListener> & rxListener)259*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationController::removeConfigurationChangeListener (
260*b1cdbd2cSJim Jagielski     const Reference<XConfigurationChangeListener>& rxListener)
261*b1cdbd2cSJim Jagielski     throw (RuntimeException)
262*b1cdbd2cSJim Jagielski {
263*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski 	ThrowIfDisposed();
266*b1cdbd2cSJim Jagielski     mpImplementation->mpBroadcaster->RemoveListener(rxListener);
267*b1cdbd2cSJim Jagielski }
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski 
notifyEvent(const ConfigurationChangeEvent & rEvent)272*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationController::notifyEvent (
273*b1cdbd2cSJim Jagielski     const ConfigurationChangeEvent& rEvent)
274*b1cdbd2cSJim Jagielski     throw (RuntimeException)
275*b1cdbd2cSJim Jagielski {
276*b1cdbd2cSJim Jagielski 	ThrowIfDisposed();
277*b1cdbd2cSJim Jagielski     mpImplementation->mpBroadcaster->NotifyListeners(rEvent);
278*b1cdbd2cSJim Jagielski }
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski //----- XConfigurationController ----------------------------------------------
285*b1cdbd2cSJim Jagielski 
lock(void)286*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationController::lock (void)
287*b1cdbd2cSJim Jagielski     throw (RuntimeException)
288*b1cdbd2cSJim Jagielski {
289*b1cdbd2cSJim Jagielski     OSL_ASSERT(mpImplementation.get()!=NULL);
290*b1cdbd2cSJim Jagielski     OSL_ASSERT(mpImplementation->mpConfigurationUpdater.get()!=NULL);
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
293*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski     ++mpImplementation->mnLockCount;
297*b1cdbd2cSJim Jagielski     if (mpImplementation->mpConfigurationUpdaterLock.get()==NULL)
298*b1cdbd2cSJim Jagielski         mpImplementation->mpConfigurationUpdaterLock
299*b1cdbd2cSJim Jagielski             = mpImplementation->mpConfigurationUpdater->GetLock();
300*b1cdbd2cSJim Jagielski }
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski 
unlock(void)305*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationController::unlock (void)
306*b1cdbd2cSJim Jagielski     throw (RuntimeException)
307*b1cdbd2cSJim Jagielski {
308*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski     // Allow unlocking while the ConfigurationController is being disposed
311*b1cdbd2cSJim Jagielski     // (but not when that is done and the controller is disposed.)
312*b1cdbd2cSJim Jagielski     if (rBHelper.bDisposed)
313*b1cdbd2cSJim Jagielski         ThrowIfDisposed();
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski     OSL_ASSERT(mpImplementation->mnLockCount>0);
316*b1cdbd2cSJim Jagielski     --mpImplementation->mnLockCount;
317*b1cdbd2cSJim Jagielski     if (mpImplementation->mnLockCount == 0)
318*b1cdbd2cSJim Jagielski         mpImplementation->mpConfigurationUpdaterLock.reset();
319*b1cdbd2cSJim Jagielski }
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski 
requestResourceActivation(const Reference<XResourceId> & rxResourceId,ResourceActivationMode eMode)324*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationController::requestResourceActivation (
325*b1cdbd2cSJim Jagielski     const Reference<XResourceId>& rxResourceId,
326*b1cdbd2cSJim Jagielski     ResourceActivationMode eMode)
327*b1cdbd2cSJim Jagielski     throw (RuntimeException)
328*b1cdbd2cSJim Jagielski {
329*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
330*b1cdbd2cSJim Jagielski    	ThrowIfDisposed();
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski     // Check whether we are being disposed.  This is handled differently
333*b1cdbd2cSJim Jagielski     // then being completely disposed because the first thing disposing()
334*b1cdbd2cSJim Jagielski     // does is to deactivate all remaining resources.  This is done via
335*b1cdbd2cSJim Jagielski     // regular methods which must not throw DisposedExceptions.  Therefore
336*b1cdbd2cSJim Jagielski     // we just return silently during that stage.
337*b1cdbd2cSJim Jagielski     if (rBHelper.bInDispose)
338*b1cdbd2cSJim Jagielski     {
339*b1cdbd2cSJim Jagielski #if defined VERBOSE && VERBOSE>=1
340*b1cdbd2cSJim Jagielski         OSL_TRACE("ConfigurationController::requestResourceActivation(): ignoring %s\n",
341*b1cdbd2cSJim Jagielski             OUStringToOString(
342*b1cdbd2cSJim Jagielski                 FrameworkHelper::ResourceIdToString(rxResourceId), RTL_TEXTENCODING_UTF8).getStr());
343*b1cdbd2cSJim Jagielski #endif
344*b1cdbd2cSJim Jagielski         return;
345*b1cdbd2cSJim Jagielski     }
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski #if defined VERBOSE && VERBOSE>=2
348*b1cdbd2cSJim Jagielski     OSL_TRACE("ConfigurationController::requestResourceActivation() %s\n",
349*b1cdbd2cSJim Jagielski         OUStringToOString(
350*b1cdbd2cSJim Jagielski             FrameworkHelper::ResourceIdToString(rxResourceId), RTL_TEXTENCODING_UTF8).getStr());
351*b1cdbd2cSJim Jagielski #endif
352*b1cdbd2cSJim Jagielski 
353*b1cdbd2cSJim Jagielski     if (rxResourceId.is())
354*b1cdbd2cSJim Jagielski     {
355*b1cdbd2cSJim Jagielski         if (eMode == ResourceActivationMode_REPLACE)
356*b1cdbd2cSJim Jagielski         {
357*b1cdbd2cSJim Jagielski             // Get a list of the matching resources and create deactivation
358*b1cdbd2cSJim Jagielski             // requests for them.
359*b1cdbd2cSJim Jagielski             Sequence<Reference<XResourceId> > aResourceList (
360*b1cdbd2cSJim Jagielski                 mpImplementation->mxRequestedConfiguration->getResources(
361*b1cdbd2cSJim Jagielski                     rxResourceId->getAnchor(),
362*b1cdbd2cSJim Jagielski                     rxResourceId->getResourceTypePrefix(),
363*b1cdbd2cSJim Jagielski                     AnchorBindingMode_DIRECT));
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski             for (sal_Int32 nIndex=0; nIndex<aResourceList.getLength(); ++nIndex)
366*b1cdbd2cSJim Jagielski             {
367*b1cdbd2cSJim Jagielski                 // Do not request the deactivation of the resource for which
368*b1cdbd2cSJim Jagielski                 // this method was called.  Doing it would not change the
369*b1cdbd2cSJim Jagielski                 // outcome but would result in unnecessary work.
370*b1cdbd2cSJim Jagielski                 if (rxResourceId->compareTo(aResourceList[nIndex]) == 0)
371*b1cdbd2cSJim Jagielski                     continue;
372*b1cdbd2cSJim Jagielski 
373*b1cdbd2cSJim Jagielski                 // Request the deactivation of a resource and all resources
374*b1cdbd2cSJim Jagielski                 // linked to it.
375*b1cdbd2cSJim Jagielski                 requestResourceDeactivation(aResourceList[nIndex]);
376*b1cdbd2cSJim Jagielski             }
377*b1cdbd2cSJim Jagielski         }
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski         Reference<XConfigurationChangeRequest> xRequest(
380*b1cdbd2cSJim Jagielski             new GenericConfigurationChangeRequest(
381*b1cdbd2cSJim Jagielski                 rxResourceId,
382*b1cdbd2cSJim Jagielski                 GenericConfigurationChangeRequest::Activation));
383*b1cdbd2cSJim Jagielski         postChangeRequest(xRequest);
384*b1cdbd2cSJim Jagielski     }
385*b1cdbd2cSJim Jagielski }
386*b1cdbd2cSJim Jagielski 
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski 
requestResourceDeactivation(const Reference<XResourceId> & rxResourceId)390*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationController::requestResourceDeactivation (
391*b1cdbd2cSJim Jagielski     const Reference<XResourceId>& rxResourceId)
392*b1cdbd2cSJim Jagielski     throw (RuntimeException)
393*b1cdbd2cSJim Jagielski {
394*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
395*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski #if defined VERBOSE && VERBOSE>=2
398*b1cdbd2cSJim Jagielski     OSL_TRACE("ConfigurationController::requestResourceDeactivation() %s\n",
399*b1cdbd2cSJim Jagielski             OUStringToOString(
400*b1cdbd2cSJim Jagielski                 FrameworkHelper::ResourceIdToString(rxResourceId), RTL_TEXTENCODING_UTF8).getStr());
401*b1cdbd2cSJim Jagielski #endif
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski     if (rxResourceId.is())
404*b1cdbd2cSJim Jagielski     {
405*b1cdbd2cSJim Jagielski         // Request deactivation of all resources linked to the specified one
406*b1cdbd2cSJim Jagielski         // as well.
407*b1cdbd2cSJim Jagielski         const Sequence<Reference<XResourceId> > aLinkedResources (
408*b1cdbd2cSJim Jagielski             mpImplementation->mxRequestedConfiguration->getResources(
409*b1cdbd2cSJim Jagielski                 rxResourceId,
410*b1cdbd2cSJim Jagielski                 OUString(),
411*b1cdbd2cSJim Jagielski                 AnchorBindingMode_DIRECT));
412*b1cdbd2cSJim Jagielski         const sal_Int32 nCount (aLinkedResources.getLength());
413*b1cdbd2cSJim Jagielski         for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
414*b1cdbd2cSJim Jagielski         {
415*b1cdbd2cSJim Jagielski             // We do not add deactivation requests directly but call this
416*b1cdbd2cSJim Jagielski             // method recursively, so that when one time there are resources
417*b1cdbd2cSJim Jagielski             // linked to linked resources, these are handled correctly, too.
418*b1cdbd2cSJim Jagielski             requestResourceDeactivation(aLinkedResources[nIndex]);
419*b1cdbd2cSJim Jagielski         }
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski         // Add a deactivation request for the specified resource.
422*b1cdbd2cSJim Jagielski         Reference<XConfigurationChangeRequest> xRequest(
423*b1cdbd2cSJim Jagielski             new GenericConfigurationChangeRequest(
424*b1cdbd2cSJim Jagielski                 rxResourceId,
425*b1cdbd2cSJim Jagielski                 GenericConfigurationChangeRequest::Deactivation));
426*b1cdbd2cSJim Jagielski         postChangeRequest(xRequest);
427*b1cdbd2cSJim Jagielski     }
428*b1cdbd2cSJim Jagielski }
429*b1cdbd2cSJim Jagielski 
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski 
getResource(const Reference<XResourceId> & rxResourceId)433*b1cdbd2cSJim Jagielski Reference<XResource> SAL_CALL ConfigurationController::getResource (
434*b1cdbd2cSJim Jagielski     const Reference<XResourceId>& rxResourceId)
435*b1cdbd2cSJim Jagielski     throw (RuntimeException)
436*b1cdbd2cSJim Jagielski {
437*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
438*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski     ConfigurationControllerResourceManager::ResourceDescriptor aDescriptor (
441*b1cdbd2cSJim Jagielski         mpImplementation->mpResourceManager->GetResource(rxResourceId));
442*b1cdbd2cSJim Jagielski     return aDescriptor.mxResource;
443*b1cdbd2cSJim Jagielski }
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski 
update(void)448*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationController::update (void)
449*b1cdbd2cSJim Jagielski     throw (RuntimeException)
450*b1cdbd2cSJim Jagielski {
451*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
452*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski     if (mpImplementation->mpQueueProcessor->IsEmpty())
455*b1cdbd2cSJim Jagielski     {
456*b1cdbd2cSJim Jagielski         // The queue is empty.  Add another request that does nothing but
457*b1cdbd2cSJim Jagielski         // asynchronously trigger a request for an update.
458*b1cdbd2cSJim Jagielski         mpImplementation->mpQueueProcessor->AddRequest(new UpdateRequest());
459*b1cdbd2cSJim Jagielski     }
460*b1cdbd2cSJim Jagielski     else
461*b1cdbd2cSJim Jagielski     {
462*b1cdbd2cSJim Jagielski         // The queue is not empty, so we rely on the queue processor to
463*b1cdbd2cSJim Jagielski         // request an update automatically when the queue becomes empty.
464*b1cdbd2cSJim Jagielski     }
465*b1cdbd2cSJim Jagielski }
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski 
hasPendingRequests(void)470*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ConfigurationController::hasPendingRequests (void)
471*b1cdbd2cSJim Jagielski     throw (RuntimeException)
472*b1cdbd2cSJim Jagielski {
473*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
474*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
475*b1cdbd2cSJim Jagielski 
476*b1cdbd2cSJim Jagielski     return ! mpImplementation->mpQueueProcessor->IsEmpty();
477*b1cdbd2cSJim Jagielski }
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski 
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski 
postChangeRequest(const Reference<XConfigurationChangeRequest> & rxRequest)483*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationController::postChangeRequest (
484*b1cdbd2cSJim Jagielski     const Reference<XConfigurationChangeRequest>& rxRequest)
485*b1cdbd2cSJim Jagielski     throw (RuntimeException)
486*b1cdbd2cSJim Jagielski {
487*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
488*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski     mpImplementation->mpQueueProcessor->AddRequest(rxRequest);
491*b1cdbd2cSJim Jagielski }
492*b1cdbd2cSJim Jagielski 
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski 
getRequestedConfiguration(void)496*b1cdbd2cSJim Jagielski Reference<XConfiguration> SAL_CALL ConfigurationController::getRequestedConfiguration (void)
497*b1cdbd2cSJim Jagielski     throw (RuntimeException)
498*b1cdbd2cSJim Jagielski {
499*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
500*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
501*b1cdbd2cSJim Jagielski 
502*b1cdbd2cSJim Jagielski     if (mpImplementation->mxRequestedConfiguration.is())
503*b1cdbd2cSJim Jagielski         return Reference<XConfiguration>(
504*b1cdbd2cSJim Jagielski             mpImplementation->mxRequestedConfiguration->createClone(), UNO_QUERY);
505*b1cdbd2cSJim Jagielski     else
506*b1cdbd2cSJim Jagielski         return Reference<XConfiguration>();
507*b1cdbd2cSJim Jagielski }
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski 
510*b1cdbd2cSJim Jagielski 
511*b1cdbd2cSJim Jagielski 
getCurrentConfiguration(void)512*b1cdbd2cSJim Jagielski Reference<XConfiguration> SAL_CALL ConfigurationController::getCurrentConfiguration (void)
513*b1cdbd2cSJim Jagielski     throw (RuntimeException)
514*b1cdbd2cSJim Jagielski {
515*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
516*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
517*b1cdbd2cSJim Jagielski 
518*b1cdbd2cSJim Jagielski     Reference<XConfiguration> xCurrentConfiguration(
519*b1cdbd2cSJim Jagielski         mpImplementation->mpConfigurationUpdater->GetCurrentConfiguration());
520*b1cdbd2cSJim Jagielski     if (xCurrentConfiguration.is())
521*b1cdbd2cSJim Jagielski         return Reference<XConfiguration>(xCurrentConfiguration->createClone(), UNO_QUERY);
522*b1cdbd2cSJim Jagielski     else
523*b1cdbd2cSJim Jagielski         return Reference<XConfiguration>();
524*b1cdbd2cSJim Jagielski }
525*b1cdbd2cSJim Jagielski 
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski 
529*b1cdbd2cSJim Jagielski /** The given configuration is restored by generating the appropriate set of
530*b1cdbd2cSJim Jagielski     activation and deactivation requests.
531*b1cdbd2cSJim Jagielski */
restoreConfiguration(const Reference<XConfiguration> & rxNewConfiguration)532*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationController::restoreConfiguration (
533*b1cdbd2cSJim Jagielski     const Reference<XConfiguration>& rxNewConfiguration)
534*b1cdbd2cSJim Jagielski     throw (RuntimeException)
535*b1cdbd2cSJim Jagielski {
536*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
537*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
538*b1cdbd2cSJim Jagielski 
539*b1cdbd2cSJim Jagielski     // We will probably be making a couple of activation and deactivation
540*b1cdbd2cSJim Jagielski     // requests so lock the configuration controller and let it later update
541*b1cdbd2cSJim Jagielski     // all changes at once.
542*b1cdbd2cSJim Jagielski     ::boost::shared_ptr<ConfigurationUpdaterLock> pLock (
543*b1cdbd2cSJim Jagielski         mpImplementation->mpConfigurationUpdater->GetLock());
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski     // Get lists of resources that are to be activated or deactivated.
546*b1cdbd2cSJim Jagielski     Reference<XConfiguration> xCurrentConfiguration (mpImplementation->mxRequestedConfiguration);
547*b1cdbd2cSJim Jagielski #if defined VERBOSE && VERBOSE>=1
548*b1cdbd2cSJim Jagielski     OSL_TRACE("ConfigurationController::restoreConfiguration(\n");
549*b1cdbd2cSJim Jagielski     ConfigurationTracer::TraceConfiguration(rxNewConfiguration, "requested configuration");
550*b1cdbd2cSJim Jagielski     ConfigurationTracer::TraceConfiguration(xCurrentConfiguration, "current configuration");
551*b1cdbd2cSJim Jagielski #endif
552*b1cdbd2cSJim Jagielski     ConfigurationClassifier aClassifier (rxNewConfiguration, xCurrentConfiguration);
553*b1cdbd2cSJim Jagielski     aClassifier.Partition();
554*b1cdbd2cSJim Jagielski #if defined VERBOSE && VERBOSE>=3
555*b1cdbd2cSJim Jagielski     aClassifier.TraceResourceIdVector(
556*b1cdbd2cSJim Jagielski         "requested but not current resources:\n", aClassifier.GetC1minusC2());
557*b1cdbd2cSJim Jagielski     aClassifier.TraceResourceIdVector(
558*b1cdbd2cSJim Jagielski         "current but not requested resources:\n", aClassifier.GetC2minusC1());
559*b1cdbd2cSJim Jagielski     aClassifier.TraceResourceIdVector(
560*b1cdbd2cSJim Jagielski         "requested and current resources:\n", aClassifier.GetC1andC2());
561*b1cdbd2cSJim Jagielski #endif
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski     ConfigurationClassifier::ResourceIdVector::const_iterator iResource;
564*b1cdbd2cSJim Jagielski 
565*b1cdbd2cSJim Jagielski     // Request the deactivation of resources that are not requested in the
566*b1cdbd2cSJim Jagielski     // new configuration.
567*b1cdbd2cSJim Jagielski     const ConfigurationClassifier::ResourceIdVector& rResourcesToDeactivate (
568*b1cdbd2cSJim Jagielski         aClassifier.GetC2minusC1());
569*b1cdbd2cSJim Jagielski     for (iResource=rResourcesToDeactivate.begin();
570*b1cdbd2cSJim Jagielski          iResource!=rResourcesToDeactivate.end();
571*b1cdbd2cSJim Jagielski          ++iResource)
572*b1cdbd2cSJim Jagielski     {
573*b1cdbd2cSJim Jagielski         requestResourceDeactivation(*iResource);
574*b1cdbd2cSJim Jagielski     }
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski     // Request the activation of resources that are requested in the
577*b1cdbd2cSJim Jagielski     // new configuration but are not part of the current configuration.
578*b1cdbd2cSJim Jagielski     const ConfigurationClassifier::ResourceIdVector& rResourcesToActivate (
579*b1cdbd2cSJim Jagielski         aClassifier.GetC1minusC2());
580*b1cdbd2cSJim Jagielski     for (iResource=rResourcesToActivate.begin();
581*b1cdbd2cSJim Jagielski          iResource!=rResourcesToActivate.end();
582*b1cdbd2cSJim Jagielski          ++iResource)
583*b1cdbd2cSJim Jagielski     {
584*b1cdbd2cSJim Jagielski         requestResourceActivation(*iResource, ResourceActivationMode_ADD);
585*b1cdbd2cSJim Jagielski     }
586*b1cdbd2cSJim Jagielski 
587*b1cdbd2cSJim Jagielski     pLock.reset();
588*b1cdbd2cSJim Jagielski }
589*b1cdbd2cSJim Jagielski 
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski 
593*b1cdbd2cSJim Jagielski //----- XResourceFactoryManager -----------------------------------------------
594*b1cdbd2cSJim Jagielski 
addResourceFactory(const OUString & sResourceURL,const Reference<XResourceFactory> & rxResourceFactory)595*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationController::addResourceFactory(
596*b1cdbd2cSJim Jagielski     const OUString& sResourceURL,
597*b1cdbd2cSJim Jagielski     const Reference<XResourceFactory>& rxResourceFactory)
598*b1cdbd2cSJim Jagielski     throw (RuntimeException)
599*b1cdbd2cSJim Jagielski {
600*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
601*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
602*b1cdbd2cSJim Jagielski     mpImplementation->mpResourceFactoryContainer->AddFactory(sResourceURL, rxResourceFactory);
603*b1cdbd2cSJim Jagielski }
604*b1cdbd2cSJim Jagielski 
605*b1cdbd2cSJim Jagielski 
606*b1cdbd2cSJim Jagielski 
607*b1cdbd2cSJim Jagielski 
removeResourceFactoryForURL(const OUString & sResourceURL)608*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationController::removeResourceFactoryForURL(
609*b1cdbd2cSJim Jagielski     const OUString& sResourceURL)
610*b1cdbd2cSJim Jagielski     throw (RuntimeException)
611*b1cdbd2cSJim Jagielski {
612*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
613*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
614*b1cdbd2cSJim Jagielski     mpImplementation->mpResourceFactoryContainer->RemoveFactoryForURL(sResourceURL);
615*b1cdbd2cSJim Jagielski }
616*b1cdbd2cSJim Jagielski 
617*b1cdbd2cSJim Jagielski 
618*b1cdbd2cSJim Jagielski 
619*b1cdbd2cSJim Jagielski 
removeResourceFactoryForReference(const Reference<XResourceFactory> & rxResourceFactory)620*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationController::removeResourceFactoryForReference(
621*b1cdbd2cSJim Jagielski     const Reference<XResourceFactory>& rxResourceFactory)
622*b1cdbd2cSJim Jagielski     throw (RuntimeException)
623*b1cdbd2cSJim Jagielski {
624*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
625*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
626*b1cdbd2cSJim Jagielski     mpImplementation->mpResourceFactoryContainer->RemoveFactoryForReference(rxResourceFactory);
627*b1cdbd2cSJim Jagielski }
628*b1cdbd2cSJim Jagielski 
629*b1cdbd2cSJim Jagielski 
630*b1cdbd2cSJim Jagielski 
631*b1cdbd2cSJim Jagielski 
getResourceFactory(const OUString & sResourceURL)632*b1cdbd2cSJim Jagielski Reference<XResourceFactory> SAL_CALL ConfigurationController::getResourceFactory (
633*b1cdbd2cSJim Jagielski     const OUString& sResourceURL)
634*b1cdbd2cSJim Jagielski     throw (RuntimeException)
635*b1cdbd2cSJim Jagielski {
636*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
637*b1cdbd2cSJim Jagielski     ThrowIfDisposed();
638*b1cdbd2cSJim Jagielski 
639*b1cdbd2cSJim Jagielski     return mpImplementation->mpResourceFactoryContainer->GetFactory(sResourceURL);
640*b1cdbd2cSJim Jagielski }
641*b1cdbd2cSJim Jagielski 
642*b1cdbd2cSJim Jagielski 
643*b1cdbd2cSJim Jagielski 
644*b1cdbd2cSJim Jagielski 
645*b1cdbd2cSJim Jagielski //----- XInitialization -------------------------------------------------------
646*b1cdbd2cSJim Jagielski 
initialize(const Sequence<Any> & aArguments)647*b1cdbd2cSJim Jagielski void SAL_CALL ConfigurationController::initialize (const Sequence<Any>& aArguments)
648*b1cdbd2cSJim Jagielski     throw (Exception, RuntimeException)
649*b1cdbd2cSJim Jagielski {
650*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard (maMutex);
651*b1cdbd2cSJim Jagielski 
652*b1cdbd2cSJim Jagielski     if (aArguments.getLength() == 1)
653*b1cdbd2cSJim Jagielski     {
654*b1cdbd2cSJim Jagielski         const ::vos::OGuard aSolarGuard (Application::GetSolarMutex());
655*b1cdbd2cSJim Jagielski 
656*b1cdbd2cSJim Jagielski         mpImplementation.reset(new Implementation(
657*b1cdbd2cSJim Jagielski             *this,
658*b1cdbd2cSJim Jagielski             Reference<frame::XController>(aArguments[0], UNO_QUERY_THROW)));
659*b1cdbd2cSJim Jagielski     }
660*b1cdbd2cSJim Jagielski }
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski 
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski 
665*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
666*b1cdbd2cSJim Jagielski 
ThrowIfDisposed(void) const667*b1cdbd2cSJim Jagielski void ConfigurationController::ThrowIfDisposed (void) const
668*b1cdbd2cSJim Jagielski     throw (::com::sun::star::lang::DisposedException)
669*b1cdbd2cSJim Jagielski {
670*b1cdbd2cSJim Jagielski 	if (mbIsDisposed)
671*b1cdbd2cSJim Jagielski 	{
672*b1cdbd2cSJim Jagielski         throw lang::DisposedException (
673*b1cdbd2cSJim Jagielski             OUString(RTL_CONSTASCII_USTRINGPARAM(
674*b1cdbd2cSJim Jagielski                 "ConfigurationController object has already been disposed")),
675*b1cdbd2cSJim Jagielski             const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
676*b1cdbd2cSJim Jagielski     }
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski     if (mpImplementation.get() == NULL)
679*b1cdbd2cSJim Jagielski     {
680*b1cdbd2cSJim Jagielski         OSL_ASSERT(mpImplementation.get() != NULL);
681*b1cdbd2cSJim Jagielski         throw RuntimeException(
682*b1cdbd2cSJim Jagielski             OUString(RTL_CONSTASCII_USTRINGPARAM(
683*b1cdbd2cSJim Jagielski                 "ConfigurationController not initialized")),
684*b1cdbd2cSJim Jagielski             const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
685*b1cdbd2cSJim Jagielski     }
686*b1cdbd2cSJim Jagielski }
687*b1cdbd2cSJim Jagielski 
688*b1cdbd2cSJim Jagielski 
689*b1cdbd2cSJim Jagielski 
690*b1cdbd2cSJim Jagielski 
691*b1cdbd2cSJim Jagielski //===== ConfigurationController::Implementation ===============================
692*b1cdbd2cSJim Jagielski 
Implementation(ConfigurationController & rController,const Reference<frame::XController> & rxController)693*b1cdbd2cSJim Jagielski ConfigurationController::Implementation::Implementation (
694*b1cdbd2cSJim Jagielski     ConfigurationController& rController,
695*b1cdbd2cSJim Jagielski     const Reference<frame::XController>& rxController)
696*b1cdbd2cSJim Jagielski     : mxControllerManager(rxController, UNO_QUERY_THROW),
697*b1cdbd2cSJim Jagielski       mpBroadcaster(new ConfigurationControllerBroadcaster(&rController)),
698*b1cdbd2cSJim Jagielski       mxRequestedConfiguration(new Configuration(&rController, true)),
699*b1cdbd2cSJim Jagielski       mpBase(NULL),
700*b1cdbd2cSJim Jagielski       mpResourceFactoryContainer(new ResourceFactoryManager(mxControllerManager)),
701*b1cdbd2cSJim Jagielski       mpResourceManager(
702*b1cdbd2cSJim Jagielski           new ConfigurationControllerResourceManager(mpResourceFactoryContainer,mpBroadcaster)),
703*b1cdbd2cSJim Jagielski       mpConfigurationUpdater(
704*b1cdbd2cSJim Jagielski           new ConfigurationUpdater(mpBroadcaster, mpResourceManager,mxControllerManager)),
705*b1cdbd2cSJim Jagielski       mpQueueProcessor(new ChangeRequestQueueProcessor(&rController,mpConfigurationUpdater)),
706*b1cdbd2cSJim Jagielski       mpConfigurationUpdaterLock(),
707*b1cdbd2cSJim Jagielski       mnLockCount(0)
708*b1cdbd2cSJim Jagielski {
709*b1cdbd2cSJim Jagielski     mpQueueProcessor->SetConfiguration(mxRequestedConfiguration);
710*b1cdbd2cSJim Jagielski }
711*b1cdbd2cSJim Jagielski 
712*b1cdbd2cSJim Jagielski 
713*b1cdbd2cSJim Jagielski 
714*b1cdbd2cSJim Jagielski 
~Implementation(void)715*b1cdbd2cSJim Jagielski ConfigurationController::Implementation::~Implementation (void)
716*b1cdbd2cSJim Jagielski {
717*b1cdbd2cSJim Jagielski }
718*b1cdbd2cSJim Jagielski 
719*b1cdbd2cSJim Jagielski 
720*b1cdbd2cSJim Jagielski 
721*b1cdbd2cSJim Jagielski 
722*b1cdbd2cSJim Jagielski } } // end of namespace sd::framework
723