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_comphelper.hxx"
26 #include <comphelper/attributelist.hxx>
27 #include <vos/diagnose.hxx>
28
29 #include <vector>
30
31 using namespace rtl;
32 using namespace osl;
33 using namespace com::sun::star;
34
35 namespace comphelper {
36
37 struct TagAttribute_Impl
38 {
TagAttribute_Implcomphelper::TagAttribute_Impl39 TagAttribute_Impl(){}
TagAttribute_Implcomphelper::TagAttribute_Impl40 TagAttribute_Impl( const OUString &aName, const OUString &aType,
41 const OUString &aValue )
42 {
43 this->sName = aName;
44 this->sType = aType;
45 this->sValue = aValue;
46 }
47
48 OUString sName;
49 OUString sType;
50 OUString sValue;
51 };
52
53 struct AttributeList_Impl
54 {
AttributeList_Implcomphelper::AttributeList_Impl55 AttributeList_Impl()
56 {
57 // performance improvement during adding
58 vecAttribute.reserve(20);
59 }
60 ::std::vector<struct TagAttribute_Impl> vecAttribute;
61 };
62
getLength(void)63 sal_Int16 SAL_CALL AttributeList::getLength(void) throw( ::com::sun::star::uno::RuntimeException )
64 {
65 return (sal_Int16)(m_pImpl->vecAttribute.size());
66 }
67
getNameByIndex(sal_Int16 i)68 OUString SAL_CALL AttributeList::getNameByIndex(sal_Int16 i) throw( ::com::sun::star::uno::RuntimeException )
69 {
70 return ( i < static_cast < sal_Int16 > (m_pImpl->vecAttribute.size()) ) ? m_pImpl->vecAttribute[i].sName : OUString();
71 }
72
getTypeByIndex(sal_Int16 i)73 OUString SAL_CALL AttributeList::getTypeByIndex(sal_Int16 i) throw( ::com::sun::star::uno::RuntimeException )
74 {
75 if( i < static_cast < sal_Int16 > (m_pImpl->vecAttribute.size() ) ) {
76 return m_pImpl->vecAttribute[i].sType;
77 }
78 return OUString();
79 }
80
getValueByIndex(sal_Int16 i)81 OUString SAL_CALL AttributeList::getValueByIndex(sal_Int16 i) throw( ::com::sun::star::uno::RuntimeException )
82 {
83 return ( i < static_cast < sal_Int16 > (m_pImpl->vecAttribute.size() ) ) ? m_pImpl->vecAttribute[i].sValue : OUString();
84 }
85
getTypeByName(const OUString & sName)86 OUString SAL_CALL AttributeList::getTypeByName( const OUString& sName ) throw( ::com::sun::star::uno::RuntimeException )
87 {
88 ::std::vector<struct TagAttribute_Impl>::iterator ii = m_pImpl->vecAttribute.begin();
89
90 for( ; ii != m_pImpl->vecAttribute.end() ; ii ++ ) {
91 if( (*ii).sName == sName ) {
92 return (*ii).sType;
93 }
94 }
95 return OUString();
96 }
97
getValueByName(const OUString & sName)98 OUString SAL_CALL AttributeList::getValueByName(const OUString& sName) throw( ::com::sun::star::uno::RuntimeException )
99 {
100 ::std::vector<struct TagAttribute_Impl>::iterator ii = m_pImpl->vecAttribute.begin();
101
102 for( ; ii != m_pImpl->vecAttribute.end() ; ii ++ ) {
103 if( (*ii).sName == sName ) {
104 return (*ii).sValue;
105 }
106 }
107 return OUString();
108 }
109
110
AttributeList()111 AttributeList::AttributeList()
112 {
113 m_pImpl = new AttributeList_Impl;
114 }
115
116
117
~AttributeList()118 AttributeList::~AttributeList()
119 {
120 delete m_pImpl;
121 }
122
AddAttribute(const OUString & sName,const OUString & sType,const OUString & sValue)123 void AttributeList::AddAttribute( const OUString &sName ,
124 const OUString &sType ,
125 const OUString &sValue )
126 {
127 m_pImpl->vecAttribute.push_back( TagAttribute_Impl( sName , sType , sValue ) );
128 }
129
Clear()130 void AttributeList::Clear()
131 {
132 m_pImpl->vecAttribute.clear();
133
134 VOS_ENSURE( ! getLength(), "Length > 0 after AttributeList::Clear!");
135 }
136
RemoveAttribute(const OUString sName)137 void AttributeList::RemoveAttribute( const OUString sName )
138 {
139 ::std::vector<struct TagAttribute_Impl>::iterator ii = m_pImpl->vecAttribute.begin();
140
141 for( ; ii != m_pImpl->vecAttribute.end() ; ii ++ ) {
142 if( (*ii).sName == sName ) {
143 m_pImpl->vecAttribute.erase( ii );
144 break;
145 }
146 }
147 }
148
149
SetAttributeList(const uno::Reference<::com::sun::star::xml::sax::XAttributeList> & r)150 void AttributeList::SetAttributeList( const uno::Reference< ::com::sun::star::xml::sax::XAttributeList > &r )
151 {
152 Clear();
153 AppendAttributeList( r );
154 }
155
AppendAttributeList(const uno::Reference<::com::sun::star::xml::sax::XAttributeList> & r)156 void AttributeList::AppendAttributeList( const uno::Reference< ::com::sun::star::xml::sax::XAttributeList > &r )
157 {
158 VOS_ENSURE( r.is(), "r isn't!" );
159
160 sal_Int32 nMax = r->getLength();
161 sal_Int32 nTotalSize = m_pImpl->vecAttribute.size() + nMax;
162 m_pImpl->vecAttribute.reserve( nTotalSize );
163
164 for( sal_Int16 i = 0 ; i < nMax ; i ++ ) {
165 m_pImpl->vecAttribute.push_back( TagAttribute_Impl(
166 r->getNameByIndex( i ) ,
167 r->getTypeByIndex( i ) ,
168 r->getValueByIndex( i )));
169 }
170
171 VOS_ENSURE( nTotalSize == getLength(), "nTotalSize != getLength()");
172 }
173
174 } // namespace comphelper
175
176