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_comphelper.hxx" 26 27 //_______________________________________________ 28 // includes 29 #include <comphelper/configurationhelper.hxx> 30 #include <com/sun/star/beans/XPropertySet.hpp> 31 #include <com/sun/star/container/XNameAccess.hpp> 32 #include <com/sun/star/container/XNameContainer.hpp> 33 #include <com/sun/star/lang/XSingleServiceFactory.hpp> 34 35 //_______________________________________________ 36 // namespace 37 38 namespace comphelper{ 39 40 namespace css = ::com::sun::star; 41 42 //_______________________________________________ 43 // definitions 44 45 //----------------------------------------------- 46 css::uno::Reference< css::uno::XInterface > ConfigurationHelper::openConfig(const css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR , 47 const ::rtl::OUString& sPackage, 48 sal_Int32 eMode ) 49 { 50 css::uno::Reference< css::lang::XMultiServiceFactory > xConfigProvider( 51 xSMGR->createInstance(::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider")), css::uno::UNO_QUERY_THROW); 52 53 ::comphelper::SequenceAsVector< css::uno::Any > lParams; 54 css::beans::PropertyValue aParam ; 55 56 // set root path 57 aParam.Name = ::rtl::OUString::createFromAscii("nodepath"); 58 aParam.Value <<= sPackage; 59 lParams.push_back(css::uno::makeAny(aParam)); 60 61 // enable all locales mode 62 if ((eMode & ConfigurationHelper::E_ALL_LOCALES)==ConfigurationHelper::E_ALL_LOCALES) 63 { 64 aParam.Name = ::rtl::OUString::createFromAscii("locale"); 65 aParam.Value <<= ::rtl::OUString::createFromAscii("*"); 66 lParams.push_back(css::uno::makeAny(aParam)); 67 } 68 69 // enable lazy writing 70 sal_Bool bLazy = ((eMode & ConfigurationHelper::E_LAZY_WRITE)==ConfigurationHelper::E_LAZY_WRITE); 71 aParam.Name = ::rtl::OUString::createFromAscii("lazywrite"); 72 aParam.Value = css::uno::makeAny(bLazy); 73 lParams.push_back(css::uno::makeAny(aParam)); 74 75 // open it 76 css::uno::Reference< css::uno::XInterface > xCFG; 77 78 sal_Bool bReadOnly = ((eMode & ConfigurationHelper::E_READONLY)==ConfigurationHelper::E_READONLY); 79 if (bReadOnly) 80 xCFG = xConfigProvider->createInstanceWithArguments( 81 ::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationAccess"), 82 lParams.getAsConstList()); 83 else 84 xCFG = xConfigProvider->createInstanceWithArguments( 85 ::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess"), 86 lParams.getAsConstList()); 87 88 return xCFG; 89 } 90 91 //----------------------------------------------- 92 css::uno::Any ConfigurationHelper::readRelativeKey(const css::uno::Reference< css::uno::XInterface > xCFG , 93 const ::rtl::OUString& sRelPath, 94 const ::rtl::OUString& sKey ) 95 { 96 css::uno::Reference< css::container::XHierarchicalNameAccess > xAccess(xCFG, css::uno::UNO_QUERY_THROW); 97 98 css::uno::Reference< css::beans::XPropertySet > xProps; 99 xAccess->getByHierarchicalName(sRelPath) >>= xProps; 100 if (!xProps.is()) 101 { 102 ::rtl::OUStringBuffer sMsg(256); 103 sMsg.appendAscii("The requested path \""); 104 sMsg.append (sRelPath ); 105 sMsg.appendAscii("\" does not exists." ); 106 107 throw css::container::NoSuchElementException( 108 sMsg.makeStringAndClear(), 109 css::uno::Reference< css::uno::XInterface >()); 110 } 111 return xProps->getPropertyValue(sKey); 112 } 113 114 //----------------------------------------------- 115 void ConfigurationHelper::writeRelativeKey(const css::uno::Reference< css::uno::XInterface > xCFG , 116 const ::rtl::OUString& sRelPath, 117 const ::rtl::OUString& sKey , 118 const css::uno::Any& aValue ) 119 { 120 css::uno::Reference< css::container::XHierarchicalNameAccess > xAccess(xCFG, css::uno::UNO_QUERY_THROW); 121 122 css::uno::Reference< css::beans::XPropertySet > xProps; 123 xAccess->getByHierarchicalName(sRelPath) >>= xProps; 124 if (!xProps.is()) 125 { 126 ::rtl::OUStringBuffer sMsg(256); 127 sMsg.appendAscii("The requested path \""); 128 sMsg.append (sRelPath ); 129 sMsg.appendAscii("\" does not exists." ); 130 131 throw css::container::NoSuchElementException( 132 sMsg.makeStringAndClear(), 133 css::uno::Reference< css::uno::XInterface >()); 134 } 135 xProps->setPropertyValue(sKey, aValue); 136 } 137 138 //----------------------------------------------- 139 css::uno::Reference< css::uno::XInterface > ConfigurationHelper::makeSureSetNodeExists(const css::uno::Reference< css::uno::XInterface > xCFG , 140 const ::rtl::OUString& sRelPathToSet, 141 const ::rtl::OUString& sSetNode ) 142 { 143 css::uno::Reference< css::container::XHierarchicalNameAccess > xAccess(xCFG, css::uno::UNO_QUERY_THROW); 144 css::uno::Reference< css::container::XNameAccess > xSet; 145 xAccess->getByHierarchicalName(sRelPathToSet) >>= xSet; 146 if (!xSet.is()) 147 { 148 ::rtl::OUStringBuffer sMsg(256); 149 sMsg.appendAscii("The requested path \""); 150 sMsg.append (sRelPathToSet ); 151 sMsg.appendAscii("\" does not exists." ); 152 153 throw css::container::NoSuchElementException( 154 sMsg.makeStringAndClear(), 155 css::uno::Reference< css::uno::XInterface >()); 156 } 157 158 css::uno::Reference< css::uno::XInterface > xNode; 159 if (xSet->hasByName(sSetNode)) 160 xSet->getByName(sSetNode) >>= xNode; 161 else 162 { 163 css::uno::Reference< css::lang::XSingleServiceFactory > xNodeFactory(xSet, css::uno::UNO_QUERY_THROW); 164 xNode = xNodeFactory->createInstance(); 165 css::uno::Reference< css::container::XNameContainer > xSetReplace(xSet, css::uno::UNO_QUERY_THROW); 166 xSetReplace->insertByName(sSetNode, css::uno::makeAny(xNode)); 167 } 168 169 return xNode; 170 } 171 172 //----------------------------------------------- 173 css::uno::Any ConfigurationHelper::readDirectKey(const css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR , 174 const ::rtl::OUString& sPackage, 175 const ::rtl::OUString& sRelPath, 176 const ::rtl::OUString& sKey , 177 sal_Int32 eMode ) 178 { 179 css::uno::Reference< css::uno::XInterface > xCFG = ConfigurationHelper::openConfig(xSMGR, sPackage, eMode); 180 return ConfigurationHelper::readRelativeKey(xCFG, sRelPath, sKey); 181 } 182 183 //----------------------------------------------- 184 void ConfigurationHelper::writeDirectKey(const css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR , 185 const ::rtl::OUString& sPackage, 186 const ::rtl::OUString& sRelPath, 187 const ::rtl::OUString& sKey , 188 const css::uno::Any& aValue , 189 sal_Int32 eMode ) 190 { 191 css::uno::Reference< css::uno::XInterface > xCFG = ConfigurationHelper::openConfig(xSMGR, sPackage, eMode); 192 ConfigurationHelper::writeRelativeKey(xCFG, sRelPath, sKey, aValue); 193 ConfigurationHelper::flush(xCFG); 194 } 195 196 //----------------------------------------------- 197 void ConfigurationHelper::flush(const css::uno::Reference< css::uno::XInterface >& xCFG) 198 { 199 css::uno::Reference< css::util::XChangesBatch > xBatch(xCFG, css::uno::UNO_QUERY_THROW); 200 xBatch->commitChanges(); 201 } 202 203 } // namespace comphelper 204