1*ff7655f0SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*ff7655f0SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*ff7655f0SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*ff7655f0SAndrew Rist * distributed with this work for additional information
6*ff7655f0SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*ff7655f0SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*ff7655f0SAndrew Rist * "License"); you may not use this file except in compliance
9*ff7655f0SAndrew Rist * with the License. You may obtain a copy of the License at
10*ff7655f0SAndrew Rist *
11*ff7655f0SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*ff7655f0SAndrew Rist *
13*ff7655f0SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*ff7655f0SAndrew Rist * software distributed under the License is distributed on an
15*ff7655f0SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*ff7655f0SAndrew Rist * KIND, either express or implied. See the License for the
17*ff7655f0SAndrew Rist * specific language governing permissions and limitations
18*ff7655f0SAndrew Rist * under the License.
19*ff7655f0SAndrew Rist *
20*ff7655f0SAndrew Rist *************************************************************/
21*ff7655f0SAndrew Rist
22*ff7655f0SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_codemaker.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include "codemaker/exceptiontree.hxx"
28cdf0e10cSrcweir #include "codemaker/typemanager.hxx"
29cdf0e10cSrcweir
30cdf0e10cSrcweir #include "osl/diagnose.h"
31cdf0e10cSrcweir #include "registry/reader.hxx"
32cdf0e10cSrcweir #include "registry/types.h"
33cdf0e10cSrcweir #include "rtl/string.hxx"
34cdf0e10cSrcweir #include "rtl/textenc.h"
35cdf0e10cSrcweir #include "rtl/ustring.hxx"
36cdf0e10cSrcweir
37cdf0e10cSrcweir #include <memory>
38cdf0e10cSrcweir #include <vector>
39cdf0e10cSrcweir
40cdf0e10cSrcweir using codemaker::ExceptionTree;
41cdf0e10cSrcweir using codemaker::ExceptionTreeNode;
42cdf0e10cSrcweir
add(rtl::OString const & theName)43cdf0e10cSrcweir ExceptionTreeNode * ExceptionTreeNode::add(rtl::OString const & theName) {
44cdf0e10cSrcweir std::auto_ptr< ExceptionTreeNode > node(new ExceptionTreeNode(theName));
45cdf0e10cSrcweir children.push_back(node.get());
46cdf0e10cSrcweir return node.release();
47cdf0e10cSrcweir }
48cdf0e10cSrcweir
clearChildren()49cdf0e10cSrcweir void ExceptionTreeNode::clearChildren() {
50cdf0e10cSrcweir for (Children::iterator i(children.begin()); i != children.end(); ++i) {
51cdf0e10cSrcweir delete *i;
52cdf0e10cSrcweir }
53cdf0e10cSrcweir children.clear();
54cdf0e10cSrcweir }
55cdf0e10cSrcweir
add(rtl::OString const & name,TypeManager const & manager)56cdf0e10cSrcweir void ExceptionTree::add(rtl::OString const & name, TypeManager const & manager)
57cdf0e10cSrcweir throw( CannotDumpException )
58cdf0e10cSrcweir {
59cdf0e10cSrcweir typedef std::vector< rtl::OString > List;
60cdf0e10cSrcweir List list;
61cdf0e10cSrcweir bool runtimeException = false;
62cdf0e10cSrcweir for (rtl::OString n(name); n != "com/sun/star/uno/Exception";) {
63cdf0e10cSrcweir if (n == "com/sun/star/uno/RuntimeException") {
64cdf0e10cSrcweir runtimeException = true;
65cdf0e10cSrcweir break;
66cdf0e10cSrcweir }
67cdf0e10cSrcweir list.push_back(n);
68cdf0e10cSrcweir typereg::Reader reader(manager.getTypeReader(n));
69cdf0e10cSrcweir if (!reader.isValid())
70cdf0e10cSrcweir throw CannotDumpException(
71cdf0e10cSrcweir ::rtl::OString("Unknown type '" + n.replace('/', '.')
72cdf0e10cSrcweir + "', incomplete type library."));
73cdf0e10cSrcweir
74cdf0e10cSrcweir OSL_ASSERT(
75cdf0e10cSrcweir reader.getTypeClass() == RT_TYPE_EXCEPTION
76cdf0e10cSrcweir && reader.getSuperTypeCount() == 1);
77cdf0e10cSrcweir n = rtl::OUStringToOString(
78cdf0e10cSrcweir reader.getSuperTypeName(0), RTL_TEXTENCODING_UTF8);
79cdf0e10cSrcweir }
80cdf0e10cSrcweir if (!runtimeException) {
81cdf0e10cSrcweir ExceptionTreeNode * node = &m_root;
82cdf0e10cSrcweir for (List::reverse_iterator i(list.rbegin()); !node->present; ++i) {
83cdf0e10cSrcweir if (i == list.rend()) {
84cdf0e10cSrcweir node->setPresent();
85cdf0e10cSrcweir break;
86cdf0e10cSrcweir }
87cdf0e10cSrcweir for (ExceptionTreeNode::Children::iterator j(
88cdf0e10cSrcweir node->children.begin());;
89cdf0e10cSrcweir ++j)
90cdf0e10cSrcweir {
91cdf0e10cSrcweir if (j == node->children.end()) {
92cdf0e10cSrcweir node = node->add(*i);
93cdf0e10cSrcweir break;
94cdf0e10cSrcweir }
95cdf0e10cSrcweir if ((*j)->name == *i) {
96cdf0e10cSrcweir node = *j;
97cdf0e10cSrcweir break;
98cdf0e10cSrcweir }
99cdf0e10cSrcweir }
100cdf0e10cSrcweir }
101cdf0e10cSrcweir }
102cdf0e10cSrcweir }
103