/*
* Copyright (c) 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:   Implementation for CVIMPSTUiTabbedView
 *
*/


// INCLUDE FILES
#include "cvimpstuitabbedview.h"

#include "cvimpstcmdhandler.h"
#include "mvimpstuitabbedviewcontrol.h"
#include "mvimpstuitabcontrolfactory.h"
#include "vimpstcmd.hrh"
#include "mvimpstcmd.h"
#include "mvimpstengine.h"
#include "mvimpstenginesearchmgrextention.h"

#include "vimpstui.hrh"
#include "vimpstextentionuiuid.h"
#include "tvimpstconsts.h"
#include "cvimpstuiextensionservice.h"
#include "cvimpstuibranddata.h"
#include "mvimpstprocessarray.h"
#include "vimpstutilsdialog.h"
#include "vimpstutilswaitnote.h"
#include "vimpstcmd.hrh"
#include "cvimpstuisearchfieldaray.h"
#include "mvimpstuisearchfield.h"
#include "cvimpstuisearchquerydialog.h"
#include "cvimpstuiavatarselectionhandler.h" // avatar selection
#include "cvimpstuistatuspanehandler.h"


#include "mvimpstengineextentionfeatures.h"
#include "mvimpststoragevpbkstorehandler.h"

// System includes
#include <akntoolbar.h>             //CAknToolbar
#include <eikcolib.h>               //CEikAppUiFactory

#include <coecntrl.h>
#include <eikmenup.h>
#include <AknGlobalNote.h>
#include <eikbtgpc.h>
#include <avkon.rsg>
#include <aknnotewrappers.h> 
#include <AknQueryDialog.h> 
#include <StringLoader.h>
#include <eikenv.h>
#include <e32property.h>
#include <apgtask.h>
#include <aknmessagequerydialog.h>

// Pbk2
#include <MPbk2AppUi.h>
#include <CPbk2UIExtensionView.h>
#include <MPbk2ViewActivationTransaction.h>
#include <MPbk2ViewExplorer.h>
#include <CPbk2ViewState.h>
#include <MPbk2StartupMonitor.h>
#include <Pbk2Commands.hrh>
#include <MVPbkStoreContact.h>

#include <MPbk2ApplicationServices.h>
#include <MPbk2CommandHandler.h>
// xSP extension manager
#include "MxSPViewMapper.h"
#include "MxSPContactManager.h"
#include "cvimpststoragemanagerfactory.h"
#include "mvimpststorageserviceview.h"
#include "cvimpstuimenuextension.h"

//resource
#include <ExtensionManagerRes.rsg>
#include <vimpstuires.rsg>

//CCA
#include <mccaparameter.h>
#include <ccafactory.h>
#include <mccaconnection.h>

#include "uiservicetabtracer.h"

//AIW - VOIP
#include <aiwdialdataext.h>
#include <aknPopup.h>
#include <AiwCommon.hrh>
#include <AiwServiceHandler.h>
#include <aiwdialdata.h>
#include <MVPbkStoreContact.h>

//browser launch
#include <browserlauncher.h>
#include "cvimpstuitermsofusedialoghandler.h"
#include <cvimpstsettingsstore.h>
#include <aknmessagequerydialog.h>
#include "tvimpstconsts.h"
// avatar
#include "mvimpstenginepresencesubservice.h"
#include "mvimpstenginesubservice.h"
#include "mvimpstengineimsubservice.h"
#include "cvimpstuicontactselection.h"

#include    <vimpstui.mbg>
// help launch
#include <hlplch.h>
#include <coehelp.h>
#include "meco.hlp.hrh"

#include    <AiwGenericParam.h>
#include    <AiwCommon.hrh>                //KAiwCmdCall
#include    <AiwContactAssignDataTypes.h>
#include 	<commonphoneparser.h>

using namespace AiwContactAssign;
using namespace Phonebook2;

const TInt KBufLen(512);


// ================= MEMBER FUNCTIONS =======================


// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::CVIMPSTUiTabbedView
// --------------------------------------------------------------------------
//
CVIMPSTUiTabbedView::CVIMPSTUiTabbedView( 
MxSPViewMapper& aMapper, 
MxSPContactManager& aContactManager, 
TUint aTabbedViewId,
TUint aServiceId,
CPbk2UIExtensionView& aView,
TUid /*aId*/,
CVIMPSTUIExtensionService& aServiceData,
MVIMPSTEngine& aEngine,
MVIMPSTCmdHandler& aCommandHandler,
CVIMPSTUIMenuExtension& aMenuExtension) :
CxSPBaseView( aMapper, aContactManager, aView ),
iViewId( aTabbedViewId ),
iServiceId(aServiceId),
iEngine(aEngine),
iExtensionService( aServiceData ),
iCommandHandler( aCommandHandler),
iMenuExtension(aMenuExtension),
iSelectedAction( KErrNotFound )

            {
            iFixedToolbar = NULL;
            iIsToolBarHidden = ETrue;
            }


// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::ConstructL
// --------------------------------------------------------------------------
//
inline void CVIMPSTUiTabbedView::ConstructL()
    {
    ViewBaseConstructL( KIMCONTACTSEXTNIMPLEMENTATIONUID, iViewId );   
    
    iCommandHandler.RegisterEventObserverL(this);

    iPreviousState = TVIMPSTEnums::ESVCENotRegistered; 

    iServiceHandler = CAiwServiceHandler::NewL();    

    iServiceHandler->AttachL( R_IM_APP_INTEREST );
    iServiceHandler->AttachMenuL( R_SERVTAB_TABBED_VIEW_MENU, 
            R_IM_APP_INTEREST );   

    iServiceHandler->AttachL( R_AIWASSIGNMENT_INTEREST );    
   	
	iServiceHandler->AttachL( R_AIWSELECT_INTEREST );

    iStatusMessage = HBufC::NewL( KStatusTextLength ); 

    iStatusPaneHandler = CCVIMPSTUiStatusPaneHandler::NewL();

    //Get SearchMgr
    MVIMPSTEngineExtentionFeatures* feature = iEngine.ExtentionFeatures(TVIMPSTEnums::ESearch);
    if (feature)
        {
        MVIMPSTEngineSearchMgrExtention& searchMgr = 
        MVIMPSTEngineSearchMgrExtention::Cast
        (*feature);	

        searchMgr.RegisterObserver(this);   	
        }
    iSettingsStore = CVIMPSTSettingsStore::NewL();
    
	iBrandHandler = CVIMPSTUiBrandData::NewL( iEngine );
	
	iAppUi = CCoeEnv::Static()->AppUi();
	
	CFbsBitmap *bitmap, *mask;
	iBrandHandler->GetBrandBitmapsL( &bitmap, &mask);
	iStatusPaneHandler->SetPictureL( bitmap, mask );
	
	iIsServiceHandleReSet = EFalse;
	
	iContainerCreationStarted = EFalse;
    }


// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::NewL
// --------------------------------------------------------------------------
//
CVIMPSTUiTabbedView* CVIMPSTUiTabbedView::NewL( MxSPViewMapper& aMapper, 
        MxSPContactManager& aContactManager, 
        TUint aTabbedViewId,
        TUint aServiceId,
        CPbk2UIExtensionView& aView,
        TUid aId,
        CVIMPSTUIExtensionService& aServiceData,
        MVIMPSTEngine& aEngine,
        MVIMPSTCmdHandler& aCommandHandler,
        CVIMPSTUIMenuExtension& aMenuExtension)
    {
    CVIMPSTUiTabbedView* self = new(ELeave) CVIMPSTUiTabbedView( aMapper, 
            aContactManager,
            aTabbedViewId,
            aServiceId, 
            aView, 
            aId,
            aServiceData,
            aEngine,
            aCommandHandler,
            aMenuExtension);
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    return self;
    }


// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::~CVIMPSTUiTabbedView
// --------------------------------------------------------------------------
//
CVIMPSTUiTabbedView::~CVIMPSTUiTabbedView()
    {
    delete iContactSelection;
    delete iFriendRequestId;
    
    delete iSelectedData.iPackedLinks;
    iSelectedData.iXSPList.ResetAndDestroy();
  
  	delete iQueryResult;  
    //Get SearchMgr
    MVIMPSTEngineExtentionFeatures* feature = iEngine.ExtentionFeatures(TVIMPSTEnums::ESearch);
    if (feature)
        {
        MVIMPSTEngineSearchMgrExtention& searchMgr = 
        MVIMPSTEngineSearchMgrExtention::Cast
        (*feature);	

        searchMgr.UnRegisterObserver(this);   	
        }

    if(iParameter!=NULL)
        iParameter->Close();    
    if(iConnection!=NULL)
        {
        iConnection->Close();
        iConnection = NULL;
        }

    if (iContainer && iAppUi )
        {
        iAppUi->RemoveFromStack( iContainer->CoeControl() );
        delete iContainer;
        iContainerCreationStarted = EFalse;
        }
    delete iBrandHandler;
    iCommandHandler.UnRegisterEventObserver(this);	

    if ( iFixedToolbar )
        {
        iFixedToolbar->SetToolbarObserver( NULL );
        delete iFixedToolbar;
        iFixedToolbar = NULL;
        }

    if (iServiceHandler)
        {
        iServiceHandler->Reset();
        delete iServiceHandler;	
        iServiceHandler = NULL;
        }

    delete iContact;

    if(iFocussedIDHistory)
        {
        delete iFocussedIDHistory;
        iFocussedIDHistory = NULL;
        }
    delete iBrLauncher; 
    delete iUserId;
   
    if(iSettingsStore)
        {
        delete iSettingsStore;
        iSettingsStore = NULL;
        }
    delete iStatusPaneHandler;

    delete iAiwParamList;
    
    if(iStatusMessage)
	    {
	    delete iStatusMessage; 
	    }

    }



// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::DynInitMenuPaneL
// --------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane )
    {    
    
    if (iEngine.IsUnInstalled())
        {
        // if engine is uninstalled, do not initiate the menu pane.
        return;
        }
    // AIW knows its own submenu hooks, so we can return from 
    // here if AIW handled this.
    ReInitializeServiceHandlerL();
    
    iMenuExtension.ResetAIWCommandMap();
    
    if ( iServiceHandler->HandleSubmenuL( *aMenuPane ) )
        {
        return;
        }

    TBool imService     = iEngine.IsSubServiceSupportedL(TVIMPSTEnums::EIM);
    TBool voipService   = iEngine.IsSubServiceSupportedL(TVIMPSTEnums::EVoip);
    TBool presenceService = iEngine.IsSubServiceSupportedL(TVIMPSTEnums::EPresence);
    TVIMPSTEnums::TVIMPSTRegistrationState serviceTabState = 
    							iEngine.ServiceState();

    TInt itemIndex = CurrentItemIndex();
    // fetch the item and process correct type    
    TVIMPSTEnums::TItem itemType = iCommandHandler.GetProcessInterface().GetType(itemIndex);        
    TVIMPSTEnums::TOnlineStatus onlinestatus = iCommandHandler.GetProcessInterface().GetOnlineStatusL(itemIndex);        

    switch( aResourceId)
        {
        case R_EXTENSION_MANAGER_MENU:
            { 
            aMenuPane->AddMenuItemsL(R_SERVTAB_TABBED_VIEW_MENU);
            aMenuPane->AddMenuItemsL(R_TABBED_VIEW_GENERAL_MENU);

			aMenuPane->SetItemDimmed(ECmdGetBlockedList, ETrue);
            //based on sevice states decide what all submenu should be shown
            //and main menu's to be shown
            switch (serviceTabState)
                {
                case TVIMPSTEnums::ESVCENotRegistered:
                    {                   
                    aMenuPane->SetItemDimmed(ECmdCreateNewOption, ETrue);
                    aMenuPane->SetItemDimmed(ECmdMyAvatar, ETrue);
                    aMenuPane->SetItemDimmed(ECmdChangeStatus, ETrue);
                    aMenuPane->SetItemDimmed(ECmdLogout, ETrue);
                    aMenuPane->SetItemDimmed(ECmdCancelLogin, ETrue);
                    aMenuPane->SetItemDimmed(ECmdChangeConnectioninOnlineState, ETrue);
                    aMenuPane->SetItemDimmed(ECmdChangeConnectioninWaitingState, ETrue);
                    break;	
                    }
                case TVIMPSTEnums::ESVCERegistered:
                    { 
                    if (!presenceService)
                        {
                        aMenuPane->SetItemDimmed(ECmdMyAvatar, ETrue);	
                        aMenuPane->SetItemDimmed(ECmdChangeStatus, ETrue);	
                        }
                    else
                        {
                        //find whether avatar is supported  
                         	//Get Presence SubService  			
					   	MVIMPSTEngineSubService* subService =    	   
					   	   					(iEngine.SubService(TVIMPSTEnums::EPresence));
					    if(subService)
					        {
					        MVIMPSTEnginePresenceSubService& presence = 
					        		MVIMPSTEnginePresenceSubService::Cast (*subService);
					        
					        aMenuPane->SetItemDimmed(ECmdMyAvatar, !presence.IsAvatarSupported() ); 
					        }   
        
        	           }		           		
                    aMenuPane->SetItemDimmed(ECmdLogin, ETrue);
                    aMenuPane->SetItemDimmed(ECmdCancelLogin, ETrue);
       		
		       		if (!ChangeConnectionSupportedL())
		           		{
		           		aMenuPane->SetItemDimmed(ECmdChangeConnectioninOnlineState, ETrue);
		           		}
		           		
		       		aMenuPane->SetItemDimmed(ECmdChangeConnectioninWaitingState, ETrue);
                    if(iEngine.IsBlockSupportedL())
                        {
						aMenuPane->SetItemDimmed(ECmdGetBlockedList, EFalse);
                        }
                    break;	
                    }
                case TVIMPSTEnums::ESVCENetworkConnecting:
                    {                  
                    aMenuPane->SetItemDimmed(ECmdChangeStatus, ETrue);
                    aMenuPane->SetItemDimmed(ECmdCreateNewOption, ETrue);
                    aMenuPane->SetItemDimmed(ECmdMyAvatar, ETrue);
                    aMenuPane->SetItemDimmed(ECmdLogin, ETrue);
                    aMenuPane->SetItemDimmed(ECmdLogout, ETrue);
                    aMenuPane->SetItemDimmed(ECmdSettings, ETrue);	           		
		       		aMenuPane->SetItemDimmed(ECmdChangeConnectioninOnlineState, ETrue);   
		       		aMenuPane->SetItemDimmed(ECmdChangeConnectioninWaitingState, ETrue);        		
                    if( !CancelLoginSupportedL())
                        {
                        aMenuPane->SetItemDimmed(ECmdCancelLogin, ETrue);
                        }
                    break;	
                    }
                case TVIMPSTEnums::ESVCEWaitingForNetwork:
                case TVIMPSTEnums::ESVCEUpdatingContacts:
                    {
                    aMenuPane->SetItemDimmed(ECmdChangeStatus, ETrue);
                    aMenuPane->SetItemDimmed(ECmdCreateNewOption, ETrue);
                    aMenuPane->SetItemDimmed(ECmdMyAvatar, ETrue);
                    aMenuPane->SetItemDimmed(ECmdLogin, ETrue);
                    aMenuPane->SetItemDimmed(ECmdCancelLogin, ETrue);
		       		aMenuPane->SetItemDimmed(ECmdChangeConnectioninOnlineState, ETrue);	           		
		       		if (!ChangeConnectionSupportedL())
		           		{
		           		aMenuPane->SetItemDimmed(ECmdChangeConnectioninWaitingState, ETrue);
		           		}
                    break;	
                    }
                case TVIMPSTEnums::ESVCENetworkDisConnecting:
                    {                   
                    aMenuPane->SetItemDimmed(ECmdChangeStatus, ETrue);
                    aMenuPane->SetItemDimmed(ECmdCreateNewOption, ETrue);
                    aMenuPane->SetItemDimmed(ECmdMyAvatar, ETrue);
                    aMenuPane->SetItemDimmed(ECmdLogin, ETrue);
                    aMenuPane->SetItemDimmed(ECmdCancelLogin, ETrue);
                    aMenuPane->SetItemDimmed(ECmdSettings, ETrue);	
                    aMenuPane->SetItemDimmed(ECmdLogout, ETrue);
		       		aMenuPane->SetItemDimmed(ECmdChangeConnectioninWaitingState, ETrue);
		       		aMenuPane->SetItemDimmed(ECmdChangeConnectioninOnlineState, ETrue);	           		
                    break;	
                    }
                default:
                    {
                    break;	
                    }
                }
            // common to all 
            aMenuPane->SetItemDimmed(ECmdOpenConversation, ETrue);
            aMenuPane->SetItemDimmed(ECmdContactAddAsFriend, ETrue);
            aMenuPane->SetItemDimmed(KAiwCmdCall, ETrue);
            aMenuPane->SetItemDimmed(ECmdCloseConversation, ETrue);
            aMenuPane->SetItemDimmed(ECmdContactDetails, ETrue);
            aMenuPane->SetItemDimmed(ECmdOpenFriendRequest, ETrue);
            aMenuPane->SetItemDimmed(ECmdContactEdit, ETrue);
            aMenuPane->SetItemDimmed(ECmdAIWAddToContact, ETrue); 
            aMenuPane->SetItemDimmed(ECmdAIWLinkToContact, ETrue);
            aMenuPane->SetItemDimmed(ECmdBlock, ETrue);
            aMenuPane->SetItemDimmed(ECmdUnBlock, ETrue);
            aMenuPane->SetItemDimmed(ECmdContactDelete, ETrue);
            //based on items in focus decide what main menu items needs to be shown
            switch(itemType)
                {	            	
                case TVIMPSTEnums::EOwnStatusItem:
                case TVIMPSTEnums::EInvalid:     // this case comes when no matched found for findpane characters
                    {
                    break;	
                    }
                case TVIMPSTEnums::EContactItem:
                    {      
                    //conversation related menu   
                    MVIMPSTStorageServiceView* storage = 
                    CVIMPSTStorageManagerFactory::ContactListInterfaceL(iServiceId);
                    TBool localstore = EFalse;
                    if (storage)
                        {
                        localstore = storage->IsLocalStore();
                        }
                    if (TVIMPSTEnums::ESVCERegistered == serviceTabState)
                        {
                        TPtrC selectedItem = iCommandHandler.GetProcessInterface().
                        GetItemUserId(itemIndex);
                        if( selectedItem != KNullDesC )
                            {
                            if (imService)
                                {
                                if ( iCommandHandler.GetProcessInterface().IsConversationExist( itemIndex ) )
                                    {
                                    aMenuPane->SetItemDimmed(ECmdCloseConversation, EFalse);	
                                    aMenuPane->SetItemDimmed(ECmdOpenConversation, ETrue);
                                    }
                                else
                                	{
									aMenuPane->SetItemDimmed(ECmdOpenConversation, EFalse);
                                    }
                                }
                            }
                        if(voipService)
                            {
                            TInt index;
                            aMenuPane->MenuItemExists(KAiwCmdCall, index);
                            aMenuPane->SetItemDimmed(KAiwCmdCall, EFalse);

                            CAiwDialDataExt* dialDataExt = CAiwDialDataExt::NewL();
                            CleanupStack::PushL( dialDataExt );
                            dialDataExt->SetServiceId( iServiceId );
                            ReInitializeServiceHandlerL();
                            CAiwGenericParamList& paramList = iServiceHandler->InParamListL();
                            dialDataExt->FillInParamListL( paramList );                          
                            TAiwVariant variant;
                            TAiwGenericParam param ( EGenericParamSIPAddress, variant );
                            paramList.AppendL( param );
                            iServiceHandler->InitializeMenuPaneL( *aMenuPane, 
                                    R_SERVTAB_TABBED_VIEW_MENU,
                                    // Must not overlap with the other menu ids!
                                    ECmdAIWRangeStart,
                                    paramList );

                            CleanupStack::PopAndDestroy( dialDataExt );	

                            CEikMenuPaneItem::SData& data = aMenuPane->ItemDataByIndexL(index);
                            //add to AIW command map of the menuextension manager
                            iMenuExtension.AddToAIWCommandMap(KAiwCmdCall,data.iCommandId);
                            }                            

                        aMenuPane->SetItemDimmed(ECmdContactDetails, EFalse);  
                        
                            if (localstore)
                                {
                                //ContactEdit is enabled only for localstore
                                aMenuPane->SetItemDimmed(ECmdContactEdit, EFalse);
                                }
                            if(iEngine.IsBlockSupportedL())
                                {
                                TVIMPSTEnums::TOnlineStatus status = iCommandHandler.GetProcessInterface().GetOnlineStatusL(itemIndex); 
                                if(TVIMPSTEnums::EBlocked == status )
                                    {
                                    aMenuPane->SetItemDimmed(ECmdUnBlock, EFalse);
                                    }
                                else if( selectedItem .Length() )
                                    {
                                    aMenuPane->SetItemDimmed(ECmdBlock, EFalse);
                                    }
                                }
                            aMenuPane->SetItemDimmed(ECmdContactDelete, EFalse);    
                            
                      
                        if (!localstore)
                            {
                            aMenuPane->SetItemDimmed(ECmdAIWAddToContact, EFalse);  
                            aMenuPane->SetItemDimmed(ECmdAIWLinkToContact, EFalse);
                            }
                        }
                    else if (TVIMPSTEnums::ESVCENotRegistered == serviceTabState)
                        {
                        if(!presenceService)
                            {
                            if (localstore)
                                {
                                //ContactEdit is enabled only for localstore
                                aMenuPane->SetItemDimmed(ECmdContactEdit, EFalse);
                                }                            
                            }
                        }
                    
					break;	
                    }
                case TVIMPSTEnums::EUnknonContactItem :
                    {
                    aMenuPane->SetItemDimmed(ECmdContactAddAsFriend, EFalse);
                    aMenuPane->SetItemDimmed(ECmdContactDetails, ETrue);
                    aMenuPane->SetItemDimmed(ECmdOpenFriendRequest, ETrue);
                    aMenuPane->SetItemDimmed(ECmdContactEdit, ETrue);
                    aMenuPane->SetItemDimmed(ECmdAIWAddToContact, ETrue); 
                    aMenuPane->SetItemDimmed(ECmdAIWLinkToContact, ETrue);
                    aMenuPane->SetItemDimmed(ECmdBlock, ETrue);
                    aMenuPane->SetItemDimmed(ECmdUnBlock, ETrue);
                    aMenuPane->SetItemDimmed(ECmdContactDelete, ETrue);
                    if( iEngine.IsBlockSupportedL() )
                        {
                        aMenuPane->SetItemDimmed(ECmdBlock, EFalse);
                        }
                    if (imService)
                        {                            
                        if (iCommandHandler.GetProcessInterface().IsConversationExist( itemIndex ))
                            {
                            aMenuPane->SetItemDimmed(ECmdCloseConversation, EFalse);
                            aMenuPane->SetItemDimmed(ECmdOpenConversation, ETrue);
                            }
                        else
                        	{
							aMenuPane->SetItemDimmed(ECmdOpenConversation, EFalse);
                            }
                        }
                    if(voipService)
                        {
						TInt index;
                        aMenuPane->MenuItemExists(KAiwCmdCall, index);
								
                        aMenuPane->SetItemDimmed(KAiwCmdCall, EFalse);

                        CAiwDialDataExt* dialDataExt = CAiwDialDataExt::NewL();
                        CleanupStack::PushL( dialDataExt );
                        dialDataExt->SetServiceId( iServiceId );
                        ReInitializeServiceHandlerL();
                        CAiwGenericParamList& paramList = iServiceHandler->InParamListL();
                        dialDataExt->FillInParamListL( paramList );                          
                        TAiwVariant variant;
                        TAiwGenericParam param ( EGenericParamSIPAddress, variant );
                        paramList.AppendL( param );
                        iServiceHandler->InitializeMenuPaneL( *aMenuPane, 
                                R_SERVTAB_TABBED_VIEW_MENU,
                                // Must not overlap with the other menu ids!
                                ECmdAIWRangeStart,
                                paramList );
                        CleanupStack::PopAndDestroy( dialDataExt ); 
						
						CEikMenuPaneItem::SData& data = aMenuPane->ItemDataByIndexL(index);
					    //add to AIW command map of the menuextension manager
                        iMenuExtension.AddToAIWCommandMap(KAiwCmdCall,data.iCommandId);
 
                        }  
                    break;
                    }
                case TVIMPSTEnums::EFriendRequestItem:
                    {
                    aMenuPane->SetItemDimmed(ECmdContactDetails, ETrue);
                    aMenuPane->SetItemDimmed(ECmdContactEdit, ETrue);
                    aMenuPane->SetItemDimmed(ECmdAIWAddToContact, ETrue); 
                    aMenuPane->SetItemDimmed(ECmdAIWLinkToContact, ETrue);
                    aMenuPane->SetItemDimmed(ECmdBlock, ETrue);
                    aMenuPane->SetItemDimmed(ECmdUnBlock, ETrue);
                    aMenuPane->SetItemDimmed(ECmdContactDelete, ETrue);
                    aMenuPane->SetItemDimmed(ECmdOpenFriendRequest, EFalse);
                    if(iEngine.IsBlockSupportedL())
                        {
                        aMenuPane->SetItemDimmed(ECmdBlock, EFalse);
                        }
                    break;  
                    }
                default:
                    {
                    break;	
                    }
                }
            // append the servicetab options(R_TABBED_VIEW_OPTIONS_MENU) and tabbed 
            // viem(R_SERVTAB_TABBED_VIEW_MENU) menu items and the the service
            // specific options and then settings,help and exit.(R_TABBED_VIEW_GENERAL_MENU)
            iMenuExtension.OfferMenuPaneToPlugins(ECmdCancelLogin,*aMenuPane,iServiceId);

            break;	
            }

        case R_SERVTAB_CREATENEW_OPTION_SUBMENU:
            {

            aMenuPane->SetItemDimmed(ECmdAddContact, ETrue);
            aMenuPane->SetItemDimmed(ECmdAddFromPhoneBook, ETrue);
            aMenuPane->SetItemDimmed(ECmdSearch, ETrue);					           		

            if (TVIMPSTEnums::ESVCERegistered == serviceTabState)            	
                {
                aMenuPane->SetItemDimmed(ECmdAddContact, EFalse);
                aMenuPane->SetItemDimmed(ECmdAddFromPhoneBook, EFalse);

                //make search request using search manager in engine   	
                MVIMPSTEngineExtentionFeatures* feature = 
                iEngine.ExtentionFeatures(TVIMPSTEnums::ESearch);

                if (feature)
                    {
                    if ( TVIMPSTEnums::ESupported == feature->IsSupported() )
                        {
                        aMenuPane->SetItemDimmed(ECmdSearch, EFalse);//show if search is supported. 
                        }
                    }
                }
            break;	
            }

        case R_SERVTAB_CHANGEAVATAR_SUBMENU: 
            {            	
            if ((TVIMPSTEnums::ESVCERegistered != serviceTabState) ||
                    (!presenceService))
                {
                aMenuPane->SetItemDimmed(ECmdAvatarGallery, ETrue);	
                aMenuPane->SetItemDimmed(ECmdAvatarNewPhoto, ETrue);	
                aMenuPane->SetItemDimmed(ECmdDefaultAvatar, ETrue);	
                }            
            break;	
            }

        case R_TABBED_VIEW_GENERAL_MENU:
            {
            switch (serviceTabState)
                {
                case TVIMPSTEnums::ESVCENotRegistered:
                    {
                    aMenuPane->SetItemDimmed(ECmdLogout, ETrue);
                    aMenuPane->SetItemDimmed(ECmdCancelLogin, ETrue);
					aMenuPane->SetItemDimmed(ECmdGetBlockedList, ETrue);
                    break;	
                    }
                case TVIMPSTEnums::ESVCERegistered:
                    {
                    aMenuPane->SetItemDimmed(ECmdLogin, ETrue);
                    aMenuPane->SetItemDimmed(ECmdCancelLogin, ETrue);
                    break;	
                    }
                case TVIMPSTEnums::ESVCENetworkConnecting:
                    {
                    aMenuPane->SetItemDimmed(ECmdLogin, ETrue);
					aMenuPane->SetItemDimmed(ECmdGetBlockedList, ETrue);
                    aMenuPane->SetItemDimmed(ECmdLogout, ETrue);
                    aMenuPane->SetItemDimmed(ECmdSettings, ETrue);	           		
                    if( !CancelLoginSupportedL())
                        {
                        aMenuPane->SetItemDimmed(ECmdCancelLogin, ETrue);
                        }
                    break;	
                    }
                case TVIMPSTEnums::ESVCEWaitingForNetwork:
                case TVIMPSTEnums::ESVCEUpdatingContacts:
                    {
                    aMenuPane->SetItemDimmed(ECmdLogin, ETrue);
                    aMenuPane->SetItemDimmed(ECmdCancelLogin, ETrue);
					aMenuPane->SetItemDimmed(ECmdGetBlockedList, ETrue);
                    break;	
                    }
                case TVIMPSTEnums::ESVCENetworkDisConnecting:
                    {
                    aMenuPane->SetItemDimmed(ECmdLogin, ETrue);
                    aMenuPane->SetItemDimmed(ECmdCancelLogin, ETrue);
                    aMenuPane->SetItemDimmed(ECmdSettings, ETrue);
					aMenuPane->SetItemDimmed(ECmdGetBlockedList, ETrue);
                    aMenuPane->SetItemDimmed(ECmdLogout, ETrue);
                    break;	
                    }
                default:
                    {
                    break;	
                    }


                }
            break;	
            }
        }                

    }

// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::HandleCommandL
// --------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::HandleCommandL(TInt aCommand)
    {
    //offer to extensions first, then to aiw.
    if(iMenuExtension.OfferHandleCommandToPlugins(aCommand))
        {
        //command is executed, hence return.
        return;
        }
    ReInitializeServiceHandlerL();
    if ( iServiceHandler )
    		{
    		TInt serviceCommandId =iServiceHandler->ServiceCmdByMenuCmd(aCommand);
				
		    if ( iContainer && serviceCommandId == KAiwCmdCall )
		        {
		       	MakeVoipCallL();
		        return;
		        }	
    	  }
    if( iContainer )
        {
        iContainer->SetClrFindPaneFlag(ETrue);
        }
    
    switch (aCommand)
        {
        case ECmdLogin:
            {						
            LoginL();			
            break;
            }
        case ECmdSearch:
            {
            SearchContactsL();						
            break;
            }
        case ECmdAddFromPhoneBook:
            {
           
            LaunchFetchDialogL();						
            break;
            }
        case EAknCmdHelp:
            {
            TBool imSupported = iEngine.IsSubServiceSupportedL(TVIMPSTEnums::EIM);
            TBool voipSupported = iEngine.IsSubServiceSupportedL(TVIMPSTEnums::EVoip);
            if ( imSupported )
                { 
                if (  voipSupported  )
                    { // both Im and VOIP are enabled 
                    LaunchHelpL( KSERVTAB_HLP_MAIN_VIEW_VOIPIM );
                    }
                else
                    {// only IM is enabled
                    LaunchHelpL( KSERVTAB_HLP_MAIN_VIEW_IM );
                    }
                }
            else if ( voipSupported )
                { // only VOIP is enabled
                LaunchHelpL( KSERVTAB_HLP_MAIN_VIEW_VOIP );
                }   
            
            break;
            }
        case EAknCmdExit:
        case EAknSoftkeyExit:
            { 
            //exit from phone book.
            Pbk2AppUi()->HandleCommandL( EAknSoftkeyExit );

            break;
            }
        case ECmdSettings:
            {
             LaunchSettingsViewL();
             break;
            }		

        case ECmdLogout:
            {                        
            // this is for actual network logout          
            iCommandHandler.HandleCommandL(ELogoutService, this, &iServiceId);
            break;
            } 

        case ECmdContactDetails:        
            {
            TInt index = KErrNotFound;                        
            if (iContainer)
                {				
                index = iContainer->CurrentItemIndex(); 
                }
            if(KErrNotFound != index)
                {
                TLaunchCCAData data;
                data.iIndex = index;
                iConnection = TCCAFactory::NewConnectionL();
                data.iConnection = iConnection;
                iCommandHandler.HandleCommandL(ELaunchCCA, this, &data );
                }
            break;
            }
        case ECmdOpenConversation:
            {
            if( iContainer )
                {
                iContainer->SendMessageL();
                }

            break;
            }

        case ECmdAddContact:
            {
            AddContactL( R_IM_ADD_CONTACT_MANUAL_QUERY );
            break;
            }

        case ECmdContactEdit:
            { 
            EditContactL();           
            break;
            }
        case ECmdContactDelete:        
            {
            if( iContainer )
                {
                iContainer->SetClrFindPaneFlag(EFalse);
                }
            DeleteContactL();
            break;
            }
        case ECmdChangeStatus:
            {
            ChangeStatusProcessL();
            break;
            } 
        case ECmdCancelLogin:
            {
            iCommandHandler.HandleCommandL( ECancelLogin , this , NULL );
            break;
            }                     

        case ECmdOpenFriendRequest:
            {
            ProcessFriendRequestL();
            break;
            }

        case ECmdAvatarGallery:
        case ECmdAvatarNewPhoto:     
            {
            CAvatarSelectionHandler* avatarHandler = CAvatarSelectionHandler::NewLC();
            HBufC* avatarFile = avatarHandler->HandleAvatarSelectionL( aCommand );
            if( avatarFile ) // if user selected the image 
                {
                CleanupStack::PushL( avatarFile ); 
                if(iWaitNote)
	                {
	                delete iWaitNote;
	                iWaitNote = NULL;	
	                }
                iWaitNote = CVIMPSTUtilsWaitNote::ShowWaitNoteL( R_QTN_SERVTAB_CHANGE_AVATAR_CHANGING, EFalse , ETrue );
                ChangeOwnAvatarL( *avatarFile , avatarHandler->MimeTypeL() );
                CleanupStack::PopAndDestroy(); //avatarFile
                }
	        CleanupStack::PopAndDestroy(); // avatarHandler
            break;
            }
       case ECmdDefaultAvatar:
            {
            ChangeOwnAvatarL( KNullDesC , KNullDesC8 );
            break;
            }        

        case ECmdCloseConversation:
            {
            CloseConversationL();
            break;
            }
    	case ECmdChangeConnectioninWaitingState:
		case ECmdChangeConnectioninOnlineState:
			{
			iEngine.ChangeConnectionL();
			break;	
			}
		case ECmdBlock:        
            {
            if( iContainer )
                {
                iContainer->SetClrFindPaneFlag(EFalse);
                }
            BlockContactL(ETrue);
            break;
            }
		case ECmdUnBlock:        
            {
            if( iContainer )
                {
                iContainer->SetClrFindPaneFlag(EFalse);
                }
            BlockContactL();
            break;
            }
        case ECmdGetBlockedList:
	        {
			ShowBlockedContactListL();
			break;
	        }
        case ECmdAIWAddToContact:
       	case ECmdAIWLinkToContact:
        	{
            CreateOrLinkToPhoneBookL(aCommand);
           	break;	
        	}
       	case ECmdContactAddAsFriend:
       	    {
       	    TInt index = KErrNotFound;                        
       	    if (iContainer)
       	        {               
       	        index = iContainer->CurrentItemIndex(); 
       	        }
       	    MVIMPSTProcessArray& arrayprocess = iCommandHandler.GetProcessInterface();
       	    TVIMPSTEnums::TItem itemType = arrayprocess.GetType( index );
       	    if( itemType ==  TVIMPSTEnums::EUnknonContactItem ) 
       	        {
       	        TPtrC userId = arrayprocess.GetItemUserId( index );
       	        AddContactL( R_IM_ADD_CONTACT_MANUAL_QUERY , userId );
       	        }
       	    break;
       	    }
			       	case EAknCmdHideInBackground:
       	    {
       	    //in case of EAknCmdHideInBackground phonebook be in 
       	    //background and all the child application should close

       	    if(iConnection)//  close connection to close cca
       	        {
       	        iConnection->Close();
       	        iConnection = NULL;
       	        }
       	    if (iServiceHandler)//reset selectionhandler so that it closes all the phonebook forms if open
       	        {
       	        iServiceHandler->Reset();
       	        iIsServiceHandleReSet = ETrue;
       	        }
       	    
            Pbk2AppUi()->HandleCommandL( aCommand );

       	    break;
       	    }
        default:
            {
            Pbk2AppUi()->HandleCommandL( aCommand );
            break;
            }
        }
    }



// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::DoActivateViewL
// --------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::DoActivateViewL( const TVwsViewId& aPrevViewId,
        TUid /*aCustomMessageId*/,
        const TDesC8& aCustomMessage)
    {	
    // When ST is launched from widget or universal indicator plugin
    // user clicks twice continuously, then DoActivateL is called
    // twice, as iContainer is NULL since construction is not complete
    // then it creates two controls (containers), hence to avoid this
    // situation, we are checking if construction of iContainer has 
    // started, then we ignore DoActivateL second time.  
    MPbk2ViewActivationTransaction* viewActivationTransaction =
    Pbk2AppUi()->Pbk2ViewExplorer()->HandleViewActivationLC(
            iView.Id(),
            aPrevViewId,
            &iEngine.ServiceName(),
            NULL,
            EUpdateAll );

    // Notifies startup monitor of view activation
    if( Pbk2AppUi()->Pbk2StartupMonitor() )
        {
        Pbk2AppUi()->Pbk2StartupMonitor()->
        NotifyViewActivationL( iView.Id() );
        }
    
    if (iEngine.IsUnInstalled())
        {
    // engine is uninstalled, disable left softkey i.e options and provide only exit.
        iView.Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_EXIT);
        }
    else
        {
    // engine is constructed completely, provide tabbed view softkeys.
        iView.Cba()->SetCommandSetL(R_IM_CONTACTS_TABBED_VIEW_SOFTKEYS);
        }
    
	
	ReadAndSetOwnUserIdL();

    if (!iContainer&& !iContainerCreationStarted)
        {
        iContainerCreationStarted = ETrue;
        iContainer = MVIMPSTUiTabbedViewControlFactory::NewTabControlL(*this,
                &iView,iCommandHandler, iServiceId,
                *iBrandHandler, iEngine);
        // take the control pointer
        CCoeControl* cCoeControl = iContainer->CoeControl();
        iAppUi->AddToStackL( iView, cCoeControl );
        cCoeControl->SetMopParent( &iView );        
        cCoeControl->SetRect( iView.ClientRect() ); 
        cCoeControl->ActivateL();
        } 
     iStatusPaneHandler->SetTextL( iEngine.ServiceName() );
    // Commit application-wide state changes
    viewActivationTransaction->Commit();
    CleanupStack::PopAndDestroy(); //viewActivationTransaction    
    
    //CreateToolBarL();
    
    if(TVIMPSTEnums::ESVCERegistered  == iEngine.ServiceState())
        {
        if(iIsToolBarHidden)
            {
            ShowHideFixedToolbarL(ETrue);
            }
        }
    else
        {
        if(!iIsToolBarHidden)
            {
            ShowHideFixedToolbarL(EFalse);
            }
        }
    
    if(iContainer && iFocussedIDHistory )
        {
        iContainer->SetFocussedId( iFocussedIDHistory->Des() );
        } 
    
    /*
     * aCustomMessage has following format if it is coming from Service Widget
     * when you click on widget 
     * we need to unpack data in similar format 
     * version number --> stream.WriteInt8L(1);
     * EEnd --> stream.WriteInt8L( 0 );
     * Service Id --> stream.WriteInt32L( iServiceId );
     * 
     * If function call is coming from other than service widget then 
     * aCustomMessage will not have data in above format
     */
    
    if(aCustomMessage.Length())
        {        
        RDesReadStream stream( aCustomMessage);
        stream.PushL();
        TInt serviceId = KErrNotFound;
        TRAP_IGNORE( const TUint versionNumber = stream.ReadUint8L(); //equal to 1
        TInt type = stream.ReadInt8L(); // equal to eend
        serviceId = stream.ReadInt32L(); );
        CleanupStack::PopAndDestroy();//stream
        if( serviceId ==  iServiceId  )
            {
            // this case will get excuted only when there is 
            // fresh login from service widget for first time only
            // uid has been taken for autologin 
            // if the service id is matches to aCustomMessage 
            // it is auto login ,called from service widget
            // start the login procedure            
            LoginL();            
            }       
        }
    UpdateToolbarL();	
    }

// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::DoDeactivate
// --------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::DoDeactivate()
    {

    if(iFixedToolbar)
        {
        iIsToolBarHidden = ETrue;
        delete iFixedToolbar;
        iFixedToolbar = NULL;
        }   
    
    if (iContainer)
        {   
        delete iFocussedIDHistory;
    	iFocussedIDHistory = NULL;
        TRAP_IGNORE( iFocussedIDHistory = iContainer->GetFocussedId().AllocL() );
        iAppUi->RemoveFromStack( iContainer->CoeControl() );
        delete iContainer;
        iContainer = NULL;
        iContainerCreationStarted = EFalse;
        }
    }

// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::HandleForegroundEventL
// --------------------------------------------------------------------------
// 
TAny* CVIMPSTUiTabbedView::UIExtensionViewExtension(
                TUid aExtensionUid )
    {
    if (aExtensionUid == KMPbk2UIExtensionView2Uid)
        {
        return static_cast<MPbk2UIExtensionView2*>(this);
        }
    return NULL;
    }
// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::HandleForegroundEventL
// --------------------------------------------------------------------------
//
 
 void CVIMPSTUiTabbedView::HandleForegroundEventL(TBool aForeground)
	 {
	 if( aForeground && TVIMPSTEnums::ESVCENotRegistered == iEngine.ServiceState() )
		 {
		 // user might has changed the setting read the new and refresh the view
		 // user can change setting in offline only
		 ReadAndSetOwnUserIdL();	
		 }
	 }

// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::HandleCommandKeyL
// --------------------------------------------------------------------------
//
TBool CVIMPSTUiTabbedView::HandleCommandKeyL(const TKeyEvent& aKeyEvent, TEventCode /*aType*/)
    {
    TBool result = EFalse;
    switch (aKeyEvent.iCode)
        {        
        default:
            {
            break;
            }
        }
    return result;
    }

// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::HandleStatusPaneSizeChange
// --------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::HandleStatusPaneSizeChange()
    {
    // Resize the container to fill the client rectangle
    if (iContainer)
        {
        iContainer->CoeControl()->SetRect( iView.ClientRect() );         
        }
    }    

// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::CommandHandlerL
// --------------------------------------------------------------------------
//
MVIMPSTCmdHandler& CVIMPSTUiTabbedView::CommandHandlerL()
    {    
    return iCommandHandler;
    }


// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::CommandFinishedL
// --------------------------------------------------------------------------
//

void CVIMPSTUiTabbedView::CommandFinishedL(
        const MVIMPSTCmd& aCommand )
    {
      TRACER_AUTO;
    //handle the observer for commands issues thro HandleCommandL()

    switch (aCommand.CommandId())
        {
        case ELoginService:
            {
            //login command is complete
            //use aCommand.Result() to get the data     
            //Ownership is not given to the caller            
            break;
            }
        case ELogoutService:
            {
            //logout command is complete
            //use aCommand.Result() to get the data 
            //Ownership is not given to the caller               
            break;
            } 
        case ECmdProcessAcceptedContactNew: // accept create new 
        case ECmdProcessAcceptedContactExist: // update existing
        case ECmdProcessSelectedContactNew: 
        case ECmdProcessSelectedContactExist:// add from phonebook
        case EAddContact:
            {
            //addcontact command is complete
            //use aCommand.Result() to get the data 
            //Ownership is not given to the caller
            //some error occured.
            if (iWaitNote)
                {
                delete iWaitNote;
                iWaitNote = NULL;   
                }
            if(aCommand.Result() != KErrNone) 
                {
                ShowErrorNoteL( aCommand.Result() );
                }
            break;
            } 
        case EDeleteContact:
            {
            //addcontact command is complete
            //use aCommand.Result() to get the data 
            //Ownership is not given to the caller  
            //some error occured.
            if (iWaitNote)
                {
                delete iWaitNote;
                iWaitNote = NULL;   
                }
            if(aCommand.Result() != KErrNone) 
                {
                HBufC* prompt = NULL;
                prompt = StringLoader::LoadLC( R_IM_ERROR_SERVICE_ERR  );
                TInt ret( VIMPSTUtilsDialog::DisplayErrorNoteL( *prompt ) );
                CleanupStack::PopAndDestroy(prompt);
                }
            break;
            } 
        case EChangeOwnStatus: 
            {
            TInt error = aCommand.Result();
            if( KErrNone == error )
                {
                // show confirmation note
                HBufC* text = CEikonEnv::Static()->AllocReadResourceLC( R_QTN_CHAT_CHANGE_STATUS_CHANGED );
                CAknConfirmationNote* dlg = new( ELeave )CAknConfirmationNote();
                dlg->ExecuteLD( *text );
                CleanupStack::PopAndDestroy( text );
                //get the status from the engine and update in the ui.
                if(iContainer)
                    {
                    iContainer->HandleItemAdditionL();
                    }

                }
            else if( KErrCancel == error )
                {
                // user cancelled, status was not updated
                HBufC* text = NULL;
                text = StringLoader::LoadLC( R_QTN_IM_CHANGE_STATUS_NOT_CHANGED );
                VIMPSTUtilsDialog::DisplayNoteDialogL( *text  );
                CleanupStack::PopAndDestroy(); //onlineText
                }
            else
                {
                // change status failed
                HBufC* failed = StringLoader::LoadLC( R_QTN_CHAT_CHANGE_STATUS_FAILED );
                VIMPSTUtilsDialog::DisplayErrorNoteL( *failed );
                CleanupStack::PopAndDestroy( failed );
                }
            break;
            }
        case EChangeOwnMessage:
            {
            TInt error = aCommand.Result();
            if( KErrNone == error )
                {
                // show note qtn_chat_change_message_changing
                HBufC* prompt = NULL;
                prompt = StringLoader::LoadLC( R_QTN_CHAT_CHANGE_MESSAGE_CHANGED );
                VIMPSTUtilsDialog::DisplayNoteDialogL( *prompt);
                CleanupStack::PopAndDestroy(prompt);
                }
            else if( KErrCancel == error)
                {
                HBufC* prompt = NULL;
                prompt = StringLoader::LoadLC( R_QTN_IM_CHANGE_STATUS_NOT_CHANGED );
                VIMPSTUtilsDialog::DisplayNoteDialogL( *prompt);
                CleanupStack::PopAndDestroy(prompt);
                }
            else
                {
                HBufC* prompt = NULL;
                prompt = StringLoader::LoadLC( R_QTN_CHAT_CHANGE_MESSAGE_FAILED );
                VIMPSTUtilsDialog::DisplayNoteDialogL(*prompt );
                CleanupStack::PopAndDestroy(prompt);
                }

            break;
            }
        case ESearch:
            {
            // Search command is complete
            //use aCommand.Result() to get the data 
            if(iWaitNote)
                {
                delete iWaitNote;
                iWaitNote = NULL;	
                }
            if(aCommand.Result() != KErrNone) 
                {
                HBufC* prompt = NULL;
                prompt = StringLoader::LoadLC(R_QTN_CHAT_ERROR_NOT_SUP_FUNCTIONS );
                VIMPSTUtilsDialog::DisplayErrorNoteL( *prompt ) ;
                CleanupStack::PopAndDestroy(prompt);
                LaunchViewL(iExtensionService.TabbedViewId());
                } 
            }
        case EFriendRejected:
        case EFriendAccpeted:
            {
            if(iWaitNote)
          	     {
          	     delete iWaitNote;
          	     iWaitNote = NULL;   
          	     }
		    if( ( aCommand.Result() != KErrNone ) && ( aCommand.CommandId() == EFriendAccpeted  ) ) 
                {
                HBufC* prompt = StringLoader::LoadLC( R_QTN_SERVTAB_SAVING_CONTACT_FAILED );
                VIMPSTUtilsDialog::DisplayErrorNoteL( *prompt ) ;
                CleanupStack::PopAndDestroy(prompt);
                } 
            break;
            }
        case EChangeOwnAvtar:
            {
            if(aCommand.Result() == KErrNone)  // successfull show confirmation note
                {
                if(iWaitNote)
                    {
                    delete iWaitNote;
                    iWaitNote = NULL;   
                    }
                } 
            else  // show error note
                {
                HBufC* prompt  = StringLoader::LoadLC( R_QTN_SERVTAB_ERROR_UPDATE_AVATAR );
                VIMPSTUtilsDialog::DisplayErrorNoteL( *prompt ) ;
                CleanupStack::PopAndDestroy(prompt);
                }
            break;
            }
        case ECmdBlockContact:
           {
		TRACE("block finished enter");
           //blockcontact command is complete
           //use aCommand.Result() to get the data 
           //Ownership is not given to the caller  
           //some error occured.
           if(iWaitNote)
               {
               delete iWaitNote;
               iWaitNote = NULL;   
               }
           if(aCommand.Result() != KErrNone) 
               {
		   TRACE( "aCommand result = %d ", aCommand.Result() );
               HBufC* prompt = NULL;
               prompt = StringLoader::LoadLC( R_QTN_CHAT_BLOCKING_FAILED  );
		   TRACE("blocking error prompt displaying");	
               TInt ret( VIMPSTUtilsDialog::DisplayErrorNoteL( *prompt ) );
               CleanupStack::PopAndDestroy(prompt);
               }
           break;
           } 
        case ECmdUnBlockContact:
           {
		TRACE("unblock finished enter");

           if(iWaitNote)
               {
               delete iWaitNote;
               iWaitNote = NULL;   
               }
           //unblockcontact command is complete
           //use aCommand.Result() to get the data 
           //Ownership is not given to the caller  
           //some error occured.
           if(aCommand.Result() != KErrNone) 
               {
                TRACE( "aCommand result = %d ", aCommand.Result() );
               HBufC* prompt = NULL;
               prompt = StringLoader::LoadLC( R_QTN_CHAT_UNBLOCKING_FAILED  );
		   TRACE("unblocking error prompt displaying");	
               TInt ret( VIMPSTUtilsDialog::DisplayErrorNoteL( *prompt ) );
               CleanupStack::PopAndDestroy(prompt);
               }
           else
        	   {
			TRACE("unblocking successful");	

		         if(iContainer)
		          {
		            TInt index = CurrentItemIndex();
			        if( index > 0 )
                         {
	                      MVIMPSTProcessArray& arrayprocess = iCommandHandler.GetProcessInterface();
	                      HBufC* contactId =  arrayprocess.GetItemUserId(index).AllocLC();
	              	      if( contactId->Length() )
	                          {									   
						TRACE("HandleAvatarRefreshl calling for unblock");		   
				    iContainer->HandleAvatarRefreshL(*contactId,EFalse);
		      
			          }					
	                      }
	               CleanupStack::PopAndDestroy();
                    }   
        	   }
           break;
           } 
        default:
            { 
            //should never be here.           
            break;
            }
        }
    }
    
// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::ShowErrorNoteL
// --------------------------------------------------------------------------
void CVIMPSTUiTabbedView::ShowErrorNoteL(TInt aError )
	{
	TRACER_AUTO;
	HBufC* textResource = NULL;
	switch( aError)
		{
		case EErrExistInBlockList:
			{
			textResource = StringLoader::LoadLC( R_QTN_SERVTAB_ADD_FRIEND_BLOCKED);
			break;	
			}
		case KErrAlreadyExists :
		case EErrExistInContactList:
			{
			textResource = StringLoader::LoadLC( R_QTN_SERTAB_CONTACT_ALREADY_EXISTS_ERROR_NOTE);
			break;	
			}
		default :
			{
			textResource = StringLoader::LoadLC( R_QTN_SERVTAB_SAVING_CONTACT_FAILED );
			break;	
			}
		}
	if( textResource )
		{
		CAknInformationNote* note = new ( ELeave ) CAknInformationNote;
		note->ExecuteLD( *textResource );
		CleanupStack::PopAndDestroy( textResource );
		}
	}
    
// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::HandleCommandEventL
// --------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::HandleCommandEventL(TVIMPSTEnums::TVIMPSTRegistrationState aState, TInt /*aServiceError*/) 
    {    
    switch (aState)	
        {
        case TVIMPSTEnums::ESVCERegistered:
            {
            // this is to make sure that it always has the user id
            // some services they do not have the user id in offline case
            // like skype ,get the user if service is logged in
            if( !iUserId || iUserId->Length() == 0 )
	            {
	            // read if user id is empty only
	            ReadAndSetOwnUserIdL();	
	            }
            TInt isSuccessfulLogin = 0;
            iSettingsStore->GetL(iServiceId, EServiceSuccessfullLogin, isSuccessfulLogin);
            if(!isSuccessfulLogin)
                {
                isSuccessfulLogin = 1;
                iSettingsStore->SetL(iServiceId, EServiceSuccessfullLogin, isSuccessfulLogin);
                }
            if(iIsToolBarHidden)
                {
                ShowHideFixedToolbarL(ETrue);
                }
            break;
            }
        case TVIMPSTEnums::ESVCENotRegistered:
            {
             // might user has choosen some diff user id while login
            // set to store and engine etc
            ReadAndSetOwnUserIdL();
        	
		 	// no need to hide the tool bar here as its already called while in the 
		 	// disconnecting state.
		 	// assume in some cornere scenario, where network is lost, and the ui does not 
		 	// get a callback for disconnecting state then we need to call hidetoolbar in this case.
		 	// hence the flag iIsToolBarHidden will set it when ever the tool bar is hidden 
		 	if(!iIsToolBarHidden)
		 	    {
		 	    ShowHideFixedToolbarL(EFalse);
		 	    }
            break;	
            }
        case TVIMPSTEnums::ESVCENetworkConnecting:
            {
            // might user has choosen some diff user id while login
            // set to store and engine etc
            ReadAndSetOwnUserIdL();
            break;
            }
        case TVIMPSTEnums::ESVCEWaitingForNetwork:
            {
            break;
            }
        case TVIMPSTEnums::ESVCENetworkDisConnecting:
            {
            if(!iIsToolBarHidden)
                {
                ShowHideFixedToolbarL(EFalse);
                }
            break;
            }
        case TVIMPSTEnums::ESVCEUpdatingContacts:
            {
            // might user has choosen some diff user id while login
            // set to store and engine etc 
            // this is to make sure that it always has the user id
            // some services they do not have the user id in offline case
            // like skype ,get the user if service is logged in
            if( !iUserId || iUserId->Length() == 0 )
	            {
	            // read if user id is empty only
	            ReadAndSetOwnUserIdL();	
	            }
            break;
            }	
        default:
            {
            //should never be here.
            break;
            }

        }
    if(iContainer)
        {
        iContainer->HandleItemAdditionL();        
        }

    }

// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::CurrentItemIndex
// --------------------------------------------------------------------------
//
TInt CVIMPSTUiTabbedView:: CurrentItemIndex()
    {
    TInt index = KErrNone;
    iContainer?(index = iContainer->CurrentItemIndex()):(index = KErrNotFound);
    return index;
    }


// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::ReadAndSetOwnUserIdL()
// --------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::ReadAndSetOwnUserIdL()
    {
    if( iUserId )
		{
		delete iUserId;	
		iUserId = NULL;
		}
 	iUserId = iEngine.GetOwnUserIdFromCChOrStorageL();
 	iEngine.SetOwnUserIdIfChangedL( *iUserId );
    }
// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::AddContactL
// --------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::AddContactL( const TInt aResouceId, const TDesC& aUserId )
    {
	TRACER_AUTO;
    MVIMPSTStorageServiceView* storage = CVIMPSTStorageManagerFactory::ContactListInterfaceL(iServiceId);    
    if (storage)
        {
        if (!storage->IsLocalStore())
            {
            HBufC* userid = HBufC::NewL(KUsernameMaxLength);
    		CleanupStack::PushL( userid );
    		TPtr useridPtr( userid->Des() );
			
            useridPtr.Copy( aUserId.Left( KUsernameMaxLength ) );
            TInt result = 0;
            if( useridPtr == KNullDesC )
                {
                CAknTextQueryDialog* dlg = CAknTextQueryDialog::NewL( useridPtr, CAknQueryDialog::ENoTone );
                dlg->SetPredictiveTextInputPermitted( ETrue ); // T9
                result = dlg->ExecuteLD( aResouceId );
                }
            if( ( result == EAknSoftkeyOk ) || ( result == EAknSoftkeyYes )  || ( useridPtr != KNullDesC ) )
                {
                TPtrC ownUserId = storage->OwnContactL().UserId();
                if(useridPtr.Compare( ownUserId ) == 0) //Do not add own data item to contact list
                    {
                    //show note "Own Data Item cannot be added"
                    HBufC* failed = StringLoader::LoadLC( R_QTN_SERVTAB_ERROR_ADDOWN );
                    VIMPSTUtilsDialog::DisplayErrorNoteL( *failed );
                    CleanupStack::PopAndDestroy( failed );
                    }
                else
                    {
                    CVIMPSTUtilsWaitNote* note = CVIMPSTUtilsWaitNote::ShowWaitNoteLC( R_QTN_SERVTAB_SAVING_CONTACT ,ETrue);
                    iCommandHandler.HandleCommandL(EAddContact, this, userid ); 
                    CleanupStack::PopAndDestroy( note );
                    }
             	}
		    CleanupStack::PopAndDestroy(userid);
            }
    else // server store
               
        {
                ////////////////////////////////////////////
                ReInitializeServiceHandlerL();
                TUint assignFlags = 0;
                //for unknown item createnew/update existing querry is shown
                // check whether the selected contact is unknown
                if( iCommandHandler.GetProcessInterface().GetType(iContainer->CurrentItemIndex()) ==  TVIMPSTEnums::EUnknonContactItem ) 
                    {
                    iSelectedAction = ShowNewUpdateQueryL();
                    if(CVIMPSTUiTabbedView::EInvitAcceptCreateNew == iSelectedAction )//create new 
                        {
                        assignFlags |= ECreateNewContact;
                        iSelectedAction = EContactCreateNew;
                        }
                    else if(CVIMPSTUiTabbedView::EInvitAcceptUpdateExisting == iSelectedAction ) // update existing
                        {
                        iSelectedAction = EContactAddFromContacts;
                        }
                    else // selected cancle option
                        {
                        return;
                        }
                    }
                else // not unknown contact
                    {
                    iSelectedAction = EContactCreateNew;
                    assignFlags |= ECreateNewContact;
                    }
                //show the phonebook dialog for create new/update existing option
    if(iAiwParamList)
        {
    delete iAiwParamList;
    iAiwParamList = NULL;
                }        
            iAiwParamList = CAiwGenericParamList::NewL();
            iAiwParamList->AppendL(
                    TAiwGenericParam(
                            EGenericParamContactAssignData,
                            TAiwVariant(TAiwSingleContactAssignDataV1Pckg(
                                    TAiwSingleContactAssignDataV1().SetFlags( assignFlags )))));
            
            if( aUserId.Length() > 0 )
                {
                // add user id in impp field
                TBuf<KBufLen> xspId; //xsp max length
                xspId.Append(iEngine.ServiceName());
                xspId.Append(KColon);
                xspId.Append(aUserId);

                iAiwParamList->AppendL(
                        TAiwGenericParam(
                                EGenericParamXSpId,
                                TAiwVariant(xspId) ) );
                }
            iServiceHandler->ExecuteServiceCmdL(
                    KAiwCmdAssign,
                    *iAiwParamList,
                    iServiceHandler->OutParamListL(),
                    0,
                    this);
            }
        }
    }

// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::CreateOrLinkToPhoneBookL
// --------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::CreateOrLinkToPhoneBookL(TInt aCommand )
	{
	TRACER_AUTO;
	TInt index = CurrentItemIndex();
	if( index <= 0 )
		{
		return;
		}
	TUint assignFlags = 0;
    if(ECmdAIWAddToContact == aCommand )//create new option
        {
        assignFlags |= ECreateNewContact;
        }
	TPtrC itemUserId = iCommandHandler.GetProcessInterface().GetItemUserId(index) ;
	if(iAiwParamList)
		{
		delete iAiwParamList;
		iAiwParamList = NULL;
		}   
	iAiwParamList = CAiwGenericParamList::NewL();
	iAiwParamList->AppendL(
	TAiwGenericParam(
	EGenericParamContactAssignData,
	TAiwVariant(TAiwSingleContactAssignDataV1Pckg(
	TAiwSingleContactAssignDataV1().SetFlags( assignFlags )))));

	TBuf<KBufLen> xspid;
	xspid.Append(iEngine.ServiceName());
	xspid.Append(KColon);
	xspid.Append(itemUserId);
	ReInitializeServiceHandlerL();
	iAiwParamList->AppendL(
						TAiwGenericParam(
						EGenericParamXSpId,
						TAiwVariant(xspid))  );

	iServiceHandler->ExecuteServiceCmdL( KAiwCmdAssign,
					                     *iAiwParamList,
					                     iServiceHandler->OutParamListL(),
					                     0,
					                     this);
	}

// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::EditContactL
// --------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::EditContactL()
    {
	TRACER_AUTO;
    MVIMPSTStorageServiceView* storage = CVIMPSTStorageManagerFactory::ContactListInterfaceL(iServiceId);    
    if (storage)
        {        
        if( storage->IsLocalStore())
            {
            iSelectedAction = KErrNotFound;
            TInt index = CurrentItemIndex();
        	MVPbkContactLink* contactLink = iCommandHandler.GetProcessInterface().ContactLink(index);        	
        	//show the phonebook dialog for edit existing data
            if(iAiwParamList)
                {
                delete iAiwParamList;
                iAiwParamList = NULL;
                }        
            iAiwParamList = CAiwGenericParamList::NewL();
			iAiwParamList->AppendL(
                    TAiwGenericParam(
                            EGenericParamContactAssignData,
                            TAiwVariant(TAiwSingleContactAssignDataV1Pckg(
                                    TAiwSingleContactAssignDataV1().SetFlags( EskipInfoNotes )))));

			HBufC8* packedLinks = contactLink->PackLC();
		    iAiwParamList->AppendL(
                    TAiwGenericParam(
                            EGenericParamContactLinkArray,
                            TAiwVariant(*packedLinks) ) );
		    ReInitializeServiceHandlerL();

            iServiceHandler->ExecuteServiceCmdL(
                    KAiwCmdAssign,
                    *iAiwParamList,
                    iServiceHandler->OutParamListL(),
                    0,
                    this);
		    CleanupStack::PopAndDestroy(); // packedLinks
            }
       }
    }




// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::AddContactL
// --------------------------------------------------------------------------
void CVIMPSTUiTabbedView::AddContactL(RPointerArray<HBufC> aContacts)
    {
	TRACER_AUTO;
    TInt count = aContacts.Count();

    switch( count )
        {
        case 0://no xsp found.
            {
            //launch add manually dialog.
            AddContactL( R_IM_ADD_CONTACT_MANUAL_QUERY );//to do replace with some thing else.
            break;
            }
        case 1://1 xsp foud.
            {
            //add new contact.
            HBufC* xspId = aContacts[0];
            AddContactL( R_IM_ADD_CONTACT_MANUAL_QUERY, *xspId );
            break;
            }
        default :// > 1 xsp found.
            {
            //show single selection dialog
            TInt selectionIndex = 0;
            CDesCArray* xspIds = new( ELeave )CDesCArrayFlat( count );
            CleanupStack::PushL( xspIds );

            //add all xsp(s) from aContacts to xspIds.
            for( TInt i = 0 ; i < count ; i++ )
                {
                xspIds->AppendL( *aContacts[i] );
                }

            HBufC* titleText = StringLoader::LoadLC( R_QTN_SERVTAB_SELECT_USER );

            TInt ret = VIMPSTUtilsDialog::DisplayListQueryDialogL( &selectionIndex,
                    xspIds,
                    R_IM_LIST_SELECT_STATUS_MESSAGE_DLG,
                    *titleText,
                    KNullDesC,
                    ETrue );
            CleanupStack::PopAndDestroy( titleText );


            if ( ret == EAknSoftkeyOk || ret == EAknSoftkeyDone || ret == EAknSoftkeySelect )
                {
                TPtrC selectedXspid = (*xspIds)[selectionIndex];
                AddContactL( R_IM_ADD_CONTACT_MANUAL_QUERY, selectedXspid );
                }
            CleanupStack::PopAndDestroy(xspIds);
            break;
            }
        }    
    }

// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::CopyToPhoneBookL
// --------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::CopyToPhoneBookL()
    {
	TRACER_AUTO;
    TInt index = CurrentItemIndex();

    TPtrC name( KNullDesC );
    if( index <= 0 )
        {
        // return if item not found
        return; 
        }

    TPtrC seletctedItem = iCommandHandler.GetProcessInterface().GetItemUserId(index) ;

    MVIMPSTStorageServiceView* storage = CVIMPSTStorageManagerFactory::ContactListInterfaceL(iServiceId) ;
    if(storage)
        {
        MVIMPSTStorageContact* contact = storage->FindContactByUserId(seletctedItem);
        if(contact)
            {
            CVIMPSTUtilsWaitNote* note = CVIMPSTUtilsWaitNote::ShowWaitNoteLC( R_QTN_SERVTAB_SAVING_CONTACT ,ETrue);
            iCommandHandler.HandleCommandL(EAddToPbk, this, contact );
            CleanupStack::PopAndDestroy(note);
            }
        }
    }

// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::DeleteContactL
// --------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView:: DeleteContactL()
    {
	TRACER_AUTO;
    TInt index = CurrentItemIndex();
    HBufC* deletePrompt = NULL;
    TPtrC name( KNullDesC );

    if(iContainer)
        {
        iContainer->CheckAndSetLastItemFlag();
        }
    if( index <= 0 )
        {
        // return if item not found
        return;	
        }

    TPtrC seletctedItem = iCommandHandler.GetProcessInterface().GetItemUserId(index) ;
    name.Set( seletctedItem );

    deletePrompt = StringLoader::LoadLC( R_QTN_SERVTAB_DELETE_CONTACT, name, CCoeEnv::Static() );
    TInt ret( VIMPSTUtilsDialog::DisplayQueryDialogL(R_GENERIC_YES_NO_CONFIRMATION_QUERY, *deletePrompt ) );
    CleanupStack::PopAndDestroy( deletePrompt );

    MVPbkContactLink* contactLink = iCommandHandler.GetProcessInterface().ContactLink(index);

    if( ( ret == EAknSoftkeyOk ) || ( ret == EAknSoftkeyYes ) )
        {
        if(iWaitNote)
            {
            delete iWaitNote;
            iWaitNote = NULL;
            }
        iWaitNote = CVIMPSTUtilsWaitNote::ShowWaitNoteL( R_QTN_CHAT_DELETING_CONTACT ,ETrue);
        iCommandHandler.HandleCommandL(EDeleteContact, this, &contactLink );
        }
    }



// -----------------------------------------------------------------------------
// CVIMPSTUiTabbedView::ChangeStatusProcessL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::ChangeStatusProcessL()
    {
	TRACER_AUTO;
    if( iEngine.ServiceState() )
        {
        // Check variation
        TInt showAppearOffline = 1;
        TInt showAway = 1 ;   
        TInt showBusy = 1;

        TInt awayIndex( 0 );
        TInt busyIndex( 0 );
        TInt appOfflineIndex( 0 );

        // first icon is online
        // calculate indexes for other icons
        if ( showAway)
            {
            awayIndex++;
            busyIndex++;
            appOfflineIndex++;
            }
        else
            {
            awayIndex = -1;
            }

        if ( showBusy )
            {
            busyIndex++;
            appOfflineIndex++;
            }
        else
            {
            busyIndex = -1;
            }

        if ( showAppearOffline )
            {
            appOfflineIndex++;
            }
        else
            {
            appOfflineIndex = -1;
            }

        TInt status( 0 );
        CAknListQueryDialog* dlg = new ( ELeave )
        CAknListQueryDialog( &status );
        dlg->PrepareLC( R_IM_STATUS_CHANGE_DLG );

        // Format the texts
        // Create a array for texts
        CDesCArray* listItemsArray =
        new ( ELeave ) CDesCArrayFlat( KAmountOfOwnStatusStates );
        CleanupStack::PushL( listItemsArray );

        // Online
        HBufC* onlineText = NULL;
        onlineText = StringLoader::LoadLC( R_QTN_CHAT_CHANGE_OWN_ONLINE );

        HBufC* itemTxtOnline =
        HBufC::NewLC( KTabFormatLenght + onlineText->Length() );
        TPtr itemTxtPtrOnline( itemTxtOnline->Des() );

        itemTxtPtrOnline.Format( KTabFormat, KOnlineIconIndex );
        itemTxtPtrOnline.Append( *onlineText );
        listItemsArray->AppendL( itemTxtPtrOnline );
        CleanupStack::PopAndDestroy( itemTxtOnline );
        CleanupStack::PopAndDestroy( onlineText );

        // Away
        if ( showAway )
            {
            HBufC* awayText = NULL;
            awayText = StringLoader::LoadLC( R_QTN_CHAT_CHANGE_OWN_AWAY );

            HBufC* itemTxtAway = HBufC::NewLC(
                    KTabFormatLenght + awayText->Length() );
            TPtr itemTxtPtrAway( itemTxtAway->Des() );

            itemTxtPtrAway.Format( KTabFormat, awayIndex );
            itemTxtPtrAway.Append( *awayText );
            listItemsArray->AppendL( itemTxtPtrAway );
            CleanupStack::PopAndDestroy( itemTxtAway );
            CleanupStack::PopAndDestroy( awayText );
            }

        // Busy
        if ( showBusy )
            {
            HBufC* busyText = NULL;
            busyText = StringLoader::LoadLC( R_QTN_SERVTAB_CHANGE_OWN_DND );

            HBufC* itemTextBusy = HBufC::NewLC(
                    KTabFormatLenght + busyText->Length() );
            TPtr itemTxtPtrBusy( itemTextBusy->Des() );

            itemTxtPtrBusy.Format( KTabFormat, busyIndex );
            itemTxtPtrBusy.Append( *busyText );
            listItemsArray->AppendL( itemTxtPtrBusy );
            CleanupStack::PopAndDestroy( itemTextBusy );
            CleanupStack::PopAndDestroy( busyText );
            }
        // Appear offline
        if ( showAppearOffline )
            {
            HBufC* offlineText = NULL;
            offlineText = StringLoader::LoadLC( R_QTN_CHAT_CHANGE_OWN_APPEAR_OFFLINE );

            HBufC* itemTextOffline = HBufC::NewLC(
                    KTabFormatLenght + offlineText->Length() );
            TPtr itemTxtPtrOffline( itemTextOffline->Des() );

            itemTxtPtrOffline.Format( KTabFormat, appOfflineIndex );
            itemTxtPtrOffline.Append( *offlineText );
            listItemsArray->AppendL( itemTxtPtrOffline );
            CleanupStack::PopAndDestroy( itemTextOffline );
            CleanupStack::PopAndDestroy( offlineText );
            }

        // Set the array
        dlg->SetOwnershipType( ELbmOwnsItemArray );
        CleanupStack::Pop( listItemsArray );
        dlg->SetItemTextArray( listItemsArray );

        // Add icons
        CArrayPtr< CGulIcon >* icons = LoadOwnStatusIconsL();


        dlg->SetIconArrayL( icons ); // transfers ownership
        // TODO::get own status

        // get dialog's listbox
        CEikListBox* listBox = dlg->ListBox();

        //listBox->SetCurrentItemIndex( 0 );

        TInt result = dlg->RunLD();

        //structure to pack status and status text.
        TStatusAndStatusText statusAndSatatustext;

        TInt error( KErrNone );
        if ( ( result == EAknSoftkeyOk ) ||
                ( result == EAknSoftkeySelect ) )
            {
            if ( status == 0 )                    
                {
                TInt autoStatusMsgEnabledForOnline = 1; /*IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_ONLINE_AUTO );*/
                if( autoStatusMsgEnabledForOnline )
                    {
                    error = AskStatusMessageL( TVIMPSTEnums::EOnline, EFalse );
                    } 
                if( error == KErrNone )
                    {
                    statusAndSatatustext.iStatus  = TVIMPSTEnums::EOnline;
                    statusAndSatatustext.iStatusText.Copy(iStatusMessage->Des());
                    CVIMPSTUtilsWaitNote* note = CVIMPSTUtilsWaitNote::ShowWaitNoteLC( R_QTN_CHAT_CHANGE_STATUS_CHANGING );
                    error = iCommandHandler.HandleCommandL(EChangeOwnStatus, this, &statusAndSatatustext);
                    CleanupStack::PopAndDestroy( note );
                    }
                }
            else if ( status == awayIndex ) // Away 
                { 
                // can't get here unless Away is enabled  
                TInt autoStatusMsgEnabledForAway = 1;
                //IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_AWAY_AUTO );
                if( autoStatusMsgEnabledForAway )
                    {                
                    error = AskStatusMessageL( TVIMPSTEnums::EAway, EFalse );
                    }
                if( error == KErrNone )
                    {
                    statusAndSatatustext.iStatus  = TVIMPSTEnums::EAway;
                    statusAndSatatustext.iStatusText.Copy(iStatusMessage->Des());
                    CVIMPSTUtilsWaitNote* note = CVIMPSTUtilsWaitNote::ShowWaitNoteLC( R_QTN_CHAT_CHANGE_STATUS_CHANGING );
                    error = iCommandHandler.HandleCommandL(EChangeOwnStatus, this, &statusAndSatatustext);
                    CleanupStack::PopAndDestroy( note );
                    }
                }

            else if ( status == busyIndex ) // Busy 
                {
                // can't get here unless Busy is enabled
                TInt autoStatusMsgEnabledForBusy = 1;
                //IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_BUSY_AUTO  );
                if( autoStatusMsgEnabledForBusy )
                    {
                    error = AskStatusMessageL( TVIMPSTEnums::EBusy, EFalse );
                    }
                if( error == KErrNone )
                    {
                    statusAndSatatustext.iStatus  = TVIMPSTEnums::EBusy;
                    statusAndSatatustext.iStatusText.Copy(iStatusMessage->Des());
                    CVIMPSTUtilsWaitNote* note = CVIMPSTUtilsWaitNote::ShowWaitNoteLC( R_QTN_CHAT_CHANGE_STATUS_CHANGING );
                    error = iCommandHandler.HandleCommandL(EChangeOwnStatus, this, &statusAndSatatustext);
                    CleanupStack::PopAndDestroy( note );

                    }
                }
            else if ( status == appOfflineIndex ) //appearOffline
                {

                statusAndSatatustext.iStatus  = TVIMPSTEnums::EInvisible;
                statusAndSatatustext.iStatusText.Copy(iStatusMessage->Des());
                CVIMPSTUtilsWaitNote* note = CVIMPSTUtilsWaitNote::ShowWaitNoteLC( R_QTN_CHAT_CHANGE_STATUS_CHANGING );
                error = iCommandHandler.HandleCommandL(EChangeOwnStatus, this, &statusAndSatatustext);
                CleanupStack::PopAndDestroy( note );
                }
            else
                {
                HBufC* text = NULL;
                text = StringLoader::LoadLC( R_QTN_IM_CHANGE_STATUS_NOT_CHANGED );
                VIMPSTUtilsDialog::DisplayNoteDialogL( *text );
                CleanupStack::PopAndDestroy( text );
                }
            //iUISessionManager->SetStatusPaneIconsL();
            }
        }
    }

// ---------------------------------------------------------
// CVIMPSTUiTabbedView::LoadOwnStatusIconsL
// ---------------------------------------------------------
//
CAknIconArray* CVIMPSTUiTabbedView::LoadOwnStatusIconsL()
    {
	TRACER_AUTO;
    CAknIconArray* icons = iBrandHandler->LoadOwnStatusIconsLC();
    CleanupStack::Pop( icons );
    return icons;
    }

// ---------------------------------------------------------
// CVIMPSTUiTabbedView::AskStatusMessageL()
// (other items were commented in a header).
// ---------------------------------------------------------
//
TInt CVIMPSTUiTabbedView::AskStatusMessageL( TVIMPSTEnums::TOnlineStatus aStatus,
        TBool aUpdateToNetwork )
    {
	TRACER_AUTO;
    CDesCArray* statusMessages = new( ELeave )CDesCArrayFlat(4);
    CleanupStack::PushL( statusMessages );

    HBufC* firstLine = StringLoader::LoadLC( R_QTN_CHAT_CHANGE_NEW_MESSAGE );
    statusMessages->AppendL( *firstLine );
    CleanupStack::PopAndDestroy( firstLine );

    // Read status messages
    ReadStatusMessagesL( *statusMessages, aStatus );

    // show the query
    TInt selectionIndex( statusMessages->Count() > 1 ? 1 : 0 );

    // Force to continue if selection query is not shown
    TInt ret = EAknSoftkeyOk;

    if( selectionIndex == 1 )
        {
        // There were previous status messages, show selection query
        HBufC* titleText = StringLoader::LoadLC( R_QTN_CHAT_CHANGE_SELECT_MESSAGE );
        ret = VIMPSTUtilsDialog::DisplayListQueryDialogL( &selectionIndex, statusMessages,
                R_IM_LIST_SELECT_STATUS_MESSAGE_DLG,
                *titleText, KNullDesC, ETrue );
        CleanupStack::PopAndDestroy( titleText );
        }

    if ( !( ret == EAknSoftkeyOk || ret == EAknSoftkeyDone || ret == EAknSoftkeySelect ) )
        {
        CleanupStack::PopAndDestroy( statusMessages );
        return KErrCancel;
        }

    TPtr statusTxt( iStatusMessage->Des() );
    statusTxt.Zero();

    if( selectionIndex != 0 )
        {
        statusTxt.Copy( ( *statusMessages) [ selectionIndex ] );
        }

    TInt result = VIMPSTUtilsDialog::DisplayTextQueryDialogL(
            statusTxt ,
            R_QTN_CHAT_CHANGE_STATUS_MESSAGE,
            R_IM_ENTER_STATUS_MESSAGE_QUERY,
            ETrue, // T9
            ETrue // LSK always visible
    );

    if ( (result == EAknSoftkeyOk || result == EAknSoftkeyDone )&&(iEngine.ServiceState()))
        {

        // Delete first line.
        statusMessages->Delete( 0 );
        statusMessages->InsertL( 0, statusTxt );
        WriteStatusMessagesL( *statusMessages, aStatus );            
        if( aUpdateToNetwork ) 
            {
            CVIMPSTUtilsWaitNote* note = CVIMPSTUtilsWaitNote::ShowWaitNoteLC( R_QTN_CHAT_CHANGE_MESSAGE_CHANGING );
            //structure to pack status and status text.
            TStatusAndStatusText statusAndSatatustext;
            statusAndSatatustext.iStatus  = aStatus;
            statusAndSatatustext.iStatusText.Copy( statusTxt );
            iCommandHandler.HandleCommandL(EChangeOwnMessage, this, &statusAndSatatustext);
            CleanupStack::PopAndDestroy( note );
            }
        }
    else
        {
        CleanupStack::PopAndDestroy();//statusMessages
        return KErrCancel;
        }
    CleanupStack::PopAndDestroy(); //statusMessages
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CVIMPSTUiTabbedView::ReadStatusMessagesL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::ReadStatusMessagesL( CDesCArray& aArray, TVIMPSTEnums::TOnlineStatus aStatus)
    {
	TRACER_AUTO;
    RBuf buffer;
    buffer.CreateL( RProperty::KMaxPropertySize );
    CleanupClosePushL( buffer );
            TInt err(KErrNone);
            switch ( aStatus )
                {
                case TVIMPSTEnums::EOnline:
                    {
                    err = iSettingsStore->GetL( iServiceId, EServiceOwnStatusMessagesOnline, buffer ); 
                    break;
                    }
                case TVIMPSTEnums::EBusy:
                    {
                    err = iSettingsStore->GetL( iServiceId, EServiceOwnStatusMessagesBusy, buffer ); 
                    break;
                    }
                case TVIMPSTEnums::EAway:
                    {
                    err = iSettingsStore->GetL( iServiceId, EServiceOwnStatusMessagesAway, buffer ); 
                    break;
                    }
                }
    TBuf< KStatusMessageHeaderLength > header;

    TInt countOfMessages( 0 );
    TInt offset( 1 ); // First character is for header length
    TInt headerLength( 0 );
    if( err == KErrNone && buffer.Length() )
        {
        TLex lexer( buffer.Left( 1 ) );
        err = lexer.Val( headerLength );
        }
    else
        {
        err = KErrEof;
        }
    while( err == KErrNone && countOfMessages < KMaxStatusMessageCount )
        {
        TPtrC ptr( buffer.Mid( offset ) );
        if( ptr.Length() > headerLength )
            {
            header.Copy( ptr.Left( headerLength ) );
            header.Trim();
            TLex lexer( header );
            offset += headerLength;
            TInt messageLength( 0 );
            err = lexer.Val( messageLength );
            if( err == KErrNone )
                {
                ptr.Set( buffer.Mid( offset ) );
                if( ptr.Length() >= messageLength )
                    {
                    if (messageLength)
                        {
                        aArray.AppendL( ptr.Left( messageLength ) );
                        ++countOfMessages; // this should be increased only for not null messages.
                        }
                    offset += messageLength;
                    }
                else
                    {
                    err = KErrEof;
                    }
                }
            }
        else
            {
            err = KErrEof;
            }
        }
    CleanupStack::PopAndDestroy(); //buffer
    }

// -----------------------------------------------------------------------------
// CVIMPSTUiTabbedView::WriteStatusMessagesL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//

void CVIMPSTUiTabbedView::WriteStatusMessagesL( MDesCArray& aArray, TVIMPSTEnums::TOnlineStatus aStatus )
    {
	TRACER_AUTO;
    TPtrC firstLine = aArray.MdcaPoint( 0 );
    TInt countOfMessages( 0 );
    TInt arrayCount( aArray.MdcaCount() );
    TInt index( 0 );

    RBuf buffer;
    buffer.CreateL( RProperty::KMaxPropertySize );
    CleanupClosePushL( buffer );

    TBuf< KStatusMessageHeaderLength > header;
    // Read the array and append the buffer
    while( index < arrayCount && countOfMessages < KMaxStatusMessageCount )
        {
        if( index == 0 )
            {
            header.Format( KStatusMessageHeaderLengthFormat,
                    KStatusMessageHeaderLength );
            buffer.Append( header );
            }
        TPtrC message = aArray.MdcaPoint( index );
        if( index == 0 || message.CompareF( firstLine ) != 0 )
            {
            header.Format( KStatusMessageHeaderFormat, message.Length() );
            buffer.Append( header );
            buffer.Append( message );
            //skipping increase of countOfMessages is to get one more status message if it is null.
            if( message.Length() ) // null status message
                {
                ++countOfMessages;
                }
            }
        ++index;
                }
            switch ( aStatus )
                {
                case TVIMPSTEnums::EOnline:
                    {
                    iSettingsStore->SetL( iServiceId, EServiceOwnStatusMessagesOnline, buffer ); 
                    break;
                    }
                case TVIMPSTEnums::EBusy:
                    {
                    iSettingsStore->SetL( iServiceId, EServiceOwnStatusMessagesBusy, buffer ); 
                    break;
                    }
                case TVIMPSTEnums::EAway:
                    {
                    iSettingsStore->SetL( iServiceId, EServiceOwnStatusMessagesAway, buffer ); 
                    break;
                    }
                }
    CleanupStack::PopAndDestroy(); // buffer
    }


// -----------------------------------------------------------------------------
// CVIMPSTUiTabbedView::ChangeOwnStatusMessageL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::ChangeOwnStatusMessageL()
    {
    TVIMPSTEnums::TOnlineStatus status = iCommandHandler.GetProcessInterface().GetOnlineStatusL( 0 ); //0 for own status item
    // ETrue meaning network change required
    AskStatusMessageL(status, ETrue);
    }
// -----------------------------------------------------------------------------
// CVIMPSTUiTabbedView::ChangeOwnAvatarL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::ChangeOwnAvatarL(const TDesC& aFileName, const TDesC8& aMimeType )
	{
	TRACER_AUTO;
	MVIMPSTProcessArray& arrayprocess = iCommandHandler.GetProcessInterface();
	TAvatarData avatarData;
	avatarData.iStatus = arrayprocess.GetOnlineStatusL(0);
	avatarData.iStatusText.Copy( arrayprocess.StatusTextL(0) );
	avatarData.iFileName.Set(aFileName);
	avatarData.iMimeType.Set(aMimeType);
	iCommandHandler.HandleCommandL(EChangeOwnAvtar, this, &avatarData);   
	}
// -----------------------------------------------------------------------------
// CVIMPSTUiTabbedView::GetServiceState
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TVIMPSTEnums::TVIMPSTRegistrationState CVIMPSTUiTabbedView::GetServiceState()
    {
    return iEngine.ServiceState();
    }


// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::SearchContactsL
// --------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView:: SearchContactsL()
	{
	TRACER_AUTO;
	CVIMPSTUiSearchFieldArray& fieldArray = iExtensionService.GetSearchFieldArray(); 

	if( !fieldArray.Count() )
		{
		return;	
		}
	
	if(!iIsToolBarHidden)
	    {
	    ShowHideFixedToolbarL(EFalse);
	    }

	if (iContainer)
		{
		iContainer->DeactivateFindPaneL();
		}

	fieldArray.ResetFieldData();
	fieldArray.SetSearchType( EIMBasicSearch );
	//Launch the search view with search dialog
	LaunchViewL( iExtensionService.SearchViewId() );
	            
	}

// ---------------------------------------------------------------------------
// CVIMPSTUiTabbedView::LaunchViewL()
// ---------------------------------------------------------------------------
// 
void CVIMPSTUiTabbedView::LaunchViewL( TInt aViewId )
    {
	TRACER_AUTO;

    CPbk2ViewState* state = CPbk2ViewState::NewLC( );

    TInt searchViewId;
    TInt err = iMapper.GetNewView( 
            KIMCONTACTSEXTNIMPLEMENTATIONUID, 
            aViewId, 
            searchViewId );
    User::LeaveIfError( err );                        
    Phonebook2::Pbk2AppUi()->Pbk2ViewExplorer()->ActivatePhonebook2ViewL
    (TUid::Uid(searchViewId), state);

    CleanupStack::PopAndDestroy( state );
    }

// ---------------------------------------------------------
// CVIMPSTUiTabbedView::CreateToolBarL
// ---------------------------------------------------------
//
void CVIMPSTUiTabbedView::CreateToolBarL()
    {
	TRACER_AUTO;
    if ( AknLayoutUtils::PenEnabled() )
        {
        TInt resourceId = 0;
        if(iEngine.IsSubServiceSupportedL(TVIMPSTEnums::EIM) && 
                !iEngine.IsSubServiceSupportedL(TVIMPSTEnums::EVoip))
            {
            resourceId = R_IM_APP_TOOLBAR;
            }
        else if(iEngine.IsSubServiceSupportedL(TVIMPSTEnums::EVoip) && 
                !iEngine.IsSubServiceSupportedL(TVIMPSTEnums::EIM))
            {
            resourceId = R_VOIP_APP_TOOLBAR;
            }
        else           
            {
            resourceId = R_IM_VOIP_APP_TOOLBAR;
            }
        if ( resourceId != 0 && !iFixedToolbar )
            {              
            CAknToolbar* temp = iFixedToolbar;

            iFixedToolbar = CAknToolbar::NewL( resourceId );
            iFixedToolbar->SetToolbarObserver( this ); 
            iFixedToolbar->SetCloseOnAllCommands( EFalse );
            CEikAppUiFactory* appUiFactory = 
            static_cast<CEikAppUiFactory*>(CEikonEnv::Static()->AppUiFactory() );                  
            appUiFactory->SetViewFixedToolbar( iFixedToolbar );

            iFixedToolbar->SetToolbarVisibility( EFalse, EFalse );
            delete temp;
            temp = NULL;
            }
        }
    else
        {
        delete iFixedToolbar;
        iFixedToolbar = NULL;
        }
    }

// ---------------------------------------------------------
// CVIMPSTUiTabbedView::UpdateToolbarL
// ---------------------------------------------------------
//
void CVIMPSTUiTabbedView::UpdateToolbarL()
    {
	TRACER_AUTO;
    if ( AknLayoutUtils::PenEnabled() && iFixedToolbar && iContainer )    
        {
        TInt currentItemIndex = iContainer->CurrentItemIndex();        
        TVIMPSTEnums::TItem itemType = iCommandHandler.GetProcessInterface().GetType(currentItemIndex);         
        TVIMPSTEnums::TOnlineStatus onlinestatus = iCommandHandler.GetProcessInterface().GetOnlineStatusL(currentItemIndex);        
        TBool imEnabled = iEngine.IsSubServiceEnabled(TVIMPSTEnums::EIM);
        TBool voipEnabled = iEngine.IsSubServiceEnabled(TVIMPSTEnums::EVoip);
        TPtrC selectedItem = iCommandHandler.GetProcessInterface().GetItemUserId(currentItemIndex);
        
        if(voipEnabled && imEnabled)
            {                
            if( TVIMPSTEnums::EOwnStatusItem == itemType ||
                    TVIMPSTEnums::EFriendRequestItem == itemType ||
                    KErrNotFound == currentItemIndex )
                {
                iFixedToolbar->SetItemDimmed( ECmdToolbarVoipCall, ETrue, EFalse );
                iFixedToolbar->SetItemDimmed( ECmdToolbarChat, ETrue, EFalse );
                iFixedToolbar->SetItemDimmed( ECmdToolbarDetails, ETrue, EFalse );
                }
            else if( TVIMPSTEnums::EUnknonContactItem == itemType  )
                {  
                iFixedToolbar->SetItemDimmed(ECmdToolbarVoipCall, EFalse, EFalse); 
                iFixedToolbar->SetItemDimmed(ECmdToolbarChat, EFalse, EFalse); 
                iFixedToolbar->SetItemDimmed(ECmdToolbarDetails, ETrue, EFalse);                 
                }
            else if( TVIMPSTEnums::EContactItem == itemType )
                {  
                if( selectedItem != KNullDesC  &&  TVIMPSTEnums::EServiceOut != onlinestatus )
                    {
                  
                    iFixedToolbar->SetItemDimmed(ECmdToolbarChat, EFalse, EFalse);
                    }
                else
                    {
                    iFixedToolbar->SetItemDimmed(ECmdToolbarChat, ETrue, EFalse);
                    }
                iFixedToolbar->SetItemDimmed(ECmdToolbarDetails, EFalse, EFalse); 
                iFixedToolbar->SetItemDimmed(ECmdToolbarVoipCall, EFalse, EFalse); 
                }  
            else
                {  
                iFixedToolbar->SetItemDimmed(ECmdToolbarVoipCall, ETrue, EFalse); 
                iFixedToolbar->SetItemDimmed(ECmdToolbarChat, ETrue, EFalse);
                iFixedToolbar->SetItemDimmed(ECmdToolbarDetails, EFalse, EFalse);                 
                }  
            }
        else if(imEnabled && !voipEnabled)
            {                   
            if( TVIMPSTEnums::EOwnStatusItem == itemType ||
                    TVIMPSTEnums::EFriendRequestItem == itemType ||
                    KErrNotFound == currentItemIndex)
                {
                iFixedToolbar->SetItemDimmed( ECmdToolbarChat, ETrue, EFalse );
                iFixedToolbar->SetItemDimmed( ECmdToolbarDetails, ETrue, EFalse );               
                }
            else if( TVIMPSTEnums::EUnknonContactItem == itemType  )
                {  
                iFixedToolbar->SetItemDimmed(ECmdToolbarChat, EFalse, EFalse); 
                iFixedToolbar->SetItemDimmed(ECmdToolbarDetails, ETrue, EFalse);                 
                }
            else if( TVIMPSTEnums::EContactItem == itemType )
                {
                iFixedToolbar->SetItemDimmed( ECmdToolbarDetails, EFalse, EFalse );
                if( selectedItem != KNullDesC && TVIMPSTEnums::EServiceOut != onlinestatus )
                    {
                    iFixedToolbar->SetItemDimmed(ECmdToolbarChat, EFalse, EFalse);
                    }
                else
                    {
                    iFixedToolbar->SetItemDimmed(ECmdToolbarChat, ETrue, EFalse);
                    }
                }   
            }
        else if( voipEnabled && !imEnabled )
            {               
            if( (TVIMPSTEnums::EOwnStatusItem == itemType ||
                    TVIMPSTEnums::EFriendRequestItem == itemType ||
                    KErrNotFound == currentItemIndex) && !iAddContact )
                {
                iFixedToolbar->SetItemDimmed( ECmdToolbarNewContact, EFalse, EFalse );
                iFixedToolbar->SetItemDimmed( ECmdToolbarVoipCall, ETrue, EFalse );
                iFixedToolbar->SetItemDimmed( ECmdToolbarDetails, ETrue, EFalse );               
                }   
            else if( TVIMPSTEnums::EUnknonContactItem == itemType  )
                {  
                iFixedToolbar->SetItemDimmed( ECmdToolbarNewContact, EFalse, EFalse );
                iFixedToolbar->SetItemDimmed(ECmdToolbarVoipCall, EFalse, EFalse );
                iFixedToolbar->SetItemDimmed(ECmdToolbarDetails, ETrue, EFalse);                 
                }
            else if( TVIMPSTEnums::EContactItem == itemType )
                {
                iFixedToolbar->SetItemDimmed( ECmdToolbarNewContact, EFalse, EFalse );
                iFixedToolbar->SetItemDimmed( ECmdToolbarDetails, EFalse, EFalse );
                iFixedToolbar->SetItemDimmed(ECmdToolbarVoipCall, EFalse, EFalse);  
                } 
            }
        else
            {               
            if( (TVIMPSTEnums::EOwnStatusItem == itemType ||
                    TVIMPSTEnums::EFriendRequestItem == itemType ||
                    KErrNotFound == currentItemIndex) && !iAddContact )
                {
                iFixedToolbar->SetItemDimmed( ECmdToolbarNewContact, EFalse, EFalse );
                } 
            else if( TVIMPSTEnums::EUnknonContactItem == itemType  )
                {  
                iFixedToolbar->SetItemDimmed( ECmdToolbarNewContact, EFalse, EFalse);
                }
            else
                {
                iFixedToolbar->SetItemDimmed( ECmdToolbarNewContact, EFalse, EFalse );
                iFixedToolbar->SetItemDimmed( ECmdToolbarDetails, EFalse, EFalse );
                }
            }
        iFixedToolbar->DrawNow();
        }
    }
// ---------------------------------------------------------
// CVIMPSTUiTabbedView::DynInitToolbarL
// ---------------------------------------------------------
//
void CVIMPSTUiTabbedView::DynInitToolbarL( TInt /*aResourceId*/, CAknToolbar* /*aToolbar*/ )
    {
    if ( AknLayoutUtils::PenEnabled() )
        {
        UpdateToolbarL();
        }
    }

// ---------------------------------------------------------
// CVIMPSTUiTabbedView::OfferToolbarEventL
// ---------------------------------------------------------
//        
void CVIMPSTUiTabbedView::OfferToolbarEventL( TInt aCommand )
    {
	TRACER_AUTO;
    if ( AknLayoutUtils::PenEnabled() )
        {
        switch( aCommand )
            {
            case ECmdToolbarVoipCall:
                {
                MakeVoipCallL();
                break;
                }
            case ECmdToolbarChat:
                {
                HandleCommandL( ECmdOpenConversation );
                break;
                }
            case ECmdToolbarDetails:
                {
                HandleCommandL( ECmdContactDetails );//EChatLaunchCCA

                break;
                }
            case ECmdToolbarNewContact:
                {
                HandleCommandL ( ECmdAddContact );
                break;
                }
            }  
        }
    }

// ---------------------------------------------------------
// CVIMPSTUiTabbedView::ShowHideFixedToolbarL
// ---------------------------------------------------------
//     
void CVIMPSTUiTabbedView::ShowHideFixedToolbarL(TBool aShow)
    { 
    if ( iFixedToolbar && iContainer )
        {    	
        iFixedToolbar->HideItemsAndDrawOnlyBackground( !aShow );
        if(aShow)
            {
            iFixedToolbar->SetToolbarVisibility( aShow, !aShow);
            }
        iContainer->CoeControl()->SetRect( iView.ClientRect() );
        iContainer->CoeControl()->DrawDeferred();
        iIsToolBarHidden = !aShow;
        }

    }

// ---------------------------------------------------------
// CVIMPSTUiTabbedView::ProcessFriendRequestL
// ---------------------------------------------------------
// 
void CVIMPSTUiTabbedView::ProcessFriendRequestL()
    {
	TRACER_AUTO;
    TInt index = CurrentItemIndex();    
    if( index <= 0 )
        {
        // return if item not found
        return; 
        }
    MVIMPSTProcessArray& arrayprocess = iCommandHandler.GetProcessInterface();
    if( iFriendRequestId )
	    {
	    delete iFriendRequestId;
	    iFriendRequestId = NULL;	
	    }
    iFriendRequestId = arrayprocess.GetItemUserId(index).AllocL() ;

    if( !iFriendRequestId )
        {
        return;
        }

    HBufC* queryTxt = StringLoader::LoadLC( R_SERVTAB_FRIEND_REQUEST_CONF, *iFriendRequestId );

    //ask the query and send the response back to the server.
    TInt response = VIMPSTUtilsDialog::DisplayQueryDialogL(R_SERVTAB_GENERIC_ACCEPT_DECLINE_CONFIRMATION_QUERY,*queryTxt);
    CleanupStack::PopAndDestroy(queryTxt);

    if((EAknSoftkeyYes == response)||(EAknSoftkeyOk == response ) )
        {
        
        MVIMPSTStorageServiceView* storage = CVIMPSTStorageManagerFactory::ContactListInterfaceL( iEngine.ServiceId() ) ;
        if( storage && storage->IsLocalStore() )//if local store popup create new/update existing dialog 
           {
            iSelectedAction = ShowNewUpdateQueryL();
            TUint assignFlags = 0;
            if(CVIMPSTUiTabbedView::EInvitAcceptCreateNew == iSelectedAction )//create new option
                {
                assignFlags |= ECreateNewContact;
                }
            else if(CVIMPSTUiTabbedView::EInvitAcceptUpdateExisting == iSelectedAction ) //if update existing is selected
                {
                assignFlags = 0;
                }
            else                                //if the selection dialog is cancelled then just do nothing
                {
                return;
                }
            //show the phonebook dialog for create new/update existing option
            if(iAiwParamList)
                {
                delete iAiwParamList;
                iAiwParamList = NULL;
                }        
            iAiwParamList = CAiwGenericParamList::NewL();

            iAiwParamList->AppendL(
                    TAiwGenericParam(
                            EGenericParamContactAssignData,
                            TAiwVariant(TAiwSingleContactAssignDataV1Pckg(
                                    TAiwSingleContactAssignDataV1().SetFlags( assignFlags )))));

            TBuf<KBufLen> xspId; //xsp max length
            xspId.Append(iEngine.ServiceName());
            xspId.Append(KColon);
            xspId.Append(*iFriendRequestId);

            iAiwParamList->AppendL(
                    TAiwGenericParam(
                            EGenericParamXSpId,
                            TAiwVariant(xspId))
            );
            ReInitializeServiceHandlerL();
            iServiceHandler->ExecuteServiceCmdL(
                    KAiwCmdAssign,
                    *iAiwParamList,
                    iServiceHandler->OutParamListL(),
                    0,
                    this);
            // remove of friend request is done in HnadleNotify aiw call back
            // to handle the cancel of selection dialog
            }
        else // in case of server store
            {
            if( iWaitNote )
		        {
		        delete iWaitNote;
		        iWaitNote = NULL;
		        }
        	iWaitNote = CVIMPSTUtilsWaitNote::ShowWaitNoteL( R_QTN_SERVTAB_SAVING_CONTACT, ETrue, EFalse );
            iCommandHandler.HandleCommandL(EFriendAccpeted, this, iFriendRequestId);
            }

        }
    //response value comes as zero if user rejects the request
    else if( EAknSoftkeyCancel == response || 0 == response) // rejected the request
        {
        if(iWaitNote)
            {
            delete iWaitNote;
            iWaitNote = NULL;	
            }
        iWaitNote = CVIMPSTUtilsWaitNote::ShowWaitNoteL( R_QTN_SERVTAB_DECLINING_INVITE, ETrue , EFalse );;
        iCommandHandler.HandleCommandL(EFriendRejected, this, iFriendRequestId );
        }
   

    }

// ---------------------------------------------------------
// CVIMPSTUiTabbedView::HandleSearchResultL()
// ---------------------------------------------------------
//
void CVIMPSTUiTabbedView::HandleSearchResultL(RArray<TVIMPSTSearchData> /*aSearchData*/ )
    {
    // no implemetation
    }


// ---------------------------------------------------------
// CVIMPSTUiTabbedView::HandleSearchFinishedL()
// ---------------------------------------------------------
//
void CVIMPSTUiTabbedView::HandleSearchFinishedL(TInt /*aError*/)
    {
    // no implemetation
    }

// ---------------------------------------------------------
// CVIMPSTUiSearchView::HandleSearchKeysEventL()
// ---------------------------------------------------------
//
void CVIMPSTUiTabbedView::HandleSearchKeysEventL( RArray<TInt>& aEnumKeysArray, RPointerArray<HBufC>& aLebelKeysArray )
    {
    iExtensionService.SetSearchFieldsDataL(aEnumKeysArray, aLebelKeysArray );
    }

// ---------------------------------------------------------
// CVIMPSTUiSearchView::ShowURLQueryL()
// ---------------------------------------------------------
//
void CVIMPSTUiTabbedView::ShowURLQueryL( )
    {   
	TRACER_AUTO;
    // Open browser with the specified URL
    RBuf buffer;
    buffer.CreateL( RProperty::KMaxPropertySize );
    CleanupClosePushL( buffer );
    iSettingsStore->GetL(iServiceId, EServiceURLLink, buffer);      
    HBufC16* url = HBufC::NewL(buffer.Length());
    url = buffer.Alloc();
    OpenWebBrowserL( *url );           
    CleanupStack::PopAndDestroy( ); //buffer   
    }

// -----------------------------------------------------------------------------
// CVIMPSTUiTabbedView::OpenWebBrowserL
// -----------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::OpenWebBrowserL( const TDesC& aUrl )
    {
    if( !iBrLauncher )
        {
        iBrLauncher = CBrowserLauncher::NewL();             
        }
    //Asynchronous operation to launch the browser with aUrl
    iBrLauncher->LaunchBrowserEmbeddedL( aUrl,this,this );    
    }


// -----------------------------------------------------------------------------
// CVIMPSTUiTabbedView::LoginL
// -----------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::LoginL()
    {
	TRACER_AUTO;
    TBool IsPasswordSet = iEngine.IsPasswordAvailableL();

    if(iUserId)
        {
        delete iUserId;
        iUserId = NULL;
        }
   
    iUserId = iEngine.GetOwnUserIdFromCChOrStorageL();
    
    
    TBool urlNeedtoShow = IsURLQueryToBeShownL();
    //first login : userid is not initialized and password is not set.
    TBool doLogin = ETrue;
    if( urlNeedtoShow &&  (!IsPasswordSet) && (iUserId->Length() == 0))
        {       
        TInt menuChoise( KErrCancel );
        ShowUseExistingOrCreateNewMenuL( menuChoise );
        switch(menuChoise )
            {
            case CVIMPSTUiTabbedView::EXmppMenuValuesCreateNew:
                {
                doLogin = EFalse;
                ShowURLQueryL();
                break;
                }
            case CVIMPSTUiTabbedView::EXmppMenuValuesUseExisting:
                {
                // login must be called
                doLogin = ETrue;
                break;
                }
            default: // user has cancelled the createnew and i have acccount query
                doLogin = EFalse;
                break;             
			}
        }
     if( doLogin )
        {
        TInt error = ShowTermsofuseL();
        if(KErrNone == error)
            {
            if( urlNeedtoShow  )
                {
                // Url query has been shown and accep by user
                iSettingsStore->SetL(iServiceId, EURLRegistrationOff, ETrue);
                }
            iCommandHandler.HandleCommandL(ELoginService, this, &iServiceId); 
            }
        }
    }


// -----------------------------------------------------------------------------
// CVIMPSTUiTabbedView::IsURLQueryToBeShownL
// -----------------------------------------------------------------------------
//
TBool CVIMPSTUiTabbedView::IsURLQueryToBeShownL()
    {
	TRACER_AUTO;
    TBool urlQueryShown = EFalse;
    
    RBuf buffer;
    buffer.CreateL( RProperty::KMaxPropertySize );
    CleanupClosePushL( buffer );
    iSettingsStore->GetL(iServiceId, EServiceURLLink, buffer); 
    
    //get the url from the cenrep.
    TInt isURLQueryDisabled = EFalse;
    iSettingsStore->GetL(iServiceId, EURLRegistrationOff, isURLQueryDisabled);
    
    if(buffer.Length() && !isURLQueryDisabled)
        {
        urlQueryShown = ETrue;
        }
    CleanupStack::PopAndDestroy(); //buffer
    return urlQueryShown;
    }

// ---------------------------------------------------------------------------
// CVIMPSTUiTabbedView::ShowUseExistingOrCreateNewMenuL
// return values <0 -> error
//               0 -> use existing
//               1 -> create new
// ---------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::ShowUseExistingOrCreateNewMenuL( TInt& aMenuChoise )
    {
	TRACER_AUTO;
    TInt rvalue( KErrGeneral );

    CAknSinglePopupMenuStyleListBox* accountList =
    new ( ELeave ) CAknSinglePopupMenuStyleListBox;
    CleanupStack::PushL( accountList );

    CAknPopupList* popupList =
    CAknPopupList::NewL( accountList, R_AVKON_SOFTKEYS_OK_BACK );
    CleanupStack::PushL( popupList );

    accountList->ConstructL(  popupList, EAknListBoxMenuList);

    // construct listbox item array
    CDesCArray *itemList = new (ELeave) CDesCArrayFlat( 2 );
    CleanupStack::PushL( itemList );
    TBuf<KMaxListItemLength> item;

    // First listbox item
    HBufC* text1 = StringLoader::LoadLC( R_QTN_USE_EXISTING );
    itemList->AppendL( *text1 );
    CleanupStack::PopAndDestroy( text1 );

    // Second listbox item
    HBufC* text2 = StringLoader::LoadLC( R_QTN_CREATE_NEW );
    itemList->AppendL( *text2 );
    CleanupStack::PopAndDestroy( text2 );

    // Set items and ownership
    accountList->Model()->SetItemTextArray( itemList );
    accountList->Model()->SetOwnershipType( ELbmOwnsItemArray );
    CleanupStack::Pop( itemList );

    HBufC* title = StringLoader::LoadLC( R_QTN_SELECT_ACTION );
    popupList->SetTitleL( *title );
    CleanupStack::PopAndDestroy( title );

    TInt popupOk = popupList->ExecuteLD();

    if ( popupOk )
        {
        rvalue = accountList->CurrentItemIndex();
        }
    else
        {
        rvalue = KErrCancel;
        }

    CleanupStack::Pop( popupList );
    CleanupStack::PopAndDestroy( accountList );

    aMenuChoise = rvalue;
    }
// ---------------------------------------------------------------------------
// CVIMPSTUiTabbedView::ShowNewUpdateQueryL
// return values <0 -> error
//               0 ->create new
//               1 -> update existing
// ---------------------------------------------------------------------------
//
TInt CVIMPSTUiTabbedView::ShowNewUpdateQueryL()
    {
	TRACER_AUTO;
    TInt retValue( KErrCancel );

    CAknSinglePopupMenuStyleListBox* selectionList =
                new ( ELeave ) CAknSinglePopupMenuStyleListBox;
    CleanupStack::PushL( selectionList );

    CAknPopupList* popupList = CAknPopupList::NewL( 
                                             selectionList,
                                             R_AVKON_SOFTKEYS_SELECT_CANCEL );
    CleanupStack::PushL( popupList );

    selectionList->ConstructL(  popupList, EAknListBoxMenuList );

    // construct listbox item array
    CDesCArray *itemList = new (ELeave) CDesCArrayFlat( 2 );
    CleanupStack::PushL( itemList );
    
    // First listbox item
    HBufC* newItem = StringLoader::LoadLC( R_QTN_CREATE_NEW_CONTACT  );
    itemList->AppendL( *newItem );
    CleanupStack::PopAndDestroy( newItem );
    
    // Second listbox item
    HBufC* updateItem = StringLoader::LoadLC( R_QTN_UPDATE_EXISTING  );
    itemList->AppendL( *updateItem );
    CleanupStack::PopAndDestroy( updateItem );

    // Set items and ownership
    selectionList->Model()->SetItemTextArray( itemList );
    selectionList->Model()->SetOwnershipType( ELbmOwnsItemArray );
    CleanupStack::Pop( itemList ); // ownership is transfered to selectionList

    HBufC* title = StringLoader::LoadLC( R_QTN_SELECT_ACTION );
    popupList->SetTitleL( *title );
    CleanupStack::PopAndDestroy( title );

    TInt response = popupList->ExecuteLD();

    if ( response )
        {
        retValue = selectionList->CurrentItemIndex();
        }
    CleanupStack::Pop( popupList ); // onership given to selectionList
    CleanupStack::PopAndDestroy( selectionList ); // selectionList

    return retValue;
    }
// CVIMPSTUiTabbedView::ShowLoginDialogL
// ---------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::ShowLoginDialogL( TDes& aUserName, TDes& aPassword )
    {
	TRACER_AUTO;
    HBufC* userName = HBufC::NewLC( KUsernameMaxLength );
    HBufC* passWord = HBufC::NewLC( KPasswordMaxLength );

    TPtr ptrUserName = userName->Des(); 
    TPtr ptrPassWord = passWord->Des();

    if( aUserName.Length()== 0 )
        {
        CAknMultiLineDataQueryDialog* dlg = CAknMultiLineDataQueryDialog::NewL( ptrUserName,
                ptrPassWord );
        if ( dlg->ExecuteLD( R_LOGIN_DIALOG ) )
            {
            aUserName.Copy( ptrUserName.LeftTPtr( aUserName.MaxLength() ) );
            aPassword.Copy( ptrPassWord.LeftTPtr( aPassword.MaxLength() ) );
            }
        else
            {
            User::Leave( KErrCancel );
            }
        }
    else
        {
        CAknMultiLineDataQueryDialog* dlg = CAknMultiLineDataQueryDialog::NewL( aUserName,
                aPassword );
        if ( dlg->ExecuteLD( R_LOGIN_DIALOG ) )
            {
            aUserName.Copy( aUserName.LeftTPtr( aUserName.MaxLength() ) );
            aPassword.Copy( aPassword.LeftTPtr( aPassword.MaxLength() ) );
            }
        else
            {
            User::Leave( KErrCancel );
            }
        }
    CleanupStack::PopAndDestroy( passWord );
    CleanupStack::PopAndDestroy( userName );
    }
// ----------------------------------------------------
// CVIMPSTUiTabbedView::HandleContentL
// Handles the content coming from the embedded browser.
// Returns EFalse: content will be passed on to framework
// ----------------------------------------------------
//
TBool CVIMPSTUiTabbedView::HandleContentL( 
        const TDesC& /*aFileName*/, 
        const CAiwGenericParamList& /*aParamList*/, 
        TBool& aContinue )
    {
    // Close browser after downloading content
    aContinue = EFalse;
    return EFalse;
    }

// ----------------------------------------------------
// CVIMPSTUiTabbedView::DownloadedContentHandlerReserved1
// ( Reserved for future use )
// ----------------------------------------------------
//
TAny* CVIMPSTUiTabbedView::DownloadedContentHandlerReserved1( TAny* /*aAnyParam*/ )
    {
    // Empty implementation.
    return NULL;
    }

// ---------------------------------------------------------------------------
// CVIMPSTUiTabbedView::CloseConversation
// ---------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::CloseConversationL()
    {
	TRACER_AUTO;
    TInt index = CurrentItemIndex();    
    if( index <= 0 )
        {
        // return if item not found
        return; 
        }
    MVIMPSTProcessArray& arrayprocess = iCommandHandler.GetProcessInterface();
    TPtrC itemId = arrayprocess.GetItemUserId(index);

    if(itemId.Length() == 0)
        {
        return;
        }

    HBufC* queryTxt = StringLoader::LoadLC( R_QTN_SERVTAB_CLOSE_CONV, itemId );

    //ask the query and send the response back to the server.
    TInt response = VIMPSTUtilsDialog::DisplayQueryDialogL(R_GENERIC_YES_NO_CONFIRMATION_QUERY,*queryTxt);
    CleanupStack::PopAndDestroy(queryTxt);

    if( (EAknSoftkeyYes == response)||(EAknSoftkeyOk == response ) )
        {
        iCommandHandler.HandleCommandL(ECloseConversation, this, &itemId ); 
        } 

    }

// ----------------------------------------------------
// CVIMPSTUiTabbedView::HandleServerAppExit
// ( Reserved for future use )
// ----------------------------------------------------
//
void CVIMPSTUiTabbedView::HandleServerAppExit( TInt /*aReason*/ )
    {
	TRACER_AUTO;
    TInt error = KErrNone;
    TRAPD(leaveErr,error = ShowTermsofuseL());
    if(KErrNone == error && KErrNone == leaveErr)
        {
        TRAP_IGNORE(iCommandHandler.HandleCommandL(ELoginService, this, &iServiceId)); 
        }
    }
    
// ----------------------------------------------------
// CVIMPSTUiTabbedView::ShowTermsofuseL
// ( Reserved for future use )
// ----------------------------------------------------
//
TInt CVIMPSTUiTabbedView::ShowTermsofuseL()
    {
	TRACER_AUTO;
    TInt retVal = KErrNone;
    // get the  ETOUDlgOff if its set don't show TOU dialog else show TOU 
    TInt termsOfUseDisabled = KErrNone;
    iSettingsStore->GetL(iServiceId, ETOUDlgOff, termsOfUseDisabled);
    if( !termsOfUseDisabled)
        {
        HBufC* termsOfUsetext = iBrandHandler->GetToUStringL();
        if( termsOfUsetext )
	        {
	        CleanupStack::PushL(termsOfUsetext);
	        retVal = CVIMPSTUiTermsOfUseDialogHandler::HandleTermsOfUseDialogLD(
                   												*iSettingsStore,
                   												 *iUserId, 
                   												 iServiceId, 
                   												 termsOfUsetext ); // termsOfUsetext ownership is transfered	
	        CleanupStack::Pop(); // termsOfUsetext ownership is transfered
	        }
        }
    return retVal;
    }
// ----------------------------------------------------
// CVIMPSTUiTabbedView::MakeVoipCallL
// ( Reserved for future use )
// ----------------------------------------------------
//
void CVIMPSTUiTabbedView::MakeVoipCallL()
    {
	TRACER_AUTO;
    // making voip call will take in three steps
    // pop up the selection dialog
    // select adress
    // create a call
    TInt index = CurrentItemIndex();  
    //Index should always be greater than zero
    //Negative index means item not found.
    if(index <= 0 )
        {
        return;
        }
    MVIMPSTProcessArray& processArray = iCommandHandler.GetProcessInterface();
    TVIMPSTEnums::TItem itemType = processArray.GetType( index ) ;
    
    if( itemType == TVIMPSTEnums::EContactItem )
        {
        iSelectedAction = CVIMPSTUiTabbedView::ECreateXSPCall;
        TUint fetchFlags = 0;
        TAiwSingleItemSelectionDataV3 data;
        data.SetFlags(fetchFlags);
        data.SetCommAddressSelectType(EAiwCommVOIPCall);
        ReInitializeServiceHandlerL();
        CAiwGenericParamList& inParamList = iServiceHandler->InParamListL();
        // Set service data
        inParamList.AppendL(TAiwGenericParam(EGenericParamContactSelectionData,
                TAiwVariant(TAiwSingleItemSelectionDataV3Pckg(data))));

        HBufC8* pack = processArray.ContactLink(index )->PackLC();
        // Set contactlink
        inParamList.AppendL(TAiwGenericParam(EGenericParamContactLinkArray,
                TAiwVariant(*pack)));

        iServiceHandler->ExecuteServiceCmdL(KAiwCmdSelect, inParamList,
                iServiceHandler->OutParamListL(), 0, this);
        CleanupStack::PopAndDestroy( pack );
        }
    else if( itemType == TVIMPSTEnums::EUnknonContactItem )
        {
        TPtrC unknownId = processArray.GetItemUserId( index );
        ExecuteAiwCallL( unknownId );
        }
    }
// ---------------------------------------------------------
// CVIMPSTUiTabbedView::ExecuteAiwCallL
// ---------------------------------------------------------
void CVIMPSTUiTabbedView::ExecuteAiwCallL( const TDesC& aSelectedAddress )
	{
	TRACER_AUTO;
	//aSelectedAdress will be an xsp id of format "ServiceName:UserId"
	//here we need to truncate the servicename and pass only the UserId
    //Find if aSelectedAdress of type "ServiceName:UserId"
	//if true, then remove the service part
    TInt phoneNumberStart = aSelectedAddress.Locate(':');
    HBufC* numBuf = NULL;
    
    if ( KErrNotFound != phoneNumberStart )
        {
        phoneNumberStart++; //To get rid of ':'
        numBuf = aSelectedAddress.Right( 
                                aSelectedAddress.Length() - phoneNumberStart 
                                ).AllocLC();
        }
    else
        {
        numBuf = aSelectedAddress.AllocLC();
        }
    
    TPtr numDesc( numBuf->Des ());
	CommonPhoneParser::ParsePhoneNumber ( numDesc,
			CommonPhoneParser::EPhoneClientNumber); 

	CAiwDialDataExt* dialDataExt = CAiwDialDataExt::NewLC();
	dialDataExt->SetPhoneNumberL ( numBuf->Des ());
    dialDataExt->SetServiceId(iServiceId);
    dialDataExt->SetCallType( CAiwDialData::EAIWVoiP);

	dialDataExt->SetWindowGroup ( CCoeEnv::Static()->RootWin().Identifier() );
	ReInitializeServiceHandlerL();
	CAiwGenericParamList& paramList = iServiceHandler->InParamListL();
	dialDataExt->FillInParamListL ( paramList);
	iServiceHandler->ExecuteServiceCmdL ( KAiwCmdCall, 
										 paramList,
										 iServiceHandler->OutParamListL(), 
										 0, 
										 NULL);
	CleanupStack::PopAndDestroy(dialDataExt);
	CleanupStack::PopAndDestroy(numBuf);
	}

// ---------------------------------------------------------
// CVIMPSTUiTabbedView::LaunchHelpL()
// Function launches help application using the HlpLauncher.
// @params: Reference to a descriptor, serves as context.
// ---------------------------------------------------------
//

void CVIMPSTUiTabbedView::LaunchHelpL( const TDesC& aContext )
    {
	TRACER_AUTO;
    CArrayFix< TCoeHelpContext >* cntx = new( ELeave ) CArrayFixFlat< TCoeHelpContext >( KHelpContextSize );
    CleanupStack::PushL( cntx );

    TUid KHelpUid = { KHELPUID };
    cntx->AppendL( TCoeHelpContext( KHelpUid, aContext ) );
    CleanupStack::Pop( cntx );

    //and launch help - takes ownership of context array
    HlpLauncher::LaunchHelpApplicationL( CEikonEnv::Static()->WsSession(), cntx );    
    }

// ----------------------------------------------------
// CVIMPSTUiTabbedView::SettingsStore()
// ----------------------------------------------------
//
MVIMPSTSettingsStore* CVIMPSTUiTabbedView::SettingsStore()
    {
    return iSettingsStore;
    }

// ----------------------------------------------------
// CVIMPSTUiTabbedView::CancelLoginSupportedL()
// ----------------------------------------------------
//
TBool CVIMPSTUiTabbedView::CancelLoginSupportedL()
    {
	TRACER_AUTO;
    TInt cancelNotSupported(KErrNone);
    TBool returnValue = ETrue;
    // read from the cenrep settings 
    TInt err = iSettingsStore->GetL(iServiceId, EServiceCancelLoginNotSupported,cancelNotSupported);
    // if any error  OR  cancelNotSupported = 1 then 
    if ( err || cancelNotSupported )
        {
        returnValue =  EFalse; // SOME Error or cancel is not supported : return EFalse
        }
    return returnValue; // cancel is supported : return ETrue
    }


// ----------------------------------------------------
// CVIMPSTUiTabbedView::ChangeConnectionSupportedL()
// ----------------------------------------------------
//
TBool CVIMPSTUiTabbedView::ChangeConnectionSupportedL()
    {
	TRACER_AUTO;
    TInt changeConnectionSupported(KErrNone);
    TBool returnValue = ETrue;
    // read from the cenrep settings 
    TInt err = iSettingsStore->GetL(iServiceId, EServiceChangeConnectionNotSupported,changeConnectionSupported);
    // if any error  OR  cancelNotSupported = 1 then 
    if ( err || changeConnectionSupported )
        {
        returnValue =  EFalse; // SOME Error or cancel is not supported : return EFalse
        }
    return returnValue; // cancel is supported : return ETrue
    }

// ----------------------------------------------------
// CVIMPSTUiTabbedView::HandleNotifyL()
// ----------------------------------------------------
//
TInt CVIMPSTUiTabbedView::HandleNotifyL(
        TInt aCmdId,
        TInt aEventId,
        CAiwGenericParamList& aEventParamList,
        const CAiwGenericParamList& /* aInParamList */)
	{
	TRACER_AUTO;
	TInt result = 0;
		if( (aCmdId == KAiwCmdSelect) && (aEventId == KAiwEventCompleted && iSelectedAction == ECreateXSPCall ))
			{
			if( iQueryResult )
				{
				delete iQueryResult;
				iQueryResult = NULL;	
				}
			TInt index = 1; // Get field data from index 1
			const TAiwGenericParam* param =
			aEventParamList.FindFirst(index, EGenericParamContactFieldData);
			if (KErrNotFound != index)
				{
				TInt length = param->Value().AsDes().Length();
				iQueryResult = HBufC::NewL(length);
				iQueryResult->Des().Append( param->Value().AsDes() );
				// Data must be found!
				if (0 >= iQueryResult->Length())
					{
					User::Leave(KErrGeneral);
					}
				if( !iContactSelection )
					{
					iContactSelection = CVIMPSTUiContactSelection::NewL(*this);	//register for the contactselection
					}
				iContactSelection->IssueRequest(); 	
				}
			else
				{
				User::Leave(KErrNotFound);
				}
			result = ETrue;
			}
		
		else if (aCmdId == KAiwCmdAssign || aCmdId == KAiwCmdSelect )
		{
		if (aEventId == KAiwEventCompleted )
			{
			if( iSelectedAction == CVIMPSTUiTabbedView::EInvitAcceptUpdateExisting || 
				iSelectedAction == CVIMPSTUiTabbedView::EInvitAcceptCreateNew || 
				iSelectedAction == CVIMPSTUiTabbedView::EContactCreateNew ||
				iSelectedAction == CVIMPSTUiTabbedView::EContactAddFromContacts )
				{
				// action has been completed ,
				// this will be excuted only if invitation accepted using update existing contact
				TInt paramIndex = 0;
				const TAiwGenericParam* contactParam = aEventParamList.FindFirst(
				paramIndex, EGenericParamContactLinkArray );//get the contact link
				TPtrC8 packLink = contactParam->Value().AsData();
				delete iSelectedData.iPackedLinks;
				iSelectedData.iPackedLinks = NULL; 
				if( packLink.Length() )
						{
						iSelectedData.iPackedLinks = packLink.AllocL();
						if( !iContactSelection )
							{
							iContactSelection = CVIMPSTUiContactSelection::NewL(*this);	//register for the contactselection
							}
						iContactSelection->IssueRequest(); 	
						}
				}
			result = ETrue;
			}
		else if (aEventId == KAiwEventQueryExit)
		    {
		    // Send an exit command in order to close CCA and Phonebook2        
		    CAknAppUi* appUi = static_cast<CAknAppUi*>( CCoeEnv::Static()->AppUi() );

		    if ( appUi )
		        {
		        appUi->ProcessCommandL( EAknCmdExit );
		        }
		    result = ETrue;
		    }
		else if(aEventId == KAiwEventOutParamCheck)
		    {
		        result = ETrue;
		    }
		}
    if(aEventId == KAiwEventCanceled)
		{
		result = ETrue;
		}
	return result;
	}
// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::BlockContactL
// --------------------------------------------------------------------------
//
void CVIMPSTUiTabbedView::BlockContactL(TBool aBlock /* = EFalse */)
    {
	TRACER_AUTO;
    TInt index = CurrentItemIndex();
    if(iContainer)
        {
        iContainer->CheckAndSetLastItemFlag();
        }
    if( index <= 0 )
        {
        // return if item not found
        // 0 for own item which can not be blocked
        return; 
        }   
         if(iWaitNote)
             {
             delete iWaitNote;
             iWaitNote = NULL;
             }

    MVIMPSTProcessArray& arrayprocess = iCommandHandler.GetProcessInterface();
    HBufC* contactId =  arrayprocess.GetItemUserId(index).AllocLC();

    if( contactId->Length() )
        {
        if(aBlock )
            {
            // load, format and show confirmation note
            HBufC* prompt = StringLoader::LoadLC( R_QTN_SERVTAB_BLOCKING, *contactId );
            iWaitNote = CVIMPSTUtilsWaitNote::ShowWaitNoteL( *prompt, ETrue, EFalse );
          //  iCommandHandler.HandleCommandL(ECmdBlockContact, this, &(contactId) );
            iCommandHandler.HandleCommandL(ECmdBlockContact, this, contactId );
            CleanupStack::PopAndDestroy();// prompt
            
        	if(iContainer)
                {
                     TRACE("HandleAvatarRefreshl calling for blocking");		   
                
		iContainer->HandleAvatarRefreshL(*contactId, ETrue);
                }
            }
        else 
            {
            HBufC* unBprompt = StringLoader::LoadLC( R_QTN_CHAT_UNBLOCKING, *contactId );
            // load, format and show confirmation note
            iWaitNote = CVIMPSTUtilsWaitNote::ShowWaitNoteL( *unBprompt, ETrue, EFalse );
            iCommandHandler.HandleCommandL(ECmdUnBlockContact, this, contactId );
            CleanupStack::PopAndDestroy();// unBprompt
            }
        }
    CleanupStack::PopAndDestroy(); //contactId
    } 
    
// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::ShowBlockedContactListL
// --------------------------------------------------------------------------
void CVIMPSTUiTabbedView::ShowBlockedContactListL()
	{
	TRACER_AUTO;
	if(!iIsToolBarHidden)
	    {
	    ShowHideFixedToolbarL(EFalse);
	    }

	if (iContainer)
		{
		iContainer->DeactivateFindPaneL();
		}

	//Launch the search view with search dialog
	LaunchViewL( iExtensionService.BlockViewId() );
	}
	
// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::HandleContactSelectionCompleteL
// --------------------------------------------------------------------------
void CVIMPSTUiTabbedView::HandleContactSelectionCompleteL()
	{
	TRACER_AUTO;
	
	 if( iWaitNote )
	        {
	        delete iWaitNote;
	        iWaitNote = NULL;
	        }
     if( iSelectedAction == CVIMPSTUiTabbedView::EInvitAcceptUpdateExisting || iSelectedAction == CVIMPSTUiTabbedView::EInvitAcceptCreateNew)
        {
        iWaitNote = CVIMPSTUtilsWaitNote::ShowWaitNoteL( R_QTN_SERVTAB_SAVING_CONTACT, ETrue, EFalse );

        if ( iSelectedData.iPackedLinks )                     //add the selected contact to the service tab
            {
            TRACE("process contact");
            if( iSelectedAction == CVIMPSTUiTabbedView::EInvitAcceptCreateNew )
                   {
                 iCommandHandler.HandleCommandL( ECmdProcessAcceptedContactNew, this, (TAny*)&iSelectedData );
                   }
            else
                   {
                 iCommandHandler.HandleCommandL( ECmdProcessAcceptedContactExist, this, (TAny*)&iSelectedData );
                   }
            delete iSelectedData.iPackedLinks;  
            iSelectedData.iPackedLinks = NULL;           
            } 
        iSelectedData.iXSPList.ResetAndDestroy();
       
        //invitation has been accepted using update existing contact
        // updation is successful
        // send accepted request to command/engine/server   
        TRACE("frnrequest accepted");
        iCommandHandler.HandleCommandL(EFriendAccpeted, this, iFriendRequestId );
        }
     else if(  iSelectedAction == CVIMPSTUiTabbedView::EContactCreateNew ||  iSelectedAction == CVIMPSTUiTabbedView::EContactAddFromContacts)
         {
         MVIMPSTStorageServiceView* storage = CVIMPSTStorageManagerFactory::ContactListInterfaceL( iEngine.ServiceId() ) ;
         TBool localStore = EFalse;
         if( storage )
             {
             localStore = storage->IsLocalStore();
             }
         if( localStore )//for server store wait note is shown by AddContactL function
             {
             if(iWaitNote)
                 {
                 delete iWaitNote;
                 iWaitNote = NULL;
                 }
             iWaitNote = CVIMPSTUtilsWaitNote::ShowWaitNoteL( R_QTN_SERVTAB_SAVING_CONTACT, ETrue, EFalse );
             }

         if ( iSelectedData.iPackedLinks )                     //add the selected contact to the service tab
             {
           TRACE("process contact");
             if( iSelectedAction == CVIMPSTUiTabbedView::EContactCreateNew )
                 {
                 iCommandHandler.HandleCommandL( ECmdProcessSelectedContactNew, this, (TAny*)&iSelectedData );
                 }
             else
                 {
                 iCommandHandler.HandleCommandL( ECmdProcessSelectedContactExist, this, (TAny*)&iSelectedData );
                 }
             delete iSelectedData.iPackedLinks;  
             iSelectedData.iPackedLinks = NULL;
             //server store xspid will be stored in iSelectedData.iXSPList and adding it to UI
             if( !localStore && iSelectedAction == CVIMPSTUiTabbedView::EContactAddFromContacts)
                 {
                 AddContactL( iSelectedData.iXSPList );
                 }       
             iSelectedData.iXSPList.ResetAndDestroy();

             } 
         // this is for adding a fresh contact for local store
	     // read the data from link and send it to server for updation	
         }
	 else if( iSelectedAction == CVIMPSTUiTabbedView::ECreateXSPCall && iQueryResult )
		 {
		 // make a call here
		 ExecuteAiwCallL(*iQueryResult );
		 delete iQueryResult;
		 iQueryResult = NULL;	
		 }
    iSelectedAction = KErrNotFound;  // This is to clear the previous selected action.
      
	}

// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::LaunchSettingsViewL
// --------------------------------------------------------------------------
void CVIMPSTUiTabbedView::LaunchSettingsViewL()
    {
    /*
    If settingsui is already opened, instead of starting with StartDocument just bring csc to foreground and send message
    (csc opens correct settings ui even when it´s already open)What comes to coming back to meco tab by pressing Back in 
    settingsui i made change that tab view is opened by using RxSPViewServices in csc side and csc is closed after that.
    I found only one problem while testing this solution, that is if phonebook is closed when settingsui is still open. 
    In that case settingsui stays in background, but even then when Back is pressed on settingsui correct tab is opened 
    (phonebook is reopened using RxSPViewServices)
    
    **************************************************************************************
    CSC team agreed to provide new generic CSC view launcher API, once CSC provide new API
    below code need to remove and new API will be called.
    ***************************************************************************************
    */
	TRACER_AUTO; 
    _LIT(KStartupParams, "ACTION=4 SERID=");
    _LIT8(KStartupParams8, "ACTION=4 SERID=");
    //Take CSC UID (In future if this UID change , we also need to change it otherwise we will not be able
    //to launch CSC settings.
    const TUid KCSCAppUid = { 0x10275458 };
    RWsSession ws;
    User::LeaveIfError( ws.Connect() );
    CleanupClosePushL( ws );
    TApaTaskList list( ws );

    TApaTask task( list.FindApp( KCSCAppUid ) );

    if ( task.Exists() )
        {
        TBuf8<255> params8;
        params8.Copy( KStartupParams8 );
        params8.AppendNum( iServiceId );
       //Bring CSC to foreground if already open
        task.BringToForeground();
        task.SendMessage( 
                TUid::Uid( KUidApaMessageSwitchOpenFileValue ), params8 );
        }
    else
        {
        RApaLsSession session;
        CleanupClosePushL( session );                       
        User::LeaveIfError(session.Connect());

        TUid appUid = KCSCAppUid;
        TThreadId threadId;
        TFileName fileName;

        fileName.Copy( KStartupParams ); 
        fileName.AppendNum( iServiceId );

        User::LeaveIfError(
                session.StartDocument( fileName, appUid, threadId ) );

        session.Close();                       
        CleanupStack::PopAndDestroy( &session );
        }

    CleanupStack::PopAndDestroy( &ws );

    }//End LaunchSettingsUiL() 
	// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::ReInitializeServiceHandlerL()
// --------------------------------------------------------------------------

void CVIMPSTUiTabbedView::ReInitializeServiceHandlerL()
    {
	TRACER_AUTO;
    if(iIsServiceHandleReSet )
        {
        if(iServiceHandler)
            {
            iServiceHandler->AttachL( R_IM_APP_INTEREST );
            iServiceHandler->AttachMenuL( R_SERVTAB_TABBED_VIEW_MENU, 
                R_IM_APP_INTEREST );   
            
            iServiceHandler->AttachL( R_AIWASSIGNMENT_INTEREST );    
            
            iServiceHandler->AttachL( R_AIWSELECT_INTEREST );
            iIsServiceHandleReSet = EFalse;
            }
        }
    }
	// --------------------------------------------------------------------------
	// CVIMPSTUiTabbedView::LaunchFetchDialogL()
	// --------------------------------------------------------------------------

void CVIMPSTUiTabbedView::LaunchFetchDialogL()
    {
	TRACER_AUTO;
    iSelectedAction = EContactAddFromContacts;
    MVIMPSTStorageServiceView* storage = CVIMPSTStorageManagerFactory::ContactListInterfaceL( iEngine.ServiceId() ) ;
    TBool localStore = EFalse;
    if( storage )
        {
        localStore = storage->IsLocalStore();
        }
    
    if( localStore )
        {
        //multiple item fetch.
        TUint fetchFlags = 0;
        fetchFlags |= ::EExcludeGroupsView;
        
        ExecuteMultipleItemFetchL( TAiwMultipleEntrySelectionDataV2().SetFlags( fetchFlags ) );
        }
    else
        {
        //single item fetch.
        TUint fetchFlags = 0;

        ExecuteSingleItemFetchL( TAiwSingleEntrySelectionDataV2().SetFlags( fetchFlags ) );
        }

    }
	// --------------------------------------------------------------------------
	// CVIMPSTUiTabbedView::ExecuteSingleItemFetchL
	// --------------------------------------------------------------------------

void CVIMPSTUiTabbedView::ExecuteSingleItemFetchL( TAiwSingleEntrySelectionDataV2 aData )
    {
	TRACER_AUTO;
    if(iAiwParamList)
           {
           delete iAiwParamList;
           iAiwParamList = NULL;
           }        
       iAiwParamList = CAiwGenericParamList::NewL();
       iAiwParamList->AppendL(
            TAiwGenericParam(
            EGenericParamContactSelectionData,
            TAiwVariant(TAiwSingleEntrySelectionDataV2Pckg(aData))));

       ReInitializeServiceHandlerL();
    iServiceHandler->ExecuteServiceCmdL(
                                         KAiwCmdSelect,
                                         *iAiwParamList,
                                         iServiceHandler->OutParamListL(),
                                         0,
                                         this
                                         );

    }
// --------------------------------------------------------------------------
// CVIMPSTUiTabbedView::ExecuteMultipleItemFetchL
// --------------------------------------------------------------------------
void CVIMPSTUiTabbedView::ExecuteMultipleItemFetchL( TAiwMultipleEntrySelectionDataV2 aData )
    {
	TRACER_AUTO;
    if(iAiwParamList)
        {
        delete iAiwParamList;
        iAiwParamList = NULL;
        }        
    iAiwParamList = CAiwGenericParamList::NewL();
    ReInitializeServiceHandlerL();
    iAiwParamList->AppendL(
            TAiwGenericParam(
                    EGenericParamContactSelectionData,
                    TAiwVariant(TAiwMultipleEntrySelectionDataV2Pckg(aData))));

  
    iServiceHandler->ExecuteServiceCmdL(
            KAiwCmdSelect,
            *iAiwParamList,
            iServiceHandler->OutParamListL(),
            0,
            this
    );
    }
//  End of File
