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