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 #include "FrameOASISTContext.hxx" 27 #include "IgnoreTContext.hxx" 28 #include "MutableAttrList.hxx" 29 #include "xmloff/xmlnmspe.hxx" 30 #include "ActionMapTypesOASIS.hxx" 31 #include "ElemTransformerAction.hxx" 32 #include "TransformerActions.hxx" 33 #ifndef _XMLOFF_TRANSFORMERBASE_HXX 34 #include "TransformerBase.hxx" 35 #endif 36 37 using ::rtl::OUString; 38 39 using namespace ::com::sun::star::uno; 40 using namespace ::com::sun::star::xml::sax; 41 using namespace ::xmloff::token; 42 43 TYPEINIT1( XMLFrameOASISTransformerContext, XMLTransformerContext ); 44 45 sal_Bool XMLFrameOASISTransformerContext::IsLinkedEmbeddedObject( 46 const OUString& rLocalName, 47 const Reference< XAttributeList >& rAttrList ) 48 { 49 if( !(IsXMLToken( rLocalName, XML_OBJECT ) || 50 IsXMLToken( rLocalName, XML_OBJECT_OLE) ) ) 51 return sal_False; 52 53 sal_Int16 nAttrCount = rAttrList.is() ? rAttrList->getLength() : 0; 54 for( sal_Int16 i=0; i < nAttrCount; i++ ) 55 { 56 OUString aAttrName( rAttrList->getNameByIndex( i ) ); 57 OUString aLocalName; 58 sal_uInt16 nPrefix = 59 GetTransformer().GetNamespaceMap().GetKeyByAttrName( aAttrName, 60 &aLocalName ); 61 if( XML_NAMESPACE_XLINK == nPrefix && 62 IsXMLToken( aLocalName, XML_HREF ) ) 63 { 64 OUString sHRef( rAttrList->getValueByIndex( i ) ); 65 if (sHRef.getLength() == 0) 66 { 67 // When the href is empty then the object is not linked but 68 // a placeholder. 69 return sal_False; 70 } 71 GetTransformer().ConvertURIToOOo( sHRef, sal_True ); 72 return !(sHRef.getLength() && '#'==sHRef[0]); 73 } 74 } 75 76 return sal_False; 77 } 78 79 80 XMLFrameOASISTransformerContext::XMLFrameOASISTransformerContext( 81 XMLTransformerBase& rImp, 82 const OUString& rQName ) : 83 XMLTransformerContext( rImp, rQName ), 84 m_bIgnoreElement( false ) 85 { 86 } 87 88 XMLFrameOASISTransformerContext::~XMLFrameOASISTransformerContext() 89 { 90 } 91 92 void XMLFrameOASISTransformerContext::StartElement( 93 const Reference< XAttributeList >& rAttrList ) 94 { 95 m_xAttrList = new XMLMutableAttributeList( rAttrList, sal_True ); 96 97 sal_Int16 nAttrCount = rAttrList.is() ? rAttrList->getLength() : 0; 98 for( sal_Int16 i=0; i < nAttrCount; i++ ) 99 { 100 const OUString& rAttrName = rAttrList->getNameByIndex( i ); 101 OUString aLocalName; 102 sal_uInt16 nPrefix = 103 GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName ); 104 105 if( (nPrefix == XML_NAMESPACE_PRESENTATION) && IsXMLToken( aLocalName, XML_CLASS ) ) 106 { 107 const OUString& rAttrValue = rAttrList->getValueByIndex( i ); 108 if( IsXMLToken( rAttrValue, XML_HEADER ) || IsXMLToken( rAttrValue, XML_FOOTER ) || 109 IsXMLToken( rAttrValue, XML_PAGE_NUMBER ) || IsXMLToken( rAttrValue, XML_DATE_TIME ) ) 110 { 111 m_bIgnoreElement = true; 112 break; 113 } 114 } 115 } 116 } 117 118 XMLTransformerContext *XMLFrameOASISTransformerContext::CreateChildContext( 119 sal_uInt16 nPrefix, 120 const OUString& rLocalName, 121 const OUString& rQName, 122 const Reference< XAttributeList >& rAttrList ) 123 { 124 XMLTransformerContext *pContext = 0; 125 126 if( m_bIgnoreElement ) 127 { 128 // do not export the frame element and all of its children 129 pContext = new XMLIgnoreTransformerContext( GetTransformer(), 130 rQName, 131 sal_True, sal_True ); 132 } 133 else 134 { 135 XMLTransformerActions *pActions = 136 GetTransformer().GetUserDefinedActions( OASIS_FRAME_ELEM_ACTIONS ); 137 OSL_ENSURE( pActions, "go no actions" ); 138 XMLTransformerActions::key_type aKey( nPrefix, rLocalName ); 139 XMLTransformerActions::const_iterator aIter = pActions->find( aKey ); 140 141 if( !(aIter == pActions->end()) ) 142 { 143 switch( (*aIter).second.m_nActionType ) 144 { 145 case XML_ETACTION_COPY: 146 if( !m_aElemQName.getLength() && 147 !IsLinkedEmbeddedObject( rLocalName, rAttrList ) ) 148 { 149 pContext = new XMLIgnoreTransformerContext( GetTransformer(), 150 rQName, 151 sal_False, sal_False ); 152 m_aElemQName = rQName; 153 static_cast< XMLMutableAttributeList * >( m_xAttrList.get() ) 154 ->AppendAttributeList( rAttrList ); 155 GetTransformer().ProcessAttrList( m_xAttrList, 156 OASIS_SHAPE_ACTIONS, 157 sal_False ); 158 GetTransformer().GetDocHandler()->startElement( m_aElemQName, 159 m_xAttrList ); 160 } 161 else 162 { 163 pContext = new XMLIgnoreTransformerContext( GetTransformer(), 164 rQName, 165 sal_True, sal_True ); 166 } 167 break; 168 default: 169 OSL_ENSURE( !this, "unknown action" ); 170 break; 171 } 172 } 173 } 174 175 // default is copying 176 if( !pContext ) 177 pContext = XMLTransformerContext::CreateChildContext( nPrefix, 178 rLocalName, 179 rQName, 180 rAttrList ); 181 182 return pContext; 183 } 184 185 void XMLFrameOASISTransformerContext::EndElement() 186 { 187 if( !m_bIgnoreElement ) 188 GetTransformer().GetDocHandler()->endElement( m_aElemQName ); 189 } 190 191 void XMLFrameOASISTransformerContext::Characters( const OUString& rChars ) 192 { 193 // ignore 194 if( m_aElemQName.getLength() && !m_bIgnoreElement ) 195 XMLTransformerContext::Characters( rChars ); 196 } 197