1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_unotools.hxx"
26 
27 #include "itemholder1.hxx"
28 
29 //-----------------------------------------------
30 // includes
31 #include <comphelper/processfactory.hxx>
32 #include <com/sun/star/lang/XComponent.hpp>
33 
34 #include <unotools/misccfg.hxx>
35 #include <unotools/undoopt.hxx>
36 #include <unotools/useroptions.hxx>
37 #include <unotools/accelcfg.hxx>
38 #include <unotools/cacheoptions.hxx>
39 #include <unotools/cmdoptions.hxx>
40 #include <unotools/compatibility.hxx>
41 #include <unotools/defaultoptions.hxx>
42 #include <unotools/dynamicmenuoptions.hxx>
43 #include <unotools/eventcfg.hxx>
44 #include <unotools/extendedsecurityoptions.hxx>
45 #include <unotools/fltrcfg.hxx>
46 #include <unotools/fontoptions.hxx>
47 #include <unotools/historyoptions.hxx>
48 #include <unotools/inetoptions.hxx>
49 #include <unotools/internaloptions.hxx>
50 #include <unotools/javaoptions.hxx>
51 #include <unotools/lingucfg.hxx>
52 #include <unotools/localisationoptions.hxx>
53 #include <unotools/moduleoptions.hxx>
54 #include <unotools/pathoptions.hxx>
55 #include <unotools/printwarningoptions.hxx>
56 #include <unotools/optionsdlg.hxx>
57 #include <unotools/saveopt.hxx>
58 #include <unotools/searchopt.hxx>
59 #include <unotools/securityoptions.hxx>
60 #include <unotools/sourceviewconfig.hxx>
61 #include <unotools/startoptions.hxx>
62 #include <unotools/viewoptions.hxx>
63 #include <unotools/workingsetoptions.hxx>
64 #include <unotools/xmlaccelcfg.hxx>
65 #include <unotools/options.hxx>
66 #include <unotools/syslocaleoptions.hxx>
67 
68 //-----------------------------------------------
69 // namespaces
70 
71 namespace css = ::com::sun::star;
72 
73 //-----------------------------------------------
74 // declarations
75 
76 //-----------------------------------------------
ItemHolder1()77 ItemHolder1::ItemHolder1()
78     : ItemHolderMutexBase()
79 {
80     try
81     {
82         css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory();
83         css::uno::Reference< css::lang::XComponent > xCfg(
84             xSMGR->createInstance(::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider")),
85             css::uno::UNO_QUERY);
86         if (xCfg.is())
87             xCfg->addEventListener(static_cast< css::lang::XEventListener* >(this));
88     }
89 // #i37892  got errorhandling from   ConfigManager::GetConfigurationProvider()
90 #ifdef DBG_UTIL
91     catch(css::uno::Exception& rEx)
92 	{
93         static sal_Bool bMessage = sal_True;
94         if(bMessage)
95         {
96             bMessage = sal_False;
97             ::rtl::OString sMsg("CreateInstance with arguments exception: ");
98             sMsg += ::rtl::OString(rEx.Message.getStr(),
99                         rEx.Message.getLength(),
100                         RTL_TEXTENCODING_ASCII_US);
101             OSL_ENSURE(sal_False, sMsg.getStr());
102         }
103 	}
104 #else
105 	catch(css::uno::Exception&){}
106 #endif
107 }
108 
109 //-----------------------------------------------
~ItemHolder1()110 ItemHolder1::~ItemHolder1()
111 {
112     impl_releaseAllItems();
113 }
114 
115 //-----------------------------------------------
holdConfigItem(EItem eItem)116 void ItemHolder1::holdConfigItem(EItem eItem)
117 {
118     static ItemHolder1* pHolder = new ItemHolder1();
119     pHolder->impl_addItem(eItem);
120 }
121 
122 //-----------------------------------------------
disposing(const css::lang::EventObject &)123 void SAL_CALL ItemHolder1::disposing(const css::lang::EventObject&)
124     throw(css::uno::RuntimeException)
125 {
126     css::uno::Reference< css::uno::XInterface > xSelfHold(static_cast< css::lang::XEventListener* >(this), css::uno::UNO_QUERY);
127     impl_releaseAllItems();
128 }
129 
130 //-----------------------------------------------
impl_addItem(EItem eItem)131 void ItemHolder1::impl_addItem(EItem eItem)
132 {
133     ::osl::ResettableMutexGuard aLock(m_aLock);
134 
135     TItems::const_iterator pIt;
136     for (  pIt  = m_lItems.begin();
137            pIt != m_lItems.end()  ;
138          ++pIt                    )
139     {
140         const TItemInfo& rInfo = *pIt;
141         if (rInfo.eItem == eItem)
142             return;
143     }
144 
145     TItemInfo aNewItem;
146     aNewItem.eItem = eItem;
147     impl_newItem(aNewItem);
148     if (aNewItem.pItem)
149         m_lItems.push_back(aNewItem);
150 }
151 
152 //-----------------------------------------------
impl_releaseAllItems()153 void ItemHolder1::impl_releaseAllItems()
154 {
155     ::osl::ResettableMutexGuard aLock(m_aLock);
156 
157     TItems::iterator pIt;
158     for (  pIt  = m_lItems.begin();
159            pIt != m_lItems.end()  ;
160          ++pIt                    )
161     {
162         TItemInfo& rInfo = *pIt;
163         impl_deleteItem(rInfo);
164     }
165     m_lItems.clear();
166 }
167 
168 //-----------------------------------------------
impl_newItem(TItemInfo & rItem)169 void ItemHolder1::impl_newItem(TItemInfo& rItem)
170 {
171     switch(rItem.eItem)
172     {
173         case E_ACCELCFG :
174             rItem.pItem = new SvtAcceleratorConfiguration();
175             break;
176 
177         case E_CMDOPTIONS :
178             rItem.pItem = new SvtCommandOptions();
179             break;
180 
181         case E_COMPATIBILITY :
182             rItem.pItem = new SvtCompatibilityOptions();
183             break;
184 
185         case E_DEFAULTOPTIONS :
186             rItem.pItem = new SvtDefaultOptions();
187             break;
188 
189         case E_DYNAMICMENUOPTIONS :
190             rItem.pItem = new SvtDynamicMenuOptions();
191             break;
192 
193         case E_EVENTCFG :
194             //rItem.pItem = new GlobalEventConfig();
195             break;
196 
197         case E_EXTENDEDSECURITYOPTIONS :
198             rItem.pItem = new SvtExtendedSecurityOptions();
199             break;
200 
201         case E_FLTRCFG :
202 // no ref count            rItem.pItem = new SvtFilterOptions();
203             break;
204 
205         case E_FONTOPTIONS :
206             rItem.pItem = new SvtFontOptions();
207             break;
208 
209         case E_HISTORYOPTIONS :
210             rItem.pItem = new SvtHistoryOptions();
211             break;
212 
213         case E_INETOPTIONS :
214             rItem.pItem = new SvtInetOptions();
215             break;
216 
217         case E_INTERNALOPTIONS :
218             rItem.pItem = new SvtInternalOptions();
219             break;
220 
221         case E_JAVAOPTIONS :
222 // no ref count            rItem.pItem = new SvtJavaOptions();
223             break;
224 
225         case E_LINGUCFG :
226             rItem.pItem = new SvtLinguConfig();
227             break;
228 
229         case E_LOCALISATIONOPTIONS :
230             rItem.pItem = new SvtLocalisationOptions();
231             break;
232 
233         case E_MODULEOPTIONS :
234             rItem.pItem = new SvtModuleOptions();
235             break;
236 
237         case E_OPTIONSDLGOPTIONS :
238             rItem.pItem = new SvtOptionsDialogOptions();
239             break;
240 
241         case E_PATHOPTIONS :
242             rItem.pItem = new SvtPathOptions();
243             break;
244 
245         case E_PRINTWARNINGOPTIONS :
246             rItem.pItem = new SvtPrintWarningOptions();
247             break;
248 
249         case E_MISCCFG :
250 			rItem.pItem = new ::utl::MiscCfg();
251             break;
252 
253         case E_SAVEOPTIONS :
254             rItem.pItem = new SvtSaveOptions();
255             break;
256 
257         case E_SEARCHOPT :
258 // no ref count            rItem.pItem = new SvtSearchOptions();
259             break;
260 
261         case E_SECURITYOPTIONS :
262             rItem.pItem = new SvtSecurityOptions();
263             break;
264 
265         case E_SOURCEVIEWCONFIG :
266             rItem.pItem = new ::utl::SourceViewConfig();
267             break;
268 
269         case E_STARTOPTIONS :
270             rItem.pItem = new SvtStartOptions();
271             break;
272 
273         case E_VIEWOPTIONS_DIALOG :
274             rItem.pItem = new SvtViewOptions(E_DIALOG, ::rtl::OUString());
275             break;
276 
277         case E_VIEWOPTIONS_TABDIALOG :
278             rItem.pItem = new SvtViewOptions(E_TABDIALOG, ::rtl::OUString());
279             break;
280 
281         case E_VIEWOPTIONS_TABPAGE :
282             rItem.pItem = new SvtViewOptions(E_TABPAGE, ::rtl::OUString());
283             break;
284 
285         case E_VIEWOPTIONS_WINDOW :
286             rItem.pItem = new SvtViewOptions(E_WINDOW, ::rtl::OUString());
287             break;
288 
289         case E_WORKINGSETOPTIONS :
290             rItem.pItem = new SvtWorkingSetOptions();
291             break;
292 
293         case E_XMLACCELCFG :
294             // ??? TODO
295             break;
296 
297         case E_UNDOOPTIONS :
298             rItem.pItem = new SvtUndoOptions();
299             break;
300 
301         case E_USEROPTIONS :
302             rItem.pItem = new SvtUserOptions();
303             break;
304 
305         case E_SYSLOCALEOPTIONS :
306             rItem.pItem = new SvtSysLocaleOptions();
307             break;
308 
309 		default:
310             OSL_ASSERT( "unknown item type" );
311             break;
312     }
313 }
314 
315 //-----------------------------------------------
impl_deleteItem(TItemInfo & rItem)316 void ItemHolder1::impl_deleteItem(TItemInfo& rItem)
317 {
318     if (rItem.pItem)
319     {
320         delete rItem.pItem;
321         rItem.pItem = 0;
322     }
323 }
324 
325