23#include <com/sun/star/container/NoSuchElementException.hpp>
24#include <com/sun/star/lang/IllegalArgumentException.hpp>
25#include <com/sun/star/reflection/NoSuchTypeNameException.hpp>
26#include <com/sun/star/reflection/TypeDescriptionSearchDepth.hpp>
27#include <com/sun/star/reflection/XConstantTypeDescription.hpp>
28#include <com/sun/star/reflection/XConstantsTypeDescription.hpp>
29#include <com/sun/star/reflection/XEnumTypeDescription.hpp>
30#include <com/sun/star/reflection/XIndirectTypeDescription.hpp>
31#include <com/sun/star/reflection/XInterfaceAttributeTypeDescription2.hpp>
32#include <com/sun/star/reflection/XInterfaceMethodTypeDescription.hpp>
33#include <com/sun/star/reflection/XInterfaceTypeDescription2.hpp>
34#include <com/sun/star/reflection/XModuleTypeDescription.hpp>
35#include <com/sun/star/reflection/XPublished.hpp>
36#include <com/sun/star/reflection/XServiceTypeDescription2.hpp>
37#include <com/sun/star/reflection/XSingletonTypeDescription2.hpp>
38#include <com/sun/star/reflection/XStructTypeDescription.hpp>
39#include <com/sun/star/reflection/XTypeDescription.hpp>
40#include <com/sun/star/uno/Any.hxx>
41#include <com/sun/star/uno/DeploymentException.hpp>
42#include <com/sun/star/uno/Reference.hxx>
43#include <com/sun/star/uno/RuntimeException.hpp>
44#include <com/sun/star/uno/Sequence.hxx>
45#include <com/sun/star/uno/Type.hxx>
46#include <com/sun/star/uno/TypeClass.hpp>
50#include <osl/file.hxx>
52#include <rtl/ustring.hxx>
65OUString makePrefix(OUString
const & name) {
69css::uno::Any resolveTypedefs(css::uno::Any
const & type) {
70 for (css::uno::Any
t(type);;) {
71 css::uno::Reference< css::reflection::XIndirectTypeDescription > ind(
72 type, css::uno::UNO_QUERY);
73 if (!ind.is() || ind->getTypeClass() != css::uno::TypeClass_TYPEDEF) {
76 t <<= ind->getReferencedType();
80class SimpleTypeDescription:
81 public cppu::WeakImplHelper< css::reflection::XTypeDescription >
84 SimpleTypeDescription(
85 css::uno::TypeClass typeClass, OUString name):
90 virtual ~SimpleTypeDescription()
override {}
92 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
93 {
return typeClass_; }
95 virtual OUString SAL_CALL getName()
override
98 css::uno::TypeClass typeClass_;
102class SequenceTypeDescription:
103 public cppu::WeakImplHelper< css::reflection::XIndirectTypeDescription >
106 SequenceTypeDescription(
108 OUString name, OUString componentType):
113 virtual ~SequenceTypeDescription()
override {}
115 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
116 {
return css::uno::TypeClass_SEQUENCE; }
118 virtual OUString SAL_CALL getName()
override
121 virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
122 getReferencedType()
override
123 {
return manager_->resolve(componentType_); }
127 OUString componentType_;
130class PublishableDescription:
131 public cppu::WeakImplHelper< css::reflection::XPublished >
134 explicit PublishableDescription(
bool published): published_(published) {}
136 virtual ~PublishableDescription()
override {}
139 virtual sal_Bool SAL_CALL isPublished()
override
140 {
return published_; }
145class ModuleDescription:
146 public cppu::WeakImplHelper< css::reflection::XModuleTypeDescription >
154 { assert(
manager.is()); assert(entity.is()); }
157 virtual ~ModuleDescription()
override {}
159 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
160 {
return css::uno::TypeClass_MODULE; }
162 virtual OUString SAL_CALL getName()
override
167 css::uno::Reference< css::reflection::XTypeDescription > >
168 SAL_CALL getMembers()
override;
175css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
176ModuleDescription::getMembers() {
178 std::vector< OUString > names(entity_->getMemberNames());
179 assert(names.size() <= SAL_MAX_INT32);
180 sal_Int32
n =
static_cast< sal_Int32
>(names.size());
182 css::uno::Reference< css::reflection::XTypeDescription > > s(n);
183 auto r = asNonConstRange(s);
184 for (sal_Int32 i = 0;
i !=
n; ++
i) {
185 r[
i] =
manager_->resolve(makePrefix(name_) + names[i]);
189 throw css::uno::DeploymentException(
195typedef cppu::ImplInheritanceHelper<
196 PublishableDescription, css::reflection::XEnumTypeDescription >
197EnumTypeDescription_Base;
199class EnumTypeDescription:
public EnumTypeDescription_Base {
204 EnumTypeDescription_Base(entity->isPublished()),
name_(
std::move(
name)),
206 { assert(entity.is()); }
209 virtual ~EnumTypeDescription()
override {}
211 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
212 {
return css::uno::TypeClass_ENUM; }
214 virtual OUString SAL_CALL getName()
override
217 virtual sal_Int32 SAL_CALL getDefaultEnumValue()
override
218 {
return entity_->getMembers()[0].value; }
220 virtual css::uno::Sequence< OUString > SAL_CALL getEnumNames()
override;
222 virtual css::uno::Sequence< sal_Int32 > SAL_CALL getEnumValues()
override;
228css::uno::Sequence< OUString > EnumTypeDescription::getEnumNames()
230 assert(entity_->getMembers().size() <= SAL_MAX_INT32);
231 sal_Int32
n =
static_cast< sal_Int32
>(entity_->getMembers().size());
232 css::uno::Sequence< OUString > s(n);
233 auto r = asNonConstRange(s);
234 for (sal_Int32 i = 0;
i !=
n; ++
i) {
235 r[
i] = entity_->getMembers()[
i].name;
240css::uno::Sequence< sal_Int32 > EnumTypeDescription::getEnumValues()
242 assert(entity_->getMembers().size() <= SAL_MAX_INT32);
243 sal_Int32
n =
static_cast< sal_Int32
>(entity_->getMembers().size());
244 css::uno::Sequence< sal_Int32 > s(n);
245 auto r = asNonConstRange(s);
246 for (sal_Int32 i = 0;
i !=
n; ++
i) {
247 r[
i] = entity_->getMembers()[
i].value;
252typedef cppu::ImplInheritanceHelper<
253 PublishableDescription, css::reflection::XStructTypeDescription >
254PlainStructTypeDescription_Base;
256class PlainStructTypeDescription:
public PlainStructTypeDescription_Base {
258 PlainStructTypeDescription(
262 PlainStructTypeDescription_Base(entity->isPublished()),
264 { assert(
manager.is()); assert(entity.is()); }
267 virtual ~PlainStructTypeDescription()
override {}
269 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
270 {
return css::uno::TypeClass_STRUCT; }
272 virtual OUString SAL_CALL getName()
override
275 virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
276 getBaseType()
override {
277 return entity_->getDirectBase().isEmpty()
278 ? css::uno::Reference< css::reflection::XTypeDescription >()
279 :
manager_->resolve(entity_->getDirectBase());
284 css::uno::Reference< css::reflection::XTypeDescription > >
285 SAL_CALL getMemberTypes()
override;
287 virtual css::uno::Sequence< OUString > SAL_CALL getMemberNames()
override;
289 virtual css::uno::Sequence< OUString > SAL_CALL getTypeParameters()
override
290 {
return css::uno::Sequence< OUString >(); }
294 css::uno::Reference< css::reflection::XTypeDescription > >
295 SAL_CALL getTypeArguments()
override {
296 return css::uno::Sequence<
297 css::uno::Reference< css::reflection::XTypeDescription > >();
305css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
306PlainStructTypeDescription::getMemberTypes()
308 assert(entity_->getDirectMembers().size() <= SAL_MAX_INT32);
309 sal_Int32
n =
static_cast< sal_Int32
>(entity_->getDirectMembers().size());
311 css::uno::Reference< css::reflection::XTypeDescription > > s(n);
312 auto r = asNonConstRange(s);
313 for (sal_Int32 i = 0;
i !=
n; ++
i) {
314 r[
i] =
manager_->resolve(entity_->getDirectMembers()[i].type);
319css::uno::Sequence< OUString > PlainStructTypeDescription::getMemberNames()
321 assert(entity_->getDirectMembers().size() <= SAL_MAX_INT32);
322 sal_Int32
n =
static_cast< sal_Int32
>(entity_->getDirectMembers().size());
323 css::uno::Sequence< OUString > s(n);
324 auto r = asNonConstRange(s);
325 for (sal_Int32 i = 0;
i !=
n; ++
i) {
326 r[
i] = entity_->getDirectMembers()[
i].name;
331class ParameterizedMemberTypeDescription:
332 public cppu::WeakImplHelper< css::reflection::XTypeDescription >
335 explicit ParameterizedMemberTypeDescription(
336 OUString typeParameterName):
337 typeParameterName_(
std::move(typeParameterName))
341 virtual ~ParameterizedMemberTypeDescription()
override {}
343 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
344 {
return css::uno::TypeClass_UNKNOWN; }
346 virtual OUString SAL_CALL getName()
override
347 {
return typeParameterName_; }
349 OUString typeParameterName_;
352typedef cppu::ImplInheritanceHelper<
353 PublishableDescription, css::reflection::XStructTypeDescription >
354PolymorphicStructTypeTemplateDescription_Base;
356class PolymorphicStructTypeTemplateDescription:
357 public PolymorphicStructTypeTemplateDescription_Base
360 PolymorphicStructTypeTemplateDescription(
365 PolymorphicStructTypeTemplateDescription_Base(entity->isPublished()),
367 { assert(
manager.is()); assert(entity.is()); }
370 virtual ~PolymorphicStructTypeTemplateDescription()
override {}
372 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
373 {
return css::uno::TypeClass_STRUCT; }
375 virtual OUString SAL_CALL getName()
override
378 virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
379 getBaseType()
override
380 {
return css::uno::Reference< css::reflection::XTypeDescription >(); }
384 css::uno::Reference< css::reflection::XTypeDescription > >
385 SAL_CALL getMemberTypes()
override;
387 virtual css::uno::Sequence< OUString > SAL_CALL getMemberNames()
override;
389 virtual css::uno::Sequence< OUString > SAL_CALL getTypeParameters()
override;
393 css::uno::Reference< css::reflection::XTypeDescription > >
394 SAL_CALL getTypeArguments()
override {
395 return css::uno::Sequence<
396 css::uno::Reference< css::reflection::XTypeDescription > >();
404css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
405PolymorphicStructTypeTemplateDescription::getMemberTypes()
407 assert(entity_->getMembers().size() <= SAL_MAX_INT32);
408 sal_Int32
n =
static_cast< sal_Int32
>(entity_->getMembers().size());
410 css::uno::Reference< css::reflection::XTypeDescription > > s(n);
411 auto r = asNonConstRange(s);
412 for (sal_Int32 i = 0;
i !=
n; ++
i) {
413 r[
i] = entity_->getMembers()[
i].parameterized
414 ?
new ParameterizedMemberTypeDescription(
415 entity_->getMembers()[i].type)
421css::uno::Sequence< OUString >
422PolymorphicStructTypeTemplateDescription::getMemberNames()
424 assert(entity_->getMembers().size() <= SAL_MAX_INT32);
425 sal_Int32
n =
static_cast< sal_Int32
>(entity_->getMembers().size());
426 css::uno::Sequence< OUString > s(n);
427 auto r = asNonConstRange(s);
428 for (sal_Int32 i = 0;
i !=
n; ++
i) {
429 r[
i] = entity_->getMembers()[
i].name;
434css::uno::Sequence< OUString >
435PolymorphicStructTypeTemplateDescription::getTypeParameters()
437 assert(entity_->getTypeParameters().size() <= SAL_MAX_INT32);
438 sal_Int32
n =
static_cast< sal_Int32
>(entity_->getTypeParameters().size());
439 css::uno::Sequence< OUString > s(n);
440 auto r = asNonConstRange(s);
441 for (sal_Int32 i = 0;
i !=
n; ++
i) {
442 r[
i] = entity_->getTypeParameters()[
i];
447class InstantiatedPolymorphicStructTypeDescription:
448 public cppu::WeakImplHelper< css::reflection::XStructTypeDescription >
451 InstantiatedPolymorphicStructTypeDescription(
456 std::vector< OUString >&& arguments):
461 assert(arguments_.size() == entity->getTypeParameters().size());
465 virtual ~InstantiatedPolymorphicStructTypeDescription()
override {}
467 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
468 {
return css::uno::TypeClass_STRUCT; }
470 virtual OUString SAL_CALL getName()
override
473 virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
474 getBaseType()
override
475 {
return css::uno::Reference< css::reflection::XTypeDescription >(); }
479 css::uno::Reference< css::reflection::XTypeDescription > >
480 SAL_CALL getMemberTypes()
override;
482 virtual css::uno::Sequence< OUString > SAL_CALL getMemberNames()
override;
484 virtual css::uno::Sequence< OUString > SAL_CALL getTypeParameters()
override
485 {
return css::uno::Sequence< OUString >(); }
489 css::uno::Reference< css::reflection::XTypeDescription > >
490 SAL_CALL getTypeArguments()
override;
495 std::vector< OUString > arguments_;
498css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
499InstantiatedPolymorphicStructTypeDescription::getMemberTypes()
501 assert(entity_->getMembers().size() <= SAL_MAX_INT32);
502 sal_Int32
n =
static_cast< sal_Int32
>(entity_->getMembers().size());
504 css::uno::Reference< css::reflection::XTypeDescription > > s(n);
505 auto r = asNonConstRange(s);
506 for (sal_Int32 i = 0;
i !=
n; ++
i) {
507 OUString
type(entity_->getMembers()[i].type);
508 if (entity_->getMembers()[i].parameterized) {
509 auto j = std::find(entity_->getTypeParameters().begin(), entity_->getTypeParameters().end(), type);
510 if (j != entity_->getTypeParameters().end()) {
511 type = arguments_[j - entity_->getTypeParameters().begin()];
522css::uno::Sequence< OUString >
523InstantiatedPolymorphicStructTypeDescription::getMemberNames()
525 assert(entity_->getMembers().size() <= SAL_MAX_INT32);
526 sal_Int32
n =
static_cast< sal_Int32
>(entity_->getMembers().size());
527 css::uno::Sequence< OUString > s(n);
528 auto r = asNonConstRange(s);
529 for (sal_Int32 i = 0;
i !=
n; ++
i) {
530 r[
i] = entity_->getMembers()[
i].name;
534css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
535InstantiatedPolymorphicStructTypeDescription::getTypeArguments()
537 assert(arguments_.size() <= SAL_MAX_INT32);
538 sal_Int32
n =
static_cast< sal_Int32
>(arguments_.size());
540 css::uno::Reference< css::reflection::XTypeDescription > > s(n);
541 auto r = asNonConstRange(s);
542 for (sal_Int32 i = 0;
i !=
n; ++
i) {
548typedef cppu::ImplInheritanceHelper<
549 PublishableDescription, css::reflection::XCompoundTypeDescription >
550ExceptionTypeDescription_Base;
552class ExceptionTypeDescription:
public ExceptionTypeDescription_Base {
554 ExceptionTypeDescription(
558 ExceptionTypeDescription_Base(entity->isPublished()),
manager_(
manager),
560 { assert(
manager.is()); assert(entity.is()); }
563 virtual ~ExceptionTypeDescription()
override {}
565 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
566 {
return css::uno::TypeClass_EXCEPTION; }
568 virtual OUString SAL_CALL getName()
override
571 virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
572 getBaseType()
override {
573 return entity_->getDirectBase().isEmpty()
574 ? css::uno::Reference< css::reflection::XTypeDescription >()
575 :
manager_->resolve(entity_->getDirectBase());
580 css::uno::Reference< css::reflection::XTypeDescription > >
581 SAL_CALL getMemberTypes()
override;
583 virtual css::uno::Sequence< OUString > SAL_CALL getMemberNames()
override;
590css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
591ExceptionTypeDescription::getMemberTypes() {
592 assert(entity_->getDirectMembers().size() <= SAL_MAX_INT32);
593 sal_Int32
n =
static_cast< sal_Int32
>(entity_->getDirectMembers().size());
595 css::uno::Reference< css::reflection::XTypeDescription > > s(n);
596 auto r = asNonConstRange(s);
597 for (sal_Int32 i = 0;
i !=
n; ++
i) {
598 r[
i] =
manager_->resolve(entity_->getDirectMembers()[i].type);
603css::uno::Sequence< OUString > ExceptionTypeDescription::getMemberNames()
605 assert(entity_->getDirectMembers().size() <= SAL_MAX_INT32);
606 sal_Int32
n =
static_cast< sal_Int32
>(entity_->getDirectMembers().size());
607 css::uno::Sequence< OUString > s(n);
608 auto r = asNonConstRange(s);
609 for (sal_Int32 i = 0;
i !=
n; ++
i) {
610 r[
i] = entity_->getDirectMembers()[
i].name;
615class AttributeDescription:
616 public cppu::WeakImplHelper<
617 css::reflection::XInterfaceAttributeTypeDescription2 >
620 AttributeDescription(
630 virtual ~AttributeDescription()
override {}
632 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
633 {
return css::uno::TypeClass_INTERFACE_ATTRIBUTE; }
635 virtual OUString SAL_CALL getName()
override
638 virtual OUString SAL_CALL getMemberName()
override
639 {
return attribute_.name; }
641 virtual sal_Int32 SAL_CALL getPosition()
override
642 {
return position_; }
644 virtual sal_Bool SAL_CALL isReadOnly()
override
645 {
return attribute_.readOnly; }
647 virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
649 {
return manager_->resolve(attribute_.type); }
651 virtual sal_Bool SAL_CALL isBound()
override
652 {
return attribute_.bound; }
656 css::uno::Reference< css::reflection::XCompoundTypeDescription > >
657 SAL_CALL getGetExceptions()
override;
661 css::uno::Reference< css::reflection::XCompoundTypeDescription > >
662 SAL_CALL getSetExceptions()
override;
671 css::uno::Reference< css::reflection::XCompoundTypeDescription > >
672AttributeDescription::getGetExceptions() {
673 assert(attribute_.getExceptions.size() <= SAL_MAX_INT32);
674 sal_Int32
n =
static_cast< sal_Int32
>(attribute_.getExceptions.size());
676 css::uno::Reference< css::reflection::XCompoundTypeDescription > > s(n);
677 auto r = asNonConstRange(s);
678 for (sal_Int32 i = 0;
i !=
n; ++
i) {
680 manager_->resolve(attribute_.getExceptions[i]),
681 css::uno::UNO_QUERY_THROW);
687 css::uno::Reference< css::reflection::XCompoundTypeDescription > >
688AttributeDescription::getSetExceptions() {
689 assert(attribute_.setExceptions.size() <= SAL_MAX_INT32);
690 sal_Int32
n =
static_cast< sal_Int32
>(attribute_.setExceptions.size());
692 css::uno::Reference< css::reflection::XCompoundTypeDescription > > s(n);
693 auto r = asNonConstRange(s);
694 for (sal_Int32 i = 0;
i !=
n; ++
i) {
696 manager_->resolve(attribute_.setExceptions[i]),
697 css::uno::UNO_QUERY_THROW);
702class MethodParameter:
703 public cppu::WeakImplHelper< css::reflection::XMethodParameter >
714 virtual ~MethodParameter()
override {}
716 virtual OUString SAL_CALL getName()
override
717 {
return parameter_.name; }
719 virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
721 {
return manager_->resolve(parameter_.type); }
723 virtual sal_Bool SAL_CALL isIn()
override {
725 (parameter_.direction
727 || (parameter_.direction
732 virtual sal_Bool SAL_CALL isOut()
override {
734 (parameter_.direction
736 || (parameter_.direction
741 virtual sal_Int32 SAL_CALL getPosition()
override
742 {
return position_; }
749class MethodDescription:
750 public cppu::WeakImplHelper<
751 css::reflection::XInterfaceMethodTypeDescription >
762 virtual ~MethodDescription()
override {}
764 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
765 {
return css::uno::TypeClass_INTERFACE_METHOD; }
767 virtual OUString SAL_CALL getName()
override
770 virtual OUString SAL_CALL getMemberName()
override
771 {
return method_.name; }
773 virtual sal_Int32 SAL_CALL getPosition()
override
774 {
return position_; }
776 virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
777 getReturnType()
override
778 {
return manager_->resolve(method_.returnType); }
780 virtual sal_Bool SAL_CALL isOneway()
override
785 css::uno::Reference< css::reflection::XMethodParameter > >
786 SAL_CALL getParameters()
override;
790 css::uno::Reference< css::reflection::XTypeDescription > >
791 SAL_CALL getExceptions()
override;
799css::uno::Sequence< css::uno::Reference< css::reflection::XMethodParameter > >
800MethodDescription::getParameters() {
801 assert(method_.parameters.size() <= SAL_MAX_INT32);
802 sal_Int32
n =
static_cast< sal_Int32
>(method_.parameters.size());
804 css::uno::Reference< css::reflection::XMethodParameter > > s(n);
805 auto r = asNonConstRange(s);
806 for (sal_Int32 i = 0;
i !=
n; ++
i) {
807 r[
i] =
new MethodParameter(manager_, method_.parameters[i], i);
812css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
813MethodDescription::getExceptions() {
814 assert(method_.exceptions.size() <= SAL_MAX_INT32);
815 sal_Int32
n =
static_cast< sal_Int32
>(method_.exceptions.size());
817 css::uno::Reference< css::reflection::XTypeDescription > > s(n);
818 auto r = asNonConstRange(s);
819 for (sal_Int32 i = 0;
i !=
n; ++
i) {
820 r[
i] =
manager_->resolve(method_.exceptions[i]);
828 css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >
829 const & description);
831 BaseOffset(
const BaseOffset&) =
delete;
832 const BaseOffset& operator=(
const BaseOffset&) =
delete;
834 sal_Int32
get()
const {
return offset_; }
838 css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >
839 const & description);
842 css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >
843 const & description);
845 std::set< OUString > set_;
849BaseOffset::BaseOffset(
850 css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >
const &
854 calculateBases(description);
857void BaseOffset::calculateBases(
858 css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >
const &
861 const css::uno::Sequence<
862 css::uno::Reference < css::reflection::XTypeDescription > > bases(
863 description->getBaseTypes());
864 for (
const auto & i : bases) {
866 css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >(
867 resolveTypedefs(css::uno::Any(i)),
868 css::uno::UNO_QUERY_THROW));
872void BaseOffset::calculate(
873 css::uno::Reference< css::reflection::XInterfaceTypeDescription2 >
const &
876 if (set_.insert(description->getName()).second) {
877 calculateBases(description);
878 offset_ += description->getMembers().getLength();
882typedef cppu::ImplInheritanceHelper<
883 PublishableDescription, css::reflection::XInterfaceTypeDescription2 >
884InterfaceTypeDescription_Base;
886class InterfaceTypeDescription:
public InterfaceTypeDescription_Base {
888 InterfaceTypeDescription(
892 InterfaceTypeDescription_Base(entity->isPublished()),
manager_(
manager),
894 { assert(
manager.is()); assert(entity.is()); }
897 virtual ~InterfaceTypeDescription()
override {}
899 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
900 {
return css::uno::TypeClass_INTERFACE; }
902 virtual OUString SAL_CALL getName()
override
905 virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
906 getBaseType()
override {
907 return entity_->getDirectMandatoryBases().empty()
908 ? css::uno::Reference< css::reflection::XTypeDescription >()
909 :
manager_->resolve(entity_->getDirectMandatoryBases()[0].
name);
912 virtual css::uno::Uik SAL_CALL getUik()
override
913 {
return css::uno::Uik(); }
918 css::reflection::XInterfaceMemberTypeDescription > >
919 SAL_CALL getMembers()
override;
923 css::uno::Reference< css::reflection::XTypeDescription > >
924 SAL_CALL getBaseTypes()
override;
928 css::uno::Reference< css::reflection::XTypeDescription > >
929 SAL_CALL getOptionalBaseTypes()
override;
937 css::uno::Reference< css::reflection::XInterfaceMemberTypeDescription > >
938InterfaceTypeDescription::getMembers() {
940 entity_->getDirectAttributes().size() <= SAL_MAX_INT32
941 && (entity_->getDirectMethods().size()
942 <= SAL_MAX_INT32 - entity_->getDirectAttributes().size()));
943 sal_Int32
n1 =
static_cast< sal_Int32
>(
944 entity_->getDirectAttributes().size());
945 sal_Int32
n2 =
static_cast< sal_Int32
>(entity_->getDirectMethods().size());
948 css::reflection::XInterfaceMemberTypeDescription > > s(n1 + n2);
949 auto r = asNonConstRange(s);
950 sal_Int32 off = BaseOffset(
this).get();
951 for (sal_Int32 i = 0;
i !=
n1; ++
i) {
952 r[
i] =
new AttributeDescription(
953 manager_, name_ +
"::" + entity_->getDirectAttributes()[i].name,
954 entity_->getDirectAttributes()[i], off + i);
956 for (sal_Int32 i = 0;
i !=
n2; ++
i) {
957 r[
n1 +
i] =
new MethodDescription(
958 manager_, name_ +
"::" + entity_->getDirectMethods()[i].name,
959 entity_->getDirectMethods()[i], off + n1 + i);
964css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
965InterfaceTypeDescription::getBaseTypes() {
966 assert(entity_->getDirectMandatoryBases().size() <= SAL_MAX_INT32);
967 sal_Int32
n =
static_cast< sal_Int32
>(
968 entity_->getDirectMandatoryBases().size());
970 css::uno::Reference< css::reflection::XTypeDescription > > s(n);
971 auto r = asNonConstRange(s);
972 for (sal_Int32 i = 0;
i !=
n; ++
i) {
973 r[
i] =
manager_->resolve(entity_->getDirectMandatoryBases()[i].name);
978css::uno::Sequence< css::uno::Reference< css::reflection::XTypeDescription > >
979InterfaceTypeDescription::getOptionalBaseTypes()
981 assert(entity_->getDirectOptionalBases().size() <= SAL_MAX_INT32);
982 sal_Int32
n =
static_cast< sal_Int32
>(
983 entity_->getDirectOptionalBases().size());
985 css::uno::Reference< css::reflection::XTypeDescription > > s(n);
986 auto r = asNonConstRange(s);
987 for (sal_Int32 i = 0;
i !=
n; ++
i) {
988 r[
i] =
manager_->resolve(entity_->getDirectOptionalBases()[i].name);
993class ConstantDescription:
994 public cppu::WeakImplHelper< css::reflection::XConstantTypeDescription >
998 OUString
const & constantGroupName,
1002 virtual ~ConstantDescription()
override {}
1004 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
1005 {
return css::uno::TypeClass_CONSTANT; }
1007 virtual OUString SAL_CALL getName()
override
1010 virtual css::uno::Any SAL_CALL getConstantValue()
override
1017ConstantDescription::ConstantDescription(
1018 OUString
const & constantGroupName,
1020 name_(makePrefix(constantGroupName) + member.
name)
1054 for (;;) { std::abort(); }
1058typedef cppu::ImplInheritanceHelper<
1059 PublishableDescription, css::reflection::XConstantsTypeDescription >
1060ConstantGroupDescription_Base;
1062class ConstantGroupDescription:
public ConstantGroupDescription_Base {
1064 ConstantGroupDescription(
1067 ConstantGroupDescription_Base(entity->isPublished()),
name_(
std::move(
name)),
1069 { assert(entity.is()); }
1072 virtual ~ConstantGroupDescription()
override {}
1074 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
1075 {
return css::uno::TypeClass_CONSTANTS; }
1077 virtual OUString SAL_CALL getName()
override
1082 css::uno::Reference< css::reflection::XConstantTypeDescription > >
1083 SAL_CALL getConstants()
override;
1090 css::uno::Reference< css::reflection::XConstantTypeDescription > >
1091ConstantGroupDescription::getConstants() {
1092 assert(entity_->getMembers().size() <= SAL_MAX_INT32);
1093 sal_Int32
n =
static_cast< sal_Int32
>(entity_->getMembers().size());
1095 css::uno::Reference< css::reflection::XConstantTypeDescription > > s(n);
1096 auto r = asNonConstRange(s);
1097 for (sal_Int32 i = 0;
i !=
n; ++
i) {
1098 r[
i] =
new ConstantDescription(name_, entity_->getMembers()[i]);
1103typedef cppu::ImplInheritanceHelper<
1104 PublishableDescription, css::reflection::XIndirectTypeDescription >
1105TypedefDescription_Base;
1107class TypedefDescription:
public TypedefDescription_Base {
1115 { assert(
manager.is()); assert(entity.is()); }
1118 virtual ~TypedefDescription()
override {}
1120 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
1121 {
return css::uno::TypeClass_TYPEDEF; }
1123 virtual OUString SAL_CALL getName()
override
1126 virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
1127 getReferencedType()
override
1128 {
return manager_->resolve(entity_->getType()); }
1135class ConstructorParameter:
1136 public cppu::WeakImplHelper< css::reflection::XParameter >
1139 ConstructorParameter(
1142 sal_Int32 position):
1147 virtual ~ConstructorParameter()
override {}
1149 virtual OUString SAL_CALL getName()
override
1150 {
return parameter_.name; }
1152 virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
1154 {
return manager_->resolve(parameter_.type); }
1156 virtual sal_Bool SAL_CALL isIn()
override
1159 virtual sal_Bool SAL_CALL isOut()
override
1162 virtual sal_Int32 SAL_CALL getPosition()
override
1163 {
return position_; }
1165 virtual sal_Bool SAL_CALL isRestParameter()
override
1166 {
return parameter_.rest; }
1171 sal_Int32 position_;
1174class ConstructorDescription:
1175 public cppu::WeakImplHelper<
1176 css::reflection::XServiceConstructorDescription >
1179 ConstructorDescription(
1186 virtual ~ConstructorDescription()
override {}
1188 virtual sal_Bool SAL_CALL isDefaultConstructor()
override
1189 {
return constructor_.defaultConstructor; }
1191 virtual OUString SAL_CALL getName()
override
1192 {
return constructor_.name; }
1196 css::uno::Reference< css::reflection::XParameter > >
1197 SAL_CALL getParameters()
override;
1201 css::uno::Reference< css::reflection::XCompoundTypeDescription > >
1202 SAL_CALL getExceptions()
override;
1208css::uno::Sequence< css::uno::Reference< css::reflection::XParameter > >
1209ConstructorDescription::getParameters() {
1210 assert(constructor_.parameters.size() <= SAL_MAX_INT32);
1211 sal_Int32
n =
static_cast< sal_Int32
>(constructor_.parameters.size());
1212 css::uno::Sequence< css::uno::Reference< css::reflection::XParameter > > s(
1214 auto r = asNonConstRange(s);
1215 for (sal_Int32 i = 0;
i !=
n; ++
i) {
1216 r[
i] =
new ConstructorParameter(
1217 manager_, constructor_.parameters[i], i);
1223 css::uno::Reference< css::reflection::XCompoundTypeDescription > >
1224ConstructorDescription::getExceptions() {
1225 assert(constructor_.exceptions.size() <= SAL_MAX_INT32);
1226 sal_Int32
n =
static_cast< sal_Int32
>(constructor_.exceptions.size());
1228 css::uno::Reference< css::reflection::XCompoundTypeDescription > > s(n);
1229 auto r = asNonConstRange(s);
1230 for (sal_Int32 i = 0;
i !=
n; ++
i) {
1232 manager_->resolve(constructor_.exceptions[i]),
1233 css::uno::UNO_QUERY_THROW);
1238typedef cppu::ImplInheritanceHelper<
1239 PublishableDescription, css::reflection::XServiceTypeDescription2 >
1240SingleInterfaceBasedServiceDescription_Base;
1242class SingleInterfaceBasedServiceDescription:
1243 public SingleInterfaceBasedServiceDescription_Base
1246 SingleInterfaceBasedServiceDescription(
1251 SingleInterfaceBasedServiceDescription_Base(entity->isPublished()),
1253 { assert(
manager.is()); assert(entity.is()); }
1256 virtual ~SingleInterfaceBasedServiceDescription()
override {}
1258 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
1259 {
return css::uno::TypeClass_SERVICE; }
1261 virtual OUString SAL_CALL getName()
override
1266 css::uno::Reference< css::reflection::XServiceTypeDescription > >
1267 SAL_CALL getMandatoryServices()
override
1269 return css::uno::Sequence<
1270 css::uno::Reference< css::reflection::XServiceTypeDescription > >();
1275 css::uno::Reference< css::reflection::XServiceTypeDescription > >
1276 SAL_CALL getOptionalServices()
override
1278 return css::uno::Sequence<
1279 css::uno::Reference< css::reflection::XServiceTypeDescription > >();
1284 css::uno::Reference< css::reflection::XInterfaceTypeDescription > >
1285 SAL_CALL getMandatoryInterfaces()
override
1287 return css::uno::Sequence<
1288 css::uno::Reference<
1289 css::reflection::XInterfaceTypeDescription > >();
1294 css::uno::Reference< css::reflection::XInterfaceTypeDescription > >
1295 SAL_CALL getOptionalInterfaces()
override
1297 return css::uno::Sequence<
1298 css::uno::Reference<
1299 css::reflection::XInterfaceTypeDescription > >();
1304 css::uno::Reference< css::reflection::XPropertyTypeDescription > >
1305 SAL_CALL getProperties()
override
1307 return css::uno::Sequence<
1308 css::uno::Reference<
1309 css::reflection::XPropertyTypeDescription > >();
1312 virtual sal_Bool SAL_CALL isSingleInterfaceBased()
override
1315 virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
1316 getInterface()
override
1317 {
return manager_->resolve(entity_->getBase()); }
1321 css::uno::Reference< css::reflection::XServiceConstructorDescription > >
1322 SAL_CALL getConstructors()
override;
1330 css::uno::Reference< css::reflection::XServiceConstructorDescription > >
1331SingleInterfaceBasedServiceDescription::getConstructors()
1333 assert(entity_->getConstructors().size() <= SAL_MAX_INT32);
1334 sal_Int32
n =
static_cast< sal_Int32
>(entity_->getConstructors().size());
1336 css::uno::Reference< css::reflection::XServiceConstructorDescription > >
1338 auto r = asNonConstRange(s);
1339 for (sal_Int32 i = 0;
i !=
n; ++
i) {
1340 r[
i] =
new ConstructorDescription(
1341 manager_, entity_->getConstructors()[i]);
1346class PropertyDescription:
1347 public cppu::WeakImplHelper< css::reflection::XPropertyTypeDescription >
1350 PropertyDescription(
1357 virtual ~PropertyDescription()
override {}
1359 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
1360 {
return css::uno::TypeClass_PROPERTY; }
1362 virtual OUString SAL_CALL getName()
override
1363 {
return property_.name; }
1365 virtual sal_Int16 SAL_CALL getPropertyFlags()
override
1366 {
return property_.attributes; }
1368 virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
1369 getPropertyTypeDescription()
override
1370 {
return manager_->resolve(property_.type); }
1376typedef cppu::ImplInheritanceHelper<
1377 PublishableDescription, css::reflection::XServiceTypeDescription2 >
1378AccumulationBasedServiceDescription_Base;
1380class AccumulationBasedServiceDescription:
1381 public AccumulationBasedServiceDescription_Base
1384 AccumulationBasedServiceDescription(
1389 AccumulationBasedServiceDescription_Base(entity->isPublished()),
1391 { assert(
manager.is()); assert(entity.is()); }
1394 virtual ~AccumulationBasedServiceDescription()
override {}
1396 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
1397 {
return css::uno::TypeClass_SERVICE; }
1399 virtual OUString SAL_CALL getName()
override
1404 css::uno::Reference< css::reflection::XServiceTypeDescription > >
1405 SAL_CALL getMandatoryServices()
override;
1409 css::uno::Reference< css::reflection::XServiceTypeDescription > >
1410 SAL_CALL getOptionalServices()
override;
1414 css::uno::Reference< css::reflection::XInterfaceTypeDescription > >
1415 SAL_CALL getMandatoryInterfaces()
override;
1419 css::uno::Reference< css::reflection::XInterfaceTypeDescription > >
1420 SAL_CALL getOptionalInterfaces()
override;
1424 css::uno::Reference< css::reflection::XPropertyTypeDescription > >
1425 SAL_CALL getProperties()
override;
1427 virtual sal_Bool SAL_CALL isSingleInterfaceBased()
override
1430 virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
1431 getInterface()
override
1432 {
return css::uno::Reference< css::reflection::XTypeDescription >(); }
1436 css::uno::Reference< css::reflection::XServiceConstructorDescription > >
1437 SAL_CALL getConstructors()
override
1439 return css::uno::Sequence<
1440 css::uno::Reference<
1441 css::reflection::XServiceConstructorDescription > >();
1450 css::uno::Reference< css::reflection::XServiceTypeDescription > >
1451AccumulationBasedServiceDescription::getMandatoryServices()
1453 assert(entity_->getDirectMandatoryBaseServices().size() <= SAL_MAX_INT32);
1454 sal_Int32
n =
static_cast< sal_Int32
>(
1455 entity_->getDirectMandatoryBaseServices().size());
1457 css::uno::Reference< css::reflection::XServiceTypeDescription > > s(n);
1458 auto r = asNonConstRange(s);
1459 for (sal_Int32 i = 0;
i !=
n; ++
i) {
1462 entity_->getDirectMandatoryBaseServices()[i].name),
1463 css::uno::UNO_QUERY_THROW);
1469 css::uno::Reference< css::reflection::XServiceTypeDescription > >
1470AccumulationBasedServiceDescription::getOptionalServices()
1472 assert(entity_->getDirectOptionalBaseServices().size() <= SAL_MAX_INT32);
1473 sal_Int32
n =
static_cast< sal_Int32
>(
1474 entity_->getDirectOptionalBaseServices().size());
1476 css::uno::Reference< css::reflection::XServiceTypeDescription > > s(n);
1477 auto r = asNonConstRange(s);
1478 for (sal_Int32 i = 0;
i !=
n; ++
i) {
1480 manager_->resolve(entity_->getDirectOptionalBaseServices()[i].name),
1481 css::uno::UNO_QUERY_THROW);
1487 css::uno::Reference< css::reflection::XInterfaceTypeDescription > >
1488AccumulationBasedServiceDescription::getMandatoryInterfaces()
1490 assert(entity_->getDirectMandatoryBaseInterfaces().size() <= SAL_MAX_INT32);
1491 sal_Int32
n =
static_cast< sal_Int32
>(
1492 entity_->getDirectMandatoryBaseInterfaces().size());
1494 css::uno::Reference< css::reflection::XInterfaceTypeDescription > > s(
1496 auto r = asNonConstRange(s);
1497 for (sal_Int32 i = 0;
i !=
n; ++
i) {
1501 entity_->getDirectMandatoryBaseInterfaces()[i].name)),
1502 css::uno::UNO_QUERY_THROW);
1508 css::uno::Reference< css::reflection::XInterfaceTypeDescription > >
1509AccumulationBasedServiceDescription::getOptionalInterfaces()
1511 assert(entity_->getDirectOptionalBaseInterfaces().size() <= SAL_MAX_INT32);
1512 sal_Int32
n =
static_cast< sal_Int32
>(
1513 entity_->getDirectOptionalBaseInterfaces().size());
1515 css::uno::Reference< css::reflection::XInterfaceTypeDescription > > s(
1517 auto r = asNonConstRange(s);
1518 for (sal_Int32 i = 0;
i !=
n; ++
i) {
1522 entity_->getDirectOptionalBaseInterfaces()[i].name)),
1523 css::uno::UNO_QUERY_THROW);
1529 css::uno::Reference< css::reflection::XPropertyTypeDescription > >
1530AccumulationBasedServiceDescription::getProperties()
1532 assert(entity_->getDirectProperties().size() <= SAL_MAX_INT32);
1533 sal_Int32
n =
static_cast< sal_Int32
>(
1534 entity_->getDirectProperties().size());
1536 css::uno::Reference< css::reflection::XPropertyTypeDescription > > s(n);
1537 auto r = asNonConstRange(s);
1538 for (sal_Int32 i = 0;
i !=
n; ++
i) {
1539 r[
i] =
new PropertyDescription(
1540 manager_, entity_->getDirectProperties()[i]);
1545typedef cppu::ImplInheritanceHelper<
1546 PublishableDescription, css::reflection::XSingletonTypeDescription2 >
1547InterfaceBasedSingletonDescription_Base;
1549class InterfaceBasedSingletonDescription:
1550 public InterfaceBasedSingletonDescription_Base
1553 InterfaceBasedSingletonDescription(
1557 InterfaceBasedSingletonDescription_Base(entity->isPublished()),
1559 { assert(
manager.is()); assert(entity.is()); }
1562 virtual ~InterfaceBasedSingletonDescription()
override {}
1564 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
1565 {
return css::uno::TypeClass_SINGLETON; }
1567 virtual OUString SAL_CALL getName()
override
1570 virtual css::uno::Reference< css::reflection::XServiceTypeDescription >
1571 SAL_CALL getService()
override
1574 css::uno::Reference< css::reflection::XServiceTypeDescription >();
1577 virtual sal_Bool SAL_CALL isInterfaceBased()
override
1580 virtual css::uno::Reference< css::reflection::XTypeDescription >
1581 SAL_CALL getInterface()
override
1582 {
return manager_->resolve(entity_->getBase()); }
1589typedef cppu::ImplInheritanceHelper<
1590 PublishableDescription, css::reflection::XSingletonTypeDescription2 >
1591ServiceBasedSingletonDescription_Base;
1593class ServiceBasedSingletonDescription:
1594 public ServiceBasedSingletonDescription_Base
1597 ServiceBasedSingletonDescription(
1601 ServiceBasedSingletonDescription_Base(entity->isPublished()),
1603 { assert(
manager.is()); assert(entity.is()); }
1606 virtual ~ServiceBasedSingletonDescription()
override {}
1608 virtual css::uno::TypeClass SAL_CALL
getTypeClass()
override
1609 {
return css::uno::TypeClass_SINGLETON; }
1611 virtual OUString SAL_CALL getName()
override
1614 virtual css::uno::Reference< css::reflection::XServiceTypeDescription >
1615 SAL_CALL getService()
override
1617 return css::uno::Reference< css::reflection::XServiceTypeDescription >(
1618 manager_->resolve(entity_->getBase()), css::uno::UNO_QUERY_THROW);
1621 virtual sal_Bool SAL_CALL isInterfaceBased()
override
1624 virtual css::uno::Reference< css::reflection::XTypeDescription >
1625 SAL_CALL getInterface()
override
1626 {
return css::uno::Reference< css::reflection::XTypeDescription >(); }
1634 public cppu::WeakImplHelper< css::reflection::XTypeDescriptionEnumeration >
1639 OUString
const & prefix,
1641 css::uno::Sequence< css::uno::TypeClass >
const & types,
bool deep):
1645 positions_.push(
Position(prefix, cursor));
1653 {
return !positions_.empty(); }
1655 virtual css::uno::Any SAL_CALL
nextElement()
override
1656 {
return css::uno::Any(nextTypeDescription()); }
1658 virtual css::uno::Reference< css::reflection::XTypeDescription > SAL_CALL
1659 nextTypeDescription()
override;
1661 bool matches(css::uno::TypeClass tc)
const;
1663 void findNextMatch();
1669 prefix(
std::move(thePrefix)), cursor(theCursor)
1670 { assert(theCursor.is()); }
1676 prefix(
std::move(thePrefix)), constantGroup(theConstantGroup),
1677 constantGroupIndex(constantGroup->getMembers().
begin())
1678 { assert(theConstantGroup.is()); }
1682 constantGroup(other.constantGroup)
1684 if (constantGroup.is()) {
1685 constantGroupIndex = other.constantGroupIndex;
1692 std::vector< unoidl::ConstantGroupEntity::Member >::const_iterator
1697 css::uno::Sequence< css::uno::TypeClass > types_;
1701 std::stack< Position, std::vector<Position> > positions_;
1705css::uno::Reference< css::reflection::XTypeDescription >
1706Enumeration::nextTypeDescription()
1710 std::scoped_lock g(mutex_);
1711 if (positions_.empty()) {
1712 throw css::container::NoSuchElementException(
1713 "exhausted XTypeDescriptionEnumeration",
1722bool Enumeration::matches(css::uno::TypeClass tc)
const {
1723 if (!types_.hasElements()) {
1726 for (
const auto & i : types_) {
1734void Enumeration::findNextMatch() {
1737 assert(!positions_.empty());
1739 if (positions_.top().cursor.is()) {
1741 positions_.top().cursor->getNext(&name));
1744 if (positions_.empty()) {
1749 name = positions_.top().prefix +
name;
1750 css::uno::TypeClass tc;
1751 switch (ent->getSort()) {
1753 tc = css::uno::TypeClass_MODULE;
1763 tc = css::uno::TypeClass_ENUM;
1767 tc = css::uno::TypeClass_STRUCT;
1770 tc = css::uno::TypeClass_EXCEPTION;
1773 tc = css::uno::TypeClass_INTERFACE;
1776 tc = css::uno::TypeClass_TYPEDEF;
1779 tc = css::uno::TypeClass_CONSTANTS;
1780 if (deep_ && matches(css::uno::TypeClass_CONSTANT)) {
1790 tc = css::uno::TypeClass_SERVICE;
1794 tc = css::uno::TypeClass_SINGLETON;
1797 for (;;) { std::abort(); }
1804 if (positions_.top().constantGroupIndex
1805 == positions_.top().constantGroup->getMembers().end())
1808 if (positions_.empty()) {
1813 current_ = positions_.top().prefix
1814 + positions_.top().constantGroupIndex++->name;
1819 throw css::uno::DeploymentException(
1833 static constexpr std::pair<std::u16string_view, css::uno::TypeClass>
const simple[] = {
1834 {
u"void", css::uno::TypeClass_VOID },
1835 {
u"boolean", css::uno::TypeClass_BOOLEAN },
1836 {
u"byte", css::uno::TypeClass_BYTE },
1837 {
u"short", css::uno::TypeClass_SHORT },
1838 {
u"unsigned short", css::uno::TypeClass_UNSIGNED_SHORT },
1839 {
u"long", css::uno::TypeClass_LONG },
1840 {
u"unsigned long", css::uno::TypeClass_UNSIGNED_LONG },
1841 {
u"hyper", css::uno::TypeClass_HYPER },
1842 {
u"unsigned hyper", css::uno::TypeClass_UNSIGNED_HYPER },
1843 {
u"float", css::uno::TypeClass_FLOAT },
1844 {
u"double", css::uno::TypeClass_DOUBLE },
1845 {
u"char", css::uno::TypeClass_CHAR },
1846 {
u"string", css::uno::TypeClass_STRING },
1847 {
u"type", css::uno::TypeClass_TYPE },
1848 {
u"any", css::uno::TypeClass_ANY } };
1849 for (
const auto& [ rName, rTypeClass ] : simple) {
1850 if (
name == rName) {
1851 return css::uno::Any(
1852 css::uno::Reference< css::reflection::XTypeDescription >(
1853 new SimpleTypeDescription(rTypeClass,
name)));
1856 if (
name.startsWith(
"[]")) {
1857 return getSequenceType(
name);
1859 sal_Int32
i =
name.indexOf(
'<');
1861 return getInstantiatedStruct(
name,
i);
1863 i =
name.indexOf(
"::");
1865 return getInterfaceMember(
name,
i);
1869 return getNamed(
name, ent);
1871 i =
name.lastIndexOf(
'.');
1873 OUString parent(
name.copy(0,
i));
1874 ent = findEntity(parent);
1876 switch (ent->getSort()) {
1878 return getEnumMember(
1880 name.subView(
i + 1));
1885 name.subView(
i + 1));
1891 return css::uno::Any();
1894css::uno::Reference< css::reflection::XTypeDescription >
1896 css::uno::Reference< css::reflection::XTypeDescription > desc(
1899 throw css::uno::DeploymentException(
1900 "cannot resolve type \"" +
name +
"\"",
1911 "com.sun.star.comp.cppuhelper.bootstrap.TypeManager";
1915 OUString
const & ServiceName)
1920css::uno::Sequence< OUString >
1923 return {
"com.sun.star.reflection.TypeDescriptionManager" };
1927 OUString
const & aName)
1930 if (!desc.hasValue()) {
1931 throw css::container::NoSuchElementException(
1938 OUString
const & aName)
1950 throw css::uno::RuntimeException(
1951 "TypeManager hasElements: method not supported",
1955css::uno::Reference< css::container::XEnumeration >
1958 throw css::uno::RuntimeException(
1959 "TypeManager createEnumeration: method not supported",
1965 throw css::uno::RuntimeException(
1966 "TypeManager has: method not supported",
1973 if (!(aElement >>= uri)) {
1974 throw css::lang::IllegalArgumentException(
1975 (
"css.uno.theTypeDescriptionManager.insert expects a string URI"
1981 readRdbFile(uri,
false);
1987 if (!(aElement >>= uri)) {
1988 throw css::lang::IllegalArgumentException(
1989 (
"css.uno.theTypeDescriptionManager.remove expects a string URI"
1996css::uno::Reference< css::reflection::XTypeDescriptionEnumeration >
1998 OUString
const & moduleName,
1999 css::uno::Sequence< css::uno::TypeClass >
const & types,
2000 css::reflection::TypeDescriptionSearchDepth depth)
2004 cursor =
manager_->createCursor(moduleName);
2006 throw css::uno::DeploymentException(
2007 (
"unoidl::FileFormatException for <" + e.
getUri() +
">: "
2014 throw css::reflection::NoSuchTypeNameException(
2018 this, makePrefix(moduleName), cursor, types,
2019 depth == css::reflection::TypeDescriptionSearchDepth_INFINITE);
2023 for (sal_Int32
i = 0;
i != -1;) {
2032 readRdbDirectory(uri, optional);
2034 readRdbFile(uri, optional);
2040 std::u16string_view uri,
bool optional)
2042 osl::Directory dir = OUString(uri);
2043 switch (dir.open()) {
2044 case osl::FileBase::E_None:
2046 case osl::FileBase::E_NOENT:
2048 SAL_INFO(
"cppuhelper",
"Ignored optional " << OUString(uri));
2053 throw css::uno::DeploymentException(
2054 OUString::Concat(
"Cannot open directory ") + uri,
2062 readRdbFile(url,
false);
2067 std::u16string_view uri,
bool optional)
2070 manager_->addProvider(OUString(uri));
2073 throw css::uno::DeploymentException(
2074 OUString::Concat(uri) +
": no such file",
2077 SAL_INFO(
"cppuhelper",
"Ignored optional " << OUString(uri));
2079 throw css::uno::DeploymentException(
2080 (
"unoidl::FileFormatException for <" + e.
getUri() +
">: "
2087 OUString
const & name)
2089 assert(
name.startsWith(
"[]"));
2090 return css::uno::Any(
2091 css::uno::Reference< css::reflection::XTypeDescription >(
2092 new SequenceTypeDescription(
2093 this,
name,
name.copy(std::strlen(
"[]")))));
2097 OUString
const & name, sal_Int32 separator)
2105 return css::uno::Any();
2110 std::vector< OUString >
args;
2115 for (sal_Int32 level = 0; j !=
name.getLength(); ++j) {
2121 }
else if (c ==
'<') {
2123 }
else if (c ==
'>') {
2130 if (j !=
name.getLength()) {
2134 }
while (
i !=
name.getLength() &&
name[
i] !=
'>');
2135 if (
i !=
name.getLength() - 1 ||
name[
i] !=
'>'
2136 ||
args.size() != ent2->getTypeParameters().size())
2138 return css::uno::Any();
2140 return css::uno::Any(
2141 css::uno::Reference< css::reflection::XTypeDescription >(
2142 new InstantiatedPolymorphicStructTypeDescription(
2143 this,
name, ent2, std::move(
args))));
2147 std::u16string_view name, std::size_t separator)
2150 css::uno::Reference< css::reflection::XInterfaceTypeDescription2 > ifc(
2151 resolveTypedefs(
find(OUString(
name.substr(0,
separator)))), css::uno::UNO_QUERY);
2153 return css::uno::Any();
2155 std::u16string_view member =
name.substr(
separator + std::strlen(
"::"));
2156 const css::uno::Sequence<
2157 css::uno::Reference<
2158 css::reflection::XInterfaceMemberTypeDescription > > mems(
2160 for (
const auto &
m : mems) {
2161 if (
m->getMemberName() == member) {
2162 return css::uno::Any(
2163 css::uno::Reference< css::reflection::XTypeDescription >(
m));
2166 return css::uno::Any();
2172 assert(entity.is());
2173 switch (entity->getSort()) {
2175 return css::uno::Any(
2176 css::uno::Reference< css::reflection::XTypeDescription >(
2177 new ModuleDescription(
2181 return css::uno::Any(
2182 css::uno::Reference< css::reflection::XTypeDescription >(
2183 new EnumTypeDescription(
2187 return css::uno::Any(
2188 css::uno::Reference< css::reflection::XTypeDescription >(
2189 new PlainStructTypeDescription(
2194 return css::uno::Any(
2195 css::uno::Reference< css::reflection::XTypeDescription >(
2196 new PolymorphicStructTypeTemplateDescription(
2202 return css::uno::Any(
2203 css::uno::Reference< css::reflection::XTypeDescription >(
2204 new ExceptionTypeDescription(
2209 return css::uno::Any(
2210 css::uno::Reference< css::reflection::XTypeDescription >(
2211 new InterfaceTypeDescription(
2216 return css::uno::Any(
2217 css::uno::Reference< css::reflection::XTypeDescription >(
2218 new TypedefDescription(
2222 return css::uno::Any(
2223 css::uno::Reference< css::reflection::XTypeDescription >(
2224 new ConstantGroupDescription(
2229 return css::uno::Any(
2230 css::uno::Reference< css::reflection::XTypeDescription >(
2231 new SingleInterfaceBasedServiceDescription(
2236 return css::uno::Any(
2237 css::uno::Reference< css::reflection::XTypeDescription >(
2238 new AccumulationBasedServiceDescription(
2243 return css::uno::Any(
2244 css::uno::Reference< css::reflection::XTypeDescription >(
2245 new InterfaceBasedSingletonDescription(
2250 return css::uno::Any(
2251 css::uno::Reference< css::reflection::XTypeDescription >(
2252 new ServiceBasedSingletonDescription(
2257 for (;;) { std::abort(); }
2263 std::u16string_view member)
2265 auto i = std::find_if(entity->getMembers().begin(), entity->getMembers().end(),
2267 if (
i != entity->getMembers().end())
2268 return css::uno::Any(
i->value);
2269 return css::uno::Any();
2273 std::u16string_view constantGroupName,
2275 std::u16string_view member)
2277 auto i = std::find_if(entity->getMembers().begin(), entity->getMembers().end(),
2279 if (
i != entity->getMembers().end())
2280 return css::uno::Any(
2281 css::uno::Reference< css::reflection::XTypeDescription >(
2282 new ConstantDescription(OUString(constantGroupName), *
i)));
2283 return css::uno::Any();
2287 OUString
const & name)
2292 throw css::uno::DeploymentException(
2293 (
"unoidl::FileFormatException for <" + e.
getUri() +
">: "
virtual css::uno::Any SAL_CALL nextElement() override
Enumeration(css::container::XIndexAccess *)
virtual sal_Bool SAL_CALL hasMoreElements() override
Base class to implement a UNO object supporting weak references, i.e.
css::uno::Type const & get()
virtual OUString SAL_CALL getImplementationName() override
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual sal_Bool SAL_CALL hasElements() override
static css::uno::Any getEnumMember(rtl::Reference< unoidl::EnumTypeEntity > const &entity, std::u16string_view member)
virtual void SAL_CALL remove(css::uno::Any const &aElement) override
virtual css::uno::Reference< css::reflection::XTypeDescriptionEnumeration > SAL_CALL createTypeDescriptionEnumeration(OUString const &moduleName, css::uno::Sequence< css::uno::TypeClass > const &types, css::reflection::TypeDescriptionSearchDepth depth) override
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() override
virtual css::uno::Any SAL_CALL getByHierarchicalName(OUString const &aName) override
css::uno::Reference< css::reflection::XTypeDescription > resolve(OUString const &name)
virtual sal_Bool SAL_CALL has(css::uno::Any const &aElement) override
css::uno::Any find(OUString const &name)
virtual ~TypeManager() noexcept override
rtl::Reference< unoidl::Entity > findEntity(OUString const &name)
virtual void SAL_CALL insert(css::uno::Any const &aElement) override
void readRdbDirectory(std::u16string_view uri, bool optional)
css::uno::Any getNamed(OUString const &name, rtl::Reference< unoidl::Entity > const &entity)
css::uno::Any getInterfaceMember(std::u16string_view name, std::size_t separator)
css::uno::Any getInstantiatedStruct(OUString const &name, sal_Int32 separator)
virtual sal_Bool SAL_CALL supportsService(OUString const &ServiceName) override
virtual css::uno::Type SAL_CALL getElementType() override
css::uno::Any getSequenceType(OUString const &name)
void init(std::u16string_view rdbUris)
void readRdbFile(std::u16string_view uri, bool optional)
virtual sal_Bool SAL_CALL hasByHierarchicalName(OUString const &aName) override
static css::uno::Any getConstant(std::u16string_view constantGroupName, rtl::Reference< unoidl::ConstantGroupEntity > const &entity, std::u16string_view member)
SORT_ACCUMULATION_BASED_SERVICE
SORT_SINGLE_INTERFACE_BASED_SERVICE
SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE
SORT_INTERFACE_BASED_SINGLETON
SORT_SERVICE_BASED_SINGLETON
virtual rtl::Reference< MapCursor > createCursor() const=0
rtl::Reference< ParseManager > manager
rtl::Reference< Manager > manager_
#define SAL_INFO(area, stream)
OSQLColumns::const_iterator find(const OSQLColumns::const_iterator &first, const OSQLColumns::const_iterator &last, std::u16string_view _rVal, const ::comphelper::UStringMixEqual &_rCase)
void decodeRdbUri(std::u16string_view *uri, bool *optional, bool *directory)
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
A helper for implementations of com.sun.star.lang.XServiceInfo.
bool nextDirectoryItem(osl::Directory &directory, OUString *url)
std::basic_string_view< charT, traits > getToken(std::basic_string_view< charT, traits > sv, charT delimiter, std::size_t &position)
enumrange< T >::Iterator begin(enumrange< T >)
PyRef getTypeClass(const Runtime &)
css::uno::Reference< css::linguistic2::XProofreadingIterator > get(css::uno::Reference< css::uno::XComponentContext > const &context)
bool getType(BSTR name, Type &type)
sal_uInt16 unsignedShortValue
sal_uInt64 unsignedHyperValue
sal_uInt32 unsignedLongValue