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 : :
30 : : #include "xformsapi.hxx"
31 : :
32 : : #include <com/sun/star/uno/Reference.hxx>
33 : : #include <com/sun/star/beans/XPropertySet.hpp>
34 : : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
35 : : #include <com/sun/star/container/XNameAccess.hpp>
36 : : #include <com/sun/star/xforms/XFormsSupplier.hpp>
37 : : #include <com/sun/star/xforms/XDataTypeRepository.hpp>
38 : : #include <com/sun/star/xforms/XModel.hpp>
39 : : #include <com/sun/star/container/XNameContainer.hpp>
40 : : #include <com/sun/star/xsd/DataTypeClass.hpp>
41 : :
42 : : #include <comphelper/processfactory.hxx>
43 : : #include <tools/debug.hxx>
44 : :
45 : : #include <xmloff/xmltoken.hxx>
46 : : #include <xmloff/nmspmap.hxx>
47 : : #include <xmloff/xmlnmspe.hxx>
48 : : #include <xmloff/xmltkmap.hxx>
49 : :
50 : : using rtl::OUString;
51 : : using com::sun::star::uno::Reference;
52 : : using com::sun::star::uno::Sequence;
53 : : using com::sun::star::uno::UNO_QUERY;
54 : : using com::sun::star::uno::UNO_QUERY_THROW;
55 : : using com::sun::star::beans::XPropertySet;
56 : : using com::sun::star::container::XNameAccess;
57 : : using com::sun::star::lang::XMultiServiceFactory;
58 : : using com::sun::star::xforms::XFormsSupplier;
59 : : using com::sun::star::xforms::XDataTypeRepository;
60 : : using com::sun::star::container::XNameContainer;
61 : : using comphelper::getProcessServiceFactory;
62 : : using com::sun::star::uno::makeAny;
63 : : using com::sun::star::uno::Any;
64 : : using com::sun::star::uno::Exception;
65 : :
66 : : using namespace com::sun::star;
67 : : using namespace xmloff::token;
68 : :
69 : 0 : Reference<XPropertySet> lcl_createPropertySet( const OUString& rServiceName )
70 : : {
71 [ # # ]: 0 : Reference<XMultiServiceFactory> xFactory = getProcessServiceFactory();
72 : : DBG_ASSERT( xFactory.is(), "can't get service factory" );
73 : :
74 [ # # ]: 0 : Reference<XPropertySet> xModel( xFactory->createInstance( rServiceName ),
75 [ # # ][ # # ]: 0 : UNO_QUERY_THROW );
76 : : DBG_ASSERT( xModel.is(), "can't create model" );
77 : :
78 : 0 : return xModel;
79 : : }
80 : :
81 : 0 : Reference<XPropertySet> lcl_createXFormsModel()
82 : : {
83 [ # # ]: 0 : return lcl_createPropertySet( OUSTRING( "com.sun.star.xforms.Model" ) );
84 : : }
85 : :
86 : 0 : void lcl_addXFormsModel(
87 : : const Reference<frame::XModel>& xDocument,
88 : : const Reference<XPropertySet>& xModel )
89 : : {
90 : 0 : bool bSuccess = false;
91 : : try
92 : : {
93 [ # # ]: 0 : Reference<XFormsSupplier> xSupplier( xDocument, UNO_QUERY );
94 [ # # ]: 0 : if( xSupplier.is() )
95 : : {
96 [ # # ][ # # ]: 0 : Reference<XNameContainer> xForms = xSupplier->getXForms();
97 [ # # ]: 0 : if( xForms.is() )
98 : : {
99 : 0 : OUString sName;
100 [ # # ][ # # ]: 0 : xModel->getPropertyValue( OUSTRING("ID")) >>= sName;
[ # # ]
101 [ # # ][ # # ]: 0 : xForms->insertByName( sName, makeAny( xModel ) );
[ # # ]
102 : 0 : bSuccess = true;
103 : 0 : }
104 [ # # ]: 0 : }
105 : : }
106 : 0 : catch( const Exception& )
107 : : {
108 : : ; // no success!
109 : : }
110 : :
111 : : // TODO: implement proper error handling
112 : : DBG_ASSERT( bSuccess, "can't import model" );
113 : : (void)bSuccess;
114 : 0 : }
115 : :
116 : 0 : Reference<XPropertySet> lcl_findXFormsBindingOrSubmission(
117 : : Reference<frame::XModel>& xDocument,
118 : : const rtl::OUString& rBindingID,
119 : : bool bBinding )
120 : : {
121 : : // find binding by iterating over all models, and look for the
122 : : // given binding ID
123 : :
124 : 0 : Reference<XPropertySet> xRet;
125 : : try
126 : : {
127 : : // get supplier
128 [ # # ]: 0 : Reference<XFormsSupplier> xSupplier( xDocument, UNO_QUERY );
129 [ # # ]: 0 : if( xSupplier.is() )
130 : : {
131 : : // get XForms models
132 [ # # ][ # # ]: 0 : Reference<XNameContainer> xForms = xSupplier->getXForms();
133 [ # # ]: 0 : if( xForms.is() )
134 : : {
135 : : // iterate over all models
136 [ # # ][ # # ]: 0 : Sequence<OUString> aNames = xForms->getElementNames();
137 : 0 : const OUString* pNames = aNames.getConstArray();
138 : 0 : sal_Int32 nNames = aNames.getLength();
139 [ # # ][ # # ]: 0 : for( sal_Int32 n = 0; (n < nNames) && !xRet.is(); n++ )
[ # # ]
140 : : {
141 : : Reference<xforms::XModel> xModel(
142 [ # # ][ # # ]: 0 : xForms->getByName( pNames[n] ), UNO_QUERY );
[ # # ]
143 [ # # ]: 0 : if( xModel.is() )
144 : : {
145 : : // ask model for bindings
146 : : Reference<XNameAccess> xBindings(
147 : : bBinding
148 [ # # ]: 0 : ? xModel->getBindings()
149 [ # # ]: 0 : : xModel->getSubmissions(),
150 [ # # ][ # # ]: 0 : UNO_QUERY_THROW );
[ # # ][ # # ]
151 : :
152 : : // finally, ask binding for name
153 [ # # ][ # # ]: 0 : if( xBindings->hasByName( rBindingID ) )
[ # # ]
154 [ # # ]: 0 : xRet.set( xBindings->getByName( rBindingID ),
155 [ # # ][ # # ]: 0 : UNO_QUERY );
156 : : }
157 [ # # ]: 0 : }
158 : 0 : }
159 [ # # ]: 0 : }
160 : : }
161 [ # # ]: 0 : catch( const Exception& )
162 : : {
163 : : ; // no success!
164 : : }
165 : :
166 : : // TODO: if (!xRet.is()) rImport.SetError(...);
167 : :
168 : 0 : return xRet;
169 : : }
170 : :
171 : 0 : Reference<XPropertySet> lcl_findXFormsBinding(
172 : : Reference<frame::XModel>& xDocument,
173 : : const rtl::OUString& rBindingID )
174 : : {
175 : 0 : return lcl_findXFormsBindingOrSubmission( xDocument, rBindingID, true );
176 : : }
177 : :
178 : 0 : Reference<XPropertySet> lcl_findXFormsSubmission(
179 : : Reference<frame::XModel>& xDocument,
180 : : const rtl::OUString& rBindingID )
181 : : {
182 : 0 : return lcl_findXFormsBindingOrSubmission( xDocument, rBindingID, false );
183 : : }
184 : :
185 : 0 : void lcl_setValue( Reference<XPropertySet>& xPropertySet,
186 : : const OUString& rName,
187 : : const Any rAny )
188 : : {
189 : 0 : xPropertySet->setPropertyValue( rName, rAny );
190 : 0 : }
191 : :
192 : : #define TOKEN_MAP_ENTRY(NAMESPACE,TOKEN) { XML_NAMESPACE_##NAMESPACE, xmloff::token::XML_##TOKEN, xmloff::token::XML_##TOKEN }
193 : : static SvXMLTokenMapEntry aTypes[] =
194 : : {
195 : : TOKEN_MAP_ENTRY( XSD, STRING ),
196 : : TOKEN_MAP_ENTRY( XSD, DECIMAL ),
197 : : TOKEN_MAP_ENTRY( XSD, DOUBLE ),
198 : : TOKEN_MAP_ENTRY( XSD, FLOAT ),
199 : : TOKEN_MAP_ENTRY( XSD, BOOLEAN ),
200 : : TOKEN_MAP_ENTRY( XSD, ANYURI ),
201 : : TOKEN_MAP_ENTRY( XSD, DATETIME_XSD ),
202 : : TOKEN_MAP_ENTRY( XSD, DATE ),
203 : : TOKEN_MAP_ENTRY( XSD, TIME ),
204 : : TOKEN_MAP_ENTRY( XSD, YEAR ),
205 : : TOKEN_MAP_ENTRY( XSD, MONTH ),
206 : : TOKEN_MAP_ENTRY( XSD, DAY ),
207 : : XML_TOKEN_MAP_END
208 : : };
209 : :
210 : 0 : sal_uInt16 lcl_getTypeClass(
211 : : const Reference<XDataTypeRepository>&
212 : : #ifdef DBG_UTIL
213 : : xRepository
214 : : #endif
215 : : ,
216 : : const SvXMLNamespaceMap& rNamespaceMap,
217 : : const OUString& rXMLName )
218 : : {
219 : : // translate name into token for local name
220 : 0 : OUString sLocalName;
221 [ # # ]: 0 : sal_uInt16 nPrefix = rNamespaceMap.GetKeyByAttrName(rXMLName, &sLocalName);
222 [ # # ]: 0 : SvXMLTokenMap aMap( aTypes );
223 [ # # ]: 0 : sal_uInt16 mnToken = aMap.Get( nPrefix, sLocalName );
224 : :
225 : 0 : sal_uInt16 nTypeClass = com::sun::star::xsd::DataTypeClass::STRING;
226 [ # # ]: 0 : if( mnToken != XML_TOK_UNKNOWN )
227 : : {
228 : : // we found an XSD name: then get the proper API name for it
229 : : DBG_ASSERT( xRepository.is(), "can't find type without repository");
230 [ # # # # : 0 : switch( mnToken )
# # # # #
# # # # ]
231 : : {
232 : : case XML_STRING:
233 : 0 : nTypeClass = com::sun::star::xsd::DataTypeClass::STRING;
234 : 0 : break;
235 : : case XML_ANYURI:
236 : 0 : nTypeClass = com::sun::star::xsd::DataTypeClass::anyURI;
237 : 0 : break;
238 : : case XML_DECIMAL:
239 : 0 : nTypeClass = com::sun::star::xsd::DataTypeClass::DECIMAL;
240 : 0 : break;
241 : : case XML_DOUBLE:
242 : 0 : nTypeClass = com::sun::star::xsd::DataTypeClass::DOUBLE;
243 : 0 : break;
244 : : case XML_FLOAT:
245 : 0 : nTypeClass = com::sun::star::xsd::DataTypeClass::FLOAT;
246 : 0 : break;
247 : : case XML_BOOLEAN:
248 : 0 : nTypeClass = com::sun::star::xsd::DataTypeClass::BOOLEAN;
249 : 0 : break;
250 : : case XML_DATETIME_XSD:
251 : 0 : nTypeClass = com::sun::star::xsd::DataTypeClass::DATETIME;
252 : 0 : break;
253 : : case XML_DATE:
254 : 0 : nTypeClass = com::sun::star::xsd::DataTypeClass::DATE;
255 : 0 : break;
256 : : case XML_TIME:
257 : 0 : nTypeClass = com::sun::star::xsd::DataTypeClass::TIME;
258 : 0 : break;
259 : : case XML_YEAR:
260 : 0 : nTypeClass = com::sun::star::xsd::DataTypeClass::gYear;
261 : 0 : break;
262 : : case XML_DAY:
263 : 0 : nTypeClass = com::sun::star::xsd::DataTypeClass::gDay;
264 : 0 : break;
265 : : case XML_MONTH:
266 : 0 : nTypeClass = com::sun::star::xsd::DataTypeClass::gMonth;
267 : 0 : break;
268 : :
269 : : /* data types not yet supported:
270 : : nTypeClass = com::sun::star::xsd::DataTypeClass::DURATION;
271 : : nTypeClass = com::sun::star::xsd::DataTypeClass::gYearMonth;
272 : : nTypeClass = com::sun::star::xsd::DataTypeClass::gMonthDay;
273 : : nTypeClass = com::sun::star::xsd::DataTypeClass::hexBinary;
274 : : nTypeClass = com::sun::star::xsd::DataTypeClass::base64Binary;
275 : : nTypeClass = com::sun::star::xsd::DataTypeClass::QName;
276 : : nTypeClass = com::sun::star::xsd::DataTypeClass::NOTATION;
277 : : */
278 : : }
279 : : }
280 : :
281 [ # # ]: 0 : return nTypeClass;
282 : : }
283 : :
284 : :
285 : 0 : rtl::OUString lcl_getTypeName(
286 : : const Reference<XDataTypeRepository>& xRepository,
287 : : const SvXMLNamespaceMap& rNamespaceMap,
288 : : const OUString& rXMLName )
289 : : {
290 : 0 : OUString sLocalName;
291 [ # # ]: 0 : sal_uInt16 nPrefix = rNamespaceMap.GetKeyByAttrName(rXMLName, &sLocalName);
292 [ # # ]: 0 : SvXMLTokenMap aMap( aTypes );
293 [ # # ]: 0 : sal_uInt16 mnToken = aMap.Get( nPrefix, sLocalName );
294 : : return ( mnToken == XML_TOK_UNKNOWN )
295 : : ? rXMLName
296 [ # # ][ # # ]: 0 : : lcl_getBasicTypeName( xRepository, rNamespaceMap, rXMLName );
[ # # ]
297 : : }
298 : :
299 : 0 : rtl::OUString lcl_getBasicTypeName(
300 : : const Reference<XDataTypeRepository>& xRepository,
301 : : const SvXMLNamespaceMap& rNamespaceMap,
302 : : const OUString& rXMLName )
303 : : {
304 : 0 : OUString sTypeName = rXMLName;
305 : : try
306 : : {
307 : : sTypeName =
308 [ # # ]: 0 : xRepository->getBasicDataType(
309 [ # # ]: 0 : lcl_getTypeClass( xRepository, rNamespaceMap, rXMLName ) )
310 [ # # ][ # # ]: 0 : ->getName();
[ # # ][ # # ]
311 : : }
312 [ # # ]: 0 : catch( const Exception& )
313 : : {
314 : : OSL_FAIL( "exception during type creation" );
315 : : }
316 : 0 : return sTypeName;
317 : : }
318 : :
319 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|