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_framework.hxx" 26 #include <accelerators/moduleacceleratorconfiguration.hxx> 27 28 //_______________________________________________ 29 // own includes 30 #include <threadhelp/readguard.hxx> 31 #include <threadhelp/writeguard.hxx> 32 33 #ifndef __FRAMEWORK_ACCELERATORCONST_H_ 34 #include <acceleratorconst.h> 35 #endif 36 #include <services.h> 37 38 //_______________________________________________ 39 // interface includes 40 #include <com/sun/star/beans/XPropertySet.hpp> 41 #include <com/sun/star/lang/XSingleServiceFactory.hpp> 42 #include <com/sun/star/embed/ElementModes.hpp> 43 44 //_______________________________________________ 45 // other includes 46 47 #ifndef _COMPHELPER_SEQUENCEASHASHMAP_HXX 48 #include <comphelper/sequenceashashmap.hxx> 49 #endif 50 #include <vcl/svapp.hxx> 51 52 #ifndef _COMPHELPER_CONFIGURATIONHELPER_HXX_ 53 #include <comphelper/configurationhelper.hxx> 54 #endif 55 56 #ifndef _COM_SUN_STAR_UTIL_XCHANGESNOTIFIER_HPP_ 57 #include <com/sun/star/util/XChangesNotifier.hpp> 58 #endif 59 60 #ifndef _RTL_LOGFILE_HXX_ 61 #include <rtl/logfile.hxx> 62 #endif 63 64 #ifndef _RTL_LOGFILE_HXX_ 65 #include <rtl/logfile.h> 66 #endif 67 68 //_______________________________________________ 69 // const 70 71 namespace framework 72 { 73 74 //----------------------------------------------- 75 // XInterface, XTypeProvider, XServiceInfo 76 DEFINE_XINTERFACE_2(ModuleAcceleratorConfiguration , 77 XCUBasedAcceleratorConfiguration , 78 DIRECT_INTERFACE(css::lang::XServiceInfo) , 79 DIRECT_INTERFACE(css::lang::XInitialization)) 80 81 DEFINE_XTYPEPROVIDER_2_WITH_BASECLASS(ModuleAcceleratorConfiguration, 82 XCUBasedAcceleratorConfiguration , 83 css::lang::XServiceInfo , 84 css::lang::XInitialization ) 85 86 DEFINE_XSERVICEINFO_MULTISERVICE(ModuleAcceleratorConfiguration , 87 ::cppu::OWeakObject , 88 SERVICENAME_MODULEACCELERATORCONFIGURATION , 89 IMPLEMENTATIONNAME_MODULEACCELERATORCONFIGURATION) 90 91 DEFINE_INIT_SERVICE(ModuleAcceleratorConfiguration, 92 { 93 /*Attention 94 I think we don't need any mutex or lock here ... because we are called by our own static method impl_createInstance() 95 to create a new instance of this class by our own supported service factory. 96 see macro DEFINE_XSERVICEINFO_MULTISERVICE and "impl_initService()" for further informations! 97 */ 98 } 99 ) 100 101 //----------------------------------------------- 102 ModuleAcceleratorConfiguration::ModuleAcceleratorConfiguration(const css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR) 103 : XCUBasedAcceleratorConfiguration(xSMGR) 104 { 105 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ModuleAcceleratorConfiguration::ModuleAcceleratorConfiguration" ); 106 } 107 108 //----------------------------------------------- 109 ModuleAcceleratorConfiguration::~ModuleAcceleratorConfiguration() 110 { 111 // m_aPresetHandler.removeStorageListener(this); 112 } 113 114 //----------------------------------------------- 115 void SAL_CALL ModuleAcceleratorConfiguration::initialize(const css::uno::Sequence< css::uno::Any >& lArguments) 116 throw(css::uno::Exception , 117 css::uno::RuntimeException) 118 { 119 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ModuleAcceleratorConfiguration::initialize" ); 120 // SAFE -> ---------------------------------- 121 WriteGuard aWriteLock(m_aLock); 122 123 ::comphelper::SequenceAsHashMap lArgs(lArguments); 124 m_sModule = lArgs.getUnpackedValueOrDefault(::rtl::OUString::createFromAscii("ModuleIdentifier"), ::rtl::OUString()); 125 m_sLocale = lArgs.getUnpackedValueOrDefault(::rtl::OUString::createFromAscii("Locale") , ::rtl::OUString::createFromAscii("x-default")); 126 127 if (!m_sModule.getLength()) 128 throw css::uno::RuntimeException( 129 ::rtl::OUString::createFromAscii("The module dependend accelerator configuration service was initialized with an empty module identifier!"), 130 static_cast< ::cppu::OWeakObject* >(this)); 131 132 aWriteLock.unlock(); 133 // <- SAFE ---------------------------------- 134 135 impl_ts_fillCache(); 136 } 137 138 //----------------------------------------------- 139 void ModuleAcceleratorConfiguration::impl_ts_fillCache() 140 { 141 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "ModuleAcceleratorConfiguration::impl_ts_fillCache" ); 142 // SAFE -> ---------------------------------- 143 ReadGuard aReadLock(m_aLock); 144 ::rtl::OUString sModule = m_sModule; 145 m_sModuleCFG = m_sModule; 146 aReadLock.unlock(); 147 // <- SAFE ---------------------------------- 148 149 // get current office locale ... but dont cache it. 150 // Otherwise we must be listener on the configuration layer 151 // which seems to superflous for this small implementation .-) 152 ::comphelper::Locale aLocale = ::comphelper::Locale(m_sLocale); 153 154 // May be the current app module does not have any 155 // accelerator config? Handle it gracefully :-) 156 try 157 { 158 m_sGlobalOrModules = CFG_ENTRY_MODULES; 159 XCUBasedAcceleratorConfiguration::reload(); 160 161 css::uno::Reference< css::util::XChangesNotifier > xBroadcaster(m_xCfg, css::uno::UNO_QUERY_THROW); 162 xBroadcaster->addChangesListener(static_cast< css::util::XChangesListener* >(this)); 163 } 164 catch(const css::uno::RuntimeException& exRun) 165 { throw exRun; } 166 catch(const css::uno::Exception&) 167 {} 168 } 169 170 } // namespace framework 171 172