Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /* CDRImportFilter: Sets up the filter, and calls OdgExporter
3 : * to do the actual filtering
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : */
9 :
10 : /* "This product is not manufactured, approved, or supported by
11 : * Corel Corporation or Corel Corporation Limited."
12 : */
13 :
14 : #include <osl/diagnose.h>
15 : #include <rtl/tencinfo.h>
16 :
17 : #include <com/sun/star/io/XInputStream.hpp>
18 : #include <com/sun/star/xml/sax/XAttributeList.hpp>
19 : #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
20 : #include <com/sun/star/xml/sax/InputSource.hpp>
21 : #include <com/sun/star/xml/sax/XParser.hpp>
22 : #include <com/sun/star/io/XSeekable.hpp>
23 : #include <com/sun/star/uno/Reference.h>
24 :
25 : #include <comphelper/componentcontext.hxx>
26 : #include <xmloff/attrlist.hxx>
27 :
28 : #include <libcdr/libcdr.h>
29 : #include "filter/DocumentHandler.hxx"
30 : #include "filter/OdgGenerator.hxx"
31 : #include "CDRImportFilter.hxx"
32 : #include "stream/WPXSvStream.h"
33 :
34 : #include <iostream>
35 :
36 : using namespace ::com::sun::star::uno;
37 : using com::sun::star::uno::Reference;
38 : using com::sun::star::io::XInputStream;
39 : using com::sun::star::io::XSeekable;
40 : using com::sun::star::uno::Sequence;
41 : using namespace ::rtl;
42 : using rtl::OString;
43 : using rtl::OUString;
44 : using com::sun::star::uno::Sequence;
45 : using com::sun::star::uno::Reference;
46 : using com::sun::star::uno::Any;
47 : using com::sun::star::uno::UNO_QUERY;
48 : using com::sun::star::uno::XInterface;
49 : using com::sun::star::uno::Exception;
50 : using com::sun::star::uno::RuntimeException;
51 : using com::sun::star::beans::PropertyValue;
52 : using com::sun::star::document::XFilter;
53 : using com::sun::star::document::XExtendedFilterDetection;
54 :
55 : using com::sun::star::io::XInputStream;
56 : using com::sun::star::document::XImporter;
57 : using com::sun::star::xml::sax::InputSource;
58 : using com::sun::star::xml::sax::XAttributeList;
59 : using com::sun::star::xml::sax::XDocumentHandler;
60 : using com::sun::star::xml::sax::XParser;
61 :
62 :
63 0 : sal_Bool SAL_CALL CDRImportFilter::filter( const Sequence< ::com::sun::star::beans::PropertyValue >& aDescriptor )
64 : throw (RuntimeException)
65 : {
66 : #ifdef DEBUG
67 : std::cerr << "CDRImportFilter::filter" << std::endl;
68 : #endif
69 0 : sal_Int32 nLength = aDescriptor.getLength();
70 0 : const PropertyValue *pValue = aDescriptor.getConstArray();
71 0 : OUString sURL;
72 0 : Reference < XInputStream > xInputStream;
73 0 : for ( sal_Int32 i = 0 ; i < nLength; i++)
74 : {
75 0 : if ( pValue[i].Name == "InputStream" )
76 0 : pValue[i].Value >>= xInputStream;
77 0 : else if ( pValue[i].Name == "URL" )
78 0 : pValue[i].Value >>= sURL;
79 : }
80 0 : if ( !xInputStream.is() )
81 : {
82 : OSL_ASSERT( 0 );
83 0 : return sal_False;
84 : }
85 0 : OString sFileName;
86 0 : sFileName = OUStringToOString(sURL, RTL_TEXTENCODING_INFO_ASCII);
87 :
88 : // An XML import service: what we push sax messages to..
89 0 : OUString sXMLImportService ( "com.sun.star.comp.Draw.XMLOasisImporter" );
90 0 : Reference < XDocumentHandler > xInternalHandler( comphelper::ComponentContext( mxContext ).createComponent( sXMLImportService ), UNO_QUERY );
91 :
92 : // The XImporter sets up an empty target document for XDocumentHandler to write to..
93 0 : Reference < XImporter > xImporter(xInternalHandler, UNO_QUERY);
94 0 : xImporter->setTargetDocument( mxDoc );
95 :
96 : // OO Graphics Handler: abstract class to handle document SAX messages, concrete implementation here
97 : // writes to in-memory target doc
98 0 : DocumentHandler xHandler(xInternalHandler);
99 :
100 0 : WPXSvInputStream input( xInputStream );
101 :
102 0 : OdgGenerator exporter(&xHandler, ODF_FLAT_XML);
103 0 : bool tmpParseResult = libcdr::CDRDocument::parse(&input, &exporter);
104 0 : return tmpParseResult;
105 : }
106 :
107 0 : void SAL_CALL CDRImportFilter::cancel( )
108 : throw (RuntimeException)
109 : {
110 : #ifdef DEBUG
111 : std::cerr << "CDRImportFilter::cancel" << std::endl;
112 : #endif
113 0 : }
114 :
115 : // XImporter
116 0 : void SAL_CALL CDRImportFilter::setTargetDocument( const Reference< ::com::sun::star::lang::XComponent >& xDoc )
117 : throw (::com::sun::star::lang::IllegalArgumentException, RuntimeException)
118 : {
119 : #ifdef DEBUG
120 : std::cerr << "CDRImportFilter::setTargetDocument" << std::endl;
121 : #endif
122 0 : mxDoc = xDoc;
123 0 : }
124 :
125 : // XExtendedFilterDetection
126 0 : OUString SAL_CALL CDRImportFilter::detect( com::sun::star::uno::Sequence< PropertyValue >& Descriptor )
127 : throw( com::sun::star::uno::RuntimeException )
128 : {
129 : #ifdef DEBUG
130 : std::cerr << "CDRImportFilter::detect" << std::endl;
131 : #endif
132 0 : OUString sTypeName;
133 0 : sal_Int32 nLength = Descriptor.getLength();
134 0 : sal_Int32 location = nLength;
135 0 : const PropertyValue *pValue = Descriptor.getConstArray();
136 0 : Reference < XInputStream > xInputStream;
137 0 : for ( sal_Int32 i = 0 ; i < nLength; i++)
138 : {
139 0 : if ( pValue[i].Name == "TypeName" )
140 0 : location=i;
141 0 : else if ( pValue[i].Name == "InputStream" )
142 0 : pValue[i].Value >>= xInputStream;
143 : }
144 :
145 0 : WPXSvInputStream input( xInputStream );
146 :
147 0 : if (libcdr::CDRDocument::isSupported(&input))
148 0 : sTypeName = "draw_CorelDraw_Document";
149 :
150 0 : if (sTypeName.getLength())
151 : {
152 0 : if ( location == Descriptor.getLength() )
153 : {
154 0 : Descriptor.realloc(nLength+1);
155 0 : Descriptor[location].Name = "TypeName";
156 : }
157 :
158 0 : Descriptor[location].Value <<=sTypeName;
159 : }
160 0 : return sTypeName;
161 : }
162 :
163 :
164 : // XInitialization
165 0 : void SAL_CALL CDRImportFilter::initialize( const Sequence< Any >& aArguments )
166 : throw (Exception, RuntimeException)
167 : {
168 : #ifdef DEBUG
169 : std::cerr << "CDRImportFilter::initialize" << std::endl;
170 : #endif
171 0 : Sequence < PropertyValue > aAnySeq;
172 0 : sal_Int32 nLength = aArguments.getLength();
173 0 : if ( nLength && ( aArguments[0] >>= aAnySeq ) )
174 : {
175 0 : const PropertyValue *pValue = aAnySeq.getConstArray();
176 0 : nLength = aAnySeq.getLength();
177 0 : for ( sal_Int32 i = 0 ; i < nLength; i++)
178 : {
179 0 : if ( pValue[i].Name == "Type" )
180 : {
181 0 : pValue[i].Value >>= msFilterName;
182 0 : break;
183 : }
184 : }
185 0 : }
186 0 : }
187 0 : OUString CDRImportFilter_getImplementationName ()
188 : throw (RuntimeException)
189 : {
190 : #ifdef DEBUG
191 : std::cerr << "CDRImportFilter_getImplementationName" << std::endl;
192 : #endif
193 0 : return OUString ( "com.sun.star.comp.Draw.CDRImportFilter" );
194 : }
195 :
196 : #define SERVICE_NAME1 "com.sun.star.document.ImportFilter"
197 : #define SERVICE_NAME2 "com.sun.star.document.ExtendedTypeDetection"
198 0 : sal_Bool SAL_CALL CDRImportFilter_supportsService( const OUString &ServiceName )
199 : throw (RuntimeException)
200 : {
201 : #ifdef DEBUG
202 : std::cerr << "CDRImportFilter_supportsService" << std::endl;
203 : #endif
204 0 : return ( ServiceName == SERVICE_NAME1 || ServiceName == SERVICE_NAME2 );
205 : }
206 0 : Sequence< OUString > SAL_CALL CDRImportFilter_getSupportedServiceNames( )
207 : throw (RuntimeException)
208 : {
209 : #ifdef DEBUG
210 : std::cerr << "CDRImportFilter_getSupportedServiceNames" << std::endl;
211 : #endif
212 0 : Sequence < OUString > aRet(2);
213 0 : OUString *pArray = aRet.getArray();
214 0 : pArray[0] = OUString ( SERVICE_NAME1 );
215 0 : pArray[1] = OUString ( SERVICE_NAME2 );
216 0 : return aRet;
217 : }
218 : #undef SERVICE_NAME2
219 : #undef SERVICE_NAME1
220 :
221 0 : Reference< XInterface > SAL_CALL CDRImportFilter_createInstance( const Reference< XComponentContext > & rContext)
222 : throw( Exception )
223 : {
224 : #ifdef DEBUG
225 : std::cerr << "CDRImportFilter_createInstance" << std::endl;
226 : #endif
227 0 : return (cppu::OWeakObject *) new CDRImportFilter( rContext );
228 : }
229 :
230 : // XServiceInfo
231 0 : OUString SAL_CALL CDRImportFilter::getImplementationName( )
232 : throw (RuntimeException)
233 : {
234 : #ifdef DEBUG
235 : std::cerr << "CDRImportFilter::getImplementationName" << std::endl;
236 : #endif
237 0 : return CDRImportFilter_getImplementationName();
238 : }
239 0 : sal_Bool SAL_CALL CDRImportFilter::supportsService( const OUString &rServiceName )
240 : throw (RuntimeException)
241 : {
242 : #ifdef DEBUG
243 : std::cerr << "CDRImportFilter::supportsService" << std::endl;
244 : #endif
245 0 : return CDRImportFilter_supportsService( rServiceName );
246 : }
247 0 : Sequence< OUString > SAL_CALL CDRImportFilter::getSupportedServiceNames( )
248 : throw (RuntimeException)
249 : {
250 : #ifdef DEBUG
251 : std::cerr << "CDRImportFilter::getSupportedServiceNames" << std::endl;
252 : #endif
253 0 : return CDRImportFilter_getSupportedServiceNames();
254 0 : }
255 :
256 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|