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 "XMLSymbolImageContext.hxx" 27 #include <xmloff/xmltoken.hxx> 28 #include <xmloff/xmltkmap.hxx> 29 #include "xmloff/xmlnmspe.hxx" 30 #include <xmloff/xmlimp.hxx> 31 #include <xmloff/nmspmap.hxx> 32 #include <xmloff/XMLBase64ImportContext.hxx> 33 #include <com/sun/star/io/XOutputStream.hpp> 34 35 TYPEINIT1( XMLSymbolImageContext, XMLElementPropertyContext ); 36 37 using namespace ::com::sun::star; 38 39 enum SvXMLTokenMapAttrs 40 { 41 XML_TOK_SYMBOL_IMAGE_HREF, 42 XML_TOK_SYMBOL_IMAGE_TYPE, 43 XML_TOK_SYMBOL_IMAGE_ACTUATE, 44 XML_TOK_SYMBOL_IMAGE_SHOW, 45 XML_TOK_SYMBOL_IMAGE_END = XML_TOK_UNKNOWN 46 }; 47 48 static __FAR_DATA SvXMLTokenMapEntry aSymbolImageAttrTokenMap[] = 49 { 50 { XML_NAMESPACE_XLINK, ::xmloff::token::XML_HREF, XML_TOK_SYMBOL_IMAGE_HREF }, 51 { XML_NAMESPACE_XLINK, ::xmloff::token::XML_TYPE, XML_TOK_SYMBOL_IMAGE_TYPE }, 52 { XML_NAMESPACE_XLINK, ::xmloff::token::XML_ACTUATE, XML_TOK_SYMBOL_IMAGE_ACTUATE }, 53 { XML_NAMESPACE_XLINK, ::xmloff::token::XML_SHOW, XML_TOK_SYMBOL_IMAGE_SHOW }, 54 XML_TOKEN_MAP_END 55 }; 56 57 XMLSymbolImageContext::XMLSymbolImageContext( 58 SvXMLImport& rImport, sal_uInt16 nPrfx, 59 const ::rtl::OUString& rLName, 60 const XMLPropertyState& rProp, 61 ::std::vector< XMLPropertyState > &rProps ) : 62 XMLElementPropertyContext( 63 rImport, nPrfx, rLName, rProp, rProps ) 64 { 65 } 66 67 XMLSymbolImageContext::~XMLSymbolImageContext() 68 {} 69 70 void XMLSymbolImageContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList ) 71 { 72 SvXMLTokenMap aTokenMap( aSymbolImageAttrTokenMap ); 73 ::rtl::OUString aLocalName; 74 75 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 76 for( sal_Int16 i = 0; i < nAttrCount; i++ ) 77 { 78 const ::rtl::OUString& rAttrName = xAttrList->getNameByIndex( i ); 79 sal_uInt16 nPrefix = 80 GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, 81 &aLocalName ); 82 const ::rtl::OUString& rValue = xAttrList->getValueByIndex( i ); 83 84 switch( aTokenMap.Get( nPrefix, aLocalName ) ) 85 { 86 case XML_TOK_SYMBOL_IMAGE_HREF: 87 msURL = rValue; 88 break; 89 case XML_TOK_SYMBOL_IMAGE_ACTUATE: 90 case XML_TOK_SYMBOL_IMAGE_TYPE: 91 case XML_TOK_SYMBOL_IMAGE_SHOW: 92 // these values are currently not interpreted 93 // it is always assumed 'actuate=onLoad', 'type=simple', 'show=embed' 94 break; 95 } 96 } 97 } 98 99 SvXMLImportContext* XMLSymbolImageContext::CreateChildContext( 100 sal_uInt16 nPrefix, const ::rtl::OUString& rLocalName, 101 const uno::Reference< xml::sax::XAttributeList > & xAttrList ) 102 { 103 SvXMLImportContext* pContext = NULL; 104 if( xmloff::token::IsXMLToken( rLocalName, 105 xmloff::token::XML_BINARY_DATA ) ) 106 { 107 if( ! msURL.getLength() && ! mxBase64Stream.is() ) 108 { 109 mxBase64Stream = GetImport().GetStreamForGraphicObjectURLFromBase64(); 110 if( mxBase64Stream.is() ) 111 pContext = new XMLBase64ImportContext( GetImport(), nPrefix, 112 rLocalName, xAttrList, 113 mxBase64Stream ); 114 } 115 } 116 if( ! pContext ) 117 { 118 pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); 119 } 120 121 return pContext; 122 } 123 124 void XMLSymbolImageContext::EndElement() 125 { 126 ::rtl::OUString sResolvedURL; 127 128 if( msURL.getLength() ) 129 { 130 sResolvedURL = GetImport().ResolveGraphicObjectURL( msURL, sal_False ); 131 } 132 else if( mxBase64Stream.is() ) 133 { 134 sResolvedURL = GetImport().ResolveGraphicObjectURLFromBase64( mxBase64Stream ); 135 mxBase64Stream = 0; 136 } 137 138 if( sResolvedURL.getLength()) 139 { 140 // aProp is a member of XMLElementPropertyContext 141 aProp.maValue <<= sResolvedURL; 142 SetInsert( sal_True ); 143 } 144 145 XMLElementPropertyContext::EndElement(); 146 } 147