xref: /trunk/main/framework/source/accelerators/documentacceleratorconfiguration.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_framework.hxx"
30 #include <accelerators/documentacceleratorconfiguration.hxx>
31 
32 #ifndef __FRAMEWORK_XML_ACCELERATORCONFIGURATIONREADER_HXX_
33 #include <xml/acceleratorconfigurationreader.hxx>
34 #endif
35 
36 #ifndef __FRAMEWORK_XML_ACCELERATORCONFIGURATIONWRITER_HXX_
37 #include <xml/acceleratorconfigurationwriter.hxx>
38 #endif
39 
40 #ifndef __FRAMEWORK_XML_SAXNAMESPACEFILTER_HXX_
41 #include <xml/saxnamespacefilter.hxx>
42 #endif
43 
44 //_______________________________________________
45 // own includes
46 #include <threadhelp/readguard.hxx>
47 #include <threadhelp/writeguard.hxx>
48 
49 #ifndef __FRAMEWORK_ACCELERATORCONST_H_
50 #include <acceleratorconst.h>
51 #endif
52 #include <services.h>
53 
54 //_______________________________________________
55 // interface includes
56 
57 #ifndef _COM_SUN_STAR_IO_XACTIVEDATASOURCE_HPP_
58 #include <com/sun/star/io/XActiveDataSource.hpp>
59 #endif
60 
61 #ifndef _COM_SUN_STAR_IO_XSEEKABLE_HPP_
62 #include <com/sun/star/io/XSeekable.hpp>
63 #endif
64 
65 #ifndef _COM_SUN_STAR_IO_XTRUNCATE_HPP_
66 #include <com/sun/star/io/XTruncate.hpp>
67 #endif
68 
69 #ifndef _COM_SUN_STAR_EMBED_ELEMENTMODES_HPP_
70 #include <com/sun/star/embed/ElementModes.hpp>
71 #endif
72 
73 #ifndef _COM_SUN_STAR_XML_SAX_INPUTSOURCE_HPP_
74 #include <com/sun/star/xml/sax/InputSource.hpp>
75 #endif
76 
77 #ifndef _COM_SUN_STAR_XML_SAX_XPARSER_HPP_
78 #include <com/sun/star/xml/sax/XParser.hpp>
79 #endif
80 
81 //_______________________________________________
82 // other includes
83 
84 #ifndef _COMPHELPER_SEQUENCEASHASHMAP_HXX
85 #include <comphelper/sequenceashashmap.hxx>
86 #endif
87 
88 //_______________________________________________
89 // const
90 
91 namespace framework
92 {
93 
94 //-----------------------------------------------
95 // XInterface, XTypeProvider, XServiceInfo
96 DEFINE_XINTERFACE_2(DocumentAcceleratorConfiguration                   ,
97                     XMLBasedAcceleratorConfiguration                           ,
98                     DIRECT_INTERFACE(css::lang::XServiceInfo)          ,
99                     DIRECT_INTERFACE(css::lang::XInitialization))
100 //                    DIRECT_INTERFACE(css::ui::XUIConfigurationStorage))
101 
102 DEFINE_XTYPEPROVIDER_2_WITH_BASECLASS(DocumentAcceleratorConfiguration ,
103                                       XMLBasedAcceleratorConfiguration         ,
104                                       css::lang::XServiceInfo          ,
105                                       css::lang::XInitialization)
106 //                                      css::ui::XUIConfigurationStorage)
107 
108 DEFINE_XSERVICEINFO_MULTISERVICE(DocumentAcceleratorConfiguration                   ,
109                                  ::cppu::OWeakObject                                ,
110                                  SERVICENAME_DOCUMENTACCELERATORCONFIGURATION       ,
111                                  IMPLEMENTATIONNAME_DOCUMENTACCELERATORCONFIGURATION)
112 
113 DEFINE_INIT_SERVICE(DocumentAcceleratorConfiguration,
114                     {
115                         /*Attention
116                         I think we don't need any mutex or lock here ... because we are called by our own static method impl_createInstance()
117                         to create a new instance of this class by our own supported service factory.
118                         see macro DEFINE_XSERVICEINFO_MULTISERVICE and "impl_initService()" for further informations!
119                         */
120                     }
121                    )
122 
123 //-----------------------------------------------
124 DocumentAcceleratorConfiguration::DocumentAcceleratorConfiguration(const css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR)
125     : XMLBasedAcceleratorConfiguration(xSMGR)
126 {
127 }
128 
129 //-----------------------------------------------
130 DocumentAcceleratorConfiguration::~DocumentAcceleratorConfiguration()
131 {
132     m_aPresetHandler.removeStorageListener(this);
133 }
134 
135 //-----------------------------------------------
136 void SAL_CALL DocumentAcceleratorConfiguration::initialize(const css::uno::Sequence< css::uno::Any >& lArguments)
137     throw(css::uno::Exception       ,
138           css::uno::RuntimeException)
139 {
140     // SAFE -> ----------------------------------
141     WriteGuard aWriteLock(m_aLock);
142 
143     ::comphelper::SequenceAsHashMap lArgs(lArguments);
144     m_xDocumentRoot = lArgs.getUnpackedValueOrDefault(
145                         ::rtl::OUString::createFromAscii("DocumentRoot"),
146                         css::uno::Reference< css::embed::XStorage >());
147 
148     aWriteLock.unlock();
149     // <- SAFE ----------------------------------
150 
151     impl_ts_fillCache();
152 }
153 
154 //-----------------------------------------------
155 void SAL_CALL DocumentAcceleratorConfiguration::setStorage(const css::uno::Reference< css::embed::XStorage >& xStorage)
156     throw(css::uno::RuntimeException)
157 {
158     // Attention! xStorage must be accepted too, if it's NULL !
159 
160     // SAFE -> ----------------------------------
161     WriteGuard aWriteLock(m_aLock);
162     sal_Bool bForgetOldStorages = m_xDocumentRoot.is();
163     m_xDocumentRoot = xStorage;
164     aWriteLock.unlock();
165     // <- SAFE ----------------------------------
166 
167     if (bForgetOldStorages)
168         impl_ts_clearCache();
169 
170     if (xStorage.is())
171         impl_ts_fillCache();
172 }
173 
174 //-----------------------------------------------
175 sal_Bool SAL_CALL DocumentAcceleratorConfiguration::hasStorage()
176     throw(css::uno::RuntimeException)
177 {
178     // SAFE -> ----------------------------------
179     ReadGuard aReadLock(m_aLock);
180     return m_xDocumentRoot.is();
181     // <- SAFE ----------------------------------
182 }
183 
184 //-----------------------------------------------
185 void DocumentAcceleratorConfiguration::impl_ts_fillCache()
186 {
187     // SAFE -> ----------------------------------
188     ReadGuard aReadLock(m_aLock);
189     css::uno::Reference< css::embed::XStorage > xDocumentRoot = m_xDocumentRoot;
190     aReadLock.unlock();
191     // <- SAFE ----------------------------------
192 
193     // Sometimes we must live without a document root.
194     // E.g. if the document is readonly ...
195     if (!xDocumentRoot.is())
196         return;
197 
198     // get current office locale ... but dont cache it.
199     // Otherwise we must be listener on the configuration layer
200     // which seems to superflous for this small implementation .-)
201     ::comphelper::Locale aLocale = impl_ts_getLocale();
202 
203     // May be the current document does not contain any
204     // accelerator config? Handle it gracefully :-)
205     try
206     {
207         // Note: The used preset class is threadsafe by itself ... and live if we live!
208         // We do not need any mutex here.
209 
210         // open the folder, where the configuration exists
211         m_aPresetHandler.connectToResource(
212             PresetHandler::E_DOCUMENT,
213             PresetHandler::RESOURCETYPE_ACCELERATOR(),
214             ::rtl::OUString(),
215             xDocumentRoot,
216             aLocale);
217 
218         DocumentAcceleratorConfiguration::reload();
219         m_aPresetHandler.addStorageListener(this);
220     }
221     /*
222 
223     Sometimes the configuration seams to be corrupted ..
224     So it would be nice if we dont crash the office then .-)
225     #121559#
226 
227     catch(const css::uno::RuntimeException& exRun)
228     { throw exRun; }
229     */
230     catch(const css::uno::Exception&)
231     {}
232 }
233 
234 //-----------------------------------------------
235 void DocumentAcceleratorConfiguration::impl_ts_clearCache()
236 {
237     m_aPresetHandler.forgetCachedStorages();
238 }
239 
240 } // namespace framework
241