commonuis/CommonUi/src/FindItemMenu.cpp
changeset 0 2f259fa3e83a
child 4 8ca85d2f0db7
child 22 75713bee6484
child 33 b3425bf29f82
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonuis/CommonUi/src/FindItemMenu.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,1841 @@
+/*
+* Copyright (c) 2002-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: 
+*
+*/
+
+
+// INCLUDE FILES
+#include <eikmenup.h> // for CEikMenuPane
+#include <bautils.h> // BaflUtils
+#include <eikenv.h> // CEikonEnv
+#include "finditemmenu.h"
+#include <finditemengine.h>
+#include "finditemdialogpanic.h"
+#include <finditemmenu.rsg>
+#include <ConeResLoader.h>
+
+#include <ItemFinder.h>
+
+#include <sendui.h> // for CSendAppUi
+#include <CMessageData.h> // for CMessageData
+
+#include <commonphoneparser.h> // Phonenumber parser
+#include <SendUiConsts.h> // Mtm uids
+
+#include <FavouritesLimits.h> // KFavouritesMaxUrl
+#include <FavouritesItem.h> // for CBookmarkItem
+
+#include <FavouritesDb.h>
+
+#include <apgcli.h> // RApaLsSession for WMLBrowser launch
+#include <apgtask.h>
+
+#ifndef RD_VIRTUAL_PHONEBOOK
+#include <CPbkContactEngine.h> // Phonebook Engine
+#include <RPbkViewResourceFile.h> // Phonebook view dll resource loader
+#include <cpbkdatasaveappui.h> // for PbkDataSaveAppUi
+#include <CPbkFieldsInfo.h> // Phonebook field types
+#else // RD_VIRTUAL_PHONEBOOK
+#include <AiwServiceHandler.h> // CAiwServiceHandler
+#include <AiwContactAssignDataTypes.h> // AiwContactAssign
+#endif // !RD_VIRTUAL_PHONEBOOK
+
+#include "finditem.hrh"
+#include <FindItemui.rsg>
+#include <aknnotewrappers.h>
+
+// add to gallery related
+#include <AknCommonDialogs.h>
+
+#include <featmgr.h>
+
+#include <centralrepository.h>
+#include <CommonUiInternalCRKeys.h>
+
+#include <AiwCommon.hrh>
+#include <SchemeHandler.h>
+
+// Callback query
+#include <aknlists.h>
+#include <aknPopup.h>
+#include <StringLoader.h>
+
+#include "FindItemVoIPExtension.h"
+
+#include "FindItemMenuWrapper.h"
+#include <akncontext.h> // AknContextPane
+
+#include <baclipb.h> // CClipboard
+
+#include "commonuimpengineapiloader.h"
+
+// LOCAL CONSTANTS AND MACROS
+
+// Resource files
+_LIT( KResFileName, "z:\\resource\\finditemmenu.rsc" );
+_LIT( KDialogResourceName, "z:\\resource\\finditemui.rsc" );
+_LIT( KCommonUiMPEngineApiLoaderName, "z:\\sys\\bin\\commonuimpengineapiloader.dll" );
+
+enum  TFindUIAddCNList  //handling popup indeces, update there if order of
+                        // query items changes
+    {
+    EFindUISenderNumber = 0,
+    EFindUICallbackNumber = 1
+    };
+
+
+_LIT( KRtspUrlAddress, "rtsp://" );
+
+const TInt KMaxMenuTextLength = 40;
+
+// Maximum length of Browser bookmark
+const TInt KMaxBookmarkNameLength = 50;
+
+// Entry point for dynamically loaded dlls.
+const TInt KMPEngineApiDllEntryPoint = 1;
+
+// TYPE DEFINITIONS
+typedef TAny* (*MPEngineApiL)();
+
+
+// ============================= MEMBER FUNCTIONS ==============================
+// -----------------------------------------------------------------------------
+// CFindItemMenu::CFindItemMenu
+//  C++ default constructor.
+// -----------------------------------------------------------------------------
+//
+CFindItemMenu::CFindItemMenu() :
+    iCoeEnv( CCoeEnv::Static() ),
+    iResLoader( *iCoeEnv ),
+    iSenderDescType( CItemFinder::EPhoneNumber ),
+    iSenderHighlighted( EFalse )
+#ifdef RD_VOIP_REL_2_2
+    ,iMenuItemFlags( NULL ) // all menu items allowed
+#endif // RD_VOIP_REL_2_2
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CFindItemMenu::ConstructL
+//  Second-phase constructor
+// -----------------------------------------------------------------------------
+//
+void CFindItemMenu::ConstructL( const TInt aCommandId )
+    {
+    iFindItemCommandId = aCommandId;
+    iFindItemMenuItemAdded = EFalse;
+
+    iDialData = CAiwDialDataExt::NewL();
+
+    iMMSFeatureSupported =
+        FeatureManager::FeatureSupported( KFeatureIdMMS );
+
+    iFindItemVoIPExtension = CFindItemVoIPExtension::NewL();
+
+    iAudioMessagingFeatureSupported =
+        FeatureManager::FeatureSupported( KFeatureIdAudioMessaging );
+
+    iEmailOverSmsFeatureSupported =
+        FeatureManager::FeatureSupported( KFeatureIdEmailOverSms );
+
+    iEmailUiFeatureSupported =
+        FeatureManager::FeatureSupported( KFeatureIdEmailUi );
+
+    LoadResourceFileL();
+    }
+
+// -----------------------------------------------------------------------------
+// CFindItemMenu::NewL
+//  Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CFindItemMenu* CFindItemMenu::NewL( const TInt aCommandId )
+    {
+    CFindItemMenu* self = CFindItemMenu::NewLC( aCommandId );
+    CleanupStack::Pop();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CFindItemMenu::NewLC
+//  Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CFindItemMenu* CFindItemMenu::NewLC( const TInt aCommandId )
+    {
+
+    CFindItemMenu* self = new (ELeave) CFindItemMenu;
+    CleanupStack::PushL( self );
+    self->ConstructL( aCommandId );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CFindItemMenu::~CFindItemMenu
+//  Default destructor
+// -----------------------------------------------------------------------------
+//
+CFindItemMenu::~CFindItemMenu()
+    {
+    delete iMPEngineApi;
+    if( iMPEngineDllLoaded )
+        {
+        iMPEngineDll.Close();
+        }
+
+    // Unload the resourcefile
+    iResLoader.Close();
+    delete iFindItemMenuItemString;
+    delete iFindItemUrlItemString;
+    delete iFindItemMailItemString;
+    delete iFindItemPhoneItemString;
+
+    delete iFindItemVoIPExtension;
+
+    if ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) )
+        {
+        delete iFindItemTelInternetItemString;
+        }
+
+#ifndef RD_VIRTUAL_PHONEBOOK
+    delete iPbkEngine;
+    delete iPbkDataSave;
+    if ( iRPbkResourceFile )
+        {
+        iRPbkResourceFile->Close();
+        }
+    delete iRPbkResourceFile;
+#endif // !RD_VIRTUAL_PHONEBOOK
+    delete iSendUi;
+    delete iSenderDescriptor;
+
+    delete iServiceHandler;
+
+    delete iCommonUiRepositoryWatcher;
+    delete iCommonUiRepository;
+
+
+    delete iCallbackNumber;
+    delete iSchemeHandler;
+
+    delete iDialData;
+
+    delete iSenderDisplayText;
+    }
+
+// -----------------------------------------------------------------------------
+// CFindItemMenu::LoadResourceFileL
+//  Loads the resource for menuitems
+// -----------------------------------------------------------------------------
+//
+void CFindItemMenu::LoadResourceFileL()
+    {
+    TFileName fileName( KResFileName );
+    iResLoader.OpenL( fileName );
+
+    // Read menu item's names from resource r_finditemmenu_menu_item
+    iFindItemMenuItemString =
+            iCoeEnv->AllocReadResourceL( R_FINDITEMMENU_MENU_ITEM );
+    iFindItemUrlItemString =
+            iCoeEnv->AllocReadResourceL( R_FINDITEMMENU_URL_ITEM );
+    iFindItemMailItemString =
+            iCoeEnv->AllocReadResourceL( R_FINDITEMMENU_MAIL_ITEM );
+    iFindItemPhoneItemString =
+            iCoeEnv->AllocReadResourceL( R_FINDITEMMENU_PHONE_ITEM );
+    if ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) )
+        {
+        iFindItemTelInternetItemString =
+            iCoeEnv->AllocReadResourceL( R_FINDITEMMENU_TELINTERNET_ITEM );
+        }
+   }
+
+// -----------------------------------------------------------------------------
+// CFindItemMenu::CommandIsValidL
+//  Allows the application's HandleCommandL() method to switch appropriately
+//  on menuselections
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CFindItemMenu::CommandIsValidL( const TInt aCommandId ) const
+    {
+    if ( (iFindItemMenuItemAdded && ( aCommandId > iFindItemCommandId &&
+          aCommandId <= (iFindItemCommandId + (iFindItemVoIPExtension->IsVoIPSupported()?4:3)))) // traditional find
+         ||
+        (!iFindItemMenuItemAdded &&
+        // normal autofind command. Let call ui to handle the VoIP profile
+        // count.
+        ( ( aCommandId >= EFindItemCmdCall &&
+            aCommandId <= EFindItemCmdSendAudio ) ||
+        // or autofind AIW command
+        ( iServiceHandler &&
+        ( iServiceHandler->ServiceCmdByMenuCmd( aCommandId ) == KAiwCmdCall ||
+        iServiceHandler->ServiceCmdByMenuCmd( aCommandId ) ==
+             KAiwCmdAssign ) ) ) ) )
+        {
+        return ETrue;
+        }
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CFindItemMenu::DisplayFindItemMenuItemL
+//
+//  Inserts the FindItem menu item into menupane
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CFindItemMenu::DisplayFindItemMenuItemL(
+    CEikMenuPane& aMenuPane,
+    const TInt aIndex )
+    {
+    // Call this from DynInitMenuPaneL to add a find item menu item to your menu
+    AddMenuItemL(
+        aMenuPane,
+        iFindItemCommandId,
+        aIndex,
+        R_FINDITEMMENU_MENU,
+        *iFindItemMenuItemString );
+
+    iFindItemMenuItemAdded = ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CFindItemMenu::DisplayFindItemCascadeMenuL
+//  Displays the FindItem cascade menu
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CFindItemMenu::DisplayFindItemCascadeMenuL(
+    CEikMenuPane& aMenuPane ) const
+    {
+    // Call this from DynInitMenuPaneL to add a find item's cascading menu
+    // items to your menu
+    if ( iFindItemMenuItemAdded )
+        {
+        AddMenuItemL(
+            aMenuPane,
+            iFindItemCommandId + 1,
+            0,
+            0,
+            *iFindItemPhoneItemString );
+
+        if ( iFindItemVoIPExtension->IsVoIPSupported() )
+            {
+            AddMenuItemL(
+                aMenuPane,
+                iFindItemCommandId + 4,
+                0,
+                0,
+                *iFindItemTelInternetItemString );
+            }
+
+        if ( iEmailUiFeatureSupported )
+            {
+            AddMenuItemL(
+                aMenuPane,
+                iFindItemCommandId + 2,
+                0,
+                0,
+                *iFindItemMailItemString );
+            }
+
+        AddMenuItemL(
+            aMenuPane,
+            iFindItemCommandId + 3,
+            0,
+            0,
+            *iFindItemUrlItemString );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// AddMenuItemL
+//  Adds the menu item to menupane
+// -----------------------------------------------------------------------------
+//
+void CFindItemMenu::AddMenuItemL(
+    CEikMenuPane& aMenuPane,
+    TInt aCommandId,
+    TInt aIndex,
+    TInt aCascadeId,
+    const TDesC& aText ) const
+    {
+    CEikMenuPaneItem::SData data;
+    data.iCascadeId = aCascadeId;
+    data.iFlags = 0;
+    data.iText = aText;
+    data.iCommandId = aCommandId;
+    if ( aIndex == 0 )
+        {
+        aMenuPane.AddMenuItemL( data );
+        }
+    else
+        {
+        aMenuPane.AddMenuItemL( data, aIndex );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CFindItemEngine::TFindItemSearchCase CFindItemMenu::SearchCase
+//  Gives a search case for a command id
+//  Use the return value when creating a CFindItemDialog.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CFindItemEngine::TFindItemSearchCase CFindItemMenu::SearchCase(
+    const TInt aCommandId ) const
+    {
+    switch ( aCommandId - iFindItemCommandId )
+        {
+        case 1:
+            return CFindItemEngine::EFindItemSearchPhoneNumberBin;
+        case 2:
+            return CFindItemEngine::EFindItemSearchMailAddressBin;
+        case 3:
+            return CFindItemEngine::EFindItemSearchURLBin;
+        case 4:
+            return static_cast<CFindItemEngine::TFindItemSearchCase>
+                ( CFindItemEngine::EFindItemSearchPhoneNumberBin |
+                CFindItemEngine::EFindItemSearchMailAddressBin );
+        default:
+            __ASSERT_DEBUG( 0, Panic( ENoSearchCase ) );
+            return CFindItemEngine::EFindItemSearchPhoneNumberBin;
+        }
+    }
+
+EXPORT_C void CFindItemMenu::AddItemFindMenuL(
+    CItemFinder* aItemFinder,
+    CEikMenuPane* aMenuPane,
+    TInt aIndex,
+    const TDesC& aSenderDescriptor,
+    TBool aKnownSender,
+    TBool aIsContextMenu )
+    {
+    // create items
+    iIsSenderKnown = aKnownSender;
+    delete iSenderDescriptor;
+    iSenderDescriptor = 0;
+    iSenderDescriptor = aSenderDescriptor.AllocL();
+    
+    iAutomaticFind = aItemFinder;
+    
+    iMenuPane = aMenuPane;
+
+    iIndex = aIndex;
+
+    iIsContextMenu = aIsContextMenu;
+
+    UpdateItemFinderMenuL();
+    }
+      
+EXPORT_C void CFindItemMenu::UpdateItemFinderMenuL(
+    TInt aResource,
+    CEikMenuPane* aMenuPane )
+    {
+    if ( !iServiceHandler )
+        {
+        AttachItemFinderMenuL( 0 ); // param not really used
+        }
+
+    CItemFinder::TItemType itemType = iAutomaticFind ? iAutomaticFind->CurrentItemExt().iItemType : CItemFinder::ENoneSelected;    
+    if ( aResource != -1 && aMenuPane )
+        {
+         if( aResource == R_FINDMENU_CALLUI_AIW_SUBMENU )
+            {
+            //Show full call command when number type is not SIP URI or
+            //number type is phone number or
+            //it is possible to call sender or callback number
+            if ( ( itemType != CItemFinder::EEmailAddress ||
+                ( itemType == CItemFinder::EEmailAddress &&
+                !iFindItemVoIPExtension->VoIPProfilesExistL() ) ) &&
+                ( itemType == CItemFinder::EPhoneNumber ||
+                ( iSenderDescriptor->Length() &&
+                iSenderDescType == CItemFinder::EPhoneNumber ) ||
+                ( iCallbackNumber && iCallbackNumber->Length() ) ) )
+                {
+                iServiceHandler->InitializeMenuPaneL(
+                    *aMenuPane,
+                    aResource,
+                    EFindMenuPlaceHolderCallUI,
+                    iServiceHandler->InParamListL() );
+                }
+            //Show only Internet call command in Call submenu when
+            //Number type is SIP URI
+            else
+                {
+                CAiwGenericParamList* inList = CAiwGenericParamList::NewLC();
+
+                // SIP Address
+                TAiwGenericParam param( EGenericParamSIPAddress );
+                inList->AppendL( param );
+
+                iServiceHandler->InitializeMenuPaneL(
+                    *aMenuPane,
+                    aResource,
+                    EFindMenuPlaceHolderCallUI,
+                    *inList );
+
+                CleanupStack::PopAndDestroy(); // inList
+                }
+
+            return;
+            }
+
+#ifdef RD_VIRTUAL_PHONEBOOK
+        // Aiw Contacts
+        else if ( aResource == R_FINDMENU_CONTACTS_AIW_SUBMENU )
+            {
+            if ( ( ( ( !iIsSenderKnown && iSenderDescriptor->Length() ) ||
+                iCallbackNumber ) &&
+                itemType == CItemFinder::ENoneSelected ) ||
+                itemType != CItemFinder::ENoneSelected )
+                {
+                using namespace AiwContactAssign;
+
+                CAiwGenericParamList& inList = iServiceHandler->InParamListL();
+
+                // Contact Assign Data
+                TAiwGenericParam param( EGenericParamContactAssignData );
+                TAiwSingleContactAssignDataV1 assignData;
+                assignData.SetFlags( 0 ); // Reset
+                param.Value().Set(
+                    TAiwSingleContactAssignDataV1Pckg( assignData ) );
+                inList.AppendL( param );
+
+                // Contact Data Type
+                param.Reset();
+                param.SetSemanticId( EGenericParamPhoneNumber );
+                inList.AppendL( param );
+
+                iServiceHandler->InitializeMenuPaneL(
+                    *aMenuPane,
+                    aResource,
+                    EFindMenuCmdLast,
+                    inList );
+
+                return;
+                }
+            }
+#endif // RD_VIRTUAL_PHONEBOOK
+
+#ifndef RD_VIRTUAL_PHONEBOOK
+        else if ( iPbkDataSave )
+            {
+            iPbkDataSave->DynInitMenuPaneL( aResource, aMenuPane );
+            }
+#endif // !RD_VIRTUAL_PHONEBOOK
+
+        return;
+        }
+
+    TInt index = iIndex;
+
+    TBuf<KMaxMenuTextLength> tempBuf;
+
+    // Adds menu items depending the selected item
+    switch ( itemType )
+        {
+        case CItemFinder::EPhoneNumber:
+            {
+#ifdef RD_VOIP_REL_2_2
+            if ( FeatureManager::FeatureSupported(KFeatureIdCommonVoip ) )
+                {
+                // show call menu if allowed
+                if ( !( iMenuItemFlags & CFindItemMenu::ECallItem ) )
+                    {
+                    // Call
+                    iCoeEnv->ReadResourceL( tempBuf, R_FINDITEMMENU_CALL );
+                    AddMenuItemL(
+                        *iMenuPane,
+                        EFindItemCmdCall,
+                        ( iIsContextMenu ? EFindItemContextMenuPlaceHolder : index ),
+                        0,
+                        tempBuf );
+                    }
+                 // if context menu, we will show call item anyway
+                 else if ( iIsContextMenu )
+                    {
+                    // Call
+                    iCoeEnv->ReadResourceL( tempBuf, R_FINDITEMMENU_CALL );
+                    AddMenuItemL(
+                        *iMenuPane,
+                        EFindItemCmdCall,
+                        EFindItemContextMenuPlaceHolder,
+                        0,
+                        tempBuf );
+                    }
+                }
+            else
+                {
+                // Call
+                iCoeEnv->ReadResourceL( tempBuf, R_FINDITEMMENU_CALL );
+                AddMenuItemL(
+                    *iMenuPane,
+                    EFindItemCmdCall,
+                    ( iIsContextMenu ? EFindItemContextMenuPlaceHolder : index ),
+                    0,
+                    tempBuf );
+                }
+            index = EFindItemCmdCall;
+#else
+            // Call
+            iCoeEnv->ReadResourceL( tempBuf, R_FINDITEMMENU_CALL );
+            AddMenuItemL(
+                *iMenuPane,
+                EFindItemCmdCall,
+                ( iIsContextMenu ? EFindItemContextMenuPlaceHolder : index ),
+                0,
+                tempBuf );
+            index = EFindItemCmdCall;
+#endif // RD_VOIP_REL_2_2
+            // Write
+            iCoeEnv->ReadResourceL( tempBuf, R_FINDITEMMENU_MESSAGE_SUB );
+            AddMenuItemL(
+                *iMenuPane,
+                EFindItemSubMenuSend,
+                index,
+               0,//R_FINDITEM_NUMBER_MESSAGE_SUBMENU,
+                tempBuf );
+            index = EFindItemSubMenuSend;
+
+            break;
+            }
+        case CItemFinder::EUrlAddress:
+            {
+            iCoeEnv->ReadResourceL( tempBuf, R_FINDITEMMENU_GOTO_URL );
+
+            // check if not rstp    
+            if ( iAutomaticFind->CurrentItemExt().iItemDescriptor->FindF( KRtspUrlAddress ) == KErrNotFound )
+                {
+                AddMenuItemL(
+                    *iMenuPane,
+                    EFindItemCmdGoToUrl,
+                    ( iIsContextMenu ? EFindItemContextMenuPlaceHolder : index ),
+                    0,
+                    tempBuf);
+                index = EFindItemCmdGoToUrl;
+
+                if ( !iIsContextMenu )
+                    {
+                    // Add bookmark
+                    iCoeEnv->ReadResourceL(
+                        tempBuf, R_FINDITEMMENU_ADD_BOOKMARK );
+                    AddMenuItemL(
+                        *iMenuPane,
+                        EFindItemCmdAddToBookmark,
+                        index,
+                        0,
+                        tempBuf );
+                    index = EFindItemCmdAddToBookmark;
+                    }
+                }
+            else
+                {
+                AddMenuItemL(
+                    *iMenuPane,
+                    EFindItemCmdGoToRstp,
+                    ( iIsContextMenu ? EFindItemContextMenuPlaceHolder : index ),
+                    0,
+                    tempBuf );
+                index = EFindItemCmdGoToRstp;
+
+                if ( !iIsContextMenu )
+                    {
+                    iCoeEnv->ReadResourceL(
+                        tempBuf, R_FINDITEMMENU_ADD_TO_GALLERY );
+                    AddMenuItemL(
+                        *iMenuPane,
+                        EFindItemCmdAddToGallery,
+                        index,
+                        0,
+                        tempBuf );
+                    index = EFindItemCmdAddToGallery;
+                    }
+                }
+            break;
+            }
+        case CItemFinder::EEmailAddress:
+            {
+            // Checks VoIP profile count and local variation
+            if ( iIsContextMenu && iFindItemVoIPExtension->VoIPProfilesExistL() )
+                {
+                //Call
+                iCoeEnv->ReadResourceL( tempBuf, R_FINDITEMMENU_CALL );
+                AddMenuItemL(
+                    *iMenuPane,
+                    EFindItemCmdCall,
+                    EFindItemContextMenuPlaceHolder,
+                    0,
+                    tempBuf );
+                index = EFindItemCmdCall; // Replaces the call ui menu when email
+                                          // field is selected.
+                }
+
+            // Write
+            if( iEmailOverSmsFeatureSupported || iMMSFeatureSupported ||
+                iEmailUiFeatureSupported ) // Sometimes submenu can be empty.
+                {
+                iCoeEnv->ReadResourceL( tempBuf, R_FINDITEMMENU_MESSAGE_SUB );
+                AddMenuItemL(
+                    *iMenuPane,
+                    EFindItemSubMenuSend,
+                    ( ( iIsContextMenu &&
+                        !iFindItemVoIPExtension->VoIPProfilesExistL() ) ?
+                            EFindItemContextMenuPlaceHolder : index ),
+                    0,//R_FINDITEM_EMAIL_MESSAGE_SUBMENU,
+                    tempBuf );
+                index = EFindItemSubMenuSend;
+                }
+            break;
+            }
+        case CItemFinder::EUriScheme:
+            {
+            // Use
+            iCoeEnv->ReadResourceL( tempBuf, R_QTN_OPTIONS_SCHEME_USE );
+            AddMenuItemL(
+                *iMenuPane,
+                EFindItemCmdUse,
+                ( iIsContextMenu ? EFindItemContextMenuPlaceHolder : index ),
+                0,
+                tempBuf );
+            index = EFindItemCmdUse;
+            break;
+            }
+        default:
+            {
+            // Something else, probably nothing selected or new type which we
+            // don't support.
+            break;
+            }
+        }
+    // Call
+    if (
+        ( itemType == CItemFinder::ENoneSelected ) &&
+        (
+            (
+            iSenderDescriptor->Length() &&
+            iSenderDescType == CItemFinder::EPhoneNumber ||
+            iSenderDescriptor->Length() &&
+            iSenderDescType == CItemFinder::EEmailAddress &&
+            iFindItemVoIPExtension->VoIPProfilesExistL()
+            )
+        ||
+            ( iCallbackNumber && iCallbackNumber->Length()  ) )
+
+        ||
+            ( itemType == CItemFinder::EEmailAddress &&
+            iFindItemVoIPExtension->VoIPProfilesExistL() &&
+            !iIsContextMenu )
+        )
+        {
+#ifdef RD_VOIP_REL_2_2
+        if ( FeatureManager::FeatureSupported(KFeatureIdCommonVoip ) )
+            {
+            if ( !iMenuItemFlags & CFindItemMenu::ECallItem )
+                {
+                iCoeEnv->ReadResourceL( tempBuf, R_FINDITEMMENU_CALL );
+                AddMenuItemL(
+                    *iMenuPane,
+                    EFindItemCmdCall,
+                    iIndex,
+                    0,
+                    tempBuf ); // this goes always first
+                if ( index == iIndex )
+                    {
+                    index = EFindItemCmdCall; // other commands are added after this.
+                    }
+                }
+            }
+        else
+            {
+            iCoeEnv->ReadResourceL( tempBuf, R_FINDITEMMENU_CALL );
+            AddMenuItemL(
+                *iMenuPane,
+                EFindItemCmdCall,
+                iIndex,
+                0,
+                tempBuf ); // this goes always first
+            if ( index == iIndex )
+                {
+                index = EFindItemCmdCall; // other commands are added after this.
+                }
+            }
+#else
+        iCoeEnv->ReadResourceL( tempBuf, R_FINDITEMMENU_CALL );
+        AddMenuItemL(
+            *iMenuPane,
+            EFindItemCmdCall,
+            iIndex,
+            0,
+            tempBuf ); // this goes always first
+        if ( index == iIndex )
+            {
+            index = EFindItemCmdCall; // other commands are added after this.
+
+            }
+#endif // RD_VOIP_REL_2_2
+        }
+    // Highlight status
+    TInt highlight = 0;
+    if ( iCommonUiRepository )
+        {
+        iCommonUiRepository->Get( KCuiAutomaticHighlight, highlight );
+        }
+    if ( !iIsContextMenu )
+        {
+        // Activate/Deactivate find
+        if ( highlight )
+            {
+            iCoeEnv->ReadResourceL( tempBuf, R_QTN_FIND_DEACTIVATE_OPTION );
+            AddMenuItemL(
+                *iMenuPane,
+                EFindItemCmdDisableAutoFind,
+                index,
+                0,
+                tempBuf );
+            }
+        else
+            {
+            iCoeEnv->ReadResourceL( tempBuf, R_QTN_FIND_ACTIVATE_OPTION );
+            AddMenuItemL(
+                *iMenuPane,
+                EFindItemCmdEnableAutoFind,
+                index,
+                0,
+                tempBuf );
+            }
+
+        // Copy
+
+        TInt len = 0;
+        if ( iAutomaticFind && iAutomaticFind->CurrentItemExt().iItemType != CItemFinder::ENoneSelected )
+              {
+              HBufC* item = iAutomaticFind->CurrentSelection().AllocLC();  
+              len = item->Length();
+              CleanupStack::PopAndDestroy( ); 
+              }
+
+        if( (!iAutomaticFind || len != 0) && 
+            highlight &&        
+            ( itemType != CItemFinder::ENoneSelected || 
+            iSenderHighlighted ) )
+            {
+            iCoeEnv->ReadResourceL( tempBuf, R_FINDITEMMENU_COPY );
+            AddMenuItemL(
+                *iMenuPane,
+                EFindItemCmdCopy,
+                index,
+                0,
+                tempBuf );
+            }
+
+       
+        }
+
+     // Add to contacts
+     if ( ( itemType != CItemFinder::EUriScheme ) &&
+        !( itemType == CItemFinder::EUrlAddress &&
+        iIsContextMenu ) &&
+        ( ( ( ( !iIsSenderKnown &&
+        iSenderDescriptor->Length() ) ||
+        iCallbackNumber ) &&
+        itemType == CItemFinder::ENoneSelected ) ||
+        itemType != CItemFinder::ENoneSelected ) )
+        {
+        AddMenuItemL(
+            *iMenuPane,
+            EFindItemCmdCreateContactCard,
+            index,
+            0,
+            KNullDesC );
+#ifndef RD_VIRTUAL_PHONEBOOK
+        iPbkDataSave->AddMenuItemsL(
+            iMenuPane,
+            EFindItemCmdCreateContactCard );
+#else
+         iMenuPane->SetItemDimmed(
+            EFindItemCmdCreateContactCard, ETrue );
+            iMenuPane->AddMenuItemsL(
+            R_FINDMENU_CONTACTS_AIW_ITEM,
+            EFindItemCmdCreateContactCard );
+#endif // !RD_VIRTUAL_PHONEBOOK
+        }
+    // Diming
+    if ( !iIsContextMenu )
+        {
+        TInt dummy = 0;
+        if ( iMenuPane->MenuItemExists( EFindItemMenuPlaceHolder, dummy ) )
+            {
+            iMenuPane->SetItemDimmed( EFindItemMenuPlaceHolder, ETrue );
+            }
+        }
+    else
+        {
+        TInt dummy = 0;
+        if ( iMenuPane->MenuItemExists( EFindItemContextMenuPlaceHolder, dummy ) )
+            {
+            iMenuPane->SetItemDimmed( EFindItemContextMenuPlaceHolder, ETrue );
+            }
+        }
+    // Replace cmd call with AIW menu if more than one option available in AIW
+    // menu
+    // Note: count of VoIP profiles is not static. If phone contains VoIP
+    // profiles there must be Internet call command in call submenu.
+    TInt dummy = 0;
+    if ( ( !iHideCallMenu ||
+        ( iFindItemVoIPExtension->IsVoIPSupported() &&
+        iFindItemVoIPExtension->VoIPProfilesExistL() ) ) &&
+        iMenuPane->MenuItemExists( EFindItemCmdCall, dummy ) )
+        {
+        iMenuPane->SetItemDimmed( EFindItemCmdCall, ETrue );
+        iMenuPane->AddMenuItemsL(
+            R_FINDMENU_CALLUI_AIW_ITEM,
+            EFindItemCmdCall );
+        }
+    }
+
+EXPORT_C void CFindItemMenu::HandleItemFinderCommandL( TInt aCommand )
+    {
+    switch ( aCommand )
+        {
+        case EFindItemCmdCall:
+            {
+            CallL();
+            break;
+            }
+        case EFindItemSubMenuSend:
+           {
+           TSendingCapabilities sendingCapabilities;
+           sendingCapabilities.iFlags = TSendingCapabilities::ESupportsEditor;
+           CArrayFixFlat<TUid>* mtmFilter = new(ELeave) CArrayFixFlat<TUid>( 1 );
+           CleanupStack::PushL(mtmFilter);
+           CItemFinder::TItemType itemType = iAutomaticFind ? iAutomaticFind->CurrentItemExt().iItemType : CItemFinder::ENoneSelected;
+           
+           mtmFilter->AppendL(KSenduiMtmPostcardUid);// dim postcard
+           // Hide SMS if not supported
+           
+           #ifndef RD_UNIFIED_EDITOR
+           if ( !iEmailOverSmsFeatureSupported )
+               {
+           	   mtmFilter->AppendL(KSenduiMtmSmsUid);
+               }
+           // Hide MMS if not supported
+           if (!iMMSFeatureSupported)
+               {
+               mtmFilter->AppendL(KSenduiMtmMmsUid);
+               }
+           #endif
+           
+           // Hide E-Mail if nosupported or phonenumber 
+           if ( !iEmailUiFeatureSupported || itemType == CItemFinder::EPhoneNumber )
+               {
+       	       mtmFilter->AppendL(KSenduiMtmSmtpUid);
+               mtmFilter->AppendL(KSenduiMtmImap4Uid);
+               mtmFilter->AppendL(KSenduiMtmPop3Uid);
+               mtmFilter->AppendL(KSenduiMtmSyncMLEmailUid);
+               }
+           // Hide Audio if not supported or E-mail address
+           if( !iAudioMessagingFeatureSupported || itemType == CItemFinder::EEmailAddress)
+               {
+           	   mtmFilter->AppendL(KSenduiMtmAudioMessageUid);
+               }
+           TUid uid = iSendUi->ShowTypedQueryL( CSendUi::EWriteMenu, NULL, sendingCapabilities, mtmFilter );
+           
+           CleanupStack::PopAndDestroy();
+           if ( uid == KNullUid )
+              {
+              break;
+              }
+           SendMessageL(uid);  
+      
+           break;
+           }
+
+        case EFindItemCmdGoToUrl:
+            {
+            LaunchGenericUriL();
+            break;
+            }
+        case EFindItemCmdGoToRstp:
+            {
+            LaunchGenericUriL();
+            break;
+            }
+
+        case EFindItemCmdAddToBookmark:
+            {
+            AddToBookmarkL();
+            break;
+            }
+        case EFindItemCmdCreateContactCardSub1:
+        case EFindItemCmdCreateContactCardSub2:
+        case EFindItemCmdCreateContactCardSub3:
+            {
+            CreateContactCardL( aCommand );
+            // Restore original client application icon back to context pane.
+            CEikStatusPane* statusPane =
+                ( (CAknAppUi*)CEikonEnv::Static()->EikAppUi() )->StatusPane();
+            CCoeControl* contextControl =
+                statusPane->ControlL( TUid::Uid( EEikStatusPaneUidContext ) );
+            CAknContextPane* contextPane =
+                static_cast<CAknContextPane*>( contextControl );
+            contextPane->SetPictureToDefaultL();
+            break;
+            }
+        case EFindItemCmdAddToGallery:
+            {
+            AddToGalleryL();
+            break;
+            }
+
+        case EFindItemCmdDisableAutoFind:
+            {
+            if (iCommonUiRepository)
+                {
+                iCommonUiRepository->Set( KCuiAutomaticHighlight, 0 );
+                }
+            AutoFindStatusChangedL();
+            break;
+            }
+
+        case EFindItemCmdEnableAutoFind:
+            {
+            if (iCommonUiRepository)
+                {
+                iCommonUiRepository->Set( KCuiAutomaticHighlight, 1 );
+                }
+            AutoFindStatusChangedL();
+            break;
+            }
+
+        case EFindItemCmdUse:
+            {
+            LaunchGenericUriL();
+            break;
+            }
+
+        case EFindItemCmdCopy:
+            {
+            CopyToClipboardL();
+            break;
+            }
+        default:
+            {
+            TInt aiwCmd = iServiceHandler->ServiceCmdByMenuCmd( aCommand );            
+            TBool calltypeInternetCall( EFalse );
+            if ( iFindItemVoIPExtension->VoIPProfilesExistL() && iAutomaticFind && iAutomaticFind->CurrentItemExt().iItemType == CItemFinder::EEmailAddress )
+                {
+                calltypeInternetCall = ETrue;
+                }
+
+            // Call via Aiw
+            if ( aiwCmd == KAiwCmdCall && FormatDialDataL( calltypeInternetCall ) )
+                {
+                if ( !iDialData )
+                    {
+                    break;
+                    }
+
+                CAiwGenericParamList& paramList =
+                    iServiceHandler->InParamListL();
+
+                iDialData->FillInParamListL( paramList );
+
+                iServiceHandler->ExecuteMenuCmdL(
+                    aCommand,
+                    paramList,
+                    iServiceHandler->OutParamListL(),
+                    0, // No options used.
+                    0 ); // no dial results are wanted.
+                }
+#ifdef RD_VIRTUAL_PHONEBOOK
+             // Contacts via Aiw
+            else if ( aiwCmd == KAiwCmdAssign )
+                {
+                CreateContactCardL( aCommand );
+                }
+#endif // RD_VIRTUAL_PHONEBOOK
+            break;
+            }
+        }
+    }
+
+EXPORT_C void CFindItemMenu::HandleCallL( const TDesC& aSenderDescriptor )
+    {
+    AttachItemFinderMenuL( 0 ); // Make sure that this get called even if
+                                // caller won't call this
+
+    delete iSenderDescriptor;
+    iSenderDescriptor = 0;
+    iSenderDescriptor = aSenderDescriptor.AllocL();
+
+    CallL();
+    }
+
+EXPORT_C void CFindItemMenu::HandleVoIPCallL( const TDesC& aSenderDescriptor )
+    {
+    AttachItemFinderMenuL( 0 ); // Make sure that this get called even if
+                                // caller won't call this
+
+    delete iSenderDescriptor;
+    iSenderDescriptor = 0;
+    iSenderDescriptor = aSenderDescriptor.AllocL();
+
+    VoIPCallL();
+    }
+
+void CFindItemMenu::CallL()
+    {
+    if ( !iDialData )
+        {
+        return;
+        }
+
+    if ( !FormatDialDataL( EFalse ) )
+        {
+        return;
+        }
+
+    // Create Call W/O Menu
+    CAiwGenericParamList& paramList =
+        iServiceHandler->InParamListL();
+
+    iDialData->FillInParamListL( paramList );
+
+    iServiceHandler->ExecuteServiceCmdL(
+        KAiwCmdCall,
+        paramList,
+        iServiceHandler->OutParamListL(),
+        0, // No options used.
+        NULL );
+    }
+
+void CFindItemMenu::VoIPCallL()
+    {
+    if ( !iDialData )
+        {
+        return;
+        }
+  if ( !FormatDialDataL( ETrue ) ||
+       !iFindItemVoIPExtension->IsVoIPSupported() )
+        {
+        return;
+        }
+
+    // Create Call W/O Menu
+    CAiwGenericParamList& paramList = iServiceHandler->InParamListL();
+
+    iDialData->FillInParamListL( paramList );
+
+    iServiceHandler->ExecuteServiceCmdL(
+        KAiwCmdCall,
+        paramList,
+        iServiceHandler->OutParamListL(),
+        0, // No options used.
+        NULL );
+    }
+
+void CFindItemMenu::SendMessageL( const TUid aMtmUid )
+    {
+    HBufC* parsedAddress = 0;
+    TBool isNumber = EFalse;            
+    if ( iAutomaticFind && iAutomaticFind->CurrentItemExt().iItemType == CItemFinder::EEmailAddress )
+        {
+        parsedAddress = iAutomaticFind->CurrentItemExt().iItemDescriptor;
+        }
+    else
+        {
+        // if sender descriptor is something else than phone number it will
+        // still go through this brach..
+        TBool numberSelected = ( iAutomaticFind && iAutomaticFind->CurrentItemExt().iItemType == CItemFinder::EPhoneNumber );        
+        parsedAddress = ( numberSelected ? iAutomaticFind->CurrentItemExt().iItemDescriptor : iSenderDescriptor)->AllocLC();
+        TPtr numberPtr = parsedAddress->Des();
+        CommonPhoneParser::ParsePhoneNumber( numberPtr, CommonPhoneParser::EPlainPhoneNumber );
+        AknTextUtils::ConvertDigitsTo( numberPtr, EDigitTypeWestern );            
+        isNumber = ETrue;
+        }
+
+    CMessageData* messageData = CMessageData::NewL();
+    CleanupStack::PushL( messageData );
+    messageData->AppendToAddressL( parsedAddress->Des() );
+    iSendUi->CreateAndSendMessageL( aMtmUid,messageData );
+    CleanupStack::PopAndDestroy( isNumber ? 2 : 1 ); // messageData, number
+    }
+
+void CFindItemMenu::GoToUrlL( TUid /*aHandlerAppUid*/ )
+   {
+    // Scheme handler can handle this
+   }
+
+void CFindItemMenu::AddToBookmarkL()
+    {
+    // Create an item
+    CFavouritesItem* item = CFavouritesItem::NewLC();
+    item->SetParentFolder( KFavouritesRootUid );
+    item->SetType( CFavouritesItem::EItem );
+    // Read default name from resources
+    RConeResourceLoader ldr( *iCoeEnv );
+
+    TFileName dialogResource( KDialogResourceName );
+
+    ldr.OpenL( dialogResource );
+    CleanupClosePushL( ldr );
+
+    // Read default name from resources
+    HBufC* defaultName =
+        iCoeEnv->AllocReadResourceLC( R_FINDITEM_DEFAULT_BOOKMARK_NAME );
+
+    TBuf<KMaxBookmarkNameLength> retName;
+    retName.Copy( defaultName->Des() );
+
+    // Query bookmark name from user
+    CAknTextQueryDialog* dlg = CAknTextQueryDialog::NewL( retName );
+    dlg->SetMaxLength( KMaxBookmarkNameLength );
+    if ( !dlg->ExecuteLD( R_FINDITEM_BOOKMARK_QUERY_DIALOG ) )
+        {
+        // User press cancel - do not add bookmark
+        CleanupStack::PopAndDestroy( 3 ); // item, defaultName, resourceLoader
+        return;
+        }
+
+    item->SetNameL( retName );            
+    item->SetUrlL( iAutomaticFind->CurrentItemExt().iItemDescriptor->Des() );
+
+    RFavouritesSession sess;
+    RFavouritesDb db;
+
+    User::LeaveIfError( sess.Connect() );
+    CleanupClosePushL<RFavouritesSession>( sess );
+    User::LeaveIfError( db.Open( sess, KBrowserBookmarks ) );
+    CleanupClosePushL<RFavouritesDb>( db );
+
+    // add item
+    db.Add( *item, ETrue );
+    // Close the database.
+    db.Close();
+
+    HBufC* msgBuffer = iCoeEnv->AllocReadResourceLC( R_FINDITEM_BOOKMARK_SAVED );
+    CAknConfirmationNote* note = new (ELeave)CAknConfirmationNote( ETrue );
+    note->ExecuteLD( *msgBuffer );
+
+    CleanupStack::PopAndDestroy( 6 ); // item, db, sess, resourceLoader,
+                                      // defaultName, msgBuffer
+    }
+
+void CFindItemMenu::CreateContactCardL( TInt aCommandId )
+    {
+    CItemFinder::TItemType itemType = iSenderDescType; // default
+    HBufC* item = 0;
+    if ( iAutomaticFind && iAutomaticFind->CurrentItemExt().iItemType != CItemFinder::ENoneSelected )
+        {
+        item = iAutomaticFind->CurrentItemExt().iItemDescriptor->AllocLC();
+        itemType = iAutomaticFind->CurrentItemExt().iItemType;
+        }
+    else if ( !iCallbackNumber ) // default type if ok
+        {
+        item = iSenderDescriptor->AllocLC();        
+        }
+    else if ( iIsSenderKnown || !iSenderDescriptor->Length() )
+        {
+        // callbacknumber exists and sender's address is already in phonebook
+        //  or sender's number is NULL
+        item = iCallbackNumber->AllocLC();
+        }
+    else
+        {
+        TInt index = 0;
+        item = ChooseNumberQueryL( index );
+        if (item)
+            {
+            CleanupStack::PushL( item );
+            if ( index == EFindUICallbackNumber ) // sender type is still
+                                                  // default
+                {
+                itemType = CItemFinder::EPhoneNumber;
+                }
+            }
+        else
+            {
+            return;
+            }
+        }
+#ifndef RD_VIRTUAL_PHONEBOOK
+    CArrayPtrFlat<CPbkFieldInfo> *fieldArray =
+        new(ELeave)CArrayPtrFlat<CPbkFieldInfo>( 1 );
+    CleanupStack::PushL( fieldArray );
+
+    for ( TInt i = 0; i < iPbkEngine->FieldsInfo().Count(); i++ )
+        {
+        CPbkFieldInfo* fieldInfo = iPbkEngine->FieldsInfo()[ i ];
+        // Only interested in text storage fields
+        if ( !( fieldInfo->FieldStorageType() == KStorageTypeText ) )
+            {
+            continue;
+            }
+
+        if ( itemType == CItemFinder::EPhoneNumber &&
+            ( fieldInfo->IsPhoneNumberField() ||
+#ifdef __VOIP 
+            iFindItemVoIPExtension->IsVoIPSupported() && 
+#else
+            iVoIPFeatureSupported &&
+#endif 
+            fieldInfo->FieldId() == EPbkFieldIdVOIP ) )
+            {
+            fieldArray->AppendL( fieldInfo );
+            }
+        else if ( itemType == CItemFinder::EEmailAddress &&
+            ( fieldInfo->FieldId() == EPbkFieldIdEmailAddress ||
+#ifdef __VOIP 
+			iFindItemVoIPExtension->IsVoIPSupported() && 
+#else
+            iVoIPFeatureSupported &&
+#endif 
+            fieldInfo->FieldId() == EPbkFieldIdVOIP ) )
+            {
+            fieldArray->AppendL(fieldInfo);
+            }
+        else if ( ( itemType == CItemFinder::EUrlAddress ||
+            itemType == CItemFinder::EUriScheme ) &&
+            fieldInfo->FieldId() == EPbkFieldIdURL )
+            {
+            fieldArray->AppendL( fieldInfo );
+            }
+        }
+#endif // !RD_VIRTUAL_PHONEBOOK
+
+    TPtr itemDes = item->Des();
+
+#ifndef RD_VIRTUAL_PHONEBOOK
+    iPbkDataSave->HandleCommandL( aCommandId, *fieldArray, *item );
+    CleanupStack::PopAndDestroy( 2 ); // fieldArray, item
+#else //RD_VIRTUAL_PHONEBOOK
+    using namespace AiwContactAssign;
+
+    CAiwGenericParamList& inList = iServiceHandler->InParamListL();
+
+    // Contact Assign Data.
+    TAiwGenericParam param( EGenericParamContactAssignData );
+    TAiwSingleContactAssignDataV1 assignData;
+    assignData.SetFlags( 0 );
+    param.Value().Set( TAiwSingleContactAssignDataV1Pckg( assignData ) );
+    inList.AppendL( param );
+
+    // Contact Data Type.
+    param.Reset();
+    switch( itemType ) // Resolve type.
+        {
+        case CItemFinder::EPhoneNumber:                      // Phone number
+            param.SetSemanticId( EGenericParamPhoneNumber );
+            // convert phone number.
+            CommonPhoneParser::ParsePhoneNumber(
+                itemDes, CommonPhoneParser::EPhoneClientNumber );
+            break;
+        case CItemFinder::EEmailAddress:                     // E-mail
+            param.SetSemanticId( EGenericParamEmailAddress );
+            break;
+       case CItemFinder::EUrlAddress:                        // URL
+       case CItemFinder::EUriScheme:                         // URI
+            param.SetSemanticId( EGenericParamURL );
+            break;
+        default:
+            CleanupStack::PopAndDestroy( 1 ); // item
+            return; // unknown item type.
+        }
+    param.Value().Set( itemDes );
+    inList.AppendL( param );
+
+    iServiceHandler->ExecuteMenuCmdL(
+        aCommandId,
+        inList,
+        iServiceHandler->OutParamListL(),
+        0,
+        &iCallback );
+    CleanupStack::PopAndDestroy( 1 ); // item
+#endif // !RD_VIRTUAL_PHONEBOOK
+    }
+
+void CFindItemMenu::AddToGalleryL()
+    {
+    _LIT( KRamFileExtension,".ram" );
+    TFileName fileName;
+    iCoeEnv->ReadResourceL( fileName, R_FINDITEMMENU_DEFAULT_GALL_NAME );
+    fileName.Append( KRamFileExtension );
+    if ( AknCommonDialogs::RunSaveDlgLD(
+        fileName, R_MEMORY_SELECTION_LOCATIONS ) )
+        {
+        CDesCArrayFlat* array = new (ELeave)CDesCArrayFlat( 1 );
+        CleanupStack::PushL( array );
+        array->AppendL( iAutomaticFind->CurrentItemExt().iItemDescriptor->Des() );
+        TInt err = KErrNone;
+        if( !iMPEngineDllLoaded )
+            {
+            LoadMPEngineApiL();
+            }
+        err = iMPEngineApi->CreateNewLinkFileL( fileName, array, ETrue );
+        CleanupStack::PopAndDestroy( 1 );
+
+        if ( err == KErrNone )
+            {
+            // Show note
+            HBufC* msgBuffer =
+                iCoeEnv->AllocReadResourceLC( R_FINDITEMMENU_LINK_SAVED );
+            CAknConfirmationNote* note =
+                new (ELeave) CAknConfirmationNote( ETrue );
+            note->ExecuteLD( *msgBuffer );
+            CleanupStack::PopAndDestroy(); // msgBuffer
+            }
+        }
+    }
+
+EXPORT_C void CFindItemMenu::SetSenderDescriptorType(
+    CItemFinder::TItemType aType )
+    {
+    iSenderDescType = aType;
+    }
+
+EXPORT_C void CFindItemMenu::AttachItemFinderMenuL( TInt /*aResource*/ )
+    {
+    if ( iServiceHandler ) // this method should be called once and only once.
+        {
+        return;
+        }
+#ifndef RD_VIRTUAL_PHONEBOOK
+    iRPbkResourceFile = new (ELeave)RPbkViewResourceFile( *iCoeEnv );
+    iRPbkResourceFile->OpenL();
+    iPbkEngine = CPbkContactEngine::NewL();
+    iPbkDataSave = CPbkDataSaveAppUi::NewL( *iPbkEngine );
+#endif // !RD_VIRTUAL_PHONEBOOK
+    iSendUi = CSendUi::NewL();
+
+    TRAPD( ret, iCommonUiRepository = CRepository::NewL( KCRUidCommonUi ) );
+    if ( ret == KErrNone )
+        {
+        iCommonUiRepositoryWatcher = CCommonUiRepositoryWatcher::NewL(
+            KCRUidCommonUi,
+            KCuiAutomaticHighlight,
+            CCenRepNotifyHandler::EIntKey,
+            TCallBack( AutoFindStatusChanged, this ),
+            iCommonUiRepository );
+        }
+
+    // AIW
+    iServiceHandler = CAiwServiceHandler::NewL();
+
+    //  Call UI
+    iServiceHandler->AttachMenuL(
+        R_FINDMENU_CALLUI_AIW_SUBMENU,
+        R_FINDMENU_CALLUI_AIW_INTEREST );
+
+    CMyMenuPane* callUiMenu =
+        new (ELeave) CMyMenuPane( (MEikMenuObserver*)this ); // not used really
+    CleanupStack::PushL( callUiMenu );
+    TResourceReader callUiReader;
+    iCoeEnv->CreateResourceReaderLC(
+        callUiReader, R_FINDMENU_CALLUI_AIW_SUBMENU );
+    callUiMenu->ConstructFromResourceL( callUiReader );
+    CleanupStack::PopAndDestroy(); // callUiReader
+
+    iServiceHandler->InitializeMenuPaneL(
+        *(CEikMenuPane*)callUiMenu,
+        R_FINDMENU_CALLUI_AIW_SUBMENU,
+        EFindMenuPlaceHolderCallUI,
+        iServiceHandler->InParamListL() );
+
+    if ( callUiMenu->NumberOfItemsInPane() < 2 )
+        {
+        iHideCallMenu = ETrue;
+        }
+
+    iServiceHandler->AttachL( R_FINDMENU_CALLUI_AIW_INTEREST );
+    CleanupStack::PopAndDestroy(); // callUiMenu
+
+#ifdef RD_VIRTUAL_PHONEBOOK
+    // Contacts
+    iServiceHandler->AttachMenuL(
+        R_FINDMENU_CONTACTS_AIW_SUBMENU,
+        R_FINDMENU_CONTACTS_AIW_INTEREST );
+#endif // RD_VIRTUAL_PHONEBOOK
+    }
+
+void CFindItemMenu::AutoFindStatusChangedL()
+    {
+    if ( iAutomaticFind )
+        {
+        TInt value = 0;
+        if ( iCommonUiRepository )
+            {
+            iCommonUiRepository->Get( KCuiAutomaticHighlight, value );
+            }
+        if ( value == 1 )
+            {
+            iAutomaticFind->SetFindModeL( CItemFinder::EUrlAddress|CItemFinder::EEmailAddress|CItemFinder::EPhoneNumber );
+            }
+        else
+            {
+            iAutomaticFind->SetFindModeL( 0 );
+            }
+        }
+    }
+
+TInt CFindItemMenu::AutoFindStatusChanged( TAny* aThis )
+    {
+    CFindItemMenu* me = (CFindItemMenu*)aThis;
+    TRAPD( err, me->AutoFindStatusChangedL() );
+    return err;
+    }
+
+TBool CFindItemMenu::FormatDialDataL( TBool aFormatVoIPDialData )
+    {
+    if ( !iDialData )
+        {
+        return EFalse;
+        }
+
+    TBool numberSelected = ( iAutomaticFind && iAutomaticFind->CurrentItemExt().iItemType == CItemFinder::EPhoneNumber );
+
+    TBool SIPURISelected = 
+        ( aFormatVoIPDialData && 
+            iAutomaticFind &&
+                iFindItemVoIPExtension->VoIPProfilesExistL() &&
+                    iAutomaticFind->CurrentItemExt().iItemType == CItemFinder::EEmailAddress );
+
+    HBufC* parsedNumber = NULL ;
+    // Foucs in text body and a phone number has been selected
+    // Takes number from selected item when SIP URI is selected.
+    if ( numberSelected || SIPURISelected )
+        {
+        parsedNumber = iAutomaticFind->CurrentItemExt().iItemDescriptor->AllocLC();
+        }
+    else if ( !iCallbackNumber ) // Focus in address control with callback
+                                 // number
+        {
+        parsedNumber = iSenderDescriptor->AllocLC();
+        }                  
+    else if ( !( iSenderDescType == CItemFinder::EPhoneNumber && iSenderDescriptor->Length() ) )
+        // Eg. Email over Sms with callback number
+        {
+        parsedNumber = iCallbackNumber->AllocLC();
+        }
+    else  // both callback number and sender number, use query
+        {                   
+        TInt dummy = 0;
+        parsedNumber = ChooseNumberQueryL( dummy );
+        if( parsedNumber )
+            {
+            CleanupStack::PushL( parsedNumber );
+            }
+        else
+            {
+            return EFalse;
+            }
+        }
+    TPtr numberPtr = parsedNumber->Des();
+
+    using namespace AIWDialDataExt;
+    CommonPhoneParser::ParsePhoneNumber(
+        numberPtr, CommonPhoneParser::EPhoneClientNumber );
+    __ASSERT_ALWAYS( parsedNumber->Length() <= KMaximumPhoneNumberLength,
+        Panic( ETooLongItem ) );
+    AknTextUtils::ConvertDigitsTo( numberPtr, EDigitTypeWestern );
+#ifdef RD_VOIP_REL_2_2
+    if ( FeatureManager::FeatureSupported(KFeatureIdCommonVoip ) )
+        {
+        if ( aFormatVoIPDialData )
+            {
+            // sets call type for VoIP
+            iDialData->SetCallType( CAiwDialData::EAIWVoiP );
+            }
+        }
+#endif // RD_VOIP_REL_2_2
+    iDialData->SetPhoneNumberL( numberPtr );
+
+    CleanupStack::PopAndDestroy(); // number;
+    return ETrue;
+    }
+
+void CFindItemMenu::LaunchGenericUriL()
+    {
+    if ( iSchemeHandler )
+        {
+        delete iSchemeHandler;
+        iSchemeHandler = 0;
+        }    
+    iSchemeHandler = CSchemeHandler::NewL( iAutomaticFind->CurrentItemExt().iItemDescriptor->Des() );
+    if ( iAutomaticFind->CurrentItemExt().iItemDescriptor->FindF( KRtspUrlAddress ) != KErrNotFound )
+        {
+        iSchemeHandler->HandleUrlEmbeddedL();
+        }
+    else
+        {
+        iSchemeHandler->HandleUrlStandaloneL();
+        }
+    }
+
+EXPORT_C void CFindItemMenu::SetCallbackNumber( const TDesC& aPhoneNumber )
+    {
+    delete iCallbackNumber;
+    iCallbackNumber = 0;
+    iCallbackNumber = aPhoneNumber.Alloc();    
+    }
+
+HBufC* CFindItemMenu::ChooseNumberQueryL( TInt& aIndex )
+    {
+    HBufC* ret = 0;
+
+    // First phase construction of menu list
+    CAknSingleHeadingPopupMenuStyleListBox* phoneNumberList =
+        new (ELeave) CAknSingleHeadingPopupMenuStyleListBox;
+    CleanupStack::PushL( phoneNumberList );
+
+    // Create a popuplist to show the menu list in
+    CAknPopupList* popupList =
+        CAknPopupList::NewL( phoneNumberList, R_AVKON_SOFTKEYS_OK_CANCEL );
+    CleanupStack::PushL( popupList );
+    // Second phase construction of popupList
+    phoneNumberList->ConstructL( popupList,EAknListBoxMenuList );
+
+    // Set up menu items
+    CTextListBoxModel* model = phoneNumberList->Model();
+    model->SetOwnershipType( ELbmOwnsItemArray );
+
+    CDesCArray* phoneNumberListArray =
+        static_cast<CDesCArray*>( model->ItemTextArray() );
+
+    HBufC* title;
+    title = StringLoader::LoadLC( R_QTN_SMS_USENUMBER );
+    popupList->SetTitleL( *title );
+    CleanupStack::PopAndDestroy( title );
+
+    _LIT( KStringHeader, "%S\t%S" );
+    TBuf <256> string;
+    HBufC* head;
+    // sender item
+    head = StringLoader::LoadLC( R_QTN_SMS_USENUMBER_FROM );
+    string.Format( KStringHeader(), head, iSenderDescriptor );
+    phoneNumberListArray->AppendL ( string);
+    CleanupStack::PopAndDestroy( head );
+    // callback number
+    head = StringLoader::LoadLC( R_QTN_SMS_USENUMBER_CALLBACK );
+    string.Format( KStringHeader(), head, iCallbackNumber );
+    phoneNumberListArray->AppendL( string );
+    CleanupStack::PopAndDestroy( head );
+
+    CleanupStack::Pop( popupList );
+
+    if ( popupList->ExecuteLD() )
+        {
+        ret = ( phoneNumberList->CurrentItemIndex() == EFindUICallbackNumber ) ?
+            iCallbackNumber->AllocL() : iSenderDescriptor->AllocL();
+        aIndex = phoneNumberList->CurrentItemIndex();
+        }
+
+    CleanupStack::PopAndDestroy( phoneNumberList );
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// TInt CFindItemMenu::LoadMPEngineApiL
+// Load MPEngine Api.
+// -----------------------------------------------------------------------------
+void CFindItemMenu::LoadMPEngineApiL()
+   {
+   // Memo saving dll loading.
+   if( !iMPEngineDllLoaded )
+        {
+        if( iMPEngineDll.Load( KCommonUiMPEngineApiLoaderName ) == KErrNone )
+            {
+            iMPEngineDllLoaded = ETrue;
+            // Request the entry function
+            MPEngineApiL mpengineApi =
+                (MPEngineApiL) iMPEngineDll.Lookup( KMPEngineApiDllEntryPoint );
+            if( mpengineApi )
+                {
+                // Create the class
+                iMPEngineApi = (CCommonUiMPEngineApiLoader*) (*mpengineApi)();
+                }
+            }
+        }
+    // The wrapper failed to load.
+    if ( !iMPEngineApi )
+        {
+        User::Leave( KErrNotFound );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// TInt CFindItemMenu::CopyToClipboardL
+//
+// -----------------------------------------------------------------------------
+void CFindItemMenu::CopyToClipboardL()
+    {       
+    HBufC* item = 0;
+    TInt len = 0;
+    if ( iAutomaticFind && iAutomaticFind->CurrentItemExt().iItemType != CItemFinder::ENoneSelected )
+        {
+        item = iAutomaticFind->CurrentSelection().AllocLC();                        
+        len = item->Length();
+        }
+    else if( iSenderHighlighted )
+        {
+        item = iSenderDisplayText->AllocLC();
+        len = item->Length();
+        }            
+    __ASSERT_DEBUG( len > 0, Panic( ENoItemSelected ) );        
+
+    CPlainText* plainText = CPlainText::NewL( CPlainText::ESegmentedStorage, len );
+    CleanupStack::PushL( plainText );
+    plainText->InsertL( 0, *item );
+
+    CClipboard* cb = CClipboard::NewForWritingLC( iCoeEnv->FsSession() );
+    plainText->CopyToStoreL( cb->Store(), cb->StreamDictionary(), 0, len );
+    cb->CommitL();
+    
+    CleanupStack::PopAndDestroy( 3 ); // item, plainText, cb
+    // fix for EJCU-7K98TM 
+    CAknNoteDialog* dlg = new (ELeave) CAknNoteDialog();
+    dlg->SetTimeout(CAknNoteDialog::EShortTimeout);
+    dlg->SetTone(CAknNoteDialog::ENoTone);
+    dlg->ExecuteLD( R_AVKON_NOTE_CONF_COPIED );
+    // fix end
+    }
+
+EXPORT_C void CFindItemMenu::SetSenderHighlightStatus( TBool aStatus )
+    {
+    iSenderHighlighted = aStatus;
+    }
+
+EXPORT_C void CFindItemMenu::SetSenderDisplayText( const TDesC& aText )
+    {
+    delete iSenderDisplayText;
+    iSenderDisplayText = 0;
+    iSenderDisplayText = aText.Alloc();
+    }
+
+#ifdef RD_VOIP_REL_2_2
+EXPORT_C void CFindItemMenu::SetMenuItemVisibility( 
+    CFindItemMenu::TMenuItem aItem, 
+    TBool aVisible )
+    {
+    if ( aVisible )
+        {
+        // iMenuItemFlags, 0 = visible
+        iMenuItemFlags &= ~(TInt)aItem;
+        }
+    else
+        {
+        // iMenuItemFlags, 1 = not allowed
+        iMenuItemFlags |= (TInt)aItem;
+        } 
+    }
+#else
+EXPORT_C void CFindItemMenu::SetMenuItemVisibility( 
+    CFindItemMenu::TMenuItem /*aItem*/, 
+    TBool /*aVisible*/ )
+    {
+    }
+#endif // RD_VOIP_REL_2_2
+CCommonUiRepositoryWatcher* CCommonUiRepositoryWatcher::NewL(
+    const TUid aUid,
+    const TUint32 aKey,
+    CCenRepNotifyHandler::TCenRepKeyType aKeyType,
+    TCallBack aCallBack,
+    CRepository* aRepository )
+    {
+    CCommonUiRepositoryWatcher* self =
+        new(ELeave) CCommonUiRepositoryWatcher(
+            aUid, aKey, aCallBack, aRepository );
+
+    CleanupStack::PushL( self );
+    self->ConstructL( aKeyType );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+CCommonUiRepositoryWatcher::~CCommonUiRepositoryWatcher()
+    {
+    if ( iNotifyHandler )
+        {
+        iNotifyHandler->StopListening();
+        }
+    delete iNotifyHandler;
+    }
+
+CCommonUiRepositoryWatcher::CCommonUiRepositoryWatcher(
+    const TUid aUid,
+    const TUint32 aKey,
+    TCallBack aCallBack,
+    CRepository* aRepository )
+    : iUid( aUid ),
+    iKey( aKey ),
+    iCallBack( aCallBack ),
+    iRepository( aRepository )
+    {
+    }
+
+void CCommonUiRepositoryWatcher::ConstructL(
+    CCenRepNotifyHandler::TCenRepKeyType aKeyType )
+    {
+    iNotifyHandler =
+        CCenRepNotifyHandler::NewL( *this, *iRepository, aKeyType, iKey );
+    iNotifyHandler->StartListeningL();
+    }
+
+void CCommonUiRepositoryWatcher::ConstructL()
+    {
+    iNotifyHandler = CCenRepNotifyHandler::NewL( *this, *iRepository );
+    iNotifyHandler->StartListeningL();
+    }
+
+TUint32 CCommonUiRepositoryWatcher::ChangedKey()
+    {
+    return iChangedKey;
+    }
+
+void CCommonUiRepositoryWatcher::HandleNotifyInt(
+    TUint32 aKey,
+    TInt aNewValue )
+    {
+#ifdef _DEBUG
+    RDebug::Print(_L("CCommonUiRepositoryWatcher::HandleNotifyInt aKey=%d, aNewValue=%d"), aKey, aNewValue);
+#endif
+    (void)aNewValue;
+    iChangedKey = aKey;
+    iCallBack.CallBack();
+    iChangedKey = NCentralRepositoryConstants::KInvalidNotificationId;
+    }
+
+void CCommonUiRepositoryWatcher::HandleNotifyError(
+    TUint32 /*aKey*/,
+    TInt /*aError*/,
+    CCenRepNotifyHandler* /*aHandler*/ )
+    {
+    }
+
+
+EXPORT_C TInt MPBAiwNotify::HandleNotifyL(TInt /*aCmdId*/, TInt aEventId,
+        CAiwGenericParamList& aEventParamList,
+        const CAiwGenericParamList& /*aInParamList*/)
+    {
+    if (aEventId == KAiwEventError)
+        {
+        if (aEventParamList.Count() > 0)
+            {
+            TInt32 err = aEventParamList[0].Value().AsTInt32();
+            User::Leave(err);                
+            }
+        }
+    return KErrNone;
+    }    
+
+//  End of File