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 #include "docxexportfilter.hxx"
25 #include "rtfexportfilter.hxx"
26 #include "rtfimportfilter.hxx"
27 #include "docxexport.hxx"
28 
29 #include <docsh.hxx>
30 #include <pam.hxx>
31 #include <unotxdoc.hxx>
32 
33 #include <cppuhelper/factory.hxx>
34 
35 using namespace ::comphelper;
36 using namespace ::com::sun::star;
37 using ::rtl::OUString;
38 
39 #define S( x ) OUString( RTL_CONSTASCII_USTRINGPARAM( x ) )
40 
DocxExportFilter(const uno::Reference<lang::XMultiServiceFactory> & rMSF)41 DocxExportFilter::DocxExportFilter( const uno::Reference< lang::XMultiServiceFactory >& rMSF )
42     : oox::core::XmlFilterBase( rMSF )
43 {
44 }
45 
exportDocument()46 bool DocxExportFilter::exportDocument()
47 {
48     OSL_TRACE(, "DocxExportFilter::exportDocument()\n" ); // DEBUG remove me
49 
50     // get SwDoc*
51     uno::Reference< uno::XInterface > xIfc( getModel(), uno::UNO_QUERY );
52     SwXTextDocument *pTxtDoc = dynamic_cast< SwXTextDocument * >( xIfc.get() );
53     if ( !pTxtDoc )
54         return false;
55 
56     SwDoc *pDoc = pTxtDoc->GetDocShell()->GetDoc();
57     if ( !pDoc )
58         return false;
59 
60     // get SwPaM*
61     // FIXME so far we get SwPaM for the entire document; probably we should
62     // be able to output just the selection as well - though no idea how to
63     // get the correct SwPaM* then...
64     SwPaM aPam( pDoc->GetNodes().GetEndOfContent() );
65     aPam.SetMark();
66     aPam.Move( fnMoveBackward, fnGoDoc );
67 
68     SwPaM *pCurPam = new SwPaM( *aPam.End(), *aPam.Start() );
69 
70     // export the document
71     // (in a separate block so that it's destructed before the commit)
72     {
73         DocxExport aExport( this, pDoc, pCurPam, &aPam );
74         aExport.ExportDocument( true ); // FIXME support exporting selection only
75     }
76 
77     commit();
78 
79     // delete the pCurPam
80     if ( pCurPam )
81     {
82         while ( pCurPam->GetNext() != pCurPam )
83             delete pCurPam->GetNext();
84         delete pCurPam;
85     }
86 
87     return true;
88 }
89 
90 //////////////////////////////////////////////////////////////////////////
91 // UNO stuff so that the filter is registered
92 //////////////////////////////////////////////////////////////////////////
93 
94 #define IMPL_NAME "com.sun.star.comp.Writer.DocxExport"
95 
DocxExport_getImplementationName()96 OUString DocxExport_getImplementationName()
97 {
98     return OUString( RTL_CONSTASCII_USTRINGPARAM( IMPL_NAME ) );
99 }
100 
implGetImplementationName() const101 OUString DocxExportFilter::implGetImplementationName() const
102 {
103     return DocxExport_getImplementationName();
104 }
105 
DocxExport_getSupportedServiceNames()106 uno::Sequence< OUString > SAL_CALL DocxExport_getSupportedServiceNames() throw()
107 {
108     const OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.ExportFilter" ) );
109     const uno::Sequence< OUString > aSeq( &aServiceName, 1 );
110     return aSeq;
111 }
112 
DocxExport_createInstance(const uno::Reference<lang::XMultiServiceFactory> & rSMgr)113 uno::Reference< uno::XInterface > SAL_CALL DocxExport_createInstance(const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception )
114 {
115     return (cppu::OWeakObject*) new DocxExportFilter( rSMgr );
116 }
117 
118 #ifdef __cplusplus
119 extern "C"
120 {
121 #endif
122 
component_getImplementationEnvironment(const sal_Char ** ppEnvTypeName,uno_Environment **)123 SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment( const sal_Char ** ppEnvTypeName, uno_Environment ** /* ppEnv */ )
124 {
125     *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
126 }
127 
128 // ------------------------
129 // - component_getFactory -
130 // ------------------------
131 
component_getFactory(const sal_Char * pImplName,void * pServiceManager,void *)132 SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory( const sal_Char* pImplName, void* pServiceManager, void* /* pRegistryKey */ )
133 {
134     OSL_TRACE("%s, pImplName is '%s'", OSL_THIS_FUNC, pImplName);
135     uno::Reference< lang::XSingleServiceFactory > xFactory;
136     void* pRet = 0;
137 
138     if ( rtl_str_compare( pImplName, IMPL_NAME ) == 0 )
139     {
140         const OUString aServiceName( OUString::createFromAscii( IMPL_NAME ) );
141 
142         xFactory = uno::Reference< lang::XSingleServiceFactory >( ::cppu::createSingleFactory(
143                     reinterpret_cast< lang::XMultiServiceFactory* >( pServiceManager ),
144                     DocxExport_getImplementationName(),
145                     DocxExport_createInstance,
146                     DocxExport_getSupportedServiceNames() ) );
147     } else if ( rtl_str_compare( pImplName, IMPL_NAME_RTFEXPORT ) == 0 ) {
148         const OUString aServiceName( OUString::createFromAscii( IMPL_NAME_RTFEXPORT ) );
149 
150         xFactory = uno::Reference< lang::XSingleServiceFactory >( ::cppu::createSingleFactory(
151                     reinterpret_cast< lang::XMultiServiceFactory* >( pServiceManager ),
152                     RtfExport_getImplementationName(),
153                     RtfExport_createInstance,
154                     RtfExport_getSupportedServiceNames() ) );
155     } else if ( rtl_str_compare( pImplName, IMPL_NAME_RTFIMPORT ) == 0 ) {
156         const OUString aServiceName( OUString::createFromAscii( IMPL_NAME_RTFIMPORT ) );
157 
158         xFactory = uno::Reference< lang::XSingleServiceFactory >( ::cppu::createSingleFactory(
159                     reinterpret_cast< lang::XMultiServiceFactory* >( pServiceManager ),
160                     RtfImport_getImplementationName(),
161                     RtfImport_createInstance,
162                     RtfImport_getSupportedServiceNames() ) );
163     }
164 
165     if ( xFactory.is() )
166     {
167         xFactory->acquire();
168         pRet = xFactory.get();
169     }
170 
171     return pRet;
172 }
173 
174 #ifdef __cplusplus
175 }
176 #endif
177 
178 /* vi:set tabstop=4 shiftwidth=4 expandtab: */
179