diff -r a3a1ae9acec6 -r da5135c61bad meetingrequest/mrurlparserplugin/src/cmrurlparserextension.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrurlparserplugin/src/cmrurlparserextension.cpp Wed Mar 31 21:08:33 2010 +0300 @@ -0,0 +1,304 @@ +/* +* Copyright (c) 2008-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Parser class extension for parsing landmarks to url and vice versa +* +*/ + + + +#include "cmrurlparserextension.h" + +#include +#include +#include +#include +#include + +#include "emailtrace.h" + +namespace +{ +// Old location base URL format +_LIT( KLocationUrl, "http://www.ovi.com/maps/" ); + +// Latitude parameter +_LIT( KUrlParamLatitude, "lat=" ); + +// Parameter separator +_LIT( KUrlParamSeparator, "&" ); + +// Longitude parameter +_LIT( KUrlParamLongitude, "lon=" ); + +// Location sieve URL +_LIT( KLocationSieveUrl, "http://www.ovi.com/maps/lat=*&lon=*" ); + +const TUint KDecimalSeparator = '.'; +const TUint KMinusSign = '-'; + +// ======== LOCAL FUNCTIONS ======== +// ---------------------------------------------------------------------------- +// CheckCoordinateParamL +// +// Checks if coordinate parameter (lon or lat) is in correct format +// Leaves if not +// Correct form is: +// -minus sign allowed only in first position +// -only one decimalseparator sign allowed +// -only digits allowed +// -aParam length not allowed to be zero +// ---------------------------------------------------------------------------- +// +void CheckCoordinateParamL( const TDesC& aParam ) + { + FUNC_LOG; + if( aParam.Length() == 0 ) + { + User::Leave( KErrArgument ); + } + + //check that aParam contains only digits and only one decimalseparator + //and minus sign is first, if it exists + TChar character; + TBool decimalSeparatorFound = EFalse; + TLex lex; + lex.Assign( aParam ); + + for( TInt i = 0; i < aParam.Length(); i++) + { + character = lex.Get(); + //checks if first character is minus sign and continues if it is + if( i == 0 && (TUint)character == KMinusSign) + { + continue; + } + + //check that only one decimal separator exists + if ( (TUint)character == KDecimalSeparator ) + { + if ( decimalSeparatorFound ) + { + User::Leave( KErrArgument ); + } + else + { + decimalSeparatorFound = ETrue; + } + } + //check that character is either digit or decimalseparator + if( !( character.IsDigit() ) && (TUint)character != KDecimalSeparator ) + { + User::Leave( KErrArgument ); + } + } + } + +// ---------------------------------------------------------------------------- +// GetCoordinateParamValuesL +// Returns longitude and latitude if found correctly +// ---------------------------------------------------------------------------- +// +void GetCoordinateParamValuesL( const TDesC& aUrl, + TPtrC& aLatitude, + TPtrC& aLongitude ) + { + FUNC_LOG; + + //Find out if lat and lon params and separator exists in aUrl + TInt latPos = aUrl.Find( KUrlParamLatitude ); + TInt lonPos = aUrl.Find( KUrlParamLongitude ); + TInt separatorPos = aUrl.Find( KUrlParamSeparator ); + + if( latPos == KErrNotFound || lonPos == KErrNotFound + || separatorPos == KErrNotFound ) + { + User::Leave( KErrNotFound ); + } + + //takes from aUrl parts with actual coordinate data + aLatitude.Set( aUrl.Mid( + latPos + KUrlParamLatitude().Length(), + separatorPos - latPos - KUrlParamLatitude().Length() ) ); + + aLongitude.Set( aUrl.Right( + aUrl.Length() - separatorPos - 1 - KUrlParamLongitude().Length() ) ); + } +} + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CMRUrlParserExtension::CMRUrlParserExtension +// --------------------------------------------------------------------------- +// +CMRUrlParserExtension::CMRUrlParserExtension() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CMRUrlParserExtension::NewL +// --------------------------------------------------------------------------- +// +CMRUrlParserExtension* CMRUrlParserExtension::NewL() + { + FUNC_LOG; + + CMRUrlParserExtension* self = CMRUrlParserExtension::NewLC(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CMRUrlParserExtension::NewLC +// --------------------------------------------------------------------------- +// +CMRUrlParserExtension* CMRUrlParserExtension::NewLC() + { + FUNC_LOG; + + CMRUrlParserExtension* self = new( ELeave ) CMRUrlParserExtension; + CleanupStack::PushL( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CMRUrlParserExtension::~CMRUrlParserExtension +// --------------------------------------------------------------------------- +// +CMRUrlParserExtension::~CMRUrlParserExtension() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CMRUrlParserExtension::FindLocationUrl +// Finds location URL from given text input +// --------------------------------------------------------------------------- +// +void CMRUrlParserExtension::FindLocationUrlL( + const TDesC& aText, + TPtrC& aUrl, + TInt& aPos) + + { + FUNC_LOG; + + //Seach if base string is found from aText + TInt urlLocation = aText.FindF( KLocationUrl ); + if ( urlLocation < KErrNone ) + { + User::Leave(KErrNotFound); + } + + //Take out unnecessary part before URL and search if endmark (whitespace) + //is found. If endmark is not found, + //then all the rest of descriptor is part of URL + TPtrC urlAndAfter = aText.Mid( urlLocation ); + TInt urlAndAfterLength = urlAndAfter.Length(); + TInt urlEndmarkLocation = KErrNotFound; + + for( TInt i = 0; i < urlAndAfterLength; i++) + { + if( TChar( urlAndAfter[i] ).IsSpace() ) + { + urlEndmarkLocation = i; + break; + } + } + + if( urlEndmarkLocation == KErrNotFound ) + { + urlEndmarkLocation = urlAndAfterLength; + } + + //Take out part from beginning of URL to endmark + TPtrC urlToEndMark = urlAndAfter.Left( urlEndmarkLocation ); + + //Now we should have only URL left, check with "sieve" that it is about in + //right format + TInt sievedStartPoint = urlToEndMark.MatchF( KLocationSieveUrl ); + + if( sievedStartPoint == KErrNotFound ) + { + User::Leave(KErrNotFound); + } + + //Check that parameters are in right format + TPtrC latValue; + TPtrC lonValue; + + GetCoordinateParamValuesL( + urlToEndMark, + latValue, + lonValue ); + CheckCoordinateParamL( latValue ); + CheckCoordinateParamL( lonValue ); + + //Set aURL to correspond URL part of aText and aPos with url position + aUrl.Set( urlToEndMark ); + aPos = urlLocation; + } + +// --------------------------------------------------------------------------- +// CMRUrlParserExtension::CreateLandmarkFromUrlL +// Creates landmark object from location URL +// --------------------------------------------------------------------------- +// +CPosLandmark* CMRUrlParserExtension::CreateLandmarkFromUrlL( + const TDesC& aUrl ) + { + FUNC_LOG; + + TInt matchPos = User::LeaveIfError( aUrl.MatchF( KLocationSieveUrl ) ); + + if( matchPos != 0 ) + { + //URL was found but is not int the beginning of desc + User::Leave( KErrArgument ); + } + + //Parse actual coordinate values out of url + TPtrC latValue; + TPtrC lonValue; + GetCoordinateParamValuesL( aUrl, latValue, lonValue ); + + //Check that parameters are in right format + CheckCoordinateParamL( latValue ); + CheckCoordinateParamL( lonValue ); + + //Convert parameters to TReal values + TLex lexConverter( latValue ); + TReal64 realLatitude; + lexConverter.Val( realLatitude ); + + lexConverter.Assign( lonValue ); + TReal64 realLongitude; + lexConverter.Val( realLongitude ); + + //Create landmark with coordinatevalues + CPosLandmark* landmark = CPosLandmark::NewLC(); + TLocality position; + position.SetCoordinate( realLatitude, realLongitude ); + landmark->SetPositionL( position ); + CleanupStack::Pop( landmark ); + + //transfer ownership + return landmark; + } + +//EOF +