1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_xmloff.hxx" 30 #include "FrameOASISTContext.hxx" 31 #include "IgnoreTContext.hxx" 32 #include "MutableAttrList.hxx" 33 #include "xmloff/xmlnmspe.hxx" 34 #include "ActionMapTypesOASIS.hxx" 35 #include "ElemTransformerAction.hxx" 36 #include "TransformerActions.hxx" 37 #ifndef _XMLOFF_TRANSFORMERBASE_HXX 38 #include "TransformerBase.hxx" 39 #endif 40 41 using ::rtl::OUString; 42 43 using namespace ::com::sun::star::uno; 44 using namespace ::com::sun::star::xml::sax; 45 using namespace ::xmloff::token; 46 47 TYPEINIT1( XMLFrameOASISTransformerContext, XMLTransformerContext ); 48 49 sal_Bool XMLFrameOASISTransformerContext::IsLinkedEmbeddedObject( 50 const OUString& rLocalName, 51 const Reference< XAttributeList >& rAttrList ) 52 { 53 if( !(IsXMLToken( rLocalName, XML_OBJECT ) || 54 IsXMLToken( rLocalName, XML_OBJECT_OLE) ) ) 55 return sal_False; 56 57 sal_Int16 nAttrCount = rAttrList.is() ? rAttrList->getLength() : 0; 58 for( sal_Int16 i=0; i < nAttrCount; i++ ) 59 { 60 OUString aAttrName( rAttrList->getNameByIndex( i ) ); 61 OUString aLocalName; 62 sal_uInt16 nPrefix = 63 GetTransformer().GetNamespaceMap().GetKeyByAttrName( aAttrName, 64 &aLocalName ); 65 if( XML_NAMESPACE_XLINK == nPrefix && 66 IsXMLToken( aLocalName, XML_HREF ) ) 67 { 68 OUString sHRef( rAttrList->getValueByIndex( i ) ); 69 if (sHRef.getLength() == 0) 70 { 71 // When the href is empty then the object is not linked but 72 // a placeholder. 73 return sal_False; 74 } 75 GetTransformer().ConvertURIToOOo( sHRef, sal_True ); 76 return !(sHRef.getLength() && '#'==sHRef[0]); 77 } 78 } 79 80 return sal_False; 81 } 82 83 84 XMLFrameOASISTransformerContext::XMLFrameOASISTransformerContext( 85 XMLTransformerBase& rImp, 86 const OUString& rQName ) : 87 XMLTransformerContext( rImp, rQName ), 88 m_bIgnoreElement( false ) 89 { 90 } 91 92 XMLFrameOASISTransformerContext::~XMLFrameOASISTransformerContext() 93 { 94 } 95 96 void XMLFrameOASISTransformerContext::StartElement( 97 const Reference< XAttributeList >& rAttrList ) 98 { 99 m_xAttrList = new XMLMutableAttributeList( rAttrList, sal_True ); 100 101 sal_Int16 nAttrCount = rAttrList.is() ? rAttrList->getLength() : 0; 102 for( sal_Int16 i=0; i < nAttrCount; i++ ) 103 { 104 const OUString& rAttrName = rAttrList->getNameByIndex( i ); 105 OUString aLocalName; 106 sal_uInt16 nPrefix = 107 GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName ); 108 109 if( (nPrefix == XML_NAMESPACE_PRESENTATION) && IsXMLToken( aLocalName, XML_CLASS ) ) 110 { 111 const OUString& rAttrValue = rAttrList->getValueByIndex( i ); 112 if( IsXMLToken( rAttrValue, XML_HEADER ) || IsXMLToken( rAttrValue, XML_FOOTER ) || 113 IsXMLToken( rAttrValue, XML_PAGE_NUMBER ) || IsXMLToken( rAttrValue, XML_DATE_TIME ) ) 114 { 115 m_bIgnoreElement = true; 116 break; 117 } 118 } 119 } 120 } 121 122 XMLTransformerContext *XMLFrameOASISTransformerContext::CreateChildContext( 123 sal_uInt16 nPrefix, 124 const OUString& rLocalName, 125 const OUString& rQName, 126 const Reference< XAttributeList >& rAttrList ) 127 { 128 XMLTransformerContext *pContext = 0; 129 130 if( m_bIgnoreElement ) 131 { 132 // do not export the frame element and all of its children 133 pContext = new XMLIgnoreTransformerContext( GetTransformer(), 134 rQName, 135 sal_True, sal_True ); 136 } 137 else 138 { 139 XMLTransformerActions *pActions = 140 GetTransformer().GetUserDefinedActions( OASIS_FRAME_ELEM_ACTIONS ); 141 OSL_ENSURE( pActions, "go no actions" ); 142 XMLTransformerActions::key_type aKey( nPrefix, rLocalName ); 143 XMLTransformerActions::const_iterator aIter = pActions->find( aKey ); 144 145 if( !(aIter == pActions->end()) ) 146 { 147 switch( (*aIter).second.m_nActionType ) 148 { 149 case XML_ETACTION_COPY: 150 if( !m_aElemQName.getLength() && 151 !IsLinkedEmbeddedObject( rLocalName, rAttrList ) ) 152 { 153 pContext = new XMLIgnoreTransformerContext( GetTransformer(), 154 rQName, 155 sal_False, sal_False ); 156 m_aElemQName = rQName; 157 static_cast< XMLMutableAttributeList * >( m_xAttrList.get() ) 158 ->AppendAttributeList( rAttrList ); 159 GetTransformer().ProcessAttrList( m_xAttrList, 160 OASIS_SHAPE_ACTIONS, 161 sal_False ); 162 GetTransformer().GetDocHandler()->startElement( m_aElemQName, 163 m_xAttrList ); 164 } 165 else 166 { 167 pContext = new XMLIgnoreTransformerContext( GetTransformer(), 168 rQName, 169 sal_True, sal_True ); 170 } 171 break; 172 default: 173 OSL_ENSURE( !this, "unknown action" ); 174 break; 175 } 176 } 177 } 178 179 // default is copying 180 if( !pContext ) 181 pContext = XMLTransformerContext::CreateChildContext( nPrefix, 182 rLocalName, 183 rQName, 184 rAttrList ); 185 186 return pContext; 187 } 188 189 void XMLFrameOASISTransformerContext::EndElement() 190 { 191 if( !m_bIgnoreElement ) 192 GetTransformer().GetDocHandler()->endElement( m_aElemQName ); 193 } 194 195 void XMLFrameOASISTransformerContext::Characters( const OUString& rChars ) 196 { 197 // ignore 198 if( m_aElemQName.getLength() && !m_bIgnoreElement ) 199 XMLTransformerContext::Characters( rChars ); 200 } 201