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