summaryrefslogtreecommitdiff
path: root/unoidl
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2013-09-16 23:25:43 +0200
committerStephan Bergmann <sbergman@redhat.com>2013-09-17 06:55:42 +0200
commit14bc5fc0ec652650deb9a41505e97c3b4d3854b2 (patch)
treea358397972c921349eaefa272c91d65c0fc88681 /unoidl
parent6292bba6debaeb5c1bbbabfb77606296c894ec28 (diff)
WIP: additional unoidl::Provider that directly reads a single .idl file
Change-Id: Iab795a34a657cb36ced24a1a05f6c21a6c1637aa
Diffstat (limited to 'unoidl')
-rw-r--r--unoidl/Library_unoidl.mk1
-rw-r--r--unoidl/source/sourcefileprovider.cxx142
-rw-r--r--unoidl/source/sourcefileprovider.hxx44
-rw-r--r--unoidl/source/unoidl.cxx4
4 files changed, 191 insertions, 0 deletions
diff --git a/unoidl/Library_unoidl.mk b/unoidl/Library_unoidl.mk
index 411e0a9a7ab3..c98fc69f4945 100644
--- a/unoidl/Library_unoidl.mk
+++ b/unoidl/Library_unoidl.mk
@@ -13,6 +13,7 @@ $(eval $(call gb_Library_add_defs,unoidl,-DLO_DLLIMPLEMENTATION_UNOIDL))
$(eval $(call gb_Library_add_exception_objects,unoidl, \
unoidl/source/legacyprovider \
+ unoidl/source/sourcefileprovider \
unoidl/source/sourcetreeprovider \
unoidl/source/unoidl \
unoidl/source/unoidlprovider \
diff --git a/unoidl/source/sourcefileprovider.cxx b/unoidl/source/sourcefileprovider.cxx
new file mode 100644
index 000000000000..4c522e8fc423
--- /dev/null
+++ b/unoidl/source/sourcefileprovider.cxx
@@ -0,0 +1,142 @@
+/* -*- 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 <map>
+#include <utility>
+#include <vector>
+
+#include "sourcefileprovider.hxx"
+#include "sourceprovider-scanner.hxx"
+
+namespace unoidl { namespace detail {
+
+namespace {
+
+class Cursor: public MapCursor {
+public:
+ explicit Cursor(std::map< OUString, rtl::Reference<Entity> > const & map):
+ map_(map), iterator_(map_.begin())
+ {}
+
+private:
+ virtual ~Cursor() throw () {}
+
+ virtual rtl::Reference< Entity > getNext(OUString * name);
+
+ std::map< OUString, rtl::Reference<Entity> > const & map_; //TODO: extent
+ std::map< OUString, rtl::Reference<Entity> >::const_iterator iterator_;
+};
+
+rtl::Reference< Entity > Cursor::getNext(OUString * name) {
+ assert(name != 0);
+ rtl::Reference< Entity > ent;
+ if (iterator_ != map_.end()) {
+ *name = iterator_->first;
+ ent = iterator_->second;
+ ++iterator_;
+ }
+ return ent;
+}
+
+class Module: public ModuleEntity {
+public:
+ Module() {}
+
+ std::map< OUString, rtl::Reference<Entity> > map;
+
+private:
+ virtual ~Module() throw () {}
+
+ virtual std::vector<rtl::OUString> getMemberNames() const;
+
+ virtual rtl::Reference<MapCursor> createCursor() const
+ { return new Cursor(map); }
+};
+
+std::vector<rtl::OUString> Module::getMemberNames() const {
+ std::vector<rtl::OUString> names;
+ for (std::map< OUString, rtl::Reference<Entity> >::const_iterator i(
+ map.begin());
+ i != map.end(); ++i)
+ {
+ names.push_back(i->first);
+ }
+ return names;
+}
+
+}
+
+SourceFileProvider::SourceFileProvider(
+ rtl::Reference<Manager> const & manager, OUString const & uri)
+{
+ SourceProviderScannerData data(manager);
+ if (!parse(uri, &data)) {
+ throw NoSuchFileException(uri);
+ }
+ for (std::map<OUString, SourceProviderEntity>::iterator i(
+ data.entities.begin());
+ i != data.entities.end(); ++i)
+ {
+ if (i->second.kind == SourceProviderEntity::KIND_LOCAL) {
+ assert(i->second.entity.is());
+ assert(i->second.entity->getSort() != Entity::SORT_MODULE);
+ std::map< OUString, rtl::Reference<Entity> > * map = &rootMap_;
+ for (sal_Int32 j = 0;;) {
+ OUString id(i->first.getToken(0, '.', j));
+ if (j == -1) {
+ map->insert(std::make_pair(id, i->second.entity));
+ break;
+ }
+ std::map< OUString, rtl::Reference<Entity> >::const_iterator k(
+ map->find(id));
+ if (k == map->end()) {
+ k = map->insert(std::make_pair(id, new Module)).first;
+ }
+ Module * mod = dynamic_cast< Module * >(k->second.get());
+ assert(mod != 0);
+ map = &mod->map;
+ }
+ }
+ }
+}
+
+rtl::Reference<MapCursor> SourceFileProvider::createRootCursor() const {
+ return new Cursor(rootMap_);
+}
+
+rtl::Reference<Entity> SourceFileProvider::findEntity(OUString const & name)
+ const
+{
+ std::map< OUString, rtl::Reference<Entity> > const * map = &rootMap_;
+ for (sal_Int32 i = 0;;) {
+ OUString id(name.getToken(0, '.', i));
+ std::map< OUString, rtl::Reference<Entity> >::const_iterator j(
+ map->find(id));
+ if (j == map->end()) {
+ return rtl::Reference<Entity>();
+ }
+ if (i == -1) {
+ return j->second;
+ }
+ if (j->second->getSort() != Entity::SORT_MODULE) {
+ return rtl::Reference<Entity>();
+ }
+ Module * mod = dynamic_cast< Module * >(j->second.get());
+ assert(mod != 0);
+ map = &mod->map;
+ }
+}
+
+SourceFileProvider::~SourceFileProvider() throw () {}
+
+} }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/unoidl/source/sourcefileprovider.hxx b/unoidl/source/sourcefileprovider.hxx
new file mode 100644
index 000000000000..672f0d6e0208
--- /dev/null
+++ b/unoidl/source/sourcefileprovider.hxx
@@ -0,0 +1,44 @@
+/* -*- 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/.
+ */
+
+#ifndef INCLUDED_UNOIDL_SOURCEFILEPROVIDER_HXX
+#define INCLUDED_UNOIDL_SOURCEFILEPROVIDER_HXX
+
+#include "sal/config.h"
+
+#include <map>
+
+#include "rtl/ref.hxx"
+#include "unoidl/unoidl.hxx"
+
+namespace unoidl { namespace detail {
+
+class SourceFileProvider: public Provider {
+public:
+ // throws FileFormatException, NoSuchFileException:
+ SourceFileProvider(
+ rtl::Reference<Manager> const & manager, OUString const & uri);
+
+ // throws FileFormatException:
+ virtual rtl::Reference<MapCursor> createRootCursor() const;
+
+ // throws FileFormatException:
+ virtual rtl::Reference<Entity> findEntity(OUString const & name) const;
+
+private:
+ virtual ~SourceFileProvider() throw ();
+
+ std::map< OUString, rtl::Reference<Entity> > rootMap_;
+};
+
+} }
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/unoidl/source/unoidl.cxx b/unoidl/source/unoidl.cxx
index 19b8a9cab646..7c3e2e5bb7c5 100644
--- a/unoidl/source/unoidl.cxx
+++ b/unoidl/source/unoidl.cxx
@@ -20,6 +20,7 @@
#include "unoidl/unoidl.hxx"
#include "legacyprovider.hxx"
+#include "sourcefileprovider.hxx"
#include "sourcetreeprovider.hxx"
#include "unoidlprovider.hxx"
@@ -117,6 +118,9 @@ rtl::Reference< Provider > loadProvider(
return new detail::SourceTreeProvider(manager, uri);
}
}
+ if (uri.endsWith(".idl")) {
+ return new detail::SourceFileProvider(manager, uri);
+ }
try {
return new detail::UnoidlProvider(uri);
} catch (FileFormatException & e) {