INTEGRATION: CWS sb10 (1.23.2); FILE MERGED

2004/01/13 14:16:38 sb 1.23.2.3: RESYNC: (1.23-1.24); FILE MERGED
2003/12/10 10:45:35 sb 1.23.2.2: #114000# Fixed minor omission.
2003/12/10 08:46:45 sb 1.23.2.1: #114000# Adapted to multiple-inheritance interface types.
This commit is contained in:
Jens-Heiner Rechtien
2004-02-03 10:53:35 +00:00
parent 840bfe5e72
commit 8abe53a2ea

View File

@ -2,9 +2,9 @@
*
* $RCSfile: cpputype.cxx,v $
*
* $Revision: 1.25 $
* $Revision: 1.26 $
*
* last change: $Author: hr $ $Date: 2004-02-02 19:44:41 $
* last change: $Author: hr $ $Date: 2004-02-03 11:53:35 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -59,6 +59,7 @@
*
************************************************************************/
#include <set>
#include <stdio.h>
#include <string.h>
@ -1553,9 +1554,10 @@ sal_Bool InterfaceType::dumpDeclaration(FileStream& o)
{
o << "\nclass SAL_NO_VTABLE " << m_name;
OString superType(m_reader.getSuperTypeName());
if (superType.getLength() > 0)
o << " : public " << scopedName(m_typeName, superType);
for (sal_Int16 i = 0; i < m_reader.getMISuperTypeCount(); ++i) {
o << (i == 0 ? " :" : ",") << " public "
<< scopedName(m_typeName, m_reader.getMISuperTypeName(i));
}
o << "\n{\npublic:\n";
@ -1897,22 +1899,30 @@ void InterfaceType::dumpGetCppuType(FileStream& o)
o << indent() << "if ( !s_pType_" << typeName << " )\n" << indent() << "{\n";
inc();
OString superType(m_reader.getSuperTypeName());
sal_Bool bWithBase = sal_False;
if (superType.getLength() > 0 && !superType.equals("com/sun/star/uno/XInterface"))
sal_Int16 nBases = m_reader.getMISuperTypeCount();
OSL_ASSERT(nBases > 0);
if (nBases == 1
&& m_reader.getMISuperTypeName(0).equals("com/sun/star/uno/XInterface"))
{
bWithBase = sal_True;
o << indent() << "const ::com::sun::star::uno::Type& rSuperType = getCppuType( ( ";
dumpType(o, superType, sal_True, sal_False);
o << " *)0 );\n";
nBases = 0;
}
if (nBases > 0) {
o << indent() << "typelib_TypeDescriptionReference * aSuperTypes["
<< nBases << "];\n";
for (sal_Int16 i = 0; i < nBases; ++i) {
o << indent() << "aSuperTypes[" << i << "] = getCppuType( ( ";
dumpType(o, m_reader.getMISuperTypeName(i), sal_True, sal_False);
o << " *)0 ).getTypeLibType();\n";
}
}
o << indent() << "typelib_static_interface_type_init( &s_pType_" << typeName
<< ", \"" << m_typeName.replace('/', '.') << "\", ";
o << indent() << "typelib_static_mi_interface_type_init( &s_pType_"
<< typeName << ", \"" << m_typeName.replace('/', '.') << "\", " << nBases
<< ", ";
if ( bWithBase )
if ( nBases > 0 )
{
o << "rSuperType.getTypeLibType() );\n";
o << "aSuperTypes );\n";
} else
{
o << "0 );\n";
@ -1974,12 +1984,13 @@ void InterfaceType::dumpCGetCppuType(FileStream& o)
o << indent() << "// Start inline typedescription generation\n"
<< indent() << "typelib_InterfaceTypeDescription * pTD = 0;\n\n";
OString superType(m_reader.getSuperTypeName());
if (superType.getLength() > 0)
{
o << indent() << "const ::com::sun::star::uno::Type& rSuperType = getCppuType( ( ";
dumpType(o, superType, sal_True, sal_False);
o << " *)0 );\n";
OSL_ASSERT(m_reader.getMISuperTypeCount() > 0);
o << indent() << "typelib_TypeDescriptionReference * aSuperTypes["
<< m_reader.getMISuperTypeCount() << "];\n";
for (sal_Int16 i = 0; i < m_reader.getMISuperTypeCount(); ++i) {
o << indent() << "aSuperTypes[" << i << "] = getCppuType( ( ";
dumpType(o, m_reader.getMISuperTypeName(i), sal_True, sal_False);
o << " *)0 ).getTypeLibType();\n";
}
sal_uInt32 count = getMemberCount();
@ -2000,7 +2011,7 @@ void InterfaceType::dumpCGetCppuType(FileStream& o)
dumpCppuMethodRefs(o, index);
}
o << "\n" << indent() << "typelib_typedescription_newInterface(\n";
o << "\n" << indent() << "typelib_typedescription_newMIInterface(\n";
inc();
o << indent() << "&pTD,\n"
<< indent() << "sTypeName.pData, ";
@ -2012,10 +2023,7 @@ void InterfaceType::dumpCGetCppuType(FileStream& o)
uik.m_Data1, uik.m_Data2, uik.m_Data3, uik.m_Data4, uik.m_Data5);
o << buffer;
if (superType.getLength() > 0)
o << indent() << "rSuperType.getTypeLibType(),\n";
else
o << indent() << "0,\n";
o << indent() << m_reader.getMISuperTypeCount() << ", aSuperTypes,\n";
if ( count )
{
@ -2153,44 +2161,59 @@ sal_uInt32 InterfaceType::getMemberCount()
return count;
}
sal_uInt32 InterfaceType::checkInheritedMemberCount(const TypeReader* pReader)
{
sal_uInt32 cout = 0;
sal_Bool bSelfCheck = sal_True;
if (!pReader)
{
bSelfCheck = sal_False;
pReader = &m_reader;
}
namespace {
sal_uInt32 count = 0;
OString superType(pReader->getSuperTypeName());
if (superType.getLength() > 0)
{
TypeReader aSuperReader(m_typeMgr.getTypeReader(superType));
if (aSuperReader.isValid())
{
count = checkInheritedMemberCount(&aSuperReader);
class BaseOffset {
public:
BaseOffset(TypeManager & theManager, TypeReader const & reader);
sal_Int32 get() const { return offset; }
private:
void calculateBases(TypeReader const & reader);
void calculate(TypeReader const & reader);
TypeManager & manager;
std::set< rtl::OString > set;
sal_Int32 offset;
};
BaseOffset::BaseOffset(TypeManager & theManager, TypeReader const & reader):
manager(theManager)
{
offset = 0;
calculateBases(reader);
}
void BaseOffset::calculateBases(TypeReader const & reader) {
for (sal_Int16 i = 0; i < reader.getMISuperTypeCount(); ++i) {
TypeReader super(manager.getTypeReader(reader.getMISuperTypeName(i)));
if (super.isValid()) {
calculate(super);
}
}
}
if (bSelfCheck)
{
count += pReader->getMethodCount();
sal_uInt32 fieldCount = pReader->getFieldCount();
RTFieldAccess access = RT_ACCESS_INVALID;
for (sal_uInt16 i=0; i < fieldCount; i++)
{
access = pReader->getFieldAccess(i);
if (access != RT_ACCESS_CONST && access != RT_ACCESS_INVALID)
{
count++;
void BaseOffset::calculate(TypeReader const & reader) {
if (set.insert(reader.getTypeName()).second) {
calculateBases(reader);
offset += reader.getMethodCount();
for (sal_uInt16 i = 0; i < reader.getFieldCount(); ++i) {
RTFieldAccess access = reader.getFieldAccess(i);
if (access != RT_ACCESS_CONST && access != RT_ACCESS_INVALID) {
++offset;
}
}
}
}
return count;
}
sal_uInt32 InterfaceType::checkInheritedMemberCount(const TypeReader* pReader)
{
OSL_ASSERT(pReader == 0);
return BaseOffset(m_typeMgr, m_reader).get();
}
sal_uInt32 InterfaceType::getInheritedMemberCount()