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_editeng.hxx" 26 27 /** this file implements an export of a selected EditEngine content into 28 a xml stream. See editeng/source/inc/xmledit.hxx for interface */ 29 #include <com/sun/star/ucb/XAnyCompareFactory.hpp> 30 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> 31 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 32 #include <com/sun/star/io/XActiveDataSource.hpp> 33 #include <tools/debug.hxx> 34 #include <svl/itemprop.hxx> 35 #include <svl/brdcst.hxx> 36 #include <com/sun/star/uno/Sequence.hxx> 37 #include <sot/storage.hxx> 38 #include <rtl/ustrbuf.hxx> 39 #include <xmloff/xmluconv.hxx> 40 #include <xmloff/xmlnmspe.hxx> 41 #include <xmloff/nmspmap.hxx> 42 #include <xmloff/xmlmetae.hxx> 43 #include <cppuhelper/implbase4.hxx> 44 #include <comphelper/processfactory.hxx> 45 #include <unotools/streamwrap.hxx> 46 #include <xmloff/xmlexp.hxx> 47 #include <editeng/unoedsrc.hxx> 48 #include <editeng/unofored.hxx> 49 #include <editeng/unotext.hxx> 50 #include <editeng/unoprnms.hxx> 51 #include <editeng/unofield.hxx> 52 #include <editeng/editeng.hxx> 53 #include "editsource.hxx" 54 #include <editeng/unonrule.hxx> 55 #include <editeng/unoipset.hxx> 56 57 using namespace com::sun::star; 58 using namespace com::sun::star::container; 59 using namespace com::sun::star::document; 60 using namespace com::sun::star::uno; 61 using namespace com::sun::star::awt; 62 using namespace com::sun::star::lang; 63 using namespace com::sun::star::xml::sax; 64 using namespace ::rtl; 65 using namespace cppu; 66 67 /////////////////////////////////////////////////////////////////////// 68 69 class SvxEditEngineSourceImpl; 70 71 /////////////////////////////////////////////////////////////////////// 72 73 class SvxEditEngineSourceImpl 74 { 75 private: 76 oslInterlockedCount maRefCount; 77 78 EditEngine* mpEditEngine; 79 SvxTextForwarder* mpTextForwarder; 80 81 ~SvxEditEngineSourceImpl(); 82 83 public: 84 SvxEditEngineSourceImpl( EditEngine* pEditEngine ); 85 86 void SAL_CALL acquire(); 87 void SAL_CALL release(); 88 89 SvxTextForwarder* GetTextForwarder(); 90 }; 91 92 /////////////////////////////////////////////////////////////////////// 93 94 95 //------------------------------------------------------------------------ 96 97 SvxEditEngineSourceImpl::SvxEditEngineSourceImpl( EditEngine* pEditEngine ) 98 : maRefCount(0), 99 mpEditEngine( pEditEngine ), 100 mpTextForwarder(NULL) 101 { 102 } 103 104 //------------------------------------------------------------------------ 105 106 SvxEditEngineSourceImpl::~SvxEditEngineSourceImpl() 107 { 108 delete mpTextForwarder; 109 } 110 111 //------------------------------------------------------------------------ 112 113 void SAL_CALL SvxEditEngineSourceImpl::acquire() 114 { 115 osl_incrementInterlockedCount( &maRefCount ); 116 } 117 118 //------------------------------------------------------------------------ 119 120 void SAL_CALL SvxEditEngineSourceImpl::release() 121 { 122 if( ! osl_decrementInterlockedCount( &maRefCount ) ) 123 delete this; 124 } 125 126 //------------------------------------------------------------------------ 127 128 SvxTextForwarder* SvxEditEngineSourceImpl::GetTextForwarder() 129 { 130 if (!mpTextForwarder) 131 mpTextForwarder = new SvxEditEngineForwarder( *mpEditEngine ); 132 133 return mpTextForwarder; 134 } 135 136 // -------------------------------------------------------------------- 137 // SvxTextEditSource 138 // -------------------------------------------------------------------- 139 140 SvxEditEngineSource::SvxEditEngineSource( EditEngine* pEditEngine ) 141 { 142 mpImpl = new SvxEditEngineSourceImpl( pEditEngine ); 143 mpImpl->acquire(); 144 } 145 146 // -------------------------------------------------------------------- 147 148 SvxEditEngineSource::SvxEditEngineSource( SvxEditEngineSourceImpl* pImpl ) 149 { 150 mpImpl = pImpl; 151 mpImpl->acquire(); 152 } 153 154 //------------------------------------------------------------------------ 155 156 SvxEditEngineSource::~SvxEditEngineSource() 157 { 158 mpImpl->release(); 159 } 160 161 //------------------------------------------------------------------------ 162 163 SvxEditSource* SvxEditEngineSource::Clone() const 164 { 165 return new SvxEditEngineSource( mpImpl ); 166 } 167 168 //------------------------------------------------------------------------ 169 170 SvxTextForwarder* SvxEditEngineSource::GetTextForwarder() 171 { 172 return mpImpl->GetTextForwarder(); 173 } 174 175 //------------------------------------------------------------------------ 176 177 void SvxEditEngineSource::UpdateData() 178 { 179 } 180 181 class SvxSimpleUnoModel : public cppu::WeakAggImplHelper4< 182 ::com::sun::star::frame::XModel, 183 ::com::sun::star::ucb::XAnyCompareFactory, 184 ::com::sun::star::style::XStyleFamiliesSupplier, 185 ::com::sun::star::lang::XMultiServiceFactory > 186 { 187 public: 188 SvxSimpleUnoModel(); 189 virtual ~SvxSimpleUnoModel(); 190 191 192 // XMultiServiceFactory 193 virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL createInstance( const ::rtl::OUString& aServiceSpecifier ) throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); 194 virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL createInstanceWithArguments( const ::rtl::OUString& ServiceSpecifier, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& Arguments ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); 195 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getAvailableServiceNames( ) throw(::com::sun::star::uno::RuntimeException); 196 197 // XStyleFamiliesSupplier 198 virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getStyleFamilies( ) throw(::com::sun::star::uno::RuntimeException); 199 200 // XAnyCompareFactory 201 virtual ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XAnyCompare > SAL_CALL createAnyCompareByName( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException); 202 203 // XModel 204 virtual sal_Bool SAL_CALL attachResource( const ::rtl::OUString& aURL, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aArgs ) throw (::com::sun::star::uno::RuntimeException); 205 virtual ::rtl::OUString SAL_CALL getURL( ) throw (::com::sun::star::uno::RuntimeException); 206 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL getArgs( ) throw (::com::sun::star::uno::RuntimeException); 207 virtual void SAL_CALL connectController( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >& xController ) throw (::com::sun::star::uno::RuntimeException); 208 virtual void SAL_CALL disconnectController( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >& xController ) throw (::com::sun::star::uno::RuntimeException); 209 virtual void SAL_CALL lockControllers( ) throw (::com::sun::star::uno::RuntimeException); 210 virtual void SAL_CALL unlockControllers( ) throw (::com::sun::star::uno::RuntimeException); 211 virtual sal_Bool SAL_CALL hasControllersLocked( ) throw (::com::sun::star::uno::RuntimeException); 212 virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > SAL_CALL getCurrentController( ) throw (::com::sun::star::uno::RuntimeException); 213 virtual void SAL_CALL setCurrentController( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >& xController ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException); 214 virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getCurrentSelection( ) throw (::com::sun::star::uno::RuntimeException); 215 216 // XComponent 217 virtual void SAL_CALL dispose( ) throw (::com::sun::star::uno::RuntimeException); 218 virtual void SAL_CALL addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener ) throw (::com::sun::star::uno::RuntimeException); 219 virtual void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); 220 221 }; 222 223 SvxSimpleUnoModel::SvxSimpleUnoModel() 224 { 225 } 226 227 SvxSimpleUnoModel::~SvxSimpleUnoModel() 228 { 229 } 230 231 // XMultiServiceFactory ( SvxFmMSFactory ) 232 uno::Reference< uno::XInterface > SAL_CALL SvxSimpleUnoModel::createInstance( const OUString& aServiceSpecifier ) 233 throw(uno::Exception, uno::RuntimeException) 234 { 235 if( 0 == aServiceSpecifier.reverseCompareToAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.NumberingRules" ) ) ) 236 { 237 return uno::Reference< uno::XInterface >( 238 SvxCreateNumRule(), uno::UNO_QUERY ); 239 } 240 if ( (0 == aServiceSpecifier.reverseCompareToAsciiL( 241 RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.textfield.DateTime"))) 242 || (0 == aServiceSpecifier.reverseCompareToAsciiL( 243 RTL_CONSTASCII_STRINGPARAM("com.sun.star.text.TextField.DateTime"))) 244 ) 245 { 246 return (::cppu::OWeakObject * )new SvxUnoTextField( ID_EXT_DATEFIELD ); 247 } 248 249 return SvxUnoTextCreateTextField( aServiceSpecifier ); 250 251 } 252 253 uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL SvxSimpleUnoModel::createInstanceWithArguments( const ::rtl::OUString& ServiceSpecifier, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException) 254 { 255 return createInstance( ServiceSpecifier ); 256 } 257 258 Sequence< ::rtl::OUString > SAL_CALL SvxSimpleUnoModel::getAvailableServiceNames( ) throw(::com::sun::star::uno::RuntimeException) 259 { 260 Sequence< OUString > aSeq; 261 return aSeq; 262 } 263 264 // XAnyCompareFactory 265 uno::Reference< com::sun::star::ucb::XAnyCompare > SAL_CALL SvxSimpleUnoModel::createAnyCompareByName( const OUString& PropertyName ) 266 throw(uno::RuntimeException) 267 { 268 (void)PropertyName; 269 return SvxCreateNumRuleCompare(); 270 } 271 272 // XStyleFamiliesSupplier 273 uno::Reference< container::XNameAccess > SAL_CALL SvxSimpleUnoModel::getStyleFamilies( ) 274 throw(uno::RuntimeException) 275 { 276 uno::Reference< container::XNameAccess > xStyles; 277 return xStyles; 278 } 279 280 // XModel 281 sal_Bool SAL_CALL SvxSimpleUnoModel::attachResource( const ::rtl::OUString& aURL, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aArgs ) throw (::com::sun::star::uno::RuntimeException) 282 { 283 (void)aURL; 284 (void)aArgs; 285 return sal_False; 286 } 287 288 ::rtl::OUString SAL_CALL SvxSimpleUnoModel::getURL( ) throw (::com::sun::star::uno::RuntimeException) 289 { 290 OUString aStr; 291 return aStr; 292 } 293 294 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL SvxSimpleUnoModel::getArgs( ) throw (::com::sun::star::uno::RuntimeException) 295 { 296 Sequence< beans::PropertyValue > aSeq; 297 return aSeq; 298 } 299 300 void SAL_CALL SvxSimpleUnoModel::connectController( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >& ) throw (::com::sun::star::uno::RuntimeException) 301 { 302 } 303 304 void SAL_CALL SvxSimpleUnoModel::disconnectController( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >& ) throw (::com::sun::star::uno::RuntimeException) 305 { 306 } 307 308 void SAL_CALL SvxSimpleUnoModel::lockControllers( ) throw (::com::sun::star::uno::RuntimeException) 309 { 310 } 311 312 void SAL_CALL SvxSimpleUnoModel::unlockControllers( ) throw (::com::sun::star::uno::RuntimeException) 313 { 314 } 315 316 sal_Bool SAL_CALL SvxSimpleUnoModel::hasControllersLocked( ) throw (::com::sun::star::uno::RuntimeException) 317 { 318 return sal_True; 319 } 320 321 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > SAL_CALL SvxSimpleUnoModel::getCurrentController( ) throw (::com::sun::star::uno::RuntimeException) 322 { 323 uno::Reference< frame::XController > xRet; 324 return xRet; 325 } 326 327 void SAL_CALL SvxSimpleUnoModel::setCurrentController( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >& ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException) 328 { 329 } 330 331 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL SvxSimpleUnoModel::getCurrentSelection( ) throw (::com::sun::star::uno::RuntimeException) 332 { 333 uno::Reference< XInterface > xRet; 334 return xRet; 335 } 336 337 338 // XComponent 339 void SAL_CALL SvxSimpleUnoModel::dispose( ) throw (::com::sun::star::uno::RuntimeException) 340 { 341 } 342 343 void SAL_CALL SvxSimpleUnoModel::addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& ) throw (::com::sun::star::uno::RuntimeException) 344 { 345 } 346 347 void SAL_CALL SvxSimpleUnoModel::removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& ) throw (::com::sun::star::uno::RuntimeException) 348 { 349 } 350 351 /////////////////////////////////////////////////////////////////////// 352 353 class SvxXMLTextExportComponent : public SvXMLExport 354 { 355 public: 356 // #110680# 357 SvxXMLTextExportComponent( 358 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xServiceFactory, 359 EditEngine* pEditEngine, 360 const ESelection& rSel, 361 const ::rtl::OUString& rFileName, 362 const com::sun::star::uno::Reference< com::sun::star::xml::sax::XDocumentHandler > & xHandler ); 363 364 ~SvxXMLTextExportComponent(); 365 366 // methods without content: 367 virtual void _ExportAutoStyles(); 368 virtual void _ExportMasterStyles(); 369 virtual void _ExportContent(); 370 371 private: 372 com::sun::star::uno::Reference< com::sun::star::text::XText > mxText; 373 EditEngine* mpEditEngine; 374 ESelection maSelection; 375 }; 376 377 /////////////////////////////////////////////////////////////////////// 378 379 // #110680# 380 SvxXMLTextExportComponent::SvxXMLTextExportComponent( 381 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xServiceFactory, 382 EditEngine* pEditEngine, 383 const ESelection& rSel, 384 const ::rtl::OUString& rFileName, 385 const com::sun::star::uno::Reference< com::sun::star::xml::sax::XDocumentHandler > & xHandler) 386 : SvXMLExport( xServiceFactory, rFileName, xHandler, ((frame::XModel*)new SvxSimpleUnoModel()), MAP_CM ), 387 mpEditEngine( pEditEngine ), 388 maSelection( rSel ) 389 { 390 SvxEditEngineSource aEditSource( pEditEngine ); 391 392 static const SfxItemPropertyMapEntry SvxXMLTextExportComponentPropertyMap[] = 393 { 394 SVX_UNOEDIT_CHAR_PROPERTIES, 395 SVX_UNOEDIT_FONT_PROPERTIES, 396 // SVX_UNOEDIT_OUTLINER_PROPERTIES, 397 {MAP_CHAR_LEN(UNO_NAME_NUMBERING_RULES), EE_PARA_NUMBULLET, &::getCppuType((const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexReplace>*)0), 0, 0 }, 398 {MAP_CHAR_LEN(UNO_NAME_NUMBERING), EE_PARA_BULLETSTATE,&::getBooleanCppuType(), 0, 0 }, 399 {MAP_CHAR_LEN(UNO_NAME_NUMBERING_LEVEL), EE_PARA_OUTLLEVEL, &::getCppuType((const sal_Int16*)0), 0, 0 }, 400 SVX_UNOEDIT_PARA_PROPERTIES, 401 {0,0,0,0,0,0} 402 }; 403 static SvxItemPropertySet aSvxXMLTextExportComponentPropertySet( SvxXMLTextExportComponentPropertyMap, EditEngine::GetGlobalItemPool() ); 404 405 SvxUnoText* pUnoText = new SvxUnoText( &aEditSource, &aSvxXMLTextExportComponentPropertySet, mxText ); 406 pUnoText->SetSelection( rSel ); 407 mxText = pUnoText; 408 409 setExportFlags( EXPORT_AUTOSTYLES|EXPORT_CONTENT ); 410 } 411 412 SvxXMLTextExportComponent::~SvxXMLTextExportComponent() 413 { 414 } 415 416 void SvxWriteXML( EditEngine& rEditEngine, SvStream& rStream, const ESelection& rSel ) 417 { 418 try 419 { 420 do 421 { 422 // create service factory 423 424 uno::Reference< lang::XMultiServiceFactory> xServiceFactory( ::comphelper::getProcessServiceFactory() ); 425 426 if( !xServiceFactory.is() ) 427 { 428 DBG_ERROR( "got no service manager" ); 429 break; 430 } 431 432 // create document handler 433 434 uno::Reference< uno::XInterface > xWriter( xServiceFactory->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Writer" ) ) ) ); 435 436 if( !xWriter.is() ) 437 { 438 DBG_ERROR( "com.sun.star.xml.sax.Writer service missing" ); 439 break; 440 } 441 442 uno::Reference<xml::sax::XDocumentHandler> xHandler( xWriter, uno::UNO_QUERY ); 443 444 // create output stream and active data source 445 uno::Reference<io::XOutputStream> xOut( new utl::OOutputStreamWrapper( rStream ) ); 446 447 /* testcode 448 const OUString aURL( RTL_CONSTASCII_USTRINGPARAM( "file:///e:/test.xml" ) ); 449 SfxMedium aMedium( aURL, STREAM_WRITE | STREAM_TRUNC, sal_True ); 450 aMedium.IsRemote(); 451 uno::Reference<io::XOutputStream> xOut( new utl::OOutputStreamWrapper( *aMedium.GetOutStream() ) ); 452 */ 453 454 455 uno::Reference<io::XActiveDataSource> xMetaSrc( xWriter, uno::UNO_QUERY ); 456 xMetaSrc->setOutputStream( xOut ); 457 458 // export text 459 const OUString aName; 460 461 // #110680# 462 // SvxXMLTextExportComponent aExporter( &rEditEngine, rSel, aName, xHandler ); 463 SvxXMLTextExportComponent aExporter( xServiceFactory, &rEditEngine, rSel, aName, xHandler ); 464 465 aExporter.exportDoc(); 466 467 /* testcode 468 aMedium.Commit(); 469 */ 470 471 } 472 while( 0 ); 473 } 474 catch( uno::Exception& ) 475 { 476 DBG_ERROR("exception during xml export"); 477 } 478 } 479 480 // methods without content: 481 void SvxXMLTextExportComponent::_ExportAutoStyles() 482 { 483 UniReference< XMLTextParagraphExport > xTextExport( GetTextParagraphExport() ); 484 485 xTextExport->collectTextAutoStyles( mxText ); 486 xTextExport->exportTextAutoStyles(); 487 } 488 489 void SvxXMLTextExportComponent::_ExportContent() 490 { 491 UniReference< XMLTextParagraphExport > xTextExport( GetTextParagraphExport() ); 492 493 xTextExport->exportText( mxText ); 494 } 495 496 void SvxXMLTextExportComponent::_ExportMasterStyles() {} 497