diff -r 000000000000 -r 667063e416a2 locationmapnavfw/library/src/mnmapviewservicebase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/locationmapnavfw/library/src/mnmapviewservicebase.cpp Tue Feb 02 01:06:48 2010 +0200 @@ -0,0 +1,588 @@ +/* +* Copyright (c) 2005-2006 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: CMnMapViewServiceBase class implementation +* +*/ + + +#include +#include +#include +#include + +#include +#include + +#include "mndebug.h" +#include "mnerrors.h" +#include "mninternal.h" +#include "mninternal.inl" +#include "mnmapselectionresultinfo.inl" + +#include "mnmapviewservicebase.h" + +// ======== LOCAL FUNCTIONS ======== + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C CMnMapViewServiceBase::CMnMapViewServiceBase() + { + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C CMnMapViewServiceBase::~CMnMapViewServiceBase() + { + LOG("~CMnMapViewServiceBase in"); + ResetLandmarks(); + iLandmarks.Close(); + iLinkedLandmarksLists.Close(); + iTempDatabaseList.Close(); + + CleanSelectionResult(); + delete iSelectionRequestText; + LOG("~CMnMapViewServiceBase out"); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C void CMnMapViewServiceBase::BaseConstructL() + { + LOG("CMnMapViewServiceBase::BaseConstructL"); + CMnServiceBase::BaseConstructL(); + iSelectionRequestText = HBufC::NewL( 0 ); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C CMnMapView::TOptions CMnMapViewServiceBase::Options() + { + LOG("CMnMapViewServiceBase::Options"); + return iOptions; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C CMnMapView::TCurrentLocationOption CMnMapViewServiceBase::CurrentLocationOption() + { + LOG("CMnMapViewServiceBase::CurrentLocationOption"); + return iCurrentLocationOption; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C TArray CMnMapViewServiceBase::LandmarksToShow() + { + LOG("CMnMapViewServiceBase::LandmarksToShow"); + return iLandmarks.Array(); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C TArray CMnMapViewServiceBase::LinkedLandmarksToShow( TInt aDbIndex ) + { + LOG1("CMnMapViewServiceBase::LinkedLandmarksToShow, db index %d", aDbIndex); + if ( aDbIndex < 0 || aDbIndex >= iLinkedLandmarksLists.Count() ) + { + PanicServer( KMnPanicArrayIndexOutOfBounds ); + } + return iLinkedLandmarksLists[aDbIndex]->iLandmarkIds.Array(); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C TArray CMnMapViewServiceBase::LandmarksToShowDatabases() + { + LOG("CMnMapViewServiceBase::LandmarksToShowDatabases"); + if ( iTempDatabaseList.Count() != iLinkedLandmarksLists.Count() ) + { + // update database list + iTempDatabaseList.Reset(); + for ( TInt i = 0; i < iLinkedLandmarksLists.Count(); i++ ) + { + iTempDatabaseList.Append( iLinkedLandmarksLists[i]->iDatabaseUri ); + } + } + return iTempDatabaseList.Array(); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C TPtrC CMnMapViewServiceBase::SelectionRequestText() + { + LOG("CMnMapViewServiceBase::SelectionRequestText"); + return iSelectionRequestText->Des(); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CMnMapViewServiceBase::IsAreaCentralPointSet() + { + LOG("CMnMapViewServiceBase::IsAreaCentralPointSet"); + return !( Math::IsNaN( iCentralPoint.Latitude() ) && + Math::IsNaN( iCentralPoint.Longitude() ) ); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C void CMnMapViewServiceBase::GetAreaCentralPoint( TCoordinate& aCentralPoint ) + { + LOG("CMnMapViewServiceBase::GetAreaCentralPoint"); + aCentralPoint = iCentralPoint; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C TReal CMnMapViewServiceBase::AreaRadius() + { + LOG("CMnMapViewServiceBase::AreaRadius"); + return iRadius; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C void CMnMapViewServiceBase::CompleteSelectionRequestL( const CPosLandmark& aLandmark ) + { + LOG("CMnMapViewServiceBase::CompleteSelectionRequestL(free) in"); + + if ( !IsAsyncRequestActive() ) + { + PanicServer( KMnPanicAttemptToCompleteNoRequest ); + } + + if ( iOptions & CMnMapView::EOptionRestrictSelection ) + { + User::Leave( KErrArgument ); + } + + CleanSelectionResult(); + + iResultLandmark = PosLandmarkSerialization::PackL( aLandmark ); + + TMnMapSelectionResultInfo info( *iResultLandmark ); + TPckgC resultInfoPack( info ); + + TInt err = iMessage.Write( EMnIpcMapSelectionResultInfoParamIndex, resultInfoPack ); + + CompleteRequest( err ); + + LOG("CMnMapViewServiceBase::CompleteSelectionRequestL(free) out"); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C void CMnMapViewServiceBase::CompleteSelectionRequest( TInt aLandmarkIndex ) + { + LOG1("CMnMapViewServiceBase::CompleteSelectionRequest(index) in, index=%d", aLandmarkIndex); + + if ( !IsAsyncRequestActive() ) + { + PanicServer( KMnPanicAttemptToCompleteNoRequest ); + } + + if ( aLandmarkIndex < 0 || aLandmarkIndex >= iLandmarks.Count() ) + { + PanicServer( KMnPanicArrayIndexOutOfBounds ); + } + + CleanSelectionResult(); + + TMnMapSelectionResultInfo info( aLandmarkIndex ); + TPckgC resultInfoPack( info ); + + TInt err = iMessage.Write( EMnIpcMapSelectionResultInfoParamIndex, resultInfoPack ); + + CompleteRequest( err ); + + LOG("CMnMapViewServiceBase::CompleteSelectionRequest(index) out"); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C void CMnMapViewServiceBase::CompleteSelectionRequest( + TPosLmItemId aLandmarkId, + TInt aDbIndex) + { + LOG2("CMnMapViewServiceBase::CompleteSelectionRequest(id,db) in, dbIndex %d, lmId %d", + aDbIndex, aLandmarkId); + + if ( !IsAsyncRequestActive() ) + { + PanicServer( KMnPanicAttemptToCompleteNoRequest ); + } + + if ( aDbIndex < 0 || aDbIndex >= iLinkedLandmarksLists.Count() ) + { + LOG1("CMnMapViewServiceBase::CompleteSelectionRequest(id,db) dbIndex invalid, max %d", + iLinkedLandmarksLists.Count()); + PanicServer( KMnPanicArrayIndexOutOfBounds ); + } + + if ( KErrNotFound == iLinkedLandmarksLists[aDbIndex]->iLandmarkIds.Find( aLandmarkId ) ) + { + LOG("CMnMapViewServiceBase::CompleteSelectionRequest(id,db) lmId not found"); + PanicServer( KMnPanicArrayIndexOutOfBounds ); + } + + CleanSelectionResult(); + + TMnMapSelectionResultInfo info( + aLandmarkId, + *(iLinkedLandmarksLists[aDbIndex]->iDatabaseUri) ); + + TPckgC resultInfoPack( info ); + TInt err = iMessage.Write( EMnIpcMapSelectionResultInfoParamIndex, resultInfoPack ); + + CompleteRequest( err ); + + LOG("CMnMapViewServiceBase::CompleteSelectionRequest(id,db) out"); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +EXPORT_C void CMnMapViewServiceBase::ServiceL( const RMessage2& aMessage ) + { + LOG1("CMnMapViewServiceBase::ServiceL in, function %d", aMessage.Function()); + + switch ( aMessage.Function() ) + { + case EMnIpcAddLmIdsToShow: + HandleAddLandmarkIdsToShowL( aMessage ); + break; + + case EMnIpcAddLandmarksToShow: + HandleAddLandmarksToShowL( aMessage ); + break; + + case EMnIpcResetLandmarksToShow: // blind request + ResetLandmarks(); + break; + + case EMnIpcCancel: + HandleCancelRequestL( aMessage ); + break; + + case EMnIpcShowMap: + UnpackOptionsL( aMessage ); + LOG("CMnMapViewServiceBase::ServiceL, calling HandleShowMapL"); + HandleShowMapL(); + Complete( aMessage, KErrNone ); + break; + + case EMnIpcShowCurrentLocation: + UnpackOptionsL( aMessage ); + LOG("CMnMapViewServiceBase::ServiceL, calling HandleShowCurrentLocationL"); + HandleShowCurrentLocationL(); + Complete( aMessage, KErrNone ); + break; + + case EMnIpcInitRequestText: + UnpackSelectionRequestTextL( aMessage ); + Complete( aMessage, KErrNone ); + break; + + case EMnIpcSelectFromMap: + PrepareAsyncRequestL( aMessage ); + UnpackOptionsL( aMessage ); + UnpackSelectionRequestTextL( aMessage ); + VerifySelectionRequestL(); + LOG("CMnMapViewServiceBase::ServiceL, calling HandleSelectFromMapL"); + HandleSelectFromMapL(); + break; + + case EMnIpcGetSelectionResultLandmark: + HandleGetSelectionResultLandmarkL( aMessage ); + break; + + case EMnIpcGetSelectionResultDbUri: + HandleGetSelectionResultDbUriL( aMessage ); + break; + + default: + CMnServiceBase::ServiceL( aMessage ); + } +} + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnMapViewServiceBase::CleanSelectionResult() + { + delete iResultLandmark; + iResultLandmark = NULL; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnMapViewServiceBase::HandleAddLandmarkIdsToShowL( const RMessage2& aMessage ) + { + LOG("CMnMapViewServiceBase::HandleAddLandmarkIdsToShowL in"); + + if ( IsAsyncRequestActive() ) + { + User::Leave( KErrLocked ); + } + + // Read client's data + HBufC* uri = CopyClientBufferLC( aMessage, EMnIpcMapDbUriParamIndex ); + HBufC8* buf = CopyClientBuffer8LC( aMessage, EMnIpcMapLmIdsParamIndex ); + + if ( buf->Size() % ( sizeof( TPosLmItemId ) ) != 0 ) + { + User::Leave( KErrArgument ); + } + + TInt lmCount = buf->Size() / ( sizeof( TPosLmItemId ) ); + const TPosLmItemId* ids = reinterpret_cast( buf->Ptr() ); + + // Save data to internal structs + iTempDatabaseList.Reset(); + CLinkedLandmarksList* linked = NULL; + + // check if this database is already listed + TInt dbIndex = FindDatabase( *uri ); + if ( dbIndex == KErrNotFound ) + { + linked = new (ELeave) CLinkedLandmarksList; + CleanupStack::PushL( linked ); + linked->iDatabaseUri = uri; + iLinkedLandmarksLists.AppendL( linked ); + CleanupStack::Pop( linked ); + } + else + { + linked = iLinkedLandmarksLists[dbIndex]; + } + + for ( TInt i = 0; i < lmCount; i++ ) + { + linked->iLandmarkIds.AppendL( ids[i] ); + } + + // Finalize + Complete( aMessage, KErrNone ); + + CleanupStack::PopAndDestroy( buf ); + CleanupStack::Pop( uri ); + + LOG("CMnMapViewServiceBase::HandleAddLandmarkIdsToShowL out"); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnMapViewServiceBase::HandleAddLandmarksToShowL( const RMessage2& aMessage ) + { + LOG("CMnMapViewServiceBase::HandleAddLandmarksToShowL in"); + + if ( IsAsyncRequestActive() ) + { + User::Leave( KErrLocked ); + } + + HBufC8* buf = CopyClientBuffer8LC( aMessage, EMnIpcMapLandmarksParamIndex ); + RDesReadStream readStream( *buf ); + + LOG1("CMnMapViewServiceBase::HandleAddLandmarksToShowL buffersize %d", buf->Size()); + + TInt lmCount = readStream.ReadInt32L(); + + LOG1("CMnMapViewServiceBase::HandleAddLandmarksToShowL lmCount %d", lmCount); + + for ( TInt i = 0; i < lmCount; i++ ) + { + TInt lmSize = readStream.ReadInt32L(); + + HBufC8* lmBuf = HBufC8::NewLC( lmSize ); + + TPtr8 lmData( lmBuf->Des() ); + readStream.ReadL( lmData, lmSize ); + + CPosLandmark* lm = PosLandmarkSerialization::UnpackL( *lmBuf ); + CleanupStack::PushL( lm ); + + iLandmarks.AppendL( lm ); + + CleanupStack::Pop( lm ); + CleanupStack::PopAndDestroy( lmBuf ); + } + + readStream.Close(); + CleanupStack::PopAndDestroy( buf ); + + Complete( aMessage, KErrNone ); + LOG("CMnMapViewServiceBase::HandleAddLandmarksToShowL out"); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnMapViewServiceBase::HandleGetSelectionResultLandmarkL( const RMessage2& aMessage ) + { + LOG("CMnMapViewServiceBase::HandleGetSelectionResultLandmarkL in"); + + if ( iResultLandmark ) + { + aMessage.WriteL( EMnIpcMapSelResultBufferParamIndex, *iResultLandmark ); + Complete( aMessage, KErrNone ); + } + else + { + User::Leave( KErrNotFound ); + } + + LOG("CMnMapViewServiceBase::HandleGetSelectionResultLandmarkL out"); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnMapViewServiceBase::HandleGetSelectionResultDbUriL( const RMessage2& aMessage ) + { + LOG("CMnMapViewServiceBase::HandleGetSelectionResultDbUriL in"); + + __ASSERT_DEBUG( + iResultDbIndex >= 0 && iResultDbIndex < iLinkedLandmarksLists.Count() , + Panic( KErrGeneral ) ); + + if ( iResultDbIndex != KErrNotFound ) + { + __ASSERT_DEBUG( + iLinkedLandmarksLists[iResultDbIndex]->iDatabaseUri , + Panic( KErrGeneral ) ); + + aMessage.WriteL( + EMnIpcMapSelResultBufferParamIndex, + *(iLinkedLandmarksLists[iResultDbIndex]->iDatabaseUri) ); + + Complete( aMessage, KErrNone ); + } + else + { + User::Leave( KErrNotFound ); + } + + LOG("CMnMapViewServiceBase::HandleGetSelectionResultDbUriL out"); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnMapViewServiceBase::ResetLandmarks() + { + if ( !IsAsyncRequestActive() ) + { + iLandmarks.ResetAndDestroy(); + iLinkedLandmarksLists.ResetAndDestroy(); + } + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +TInt CMnMapViewServiceBase::FindDatabase( const TDesC& aUri ) + { + for ( TInt i = 0; i < iLinkedLandmarksLists.Count(); i++ ) + { + CLinkedLandmarksList* list = iLinkedLandmarksLists[i]; + if ( list->iDatabaseUri->Compare( aUri ) == 0 ) + { + return i; + } + } + return KErrNotFound; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnMapViewServiceBase::UnpackOptionsL( const RMessage2& aMsg ) + { + HBufC8* buf = CopyClientBuffer8LC( aMsg, EMnIpcMapOptionsParamIndex ); + const TMnMapOptions& options = *( + reinterpret_cast( buf->Ptr() ) ); + + iOptions = options.iOptions; + iCurrentLocationOption = options.iCurrentLocationOption; + iCentralPoint = options.iCentralPoint; + iRadius = options.iRadius; + + CleanupStack::PopAndDestroy( buf ); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnMapViewServiceBase::UnpackSelectionRequestTextL( const RMessage2& aMsg ) + { + HBufC* buf = CopyClientBufferLC( aMsg, EMnIpcMapSelectionTextParamIndex ); + + delete iSelectionRequestText; + iSelectionRequestText = NULL; + iSelectionRequestText = buf; + + CleanupStack::Pop( buf ); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnMapViewServiceBase::VerifySelectionRequestL() + { + if ( iOptions & CMnMapView::EOptionRestrictSelection ) + { + // find out how many landmarks are given + TInt num = iLandmarks.Count(); + for ( TInt i = 0; i < iLinkedLandmarksLists.Count(); i++ ) + { + CLinkedLandmarksList* linked = iLinkedLandmarksLists[i]; + num += linked->iLandmarkIds.Count(); + } + LOG1("CMnMapViewServiceBase::VerifySelectionRequestL, restricted with %d landmarks", num); + if ( num < 1 ) + { + User::Leave( KErrArgument ); + } + } + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CMnMapViewServiceBase::CLinkedLandmarksList::~CLinkedLandmarksList() + { + delete iDatabaseUri; + iLandmarkIds.Close(); + } + +