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 "MetaExportComponent.hxx" 27 #include <com/sun/star/frame/XModel.hpp> 28 #include <com/sun/star/xml/sax/XDocumentHandler.hpp> 29 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 30 #include <com/sun/star/uno/Sequence.hxx> 31 #include <com/sun/star/uno/Reference.hxx> 32 33 #ifndef _COM_SUN_STAR_UNO_EXCEPTION_HPP 34 #include <com/sun/star/uno/Exception.hpp> 35 #endif 36 #include <com/sun/star/beans/PropertyAttribute.hpp> 37 38 // #110680# 39 //#ifndef _COMPHELPER_PROCESSFACTORY_HXX_ 40 //#include <comphelper/processfactory.hxx> 41 //#endif 42 #include <comphelper/genericpropertyset.hxx> 43 #include <rtl/ustrbuf.hxx> 44 #include "xmloff/xmlnmspe.hxx" 45 #include <xmloff/nmspmap.hxx> 46 #include <xmloff/xmltoken.hxx> 47 #include <xmloff/xmlmetae.hxx> 48 #include "PropertySetMerger.hxx" 49 #include <tools/debug.hxx> 50 51 #include <unotools/docinfohelper.hxx> 52 53 54 using namespace ::com::sun::star; 55 using namespace ::xmloff::token; 56 57 // #110680# 58 XMLMetaExportComponent::XMLMetaExportComponent( 59 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory, 60 sal_uInt16 nFlags ) 61 : SvXMLExport( xServiceFactory, MAP_INCH, XML_TEXT, nFlags ) 62 { 63 } 64 65 XMLMetaExportComponent::~XMLMetaExportComponent() 66 { 67 } 68 69 void SAL_CALL XMLMetaExportComponent::setSourceDocument( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent >& xDoc ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException) 70 { 71 try 72 { 73 SvXMLExport::setSourceDocument( xDoc ); 74 } 75 catch( lang::IllegalArgumentException& ) 76 { 77 // allow to use document properties service without model access 78 // this is required for document properties exporter 79 mxDocProps = 80 uno::Reference< document::XDocumentProperties >::query( xDoc ); 81 if( !mxDocProps.is() ) 82 throw lang::IllegalArgumentException(); 83 } 84 } 85 86 sal_uInt32 XMLMetaExportComponent::exportDoc( enum XMLTokenEnum ) 87 { 88 uno::Reference< xml::sax::XDocumentHandler > xDocHandler = GetDocHandler(); 89 90 if( (getExportFlags() & EXPORT_OASIS) == 0 ) 91 { 92 uno::Reference< lang::XMultiServiceFactory > xFactory = getServiceFactory(); 93 if( xFactory.is() ) 94 { 95 try 96 { 97 ::comphelper::PropertyMapEntry aInfoMap[] = 98 { 99 { "Class", sizeof("Class")-1, 0, 100 &::getCppuType((::rtl::OUString*)0), 101 beans::PropertyAttribute::MAYBEVOID, 0}, 102 { NULL, 0, 0, NULL, 0, 0 } 103 }; 104 uno::Reference< beans::XPropertySet > xConvPropSet( 105 ::comphelper::GenericPropertySet_CreateInstance( 106 new ::comphelper::PropertySetInfo( aInfoMap ) ) ); 107 108 uno::Any aAny; 109 aAny <<= GetXMLToken( XML_TEXT ); 110 xConvPropSet->setPropertyValue( 111 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Class")), aAny ); 112 113 uno::Reference< beans::XPropertySet > xPropSet = 114 getExportInfo().is() 115 ? PropertySetMerger_CreateInstance( getExportInfo(), 116 xConvPropSet ) 117 : getExportInfo(); 118 119 uno::Sequence< uno::Any > aArgs( 3 ); 120 aArgs[0] <<= xDocHandler; 121 aArgs[1] <<= xPropSet; 122 aArgs[2] <<= GetModel(); 123 124 // get filter component 125 xDocHandler = uno::Reference< xml::sax::XDocumentHandler >( 126 xFactory->createInstanceWithArguments( 127 ::rtl::OUString::createFromAscii("com.sun.star.comp.Oasis2OOoTransformer"), 128 aArgs), 129 uno::UNO_QUERY_THROW ); 130 131 SetDocHandler( xDocHandler ); 132 } 133 catch( com::sun::star::uno::Exception& ) 134 { 135 OSL_ENSURE( sal_False, "Cannot instantiate com.sun.star.comp.Oasis2OOoTransformer!\n"); 136 } 137 } 138 } 139 140 141 xDocHandler->startDocument(); 142 { 143 #if 0 144 GetAttrList().AddAttribute( 145 GetNamespaceMap().GetAttrNameByKey( XML_NAMESPACE_DC ), 146 GetNamespaceMap().GetNameByKey( XML_NAMESPACE_DC ) ); 147 GetAttrList().AddAttribute( 148 GetNamespaceMap().GetAttrNameByKey( XML_NAMESPACE_META ), 149 GetNamespaceMap().GetNameByKey( XML_NAMESPACE_META ) ); 150 GetAttrList().AddAttribute( 151 GetNamespaceMap().GetAttrNameByKey( XML_NAMESPACE_OFFICE ), 152 GetNamespaceMap().GetNameByKey( XML_NAMESPACE_OFFICE ) ); 153 #else 154 const SvXMLNamespaceMap& rMap = GetNamespaceMap(); 155 sal_uInt16 nPos = rMap.GetFirstKey(); 156 while( USHRT_MAX != nPos ) 157 { 158 GetAttrList().AddAttribute( rMap.GetAttrNameByKey( nPos ), rMap.GetNameByKey( nPos ) ); 159 nPos = GetNamespaceMap().GetNextKey( nPos ); 160 } 161 #endif 162 163 const sal_Char* pVersion = 0; 164 switch( getDefaultVersion() ) 165 { 166 case SvtSaveOptions::ODFVER_LATEST: pVersion = "1.2"; break; 167 case SvtSaveOptions::ODFVER_012: pVersion = "1.2"; break; 168 case SvtSaveOptions::ODFVER_011: pVersion = "1.1"; break; 169 case SvtSaveOptions::ODFVER_010: break; 170 171 default: 172 DBG_ERROR("xmloff::XMLMetaExportComponent::exportDoc(), unexpected odf default version!"); 173 } 174 175 if( pVersion ) 176 AddAttribute( XML_NAMESPACE_OFFICE, XML_VERSION, 177 ::rtl::OUString::createFromAscii(pVersion) ); 178 179 SvXMLElementExport aDocElem( *this, XML_NAMESPACE_OFFICE, XML_DOCUMENT_META, 180 sal_True, sal_True ); 181 182 // NB: office:meta is now written by _ExportMeta 183 _ExportMeta(); 184 } 185 xDocHandler->endDocument(); 186 return 0; 187 } 188 189 void XMLMetaExportComponent::_ExportMeta() 190 { 191 if (mxDocProps.is()) { 192 ::rtl::OUString generator( ::utl::DocInfoHelper::GetGeneratorString() ); 193 // update generator here 194 mxDocProps->setGenerator(generator); 195 SvXMLMetaExport * pMeta = new SvXMLMetaExport(*this, mxDocProps); 196 uno::Reference<xml::sax::XDocumentHandler> xMeta(pMeta); 197 pMeta->Export(); 198 } else { 199 SvXMLExport::_ExportMeta(); 200 } 201 } 202 203 // methods without content: 204 void XMLMetaExportComponent::_ExportAutoStyles() {} 205 void XMLMetaExportComponent::_ExportMasterStyles() {} 206 void XMLMetaExportComponent::_ExportContent() {} 207 208 209 uno::Sequence< rtl::OUString > SAL_CALL XMLMetaExportComponent_getSupportedServiceNames() 210 throw() 211 { 212 const rtl::OUString aServiceName( 213 RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.XMLOasisMetaExporter" ) ); 214 const uno::Sequence< rtl::OUString > aSeq( &aServiceName, 1 ); 215 return aSeq; 216 } 217 218 rtl::OUString SAL_CALL XMLMetaExportComponent_getImplementationName() throw() 219 { 220 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "XMLMetaExportComponent" ) ); 221 } 222 223 uno::Reference< uno::XInterface > SAL_CALL XMLMetaExportComponent_createInstance( 224 const uno::Reference< lang::XMultiServiceFactory > & rSMgr) 225 throw( uno::Exception ) 226 { 227 // #110680# 228 // return (cppu::OWeakObject*)new XMLMetaExportComponent; 229 return (cppu::OWeakObject*)new XMLMetaExportComponent(rSMgr, EXPORT_META|EXPORT_OASIS); 230 } 231 232 uno::Sequence< rtl::OUString > SAL_CALL XMLMetaExportOOO_getSupportedServiceNames() 233 throw() 234 { 235 const rtl::OUString aServiceName( 236 RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.XMLMetaExporter" ) ); 237 const uno::Sequence< rtl::OUString > aSeq( &aServiceName, 1 ); 238 return aSeq; 239 } 240 241 rtl::OUString SAL_CALL XMLMetaExportOOO_getImplementationName() throw() 242 { 243 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "XMLMetaExportOOo" ) ); 244 } 245 246 uno::Reference< uno::XInterface > SAL_CALL XMLMetaExportOOO_createInstance( 247 const uno::Reference< lang::XMultiServiceFactory > & rSMgr) 248 throw( uno::Exception ) 249 { 250 // #110680# 251 // return (cppu::OWeakObject*)new XMLMetaExportComponent; 252 return (cppu::OWeakObject*)new XMLMetaExportComponent(rSMgr, EXPORT_META); 253 } 254 255