1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmloff.hxx"
26 #include <tools/debug.hxx>
27 #include <com/sun/star/xml/AttributeData.hpp>
28 #include <com/sun/star/lang/XUnoTunnel.hpp>
29
30 #include <xmloff/xmlcnimp.hxx>
31 #include "xmloff/unoatrcn.hxx"
32
33 using namespace rtl;
34 using namespace ::com::sun::star::uno;
35 using namespace ::com::sun::star::container;
36 using namespace ::com::sun::star::lang;
37 using namespace ::com::sun::star::xml;
38
39 typedef ::rtl::OUString *OUStringPtr;
40 SV_DECL_PTRARR_DEL( SvXMLAttrContainerData_Impl, OUStringPtr, 5, 5 )
SV_IMPL_PTRARR(SvXMLAttrContainerData_Impl,OUStringPtr)41 SV_IMPL_PTRARR( SvXMLAttrContainerData_Impl, OUStringPtr )
42
43
44 SvXMLAttrContainerData::SvXMLAttrContainerData(
45 const SvXMLAttrContainerData& rImpl ) :
46 aNamespaceMap( rImpl.aNamespaceMap ),
47 pLNames( new SvXMLAttrContainerData_Impl ),
48 pValues( new SvXMLAttrContainerData_Impl )
49 {
50 sal_uInt16 nCount = rImpl.pLNames->Count();
51 for( sal_uInt16 i=0; i<nCount; i++ )
52 {
53 aPrefixPoss.Insert( rImpl.aPrefixPoss[i], i );
54 pLNames->Insert( new OUString( *(*rImpl.pLNames)[i] ), i );
55 pValues->Insert( new OUString( *(*rImpl.pValues)[i] ), i );
56 }
57 }
58
SvXMLAttrContainerData()59 SvXMLAttrContainerData::SvXMLAttrContainerData() :
60 pLNames( new SvXMLAttrContainerData_Impl ),
61 pValues( new SvXMLAttrContainerData_Impl )
62 {
63 }
64
~SvXMLAttrContainerData()65 SvXMLAttrContainerData::~SvXMLAttrContainerData()
66 {
67 delete pLNames;
68 delete pValues;
69 }
70
operator ==(const SvXMLAttrContainerData & rCmp) const71 int SvXMLAttrContainerData::operator ==(
72 const SvXMLAttrContainerData& rCmp ) const
73 {
74 sal_Bool bRet = pLNames->Count() == rCmp.pLNames->Count() &&
75 aNamespaceMap == rCmp.aNamespaceMap;
76 if( bRet )
77 {
78 sal_uInt16 nCount = pLNames->Count();
79 sal_uInt16 i;
80 for( i=0; bRet && i < nCount; i++ )
81 bRet = aPrefixPoss[i] == rCmp.aPrefixPoss[i];
82
83 if( bRet )
84 {
85 for( i=0; bRet && i < nCount; i++ )
86 bRet = *(*pLNames)[i] == *(*rCmp.pLNames)[i] &&
87 *(*pValues)[i] == *(*rCmp.pValues)[i];
88 }
89 }
90
91 return (int)bRet;
92 }
93
AddAttr(const OUString & rLName,const OUString & rValue)94 sal_Bool SvXMLAttrContainerData::AddAttr( const OUString& rLName,
95 const OUString& rValue )
96 {
97 aPrefixPoss.Insert( USHRT_MAX, aPrefixPoss.Count() );
98 pLNames->Insert( new OUString(rLName), pLNames->Count() );
99 pValues->Insert( new OUString(rValue), pValues->Count() );
100
101 return sal_True;
102 }
103
AddAttr(const OUString & rPrefix,const OUString & rNamespace,const OUString & rLName,const OUString & rValue)104 sal_Bool SvXMLAttrContainerData::AddAttr( const OUString& rPrefix,
105 const OUString& rNamespace,
106 const OUString& rLName,
107 const OUString& rValue )
108 {
109 sal_uInt16 nPos = aNamespaceMap.Add( rPrefix, rNamespace );
110 aPrefixPoss.Insert( nPos, aPrefixPoss.Count() );
111 pLNames->Insert( new OUString(rLName), pLNames->Count() );
112 pValues->Insert( new OUString(rValue), pValues->Count() );
113
114 return sal_True;
115 }
116
AddAttr(const OUString & rPrefix,const OUString & rLName,const OUString & rValue)117 sal_Bool SvXMLAttrContainerData::AddAttr( const OUString& rPrefix,
118 const OUString& rLName,
119 const OUString& rValue )
120 {
121 sal_uInt16 nPos = aNamespaceMap.GetIndexByPrefix( rPrefix );
122 if( USHRT_MAX == nPos )
123 return sal_False;
124
125 aPrefixPoss.Insert( nPos, aPrefixPoss.Count() );
126 pLNames->Insert( new OUString(rLName), pLNames->Count() );
127 pValues->Insert( new OUString(rValue), pValues->Count() );
128
129 return sal_True;
130 }
131
SetAt(sal_uInt16 i,const rtl::OUString & rLName,const rtl::OUString & rValue)132 sal_Bool SvXMLAttrContainerData::SetAt( sal_uInt16 i,
133 const rtl::OUString& rLName, const rtl::OUString& rValue )
134 {
135 if( i >= GetAttrCount() )
136 return sal_False;
137
138 *(*pLNames)[i] = rLName;
139 *(*pValues)[i] = rValue;
140 aPrefixPoss[i] = USHRT_MAX;
141
142 return sal_True;
143 }
144
SetAt(sal_uInt16 i,const rtl::OUString & rPrefix,const rtl::OUString & rNamespace,const rtl::OUString & rLName,const rtl::OUString & rValue)145 sal_Bool SvXMLAttrContainerData::SetAt( sal_uInt16 i,
146 const rtl::OUString& rPrefix, const rtl::OUString& rNamespace,
147 const rtl::OUString& rLName, const rtl::OUString& rValue )
148 {
149 if( i >= GetAttrCount() )
150 return sal_False;
151
152 sal_uInt16 nPos = aNamespaceMap.Add( rPrefix, rNamespace );
153 if( USHRT_MAX == nPos )
154 return sal_False;
155
156 *(*pLNames)[i] = rLName;
157 *(*pValues)[i] = rValue;
158 aPrefixPoss[i] = nPos;
159
160 return sal_True;
161 }
162
SetAt(sal_uInt16 i,const rtl::OUString & rPrefix,const rtl::OUString & rLName,const rtl::OUString & rValue)163 sal_Bool SvXMLAttrContainerData::SetAt( sal_uInt16 i,
164 const rtl::OUString& rPrefix,
165 const rtl::OUString& rLName,
166 const rtl::OUString& rValue )
167 {
168 if( i >= GetAttrCount() )
169 return sal_False;
170
171 sal_uInt16 nPos = aNamespaceMap.GetIndexByPrefix( rPrefix );
172 if( USHRT_MAX == nPos )
173 return sal_False;
174
175 *(*pLNames)[i] = rLName;
176 *(*pValues)[i] = rValue;
177 aPrefixPoss[i] = nPos;
178
179 return sal_True;
180 }
181
Remove(sal_uInt16 i)182 void SvXMLAttrContainerData::Remove( sal_uInt16 i )
183 {
184 if( i < GetAttrCount() )
185 {
186 delete (*pLNames)[i];
187 pLNames->Remove( i );
188 delete (*pValues)[i];
189 pValues->Remove( i );
190 aPrefixPoss.Remove( i );
191 }
192 else
193 {
194 DBG_ERROR( "illegal index" );
195 }
196 }
197
GetAttrCount() const198 sal_uInt16 SvXMLAttrContainerData::GetAttrCount() const
199 {
200 return pLNames->Count();
201 }
202
GetAttrLName(sal_uInt16 i) const203 const ::rtl::OUString& SvXMLAttrContainerData::GetAttrLName(sal_uInt16 i) const
204 {
205 OSL_ENSURE( i < pLNames->Count(), "SvXMLAttrContainerData::GetLName: illegal index" );
206 return *(*pLNames)[i];
207 }
208
GetAttrValue(sal_uInt16 i) const209 const ::rtl::OUString& SvXMLAttrContainerData::GetAttrValue(sal_uInt16 i) const
210 {
211 OSL_ENSURE( i < pValues->Count(), "SvXMLAttrContainerData::GetValue: illegal index" );
212 return *(*pValues)[i];
213 }
214
215