LibreOffice Module unoidl (master) 1
unoidl.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 */
9
10#include <sal/config.h>
11#include <sal/log.hxx>
12
13#include <set>
14#include <utility>
15#include <vector>
16
17#include <osl/file.h>
18#include <osl/file.hxx>
19#include <osl/mutex.hxx>
20#include <rtl/ref.hxx>
21#include <rtl/ustring.hxx>
22#include <unoidl/unoidl.hxx>
23
24#include "legacyprovider.hxx"
27#include "unoidlprovider.hxx"
28
29namespace unoidl {
30
31namespace {
32
33class AggregatingModule: public ModuleEntity {
34public:
35 AggregatingModule(
36 std::vector< rtl::Reference< Provider > >&& providers,
37 OUString name):
38 providers_(std::move(providers)), name_(std::move(name))
39 {}
40
41private:
42 virtual ~AggregatingModule() noexcept override {}
43
44 virtual std::vector< OUString > getMemberNames() const override;
45
46 virtual rtl::Reference< MapCursor > createCursor() const override;
47
48 std::vector< rtl::Reference< Provider > > providers_;
49 OUString name_;
50};
51
52std::vector< OUString > AggregatingModule::getMemberNames() const {
53 std::set< OUString > names;
54 for (auto & i: providers_) {
55 rtl::Reference< Entity > ent(i->findEntity(name_));
56 if (ent.is() && ent->getSort() == Entity::SORT_MODULE) {
57 std::vector< OUString > ns(
58 static_cast< ModuleEntity * >(ent.get())->getMemberNames());
59 names.insert(ns.begin(), ns.end());
60 }
61 }
62 return std::vector< OUString >(names.begin(), names.end());
63}
64
65class AggregatingCursor: public MapCursor {
66public:
67 AggregatingCursor(
68 std::vector< rtl::Reference< Provider > >&& providers,
69 OUString name):
70 providers_(std::move(providers)), name_(std::move(name)), iterator_(providers_.begin())
71 { findCursor(); }
72
73private:
74 virtual ~AggregatingCursor() noexcept override {}
75
76 virtual rtl::Reference< Entity > getNext(OUString * name) override;
77
78 void findCursor();
79
80 std::vector< rtl::Reference< Provider > > providers_;
81 OUString name_;
82 std::vector< rtl::Reference< Provider > >::iterator iterator_;
84 std::set< OUString > seen_;
85};
86
87rtl::Reference< Entity > AggregatingCursor::getNext(OUString * name) {
88 while (cursor_.is()) {
89 OUString n;
90 rtl::Reference< Entity > ent(cursor_->getNext(&n));
91 if (ent.is()) {
92 if (seen_.insert(n).second) {
93 if (name != nullptr) {
94 *name = n;
95 }
96 return ent->getSort() == Entity::SORT_MODULE
97 ? new AggregatingModule(
98 std::vector(providers_), (name_.isEmpty() ? name_ : name_ + ".") + n)
99 : ent;
100 }
101 } else {
102 cursor_.clear();
103 findCursor();
104 }
105 }
107}
108
109void AggregatingCursor::findCursor() {
110 for (; !cursor_.is() && iterator_ != providers_.end(); ++iterator_) {
111 if (name_.isEmpty()) {
112 cursor_ = (*iterator_)->createRootCursor();
113 } else {
114 rtl::Reference< Entity > ent((*iterator_)->findEntity(name_));
115 if (ent.is() && ent->getSort() == Entity::SORT_MODULE) {
116 cursor_ = static_cast< ModuleEntity * >(ent.get())->
117 createCursor();
118 }
119 }
120 }
121}
122
123rtl::Reference< MapCursor > AggregatingModule::createCursor() const {
124 return new AggregatingCursor(std::vector(providers_), name_);
125}
126
127}
128
130
132
133Entity::~Entity() noexcept {}
134
136
138
140
142
144
146 noexcept
147{}
148
150
152
154
156
158{}
159
161
163
165
167
170 assert(p.is());
171 {
172 osl::MutexGuard g(mutex_);
173 providers_.push_back(p);
174 }
175 return p;
176}
177
178rtl::Reference< Entity > Manager::findEntity(OUString const & name) const {
179 //TODO: caching? (here or in cppuhelper::TypeManager?)
180 osl::MutexGuard g(mutex_);
181 for (auto & i: providers_) {
182 rtl::Reference< Entity > ent(i->findEntity(name));
183 if (ent.is()) {
184 return ent;
185 }
186 }
188}
189
191 const
192{
193 return new AggregatingCursor(std::vector(providers_), name);
194}
195
196Manager::~Manager() noexcept {}
197
199 osl::DirectoryItem item;
200 if (osl::DirectoryItem::get(uri, item) == osl::FileBase::E_None) {
201 osl::FileStatus status(osl_FileStatus_Mask_Type);
202 if (item.getFileStatus(status) == osl::FileBase::E_None
203 && status.getFileType() == osl::FileStatus::Directory)
204 {
205 return new detail::SourceTreeProvider(*this, uri);
206 }
207 }
208 if (uri.endsWith(".idl")) {
209 return new detail::SourceFileProvider(this, uri);
210 }
211 try {
212 return new detail::UnoidlProvider(uri);
213 } catch (FileFormatException & e) {
214 SAL_INFO(
215 "unoidl",
216 "FileFormatException \"" << e.getDetail() << "\", retrying <" << uri
217 << "> as legacy format");
218 return new detail::LegacyProvider(*this, uri);
219 }
220}
221
222}
223
224/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
virtual SAL_DLLPRIVATE ~AccumulationBasedServiceEntity() noexcept override
Definition: unoidl.cxx:160
virtual SAL_DLLPRIVATE ~ConstantGroupEntity() noexcept override
Definition: unoidl.cxx:155
virtual SAL_DLLPRIVATE ~Entity() noexcept override
Definition: unoidl.cxx:133
virtual SAL_DLLPRIVATE ~EnumTypeEntity() noexcept override
Definition: unoidl.cxx:141
virtual SAL_DLLPRIVATE ~ExceptionTypeEntity() noexcept override
Definition: unoidl.cxx:149
const OUString & getDetail() const
Definition: unoidl.hxx:60
SAL_DLLPRIVATE ~FileFormatException() noexcept
Definition: unoidl.cxx:131
virtual SAL_DLLPRIVATE ~InterfaceBasedSingletonEntity() noexcept override
Definition: unoidl.cxx:162
virtual SAL_DLLPRIVATE ~InterfaceTypeEntity() noexcept override
Definition: unoidl.cxx:151
SAL_DLLPRIVATE rtl::Reference< Provider > loadProvider(OUString const &uri)
Definition: unoidl.cxx:198
std::vector< rtl::Reference< Provider > > providers_
Definition: unoidl.hxx:708
rtl::Reference< Provider > addProvider(OUString const &uri)
Definition: unoidl.cxx:168
rtl::Reference< MapCursor > createCursor(OUString const &name) const
Definition: unoidl.cxx:190
virtual SAL_DLLPRIVATE ~Manager() noexcept override
Definition: unoidl.cxx:196
rtl::Reference< Entity > findEntity(OUString const &name) const
Definition: unoidl.cxx:178
osl::Mutex mutex_
Definition: unoidl.hxx:707
virtual SAL_DLLPRIVATE ~MapCursor() noexcept override
Definition: unoidl.cxx:135
virtual SAL_DLLPRIVATE ~ModuleEntity() noexcept override
Definition: unoidl.cxx:137
SAL_DLLPRIVATE ~NoSuchFileException() noexcept
Definition: unoidl.cxx:129
virtual SAL_DLLPRIVATE ~PlainStructTypeEntity() noexcept override
Definition: unoidl.cxx:143
virtual SAL_DLLPRIVATE ~PolymorphicStructTypeTemplateEntity() noexcept override
Definition: unoidl.cxx:145
virtual SAL_DLLPRIVATE ~Provider() noexcept override
Definition: unoidl.cxx:166
virtual SAL_DLLPRIVATE ~PublishableEntity() noexcept override
Definition: unoidl.cxx:139
virtual SAL_DLLPRIVATE ~ServiceBasedSingletonEntity() noexcept override
Definition: unoidl.cxx:164
virtual SAL_DLLPRIVATE ~SingleInterfaceBasedServiceEntity() noexcept override
Definition: unoidl.cxx:157
virtual SAL_DLLPRIVATE ~TypedefEntity() noexcept override
Definition: unoidl.cxx:153
const char * name
void * p
sal_Int64 n
#define SAL_INFO(area, stream)
ns
int i
enumrange< T >::Iterator begin(enumrange< T >)
rtl::Reference< MapCursor > cursor_
Definition: unoidl.cxx:83
OUString name_
Definition: unoidl.cxx:49
std::set< OUString > seen_
Definition: unoidl.cxx:84
std::vector< rtl::Reference< Provider > >::iterator iterator_
Definition: unoidl.cxx:82
std::vector< rtl::Reference< Provider > > providers_
Definition: unoidl.cxx:48