Coverage Report

Created: 2026-11-06 11:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/xmloff/source/transform/FormPropOOoTContext.cxx
Line
Count
Source
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/*
3
 * This file is part of the LibreOffice project.
4
 *
5
 * This Source Code Form is subject to the terms of the Mozilla Public
6
 * License, v. 2.0. If a copy of the MPL was not distributed with this
7
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
 *
9
 * This file incorporates work covered by the following license notice:
10
 *
11
 *   Licensed to the Apache Software Foundation (ASF) under one or more
12
 *   contributor license agreements. See the NOTICE file distributed
13
 *   with this work for additional information regarding copyright
14
 *   ownership. The ASF licenses this file to you under the Apache
15
 *   License, Version 2.0 (the "License"); you may not use this file
16
 *   except in compliance with the License. You may obtain a copy of
17
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18
 */
19
20
#include "MutableAttrList.hxx"
21
#include <xmloff/xmlnamespace.hxx>
22
#include <xmloff/namespacemap.hxx>
23
#include "IgnoreTContext.hxx"
24
#include "ActionMapTypesOOo.hxx"
25
#include "AttrTransformerAction.hxx"
26
#include "TransformerActions.hxx"
27
#include "TransformerBase.hxx"
28
#include "FormPropOOoTContext.hxx"
29
#include <osl/diagnose.h>
30
31
using namespace ::com::sun::star::uno;
32
using namespace ::com::sun::star::xml::sax;
33
using namespace ::xmloff::token;
34
35
class XMLFormPropValueTContext_Impl : public XMLTransformerContext
36
{
37
    OUString m_aCharacters;
38
    bool m_bIsVoid;
39
40
public:
41
    // element content persistence only
42
    XMLFormPropValueTContext_Impl( XMLTransformerBase& rTransformer,
43
                           const OUString& rQName );
44
45
    virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
46
47
    virtual void EndElement() override;
48
49
    virtual void Characters( const OUString& rChars ) override;
50
51
    virtual bool IsPersistent() const override;
52
53
0
    bool IsVoid() const { return m_bIsVoid; }
54
0
    const OUString& GetTextContent() const { return m_aCharacters; }
55
};
56
57
XMLFormPropValueTContext_Impl::XMLFormPropValueTContext_Impl(
58
        XMLTransformerBase& rTransformer,
59
        const OUString& rQName ) :
60
0
    XMLTransformerContext( rTransformer, rQName ),
61
0
    m_bIsVoid( false )
62
0
{
63
0
}
64
65
void XMLFormPropValueTContext_Impl::StartElement(
66
    const Reference< XAttributeList >& rAttrList )
67
0
{
68
0
    sal_Int16 nAttrCount = rAttrList.is() ? rAttrList->getLength() : 0;
69
0
    for( sal_Int16 i=0; i < nAttrCount; i++ )
70
0
    {
71
0
        const OUString aAttrName = rAttrList->getNameByIndex( i );
72
0
        OUString aLocalName;
73
0
        sal_uInt16 nPrefix =
74
0
            GetTransformer().GetNamespaceMap().GetKeyByAttrName( aAttrName,
75
0
                                                                 &aLocalName );
76
0
        if( XML_NAMESPACE_FORM == nPrefix &&
77
0
            IsXMLToken( aLocalName, XML_PROPERTY_IS_VOID ) &&
78
0
             IsXMLToken( rAttrList->getValueByIndex( i ), XML_TRUE ) )
79
0
            m_bIsVoid = true;
80
0
    }
81
0
}
82
83
void XMLFormPropValueTContext_Impl::EndElement()
84
0
{
85
0
}
86
87
void XMLFormPropValueTContext_Impl::Characters( const OUString& rChars )
88
0
{
89
0
    m_aCharacters += rChars;
90
0
}
91
92
bool XMLFormPropValueTContext_Impl::IsPersistent() const
93
0
{
94
0
    return true;
95
0
}
96
97
XMLFormPropOOoTransformerContext::XMLFormPropOOoTransformerContext(
98
        XMLTransformerBase& rImp,
99
        const OUString& rQName ) :
100
0
    XMLTransformerContext( rImp, rQName ),
101
0
    m_aElemQName( rQName ),
102
0
    m_nValueTypeAttr( -1 ),
103
0
    m_eValueToken( XML_VALUE ),
104
0
    m_eValueTypeToken( XML_TOKEN_END ),
105
0
    m_bIsList( false )
106
0
{
107
0
}
108
109
XMLFormPropOOoTransformerContext::~XMLFormPropOOoTransformerContext()
110
0
{
111
0
}
112
113
rtl::Reference<XMLTransformerContext> XMLFormPropOOoTransformerContext::CreateChildContext(
114
        sal_uInt16 nPrefix,
115
        const OUString& rLocalName,
116
        const OUString& rQName,
117
        const Reference< XAttributeList >& )
118
0
{
119
0
    rtl::Reference<XMLTransformerContext> pContext;
120
121
0
    if( XML_NAMESPACE_FORM == nPrefix &&
122
0
        IsXMLToken( rLocalName, XML_PROPERTY_VALUE ) )
123
0
    {
124
0
        if( m_bIsList )
125
0
        {
126
0
            pContext.set(new XMLFormPropValueTContext_Impl( GetTransformer(),
127
0
                                                          rQName ));
128
0
        }
129
0
        else if( !m_xValueContext.is() )
130
0
        {
131
0
            m_xValueContext=
132
0
                new XMLFormPropValueTContext_Impl( GetTransformer(), rQName );
133
0
            pContext = m_xValueContext;
134
0
        }
135
0
    }
136
137
    // default is ignore
138
0
    if( !pContext.is() )
139
0
        pContext.set(new XMLIgnoreTransformerContext( GetTransformer(), rQName,
140
0
                                             true, true ));
141
0
    return pContext;
142
0
}
143
144
void XMLFormPropOOoTransformerContext::StartElement(
145
    const Reference< XAttributeList >& rAttrList )
146
0
{
147
148
0
    XMLTransformerActions *pActions =
149
0
        GetTransformer().GetUserDefinedActions( OOO_FORM_PROP_ACTIONS );
150
0
    OSL_ENSURE( pActions, "go no actions" );
151
152
0
    rtl::Reference<XMLMutableAttributeList> pMutableAttrList =
153
0
        new XMLMutableAttributeList( rAttrList, true );
154
0
    m_xAttrList = pMutableAttrList;
155
156
0
    OUString aValueType;
157
0
    sal_Int16 nAttrCount = rAttrList.is() ? rAttrList->getLength() : 0;
158
0
    for( sal_Int16 i=0; i < nAttrCount; i++ )
159
0
    {
160
0
        const OUString aAttrName = rAttrList->getNameByIndex( i );
161
0
        OUString aLocalName;
162
0
        sal_uInt16 nPrefix =
163
0
            GetTransformer().GetNamespaceMap().GetKeyByAttrName( aAttrName,
164
0
                                                                 &aLocalName );
165
0
        XMLTransformerActions::key_type aKey( nPrefix, aLocalName );
166
0
        XMLTransformerActions::const_iterator aIter =
167
0
            pActions->find( aKey );
168
0
        if( aIter != pActions->end() )
169
0
        {
170
0
            const OUString aAttrValue = rAttrList->getValueByIndex( i );
171
0
            switch( (*aIter).second.m_nActionType )
172
0
            {
173
0
            case XML_ATACTION_RENAME:
174
0
                if( IsXMLToken( aLocalName, XML_PROPERTY_TYPE ) )
175
0
                {
176
0
                    aValueType = aAttrValue;
177
0
                    m_nValueTypeAttr = i;
178
0
                }
179
0
                {
180
0
                    OUString aNewAttrQName(
181
0
                        GetTransformer().GetNamespaceMap().GetQNameByKey(
182
0
                                (*aIter).second.GetQNamePrefixFromParam1(),
183
0
                                ::xmloff::token::GetXMLToken(
184
0
                                    (*aIter).second.GetQNameTokenFromParam1()) ) );
185
0
                    pMutableAttrList->RenameAttributeByIndex( i, aNewAttrQName );
186
0
                }
187
0
                break;
188
0
            case XML_ATACTION_REMOVE:
189
0
                if( IsXMLToken( aLocalName, XML_PROPERTY_IS_LIST ) )
190
0
                {
191
0
                    m_aElemQName =
192
0
                        GetTransformer().GetNamespaceMap().GetQNameByKey(
193
0
                        XML_NAMESPACE_FORM, GetXMLToken( XML_LIST_PROPERTY ) );
194
0
                    m_bIsList = true;
195
0
                }
196
0
                pMutableAttrList->RemoveAttributeByIndex( i );
197
0
                --i;
198
0
                --nAttrCount;
199
0
                break;
200
0
            default:
201
0
                OSL_ENSURE( false, "unknown action" );
202
0
                break;
203
0
            }
204
0
        }
205
0
    }
206
207
0
    if( !aValueType.isEmpty() )
208
0
    {
209
0
        if( IsXMLToken( aValueType, XML_STRING ) )
210
0
            m_eValueToken = XML_STRING_VALUE;
211
0
        else if( IsXMLToken( aValueType, XML_BOOLEAN ) )
212
0
            m_eValueToken = XML_BOOLEAN_VALUE;
213
0
        else if( IsXMLToken( aValueType, XML_SHORT ) ||
214
0
                 IsXMLToken( aValueType, XML_INT ) ||
215
0
                 IsXMLToken( aValueType, XML_LONG ) ||
216
0
                 IsXMLToken( aValueType, XML_DOUBLE ) )
217
0
            m_eValueTypeToken = XML_FLOAT;
218
0
    }
219
0
}
220
221
void XMLFormPropOOoTransformerContext::EndElement()
222
0
{
223
0
    if( m_xValueContext.is() )
224
0
    {
225
0
        if( m_xValueContext->IsVoid() )
226
0
        {
227
0
            m_eValueTypeToken = XML_VOID;
228
0
        }
229
0
        else
230
0
        {
231
0
            OUString aAttrQName(
232
0
                    GetTransformer().GetNamespaceMap().GetQNameByKey(
233
0
                    XML_NAMESPACE_OFFICE, GetXMLToken(m_eValueToken) ) );
234
0
            m_xAttrList->AddAttribute( aAttrQName, m_xValueContext->GetTextContent() );
235
0
        }
236
0
    }
237
238
0
    if( m_nValueTypeAttr != -1 && m_eValueTypeToken != XML_TOKEN_END )
239
0
    {
240
0
        m_xAttrList->SetValueByIndex( m_nValueTypeAttr ,
241
0
                                GetXMLToken( m_eValueTypeToken ) );
242
0
    }
243
244
0
    GetTransformer().GetDocHandler()->startElement( m_aElemQName, m_xAttrList );
245
0
    GetTransformer().GetDocHandler()->endElement( m_aElemQName );
246
0
}
247
248
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */