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