xref: /trunk/main/comphelper/source/container/namecontainer.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_comphelper.hxx"
30 #include <comphelper/namecontainer.hxx>
31 #include <cppuhelper/implbase1.hxx>
32 #include <osl/diagnose.h>
33 #include <osl/mutex.hxx>
34 #include <comphelper/stl_types.hxx>
35 
36 DECLARE_STL_USTRINGACCESS_MAP( ::com::sun::star::uno::Any, SvGenericNameContainerMapImpl );
37 
38 namespace comphelper
39 {
40     class NameContainerImpl
41     {
42     public:
43         osl::Mutex maMutex;
44     };
45 
46     /** this is the base helper class for NameContainer thats also declared in this header. */
47     class NameContainer : public ::cppu::WeakImplHelper1< ::com::sun::star::container::XNameContainer >, private NameContainerImpl
48     {
49     public:
50         NameContainer( ::com::sun::star::uno::Type aType );
51         virtual ~NameContainer();
52 
53         // XNameContainer
54         virtual void SAL_CALL insertByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement )
55             throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::ElementExistException,
56             ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
57         virtual void SAL_CALL removeByName( const ::rtl::OUString& Name )
58             throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException,
59                 ::com::sun::star::uno::RuntimeException);
60 
61         // XNameReplace
62         virtual void SAL_CALL replaceByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement )
63             throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::NoSuchElementException,
64                 ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
65 
66         // XNameAccess
67         virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName )
68             throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException,
69                 ::com::sun::star::uno::RuntimeException);
70         virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames(  )
71             throw(::com::sun::star::uno::RuntimeException);
72         virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName )
73             throw(::com::sun::star::uno::RuntimeException);
74 
75         // XElementAccess
76         virtual sal_Bool SAL_CALL hasElements(  )
77             throw(::com::sun::star::uno::RuntimeException);
78         virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  )
79             throw(::com::sun::star::uno::RuntimeException);
80 
81     private:
82         SvGenericNameContainerMapImpl maProperties;
83         const ::com::sun::star::uno::Type maType;
84     };
85 }
86 
87 using namespace ::comphelper;
88 using namespace ::osl;
89 using namespace ::rtl;
90 using namespace ::com::sun::star::uno;
91 using namespace ::com::sun::star::container;
92 using namespace ::com::sun::star::lang;
93 
94 
95 NameContainer::NameContainer( ::com::sun::star::uno::Type aType )
96 : maType( aType )
97 {
98 }
99 
100 NameContainer::~NameContainer()
101 {
102 }
103 
104 // XNameContainer
105 void SAL_CALL NameContainer::insertByName( const rtl::OUString& aName, const Any& aElement )
106     throw(IllegalArgumentException, ElementExistException,
107         WrappedTargetException, RuntimeException)
108 {
109     MutexGuard aGuard( maMutex );
110 
111     if( maProperties.find( aName ) != maProperties.end() )
112         throw ElementExistException();
113 
114     if( aElement.getValueType() != maType )
115         throw IllegalArgumentException();
116 
117     maProperties.insert( SvGenericNameContainerMapImpl::value_type(aName,aElement));
118 }
119 
120 void SAL_CALL NameContainer::removeByName( const ::rtl::OUString& Name )
121     throw(NoSuchElementException, WrappedTargetException,
122         RuntimeException)
123 {
124     MutexGuard aGuard( maMutex );
125 
126     SvGenericNameContainerMapImpl::iterator aIter = maProperties.find( Name );
127     if( aIter == maProperties.end() )
128         throw NoSuchElementException();
129 
130     maProperties.erase( aIter );
131 }
132 
133 // XNameReplace
134 
135 void SAL_CALL NameContainer::replaceByName( const ::rtl::OUString& aName, const Any& aElement )
136     throw(IllegalArgumentException, NoSuchElementException,
137         WrappedTargetException, RuntimeException)
138 {
139     MutexGuard aGuard( maMutex );
140 
141     SvGenericNameContainerMapImpl::iterator aIter( maProperties.find( aName ) );
142     if( aIter == maProperties.end() )
143         throw NoSuchElementException();
144 
145     if( aElement.getValueType() != maType )
146         throw IllegalArgumentException();
147 
148     (*aIter).second = aElement;
149 }
150 
151 // XNameAccess
152 
153 Any SAL_CALL NameContainer::getByName( const ::rtl::OUString& aName )
154     throw(NoSuchElementException, WrappedTargetException,
155         RuntimeException)
156 {
157     MutexGuard aGuard( maMutex );
158 
159     SvGenericNameContainerMapImpl::iterator aIter = maProperties.find( aName );
160     if( aIter == maProperties.end() )
161         throw NoSuchElementException();
162 
163     return (*aIter).second;
164 }
165 
166 Sequence< ::rtl::OUString > SAL_CALL NameContainer::getElementNames(  )
167     throw(RuntimeException)
168 {
169     MutexGuard aGuard( maMutex );
170 
171     SvGenericNameContainerMapImpl::iterator aIter = maProperties.begin();
172     const SvGenericNameContainerMapImpl::iterator aEnd = maProperties.end();
173 
174     Sequence< rtl::OUString > aNames( maProperties.size() );
175     rtl::OUString* pNames = aNames.getArray();
176 
177     while( aIter != aEnd )
178     {
179         *pNames++ = (*aIter++).first;
180     }
181 
182     return aNames;
183 }
184 
185 sal_Bool SAL_CALL NameContainer::hasByName( const ::rtl::OUString& aName )
186     throw(RuntimeException)
187 {
188     MutexGuard aGuard( maMutex );
189 
190     SvGenericNameContainerMapImpl::iterator aIter = maProperties.find( aName );
191     return aIter != maProperties.end();
192 }
193 
194 sal_Bool SAL_CALL NameContainer::hasElements(  )
195     throw(RuntimeException)
196 {
197     MutexGuard aGuard( maMutex );
198 
199     return !maProperties.empty();
200 }
201 
202 Type SAL_CALL NameContainer::getElementType()
203     throw( RuntimeException )
204 {
205     return maType;
206 }
207 
208 Reference< XNameContainer > comphelper::NameContainer_createInstance( Type aType )
209 {
210     return (XNameContainer*) new NameContainer( aType );
211 }
212