1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_xmloff.hxx" 30*cdf0e10cSrcweir #include <tools/debug.hxx> 31*cdf0e10cSrcweir #include <com/sun/star/xml/AttributeData.hpp> 32*cdf0e10cSrcweir #include <com/sun/star/lang/XUnoTunnel.hpp> 33*cdf0e10cSrcweir 34*cdf0e10cSrcweir #include <xmloff/xmlcnimp.hxx> 35*cdf0e10cSrcweir #include "xmloff/unoatrcn.hxx" 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir using namespace rtl; 38*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 39*cdf0e10cSrcweir using namespace ::com::sun::star::container; 40*cdf0e10cSrcweir using namespace ::com::sun::star::lang; 41*cdf0e10cSrcweir using namespace ::com::sun::star::xml; 42*cdf0e10cSrcweir 43*cdf0e10cSrcweir typedef ::rtl::OUString *OUStringPtr; 44*cdf0e10cSrcweir SV_DECL_PTRARR_DEL( SvXMLAttrContainerData_Impl, OUStringPtr, 5, 5 ) 45*cdf0e10cSrcweir SV_IMPL_PTRARR( SvXMLAttrContainerData_Impl, OUStringPtr ) 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir 48*cdf0e10cSrcweir SvXMLAttrContainerData::SvXMLAttrContainerData( 49*cdf0e10cSrcweir const SvXMLAttrContainerData& rImpl ) : 50*cdf0e10cSrcweir aNamespaceMap( rImpl.aNamespaceMap ), 51*cdf0e10cSrcweir pLNames( new SvXMLAttrContainerData_Impl ), 52*cdf0e10cSrcweir pValues( new SvXMLAttrContainerData_Impl ) 53*cdf0e10cSrcweir { 54*cdf0e10cSrcweir sal_uInt16 nCount = rImpl.pLNames->Count(); 55*cdf0e10cSrcweir for( sal_uInt16 i=0; i<nCount; i++ ) 56*cdf0e10cSrcweir { 57*cdf0e10cSrcweir aPrefixPoss.Insert( rImpl.aPrefixPoss[i], i ); 58*cdf0e10cSrcweir pLNames->Insert( new OUString( *(*rImpl.pLNames)[i] ), i ); 59*cdf0e10cSrcweir pValues->Insert( new OUString( *(*rImpl.pValues)[i] ), i ); 60*cdf0e10cSrcweir } 61*cdf0e10cSrcweir } 62*cdf0e10cSrcweir 63*cdf0e10cSrcweir SvXMLAttrContainerData::SvXMLAttrContainerData() : 64*cdf0e10cSrcweir pLNames( new SvXMLAttrContainerData_Impl ), 65*cdf0e10cSrcweir pValues( new SvXMLAttrContainerData_Impl ) 66*cdf0e10cSrcweir { 67*cdf0e10cSrcweir } 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir SvXMLAttrContainerData::~SvXMLAttrContainerData() 70*cdf0e10cSrcweir { 71*cdf0e10cSrcweir delete pLNames; 72*cdf0e10cSrcweir delete pValues; 73*cdf0e10cSrcweir } 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir int SvXMLAttrContainerData::operator ==( 76*cdf0e10cSrcweir const SvXMLAttrContainerData& rCmp ) const 77*cdf0e10cSrcweir { 78*cdf0e10cSrcweir sal_Bool bRet = pLNames->Count() == rCmp.pLNames->Count() && 79*cdf0e10cSrcweir aNamespaceMap == rCmp.aNamespaceMap; 80*cdf0e10cSrcweir if( bRet ) 81*cdf0e10cSrcweir { 82*cdf0e10cSrcweir sal_uInt16 nCount = pLNames->Count(); 83*cdf0e10cSrcweir sal_uInt16 i; 84*cdf0e10cSrcweir for( i=0; bRet && i < nCount; i++ ) 85*cdf0e10cSrcweir bRet = aPrefixPoss[i] == rCmp.aPrefixPoss[i]; 86*cdf0e10cSrcweir 87*cdf0e10cSrcweir if( bRet ) 88*cdf0e10cSrcweir { 89*cdf0e10cSrcweir for( i=0; bRet && i < nCount; i++ ) 90*cdf0e10cSrcweir bRet = *(*pLNames)[i] == *(*rCmp.pLNames)[i] && 91*cdf0e10cSrcweir *(*pValues)[i] == *(*rCmp.pValues)[i]; 92*cdf0e10cSrcweir } 93*cdf0e10cSrcweir } 94*cdf0e10cSrcweir 95*cdf0e10cSrcweir return (int)bRet; 96*cdf0e10cSrcweir } 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir sal_Bool SvXMLAttrContainerData::AddAttr( const OUString& rLName, 99*cdf0e10cSrcweir const OUString& rValue ) 100*cdf0e10cSrcweir { 101*cdf0e10cSrcweir aPrefixPoss.Insert( USHRT_MAX, aPrefixPoss.Count() ); 102*cdf0e10cSrcweir pLNames->Insert( new OUString(rLName), pLNames->Count() ); 103*cdf0e10cSrcweir pValues->Insert( new OUString(rValue), pValues->Count() ); 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir return sal_True; 106*cdf0e10cSrcweir } 107*cdf0e10cSrcweir 108*cdf0e10cSrcweir sal_Bool SvXMLAttrContainerData::AddAttr( const OUString& rPrefix, 109*cdf0e10cSrcweir const OUString& rNamespace, 110*cdf0e10cSrcweir const OUString& rLName, 111*cdf0e10cSrcweir const OUString& rValue ) 112*cdf0e10cSrcweir { 113*cdf0e10cSrcweir sal_uInt16 nPos = aNamespaceMap.Add( rPrefix, rNamespace ); 114*cdf0e10cSrcweir aPrefixPoss.Insert( nPos, aPrefixPoss.Count() ); 115*cdf0e10cSrcweir pLNames->Insert( new OUString(rLName), pLNames->Count() ); 116*cdf0e10cSrcweir pValues->Insert( new OUString(rValue), pValues->Count() ); 117*cdf0e10cSrcweir 118*cdf0e10cSrcweir return sal_True; 119*cdf0e10cSrcweir } 120*cdf0e10cSrcweir 121*cdf0e10cSrcweir sal_Bool SvXMLAttrContainerData::AddAttr( const OUString& rPrefix, 122*cdf0e10cSrcweir const OUString& rLName, 123*cdf0e10cSrcweir const OUString& rValue ) 124*cdf0e10cSrcweir { 125*cdf0e10cSrcweir sal_uInt16 nPos = aNamespaceMap.GetIndexByPrefix( rPrefix ); 126*cdf0e10cSrcweir if( USHRT_MAX == nPos ) 127*cdf0e10cSrcweir return sal_False; 128*cdf0e10cSrcweir 129*cdf0e10cSrcweir aPrefixPoss.Insert( nPos, aPrefixPoss.Count() ); 130*cdf0e10cSrcweir pLNames->Insert( new OUString(rLName), pLNames->Count() ); 131*cdf0e10cSrcweir pValues->Insert( new OUString(rValue), pValues->Count() ); 132*cdf0e10cSrcweir 133*cdf0e10cSrcweir return sal_True; 134*cdf0e10cSrcweir } 135*cdf0e10cSrcweir 136*cdf0e10cSrcweir sal_Bool SvXMLAttrContainerData::SetAt( sal_uInt16 i, 137*cdf0e10cSrcweir const rtl::OUString& rLName, const rtl::OUString& rValue ) 138*cdf0e10cSrcweir { 139*cdf0e10cSrcweir if( i >= GetAttrCount() ) 140*cdf0e10cSrcweir return sal_False; 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir *(*pLNames)[i] = rLName; 143*cdf0e10cSrcweir *(*pValues)[i] = rValue; 144*cdf0e10cSrcweir aPrefixPoss[i] = USHRT_MAX; 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir return sal_True; 147*cdf0e10cSrcweir } 148*cdf0e10cSrcweir 149*cdf0e10cSrcweir sal_Bool SvXMLAttrContainerData::SetAt( sal_uInt16 i, 150*cdf0e10cSrcweir const rtl::OUString& rPrefix, const rtl::OUString& rNamespace, 151*cdf0e10cSrcweir const rtl::OUString& rLName, const rtl::OUString& rValue ) 152*cdf0e10cSrcweir { 153*cdf0e10cSrcweir if( i >= GetAttrCount() ) 154*cdf0e10cSrcweir return sal_False; 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir sal_uInt16 nPos = aNamespaceMap.Add( rPrefix, rNamespace ); 157*cdf0e10cSrcweir if( USHRT_MAX == nPos ) 158*cdf0e10cSrcweir return sal_False; 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir *(*pLNames)[i] = rLName; 161*cdf0e10cSrcweir *(*pValues)[i] = rValue; 162*cdf0e10cSrcweir aPrefixPoss[i] = nPos; 163*cdf0e10cSrcweir 164*cdf0e10cSrcweir return sal_True; 165*cdf0e10cSrcweir } 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir sal_Bool SvXMLAttrContainerData::SetAt( sal_uInt16 i, 168*cdf0e10cSrcweir const rtl::OUString& rPrefix, 169*cdf0e10cSrcweir const rtl::OUString& rLName, 170*cdf0e10cSrcweir const rtl::OUString& rValue ) 171*cdf0e10cSrcweir { 172*cdf0e10cSrcweir if( i >= GetAttrCount() ) 173*cdf0e10cSrcweir return sal_False; 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir sal_uInt16 nPos = aNamespaceMap.GetIndexByPrefix( rPrefix ); 176*cdf0e10cSrcweir if( USHRT_MAX == nPos ) 177*cdf0e10cSrcweir return sal_False; 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir *(*pLNames)[i] = rLName; 180*cdf0e10cSrcweir *(*pValues)[i] = rValue; 181*cdf0e10cSrcweir aPrefixPoss[i] = nPos; 182*cdf0e10cSrcweir 183*cdf0e10cSrcweir return sal_True; 184*cdf0e10cSrcweir } 185*cdf0e10cSrcweir 186*cdf0e10cSrcweir void SvXMLAttrContainerData::Remove( sal_uInt16 i ) 187*cdf0e10cSrcweir { 188*cdf0e10cSrcweir if( i < GetAttrCount() ) 189*cdf0e10cSrcweir { 190*cdf0e10cSrcweir delete (*pLNames)[i]; 191*cdf0e10cSrcweir pLNames->Remove( i ); 192*cdf0e10cSrcweir delete (*pValues)[i]; 193*cdf0e10cSrcweir pValues->Remove( i ); 194*cdf0e10cSrcweir aPrefixPoss.Remove( i ); 195*cdf0e10cSrcweir } 196*cdf0e10cSrcweir else 197*cdf0e10cSrcweir { 198*cdf0e10cSrcweir DBG_ERROR( "illegal index" ); 199*cdf0e10cSrcweir } 200*cdf0e10cSrcweir } 201*cdf0e10cSrcweir 202*cdf0e10cSrcweir sal_uInt16 SvXMLAttrContainerData::GetAttrCount() const 203*cdf0e10cSrcweir { 204*cdf0e10cSrcweir return pLNames->Count(); 205*cdf0e10cSrcweir } 206*cdf0e10cSrcweir 207*cdf0e10cSrcweir const ::rtl::OUString& SvXMLAttrContainerData::GetAttrLName(sal_uInt16 i) const 208*cdf0e10cSrcweir { 209*cdf0e10cSrcweir OSL_ENSURE( i < pLNames->Count(), "SvXMLAttrContainerData::GetLName: illegal index" ); 210*cdf0e10cSrcweir return *(*pLNames)[i]; 211*cdf0e10cSrcweir } 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir const ::rtl::OUString& SvXMLAttrContainerData::GetAttrValue(sal_uInt16 i) const 214*cdf0e10cSrcweir { 215*cdf0e10cSrcweir OSL_ENSURE( i < pValues->Count(), "SvXMLAttrContainerData::GetValue: illegal index" ); 216*cdf0e10cSrcweir return *(*pValues)[i]; 217*cdf0e10cSrcweir } 218*cdf0e10cSrcweir 219