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 10cdf0e10cSrcweir * 11*5900e8ecSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 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. 19cdf0e10cSrcweir * 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 63cdf0e10cSrcweir 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 81cdf0e10cSrcweir 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 98cdf0e10cSrcweir 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 110cdf0e10cSrcweir 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 127cdf0e10cSrcweir 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 145cdf0e10cSrcweir 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 167cdf0e10cSrcweir 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 186cdf0e10cSrcweir 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 208cdf0e10cSrcweir 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 228cdf0e10cSrcweir 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 252cdf0e10cSrcweir 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 272cdf0e10cSrcweir 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 308cdf0e10cSrcweir 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 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 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 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 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 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 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 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 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 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 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 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