summaryrefslogtreecommitdiff
path: root/unoidl/source/reg2unoidl.cxx
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2013-09-16 16:48:09 +0200
committerStephan Bergmann <sbergman@redhat.com>2013-09-16 16:48:09 +0200
commitfc54915c461dc753866627bd52ea60b12b71a012 (patch)
tree8f71995fb5420ae1c32e8669e3fd249c82728f8e /unoidl/source/reg2unoidl.cxx
parent95e566b9a0df06d130e118181058273f034bcf2c (diff)
Replace reg2unoidl with unoidl-write
...that can also generate an .rdb containing a specific set of entities, intended to replace idlc (when reading directly from .idl source registries). Change-Id: I630ce4640828979d7952dc24dbbef80a42a8140a
Diffstat (limited to 'unoidl/source/reg2unoidl.cxx')
-rw-r--r--unoidl/source/reg2unoidl.cxx977
1 files changed, 0 insertions, 977 deletions
diff --git a/unoidl/source/reg2unoidl.cxx b/unoidl/source/reg2unoidl.cxx
deleted file mode 100644
index bf2b6d271ab2..000000000000
--- a/unoidl/source/reg2unoidl.cxx
+++ /dev/null
@@ -1,977 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-#include "sal/config.h"
-
-#include <cassert>
-#include <cstddef>
-#include <cstdlib>
-#include <iostream>
-#include <map>
-#include <utility>
-#include <vector>
-
-#include "config_version.h"
-#include "osl/endian.h"
-#include "osl/file.h"
-#include "osl/file.hxx"
-#include "osl/process.h"
-#include "rtl/process.h"
-#include "rtl/string.h"
-#include "rtl/string.hxx"
-#include "rtl/textenc.h"
-#include "rtl/textcvt.h"
-#include "rtl/ustring.hxx"
-#include "sal/macros.h"
-#include "sal/main.h"
-#include "unoidl/unoidl.hxx"
-
-namespace {
-
-OUString getArgumentUri(sal_uInt32 argument) {
- OUString arg;
- rtl_getAppCommandArg(argument, &arg.pData);
- OUString url;
- osl::FileBase::RC e1 = osl::FileBase::getFileURLFromSystemPath(arg, url);
- if (e1 != osl::FileBase::E_None) {
- std::cerr
- << "Cannot convert \"" << arg << "\" to file URL, error code "
- << +e1 << std::endl;
- std::exit(EXIT_FAILURE);
- }
- OUString cwd;
- oslProcessError e2 = osl_getProcessWorkingDir(&cwd.pData);
- if (e2 != osl_Process_E_None) {
- std::cerr
- << "Cannot obtain working directory, error code " << +e2
- << std::endl;
- std::exit(EXIT_FAILURE);
- }
- OUString abs;
- e1 = osl::FileBase::getAbsoluteFileURL(cwd, url, abs);
- if (e1 != osl::FileBase::E_None) {
- std::cerr
- << "Cannot make \"" << url
- << "\" into an absolute file URL, error code " << +e1 << std::endl;
- std::exit(EXIT_FAILURE);
- }
- return abs;
-}
-
-rtl::Reference< unoidl::Provider > load(
- rtl::Reference< unoidl::Manager > const & manager, OUString const & uri)
-{
- try {
- return unoidl::loadProvider(manager, uri);
- } catch (unoidl::NoSuchFileException &) {
- std::cerr << "Input <" << uri << "> does not exist" << std::endl;
- std::exit(EXIT_FAILURE);
- } catch (unoidl::FileFormatException & e) {
- std::cerr
- << "Cannot read input <" << uri << ">: " << e.getDetail()
- << std::endl;
- std::exit(EXIT_FAILURE);
- }
-}
-
-sal_uInt64 getOffset(osl::File & file) {
- sal_uInt64 off;
- osl::FileBase::RC e = file.getPos(off);
- if (e != osl::FileBase::E_None) {
- std::cerr
- << "Cannot determine current position in <" << file.getURL()
- << ">, error code " << +e << std::endl;
- std::exit(EXIT_FAILURE);
- }
- return off;
-}
-
-void write(osl::File & file, void const * buffer, sal_uInt64 size) {
- sal_uInt64 n;
- osl::FileBase::RC e = file.write(buffer, size, n);
- if (e != osl::FileBase::E_None) {
- std::cerr
- << "Cannot write to <" << file.getURL() << ">, error code " << +e
- << std::endl;
- std::exit(EXIT_FAILURE);
- }
- if (n != size) {
- std::cerr
- << "Bad write of " << n << " instead of " << size << " bytes to <"
- << file.getURL() << '>' << std::endl;
- std::exit(EXIT_FAILURE);
- }
-}
-
-void write8(osl::File & file, sal_uInt64 value) {
- if (value > 0xFF) {
- std::cerr
- << "Cannot write value >= 2^8; input is too large" << std::endl;
- std::exit(EXIT_FAILURE);
- }
- unsigned char buf[1];
- buf[0] = value & 0xFF;
- write(file, buf, SAL_N_ELEMENTS(buf));
-}
-
-void write16(osl::File & file, sal_uInt64 value) {
- if (value > 0xFFFF) {
- std::cerr
- << "Cannot write value >= 2^16; input is too large" << std::endl;
- std::exit(EXIT_FAILURE);
- }
- unsigned char buf[2];
- buf[0] = value & 0xFF;
- buf[1] = (value >> 8) & 0xFF;
- write(file, buf, SAL_N_ELEMENTS(buf));
-}
-
-void write32(osl::File & file, sal_uInt64 value) {
- if (value > 0xFFFFFFFF) {
- std::cerr
- << "Cannot write value >= 2^32; input is too large" << std::endl;
- std::exit(EXIT_FAILURE);
- }
- unsigned char buf[4];
- buf[0] = value & 0xFF;
- buf[1] = (value >> 8) & 0xFF;
- buf[2] = (value >> 16) & 0xFF;
- buf[3] = (value >> 24) & 0xFF;
- write(file, buf, SAL_N_ELEMENTS(buf));
-}
-
-void write64(osl::File & file, sal_uInt64 value) {
- unsigned char buf[8];
- buf[0] = value & 0xFF;
- buf[1] = (value >> 8) & 0xFF;
- buf[2] = (value >> 16) & 0xFF;
- buf[3] = (value >> 24) & 0xFF;
- buf[4] = (value >> 32) & 0xFF;
- buf[5] = (value >> 40) & 0xFF;
- buf[6] = (value >> 48) & 0xFF;
- buf[7] = (value >> 56) & 0xFF;
- write(file, buf, SAL_N_ELEMENTS(buf));
-}
-
-void writeIso60599Binary32(osl::File & file, float value) {
- union {
- unsigned char buf[4];
- float f; // assuming float is ISO 60599 binary32
- } sa;
- sa.f = value;
-#if defined OSL_BIGENDIAN
- std::swap(sa.buf[0], sa.buf[3]);
- std::swap(sa.buf[1], sa.buf[2]);
-#endif
- write(file, sa.buf, SAL_N_ELEMENTS(sa.buf));
-}
-
-void writeIso60599Binary64(osl::File & file, double value) {
- union {
- unsigned char buf[8];
- float d; // assuming double is ISO 60599 binary64
- } sa;
- sa.d = value;
-#if defined OSL_BIGENDIAN
- std::swap(sa.buf[0], sa.buf[7]);
- std::swap(sa.buf[1], sa.buf[6]);
- std::swap(sa.buf[2], sa.buf[5]);
- std::swap(sa.buf[3], sa.buf[4]);
-#endif
- write(file, sa.buf, SAL_N_ELEMENTS(sa.buf));
-}
-
-OString toAscii(OUString const & name) {
- OString ascii;
- if (!name.convertToString(
- &ascii, RTL_TEXTENCODING_ASCII_US,
- (RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR
- | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR)))
- {
- std::cerr
- << "Cannot convert \"" << name << "\" to US ASCII" << std::endl;
- std::exit(EXIT_FAILURE);
- }
- return ascii;
-}
-
-OString toUtf8(OUString const & string) {
- OString ascii;
- if (!string.convertToString(
- &ascii, RTL_TEXTENCODING_UTF8,
- (RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR
- | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR)))
- {
- std::cerr
- << "Cannot convert \"" << string << "\" to UTF-8" << std::endl;
- std::exit(EXIT_FAILURE);
- }
- return ascii;
-}
-
-sal_uInt64 writeNulName(osl::File & file, OUString const & name) {
- OString ascii(toAscii(name));
- if (ascii.indexOf('\0') != -1) {
- std::cerr
- << "Name \"" << ascii << "\" contains NUL characters" << std::endl;
- std::exit(EXIT_FAILURE);
- }
- sal_uInt64 off = getOffset(file);
- write(file, ascii.getStr(), ascii.getLength() + 1);
- return off;
-}
-
-void writeIdxString(osl::File & file, OString const & string) {
- static std::map< OString, sal_uInt64 > reuse;
- std::map< OString, sal_uInt64 >::iterator i(reuse.find(string));
- if (i == reuse.end()) {
- reuse.insert(std::make_pair(string, getOffset(file)));
- assert(
- (static_cast< sal_uInt64 >(string.getLength()) & 0x80000000) == 0);
- write32(file, static_cast< sal_uInt64 >(string.getLength()));
- write(file, string.getStr(), string.getLength());
- } else {
- if ((i->second & 0x80000000) != 0) {
- std::cerr
- << "Cannot write index 0x" << std::hex << i->second << std::dec
- << " of \"" << string << "\"; input is too large" << std::endl;
- std::exit(EXIT_FAILURE);
- }
- write32(file, i->second | 0x80000000);
- }
-}
-
-void writeIdxName(osl::File & file, OUString const & name) {
- writeIdxString(file, toAscii(name));
-}
-
-void writeAnnotations(
- osl::File & file, bool annotate,
- std::vector< OUString > const & annotations)
-{
- assert(annotate || annotations.empty());
- if (annotate) {
- write32(file, annotations.size());
- // overflow from std::vector::size_type -> sal_uInt64 is unrealistic
- for (std::vector< OUString >::const_iterator i(annotations.begin());
- i != annotations.end(); ++i)
- {
- writeIdxString(file, toUtf8(*i));
- }
- }
-}
-
-void writeKind(
- osl::File & file,
- rtl::Reference< unoidl::PublishableEntity > const & entity,
- bool annotated, bool flag = false)
-{
- assert(entity.is());
- sal_uInt64 v = entity->getSort();
- if (entity->isPublished()) {
- v |= 0x80;
- }
- if (annotated) {
- v |= 0x40;
- }
- if (flag) {
- v |= 0x20;
- }
- write8(file, v);
-}
-
-struct Item {
- explicit Item(rtl::Reference< unoidl::Entity > const & theEntity):
- entity(theEntity), nameOffset(0), dataOffset(0)
- {}
-
- rtl::Reference< unoidl::Entity > entity;
- sal_uInt64 nameOffset;
- sal_uInt64 dataOffset;
-};
-
-struct ConstItem {
- ConstItem(
- unoidl::ConstantValue const & theConstant,
- std::vector< OUString > const & theAnnotations):
- constant(theConstant), annotations(theAnnotations), nameOffset(0),
- dataOffset(0)
- {}
-
- unoidl::ConstantValue constant;
- std::vector< OUString > annotations;
- sal_uInt64 nameOffset;
- sal_uInt64 dataOffset;
-};
-
-sal_uInt64 writeMap(
- osl::File & file, rtl::Reference< unoidl::MapCursor > const & cursor,
- std::size_t * rootSize)
-{
- assert(cursor.is());
- std::map< OUString, Item > map;
- for (;;) {
- OUString name;
- rtl::Reference< unoidl::Entity > ent(cursor->getNext(&name));
- if (!ent.is()) {
- break;
- }
- if (!map.insert(std::make_pair(name, Item(ent))).second) {
- std::cout << "Duplicate name \"" << name << '"' << std::endl;
- std::exit(EXIT_FAILURE);
- }
- }
- for (std::map< OUString, Item >::iterator i(map.begin()); i != map.end();
- ++i)
- {
- switch (i->second.entity->getSort()) {
- case unoidl::Entity::SORT_MODULE:
- {
- rtl::Reference< unoidl::ModuleEntity > ent2(
- static_cast< unoidl::ModuleEntity * >(
- i->second.entity.get()));
- i->second.dataOffset = writeMap(file, ent2->createCursor(), 0);
- break;
- }
- case unoidl::Entity::SORT_ENUM_TYPE:
- {
- rtl::Reference< unoidl::EnumTypeEntity > ent2(
- static_cast< unoidl::EnumTypeEntity * >(
- i->second.entity.get()));
- bool ann = !ent2->getAnnotations().empty();
- for (std::vector< unoidl::EnumTypeEntity::Member >::
- const_iterator j(ent2->getMembers().begin());
- !ann && j != ent2->getMembers().end(); ++j)
- {
- ann = !j->annotations.empty();
- }
- i->second.dataOffset = getOffset(file);
- writeKind(file, ent2.get(), ann);
- write32(file, ent2->getMembers().size());
- for (std::vector< unoidl::EnumTypeEntity::Member >::
- const_iterator j(ent2->getMembers().begin());
- j != ent2->getMembers().end(); ++j)
- {
- writeIdxName(file, j->name);
- write32(file, static_cast< sal_uInt32 >(j->value));
- writeAnnotations(file, ann, j->annotations);
- }
- writeAnnotations(file, ann, ent2->getAnnotations());
- break;
- }
- case unoidl::Entity::SORT_PLAIN_STRUCT_TYPE:
- {
- rtl::Reference< unoidl::PlainStructTypeEntity > ent2(
- static_cast< unoidl::PlainStructTypeEntity * >(
- i->second.entity.get()));
- bool ann = !ent2->getAnnotations().empty();
- for (std::vector< unoidl::PlainStructTypeEntity::Member >::
- const_iterator j(ent2->getDirectMembers().begin());
- !ann && j != ent2->getDirectMembers().end(); ++j)
- {
- ann = !j->annotations.empty();
- }
- i->second.dataOffset = getOffset(file);
- writeKind(
- file, ent2.get(), ann, !ent2->getDirectBase().isEmpty());
- if (!ent2->getDirectBase().isEmpty()) {
- writeIdxName(file, ent2->getDirectBase());
- }
- write32(file, ent2->getDirectMembers().size());
- for (std::vector< unoidl::PlainStructTypeEntity::Member >::
- const_iterator j(ent2->getDirectMembers().begin());
- j != ent2->getDirectMembers().end(); ++j)
- {
- writeIdxName(file, j->name);
- writeIdxName(file, j->type);
- writeAnnotations(file, ann, j->annotations);
- }
- writeAnnotations(file, ann, ent2->getAnnotations());
- break;
- }
- case unoidl::Entity::SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE:
- {
- rtl::Reference< unoidl::PolymorphicStructTypeTemplateEntity >
- ent2(
- static_cast<
- unoidl::PolymorphicStructTypeTemplateEntity * >(
- i->second.entity.get()));
- bool ann = !ent2->getAnnotations().empty();
- for (std::vector<
- unoidl::PolymorphicStructTypeTemplateEntity::Member >::
- const_iterator j(
- ent2->getMembers().begin());
- !ann && j != ent2->getMembers().end(); ++j)
- {
- ann = !j->annotations.empty();
- }
- i->second.dataOffset = getOffset(file);
- writeKind(file, ent2.get(), ann);
- write32(file, ent2->getTypeParameters().size());
- for (std::vector< OUString >::const_iterator j(
- ent2->getTypeParameters().begin());
- j != ent2->getTypeParameters().end(); ++j)
- {
- writeIdxName(file, *j);
- }
- write32(file, ent2->getMembers().size());
- for (std::vector<
- unoidl::PolymorphicStructTypeTemplateEntity::Member >::
- const_iterator j(
- ent2->getMembers().begin());
- j != ent2->getMembers().end(); ++j)
- {
- sal_uInt64 f = 0;
- if (j->parameterized) {
- f |= 0x01;
- }
- write8(file, f);
- writeIdxName(file, j->name);
- writeIdxName(file, j->type);
- writeAnnotations(file, ann, j->annotations);
- }
- writeAnnotations(file, ann, ent2->getAnnotations());
- break;
- }
- case unoidl::Entity::SORT_EXCEPTION_TYPE:
- {
- rtl::Reference< unoidl::ExceptionTypeEntity > ent2(
- static_cast< unoidl::ExceptionTypeEntity * >(
- i->second.entity.get()));
- bool ann = !ent2->getAnnotations().empty();
- for (std::vector< unoidl::ExceptionTypeEntity::Member >::
- const_iterator j(ent2->getDirectMembers().begin());
- !ann && j != ent2->getDirectMembers().end(); ++j)
- {
- ann = !j->annotations.empty();
- }
- i->second.dataOffset = getOffset(file);
- writeKind(
- file, ent2.get(), ann, !ent2->getDirectBase().isEmpty());
- if (!ent2->getDirectBase().isEmpty()) {
- writeIdxName(file, ent2->getDirectBase());
- }
- write32(file, ent2->getDirectMembers().size());
- for (std::vector< unoidl::ExceptionTypeEntity::Member >::
- const_iterator j(ent2->getDirectMembers().begin());
- j != ent2->getDirectMembers().end(); ++j)
- {
- writeIdxName(file, j->name);
- writeIdxName(file, j->type);
- writeAnnotations(file, ann, j->annotations);
- }
- writeAnnotations(file, ann, ent2->getAnnotations());
- break;
- }
- case unoidl::Entity::SORT_INTERFACE_TYPE:
- {
- rtl::Reference< unoidl::InterfaceTypeEntity > ent2(
- static_cast< unoidl::InterfaceTypeEntity * >(
- i->second.entity.get()));
- bool ann = !ent2->getAnnotations().empty();
- for (std::vector< unoidl::AnnotatedReference >::const_iterator
- j(ent2->getDirectMandatoryBases().begin());
- !ann && j != ent2->getDirectMandatoryBases().end(); ++j)
- {
- ann = !j->annotations.empty();
- }
- for (std::vector< unoidl::AnnotatedReference >::const_iterator
- j(ent2->getDirectOptionalBases().begin());
- !ann && j != ent2->getDirectOptionalBases().end(); ++j)
- {
- ann = !j->annotations.empty();
- }
- for (std::vector< unoidl::InterfaceTypeEntity::Attribute >::
- const_iterator j(ent2->getDirectAttributes().begin());
- !ann && j != ent2->getDirectAttributes().end(); ++j)
- {
- ann = !j->annotations.empty();
- }
- for (std::vector< unoidl::InterfaceTypeEntity::Method >::
- const_iterator j(ent2->getDirectMethods().begin());
- !ann && j != ent2->getDirectMethods().end(); ++j)
- {
- ann = !j->annotations.empty();
- }
- i->second.dataOffset = getOffset(file);
- writeKind(file, ent2.get(), ann);
- write32(file, ent2->getDirectMandatoryBases().size());
- for (std::vector< unoidl::AnnotatedReference >::const_iterator
- j(ent2->getDirectMandatoryBases().begin());
- j != ent2->getDirectMandatoryBases().end(); ++j)
- {
- writeIdxName(file, j->name);
- writeAnnotations(file, ann, j->annotations);
- }
- write32(file, ent2->getDirectOptionalBases().size());
- for (std::vector< unoidl::AnnotatedReference >::const_iterator
- j(ent2->getDirectOptionalBases().begin());
- j != ent2->getDirectOptionalBases().end(); ++j)
- {
- writeIdxName(file, j->name);
- writeAnnotations(file, ann, j->annotations);
- }
- write32(file, ent2->getDirectAttributes().size());
- for (std::vector< unoidl::InterfaceTypeEntity::Attribute >::
- const_iterator j(ent2->getDirectAttributes().begin());
- j != ent2->getDirectAttributes().end(); ++j)
- {
- sal_uInt64 f = 0;
- if (j->bound) {
- f |= 0x01;
- }
- if (j->readOnly) {
- f |= 0x02;
- }
- write8(file, f);
- writeIdxName(file, j->name);
- writeIdxName(file, j->type);
- write32(file, j->getExceptions.size());
- for (std::vector< OUString >::const_iterator k(
- j->getExceptions.begin());
- k != j->getExceptions.end(); ++k)
- {
- writeIdxName(file, *k);
- }
- if (!j->readOnly) {
- write32(file, j->setExceptions.size());
- for (std::vector< OUString >::const_iterator k(
- j->setExceptions.begin());
- k != j->setExceptions.end(); ++k)
- {
- writeIdxName(file, *k);
- }
- }
- writeAnnotations(file, ann, j->annotations);
- }
- write32(file, ent2->getDirectMethods().size());
- for (std::vector< unoidl::InterfaceTypeEntity::Method >::
- const_iterator j(ent2->getDirectMethods().begin());
- j != ent2->getDirectMethods().end(); ++j)
- {
- writeIdxName(file, j->name);
- writeIdxName(file, j->returnType);
- write32(file, j->parameters.size());
- for (std::vector<
- unoidl::InterfaceTypeEntity::Method::Parameter >::
- const_iterator k(j->parameters.begin());
- k != j->parameters.end(); ++k)
- {
- write8(file, k->direction);
- writeIdxName(file, k->name);
- writeIdxName(file, k->type);
- }
- write32(file, j->exceptions.size());
- for (std::vector< OUString >::const_iterator k(
- j->exceptions.begin());
- k != j->exceptions.end(); ++k)
- {
- writeIdxName(file, *k);
- }
- writeAnnotations(file, ann, j->annotations);
- }
- writeAnnotations(file, ann, ent2->getAnnotations());
- break;
- }
- case unoidl::Entity::SORT_TYPEDEF:
- {
- rtl::Reference< unoidl::TypedefEntity > ent2(
- static_cast< unoidl::TypedefEntity * >(
- i->second.entity.get()));
- bool ann = !ent2->getAnnotations().empty();
- i->second.dataOffset = getOffset(file);
- writeKind(file, ent2.get(), ann);
- writeIdxName(file, ent2->getType());
- writeAnnotations(file, ann, ent2->getAnnotations());
- break;
- }
- case unoidl::Entity::SORT_CONSTANT_GROUP:
- {
- rtl::Reference< unoidl::ConstantGroupEntity > ent2(
- static_cast< unoidl::ConstantGroupEntity * >(
- i->second.entity.get()));
- std::map< OUString, ConstItem > cmap;
- for (std::vector< unoidl::ConstantGroupEntity::Member >::
- const_iterator j(ent2->getMembers().begin());
- j != ent2->getMembers().end(); ++j)
- {
- if (!cmap.insert(
- std::make_pair(
- j->name, ConstItem(j->value, j->annotations))).
- second)
- {
- std::cout
- << "Duplicate constant group member name \""
- << j->name << '"' << std::endl;
- std::exit(EXIT_FAILURE);
- }
- }
- for (std::map< OUString, ConstItem >::iterator j(cmap.begin());
- j != cmap.end(); ++j)
- {
- j->second.dataOffset = getOffset(file);
- sal_uInt64 v = j->second.constant.type;
- if (!j->second.annotations.empty()) {
- v |= 0x80;
- }
- write8(file, v);
- switch (j->second.constant.type) {
- case unoidl::ConstantValue::TYPE_BOOLEAN:
- write8(file, j->second.constant.booleanValue ? 1 : 0);
- break;
- case unoidl::ConstantValue::TYPE_BYTE:
- write8(
- file,
- static_cast< sal_uInt8 >(
- j->second.constant.byteValue));
- break;
- case unoidl::ConstantValue::TYPE_SHORT:
- write16(
- file,
- static_cast< sal_uInt16 >(
- j->second.constant.shortValue));
- break;
- case unoidl::ConstantValue::TYPE_UNSIGNED_SHORT:
- write16(file, j->second.constant.unsignedShortValue);
- break;
- case unoidl::ConstantValue::TYPE_LONG:
- write32(
- file,
- static_cast< sal_uInt32 >(
- j->second.constant.longValue));
- break;
- case unoidl::ConstantValue::TYPE_UNSIGNED_LONG:
- write32(file, j->second.constant.unsignedLongValue);
- break;
- case unoidl::ConstantValue::TYPE_HYPER:
- write64(
- file,
- static_cast< sal_uInt64 >(
- j->second.constant.hyperValue));
- break;
- case unoidl::ConstantValue::TYPE_UNSIGNED_HYPER:
- write64(file, j->second.constant.unsignedHyperValue);
- break;
- case unoidl::ConstantValue::TYPE_FLOAT:
- writeIso60599Binary32(
- file, j->second.constant.floatValue);
- break;
- case unoidl::ConstantValue::TYPE_DOUBLE:
- writeIso60599Binary64(
- file, j->second.constant.doubleValue);
- break;
- default:
- for (;;) { std::abort(); } // this cannot happen
- }
- writeAnnotations(
- file, !j->second.annotations.empty(),
- j->second.annotations);
- }
- for (std::map< OUString, ConstItem >::iterator j(
- cmap.begin());
- j != cmap.end(); ++j)
- {
- j->second.nameOffset = writeNulName(file, j->first);
- }
- bool ann = !ent2->getAnnotations().empty();
- i->second.dataOffset = getOffset(file);
- writeKind(file, ent2.get(), ann);
- write32(file, cmap.size());
- // overflow from std::map::size_type -> sal_uInt64 is
- // unrealistic
- for (std::map< OUString, ConstItem >::iterator j(
- cmap.begin());
- j != cmap.end(); ++j)
- {
- write32(file, j->second.nameOffset);
- write32(file, j->second.dataOffset);
- }
- writeAnnotations(file, ann, ent2->getAnnotations());
- break;
- }
- case unoidl::Entity::SORT_SINGLE_INTERFACE_BASED_SERVICE:
- {
- rtl::Reference< unoidl::SingleInterfaceBasedServiceEntity >
- ent2(
- static_cast<
- unoidl::SingleInterfaceBasedServiceEntity * >(
- i->second.entity.get()));
- bool dfltCtor = ent2->getConstructors().size() == 1
- && ent2->getConstructors()[0].defaultConstructor;
- bool ann = !ent2->getAnnotations().empty();
- if (!dfltCtor) {
- for (std::vector<
- unoidl::SingleInterfaceBasedServiceEntity::
- Constructor >::const_iterator j(
- ent2->getConstructors().begin());
- !ann && j != ent2->getConstructors().end(); ++j)
- {
- ann = !j->annotations.empty();
- }
- }
- i->second.dataOffset = getOffset(file);
- writeKind(file, ent2.get(), ann, dfltCtor);
- writeIdxName(file, ent2->getBase());
- if (!dfltCtor) {
- write32(file, ent2->getConstructors().size());
- for (std::vector<
- unoidl::SingleInterfaceBasedServiceEntity::
- Constructor >::const_iterator j(
- ent2->getConstructors().begin());
- j != ent2->getConstructors().end(); ++j)
- {
- if (j->defaultConstructor) {
- std::cout
- << "Unexpected default constructor \""
- << j->name << '"' << std::endl;
- std::exit(EXIT_FAILURE);
- }
- writeIdxName(file, j->name);
- write32(file, j->parameters.size());
- for (std::vector<
- unoidl::SingleInterfaceBasedServiceEntity::
- Constructor::Parameter >::const_iterator k(
- j->parameters.begin());
- k != j->parameters.end(); ++k)
- {
- sal_uInt64 f = 0;
- if (k->rest) {
- f |= 0x04;
- }
- write8(file, f);
- writeIdxName(file, k->name);
- writeIdxName(file, k->type);
- }
- write32(file, j->exceptions.size());
- for (std::vector< OUString >::const_iterator k(
- j->exceptions.begin());
- k != j->exceptions.end(); ++k)
- {
- writeIdxName(file, *k);
- }
- writeAnnotations(file, ann, j->annotations);
- }
- }
- writeAnnotations(file, ann, ent2->getAnnotations());
- break;
- }
- case unoidl::Entity::SORT_ACCUMULATION_BASED_SERVICE:
- {
- rtl::Reference< unoidl::AccumulationBasedServiceEntity > ent2(
- static_cast< unoidl::AccumulationBasedServiceEntity * >(
- i->second.entity.get()));
- bool ann = !ent2->getAnnotations().empty();
- for (std::vector< unoidl::AnnotatedReference >::const_iterator
- j(ent2->getDirectMandatoryBaseServices().begin());
- !ann && j != ent2->getDirectMandatoryBaseServices().end();
- ++j)
- {
- ann = !j->annotations.empty();
- }
- for (std::vector< unoidl::AnnotatedReference >::const_iterator
- j(ent2->getDirectOptionalBaseServices().begin());
- !ann && j != ent2->getDirectOptionalBaseServices().end();
- ++j)
- {
- ann = !j->annotations.empty();
- }
- for (std::vector< unoidl::AnnotatedReference >::const_iterator
- j(ent2->getDirectMandatoryBaseInterfaces().begin());
- (!ann
- && j != ent2->getDirectMandatoryBaseInterfaces().end());
- ++j)
- {
- ann = !j->annotations.empty();
- }
- for (std::vector< unoidl::AnnotatedReference >::const_iterator
- j(ent2->getDirectOptionalBaseInterfaces().begin());
- !ann && j != ent2->getDirectOptionalBaseInterfaces().end();
- ++j)
- {
- ann = !j->annotations.empty();
- }
- for (std::vector<
- unoidl::AccumulationBasedServiceEntity::Property >::
- const_iterator j(
- ent2->getDirectProperties().begin());
- !ann && j != ent2->getDirectProperties().end(); ++j)
- {
- ann = !j->annotations.empty();
- }
- i->second.dataOffset = getOffset(file);
- writeKind(file, ent2.get(), ann);
- write32(file, ent2->getDirectMandatoryBaseServices().size());
- for (std::vector< unoidl::AnnotatedReference >::const_iterator
- j(ent2->getDirectMandatoryBaseServices().begin());
- j != ent2->getDirectMandatoryBaseServices().end(); ++j)
- {
- writeIdxName(file, j->name);
- writeAnnotations(file, ann, j->annotations);
- }
- write32(file, ent2->getDirectOptionalBaseServices().size());
- for (std::vector< unoidl::AnnotatedReference >::const_iterator
- j(ent2->getDirectOptionalBaseServices().begin());
- j != ent2->getDirectOptionalBaseServices().end(); ++j)
- {
- writeIdxName(file, j->name);
- writeAnnotations(file, ann, j->annotations);
- }
- write32(file, ent2->getDirectMandatoryBaseInterfaces().size());
- for (std::vector< unoidl::AnnotatedReference >::const_iterator
- j(ent2->getDirectMandatoryBaseInterfaces().begin());
- j != ent2->getDirectMandatoryBaseInterfaces().end(); ++j)
- {
- writeIdxName(file, j->name);
- writeAnnotations(file, ann, j->annotations);
- }
- write32(file, ent2->getDirectOptionalBaseInterfaces().size());
- for (std::vector< unoidl::AnnotatedReference >::const_iterator
- j(ent2->getDirectOptionalBaseInterfaces().begin());
- j != ent2->getDirectOptionalBaseInterfaces().end(); ++j)
- {
- writeIdxName(file, j->name);
- writeAnnotations(file, ann, j->annotations);
- }
- write32(file, ent2->getDirectProperties().size());
- for (std::vector<
- unoidl::AccumulationBasedServiceEntity::Property >::
- const_iterator j(
- ent2->getDirectProperties().begin());
- j != ent2->getDirectProperties().end(); ++j)
- {
- write16(file, static_cast< sal_uInt16 >(j->attributes));
- writeIdxName(file, j->name);
- writeIdxName(file, j->type);
- writeAnnotations(file, ann, j->annotations);
- }
- writeAnnotations(file, ann, ent2->getAnnotations());
- break;
- }
- case unoidl::Entity::SORT_INTERFACE_BASED_SINGLETON:
- {
- rtl::Reference< unoidl::InterfaceBasedSingletonEntity > ent2(
- static_cast< unoidl::InterfaceBasedSingletonEntity * >(
- i->second.entity.get()));
- bool ann = !ent2->getAnnotations().empty();
- i->second.dataOffset = getOffset(file);
- writeKind(file, ent2.get(), ann);
- writeIdxName(file, ent2->getBase());
- writeAnnotations(file, ann, ent2->getAnnotations());
- break;
- }
- case unoidl::Entity::SORT_SERVICE_BASED_SINGLETON:
- {
- rtl::Reference< unoidl::ServiceBasedSingletonEntity > ent2(
- static_cast< unoidl::ServiceBasedSingletonEntity * >(
- i->second.entity.get()));
- bool ann = !ent2->getAnnotations().empty();
- i->second.dataOffset = getOffset(file);
- writeKind(file, ent2.get(), ann);
- writeIdxName(file, ent2->getBase());
- writeAnnotations(file, ann, ent2->getAnnotations());
- break;
- }
- }
- }
- for (std::map< OUString, Item >::iterator i(map.begin()); i != map.end();
- ++i)
- {
- i->second.nameOffset = writeNulName(file, i->first);
- }
- sal_uInt64 off = getOffset(file);
- if (rootSize == 0) {
- write8(file, 0); // SORT_MODULE
- write32(file, map.size());
- // overflow from std::map::size_type -> sal_uInt64 is unrealistic
- } else {
- *rootSize = map.size();
- // overflow from std::map::size_type -> std::size_t is unrealistic
- }
- for (std::map< OUString, Item >::iterator i(map.begin()); i != map.end();
- ++i)
- {
- write32(file, i->second.nameOffset);
- write32(file, i->second.dataOffset);
- }
- return off;
-}
-
-}
-
-SAL_IMPLEMENT_MAIN() {
- sal_uInt32 args = rtl_getAppCommandArgCount();
- if (args < 2) {
- std::cerr
- << "Usage: reg2unoidl <extra .rdb files> <.rdb file> <unoidl file>"
- << std::endl;
- std::exit(EXIT_FAILURE);
- }
- rtl::Reference< unoidl::Manager > mgr(new unoidl::Manager);
- for (sal_uInt32 i = 0; i != args - 2; ++i) {
- mgr->addProvider(load(mgr, getArgumentUri(i)));
- }
- rtl::Reference< unoidl::Provider > prov(
- load(mgr, getArgumentUri(args - 2)));
- osl::File f(getArgumentUri(args - 1));
- osl::FileBase::RC e = f.open(osl_File_OpenFlag_Write);
- if (e == osl::FileBase::E_NOENT) {
- e = f.open(osl_File_OpenFlag_Write | osl_File_OpenFlag_Create);
- }
- if (e != osl::FileBase::E_None) {
- std::cerr
- << "Cannot open <" << f.getURL() << "> for writing, error code "
- << +e << std::endl;
- std::exit(EXIT_FAILURE);
- }
- write(f, "UNOIDL\xFF\0", 8);
- write32(f, 0); // root map offset
- write32(f, 0); // root map size
- write(
- f,
- RTL_CONSTASCII_STRINGPARAM(
- "\0** Created by LibreOffice " LIBO_VERSION_DOTTED
- " reg2unoidl **\0"));
- sal_uInt64 off;
- std::size_t size;
- try {
- off = writeMap(f, prov->createRootCursor(), &size);
- } catch (unoidl::FileFormatException & e1) {
- std::cerr
- << "Bad input <" << e1.getUri() << ">: " << e1.getDetail()
- << std::endl;
- std::exit(EXIT_FAILURE);
- }
- e = f.setSize(getOffset(f)); // truncate in case it already existed
- if (e != osl::FileBase::E_None) {
- std::cerr
- << "Cannot set size of <" << f.getURL() << ">, error code " << +e
- << std::endl;
- std::exit(EXIT_FAILURE);
- }
- e = f.setPos(osl_Pos_Absolut, 8);
- if (e != osl::FileBase::E_None) {
- std::cerr
- << "Cannot rewind current position in <" << f.getURL()
- << ">, error code " << +e << std::endl;
- std::exit(EXIT_FAILURE);
- }
- write32(f, off);
- write32(f, size);
- // overflow from std::map::size_type -> sal_uInt64 is unrealistic
- e = f.close();
- if (e != osl::FileBase::E_None) {
- std::cerr
- << "Cannot close <" << f.getURL() << "> after writing, error code "
- << +e << std::endl;
- std::exit(EXIT_FAILURE);
- }
- return EXIT_SUCCESS;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */