xref: /AOO41X/main/xmlscript/source/xmldlg_imexp/xmldlg_addfunc.cxx (revision e1d5bd03a6ea7ac2b26b792c9e2a94e9f347a43b)
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_xmlscript.hxx"
26 
27 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
28 #include <com/sun/star/io/XActiveDataSource.hpp>
29 #include <com/sun/star/xml/sax/XParser.hpp>
30 
31 #include <comphelper/processfactory.hxx>
32 #include <cppuhelper/implbase1.hxx>
33 #include <xmlscript/xml_helper.hxx>
34 #include <xmlscript/xmldlg_imexp.hxx>
35 
36 
37 using namespace ::rtl;
38 using namespace ::com::sun::star;
39 using namespace ::com::sun::star::uno;
40 
41 namespace xmlscript
42 {
43 
44 //==================================================================================================
45 class InputStreamProvider
46     : public ::cppu::WeakImplHelper1< io::XInputStreamProvider >
47 {
48     ByteSequence _bytes;
49 
50 public:
InputStreamProvider(ByteSequence const & rBytes)51     inline InputStreamProvider( ByteSequence const & rBytes )
52         : _bytes( rBytes )
53         {}
54 
55     // XInputStreamProvider
56     virtual Reference< io::XInputStream > SAL_CALL createInputStream()
57         throw (RuntimeException);
58 };
59 //__________________________________________________________________________________________________
createInputStream()60 Reference< io::XInputStream > InputStreamProvider::createInputStream()
61     throw (RuntimeException)
62 {
63     return ::xmlscript::createInputStream( _bytes );
64 }
65 
66 //==================================================================================================
exportDialogModel(Reference<container::XNameContainer> const & xDialogModel,Reference<XComponentContext> const & xContext)67 Reference< io::XInputStreamProvider > SAL_CALL exportDialogModel(
68     Reference< container::XNameContainer > const & xDialogModel,
69     Reference< XComponentContext > const & xContext )
70     SAL_THROW( (Exception) )
71 {
72     Reference< lang::XMultiComponentFactory > xSMgr( xContext->getServiceManager() );
73     if (! xSMgr.is())
74     {
75         throw RuntimeException(
76             OUString( RTL_CONSTASCII_USTRINGPARAM("no service manager available!") ),
77             Reference< XInterface >() );
78     }
79 
80     Reference< xml::sax::XExtendedDocumentHandler > xHandler( xSMgr->createInstanceWithContext(
81         OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xml.sax.Writer") ), xContext ), UNO_QUERY );
82     OSL_ASSERT( xHandler.is() );
83     if (! xHandler.is())
84     {
85         throw RuntimeException(
86             OUString( RTL_CONSTASCII_USTRINGPARAM("could not create sax-writer component!") ),
87             Reference< XInterface >() );
88     }
89 
90     ByteSequence aBytes;
91 
92     Reference< io::XActiveDataSource > xSource( xHandler, UNO_QUERY );
93     xSource->setOutputStream( createOutputStream( &aBytes ) );
94     exportDialogModel( xHandler, xDialogModel );
95 
96     return new InputStreamProvider( aBytes );
97 }
98 
99 //==================================================================================================
importDialogModel(Reference<io::XInputStream> xInput,Reference<container::XNameContainer> const & xDialogModel,Reference<XComponentContext> const & xContext)100 void SAL_CALL importDialogModel(
101     Reference< io::XInputStream > xInput,
102     Reference< container::XNameContainer > const & xDialogModel,
103     Reference< XComponentContext > const & xContext )
104     SAL_THROW( (Exception) )
105 {
106     Reference< lang::XMultiComponentFactory > xSMgr( xContext->getServiceManager() );
107     if (! xSMgr.is())
108     {
109         throw RuntimeException(
110             OUString( RTL_CONSTASCII_USTRINGPARAM("no service manager available!") ),
111             Reference< XInterface >() );
112     }
113 
114     Reference< xml::sax::XParser > xParser( xSMgr->createInstanceWithContext(
115         OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xml.sax.Parser") ), xContext ), UNO_QUERY );
116     OSL_ASSERT( xParser.is() );
117     if (! xParser.is())
118     {
119         throw RuntimeException(
120             OUString( RTL_CONSTASCII_USTRINGPARAM("could not create sax-parser component!") ),
121             Reference< XInterface >() );
122     }
123 
124     // error handler, entity resolver omitted for this helper function
125     xParser->setDocumentHandler( importDialogModel( xDialogModel, xContext ) );
126 
127     xml::sax::InputSource source;
128     source.aInputStream = xInput;
129     source.sSystemId = OUString( RTL_CONSTASCII_USTRINGPARAM("virtual file") );
130 
131     xParser->parseStream( source );
132 }
133 
134 }
135