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