1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_xmloff.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <xmloff/xmlscripti.hxx>
28*b1cdbd2cSJim Jagielski #include "xmloff/xmlnmspe.hxx"
29*b1cdbd2cSJim Jagielski #include <xmloff/xmltoken.hxx>
30*b1cdbd2cSJim Jagielski #include <xmloff/xmlimp.hxx>
31*b1cdbd2cSJim Jagielski #include <xmloff/nmspmap.hxx>
32*b1cdbd2cSJim Jagielski #include <xmloff/XMLEventsImportContext.hxx>
33*b1cdbd2cSJim Jagielski #include "xmlbasici.hxx"
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XEventsSupplier.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XEmbeddedScripts.hpp>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski using ::rtl::OUString;
39*b1cdbd2cSJim Jagielski using namespace com::sun::star;
40*b1cdbd2cSJim Jagielski using namespace com::sun::star::uno;
41*b1cdbd2cSJim Jagielski using namespace com::sun::star::lang;
42*b1cdbd2cSJim Jagielski using namespace com::sun::star::frame;
43*b1cdbd2cSJim Jagielski using namespace com::sun::star::document;
44*b1cdbd2cSJim Jagielski using namespace com::sun::star::xml::sax;
45*b1cdbd2cSJim Jagielski using namespace ::xmloff::token;
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski // =============================================================================
49*b1cdbd2cSJim Jagielski // XMLScriptChildContext: context for <office:script> element
50*b1cdbd2cSJim Jagielski // =============================================================================
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski class XMLScriptChildContext : public SvXMLImportContext
53*b1cdbd2cSJim Jagielski {
54*b1cdbd2cSJim Jagielski private:
55*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >                 m_xModel;
56*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference< ::com::sun::star::document::XEmbeddedScripts >    m_xDocumentScripts;
57*b1cdbd2cSJim Jagielski     ::rtl::OUString m_aLanguage;
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski public:
60*b1cdbd2cSJim Jagielski     XMLScriptChildContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const ::rtl::OUString& rLName,
61*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel>& rxModel,
62*b1cdbd2cSJim Jagielski         const ::rtl::OUString& rLanguage );
63*b1cdbd2cSJim Jagielski     virtual ~XMLScriptChildContext();
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski     virtual SvXMLImportContext* CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
66*b1cdbd2cSJim Jagielski         const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList );
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski 	virtual void EndElement();
69*b1cdbd2cSJim Jagielski };
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
72*b1cdbd2cSJim Jagielski 
XMLScriptChildContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const::rtl::OUString & rLName,const Reference<frame::XModel> & rxModel,const::rtl::OUString & rLanguage)73*b1cdbd2cSJim Jagielski XMLScriptChildContext::XMLScriptChildContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const ::rtl::OUString& rLName,
74*b1cdbd2cSJim Jagielski         const Reference< frame::XModel >& rxModel, const ::rtl::OUString& rLanguage )
75*b1cdbd2cSJim Jagielski     :SvXMLImportContext( rImport, nPrfx, rLName )
76*b1cdbd2cSJim Jagielski     ,m_xModel( rxModel )
77*b1cdbd2cSJim Jagielski     ,m_xDocumentScripts( rxModel, UNO_QUERY )
78*b1cdbd2cSJim Jagielski     ,m_aLanguage( rLanguage )
79*b1cdbd2cSJim Jagielski {
80*b1cdbd2cSJim Jagielski }
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
83*b1cdbd2cSJim Jagielski 
~XMLScriptChildContext()84*b1cdbd2cSJim Jagielski XMLScriptChildContext::~XMLScriptChildContext()
85*b1cdbd2cSJim Jagielski {
86*b1cdbd2cSJim Jagielski }
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
89*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrefix,const::rtl::OUString & rLocalName,const Reference<xml::sax::XAttributeList> & xAttrList)90*b1cdbd2cSJim Jagielski SvXMLImportContext* XMLScriptChildContext::CreateChildContext(
91*b1cdbd2cSJim Jagielski     sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName,
92*b1cdbd2cSJim Jagielski     const Reference< xml::sax::XAttributeList >& xAttrList )
93*b1cdbd2cSJim Jagielski {
94*b1cdbd2cSJim Jagielski     SvXMLImportContext* pContext = NULL;
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski     if ( m_xDocumentScripts.is() )
97*b1cdbd2cSJim Jagielski     {   // document supports embedding scripts/macros
98*b1cdbd2cSJim Jagielski         ::rtl::OUString aBasic( GetImport().GetNamespaceMap().GetPrefixByKey( XML_NAMESPACE_OOO ) );
99*b1cdbd2cSJim Jagielski         aBasic += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":Basic" ) );
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski         if ( m_aLanguage == aBasic && nPrefix == XML_NAMESPACE_OOO && IsXMLToken( rLocalName, XML_LIBRARIES ) )
102*b1cdbd2cSJim Jagielski             pContext = new XMLBasicImportContext( GetImport(), nPrefix, rLocalName, m_xModel );
103*b1cdbd2cSJim Jagielski     }
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski     if ( !pContext )
106*b1cdbd2cSJim Jagielski         pContext = SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList );
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski     return pContext;
109*b1cdbd2cSJim Jagielski }
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
112*b1cdbd2cSJim Jagielski 
EndElement()113*b1cdbd2cSJim Jagielski void XMLScriptChildContext::EndElement()
114*b1cdbd2cSJim Jagielski {
115*b1cdbd2cSJim Jagielski }
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski // =============================================================================
118*b1cdbd2cSJim Jagielski // XMLScriptContext: context for <office:scripts> element
119*b1cdbd2cSJim Jagielski // =============================================================================
120*b1cdbd2cSJim Jagielski 
XMLScriptContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const Reference<XModel> & rDocModel)121*b1cdbd2cSJim Jagielski XMLScriptContext::XMLScriptContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName,
122*b1cdbd2cSJim Jagielski         const Reference<XModel>& rDocModel )
123*b1cdbd2cSJim Jagielski     :SvXMLImportContext( rImport, nPrfx, rLName )
124*b1cdbd2cSJim Jagielski     ,m_xModel( rDocModel )
125*b1cdbd2cSJim Jagielski {
126*b1cdbd2cSJim Jagielski }
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
129*b1cdbd2cSJim Jagielski 
~XMLScriptContext()130*b1cdbd2cSJim Jagielski XMLScriptContext::~XMLScriptContext()
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski }
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
135*b1cdbd2cSJim Jagielski 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLName,const Reference<XAttributeList> & xAttrList)136*b1cdbd2cSJim Jagielski SvXMLImportContext* XMLScriptContext::CreateChildContext(
137*b1cdbd2cSJim Jagielski     sal_uInt16 nPrefix, const OUString& rLName,
138*b1cdbd2cSJim Jagielski     const Reference<XAttributeList>& xAttrList )
139*b1cdbd2cSJim Jagielski {
140*b1cdbd2cSJim Jagielski 	SvXMLImportContext* pContext = NULL;
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski     if ( nPrefix == XML_NAMESPACE_OFFICE )
143*b1cdbd2cSJim Jagielski     {
144*b1cdbd2cSJim Jagielski         if ( IsXMLToken( rLName, XML_EVENT_LISTENERS ) )
145*b1cdbd2cSJim Jagielski         {
146*b1cdbd2cSJim Jagielski             Reference< XEventsSupplier> xSupplier( GetImport().GetModel(), UNO_QUERY );
147*b1cdbd2cSJim Jagielski             pContext = new XMLEventsImportContext( GetImport(), nPrefix, rLName, xSupplier );
148*b1cdbd2cSJim Jagielski         }
149*b1cdbd2cSJim Jagielski         else if ( IsXMLToken( rLName, XML_SCRIPT ) )
150*b1cdbd2cSJim Jagielski         {
151*b1cdbd2cSJim Jagielski             ::rtl::OUString aAttrName( GetImport().GetNamespaceMap().GetPrefixByKey( XML_NAMESPACE_SCRIPT ) );
152*b1cdbd2cSJim Jagielski             aAttrName += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":language" ) );
153*b1cdbd2cSJim Jagielski             if ( xAttrList.is() )
154*b1cdbd2cSJim Jagielski             {
155*b1cdbd2cSJim Jagielski                 ::rtl::OUString aLanguage = xAttrList->getValueByName( aAttrName );
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 				if ( m_xModel.is() )
158*b1cdbd2cSJim Jagielski 				{
159*b1cdbd2cSJim Jagielski 					uno::Sequence< beans::PropertyValue > aMedDescr = m_xModel->getArgs();
160*b1cdbd2cSJim Jagielski 					sal_Int32 nNewLen = aMedDescr.getLength() + 1;
161*b1cdbd2cSJim Jagielski 					aMedDescr.realloc( nNewLen );
162*b1cdbd2cSJim Jagielski 					aMedDescr[nNewLen-1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "BreakMacroSignature" ) );
163*b1cdbd2cSJim Jagielski 					aMedDescr[nNewLen-1].Value <<= (sal_Bool)sal_True;
164*b1cdbd2cSJim Jagielski 					m_xModel->attachResource( m_xModel->getURL(), aMedDescr );
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski                 	pContext = new XMLScriptChildContext( GetImport(), nPrefix, rLName, m_xModel, aLanguage );
167*b1cdbd2cSJim Jagielski 				}
168*b1cdbd2cSJim Jagielski             }
169*b1cdbd2cSJim Jagielski         }
170*b1cdbd2cSJim Jagielski 	}
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski     if ( !pContext )
173*b1cdbd2cSJim Jagielski         pContext = SvXMLImportContext::CreateChildContext( nPrefix, rLName, xAttrList);
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 	return pContext;
176*b1cdbd2cSJim Jagielski }
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
179*b1cdbd2cSJim Jagielski 
EndElement()180*b1cdbd2cSJim Jagielski void XMLScriptContext::EndElement()
181*b1cdbd2cSJim Jagielski {
182*b1cdbd2cSJim Jagielski }
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
185