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