blob: 861f9cd8620e5f2e03d64157f9d1f3f392d247a3 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef INCLUDED_CODEMAKER_SOURCE_CPPUMAKER_CPPUTYPE_HXX
#define INCLUDED_CODEMAKER_SOURCE_CPPUMAKER_CPPUTYPE_HXX
#include "codemaker/dependencies.hxx"
#include "codemaker/options.hxx"
#include "codemaker/typemanager.hxx"
#include "codemaker/commoncpp.hxx"
#include "registry/reader.hxx"
#include "registry/types.h"
#include "rtl/string.hxx"
namespace rtl { class OUString; }
namespace codemaker {
namespace cppumaker { class Includes; }
struct ExceptionTreeNode;
class GeneratedTypeSet;
}
enum CppuTypeDecl
{
CPPUTYPEDECL_ALLTYPES,
CPPUTYPEDECL_NOINTERFACES,
CPPUTYPEDECL_ONLYINTERFACES
};
class CppuOptions;
class FileStream;
class CppuType
{
public:
CppuType(typereg::Reader& typeReader,
const ::rtl::OString& typeName,
const TypeManager& typeMgr);
virtual ~CppuType();
virtual sal_Bool dump(CppuOptions* pOptions) throw( CannotDumpException );
sal_Bool dumpFile(CppuOptions* pOptions,
const ::rtl::OString& sExtension,
const ::rtl::OString& sName,
const ::rtl::OString& sOutPath )
throw( CannotDumpException );
void dumpDependedTypes(
codemaker::GeneratedTypeSet & generated, CppuOptions * options);
virtual sal_Bool dumpHFile(FileStream& o, codemaker::cppumaker::Includes & includes) throw( CannotDumpException ) = 0;
virtual sal_Bool dumpHxxFile(FileStream& o, codemaker::cppumaker::Includes & includes) throw( CannotDumpException ) = 0;
::rtl::OString dumpHeaderDefine(
FileStream& o, char const * prefix, sal_Bool bExtended=sal_False);
void dumpGetCppuType(FileStream & out);
virtual void dumpLightGetCppuType(FileStream& o);
virtual void dumpNormalGetCppuType(FileStream& o);
virtual void dumpComprehensiveGetCppuType(FileStream& o);
virtual void dumpType(FileStream& o, const ::rtl::OString& type, bool bConst=false,
bool bRef=false, bool bNative=false, bool cppuUnoType=false)
const throw( CannotDumpException );
::rtl::OString getTypeClass(const ::rtl::OString& type="", sal_Bool bCStyle=sal_False);
void dumpCppuGetType(FileStream& o, const ::rtl::OString& type, sal_Bool bDecl=sal_False, CppuTypeDecl eDeclFlag=CPPUTYPEDECL_ALLTYPES);
::rtl::OString typeToIdentifier(const ::rtl::OString& type);
void dumpConstantValue(FileStream& o, sal_uInt16 index);
virtual sal_uInt32 getMemberCount();
virtual sal_uInt32 getInheritedMemberCount();
void inc(sal_Int32 num=4);
void dec(sal_Int32 num=4);
::rtl::OString indent() const;
protected:
virtual sal_uInt32 checkInheritedMemberCount(
const typereg::Reader* pReader);
bool passByReference(rtl::OString const & unoType);
::rtl::OString resolveTypedefs(const ::rtl::OString& type) const;
::rtl::OString checkRealBaseType(const ::rtl::OString& type, sal_Bool bResolveTypeOnly = sal_False) const;
void dumpCppuGetTypeMemberDecl(FileStream& o, CppuTypeDecl eDeclFlag);
codemaker::cpp::IdentifierTranslationMode isGlobal() const;
virtual void addSpecialDependencies() {}
virtual bool dumpFiles(CppuOptions * options, rtl::OString const & outPath);
virtual void addLightGetCppuTypeIncludes(
codemaker::cppumaker::Includes & includes) const;
virtual void addNormalGetCppuTypeIncludes(
codemaker::cppumaker::Includes & includes) const;
virtual void addComprehensiveGetCppuTypeIncludes(
codemaker::cppumaker::Includes & includes) const;
virtual bool isPolymorphic() const;
virtual void dumpTemplateHead(FileStream & out) const;
virtual void dumpTemplateParameters(FileStream & out) const;
void dumpGetCppuTypePreamble(FileStream & out);
void dumpGetCppuTypePostamble(FileStream & out);
void addDefaultHIncludes(codemaker::cppumaker::Includes & includes) const;
void addDefaultHxxIncludes(codemaker::cppumaker::Includes & includes) const;
void dumpInitializer(
FileStream & out, bool parameterized, rtl::OUString const & type) const;
protected:
sal_uInt32 m_inheritedMemberCount;
sal_Bool m_cppuTypeLeak;
sal_Bool m_cppuTypeDynamic;
sal_Int32 m_indentLength;
::rtl::OString m_typeName;
::rtl::OString m_name;
typereg::Reader m_reader;
TypeManager const & m_typeMgr;
codemaker::Dependencies m_dependencies;
private:
void addGetCppuTypeIncludes(codemaker::cppumaker::Includes & includes)
const;
};
class InterfaceType : public CppuType
{
public:
InterfaceType(typereg::Reader& typeReader,
const ::rtl::OString& typeName,
const TypeManager& typeMgr);
virtual ~InterfaceType();
sal_Bool dumpDeclaration(FileStream& o) throw( CannotDumpException );
sal_Bool dumpHFile(FileStream& o, codemaker::cppumaker::Includes & includes) throw( CannotDumpException );
sal_Bool dumpHxxFile(FileStream& o, codemaker::cppumaker::Includes & includes) throw( CannotDumpException );
void dumpAttributes(FileStream& o);
void dumpMethods(FileStream& o);
void dumpNormalGetCppuType(FileStream& o);
void dumpComprehensiveGetCppuType(FileStream& o);
void dumpCppuAttributeRefs(FileStream& o, sal_uInt32& index);
void dumpCppuMethodRefs(FileStream& o, sal_uInt32& index);
void dumpCppuAttributes(FileStream& o, sal_uInt32& index);
void dumpCppuMethods(FileStream& o, sal_uInt32& index);
void dumpAttributesCppuDecl(FileStream& o, StringSet* pFinishedTypes, CppuTypeDecl eDeclFlag);
void dumpMethodsCppuDecl(FileStream& o, StringSet* pFinishedTypes, CppuTypeDecl eDeclFlag );
sal_uInt32 getMemberCount();
sal_uInt32 getInheritedMemberCount();
protected:
virtual void addSpecialDependencies();
virtual void addComprehensiveGetCppuTypeIncludes(
codemaker::cppumaker::Includes & includes) const;
sal_uInt32 checkInheritedMemberCount(const typereg::Reader* pReader);
protected:
sal_uInt32 m_inheritedMemberCount;
sal_Bool m_hasAttributes;
sal_Bool m_hasMethods;
private:
void dumpExceptionSpecification(
FileStream & out, sal_uInt32 methodIndex, bool runtimeException);
void dumpAttributeExceptionSpecification(
FileStream & out, rtl::OUString const & name, RTMethodMode sort);
void dumpExceptionTypeName(
FileStream & out, char const * prefix, sal_uInt32 index,
rtl::OUString name);
sal_Int32 dumpExceptionTypeNames(
FileStream & out, char const * prefix, sal_uInt16 methodIndex,
bool runtimeException);
sal_Int32 dumpAttributeExceptionTypeNames(
FileStream & out, char const * prefix, rtl::OUString const & name,
RTMethodMode sort);
};
class ConstantsType : public CppuType
{
public:
ConstantsType(typereg::Reader& typeReader,
const ::rtl::OString& typeName,
const TypeManager& typeMgr);
virtual ~ConstantsType();
virtual sal_Bool dump(CppuOptions* pOptions) throw( CannotDumpException );
sal_Bool dumpDeclaration(FileStream& o) throw( CannotDumpException );
sal_Bool dumpHFile(FileStream& o, codemaker::cppumaker::Includes & includes) throw( CannotDumpException );
sal_Bool dumpHxxFile(FileStream& o, codemaker::cppumaker::Includes & includes) throw( CannotDumpException );
sal_Bool hasConstants();
};
class ModuleType : public ConstantsType
{
public:
ModuleType(typereg::Reader& typeReader,
const ::rtl::OString& typeName,
const TypeManager& typeMgr);
virtual ~ModuleType();
protected:
virtual bool dumpFiles(CppuOptions * options, rtl::OString const & outPath);
};
class StructureType : public CppuType
{
public:
StructureType(typereg::Reader& typeReader,
const ::rtl::OString& typeName,
const TypeManager& typeMgr);
virtual ~StructureType();
sal_Bool dumpDeclaration(FileStream& o) throw( CannotDumpException );
sal_Bool dumpHFile(FileStream& o, codemaker::cppumaker::Includes & includes) throw( CannotDumpException );
sal_Bool dumpHxxFile(FileStream& o, codemaker::cppumaker::Includes & includes) throw( CannotDumpException );
virtual void dumpLightGetCppuType(FileStream & out);
virtual void dumpNormalGetCppuType(FileStream & out);
virtual void dumpComprehensiveGetCppuType(FileStream & out);
sal_Bool dumpSuperMember(FileStream& o, const ::rtl::OString& super, sal_Bool bWithType);
protected:
virtual void addLightGetCppuTypeIncludes(
codemaker::cppumaker::Includes & includes) const;
virtual void addNormalGetCppuTypeIncludes(
codemaker::cppumaker::Includes & includes) const;
virtual void addComprehensiveGetCppuTypeIncludes(
codemaker::cppumaker::Includes & includes) const;
virtual bool isPolymorphic() const;
virtual void dumpTemplateHead(FileStream & out) const;
virtual void dumpTemplateParameters(FileStream & out) const;
};
class ExceptionType : public CppuType
{
public:
ExceptionType(typereg::Reader& typeReader,
const ::rtl::OString& typeName,
const TypeManager& typeMgr);
virtual ~ExceptionType();
sal_Bool dumpDeclaration(FileStream& o) throw( CannotDumpException );
sal_Bool dumpHFile(FileStream& o, codemaker::cppumaker::Includes & includes) throw( CannotDumpException );
sal_Bool dumpHxxFile(FileStream& o, codemaker::cppumaker::Includes & includes) throw( CannotDumpException );
sal_Bool dumpSuperMember(FileStream& o, const ::rtl::OString& super, sal_Bool bWithType);
};
class EnumType : public CppuType
{
public:
EnumType(typereg::Reader& typeReader,
const ::rtl::OString& typeName,
const TypeManager& typeMgr);
virtual ~EnumType();
sal_Bool dumpDeclaration(FileStream& o) throw( CannotDumpException );
sal_Bool dumpHFile(FileStream& o, codemaker::cppumaker::Includes & includes) throw( CannotDumpException );
sal_Bool dumpHxxFile(FileStream& o, codemaker::cppumaker::Includes & includes) throw( CannotDumpException );
void dumpNormalGetCppuType(FileStream& o);
void dumpComprehensiveGetCppuType(FileStream& o);
};
class TypeDefType : public CppuType
{
public:
TypeDefType(typereg::Reader& typeReader,
const ::rtl::OString& typeName,
const TypeManager& typeMgr);
virtual ~TypeDefType();
sal_Bool dumpDeclaration(FileStream& o) throw( CannotDumpException );
sal_Bool dumpHFile(FileStream& o, codemaker::cppumaker::Includes & includes) throw( CannotDumpException );
sal_Bool dumpHxxFile(FileStream& o, codemaker::cppumaker::Includes & includes) throw( CannotDumpException );
};
class ConstructiveType: public CppuType {
public:
ConstructiveType(
typereg::Reader & reader, rtl::OString const & name,
TypeManager const & manager):
CppuType(reader, name, manager) {}
virtual sal_Bool dumpHFile(
FileStream & o, codemaker::cppumaker::Includes & includes)
throw (CannotDumpException);
protected:
virtual bool dumpFiles(CppuOptions * options, rtl::OString const & outPath);
};
class ServiceType: public ConstructiveType {
public:
ServiceType(
typereg::Reader & reader, rtl::OString const & name,
TypeManager const & manager):
ConstructiveType(reader, name, manager) {}
bool isSingleInterfaceBased();
virtual sal_Bool dumpHxxFile(
FileStream & o, codemaker::cppumaker::Includes & includes)
throw (CannotDumpException);
private:
virtual void addSpecialDependencies();
bool isDefaultConstructor(sal_uInt16 ctorIndex) const;
bool hasRestParameter(sal_uInt16 ctorIndex) const;
void dumpCatchClauses(
FileStream & out, codemaker::ExceptionTreeNode const * node);
};
class SingletonType: public ConstructiveType {
public:
SingletonType(
typereg::Reader & reader, rtl::OString const & name,
TypeManager const & manager):
ConstructiveType(reader, name, manager) {}
bool isInterfaceBased();
virtual sal_Bool dumpHxxFile(
FileStream & o, codemaker::cppumaker::Includes & includes)
throw (CannotDumpException);
};
bool produceType(const ::rtl::OString& typeName,
TypeManager const & typeMgr,
codemaker::GeneratedTypeSet & generated,
CppuOptions* pOptions)
throw( CannotDumpException );
bool produceType(RegistryKey& typeName, bool bIsExtraType,
TypeManager const & typeMgr,
codemaker::GeneratedTypeSet & generated,
CppuOptions* pOptions)
throw( CannotDumpException );
/**
* This function returns a C++ scoped name, represents the namespace
* scoping of this type, e.g. com:.sun::star::uno::XInterface.
*/
// ::rtl::OString scopedName(const ::rtl::OString& scope, const ::rtl::OString& type,
// sal_Bool bNoNameSpace=sal_False);
#endif // INCLUDED_CODEMAKER_SOURCE_CPPUMAKER_CPPUTYPE_HXX