meetingrequest/mrgui/mrlocationplugin/src/cesmrlocationpluginimpl.cpp
branchRCL_3
changeset 25 3533d4323edc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrgui/mrlocationplugin/src/cesmrlocationpluginimpl.cpp	Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,475 @@
+/*
+* Copyright (c) 2009 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 "cesmrlocationpluginimpl.h"
+#include "mesmrlocationpluginobserver.h"
+#include "cesmrurlparserplugin.h"
+
+#include <mnproviderfinder.h>
+#include <mnprovider.h>
+#include <mnmapview.h>
+#include <EPos_CPosLandmark.h>
+#include <StringLoader.h>
+#include <esmrgui.rsg>
+#include <ct/rcpointerarray.h>
+#include <calentry.h>
+
+#include "emailtrace.h"
+
+// ======== LOCAL FUNCTIONS ========
+
+namespace
+    {
+/**
+ * Converts vCal GEO value to landmark with coordinates
+ *
+ * @param aGeoValue coordinates
+ * @return a landmark with coordinates
+ */
+CPosLandmark* CreateLandmarkL( const CCalGeoValue& aGeoValue )
+    {
+    TReal lat;
+    TReal lon;
+
+    if( !aGeoValue.GetLatLong( lat, lon ) )
+        {
+        User::Leave( KErrArgument );
+        }
+
+    CPosLandmark* landmark = CPosLandmark::NewLC();
+    TLocality coordinate;
+    coordinate.SetCoordinate( lat, lon );
+    landmark->SetPositionL( coordinate );
+    CleanupStack::Pop( landmark );
+    return landmark;
+    }
+
+    }
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRLocationPluginImpl::CESMRLocationPluginImpl
+// ---------------------------------------------------------------------------
+//
+CESMRLocationPluginImpl::CESMRLocationPluginImpl()
+    : CESMRLocationPlugin( CActive::EPriorityStandard )
+    {
+    FUNC_LOG;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationPluginImpl::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationPluginImpl::ConstructL()
+    {
+    FUNC_LOG;
+    // Find Map & Navigation provider
+    RCPointerArray<CMnProvider> providers;
+    CleanupClosePushL( providers );
+    MnProviderFinder::FindProvidersL( providers,
+                                      CMnProvider::EServiceMapView
+                                      | CMnProvider::EServiceNavigation );
+    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();
+
+    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;
+
+    // Create landmark from location URL. TRAP errors because URL is optional.
+    CPosLandmark* location = NULL;
+    TRAP_IGNORE( location = //codescanner::forgottoputptroncleanupstack
+            UrlParserL().CreateLandmarkFromUrlL( aLocationUrl ) )
+
+    SelectFromMapL( aSearchQuery, location );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationPluginImpl::SelectFromMapL
+// From class MESMRLocationPlugin.
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationPluginImpl::SelectFromMapL(
+            const TDesC& aSearchQuery,
+            const CCalGeoValue* aGeoValue )
+    {
+    FUNC_LOG;
+
+    CPosLandmark* location = NULL;
+
+    if ( aGeoValue )
+        {
+        location = CreateLandmarkL( *aGeoValue );
+        }
+
+    SelectFromMapL( aSearchQuery, location );
+    }
+
+// ---------------------------------------------------------------------------
+// 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 );
+
+    CreateMapViewL();
+
+    iMapView->ResetLandmarksToShow();
+    iMapView->AddLandmarksToShowL( iLandMarks );
+    iMapView->ShowMapL();
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationPluginImpl::ShowOnMapL
+// From class MESMRLocationPlugin.
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationPluginImpl::ShowOnMapL( const TDesC& aLocationUrl )
+    {
+    FUNC_LOG;
+
+    CPosLandmark* landmark =
+        UrlParserL().CreateLandmarkFromUrlL( aLocationUrl );
+    ShowLandmarkL( landmark );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationPluginImpl::ShowOnMapL
+// From class MESMRLocationPlugin.
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationPluginImpl::ShowOnMapL( const CCalGeoValue& aGeoValue )
+    {
+    FUNC_LOG;
+
+    CPosLandmark* landmark = CreateLandmarkL( aGeoValue );
+    ShowLandmarkL( landmark );
+    }
+
+// ---------------------------------------------------------------------------
+// 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;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationPluginImpl::ShowLandmarkL
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationPluginImpl::SelectFromMapL(
+        const TDesC& aSearchQuery,
+        CPosLandmark* aLandmark )
+    {
+    iLandMarks.ResetAndDestroy();
+
+    if ( IsActive() )
+        {
+        User::Leave( KErrInUse );
+        }
+
+    CreateMapViewL();
+
+    iMapView->ResetMapArea();
+
+    CPosLandmark* location = aLandmark;
+
+    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::ShowLandmarkL
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationPluginImpl::ShowLandmarkL( CPosLandmark* aLandmark )
+    {
+    CreateMapViewL();
+
+    iMapView->ResetLandmarksToShow();
+    RCPointerArray<CPosLandmark> landmarks;
+    CleanupClosePushL( landmarks );
+    CleanupStack::PushL( aLandmark );
+    landmarks.AppendL( aLandmark );
+    CleanupStack::Pop( aLandmark );
+    iMapView->AddLandmarksToShowL( landmarks );
+    CleanupStack::PopAndDestroy( &landmarks );
+    iMapView->ShowMapL();
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationPluginImpl::UrlParserL
+// ---------------------------------------------------------------------------
+//
+CESMRUrlParserPlugin& CESMRLocationPluginImpl::UrlParserL()
+    {
+    if ( !iUrlParser )
+        {
+        iUrlParser = CESMRUrlParserPlugin::NewL();
+        }
+
+    return *iUrlParser;
+    }
+
+// EOF