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_svx.hxx" 26 #include <tools/debug.hxx> 27 #include <com/sun/star/container/XNameContainer.hpp> 28 #include <com/sun/star/xml/sax/XDocumentHandler.hpp> 29 #include <com/sun/star/uno/Sequence.hxx> 30 #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp> 31 #include <com/sun/star/drawing/LineDash.hpp> 32 #include <com/sun/star/awt/Gradient.hpp> 33 #include <com/sun/star/drawing/Hatch.hpp> 34 #include <com/sun/star/io/XActiveDataSource.hpp> 35 #include <com/sun/star/embed/ElementModes.hpp> 36 #include <sfx2/docfile.hxx> 37 #include <rtl/ustrbuf.hxx> 38 #include <xmloff/xmluconv.hxx> 39 #include "xmloff/xmlnmspe.hxx" 40 #include "xmloff/nmspmap.hxx" 41 42 #include "xmloff/xmltoken.hxx" 43 #include "xmloff/xmlmetae.hxx" 44 #include "xmloff/DashStyle.hxx" 45 #include "xmloff/GradientStyle.hxx" 46 #include "xmloff/HatchStyle.hxx" 47 #include "xmloff/ImageStyle.hxx" 48 #include "xmloff/MarkerStyle.hxx" 49 #include <com/sun/star/container/XNameContainer.hpp> 50 #include <com/sun/star/embed/XTransactedObject.hpp> 51 #include <comphelper/processfactory.hxx> 52 #include <unotools/streamwrap.hxx> 53 #include "svx/xmlgrhlp.hxx" 54 55 #include "xmlxtexp.hxx" 56 57 #include <comphelper/storagehelper.hxx> 58 59 using namespace com::sun::star; 60 using namespace com::sun::star::container; 61 using namespace com::sun::star::document; 62 using namespace com::sun::star::uno; 63 using namespace com::sun::star::awt; 64 using namespace com::sun::star::lang; 65 using namespace com::sun::star::xml::sax; 66 using namespace ::xmloff::token; 67 using namespace ::rtl; 68 using namespace cppu; 69 70 using com::sun::star::embed::XTransactedObject; 71 72 class SvxXMLTableEntryExporter 73 { 74 public: 75 SvxXMLTableEntryExporter( SvXMLExport& rExport ) : mrExport( rExport ) {} 76 virtual ~SvxXMLTableEntryExporter(); 77 78 virtual void exportEntry( const OUString& rStrName, const Any& rValue ) = 0; 79 80 protected: 81 SvXMLExport& mrExport; 82 }; 83 84 class SvxXMLColorEntryExporter : public SvxXMLTableEntryExporter 85 { 86 public: 87 SvxXMLColorEntryExporter( SvXMLExport& rExport ); 88 virtual ~SvxXMLColorEntryExporter(); 89 90 virtual void exportEntry( const OUString& rStrName, const Any& rValue ); 91 }; 92 93 class SvxXMLLineEndEntryExporter : public SvxXMLTableEntryExporter 94 { 95 public: 96 SvxXMLLineEndEntryExporter( SvXMLExport& rExport ); 97 SvxXMLLineEndEntryExporter(); 98 virtual ~SvxXMLLineEndEntryExporter(); 99 100 virtual void exportEntry( const OUString& rStrName, const Any& rValue ); 101 private: 102 XMLMarkerStyleExport maMarkerStyle; 103 }; 104 105 class SvxXMLDashEntryExporter : public SvxXMLTableEntryExporter 106 { 107 public: 108 SvxXMLDashEntryExporter( SvXMLExport& rExport ); 109 virtual ~SvxXMLDashEntryExporter(); 110 111 virtual void exportEntry( const OUString& rStrName, const Any& rValue ); 112 113 private: 114 XMLDashStyleExport maDashStyle; 115 }; 116 117 class SvxXMLHatchEntryExporter : public SvxXMLTableEntryExporter 118 { 119 public: 120 SvxXMLHatchEntryExporter( SvXMLExport& rExport ); 121 virtual ~SvxXMLHatchEntryExporter(); 122 123 virtual void exportEntry( const OUString& rStrName, const Any& rValue ); 124 private: 125 XMLHatchStyleExport maHatchStyle; 126 }; 127 128 class SvxXMLGradientEntryExporter : public SvxXMLTableEntryExporter 129 { 130 public: 131 SvxXMLGradientEntryExporter( SvXMLExport& rExport ); 132 virtual ~SvxXMLGradientEntryExporter(); 133 134 virtual void exportEntry( const OUString& rStrName, const Any& rValue ); 135 private: 136 XMLGradientStyleExport maGradientStyle; 137 }; 138 139 class SvxXMLBitmapEntryExporter : public SvxXMLTableEntryExporter 140 { 141 public: 142 SvxXMLBitmapEntryExporter( SvXMLExport& rExport ); 143 virtual ~SvxXMLBitmapEntryExporter(); 144 145 virtual void exportEntry( const OUString& rStrName, const Any& rValue ); 146 147 private: 148 XMLImageStyle maImageStyle; 149 }; 150 151 /////////////////////////////////////////////////////////////////////// 152 153 // #110680# 154 SvxXMLXTableExportComponent::SvxXMLXTableExportComponent( 155 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xServiceFactory, 156 const OUString& rFileName, 157 const uno::Reference<xml::sax::XDocumentHandler> & rHandler, 158 const uno::Reference<container::XNameContainer >& xTable, 159 uno::Reference<document::XGraphicObjectResolver >& xGrfResolver ) 160 : SvXMLExport( xServiceFactory, rFileName, rHandler, NULL, MAP_100TH_MM), 161 mxTable( xTable ) 162 { 163 164 _GetNamespaceMap().Add( GetXMLToken(XML_NP_OOO), GetXMLToken(XML_N_OOO), XML_NAMESPACE_OOO ); 165 _GetNamespaceMap().Add( GetXMLToken(XML_NP_OFFICE), GetXMLToken(XML_N_OFFICE), XML_NAMESPACE_OFFICE ); 166 _GetNamespaceMap().Add( GetXMLToken(XML_NP_DRAW), GetXMLToken(XML_N_DRAW), XML_NAMESPACE_DRAW ); 167 _GetNamespaceMap().Add( GetXMLToken(XML_NP_XLINK), GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK ); 168 _GetNamespaceMap().Add( GetXMLToken(XML_NP_SVG), GetXMLToken(XML_N_SVG), XML_NAMESPACE_SVG ); 169 SetGraphicResolver( xGrfResolver ); 170 setExportFlags( 0 ); 171 } 172 173 SvxXMLXTableExportComponent::~SvxXMLXTableExportComponent() 174 { 175 } 176 177 sal_Bool SvxXMLXTableExportComponent::save( const OUString& rURL, const uno::Reference<container::XNameContainer >& xTable ) throw() 178 { 179 uno::Reference < embed::XStorage > xStorage; 180 SfxMedium* pMedium = NULL; 181 sal_Bool bRet = sal_False; 182 183 uno::Reference< XGraphicObjectResolver > xGrfResolver; 184 SvXMLGraphicHelper* pGraphicHelper = 0; 185 186 try 187 { 188 do 189 { 190 uno::Reference < io::XOutputStream > xOut; 191 uno::Reference < io::XStream > xStream; 192 193 sal_Bool bNeedStorage = xTable->getElementType() == ::getCppuType((const OUString*)0); 194 195 uno::Reference< lang::XMultiServiceFactory> xServiceFactory( ::comphelper::getProcessServiceFactory() ); 196 if( !xServiceFactory.is() ) 197 { 198 DBG_ERROR( "got no service manager" ); 199 return sal_False; 200 } 201 202 uno::Reference< uno::XInterface > xWriter( xServiceFactory->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Writer" ) ) ) ); 203 if( !xWriter.is() ) 204 { 205 DBG_ERROR( "com.sun.star.xml.sax.Writer service missing" ); 206 return sal_False; 207 } 208 209 uno::Reference<xml::sax::XDocumentHandler> xHandler( xWriter, uno::UNO_QUERY ); 210 211 if( bNeedStorage ) 212 { 213 xStorage = 214 ::comphelper::OStorageHelper::GetStorageFromURL( rURL, embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE ); 215 216 if( !xStorage.is() ) 217 { 218 DBG_ERROR( "no storage!" ); 219 break; 220 } 221 222 OUString sMetaName( RTL_CONSTASCII_USTRINGPARAM( "Content.xml" ) ); 223 xStream = xStorage->openStreamElement( sMetaName, embed::ElementModes::WRITE ); 224 pGraphicHelper = SvXMLGraphicHelper::Create( xStorage, GRAPHICHELPER_MODE_WRITE ); 225 xGrfResolver = pGraphicHelper; 226 xOut = xStream->getOutputStream(); 227 } 228 else 229 { 230 pMedium = new SfxMedium( rURL, STREAM_WRITE | STREAM_TRUNC, sal_True ); 231 pMedium->IsRemote(); 232 233 SvStream* pStream = pMedium->GetOutStream(); 234 if( NULL == pStream ) 235 { 236 DBG_ERROR( "no output stream!" ); 237 break; 238 } 239 240 xOut = new utl::OOutputStreamWrapper( *pStream ); 241 } 242 243 uno::Reference<io::XActiveDataSource> xMetaSrc( xWriter, uno::UNO_QUERY ); 244 xMetaSrc->setOutputStream( xOut ); 245 246 const OUString aName; 247 248 // #110680# 249 // SvxXMLXTableExportComponent aExporter( aName, xHandler, xTable, xGrfResolver ); 250 SvxXMLXTableExportComponent aExporter( xServiceFactory, aName, xHandler, xTable, xGrfResolver ); 251 252 bRet = aExporter.exportTable(); 253 254 } 255 while( 0 ); 256 257 if( pGraphicHelper ) 258 SvXMLGraphicHelper::Destroy( pGraphicHelper ); 259 260 if( xStorage.is() ) 261 { 262 uno::Reference< XTransactedObject > xTrans( xStorage, UNO_QUERY ); 263 if( xTrans.is() ) 264 xTrans->commit(); 265 266 uno::Reference< XComponent > xComp( xStorage, UNO_QUERY ); 267 if( xComp.is() ) 268 xStorage->dispose(); 269 } 270 } 271 catch( uno::Exception& ) 272 { 273 bRet = sal_False; 274 } 275 276 if( pMedium ) 277 { 278 pMedium->Commit(); 279 delete pMedium; 280 } 281 282 return bRet; 283 } 284 285 sal_Bool SvxXMLXTableExportComponent::exportTable() throw() 286 { 287 sal_Bool bRet = sal_False; 288 289 try 290 { 291 GetDocHandler()->startDocument(); 292 293 // export namespaces 294 sal_uInt16 nPos = GetNamespaceMap().GetFirstKey(); 295 while( USHRT_MAX != nPos ) 296 { 297 GetAttrList().AddAttribute( GetNamespaceMap().GetAttrNameByKey( nPos ), GetNamespaceMap().GetNameByKey( nPos ) ); 298 nPos = GetNamespaceMap().GetNextKey( nPos ); 299 } 300 301 do 302 { 303 if( !mxTable.is() ) 304 break; 305 306 char const* pEleName; 307 Type aExportType = mxTable->getElementType(); 308 SvxXMLTableEntryExporter* pExporter = NULL; 309 310 if( aExportType == ::getCppuType((const sal_Int32*)0) ) 311 { 312 pExporter = new SvxXMLColorEntryExporter(*this); 313 pEleName = "color-table"; 314 } 315 else if( aExportType == ::getCppuType((const drawing::PolyPolygonBezierCoords*)0) ) 316 { 317 pExporter = new SvxXMLLineEndEntryExporter(*this); 318 pEleName = "marker-table"; 319 } 320 else if( aExportType == ::getCppuType((const drawing::LineDash*)0) ) 321 { 322 pExporter = new SvxXMLDashEntryExporter(*this); 323 pEleName = "dash-table"; 324 } 325 else if( aExportType == ::getCppuType((const drawing::Hatch*)0) ) 326 { 327 pExporter = new SvxXMLHatchEntryExporter(*this); 328 pEleName = "hatch-table"; 329 } 330 else if( aExportType == ::getCppuType((const awt::Gradient*)0)) 331 { 332 pExporter = new SvxXMLGradientEntryExporter(*this); 333 pEleName = "gradient-table"; 334 } 335 else if( aExportType == ::getCppuType((const OUString*)0)) 336 { 337 pExporter = new SvxXMLBitmapEntryExporter(*this); 338 pEleName = "bitmap-table"; 339 } 340 else 341 { 342 DBG_ERROR( "unknown type for export"); 343 break; 344 } 345 346 SvXMLElementExport aElem( *this, XML_NAMESPACE_OOO, pEleName, sal_True, sal_True ); 347 348 Sequence< OUString > aNames = mxTable->getElementNames(); 349 const sal_Int32 nCount = aNames.getLength(); 350 const OUString* pNames = aNames.getConstArray(); 351 Any aAny; 352 353 sal_Int32 nIndex; 354 for( nIndex = 0; nIndex < nCount; nIndex++, pNames++ ) 355 { 356 aAny = mxTable->getByName( *pNames ); 357 pExporter->exportEntry( *pNames, aAny ); 358 } 359 360 bRet = sal_True; 361 } 362 while(0); 363 364 GetDocHandler()->endDocument(); 365 } 366 catch( Exception e ) 367 { 368 bRet = sal_False; 369 } 370 371 return bRet; 372 } 373 374 // methods without content: 375 void SvxXMLXTableExportComponent::_ExportAutoStyles() {} 376 void SvxXMLXTableExportComponent::_ExportMasterStyles() {} 377 void SvxXMLXTableExportComponent::_ExportContent() {} 378 379 /////////////////////////////////////////////////////////////////////// 380 381 SvxXMLTableEntryExporter::~SvxXMLTableEntryExporter() 382 { 383 } 384 385 /////////////////////////////////////////////////////////////////////// 386 387 SvxXMLColorEntryExporter::SvxXMLColorEntryExporter( SvXMLExport& rExport ) 388 : SvxXMLTableEntryExporter( rExport ) 389 { 390 } 391 392 SvxXMLColorEntryExporter::~SvxXMLColorEntryExporter() 393 { 394 } 395 396 void SvxXMLColorEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue ) 397 { 398 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, rStrName ); 399 400 sal_Int32 nColor = 0; 401 rValue >>= nColor; 402 403 OUStringBuffer aOut; 404 mrExport.GetMM100UnitConverter().convertColor( aOut, nColor ); 405 mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_COLOR, aOut.makeStringAndClear() ); 406 407 SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW, XML_COLOR, sal_True, sal_True ); 408 } 409 410 /////////////////////////////////////////////////////////////////////// 411 412 SvxXMLLineEndEntryExporter::SvxXMLLineEndEntryExporter( SvXMLExport& rExport ) 413 : SvxXMLTableEntryExporter( rExport ), maMarkerStyle( rExport ) 414 { 415 } 416 417 SvxXMLLineEndEntryExporter::~SvxXMLLineEndEntryExporter() 418 { 419 } 420 421 void SvxXMLLineEndEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue ) 422 { 423 maMarkerStyle.exportXML( rStrName, rValue ); 424 } 425 426 /////////////////////////////////////////////////////////////////////// 427 428 SvxXMLDashEntryExporter::SvxXMLDashEntryExporter( SvXMLExport& rExport ) 429 : SvxXMLTableEntryExporter( rExport ), maDashStyle( rExport ) 430 { 431 } 432 433 SvxXMLDashEntryExporter::~SvxXMLDashEntryExporter() 434 { 435 } 436 437 void SvxXMLDashEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue ) 438 { 439 maDashStyle.exportXML( rStrName, rValue ); 440 } 441 442 /////////////////////////////////////////////////////////////////////// 443 444 SvxXMLHatchEntryExporter::SvxXMLHatchEntryExporter( SvXMLExport& rExport ) 445 : SvxXMLTableEntryExporter( rExport ), maHatchStyle( rExport ) 446 { 447 } 448 449 SvxXMLHatchEntryExporter::~SvxXMLHatchEntryExporter() 450 { 451 } 452 453 void SvxXMLHatchEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue ) 454 { 455 maHatchStyle.exportXML( rStrName, rValue ); 456 } 457 458 /////////////////////////////////////////////////////////////////////// 459 460 SvxXMLGradientEntryExporter::SvxXMLGradientEntryExporter( SvXMLExport& rExport ) 461 : SvxXMLTableEntryExporter( rExport ), maGradientStyle( rExport ) 462 { 463 } 464 465 SvxXMLGradientEntryExporter::~SvxXMLGradientEntryExporter() 466 { 467 } 468 469 void SvxXMLGradientEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue ) 470 { 471 maGradientStyle.exportXML( rStrName, rValue ); 472 } 473 474 /////////////////////////////////////////////////////////////////////// 475 476 SvxXMLBitmapEntryExporter::SvxXMLBitmapEntryExporter( SvXMLExport& rExport ) 477 : SvxXMLTableEntryExporter( rExport ) 478 { 479 } 480 481 SvxXMLBitmapEntryExporter::~SvxXMLBitmapEntryExporter() 482 { 483 } 484 485 void SvxXMLBitmapEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue ) 486 { 487 maImageStyle.exportXML( rStrName, rValue, mrExport ); 488 } 489