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