diff options
Diffstat (limited to 'rdbmaker/source/codemaker')
-rw-r--r-- | rdbmaker/source/codemaker/dependency.cxx | 301 | ||||
-rw-r--r-- | rdbmaker/source/codemaker/global.cxx | 171 | ||||
-rw-r--r-- | rdbmaker/source/codemaker/makefile.mk | 55 | ||||
-rw-r--r-- | rdbmaker/source/codemaker/options.cxx | 67 | ||||
-rw-r--r-- | rdbmaker/source/codemaker/typemanager.cxx | 273 |
5 files changed, 867 insertions, 0 deletions
diff --git a/rdbmaker/source/codemaker/dependency.cxx b/rdbmaker/source/codemaker/dependency.cxx new file mode 100644 index 000000000000..5305fad0b968 --- /dev/null +++ b/rdbmaker/source/codemaker/dependency.cxx @@ -0,0 +1,301 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include <osl/interlck.h> +#include <rtl/alloc.h> +#include <codemaker/dependency.hxx> + +using namespace rtl; + +TypeDependency::TypeDependency() +{ + m_pImpl = new TypeDependencyImpl(); + acquire(); +} + +TypeDependency::~TypeDependency() +{ + release(); +} + +void TypeDependency::acquire() +{ + osl_incrementInterlockedCount(&m_pImpl->m_refCount); +} + +void TypeDependency::release() +{ + if (0 == osl_decrementInterlockedCount(&m_pImpl->m_refCount)) + { + delete m_pImpl; + } +} + +sal_Bool TypeDependency::insert(const OString& type, const OString& depend, sal_uInt16 use) +{ + sal_Bool ret = sal_False; + + if (type.getLength() > 0 && depend.getLength() > 0) + { + if (m_pImpl->m_dependencies.count(type) > 0) + { + TypeUsing typeUsing(depend, use); + TypeUsingSet::iterator iter; + if ((iter = m_pImpl->m_dependencies[type].find(typeUsing)) != m_pImpl->m_dependencies[type].end()) + { + (((TypeUsing *) &(*iter))->m_use) = (*iter).m_use | use; + } else + { + m_pImpl->m_dependencies[type].insert(typeUsing); + } + } else + { + TypeUsing typeUsing(depend, use); + TypeUsingSet tmpSet; + tmpSet.insert(typeUsing); + m_pImpl->m_dependencies[type]=tmpSet; + } + } + + return ret; +} + +TypeUsingSet TypeDependency::getDependencies(const OString& type) +{ + if (type.getLength() > 0) + { + if (m_pImpl->m_dependencies.count(type) > 0) + { + return m_pImpl->m_dependencies[type]; + } + } + + return TypeUsingSet(); +} + +sal_Bool TypeDependency::hasDependencies(const OString& type) +{ + if (type.getLength() > 0) + { + if (m_pImpl->m_dependencies.count(type) > 0) + { + return sal_True; + } + } + + return sal_False; +} + +void TypeDependency::setGenerated(const OString& type, sal_uInt16 genFlag) +{ +// m_pImpl->m_generatedTypes.insert(type); + if (m_pImpl->m_generatedTypes.count(type) > 0) + m_pImpl->m_generatedTypes[type]= m_pImpl->m_generatedTypes[type] | genFlag; + else + m_pImpl->m_generatedTypes[type]=genFlag; +} + +sal_Bool TypeDependency::isGenerated(const OString& type, sal_uInt16 genFlag) +{ +/* + if (m_pImpl->m_generatedTypes.count(type) > 0) + return sal_True; + + return sal_False; +*/ + if (m_pImpl->m_generatedTypes.count(type) > 0 && + m_pImpl->m_generatedTypes[type] & genFlag) + { + return sal_True; + } + + return sal_False; +} + +static sal_Bool checkFieldDependencies(TypeManager& typeMgr, TypeDependency& dependencies, + TypeReader& reader, const OString& type) +{ + sal_uInt32 count = reader.getFieldCount(); + + if (count == 0 || reader.getTypeClass() == RT_TYPE_ENUM) + return sal_True; + + OString fieldType; + for (sal_uInt16 i=0; i < count; i++) + { + fieldType = reader.getFieldType(i); + + if (fieldType.getLength() > 0) + { + dependencies.insert(type, fieldType, TYPEUSE_MEMBER); + checkTypeDependencies(typeMgr, dependencies, fieldType); + } + } + + return sal_True; +} + +static sal_Bool checkMethodDependencies(TypeManager& typeMgr, TypeDependency& dependencies, + TypeReader& reader, const OString& type) +{ + sal_uInt32 count = reader.getMethodCount(); + + if (count == 0) + return sal_True; + + OString returnType, paramType, excType; + sal_uInt32 paramCount = 0; + sal_uInt32 excCount = 0; + RTParamMode paramMode = RT_PARAM_INVALID; + for (sal_uInt16 i=0; i < count; i++) + { + returnType = reader.getMethodReturnType(i); + + dependencies.insert(type, returnType, TYPEUSE_RETURN); + checkTypeDependencies(typeMgr, dependencies, returnType); + + paramCount = reader.getMethodParamCount(i); + excCount = reader.getMethodExcCount(i); + + sal_uInt16 j; + for (j=0; j < paramCount; j++) + { + paramType = reader.getMethodParamType(i, j); + paramMode = reader.getMethodParamMode(i, j); + + switch (paramMode) + { + case RT_PARAM_IN: + dependencies.insert(type, paramType, TYPEUSE_INPARAM); + break; + case RT_PARAM_OUT: + dependencies.insert(type, paramType, TYPEUSE_OUTPARAM); + break; + case RT_PARAM_INOUT: + dependencies.insert(type, paramType, TYPEUSE_INOUTPARAM); + break; + default: + break; + } + + checkTypeDependencies(typeMgr, dependencies, paramType); + } + + for (j=0; j < excCount; j++) + { + excType = reader.getMethodExcType(i, j); + dependencies.insert(type, excType, TYPEUSE_EXCEPTION); + checkTypeDependencies(typeMgr, dependencies, excType); + } + + } + + return sal_True; +} + +static sal_Bool checkReferenceDependencies(TypeManager& typeMgr, TypeDependency& dependencies, + TypeReader& reader, const OString& type) +{ + sal_uInt32 count = reader.getReferenceCount(); + + if (count == 0) + return sal_True; + + OString referenceName; + for (sal_uInt16 i=0; i < count; i++) + { + referenceName = reader.getReferenceName(i); + + dependencies.insert(type, referenceName, TYPEUSE_NORMAL); + checkTypeDependencies(typeMgr, dependencies, referenceName); + } + + return sal_True; +} + +sal_Bool checkTypeDependencies(TypeManager& typeMgr, TypeDependency& dependencies, const OString& type, sal_Bool bDepend) +{ + if (!typeMgr.isValidType(type)) + return sal_False; + + if (dependencies.hasDependencies(type)) + return sal_True; + + TypeReader reader = typeMgr.getTypeReader(type); + + if ( !reader.isValid() ) + { + if (type.equals("/")) + return sal_True; + else + return sal_False; + } + + if ( bDepend && reader.getTypeClass() == RT_TYPE_MODULE) + { + checkFieldDependencies(typeMgr, dependencies, reader, type); + return sal_True; + } + + for (sal_uInt16 i = 0; i < reader.getSuperTypeCount(); ++i) { + OString superType(reader.getSuperTypeName(i)); + dependencies.insert(type, superType, TYPEUSE_SUPER); + checkTypeDependencies(typeMgr, dependencies, superType); + } + + if (reader.getTypeClass() == RT_TYPE_INTERFACE) + { + dependencies.insert(type, "com/sun/star/uno/RuntimeException", TYPEUSE_EXCEPTION); + dependencies.insert(type, "com/sun/star/uno/TypeClass", TYPEUSE_NORMAL); + checkTypeDependencies(typeMgr, dependencies, "com/sun/star/uno/RuntimeException", bDepend); + } + + checkFieldDependencies(typeMgr, dependencies, reader, type); + checkMethodDependencies(typeMgr, dependencies, reader, type); + checkReferenceDependencies(typeMgr, dependencies, reader, type); + + // make the scope modules as dependencies + sal_Int32 nPos = type.lastIndexOf( '/' ); + + if ( nPos >= 0 ) + { + OString aScope( type.copy( 0, nPos ) ); + OStringBuffer tmpBuf(aScope.getLength()); + + nPos = 0; + do + { + tmpBuf.append(aScope.getToken(0, '/', nPos)); + dependencies.insert(type, tmpBuf.getStr(), TYPEUSE_SCOPE); + tmpBuf.append('/'); + } while( nPos != -1 ); + } + + return sal_True; +} + + diff --git a/rdbmaker/source/codemaker/global.cxx b/rdbmaker/source/codemaker/global.cxx new file mode 100644 index 000000000000..2e6d2a586444 --- /dev/null +++ b/rdbmaker/source/codemaker/global.cxx @@ -0,0 +1,171 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#include <osl/process.h> +#ifndef _RTL_OSTRINGBUFFER_HXX_ +#include <rtl/strbuf.hxx> +#endif +#include <rtl/ustring.hxx> +#include <osl/thread.h> +#include <osl/file.hxx> + +#include <stdlib.h> +#include <stdio.h> +#if defined(SAL_W32) || defined(SAL_OS2) +#include <io.h> +#include <direct.h> +#include <errno.h> +#endif + +#ifdef UNX +#include <sys/stat.h> +#include <errno.h> +#include <unistd.h> +#endif +#include <codemaker/global.hxx> + +#ifdef SAL_UNX +#define SEPARATOR '/' +#else +#define SEPARATOR '\\' +#endif + +using namespace ::rtl; +using namespace ::osl; + +const OString inGlobalSet(const OUString & rValue) +{ + OString sValue( OUStringToOString(rValue, RTL_TEXTENCODING_UTF8) ); + static StringSet aGlobalMap; + StringSet::iterator iter = aGlobalMap.find( sValue ); + if( iter != aGlobalMap.end() ) + return *iter; + return *(aGlobalMap.insert( sValue ).first); +} + +static sal_Bool isFileUrl(const OString& fileName) +{ + if (fileName.indexOf("file://") == 0 ) + return sal_True; + return sal_False; +} + +OUString convertToFileUrl(const OString& fileName) +{ + if ( isFileUrl(fileName) ) + { + return OStringToOUString(fileName, osl_getThreadTextEncoding()); + } + + OUString uUrlFileName; + OUString uFileName(fileName.getStr(), fileName.getLength(), osl_getThreadTextEncoding()); + if ( fileName.indexOf('.') == 0 || fileName.indexOf(SEPARATOR) < 0 ) + { + OUString uWorkingDir; + if (osl_getProcessWorkingDir(&uWorkingDir.pData) != osl_Process_E_None) { + OSL_ASSERT(false); + } + if (FileBase::getAbsoluteFileURL(uWorkingDir, uFileName, uUrlFileName) + != FileBase::E_None) + { + OSL_ASSERT(false); + } + } else + { + if (FileBase::getFileURLFromSystemPath(uFileName, uUrlFileName) + != FileBase::E_None) + { + OSL_ASSERT(false); + } + } + + return uUrlFileName; +} + +//************************************************************************* +// FileStream +//************************************************************************* +FileStream::FileStream() +{ +} + +FileStream::~FileStream() +{ + if ( isValid() ) + { + fflush(m_pFile); + fclose(m_pFile); + } +} + +sal_Bool FileStream::isValid() +{ + if ( m_pFile ) + return sal_True; + + return sal_False; +} + +void FileStream::open(const OString& name, FileAccessMode mode) +{ + if ( name.getLength() > 0 ) + { + m_name = name; + m_pFile = fopen(m_name, checkAccessMode(mode)); + } +} + +void FileStream::close() +{ + if ( isValid() ) + { + fflush(m_pFile); + fclose(m_pFile); + m_pFile = NULL; + m_name = OString(); + } +} + +const sal_Char* FileStream::checkAccessMode(FileAccessMode mode) +{ + switch( mode ) + { + case FAM_READ: + return "r"; + case FAM_WRITE: + return "w"; + case FAM_APPEND: + return "a"; + case FAM_READWRITE_EXIST: + return "r+"; + case FAM_READWRITE: + return "w+"; + case FAM_READAPPEND: + return "a+"; + } + return "w+"; +} + diff --git a/rdbmaker/source/codemaker/makefile.mk b/rdbmaker/source/codemaker/makefile.mk new file mode 100644 index 000000000000..626b71ec0ed5 --- /dev/null +++ b/rdbmaker/source/codemaker/makefile.mk @@ -0,0 +1,55 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* +PRJ=..$/.. + +PRJNAME=codemaker +TARGET=$(PRJNAME) + + +ENABLE_EXCEPTIONS=TRUE + +# --- Settings ----------------------------------------------------- +.INCLUDE : settings.mk + +# ------------------------------------------------------------------ + +CXXFILES= \ + global.cxx \ + options.cxx \ + typemanager.cxx \ + dependency.cxx + +OBJFILES= \ + $(OBJ)$/global.obj \ + $(OBJ)$/options.obj \ + $(OBJ)$/typemanager.obj \ + $(OBJ)$/dependency.obj + +# ------------------------------------------------------------------ + +.INCLUDE : target.mk + diff --git a/rdbmaker/source/codemaker/options.cxx b/rdbmaker/source/codemaker/options.cxx new file mode 100644 index 000000000000..c4fe96d48d04 --- /dev/null +++ b/rdbmaker/source/codemaker/options.cxx @@ -0,0 +1,67 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include <codemaker/options.hxx> + +using namespace rtl; + +Options::Options() +{ +} + +Options::~Options() +{ + +} + +const OString& Options::getProgramName() const +{ + return m_program; +} + +sal_Bool Options::isValid(const OString& option) +{ + return (m_options.count(option) > 0); +} + +const OString Options::getOption(const OString& option) + throw( IllegalArgument ) +{ + if (m_options.count(option) > 0) + { + return m_options[option]; + } else + { + throw IllegalArgument("Option is not valid or currently not set."); + } +} + +const StringVector& Options::getInputFiles() +{ + return m_inputFiles; +} + diff --git a/rdbmaker/source/codemaker/typemanager.cxx b/rdbmaker/source/codemaker/typemanager.cxx new file mode 100644 index 000000000000..f8e231a9403a --- /dev/null +++ b/rdbmaker/source/codemaker/typemanager.cxx @@ -0,0 +1,273 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include <rtl/alloc.h> +#include <osl/file.hxx> +#include <codemaker/typemanager.hxx> + +using namespace rtl; + +TypeManager::TypeManager() +{ + m_pImpl = new TypeManagerImpl(); + acquire(); +} + +TypeManager::~TypeManager() +{ + release(); +} + +sal_Int32 TypeManager::acquire() +{ + return osl_incrementInterlockedCount(&m_pImpl->m_refCount); +} + +sal_Int32 TypeManager::release() +{ + sal_Int32 refCount = 0; + if (0 == (refCount = osl_decrementInterlockedCount(&m_pImpl->m_refCount)) ) + { + delete m_pImpl; + } + return refCount;; +} + +RegistryTypeManager::RegistryTypeManager() +{ + m_pImpl = new RegistryTypeManagerImpl(); + acquire(); +} + +RegistryTypeManager::~RegistryTypeManager() +{ + release(); +} + +void RegistryTypeManager::acquire() +{ + TypeManager::acquire(); +} + +void RegistryTypeManager::release() +{ + if (0 == TypeManager::release()) + { + if (m_pImpl->m_pMergedRegistry) + { + if (m_pImpl->m_pMergedRegistry->isValid()) + { + m_pImpl->m_pMergedRegistry->destroy(OUString()); + } + + delete m_pImpl->m_pMergedRegistry; + } + + if (m_pImpl->m_registries.size() > 0) + { + freeRegistries(); + } + + delete m_pImpl; + } +} + +sal_Bool RegistryTypeManager::init(sal_Bool bMerged, const StringVector& regFiles) +{ + m_pImpl->m_isMerged = bMerged && (regFiles.size() > 1); + + if (regFiles.empty()) + return sal_False; + + StringVector::const_iterator iter = regFiles.begin(); + + Registry tmpReg; + while (iter != regFiles.end()) + { + if (!tmpReg.open( convertToFileUrl(*iter), REG_READONLY)) + m_pImpl->m_registries.push_back(new Registry(tmpReg)); + else + { + freeRegistries(); + return sal_False; + } + iter++; + } + + if (m_pImpl->m_isMerged) + { + Registry *pTmpReg = new Registry; + OUString tmpName; + osl::FileBase::createTempFile(0, 0, &tmpName); + if (!pTmpReg->create(tmpName)) + { + RegistryKey rootKey; + RegError ret = REG_NO_ERROR; + OUString aRoot( RTL_CONSTASCII_USTRINGPARAM("/") ); + iter = regFiles.begin(); + pTmpReg->openRootKey(rootKey); + + while (iter != regFiles.end()) + { + if ( (ret = pTmpReg->mergeKey(rootKey, aRoot, convertToFileUrl( *iter ))) ) + { + if (ret != REG_MERGE_CONFLICT) + { + freeRegistries(); + rootKey.closeKey(); + pTmpReg->destroy( OUString() ); + delete pTmpReg; + return sal_False; + } + } + iter++; + } + + m_pImpl->m_pMergedRegistry = pTmpReg; + freeRegistries(); + } else + { + delete pTmpReg; + freeRegistries(); + return sal_False; + } + } + + return sal_True; +} + +TypeReader RegistryTypeManager::getTypeReader(const OString& name) +{ + TypeReader reader; + RegistryKey key(searchTypeKey(name)); + + if (key.isValid()) + { + RegValueType valueType; + sal_uInt32 valueSize; + + if (!key.getValueInfo(OUString(), &valueType, &valueSize)) + { + sal_uInt8* pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize); + if (!key.getValue(OUString(), pBuffer)) + { + reader = TypeReader(pBuffer, valueSize, sal_True); + } + rtl_freeMemory(pBuffer); + } + } + return reader; +} + +RTTypeClass RegistryTypeManager::getTypeClass(const OString& name) +{ + if (m_pImpl->m_t2TypeClass.count(name) > 0) + { + return m_pImpl->m_t2TypeClass[name]; + } else + { + RegistryKey key(searchTypeKey(name)); + + if (key.isValid()) + { + RegValueType valueType; + sal_uInt32 valueSize; + + if (!key.getValueInfo(OUString(), &valueType, &valueSize)) + { + sal_uInt8* pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize); + if (!key.getValue(OUString(), pBuffer)) + { + TypeReader reader(pBuffer, valueSize, sal_False); + + RTTypeClass ret = reader.getTypeClass(); + + rtl_freeMemory(pBuffer); + + m_pImpl->m_t2TypeClass[name] = ret; + return ret; + } + rtl_freeMemory(pBuffer); + } + } + } + + return RT_TYPE_INVALID; +} + +void RegistryTypeManager::setBase(const OString& base) +{ + m_pImpl->m_base = base; + + if (base.lastIndexOf('/') != (base.getLength() - 1)) + { + m_pImpl->m_base += "/"; + } +} + +void RegistryTypeManager::freeRegistries() +{ + RegistryList::const_iterator iter = m_pImpl->m_registries.begin(); + + while (iter != m_pImpl->m_registries.end()) + { + delete *iter; + + iter++; + } + +} + +RegistryKey RegistryTypeManager::searchTypeKey(const OString& name) +{ + RegistryKey key, rootKey; + + if (m_pImpl->m_isMerged) + { + if (!m_pImpl->m_pMergedRegistry->openRootKey(rootKey)) + { + rootKey.openKey(OStringToOUString(m_pImpl->m_base + name, RTL_TEXTENCODING_UTF8), key); + } + } else + { + RegistryList::const_iterator iter = m_pImpl->m_registries.begin(); + + while (iter != m_pImpl->m_registries.end()) + { + if (!(*iter)->openRootKey(rootKey)) + { + if (!rootKey.openKey(OStringToOUString(m_pImpl->m_base + name, RTL_TEXTENCODING_UTF8), key)) + break; + } + + iter++; + } + } + + return key; +} + |