xref: /AOO41X/main/xmloff/source/meta/MetaExportComponent.cxx (revision 63bba73cc51e0afb45f8a8d578158724bb5afee8)
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#
XMLMetaExportComponent(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & xServiceFactory,sal_uInt16 nFlags)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 
~XMLMetaExportComponent()65 XMLMetaExportComponent::~XMLMetaExportComponent()
66 {
67 }
68 
setSourceDocument(const::com::sun::star::uno::Reference<::com::sun::star::lang::XComponent> & xDoc)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 
exportDoc(enum XMLTokenEnum)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 
_ExportMeta()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:
_ExportAutoStyles()204 void XMLMetaExportComponent::_ExportAutoStyles() {}
_ExportMasterStyles()205 void XMLMetaExportComponent::_ExportMasterStyles() {}
_ExportContent()206 void XMLMetaExportComponent::_ExportContent() {}
207 
208 
XMLMetaExportComponent_getSupportedServiceNames()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 
XMLMetaExportComponent_getImplementationName()218 rtl::OUString SAL_CALL XMLMetaExportComponent_getImplementationName() throw()
219 {
220     return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "XMLMetaExportComponent" ) );
221 }
222 
XMLMetaExportComponent_createInstance(const uno::Reference<lang::XMultiServiceFactory> & rSMgr)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 
XMLMetaExportOOO_getSupportedServiceNames()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 
XMLMetaExportOOO_getImplementationName()241 rtl::OUString SAL_CALL XMLMetaExportOOO_getImplementationName() throw()
242 {
243     return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "XMLMetaExportOOo" ) );
244 }
245 
XMLMetaExportOOO_createInstance(const uno::Reference<lang::XMultiServiceFactory> & rSMgr)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