1d0626817SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3d0626817SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4d0626817SAndrew Rist * or more contributor license agreements. See the NOTICE file 5d0626817SAndrew Rist * distributed with this work for additional information 6d0626817SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7d0626817SAndrew Rist * to you under the Apache License, Version 2.0 (the 8d0626817SAndrew Rist * "License"); you may not use this file except in compliance 9d0626817SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11d0626817SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13d0626817SAndrew Rist * Unless required by applicable law or agreed to in writing, 14d0626817SAndrew Rist * software distributed under the License is distributed on an 15d0626817SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16d0626817SAndrew Rist * KIND, either express or implied. See the License for the 17d0626817SAndrew Rist * specific language governing permissions and limitations 18d0626817SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20d0626817SAndrew Rist *************************************************************/ 21d0626817SAndrew Rist 22d0626817SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_framework.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <stdio.h> 28cdf0e10cSrcweir 29cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 30cdf0e10cSrcweir // my own includes 31cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 32cdf0e10cSrcweir 33cdf0e10cSrcweir #include <threadhelp/resetableguard.hxx> 34cdf0e10cSrcweir #include <xml/imagesdocumenthandler.hxx> 35cdf0e10cSrcweir #include <macros/debug.hxx> 36cdf0e10cSrcweir 37cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 38cdf0e10cSrcweir // interface includes 39cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 40cdf0e10cSrcweir 41cdf0e10cSrcweir #ifndef __COM_SUN_STAR_XML_SAX_XEXTENDEDDOCUMENTHANDLER_HPP_ 42cdf0e10cSrcweir #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp> 43cdf0e10cSrcweir #endif 44cdf0e10cSrcweir 45cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 46cdf0e10cSrcweir // other includes 47cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 48cdf0e10cSrcweir #include <vcl/svapp.hxx> 49cdf0e10cSrcweir #include <vcl/toolbox.hxx> 50cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 51cdf0e10cSrcweir 52cdf0e10cSrcweir #include <comphelper/attributelist.hxx> 53cdf0e10cSrcweir 54cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 55cdf0e10cSrcweir // namespace 56cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 57cdf0e10cSrcweir 58cdf0e10cSrcweir using namespace ::com::sun::star::uno; 59cdf0e10cSrcweir using namespace ::com::sun::star::xml::sax; 60cdf0e10cSrcweir 61cdf0e10cSrcweir #define ELEMENT_IMAGECONTAINER "imagescontainer" 62cdf0e10cSrcweir #define ELEMENT_IMAGES "images" 63cdf0e10cSrcweir #define ELEMENT_ENTRY "entry" 64cdf0e10cSrcweir #define ELEMENT_EXTERNALIMAGES "externalimages" 65cdf0e10cSrcweir #define ELEMENT_EXTERNALENTRY "externalentry" 66cdf0e10cSrcweir 67cdf0e10cSrcweir #define ELEMENT_NS_IMAGESCONTAINER "image:imagescontainer" 68cdf0e10cSrcweir #define ELEMENT_NS_IMAGES "image:images" 69cdf0e10cSrcweir #define ELEMENT_NS_ENTRY "image:entry" 70cdf0e10cSrcweir #define ELEMENT_NS_EXTERNALIMAGES "image:externalimages" 71cdf0e10cSrcweir #define ELEMENT_NS_EXTERNALENTRY "image:externalentry" 72cdf0e10cSrcweir 73cdf0e10cSrcweir #define ATTRIBUTE_HREF "href" 74cdf0e10cSrcweir #define ATTRIBUTE_MASKCOLOR "maskcolor" 75cdf0e10cSrcweir #define ATTRIBUTE_COMMAND "command" 76cdf0e10cSrcweir #define ATTRIBUTE_BITMAPINDEX "bitmap-index" 77cdf0e10cSrcweir #define ATTRIBUTE_MASKURL "maskurl" 78cdf0e10cSrcweir #define ATTRIBUTE_MASKMODE "maskmode" 79cdf0e10cSrcweir #define ATTRIBUTE_HIGHCONTRASTURL "highcontrasturl" 80cdf0e10cSrcweir #define ATTRIBUTE_HIGHCONTRASTMASKURL "highcontrastmaskurl" 81cdf0e10cSrcweir #define ATTRIBUTE_TYPE_CDATA "CDATA" 82cdf0e10cSrcweir 83cdf0e10cSrcweir #define ATTRIBUTE_MASKMODE_BITMAP "maskbitmap" 84cdf0e10cSrcweir #define ATTRIBUTE_MASKMODE_COLOR "maskcolor" 85cdf0e10cSrcweir 86cdf0e10cSrcweir #define ATTRIBUTE_XMLNS_IMAGE "xmlns:image" 87cdf0e10cSrcweir #define ATTRIBUTE_XMLNS_XLINK "xmlns:xlink" 88cdf0e10cSrcweir 89cdf0e10cSrcweir #define ATTRIBUTE_XLINK_TYPE "xlink:type" 90cdf0e10cSrcweir #define ATTRIBUTE_XLINK_TYPE_VALUE "simple" 91cdf0e10cSrcweir 92cdf0e10cSrcweir #define XMLNS_IMAGE "http://openoffice.org/2001/image" 93cdf0e10cSrcweir #define XMLNS_XLINK "http://www.w3.org/1999/xlink" 94cdf0e10cSrcweir #define XMLNS_IMAGE_PREFIX "image:" 95cdf0e10cSrcweir #define XMLNS_XLINK_PREFIX "xlink:" 96cdf0e10cSrcweir 97cdf0e10cSrcweir #define XMLNS_FILTER_SEPARATOR "^" 98cdf0e10cSrcweir 99cdf0e10cSrcweir #define IMAGES_DOCTYPE "<!DOCTYPE image:imagecontainer PUBLIC \"-//OpenOffice.org//DTD OfficeDocument 1.0//EN\" \"image.dtd\">" 100cdf0e10cSrcweir 101cdf0e10cSrcweir namespace framework 102cdf0e10cSrcweir { 103cdf0e10cSrcweir 104cdf0e10cSrcweir struct ImageXMLEntryProperty 105cdf0e10cSrcweir { 106cdf0e10cSrcweir OReadImagesDocumentHandler::Image_XML_Namespace nNamespace; 107cdf0e10cSrcweir char aEntryName[20]; 108cdf0e10cSrcweir }; 109cdf0e10cSrcweir 110cdf0e10cSrcweir ImageXMLEntryProperty ImagesEntries[OReadImagesDocumentHandler::IMG_XML_ENTRY_COUNT] = 111cdf0e10cSrcweir { 112cdf0e10cSrcweir { OReadImagesDocumentHandler::IMG_NS_IMAGE, ELEMENT_IMAGECONTAINER }, 113cdf0e10cSrcweir { OReadImagesDocumentHandler::IMG_NS_IMAGE, ELEMENT_IMAGES }, 114cdf0e10cSrcweir { OReadImagesDocumentHandler::IMG_NS_IMAGE, ELEMENT_ENTRY }, 115cdf0e10cSrcweir { OReadImagesDocumentHandler::IMG_NS_IMAGE, ELEMENT_EXTERNALIMAGES }, 116cdf0e10cSrcweir { OReadImagesDocumentHandler::IMG_NS_IMAGE, ELEMENT_EXTERNALENTRY }, 117cdf0e10cSrcweir { OReadImagesDocumentHandler::IMG_NS_XLINK, ATTRIBUTE_HREF }, 118cdf0e10cSrcweir { OReadImagesDocumentHandler::IMG_NS_IMAGE, ATTRIBUTE_MASKCOLOR }, 119cdf0e10cSrcweir { OReadImagesDocumentHandler::IMG_NS_IMAGE, ATTRIBUTE_COMMAND }, 120cdf0e10cSrcweir { OReadImagesDocumentHandler::IMG_NS_IMAGE, ATTRIBUTE_BITMAPINDEX }, 121cdf0e10cSrcweir { OReadImagesDocumentHandler::IMG_NS_IMAGE, ATTRIBUTE_MASKURL }, 122cdf0e10cSrcweir { OReadImagesDocumentHandler::IMG_NS_IMAGE, ATTRIBUTE_MASKMODE }, 123cdf0e10cSrcweir { OReadImagesDocumentHandler::IMG_NS_IMAGE, ATTRIBUTE_HIGHCONTRASTURL }, 124cdf0e10cSrcweir { OReadImagesDocumentHandler::IMG_NS_IMAGE, ATTRIBUTE_HIGHCONTRASTMASKURL } 125cdf0e10cSrcweir }; 126cdf0e10cSrcweir 127cdf0e10cSrcweir 128cdf0e10cSrcweir OReadImagesDocumentHandler::OReadImagesDocumentHandler( ImageListsDescriptor& aItems ) : 129cdf0e10cSrcweir ThreadHelpBase( &Application::GetSolarMutex() ), 130cdf0e10cSrcweir m_aImageList( aItems ), 131cdf0e10cSrcweir m_pImages( 0 ), 132cdf0e10cSrcweir m_pExternalImages( 0 ) 133cdf0e10cSrcweir { 134cdf0e10cSrcweir m_aImageList.pImageList = NULL; 135cdf0e10cSrcweir m_aImageList.pExternalImageList = NULL; 136cdf0e10cSrcweir 137cdf0e10cSrcweir m_nHashMaskModeBitmap = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_MASKMODE_BITMAP )).hashCode(); 138cdf0e10cSrcweir m_nHashMaskModeColor = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_MASKMODE_COLOR )).hashCode(); 139cdf0e10cSrcweir 140cdf0e10cSrcweir // create hash map to speed up lookup 141cdf0e10cSrcweir for ( int i = 0; i < (int)IMG_XML_ENTRY_COUNT; i++ ) 142cdf0e10cSrcweir { 143cdf0e10cSrcweir ::rtl::OUStringBuffer temp( 20 ); 144cdf0e10cSrcweir 145cdf0e10cSrcweir if ( ImagesEntries[i].nNamespace == IMG_NS_IMAGE ) 146cdf0e10cSrcweir temp.appendAscii( XMLNS_IMAGE ); 147cdf0e10cSrcweir else 148cdf0e10cSrcweir temp.appendAscii( XMLNS_XLINK ); 149cdf0e10cSrcweir 150cdf0e10cSrcweir temp.appendAscii( XMLNS_FILTER_SEPARATOR ); 151cdf0e10cSrcweir temp.appendAscii( ImagesEntries[i].aEntryName ); 152cdf0e10cSrcweir m_aImageMap.insert( ImageHashMap::value_type( temp.makeStringAndClear(), (Image_XML_Entry)i ) ); 153cdf0e10cSrcweir } 154cdf0e10cSrcweir 155cdf0e10cSrcweir // reset states 156cdf0e10cSrcweir m_bImageContainerStartFound = sal_False; 157cdf0e10cSrcweir m_bImageContainerEndFound = sal_False; 158cdf0e10cSrcweir m_bImagesStartFound = sal_False; 159cdf0e10cSrcweir m_bImagesEndFound = sal_False; 160cdf0e10cSrcweir m_bImageStartFound = sal_False; 161cdf0e10cSrcweir m_bExternalImagesStartFound = sal_False; 162cdf0e10cSrcweir m_bExternalImagesEndFound = sal_False; 163cdf0e10cSrcweir m_bExternalImageStartFound = sal_False; 164cdf0e10cSrcweir } 165cdf0e10cSrcweir 166cdf0e10cSrcweir OReadImagesDocumentHandler::~OReadImagesDocumentHandler() 167cdf0e10cSrcweir { 168cdf0e10cSrcweir } 169cdf0e10cSrcweir 170cdf0e10cSrcweir // XDocumentHandler 171cdf0e10cSrcweir void SAL_CALL OReadImagesDocumentHandler::startDocument(void) 172cdf0e10cSrcweir throw ( SAXException, RuntimeException ) 173cdf0e10cSrcweir { 174cdf0e10cSrcweir } 175cdf0e10cSrcweir 176cdf0e10cSrcweir void SAL_CALL OReadImagesDocumentHandler::endDocument(void) 177cdf0e10cSrcweir throw( SAXException, RuntimeException ) 178cdf0e10cSrcweir { 179cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 180cdf0e10cSrcweir 181cdf0e10cSrcweir if (( m_bImageContainerStartFound && !m_bImageContainerEndFound ) || 182cdf0e10cSrcweir ( !m_bImageContainerStartFound && m_bImageContainerEndFound ) ) 183cdf0e10cSrcweir { 184cdf0e10cSrcweir ::rtl::OUString aErrorMessage = getErrorLineString(); 185cdf0e10cSrcweir aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "No matching start or end element 'image:imagecontainer' found!" )); 186cdf0e10cSrcweir throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 187cdf0e10cSrcweir } 188cdf0e10cSrcweir } 189cdf0e10cSrcweir 190cdf0e10cSrcweir void SAL_CALL OReadImagesDocumentHandler::startElement( 191cdf0e10cSrcweir const ::rtl::OUString& aName, const Reference< XAttributeList > &xAttribs ) 192cdf0e10cSrcweir throw( SAXException, RuntimeException ) 193cdf0e10cSrcweir { 194cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 195cdf0e10cSrcweir 196cdf0e10cSrcweir ImageHashMap::const_iterator pImageEntry = m_aImageMap.find( aName ) ; 197cdf0e10cSrcweir if ( pImageEntry != m_aImageMap.end() ) 198cdf0e10cSrcweir { 199cdf0e10cSrcweir switch ( pImageEntry->second ) 200cdf0e10cSrcweir { 201cdf0e10cSrcweir case IMG_ELEMENT_IMAGECONTAINER: 202cdf0e10cSrcweir { 203cdf0e10cSrcweir // image:imagecontainer element (container element for all further image elements) 204cdf0e10cSrcweir if ( m_bImageContainerStartFound ) 205cdf0e10cSrcweir { 206cdf0e10cSrcweir ::rtl::OUString aErrorMessage = getErrorLineString(); 207*07a3d7f1SPedro Giffuni aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'image:imagecontainer' cannot be embedded into 'image:imagecontainer'!" )); 208cdf0e10cSrcweir throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 209cdf0e10cSrcweir } 210cdf0e10cSrcweir 211cdf0e10cSrcweir m_bImageContainerStartFound = sal_True; 212cdf0e10cSrcweir } 213cdf0e10cSrcweir break; 214cdf0e10cSrcweir 215cdf0e10cSrcweir case IMG_ELEMENT_IMAGES: 216cdf0e10cSrcweir { 217cdf0e10cSrcweir if ( !m_bImageContainerStartFound ) 218cdf0e10cSrcweir { 219cdf0e10cSrcweir ::rtl::OUString aErrorMessage = getErrorLineString(); 220*07a3d7f1SPedro Giffuni aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'image:images' must be embedded into element 'image:imagecontainer'!" )); 221cdf0e10cSrcweir throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 222cdf0e10cSrcweir } 223cdf0e10cSrcweir 224cdf0e10cSrcweir if ( m_bImagesStartFound ) 225cdf0e10cSrcweir { 226cdf0e10cSrcweir ::rtl::OUString aErrorMessage = getErrorLineString(); 227*07a3d7f1SPedro Giffuni aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'image:images' cannot be embedded into 'image:images'!" )); 228cdf0e10cSrcweir throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 229cdf0e10cSrcweir } 230cdf0e10cSrcweir 231cdf0e10cSrcweir if ( !m_aImageList.pImageList ) 232cdf0e10cSrcweir m_aImageList.pImageList = new ImageListDescriptor; 233cdf0e10cSrcweir 234cdf0e10cSrcweir m_bImagesStartFound = sal_True; 235cdf0e10cSrcweir m_pImages = new ImageListItemDescriptor; 236cdf0e10cSrcweir 237cdf0e10cSrcweir for ( sal_Int16 n = 0; n < xAttribs->getLength(); n++ ) 238cdf0e10cSrcweir { 239cdf0e10cSrcweir pImageEntry = m_aImageMap.find( xAttribs->getNameByIndex( n ) ); 240cdf0e10cSrcweir if ( pImageEntry != m_aImageMap.end() ) 241cdf0e10cSrcweir { 242cdf0e10cSrcweir switch ( pImageEntry->second ) 243cdf0e10cSrcweir { 244cdf0e10cSrcweir case IMG_ATTRIBUTE_HREF: 245cdf0e10cSrcweir { 246cdf0e10cSrcweir m_pImages->aURL = xAttribs->getValueByIndex( n ); 247cdf0e10cSrcweir } 248cdf0e10cSrcweir break; 249cdf0e10cSrcweir 250cdf0e10cSrcweir case IMG_ATTRIBUTE_MASKCOLOR: 251cdf0e10cSrcweir { 252cdf0e10cSrcweir ::rtl::OUString aColor = xAttribs->getValueByIndex( n ); 253cdf0e10cSrcweir 254cdf0e10cSrcweir if ( aColor.getLength() > 0 ) 255cdf0e10cSrcweir { 256cdf0e10cSrcweir if ( aColor.getStr()[0] == '#' ) 257cdf0e10cSrcweir { 258cdf0e10cSrcweir // the color value is given as #rrggbb and used the hexadecimal system!! 259cdf0e10cSrcweir sal_uInt32 nColor = aColor.copy( 1 ).toInt32( 16 ); 260cdf0e10cSrcweir 261cdf0e10cSrcweir m_pImages->aMaskColor = Color( COLORDATA_RGB( nColor ) ); 262cdf0e10cSrcweir } 263cdf0e10cSrcweir } 264cdf0e10cSrcweir } 265cdf0e10cSrcweir break; 266cdf0e10cSrcweir 267cdf0e10cSrcweir case IMG_ATTRIBUTE_MASKURL: 268cdf0e10cSrcweir { 269cdf0e10cSrcweir m_pImages->aMaskURL = xAttribs->getValueByIndex( n ); 270cdf0e10cSrcweir } 271cdf0e10cSrcweir break; 272cdf0e10cSrcweir 273cdf0e10cSrcweir case IMG_ATTRIBUTE_MASKMODE: 274cdf0e10cSrcweir { 275cdf0e10cSrcweir sal_Int32 nHashCode = xAttribs->getValueByIndex( n ).hashCode(); 276cdf0e10cSrcweir if ( nHashCode == m_nHashMaskModeBitmap ) 277cdf0e10cSrcweir m_pImages->nMaskMode = ImageMaskMode_Bitmap; 278cdf0e10cSrcweir else if ( nHashCode == m_nHashMaskModeColor ) 279cdf0e10cSrcweir m_pImages->nMaskMode = ImageMaskMode_Color; 280cdf0e10cSrcweir else 281cdf0e10cSrcweir { 282cdf0e10cSrcweir delete m_pImages; 283cdf0e10cSrcweir m_pImages = NULL; 284cdf0e10cSrcweir 285cdf0e10cSrcweir ::rtl::OUString aErrorMessage = getErrorLineString(); 286cdf0e10cSrcweir aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Attribute image:maskmode must be 'maskcolor' or 'maskbitmap'!" )); 287cdf0e10cSrcweir throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 288cdf0e10cSrcweir } 289cdf0e10cSrcweir } 290cdf0e10cSrcweir break; 291cdf0e10cSrcweir 292cdf0e10cSrcweir case IMG_ATTRIBUTE_HIGHCONTRASTURL: 293cdf0e10cSrcweir { 294cdf0e10cSrcweir m_pImages->aHighContrastURL = xAttribs->getValueByIndex( n ); 295cdf0e10cSrcweir } 296cdf0e10cSrcweir break; 297cdf0e10cSrcweir 298cdf0e10cSrcweir case IMG_ATTRIBUTE_HIGHCONTRASTMASKURL: 299cdf0e10cSrcweir { 300cdf0e10cSrcweir m_pImages->aHighContrastMaskURL = xAttribs->getValueByIndex( n ); 301cdf0e10cSrcweir } 302cdf0e10cSrcweir break; 303cdf0e10cSrcweir 304cdf0e10cSrcweir default: 305cdf0e10cSrcweir break; 306cdf0e10cSrcweir } 307cdf0e10cSrcweir } 308cdf0e10cSrcweir } // for 309cdf0e10cSrcweir 310cdf0e10cSrcweir if ( m_pImages->aURL.Len() == 0 ) 311cdf0e10cSrcweir { 312cdf0e10cSrcweir delete m_pImages; 313cdf0e10cSrcweir m_pImages = NULL; 314cdf0e10cSrcweir 315cdf0e10cSrcweir ::rtl::OUString aErrorMessage = getErrorLineString(); 316cdf0e10cSrcweir aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Required attribute xlink:href must have a value!" )); 317cdf0e10cSrcweir throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 318cdf0e10cSrcweir } 319cdf0e10cSrcweir } 320cdf0e10cSrcweir break; 321cdf0e10cSrcweir 322cdf0e10cSrcweir case IMG_ELEMENT_ENTRY: 323cdf0e10cSrcweir { 324*07a3d7f1SPedro Giffuni // Check that image:entry is embedded into image:images! 325cdf0e10cSrcweir if ( !m_bImagesStartFound ) 326cdf0e10cSrcweir { 327cdf0e10cSrcweir delete m_pImages; 328cdf0e10cSrcweir m_pImages = NULL; 329cdf0e10cSrcweir 330cdf0e10cSrcweir ::rtl::OUString aErrorMessage = getErrorLineString(); 331*07a3d7f1SPedro Giffuni aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'image:entry' must be embedded into element 'image:images'!" )); 332cdf0e10cSrcweir throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 333cdf0e10cSrcweir } 334cdf0e10cSrcweir 335cdf0e10cSrcweir if ( !m_pImages->pImageItemList ) 336cdf0e10cSrcweir m_pImages->pImageItemList = new ImageItemListDescriptor; 337cdf0e10cSrcweir 338cdf0e10cSrcweir m_bImageStartFound = sal_True; 339cdf0e10cSrcweir 340cdf0e10cSrcweir // Create new image item descriptor 341cdf0e10cSrcweir ImageItemDescriptor* pItem = new ImageItemDescriptor; 342cdf0e10cSrcweir pItem->nIndex = -1; 343cdf0e10cSrcweir 344cdf0e10cSrcweir // Read attributes for this image definition 345cdf0e10cSrcweir for ( sal_Int16 n = 0; n < xAttribs->getLength(); n++ ) 346cdf0e10cSrcweir { 347cdf0e10cSrcweir pImageEntry = m_aImageMap.find( xAttribs->getNameByIndex( n ) ); 348cdf0e10cSrcweir if ( pImageEntry != m_aImageMap.end() ) 349cdf0e10cSrcweir { 350cdf0e10cSrcweir switch ( pImageEntry->second ) 351cdf0e10cSrcweir { 352cdf0e10cSrcweir case IMG_ATTRIBUTE_COMMAND: 353cdf0e10cSrcweir { 354cdf0e10cSrcweir pItem->aCommandURL = xAttribs->getValueByIndex( n ); 355cdf0e10cSrcweir } 356cdf0e10cSrcweir break; 357cdf0e10cSrcweir 358cdf0e10cSrcweir case IMG_ATTRIBUTE_BITMAPINDEX: 359cdf0e10cSrcweir { 360cdf0e10cSrcweir pItem->nIndex = xAttribs->getValueByIndex( n ).toInt32(); 361cdf0e10cSrcweir } 362cdf0e10cSrcweir break; 363cdf0e10cSrcweir 364cdf0e10cSrcweir default: 365cdf0e10cSrcweir break; 366cdf0e10cSrcweir } 367cdf0e10cSrcweir } 368cdf0e10cSrcweir } 369cdf0e10cSrcweir 370cdf0e10cSrcweir // Check required attribute "bitmap-index" 371cdf0e10cSrcweir if ( pItem->nIndex < 0 ) 372cdf0e10cSrcweir { 373cdf0e10cSrcweir delete pItem; 374cdf0e10cSrcweir delete m_pImages; 375cdf0e10cSrcweir m_pImages = NULL; 376cdf0e10cSrcweir 377cdf0e10cSrcweir ::rtl::OUString aErrorMessage = getErrorLineString(); 378cdf0e10cSrcweir aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Required attribute 'image:bitmap-index' must have a value >= 0!" )); 379cdf0e10cSrcweir throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 380cdf0e10cSrcweir } 381cdf0e10cSrcweir 382cdf0e10cSrcweir // Check required attribute "command" 383cdf0e10cSrcweir if ( pItem->aCommandURL.Len() == 0 ) 384cdf0e10cSrcweir { 385cdf0e10cSrcweir delete pItem; 386cdf0e10cSrcweir delete m_pImages; 387cdf0e10cSrcweir m_pImages = NULL; 388cdf0e10cSrcweir 389cdf0e10cSrcweir ::rtl::OUString aErrorMessage = getErrorLineString(); 390cdf0e10cSrcweir aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Required attribute 'image:command' must have a value!" )); 391cdf0e10cSrcweir throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 392cdf0e10cSrcweir } 393cdf0e10cSrcweir 394cdf0e10cSrcweir if ( m_pImages ) 395cdf0e10cSrcweir m_pImages->pImageItemList->Insert( pItem, m_pImages->pImageItemList->Count() ); 396cdf0e10cSrcweir } 397cdf0e10cSrcweir break; 398cdf0e10cSrcweir 399cdf0e10cSrcweir case IMG_ELEMENT_EXTERNALIMAGES: 400cdf0e10cSrcweir { 401*07a3d7f1SPedro Giffuni // Check that image:externalimages is embedded into image:imagecontainer 402cdf0e10cSrcweir if ( !m_bImageContainerStartFound ) 403cdf0e10cSrcweir { 404cdf0e10cSrcweir delete m_pImages; 405cdf0e10cSrcweir m_pImages = NULL; 406cdf0e10cSrcweir 407cdf0e10cSrcweir ::rtl::OUString aErrorMessage = getErrorLineString(); 408*07a3d7f1SPedro Giffuni aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'image:externalimages' must be embedded into element 'image:imagecontainer'!" )); 409cdf0e10cSrcweir throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 410cdf0e10cSrcweir } 411cdf0e10cSrcweir 412*07a3d7f1SPedro Giffuni // Check that image:externalentry is NOT embedded into image:externalentry 413cdf0e10cSrcweir if ( m_bExternalImagesStartFound ) 414cdf0e10cSrcweir { 415cdf0e10cSrcweir delete m_pImages; 416cdf0e10cSrcweir m_pImages = NULL; 417cdf0e10cSrcweir 418cdf0e10cSrcweir ::rtl::OUString aErrorMessage = getErrorLineString(); 419*07a3d7f1SPedro Giffuni aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'image:externalimages' cannot be embedded into 'image:externalimages'!" )); 420cdf0e10cSrcweir throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 421cdf0e10cSrcweir } 422cdf0e10cSrcweir 423cdf0e10cSrcweir // Create unique external image container 424cdf0e10cSrcweir m_bExternalImagesStartFound = sal_True; 425cdf0e10cSrcweir m_pExternalImages = new ExternalImageItemListDescriptor; 426cdf0e10cSrcweir } 427cdf0e10cSrcweir break; 428cdf0e10cSrcweir 429cdf0e10cSrcweir case IMG_ELEMENT_EXTERNALENTRY: 430cdf0e10cSrcweir { 431cdf0e10cSrcweir if ( !m_bExternalImagesStartFound ) 432cdf0e10cSrcweir { 433cdf0e10cSrcweir delete m_pImages; 434cdf0e10cSrcweir delete m_pExternalImages; 435cdf0e10cSrcweir m_pImages = NULL; 436cdf0e10cSrcweir m_pExternalImages = NULL; 437cdf0e10cSrcweir 438cdf0e10cSrcweir ::rtl::OUString aErrorMessage = getErrorLineString(); 439*07a3d7f1SPedro Giffuni aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'image:externalentry' must be embedded into 'image:externalimages'!" )); 440cdf0e10cSrcweir throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 441cdf0e10cSrcweir } 442cdf0e10cSrcweir 443cdf0e10cSrcweir if ( m_bExternalImageStartFound ) 444cdf0e10cSrcweir { 445cdf0e10cSrcweir delete m_pImages; 446cdf0e10cSrcweir delete m_pExternalImages; 447cdf0e10cSrcweir m_pImages = NULL; 448cdf0e10cSrcweir m_pExternalImages = NULL; 449cdf0e10cSrcweir 450cdf0e10cSrcweir ::rtl::OUString aErrorMessage = getErrorLineString(); 451*07a3d7f1SPedro Giffuni aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'image:externalentry' cannot be embedded into 'image:externalentry'!" )); 452cdf0e10cSrcweir throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 453cdf0e10cSrcweir } 454cdf0e10cSrcweir 455cdf0e10cSrcweir m_bExternalImageStartFound = sal_True; 456cdf0e10cSrcweir 457cdf0e10cSrcweir ExternalImageItemDescriptor* pItem = new ExternalImageItemDescriptor; 458cdf0e10cSrcweir 459cdf0e10cSrcweir // Read attributes for this external image definition 460cdf0e10cSrcweir for ( sal_Int16 n = 0; n < xAttribs->getLength(); n++ ) 461cdf0e10cSrcweir { 462cdf0e10cSrcweir pImageEntry = m_aImageMap.find( xAttribs->getNameByIndex( n ) ); 463cdf0e10cSrcweir if ( pImageEntry != m_aImageMap.end() ) 464cdf0e10cSrcweir { 465cdf0e10cSrcweir switch ( pImageEntry->second ) 466cdf0e10cSrcweir { 467cdf0e10cSrcweir case IMG_ATTRIBUTE_COMMAND: 468cdf0e10cSrcweir { 469cdf0e10cSrcweir pItem->aCommandURL = xAttribs->getValueByIndex( n ); 470cdf0e10cSrcweir } 471cdf0e10cSrcweir break; 472cdf0e10cSrcweir 473cdf0e10cSrcweir case IMG_ATTRIBUTE_HREF: 474cdf0e10cSrcweir { 475cdf0e10cSrcweir pItem->aURL = xAttribs->getValueByIndex( n ); 476cdf0e10cSrcweir } 477cdf0e10cSrcweir break; 478cdf0e10cSrcweir 479cdf0e10cSrcweir default: 480cdf0e10cSrcweir break; 481cdf0e10cSrcweir } 482cdf0e10cSrcweir } 483cdf0e10cSrcweir } 484cdf0e10cSrcweir 485cdf0e10cSrcweir // Check required attribute "command" 486cdf0e10cSrcweir if ( pItem->aCommandURL.Len() == 0 ) 487cdf0e10cSrcweir { 488cdf0e10cSrcweir delete pItem; 489cdf0e10cSrcweir delete m_pImages; 490cdf0e10cSrcweir delete m_pExternalImages; 491cdf0e10cSrcweir m_pImages = NULL; 492cdf0e10cSrcweir m_pExternalImages = NULL; 493cdf0e10cSrcweir 494cdf0e10cSrcweir ::rtl::OUString aErrorMessage = getErrorLineString(); 495cdf0e10cSrcweir aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Required attribute 'image:command' must have a value!" )); 496cdf0e10cSrcweir throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 497cdf0e10cSrcweir } 498cdf0e10cSrcweir 499cdf0e10cSrcweir // Check required attribute "href" 500cdf0e10cSrcweir if ( pItem->aURL.Len() == 0 ) 501cdf0e10cSrcweir { 502cdf0e10cSrcweir delete pItem; 503cdf0e10cSrcweir delete m_pImages; 504cdf0e10cSrcweir delete m_pExternalImages; 505cdf0e10cSrcweir m_pImages = NULL; 506cdf0e10cSrcweir m_pExternalImages = NULL; 507cdf0e10cSrcweir 508cdf0e10cSrcweir ::rtl::OUString aErrorMessage = getErrorLineString(); 509cdf0e10cSrcweir aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Required attribute 'xlink:href' must have a value!" )); 510cdf0e10cSrcweir throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 511cdf0e10cSrcweir } 512cdf0e10cSrcweir 513cdf0e10cSrcweir if ( m_pExternalImages ) 514cdf0e10cSrcweir m_pExternalImages->Insert( pItem, m_pExternalImages->Count() ); 515cdf0e10cSrcweir } 516cdf0e10cSrcweir break; 517cdf0e10cSrcweir 518cdf0e10cSrcweir default: 519cdf0e10cSrcweir break; 520cdf0e10cSrcweir } 521cdf0e10cSrcweir } 522cdf0e10cSrcweir } 523cdf0e10cSrcweir 524cdf0e10cSrcweir void SAL_CALL OReadImagesDocumentHandler::endElement(const ::rtl::OUString& aName) 525cdf0e10cSrcweir throw( SAXException, RuntimeException ) 526cdf0e10cSrcweir { 527cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 528cdf0e10cSrcweir 529cdf0e10cSrcweir ImageHashMap::const_iterator pImageEntry = m_aImageMap.find( aName ) ; 530cdf0e10cSrcweir if ( pImageEntry != m_aImageMap.end() ) 531cdf0e10cSrcweir { 532cdf0e10cSrcweir switch ( pImageEntry->second ) 533cdf0e10cSrcweir { 534cdf0e10cSrcweir case IMG_ELEMENT_IMAGECONTAINER: 535cdf0e10cSrcweir { 536cdf0e10cSrcweir m_bImageContainerEndFound = sal_True; 537cdf0e10cSrcweir } 538cdf0e10cSrcweir break; 539cdf0e10cSrcweir 540cdf0e10cSrcweir case IMG_ELEMENT_IMAGES: 541cdf0e10cSrcweir { 542cdf0e10cSrcweir if ( m_pImages ) 543cdf0e10cSrcweir { 544cdf0e10cSrcweir if ( m_aImageList.pImageList ) 545cdf0e10cSrcweir m_aImageList.pImageList->Insert( m_pImages, m_aImageList.pImageList->Count() ); 546cdf0e10cSrcweir m_pImages = NULL; 547cdf0e10cSrcweir } 548cdf0e10cSrcweir m_bImagesStartFound = sal_False; 549cdf0e10cSrcweir } 550cdf0e10cSrcweir break; 551cdf0e10cSrcweir 552cdf0e10cSrcweir case IMG_ELEMENT_ENTRY: 553cdf0e10cSrcweir { 554cdf0e10cSrcweir m_bImageStartFound = sal_False; 555cdf0e10cSrcweir } 556cdf0e10cSrcweir break; 557cdf0e10cSrcweir 558cdf0e10cSrcweir case IMG_ELEMENT_EXTERNALIMAGES: 559cdf0e10cSrcweir { 560cdf0e10cSrcweir if ( m_pExternalImages && !m_aImageList.pExternalImageList ) 561cdf0e10cSrcweir { 562cdf0e10cSrcweir if ( !m_aImageList.pExternalImageList ) 563cdf0e10cSrcweir m_aImageList.pExternalImageList = m_pExternalImages; 564cdf0e10cSrcweir } 565cdf0e10cSrcweir 566cdf0e10cSrcweir m_bExternalImagesStartFound = sal_False; 567cdf0e10cSrcweir m_pExternalImages = NULL; 568cdf0e10cSrcweir } 569cdf0e10cSrcweir break; 570cdf0e10cSrcweir 571cdf0e10cSrcweir case IMG_ELEMENT_EXTERNALENTRY: 572cdf0e10cSrcweir { 573cdf0e10cSrcweir m_bExternalImageStartFound = sal_False; 574cdf0e10cSrcweir } 575cdf0e10cSrcweir break; 576cdf0e10cSrcweir 577cdf0e10cSrcweir default: 578cdf0e10cSrcweir break; 579cdf0e10cSrcweir } 580cdf0e10cSrcweir } 581cdf0e10cSrcweir } 582cdf0e10cSrcweir 583cdf0e10cSrcweir void SAL_CALL OReadImagesDocumentHandler::characters(const ::rtl::OUString&) 584cdf0e10cSrcweir throw( SAXException, RuntimeException ) 585cdf0e10cSrcweir { 586cdf0e10cSrcweir } 587cdf0e10cSrcweir 588cdf0e10cSrcweir void SAL_CALL OReadImagesDocumentHandler::ignorableWhitespace(const ::rtl::OUString&) 589cdf0e10cSrcweir throw( SAXException, RuntimeException ) 590cdf0e10cSrcweir { 591cdf0e10cSrcweir } 592cdf0e10cSrcweir 593cdf0e10cSrcweir void SAL_CALL OReadImagesDocumentHandler::processingInstruction( 594cdf0e10cSrcweir const ::rtl::OUString& /*aTarget*/, const ::rtl::OUString& /*aData*/ ) 595cdf0e10cSrcweir throw( SAXException, RuntimeException ) 596cdf0e10cSrcweir { 597cdf0e10cSrcweir } 598cdf0e10cSrcweir 599cdf0e10cSrcweir void SAL_CALL OReadImagesDocumentHandler::setDocumentLocator( 600cdf0e10cSrcweir const Reference< XLocator > &xLocator) 601cdf0e10cSrcweir throw( SAXException, RuntimeException ) 602cdf0e10cSrcweir { 603cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 604cdf0e10cSrcweir 605cdf0e10cSrcweir m_xLocator = xLocator; 606cdf0e10cSrcweir } 607cdf0e10cSrcweir 608cdf0e10cSrcweir ::rtl::OUString OReadImagesDocumentHandler::getErrorLineString() 609cdf0e10cSrcweir { 610cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 611cdf0e10cSrcweir 612cdf0e10cSrcweir char buffer[32]; 613cdf0e10cSrcweir 614cdf0e10cSrcweir if ( m_xLocator.is() ) 615cdf0e10cSrcweir { 616cdf0e10cSrcweir snprintf( buffer, sizeof(buffer), "Line: %ld - ", static_cast<long>( m_xLocator->getLineNumber() )); 617cdf0e10cSrcweir return ::rtl::OUString::createFromAscii( buffer ); 618cdf0e10cSrcweir } 619cdf0e10cSrcweir else 620cdf0e10cSrcweir return ::rtl::OUString(); 621cdf0e10cSrcweir } 622cdf0e10cSrcweir 623cdf0e10cSrcweir 624cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 625cdf0e10cSrcweir // OWriteImagesDocumentHandler 626cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 627cdf0e10cSrcweir 628cdf0e10cSrcweir OWriteImagesDocumentHandler::OWriteImagesDocumentHandler( 629cdf0e10cSrcweir const ImageListsDescriptor& aItems, 630cdf0e10cSrcweir Reference< XDocumentHandler > rWriteDocumentHandler ) : 631cdf0e10cSrcweir ThreadHelpBase( &Application::GetSolarMutex() ), 632cdf0e10cSrcweir m_aImageListsItems( aItems ), 633cdf0e10cSrcweir m_xWriteDocumentHandler( rWriteDocumentHandler ) 634cdf0e10cSrcweir { 635cdf0e10cSrcweir ::comphelper::AttributeList* pList = new ::comphelper::AttributeList; 636cdf0e10cSrcweir m_xEmptyList = Reference< XAttributeList >( (XAttributeList *) pList, UNO_QUERY ); 637cdf0e10cSrcweir m_aAttributeType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_TYPE_CDATA )); 638cdf0e10cSrcweir m_aXMLImageNS = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_IMAGE_PREFIX )); 639cdf0e10cSrcweir m_aXMLXlinkNS = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK_PREFIX )); 640cdf0e10cSrcweir m_aAttributeXlinkType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_XLINK_TYPE )); 641cdf0e10cSrcweir m_aAttributeValueSimple = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_XLINK_TYPE_VALUE )); 642cdf0e10cSrcweir } 643cdf0e10cSrcweir 644cdf0e10cSrcweir OWriteImagesDocumentHandler::~OWriteImagesDocumentHandler() 645cdf0e10cSrcweir { 646cdf0e10cSrcweir } 647cdf0e10cSrcweir 648cdf0e10cSrcweir void OWriteImagesDocumentHandler::WriteImagesDocument() throw 649cdf0e10cSrcweir ( SAXException, RuntimeException ) 650cdf0e10cSrcweir { 651cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 652cdf0e10cSrcweir 653cdf0e10cSrcweir m_xWriteDocumentHandler->startDocument(); 654cdf0e10cSrcweir 655cdf0e10cSrcweir // write DOCTYPE line! 656cdf0e10cSrcweir Reference< XExtendedDocumentHandler > xExtendedDocHandler( m_xWriteDocumentHandler, UNO_QUERY ); 657cdf0e10cSrcweir if ( xExtendedDocHandler.is() ) 658cdf0e10cSrcweir { 659cdf0e10cSrcweir xExtendedDocHandler->unknown( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( IMAGES_DOCTYPE )) ); 660cdf0e10cSrcweir m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 661cdf0e10cSrcweir } 662cdf0e10cSrcweir 663cdf0e10cSrcweir ::comphelper::AttributeList* pList = new ::comphelper::AttributeList; 664cdf0e10cSrcweir Reference< XAttributeList > xList( (XAttributeList *) pList , UNO_QUERY ); 665cdf0e10cSrcweir 666cdf0e10cSrcweir pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_XMLNS_IMAGE )), 667cdf0e10cSrcweir m_aAttributeType, 668cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_IMAGE )) ); 669cdf0e10cSrcweir 670cdf0e10cSrcweir pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_XMLNS_XLINK )), 671cdf0e10cSrcweir m_aAttributeType, 672cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK )) ); 673cdf0e10cSrcweir 674cdf0e10cSrcweir m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_IMAGESCONTAINER )), pList ); 675cdf0e10cSrcweir m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 676cdf0e10cSrcweir 677cdf0e10cSrcweir if ( m_aImageListsItems.pImageList ) 678cdf0e10cSrcweir { 679cdf0e10cSrcweir ImageListDescriptor* pImageList = m_aImageListsItems.pImageList; 680cdf0e10cSrcweir 681cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < m_aImageListsItems.pImageList->Count(); i++ ) 682cdf0e10cSrcweir { 683cdf0e10cSrcweir const ImageListItemDescriptor* pImageItems = (*pImageList)[i]; 684cdf0e10cSrcweir WriteImageList( pImageItems ); 685cdf0e10cSrcweir } 686cdf0e10cSrcweir } 687cdf0e10cSrcweir 688cdf0e10cSrcweir if ( m_aImageListsItems.pExternalImageList ) 689cdf0e10cSrcweir { 690cdf0e10cSrcweir WriteExternalImageList( m_aImageListsItems.pExternalImageList ); 691cdf0e10cSrcweir } 692cdf0e10cSrcweir 693cdf0e10cSrcweir m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 694cdf0e10cSrcweir m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_IMAGESCONTAINER )) ); 695cdf0e10cSrcweir m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 696cdf0e10cSrcweir m_xWriteDocumentHandler->endDocument(); 697cdf0e10cSrcweir } 698cdf0e10cSrcweir 699cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 700cdf0e10cSrcweir // protected member functions 701cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 702cdf0e10cSrcweir 703cdf0e10cSrcweir void OWriteImagesDocumentHandler::WriteImageList( const ImageListItemDescriptor* pImageList ) throw 704cdf0e10cSrcweir ( SAXException, RuntimeException ) 705cdf0e10cSrcweir { 706cdf0e10cSrcweir ::comphelper::AttributeList* pList = new ::comphelper::AttributeList; 707cdf0e10cSrcweir Reference< XAttributeList > xList( (XAttributeList *) pList , UNO_QUERY ); 708cdf0e10cSrcweir 709cdf0e10cSrcweir // save required attributes 710cdf0e10cSrcweir pList->AddAttribute( m_aAttributeXlinkType, 711cdf0e10cSrcweir m_aAttributeType, 712cdf0e10cSrcweir m_aAttributeValueSimple ); 713cdf0e10cSrcweir 714cdf0e10cSrcweir pList->AddAttribute( m_aXMLXlinkNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_HREF )), 715cdf0e10cSrcweir m_aAttributeType, 716cdf0e10cSrcweir pImageList->aURL ); 717cdf0e10cSrcweir 718cdf0e10cSrcweir if ( pImageList->nMaskMode == ImageMaskMode_Bitmap ) 719cdf0e10cSrcweir { 720cdf0e10cSrcweir pList->AddAttribute( m_aXMLImageNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_MASKMODE )), 721cdf0e10cSrcweir m_aAttributeType, 722cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_MASKMODE_BITMAP )) ); 723cdf0e10cSrcweir 724cdf0e10cSrcweir pList->AddAttribute( m_aXMLImageNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_MASKURL )), 725cdf0e10cSrcweir m_aAttributeType, 726cdf0e10cSrcweir pImageList->aMaskURL ); 727cdf0e10cSrcweir 728cdf0e10cSrcweir if ( pImageList->aHighContrastMaskURL.Len() > 0 ) 729cdf0e10cSrcweir { 730cdf0e10cSrcweir pList->AddAttribute( m_aXMLImageNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_HIGHCONTRASTMASKURL )), 731cdf0e10cSrcweir m_aAttributeType, 732cdf0e10cSrcweir pImageList->aHighContrastMaskURL ); 733cdf0e10cSrcweir } 734cdf0e10cSrcweir } 735cdf0e10cSrcweir else 736cdf0e10cSrcweir { 737cdf0e10cSrcweir ::rtl::OUStringBuffer aColorStrBuffer( 8 ); 738cdf0e10cSrcweir sal_Int64 nValue = pImageList->aMaskColor.GetRGBColor(); 739cdf0e10cSrcweir 740cdf0e10cSrcweir aColorStrBuffer.appendAscii( "#" ); 741cdf0e10cSrcweir aColorStrBuffer.append( ::rtl::OUString::valueOf( nValue, 16 )); 742cdf0e10cSrcweir 743cdf0e10cSrcweir pList->AddAttribute( m_aXMLImageNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_MASKCOLOR )), 744cdf0e10cSrcweir m_aAttributeType, 745cdf0e10cSrcweir aColorStrBuffer.makeStringAndClear() ); 746cdf0e10cSrcweir 747cdf0e10cSrcweir pList->AddAttribute( m_aXMLImageNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_MASKMODE )), 748cdf0e10cSrcweir m_aAttributeType, 749cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_MASKMODE_COLOR )) ); 750cdf0e10cSrcweir } 751cdf0e10cSrcweir 752cdf0e10cSrcweir if ( pImageList->aHighContrastURL.Len() > 0 ) 753cdf0e10cSrcweir { 754cdf0e10cSrcweir pList->AddAttribute( m_aXMLImageNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_HIGHCONTRASTURL )), 755cdf0e10cSrcweir m_aAttributeType, 756cdf0e10cSrcweir pImageList->aHighContrastURL ); 757cdf0e10cSrcweir } 758cdf0e10cSrcweir 759cdf0e10cSrcweir m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_IMAGES )), xList ); 760cdf0e10cSrcweir m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 761cdf0e10cSrcweir 762cdf0e10cSrcweir ImageItemListDescriptor* pImageItemList = pImageList->pImageItemList; 763cdf0e10cSrcweir if ( pImageItemList ) 764cdf0e10cSrcweir { 765cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < pImageItemList->Count(); i++ ) 766cdf0e10cSrcweir WriteImage( (*pImageItemList)[i] ); 767cdf0e10cSrcweir } 768cdf0e10cSrcweir 769cdf0e10cSrcweir m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_IMAGES )) ); 770cdf0e10cSrcweir m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 771cdf0e10cSrcweir } 772cdf0e10cSrcweir 773cdf0e10cSrcweir void OWriteImagesDocumentHandler::WriteImage( const ImageItemDescriptor* pImage ) throw 774cdf0e10cSrcweir ( SAXException, RuntimeException ) 775cdf0e10cSrcweir { 776cdf0e10cSrcweir ::comphelper::AttributeList* pList = new ::comphelper::AttributeList; 777cdf0e10cSrcweir Reference< XAttributeList > xList( (XAttributeList *) pList , UNO_QUERY ); 778cdf0e10cSrcweir 779cdf0e10cSrcweir pList->AddAttribute( m_aXMLImageNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_BITMAPINDEX )), 780cdf0e10cSrcweir m_aAttributeType, 781cdf0e10cSrcweir ::rtl::OUString::valueOf( (sal_Int32)pImage->nIndex ) ); 782cdf0e10cSrcweir 783cdf0e10cSrcweir pList->AddAttribute( m_aXMLImageNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_COMMAND )), 784cdf0e10cSrcweir m_aAttributeType, 785cdf0e10cSrcweir pImage->aCommandURL ); 786cdf0e10cSrcweir 787cdf0e10cSrcweir m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_ENTRY )), xList ); 788cdf0e10cSrcweir m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 789cdf0e10cSrcweir 790cdf0e10cSrcweir m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_ENTRY )) ); 791cdf0e10cSrcweir m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 792cdf0e10cSrcweir } 793cdf0e10cSrcweir 794cdf0e10cSrcweir void OWriteImagesDocumentHandler::WriteExternalImageList( const ExternalImageItemListDescriptor* pExternalImageList ) throw 795cdf0e10cSrcweir ( SAXException, RuntimeException ) 796cdf0e10cSrcweir { 797cdf0e10cSrcweir m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_EXTERNALIMAGES )), m_xEmptyList ); 798cdf0e10cSrcweir m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 799cdf0e10cSrcweir 800cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < pExternalImageList->Count(); i++ ) 801cdf0e10cSrcweir { 802cdf0e10cSrcweir ExternalImageItemDescriptor* pItem = (*pExternalImageList)[i]; 803cdf0e10cSrcweir WriteExternalImage( pItem ); 804cdf0e10cSrcweir } 805cdf0e10cSrcweir 806cdf0e10cSrcweir m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 807cdf0e10cSrcweir m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_EXTERNALIMAGES )) ); 808cdf0e10cSrcweir m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 809cdf0e10cSrcweir } 810cdf0e10cSrcweir 811cdf0e10cSrcweir void OWriteImagesDocumentHandler::WriteExternalImage( const ExternalImageItemDescriptor* pExternalImage ) throw 812cdf0e10cSrcweir ( SAXException, RuntimeException ) 813cdf0e10cSrcweir { 814cdf0e10cSrcweir ::comphelper::AttributeList* pList = new ::comphelper::AttributeList; 815cdf0e10cSrcweir Reference< XAttributeList > xList( (XAttributeList *) pList , UNO_QUERY ); 816cdf0e10cSrcweir 817cdf0e10cSrcweir // save required attributes 818cdf0e10cSrcweir pList->AddAttribute( m_aAttributeXlinkType, 819cdf0e10cSrcweir m_aAttributeType, 820cdf0e10cSrcweir m_aAttributeValueSimple ); 821cdf0e10cSrcweir 822cdf0e10cSrcweir if ( pExternalImage->aURL.Len() > 0 ) 823cdf0e10cSrcweir { 824cdf0e10cSrcweir pList->AddAttribute( m_aXMLXlinkNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_HREF )), 825cdf0e10cSrcweir m_aAttributeType, 826cdf0e10cSrcweir pExternalImage->aURL ); 827cdf0e10cSrcweir } 828cdf0e10cSrcweir 829cdf0e10cSrcweir if ( pExternalImage->aCommandURL.Len() > 0 ) 830cdf0e10cSrcweir { 831cdf0e10cSrcweir pList->AddAttribute( m_aXMLImageNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_COMMAND )), 832cdf0e10cSrcweir m_aAttributeType, 833cdf0e10cSrcweir pExternalImage->aCommandURL ); 834cdf0e10cSrcweir } 835cdf0e10cSrcweir 836cdf0e10cSrcweir m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_EXTERNALENTRY )), xList ); 837cdf0e10cSrcweir m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 838cdf0e10cSrcweir 839cdf0e10cSrcweir m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_EXTERNALENTRY )) ); 840cdf0e10cSrcweir m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 841cdf0e10cSrcweir } 842cdf0e10cSrcweir 843cdf0e10cSrcweir } // namespace framework 844cdf0e10cSrcweir 845cdf0e10cSrcweir 846cdf0e10cSrcweir 847cdf0e10cSrcweir 848