22#include "rtl/string.hxx"
23#include "rtl/ustrbuf.hxx"
24#include "com/sun/star/reflection/XIndirectTypeDescription.hpp"
25#include "com/sun/star/reflection/XStructTypeDescription.hpp"
26#include "com/sun/star/reflection/XInterfaceTypeDescription2.hpp"
27#include "com/sun/star/reflection/XInterfaceMethodTypeDescription.hpp"
28#include "com/sun/star/reflection/XInterfaceAttributeTypeDescription.hpp"
29#include "com/sun/star/reflection/XInterfaceAttributeTypeDescription2.hpp"
32using namespace ::System::Reflection;
42 OUString
const & uno_name )
50 switch (
value.getValueTypeClass())
53 return ((::System::Char) *
reinterpret_cast< sal_Unicode const *
>(
55 case TypeClass_BOOLEAN:
56 return ((::System::Boolean)
60 return ((::System::Byte) *
reinterpret_cast< sal_Int8 const *
>(
63 return ((::System::Int16) *
reinterpret_cast< sal_Int16
const *
>(
65 case TypeClass_UNSIGNED_SHORT:
66 return ((::System::UInt16) *
reinterpret_cast< sal_uInt16
const *
>(
69 return ((::System::Int32) *
reinterpret_cast< sal_Int32
const *
>(
71 case TypeClass_UNSIGNED_LONG:
72 return ((::System::UInt32) *
reinterpret_cast< sal_uInt32
const *
>(
75 return ((::System::Int64) *
reinterpret_cast< sal_Int64
const *
>(
77 case TypeClass_UNSIGNED_HYPER:
78 return ((::System::UInt64) *
reinterpret_cast< sal_uInt64
const *
>(
81 return ((::System::Single) *
reinterpret_cast< float const *
>(
83 case TypeClass_DOUBLE:
84 return ((::System::Double) *
reinterpret_cast< double const *
>(
88 "unexpected constant type " +
89 value.getValueType().getTypeName() );
94static inline void emit_ldarg( Emit::ILGenerator ^ code, ::System::Int32 index )
100#pragma warning (disable: 4538)
101 code->Emit( Emit::OpCodes::Ldarg_0 );
105 code->Emit( Emit::OpCodes::Ldarg_1 );
108 code->Emit( Emit::OpCodes::Ldarg_2 );
111 code->Emit( Emit::OpCodes::Ldarg_3 );
115 code->Emit( Emit::OpCodes::Ldarg_S, (::System::Byte)
index );
116 else if (
index < 0x8000)
117 code->Emit( Emit::OpCodes::Ldarg_S, (::System::Int16)
index );
119 code->Emit( Emit::OpCodes::Ldarg,
index );
126 if ((*sPolyName)->EndsWith(
">") ==
false)
129 int index = (*sPolyName)->IndexOf(
'<');
130 OSL_ASSERT(
index != -1);
131 *sPolyName = (*sPolyName)->Substring(0,
index);
137 ::System::Text::StringBuilder^ buf= gcnew System::Text::StringBuilder();
138 ::System::String ^ sUnoName = ::System::String::Copy(
typeName);
151 sUnoName = sUnoName->Substring(
index - 1);
197 return buf->ToString();
212 int index = unoName->IndexOf(
'<');
216 System::Text::StringBuilder ^ builder =
217 gcnew System::Text::StringBuilder(unoName->Substring(0,
index +1 ));
223 int endIndex = unoName->Length - 1;
227 while (cur <= endIndex)
229 System::Char c = unoName[cur];
230 if (c ==
',' || c ==
'>')
233 if (countParams != 0)
234 builder->Append(
",");
236 System::String ^ sParam = unoName->Substring(
index, cur -
index);
250 System::Char curChar = unoName[cur];
255 else if (curChar ==
'>')
267 builder->Append((System::Char)
'>');
268 return builder->ToString();
273 ::System::Object ^, ::System::ResolveEventArgs ^ args )
275 ::System::String ^ cts_name =
args->Name;
276 ::System::Type ^ ret_type =
nullptr;
279 if (
nullptr != entry)
282 if (
nullptr == ret_type)
285 for ( sal_Int32
pos = 0;
pos < len; ++
pos )
289 if (
nullptr != ret_type)
293 ::System::Console::WriteLine(
294 "> resolving type {0} from {1}.",
295 cts_name, ret_type->Assembly->FullName );
301 if (
nullptr != ret_type)
302 return ret_type->Assembly;
308 ::System::String ^ cts_name,
bool throw_exc )
321 if (ret_type ==
nullptr)
323 ::System::Text::StringBuilder ^ builder = gcnew ::System::Text::StringBuilder(cts_name);
324 builder->Append(
",cli_basetypes");
325 ret_type = ::System::Type::GetType(builder->ToString());
328 if (ret_type ==
nullptr)
333 return ::System::Type::GetType( cts_name, throw_exc );
335 catch (::System::Exception^ exc)
339 ::System::Text::StringBuilder ^ sb = gcnew ::System::Text::StringBuilder();
340 sb->Append(gcnew ::System::String(
"\nThe type "));
341 sb->Append(cts_name);
342 sb->Append(gcnew ::System::String(
" \n could not be found. Did you forget to "
343 "specify an additional assembly with the --reference option?\n"));
345 throw gcnew ::System::Exception(sb->ToString(), exc);
360 "unoidl.com.sun.star.uno.Exception",
false );
364 Emit::TypeBuilder ^ type_builder =
366 "unoidl.com.sun.star.uno.Exception",
367 (TypeAttributes) (TypeAttributes::Public |
368 TypeAttributes::BeforeFieldInit |
369 TypeAttributes::AnsiClass),
370 (::System::Exception::typeid) );
371 Emit::FieldBuilder ^ field_Context = type_builder->DefineField(
372 "Context", (::System::Object::typeid),
373 FieldAttributes::Public );
377 array< ::System::Type^>^ param_types =
378 gcnew array< ::System::Type^>(2);
379 param_types[ 0 ] = ::System::String::typeid;
380 param_types[ 1 ] = ::System::Object::typeid;
381 Emit::ConstructorBuilder ^ ctor_builder =
382 type_builder->DefineConstructor(
385 ctor_builder->DefineParameter(
386 1, ParameterAttributes::In,
"Message" );
387 ctor_builder->DefineParameter(
388 2, ParameterAttributes::In,
"Context" );
389 Emit::ILGenerator ^
code = ctor_builder->GetILGenerator();
390 code->Emit( Emit::OpCodes::Ldarg_0 );
391 code->Emit( Emit::OpCodes::Ldarg_1 );
392 param_types = gcnew array< ::System::Type^>(1);
393 param_types[ 0 ] = ::System::String::typeid;
396 (::System::Exception::typeid)
397 ->GetConstructor( param_types ) );
398 code->Emit( Emit::OpCodes::Ldarg_0 );
399 code->Emit( Emit::OpCodes::Ldarg_2 );
400 code->Emit( Emit::OpCodes::Stfld, field_Context );
401 code->Emit( Emit::OpCodes::Ret );
405 ::System::Console::WriteLine(
406 "> emitting exception type "
407 "unoidl.com.sun.star.uno.Exception" );
421 "unoidl.com.sun.star.uno.RuntimeException",
false );
426 Emit::TypeBuilder ^ type_builder =
428 "unoidl.com.sun.star.uno.RuntimeException",
429 (TypeAttributes) (TypeAttributes::Public |
430 TypeAttributes::BeforeFieldInit |
431 TypeAttributes::AnsiClass),
436 array< ::System::Type^>^ param_types =
437 gcnew array< ::System::Type^>(2);
438 param_types[ 0 ] = ::System::String::typeid;
439 param_types[ 1 ] = ::System::Object::typeid;
440 Emit::ConstructorBuilder ^ ctor_builder =
441 type_builder->DefineConstructor(
444 ctor_builder->DefineParameter(
445 1, ParameterAttributes::In,
"Message" );
446 ctor_builder->DefineParameter(
447 2, ParameterAttributes::In,
"Context" );
448 Emit::ILGenerator ^
code = ctor_builder->GetILGenerator();
449 code->Emit( Emit::OpCodes::Ldarg_0 );
450 code->Emit( Emit::OpCodes::Ldarg_1 );
451 code->Emit( Emit::OpCodes::Ldarg_2 );
454 type_Exception->GetConstructor( param_types ) );
455 code->Emit( Emit::OpCodes::Ret );
459 ::System::Console::WriteLine(
460 "> emitting exception type "
461 "unoidl.com.sun.star.uno.RuntimeException" );
471 Reference< reflection::XConstantTypeDescription >
const & xType )
473 ::System::String ^ cts_name =
to_cts_name( xType->getName() );
474 ::System::Type ^ ret_type =
get_type( cts_name,
false );
475 if (
nullptr == ret_type)
477 Reference< reflection::XConstantTypeDescription > xConstant(
478 xType, UNO_SET_THROW );
479 ::System::Object ^ constant =
481 Emit::TypeBuilder ^ type_builder =
484 (TypeAttributes) (TypeAttributes::Public |
485 TypeAttributes::Sealed |
486 TypeAttributes::BeforeFieldInit |
487 TypeAttributes::AnsiClass) );
489 Emit::FieldBuilder ^ field_builder = type_builder->DefineField(
490 cts_name->Substring( cts_name->LastIndexOf(
'.' ) +1 ),
492 (FieldAttributes) (FieldAttributes::Public |
493 FieldAttributes::Static |
494 FieldAttributes::Literal) );
495 field_builder->SetConstant( constant );
499 ::System::Console::WriteLine(
500 "> emitting constant type {0}", cts_name );
502 ret_type = type_builder->CreateType();
509 Reference< reflection::XConstantsTypeDescription >
const & xType )
511 ::System::String ^ cts_name =
to_cts_name( xType->getName() );
512 ::System::Type ^ ret_type =
get_type( cts_name,
false );
513 if (
nullptr == ret_type)
515 Emit::TypeBuilder ^ type_builder =
518 (TypeAttributes) (TypeAttributes::Public |
519 TypeAttributes::Sealed |
520 TypeAttributes::BeforeFieldInit |
521 TypeAttributes::AnsiClass) );
524 reflection::XConstantTypeDescription > > seq_constants(
525 xType->getConstants() );
526 Reference< reflection::XConstantTypeDescription >
const * constants =
527 seq_constants.getConstArray();
528 sal_Int32 constants_length = seq_constants.getLength();
529 for ( sal_Int32 constants_pos = 0;
530 constants_pos < constants_length; ++constants_pos )
533 reflection::XConstantTypeDescription >
const & xConstant =
534 constants[ constants_pos ];
535 ::System::Object ^ constant =
537 ::System::String ^ uno_name =
539 Emit::FieldBuilder ^ field_builder = type_builder->DefineField(
540 uno_name->Substring( uno_name->LastIndexOf(
'.' ) +1 ),
542 (FieldAttributes) (FieldAttributes::Public |
543 FieldAttributes::Static |
544 FieldAttributes::Literal) );
545 field_builder->SetConstant( constant );
550 ::System::Console::WriteLine(
551 "> emitting constants group type {0}", cts_name );
553 ret_type = type_builder->CreateType();
560 Reference< reflection::XEnumTypeDescription >
const & xType )
562 ::System::String ^ cts_name =
to_cts_name( xType->getName() );
563 ::System::Type ^ ret_type =
get_type( cts_name,
false );
564 if (
nullptr == ret_type)
567 Emit::TypeBuilder ^ enum_builder =
570 (TypeAttributes) (TypeAttributes::Public |
571 TypeAttributes::Sealed),
572 ::System::Enum::typeid );
573 enum_builder->DefineField(
574 "value__", ::System::Int32::typeid,
575 (FieldAttributes) (FieldAttributes::Private |
576 FieldAttributes::SpecialName |
577 FieldAttributes::RTSpecialName) );
578 Sequence< OUString > seq_enum_names( xType->getEnumNames() );
579 Sequence< sal_Int32 > seq_enum_values( xType->getEnumValues() );
580 sal_Int32 enum_length = seq_enum_names.getLength();
581 OSL_ASSERT( enum_length == seq_enum_values.getLength() );
582 OUString
const * enum_names = seq_enum_names.getConstArray();
583 sal_Int32
const * enum_values = seq_enum_values.getConstArray();
584 for ( sal_Int32 enum_pos = 0; enum_pos < enum_length; ++enum_pos )
589 Emit::FieldBuilder ^ field_builder =
590 enum_builder->DefineField(
593 (FieldAttributes) (FieldAttributes::Public |
594 FieldAttributes::Static |
595 FieldAttributes::Literal) );
596 field_builder->SetConstant(
597 ((::System::Int32) enum_values[ enum_pos ]) );
602 ::System::Console::WriteLine(
603 "> emitting enum type {0}", cts_name );
605 ret_type = enum_builder->CreateType();
612 Reference< reflection::XCompoundTypeDescription >
const & xType )
614 OUString uno_name( xType->getName() );
615 if (TypeClass_EXCEPTION == xType->getTypeClass())
617 if ( uno_name ==
"com.sun.star.uno.Exception" )
621 if ( uno_name ==
"com.sun.star.uno.RuntimeException" )
626 ::System::String ^ cts_name =
to_cts_name( uno_name );
633 ::System::Type ^ ret_type =
get_type( cts_name,
false );
634 if (
nullptr == ret_type)
636 Reference< reflection::XCompoundTypeDescription > xBaseType(
637 xType->getBaseType(), UNO_QUERY );
638 ::System::Type ^ base_type = (xBaseType.is()
641 Emit::TypeBuilder ^ type_builder =
644 (TypeAttributes) (TypeAttributes::Public |
645 TypeAttributes::BeforeFieldInit |
646 TypeAttributes::AnsiClass),
651 struct_entry ^ entry = gcnew struct_entry();
653 entry->m_xType = xType.get();
654 entry->m_type_builder = type_builder;
655 entry->m_base_type = base_type;
659 ret_type = type_builder;
667 Reference< reflection::XStructTypeDescription> xStructTypeDesc(
670 if (xStructTypeDesc.is())
672 Sequence< Reference< reflection::XTypeDescription > > seqTypeArgs = xStructTypeDesc->getTypeArguments();
673 sal_Int32 numTypes = seqTypeArgs.getLength();
687 Reference< reflection::XInterfaceTypeDescription2 >
const & xType )
689 OUString uno_name( xType->getName() );
690 if ( uno_name ==
"com.sun.star.uno.XInterface" )
692 return ::System::Object::typeid;
695 ::System::String ^ cts_name =
to_cts_name( xType->getName() );
696 ::System::Type ^ ret_type =
get_type( cts_name,
false );
697 if (
nullptr == ret_type)
699 Emit::TypeBuilder ^ type_builder;
701 TypeAttributes attr = (TypeAttributes) (TypeAttributes::Public |
702 TypeAttributes::Interface |
703 TypeAttributes::Abstract |
704 TypeAttributes::AnsiClass);
706 std::vector<Reference<reflection::XInterfaceTypeDescription2> > vecBaseTypes;
707 Sequence<Reference< reflection::XTypeDescription > > seqBaseTypes =
708 xType->getBaseTypes();
709 if (seqBaseTypes.getLength() > 0)
711 for (
int i = 0;
i < seqBaseTypes.getLength();
i++)
713 Reference<reflection::XInterfaceTypeDescription2> xIfaceTd =
716 if ( xIfaceTd->getName() !=
"com.sun.star.uno.XInterface" )
718 vecBaseTypes.push_back(xIfaceTd);
722 array< ::System::Type^>^ base_interfaces =
723 gcnew array< ::System::Type^>( vecBaseTypes.size() );
726 for (
auto const & vecBaseType : vecBaseTypes)
732 cts_name, attr,
nullptr, base_interfaces );
736 ::System::Console::WriteLine(
737 "warning: IDL interface {0} is not derived from "
738 "com.sun.star.uno.XInterface!",
745 iface_entry ^ entry = gcnew iface_entry();
747 entry->m_xType = xType.get();
748 entry->m_type_builder = type_builder;
752 ret_type = type_builder;
759 Reference< reflection::XServiceTypeDescription2 >
const & xType )
761 if (xType->isSingleInterfaceBased() == sal_False)
764 System::String ^ cts_name =
to_cts_name( xType->getName() );
765 System::Type ^ ret_type =
get_type( cts_name,
false );
766 if (ret_type !=
nullptr)
769 TypeAttributes attr = (TypeAttributes) (TypeAttributes::Public |
770 TypeAttributes::Sealed |
771 TypeAttributes::BeforeFieldInit |
772 TypeAttributes::AnsiClass);
778 service_entry ^ entry = gcnew service_entry();
780 entry->m_xType = xType.get();
781 entry->m_type_builder = type_builder;
788 Reference<reflection::XSingletonTypeDescription2 >
const & xType )
790 if (xType->isInterfaceBased() == sal_False)
793 ::System::String^ cts_name =
to_cts_name( xType->getName() );
794 ::System::Type ^ ret_type =
get_type( cts_name,
false );
795 if (ret_type !=
nullptr)
798 TypeAttributes attr =
static_cast<TypeAttributes
>(
799 TypeAttributes::Public |
800 TypeAttributes::Sealed |
801 TypeAttributes::BeforeFieldInit |
802 TypeAttributes::AnsiClass);
808 singleton_entry ^ entry = gcnew singleton_entry();
810 entry->m_xType = xType.get();
811 entry->m_type_builder = type_builder;
822 reflection::XInterfaceTypeDescription2 * xType = entry->
m_xType;
824 Sequence<Reference< reflection::XTypeDescription > > seqBaseTypes( xType->getBaseTypes() );
825 if (seqBaseTypes.getLength() > 0)
827 for (
int i = 0;
i < seqBaseTypes.getLength();
i++)
830 Reference<reflection::XInterfaceTypeDescription2> aBaseType =
833 if ( aBaseType->getName() !=
"com.sun.star.uno.XInterface" )
835 ::System::String ^ basetype_name =
to_cts_name( aBaseType->getName() );
838 if (
nullptr != base_entry)
848 Reference< reflection::XInterfaceMemberTypeDescription > > seq_members(
849 xType->getMembers() );
850 Reference< reflection::XInterfaceMemberTypeDescription >
const *
members =
851 seq_members.getConstArray();
852 sal_Int32 members_length = seq_members.getLength();
853 for ( sal_Int32 members_pos = 0;
854 members_pos < members_length; ++members_pos )
857 reflection::XInterfaceMemberTypeDescription >
const & xMember =
859 Sequence< Reference< reflection::XTypeDescription > > seq_exceptions;
860 Emit::MethodBuilder ^ method_builder;
862 MethodAttributes c_method_attr = (MethodAttributes)
863 (MethodAttributes::Public |
864 MethodAttributes::Abstract |
865 MethodAttributes::Virtual |
866 MethodAttributes::NewSlot |
867 MethodAttributes::HideBySig);
869 if (TypeClass_INTERFACE_METHOD == xMember->getTypeClass())
871 Reference< reflection::XInterfaceMethodTypeDescription >
xMethod(
872 xMember, UNO_QUERY_THROW );
875 Reference< reflection::XMethodParameter > > seq_parameters(
877 sal_Int32 params_length = seq_parameters.getLength();
878 array< ::System::Type^>^ param_types =
879 gcnew array< ::System::Type^>( params_length );
880 Reference< reflection::XMethodParameter >
const * parameters =
881 seq_parameters.getConstArray();
884 sal_Int32 params_pos = 0;
885 for ( ; params_pos < params_length; ++params_pos )
887 Reference< reflection::XMethodParameter >
const & xParam =
888 parameters[ params_pos ];
889 ::System::Type ^ param_type =
get_type( xParam->getType() );
890 ::System::String ^ param_type_name = param_type->FullName;
894 ::System::String::Concat(
895 param_type_name,
"&" ),
true );
897 param_types[ xParam->getPosition() ] = param_type;
908 method_builder = type_builder->DefineMethod(
914 for ( ; params_pos < params_length; ++params_pos )
916 Reference< reflection::XMethodParameter >
const & xParam =
917 parameters[ params_pos ];
918 long param_flags = 0;
920 param_flags |= (long)ParameterAttributes::In;
922 param_flags |= (
long)ParameterAttributes::Out;
923 OSL_ASSERT( 0 != param_flags );
924 method_builder->DefineParameter(
925 xParam->getPosition() +1 ,
926 (ParameterAttributes) param_flags,
931 Reference<reflection::XStructTypeDescription> xReturnStruct(
932 xMethod->getReturnType(), UNO_QUERY);
934 if (xReturnStruct.is())
936 Sequence<Reference<reflection::XTypeDescription> > seq_type_args =
937 xReturnStruct->getTypeArguments();
938 if (seq_type_args.getLength() != 0)
941 array< ::System::Type^>^ arCtor = {::System::Type::GetType(
"System.Type[]")};
943 Reference<reflection::XTypeDescription>
const * arXTypeArgs =
944 seq_type_args.getConstArray();
945 int numTypes = seq_type_args.getLength();
946 array< ::System::Type^>^ arCtsTypes = gcnew array< ::System::Type^>(numTypes);
947 for (
int i = 0;
i < numTypes;
i++)
949 array< ::System::Object^>^ arArgs = {arCtsTypes};
951 Emit::CustomAttributeBuilder ^ attrBuilder =
952 gcnew Emit::CustomAttributeBuilder(
953 ::uno::TypeArgumentsAttribute::typeid
954 ->GetConstructor( arCtor),
957 method_builder->SetCustomAttribute(attrBuilder);
962 Emit::CustomAttributeBuilder^ attrBuilder =
964 if (attrBuilder !=
nullptr)
965 method_builder->SetCustomAttribute(attrBuilder);
970 array< ::System::Type^>^ arCtorOneway = gcnew array< ::System::Type^>(0);
971 array< ::System::Object^>^ arArgs = gcnew array< ::System::Object^>(0);
972 Emit::CustomAttributeBuilder ^ attrBuilder =
973 gcnew Emit::CustomAttributeBuilder(
974 ::uno::OnewayAttribute::typeid->GetConstructor( arCtorOneway),
976 method_builder->SetCustomAttribute(attrBuilder);
982 TypeClass_INTERFACE_ATTRIBUTE == xMember->getTypeClass() );
984 reflection::XInterfaceAttributeTypeDescription2 > xAttribute(
985 xMember, UNO_QUERY_THROW );
987 MethodAttributes c_property_method_attr = (MethodAttributes)
988 (c_method_attr | MethodAttributes::SpecialName);
990 ::System::Type ^ attribute_type =
get_type( xAttribute->getType() );
991 array< ::System::Type^>^ parameters =
992 gcnew array< ::System::Type^> ( 0 );
994 Emit::PropertyBuilder ^ property_builder =
995 type_builder->DefineProperty(
997 PropertyAttributes::None,
998 attribute_type, parameters );
1001 if (xAttribute->isBound())
1003 ConstructorInfo ^ ctorBoundAttr =
1004 ::uno::BoundAttribute::typeid->GetConstructor(
1005 gcnew array<System::Type^>(0));
1006 Emit::CustomAttributeBuilder ^ attrBuilderBound =
1007 gcnew Emit::CustomAttributeBuilder(
1008 ctorBoundAttr, gcnew array< ::System::Object^>(0));
1009 property_builder->SetCustomAttribute(attrBuilderBound);
1013 Emit::MethodBuilder ^ method_builder =
1014 type_builder->DefineMethod(
1016 xAttribute->getMemberName() ),
1017 c_property_method_attr, attribute_type, parameters );
1020 Emit::CustomAttributeBuilder^ attrBuilder =
1022 if (attrBuilder !=
nullptr)
1023 method_builder->SetCustomAttribute(attrBuilder);
1025 property_builder->SetGetMethod( method_builder );
1027 if (! xAttribute->isReadOnly())
1030 parameters = gcnew array< ::System::Type^> ( 1 );
1031 parameters[ 0 ] = attribute_type;
1033 type_builder->DefineMethod(
1035 xAttribute->getMemberName() ),
1036 c_property_method_attr,
nullptr, parameters );
1038 method_builder->DefineParameter(
1039 1 , ParameterAttributes::In,
"value" );
1041 Emit::CustomAttributeBuilder^ attrBuilder =
1043 if (attrBuilder !=
nullptr)
1044 method_builder->SetCustomAttribute(attrBuilder);
1046 property_builder->SetSetMethod( method_builder );
1052 ::System::String ^ cts_name = type_builder->FullName;
1058 ::System::Console::WriteLine(
1059 "> emitting interface type {0}", cts_name );
1061 return type_builder->CreateType();
1073 Sequence< OUString > seq_type_parameters;
1074 Reference< reflection::XStructTypeDescription> xStructTypeDesc(
1076 if (xStructTypeDesc.is())
1078 seq_type_parameters = xStructTypeDesc->getTypeParameters();
1080 if ((numTypes = seq_type_parameters.getLength()) > 0)
1082 array< ::System::Object^>^ aArg = gcnew array< ::System::Object^>(numTypes);
1083 for (
int i = 0;
i < numTypes;
i++)
1085 array< ::System::Object^>^
args = {aArg};
1087 array< ::System::Type^>^ arTypesCtor =
1088 {::System::Type::GetType(
"System.String[]")};
1089 Emit::CustomAttributeBuilder ^ attrBuilder =
1090 gcnew Emit::CustomAttributeBuilder(
1091 ::uno::TypeParametersAttribute::typeid->GetConstructor(arTypesCtor),
1109 Sequence< Reference< reflection::XTypeDescription > > seq_members(
1110 entry->
m_xType->getMemberTypes() );
1111 Sequence< OUString > seq_member_names( entry->
m_xType->getMemberNames() );
1112 sal_Int32 members_length = seq_members.getLength();
1113 OSL_ASSERT( seq_member_names.getLength() == members_length );
1116 Reference< reflection::XTypeDescription >
const * pseq_members =
1117 seq_members.getConstArray();
1118 OUString
const * pseq_member_names =
1119 seq_member_names.getConstArray();
1120 for (
int i = 0;
i < members_length;
i++)
1123 const OUString sMemberName(pseq_member_names[
i]);
1124 if ( ! pseq_members[
i].is())
1126 "specify additional RDBs with the --extra option. Type missing for: " +
sType +
1127 "::" + sMemberName,0);
1130 sal_Int32 all_members_length = 0;
1131 sal_Int32 member_pos;
1132 sal_Int32 type_param_pos = 0;
1135 ::System::Collections::ArrayList ^ base_types_list =
1136 gcnew ::System::Collections::ArrayList( 3 );
1137 for (::System::Type ^ base_type_pos = entry->
m_base_type;
1138 ! base_type_pos->Equals( ::System::Object::typeid );
1139 base_type_pos = base_type_pos->BaseType )
1141 base_types_list->Add( base_type_pos );
1142 if (base_type_pos->Equals( ::System::Exception::typeid ))
1145 all_members_length += 1;
1152 all_members_length +=
1153 base_type_pos->GetFields(
1154 (BindingFlags) (BindingFlags::Instance |
1155 BindingFlags::Public |
1156 BindingFlags::DeclaredOnly) )
1162 array< ::System::String^>^ all_member_names =
1163 gcnew array< ::System::String^> (all_members_length + members_length );
1164 array< ::System::Type^>^ all_param_types =
1165 gcnew array< ::System::Type^> (all_members_length + members_length );
1167 for ( sal_Int32
pos = base_types_list->Count;
pos--; )
1169 ::System::Type ^ base_type = safe_cast< ::System::Type ^ >(
1170 base_types_list[
pos] );
1171 if (base_type->Equals( ::System::Exception::typeid ))
1173 all_member_names[ member_pos ] =
"Message";
1174 all_param_types[ member_pos ] = ::System::String::typeid;
1179 ::System::String ^ base_type_name = base_type->FullName;
1185 if (
nullptr == entry)
1188 array<FieldInfo^>^ fields =
1189 base_type->GetFields(
1190 (BindingFlags) (BindingFlags::Instance |
1191 BindingFlags::Public |
1192 BindingFlags::DeclaredOnly) );
1193 sal_Int32 len = fields->Length;
1194 for ( sal_Int32
pos = 0;
pos < len; ++
pos )
1196 FieldInfo ^ field = fields[
pos ];
1197 all_member_names[ member_pos ] = field->Name;
1198 all_param_types[ member_pos ] = field->FieldType;
1206 for ( sal_Int32
pos = 0;
pos < len; ++
pos )
1208 all_member_names[ member_pos ] =
1210 all_param_types[ member_pos ] =
1217 OSL_ASSERT( all_members_length == member_pos );
1221 entry->
m_member_names = gcnew array< ::System::String^> ( members_length );
1222 entry->
m_param_types = gcnew array< ::System::Type^> ( members_length );
1225 array<Emit::FieldBuilder^>^
members = gcnew array<Emit::FieldBuilder^> ( members_length );
1231 int curParamIndex = 0;
1232 for ( member_pos = 0; member_pos < members_length; ++member_pos )
1234 ::System::String ^ field_name =
1236 ::System::Type ^ field_type;
1238 bool bParameterizedType =
false;
1239 if (pseq_members[ member_pos ]->
getTypeClass() == TypeClass_UNKNOWN)
1241 bParameterizedType =
true;
1242 if (type_param_pos < seq_type_parameters.getLength())
1244 field_type = ::System::Object::typeid;
1250 "unexpected member type in " + entry->
m_xType->getName() );
1255 field_type =
get_type( pseq_members[ member_pos ] );
1257 if (field_type->IsArray
1259 && !field_type->Namespace->Equals(
"System"))
1262 ::System::Type ^
value = field_type;
1263 while ((
value =
value->GetElementType())->IsArray);
1266 field_type =
get_type(pseq_members[member_pos]);
1271 field_name, field_type, FieldAttributes::Public );
1274 if (bParameterizedType && xStructTypeDesc.is())
1277 OSL_ASSERT(seq_type_parameters.getLength() > curParamIndex);
1279 seq_type_parameters.getConstArray()[curParamIndex++]);
1280 array< ::System::Object^>^
args = {sTypeName};
1282 array< ::System::Type^>^ arCtorTypes = {::System::String::typeid};
1284 Emit::CustomAttributeBuilder ^ attrBuilder =
1285 gcnew Emit::CustomAttributeBuilder(
1286 ::uno::ParameterizedTypeAttribute::typeid
1287 ->GetConstructor(arCtorTypes),
1290 members[member_pos]->SetCustomAttribute(attrBuilder);
1293 all_member_names[ all_members_length + member_pos ] = field_name;
1294 all_param_types[ all_members_length + member_pos ] = field_type;
1299 all_members_length += members_length;
1302 Emit::ConstructorBuilder ^ ctor_builder =
1305 gcnew array< ::System::Type^> ( 0 ) );
1306 Emit::ILGenerator ^
code = ctor_builder->GetILGenerator();
1307 code->Emit( Emit::OpCodes::Ldarg_0 );
1309 Emit::OpCodes::Call,
1310 nullptr == base_type_entry
1311 ? entry->
m_base_type->GetConstructor( gcnew array< ::System::Type^> ( 0 ) )
1314 for ( member_pos = 0; member_pos < members_length; ++member_pos )
1316 FieldInfo ^ field =
members[ member_pos ];
1317 ::System::Type ^ field_type = field->FieldType;
1321 if (field_type->Equals( ::System::String::typeid ))
1323 code->Emit( Emit::OpCodes::Ldarg_0 );
1324 code->Emit( Emit::OpCodes::Ldstr,
"" );
1325 code->Emit( Emit::OpCodes::Stfld, field );
1327 else if (field_type->Equals( ::System::Type::typeid ))
1329 code->Emit( Emit::OpCodes::Ldarg_0 );
1331 Emit::OpCodes::Ldtoken, ::System::Void::typeid );
1334 code->Emit( Emit::OpCodes::Stfld, field );
1336 else if (field_type->IsArray)
1338 code->Emit( Emit::OpCodes::Ldarg_0 );
1339 code->Emit( Emit::OpCodes::Ldc_I4_0 );
1341 Emit::OpCodes::Newarr, field_type->GetElementType() );
1342 code->Emit( Emit::OpCodes::Stfld, field );
1344 else if (field_type->IsValueType)
1346 if (field_type->FullName->Equals(
"uno.Any" ))
1348 code->Emit( Emit::OpCodes::Ldarg_0 );
1349 code->Emit( Emit::OpCodes::Ldsfld, ::uno::Any::typeid->GetField(
"VOID"));
1350 code->Emit( Emit::OpCodes::Stfld, field );
1353 else if (field_type->IsClass)
1356 if (! field_type->Equals( ::System::Object::typeid ))
1361 code->Emit( Emit::OpCodes::Ldarg_0 );
1363 Emit::OpCodes::Newobj,
1365 field_type->GetConstructor(
1366 gcnew array< ::System::Type^> ( 0 ) ) );
1367 code->Emit( Emit::OpCodes::Stfld, field );
1371 code->Emit( Emit::OpCodes::Ret );
1377 for ( member_pos = 0; member_pos < all_members_length; ++member_pos )
1379 ctor_builder->DefineParameter(
1380 member_pos +1 , ParameterAttributes::In,
1381 all_member_names[ member_pos ] );
1383 code = ctor_builder->GetILGenerator();
1385 code->Emit( Emit::OpCodes::Ldarg_0 );
1386 sal_Int32 base_members_length = all_members_length - members_length;
1387 array< ::System::Type^>^ param_types =
1388 gcnew array< ::System::Type^> ( base_members_length );
1389 for ( member_pos = 0; member_pos < base_members_length; ++member_pos )
1392 param_types[ member_pos ] = all_param_types[ member_pos ];
1395 Emit::OpCodes::Call,
1396 nullptr == base_type_entry
1397 ? entry->
m_base_type->GetConstructor( param_types )
1398 : base_type_entry->
m_ctor );
1400 for ( member_pos = 0; member_pos < members_length; ++member_pos )
1402 code->Emit( Emit::OpCodes::Ldarg_0 );
1404 code->Emit( Emit::OpCodes::Stfld,
members[ member_pos ] );
1406 code->Emit( Emit::OpCodes::Ret );
1407 entry->
m_ctor = ctor_builder;
1411 ::System::Console::WriteLine(
1412 "> emitting {0} type {1}",
1413 TypeClass_STRUCT == entry->
m_xType->getTypeClass()
1428 ::System::Console::WriteLine(
1429 "> emitting struct type {0}", cts_name);
1466 reflection::XServiceTypeDescription2 * xServiceType = entry->
m_xType;
1469 Emit::ConstructorBuilder^ ctor_builder =
1470 type_builder->DefineConstructor(
1471 (MethodAttributes) (MethodAttributes::Private |
1472 MethodAttributes::HideBySig |
1473 MethodAttributes::SpecialName |
1474 MethodAttributes::RTSpecialName),
1475 CallingConventions::Standard,
nullptr);
1477 Emit::ILGenerator^ ilGen = ctor_builder->GetILGenerator();
1478 ilGen->Emit( Emit::OpCodes::Ldarg_0 );
1480 Emit::OpCodes::Call,
1481 type_builder->BaseType->GetConstructor(gcnew array< ::System::Type^>(0)));
1482 ilGen->Emit( Emit::OpCodes::Ret );
1488 Reference<reflection::XInterfaceTypeDescription2> xIfaceType(
1489 xServiceType->getInterface(), UNO_QUERY);
1492 System::Type ^ retType =
get_type(xIfaceType);
1495 ::System::Type ^ typeDeploymentExc =
1496 get_type(
"unoidl.com.sun.star.uno.DeploymentException",
true);
1498 array< ::System::Type^>^ arTypeCtor = {::System::String::typeid,
1499 ::System::Object::typeid};
1500 ::System::Reflection::ConstructorInfo ^ ctorDeploymentException =
1501 typeDeploymentExc->GetConstructor(arTypeCtor);
1503 Sequence<Reference<reflection::XServiceConstructorDescription> > seqCtors =
1504 xServiceType->getConstructors();
1506 ::System::Type ^ type_uno_exception =
get_type(
"unoidl.com.sun.star.uno.Exception",
true);
1508 for (
int i = seqCtors.getLength() - 1;
i >= 0;
i--)
1510 bool bParameterArray =
false;
1511 ::System::Type ^ typeAny = ::uno::Any::typeid;
1512 const Reference<reflection::XServiceConstructorDescription> & ctorDes =
1515 Sequence<Reference<reflection::XParameter> > seqParams =
1516 ctorDes->getParameters();
1517 Reference<reflection::XParameter>
const * arXParams = seqParams.getConstArray();
1518 sal_Int32 cParams = seqParams.getLength();
1519 array< ::System::Type^>^ arTypeParameters = gcnew array< ::System::Type^> (cParams + 1);
1520 arTypeParameters[0] =
get_type(
"unoidl.com.sun.star.uno.XComponentContext",
true);
1521 for (
int iparam = 0; iparam != cParams; iparam++)
1523 if (arXParams[iparam]->isRestParameter())
1524 arTypeParameters[iparam + 1] = array< ::uno::Any>::typeid;
1526 arTypeParameters[iparam + 1] =
get_type(arXParams[iparam]->
getType());
1535 array< ::System::Type^>^ arParamTypes = gcnew array< ::System::Type^> (cParams + 1);
1537 for (
int i = 0;
i < cParams + 1;
i++)
1543 arParamTypes[
i] = arTypeParameters[
i];
1546 System::String ^ ctorName;
1547 if (ctorDes->isDefaultConstructor())
1548 ctorName = gcnew ::System::String(
"create");
1551 Emit::MethodBuilder^ method_builder = type_builder->DefineMethod(
1553 static_cast<MethodAttributes
>(MethodAttributes::Public | MethodAttributes::HideBySig |
1554 MethodAttributes::Static),
1561 if (attrBuilder !=
nullptr)
1562 method_builder->SetCustomAttribute(attrBuilder);
1569 method_builder->DefineParameter(
1570 1, ParameterAttributes::In,
"the_context");
1572 array<Emit::ParameterBuilder^>^ arParameterBuilder =
1573 gcnew array<Emit::ParameterBuilder^> (cParams);
1574 for (
int iparam = 0; iparam != cParams; iparam++)
1576 Reference<reflection::XParameter>
const & aParam = arXParams[iparam];
1579 arParameterBuilder[iparam] = method_builder->DefineParameter(
1580 iparam + 2, ParameterAttributes::In, sParamName);
1582 if (aParam->isRestParameter())
1584 bParameterArray =
true;
1586 ::System::Reflection::ConstructorInfo^ ctor_info =
1587 System::ParamArrayAttribute::typeid->GetConstructor(
1588 gcnew array< ::System::Type^>(0));
1589 Emit::CustomAttributeBuilder ^ attr_builder =
1590 gcnew Emit::CustomAttributeBuilder(ctor_info, gcnew array< ::System::Object^>(0));
1591 arParameterBuilder[iparam]->SetCustomAttribute(attr_builder);
1596 Emit::ILGenerator ^ ilGen = method_builder->GetILGenerator();
1600 Emit::LocalBuilder^ local_factory =
1601 ilGen->DeclareLocal(
1602 get_type(
"unoidl.com.sun.star.lang.XMultiComponentFactory",
true));
1605 Emit::LocalBuilder^ local_return_val =
1606 ilGen->DeclareLocal(retType);
1609 ilGen->Emit(Emit::OpCodes::Ldarg_0);
1611 ::System::Reflection::MethodInfo ^ methodGetServiceManager =
get_type(
1612 "unoidl.com.sun.star.uno.XComponentContext",
true)
1613 ->GetMethod(
"getServiceManager");
1614 ilGen->Emit(Emit::OpCodes::Callvirt, methodGetServiceManager);
1615 ilGen->Emit(Emit::OpCodes::Stloc, local_factory);
1616 ilGen->Emit(Emit::OpCodes::Ldloc, local_factory);
1617 Emit::Label label1 = ilGen->DefineLabel();
1618 ilGen->Emit(Emit::OpCodes::Brtrue, label1);
1620 ::System::Text::StringBuilder ^ strbuilder = gcnew ::System::Text::StringBuilder(256);
1621 strbuilder->Append(
"The service ");
1622 strbuilder->Append(
to_cts_name(xServiceType->getName()));
1623 strbuilder->Append(
" could not be created. The context failed to supply the service manager.");
1625 ilGen->Emit(Emit::OpCodes::Ldstr, strbuilder->ToString());
1626 ilGen->Emit(Emit::OpCodes::Ldarg_0);
1627 ilGen->Emit(Emit::OpCodes::Newobj, ctorDeploymentException);
1628 ilGen->Emit(Emit::OpCodes::Throw);
1629 ilGen->MarkLabel(label1);
1641 ::System::Collections::ArrayList ^ arExceptionTypes =
1643 if (arExceptionTypes->Contains(
1644 type_uno_exception) ==
false)
1646 ilGen->BeginExceptionBlock();
1650 ilGen->Emit(Emit::OpCodes::Ldloc, local_factory);
1652 ilGen->Emit(Emit::OpCodes::Ldarg_0);
1654 ::System::Reflection::MethodInfo ^ methodCreate =
1655 local_factory->LocalType->GetMethod(
"createInstanceWithContext");
1656 ilGen->Emit(Emit::OpCodes::Callvirt, methodCreate);
1658 else if(bParameterArray)
1661 ilGen->Emit(Emit::OpCodes::Ldloc, local_factory);
1663 ilGen->Emit(Emit::OpCodes::Ldarg_1);
1664 ilGen->Emit(Emit::OpCodes::Ldarg_0);
1665 ::System::Reflection::MethodInfo ^ methodCreate =
1666 local_factory->LocalType->GetMethod(
"createInstanceWithArgumentsAndContext");
1667 ilGen->Emit(Emit::OpCodes::Callvirt, methodCreate);
1674 array<Emit::LocalBuilder^>^ arLocalAny = gcnew array<Emit::LocalBuilder^> (cParams);
1676 for (
int iParam = 0; iParam < cParams; iParam ++)
1678 arLocalAny[iParam] = ilGen->DeclareLocal(typeAny);
1683 Emit::LocalBuilder ^ local_anyParams =
1684 ilGen->DeclareLocal(array< ::uno::Any>::typeid);
1690 array< ::System::Type^>^ arTypesCtorAny = {::System::Type::typeid,
1691 ::System::Object::typeid};
1692 ::System::Reflection::ConstructorInfo ^ ctorAny =
1693 typeAny->GetConstructor( arTypesCtorAny);
1694 ::System::Reflection::MethodInfo ^ methodAnyGetType =
1695 typeAny->GetProperty(
"Type")->GetGetMethod();
1696 ::System::Reflection::MethodInfo ^ methodAnyGetValue =
1697 typeAny->GetProperty(
"Value")->GetGetMethod();
1698 for (
int i = 0;
i < arLocalAny->Length;
i ++)
1707 ilGen->Emit(Emit::OpCodes::Ldloca, arLocalAny[
i]);
1710 ilGen->Emit(Emit::OpCodes::Ldtoken, polyType->
OriginalType);
1711 array< ::System::Type^>^ arTypeParams = {::System::RuntimeTypeHandle::typeid};
1712 ilGen->Emit(Emit::OpCodes::Call,
1713 ::System::Type::typeid->GetMethod(
1714 "GetTypeFromHandle", arTypeParams));
1718 array< ::System::Type^>^ arTypeParam_GetType = {
1719 ::System::Type::typeid, ::System::String::typeid };
1720 ilGen->Emit(Emit::OpCodes::Call,
1721 ::uno::PolymorphicType::typeid->GetMethod(gcnew System::String(
"GetType"),
1722 arTypeParam_GetType));
1727 ilGen->Emit(Emit::OpCodes::Ldarg,
i + 1);
1730 if (arTypeParameters[
i+1]->IsValueType)
1731 ilGen->Emit(Emit::OpCodes::Box, arTypeParameters[
i+1]);
1732 ilGen->Emit(Emit::OpCodes::Call, ctorAny);
1734 else if (arTypeParameters[
i+1] == typeAny)
1739 ilGen->Emit(Emit::OpCodes::Ldloca, arLocalAny[
i]);
1741 ilGen->Emit(Emit::OpCodes::Ldarga,
i + 1);
1742 ilGen->Emit(Emit::OpCodes::Call, methodAnyGetType);
1744 ilGen->Emit(Emit::OpCodes::Ldarga,
i + 1);
1745 ilGen->Emit(Emit::OpCodes::Call, methodAnyGetValue);
1747 ilGen->Emit(Emit::OpCodes::Call, ctorAny);
1751 ilGen->Emit(Emit::OpCodes::Ldloca, arLocalAny[
i]);
1752 ilGen->Emit(Emit::OpCodes::Ldtoken, arTypeParameters[
i+1]);
1754 array< ::System::Type^>^ arTypeParams = {::System::RuntimeTypeHandle::typeid};
1755 ilGen->Emit(Emit::OpCodes::Call,
1756 ::System::Type::typeid->GetMethod(
1757 "GetTypeFromHandle", arTypeParams));
1758 ilGen->Emit(Emit::OpCodes::Ldarg,
i + 1);
1761 if (arTypeParameters[
i+1]->IsValueType)
1762 ilGen->Emit(Emit::OpCodes::Box, arTypeParameters[
i+1]);
1763 ilGen->Emit(Emit::OpCodes::Call, ctorAny);
1769 ilGen->Emit(Emit::OpCodes::Ldc_I4, arLocalAny->Length);
1770 ilGen->Emit(Emit::OpCodes::Newarr, typeAny);
1771 ilGen->Emit(Emit::OpCodes::Stloc, local_anyParams);
1775 for (
int i = 0;
i < arLocalAny->Length;
i++)
1777 ilGen->Emit(Emit::OpCodes::Ldloc, local_anyParams);
1778 ilGen->Emit(Emit::OpCodes::Ldc_I4,
i);
1779 ilGen->Emit(Emit::OpCodes::Ldelema, typeAny);
1780 ilGen->Emit(Emit::OpCodes::Ldloc, arLocalAny[
i]);
1781 ilGen->Emit(Emit::OpCodes::Stobj, typeAny);
1784 ilGen->Emit(Emit::OpCodes::Ldloc, local_factory);
1786 ilGen->Emit(Emit::OpCodes::Ldloc, local_anyParams);
1787 ilGen->Emit(Emit::OpCodes::Ldarg_0);
1788 ::System::Reflection::MethodInfo ^ methodCreate =
1789 local_factory->LocalType->GetMethod(
"createInstanceWithArgumentsAndContext");
1790 ilGen->Emit(Emit::OpCodes::Callvirt, methodCreate);
1794 ilGen->Emit(Emit::OpCodes::Castclass, retType);
1795 ilGen->Emit(Emit::OpCodes::Stloc, local_return_val);
1798 if (arExceptionTypes->Contains(type_uno_exception) ==
false)
1801 ilGen->BeginCatchBlock(
get_type(
"unoidl.com.sun.star.uno.RuntimeException",
true));
1802 ilGen->Emit(Emit::OpCodes::Pop);
1803 ilGen->Emit(Emit::OpCodes::Rethrow);
1806 for (
int i = 0;
i < arExceptionTypes->Count;
i++)
1808 ::System::Type ^ excType = safe_cast< ::System::Type^ >(
1809 arExceptionTypes[
i]);
1810 if (excType->IsInstanceOfType(
1811 get_type(
"unoidl.com.sun.star.uno.RuntimeException",
true)))
1817 ilGen->BeginCatchBlock(excType);
1818 ilGen->Emit(Emit::OpCodes::Pop);
1819 ilGen->Emit(Emit::OpCodes::Rethrow);
1822 ilGen->BeginCatchBlock(type_uno_exception);
1825 Emit::LocalBuilder ^ local_exception = ilGen->DeclareLocal(
1826 type_uno_exception);
1829 ilGen->Emit(Emit::OpCodes::Stloc, local_exception);
1832 strbuilder = gcnew ::System::Text::StringBuilder(256);
1833 strbuilder->Append(
"The context (com.sun.star.uno.XComponentContext) failed to supply the service ");
1834 strbuilder->Append(
to_cts_name(xServiceType->getName()));
1835 strbuilder->Append(
": ");
1837 ilGen->Emit(Emit::OpCodes::Ldstr, strbuilder->ToString());
1840 ilGen->Emit(Emit::OpCodes::Ldloc, local_exception);
1841 ilGen->Emit(Emit::OpCodes::Callvirt,
1842 type_uno_exception->GetProperty(
"Message")->GetGetMethod());
1843 array< ::System::Type^>^ arConcatParams = {System::String::typeid,
1844 System::String::typeid};
1845 ilGen->Emit(Emit::OpCodes::Call,
1846 System::String::typeid->GetMethod(
"Concat", arConcatParams));
1848 ilGen->Emit(Emit::OpCodes::Ldarg_0);
1849 ilGen->Emit(Emit::OpCodes::Newobj, ctorDeploymentException);
1850 ilGen->Emit(Emit::OpCodes::Throw);
1852 ilGen->EndExceptionBlock();
1857 Emit::Label label_service_created = ilGen->DefineLabel();
1858 ilGen->Emit(Emit::OpCodes::Ldloc, local_return_val);
1859 ilGen->Emit(Emit::OpCodes::Brtrue_S, label_service_created);
1861 strbuilder = gcnew ::System::Text::StringBuilder(256);
1862 strbuilder->Append(
"The context (com.sun.star.uno.XComponentContext) failed to supply the service ");
1863 strbuilder->Append(
to_cts_name(xServiceType->getName()));
1864 strbuilder->Append(
".");
1865 ilGen->Emit(Emit::OpCodes::Ldstr, strbuilder->ToString());
1866 ilGen->Emit(Emit::OpCodes::Ldarg_0);
1867 ilGen->Emit(Emit::OpCodes::Newobj, ctorDeploymentException);
1868 ilGen->Emit(Emit::OpCodes::Throw);
1870 ilGen->MarkLabel(label_service_created);
1871 ilGen->Emit(Emit::OpCodes::Ldloc, local_return_val);
1872 ilGen->Emit(Emit::OpCodes::Ret);
1876 ::System::String ^ cts_name = type_builder->FullName;
1878 xServiceType->release();
1881 ::System::Console::WriteLine(
1882 "> emitting service type {0}", cts_name );
1884 return type_builder->CreateType();
1889 const Reference<reflection::XServiceConstructorDescription> & ctorDes )
1895 const Reference< reflection::XInterfaceMethodTypeDescription >& xMethod )
1898 const Sequence<Reference<reflection::XTypeDescription> > seqTD =
xMethod->getExceptions();
1899 int len = seqTD.getLength();
1900 Sequence<Reference<reflection::XCompoundTypeDescription> > seqCTD(len);
1901 Reference<reflection::XCompoundTypeDescription> * arCTD = seqCTD.getArray();
1902 for (
int i = 0;
i < len;
i++)
1903 arCTD[
i] = Reference<reflection::XCompoundTypeDescription>(seqTD[
i], UNO_QUERY_THROW);
1909 const Sequence<Reference< reflection::XCompoundTypeDescription > >& seq_exceptionsTd )
1911 Emit::CustomAttributeBuilder ^ attr_builder =
nullptr;
1913 Reference< reflection::XCompoundTypeDescription >
const * exceptions =
1914 seq_exceptionsTd.getConstArray();
1916 array< ::System::Type^>^ arTypesCtor = {::System::Type::GetType(
"System.Type[]")};
1917 ConstructorInfo ^ ctor_ExceptionAttribute =
1918 ::uno::ExceptionAttribute::typeid->GetConstructor(arTypesCtor);
1920 sal_Int32 exc_length = seq_exceptionsTd.getLength();
1921 if (exc_length != 0)
1923 array< ::System::Type^>^ exception_types =
1924 gcnew array< ::System::Type^> ( exc_length );
1925 for ( sal_Int32 exc_pos = 0; exc_pos < exc_length; ++exc_pos )
1927 Reference< reflection::XCompoundTypeDescription >
const & xExc =
1928 exceptions[ exc_pos ];
1929 exception_types[ exc_pos ] =
get_type( xExc );
1931 array< ::System::Object^>^
args = {exception_types};
1932 attr_builder = gcnew Emit::CustomAttributeBuilder(
1933 ctor_ExceptionAttribute,
args );
1935 return attr_builder;
1942 reflection::XSingletonTypeDescription2 * xSingletonType = entry->
m_xType;
1943 ::System::String^ sSingletonName =
to_cts_name(xSingletonType->getName());
1946 Emit::ConstructorBuilder^ ctor_builder =
1947 type_builder->DefineConstructor(
1948 static_cast<MethodAttributes
>(MethodAttributes::Private |
1949 MethodAttributes::HideBySig |
1950 MethodAttributes::SpecialName |
1951 MethodAttributes::RTSpecialName),
1952 CallingConventions::Standard,
nullptr);
1954 Emit::ILGenerator^ ilGen = ctor_builder->GetILGenerator();
1955 ilGen->Emit( Emit::OpCodes::Ldarg_0 );
1957 Emit::OpCodes::Call,
1958 type_builder->BaseType->GetConstructor(gcnew array< ::System::Type^>(0)));
1959 ilGen->Emit( Emit::OpCodes::Ret );
1964 Reference<reflection::XInterfaceTypeDescription2> xIfaceType(
1965 xSingletonType->getInterface(), UNO_QUERY);
1968 System::Type ^ retType =
get_type(xIfaceType);
1971 array< ::System::Type^>^ arTypeParameters = {
get_type(
"unoidl.com.sun.star.uno.XComponentContext",
true)};
1972 Emit::MethodBuilder^ method_builder = type_builder->DefineMethod(
1973 gcnew System::String(
"get"),
1974 static_cast<MethodAttributes
>(MethodAttributes::Public | MethodAttributes::HideBySig |
1975 MethodAttributes::Static),
1985 method_builder->DefineParameter(1, ParameterAttributes::In,
"the_context");
1988 ilGen = method_builder->GetILGenerator();
1991 Emit::LocalBuilder^ local_any =
1992 ilGen->DeclareLocal(::uno::Any::typeid);
1995 ilGen->Emit(Emit::OpCodes::Ldarg_0);
1997 ::System::Text::StringBuilder^ sBuilder =
1998 gcnew ::System::Text::StringBuilder(
"/singletons/");
1999 sBuilder->Append(sSingletonName);
2000 ilGen->Emit(Emit::OpCodes::Ldstr, sBuilder->ToString());
2002 ::System::Reflection::MethodInfo ^ methodGetValueByName =
2003 get_type(
"unoidl.com.sun.star.uno.XComponentContext",
true)->GetMethod(
"getValueByName");
2004 ilGen->Emit(Emit::OpCodes::Callvirt, methodGetValueByName);
2005 ilGen->Emit(Emit::OpCodes::Stloc_0);
2008 ilGen->Emit(Emit::OpCodes::Ldloca_S, local_any);
2009 ::System::Reflection::MethodInfo ^ methodHasValue =
2010 ::uno::Any::typeid->GetMethod(
"hasValue");
2011 ilGen->Emit(Emit::OpCodes::Call, methodHasValue);
2014 Emit::Label label_singleton_exists = ilGen->DefineLabel();
2015 ilGen->Emit(Emit::OpCodes::Brtrue_S, label_singleton_exists);
2016 sBuilder = gcnew ::System::Text::StringBuilder(
2017 "Component context fails to supply singleton ");
2018 sBuilder->Append(sSingletonName);
2019 sBuilder->Append(
" of type ");
2020 sBuilder->Append(retType->FullName);
2021 sBuilder->Append(
".");
2022 ilGen->Emit(Emit::OpCodes::Ldstr, sBuilder->ToString());
2023 ilGen->Emit(Emit::OpCodes::Ldarg_0);
2024 array< ::System::Type^>^ arTypesCtorDeploymentException = {
2025 ::System::String::typeid, ::System::Object::typeid};
2026 ilGen->Emit(Emit::OpCodes::Newobj,
2027 get_type(
"unoidl.com.sun.star.uno.DeploymentException",
true)
2028 ->GetConstructor(arTypesCtorDeploymentException));
2029 ilGen->Emit(Emit::OpCodes::Throw);
2030 ilGen->MarkLabel(label_singleton_exists);
2033 ilGen->Emit(Emit::OpCodes::Ldloca_S, local_any);
2034 ilGen->Emit(Emit::OpCodes::Call, ::uno::Any::typeid->
GetProperty(
"Value")->GetGetMethod());
2035 ilGen->Emit(Emit::OpCodes::Castclass, retType);
2036 ilGen->Emit(Emit::OpCodes::Ret);
2039 ::System::String ^ cts_name = type_builder->FullName;
2041 xSingletonType->release();
2044 ::System::Console::WriteLine(
2045 "> emitting singleton type {0}", cts_name );
2047 return type_builder->CreateType();
2052 Reference< reflection::XTypeDescription >
const & xType )
2054 switch (xType->getTypeClass())
2056 case TypeClass_VOID:
2057 return ::System::Void::typeid;
2058 case TypeClass_CHAR:
2059 return ::System::Char::typeid;
2060 case TypeClass_BOOLEAN:
2061 return ::System::Boolean::typeid;
2062 case TypeClass_BYTE:
2063 return ::System::Byte::typeid;
2064 case TypeClass_SHORT:
2065 return ::System::Int16::typeid;
2066 case TypeClass_UNSIGNED_SHORT:
2067 return ::System::UInt16::typeid;
2068 case TypeClass_LONG:
2069 return ::System::Int32::typeid;
2070 case TypeClass_UNSIGNED_LONG:
2071 return ::System::UInt32::typeid;
2072 case TypeClass_HYPER:
2073 return ::System::Int64::typeid;
2074 case TypeClass_UNSIGNED_HYPER:
2075 return ::System::UInt64::typeid;
2076 case TypeClass_FLOAT:
2077 return ::System::Single::typeid;
2078 case TypeClass_DOUBLE:
2079 return ::System::Double::typeid;
2080 case TypeClass_STRING:
2081 return ::System::String::typeid;
2082 case TypeClass_TYPE:
2083 return ::System::Type::typeid;
2085 return ::uno::Any::typeid;
2086 case TypeClass_ENUM:
2087 return get_type( Reference< reflection::XEnumTypeDescription >(
2088 xType, UNO_QUERY_THROW ) );
2089 case TypeClass_TYPEDEF:
2092 Reference< reflection::XIndirectTypeDescription >(
2093 xType, UNO_QUERY_THROW )->getReferencedType() );
2094 case TypeClass_STRUCT:
2095 case TypeClass_EXCEPTION:
2097 Reference< reflection::XCompoundTypeDescription >(
2098 xType, UNO_QUERY_THROW ) );
2099 case TypeClass_SEQUENCE:
2101 ::System::Type ^ element_type =
get_type(
2102 Reference< reflection::XIndirectTypeDescription >(
2103 xType, UNO_QUERY_THROW )->getReferencedType() );
2104 ::System::Type ^ retType =
get_type(
2105 ::System::String::Concat(
2106 element_type->FullName,
"[]" ),
true );
2111 ::System::String ^
sName = ::System::String::Concat(
pt->PolymorphicName,
"[]");
2116 case TypeClass_INTERFACE:
2118 Reference< reflection::XInterfaceTypeDescription2 >(
2119 xType, UNO_QUERY_THROW ) );
2120 case TypeClass_CONSTANT:
2122 Reference< reflection::XConstantTypeDescription >(
2123 xType, UNO_QUERY_THROW ) );
2124 case TypeClass_CONSTANTS:
2126 Reference< reflection::XConstantsTypeDescription >(
2127 xType, UNO_QUERY_THROW ) );
2128 case TypeClass_SERVICE:
2130 Reference< reflection::XServiceTypeDescription2 >(
2131 xType, UNO_QUERY_THROW) );
2132 case TypeClass_SINGLETON:
2134 Reference< reflection::XSingletonTypeDescription2 >(
2135 xType, UNO_QUERY_THROW) );
2136 case TypeClass_MODULE:
2141 "unexpected type " + xType->getName() );
2161 ::System::Collections::IDictionaryEnumerator ^ enumerator =
2163 if (! enumerator->MoveNext())
2166 safe_cast< iface_entry ^ >( enumerator->Value ) );
2171 ::System::Collections::IDictionaryEnumerator ^ enumerator =
2173 if (! enumerator->MoveNext())
2176 safe_cast< struct_entry ^ >( enumerator->Value ) );
2182 ::System::Collections::IDictionaryEnumerator ^ enumerator =
2184 if (! enumerator->MoveNext())
2187 safe_cast< service_entry ^ >( enumerator->Value ) );
2192 ::System::Collections::IDictionaryEnumerator ^ enumerator =
2194 if (! enumerator->MoveNext())
2197 safe_cast< singleton_entry ^ >( enumerator->Value ) );
2202 ::System::Reflection::Emit::ModuleBuilder ^ module_builder,
2203 array< ::System::Reflection::Assembly^>^ extra_assemblies )
2204 : m_module_builder( module_builder ),
2205 m_extra_assemblies( extra_assemblies ),
2206 m_method_info_Type_GetTypeFromHandle( nullptr ),
2207 m_type_Exception( nullptr ),
2208 m_type_RuntimeException( nullptr ),
2215 array< ::System::Type^>^ param_types = gcnew array< ::System::Type^> ( 1 );
2216 param_types[ 0 ] = ::System::RuntimeTypeHandle::typeid;
2218 ::System::Type::typeid
2219 ->GetMethod(
"GetTypeFromHandle", param_types );
2223 const Sequence<Reference<reflection::XCompoundTypeDescription> > & seqExceptionsTd)
2225 if (seqExceptionsTd.getLength() == 0)
2226 return gcnew ::System::Collections::ArrayList();
2228 ::System::Collections::ArrayList ^ arTypes = gcnew ::System::Collections::ArrayList();
2229 for (
int i = 0;
i < seqExceptionsTd.getLength();
i++)
2235 bool bRemove =
false;
2236 for (
int i =
start;
i < arTypes->Count;
i++)
2238 ::System::Type ^
t = safe_cast< ::System::Type^ >(arTypes[
i]);
2239 for (
int j = 0; j < arTypes->Count; j++)
2241 if (
t->IsSubclassOf(safe_cast< ::System::Type^ >(arTypes[j])))
2243 arTypes->RemoveAt(
i);
2253 if (bRemove ==
false)
2260css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >
2262 const css::uno::Reference<css::reflection::XTypeDescription>& type)
2264 Reference<reflection::XInterfaceTypeDescription2>
2265 xIfaceTd(
type, UNO_QUERY);
2270 Reference<reflection::XIndirectTypeDescription> xIndTd(
2271 type, UNO_QUERY_THROW);
std::unordered_map< std::string, LinkedList > Hashtable
css::reflection::XInterfaceTypeDescription2 * m_xType
::System::Reflection::Emit::TypeBuilder m_type_builder
css::reflection::XServiceTypeDescription2 * m_xType
::System::Reflection::Emit::TypeBuilder m_type_builder
::System::Reflection::Emit::TypeBuilder m_type_builder
css::reflection::XSingletonTypeDescription2 * m_xType
array< ::System::String^> m_member_names
::System::Type m_base_type
array< ::System::Type^> m_param_types
css::reflection::XCompoundTypeDescription * m_xType
::System::Reflection::Emit::TypeBuilder m_type_builder
::System::Reflection::ConstructorInfo m_ctor
::System::Reflection::ConstructorInfo m_default_ctor
::System::Collections::Hashtable m_generated_structs
TypeEmitter(::System::Reflection::Emit::ModuleBuilder ^ module_builder, array< ::System::Reflection::Assembly^>^ assemblies)
::System::Collections::Hashtable m_incomplete_ifaces
::System::Collections::Hashtable m_incomplete_structs
::System::Reflection::Assembly type_resolve(::System::Object ^ sender, ::System::ResolveEventArgs ^ args)
::System::Type get_type(::System::String ^ cli_name, bool throw_exc)
::System::Reflection::Emit::CustomAttributeBuilder get_exception_attribute(const css::uno::Sequence< css::uno::Reference< css::reflection::XCompoundTypeDescription > > &seq_exceptionsTd)
::System::Type get_type_RuntimeException()
::System::Reflection::Emit::CustomAttributeBuilder get_iface_method_exception_attribute(const css::uno::Reference< css::reflection::XInterfaceMethodTypeDescription > &xMethod)
::System::Reflection::Emit::ModuleBuilder m_module_builder
::System::Type get_type_Exception()
::System::Reflection::Emit::CustomAttributeBuilder get_service_exception_attribute(const css::uno::Reference< css::reflection::XServiceConstructorDescription > &ctorDesc)
::System::Collections::Hashtable m_incomplete_singletons
::System::Reflection::MethodInfo m_method_info_Type_GetTypeFromHandle
::System::Type complete_singleton_type(singleton_entry ^ entry)
::System::Collections::Hashtable m_incomplete_services
array< ::System::Reflection::Assembly^> m_extra_assemblies
::System::Collections::ArrayList get_service_ctor_method_exceptions_reduced(const css::uno::Sequence< css::uno::Reference< css::reflection::XCompoundTypeDescription > > &seqExceptionsTd)
::System::Type m_type_RuntimeException
::System::Type complete_struct_type(struct_entry ^ entry)
::System::Type m_type_Exception
::System::Type complete_iface_type(iface_entry ^ entry)
::System::Type get_complete_struct(::System::String ^ sName)
::System::Type complete_service_type(service_entry ^ entry)
represents a polymorphic type.
static PolymorphicType GetType(Type type, string name)
provides a unique instance of this class.
static inline ::System::Object to_cli_constant(Any const &value)
static inline ::System::String to_cts_name(OUString const &uno_name)
::System::Reflection::MethodAttributes c_ctor_method_attr
inline ::System::String ustring_to_String(OUString const &ustr)
System::String mapUnoTypeName(System::String ^ typeName)
void polymorphicStructNameToStructName(::System::String ^ *sPolyName)
System::String mapUnoPolymorphicName(System::String^ unoName)
For example, there is a uno type com.sun.star.Foo<char, long>.
css::uno::Reference< css::reflection::XInterfaceTypeDescription2 > resolveInterfaceTypedef(const css::uno::Reference< css::reflection::XTypeDescription > &type)
static void emit_ldarg(Emit::ILGenerator ^ code, ::System::Int32 index)
PyRef getTypeClass(const Runtime &)
UNOTOOLS_DLLPUBLIC css::uno::Any GetProperty(OUString const &url, OUString const &property)
bool getType(BSTR name, Type &type)
PyObject_HEAD PyUNO_callable_Internals * members
::System::String sUnoVoid
static System::String sByte
::System::String sUnoHyper
static System::String sType
static System::String sUInt16
static System::String sVoid
::System::String sUnoDouble
static System::String sAny
static System::String sUInt32
static System::String sSingle
static System::String sUInt64
::System::String sUnoShort
::System::String sUnoBool
static System::String sChar
::System::String sUnoULong
::System::String sUnoChar
static System::String sInt16
static System::String sBoolean
::System::String sUnoLong
::System::String sUnoString
static System::String sString
::System::String sUnoByte
static System::String sInt64
static System::String sObject
::System::String sUnoType
static System::String sInt32
static System::String sDouble
static System::String sUnoidl
::System::String sUnoXInterface
::System::String sBrackets
::System::String sUnoUShort
::System::String sUnoFloat
::System::String sUnoUHyper