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