20#include <rtl/ustring.hxx>
30std::vector< OUString > translateAnnotations(std::u16string_view documentation) {
31 std::vector< OUString > ans;
32 if (documentation.find(
u"@deprecated") != std::u16string_view::npos) {
34 ans.push_back(
"deprecated");
42 switch (
value.m_type) {
66 (
"legacy format: unexpected type " + OUString::number(
value.m_type)
67 +
" of value of a field of constant group with key "
74 RegistryKey & key, OUString
const & path,
bool probe);
83 virtual ~Cursor()
noexcept override {}
108 if (e != RegError::NO_ERROR) {
109 throw FileFormatException(
111 (
"legacy format: cannot get sub-key names of " +
key_.
getName()
112 +
": " + OUString::number(
static_cast<int>(e))));
117 assert(name !=
nullptr);
130class Module:
public ModuleEntity {
139 virtual ~Module() noexcept
override {}
141 virtual std::vector< OUString > getMemberNames()
const override;
151std::vector< OUString > Module::getMemberNames()
const {
154 if (e != RegError::NO_ERROR) {
155 throw FileFormatException(
157 (
"legacy format: cannot get sub-key names of " +
key_.
getName()
158 +
": " + OUString::number(
static_cast<int>(e))));
160 std::vector< OUString >
ns;
161 for (sal_uInt32 i = 0;
i != names.
getLength(); ++
i) {
168 assert(buffer !=
nullptr);
172 if (e != RegError::NO_ERROR) {
173 throw FileFormatException(
175 (
"legacy format: cannot get value info about key " + key.
getName()
176 +
": " + OUString::number(
static_cast<int>(e))));
178 if (type != RegValueType::BINARY) {
179 throw FileFormatException(
181 (
"legacy format: unexpected value type " + OUString::number(
static_cast<int>(type))
182 +
" of key " + key.
getName()));
187 throw FileFormatException(
189 (
"legacy format: bad binary value size " + OUString::number(size)
190 +
" of key " + key.
getName()));
192 buffer->resize(
static_cast< std::vector< char >::size_type
>(size));
193 e = key.
getValue(
"", buffer->data());
194 if (e != RegError::NO_ERROR) {
195 throw FileFormatException(
197 (
"legacy format: cannot get binary value of key " + key.
getName()
198 +
": " + OUString::number(
static_cast<int>(e))));
201 if (!reader.isValid()) {
202 throw FileFormatException(
204 "legacy format: malformed binary value of key " + key.
getName());
211 RegistryKey & key, OUString
const & path,
bool probe)
217 case RegError::NO_ERROR:
219 case RegError::KEY_NOT_EXISTS:
225 throw FileFormatException(
227 (
"legacy format: cannot open sub-key " + path +
" of "
228 + key.
getName() +
": " + OUString::number(
static_cast<int>(e))));
230 std::vector< char > buf;
232 switch (reader.getTypeClass()) {
235 std::vector< AnnotatedReference > mandBases;
236 sal_uInt16
n = reader.getSuperTypeCount();
237 for (sal_uInt16 j = 0; j !=
n; ++j) {
238 mandBases.emplace_back(
239 reader.getSuperTypeName(j).replace(
'/',
'.'),
240 std::vector< OUString >());
242 std::vector< AnnotatedReference > optBases;
243 n = reader.getReferenceCount();
244 for (sal_uInt16 j = 0; j !=
n; ++j) {
245 optBases.emplace_back(
246 reader.getReferenceTypeName(j).replace(
'/',
'.'),
247 translateAnnotations(reader.getReferenceDocumentation(j)));
249 sal_uInt16 methodCount = reader.getMethodCount();
250 std::vector< InterfaceTypeEntity::Attribute > attrs;
251 n = reader.getFieldCount();
252 for (sal_uInt16 j = 0; j !=
n; ++j) {
253 OUString
attrName(reader.getFieldName(j));
254 std::vector< OUString > getExcs;
255 std::vector< OUString > setExcs;
256 for (sal_uInt16 k = 0; k != methodCount; ++k) {
257 if (reader.getMethodName(k) == attrName) {
258 switch (reader.getMethodFlags(k)) {
259 case RTMethodMode::ATTRIBUTE_GET:
262 = reader.getMethodExceptionCount(k);
266 for (sal_uInt16 l = 0; l !=
m; ++l) {
268 reader.getMethodExceptionTypeName(k, l).
273 case RTMethodMode::ATTRIBUTE_SET:
276 = reader.getMethodExceptionCount(k);
280 for (sal_uInt16 l = 0; l !=
m; ++l) {
282 reader.getMethodExceptionTypeName(k, l).
288 throw FileFormatException(
290 (
"legacy format: method and attribute with same"
292 +
" in interface type with key "
299 attrName, reader.getFieldTypeName(j).replace(
'/',
'.'),
300 bool(flags & RTFieldAccess::BOUND),
301 bool(flags & RTFieldAccess::READONLY), std::move(getExcs), std::move(setExcs),
302 translateAnnotations(reader.getFieldDocumentation(j)));
304 std::vector< InterfaceTypeEntity::Method > meths;
305 meths.reserve(methodCount);
306 for (sal_uInt16 j = 0; j != methodCount; ++j) {
308 if (flags != RTMethodMode::ATTRIBUTE_GET
309 && flags != RTMethodMode::ATTRIBUTE_SET)
311 std::vector< InterfaceTypeEntity::Method::Parameter >
313 sal_uInt16
m = reader.getMethodParameterCount(j);
317 for (sal_uInt16 k = 0; k !=
m; ++k) {
319 InterfaceTypeEntity::Method::Parameter::Direction dir;
322 dir = InterfaceTypeEntity::Method::Parameter::DIRECTION_IN;
325 dir = InterfaceTypeEntity::Method::Parameter::DIRECTION_OUT;
328 dir = InterfaceTypeEntity::Method::Parameter::DIRECTION_IN_OUT;
331 throw FileFormatException(
333 (
"legacy format: unexpected mode "
334 + OUString::number(mode) +
" of parameter "
335 + reader.getMethodParameterName(j, k)
336 +
" of method " + reader.getMethodName(j)
337 +
" in interface type with key "
341 reader.getMethodParameterName(j, k),
342 (reader.getMethodParameterTypeName(j, k).
346 std::vector< OUString > excs;
347 m = reader.getMethodExceptionCount(j);
351 for (sal_uInt16 k = 0; k !=
m; ++k) {
353 reader.getMethodExceptionTypeName(j, k).replace(
357 reader.getMethodName(j),
358 reader.getMethodReturnTypeName(j).replace(
'/',
'.'),
359 std::move(params), std::move(excs),
360 translateAnnotations(
361 reader.getMethodDocumentation(j)));
364 return new InterfaceTypeEntity(
365 reader.isPublished(), std::move(mandBases), std::move(optBases), std::move(attrs), std::move(meths),
366 translateAnnotations(reader.getDocumentation()));
369 return new Module(manager, ucr, sub);
372 sal_uInt16
n = reader.getReferenceCount();
375 switch (reader.getSuperTypeCount()) {
379 base = reader.getSuperTypeName(0).replace(
'/',
'.');
382 throw FileFormatException(
384 (
"legacy format: unexpected number "
385 + OUString::number(reader.getSuperTypeCount())
386 +
" of super-types of plain struct type with key "
389 std::vector< PlainStructTypeEntity::Member > mems;
390 n = reader.getFieldCount();
391 for (sal_uInt16 j = 0; j !=
n; ++j) {
393 reader.getFieldName(j),
394 reader.getFieldTypeName(j).replace(
'/',
'.'),
395 translateAnnotations(reader.getFieldDocumentation(j)));
397 return new PlainStructTypeEntity(
398 reader.isPublished(), base, std::move(mems),
399 translateAnnotations(reader.getDocumentation()));
401 if (reader.getSuperTypeCount() != 0) {
402 throw FileFormatException(
404 (
"legacy format: unexpected number "
405 + OUString::number(reader.getSuperTypeCount())
406 +
" of super-types of polymorphic struct type template"
407 " with key " + sub.
getName()));
409 std::vector< OUString > params;
410 for (sal_uInt16 j = 0; j !=
n; ++j) {
412 reader.getReferenceTypeName(j).replace(
'/',
'.'));
414 std::vector< PolymorphicStructTypeTemplateEntity::Member > mems;
415 n = reader.getFieldCount();
416 for (sal_uInt16 j = 0; j !=
n; ++j) {
418 reader.getFieldName(j),
419 reader.getFieldTypeName(j).replace(
'/',
'.'),
421 reader.getFieldFlags(j)
422 & RTFieldAccess::PARAMETERIZED_TYPE),
423 translateAnnotations(reader.getFieldDocumentation(j)));
425 return new PolymorphicStructTypeTemplateEntity(
426 reader.isPublished(), std::move(params), std::move(mems),
427 translateAnnotations(reader.getDocumentation()));
432 std::vector< EnumTypeEntity::Member > mems;
433 sal_uInt16
n = reader.getFieldCount();
434 for (sal_uInt16 j = 0; j !=
n; ++j) {
436 if (
v.m_type != RT_TYPE_INT32) {
437 throw FileFormatException(
439 (
"legacy format: unexpected type "
440 + OUString::number(
v.m_type) +
" of value of field "
441 + reader.getFieldName(j) +
" of enum type with key "
445 reader.getFieldName(j),
v.m_value.aLong,
446 translateAnnotations(reader.getFieldDocumentation(j)));
449 return new EnumTypeEntity(
450 reader.isPublished(), std::move(mems),
451 translateAnnotations(reader.getDocumentation()));
456 switch (reader.getSuperTypeCount()) {
460 base = reader.getSuperTypeName(0).replace(
'/',
'.');
463 throw FileFormatException(
465 (
"legacy format: unexpected number "
466 + OUString::number(reader.getSuperTypeCount())
467 +
" of super-types of exception type with key "
470 std::vector< ExceptionTypeEntity::Member > mems;
471 sal_uInt16
n = reader.getFieldCount();
472 for (sal_uInt16 j = 0; j !=
n; ++j) {
474 reader.getFieldName(j),
475 reader.getFieldTypeName(j).replace(
'/',
'.'),
476 translateAnnotations(reader.getFieldDocumentation(j)));
478 return new ExceptionTypeEntity(
479 reader.isPublished(), base, std::move(mems),
480 translateAnnotations(reader.getDocumentation()));
483 if (reader.getSuperTypeCount() != 1) {
484 throw FileFormatException(
486 (
"legacy format: unexpected number "
487 + OUString::number(reader.getSuperTypeCount())
488 +
" of super-types of typedef with key " + sub.
getName()));
490 return new TypedefEntity(
491 reader.isPublished(), reader.getSuperTypeName(0).replace(
'/',
'.'),
492 translateAnnotations(reader.getDocumentation()));
494 switch (reader.getSuperTypeCount()) {
497 std::vector< AnnotatedReference > mandServs;
498 std::vector< AnnotatedReference > optServs;
499 std::vector< AnnotatedReference > mandIfcs;
500 std::vector< AnnotatedReference > optIfcs;
501 sal_uInt16
n = reader.getReferenceCount();
502 for (sal_uInt16 j = 0; j !=
n; ++j) {
503 AnnotatedReference
base{
504 reader.getReferenceTypeName(j).replace(
'/',
'.'),
505 translateAnnotations(
506 reader.getReferenceDocumentation(j))};
507 switch (reader.getReferenceSort(j)) {
508 case RTReferenceType::EXPORTS:
509 if (!(reader.getReferenceFlags(j) & RTFieldAccess::OPTIONAL))
511 mandServs.push_back(base);
513 optServs.push_back(base);
516 case RTReferenceType::SUPPORTS:
517 if (!(reader.getReferenceFlags(j) & RTFieldAccess::OPTIONAL))
519 mandIfcs.push_back(base);
521 optIfcs.push_back(base);
525 throw FileFormatException(
527 (
"legacy format: unexpected mode "
528 + OUString::number(
static_cast<int>(reader.getReferenceSort(j)))
529 +
" of reference " + reader.getReferenceTypeName(j)
530 +
" in service with key " + sub.
getName()));
533 std::vector< AccumulationBasedServiceEntity::Property >
props;
534 n = reader.getFieldCount();
535 for (sal_uInt16 j = 0; j !=
n; ++j) {
538 if (acc & RTFieldAccess::READONLY) {
539 attrs |= AccumulationBasedServiceEntity::Property::
542 if (acc & RTFieldAccess::OPTIONAL) {
543 attrs |= AccumulationBasedServiceEntity::Property::
546 if (acc & RTFieldAccess::MAYBEVOID) {
547 attrs |= AccumulationBasedServiceEntity::Property::
548 ATTRIBUTE_MAYBE_VOID;
550 if (acc & RTFieldAccess::BOUND) {
551 attrs |= AccumulationBasedServiceEntity::Property::
554 if (acc & RTFieldAccess::CONSTRAINED) {
555 attrs |= AccumulationBasedServiceEntity::Property::
556 ATTRIBUTE_CONSTRAINED;
558 if (acc & RTFieldAccess::TRANSIENT) {
559 attrs |= AccumulationBasedServiceEntity::Property::
562 if (acc & RTFieldAccess::MAYBEAMBIGUOUS) {
563 attrs |= AccumulationBasedServiceEntity::Property::
564 ATTRIBUTE_MAYBE_AMBIGUOUS;
566 if (acc & RTFieldAccess::MAYBEDEFAULT) {
567 attrs |= AccumulationBasedServiceEntity::Property::
568 ATTRIBUTE_MAYBE_DEFAULT;
570 if (acc & RTFieldAccess::REMOVABLE) {
571 attrs |= AccumulationBasedServiceEntity::Property::
575 reader.getFieldName(j),
576 reader.getFieldTypeName(j).replace(
'/',
'.'),
578 AccumulationBasedServiceEntity::Property::
580 translateAnnotations(reader.getFieldDocumentation(j)));
582 return new AccumulationBasedServiceEntity(
583 reader.isPublished(), std::move(mandServs), std::move(optServs), std::move(mandIfcs),
584 std::move(optIfcs), std::move(props),
585 translateAnnotations(reader.getDocumentation()));
589 std::vector< SingleInterfaceBasedServiceEntity::Constructor >
591 sal_uInt16
n = reader.getMethodCount();
592 if (n == 1 && reader.getMethodFlags(0) == RTMethodMode::TWOWAY
593 && reader.getMethodName(0).isEmpty()
594 && reader.getMethodReturnTypeName(0) ==
"void"
595 && reader.getMethodParameterCount(0) == 0
596 && reader.getMethodExceptionCount(0) == 0)
599 SingleInterfaceBasedServiceEntity::Constructor());
601 for (sal_uInt16 j = 0; j !=
n; ++j) {
602 if (reader.getMethodFlags(j) != RTMethodMode::TWOWAY) {
603 throw FileFormatException(
605 (
"legacy format: unexpected mode "
606 + OUString::number(
static_cast<int>(reader.getMethodFlags(j)))
607 +
" of constructor " + reader.getMethodName(j)
608 +
" in service with key " + sub.
getName()));
611 SingleInterfaceBasedServiceEntity::Constructor::
613 sal_uInt16
m = reader.getMethodParameterCount(j);
617 for (sal_uInt16 k = 0; k !=
m; ++k) {
619 = reader.getMethodParameterFlags(j, k);
620 if ((mode & ~RT_PARAM_REST) != RT_PARAM_IN) {
621 throw FileFormatException(
623 (
"legacy format: unexpected mode "
624 + OUString::number(mode)
626 + reader.getMethodParameterName(j, k)
628 + reader.getMethodName(j)
629 +
" in service with key "
632 if ((mode & RT_PARAM_REST) != 0
634 || ((reader.getMethodParameterTypeName(
638 throw FileFormatException(
640 (
"legacy format: bad rest parameter "
641 + reader.getMethodParameterName(j, k)
643 + reader.getMethodName(j)
644 +
" in service with key "
648 reader.getMethodParameterName(j, k),
649 (reader.getMethodParameterTypeName(j, k).
651 (mode & RT_PARAM_REST) != 0);
653 std::vector< OUString > excs;
654 m = reader.getMethodExceptionCount(j);
658 for (sal_uInt16 k = 0; k !=
m; ++k) {
660 reader.getMethodExceptionTypeName(j, k).replace(
664 SingleInterfaceBasedServiceEntity::Constructor(
665 reader.getMethodName(j), std::move(params), std::move(excs),
666 translateAnnotations(
667 reader.getMethodDocumentation(j))));
670 return new SingleInterfaceBasedServiceEntity(
671 reader.isPublished(),
672 reader.getSuperTypeName(0).replace(
'/',
'.'), std::move(ctors),
673 translateAnnotations(reader.getDocumentation()));
676 throw FileFormatException(
678 (
"legacy format: unexpected number "
679 + OUString::number(reader.getSuperTypeCount())
680 +
" of super-types of service with key " + sub.
getName()));
684 if (reader.getSuperTypeCount() != 1) {
685 throw FileFormatException(
687 (
"legacy format: unexpected number "
688 + OUString::number(reader.getSuperTypeCount())
689 +
" of super-types of singleton with key "
692 OUString basePath(reader.getSuperTypeName(0));
693 OUString baseName(basePath.replace(
'/',
'.'));
697 switch (
base->getSort()) {
698 case Entity::SORT_INTERFACE_TYPE:
701 case Entity::SORT_ACCUMULATION_BASED_SERVICE:
705 throw FileFormatException(
707 (
"legacy format: unexpected sort "
708 + OUString::number(
base->getSort()) +
" of base "
709 + baseName +
" of singleton with key "
714 e = ucr.
openKey(basePath, key2);
716 case RegError::NO_ERROR:
718 case RegError::KEY_NOT_EXISTS:
719 throw FileFormatException(
721 (
"legacy format: unknown super-type " + basePath
722 +
" of super-type with key " + sub.
getName()));
724 throw FileFormatException(
726 (
"legacy format: cannot open ucr sub-key " + basePath
727 +
": " + OUString::number(
static_cast<int>(e))));
729 std::vector< char > buf2;
731 switch (reader2.getTypeClass()) {
739 throw FileFormatException(
741 (
"legacy format: unexpected type class "
742 + OUString::number(reader2.getTypeClass())
743 +
" of super-type with key " + key2.
getName()
744 +
" of singleton with key " + sub.
getName()));
749 new InterfaceBasedSingletonEntity(
750 reader.isPublished(), baseName,
751 translateAnnotations(reader.getDocumentation())))
753 new ServiceBasedSingletonEntity(
754 reader.isPublished(), baseName,
755 translateAnnotations(reader.getDocumentation())));
759 std::vector< ConstantGroupEntity::Member > mems;
760 sal_uInt16
n = reader.getFieldCount();
761 for (sal_uInt16 j = 0; j !=
n; ++j) {
763 reader.getFieldName(j),
764 translateConstantValue(sub, reader.getFieldValue(j)),
765 translateAnnotations(reader.getFieldDocumentation(j)));
767 return new ConstantGroupEntity(
768 reader.isPublished(), std::move(mems),
769 translateAnnotations(reader.getDocumentation()));
772 throw FileFormatException(
774 (
"legacy format: unexpected type class "
775 + OUString::number(reader.getTypeClass()) +
" of key "
782LegacyProvider::LegacyProvider(
Manager & manager, OUString
const & uri):
788 case RegError::NO_ERROR:
790 case RegError::REGISTRY_NOT_EXISTS:
794 uri,
"cannot open legacy file: " + OUString::number(
static_cast<int>(e)));
798 if (e != RegError::NO_ERROR) {
800 uri,
"legacy format: cannot open root key: " + OUString::number(
static_cast<int>(e)));
804 case RegError::NO_ERROR:
805 case RegError::KEY_NOT_EXISTS:
809 uri,
"legacy format: cannot open UCR key: " + OUString::number(
static_cast<int>(e)));
OUString getElement(sal_uInt32 index)
sal_uInt32 getLength() const
OUString getRegistryName()
RegError getKeyNames(const OUString &keyName, RegistryKeyNames &rSubKeyNames)
RegError openKey(const OUString &keyName, RegistryKey &rOpenKey)
RegError getValueInfo(const OUString &keyName, RegValueType *pValueType, sal_uInt32 *pValueSize)
RegError getValue(const OUString &keyName, RegValue pValue)
RegError openRootKey(RegistryKey &rRootKey)
RegError open(const OUString ®istryName, RegAccessMode accessMode)
virtual rtl::Reference< MapCursor > createRootCursor() const override
virtual rtl::Reference< Entity > findEntity(OUString const &name) const override
virtual ~LegacyProvider() noexcept override
rtl::Reference< ParseManager > manager
rtl::Reference< Manager > manager_
enum SAL_DLLPUBLIC_RTTI RegValueType
enum SAL_DLLPUBLIC_RTTI RegError