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