1d0626817SAndrew Rist /**************************************************************
2*e27da661Smseidel  *
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
10*e27da661Smseidel  *
11d0626817SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*e27da661Smseidel  *
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.
19*e27da661Smseidel  *
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				},
120*e27da661Smseidel 	{ OReadImagesDocumentHandler::IMG_NS_IMAGE, ATTRIBUTE_BITMAPINDEX			},
121*e27da661Smseidel 	{ OReadImagesDocumentHandler::IMG_NS_IMAGE, ATTRIBUTE_MASKURL				},
122*e27da661Smseidel 	{ OReadImagesDocumentHandler::IMG_NS_IMAGE, ATTRIBUTE_MASKMODE				},
123cdf0e10cSrcweir 	{ OReadImagesDocumentHandler::IMG_NS_IMAGE, ATTRIBUTE_HIGHCONTRASTURL		},
124cdf0e10cSrcweir 	{ OReadImagesDocumentHandler::IMG_NS_IMAGE, ATTRIBUTE_HIGHCONTRASTMASKURL	}
125cdf0e10cSrcweir };
126cdf0e10cSrcweir 
127cdf0e10cSrcweir 
OReadImagesDocumentHandler(ImageListsDescriptor & aItems)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 
~OReadImagesDocumentHandler()166cdf0e10cSrcweir OReadImagesDocumentHandler::~OReadImagesDocumentHandler()
167cdf0e10cSrcweir {
168cdf0e10cSrcweir }
169cdf0e10cSrcweir 
170cdf0e10cSrcweir // XDocumentHandler
startDocument(void)171cdf0e10cSrcweir void SAL_CALL OReadImagesDocumentHandler::startDocument(void)
172cdf0e10cSrcweir throw (	SAXException, RuntimeException )
173cdf0e10cSrcweir {
174cdf0e10cSrcweir }
175cdf0e10cSrcweir 
endDocument(void)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 
startElement(const::rtl::OUString & aName,const Reference<XAttributeList> & xAttribs)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();
20707a3d7f1SPedro 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();
22007a3d7f1SPedro 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();
22707a3d7f1SPedro 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 									{
258*e27da661Smseidel 										// the color value is given as #rrggbb and uses 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 			{
32407a3d7f1SPedro 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();
33107a3d7f1SPedro 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 			{
40107a3d7f1SPedro 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();
40807a3d7f1SPedro 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 
41207a3d7f1SPedro 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();
41907a3d7f1SPedro 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();
43907a3d7f1SPedro 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();
45107a3d7f1SPedro 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 
endElement(const::rtl::OUString & aName)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 
characters(const::rtl::OUString &)583cdf0e10cSrcweir void SAL_CALL OReadImagesDocumentHandler::characters(const ::rtl::OUString&)
584cdf0e10cSrcweir throw(	SAXException, RuntimeException )
585cdf0e10cSrcweir {
586cdf0e10cSrcweir }
587cdf0e10cSrcweir 
ignorableWhitespace(const::rtl::OUString &)588cdf0e10cSrcweir void SAL_CALL OReadImagesDocumentHandler::ignorableWhitespace(const ::rtl::OUString&)
589cdf0e10cSrcweir throw(	SAXException, RuntimeException )
590cdf0e10cSrcweir {
591cdf0e10cSrcweir }
592cdf0e10cSrcweir 
processingInstruction(const::rtl::OUString &,const::rtl::OUString &)593cdf0e10cSrcweir void SAL_CALL OReadImagesDocumentHandler::processingInstruction(
594cdf0e10cSrcweir 	const ::rtl::OUString& /*aTarget*/, const ::rtl::OUString& /*aData*/ )
595cdf0e10cSrcweir throw(	SAXException, RuntimeException )
596cdf0e10cSrcweir {
597cdf0e10cSrcweir }
598cdf0e10cSrcweir 
setDocumentLocator(const Reference<XLocator> & xLocator)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 
getErrorLineString()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 
OWriteImagesDocumentHandler(const ImageListsDescriptor & aItems,Reference<XDocumentHandler> rWriteDocumentHandler)628cdf0e10cSrcweir OWriteImagesDocumentHandler::OWriteImagesDocumentHandler(
629cdf0e10cSrcweir 	const ImageListsDescriptor& aItems,
630cdf0e10cSrcweir 	Reference< XDocumentHandler > rWriteDocumentHandler ) :
631*e27da661Smseidel 	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 
~OWriteImagesDocumentHandler()644cdf0e10cSrcweir OWriteImagesDocumentHandler::~OWriteImagesDocumentHandler()
645cdf0e10cSrcweir {
646cdf0e10cSrcweir }
647cdf0e10cSrcweir 
WriteImagesDocument()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 
WriteImageList(const ImageListItemDescriptor * pImageList)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 
709*e27da661Smseidel 	// 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 
759*e27da661Smseidel 	m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_IMAGES )), xList );
760*e27da661Smseidel 	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 
WriteImage(const ImageItemDescriptor * pImage)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 
WriteExternalImageList(const ExternalImageItemListDescriptor * pExternalImageList)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 
WriteExternalImage(const ExternalImageItemDescriptor * pExternalImage)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 
817*e27da661Smseidel 	// 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 
845