diff -r 8173571d354e -r 1fc85118c3ae locationdataharvester/mylocationsengine/src/maptileinterface.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/locationdataharvester/mylocationsengine/src/maptileinterface.cpp Tue Aug 31 15:09:25 2010 +0300 @@ -0,0 +1,307 @@ +/* +* Copyright (c) 2010 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: Maptile interface source implementation for maptile +* service. +* +*/ + +#include +#include +#include +#include +#include +#include +#include "maptileinterface.h" +#include "mylocationlogger.h" +#include "mylocationsdefines.h" +#include "lookupmaptiledb.h" +#include + +//Invalid latitude & longitude value +const TReal KInvalidLatitudeLongitude = 200.0f; +const TInt KStreetLvelZoom = 16; +const TInt KCityLevelZoom = 11; +const TInt KImagePathSize=36; +const TInt KMapTileWidthHeight = 256 ; +_LIT(KFileExtn, ".png"); + +// ----------------------------------------------------------------------------- +// CMapTileInterface::NewL() +// Creates and returns the instance of CMapTileInterface +// ----------------------------------------------------------------------------- +// +CMapTileInterface* CMapTileInterface::NewL() +{ + CMapTileInterface* self = new (ELeave) CMapTileInterface(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; +} + +// ----------------------------------------------------------------------------- +// CMapTileInterface::~CMapTileInterface() +// Destructor +// ----------------------------------------------------------------------------- +// +CMapTileInterface::~CMapTileInterface() +{ + __TRACE_CALLSTACK; + + delete iFilePath; + + delete iMaptileGeocoder; + + delete iLandmark; +} + + +// ----------------------------------------------------------------------------- +// CMapTileInterface::CMapTileInterface() +// Constructor +// ----------------------------------------------------------------------------- +// +CMapTileInterface::CMapTileInterface() : + iMaptileGeocoder( NULL ), + iFilePath( NULL ), + iObserver(NULL), + iLandmark(NULL) +{ +} + +// ----------------------------------------------------------------------------- +// CMapTileInterface::ConstructL() +// Two phase constructor +// ----------------------------------------------------------------------------- +// +void CMapTileInterface::ConstructL() +{ + __TRACE_CALLSTACK; + + iMaptileGeocoder = CMaptileGeocoderPlugin::NewL(); + + iMaptileGeocoder->SetMaptileGeocoderObserver( *this ); +} +// ----------------------------------------------------------------------------- +// CMapTileInterface::GetGeoCodeFromAddressL() +// Interface for requesting GEO fields for the given address +// ----------------------------------------------------------------------------- +// +void CMapTileInterface::GetGeoCodeFromAddressL(const TDesC& aAddressDetails, + const TDesC& aFilePath, MMapTileObserver* aObserver) +{ + __TRACE_CALLSTACK; + iObserver = aObserver; + delete iFilePath; + iFilePath = NULL; + iFilePath = HBufC::NewL(aFilePath.Length()); + iFilePath->Des().Copy(aFilePath); + iStreetAvailable = EFalse; + iMaptileGeocoder->GetCoordinateByAddressL(aAddressDetails, ESilent); + +} +// ----------------------------------------------------------------------------- +// CMapTileInterface::GetGeoCodeFromAddressL() +// Interface for requesting GEO fields for the given landmark adress +// ----------------------------------------------------------------------------- +// +void CMapTileInterface::GetGeoCodeFromAddressL(CPosLandmark* aLandmark, + const TDesC& aFilePath, MMapTileObserver* aObserver) +{ + __TRACE_CALLSTACK; + iObserver = aObserver; + delete iFilePath; + iFilePath = NULL; + iFilePath = HBufC::NewL(aFilePath.Length()); + iFilePath->Des().Copy(aFilePath); + + //Reset the street level available flag + iStreetAvailable = EFalse; + + TPtrC getStreet; + aLandmark->GetPositionField(EPositionFieldStreet, getStreet); + + if (getStreet.Length() > 0) + { + iStreetAvailable = ETrue; + } + iMaptileGeocoder->GetCoordinateByAddressL(*aLandmark, ESilent); +} + +// ----------------------------------------------------------------------------- +// CMapTileInterface::GetMapTileL() +// Function for Retrieving latitude & longitude information +// ----------------------------------------------------------------------------- +// +void CMapTileInterface::GetMapTileL( const TReal& aLatitude, const TReal& aLongitude) +{ + __TRACE_CALLSTACK;//Notification to observer , to update contact db, + TInt zoom = KCityLevelZoom; + if (iStreetAvailable) + { + zoom = KStreetLvelZoom; + } + iStreetAvailable = EFalse; + TMapTileParam mapTileparam(aLatitude, aLongitude, zoom, MapTileWidth,MapTileHeight ); + iMaptileGeocoder->GetMapTileByGeoCodeL( mapTileparam, *iFilePath ); +} + +// ----------------------------------------------------------------------------- +// CMapTileInterface::MapComplete() +// Maptile retrievel notification +// ----------------------------------------------------------------------------- +// +void CMapTileInterface::MapTileFetchingCompleted( TInt aErrCode, const TDesC& aMapTilePath ) +{ + __TRACE_CALLSTACK; + MYLOCLOGSTRING1("MapComplete() status-%d ",aErrCode ); + iObserver->MapTilefetchingCompleted( aErrCode, aMapTilePath ); +} + +// ---------------------------------------------------------------------------- +// CMapTileInterface::UpdateFilePathL() +// Converts the geocoordinate to maptile pixel coordinate and updates the +// file path to Maptilefolder\RowCol.png +// ---------------------------------------------------------------------------- +// +void CMapTileInterface::UpdateFilePathL( const TReal& aLatitude, const TReal& aLongitude ) +{ + TInt iZoomLvl = KCityLevelZoom; + if ( iStreetAvailable ) + iZoomLvl = KStreetLvelZoom; + + TInt totalTilesHorizontal = 1 << iZoomLvl; + TInt totalTilesVertical = 1 << iZoomLvl; + + TInt totalMapWidth = totalTilesHorizontal * KMapTileWidthHeight; + TInt totalMapHeight = totalTilesVertical * KMapTileWidthHeight; + + TReal pi = 3.14159265; + + TInt convertedx = (( aLongitude + 180.0) * totalMapWidth) + / 360.0; + TReal convertedtemp = log(tan(( aLatitude + 90) * pi + / 360.0)); + int convertedy = (1 - convertedtemp / pi) * totalMapHeight / 2.0; + + //Get the image row,col + TInt iMapTileImageRow = ( convertedy / 256.0 ) * 1000; + TInt iMapTileImageCol = ( convertedx / 256.0 ) * 1000; + + TBuf mImagePath; + + mImagePath.AppendNum(iMapTileImageRow); + mImagePath.AppendNum(iMapTileImageCol); + mImagePath.Append(KFileExtn); + + if( iFilePath ) + { + iFilePath = iFilePath->ReAllocL(iFilePath->Length() + mImagePath.Length() ); + iFilePath->Des().Append(mImagePath); + } +} + +// ----------------------------------------------------------------------------- +// CMapTileInterface::GeocodeComplete() +// Geocode completion notification +// ----------------------------------------------------------------------------- +// +void CMapTileInterface::GeocodingCompleted(TInt aErrorcode, + MAddressInfo& aAddressInfo) +{ + __TRACE_CALLSTACK; + TReal latitude, longitude; + latitude=aAddressInfo.GetLatitude(); + longitude=aAddressInfo.GetLongitude(); + + MYLOCLOGSTRING1("GeocodeCompleted() status-%d",aErrorcode); + MYLOCLOGSTRING1("GeocodeCompleted() latitude-%f",latitude ); + MYLOCLOGSTRING1("GeocodeCompleted() longitude-%f",longitude ); + + if (aErrorcode == KErrNone) + { + if ( latitude != KInvalidLatitudeLongitude + && longitude != KInvalidLatitudeLongitude) + { + TRAP_IGNORE( SetLandMarkDetailsL(aAddressInfo) ); + TRAP_IGNORE( UpdateFilePathL( latitude, longitude ) ); + + iObserver->GeoCodefetchingCompleted(KErrNone, latitude, longitude, iFilePath->Des()); + + } + else + { + iObserver->GeoCodefetchingCompleted(KErrGeneral, + KInvalidLatitudeLongitude, KInvalidLatitudeLongitude, KNullDesC); + } + } + else + { + iObserver->GeoCodefetchingCompleted(aErrorcode, + KInvalidLatitudeLongitude, KInvalidLatitudeLongitude, KNullDesC ); + } +} + +// ----------------------------------------------------------------------------- +// CMapTileInterface::GetLandMarkDetails() +// return pointer to CPosLandmark +// ----------------------------------------------------------------------------- +// +CPosLandmark* CMapTileInterface::GetLandMarkDetails() +{ + return iLandmark; + +} +// ----------------------------------------------------------------------------- +// CMapTileInterface::SetLandMarkDetails() +// create CPosLandmark details from MAddressInfo +// ----------------------------------------------------------------------------- +// +void CMapTileInterface::SetLandMarkDetailsL(MAddressInfo& aAddressInfo) +{ + if(iLandmark) + { + delete iLandmark; + iLandmark=NULL; + } + TReal latitude,longitude; + latitude=aAddressInfo.GetLatitude(); + longitude=aAddressInfo.GetLongitude(); + TLocality position(TCoordinate(latitude,longitude),0); + iLandmark=CPosLandmark::NewL(); + //latitude and longitude + iLandmark->SetPositionL(position); + + //street + TPtrC tempText=aAddressInfo.GetThoroughfareName(); + if(tempText.Length()>0) + { + iStreetAvailable=ETrue; + } + iLandmark->SetPositionFieldL(EPositionFieldStreet, tempText); + //postal code + tempText.Set(aAddressInfo.GetPincode()); + iLandmark->SetPositionFieldL(EPositionFieldPostalCode, tempText); + //city + tempText.Set(aAddressInfo.GetCity()); + iLandmark->SetPositionFieldL(EPositionFieldCity, tempText); + //state + tempText.Set(aAddressInfo.GetState()); + iLandmark->SetPositionFieldL(EPositionFieldState, tempText); + //country + tempText.Set(aAddressInfo.GetCountryName()); + iLandmark->SetPositionFieldL(EPositionFieldCountry, tempText); + +} +//end of line