xref: /trunk/main/xmloff/source/core/xmlcnitm.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_xmloff.hxx"
30 #include <tools/debug.hxx>
31 #include <com/sun/star/xml/AttributeData.hpp>
32 #include <com/sun/star/lang/XUnoTunnel.hpp>
33 
34 #include <xmloff/xmlcnimp.hxx>
35 #include "xmloff/unoatrcn.hxx"
36 
37 using namespace rtl;
38 using namespace ::com::sun::star::uno;
39 using namespace ::com::sun::star::container;
40 using namespace ::com::sun::star::lang;
41 using namespace ::com::sun::star::xml;
42 
43 typedef ::rtl::OUString *OUStringPtr;
44 SV_DECL_PTRARR_DEL( SvXMLAttrContainerData_Impl, OUStringPtr, 5, 5 )
45 SV_IMPL_PTRARR( SvXMLAttrContainerData_Impl, OUStringPtr )
46 
47 
48 SvXMLAttrContainerData::SvXMLAttrContainerData(
49                             const SvXMLAttrContainerData& rImpl ) :
50     aNamespaceMap( rImpl.aNamespaceMap ),
51     pLNames( new SvXMLAttrContainerData_Impl ),
52     pValues( new SvXMLAttrContainerData_Impl )
53 {
54     sal_uInt16 nCount = rImpl.pLNames->Count();
55     for( sal_uInt16 i=0; i<nCount; i++ )
56     {
57         aPrefixPoss.Insert( rImpl.aPrefixPoss[i], i );
58         pLNames->Insert( new OUString( *(*rImpl.pLNames)[i] ), i );
59         pValues->Insert( new OUString( *(*rImpl.pValues)[i] ), i );
60     }
61 }
62 
63 SvXMLAttrContainerData::SvXMLAttrContainerData() :
64     pLNames( new SvXMLAttrContainerData_Impl ),
65     pValues( new SvXMLAttrContainerData_Impl )
66 {
67 }
68 
69 SvXMLAttrContainerData::~SvXMLAttrContainerData()
70 {
71     delete pLNames;
72     delete pValues;
73 }
74 
75 int SvXMLAttrContainerData::operator ==(
76                         const SvXMLAttrContainerData& rCmp ) const
77 {
78     sal_Bool bRet = pLNames->Count() == rCmp.pLNames->Count() &&
79                 aNamespaceMap == rCmp.aNamespaceMap;
80     if( bRet )
81     {
82         sal_uInt16 nCount = pLNames->Count();
83         sal_uInt16 i;
84         for( i=0; bRet && i < nCount; i++ )
85             bRet = aPrefixPoss[i] == rCmp.aPrefixPoss[i];
86 
87         if( bRet )
88         {
89             for( i=0; bRet && i < nCount; i++ )
90                 bRet = *(*pLNames)[i] == *(*rCmp.pLNames)[i] &&
91                        *(*pValues)[i] == *(*rCmp.pValues)[i];
92         }
93     }
94 
95     return (int)bRet;
96 }
97 
98 sal_Bool SvXMLAttrContainerData::AddAttr( const OUString& rLName,
99                                            const OUString& rValue )
100 {
101     aPrefixPoss.Insert( USHRT_MAX, aPrefixPoss.Count() );
102     pLNames->Insert( new OUString(rLName), pLNames->Count() );
103     pValues->Insert( new OUString(rValue), pValues->Count() );
104 
105     return sal_True;
106 }
107 
108 sal_Bool SvXMLAttrContainerData::AddAttr( const OUString& rPrefix,
109                                            const OUString& rNamespace,
110                                            const OUString& rLName,
111                                            const OUString& rValue )
112 {
113     sal_uInt16 nPos = aNamespaceMap.Add( rPrefix, rNamespace );
114     aPrefixPoss.Insert( nPos, aPrefixPoss.Count() );
115     pLNames->Insert( new OUString(rLName), pLNames->Count() );
116     pValues->Insert( new OUString(rValue), pValues->Count() );
117 
118     return sal_True;
119 }
120 
121 sal_Bool SvXMLAttrContainerData::AddAttr( const OUString& rPrefix,
122                                            const OUString& rLName,
123                                            const OUString& rValue )
124 {
125     sal_uInt16 nPos = aNamespaceMap.GetIndexByPrefix( rPrefix );
126     if( USHRT_MAX == nPos )
127         return sal_False;
128 
129     aPrefixPoss.Insert( nPos, aPrefixPoss.Count() );
130     pLNames->Insert( new OUString(rLName), pLNames->Count() );
131     pValues->Insert( new OUString(rValue), pValues->Count() );
132 
133     return sal_True;
134 }
135 
136 sal_Bool SvXMLAttrContainerData::SetAt( sal_uInt16 i,
137             const rtl::OUString& rLName, const rtl::OUString& rValue )
138 {
139     if( i >= GetAttrCount() )
140         return sal_False;
141 
142     *(*pLNames)[i] = rLName;
143     *(*pValues)[i] = rValue;
144     aPrefixPoss[i] = USHRT_MAX;
145 
146     return sal_True;
147 }
148 
149 sal_Bool SvXMLAttrContainerData::SetAt( sal_uInt16 i,
150             const rtl::OUString& rPrefix, const rtl::OUString& rNamespace,
151             const rtl::OUString& rLName, const rtl::OUString& rValue )
152 {
153     if( i >= GetAttrCount() )
154         return sal_False;
155 
156     sal_uInt16 nPos = aNamespaceMap.Add( rPrefix, rNamespace );
157     if( USHRT_MAX == nPos )
158         return sal_False;
159 
160     *(*pLNames)[i] = rLName;
161     *(*pValues)[i] = rValue;
162     aPrefixPoss[i] = nPos;
163 
164     return sal_True;
165 }
166 
167 sal_Bool SvXMLAttrContainerData::SetAt( sal_uInt16 i,
168             const rtl::OUString& rPrefix,
169             const rtl::OUString& rLName,
170             const rtl::OUString& rValue )
171 {
172     if( i >= GetAttrCount() )
173         return sal_False;
174 
175     sal_uInt16 nPos = aNamespaceMap.GetIndexByPrefix( rPrefix );
176     if( USHRT_MAX == nPos )
177         return sal_False;
178 
179     *(*pLNames)[i] = rLName;
180     *(*pValues)[i] = rValue;
181     aPrefixPoss[i] = nPos;
182 
183     return sal_True;
184 }
185 
186 void SvXMLAttrContainerData::Remove( sal_uInt16 i )
187 {
188     if( i < GetAttrCount() )
189     {
190         delete (*pLNames)[i];
191         pLNames->Remove( i );
192         delete (*pValues)[i];
193         pValues->Remove( i );
194         aPrefixPoss.Remove( i );
195     }
196     else
197     {
198         DBG_ERROR( "illegal index" );
199     }
200 }
201 
202 sal_uInt16 SvXMLAttrContainerData::GetAttrCount() const
203 {
204     return pLNames->Count();
205 }
206 
207 const ::rtl::OUString& SvXMLAttrContainerData::GetAttrLName(sal_uInt16 i) const
208 {
209     OSL_ENSURE( i < pLNames->Count(), "SvXMLAttrContainerData::GetLName: illegal index" );
210     return *(*pLNames)[i];
211 }
212 
213 const ::rtl::OUString& SvXMLAttrContainerData::GetAttrValue(sal_uInt16 i) const
214 {
215     OSL_ENSURE( i < pValues->Count(), "SvXMLAttrContainerData::GetValue: illegal index" );
216     return *(*pValues)[i];
217 }
218 
219