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 ) 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 59 SvXMLAttrContainerData::SvXMLAttrContainerData() : 60 pLNames( new SvXMLAttrContainerData_Impl ), 61 pValues( new SvXMLAttrContainerData_Impl ) 62 { 63 } 64 65 SvXMLAttrContainerData::~SvXMLAttrContainerData() 66 { 67 delete pLNames; 68 delete pValues; 69 } 70 71 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 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 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 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 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 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 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 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 198 sal_uInt16 SvXMLAttrContainerData::GetAttrCount() const 199 { 200 return pLNames->Count(); 201 } 202 203 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 209 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