1 /*************************************************************************
2 *
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2000, 2010 Oracle and/or its affiliates.
6 *
7 * OpenOffice.org - a multi-platform office productivity suite
8 *
9 * This file is part of OpenOffice.org.
10 *
11 * OpenOffice.org is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License version 3
13 * only, as published by the Free Software Foundation.
14 *
15 * OpenOffice.org is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 * GNU Lesser General Public License version 3 for more details
19 * (a copy is included in the LICENSE file that accompanied this code).
20 *
21 * You should have received a copy of the GNU Lesser General Public License
22 * version 3 along with OpenOffice.org.  If not, see
23 * <http://www.openoffice.org/license.html>
24 * for a copy of the LGPLv3 License.
25 *
26 ************************************************************************/
27 
28 #include "precompiled_configmgr.hxx"
29 #include "sal/config.h"
30 
31 #include "rtl/ustring.hxx"
32 
33 #include "modifications.hxx"
34 #include "path.hxx"
35 
36 namespace configmgr {
37 
38 Modifications::Modifications() {}
39 
40 Modifications::~Modifications() {}
41 
42 void Modifications::add(Path const & path) {
43     Node * p = &root_;
44     bool wasPresent = false;
45     for (Path::const_iterator i(path.begin()); i != path.end(); ++i) {
46         Node::Children::iterator j(p->children.find(*i));
47         if (j == p->children.end()) {
48             if (wasPresent && p->children.empty()) {
49                 return;
50             }
51             j = p->children.insert(Node::Children::value_type(*i, Node())).
52                 first;
53             wasPresent = false;
54         } else {
55             wasPresent = true;
56         }
57         p = &j->second;
58     }
59     p->children.clear();
60 }
61 
62 void Modifications::remove(Path const & path) {
63     OSL_ASSERT(!path.empty());
64     Node * p = &root_;
65     for (Path::const_iterator i(path.begin());;) {
66         Node::Children::iterator j(p->children.find(*i));
67         if (j == p->children.end()) {
68             break;
69         }
70         if (++i == path.end()) {
71             p->children.erase(j);
72             if (p->children.empty()) {
73                 Path parent(path);
74                 parent.pop_back();
75                 remove(parent);
76             }
77             break;
78         }
79         p = &j->second;
80     }
81 }
82 
83 Modifications::Node const & Modifications::getRoot() const {
84     return root_;
85 }
86 
87 }
88