1b5088357SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3b5088357SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4b5088357SAndrew Rist * or more contributor license agreements. See the NOTICE file 5b5088357SAndrew Rist * distributed with this work for additional information 6b5088357SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7b5088357SAndrew Rist * to you under the Apache License, Version 2.0 (the 8b5088357SAndrew Rist * "License"); you may not use this file except in compliance 9b5088357SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11b5088357SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13b5088357SAndrew Rist * Unless required by applicable law or agreed to in writing, 14b5088357SAndrew Rist * software distributed under the License is distributed on an 15b5088357SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16b5088357SAndrew Rist * KIND, either express or implied. See the License for the 17b5088357SAndrew Rist * specific language governing permissions and limitations 18b5088357SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20b5088357SAndrew Rist *************************************************************/ 21b5088357SAndrew Rist 22b5088357SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_unotools.hxx" 26cdf0e10cSrcweir #include "unotools/configmgr.hxx" 27cdf0e10cSrcweir #include "unotools/configitem.hxx" 28cdf0e10cSrcweir #include "unotools/configpathes.hxx" 29cdf0e10cSrcweir #include <unotools/processfactory.hxx> 30cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp> 31cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp> 32cdf0e10cSrcweir #include <com/sun/star/container/XHierarchicalNameAccess.hpp> 33cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp> 34cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp> 35cdf0e10cSrcweir #include <osl/diagnose.h> 36cdf0e10cSrcweir #include <rtl/bootstrap.hxx> 37cdf0e10cSrcweir #include <rtl/instance.hxx> 38cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 39cdf0e10cSrcweir #include <rtl/strbuf.hxx> 40cdf0e10cSrcweir #endif 41cdf0e10cSrcweir 42cdf0e10cSrcweir #include <list> 43cdf0e10cSrcweir 44cdf0e10cSrcweir //----------------------------------------------------------------------------- 45cdf0e10cSrcweir 46cdf0e10cSrcweir using namespace utl; 47cdf0e10cSrcweir using namespace rtl; 48cdf0e10cSrcweir using namespace com::sun::star::uno; 49cdf0e10cSrcweir using namespace com::sun::star::lang; 50cdf0e10cSrcweir using namespace com::sun::star::beans; 51cdf0e10cSrcweir using namespace com::sun::star::container; 52cdf0e10cSrcweir 53cdf0e10cSrcweir #define C2U(cChar) OUString::createFromAscii(cChar) 54cdf0e10cSrcweir #define UNISTRING(s) rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s)) 55cdf0e10cSrcweir 56cdf0e10cSrcweir //----------------------------------------------------------------------------- 57cdf0e10cSrcweir const char* cConfigBaseURL = "/org.openoffice."; 58cdf0e10cSrcweir //const char* cConfigBaseURL = "/com.sun.star."; 59cdf0e10cSrcweir const char* cAccessSrvc = "com.sun.star.configuration.ConfigurationUpdateAccess"; 60cdf0e10cSrcweir 61cdf0e10cSrcweir namespace 62cdf0e10cSrcweir { 63cdf0e10cSrcweir struct BrandName 64cdf0e10cSrcweir : public rtl::Static< ::rtl::OUString, BrandName > {}; 65cdf0e10cSrcweir struct ProductVersion 66cdf0e10cSrcweir : public rtl::Static< ::rtl::OUString, ProductVersion > {}; 67cdf0e10cSrcweir struct AboutBoxProductVersion 68cdf0e10cSrcweir : public rtl::Static< ::rtl::OUString, AboutBoxProductVersion > {}; 69cdf0e10cSrcweir struct OOOVendor 70cdf0e10cSrcweir : public rtl::Static< ::rtl::OUString, OOOVendor > {}; 71cdf0e10cSrcweir struct ProductExtension 72cdf0e10cSrcweir : public rtl::Static< ::rtl::OUString, ProductExtension > {}; 73cdf0e10cSrcweir struct XMLFileFormatName 74cdf0e10cSrcweir : public rtl::Static< ::rtl::OUString, XMLFileFormatName > {}; 75cdf0e10cSrcweir struct XMLFileFormatVersion 76cdf0e10cSrcweir : public rtl::Static< ::rtl::OUString, XMLFileFormatVersion > {}; 77cdf0e10cSrcweir struct WriterCompatibilityVersionOOo11 78cdf0e10cSrcweir : public rtl::Static< ::rtl::OUString, WriterCompatibilityVersionOOo11 > {}; 79cdf0e10cSrcweir struct OpenSourceContext : public rtl::StaticWithInit< sal_Int32, OpenSourceContext > 80cdf0e10cSrcweir { 81cdf0e10cSrcweir sal_Int32 operator() () { return sal_Int32( -1 ); } 82cdf0e10cSrcweir }; 83cdf0e10cSrcweir 84cdf0e10cSrcweir } 85cdf0e10cSrcweir 86cdf0e10cSrcweir //----------------------------------------------------------------------------- 87cdf0e10cSrcweir struct ConfigItemListEntry_Impl 88cdf0e10cSrcweir { 89cdf0e10cSrcweir ConfigItem* pConfigItem; 90cdf0e10cSrcweir 91cdf0e10cSrcweir ConfigItemListEntry_Impl(ConfigItem* pItem ) : 92cdf0e10cSrcweir pConfigItem(pItem){} 93cdf0e10cSrcweir }; 94cdf0e10cSrcweir typedef std::list<ConfigItemListEntry_Impl> ConfigItemList; 95cdf0e10cSrcweir struct utl::ConfigMgr_Impl 96cdf0e10cSrcweir { 97cdf0e10cSrcweir ConfigItemList aItemList; 98cdf0e10cSrcweir }; 99cdf0e10cSrcweir 100cdf0e10cSrcweir /* -----------------------------28.08.00 15:35-------------------------------- 101cdf0e10cSrcweir 102cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 103cdf0e10cSrcweir ConfigManager::ConfigManager() : 104cdf0e10cSrcweir pMgrImpl(new utl::ConfigMgr_Impl) 105cdf0e10cSrcweir { 106cdf0e10cSrcweir GetConfigurationProvider(); // attempt to create the provider early 107cdf0e10cSrcweir } 108cdf0e10cSrcweir /* -----------------------------17.11.00 13:51-------------------------------- 109cdf0e10cSrcweir 110cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 111cdf0e10cSrcweir ConfigManager::ConfigManager(Reference< XMultiServiceFactory > xConfigProv) : 112cdf0e10cSrcweir xConfigurationProvider(xConfigProv), 113cdf0e10cSrcweir pMgrImpl(new utl::ConfigMgr_Impl) 114cdf0e10cSrcweir { 115cdf0e10cSrcweir } 116cdf0e10cSrcweir /* -----------------------------28.08.00 15:35-------------------------------- 117cdf0e10cSrcweir 118cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 119cdf0e10cSrcweir ConfigManager::~ConfigManager() 120cdf0e10cSrcweir { 121cdf0e10cSrcweir //check list content -> should be empty! 122cdf0e10cSrcweir OSL_ENSURE(pMgrImpl->aItemList.empty(), "some ConfigItems are still alive"); 123cdf0e10cSrcweir if(!pMgrImpl->aItemList.empty()) 124cdf0e10cSrcweir { 125cdf0e10cSrcweir ConfigItemList::iterator aListIter; 126cdf0e10cSrcweir for(aListIter = pMgrImpl->aItemList.begin(); aListIter != pMgrImpl->aItemList.end(); ++aListIter) 127cdf0e10cSrcweir { 128cdf0e10cSrcweir ConfigItemListEntry_Impl& rEntry = *aListIter; 129cdf0e10cSrcweir rEntry.pConfigItem->ReleaseConfigMgr(); 130cdf0e10cSrcweir } 131cdf0e10cSrcweir pMgrImpl->aItemList.erase(pMgrImpl->aItemList.begin(), pMgrImpl->aItemList.end()); 132cdf0e10cSrcweir } 133cdf0e10cSrcweir delete pMgrImpl; 134cdf0e10cSrcweir 135cdf0e10cSrcweir } 136cdf0e10cSrcweir /* -----------------------------28.08.00 16:17-------------------------------- 137cdf0e10cSrcweir 138cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 139cdf0e10cSrcweir Reference< XMultiServiceFactory > ConfigManager::GetConfigurationProvider() 140cdf0e10cSrcweir { 141cdf0e10cSrcweir if(!xConfigurationProvider.is()) 142cdf0e10cSrcweir { 143cdf0e10cSrcweir Reference< XMultiServiceFactory > xMSF = ::utl::getProcessServiceFactory(); 144cdf0e10cSrcweir if ( xMSF.is() ) 145cdf0e10cSrcweir { 146cdf0e10cSrcweir try 147cdf0e10cSrcweir { 148cdf0e10cSrcweir xConfigurationProvider = Reference< XMultiServiceFactory > 149cdf0e10cSrcweir (xMSF->createInstance( 150cdf0e10cSrcweir C2U("com.sun.star.configuration.ConfigurationProvider")), 151cdf0e10cSrcweir UNO_QUERY); 152cdf0e10cSrcweir } 153cdf0e10cSrcweir #ifdef DBG_UTIL 154cdf0e10cSrcweir catch(Exception& rEx) 155cdf0e10cSrcweir { 156cdf0e10cSrcweir static sal_Bool bMessage = sal_True; 157cdf0e10cSrcweir if(bMessage) 158cdf0e10cSrcweir { 159cdf0e10cSrcweir bMessage = sal_False; 160cdf0e10cSrcweir OString sMsg("CreateInstance with arguments exception: "); 161cdf0e10cSrcweir sMsg += OString(rEx.Message.getStr(), 162cdf0e10cSrcweir rEx.Message.getLength(), 163cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US); 164cdf0e10cSrcweir OSL_ENSURE(sal_False, sMsg.getStr()); 165cdf0e10cSrcweir } 166cdf0e10cSrcweir } 167cdf0e10cSrcweir #else 168cdf0e10cSrcweir catch(Exception&){} 169cdf0e10cSrcweir #endif 170cdf0e10cSrcweir } 171cdf0e10cSrcweir } 172cdf0e10cSrcweir return xConfigurationProvider; 173cdf0e10cSrcweir } 174cdf0e10cSrcweir /* -----------------------------03.12.02 ------------------------------------- 175cdf0e10cSrcweir 176cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 177cdf0e10cSrcweir namespace 178cdf0e10cSrcweir { 179cdf0e10cSrcweir // helper to achieve exception - safe registration of a ConfigItem under construction 180cdf0e10cSrcweir class RegisterConfigItemHelper // : Noncopyable 181cdf0e10cSrcweir { 182cdf0e10cSrcweir utl::ConfigManager & rCfgMgr; 183cdf0e10cSrcweir utl::ConfigItem* pCfgItem; 184cdf0e10cSrcweir public: 185cdf0e10cSrcweir RegisterConfigItemHelper(utl::ConfigManager & rMgr, utl::ConfigItem& rCfgItem) 186cdf0e10cSrcweir : rCfgMgr(rMgr) 187cdf0e10cSrcweir , pCfgItem(&rCfgItem) 188cdf0e10cSrcweir { 189cdf0e10cSrcweir rCfgMgr.RegisterConfigItem(rCfgItem); 190cdf0e10cSrcweir } 191cdf0e10cSrcweir 192cdf0e10cSrcweir ~RegisterConfigItemHelper() 193cdf0e10cSrcweir { 194cdf0e10cSrcweir if (pCfgItem) rCfgMgr.RemoveConfigItem(*pCfgItem); 195cdf0e10cSrcweir } 196cdf0e10cSrcweir 197cdf0e10cSrcweir void keep() { pCfgItem = 0; } 198cdf0e10cSrcweir }; 199cdf0e10cSrcweir } 200cdf0e10cSrcweir /* -----------------------------12.12.00 17:19-------------------------------- 201cdf0e10cSrcweir 202cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 203cdf0e10cSrcweir Reference< XMultiServiceFactory > ConfigManager::GetLocalConfigurationProvider() 204cdf0e10cSrcweir { 205cdf0e10cSrcweir return GetConfigurationProvider(); 206cdf0e10cSrcweir } 207cdf0e10cSrcweir /* -----------------------------29.08.00 12:35-------------------------------- 208cdf0e10cSrcweir 209cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 210cdf0e10cSrcweir Reference< XHierarchicalNameAccess > ConfigManager::AddConfigItem(utl::ConfigItem& rCfgItem) 211cdf0e10cSrcweir { 212cdf0e10cSrcweir RegisterConfigItemHelper registeredItem(*this,rCfgItem); 213cdf0e10cSrcweir Reference< XHierarchicalNameAccess > xTree = AcquireTree(rCfgItem); 214cdf0e10cSrcweir registeredItem.keep(); 215cdf0e10cSrcweir return xTree; 216cdf0e10cSrcweir } 217cdf0e10cSrcweir /* -----------------------------21.06.01 12:20-------------------------------- 218cdf0e10cSrcweir 219cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 220cdf0e10cSrcweir void ConfigManager::RegisterConfigItem(utl::ConfigItem& rCfgItem) 221cdf0e10cSrcweir { 222cdf0e10cSrcweir ConfigItemList::iterator aListIter = pMgrImpl->aItemList.begin(); 223cdf0e10cSrcweir #ifdef DBG_UTIL 224cdf0e10cSrcweir for(aListIter = pMgrImpl->aItemList.begin(); aListIter != pMgrImpl->aItemList.end(); ++aListIter) 225cdf0e10cSrcweir { 226cdf0e10cSrcweir ConfigItemListEntry_Impl& rEntry = *aListIter; 227cdf0e10cSrcweir if(rEntry.pConfigItem == &rCfgItem) 228cdf0e10cSrcweir OSL_ENSURE(sal_False, "RegisterConfigItem: already inserted!"); 229cdf0e10cSrcweir } 230cdf0e10cSrcweir #endif 231cdf0e10cSrcweir pMgrImpl->aItemList.insert(aListIter, ConfigItemListEntry_Impl(&rCfgItem)); 232cdf0e10cSrcweir } 233cdf0e10cSrcweir /* -----------------------------21.06.01 12:20-------------------------------- 234cdf0e10cSrcweir 235cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 236cdf0e10cSrcweir Reference< XHierarchicalNameAccess> ConfigManager::AcquireTree(utl::ConfigItem& rCfgItem) 237cdf0e10cSrcweir { 238cdf0e10cSrcweir ConfigItemList::iterator aListIter = pMgrImpl->aItemList.begin(); 239cdf0e10cSrcweir #ifdef DBG_UTIL 240cdf0e10cSrcweir sal_Bool bFound = sal_False; 241cdf0e10cSrcweir for(aListIter = pMgrImpl->aItemList.begin(); aListIter != pMgrImpl->aItemList.end(); ++aListIter) 242cdf0e10cSrcweir { 243cdf0e10cSrcweir ConfigItemListEntry_Impl& rEntry = *aListIter; 244cdf0e10cSrcweir if(rEntry.pConfigItem == &rCfgItem) 245cdf0e10cSrcweir { 246cdf0e10cSrcweir bFound = sal_True; 247cdf0e10cSrcweir break; 248cdf0e10cSrcweir } 249cdf0e10cSrcweir } 250cdf0e10cSrcweir OSL_ENSURE(bFound, "AcquireTree: ConfigItem unknown!"); 251cdf0e10cSrcweir #endif 252cdf0e10cSrcweir OUString sPath = C2U(cConfigBaseURL); 253cdf0e10cSrcweir sPath += rCfgItem.GetSubTreeName(); 254cdf0e10cSrcweir Sequence< Any > aArgs(2); 255cdf0e10cSrcweir Any* pArgs = aArgs.getArray(); 256cdf0e10cSrcweir PropertyValue aPath; 257cdf0e10cSrcweir aPath.Name = C2U("nodepath"); 258cdf0e10cSrcweir aPath.Value <<= sPath; 259cdf0e10cSrcweir pArgs[0] <<= aPath; 260cdf0e10cSrcweir sal_Bool bLazy = 0 != (rCfgItem.GetMode()&CONFIG_MODE_DELAYED_UPDATE); 261cdf0e10cSrcweir PropertyValue aUpdate; 262cdf0e10cSrcweir aUpdate.Name = C2U("lazywrite"); 263cdf0e10cSrcweir aUpdate.Value.setValue(&bLazy, ::getBooleanCppuType()); 264cdf0e10cSrcweir pArgs[1] <<= aUpdate; 265cdf0e10cSrcweir 266cdf0e10cSrcweir // Initialize item with support for reading/writing more then one locales at same time! 267cdf0e10cSrcweir // It's neccessary for creation of a complete configuration entry without changing office locale 268cdf0e10cSrcweir // at runtime. 269cdf0e10cSrcweir if((rCfgItem.GetMode() & CONFIG_MODE_ALL_LOCALES) == CONFIG_MODE_ALL_LOCALES) 270cdf0e10cSrcweir { 271cdf0e10cSrcweir sal_Int32 nCount = aArgs.getLength(); 272cdf0e10cSrcweir aArgs.realloc(nCount+1); 273cdf0e10cSrcweir 274cdf0e10cSrcweir PropertyValue aAllLocale; 275cdf0e10cSrcweir aAllLocale.Name = C2U("locale"); 276cdf0e10cSrcweir aAllLocale.Value <<= C2U("*" ); 277cdf0e10cSrcweir aArgs[nCount] <<= aAllLocale; 278cdf0e10cSrcweir } 279cdf0e10cSrcweir 280cdf0e10cSrcweir Reference< XMultiServiceFactory > xCfgProvider = GetConfigurationProvider(); 281cdf0e10cSrcweir Reference< XInterface > xIFace; 282cdf0e10cSrcweir if(xCfgProvider.is()) 283cdf0e10cSrcweir { 284cdf0e10cSrcweir try 285cdf0e10cSrcweir { 286cdf0e10cSrcweir xIFace = xCfgProvider->createInstanceWithArguments( 287cdf0e10cSrcweir C2U(cAccessSrvc), 288cdf0e10cSrcweir aArgs); 289cdf0e10cSrcweir } 290cdf0e10cSrcweir catch(Exception& rEx) 291cdf0e10cSrcweir { 292cdf0e10cSrcweir if (CONFIG_MODE_PROPAGATE_ERRORS & rCfgItem.GetMode()) 293cdf0e10cSrcweir { 294cdf0e10cSrcweir OSL_TRACE("ConfigItem: Propagating creation error: %s\n", 295cdf0e10cSrcweir OUStringToOString(rEx.Message,RTL_TEXTENCODING_ASCII_US).getStr()); 296cdf0e10cSrcweir 297cdf0e10cSrcweir throw; 298cdf0e10cSrcweir } 299cdf0e10cSrcweir #ifdef DBG_UTIL 300cdf0e10cSrcweir if(0 == (CONFIG_MODE_IGNORE_ERRORS & rCfgItem.GetMode())) 301cdf0e10cSrcweir { 302cdf0e10cSrcweir OString sMsg("CreateInstance exception: "); 303cdf0e10cSrcweir sMsg += OString(rEx.Message.getStr(), 304cdf0e10cSrcweir rEx.Message.getLength(), 305cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US); 306cdf0e10cSrcweir OSL_ENSURE(sal_False, sMsg.getStr()); 307cdf0e10cSrcweir } 308cdf0e10cSrcweir #endif 309cdf0e10cSrcweir } 310cdf0e10cSrcweir } 311cdf0e10cSrcweir return Reference<XHierarchicalNameAccess>(xIFace, UNO_QUERY); 312cdf0e10cSrcweir } 313cdf0e10cSrcweir /* -----------------------------29.08.00 12:35-------------------------------- 314cdf0e10cSrcweir 315cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 316cdf0e10cSrcweir void ConfigManager::RemoveConfigItem(utl::ConfigItem& rCfgItem) 317cdf0e10cSrcweir { 318cdf0e10cSrcweir if( !pMgrImpl->aItemList.empty() ) 319cdf0e10cSrcweir { 320cdf0e10cSrcweir ConfigItemList::iterator aListIter = pMgrImpl->aItemList.begin(); 321cdf0e10cSrcweir for(aListIter = pMgrImpl->aItemList.begin(); aListIter != pMgrImpl->aItemList.end(); ++aListIter) 322cdf0e10cSrcweir { 323cdf0e10cSrcweir ConfigItemListEntry_Impl& rEntry = *aListIter; 324cdf0e10cSrcweir if(rEntry.pConfigItem == &rCfgItem) 325cdf0e10cSrcweir { 326cdf0e10cSrcweir pMgrImpl->aItemList.erase(aListIter); 327cdf0e10cSrcweir break; 328cdf0e10cSrcweir } 329cdf0e10cSrcweir } 330cdf0e10cSrcweir } 331cdf0e10cSrcweir } 332cdf0e10cSrcweir /* -----------------------------30.08.00 15:04-------------------------------- 333cdf0e10cSrcweir 334cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 335cdf0e10cSrcweir void ConfigManager::StoreConfigItems() 336cdf0e10cSrcweir { 337cdf0e10cSrcweir if(!pMgrImpl->aItemList.empty()) 338cdf0e10cSrcweir { 339cdf0e10cSrcweir ConfigItemList::iterator aListIter = pMgrImpl->aItemList.begin(); 340cdf0e10cSrcweir for(aListIter = pMgrImpl->aItemList.begin(); aListIter != pMgrImpl->aItemList.end(); ++aListIter) 341cdf0e10cSrcweir { 342cdf0e10cSrcweir ConfigItemListEntry_Impl& rEntry = *aListIter; 343cdf0e10cSrcweir if(rEntry.pConfigItem->IsModified()) 344cdf0e10cSrcweir { 345cdf0e10cSrcweir rEntry.pConfigItem->Commit(); 346cdf0e10cSrcweir rEntry.pConfigItem->ClearModified(); 347cdf0e10cSrcweir } 348cdf0e10cSrcweir } 349cdf0e10cSrcweir } 350cdf0e10cSrcweir } 351*4879a985SPedro Giffuni ConfigManager* ConfigManager::pConfigManager = 0; 352cdf0e10cSrcweir /* -----------------------------07.09.00 11:06-------------------------------- 353cdf0e10cSrcweir 354cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 355cdf0e10cSrcweir ConfigManager* ConfigManager::GetConfigManager() 356cdf0e10cSrcweir { 357*4879a985SPedro Giffuni if(!pConfigManager) 358*4879a985SPedro Giffuni { 359*4879a985SPedro Giffuni pConfigManager = new ConfigManager(); 360*4879a985SPedro Giffuni } 361*4879a985SPedro Giffuni return pConfigManager; 362*4879a985SPedro Giffuni } 363*4879a985SPedro Giffuni /* -----------------------------07.09.00 11:06-------------------------------- 364*4879a985SPedro Giffuni 365*4879a985SPedro Giffuni ---------------------------------------------------------------------------*/ 366*4879a985SPedro Giffuni void ConfigManager::RemoveConfigManager() 367*4879a985SPedro Giffuni { 368*4879a985SPedro Giffuni if(pConfigManager) 369*4879a985SPedro Giffuni { 370*4879a985SPedro Giffuni delete pConfigManager; 371*4879a985SPedro Giffuni pConfigManager = 0; 372*4879a985SPedro Giffuni } 373cdf0e10cSrcweir } 374cdf0e10cSrcweir /* -----------------------------08.09.00 13:22-------------------------------- 375cdf0e10cSrcweir 376cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 377cdf0e10cSrcweir rtl::OUString ConfigManager::GetConfigBaseURL() 378cdf0e10cSrcweir { 379cdf0e10cSrcweir return C2U(cConfigBaseURL); 380cdf0e10cSrcweir } 381cdf0e10cSrcweir /* -----------------------------25.09.00 16:34-------------------------------- 382cdf0e10cSrcweir 383cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 384cdf0e10cSrcweir Any ConfigManager::GetDirectConfigProperty(ConfigProperty eProp) 385cdf0e10cSrcweir { 386cdf0e10cSrcweir switch(eProp) 387cdf0e10cSrcweir { 388cdf0e10cSrcweir case INSTALLPATH: 389cdf0e10cSrcweir OSL_ENSURE( false, 390cdf0e10cSrcweir "ConfigManager::GetDirectConfigProperty: " 391cdf0e10cSrcweir "INSTALLPATH no longer supported." ); 392cdf0e10cSrcweir return Any(); 393cdf0e10cSrcweir case USERINSTALLURL: 394cdf0e10cSrcweir OSL_ENSURE( false, 395cdf0e10cSrcweir "ConfigManager::GetDirectConfigProperty: " 396cdf0e10cSrcweir "USERINSTALLURL no longer supported." ); 397cdf0e10cSrcweir return Any(); 398cdf0e10cSrcweir case OFFICEINSTALL: 399cdf0e10cSrcweir OSL_ENSURE( false, 400cdf0e10cSrcweir "ConfigManager::GetDirectConfigProperty: " 401cdf0e10cSrcweir "OFFICEINSTALL no longer supported." ); 402cdf0e10cSrcweir return Any(); 403cdf0e10cSrcweir case OFFICEINSTALLURL: 404cdf0e10cSrcweir OSL_ENSURE( false, 405cdf0e10cSrcweir "ConfigManager::GetDirectConfigProperty: " 406cdf0e10cSrcweir "OFFICEINSTALLURL no longer supported." ); 407cdf0e10cSrcweir return Any(); 408cdf0e10cSrcweir default: 409cdf0e10cSrcweir break; 410cdf0e10cSrcweir } 411cdf0e10cSrcweir 412cdf0e10cSrcweir Any aRet; 413cdf0e10cSrcweir ::rtl::OUString &rBrandName = BrandName::get(); 414cdf0e10cSrcweir if ( eProp == PRODUCTNAME && rBrandName.getLength() ) 415cdf0e10cSrcweir { 416cdf0e10cSrcweir aRet <<= rBrandName; 417cdf0e10cSrcweir return aRet; 418cdf0e10cSrcweir } 419cdf0e10cSrcweir 420cdf0e10cSrcweir rtl::OUString &rProductVersion = ProductVersion::get(); 421cdf0e10cSrcweir if ( eProp == PRODUCTVERSION && rProductVersion.getLength() ) 422cdf0e10cSrcweir { 423cdf0e10cSrcweir aRet <<= rProductVersion; 424cdf0e10cSrcweir return aRet; 425cdf0e10cSrcweir } 426cdf0e10cSrcweir 427cdf0e10cSrcweir rtl::OUString &rAboutBoxProductVersion = AboutBoxProductVersion::get(); 428cdf0e10cSrcweir if ( eProp == ABOUTBOXPRODUCTVERSION && rAboutBoxProductVersion.getLength() ) 429cdf0e10cSrcweir { 430cdf0e10cSrcweir aRet <<= rAboutBoxProductVersion; 431cdf0e10cSrcweir return aRet; 432cdf0e10cSrcweir } 433cdf0e10cSrcweir 434cdf0e10cSrcweir rtl::OUString &rOOOVendor = OOOVendor::get(); 435cdf0e10cSrcweir if ( eProp == OOOVENDOR && rOOOVendor.getLength() ) 436cdf0e10cSrcweir { 437cdf0e10cSrcweir aRet <<= rOOOVendor; 438cdf0e10cSrcweir return aRet; 439cdf0e10cSrcweir } 440cdf0e10cSrcweir 441cdf0e10cSrcweir 442cdf0e10cSrcweir rtl::OUString &rProductExtension = ProductExtension::get(); 443cdf0e10cSrcweir if ( eProp == PRODUCTEXTENSION && rProductExtension.getLength() ) 444cdf0e10cSrcweir { 445cdf0e10cSrcweir aRet <<= rProductExtension; 446cdf0e10cSrcweir return aRet; 447cdf0e10cSrcweir } 448cdf0e10cSrcweir 449cdf0e10cSrcweir rtl::OUString &rXMLFileFormatName = XMLFileFormatName::get(); 450cdf0e10cSrcweir if ( eProp == PRODUCTXMLFILEFORMATNAME && rXMLFileFormatName.getLength() ) 451cdf0e10cSrcweir { 452cdf0e10cSrcweir aRet <<= rXMLFileFormatName; 453cdf0e10cSrcweir return aRet; 454cdf0e10cSrcweir } 455cdf0e10cSrcweir 456cdf0e10cSrcweir rtl::OUString &rXMLFileFormatVersion = XMLFileFormatVersion::get(); 457cdf0e10cSrcweir if ( eProp == PRODUCTXMLFILEFORMATVERSION && rXMLFileFormatVersion.getLength() ) 458cdf0e10cSrcweir { 459cdf0e10cSrcweir aRet <<= rXMLFileFormatVersion; 460cdf0e10cSrcweir return aRet; 461cdf0e10cSrcweir } 462cdf0e10cSrcweir 463cdf0e10cSrcweir sal_Int32 &rOpenSourceContext = OpenSourceContext::get(); 464cdf0e10cSrcweir if ( eProp == OPENSOURCECONTEXT && ( rOpenSourceContext >= 0 ) ) 465cdf0e10cSrcweir { 466cdf0e10cSrcweir aRet <<= rOpenSourceContext; 467cdf0e10cSrcweir return aRet; 468cdf0e10cSrcweir } 469cdf0e10cSrcweir 470cdf0e10cSrcweir rtl::OUString &rWriterCompatibilityVersionOOo11 = WriterCompatibilityVersionOOo11::get(); 471cdf0e10cSrcweir if ( eProp == WRITERCOMPATIBILITYVERSIONOOO11 && rWriterCompatibilityVersionOOo11.getLength() ) 472cdf0e10cSrcweir { 473cdf0e10cSrcweir aRet <<= rWriterCompatibilityVersionOOo11; 474cdf0e10cSrcweir return aRet; 475cdf0e10cSrcweir } 476cdf0e10cSrcweir 477cdf0e10cSrcweir if (eProp == PRODUCTEXTENSION) { 478cdf0e10cSrcweir rtl::OUString name( 479cdf0e10cSrcweir rtl::OUString( 480cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( 481cdf0e10cSrcweir "${BRAND_BASE_DIR}/program/edition/edition.ini"))); 482cdf0e10cSrcweir rtl::Bootstrap::expandMacros(name); 483cdf0e10cSrcweir if (rtl::Bootstrap(name).getFrom( 484cdf0e10cSrcweir rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("EDITIONNAME")), 485cdf0e10cSrcweir rProductExtension)) 486cdf0e10cSrcweir { 487cdf0e10cSrcweir return com::sun::star::uno::Any(rProductExtension); 488cdf0e10cSrcweir } 489cdf0e10cSrcweir } 490cdf0e10cSrcweir 491cdf0e10cSrcweir OUString sPath = C2U(cConfigBaseURL); 492cdf0e10cSrcweir switch(eProp) 493cdf0e10cSrcweir { 494cdf0e10cSrcweir case LOCALE: sPath += C2U("Setup/L10N"); break; 495cdf0e10cSrcweir 496cdf0e10cSrcweir case PRODUCTNAME: 497cdf0e10cSrcweir case PRODUCTVERSION: 498cdf0e10cSrcweir case PRODUCTEXTENSION: 499cdf0e10cSrcweir case PRODUCTXMLFILEFORMATNAME : 500cdf0e10cSrcweir case PRODUCTXMLFILEFORMATVERSION: 501cdf0e10cSrcweir case OPENSOURCECONTEXT: 502cdf0e10cSrcweir case OOOVENDOR: 503cdf0e10cSrcweir case ABOUTBOXPRODUCTVERSION: sPath += C2U("Setup/Product"); break; 504cdf0e10cSrcweir 505cdf0e10cSrcweir case DEFAULTCURRENCY: sPath += C2U("Setup/L10N"); break; 506cdf0e10cSrcweir 507cdf0e10cSrcweir case WRITERCOMPATIBILITYVERSIONOOO11: 508cdf0e10cSrcweir sPath += C2U("Office.Compatibility/WriterCompatibilityVersion"); break; 509cdf0e10cSrcweir default: 510cdf0e10cSrcweir break; 511cdf0e10cSrcweir } 512cdf0e10cSrcweir Sequence< Any > aArgs(1); 513cdf0e10cSrcweir aArgs[0] <<= sPath; 514cdf0e10cSrcweir Reference< XMultiServiceFactory > xCfgProvider = GetConfigManager()->GetConfigurationProvider(); 515cdf0e10cSrcweir if(!xCfgProvider.is()) 516cdf0e10cSrcweir return aRet; 517cdf0e10cSrcweir Reference< XInterface > xIFace; 518cdf0e10cSrcweir try 519cdf0e10cSrcweir { 520cdf0e10cSrcweir xIFace = xCfgProvider->createInstanceWithArguments( 521cdf0e10cSrcweir C2U(cAccessSrvc), 522cdf0e10cSrcweir aArgs); 523cdf0e10cSrcweir 524cdf0e10cSrcweir } 525cdf0e10cSrcweir catch(Exception&){} 526cdf0e10cSrcweir Reference<XNameAccess> xDirectAccess(xIFace, UNO_QUERY); 527cdf0e10cSrcweir if(xDirectAccess.is()) 528cdf0e10cSrcweir { 529cdf0e10cSrcweir OUString sProperty; 530cdf0e10cSrcweir switch(eProp) 531cdf0e10cSrcweir { 532cdf0e10cSrcweir case LOCALE: sProperty = C2U("ooLocale"); break; 533cdf0e10cSrcweir case PRODUCTNAME: sProperty = C2U("ooName"); break; 534cdf0e10cSrcweir case PRODUCTVERSION: sProperty = C2U("ooSetupVersion"); break; 535cdf0e10cSrcweir case ABOUTBOXPRODUCTVERSION: sProperty = C2U("ooSetupVersionAboutBox"); break; 536cdf0e10cSrcweir case OOOVENDOR: sProperty = C2U("ooVendor"); break; 537cdf0e10cSrcweir case PRODUCTEXTENSION: sProperty = C2U("ooSetupExtension"); break; 538cdf0e10cSrcweir case PRODUCTXMLFILEFORMATNAME: sProperty = C2U("ooXMLFileFormatName"); break; 539cdf0e10cSrcweir case PRODUCTXMLFILEFORMATVERSION: sProperty = C2U("ooXMLFileFormatVersion"); break; 540cdf0e10cSrcweir case OPENSOURCECONTEXT: sProperty = C2U("ooOpenSourceContext"); break; 541cdf0e10cSrcweir case DEFAULTCURRENCY: sProperty = C2U("ooSetupCurrency"); break; 542cdf0e10cSrcweir case WRITERCOMPATIBILITYVERSIONOOO11: sProperty = C2U("OOo11"); break; 543cdf0e10cSrcweir default: 544cdf0e10cSrcweir break; 545cdf0e10cSrcweir } 546cdf0e10cSrcweir try 547cdf0e10cSrcweir { 548cdf0e10cSrcweir aRet = xDirectAccess->getByName(sProperty); 549cdf0e10cSrcweir } 550cdf0e10cSrcweir catch(Exception&) 551cdf0e10cSrcweir { 552cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0 553cdf0e10cSrcweir rtl::OStringBuffer aBuf(256); 554cdf0e10cSrcweir aBuf.append( "ConfigManager::GetDirectConfigProperty: could not retrieve the property \"" ); 555cdf0e10cSrcweir aBuf.append( rtl::OUStringToOString( sProperty, RTL_TEXTENCODING_ASCII_US ) ); 556cdf0e10cSrcweir aBuf.append( "\" under \"" ); 557cdf0e10cSrcweir aBuf.append( rtl::OUStringToOString( sPath, RTL_TEXTENCODING_ASCII_US ) ); 558cdf0e10cSrcweir aBuf.append( "\" (caught an exception)!" ); 559cdf0e10cSrcweir OSL_ENSURE( sal_False, aBuf.getStr() ); 560cdf0e10cSrcweir #endif 561cdf0e10cSrcweir } 562cdf0e10cSrcweir } 563cdf0e10cSrcweir 564cdf0e10cSrcweir if ( eProp == PRODUCTNAME ) 565cdf0e10cSrcweir aRet >>= rBrandName; 566cdf0e10cSrcweir 567cdf0e10cSrcweir if ( eProp == PRODUCTXMLFILEFORMATNAME ) 568cdf0e10cSrcweir aRet >>= rXMLFileFormatName; 569cdf0e10cSrcweir 570cdf0e10cSrcweir if ( eProp == PRODUCTXMLFILEFORMATVERSION ) 571cdf0e10cSrcweir aRet >>= rXMLFileFormatVersion; 572cdf0e10cSrcweir 573cdf0e10cSrcweir if ( eProp == PRODUCTVERSION ) 574cdf0e10cSrcweir aRet >>= rProductVersion; 575cdf0e10cSrcweir 576cdf0e10cSrcweir if( eProp == OOOVENDOR ) 577cdf0e10cSrcweir aRet >>= rOOOVendor; 578cdf0e10cSrcweir 579cdf0e10cSrcweir if ( eProp == ABOUTBOXPRODUCTVERSION ) 580cdf0e10cSrcweir { 581cdf0e10cSrcweir aRet >>= rAboutBoxProductVersion; 582cdf0e10cSrcweir getBasisAboutBoxProductVersion( rAboutBoxProductVersion ); 583cdf0e10cSrcweir aRet <<= rAboutBoxProductVersion; 584cdf0e10cSrcweir } 585cdf0e10cSrcweir 586cdf0e10cSrcweir if ( eProp == PRODUCTEXTENSION ) 587cdf0e10cSrcweir aRet >>= rProductExtension; 588cdf0e10cSrcweir 589cdf0e10cSrcweir if ( eProp == WRITERCOMPATIBILITYVERSIONOOO11 ) 590cdf0e10cSrcweir aRet >>= rWriterCompatibilityVersionOOo11; 591cdf0e10cSrcweir 592cdf0e10cSrcweir if ( eProp == OPENSOURCECONTEXT ) 593cdf0e10cSrcweir aRet >>= rOpenSourceContext; 594cdf0e10cSrcweir 595cdf0e10cSrcweir return aRet; 596cdf0e10cSrcweir } 597cdf0e10cSrcweir 598cdf0e10cSrcweir /*---------------------------------------------------------------------------*/ 599cdf0e10cSrcweir void ConfigManager::getBasisAboutBoxProductVersion( OUString& rVersion ) 600cdf0e10cSrcweir { 601cdf0e10cSrcweir rtl::OUString aPackageVersion = UNISTRING( "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE("version") ":OOOPackageVersion}" ); 602cdf0e10cSrcweir rtl::Bootstrap::expandMacros( aPackageVersion ); 603cdf0e10cSrcweir 604cdf0e10cSrcweir if ( aPackageVersion.getLength() ) 605cdf0e10cSrcweir { 606cdf0e10cSrcweir sal_Int32 nTokIndex = 0; 607cdf0e10cSrcweir rtl::OUString aVersionMinor = aPackageVersion.getToken( 1, '.', nTokIndex ); 608cdf0e10cSrcweir rtl::OUString aVersionMicro; 609cdf0e10cSrcweir 610cdf0e10cSrcweir if ( nTokIndex > 0 ) 611cdf0e10cSrcweir aVersionMicro = aPackageVersion.getToken( 0, '.', nTokIndex ); 612cdf0e10cSrcweir 613cdf0e10cSrcweir if ( aVersionMinor.getLength() == 0 ) 614cdf0e10cSrcweir aVersionMinor = UNISTRING( "0" ); 615cdf0e10cSrcweir if ( aVersionMicro.getLength() == 0 ) 616cdf0e10cSrcweir aVersionMicro = UNISTRING( "0" ); 617cdf0e10cSrcweir 618cdf0e10cSrcweir sal_Int32 nIndex = rVersion.indexOf( '.' ); 619cdf0e10cSrcweir if ( nIndex == -1 ) 620cdf0e10cSrcweir { 621cdf0e10cSrcweir rVersion += UNISTRING( "." ); 622cdf0e10cSrcweir rVersion += aVersionMinor; 623cdf0e10cSrcweir } 624cdf0e10cSrcweir else 625cdf0e10cSrcweir { 626cdf0e10cSrcweir nIndex = rVersion.indexOf( '.', nIndex+1 ); 627cdf0e10cSrcweir } 628cdf0e10cSrcweir if ( nIndex == -1 ) 629cdf0e10cSrcweir { 630cdf0e10cSrcweir rVersion += UNISTRING( "." ); 631cdf0e10cSrcweir rVersion += aVersionMicro; 632cdf0e10cSrcweir } 633cdf0e10cSrcweir else 634cdf0e10cSrcweir { 635cdf0e10cSrcweir rVersion = rVersion.replaceAt( nIndex+1, rVersion.getLength()-nIndex-1, aVersionMicro ); 636cdf0e10cSrcweir } 637cdf0e10cSrcweir } 638cdf0e10cSrcweir } 639cdf0e10cSrcweir 640cdf0e10cSrcweir /* -----------------------------12.12.00 17:22-------------------------------- 641cdf0e10cSrcweir 642cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 643cdf0e10cSrcweir Reference< XHierarchicalNameAccess> ConfigManager::GetHierarchyAccess(const OUString& rFullPath) 644cdf0e10cSrcweir { 645cdf0e10cSrcweir Sequence< Any > aArgs(1); 646cdf0e10cSrcweir aArgs[0] <<= rFullPath; 647cdf0e10cSrcweir Reference< XMultiServiceFactory > xCfgProvider = GetLocalConfigurationProvider(); 648cdf0e10cSrcweir Reference< XInterface > xIFace; 649cdf0e10cSrcweir if(xCfgProvider.is()) 650cdf0e10cSrcweir { 651cdf0e10cSrcweir try 652cdf0e10cSrcweir { 653cdf0e10cSrcweir xIFace = xCfgProvider->createInstanceWithArguments( 654cdf0e10cSrcweir C2U(cAccessSrvc), 655cdf0e10cSrcweir aArgs); 656cdf0e10cSrcweir } 657cdf0e10cSrcweir #ifdef DBG_UTIL 658cdf0e10cSrcweir catch(Exception& rEx) 659cdf0e10cSrcweir { 660cdf0e10cSrcweir OString sMsg("CreateInstance exception: "); 661cdf0e10cSrcweir sMsg += OString(rEx.Message.getStr(), 662cdf0e10cSrcweir rEx.Message.getLength(), 663cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US); 664cdf0e10cSrcweir OSL_ENSURE(sal_False, sMsg.getStr()); 665cdf0e10cSrcweir } 666cdf0e10cSrcweir #else 667cdf0e10cSrcweir catch(Exception&){} 668cdf0e10cSrcweir #endif 669cdf0e10cSrcweir } 670cdf0e10cSrcweir return Reference<XHierarchicalNameAccess>(xIFace, UNO_QUERY); 671cdf0e10cSrcweir } 672cdf0e10cSrcweir /* -----------------------------12.12.00 17:17-------------------------------- 673cdf0e10cSrcweir 674cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 675cdf0e10cSrcweir Any ConfigManager::GetLocalProperty(const OUString& rProperty) 676cdf0e10cSrcweir { 677cdf0e10cSrcweir OUString sPath = C2U(cConfigBaseURL); 678cdf0e10cSrcweir sPath += rProperty; 679cdf0e10cSrcweir 680cdf0e10cSrcweir OUString sNode, sProperty; 681cdf0e10cSrcweir OSL_VERIFY( splitLastFromConfigurationPath(sPath, sNode, sProperty) ); 682cdf0e10cSrcweir 683cdf0e10cSrcweir Reference< XNameAccess> xAccess( GetHierarchyAccess(sNode), UNO_QUERY ); 684cdf0e10cSrcweir Any aRet; 685cdf0e10cSrcweir try 686cdf0e10cSrcweir { 687cdf0e10cSrcweir if(xAccess.is()) 688cdf0e10cSrcweir aRet = xAccess->getByName(sProperty); 689cdf0e10cSrcweir } 690cdf0e10cSrcweir #ifdef DBG_UTIL 691cdf0e10cSrcweir catch(Exception& rEx) 692cdf0e10cSrcweir { 693cdf0e10cSrcweir OString sMsg("GetLocalProperty: "); 694cdf0e10cSrcweir sMsg += OString(rEx.Message.getStr(), 695cdf0e10cSrcweir rEx.Message.getLength(), 696cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US); 697cdf0e10cSrcweir OSL_ENSURE(sal_False, sMsg.getStr()); 698cdf0e10cSrcweir } 699cdf0e10cSrcweir #else 700cdf0e10cSrcweir catch(Exception&){} 701cdf0e10cSrcweir #endif 702cdf0e10cSrcweir return aRet; 703cdf0e10cSrcweir } 704cdf0e10cSrcweir /* -----------------------------12.12.00 17:17-------------------------------- 705cdf0e10cSrcweir 706cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 707cdf0e10cSrcweir void ConfigManager::PutLocalProperty(const OUString& rProperty, const Any& rValue) 708cdf0e10cSrcweir { 709cdf0e10cSrcweir OUString sPath = C2U(cConfigBaseURL); 710cdf0e10cSrcweir sPath += rProperty; 711cdf0e10cSrcweir 712cdf0e10cSrcweir OUString sNode, sProperty; 713cdf0e10cSrcweir OSL_VERIFY( splitLastFromConfigurationPath(sPath, sNode, sProperty) ); 714cdf0e10cSrcweir 715cdf0e10cSrcweir Reference<XNameReplace> xNodeReplace(GetHierarchyAccess(sNode), UNO_QUERY); 716cdf0e10cSrcweir if(xNodeReplace.is()) 717cdf0e10cSrcweir { 718cdf0e10cSrcweir try 719cdf0e10cSrcweir { 720cdf0e10cSrcweir xNodeReplace->replaceByName(sProperty, rValue); 721cdf0e10cSrcweir } 722cdf0e10cSrcweir #ifdef DBG_UTIL 723cdf0e10cSrcweir catch(Exception& rEx) 724cdf0e10cSrcweir { 725cdf0e10cSrcweir OString sMsg("PutLocalProperty: "); 726cdf0e10cSrcweir sMsg += OString(rEx.Message.getStr(), 727cdf0e10cSrcweir rEx.Message.getLength(), 728cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US); 729cdf0e10cSrcweir OSL_ENSURE(sal_False, sMsg.getStr()); 730cdf0e10cSrcweir } 731cdf0e10cSrcweir #else 732cdf0e10cSrcweir catch(Exception& ){} 733cdf0e10cSrcweir #endif 734cdf0e10cSrcweir } 735cdf0e10cSrcweir } 736cdf0e10cSrcweir /* -----------------------------13.12.00 08:47-------------------------------- 737cdf0e10cSrcweir 738cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 739cdf0e10cSrcweir sal_Bool ConfigManager::IsLocalConfigProvider() 740cdf0e10cSrcweir { 741cdf0e10cSrcweir return false; 742cdf0e10cSrcweir } 743cdf0e10cSrcweir 744