summaryrefslogtreecommitdiff
path: root/registry
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2021-09-17 13:37:42 +0200
committerStephan Bergmann <sbergman@redhat.com>2022-06-11 09:58:49 +0200
commit25fc5f91ab7e6fd410ccd403ba19741a16eaab49 (patch)
tree59dd98e95d4fa237fc3d118077904860d051a586 /registry
parent3ae546f97bf6c80627271c28943795175b97fdb9 (diff)
[API CHANGE] Deprecate css.registry.XSimpleRegistry::mergeKey
...and let its implementations just throw a RuntimeException, now that regmerge has been removed in "[API CHANGE] Remove deprecated idlc and regmerge from the SDK". Deprecate css.registry.MergeConflictException along with it (though stoc/source/implementationregistration/ still uses it internally). And remove the previously unused include/registry/writer.hxx along with the newly unused include/registry/writer.h, RegistryTypeWriter, and RegistryTypeReader. Change-Id: I10fd286617975dc0ef9f74460a3a3eab8060939d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123615 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'registry')
-rw-r--r--registry/IwyuFilter_registry.yaml2
-rw-r--r--registry/source/reflread.cxx106
-rw-r--r--registry/source/reflread.hxx114
-rw-r--r--registry/source/reflwrit.cxx1210
-rw-r--r--registry/source/reflwrit.hxx103
-rw-r--r--registry/source/regimpl.cxx400
-rw-r--r--registry/source/regimpl.hxx30
-rw-r--r--registry/source/registry.cxx50
8 files changed, 2 insertions, 2013 deletions
diff --git a/registry/IwyuFilter_registry.yaml b/registry/IwyuFilter_registry.yaml
index 7acf6c936e68..4b2a6b7aa309 100644
--- a/registry/IwyuFilter_registry.yaml
+++ b/registry/IwyuFilter_registry.yaml
@@ -7,8 +7,6 @@ excludelist:
registry/source/reflwrit.cxx:
# OSL_BIGENDIAN is being checked
- osl/endian.h
- # Needed for correct linker visibility
- - registry/writer.h
registry/source/reflread.cxx:
# OSL_BIGENDIAN is being checked
- osl/endian.h
diff --git a/registry/source/reflread.cxx b/registry/source/reflread.cxx
index 57884e110075..f31c6e149cd5 100644
--- a/registry/source/reflread.cxx
+++ b/registry/source/reflread.cxx
@@ -27,9 +27,9 @@
#include <sal/types.h>
#include <osl/endian.h>
#include <osl/diagnose.h>
-#include "reflread.hxx"
#include <sal/log.hxx>
+#include <registry/refltype.hxx>
#include <registry/typereg_reader.hxx>
#include <registry/version.h>
@@ -1213,13 +1213,6 @@ bool TYPEREG_CALLTYPE typereg_reader_create(
}
}
-static TypeReaderImpl TYPEREG_CALLTYPE createEntry(const sal_uInt8* buffer, sal_uInt32 len)
-{
- void * handle;
- typereg_reader_create(buffer, len, &handle);
- return handle;
-}
-
void TYPEREG_CALLTYPE typereg_reader_acquire(void * hEntry)
{
TypeRegistryEntry* pEntry = static_cast<TypeRegistryEntry*>(hEntry);
@@ -1294,23 +1287,6 @@ void TYPEREG_CALLTYPE typereg_reader_getTypeName(void * hEntry, rtl_uString** pT
}
-static void TYPEREG_CALLTYPE getSuperTypeName(TypeReaderImpl hEntry, rtl_uString** pSuperTypeName)
-{
- TypeRegistryEntry* pEntry = static_cast<TypeRegistryEntry*>(hEntry);
- if (pEntry != nullptr && pEntry->m_nSuperTypes != 0) {
- try {
- const char* pTmp = pEntry->m_pCP->readUTF8NameConstant(pEntry->readUINT16(pEntry->m_offset_SUPERTYPES )); //+ (index * sizeof(sal_uInt16))));
- rtl_string2UString(
- pSuperTypeName, pTmp, pTmp == nullptr ? 0 : rtl_str_getLength(pTmp),
- RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS);
- return;
- } catch (BlopObject::BoundsError &) {
- SAL_WARN("registry", "bad data");
- }
- }
- rtl_uString_new(pSuperTypeName);
-}
-
void TYPEREG_CALLTYPE typereg_reader_getDocumentation(void * hEntry, rtl_uString** pDoku)
{
TypeRegistryEntry* pEntry = static_cast<TypeRegistryEntry*>(hEntry);
@@ -1355,11 +1331,6 @@ sal_uInt16 TYPEREG_CALLTYPE typereg_reader_getFieldCount(void * hEntry)
return pEntry->m_pFields->m_numOfEntries;
}
-static sal_uInt32 TYPEREG_CALLTYPE getFieldCount(TypeReaderImpl hEntry)
-{
- return typereg_reader_getFieldCount(hEntry);
-}
-
void TYPEREG_CALLTYPE typereg_reader_getFieldName(void * hEntry, rtl_uString** pFieldName, sal_uInt16 index)
{
TypeRegistryEntry* pEntry = static_cast<TypeRegistryEntry*>(hEntry);
@@ -1419,13 +1390,6 @@ bool TYPEREG_CALLTYPE typereg_reader_getFieldValue(
return true;
}
-static RTValueType TYPEREG_CALLTYPE getFieldConstValue(TypeReaderImpl hEntry, sal_uInt16 index, RTConstValueUnion* value)
-{
- RTValueType t = RT_TYPE_NONE;
- typereg_reader_getFieldValue(hEntry, index, &t, value);
- return t;
-}
-
void TYPEREG_CALLTYPE typereg_reader_getFieldDocumentation(void * hEntry, rtl_uString** pDoku, sal_uInt16 index)
{
TypeRegistryEntry* pEntry = static_cast<TypeRegistryEntry*>(hEntry);
@@ -1689,72 +1653,4 @@ void TYPEREG_CALLTYPE typereg_reader_getSuperTypeName(
rtl_uString_new(pSuperTypeName);
}
-RegistryTypeReader::RegistryTypeReader(const sal_uInt8* buffer,
- sal_uInt32 bufferLen)
- : m_hImpl(nullptr)
-{
- m_hImpl = createEntry(buffer, bufferLen);
-}
-
-RegistryTypeReader::~RegistryTypeReader()
-{ typereg_reader_release(m_hImpl); }
-
-RTTypeClass RegistryTypeReader::getTypeClass() const
-{ return typereg_reader_getTypeClass(m_hImpl); }
-
-OUString RegistryTypeReader::getTypeName() const
-{
- OUString sRet;
- typereg_reader_getTypeName(m_hImpl, &sRet.pData);
- return sRet;
-}
-
-OUString RegistryTypeReader::getSuperTypeName() const
-{
- OUString sRet;
- ::getSuperTypeName(m_hImpl, &sRet.pData);
- return sRet;
-}
-
-sal_uInt32 RegistryTypeReader::getFieldCount() const
-{ return ::getFieldCount(m_hImpl); }
-
-OUString RegistryTypeReader::getFieldName( sal_uInt16 index ) const
-{
- OUString sRet;
- typereg_reader_getFieldName(m_hImpl, &sRet.pData, index);
- return sRet;
-}
-
-OUString RegistryTypeReader::getFieldType( sal_uInt16 index ) const
-{
- OUString sRet;
- typereg_reader_getFieldTypeName(m_hImpl, &sRet.pData, index);
- return sRet;
-}
-
-RTFieldAccess RegistryTypeReader::getFieldAccess( sal_uInt16 index ) const
-{ return typereg_reader_getFieldFlags(m_hImpl, index); }
-
-RTConstValue RegistryTypeReader::getFieldConstValue( sal_uInt16 index ) const
-{
- RTConstValue ret;
- ret.m_type = ::getFieldConstValue(m_hImpl, index, &ret.m_value);
- return ret;
-}
-
-OUString RegistryTypeReader::getFieldDoku( sal_uInt16 index ) const
-{
- OUString sRet;
- typereg_reader_getFieldDocumentation(m_hImpl, &sRet.pData, index);
- return sRet;
-}
-
-OUString RegistryTypeReader::getFieldFileName( sal_uInt16 index ) const
-{
- OUString sRet;
- typereg_reader_getFieldFileName(m_hImpl, &sRet.pData, index);
- return sRet;
-}
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/registry/source/reflread.hxx b/registry/source/reflread.hxx
deleted file mode 100644
index 5fc428212c03..000000000000
--- a/registry/source/reflread.hxx
+++ /dev/null
@@ -1,114 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#ifndef INCLUDED_REGISTRY_SOURCE_REFLREAD_HXX
-#define INCLUDED_REGISTRY_SOURCE_REFLREAD_HXX
-
-#include <registry/refltype.hxx>
-#include <rtl/ustring.hxx>
-
-/// Implementation handle
-typedef void* TypeReaderImpl;
-
-/** RegistryTypeReades reads a binary type blob.
-
- This class provides the necessary functions to read type information
- for all kinds of types of a type blob.
-
- @deprecated
- use typereg::Reader instead
-*/
-class RegistryTypeReader
-{
-public:
-
- /** Constructor.
-
- @param buffer points to the binary data block.
- @param bufferLen specifies the size of the binary data block.
- */
- RegistryTypeReader(const sal_uInt8* buffer,
- sal_uInt32 bufferLen);
-
- /// Destructor. The Destructor frees the data block if the copyData flag was TRUE.
- ~RegistryTypeReader();
-
- /** returns the typeclass of the type represented by this blob.
-
- This function will always return the type class without the internal
- RT_TYPE_PUBLISHED flag set.
- */
- RTTypeClass getTypeClass() const;
-
- /** returns the full qualified name of the type.
- */
- OUString getTypeName() const;
-
- /** returns the full qualified name of the supertype.
- */
- OUString getSuperTypeName() const;
-
- /** returns the number of fields (attributes/properties, enum values or number
- of constants in a module).
-
- */
- sal_uInt32 getFieldCount() const;
-
- /** returns the name of the field specified by index.
- */
- OUString getFieldName( sal_uInt16 index ) const;
-
- /** returns the full qualified name of the field specified by index.
- */
- OUString getFieldType( sal_uInt16 index ) const;
-
- /** returns the access mode of the field specified by index.
- */
- RTFieldAccess getFieldAccess( sal_uInt16 index ) const;
-
- /** returns the value of the field specified by index.
-
- This function returns the value of an enum value or of a constant.
- */
- RTConstValue getFieldConstValue( sal_uInt16 index ) const;
-
- /** returns the documentation string for the field specified by index.
-
- Each field of a type can have their own documentation.
- */
- OUString getFieldDoku( sal_uInt16 index ) const;
-
- /** returns the IDL filename of the field specified by index.
-
- The IDL filename of a field can differ from the filename of the ype itself
- because modules and also constants can be defined in different IDL files.
- */
- OUString getFieldFileName( sal_uInt16 index ) const;
-
-private:
- RegistryTypeReader(RegistryTypeReader const &) = delete;
- void operator =(RegistryTypeReader const &) = delete;
-
- /// stores the handle of an implementation class
- TypeReaderImpl m_hImpl;
-};
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/registry/source/reflwrit.cxx b/registry/source/reflwrit.cxx
index 8f8e83318433..7517f2458ffa 100644
--- a/registry/source/reflwrit.cxx
+++ b/registry/source/reflwrit.cxx
@@ -18,49 +18,15 @@
*/
-#include <new>
-#include <memory>
-#include <algorithm>
#include <sal/types.h>
#include <osl/endian.h>
-#include <rtl/string.hxx>
-#include <rtl/ustring.hxx>
+#include <rtl/ustring.h>
-#include "reflwrit.hxx"
#include <registry/refltype.hxx>
-#include <registry/version.h>
-#include <registry/writer.h>
#include "reflcnst.hxx"
-namespace {
-
-OString toByteString(rtl_uString const * str) {
- return OString(
- str->buffer, str->length, RTL_TEXTENCODING_UTF8,
- OUSTRING_TO_OSTRING_CVTFLAGS);
-}
-
-}
-
-const sal_Unicode NULL_WSTRING[1] = { 0 };
-
-#define BLOP_OFFSET_MAGIC 0
-#define BLOP_OFFSET_SIZE (BLOP_OFFSET_MAGIC + sizeof(sal_uInt32))
-#define BLOP_OFFSET_MINOR (BLOP_OFFSET_SIZE + sizeof(sal_uInt32))
-#define BLOP_OFFSET_MAJOR (BLOP_OFFSET_MINOR + sizeof(sal_uInt16))
-#define BLOP_OFFSET_N_ENTRIES (BLOP_OFFSET_MAJOR + sizeof(sal_uInt16))
-#define BLOP_HEADER_N_ENTRIES 6
-
-#define BLOP_FIELD_N_ENTRIES 6
-
-#define BLOP_METHOD_N_ENTRIES 5
-
-#define BLOP_PARAM_N_ENTRIES 3
-
-#define BLOP_REFERENCE_N_ENTRIES 4
-
sal_uInt32 UINT16StringLen(const sal_uInt8* wstring)
{
if (!wstring) return 0;
@@ -159,1178 +125,4 @@ sal_uInt32 writeDouble(sal_uInt8* buffer, double v)
return (sizeof(sal_uInt32) + sizeof(sal_uInt32));
}
-/**************************************************************************
-
- buffer write functions
-
-**************************************************************************/
-
-namespace {
-
-/**************************************************************************
-
- struct CPInfo
-
-**************************************************************************/
-
-struct CPInfo
-{
- union
- {
- const char* aUtf8;
- RTUik* aUik;
- RTConstValueUnion aConst;
- } m_value;
- struct CPInfo* m_next;
- CPInfoTag m_tag;
- sal_uInt16 m_index;
-
- CPInfo(CPInfoTag tag, struct CPInfo* prev);
-
- sal_uInt32 getBlopSize() const;
-
- sal_uInt32 toBlop(sal_uInt8* buffer);
-};
-
-CPInfo::CPInfo(CPInfoTag tag, struct CPInfo* prev)
- : m_next(nullptr)
- , m_tag(tag)
- , m_index(0)
-{
- if (prev)
- {
- m_index = prev->m_index + 1;
- prev->m_next = this;
- }
-}
-
-sal_uInt32 CPInfo::getBlopSize() const
-{
- sal_uInt32 size = sizeof(sal_uInt32) /* size */ + sizeof(sal_uInt16) /* tag */;
-
- switch (m_tag)
- {
- case CP_TAG_CONST_BOOL:
- size += sizeof(sal_uInt8);
- break;
- case CP_TAG_CONST_BYTE:
- size += sizeof(sal_uInt8);
- break;
- case CP_TAG_CONST_INT16:
- size += sizeof(sal_Int16);
- break;
- case CP_TAG_CONST_UINT16:
- size += sizeof(sal_uInt16);
- break;
- case CP_TAG_CONST_INT32:
- size += sizeof(sal_Int32);
- break;
- case CP_TAG_CONST_UINT32:
- size += sizeof(sal_uInt32);
- break;
- case CP_TAG_CONST_INT64:
- size += sizeof(sal_Int64);
- break;
- case CP_TAG_CONST_UINT64:
- size += sizeof(sal_uInt64);
- break;
- case CP_TAG_CONST_FLOAT:
- size += sizeof(sal_uInt32);
- break;
- case CP_TAG_CONST_DOUBLE:
- size += sizeof(sal_uInt32) + sizeof(sal_uInt32);
- break;
- case CP_TAG_CONST_STRING:
- size += (rtl_ustr_getLength(m_value.aConst.aString) + 1) * sizeof(sal_uInt16);
- break;
- case CP_TAG_UTF8_NAME:
- size += strlen(m_value.aUtf8) + 1;
- break;
- case CP_TAG_UIK:
- size += sizeof(sal_uInt32) + sizeof(sal_uInt16) + sizeof(sal_uInt16) + sizeof(sal_uInt32) + sizeof(sal_uInt32);
- break;
- default:
- break;
- }
-
- return size;
-}
-
-
-sal_uInt32 CPInfo::toBlop(sal_uInt8* buffer)
-{
- sal_uInt8* buff = buffer;
-
- buff += writeUINT32(buff, getBlopSize());
- buff += writeUINT16(buff, static_cast<sal_uInt16>(m_tag));
-
- switch (m_tag)
- {
- case CP_TAG_CONST_BOOL:
- buff += writeBYTE(buff, static_cast<sal_uInt8>(m_value.aConst.aBool));
- break;
- case CP_TAG_CONST_BYTE:
- buff += writeBYTE(
- buff, static_cast< sal_uInt8 >(m_value.aConst.aByte));
- break;
- case CP_TAG_CONST_INT16:
- buff += writeINT16(buff, m_value.aConst.aShort);
- break;
- case CP_TAG_CONST_UINT16:
- buff += writeINT16(buff, m_value.aConst.aUShort);
- break;
- case CP_TAG_CONST_INT32:
- buff += writeINT32(buff, m_value.aConst.aLong);
- break;
- case CP_TAG_CONST_UINT32:
- buff += writeUINT32(buff, m_value.aConst.aULong);
- break;
- case CP_TAG_CONST_INT64:
- buff += writeUINT64(buff, m_value.aConst.aHyper);
- break;
- case CP_TAG_CONST_UINT64:
- buff += writeUINT64(buff, m_value.aConst.aUHyper);
- break;
- case CP_TAG_CONST_FLOAT:
- buff += writeFloat(buff, m_value.aConst.aFloat);
- break;
- case CP_TAG_CONST_DOUBLE:
- buff += writeDouble(buff, m_value.aConst.aDouble);
- break;
- case CP_TAG_CONST_STRING:
- buff += writeString(buff, m_value.aConst.aString);
- break;
- case CP_TAG_UTF8_NAME:
- buff += writeUtf8(buff, m_value.aUtf8);
- break;
- case CP_TAG_UIK:
- buff += writeUINT32(buff, m_value.aUik->m_Data1);
- buff += writeUINT16(buff, m_value.aUik->m_Data2);
- buff += writeUINT16(buff, m_value.aUik->m_Data3);
- buff += writeUINT32(buff, m_value.aUik->m_Data4);
- buff += writeUINT32(buff, m_value.aUik->m_Data5);
- break;
- default:
- break;
- }
-
- return (buff - buffer);
-}
-
-
-/**************************************************************************
-
- class FieldEntry
-
-**************************************************************************/
-
-class FieldEntry
-{
-
-public:
-
- OString m_name;
- OString m_typeName;
- OString m_doku;
- OString m_fileName;
- RTFieldAccess m_access;
- RTValueType m_constValueType;
- RTConstValueUnion m_constValue;
-
- FieldEntry();
- ~FieldEntry();
-
- void setData(const OString& name,
- const OString& typeName,
- const OString& doku,
- const OString& fileName,
- RTFieldAccess access,
- RTValueType constValueType,
- RTConstValueUnion constValue);
- // throws std::bad_alloc
-};
-
-FieldEntry::FieldEntry()
- : m_access(RTFieldAccess::INVALID)
- , m_constValueType(RT_TYPE_NONE)
-{
-}
-
-FieldEntry::~FieldEntry()
-{
- if (
- (m_constValueType == RT_TYPE_STRING) &&
- m_constValue.aString &&
- (m_constValue.aString != NULL_WSTRING)
- )
- {
- delete[] m_constValue.aString;
- }
-}
-
-void FieldEntry::setData(const OString& name,
- const OString& typeName,
- const OString& doku,
- const OString& fileName,
- RTFieldAccess access,
- RTValueType constValueType,
- RTConstValueUnion constValue)
-{
- std::unique_ptr<sal_Unicode[]> newValue;
- if (constValueType == RT_TYPE_STRING && constValue.aString != nullptr) {
- sal_Int32 n = rtl_ustr_getLength(constValue.aString) + 1;
- newValue.reset(new sal_Unicode[n]);
- memcpy(newValue.get(), constValue.aString, n * sizeof (sal_Unicode));
- }
-
- m_name = name;
- m_typeName = typeName;
- m_doku = doku;
- m_fileName = fileName;
-
- if (
- (m_constValueType == RT_TYPE_STRING) &&
- m_constValue.aString &&
- (m_constValue.aString != NULL_WSTRING)
- )
- {
- delete[] m_constValue.aString;
- }
-
- m_access = access;
- m_constValueType = constValueType;
-
- if (m_constValueType == RT_TYPE_STRING)
- {
- if (constValue.aString == nullptr)
- m_constValue.aString = NULL_WSTRING;
- else
- {
- m_constValue.aString = newValue.release();
- }
- }
- else
- {
- m_constValue = constValue;
- }
-}
-
-/**************************************************************************
-
- class ParamEntry
-
-**************************************************************************/
-
-class ParamEntry
-{
-public:
-
- OString m_typeName;
- OString m_name;
- RTParamMode m_mode;
-
- ParamEntry();
-
- void setData(const OString& typeName,
- const OString& name,
- RTParamMode mode);
-};
-
-ParamEntry::ParamEntry()
- : m_mode(RT_PARAM_INVALID)
-{
-}
-
-void ParamEntry::setData(const OString& typeName,
- const OString& name,
- RTParamMode mode)
-{
- m_name = name;
- m_typeName = typeName;
- m_mode = mode;
-}
-
-/**************************************************************************
-
- class ReferenceEntry
-
-**************************************************************************/
-
-class ReferenceEntry
-{
-public:
-
- OString m_name;
- OString m_doku;
- RTReferenceType m_type;
- RTFieldAccess m_access;
-
- ReferenceEntry();
-
- void setData(const OString& name,
- RTReferenceType refType,
- const OString& doku,
- RTFieldAccess access);
-};
-
-ReferenceEntry::ReferenceEntry()
- : m_type(RTReferenceType::INVALID)
- , m_access(RTFieldAccess::INVALID)
-{
-}
-
-void ReferenceEntry::setData(const OString& name,
- RTReferenceType refType,
- const OString& doku,
- RTFieldAccess access)
-{
- m_name = name;
- m_doku = doku;
- m_type = refType;
- m_access = access;
-}
-
-/**************************************************************************
-
- class MethodEntry
-
-**************************************************************************/
-
-class MethodEntry
-{
-public:
-
- OString m_name;
- OString m_returnTypeName;
- RTMethodMode m_mode;
- sal_uInt16 m_paramCount;
- std::unique_ptr<ParamEntry[]> m_params;
- sal_uInt16 m_excCount;
- std::unique_ptr<OString[]> m_excNames;
- OString m_doku;
-
- MethodEntry();
-
- void setData(const OString& name,
- const OString& returnTypeName,
- RTMethodMode mode,
- sal_uInt16 paramCount,
- sal_uInt16 excCount,
- const OString& doku);
-
- void setExcName(sal_uInt16 excIndex, const OString& name) const;
-
-protected:
-
- void reallocParams(sal_uInt16 size);
- void reallocExcs(sal_uInt16 size);
-};
-
-MethodEntry::MethodEntry()
- : m_mode(RTMethodMode::INVALID)
- , m_paramCount(0)
- , m_excCount(0)
-{
-}
-
-void MethodEntry::setData(const OString& name,
- const OString& returnTypeName,
- RTMethodMode mode,
- sal_uInt16 paramCount,
- sal_uInt16 excCount,
- const OString& doku)
-{
- m_name = name;
- m_returnTypeName = returnTypeName;
- m_doku = doku;
-
- m_mode = mode;
-
- reallocParams(paramCount);
- reallocExcs(excCount);
-}
-
-void MethodEntry::setExcName(sal_uInt16 excIndex, const OString& name) const
-{
- if (excIndex < m_excCount)
- {
- m_excNames[excIndex] = name;
- }
-}
-
-void MethodEntry::reallocParams(sal_uInt16 size)
-{
- ParamEntry* newParams;
-
- if (size)
- newParams = new ParamEntry[size];
- else
- newParams = nullptr;
-
- if (m_paramCount)
- {
- sal_uInt16 i;
- sal_uInt16 mn = std::min(size, m_paramCount);
-
- for (i = 0; i < mn; i++)
- {
- newParams[i].setData(m_params[i].m_typeName, m_params[i].m_name, m_params[i].m_mode);
- }
-
- m_params.reset();
- }
-
- m_paramCount = size;
- m_params.reset( newParams );
-}
-
-void MethodEntry::reallocExcs(sal_uInt16 size)
-{
- OString* newExcNames;
-
- if (size)
- newExcNames = new OString[size];
- else
- newExcNames = nullptr;
-
- sal_uInt16 i;
- sal_uInt16 mn = std::min(size, m_excCount);
-
- for (i = 0; i < mn; i++)
- {
- newExcNames[i] = m_excNames[i];
- }
-
- m_excCount = size;
- m_excNames.reset( newExcNames );
-}
-
-
-/**************************************************************************
-
- class TypeRegistryEntry
-
-**************************************************************************/
-
-class TypeWriter
-{
-
-public:
-
- sal_uInt32 m_refCount;
- typereg_Version m_version;
- RTTypeClass m_typeClass;
- OString m_typeName;
- sal_uInt16 m_nSuperTypes;
- std::unique_ptr<OString[]>
- m_superTypeNames;
- OString m_doku;
- OString m_fileName;
- sal_uInt16 m_fieldCount;
- FieldEntry* m_fields;
- sal_uInt16 m_methodCount;
- MethodEntry* m_methods;
- sal_uInt16 m_referenceCount;
- ReferenceEntry* m_references;
-
- std::unique_ptr<sal_uInt8[]> m_blop;
- sal_uInt32 m_blopSize;
-
- TypeWriter(typereg_Version version,
- OString const & documentation,
- OString const & fileName,
- RTTypeClass RTTypeClass,
- bool published,
- const OString& typeName,
- sal_uInt16 superTypeCount,
- sal_uInt16 FieldCount,
- sal_uInt16 methodCount,
- sal_uInt16 referenceCount);
-
- ~TypeWriter();
-
- void setSuperType(sal_uInt16 index, OString const & name) const;
-
- void createBlop(); // throws std::bad_alloc
-};
-
-TypeWriter::TypeWriter(typereg_Version version,
- OString const & documentation,
- OString const & fileName,
- RTTypeClass RTTypeClass,
- bool published,
- const OString& typeName,
- sal_uInt16 superTypeCount,
- sal_uInt16 fieldCount,
- sal_uInt16 methodCount,
- sal_uInt16 referenceCount)
- : m_refCount(1)
- , m_version(version)
- , m_typeClass(
- static_cast< enum RTTypeClass >(
- RTTypeClass | (published ? RT_TYPE_PUBLISHED : 0)))
- , m_typeName(typeName)
- , m_nSuperTypes(superTypeCount)
- , m_doku(documentation)
- , m_fileName(fileName)
- , m_fieldCount(fieldCount)
- , m_fields(nullptr)
- , m_methodCount(methodCount)
- , m_methods(nullptr)
- , m_referenceCount(referenceCount)
- , m_references(nullptr)
- , m_blopSize(0)
-{
- if (m_nSuperTypes > 0)
- {
- m_superTypeNames.reset( new OString[m_nSuperTypes] );
- }
-
- if (m_fieldCount)
- m_fields = new FieldEntry[fieldCount];
-
- if (m_methodCount)
- m_methods = new MethodEntry[methodCount];
-
- if (m_referenceCount)
- m_references = new ReferenceEntry[referenceCount];
-}
-
-TypeWriter::~TypeWriter()
-{
- if (m_fieldCount)
- delete[] m_fields;
-
- if (m_methodCount)
- delete[] m_methods;
-
- if (m_referenceCount)
- delete[] m_references;
-}
-
-void TypeWriter::setSuperType(sal_uInt16 index, OString const & name) const
-{
- m_superTypeNames[index] = name;
-}
-
-void TypeWriter::createBlop()
-{
- //TODO: Fix memory leaks that occur when std::bad_alloc is thrown
-
- std::unique_ptr<sal_uInt8[]> pBlopFields;
- std::unique_ptr<sal_uInt8[]> pBlopMethods;
- std::unique_ptr<sal_uInt8[]> pBlopReferences;
- sal_uInt8* pBuffer = nullptr;
- sal_uInt32 blopFieldsSize = 0;
- sal_uInt32 blopMethodsSize = 0;
- sal_uInt32 blopReferenceSize = 0;
-
- CPInfo root(CP_TAG_INVALID, nullptr);
- sal_uInt16 cpIndexThisName = 0;
- std::unique_ptr<sal_uInt16[]> cpIndexSuperNames;
- sal_uInt16 cpIndexDoku = 0;
- sal_uInt16 cpIndexFileName = 0;
- CPInfo* pInfo = nullptr;
-
- sal_uInt16 entrySize = sizeof(sal_uInt16);
- sal_uInt32 blopHeaderEntrySize = BLOP_OFFSET_N_ENTRIES + entrySize + (BLOP_HEADER_N_ENTRIES * entrySize);
- sal_uInt32 blopFieldEntrySize = BLOP_FIELD_N_ENTRIES * entrySize;
- sal_uInt32 blopMethodEntrySize = BLOP_METHOD_N_ENTRIES * entrySize;
- sal_uInt32 blopParamEntrySize = BLOP_PARAM_N_ENTRIES * entrySize;
- sal_uInt32 blopReferenceEntrySize = BLOP_REFERENCE_N_ENTRIES * entrySize;
-
- sal_uInt32 blopSize = blopHeaderEntrySize;
-
- // create CP entry for this name
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, &root);
- pInfo->m_value.aUtf8 = m_typeName.getStr();
- cpIndexThisName = pInfo->m_index;
-
- // nSuperTypes
- blopSize += entrySize;
-
- // create CP entry for super names
- if (m_nSuperTypes)
- {
- blopSize += m_nSuperTypes * entrySize;
-
- cpIndexSuperNames.reset(new sal_uInt16[m_nSuperTypes]);
-
- for (sal_uInt32 i=0; i < m_nSuperTypes; i++)
- {
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo);
- pInfo->m_value.aUtf8 = m_superTypeNames[i].getStr();
- cpIndexSuperNames[i] = pInfo->m_index;
- }
- }
-
- // create CP entry for doku
- if (!m_doku.isEmpty())
- {
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo);
- pInfo->m_value.aUtf8 = m_doku.getStr();
- cpIndexDoku = pInfo->m_index;
- }
-
- // create CP entry for idl source filename
- if (!m_fileName.isEmpty())
- {
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo);
- pInfo->m_value.aUtf8 = m_fileName.getStr();
- cpIndexFileName = pInfo->m_index;
- }
-
- // fields blop
- blopSize += sizeof(sal_uInt16); // fieldCount + nFieldEntries
-
- if (m_fieldCount)
- {
- sal_uInt16 cpIndexName = 0;
- sal_uInt16 cpIndexTypeName = 0;
- sal_uInt16 cpIndexValue = 0;
- sal_uInt16 cpIndexDoku2 = 0;
- sal_uInt16 cpIndexFileName2 = 0;
-
- // nFieldEntries + n fields
- blopFieldsSize = sizeof(sal_uInt16) + (m_fieldCount * blopFieldEntrySize);
-
- blopSize += blopFieldsSize;
-
- pBlopFields.reset(new sal_uInt8[blopFieldsSize]);
- pBuffer = pBlopFields.get();
-
- pBuffer += writeUINT16(pBuffer, BLOP_FIELD_N_ENTRIES);
-
- for (sal_uInt16 i = 0; i < m_fieldCount; i++)
- {
- cpIndexName = 0;
- cpIndexTypeName = 0;
- cpIndexValue = 0;
- cpIndexDoku2 = 0;
- cpIndexFileName2 = 0;
-
- pBuffer += writeUINT16(pBuffer, static_cast<sal_uInt16>(m_fields[i].m_access));
-
- if (!m_fields[i].m_name.isEmpty())
- {
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo);
- pInfo->m_value.aUtf8 = m_fields[i].m_name.getStr();
- cpIndexName = pInfo->m_index;
- }
- pBuffer += writeUINT16(pBuffer, cpIndexName);
-
- if (!m_fields[i].m_typeName.isEmpty())
- {
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo);
- pInfo->m_value.aUtf8 = m_fields[i].m_typeName.getStr();
- cpIndexTypeName = pInfo->m_index;
- }
- pBuffer += writeUINT16(pBuffer, cpIndexTypeName);
-
- if (m_fields[i].m_constValueType != RT_TYPE_NONE)
- {
- pInfo = new CPInfo(static_cast<CPInfoTag>(m_fields[i].m_constValueType), pInfo);
- pInfo->m_value.aConst = m_fields[i].m_constValue;
- cpIndexValue = pInfo->m_index;
- }
- pBuffer += writeUINT16(pBuffer, cpIndexValue);
-
- if (!m_fields[i].m_doku.isEmpty())
- {
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo);
- pInfo->m_value.aUtf8 = m_fields[i].m_doku.getStr();
- cpIndexDoku2 = pInfo->m_index;
- }
- pBuffer += writeUINT16(pBuffer, cpIndexDoku2);
-
- if (!m_fields[i].m_fileName.isEmpty())
- {
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo);
- pInfo->m_value.aUtf8 = m_fields[i].m_fileName.getStr();
- cpIndexFileName2 = pInfo->m_index;
- }
- pBuffer += writeUINT16(pBuffer, cpIndexFileName2);
- }
- }
-
- // methods blop
- blopSize += sizeof(sal_uInt16); // methodCount
-
- if (m_methodCount)
- {
- std::unique_ptr<sal_uInt16[]> pMethodEntrySize( new sal_uInt16[m_methodCount] );
- sal_uInt16 cpIndexName = 0;
- sal_uInt16 cpIndexReturn = 0;
- sal_uInt16 cpIndexDoku2 = 0;
-
- // nMethodEntries + nParamEntries
- blopMethodsSize = (2 * sizeof(sal_uInt16));
-
- for (sal_uInt16 i = 0; i < m_methodCount; i++)
- {
- pMethodEntrySize[i] = static_cast<sal_uInt16>( blopMethodEntrySize + // header
- sizeof(sal_uInt16) + // parameterCount
- (m_methods[i].m_paramCount * blopParamEntrySize) + // exceptions
- sizeof(sal_uInt16) + // exceptionCount
- (m_methods[i].m_excCount * sizeof(sal_uInt16)) ); // exceptions
-
- blopMethodsSize += pMethodEntrySize[i];
- }
-
- pBlopMethods.reset(new sal_uInt8[blopMethodsSize]);
-
- blopSize += blopMethodsSize;
-
- pBuffer = pBlopMethods.get();
-
- pBuffer += writeUINT16(pBuffer, BLOP_METHOD_N_ENTRIES);
- pBuffer += writeUINT16(pBuffer, BLOP_PARAM_N_ENTRIES );
-
- for (sal_uInt16 i = 0; i < m_methodCount; i++)
- {
- cpIndexReturn = 0;
- cpIndexDoku2 = 0;
-
- pBuffer += writeUINT16(pBuffer, pMethodEntrySize[i]);
- pBuffer += writeUINT16(
- pBuffer,
- sal::static_int_cast< sal_uInt16 >(m_methods[i].m_mode));
-
- if (!m_methods[i].m_name.isEmpty())
- {
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo);
- pInfo->m_value.aUtf8 = m_methods[i].m_name.getStr();
- cpIndexName = pInfo->m_index;
- }
- pBuffer += writeUINT16(pBuffer, cpIndexName);
- cpIndexName = 0;
-
- if (!m_methods[i].m_returnTypeName.isEmpty())
- {
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo);
- pInfo->m_value.aUtf8 = m_methods[i].m_returnTypeName.getStr();
- cpIndexReturn = pInfo->m_index;
- }
- pBuffer += writeUINT16(pBuffer, cpIndexReturn);
-
- if (!m_methods[i].m_doku.isEmpty())
- {
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo);
- pInfo->m_value.aUtf8 = m_methods[i].m_doku.getStr();
- cpIndexDoku2 = pInfo->m_index;
- }
- pBuffer += writeUINT16(pBuffer, cpIndexDoku2);
-
- sal_uInt16 j;
-
- pBuffer += writeUINT16(pBuffer, m_methods[i].m_paramCount);
-
- for (j = 0; j < m_methods[i].m_paramCount; j++)
- {
- if (!m_methods[i].m_params[j].m_typeName.isEmpty())
- {
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo);
- pInfo->m_value.aUtf8 = m_methods[i].m_params[j].m_typeName.getStr();
- cpIndexName = pInfo->m_index;
- }
- pBuffer += writeUINT16(pBuffer, cpIndexName);
- cpIndexName = 0;
-
- pBuffer += writeUINT16(
- pBuffer,
- sal::static_int_cast< sal_uInt16 >(
- m_methods[i].m_params[j].m_mode));
-
- if (!m_methods[i].m_params[j].m_name.isEmpty())
- {
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo);
- pInfo->m_value.aUtf8 = m_methods[i].m_params[j].m_name.getStr();
- cpIndexName = pInfo->m_index;
- }
- pBuffer += writeUINT16(pBuffer, cpIndexName);
- cpIndexName = 0;
- }
-
- pBuffer += writeUINT16(pBuffer, m_methods[i].m_excCount);
-
- for (j = 0; j < m_methods[i].m_excCount; j++)
- {
- if (!m_methods[i].m_excNames[j].isEmpty())
- {
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo);
- pInfo->m_value.aUtf8 = m_methods[i].m_excNames[j].getStr();
- cpIndexName = pInfo->m_index;
- }
- pBuffer += writeUINT16(pBuffer, cpIndexName);
- cpIndexName = 0;
- }
- }
- }
-
- // reference blop
- blopSize += entrySize; // referenceCount
-
- if (m_referenceCount)
- {
- sal_uInt16 cpIndexName = 0;
- sal_uInt16 cpIndexDoku2 = 0;
-
- // nReferenceEntries + n references
- blopReferenceSize = entrySize + (m_referenceCount * blopReferenceEntrySize);
-
- blopSize += blopReferenceSize;
-
- pBlopReferences.reset(new sal_uInt8[blopReferenceSize]);
- pBuffer = pBlopReferences.get();
-
- pBuffer += writeUINT16(pBuffer, BLOP_REFERENCE_N_ENTRIES);
-
- for (sal_uInt16 i = 0; i < m_referenceCount; i++)
- {
- pBuffer += writeUINT16(
- pBuffer,
- sal::static_int_cast< sal_uInt16 >(m_references[i].m_type));
-
- cpIndexName = 0;
- cpIndexDoku2 = 0;
-
- if (!m_references[i].m_name.isEmpty())
- {
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo);
- pInfo->m_value.aUtf8 = m_references[i].m_name.getStr();
- cpIndexName = pInfo->m_index;
- }
- pBuffer += writeUINT16(pBuffer, cpIndexName);
-
- if (!m_references[i].m_doku.isEmpty())
- {
- pInfo = new CPInfo(CP_TAG_UTF8_NAME, pInfo);
- pInfo->m_value.aUtf8 = m_references[i].m_doku.getStr();
- cpIndexDoku2 = pInfo->m_index;
- }
- pBuffer += writeUINT16(pBuffer, cpIndexDoku2);
-
- pBuffer += writeUINT16(pBuffer, static_cast<sal_uInt16>(m_references[i].m_access));
- }
- }
-
-
- // get CP infos blop-length
- pInfo = root.m_next;
- sal_uInt32 cpBlopSize = 0;
- sal_uInt16 cpCount = 0;
-
- while (pInfo)
- {
- cpBlopSize += pInfo->getBlopSize();
- cpCount++;
- pInfo = pInfo->m_next;
- }
-
- blopSize += cpBlopSize;
- blopSize += sizeof(sal_uInt16); // constantPoolCount
-
- // write all in flat buffer
-
- sal_uInt8 * blop = new sal_uInt8[blopSize];
-
- pBuffer = blop;
-
- // Assumes two's complement arithmetic with modulo-semantics:
- pBuffer += writeUINT32(pBuffer, magic + m_version);
- pBuffer += writeUINT32(pBuffer, blopSize);
- pBuffer += writeUINT16(pBuffer, minorVersion);
- pBuffer += writeUINT16(pBuffer, majorVersion);
- pBuffer += writeUINT16(pBuffer, BLOP_HEADER_N_ENTRIES);
-
- pBuffer += writeUINT16(pBuffer, sal_uInt16(RT_UNO_IDL));
- pBuffer += writeUINT16(pBuffer, static_cast<sal_uInt16>(m_typeClass));
- pBuffer += writeUINT16(pBuffer, cpIndexThisName);
- pBuffer += writeUINT16(pBuffer, 0); // cpIndexUik
- pBuffer += writeUINT16(pBuffer, cpIndexDoku);
- pBuffer += writeUINT16(pBuffer, cpIndexFileName);
-
- // write supertypes
- pBuffer += writeUINT16(pBuffer, m_nSuperTypes);
- if (m_nSuperTypes)
- {
- for (sal_uInt32 i=0; i < m_nSuperTypes; i++)
- {
- pBuffer += writeUINT16(pBuffer, cpIndexSuperNames[i]);
- }
- cpIndexSuperNames.reset();
- }
-
- pBuffer += writeUINT16(pBuffer, cpCount);
-
- // write and delete CP infos
- pInfo = root.m_next;
-
- while (pInfo)
- {
- CPInfo* pNextInfo = pInfo->m_next;
-
- pBuffer += pInfo->toBlop(pBuffer);
- delete pInfo;
-
- pInfo = pNextInfo;
- }
-
- auto writeList = [&pBuffer](
- sal_uInt16 count, sal_uInt8 * data, sal_uInt32 size)
- {
- pBuffer += writeUINT16(pBuffer, count);
- if (size != 0) {
- memcpy(pBuffer, data, size);
- pBuffer += size;
- }
- };
-
- // write fields
- writeList(m_fieldCount, pBlopFields.get(), blopFieldsSize);
-
- // write methods
- writeList(m_methodCount, pBlopMethods.get(), blopMethodsSize);
-
- // write references
- writeList(m_referenceCount, pBlopReferences.get(), blopReferenceSize);
-
- m_blop.reset( blop );
- m_blopSize = blopSize;
-}
-
-} // unnamed namespace
-
-/**************************************************************************
-
- C-API
-
-**************************************************************************/
-
-extern "C" {
-
-static void TYPEREG_CALLTYPE release(TypeWriterImpl hEntry)
-{
- TypeWriter* pEntry = static_cast<TypeWriter*>(hEntry);
-
- if (pEntry != nullptr)
- {
- if (--pEntry->m_refCount == 0)
- delete pEntry;
- }
-}
-
-sal_Bool TYPEREG_CALLTYPE typereg_writer_setFieldData(
- void * handle, sal_uInt16 index, rtl_uString const * documentation,
- rtl_uString const * fileName, RTFieldAccess flags, rtl_uString const * name,
- rtl_uString const * typeName, RTValueType valueType,
- RTConstValueUnion valueValue)
- SAL_THROW_EXTERN_C()
-{
- try {
- static_cast< TypeWriter * >(handle)->m_fields[index].setData(
- toByteString(name), toByteString(typeName),
- toByteString(documentation), toByteString(fileName), flags,
- valueType, valueValue);
- } catch (std::bad_alloc &) {
- return false;
- }
- return true;
-}
-
-static void TYPEREG_CALLTYPE setFieldData(TypeWriterImpl hEntry,
- sal_uInt16 index,
- rtl_uString const * name,
- rtl_uString const * typeName,
- rtl_uString const * doku,
- rtl_uString const * fileName,
- RTFieldAccess access,
- RTValueType valueType,
- RTConstValueUnion constValue)
-{
- typereg_writer_setFieldData(
- hEntry, index, doku, fileName, access, name, typeName, valueType,
- constValue);
-}
-
-sal_Bool TYPEREG_CALLTYPE typereg_writer_setMethodData(
- void * handle, sal_uInt16 index, rtl_uString const * documentation,
- RTMethodMode flags, rtl_uString const * name,
- rtl_uString const * returnTypeName, sal_uInt16 parameterCount,
- sal_uInt16 exceptionCount)
- SAL_THROW_EXTERN_C()
-{
- try {
- static_cast< TypeWriter * >(handle)->m_methods[index].setData(
- toByteString(name), toByteString(returnTypeName), flags,
- parameterCount, exceptionCount, toByteString(documentation));
- } catch (std::bad_alloc &) {
- return false;
- }
- return true;
-}
-
-sal_Bool TYPEREG_CALLTYPE typereg_writer_setMethodParameterData(
- void const * handle, sal_uInt16 methodIndex, sal_uInt16 parameterIndex,
- RTParamMode flags, rtl_uString const * name, rtl_uString const * typeName)
- SAL_THROW_EXTERN_C()
-{
- try {
- static_cast< TypeWriter const * >(handle)->
- m_methods[methodIndex].m_params[parameterIndex].setData(
- toByteString(typeName), toByteString(name), flags);
- } catch (std::bad_alloc &) {
- return false;
- }
- return true;
-}
-
-sal_Bool TYPEREG_CALLTYPE typereg_writer_setMethodExceptionTypeName(
- void const * handle, sal_uInt16 methodIndex, sal_uInt16 exceptionIndex,
- rtl_uString const * typeName)
- SAL_THROW_EXTERN_C()
-{
- try {
- static_cast< TypeWriter const * >(handle)->m_methods[methodIndex].setExcName(
- exceptionIndex, toByteString(typeName));
- } catch (std::bad_alloc &) {
- return false;
- }
- return true;
-}
-
-void const * TYPEREG_CALLTYPE typereg_writer_getBlob(void * handle, sal_uInt32 * size)
- SAL_THROW_EXTERN_C()
-{
- TypeWriter * writer = static_cast< TypeWriter * >(handle);
- if (!writer->m_blop) {
- try {
- writer->createBlop();
- } catch (std::bad_alloc &) {
- *size = 0;
- return nullptr;
- }
- }
- *size = writer->m_blopSize;
- return writer->m_blop.get();
-}
-
-static const sal_uInt8* TYPEREG_CALLTYPE getBlop(TypeWriterImpl hEntry)
-{
- sal_uInt32 size;
- return static_cast< sal_uInt8 const * >(
- typereg_writer_getBlob(hEntry, &size));
-}
-
-static sal_uInt32 TYPEREG_CALLTYPE getBlopSize(TypeWriterImpl hEntry)
-{
- sal_uInt32 size;
- typereg_writer_getBlob(hEntry, &size);
- return size;
-}
-
-sal_Bool TYPEREG_CALLTYPE typereg_writer_setReferenceData(
- void * handle, sal_uInt16 index, rtl_uString const * documentation,
- RTReferenceType sort, RTFieldAccess flags, rtl_uString const * typeName)
- SAL_THROW_EXTERN_C()
-{
- try {
- static_cast< TypeWriter * >(handle)->m_references[index].setData(
- toByteString(typeName), sort, toByteString(documentation), flags);
- } catch (std::bad_alloc &) {
- return false;
- }
- return true;
-}
-
-void * TYPEREG_CALLTYPE typereg_writer_create(
- typereg_Version version, rtl_uString const * documentation,
- rtl_uString const * fileName, RTTypeClass typeClass, sal_Bool published,
- rtl_uString const * typeName, sal_uInt16 superTypeCount,
- sal_uInt16 fieldCount, sal_uInt16 methodCount, sal_uInt16 referenceCount)
- SAL_THROW_EXTERN_C()
-{
- try {
- return new TypeWriter(
- version, toByteString(documentation), toByteString(fileName),
- typeClass, published, toByteString(typeName), superTypeCount,
- fieldCount, methodCount, referenceCount);
- } catch (std::bad_alloc &) {
- return nullptr;
- }
-}
-
-void TYPEREG_CALLTYPE typereg_writer_destroy(void * handle) SAL_THROW_EXTERN_C() {
- delete static_cast< TypeWriter * >(handle);
-}
-
-sal_Bool TYPEREG_CALLTYPE typereg_writer_setSuperTypeName(
- void const * handle, sal_uInt16 index, rtl_uString const * typeName)
- SAL_THROW_EXTERN_C()
-{
- try {
- static_cast< TypeWriter const * >(handle)->setSuperType(
- index, toByteString(typeName));
- } catch (std::bad_alloc &) {
- return false;
- }
- return true;
-}
-
-static TypeWriterImpl TYPEREG_CALLTYPE createEntry(
- RTTypeClass typeClass, rtl_uString const * typeName, rtl_uString const * superTypeName,
- sal_uInt16 fieldCount)
-{
- OUString empty;
- sal_uInt16 superTypeCount = rtl_uString_getLength(superTypeName) == 0
- ? 0 : 1;
- TypeWriterImpl t = typereg_writer_create(
- TYPEREG_VERSION_0, empty.pData, empty.pData, typeClass, false, typeName,
- superTypeCount, fieldCount, 0/*methodCount*/, 0/*referenceCount*/);
- if (superTypeCount > 0) {
- typereg_writer_setSuperTypeName(t, 0, superTypeName);
- }
- return t;
-}
-
-}
-
-RegistryTypeWriter::RegistryTypeWriter(RTTypeClass RTTypeClass,
- const OUString& typeName,
- const OUString& superTypeName,
- sal_uInt16 fieldCount)
- : m_hImpl(nullptr)
-{
- m_hImpl = createEntry(RTTypeClass,
- typeName.pData,
- superTypeName.pData,
- fieldCount);
-}
-
-RegistryTypeWriter::~RegistryTypeWriter()
-{
- release(m_hImpl);
-}
-
-void RegistryTypeWriter::setFieldData( sal_uInt16 index,
- const OUString& name,
- const OUString& typeName,
- const OUString& doku,
- const OUString& fileName,
- RTFieldAccess access,
- const RTConstValue& constValue)
-{
- ::setFieldData(m_hImpl, index, name.pData, typeName.pData, doku.pData, fileName.pData, access, constValue.m_type, constValue.m_value);
-}
-
-const sal_uInt8* RegistryTypeWriter::getBlop()
-{
- return ::getBlop(m_hImpl);
-}
-
-sal_uInt32 RegistryTypeWriter::getBlopSize()
-{
- return ::getBlopSize(m_hImpl);
-}
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/registry/source/reflwrit.hxx b/registry/source/reflwrit.hxx
deleted file mode 100644
index 93cee0697381..000000000000
--- a/registry/source/reflwrit.hxx
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#ifndef INCLUDED_REGISTRY_SOURCE_REFLWRIT_HXX
-#define INCLUDED_REGISTRY_SOURCE_REFLWRIT_HXX
-
-#include <registry/types.hxx>
-#include <rtl/ustring.hxx>
-
-class RTConstValue;
-
-/// Implementation handle
-typedef void* TypeWriterImpl;
-
-/** RegistryTypeWriter writes/creates a binary type blob.
-
- This class provides the necessary functions to write type information
- for all kinds of types into a blob.
-
- @deprecated
- use typereg::Writer instead
-*/
-class RegistryTypeWriter
-{
-public:
-
- /** Constructor.
-
- @param RTTypeClass specifies the type of the new blob.
- @param typeName specifies the full qualified type name with '/' as separator.
- @param superTypeName specifies the full qualified type name of the base type
- with '/' as separator.
- @param fieldCount specifies the number of fields (eg. number of attributes/properties,
- enum values or constants).
- */
- RegistryTypeWriter(RTTypeClass RTTypeClass,
- const OUString& typeName,
- const OUString& superTypeName,
- sal_uInt16 fieldCount);
-
- /** Destructor. The Destructor frees the internal data block.
-
- The pointer (returned by getBlop) will be set to NULL.
- */
- ~RegistryTypeWriter();
-
- /** sets the data for a field member of a type blob.
-
- @param index indicates the index of the field.
- @param name specifies the name.
- @param typeName specifies the full qualified typename.
- @param doku specifies the documentation string of the field.
- @param fileName specifies the name of the IDL file where the field is defined.
- @param access specifies the access mode of the field.
- @param constValue specifies the value of the field. The value is only interesting
- for enum values or constants.
- */
- void setFieldData( sal_uInt16 index,
- const OUString& name,
- const OUString& typeName,
- const OUString& doku,
- const OUString& fileName,
- RTFieldAccess access,
- const RTConstValue& constValue);
-
- /** returns a pointer to the new type blob.
-
- The pointer will be invalid (NULL) if the instance of
- the RegistryTypeWriter will be destroyed.
- */
- const sal_uInt8* getBlop();
-
- /** returns the size of the new type blob in bytes.
- */
- sal_uInt32 getBlopSize();
-
-private:
- RegistryTypeWriter(RegistryTypeWriter const &) = delete;
- void operator =(RegistryTypeWriter const &) = delete;
-
- /// stores the handle of an implementation class
- TypeWriterImpl m_hImpl;
-};
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/registry/source/regimpl.cxx b/registry/source/regimpl.cxx
index 0d69c64cd000..f33dbc7d5ebb 100644
--- a/registry/source/regimpl.cxx
+++ b/registry/source/regimpl.cxx
@@ -32,10 +32,6 @@
#include <unistd.h>
#endif
-#include "reflread.hxx"
-
-#include "reflwrit.hxx"
-
#include <registry/reader.hxx>
#include <registry/refltype.hxx>
#include <registry/types.hxx>
@@ -850,402 +846,6 @@ RegError ORegistry::deleteSubkeysAndValues(ORegKey* pKey)
return RegError::NO_ERROR;
}
-RegError ORegistry::loadKey(RegKeyHandle hKey, const OUString& regFileName,
- bool bWarnings, bool bReport)
-{
- ORegKey* pKey = static_cast< ORegKey* >(hKey);
-
- ORegistry aReg;
- RegError _ret = aReg.initRegistry(regFileName, RegAccessMode::READONLY);
- if (_ret != RegError::NO_ERROR)
- return _ret;
- ORegKey* pRootKey = aReg.getRootKey();
-
- REG_GUARD(m_mutex);
-
- OStoreDirectory::iterator iter;
- OStoreDirectory rStoreDir(pRootKey->getStoreDir());
- storeError _err = rStoreDir.first(iter);
-
- while (_err == store_E_None)
- {
- OUString const keyName(iter.m_pszName, iter.m_nLength);
-
- if (iter.m_nAttrib & STORE_ATTRIB_ISDIR)
- {
- _ret = loadAndSaveKeys(pKey, pRootKey, keyName, 0, bWarnings, bReport);
- }
- else
- {
- _ret = loadAndSaveValue(pKey, pRootKey, keyName, 0, bWarnings, bReport);
- }
-
- if (_ret == RegError::MERGE_ERROR)
- break;
- if (_ret == RegError::MERGE_CONFLICT && bWarnings)
- break;
-
- _err = rStoreDir.next(iter);
- }
-
- rStoreDir = OStoreDirectory();
- (void) aReg.releaseKey(pRootKey);
- return _ret;
-}
-
-RegError ORegistry::loadAndSaveValue(ORegKey* pTargetKey,
- ORegKey const * pSourceKey,
- const OUString& valueName,
- sal_uInt32 nCut,
- bool bWarnings,
- bool bReport)
-{
- OStoreStream rValue;
- RegValueType valueType;
- sal_uInt32 valueSize;
- sal_uInt32 nSize;
- storeAccessMode sourceAccess = storeAccessMode::ReadWrite;
- OUString sTargetPath(pTargetKey->getName());
- OUString sSourcePath(pSourceKey->getName());
-
- if (pSourceKey->isReadOnly())
- {
- sourceAccess = storeAccessMode::ReadOnly;
- }
-
- if (nCut)
- {
- sTargetPath = sSourcePath.copy(nCut);
- } else
- {
- if (sTargetPath.getLength() > 1)
- {
- if (sSourcePath.getLength() > 1)
- sTargetPath += sSourcePath;
- } else
- sTargetPath = sSourcePath;
- }
-
- if (sTargetPath.getLength() > 1) sTargetPath += ROOT;
- if (sSourcePath.getLength() > 1) sSourcePath += ROOT;
-
- if (rValue.create(pSourceKey->getStoreFile(), sSourcePath, valueName, sourceAccess))
- {
- return RegError::VALUE_NOT_EXISTS;
- }
-
- std::vector<sal_uInt8> aBuffer(VALUE_HEADERSIZE);
-
- sal_uInt32 rwBytes;
- if (rValue.readAt(0, aBuffer.data(), VALUE_HEADERSIZE, rwBytes))
- {
- return RegError::INVALID_VALUE;
- }
- if (rwBytes != VALUE_HEADERSIZE)
- {
- return RegError::INVALID_VALUE;
- }
-
- RegError _ret = RegError::NO_ERROR;
- sal_uInt8 type = aBuffer[0];
- valueType = static_cast<RegValueType>(type);
- readUINT32(aBuffer.data() + VALUE_TYPEOFFSET, valueSize);
-
- nSize = VALUE_HEADERSIZE + valueSize;
- aBuffer.resize(nSize);
-
- if (rValue.readAt(0, aBuffer.data(), nSize, rwBytes))
- {
- return RegError::INVALID_VALUE;
- }
- if (rwBytes != nSize)
- {
- return RegError::INVALID_VALUE;
- }
-
- OStoreFile rTargetFile(pTargetKey->getStoreFile());
-
- if (!rValue.create(rTargetFile, sTargetPath, valueName, storeAccessMode::ReadWrite))
- {
- if (valueType == RegValueType::BINARY)
- {
- _ret = checkBlop(
- rValue, sTargetPath, valueSize, aBuffer.data() + VALUE_HEADEROFFSET,
- bReport);
- if (_ret != RegError::NO_ERROR)
- {
- if (_ret == RegError::MERGE_ERROR ||
- (_ret == RegError::MERGE_CONFLICT && bWarnings))
- {
- return _ret;
- }
- } else
- {
- return _ret;
- }
- }
- }
-
- if (rValue.create(rTargetFile, sTargetPath, valueName, storeAccessMode::Create))
- {
- return RegError::INVALID_VALUE;
- }
- if (rValue.writeAt(0, aBuffer.data(), nSize, rwBytes))
- {
- return RegError::INVALID_VALUE;
- }
-
- if (rwBytes != nSize)
- {
- return RegError::INVALID_VALUE;
- }
- pTargetKey->setModified();
-
- return _ret;
-}
-
-RegError ORegistry::checkBlop(OStoreStream& rValue,
- std::u16string_view sTargetPath,
- sal_uInt32 srcValueSize,
- sal_uInt8 const * pSrcBuffer,
- bool bReport)
-{
- RegistryTypeReader reader(pSrcBuffer, srcValueSize);
-
- if (reader.getTypeClass() == RT_TYPE_INVALID)
- {
- return RegError::INVALID_VALUE;
- }
-
- std::vector<sal_uInt8> aBuffer(VALUE_HEADERSIZE);
- sal_uInt32 rwBytes;
- OString targetPath(OUStringToOString(sTargetPath, RTL_TEXTENCODING_UTF8));
-
- if (!rValue.readAt(0, aBuffer.data(), VALUE_HEADERSIZE, rwBytes) &&
- (rwBytes == VALUE_HEADERSIZE))
- {
- sal_uInt8 type = aBuffer[0];
- RegValueType valueType = static_cast<RegValueType>(type);
- sal_uInt32 valueSize;
- readUINT32(aBuffer.data() + VALUE_TYPEOFFSET, valueSize);
-
- if (valueType == RegValueType::BINARY)
- {
- aBuffer.resize(valueSize);
- if (!rValue.readAt(VALUE_HEADEROFFSET, aBuffer.data(), valueSize, rwBytes) &&
- (rwBytes == valueSize))
- {
- RegistryTypeReader reader2(aBuffer.data(), valueSize);
-
- if ((reader.getTypeClass() != reader2.getTypeClass())
- || reader2.getTypeClass() == RT_TYPE_INVALID)
- {
- if (bReport)
- {
- fprintf(stdout, "ERROR: values of blop from key \"%s\" has different types.\n",
- targetPath.getStr());
- }
- return RegError::MERGE_ERROR;
- }
-
- if (reader.getTypeClass() == RT_TYPE_MODULE)
- {
- if (reader.getFieldCount() > 0 &&
- reader2.getFieldCount() > 0)
- {
- mergeModuleValue(rValue, reader, reader2);
-
- return RegError::NO_ERROR;
- } else
- if (reader2.getFieldCount() > 0)
- {
- return RegError::NO_ERROR;
- } else
- {
- return RegError::MERGE_CONFLICT;
- }
- } else
- {
- if (bReport)
- {
- fprintf(stderr, "WARNING: value of key \"%s\" already exists.\n",
- targetPath.getStr());
- }
- return RegError::MERGE_CONFLICT;
- }
- } else
- {
- if (bReport)
- {
- fprintf(stderr, "ERROR: values of key \"%s\" contains bad data.\n",
- targetPath.getStr());
- }
- return RegError::MERGE_ERROR;
- }
- } else
- {
- if (bReport)
- {
- fprintf(stderr, "ERROR: values of key \"%s\" has different types.\n",
- targetPath.getStr());
- }
- return RegError::MERGE_ERROR;
- }
- } else
- {
- return RegError::INVALID_VALUE;
- }
-}
-
-static sal_uInt32 checkTypeReaders(RegistryTypeReader const & reader1,
- RegistryTypeReader const & reader2,
- std::set< OUString >& nameSet)
-{
- sal_uInt32 count=0;
- for (sal_uInt32 i=0 ; i < reader1.getFieldCount(); i++)
- {
- nameSet.insert(reader1.getFieldName(i));
- count++;
- }
- for (sal_uInt32 i=0 ; i < reader2.getFieldCount(); i++)
- {
- if (nameSet.insert(reader2.getFieldName(i)).second)
- count++;
- }
- return count;
-}
-
-RegError ORegistry::mergeModuleValue(OStoreStream& rTargetValue,
- RegistryTypeReader const & reader,
- RegistryTypeReader const & reader2)
-{
- std::set< OUString > nameSet;
- sal_uInt32 count = checkTypeReaders(reader, reader2, nameSet);
-
- if (count == reader.getFieldCount())
- return RegError::NO_ERROR;
-
- sal_uInt16 index = 0;
-
- RegistryTypeWriter writer(reader.getTypeClass(),
- reader.getTypeName(),
- reader.getSuperTypeName(),
- static_cast<sal_uInt16>(count));
-
- for (sal_uInt32 i=0 ; i < reader.getFieldCount(); i++)
- {
- writer.setFieldData(index,
- reader.getFieldName(i),
- reader.getFieldType(i),
- reader.getFieldDoku(i),
- reader.getFieldFileName(i),
- reader.getFieldAccess(i),
- reader.getFieldConstValue(i));
- index++;
- }
- for (sal_uInt32 i=0 ; i < reader2.getFieldCount(); i++)
- {
- if (nameSet.find(reader2.getFieldName(i)) == nameSet.end())
- {
- writer.setFieldData(index,
- reader2.getFieldName(i),
- reader2.getFieldType(i),
- reader2.getFieldDoku(i),
- reader2.getFieldFileName(i),
- reader2.getFieldAccess(i),
- reader2.getFieldConstValue(i));
- index++;
- }
- }
-
- const sal_uInt8* pBlop = writer.getBlop();
- sal_uInt32 aBlopSize = writer.getBlopSize();
-
- sal_uInt8 type = sal_uInt8(RegValueType::BINARY);
- std::vector<sal_uInt8> aBuffer(VALUE_HEADERSIZE + aBlopSize);
-
- memcpy(aBuffer.data(), &type, 1);
- writeUINT32(aBuffer.data() + VALUE_TYPEOFFSET, aBlopSize);
- memcpy(aBuffer.data() + VALUE_HEADEROFFSET, pBlop, aBlopSize);
-
- sal_uInt32 rwBytes;
- if (rTargetValue.writeAt(0, aBuffer.data(), VALUE_HEADERSIZE+aBlopSize, rwBytes))
- {
- return RegError::INVALID_VALUE;
- }
-
- if (rwBytes != VALUE_HEADERSIZE+aBlopSize)
- {
- return RegError::INVALID_VALUE;
- }
- return RegError::NO_ERROR;
-}
-
-RegError ORegistry::loadAndSaveKeys(ORegKey* pTargetKey,
- ORegKey* pSourceKey,
- const OUString& keyName,
- sal_uInt32 nCut,
- bool bWarnings,
- bool bReport)
-{
- RegError _ret = RegError::NO_ERROR;
- OUString sRelPath(pSourceKey->getName().copy(nCut));
- OUString sFullPath;
-
- if(pTargetKey->getName().getLength() > 1)
- sFullPath += pTargetKey->getName();
- sFullPath += sRelPath;
- if (sRelPath.getLength() > 1 || sFullPath.isEmpty())
- sFullPath += ROOT;
-
- OUString sFullKeyName = sFullPath + keyName;
-
- OStoreDirectory rStoreDir;
- if (rStoreDir.create(pTargetKey->getStoreFile(), sFullPath, keyName, storeAccessMode::Create))
- {
- return RegError::CREATE_KEY_FAILED;
- }
-
- if (m_openKeyTable.count(sFullKeyName) > 0)
- {
- m_openKeyTable[sFullKeyName]->setDeleted(false);
- }
-
- ORegKey* pTmpKey = nullptr;
- _ret = pSourceKey->openKey(keyName, reinterpret_cast<RegKeyHandle*>(&pTmpKey));
- if (_ret != RegError::NO_ERROR)
- return _ret;
-
- OStoreDirectory::iterator iter;
- OStoreDirectory rTmpStoreDir(pTmpKey->getStoreDir());
- storeError _err = rTmpStoreDir.first(iter);
-
- while (_err == store_E_None)
- {
- OUString const sName(iter.m_pszName, iter.m_nLength);
-
- if (iter.m_nAttrib & STORE_ATTRIB_ISDIR)
- {
- _ret = loadAndSaveKeys(pTargetKey, pTmpKey,
- sName, nCut, bWarnings, bReport);
- } else
- {
- _ret = loadAndSaveValue(pTargetKey, pTmpKey,
- sName, nCut, bWarnings, bReport);
- }
-
- if (_ret == RegError::MERGE_ERROR)
- break;
- if (_ret == RegError::MERGE_CONFLICT && bWarnings)
- break;
-
- _err = rTmpStoreDir.next(iter);
- }
-
- pSourceKey->releaseKey(pTmpKey);
- return _ret;
-}
-
ORegKey* ORegistry::getRootKey()
{
m_openKeyTable[ROOT]->acquire();
diff --git a/registry/source/regimpl.hxx b/registry/source/regimpl.hxx
index 973a24986106..ecc7d1a9551d 100644
--- a/registry/source/regimpl.hxx
+++ b/registry/source/regimpl.hxx
@@ -40,7 +40,6 @@
osl::Guard< osl::Mutex > aGuard( mutex );
class ORegKey;
-class RegistryTypeReader;
class ORegistry
{
@@ -76,11 +75,6 @@ public:
RegError deleteKey(RegKeyHandle hKey, std::u16string_view keyName);
- RegError loadKey(RegKeyHandle hKey,
- const OUString& regFileName,
- bool bWarnings,
- bool bReport);
-
RegError dumpRegistry(RegKeyHandle hKey) const;
~ORegistry();
@@ -106,30 +100,6 @@ private:
RegError deleteSubkeysAndValues(ORegKey* pKey);
- static RegError loadAndSaveValue(ORegKey* pTargetKey,
- ORegKey const * pSourceKey,
- const OUString& valueName,
- sal_uInt32 nCut,
- bool bWarnings,
- bool bReport);
-
- static RegError checkBlop(store::OStoreStream& rValue,
- std::u16string_view sTargetPath,
- sal_uInt32 srcValueSize,
- sal_uInt8 const * pSrcBuffer,
- bool bReport);
-
- static RegError mergeModuleValue(store::OStoreStream& rTargetValue,
- RegistryTypeReader const & reader,
- RegistryTypeReader const & reader2);
-
- RegError loadAndSaveKeys(ORegKey* pTargetKey,
- ORegKey* pSourceKey,
- const OUString& keyName,
- sal_uInt32 nCut,
- bool bWarnings,
- bool bReport);
-
RegError dumpValue(const OUString& sPath,
const OUString& sName,
sal_Int16 nSpace) const;
diff --git a/registry/source/registry.cxx b/registry/source/registry.cxx
index 1727dfc119dc..a58a79c8bb76 100644
--- a/registry/source/registry.cxx
+++ b/registry/source/registry.cxx
@@ -213,55 +213,6 @@ static RegError REGISTRY_CALLTYPE destroyRegistry(RegHandle hReg,
}
-// mergeKey
-
-static RegError REGISTRY_CALLTYPE mergeKey(RegHandle hReg,
- RegKeyHandle hKey,
- rtl_uString* keyName,
- rtl_uString* regFileName,
- sal_Bool bWarnings,
- sal_Bool bReport)
-{
- ORegistry* pReg = static_cast< ORegistry* >(hReg);
- if (!pReg)
- return RegError::INVALID_REGISTRY;
- if (!pReg->isOpen())
- return RegError::REGISTRY_NOT_OPEN;
-
- ORegKey* pKey = static_cast< ORegKey* >(hKey);
- if (!pKey)
- return RegError::INVALID_KEY;
- if (pKey->getRegistry() != pReg)
- return RegError::INVALID_KEY;
- if (pKey->isDeleted())
- return RegError::INVALID_KEY;
- if (pKey->isReadOnly())
- return RegError::REGISTRY_READONLY;
-
- if (keyName->length)
- {
- ORegKey* pNewKey = nullptr;
- RegError _ret = pKey->createKey(OUString::unacquired(&keyName), reinterpret_cast<RegKeyHandle*>(&pNewKey));
- if (_ret != RegError::NO_ERROR)
- return _ret;
-
- _ret = pReg->loadKey(pNewKey, regFileName, bWarnings, bReport);
- if (_ret != RegError::NO_ERROR && (_ret != RegError::MERGE_CONFLICT || bWarnings))
- {
- if (pNewKey != pKey)
- (void) pKey->closeKey(pNewKey);
- else
- (void) pKey->releaseKey(pNewKey);
- return _ret;
- }
-
- return (pNewKey != pKey) ? pKey->closeKey(pNewKey) : pKey->releaseKey(pNewKey);
- }
-
- return pReg->loadKey(pKey, regFileName, bWarnings, bReport);
-}
-
-
// dumpRegistry
static RegError REGISTRY_CALLTYPE dumpRegistry(RegHandle hReg,
@@ -298,7 +249,6 @@ Registry_Api* REGISTRY_CALLTYPE initRegistry_Api()
&openRegistry,
&closeRegistry,
&destroyRegistry,
- &mergeKey,
&acquireKey,
&releaseKey,
&isKeyReadOnly,