xref: /aoo42x/main/svtools/source/misc/imap2.cxx (revision 5900e8ec)
1*5900e8ecSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*5900e8ecSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*5900e8ecSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*5900e8ecSAndrew Rist  * distributed with this work for additional information
6*5900e8ecSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*5900e8ecSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*5900e8ecSAndrew Rist  * "License"); you may not use this file except in compliance
9*5900e8ecSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*5900e8ecSAndrew Rist  *
11*5900e8ecSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*5900e8ecSAndrew Rist  *
13*5900e8ecSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*5900e8ecSAndrew Rist  * software distributed under the License is distributed on an
15*5900e8ecSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5900e8ecSAndrew Rist  * KIND, either express or implied.  See the License for the
17*5900e8ecSAndrew Rist  * specific language governing permissions and limitations
18*5900e8ecSAndrew Rist  * under the License.
19*5900e8ecSAndrew Rist  *
20*5900e8ecSAndrew Rist  *************************************************************/
21*5900e8ecSAndrew Rist 
22*5900e8ecSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svtools.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <string.h>
28cdf0e10cSrcweir // #include <math.h>
29cdf0e10cSrcweir #include <vcl/svapp.hxx>
30cdf0e10cSrcweir #include <tools/urlobj.hxx>
31cdf0e10cSrcweir #ifndef _WRKWIN_HXX //autogen
32cdf0e10cSrcweir #include <vcl/wrkwin.hxx>
33cdf0e10cSrcweir #endif
34cdf0e10cSrcweir #include <sot/formats.hxx>
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #include "svl/urihelper.hxx"
37cdf0e10cSrcweir #include <svtools/imap.hxx>
38cdf0e10cSrcweir #include <svtools/imap.hxx>
39cdf0e10cSrcweir #include <svtools/imapobj.hxx>
40cdf0e10cSrcweir #include <svtools/imaprect.hxx>
41cdf0e10cSrcweir #include <svtools/imapcirc.hxx>
42cdf0e10cSrcweir #include <svtools/imappoly.hxx>
43cdf0e10cSrcweir 
44cdf0e10cSrcweir #include <string.h>
45cdf0e10cSrcweir #include <math.h>
46cdf0e10cSrcweir 
47cdf0e10cSrcweir #define NOTEOL(c) ((c)!='\0')
48cdf0e10cSrcweir 
49cdf0e10cSrcweir 
50cdf0e10cSrcweir TYPEINIT0_AUTOFACTORY( ImageMap );
51cdf0e10cSrcweir 
52cdf0e10cSrcweir 
53cdf0e10cSrcweir /******************************************************************************/
54cdf0e10cSrcweir /******************************************************************************/
55cdf0e10cSrcweir 
56cdf0e10cSrcweir 
57cdf0e10cSrcweir /******************************************************************************
58cdf0e10cSrcweir |*
59cdf0e10cSrcweir |*
60cdf0e10cSrcweir |*
61cdf0e10cSrcweir \******************************************************************************/
62cdf0e10cSrcweir 
AppendCERNCoords(const Point & rPoint100,ByteString & rStr) const63cdf0e10cSrcweir void IMapObject::AppendCERNCoords( const Point& rPoint100, ByteString& rStr ) const
64cdf0e10cSrcweir {
65cdf0e10cSrcweir 	const Point	aPixPt( Application::GetDefaultDevice()->LogicToPixel( rPoint100, MapMode( MAP_100TH_MM ) ) );
66cdf0e10cSrcweir 
67cdf0e10cSrcweir 	rStr += '(';
68cdf0e10cSrcweir 	rStr += ByteString::CreateFromInt32( aPixPt.X() );
69cdf0e10cSrcweir 	rStr += ',';
70cdf0e10cSrcweir 	rStr += ByteString::CreateFromInt32( aPixPt.Y() );
71cdf0e10cSrcweir 	rStr += ") ";
72cdf0e10cSrcweir }
73cdf0e10cSrcweir 
74cdf0e10cSrcweir 
75cdf0e10cSrcweir /******************************************************************************
76cdf0e10cSrcweir |*
77cdf0e10cSrcweir |*
78cdf0e10cSrcweir |*
79cdf0e10cSrcweir \******************************************************************************/
80cdf0e10cSrcweir 
AppendNCSACoords(const Point & rPoint100,ByteString & rStr) const81cdf0e10cSrcweir void IMapObject::AppendNCSACoords( const Point& rPoint100, ByteString& rStr ) const
82cdf0e10cSrcweir {
83cdf0e10cSrcweir 	const Point	aPixPt( Application::GetDefaultDevice()->LogicToPixel( rPoint100, MapMode( MAP_100TH_MM ) ) );
84cdf0e10cSrcweir 
85cdf0e10cSrcweir 	rStr += ByteString::CreateFromInt32( aPixPt.X() );
86cdf0e10cSrcweir 	rStr += ',';
87cdf0e10cSrcweir 	rStr += ByteString::CreateFromInt32( aPixPt.Y() );
88cdf0e10cSrcweir 	rStr += ' ';
89cdf0e10cSrcweir }
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 
92cdf0e10cSrcweir /******************************************************************************
93cdf0e10cSrcweir |*
94cdf0e10cSrcweir |*
95cdf0e10cSrcweir |*
96cdf0e10cSrcweir \******************************************************************************/
97cdf0e10cSrcweir 
AppendCERNURL(ByteString & rStr,const String & rBaseURL) const98cdf0e10cSrcweir void IMapObject::AppendCERNURL( ByteString& rStr, const String& rBaseURL ) const
99cdf0e10cSrcweir {
100cdf0e10cSrcweir     rStr += ByteString( String(URIHelper::simpleNormalizedMakeRelative( rBaseURL, aURL )), gsl_getSystemTextEncoding() );
101cdf0e10cSrcweir }
102cdf0e10cSrcweir 
103cdf0e10cSrcweir 
104cdf0e10cSrcweir /******************************************************************************
105cdf0e10cSrcweir |*
106cdf0e10cSrcweir |*
107cdf0e10cSrcweir |*
108cdf0e10cSrcweir \******************************************************************************/
109cdf0e10cSrcweir 
AppendNCSAURL(ByteString & rStr,const String & rBaseURL) const110cdf0e10cSrcweir void IMapObject::AppendNCSAURL( ByteString& rStr, const String& rBaseURL ) const
111cdf0e10cSrcweir {
112cdf0e10cSrcweir     rStr += ByteString( String(URIHelper::simpleNormalizedMakeRelative( rBaseURL, aURL )), gsl_getSystemTextEncoding() );
113cdf0e10cSrcweir 	rStr += ' ';
114cdf0e10cSrcweir }
115cdf0e10cSrcweir 
116cdf0e10cSrcweir 
117cdf0e10cSrcweir /******************************************************************************/
118cdf0e10cSrcweir /******************************************************************************/
119cdf0e10cSrcweir 
120cdf0e10cSrcweir 
121cdf0e10cSrcweir /******************************************************************************
122cdf0e10cSrcweir |*
123cdf0e10cSrcweir |*
124cdf0e10cSrcweir |*
125cdf0e10cSrcweir \******************************************************************************/
126cdf0e10cSrcweir 
WriteCERN(SvStream & rOStm,const String & rBaseURL) const127cdf0e10cSrcweir void IMapRectangleObject::WriteCERN( SvStream& rOStm, const String& rBaseURL ) const
128cdf0e10cSrcweir {
129cdf0e10cSrcweir 	ByteString aStr( "rectangle " );
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 	AppendCERNCoords( aRect.TopLeft(), aStr );
132cdf0e10cSrcweir 	AppendCERNCoords( aRect.BottomRight(), aStr );
133cdf0e10cSrcweir     AppendCERNURL( aStr, rBaseURL );
134cdf0e10cSrcweir 
135cdf0e10cSrcweir 	rOStm.WriteLine( aStr );
136cdf0e10cSrcweir }
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 
139cdf0e10cSrcweir /******************************************************************************
140cdf0e10cSrcweir |*
141cdf0e10cSrcweir |*
142cdf0e10cSrcweir |*
143cdf0e10cSrcweir \******************************************************************************/
144cdf0e10cSrcweir 
WriteNCSA(SvStream & rOStm,const String & rBaseURL) const145cdf0e10cSrcweir void IMapRectangleObject::WriteNCSA( SvStream& rOStm, const String& rBaseURL ) const
146cdf0e10cSrcweir {
147cdf0e10cSrcweir 	ByteString aStr( "rect " );
148cdf0e10cSrcweir 
149cdf0e10cSrcweir     AppendNCSAURL( aStr, rBaseURL );
150cdf0e10cSrcweir 	AppendNCSACoords( aRect.TopLeft(), aStr );
151cdf0e10cSrcweir 	AppendNCSACoords( aRect.BottomRight(), aStr );
152cdf0e10cSrcweir 
153cdf0e10cSrcweir 	rOStm.WriteLine( aStr );
154cdf0e10cSrcweir }
155cdf0e10cSrcweir 
156cdf0e10cSrcweir 
157cdf0e10cSrcweir /******************************************************************************/
158cdf0e10cSrcweir /******************************************************************************/
159cdf0e10cSrcweir 
160cdf0e10cSrcweir 
161cdf0e10cSrcweir /******************************************************************************
162cdf0e10cSrcweir |*
163cdf0e10cSrcweir |*
164cdf0e10cSrcweir |*
165cdf0e10cSrcweir \******************************************************************************/
166cdf0e10cSrcweir 
WriteCERN(SvStream & rOStm,const String & rBaseURL) const167cdf0e10cSrcweir void IMapCircleObject::WriteCERN( SvStream& rOStm, const String& rBaseURL ) const
168cdf0e10cSrcweir {
169cdf0e10cSrcweir 	ByteString aStr( "circle " );
170cdf0e10cSrcweir 
171cdf0e10cSrcweir 	AppendCERNCoords( aCenter, aStr );
172cdf0e10cSrcweir     aStr += ByteString::CreateFromInt32(nRadius);
173cdf0e10cSrcweir 	aStr += ' ';
174cdf0e10cSrcweir     AppendCERNURL( aStr, rBaseURL );
175cdf0e10cSrcweir 
176cdf0e10cSrcweir 	rOStm.WriteLine( aStr );
177cdf0e10cSrcweir }
178cdf0e10cSrcweir 
179cdf0e10cSrcweir 
180cdf0e10cSrcweir /******************************************************************************
181cdf0e10cSrcweir |*
182cdf0e10cSrcweir |*
183cdf0e10cSrcweir |*
184cdf0e10cSrcweir \******************************************************************************/
185cdf0e10cSrcweir 
WriteNCSA(SvStream & rOStm,const String & rBaseURL) const186cdf0e10cSrcweir void IMapCircleObject::WriteNCSA( SvStream& rOStm, const String& rBaseURL ) const
187cdf0e10cSrcweir {
188cdf0e10cSrcweir 	ByteString aStr( "circle " );
189cdf0e10cSrcweir 
190cdf0e10cSrcweir     AppendNCSAURL( aStr, rBaseURL );
191cdf0e10cSrcweir 	AppendNCSACoords( aCenter, aStr );
192cdf0e10cSrcweir 	AppendNCSACoords( aCenter + Point( nRadius, 0 ), aStr );
193cdf0e10cSrcweir 
194cdf0e10cSrcweir 	rOStm.WriteLine( aStr );
195cdf0e10cSrcweir }
196cdf0e10cSrcweir 
197cdf0e10cSrcweir 
198cdf0e10cSrcweir /******************************************************************************/
199cdf0e10cSrcweir /******************************************************************************/
200cdf0e10cSrcweir 
201cdf0e10cSrcweir 
202cdf0e10cSrcweir /******************************************************************************
203cdf0e10cSrcweir |*
204cdf0e10cSrcweir |*
205cdf0e10cSrcweir |*
206cdf0e10cSrcweir \******************************************************************************/
207cdf0e10cSrcweir 
WriteCERN(SvStream & rOStm,const String & rBaseURL) const208cdf0e10cSrcweir void IMapPolygonObject::WriteCERN( SvStream& rOStm, const String& rBaseURL  ) const
209cdf0e10cSrcweir {
210cdf0e10cSrcweir 	ByteString		aStr( "polygon " );
211cdf0e10cSrcweir 	const sal_uInt16	nCount = aPoly.GetSize();
212cdf0e10cSrcweir 
213cdf0e10cSrcweir 	for ( sal_uInt16 i = 0; i < nCount; i++ )
214cdf0e10cSrcweir 		AppendCERNCoords( aPoly[ i ], aStr );
215cdf0e10cSrcweir 
216cdf0e10cSrcweir     AppendCERNURL( aStr, rBaseURL );
217cdf0e10cSrcweir 
218cdf0e10cSrcweir 	rOStm.WriteLine( aStr );
219cdf0e10cSrcweir }
220cdf0e10cSrcweir 
221cdf0e10cSrcweir 
222cdf0e10cSrcweir /******************************************************************************
223cdf0e10cSrcweir |*
224cdf0e10cSrcweir |*
225cdf0e10cSrcweir |*
226cdf0e10cSrcweir \******************************************************************************/
227cdf0e10cSrcweir 
WriteNCSA(SvStream & rOStm,const String & rBaseURL) const228cdf0e10cSrcweir void IMapPolygonObject::WriteNCSA( SvStream& rOStm, const String& rBaseURL  ) const
229cdf0e10cSrcweir {
230cdf0e10cSrcweir 	ByteString		aStr( "poly " );
231cdf0e10cSrcweir 	const sal_uInt16	nCount = Min( aPoly.GetSize(), (sal_uInt16) 100 );
232cdf0e10cSrcweir 
233cdf0e10cSrcweir     AppendNCSAURL( aStr, rBaseURL );
234cdf0e10cSrcweir 
235cdf0e10cSrcweir 	for ( sal_uInt16 i = 0; i < nCount; i++ )
236cdf0e10cSrcweir 		AppendNCSACoords( aPoly[ i ], aStr );
237cdf0e10cSrcweir 
238cdf0e10cSrcweir 	rOStm.WriteLine( aStr );
239cdf0e10cSrcweir }
240cdf0e10cSrcweir 
241cdf0e10cSrcweir 
242cdf0e10cSrcweir /******************************************************************************/
243cdf0e10cSrcweir /******************************************************************************/
244cdf0e10cSrcweir 
245cdf0e10cSrcweir 
246cdf0e10cSrcweir /******************************************************************************
247cdf0e10cSrcweir |*
248cdf0e10cSrcweir |*
249cdf0e10cSrcweir |*
250cdf0e10cSrcweir \******************************************************************************/
251cdf0e10cSrcweir 
Write(SvStream & rOStm,sal_uLong nFormat,const String & rBaseURL) const252cdf0e10cSrcweir void ImageMap::Write( SvStream& rOStm, sal_uLong nFormat, const String& rBaseURL ) const
253cdf0e10cSrcweir {
254cdf0e10cSrcweir 	switch( nFormat )
255cdf0e10cSrcweir 	{
256cdf0e10cSrcweir         case( IMAP_FORMAT_BIN ) : Write( rOStm, rBaseURL );
257cdf0e10cSrcweir         case( IMAP_FORMAT_CERN ) : ImpWriteCERN( rOStm, rBaseURL ); break;
258cdf0e10cSrcweir         case( IMAP_FORMAT_NCSA ) : ImpWriteNCSA( rOStm, rBaseURL ); break;
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 		default:
261cdf0e10cSrcweir 		break;
262cdf0e10cSrcweir 	}
263cdf0e10cSrcweir }
264cdf0e10cSrcweir 
265cdf0e10cSrcweir 
266cdf0e10cSrcweir /******************************************************************************
267cdf0e10cSrcweir |*
268cdf0e10cSrcweir |*
269cdf0e10cSrcweir |*
270cdf0e10cSrcweir \******************************************************************************/
271cdf0e10cSrcweir 
ImpWriteCERN(SvStream & rOStm,const String & rBaseURL) const272cdf0e10cSrcweir void ImageMap::ImpWriteCERN( SvStream& rOStm, const String& rBaseURL ) const
273cdf0e10cSrcweir {
274cdf0e10cSrcweir 	IMapObject* pObj;
275cdf0e10cSrcweir 	sal_uInt16		nCount = (sal_uInt16) maList.Count();
276cdf0e10cSrcweir 
277cdf0e10cSrcweir 	for ( sal_uInt16 i = 0; i < nCount; i++ )
278cdf0e10cSrcweir 	{
279cdf0e10cSrcweir 		pObj = GetIMapObject( i );
280cdf0e10cSrcweir 
281cdf0e10cSrcweir 		switch( pObj->GetType() )
282cdf0e10cSrcweir 		{
283cdf0e10cSrcweir 			case( IMAP_OBJ_RECTANGLE ):
284cdf0e10cSrcweir                 ( (IMapRectangleObject*) pObj )->WriteCERN( rOStm, rBaseURL );
285cdf0e10cSrcweir 			break;
286cdf0e10cSrcweir 
287cdf0e10cSrcweir 			case( IMAP_OBJ_CIRCLE ):
288cdf0e10cSrcweir                 ( (IMapCircleObject*) pObj )->WriteCERN( rOStm, rBaseURL );
289cdf0e10cSrcweir 			break;
290cdf0e10cSrcweir 
291cdf0e10cSrcweir 			case( IMAP_OBJ_POLYGON ):
292cdf0e10cSrcweir                 ( (IMapPolygonObject*) pObj )->WriteCERN( rOStm, rBaseURL );
293cdf0e10cSrcweir 			break;
294cdf0e10cSrcweir 
295cdf0e10cSrcweir 			default:
296cdf0e10cSrcweir 			break;
297cdf0e10cSrcweir 		}
298cdf0e10cSrcweir 	}
299cdf0e10cSrcweir }
300cdf0e10cSrcweir 
301cdf0e10cSrcweir 
302cdf0e10cSrcweir /******************************************************************************
303cdf0e10cSrcweir |*
304cdf0e10cSrcweir |*
305cdf0e10cSrcweir |*
306cdf0e10cSrcweir \******************************************************************************/
307cdf0e10cSrcweir 
ImpWriteNCSA(SvStream & rOStm,const String & rBaseURL) const308cdf0e10cSrcweir void ImageMap::ImpWriteNCSA( SvStream& rOStm, const String& rBaseURL  ) const
309cdf0e10cSrcweir {
310cdf0e10cSrcweir 	IMapObject* pObj;
311cdf0e10cSrcweir 	sal_uInt16		nCount = (sal_uInt16) maList.Count();
312cdf0e10cSrcweir 
313cdf0e10cSrcweir 	for ( sal_uInt16 i = 0; i < nCount; i++ )
314cdf0e10cSrcweir 	{
315cdf0e10cSrcweir 		pObj = GetIMapObject( i );
316cdf0e10cSrcweir 
317cdf0e10cSrcweir 			switch( pObj->GetType() )
318cdf0e10cSrcweir 		{
319cdf0e10cSrcweir 			case( IMAP_OBJ_RECTANGLE ):
320cdf0e10cSrcweir                 ( (IMapRectangleObject*) pObj )->WriteNCSA( rOStm, rBaseURL );
321cdf0e10cSrcweir 			break;
322cdf0e10cSrcweir 
323cdf0e10cSrcweir 			case( IMAP_OBJ_CIRCLE ):
324cdf0e10cSrcweir                 ( (IMapCircleObject*) pObj )->WriteNCSA( rOStm, rBaseURL );
325cdf0e10cSrcweir 			break;
326cdf0e10cSrcweir 
327cdf0e10cSrcweir 			case( IMAP_OBJ_POLYGON ):
328cdf0e10cSrcweir                 ( (IMapPolygonObject*) pObj )->WriteNCSA( rOStm, rBaseURL );
329cdf0e10cSrcweir 			break;
330cdf0e10cSrcweir 
331cdf0e10cSrcweir 			default:
332cdf0e10cSrcweir 			break;
333cdf0e10cSrcweir 		}
334cdf0e10cSrcweir 	}
335cdf0e10cSrcweir }
336cdf0e10cSrcweir 
337cdf0e10cSrcweir 
338cdf0e10cSrcweir /******************************************************************************
339cdf0e10cSrcweir |*
340cdf0e10cSrcweir |*
341cdf0e10cSrcweir |*
342cdf0e10cSrcweir \******************************************************************************/
343cdf0e10cSrcweir 
Read(SvStream & rIStm,sal_uLong nFormat,const String & rBaseURL)344cdf0e10cSrcweir sal_uLong ImageMap::Read( SvStream& rIStm, sal_uLong nFormat, const String& rBaseURL  )
345cdf0e10cSrcweir {
346cdf0e10cSrcweir 	sal_uLong nRet = IMAP_ERR_FORMAT;
347cdf0e10cSrcweir 
348cdf0e10cSrcweir 	if ( nFormat == IMAP_FORMAT_DETECT )
349cdf0e10cSrcweir 		nFormat = ImpDetectFormat( rIStm );
350cdf0e10cSrcweir 
351cdf0e10cSrcweir 	switch ( nFormat )
352cdf0e10cSrcweir 	{
353cdf0e10cSrcweir         case ( IMAP_FORMAT_BIN )    : Read( rIStm, rBaseURL ); break;
354cdf0e10cSrcweir         case ( IMAP_FORMAT_CERN )   : nRet = ImpReadCERN( rIStm, rBaseURL ); break;
355cdf0e10cSrcweir         case ( IMAP_FORMAT_NCSA )   : nRet = ImpReadNCSA( rIStm, rBaseURL ); break;
356cdf0e10cSrcweir 
357cdf0e10cSrcweir 		default:
358cdf0e10cSrcweir 		break;
359cdf0e10cSrcweir 	}
360cdf0e10cSrcweir 
361cdf0e10cSrcweir 	if ( !rIStm.GetError() )
362cdf0e10cSrcweir 		nRet = IMAP_ERR_OK;
363cdf0e10cSrcweir 
364cdf0e10cSrcweir 	return nRet;
365cdf0e10cSrcweir }
366cdf0e10cSrcweir 
367cdf0e10cSrcweir 
368cdf0e10cSrcweir /******************************************************************************
369cdf0e10cSrcweir |*
370cdf0e10cSrcweir |*
371cdf0e10cSrcweir |*
372cdf0e10cSrcweir \******************************************************************************/
373cdf0e10cSrcweir 
ImpReadCERN(SvStream & rIStm,const String & rBaseURL)374cdf0e10cSrcweir sal_uLong ImageMap::ImpReadCERN( SvStream& rIStm, const String& rBaseURL )
375cdf0e10cSrcweir {
376cdf0e10cSrcweir 	ByteString aStr;
377cdf0e10cSrcweir 
378cdf0e10cSrcweir 	// alten Inhalt loeschen
379cdf0e10cSrcweir 	ClearImageMap();
380cdf0e10cSrcweir 
381cdf0e10cSrcweir 	while ( rIStm.ReadLine( aStr ) )
382cdf0e10cSrcweir         ImpReadCERNLine( aStr, rBaseURL );
383cdf0e10cSrcweir 
384cdf0e10cSrcweir 	return IMAP_ERR_OK;
385cdf0e10cSrcweir }
386cdf0e10cSrcweir 
387cdf0e10cSrcweir 
388cdf0e10cSrcweir /******************************************************************************
389cdf0e10cSrcweir |*
390cdf0e10cSrcweir |*
391cdf0e10cSrcweir |*
392cdf0e10cSrcweir \******************************************************************************/
393cdf0e10cSrcweir 
ImpReadCERNLine(const ByteString & rLine,const String & rBaseURL)394cdf0e10cSrcweir void ImageMap::ImpReadCERNLine( const ByteString& rLine, const String& rBaseURL  )
395cdf0e10cSrcweir {
396cdf0e10cSrcweir 	ByteString	aStr( rLine );
397cdf0e10cSrcweir 	ByteString	aToken;
398cdf0e10cSrcweir 
399cdf0e10cSrcweir 	aStr.EraseLeadingChars( ' ' );
400cdf0e10cSrcweir 	aStr.EraseLeadingChars( '\t' );
401cdf0e10cSrcweir 	aStr.EraseAllChars( ';' );
402cdf0e10cSrcweir 	aStr.ToLowerAscii();
403cdf0e10cSrcweir 
404cdf0e10cSrcweir 	const char*	pStr = aStr.GetBuffer();
405cdf0e10cSrcweir 	char		cChar = *pStr++;
406cdf0e10cSrcweir 
407cdf0e10cSrcweir 		// Anweisung finden
408cdf0e10cSrcweir 	while( ( cChar >= 'a' ) && ( cChar <= 'z' ) && NOTEOL( cChar ) )
409cdf0e10cSrcweir 	{
410cdf0e10cSrcweir 		aToken += cChar;
411cdf0e10cSrcweir 		cChar = *pStr++;
412cdf0e10cSrcweir 	}
413cdf0e10cSrcweir 
414cdf0e10cSrcweir 	if ( NOTEOL( cChar ) )
415cdf0e10cSrcweir 	{
416cdf0e10cSrcweir 		if ( ( aToken == "rectangle" ) || ( aToken == "rect" ) )
417cdf0e10cSrcweir 		{
418cdf0e10cSrcweir 			const Point		aTopLeft( ImpReadCERNCoords( &pStr ) );
419cdf0e10cSrcweir 			const Point		aBottomRight( ImpReadCERNCoords( &pStr ) );
420cdf0e10cSrcweir             const String    aURL( ImpReadCERNURL( &pStr, rBaseURL ) );
421cdf0e10cSrcweir 			const Rectangle	aRect( aTopLeft, aBottomRight );
422cdf0e10cSrcweir 
423cdf0e10cSrcweir 			IMapRectangleObject* pObj = new IMapRectangleObject( aRect, aURL, String(), String(), String(), String() );
424cdf0e10cSrcweir 			maList.Insert( pObj, LIST_APPEND );
425cdf0e10cSrcweir 		}
426cdf0e10cSrcweir 		else if ( ( aToken == "circle" ) || ( aToken == "circ" ) )
427cdf0e10cSrcweir 		{
428cdf0e10cSrcweir 			const Point		aCenter( ImpReadCERNCoords( &pStr ) );
429cdf0e10cSrcweir 			const long		nRadius = ImpReadCERNRadius( &pStr );
430cdf0e10cSrcweir             const String    aURL( ImpReadCERNURL( &pStr, rBaseURL ) );
431cdf0e10cSrcweir 
432cdf0e10cSrcweir 			IMapCircleObject* pObj = new IMapCircleObject( aCenter, nRadius, aURL, String(), String(), String(), String() );
433cdf0e10cSrcweir 			maList.Insert( pObj, LIST_APPEND );
434cdf0e10cSrcweir 		}
435cdf0e10cSrcweir 		else if ( ( aToken == "polygon" ) || ( aToken == "poly" ) )
436cdf0e10cSrcweir 		{
437cdf0e10cSrcweir 			const sal_uInt16	nCount = aStr.GetTokenCount( '(' ) - 1;
438cdf0e10cSrcweir 			Polygon			aPoly( nCount );
439cdf0e10cSrcweir 			String			aURL;
440cdf0e10cSrcweir 
441cdf0e10cSrcweir 			for ( sal_uInt16 i = 0; i < nCount; i++ )
442cdf0e10cSrcweir 				aPoly[ i ] = ImpReadCERNCoords( &pStr );
443cdf0e10cSrcweir 
444cdf0e10cSrcweir             aURL = ImpReadCERNURL( &pStr, rBaseURL );
445cdf0e10cSrcweir 
446cdf0e10cSrcweir 			IMapPolygonObject* pObj = new IMapPolygonObject( aPoly, aURL, String(), String(), String(), String() );
447cdf0e10cSrcweir 			maList.Insert( pObj, LIST_APPEND );
448cdf0e10cSrcweir 		}
449cdf0e10cSrcweir 	}
450cdf0e10cSrcweir }
451cdf0e10cSrcweir 
452cdf0e10cSrcweir 
453cdf0e10cSrcweir /******************************************************************************
454cdf0e10cSrcweir |*
455cdf0e10cSrcweir |*
456cdf0e10cSrcweir |*
457cdf0e10cSrcweir \******************************************************************************/
458cdf0e10cSrcweir 
ImpReadCERNCoords(const char ** ppStr)459cdf0e10cSrcweir Point ImageMap::ImpReadCERNCoords( const char** ppStr )
460cdf0e10cSrcweir {
461cdf0e10cSrcweir 	String	aStrX;
462cdf0e10cSrcweir 	String	aStrY;
463cdf0e10cSrcweir 	Point	aPt;
464cdf0e10cSrcweir 	char	cChar = *(*ppStr)++;
465cdf0e10cSrcweir 
466cdf0e10cSrcweir 	while( NOTEOL( cChar ) && ( ( cChar < '0' ) || ( cChar > '9' ) ) )
467cdf0e10cSrcweir 		cChar = *(*ppStr)++;
468cdf0e10cSrcweir 
469cdf0e10cSrcweir 	if ( NOTEOL( cChar ) )
470cdf0e10cSrcweir 	{
471cdf0e10cSrcweir 		while( NOTEOL( cChar ) && ( cChar >= '0' ) && ( cChar <= '9' ) )
472cdf0e10cSrcweir 		{
473cdf0e10cSrcweir 			aStrX += cChar;
474cdf0e10cSrcweir 			cChar = *(*ppStr)++;
475cdf0e10cSrcweir 		}
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 		if ( NOTEOL( cChar ) )
478cdf0e10cSrcweir 		{
479cdf0e10cSrcweir 			while( NOTEOL( cChar ) && ( ( cChar < '0' ) || ( cChar > '9' ) ) )
480cdf0e10cSrcweir 				cChar = *(*ppStr)++;
481cdf0e10cSrcweir 
482cdf0e10cSrcweir 			while( NOTEOL( cChar ) && ( cChar >= '0' ) && ( cChar <= '9' ) )
483cdf0e10cSrcweir 			{
484cdf0e10cSrcweir 				aStrY += cChar;
485cdf0e10cSrcweir 				cChar = *(*ppStr)++;
486cdf0e10cSrcweir 			}
487cdf0e10cSrcweir 
488cdf0e10cSrcweir 			if ( NOTEOL( cChar ) )
489cdf0e10cSrcweir 				while( NOTEOL( cChar ) && ( cChar != ')' ) )
490cdf0e10cSrcweir 					cChar = *(*ppStr)++;
491cdf0e10cSrcweir 
492cdf0e10cSrcweir 			aPt = Point( aStrX.ToInt32(), aStrY.ToInt32() );
493cdf0e10cSrcweir 		}
494cdf0e10cSrcweir 	}
495cdf0e10cSrcweir 
496cdf0e10cSrcweir 	return aPt;
497cdf0e10cSrcweir }
498cdf0e10cSrcweir 
499cdf0e10cSrcweir 
500cdf0e10cSrcweir /******************************************************************************
501cdf0e10cSrcweir |*
502cdf0e10cSrcweir |*
503cdf0e10cSrcweir |*
504cdf0e10cSrcweir \******************************************************************************/
505cdf0e10cSrcweir 
ImpReadCERNRadius(const char ** ppStr)506cdf0e10cSrcweir long ImageMap::ImpReadCERNRadius( const char** ppStr )
507cdf0e10cSrcweir {
508cdf0e10cSrcweir 	String	aStr;
509cdf0e10cSrcweir 	char	cChar = *(*ppStr)++;
510cdf0e10cSrcweir 
511cdf0e10cSrcweir 	while( NOTEOL( cChar ) && ( ( cChar < '0' ) || ( cChar > '9' ) ) )
512cdf0e10cSrcweir 		cChar = *(*ppStr)++;
513cdf0e10cSrcweir 
514cdf0e10cSrcweir 	if ( NOTEOL( cChar ) )
515cdf0e10cSrcweir 	{
516cdf0e10cSrcweir 		while( NOTEOL( cChar ) && ( cChar >= '0' ) && ( cChar <= '9' ) )
517cdf0e10cSrcweir 		{
518cdf0e10cSrcweir 			aStr += cChar;
519cdf0e10cSrcweir 			cChar = *(*ppStr)++;
520cdf0e10cSrcweir 		}
521cdf0e10cSrcweir 	}
522cdf0e10cSrcweir 
523cdf0e10cSrcweir 	return aStr.ToInt32();
524cdf0e10cSrcweir }
525cdf0e10cSrcweir 
526cdf0e10cSrcweir 
527cdf0e10cSrcweir /******************************************************************************
528cdf0e10cSrcweir |*
529cdf0e10cSrcweir |*
530cdf0e10cSrcweir |*
531cdf0e10cSrcweir \******************************************************************************/
532cdf0e10cSrcweir 
ImpReadCERNURL(const char ** ppStr,const String & rBaseURL)533cdf0e10cSrcweir String ImageMap::ImpReadCERNURL( const char** ppStr, const String& rBaseURL )
534cdf0e10cSrcweir {
535cdf0e10cSrcweir 	String	aStr( String::CreateFromAscii( *ppStr ) );
536cdf0e10cSrcweir 
537cdf0e10cSrcweir 	aStr.EraseLeadingChars( ' ' );
538cdf0e10cSrcweir 	aStr.EraseLeadingChars( '\t' );
539cdf0e10cSrcweir 	aStr.EraseTrailingChars( ' ' );
540cdf0e10cSrcweir 	aStr.EraseTrailingChars( '\t' );
541cdf0e10cSrcweir 
542cdf0e10cSrcweir     return INetURLObject::GetAbsURL( rBaseURL, aStr );
543cdf0e10cSrcweir }
544cdf0e10cSrcweir 
545cdf0e10cSrcweir 
546cdf0e10cSrcweir /******************************************************************************
547cdf0e10cSrcweir |*
548cdf0e10cSrcweir |*
549cdf0e10cSrcweir |*
550cdf0e10cSrcweir \******************************************************************************/
551cdf0e10cSrcweir 
ImpReadNCSA(SvStream & rIStm,const String & rBaseURL)552cdf0e10cSrcweir sal_uLong ImageMap::ImpReadNCSA( SvStream& rIStm, const String& rBaseURL )
553cdf0e10cSrcweir {
554cdf0e10cSrcweir 	ByteString aStr;
555cdf0e10cSrcweir 
556cdf0e10cSrcweir 	// alten Inhalt loeschen
557cdf0e10cSrcweir 	ClearImageMap();
558cdf0e10cSrcweir 
559cdf0e10cSrcweir 	while ( rIStm.ReadLine( aStr ) )
560cdf0e10cSrcweir         ImpReadNCSALine( aStr, rBaseURL );
561cdf0e10cSrcweir 
562cdf0e10cSrcweir 	return IMAP_ERR_OK;
563cdf0e10cSrcweir }
564cdf0e10cSrcweir 
565cdf0e10cSrcweir 
566cdf0e10cSrcweir /******************************************************************************
567cdf0e10cSrcweir |*
568cdf0e10cSrcweir |*
569cdf0e10cSrcweir |*
570cdf0e10cSrcweir \******************************************************************************/
571cdf0e10cSrcweir 
ImpReadNCSALine(const ByteString & rLine,const String & rBaseURL)572cdf0e10cSrcweir void ImageMap::ImpReadNCSALine( const ByteString& rLine, const String& rBaseURL )
573cdf0e10cSrcweir {
574cdf0e10cSrcweir 	ByteString	aStr( rLine );
575cdf0e10cSrcweir 	ByteString	aToken;
576cdf0e10cSrcweir 
577cdf0e10cSrcweir 	aStr.EraseLeadingChars( ' ' );
578cdf0e10cSrcweir 	aStr.EraseLeadingChars( '\t' );
579cdf0e10cSrcweir 	aStr.EraseAllChars( ';' );
580cdf0e10cSrcweir 	aStr.ToLowerAscii();
581cdf0e10cSrcweir 
582cdf0e10cSrcweir 	const char*	pStr = aStr.GetBuffer();
583cdf0e10cSrcweir 	char		cChar = *pStr++;
584cdf0e10cSrcweir 
585cdf0e10cSrcweir 		// Anweisung finden
586cdf0e10cSrcweir 	while( ( cChar >= 'a' ) && ( cChar <= 'z' ) && NOTEOL( cChar ) )
587cdf0e10cSrcweir 	{
588cdf0e10cSrcweir 		aToken += cChar;
589cdf0e10cSrcweir 		cChar = *pStr++;
590cdf0e10cSrcweir 	}
591cdf0e10cSrcweir 
592cdf0e10cSrcweir 	if ( NOTEOL( cChar ) )
593cdf0e10cSrcweir 	{
594cdf0e10cSrcweir 		if ( aToken == "rect" )
595cdf0e10cSrcweir 		{
596cdf0e10cSrcweir             const String    aURL( ImpReadNCSAURL( &pStr, rBaseURL ) );
597cdf0e10cSrcweir 			const Point		aTopLeft( ImpReadNCSACoords( &pStr ) );
598cdf0e10cSrcweir 			const Point		aBottomRight( ImpReadNCSACoords( &pStr ) );
599cdf0e10cSrcweir 			const Rectangle	aRect( aTopLeft, aBottomRight );
600cdf0e10cSrcweir 
601cdf0e10cSrcweir 			IMapRectangleObject* pObj = new IMapRectangleObject( aRect, aURL, String(), String(), String(), String() );
602cdf0e10cSrcweir 			maList.Insert( pObj, LIST_APPEND );
603cdf0e10cSrcweir 		}
604cdf0e10cSrcweir 		else if ( aToken == "circle" )
605cdf0e10cSrcweir 		{
606cdf0e10cSrcweir             const String    aURL( ImpReadNCSAURL( &pStr, rBaseURL ) );
607cdf0e10cSrcweir 			const Point		aCenter( ImpReadNCSACoords( &pStr ) );
608cdf0e10cSrcweir 			const Point		aDX( aCenter - ImpReadNCSACoords( &pStr ) );
609cdf0e10cSrcweir 			long			nRadius = (long) sqrt( (double) aDX.X() * aDX.X() +
610cdf0e10cSrcweir 												   (double) aDX.Y() * aDX.Y() );
611cdf0e10cSrcweir 
612cdf0e10cSrcweir 			IMapCircleObject* pObj = new IMapCircleObject( aCenter, nRadius, aURL, String(), String(), String(), String() );
613cdf0e10cSrcweir 			maList.Insert( pObj, LIST_APPEND );
614cdf0e10cSrcweir 		}
615cdf0e10cSrcweir 		else if ( aToken == "poly" )
616cdf0e10cSrcweir 		{
617cdf0e10cSrcweir 			const sal_uInt16	nCount = aStr.GetTokenCount( ',' ) - 1;
618cdf0e10cSrcweir             const String    aURL( ImpReadNCSAURL( &pStr, rBaseURL ) );
619cdf0e10cSrcweir 			Polygon			aPoly( nCount );
620cdf0e10cSrcweir 
621cdf0e10cSrcweir 			for ( sal_uInt16 i = 0; i < nCount; i++ )
622cdf0e10cSrcweir 				aPoly[ i ] = ImpReadNCSACoords( &pStr );
623cdf0e10cSrcweir 
624cdf0e10cSrcweir 			IMapPolygonObject* pObj = new IMapPolygonObject( aPoly, aURL, String(), String(), String(), String() );
625cdf0e10cSrcweir 			maList.Insert( pObj, LIST_APPEND );
626cdf0e10cSrcweir 		}
627cdf0e10cSrcweir 	}
628cdf0e10cSrcweir }
629cdf0e10cSrcweir 
630cdf0e10cSrcweir 
631cdf0e10cSrcweir /******************************************************************************
632cdf0e10cSrcweir |*
633cdf0e10cSrcweir |*
634cdf0e10cSrcweir |*
635cdf0e10cSrcweir \******************************************************************************/
636cdf0e10cSrcweir 
ImpReadNCSAURL(const char ** ppStr,const String & rBaseURL)637cdf0e10cSrcweir String ImageMap::ImpReadNCSAURL( const char** ppStr, const String& rBaseURL )
638cdf0e10cSrcweir {
639cdf0e10cSrcweir 	String	aStr;
640cdf0e10cSrcweir 	char	cChar = *(*ppStr)++;
641cdf0e10cSrcweir 
642cdf0e10cSrcweir 	while( NOTEOL( cChar ) && ( ( cChar == ' ' ) || ( cChar == '\t' ) ) )
643cdf0e10cSrcweir 		cChar = *(*ppStr)++;
644cdf0e10cSrcweir 
645cdf0e10cSrcweir 	if ( NOTEOL( cChar ) )
646cdf0e10cSrcweir 	{
647cdf0e10cSrcweir 		while( NOTEOL( cChar ) && ( cChar != ' ' ) && ( cChar != '\t' ) )
648cdf0e10cSrcweir 		{
649cdf0e10cSrcweir 			aStr += cChar;
650cdf0e10cSrcweir 			cChar = *(*ppStr)++;
651cdf0e10cSrcweir 		}
652cdf0e10cSrcweir 	}
653cdf0e10cSrcweir 
654cdf0e10cSrcweir     return INetURLObject::GetAbsURL( rBaseURL, aStr );
655cdf0e10cSrcweir }
656cdf0e10cSrcweir 
657cdf0e10cSrcweir 
658cdf0e10cSrcweir /******************************************************************************
659cdf0e10cSrcweir |*
660cdf0e10cSrcweir |*
661cdf0e10cSrcweir |*
662cdf0e10cSrcweir \******************************************************************************/
663cdf0e10cSrcweir 
ImpReadNCSACoords(const char ** ppStr)664cdf0e10cSrcweir Point ImageMap::ImpReadNCSACoords( const char** ppStr )
665cdf0e10cSrcweir {
666cdf0e10cSrcweir 	String	aStrX;
667cdf0e10cSrcweir 	String	aStrY;
668cdf0e10cSrcweir 	Point	aPt;
669cdf0e10cSrcweir 	char	cChar = *(*ppStr)++;
670cdf0e10cSrcweir 
671cdf0e10cSrcweir 	while( NOTEOL( cChar ) && ( ( cChar < '0' ) || ( cChar > '9' ) ) )
672cdf0e10cSrcweir 		cChar = *(*ppStr)++;
673cdf0e10cSrcweir 
674cdf0e10cSrcweir 	if ( NOTEOL( cChar ) )
675cdf0e10cSrcweir 	{
676cdf0e10cSrcweir 		while( NOTEOL( cChar ) && ( cChar >= '0' ) && ( cChar <= '9' ) )
677cdf0e10cSrcweir 		{
678cdf0e10cSrcweir 			aStrX += cChar;
679cdf0e10cSrcweir 			cChar = *(*ppStr)++;
680cdf0e10cSrcweir 		}
681cdf0e10cSrcweir 
682cdf0e10cSrcweir 		if ( NOTEOL( cChar ) )
683cdf0e10cSrcweir 		{
684cdf0e10cSrcweir 			while( NOTEOL( cChar ) && ( ( cChar < '0' ) || ( cChar > '9' ) ) )
685cdf0e10cSrcweir 				cChar = *(*ppStr)++;
686cdf0e10cSrcweir 
687cdf0e10cSrcweir 			while( NOTEOL( cChar ) && ( cChar >= '0' ) && ( cChar <= '9' ) )
688cdf0e10cSrcweir 			{
689cdf0e10cSrcweir 				aStrY += cChar;
690cdf0e10cSrcweir 				cChar = *(*ppStr)++;
691cdf0e10cSrcweir 			}
692cdf0e10cSrcweir 
693cdf0e10cSrcweir 			aPt = Point( aStrX.ToInt32(), aStrY.ToInt32() );
694cdf0e10cSrcweir 		}
695cdf0e10cSrcweir 	}
696cdf0e10cSrcweir 
697cdf0e10cSrcweir 	return aPt;
698cdf0e10cSrcweir }
699cdf0e10cSrcweir 
700cdf0e10cSrcweir 
701cdf0e10cSrcweir /******************************************************************************
702cdf0e10cSrcweir |*
703cdf0e10cSrcweir |*
704cdf0e10cSrcweir |*
705cdf0e10cSrcweir \******************************************************************************/
706cdf0e10cSrcweir 
ImpDetectFormat(SvStream & rIStm)707cdf0e10cSrcweir sal_uLong ImageMap::ImpDetectFormat( SvStream& rIStm )
708cdf0e10cSrcweir {
709cdf0e10cSrcweir 	sal_uLong	nPos = rIStm.Tell();
710cdf0e10cSrcweir 	sal_uLong	nRet = IMAP_FORMAT_BIN;
711cdf0e10cSrcweir 	char	cMagic[6];
712cdf0e10cSrcweir 
713cdf0e10cSrcweir 	rIStm.Read( cMagic, sizeof( cMagic ) );
714cdf0e10cSrcweir 
715cdf0e10cSrcweir 	// Falls wir kein internes Format haben,
716cdf0e10cSrcweir 	// untersuchen wir das Format
717cdf0e10cSrcweir 	if ( memcmp( cMagic, IMAPMAGIC, sizeof( cMagic ) ) )
718cdf0e10cSrcweir 	{
719cdf0e10cSrcweir 		ByteString	aStr;
720cdf0e10cSrcweir 		long		nCount = 128;
721cdf0e10cSrcweir 
722cdf0e10cSrcweir 		rIStm.Seek( nPos );
723cdf0e10cSrcweir 		while ( rIStm.ReadLine( aStr ) && nCount-- )
724cdf0e10cSrcweir 		{
725cdf0e10cSrcweir 			aStr.ToLowerAscii();
726cdf0e10cSrcweir 
727cdf0e10cSrcweir 			if ( ( aStr.Search( "rect" ) != STRING_NOTFOUND ) ||
728cdf0e10cSrcweir 				 ( aStr.Search( "circ" ) != STRING_NOTFOUND ) ||
729cdf0e10cSrcweir 				 ( aStr.Search( "poly" ) != STRING_NOTFOUND ) )
730cdf0e10cSrcweir 			{
731cdf0e10cSrcweir 				if ( ( aStr.Search( '(' ) != STRING_NOTFOUND ) &&
732cdf0e10cSrcweir 					 ( aStr.Search( ')' ) != STRING_NOTFOUND ) )
733cdf0e10cSrcweir 				{
734cdf0e10cSrcweir 					nRet = IMAP_FORMAT_CERN;
735cdf0e10cSrcweir 				}
736cdf0e10cSrcweir 				else
737cdf0e10cSrcweir 					nRet = IMAP_FORMAT_NCSA;
738cdf0e10cSrcweir 
739cdf0e10cSrcweir 				break;
740cdf0e10cSrcweir 			}
741cdf0e10cSrcweir 		}
742cdf0e10cSrcweir 	}
743cdf0e10cSrcweir 
744cdf0e10cSrcweir 	rIStm.Seek( nPos );
745cdf0e10cSrcweir 
746cdf0e10cSrcweir 	return nRet;
747cdf0e10cSrcweir }
748