diff options
author | RĂ¼diger Timm <rt@openoffice.org> | 2005-01-31 14:28:27 +0000 |
---|---|---|
committer | RĂ¼diger Timm <rt@openoffice.org> | 2005-01-31 14:28:27 +0000 |
commit | 5260815e922761532d76d0a71a535aa4799f3858 (patch) | |
tree | 56ef6708c7ce0b94724ea685ef8dd54a11df33b4 /codemaker | |
parent | 81dc4b34af63d6be0c939aeacba38e7dcd8fa48e (diff) |
INTEGRATION: CWS sdksample (1.7.14); FILE MERGED
2004/07/05 11:01:52 jsc 1.7.14.1: #i30954# use registry keys directly instead of typenames
Diffstat (limited to 'codemaker')
-rw-r--r-- | codemaker/source/codemaker/typemanager.cxx | 131 |
1 files changed, 123 insertions, 8 deletions
diff --git a/codemaker/source/codemaker/typemanager.cxx b/codemaker/source/codemaker/typemanager.cxx index 8c95ee691..90ff30579 100644 --- a/codemaker/source/codemaker/typemanager.cxx +++ b/codemaker/source/codemaker/typemanager.cxx @@ -2,9 +2,9 @@ * * $RCSfile: typemanager.cxx,v $ * - * $Revision: 1.7 $ + * $Revision: 1.8 $ * - * last change: $Author: obo $ $Date: 2004-06-04 03:11:06 $ + * last change: $Author: rt $ $Date: 2005-01-31 15:28:27 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -198,6 +198,18 @@ sal_Bool RegistryTypeManager::init( return sal_True; } +::rtl::OString RegistryTypeManager::getTypeName(RegistryKey& rTypeKey) const +{ + OString typeName = OUStringToOString(rTypeKey.getName(), RTL_TEXTENCODING_UTF8); + + if (m_pImpl->m_base.getLength() > 1) + typeName = typeName.copy(typeName.indexOf('/', 1) + 1); + else + typeName = typeName.copy(1); + + return typeName; +} + typereg::Reader RegistryTypeManager::getTypeReader( const OString& name, sal_Bool * pIsExtraType ) const { @@ -223,6 +235,30 @@ typereg::Reader RegistryTypeManager::getTypeReader( return reader; } +typereg::Reader RegistryTypeManager::getTypeReader(RegistryKey& rTypeKey) const +{ + typereg::Reader reader; + + if (rTypeKey.isValid()) + { + RegValueType valueType; + sal_uInt32 valueSize; + + if (!rTypeKey.getValueInfo(OUString(), &valueType, &valueSize)) + { + sal_uInt8* pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize); + if (!rTypeKey.getValue(OUString(), pBuffer)) + { + reader = typereg::Reader( + pBuffer, valueSize, true, TYPEREG_VERSION_1); + } + rtl_freeMemory(pBuffer); + } + } + return reader; +} + + RTTypeClass RegistryTypeManager::getTypeClass(const OString& name) const { if (m_pImpl->m_t2TypeClass.count(name) > 0) @@ -260,14 +296,50 @@ RTTypeClass RegistryTypeManager::getTypeClass(const OString& name) const return RT_TYPE_INVALID; } +RTTypeClass RegistryTypeManager::getTypeClass(RegistryKey& rTypeKey) const +{ + OString name = getTypeName(rTypeKey); + + if (m_pImpl->m_t2TypeClass.count(name) > 0) + { + return m_pImpl->m_t2TypeClass[name]; + } else + { + if (rTypeKey.isValid()) + { + RegValueType valueType; + sal_uInt32 valueSize; + + if (!rTypeKey.getValueInfo(OUString(), &valueType, &valueSize)) + { + sal_uInt8* pBuffer = (sal_uInt8*)rtl_allocateMemory(valueSize); + if (!rTypeKey.getValue(OUString(), pBuffer)) + { + typereg::Reader reader( + pBuffer, valueSize, false, TYPEREG_VERSION_1); + + 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 += "/"; - } + if (base.lastIndexOf('/') == (base.getLength() - 1)) + m_pImpl->m_base += base.copy(0, base.lastIndexOf('/') - 1); + else + m_pImpl->m_base += base; } void RegistryTypeManager::freeRegistries() @@ -289,7 +361,7 @@ void RegistryTypeManager::freeRegistries() RegistryKey RegistryTypeManager::searchTypeKey(const OString& name_, sal_Bool * pIsExtraType ) const { - OUString name( OStringToOUString(m_pImpl->m_base + name_, RTL_TEXTENCODING_UTF8) ); + OUString name( OStringToOUString(m_pImpl->m_base + "/" + name_, RTL_TEXTENCODING_UTF8) ); RegistryKey key, rootKey; RegistryList::const_iterator iter = m_pImpl->m_registries.begin(); @@ -324,3 +396,46 @@ RegistryKey RegistryTypeManager::searchTypeKey(const OString& name_, sal_Bool * return key; } +RegistryKeyList RegistryTypeManager::getTypeKeys(const ::rtl::OString& name_) const +{ + RegistryKeyList keyList= RegistryKeyList(); + OString tmpName; + if ( name_.equals("/") || name_.equals(m_pImpl->m_base) ) { + tmpName = m_pImpl->m_base; + } else { + if ( m_pImpl->m_base.equals("/") ) + tmpName = name_; + else + tmpName = m_pImpl->m_base + "/" + name_; + } + + OUString name( OStringToOUString(tmpName, RTL_TEXTENCODING_UTF8) ); + RegistryKey key, rootKey; + + RegistryList::const_iterator iter = m_pImpl->m_registries.begin(); + while (iter != m_pImpl->m_registries.end()) + { + if (!(*iter)->openRootKey(rootKey)) + { + if (!rootKey.openKey(name, key)) + { + keyList.push_back(KeyPair(key, sal_False)); + } + } + ++iter; + } + iter = m_pImpl->m_extra_registries.begin(); + while (iter != m_pImpl->m_extra_registries.end()) + { + if (!(*iter)->openRootKey(rootKey)) + { + if (!rootKey.openKey(name, key)) + { + keyList.push_back(KeyPair(key, sal_True)); + } + } + ++iter; + } + + return keyList; +} |