diff -r 000000000000 -r 8466d47a6819 meetingrequest/mrgui/mrlocationplugin/src/cesmrlocationpluginimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrgui/mrlocationplugin/src/cesmrlocationpluginimpl.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,373 @@ +/* +* 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: Location plugin implementation +* +*/ + + +#include "emailtrace.h" +#include +#include +// +#include "mnmapview.h" +#include +#include +#include +#include "cesmrurlparserplugin.h" +// +#include + +#include "cesmrlocationpluginimpl.h" +#include "mesmrlocationpluginobserver.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CESMRLocationPluginImpl::CESMRLocationPluginImpl +// --------------------------------------------------------------------------- +// +CESMRLocationPluginImpl::CESMRLocationPluginImpl() + : CESMRLocationPlugin( CActive::EPriorityStandard ) + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CESMRLocationPluginImpl::ConstructL +// --------------------------------------------------------------------------- +// +void CESMRLocationPluginImpl::ConstructL() + { + FUNC_LOG; + // Find Map & Navigation provider + RCPointerArray providers; + CleanupClosePushL( providers ); + MnProviderFinder::FindProvidersL( providers, + CMnProvider::EServiceMapView + | CMnProvider::EServiceNavigation + | CMnProvider::EServiceGeocoding ); + if ( providers.Count() == 0 ) + { + User::Leave( KErrNotSupported ); + } + iProvider = providers[ 0 ]; + providers.Remove( 0 ); + // PopAndDestroy provides from cleanupstack + CleanupStack::PopAndDestroy( &providers ); + + // Create Map & Navigation view + CreateMapViewL(); + + iUrlParser = CESMRUrlParserPlugin::NewL(); + + CActiveScheduler::Add( this ); + } + + +// --------------------------------------------------------------------------- +// CESMRLocationPluginImpl::NewL +// --------------------------------------------------------------------------- +// +CESMRLocationPluginImpl* CESMRLocationPluginImpl::NewL() + { + FUNC_LOG; + CESMRLocationPluginImpl* self = new( ELeave ) CESMRLocationPluginImpl(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CESMRLocationPluginImpl::SetObserver +// --------------------------------------------------------------------------- +// +void CESMRLocationPluginImpl::SetObserver ( MESMRLocationPluginObserver* aObserver ) + { + FUNC_LOG; + iObserver = aObserver; + } +// --------------------------------------------------------------------------- +// CESMRLocationPluginImpl::~CESMRLocationPluginImpl +// --------------------------------------------------------------------------- +// +CESMRLocationPluginImpl::~CESMRLocationPluginImpl() + { + FUNC_LOG; + Cancel(); + if ( iMapView ) + { + iMapView->RemoveExitObserver(); + delete iMapView; + } + delete iProvider; + delete iUrlParser; + + iLandMarks.ResetAndDestroy(); + } + +// --------------------------------------------------------------------------- +// CESMRLocationPluginImpl::CreateMapViewL +// --------------------------------------------------------------------------- +// +void CESMRLocationPluginImpl::CreateMapViewL() + { + FUNC_LOG; + if ( !iMapView ) + { + iMapView = CMnMapView::NewChainedL( *iProvider ); + iMapView->SetExitObserverL( *this ); + } + } + +// --------------------------------------------------------------------------- +// CESMRLocationPluginImpl::SelectFromMapL +// From class MESMRLocationPlugin. +// --------------------------------------------------------------------------- +// +void CESMRLocationPluginImpl::SelectFromMapL( const TDesC& aSearchQuery, + const TDesC& aLocationUrl ) + { + FUNC_LOG; + iLandMarks.ResetAndDestroy(); + + if ( IsActive() ) + { + User::Leave( KErrInUse ); + } + + CreateMapViewL(); + + iMapView->ResetMapArea(); + + // Create landmark from location URL. TRAP errors because URL is optional. + CPosLandmark* location = NULL; + TRAP_IGNORE( location = //codescanner::forgottoputptroncleanupstack + iUrlParser->CreateLandmarkFromUrlL( aLocationUrl ) ) + + if ( location ) // Landmark created. Set search string as landmark name + { + if ( aSearchQuery.Length() > 0 ) + { + CleanupStack::PushL( location ); + + location->SetLandmarkNameL( aSearchQuery ); + + iLandMarks.AppendL( location ); + CleanupStack::Pop( location ); + + iMapView->ResetLandmarksToShow(); + iMapView->AddLandmarksToShowL( iLandMarks ); + } + } + else + { + // No location url provided, let's search from maps + // with search string. It was agreed that search is done by + // passing a landmark with search string as the name of the landmark + // forward + if ( aSearchQuery.Length() > 0 ) + { + location = CPosLandmark::NewLC(); + location->SetLandmarkNameL( aSearchQuery ); + + iLandMarks.AppendL( location ); + CleanupStack::Pop( location ); + + iMapView->ResetLandmarksToShow(); + iMapView->AddLandmarksToShowL( iLandMarks ); + } + + // Enable current location focus on map + iMapView-> + SetCurrentLocationOption( CMnMapView::ECurrentLocationEnabled ); + } + + SetActive(); + iMapView->SelectFromMapL( iStatus ); + } + +// --------------------------------------------------------------------------- +// CESMRLocationPluginImpl::SearchFromMapL +// From class MESMRLocationPlugin. +// --------------------------------------------------------------------------- +// +void CESMRLocationPluginImpl::SearchFromMapL( const TDesC& aSearchQuery ) + { + FUNC_LOG; + iLandMarks.ResetAndDestroy(); + + CPosLandmark* location = CPosLandmark::NewLC(); + location->SetLandmarkNameL( aSearchQuery ); + + iLandMarks.AppendL( location ); + CleanupStack::Pop( location ); + + iMapView->ResetLandmarksToShow(); + iMapView->AddLandmarksToShowL( iLandMarks ); + iMapView->ShowMapL(); + } + +// --------------------------------------------------------------------------- +// CESMRLocationPluginImpl::ShowOnMapL +// From class MESMRLocationPlugin. +// --------------------------------------------------------------------------- +// +void CESMRLocationPluginImpl::ShowOnMapL( const TDesC& aLocationUrl ) + { + FUNC_LOG; + CreateMapViewL(); + + iMapView->ResetLandmarksToShow(); + RCPointerArray landmarks; + CleanupClosePushL( landmarks ); + CPosLandmark* landmark = iUrlParser->CreateLandmarkFromUrlL( aLocationUrl ); + CleanupStack::PushL( landmark ); + landmarks.AppendL( landmark ); + CleanupStack::Pop( landmark ); + iMapView->AddLandmarksToShowL( landmarks ); + CleanupStack::PopAndDestroy( &landmarks ); + iMapView->ShowMapL(); + } + +// --------------------------------------------------------------------------- +// CESMRLocationPluginImpl::DoCancel +// From class CActive. +// Cancels outstanding request to iMapView +// --------------------------------------------------------------------------- +// +void CESMRLocationPluginImpl::DoCancel() + { + FUNC_LOG; + if( iMapView ) + { + iMapView->Cancel(); + } + } + +// --------------------------------------------------------------------------- +// CESMRLocationPluginImpl::RunL +// From class CActive. +// Process asynchronous SelectFromMap completion from CMnMapView +// --------------------------------------------------------------------------- +// +void CESMRLocationPluginImpl::RunL() + { + FUNC_LOG; + HandleSelectFromMapCompletedL(); + } + +// --------------------------------------------------------------------------- +// CESMRLocationPluginImpl::HandleSelectFromMapCompletedL +// --------------------------------------------------------------------------- +// +void CESMRLocationPluginImpl::HandleSelectFromMapCompletedL() + { + FUNC_LOG; + if ( iStatus == KErrNone ) + { + CMnMapView::TSelectionResultType type; + type = iMapView->SelectionResultType(); + + if ( iObserver ) + { + switch ( type ) + { + case CMnMapView::ESelectionFreeLandmark: + { + // Read selection from map view, send result to observer + CPosLandmark* landmark = + iMapView->RetrieveSelectionResultL(); + iObserver->SelectFromMapCompleted( iStatus.Int(), + landmark ); + break; + } + case CMnMapView::ESelectionLandmarkIndex: + { + TInt landmarkIndex = 0; + iMapView->RetrieveSelectionResultL( landmarkIndex ); + + if ( landmarkIndex < iLandMarks.Count() ) + { + iObserver->SelectFromMapCompleted( + iStatus.Int(), + iLandMarks[landmarkIndex] ); + iLandMarks.Remove( landmarkIndex ); + } + else + { + User::Leave( KErrGeneral ); + } + break; + } + default: + { + User::Leave( KErrNotSupported ); + break; + } + } + } + } + else if (iObserver) + { + // Notify error to observer + iObserver->SelectFromMapCompleted( iStatus.Int(), NULL ); + } + + // Close Map view + delete iMapView; + iMapView = NULL; + } + +// --------------------------------------------------------------------------- +// CESMRLocationPluginImpl::RunError +// From class CActive. +// --------------------------------------------------------------------------- +// +TInt CESMRLocationPluginImpl::RunError( TInt aError ) + { + FUNC_LOG; + // Notify error to observer + if(iObserver) + { + iObserver->SelectFromMapCompleted( aError, NULL ); + } + + // Close Map view + delete iMapView; + iMapView = NULL; + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CESMRLocationPluginImpl::HandleServerAppExit +// From class MAknServerAppExitObserver. +// --------------------------------------------------------------------------- +// +void CESMRLocationPluginImpl::HandleServerAppExit( TInt aReason ) + { + FUNC_LOG; + Cancel(); + + if ( iObserver ) + { + // Notify observer that application has been closed without selection. + iObserver->SelectFromMapCompleted( aReason, NULL ); + } + + delete iMapView; + iMapView = NULL; + } +