Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include "MutableAttrList.hxx"
30 : : #include "xmloff/xmlnmspe.hxx"
31 : : #include <xmloff/nmspmap.hxx>
32 : : #include "IgnoreTContext.hxx"
33 : : #include "ActionMapTypesOOo.hxx"
34 : : #include "AttrTransformerAction.hxx"
35 : : #include "TransformerActions.hxx"
36 : : #include "TransformerBase.hxx"
37 : : #include "FormPropOOoTContext.hxx"
38 : :
39 : : using ::rtl::OUString;
40 : : using namespace ::com::sun::star::uno;
41 : : using namespace ::com::sun::star::xml::sax;
42 : : using namespace ::xmloff::token;
43 : :
44 : : class XMLFormPropValueTContext_Impl : public XMLTransformerContext
45 : : {
46 : : OUString m_aAttrQName;
47 : : ::rtl::OUString m_aCharacters;
48 : : sal_Bool m_bPersistent;
49 : : sal_Bool m_bIsVoid;
50 : :
51 : : public:
52 : : TYPEINFO();
53 : :
54 : : // element content persistence only
55 : : XMLFormPropValueTContext_Impl( XMLTransformerBase& rTransformer,
56 : : const OUString& rQName );
57 : : XMLFormPropValueTContext_Impl( XMLTransformerBase& rTransformer,
58 : : const OUString& rQName,
59 : : sal_uInt16 nAttrPrefix,
60 : : XMLTokenEnum eAttrToken );
61 : :
62 : : virtual ~XMLFormPropValueTContext_Impl();
63 : :
64 : : virtual void StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList );
65 : :
66 : : virtual void EndElement();
67 : :
68 : : virtual void Characters( const ::rtl::OUString& rChars );
69 : :
70 : : virtual sal_Bool IsPersistent() const;
71 : :
72 : 56 : sal_Bool IsVoid() const { return m_bIsVoid; }
73 : 51 : const ::rtl::OUString& GetTextContent() const { return m_aCharacters; }
74 : : };
75 : :
76 [ # # ][ # # ]: 0 : TYPEINIT1( XMLFormPropValueTContext_Impl, XMLTransformerContext );
77 : :
78 : 56 : XMLFormPropValueTContext_Impl::XMLFormPropValueTContext_Impl(
79 : : XMLTransformerBase& rTransformer,
80 : : const ::rtl::OUString& rQName ) :
81 : : XMLTransformerContext( rTransformer, rQName ),
82 : : m_bPersistent( sal_True ),
83 : 56 : m_bIsVoid( sal_False )
84 : : {
85 : 56 : }
86 : :
87 : 0 : XMLFormPropValueTContext_Impl::XMLFormPropValueTContext_Impl(
88 : : XMLTransformerBase& rTransformer,
89 : : const ::rtl::OUString& rQName,
90 : : sal_uInt16 nAttrPrefix,
91 : : XMLTokenEnum eAttrToken ) :
92 : : XMLTransformerContext( rTransformer, rQName ),
93 : 0 : m_aAttrQName( rTransformer.GetNamespaceMap().GetQNameByKey(
94 [ # # ]: 0 : nAttrPrefix, GetXMLToken(eAttrToken) ) ),
95 : : m_bPersistent( sal_True ),
96 [ # # ]: 0 : m_bIsVoid( sal_False )
97 : : {
98 : 0 : }
99 : :
100 : 56 : XMLFormPropValueTContext_Impl::~XMLFormPropValueTContext_Impl()
101 : : {
102 [ - + ]: 112 : }
103 : :
104 : 56 : void XMLFormPropValueTContext_Impl::StartElement(
105 : : const Reference< XAttributeList >& rAttrList )
106 : : {
107 [ + - ]: 56 : sal_Int16 nAttrCount = rAttrList.is() ? rAttrList->getLength() : 0;
108 [ + + ]: 61 : for( sal_Int16 i=0; i < nAttrCount; i++ )
109 : : {
110 [ + - ][ + - ]: 5 : const OUString& rAttrName = rAttrList->getNameByIndex( i );
111 : 5 : OUString aLocalName;
112 : : sal_uInt16 nPrefix =
113 : 5 : GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName,
114 [ + - ]: 5 : &aLocalName );
115 [ + - ][ + - ]: 20 : if( XML_NAMESPACE_FORM == nPrefix &&
[ + - ][ + - ]
116 [ + - ]: 5 : IsXMLToken( aLocalName, XML_PROPERTY_IS_VOID ) &&
117 [ + - ][ + - ]: 10 : IsXMLToken( rAttrList->getValueByIndex( i ), XML_TRUE ) )
[ + - ][ + - ]
[ # # ]
118 : 5 : m_bIsVoid = sal_True;
119 : 5 : }
120 : 56 : }
121 : :
122 : 56 : void XMLFormPropValueTContext_Impl::EndElement()
123 : : {
124 [ - + ]: 56 : if( !m_bPersistent )
125 : : {
126 : : XMLMutableAttributeList *pMutableAttrList =
127 [ # # ]: 0 : new XMLMutableAttributeList;
128 [ # # ][ # # ]: 0 : Reference< XAttributeList > xAttrList( pMutableAttrList );
129 : : pMutableAttrList->AddAttribute( m_aAttrQName,
130 [ # # ]: 0 : m_aCharacters );
131 : :
132 : 0 : OUString aElemQName( GetTransformer().GetNamespaceMap().GetQNameByKey(
133 [ # # # # ]: 0 : XML_NAMESPACE_FORM, GetXMLToken(XML_LIST_VALUE) ) );
134 [ # # ]: 0 : GetTransformer().GetDocHandler()->startElement( aElemQName,
135 [ # # ]: 0 : xAttrList );
136 [ # # ][ # # ]: 0 : GetTransformer().GetDocHandler()->endElement( aElemQName );
137 : : }
138 : 56 : }
139 : :
140 : 31 : void XMLFormPropValueTContext_Impl::Characters( const OUString& rChars )
141 : : {
142 : 31 : m_aCharacters += rChars;
143 : 31 : }
144 : :
145 : :
146 : 0 : sal_Bool XMLFormPropValueTContext_Impl::IsPersistent() const
147 : : {
148 : 0 : return m_bPersistent;
149 : : }
150 : :
151 : : //------------------------------------------------------------------------------
152 : :
153 [ # # ][ # # ]: 0 : TYPEINIT1( XMLFormPropOOoTransformerContext, XMLTransformerContext );
154 : :
155 : 56 : XMLFormPropOOoTransformerContext::XMLFormPropOOoTransformerContext(
156 : : XMLTransformerBase& rImp,
157 : : const OUString& rQName ) :
158 : : XMLTransformerContext( rImp, rQName ),
159 : : m_aElemQName( rQName ),
160 : : m_nValueTypeAttr( -1 ),
161 : : m_eValueToken( XML_VALUE ),
162 : : m_eValueTypeToken( XML_TOKEN_END ),
163 : 56 : m_bIsList( sal_False )
164 : : {
165 : 56 : }
166 : :
167 [ + - ]: 56 : XMLFormPropOOoTransformerContext::~XMLFormPropOOoTransformerContext()
168 : : {
169 [ - + ]: 112 : }
170 : :
171 : 56 : XMLTransformerContext *XMLFormPropOOoTransformerContext::CreateChildContext(
172 : : sal_uInt16 nPrefix,
173 : : const OUString& rLocalName,
174 : : const OUString& rQName,
175 : : const Reference< XAttributeList >& )
176 : : {
177 : 56 : XMLTransformerContext *pContext = 0;
178 : :
179 [ + - + - ]: 112 : if( XML_NAMESPACE_FORM == nPrefix &&
[ + - ]
180 : 56 : IsXMLToken( rLocalName, XML_PROPERTY_VALUE ) )
181 : : {
182 [ - + ]: 56 : if( m_bIsList )
183 : : {
184 : 0 : pContext = new XMLFormPropValueTContext_Impl( GetTransformer(),
185 : : rQName,
186 : : XML_NAMESPACE_OFFICE,
187 [ # # ]: 0 : m_eValueToken );
188 : : }
189 [ + - ]: 56 : else if( !m_xValueContext.is() )
190 : : {
191 : : m_xValueContext=
192 [ + - ]: 56 : new XMLFormPropValueTContext_Impl( GetTransformer(), rQName );
193 : 56 : pContext = m_xValueContext.get();
194 : : }
195 : : }
196 : :
197 : : // default is ignore
198 [ - + ]: 56 : if( !pContext )
199 : 0 : pContext = new XMLIgnoreTransformerContext( GetTransformer(), rQName,
200 [ # # ]: 0 : sal_True, sal_True );
201 : 56 : return pContext;
202 : : }
203 : :
204 : 56 : void XMLFormPropOOoTransformerContext::StartElement(
205 : : const Reference< XAttributeList >& rAttrList )
206 : : {
207 : :
208 : : XMLTransformerActions *pActions =
209 [ + - ]: 56 : GetTransformer().GetUserDefinedActions( OOO_FORM_PROP_ACTIONS );
210 : : OSL_ENSURE( pActions, "go no actions" );
211 : :
212 : : XMLMutableAttributeList *pMutableAttrList =
213 [ + - ]: 56 : new XMLMutableAttributeList( rAttrList, sal_True );
214 [ + - ][ + - ]: 56 : m_xAttrList = pMutableAttrList;
215 : :
216 : 56 : OUString aValueType;
217 [ + - ][ + - ]: 56 : sal_Int16 nAttrCount = rAttrList.is() ? rAttrList->getLength() : 0;
[ + - ]
218 [ + + ]: 168 : for( sal_Int16 i=0; i < nAttrCount; i++ )
219 : : {
220 [ + - ][ + - ]: 112 : const OUString& rAttrName = rAttrList->getNameByIndex( i );
221 : 112 : OUString aLocalName;
222 : : sal_uInt16 nPrefix =
223 : 112 : GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName,
224 [ + - ]: 112 : &aLocalName );
225 : 112 : XMLTransformerActions::key_type aKey( nPrefix, aLocalName );
226 : : XMLTransformerActions::const_iterator aIter =
227 [ + - ]: 112 : pActions->find( aKey );
228 [ + + ][ + - ]: 112 : if( !(aIter == pActions->end() ) )
229 : : {
230 [ + - ][ + - ]: 56 : const OUString& rAttrValue = rAttrList->getValueByIndex( i );
231 [ + - ]: 56 : switch( (*aIter).second.m_nActionType )
[ + - - ]
232 : : {
233 : : case XML_ATACTION_RENAME:
234 [ + - ][ + - ]: 56 : if( IsXMLToken( aLocalName, XML_PROPERTY_TYPE ) )
235 : : {
236 : 56 : aValueType = rAttrValue;
237 : 56 : m_nValueTypeAttr = i;
238 : : }
239 : : {
240 : : OUString aNewAttrQName(
241 : 56 : GetTransformer().GetNamespaceMap().GetQNameByKey(
242 [ + - ]: 56 : (*aIter).second.GetQNamePrefixFromParam1(),
243 : : ::xmloff::token::GetXMLToken(
244 [ + - ]: 112 : (*aIter).second.GetQNameTokenFromParam1()) ) );
[ + - + - ]
245 [ + - ]: 56 : pMutableAttrList->RenameAttributeByIndex( i, aNewAttrQName );
246 : : }
247 : 56 : break;
248 : : case XML_ATACTION_REMOVE:
249 [ # # ][ # # ]: 0 : if( IsXMLToken( aLocalName, XML_PROPERTY_IS_LIST ) )
250 : : {
251 : : m_aElemQName =
252 : 0 : GetTransformer().GetNamespaceMap().GetQNameByKey(
253 [ # # # # ]: 0 : XML_NAMESPACE_FORM, GetXMLToken( XML_LIST_PROPERTY ) );
254 : 0 : m_bIsList = sal_True;
255 : : }
256 [ # # ]: 0 : pMutableAttrList->RemoveAttributeByIndex( i );
257 : 0 : --i;
258 : 0 : --nAttrCount;
259 : 0 : break;
260 : : default:
261 : : OSL_ENSURE( !this, "unknown action" );
262 : 0 : break;
263 : 56 : }
264 : : }
265 : 112 : }
266 : :
267 [ + - ]: 56 : if( !aValueType.isEmpty() )
268 : : {
269 [ + - ][ + + ]: 56 : if( IsXMLToken( aValueType, XML_STRING ) )
270 : 46 : m_eValueToken = XML_STRING_VALUE;
271 [ + - ][ - + ]: 10 : else if( IsXMLToken( aValueType, XML_BOOLEAN ) )
272 : 0 : m_eValueToken = XML_BOOLEAN_VALUE;
273 [ + - ][ + + ]: 15 : else if( IsXMLToken( aValueType, XML_SHORT ) ||
[ - + ][ # # ]
[ # # ][ + - ]
274 [ + - ]: 5 : IsXMLToken( aValueType, XML_INT ) ||
275 [ # # ]: 0 : IsXMLToken( aValueType, XML_LONG ) ||
276 [ # # ]: 0 : IsXMLToken( aValueType, XML_DOUBLE ) )
277 : 10 : m_eValueTypeToken = XML_FLOAT;
278 : 56 : }
279 : 56 : }
280 : :
281 : 56 : void XMLFormPropOOoTransformerContext::EndElement()
282 : : {
283 [ + - ]: 56 : if( m_xValueContext.is() )
284 : : {
285 [ + + ]: 56 : if( m_xValueContext->IsVoid() )
286 : : {
287 : 5 : m_eValueTypeToken = XML_VOID;
288 : : }
289 : : else
290 : : {
291 : : OUString aAttrQName(
292 : 51 : GetTransformer().GetNamespaceMap().GetQNameByKey(
293 [ + - + - ]: 102 : XML_NAMESPACE_OFFICE, GetXMLToken(m_eValueToken) ) );
294 [ + - ]: 51 : static_cast< XMLMutableAttributeList * >( m_xAttrList.get() )
295 [ + - ][ + - ]: 102 : ->AddAttribute( aAttrQName, m_xValueContext->GetTextContent() );
296 : : }
297 : : }
298 : :
299 [ + - ][ + + ]: 56 : if( m_nValueTypeAttr != -1 && m_eValueTypeToken != XML_TOKEN_END )
300 : : {
301 : 10 : static_cast< XMLMutableAttributeList * >( m_xAttrList.get() )
302 : : ->SetValueByIndex( m_nValueTypeAttr ,
303 [ + - ]: 20 : GetXMLToken( m_eValueTypeToken ) );
304 : : }
305 : :
306 : 56 : GetTransformer().GetDocHandler()->startElement( m_aElemQName,
307 : 56 : m_xAttrList );
308 : 56 : GetTransformer().GetDocHandler()->endElement( m_aElemQName );
309 : 56 : }
310 : :
311 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|