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_xmloff.hxx" 26 27 #include <xmloff/xmlscripti.hxx> 28 #include "xmloff/xmlnmspe.hxx" 29 #include <xmloff/xmltoken.hxx> 30 #include <xmloff/xmlimp.hxx> 31 #include <xmloff/nmspmap.hxx> 32 #include <xmloff/XMLEventsImportContext.hxx> 33 #include "xmlbasici.hxx" 34 35 #include <com/sun/star/document/XEventsSupplier.hpp> 36 #include <com/sun/star/document/XEmbeddedScripts.hpp> 37 38 using ::rtl::OUString; 39 using namespace com::sun::star; 40 using namespace com::sun::star::uno; 41 using namespace com::sun::star::lang; 42 using namespace com::sun::star::frame; 43 using namespace com::sun::star::document; 44 using namespace com::sun::star::xml::sax; 45 using namespace ::xmloff::token; 46 47 48 // ============================================================================= 49 // XMLScriptChildContext: context for <office:script> element 50 // ============================================================================= 51 52 class XMLScriptChildContext : public SvXMLImportContext 53 { 54 private: 55 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > m_xModel; 56 ::com::sun::star::uno::Reference< ::com::sun::star::document::XEmbeddedScripts > m_xDocumentScripts; 57 ::rtl::OUString m_aLanguage; 58 59 public: 60 XMLScriptChildContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const ::rtl::OUString& rLName, 61 const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel>& rxModel, 62 const ::rtl::OUString& rLanguage ); 63 virtual ~XMLScriptChildContext(); 64 65 virtual SvXMLImportContext* CreateChildContext( sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, 66 const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList ); 67 68 virtual void EndElement(); 69 }; 70 71 // ----------------------------------------------------------------------------- 72 73 XMLScriptChildContext::XMLScriptChildContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const ::rtl::OUString& rLName, 74 const Reference< frame::XModel >& rxModel, const ::rtl::OUString& rLanguage ) 75 :SvXMLImportContext( rImport, nPrfx, rLName ) 76 ,m_xModel( rxModel ) 77 ,m_xDocumentScripts( rxModel, UNO_QUERY ) 78 ,m_aLanguage( rLanguage ) 79 { 80 } 81 82 // ----------------------------------------------------------------------------- 83 84 XMLScriptChildContext::~XMLScriptChildContext() 85 { 86 } 87 88 // ----------------------------------------------------------------------------- 89 90 SvXMLImportContext* XMLScriptChildContext::CreateChildContext( 91 sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, 92 const Reference< xml::sax::XAttributeList >& xAttrList ) 93 { 94 SvXMLImportContext* pContext = NULL; 95 96 if ( m_xDocumentScripts.is() ) 97 { // document supports embedding scripts/macros 98 ::rtl::OUString aBasic( GetImport().GetNamespaceMap().GetPrefixByKey( XML_NAMESPACE_OOO ) ); 99 aBasic += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":Basic" ) ); 100 101 if ( m_aLanguage == aBasic && nPrefix == XML_NAMESPACE_OOO && IsXMLToken( rLocalName, XML_LIBRARIES ) ) 102 pContext = new XMLBasicImportContext( GetImport(), nPrefix, rLocalName, m_xModel ); 103 } 104 105 if ( !pContext ) 106 pContext = SvXMLImportContext::CreateChildContext( nPrefix, rLocalName, xAttrList ); 107 108 return pContext; 109 } 110 111 // ----------------------------------------------------------------------------- 112 113 void XMLScriptChildContext::EndElement() 114 { 115 } 116 117 // ============================================================================= 118 // XMLScriptContext: context for <office:scripts> element 119 // ============================================================================= 120 121 XMLScriptContext::XMLScriptContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, 122 const Reference<XModel>& rDocModel ) 123 :SvXMLImportContext( rImport, nPrfx, rLName ) 124 ,m_xModel( rDocModel ) 125 { 126 } 127 128 // ----------------------------------------------------------------------------- 129 130 XMLScriptContext::~XMLScriptContext() 131 { 132 } 133 134 // ----------------------------------------------------------------------------- 135 136 SvXMLImportContext* XMLScriptContext::CreateChildContext( 137 sal_uInt16 nPrefix, const OUString& rLName, 138 const Reference<XAttributeList>& xAttrList ) 139 { 140 SvXMLImportContext* pContext = NULL; 141 142 if ( nPrefix == XML_NAMESPACE_OFFICE ) 143 { 144 if ( IsXMLToken( rLName, XML_EVENT_LISTENERS ) ) 145 { 146 Reference< XEventsSupplier> xSupplier( GetImport().GetModel(), UNO_QUERY ); 147 pContext = new XMLEventsImportContext( GetImport(), nPrefix, rLName, xSupplier ); 148 } 149 else if ( IsXMLToken( rLName, XML_SCRIPT ) ) 150 { 151 ::rtl::OUString aAttrName( GetImport().GetNamespaceMap().GetPrefixByKey( XML_NAMESPACE_SCRIPT ) ); 152 aAttrName += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":language" ) ); 153 if ( xAttrList.is() ) 154 { 155 ::rtl::OUString aLanguage = xAttrList->getValueByName( aAttrName ); 156 157 if ( m_xModel.is() ) 158 { 159 uno::Sequence< beans::PropertyValue > aMedDescr = m_xModel->getArgs(); 160 sal_Int32 nNewLen = aMedDescr.getLength() + 1; 161 aMedDescr.realloc( nNewLen ); 162 aMedDescr[nNewLen-1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "BreakMacroSignature" ) ); 163 aMedDescr[nNewLen-1].Value <<= (sal_Bool)sal_True; 164 m_xModel->attachResource( m_xModel->getURL(), aMedDescr ); 165 166 pContext = new XMLScriptChildContext( GetImport(), nPrefix, rLName, m_xModel, aLanguage ); 167 } 168 } 169 } 170 } 171 172 if ( !pContext ) 173 pContext = SvXMLImportContext::CreateChildContext( nPrefix, rLName, xAttrList); 174 175 return pContext; 176 } 177 178 // ----------------------------------------------------------------------------- 179 180 void XMLScriptContext::EndElement() 181 { 182 } 183 184 // ----------------------------------------------------------------------------- 185