/src/libreoffice/xmloff/source/xforms/XFormsInstanceContext.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 | | |
21 | | #include "XFormsInstanceContext.hxx" |
22 | | |
23 | | #include <DomBuilderContext.hxx> |
24 | | |
25 | | #include <rtl/ustring.hxx> |
26 | | #include <sal/log.hxx> |
27 | | #include <com/sun/star/uno/Reference.hxx> |
28 | | #include <com/sun/star/beans/PropertyValue.hpp> |
29 | | #include <com/sun/star/xforms/XModel2.hpp> |
30 | | |
31 | | #include <xmloff/xmltoken.hxx> |
32 | | #include <xmloff/xmlimp.hxx> |
33 | | #include <xmloff/xmlerror.hxx> |
34 | | |
35 | | |
36 | | using com::sun::star::uno::Reference; |
37 | | using com::sun::star::uno::Any; |
38 | | using com::sun::star::uno::Sequence; |
39 | | using com::sun::star::xforms::XModel2; |
40 | | using com::sun::star::beans::PropertyValue; |
41 | | |
42 | | using xmloff::token::XML_SRC; |
43 | | using xmloff::token::XML_ID; |
44 | | |
45 | | XFormsInstanceContext::XFormsInstanceContext( |
46 | | SvXMLImport& rImport, |
47 | | const Reference<XModel2> & xModel ) : |
48 | 0 | TokenContext( rImport ), |
49 | 0 | mxModel( xModel ) |
50 | 0 | { |
51 | 0 | SAL_WARN_IF( !mxModel.is(), "xmloff", "need model" ); |
52 | 0 | } |
53 | | |
54 | | css::uno::Reference< css::xml::sax::XFastContextHandler > XFormsInstanceContext::createFastChildContext( |
55 | | sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& ) |
56 | 0 | { |
57 | 0 | SvXMLImportContext* pContext = nullptr; |
58 | | |
59 | | // only the first element child of an xforms:instance element |
60 | | // is used as an instance. The other children remainder must be |
61 | | // ignored. |
62 | 0 | if( mxInstance.is() ) |
63 | 0 | { |
64 | 0 | const OUString& rLocalName = SvXMLImport::getNameFromToken( nElement ); |
65 | 0 | GetImport().SetError( XMLERROR_XFORMS_ONLY_ONE_INSTANCE_ELEMENT, rLocalName ); |
66 | 0 | } |
67 | 0 | else |
68 | 0 | { |
69 | | // create new DomBuilderContext. Save reference to tree in Model. |
70 | 0 | DomBuilderContext* pInstance = new DomBuilderContext( GetImport(), nElement ); |
71 | 0 | mxInstance = pInstance->getTree(); |
72 | 0 | pContext = pInstance; |
73 | 0 | } |
74 | |
|
75 | 0 | SAL_WARN_IF( pContext == nullptr, "xmloff", "no context!" ); |
76 | 0 | return pContext; |
77 | |
|
78 | 0 | } |
79 | | |
80 | | css::uno::Reference< css::xml::sax::XFastContextHandler > XFormsInstanceContext::createUnknownChildContext( |
81 | | const OUString & rNamespace, const OUString &rName, const css::uno::Reference< css::xml::sax::XFastAttributeList > & /*Attribs*/) |
82 | 0 | { |
83 | 0 | SvXMLImportContext* pContext = nullptr; |
84 | | |
85 | | // only the first element child of an xforms:instance element |
86 | | // is used as an instance. The other children remainder must be |
87 | | // ignored. |
88 | 0 | if( mxInstance.is() ) |
89 | 0 | { |
90 | 0 | GetImport().SetError( XMLERROR_XFORMS_ONLY_ONE_INSTANCE_ELEMENT, rName ); |
91 | 0 | } |
92 | 0 | else |
93 | 0 | { |
94 | | // create new DomBuilderContext. Save reference to tree in Model. |
95 | 0 | DomBuilderContext* pInstance = new DomBuilderContext( GetImport(), rNamespace, rName ); |
96 | 0 | mxInstance = pInstance->getTree(); |
97 | 0 | pContext = pInstance; |
98 | 0 | } |
99 | |
|
100 | 0 | SAL_WARN_IF( pContext == nullptr, "xmloff", "no context!" ); |
101 | 0 | return pContext; |
102 | |
|
103 | 0 | } |
104 | | |
105 | | void XFormsInstanceContext::endFastElement(sal_Int32 ) |
106 | 0 | { |
107 | 0 | Sequence<PropertyValue> aSequence( 3 ); |
108 | 0 | PropertyValue* pSequence = aSequence.getArray(); |
109 | 0 | pSequence[0].Name = "Instance"; |
110 | 0 | pSequence[0].Value <<= mxInstance; |
111 | 0 | pSequence[1].Name = "ID"; |
112 | 0 | pSequence[1].Value <<= msId; |
113 | 0 | pSequence[2].Name = "URL"; |
114 | 0 | pSequence[2].Value <<= msURL; |
115 | |
|
116 | 0 | mxModel->getInstances()->insert( Any( aSequence ) ); |
117 | 0 | } |
118 | | |
119 | | void XFormsInstanceContext::endUnknownElement(const OUString & /*Namespace*/, const OUString & /*Name*/) |
120 | 0 | { |
121 | 0 | Sequence<PropertyValue> aSequence( 3 ); |
122 | 0 | PropertyValue* pSequence = aSequence.getArray(); |
123 | 0 | pSequence[0].Name = "Instance"; |
124 | 0 | pSequence[0].Value <<= mxInstance; |
125 | 0 | pSequence[1].Name = "ID"; |
126 | 0 | pSequence[1].Value <<= msId; |
127 | 0 | pSequence[2].Name = "URL"; |
128 | 0 | pSequence[2].Value <<= msURL; |
129 | |
|
130 | 0 | mxModel->getInstances()->insert( Any( aSequence ) ); |
131 | 0 | } |
132 | | |
133 | | void XFormsInstanceContext::HandleAttribute(const sax_fastparser::FastAttributeList::FastAttributeIter & aIter ) |
134 | 0 | { |
135 | 0 | switch( aIter.getToken() & TOKEN_MASK ) |
136 | 0 | { |
137 | 0 | case XML_SRC: |
138 | 0 | msURL = aIter.toString(); |
139 | 0 | break; |
140 | 0 | case XML_ID: |
141 | 0 | msId = aIter.toString(); |
142 | 0 | break; |
143 | 0 | default: |
144 | 0 | XMLOFF_WARN_UNKNOWN("xmloff", aIter); |
145 | 0 | assert( false && "this should not happen" ); |
146 | 0 | break; |
147 | 0 | } |
148 | 0 | } |
149 | | |
150 | | SvXMLImportContext* XFormsInstanceContext::HandleChild( |
151 | | sal_Int32, |
152 | | const Reference<css::xml::sax::XFastAttributeList>& ) |
153 | 0 | { |
154 | | assert( false && "to be handled by CreateChildContext" ); |
155 | 0 | return nullptr; |
156 | 0 | } |
157 | | |
158 | | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |