Kaydet (Commit) 30a7c6ba authored tarafından Stephan Bergmann's avatar Stephan Bergmann

WIP: Experimental new binary type.rdb format

Make uno-skeletonmaker work on top of unoidl/ instead of registry/.

These changes have only been tested so far rather lightly.  Basic
uno-skeletonmaker still works, but more thorough testing of the various input
flags is needed.

Change-Id: Id7f3aee863a10f8c649325db2d6f34a4057f70ff
üst 24aeeb01
...@@ -38,12 +38,6 @@ namespace codemaker { ...@@ -38,12 +38,6 @@ namespace codemaker {
rtl::OString convertString(rtl::OUString const & string); rtl::OString convertString(rtl::OUString const & string);
codemaker::UnoType::Sort decomposeAndResolve(
rtl::Reference< TypeManager > const & manager, rtl::OString const & type,
bool resolveTypedefs, bool allowVoid, bool allowExtraEntities,
RTTypeClass * typeClass, rtl::OString * name, sal_Int32 * rank,
std::vector< rtl::OString > * arguments);
} }
#endif // INCLUDED_CODEMAKER_CODEMAKER_HXX #endif // INCLUDED_CODEMAKER_CODEMAKER_HXX
......
...@@ -36,8 +36,7 @@ namespace codemaker { namespace cpp { ...@@ -36,8 +36,7 @@ namespace codemaker { namespace cpp {
rtl::OString scopedCppName(rtl::OString const & type, bool ns_alias=true); rtl::OString scopedCppName(rtl::OString const & type, bool ns_alias=true);
rtl::OString translateUnoToCppType( rtl::OString translateUnoToCppType(
codemaker::UnoType::Sort sort, RTTypeClass typeClass, codemaker::UnoType::Sort sort, rtl::OUString const & nucleus);
rtl::OString const & nucleus, bool shortname);
enum IdentifierTranslationMode { enum IdentifierTranslationMode {
ITM_GLOBAL, ITM_GLOBAL,
......
...@@ -62,93 +62,6 @@ rtl::OString convertString(rtl::OUString const & string) { ...@@ -62,93 +62,6 @@ rtl::OString convertString(rtl::OUString const & string) {
return s; return s;
} }
codemaker::UnoType::Sort decomposeAndResolve(
rtl::Reference< TypeManager > const & manager, rtl::OString const & type,
bool resolveTypedefs, bool allowVoid, bool allowExtraEntities,
RTTypeClass * typeClass, rtl::OString * name, sal_Int32 * rank,
std::vector< rtl::OString > * arguments)
{
OSL_ASSERT(typeClass != 0 && name != 0 && rank != 0 && arguments != 0);
*rank = 0;
for (rtl::OString t(type);;) {
sal_Int32 n = 0;
*name = codemaker::UnoType::decompose(t, &n, arguments);
if (n > SAL_MAX_INT32 - *rank) {
throw CannotDumpException("Bad type information: " + b2u(type));
//TODO
}
*rank += n;
if (n > 0) {
allowVoid = false;
allowExtraEntities = false;
}
codemaker::UnoType::Sort sort = codemaker::UnoType::getSort(*name);
switch (sort) {
case codemaker::UnoType::SORT_VOID:
if (!allowVoid) {
throw CannotDumpException("Bad type information: " + b2u(type));
//TODO
}
default:
checkNoTypeArguments(*arguments);
*typeClass = RT_TYPE_INVALID;
return sort;
case codemaker::UnoType::SORT_COMPLEX:
typereg::Reader reader(manager->getTypeReader(*name));
*typeClass = reader.getTypeClass();
switch (*typeClass) {
case RT_TYPE_ENUM:
case RT_TYPE_INTERFACE:
checkNoTypeArguments(*arguments);
return sort;
case RT_TYPE_STRUCT:
if (!(allowExtraEntities && arguments->empty())
&& (arguments->size() > SAL_MAX_UINT16
|| (static_cast< sal_uInt16 >(arguments->size())
!= reader.getReferenceCount())))
{
throw CannotDumpException("Bad type information: " + b2u(type));
//TODO
}
return sort;
case RT_TYPE_MODULE:
case RT_TYPE_EXCEPTION:
case RT_TYPE_SERVICE:
case RT_TYPE_SINGLETON:
case RT_TYPE_CONSTANTS:
if (!allowExtraEntities) {
throw CannotDumpException("Bad type information: " + b2u(type));
//TODO
}
checkNoTypeArguments(*arguments);
//TODO: check reader for consistency
return sort;
case RT_TYPE_TYPEDEF:
checkNoTypeArguments(*arguments);
if (reader.getSuperTypeCount() == 1
&& reader.getFieldCount() == 0
&& reader.getMethodCount() == 0
&& reader.getReferenceCount() == 0)
{
if (resolveTypedefs) {
t = convertString(reader.getSuperTypeName(0));
continue;
} else {
return sort;
}
}
default:
throw CannotDumpException("Bad type information: " + b2u(type));
//TODO
}
}
}
}
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -67,36 +67,26 @@ OString scopedCppName(OString const & type, bool ns_alias) ...@@ -67,36 +67,26 @@ OString scopedCppName(OString const & type, bool ns_alias)
OString translateUnoToCppType( OString translateUnoToCppType(
codemaker::UnoType::Sort sort, RTTypeClass typeClass, codemaker::UnoType::Sort sort, OUString const & nucleus)
OString const & nucleus, bool shortname)
{ {
OStringBuffer buf; OStringBuffer buf;
if (sort == codemaker::UnoType::SORT_COMPLEX) { if (sort <= codemaker::UnoType::SORT_ANY) {
if (typeClass == RT_TYPE_INTERFACE
&& nucleus == OString("com/sun/star/uno/XInterface"))
{
buf.append("::com::sun::star::uno::XInterface");
} else {
//TODO: check that nucleus is a valid (UTF-8) identifier
buf.append(nucleus);
}
} else {
static char const * const cppTypes[codemaker::UnoType::SORT_ANY + 1] = { static char const * const cppTypes[codemaker::UnoType::SORT_ANY + 1] = {
"void", "::sal_Bool", "::sal_Int8", "::sal_Int16", "::sal_uInt16", "void", "::sal_Bool", "::sal_Int8", "::sal_Int16", "::sal_uInt16",
"::sal_Int32", "::sal_uInt32", "::sal_Int64", "::sal_uInt64", "::sal_Int32", "::sal_uInt32", "::sal_Int64", "::sal_uInt64",
"float", "double", "::sal_Unicode", "rtl::OUString", "float", "double", "::sal_Unicode", "rtl::OUString",
"::com::sun::star::uno::Type", "::com::sun::star::uno::Any" }; "::com::sun::star::uno::Type", "::com::sun::star::uno::Any" };
buf.append(cppTypes[sort]); buf.append(cppTypes[sort]);
} else {
if (sort == codemaker::UnoType::SORT_INTERFACE_TYPE
&& nucleus == "com.sun.star.uno.XInterface")
{
buf.append("::com::sun::star::uno::XInterface");
} else {
//TODO: check that nucleus is a valid (UTF-8) identifier
buf.append(u2b(nucleus));
} }
if (shortname) {
OString s(buf.makeStringAndClear());
if (s.indexOf("::com::sun::star") == 0)
return s.replaceAt(0, 16, "css");
else
return s;
} }
return buf.makeStringAndClear(); return buf.makeStringAndClear();
} }
......
...@@ -23,22 +23,21 @@ ...@@ -23,22 +23,21 @@
#include "rtl/ref.hxx" #include "rtl/ref.hxx"
#include "rtl/string.hxx" #include "rtl/string.hxx"
#include "registry/reader.hxx"
#include "codemaker/typemanager.hxx" #include "codemaker/typemanager.hxx"
#include "codemaker/unotype.hxx" #include "codemaker/unotype.hxx"
#include "unoidl/unoidl.hxx"
#include <fstream> #include <fstream>
#include <boost/unordered_set.hpp>
#include <map> #include <map>
#include <set>
namespace skeletonmaker { namespace skeletonmaker {
typedef ::std::map< OString, ::std::vector< OString >, typedef ::std::map< OString, ::std::vector< OString >,
::std::less< OString > > ProtocolCmdMap; ::std::less< OString > > ProtocolCmdMap;
typedef ::std::vector< ::std::pair< OString, typedef ::std::vector< unoidl::AccumulationBasedServiceEntity::Property >
::std::pair< OString, sal_Int16 > > > AttributeInfo; AttributeInfo;
struct ProgramOptions { struct ProgramOptions {
ProgramOptions(): java5(true), all(false), dump(false), license(false), ProgramOptions(): java5(true), all(false), dump(false), license(false),
...@@ -97,42 +96,23 @@ bool getOutputStream(ProgramOptions const & options, ...@@ -97,42 +96,23 @@ bool getOutputStream(ProgramOptions const & options,
OString & targetSourceFileName, OString & targetSourceFileName,
OString & tmpSourceFileName); OString & tmpSourceFileName);
codemaker::UnoType::Sort decomposeResolveAndCheck(
rtl::Reference< TypeManager > const & manager, OString const & type,
bool resolveTypedefs, bool allowVoid, bool allowExtraEntities,
RTTypeClass * typeClass, OString * name, sal_Int32 * rank,
std::vector< OString > * arguments);
void checkType(rtl::Reference< TypeManager > const & manager, void checkType(rtl::Reference< TypeManager > const & manager,
OString const & type, OUString const & type,
boost::unordered_set< OString, OStringHash >& interfaceTypes, std::set< OUString >& interfaceTypes,
boost::unordered_set< OString, OStringHash >& serviceTypes, std::set< OUString >& serviceTypes,
AttributeInfo& properties); AttributeInfo& properties);
void checkDefaultInterfaces( void checkDefaultInterfaces(
boost::unordered_set< OString, OStringHash >& interfaces, std::set< OUString >& interfaces,
const boost::unordered_set< OString, OStringHash >& services, const std::set< OUString >& services,
const OString & propertyhelper); const OUString & propertyhelper);
OString checkPropertyHelper( OUString checkPropertyHelper(
ProgramOptions const & options, rtl::Reference< TypeManager > const & manager, ProgramOptions const & options, rtl::Reference< TypeManager > const & manager,
const boost::unordered_set< OString, OStringHash >& services, const std::set< OUString >& services,
const boost::unordered_set< OString, OStringHash >& interfaces, const std::set< OUString >& interfaces,
AttributeInfo& attributes, AttributeInfo& attributes,
boost::unordered_set< OString, OStringHash >& propinterfaces); std::set< OUString >& propinterfaces);
/**
checks whether the return and parameters types are valid and allowed
calc add-in type. The function throws a CannotDumpException with an
detailed error description which type is wrong
@param manager a type manager
@param reader a registry type reader of an interface defining
calc add-in functions
*/
void checkAddInTypes(rtl::Reference< TypeManager > const & manager,
typereg::Reader const & reader);
/** /**
checks if XComponent have to be supported, if yes it removes it from the checks if XComponent have to be supported, if yes it removes it from the
...@@ -145,17 +125,17 @@ void checkAddInTypes(rtl::Reference< TypeManager > const & manager, ...@@ -145,17 +125,17 @@ void checkAddInTypes(rtl::Reference< TypeManager > const & manager,
@return true if XComponent have to be supported @return true if XComponent have to be supported
*/ */
bool checkXComponentSupport(rtl::Reference< TypeManager > const & manager, bool checkXComponentSupport(rtl::Reference< TypeManager > const & manager,
boost::unordered_set< OString, OStringHash >& interfaces); std::set< OUString >& interfaces);
sal_uInt16 checkAdditionalPropertyFlags(typereg::Reader const & reader,
sal_uInt16 field, sal_uInt16 method);
unoidl::AccumulationBasedServiceEntity::Property::Attributes
checkAdditionalPropertyFlags(
unoidl::InterfaceTypeEntity::Attribute const & attribute);
void generateFunctionParameterMap(std::ostream& o, void generateFunctionParameterMap(std::ostream& o,
ProgramOptions const & options, ProgramOptions const & options,
rtl::Reference< TypeManager > const & manager, rtl::Reference< TypeManager > const & manager,
const boost::unordered_set< OString, OStringHash >& interfaces); const std::set< OUString >& interfaces);
} }
......
...@@ -33,84 +33,20 @@ namespace skeletonmaker { namespace cpp { ...@@ -33,84 +33,20 @@ namespace skeletonmaker { namespace cpp {
// 4 = const reference (includes css::uno::Reference for interfaces) // 4 = const reference (includes css::uno::Reference for interfaces)
// 8 = default construction for example for return types, means "return <type>();" // 8 = default construction for example for return types, means "return <type>();"
// 16 = default member initialization in a constructor // 16 = default member initialization in a constructor
void printType(std::ostream & o, void printType(
ProgramOptions const & options, rtl::Reference< TypeManager > const & manager, std::ostream & o, ProgramOptions const & options,
codemaker::UnoType::Sort sort, RTTypeClass typeClass, rtl::Reference< TypeManager > const & manager, OUString const & name,
OString const & name, sal_Int32 rank, short referenceType, bool defaultvalue = false);
std::vector< OString > const & arguments,
short referenceType, bool defaultvalue=false);
void printType(std::ostream & o,
ProgramOptions const & options, rtl::Reference< TypeManager > const & manager,
OString const & type, short referenceType,
bool defaultvalue=false);
bool printConstructorParameters(std::ostream & o,
ProgramOptions const & options,
rtl::Reference< TypeManager > const & manager,
typereg::Reader const & reader,
typereg::Reader const & outerReader,
std::vector< OString > const & arguments);
void printConstructor(std::ostream & o,
ProgramOptions const & options,
rtl::Reference< TypeManager > const & manager,
typereg::Reader const & reader,
std::vector< OString > const & arguments);
void printMethodParameters(std::ostream & o,
ProgramOptions const & options,
rtl::Reference< TypeManager > const & manager,
typereg::Reader const & reader,
sal_uInt16 method, bool previous,
bool withtype);
void printExceptionSpecification(std::ostream & o,
ProgramOptions const & options,
rtl::Reference< TypeManager > const & manager,
typereg::Reader const & reader,
sal_uInt16 method);
void printMethods(std::ostream & o, void printMethods(std::ostream & o,
ProgramOptions const & options, rtl::Reference< TypeManager > const & manager, ProgramOptions const & options, rtl::Reference< TypeManager > const & manager,
typereg::Reader const & reader, OUString const & name,
codemaker::GeneratedTypeSet & generated, codemaker::GeneratedTypeSet & generated,
OString const & delegate, OString const & delegate,
OString const & classname=OString(), OString const & classname=OString(),
OString const & indentation=OString(), OString const & indentation=OString(),
bool defaultvalue=false, bool defaultvalue=false,
OString const & propertyhelper=OString()); OUString const & propertyhelper=OUString());
void printConstructionMethods(std::ostream & o,
ProgramOptions const & options,
rtl::Reference< TypeManager > const & manager,
typereg::Reader const & reader);
void printServiceMembers(std::ostream & o,
ProgramOptions const & options,
rtl::Reference< TypeManager > const & manager,
typereg::Reader const & reader,
OString const & type,
OString const & delegate);
void printMapsToCppType(std::ostream & o,
ProgramOptions const & options,
rtl::Reference< TypeManager > const & manager,
codemaker::UnoType::Sort sort,
RTTypeClass typeClass,
OString const & name,
sal_Int32 rank,
std::vector< OString > const & arguments,
const char * cppTypeSort);
void generateDocumentation(std::ostream & o, void generateDocumentation(std::ostream & o,
ProgramOptions const & options, ProgramOptions const & options,
......
...@@ -26,73 +26,20 @@ ...@@ -26,73 +26,20 @@
namespace skeletonmaker { namespace java { namespace skeletonmaker { namespace java {
void printType(std::ostream & o, void printType(
ProgramOptions const & options, rtl::Reference< TypeManager > const & manager, std::ostream & o, ProgramOptions const & options,
codemaker::UnoType::Sort sort, RTTypeClass typeClass, rtl::Reference< TypeManager > const & manager, OUString const & name,
OString const & name, sal_Int32 rank, bool referenceType, bool defaultvalue = false);
std::vector< OString > const & arguments,
bool referenceType, bool defaultvalue=false);
void printType(std::ostream & o,
ProgramOptions const & options, rtl::Reference< TypeManager > const & manager,
OString const & type, bool referenceType,
bool defaultvalue=false);
bool printConstructorParameters(std::ostream & o,
ProgramOptions const & options,
rtl::Reference< TypeManager > const & manager,
typereg::Reader const & reader,
typereg::Reader const & outerReader,
std::vector< OString > const & arguments);
void printConstructor(std::ostream & o,
ProgramOptions const & options, rtl::Reference< TypeManager > const & manager,
typereg::Reader const & reader,
std::vector< OString > const & arguments);
void printMethodParameters(std::ostream & o,
ProgramOptions const & options,
rtl::Reference< TypeManager > const & manager,
typereg::Reader const & reader,
sal_uInt16 method, bool previous,
bool withtype);
void printExceptionSpecification(std::ostream & o,
ProgramOptions const & options,
rtl::Reference< TypeManager > const & manager,
typereg::Reader const & reader,
sal_uInt16 method);
void printMethods(std::ostream & o, void printMethods(std::ostream & o,
ProgramOptions const & options, rtl::Reference< TypeManager > const & manager, ProgramOptions const & options, rtl::Reference< TypeManager > const & manager,
typereg::Reader const & reader, OUString const & name,
codemaker::GeneratedTypeSet & generated, codemaker::GeneratedTypeSet & generated,
OString const & delegate, OString const & delegate,
OString const & indentation=OString(), OString const & indentation=OString(),
bool defaultvalue=false, bool defaultvalue=false,
bool usepropertymixin=false); bool usepropertymixin=false);
void printConstructionMethods(std::ostream & o,
ProgramOptions const & options,
rtl::Reference< TypeManager > const & manager,
typereg::Reader const & reader);
void printServiceMembers(std::ostream & o,
ProgramOptions const & options,
rtl::Reference< TypeManager > const & manager,
typereg::Reader const & reader,
OString const & type,
OString const & delegate);
void printMapsToJavaType(std::ostream & o,
ProgramOptions const & options,
rtl::Reference< TypeManager > const & manager,
codemaker::UnoType::Sort sort,
RTTypeClass typeClass,
OString const & name, sal_Int32 rank,
std::vector< OString > const & arguments,
const char * javaTypeSort);
void generateDocumentation(std::ostream & o, void generateDocumentation(std::ostream & o,
ProgramOptions const & options, ProgramOptions const & options,
rtl::Reference< TypeManager > const & manager, rtl::Reference< TypeManager > const & manager,
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#include "sal/main.h" #include "sal/main.h"
#include "rtl/process.h" #include "rtl/process.h"
#include "unodevtools/options.hxx" #include "unodevtools/options.hxx"
#include "unoidl/unoidl.hxx"
#include "skeletonjava.hxx" #include "skeletonjava.hxx"
#include "skeletoncpp.hxx" #include "skeletoncpp.hxx"
...@@ -266,11 +268,10 @@ SAL_IMPLEMENT_MAIN() ...@@ -266,11 +268,10 @@ SAL_IMPLEMENT_MAIN()
} }
rtl::Reference< TypeManager > manager(new TypeManager); rtl::Reference< TypeManager > manager(new TypeManager);
if ( !manager->init(registries) ) { for (std::vector< OString >::const_iterator i(registries.begin());
std::cerr i != registries.end(); ++i)
<< ("\nError: Using the binary type libraries failed, check the -L" {
" options\n"); manager->loadProvider(b2u(*i), true);
exit(EXIT_FAILURE);
} }
if ( options.dump ) { if ( options.dump ) {
...@@ -309,9 +310,17 @@ SAL_IMPLEMENT_MAIN() ...@@ -309,9 +310,17 @@ SAL_IMPLEMENT_MAIN()
} }
} }
} catch (const CannotDumpException & e) { } catch (CannotDumpException & e) {
std::cout.flush(); std::cerr << "ERROR: " << e.getMessage() << '\n';
std::cerr << "\nError: " << e.getMessage() << std::endl; return EXIT_FAILURE;
} catch (unoidl::NoSuchFileException & e) {
std::cerr << "ERROR: No such file <" << e.getUri() << ">\n";
return EXIT_FAILURE;
} catch (unoidl::FileFormatException & e) {
std::cerr
<< "ERROR: Bad format of <" << e.getUri() << ">, \""
<< e.getDetail() << "\"\n";
return EXIT_FAILURE;
} }
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment