--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarksui/uicontrols/src/clmkmapnavigationinterface.cpp Wed Sep 01 12:31:27 2010 +0100
@@ -0,0 +1,626 @@
+/*
+* Copyright (c) 2006-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: Applications interface class to map and navigation use cases
+*
+*/
+
+
+// INCLUDE FILES
+#include <AiwGenericParam.h>
+#include <epos_poslandmarkserialization.h>
+#include <lbsposition.h>
+#include <eikenv.h>
+#include <StringLoader.h>
+#include <lmkui.rsg>
+#include <EPos_CPosLandmarkDatabase.h>
+#include <EPos_CPosLmOperation.h>
+#include <EPos_CPosLandmark.h>
+#include <EPos_Landmarks.h>
+#include <e32math.h>
+#include <AiwServiceHandler.h>
+#include <AknQueryDialog.h>
+#include <mnaiwservices.h>
+#include <AknWaitDialog.h>
+#include "clmkdbsearchutils.h"
+#include "CLmkSender.h"
+#include "CLmkEditorImpl.h"
+#include "LmkNotes.h"
+#include "clmkmapnavigationinterface.h"
+
+// ================= LOCAL FUNCTIONS =======================
+static void CleanupArray(TAny* aArray)
+ {
+ ( reinterpret_cast<RPointerArray<CPosLandmark>*>( aArray ) )->ResetAndDestroy();
+ }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::CLmkMapNavigationInterface
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CLmkMapNavigationInterface::CLmkMapNavigationInterface( CPosLandmarkDatabase& aDb )
+ : iDb(aDb)
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CLmkMapNavigationInterface::ConstructL()
+ {
+ iAiwServiceHandler = CAiwServiceHandler::NewL();
+ iInList = CAiwGenericParamList::NewL();
+ iOutList = CAiwGenericParamList::NewL();
+ iSearchUtil = NULL;
+ iCategoryName = NULL;
+ iCategoryId = KPosLmNullItemId;
+ iEnv = CEikonEnv::Static();
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::NewL
+// Symbian 1st phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CLmkMapNavigationInterface* CLmkMapNavigationInterface::NewL( CPosLandmarkDatabase& aDb)
+ {
+ CLmkMapNavigationInterface* self = static_cast<CLmkMapNavigationInterface*>(Dll::Tls());
+ if(!self)
+ {
+ self = new (ELeave) CLmkMapNavigationInterface( aDb );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();//self
+ Dll::SetTls(self);
+ }
+ self->iRefCnt++;
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::~CLmkMapNavigationInterface
+// C++ Destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CLmkMapNavigationInterface::~CLmkMapNavigationInterface()
+ {
+ Dll::SetTls( NULL );
+ delete iAiwServiceHandler;
+ delete iInList;
+ delete iOutList;
+ delete iCategoryName;
+ delete iSearchUtil;
+ iLandmarkArray.ResetAndDestroy();
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::HandleNotifyL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CLmkMapNavigationInterface::HandleNotifyL( TInt /*aCmdId*/,
+ TInt /*aEventId*/,
+ CAiwGenericParamList& /*aEventParamList*/,
+ const CAiwGenericParamList& /*aInParamList*/ )
+ {
+ if ( iOutList->Count() )
+ {
+ const TAiwGenericParam& param = ( *iOutList )[0];
+ if ( EGenericParamLandmark == param.SemanticId() )
+ {
+ TPtrC8 landmarkData( param.Value().AsData() );
+ CPosLandmark* lm = PosLandmarkSerialization::UnpackL( landmarkData );
+ CleanupStack::PushL( lm );
+ SaveLandmarkL( *lm );
+ CleanupStack::PopAndDestroy( lm );
+ }
+ iOutList->Reset();
+ }
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::DialogDismissedL
+// -----------------------------------------------------------------------------
+//
+void CLmkMapNavigationInterface::DialogDismissedL( TInt /*aButtonId*/ )
+ {
+ CleanupStack::PushL( TCleanupItem( CleanupArray, &iLandmarkArray ) );
+ ShowLandmarksOnMapL( iLandmarkArray, iCategoryCommand, iViewType );
+ iLandmarkArray.ResetAndDestroy();
+ CleanupStack::PopAndDestroy(); //iLandmarkArray
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::SaveLandmarkL
+// -----------------------------------------------------------------------------
+//
+void CLmkMapNavigationInterface::SaveLandmarkL(CPosLandmark& aLandmark)
+ {
+ CPosLandmarkDatabase* db = CPosLandmarkDatabase::OpenL();
+ CleanupStack::PushL( db );
+ CLmkSender* sender = CLmkSender::NewL( *db );
+ CleanupStack::PushL( sender );
+ CPosLmOperation* operation = db->InitializeL();
+ CleanupStack::PushL( operation );
+ operation->ExecuteL();
+
+ if( iCategoryId != KPosLmNullItemId )
+ {
+ aLandmark.AddCategoryL( iCategoryId );
+ }
+
+ CLmkEditorImpl *dlg = CLmkEditorImpl::NewL( *db,
+ *sender,
+ CLmkEditorDlg::ELmkAll,
+ CLmkEditorDlg::ELmkEditor,
+ &aLandmark );
+ if( dlg->ExecuteLD() )
+ {
+ if ( iObserver )
+ {
+ iObserver->HandleLmCreated(aLandmark.LandmarkId());
+ }
+ }
+ CleanupStack::PopAndDestroy(3); //sender, operation and db
+ iCategoryId = KPosLmNullItemId;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::ShowLandmarksOnMapL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CLmkMapNavigationInterface::ShowLandmarksOnMapL(RPointerArray<CPosLandmark> &aArray,
+ TInt aCommand,
+ EViewType aViewType)
+ {
+ CPosLandmark* lm;
+ HBufC8* lmBuf;
+ iViewType = aViewType;
+ // Error checking
+ if(!CheckAndDisplayIfLandmarksEmptyL(aArray))
+ {
+ return;
+ }
+
+ iInList->Reset();
+ // Pack the landmark into generic parameter
+ for(TInt index = 0; index < aArray.Count(); ++index)
+ {
+ lm = aArray[index];
+ lmBuf =PosLandmarkSerialization::PackL( *lm );
+ CleanupStack::PushL( lmBuf );
+ TAiwGenericParam param( EGenericParamLandmark, TAiwVariant( *lmBuf ) );
+ iInList->AppendL( param );
+ TMnAiwCommonOptionsParam options;
+ options.iRunChained = EFalse;
+ TPckg<TMnAiwCommonOptionsParam> optionsPack( options );
+ TAiwGenericParam optParam( EGenericParamMnCommonOptions, TAiwVariant( optionsPack ) );
+ iInList->AppendL( optParam );
+ CleanupStack::PopAndDestroy( lmBuf );
+ }
+ // Send service command for "Show Landmark on Map"
+ iAiwServiceHandler->ExecuteMenuCmdL( aCommand, *iInList, *iOutList, 0, NULL );
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::ShowCategoryOnMapL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CLmkMapNavigationInterface::ShowCategoryOnMapL( TPosLmItemId aCategoryId,
+ TInt aCommand,
+ EViewType aViewType )
+ {
+ iViewType = aViewType;
+ iCategoryCommand = aCommand;
+ // This will get deleted in the callback
+ if(iSearchUtil == NULL)
+ {
+ iSearchUtil = CLmkDbSearchUtils::NewL();
+ }
+ if(iCategoryName != NULL)
+ {
+ delete iCategoryName;
+ iCategoryName = NULL;
+ }
+ iSearchUtil->GetLandmarksUnderCategoryL( this, aCategoryId );
+ if( aCategoryId == KPosLmNullItemId )
+ {
+ iCategoryName = StringLoader::LoadL( R_LMK_LM_LIST_UNCATEGORISED, iEnv );
+ }
+ else
+ {
+ iCategoryName = iSearchUtil->GetCategoryNameL( aCategoryId );
+ }
+ iWaitNote = new (ELeave) CAknWaitDialog( NULL, ETrue );
+ iWaitNote->SetCallback( this );
+ iWaitNote->ExecuteLD( R_LMKUI_PROCESSING_WAIT_NOTE );
+ iWaitNote = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::NavigateToLandmarkL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CLmkMapNavigationInterface::NavigateToLandmarkL( CPosLandmark* aLandmark, TInt aCommand )
+ {
+ HBufC8* lmBuf = PosLandmarkSerialization::PackL( *aLandmark );
+ CleanupStack::PushL( lmBuf );
+ TAiwGenericParam param( EGenericParamLandmark, TAiwVariant( *lmBuf ) );
+ iInList->Reset();
+ iInList->AppendL( param );
+ TMnAiwCommonOptionsParam options;
+ options.iRunChained = EFalse;
+ TPckg<TMnAiwCommonOptionsParam> optionsPack( options );
+ TAiwGenericParam optParam( EGenericParamMnCommonOptions, TAiwVariant( optionsPack ) );
+ iInList->AppendL( optParam );
+ CleanupStack::PopAndDestroy( lmBuf );
+ iAiwServiceHandler->ExecuteMenuCmdL( aCommand, *iInList, *iOutList, 0, NULL );
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::GetLandmarkFromMapL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CLmkMapNavigationInterface::GetLandmarkFromMapL( TInt aCommand )
+ {
+ // This string will be sent to the provider to display it in the map view
+ HBufC* buf = StringLoader::LoadLC( R_LM_SELECT_FROM_MAP, iEnv );
+ TAiwGenericParam param( EGenericParamRequestText, TAiwVariant( *buf ) );
+ iInList->Reset();
+ iInList->AppendL( param );
+ iOutList->Reset();
+ iAiwServiceHandler->ExecuteMenuCmdL( aCommand, *iInList, *iOutList, 0, this );
+ CleanupStack::PopAndDestroy(); // buf
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::GetLandmarkFromMapForCategoryL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CLmkMapNavigationInterface::GetLandmarkFromMapForCategoryL( TInt aCommand, TPosLmItemId aCategoryId )
+ {
+ iCategoryId = aCategoryId;
+ GetLandmarkFromMapL( aCommand );
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::GetServiceCmdByMenuCmd
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CLmkMapNavigationInterface::GetServiceCmdByMenuCmd( TInt aCommand )
+ {
+ return iAiwServiceHandler->ServiceCmdByMenuCmd( aCommand );
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::AttachAIWInterestL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CLmkMapNavigationInterface::AttachAIWInterestL(TInt aMenuPane, TInt aInterest)
+ {
+ iAiwServiceHandler->AttachMenuL(aMenuPane, aInterest);
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::AttachAIWInterestL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CLmkMapNavigationInterface::HandleMenuOperationL( TInt aResourceId,
+ CEikMenuPane *aMenuPane,
+ TInt aBaseCommand )
+ {
+ if(iAiwServiceHandler->HandleSubmenuL( *aMenuPane ))
+ {
+ return ETrue;
+ }
+
+ // Checks whether it is aiw menu or not
+ if ( iAiwServiceHandler->IsAiwMenu( aResourceId ) )
+ {
+ CAiwGenericParamList* params = CAiwGenericParamList::NewLC();
+
+ // Adds the aiw plugin menus
+ TInt err;
+ TRAP( err, iAiwServiceHandler->InitializeMenuPaneL(
+ *aMenuPane, aResourceId, aBaseCommand, *params ) );
+ CleanupStack::PopAndDestroy(); // params
+ return ETrue;
+ }
+
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::AttachMenuPaneL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CLmkMapNavigationInterface::AttachMenuPaneL( CEikMenuPane *aMenuPane, TInt aResourceId, TInt aBaseCommand )
+ {
+ if(iAiwServiceHandler->IsAiwMenu( aResourceId ))
+ {
+ CAiwGenericParamList* params = CAiwGenericParamList::NewLC();
+ TInt err = KErrNone;
+ TRAP( err, iAiwServiceHandler->InitializeMenuPaneL(
+ *aMenuPane, aResourceId, aBaseCommand, *params ) );
+ CleanupStack::PopAndDestroy( params );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::DetachInterestL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CLmkMapNavigationInterface::DetachInterestL( TInt aMenuResourceId, TInt aInterestresourceId )
+ {
+ iAiwServiceHandler->DetachMenu( aMenuResourceId, aInterestresourceId );
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::HandleCategorySearchNotifyL
+// -----------------------------------------------------------------------------
+//
+void CLmkMapNavigationInterface::HandleCategorySearchNotifyL( RArray<TPosLmItemId> aArray )
+ {
+ iLandmarkArray.ResetAndDestroy();
+ for(TInt i = 0; i < aArray.Count(); ++i)
+ {
+ CPosLandmark* lmk = iSearchUtil->GetLandmarkForIdL( aArray[i] );
+ iLandmarkArray.Append( lmk );
+ }
+ if(iWaitNote)
+ {
+ iWaitNote->ProcessFinishedL();
+ }
+ delete iSearchUtil;
+ iSearchUtil = NULL;
+ }
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::HandleLmkSearchNotifyL
+// -----------------------------------------------------------------------------
+//
+void CLmkMapNavigationInterface::HandleLmkSearchNotifyL()
+ {
+ // Do nothing
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::CheckAndDisplayIfLandmarksEmptyL
+// -----------------------------------------------------------------------------
+//
+TBool CLmkMapNavigationInterface::CheckAndDisplayIfLandmarksEmptyL( RPointerArray<CPosLandmark> &aArray )
+ {
+ //Error cases when Landmark(s) is/are empty
+ enum ErrorCases
+ {
+ EErrAllEmpty, // All selected landmarks are empty
+ EErrSomeEmpty, // Some selected landmarks are empty
+ EErrOneEmpty, // Only one of the selected landmark is empty
+ EErrOnlyOneAndEmpty, // Only one landmark is selected and that is empty
+ EErrNone // All landmarks have valid coordinate data
+ };
+
+ TInt count = aArray.Count();
+ TInt err = EErrNone;
+ CPosLandmark* lmk;
+ TInt numberOfEmptyLmk = 0;
+ TInt emptyIndex = 0;
+
+ for(TInt index = 0; index < count; ++index)
+ {
+ lmk = aArray[index];
+ if( IsLandmarkDataEmptyL(*lmk) )
+ {
+ err = EErrSomeEmpty;
+ ++numberOfEmptyLmk;
+ emptyIndex = index;
+ }
+ }
+
+ if(numberOfEmptyLmk == count)
+ {
+ /*
+ * When view type is by lmk view then we make the check for
+ * only one landmark.
+ */
+ if( count == 1 && (EByLmkView == iViewType) )
+ {
+ err = EErrOnlyOneAndEmpty;
+ }
+ else
+ {
+ err = EErrAllEmpty;
+ }
+ }
+ else if(err == EErrSomeEmpty && numberOfEmptyLmk == 1)
+ {
+ err = EErrOneEmpty;
+ }
+
+ switch(err)
+ {
+ case EErrAllEmpty:
+ {
+ if(EByLmkView == iViewType)
+ {
+ LmkNotes::AllLandmarksEmptyNoteL( iEnv );
+ }
+ else
+ {
+ LmkNotes::CategoryEmptyNoteL( iEnv, iCategoryName->Des());
+ }
+ return EFalse;
+ }
+ case EErrSomeEmpty:
+ {
+ HBufC* noteText = NULL;
+
+ if(EByLmkView == iViewType)
+ {
+ noteText = StringLoader::LoadLC( R_LM_SHOW_QUERY_NO_COORDINATES_SEVERAL,
+ numberOfEmptyLmk,
+ iEnv );
+ }
+ else
+ {
+ CPtrC16Array* array = new (ELeave) CPtrC16Array(2);
+ array->Reset();
+ CleanupStack::PushL( array );
+ HBufC* ptr = iCategoryName->AllocLC();
+ array->AppendL( *ptr );
+
+ CArrayFix<TInt>* arrFix = new( ELeave ) CArrayFixFlat<TInt>(2);
+ CleanupStack::PushL( arrFix );
+ arrFix->AppendL(numberOfEmptyLmk);
+ noteText = StringLoader::LoadLC( R_LM_SHOW_QUERY_CATEGORY_NO_COORDINATES_SEVERAL,
+ *array,
+ *arrFix,
+ iEnv );
+ CleanupStack::Pop();// noteText
+ CleanupStack::PopAndDestroy( 3 ); //ptr, array
+ CleanupStack::PushL( noteText );
+ }
+
+ CAknQueryDialog* dlg = CAknQueryDialog::NewL( CAknQueryDialog::ENoTone );
+ TInt retVal = dlg->ExecuteLD( R_EMPTY_LANDMARKS_DIALOG, *noteText );
+ CleanupStack::PopAndDestroy( noteText );
+ if(!retVal)
+ {
+ return EFalse;
+ }
+ break;
+ }
+ case EErrOneEmpty:
+ {
+ lmk = aArray[emptyIndex];
+ TPtrC landmarkname;
+ lmk->GetLandmarkName( landmarkname );
+ HBufC* noteText = NULL;
+
+ if(EByLmkView == iViewType)
+ {
+ noteText = StringLoader::LoadLC( R_LM_SHOW_QUERY_NO_COORDINATES_SINGLE,
+ landmarkname,
+ iEnv );
+ }
+ else
+ {
+ CPtrC16Array* array = new (ELeave) CPtrC16Array(2);
+ array->Reset();
+ CleanupStack::PushL( array );
+ HBufC* ptr = landmarkname.AllocLC();
+ array->AppendL( *ptr );
+ array->AppendL( *iCategoryName );
+
+ noteText = StringLoader::LoadLC( R_LM_SHOW_QUERY_CATEGORY_NO_COORDINATES_SINGLE,
+ *array,
+ iEnv );
+ CleanupStack::Pop();// noteText
+ CleanupStack::PopAndDestroy( 2 ); //ptr, array
+ CleanupStack::PushL( noteText );
+ }
+
+ CAknQueryDialog* dlg = CAknQueryDialog::NewL( CAknQueryDialog::ENoTone );
+ TInt retVal = dlg->ExecuteLD( R_EMPTY_LANDMARK_DIALOG, *noteText );
+ CleanupStack::PopAndDestroy( noteText ); //array, lmk, category and noteText
+ if(!retVal)
+ {
+ return EFalse;
+ }
+ break;
+ }
+ case EErrOnlyOneAndEmpty:
+ {
+ lmk = aArray[emptyIndex];
+ TPtrC landmarkname;
+ lmk->GetLandmarkName( landmarkname );
+ if( EByLmkView == iViewType )
+ {
+ // This error case happens only when in by Landmark view.
+ LmkNotes::LandmarksEmptyNoteL( iEnv, landmarkname );
+ }
+ else
+ {
+
+ }
+ return EFalse;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::IsLandmarkDataEmptyL
+// -----------------------------------------------------------------------------
+//
+TBool CLmkMapNavigationInterface::IsLandmarkDataEmptyL( CPosLandmark& aLandmark )
+ {
+ // verify that destination landmark has coordinates
+ TLocality loc;
+ TBool isValid = (KErrNone == aLandmark.GetPosition( loc ) );
+ isValid &= !Math::IsNaN( loc.Latitude() ) && !Math::IsNaN( loc.Longitude() );
+ return !isValid;
+
+/* if ( !isValid )
+ {
+ // verify that destination landmark has address info
+ TPositionFieldId fieldId = aLandmark.FirstPositionFieldId();
+ while ( fieldId != EPositionFieldNone )
+ {
+ if ( fieldId > EPositionFieldAddressCapabilitiesBegin &&
+ fieldId < EPositionFieldBuildingTelephone )
+ {
+ TPtrC field;
+ aLandmark.GetPositionField( fieldId, field );
+ if ( field.Length() )
+ {
+ isValid = ETrue;
+ break;
+ }
+ }
+ fieldId = aLandmark.NextPositionFieldId( fieldId );
+ }
+ }
+ return !isValid;*/
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::SetObserver
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CLmkMapNavigationInterface::SetObserver(MLmkMapAndNavigationObserver* aObserver)
+ {
+ iObserver = aObserver;
+ }
+// -----------------------------------------------------------------------------
+// CLmkMapNavigationInterface::Release
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CLmkMapNavigationInterface::Release()
+ {
+ iRefCnt--;
+ if( iRefCnt == 0)
+ {
+ delete this;
+ }
+ }
+// End of file