imstutils/imconversationview/imcvuiapp/src/cimcvappview.cpp
branchRCL_3
changeset 23 9a48e301e94b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imstutils/imconversationview/imcvuiapp/src/cimcvappview.cpp	Wed Sep 01 12:33:36 2010 +0100
@@ -0,0 +1,1506 @@
+/*
+* Copyright (c) 2007-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:  conversation main view
+*
+*/
+
+// INCLUDE FILES
+#include	"cimcvappview.h"
+#include    "cimcvmenuextensionmanager.h"
+
+#include	"cimcvappviewcontainer.h"
+#include 	"cimcvappui.h"
+#include 	"cimcvengine.h"
+#include 	"mimcvenginechatinterface.h"
+#include 	"imcvuiapp.hrh"
+#include 	"imcvuiliterals.h"
+#include 	"imcvlogger.h"
+#include 	"cimcvappstatuspanehandler.h"
+#include 	"cimcvappmessageextensionshandler.h"
+#include 	"imcvuiapputils.h"
+#include 	"imcvuiappnotemapper.h"
+#include 	"mimcvenginemessagehandler.h"
+#include 	"imcvuiapp.h"
+
+#include	<aknnotewrappers.h>
+#include    <CommonUiInternalCRKeys.h>
+#include    <AknIconUtils.h>
+#include    <finditem.hrh>
+#include    <finditemmenu.h>
+#include 	<imcvuiapp.mbg>
+
+#include 	<imcvuiapp.rsg>
+#include	<imerrors.hrh>
+//brandingserver
+#include 	<mbsaccess.h>
+#include    "conversations.h"
+
+#include    <conversations.mbg>
+#include 	<StringLoader.h> 
+#include 	<aknEditStateIndicator.h>
+#include 	<AknIndicatorContainer.h>
+// help launch
+#include <hlplch.h>
+#include <coehelp.h>
+#include "meco.hlp.hrh"
+
+#include "imcvuicommonuids.h"
+#include "cimcvappmessageeditor.h"
+#include <akntoolbar.h>
+
+#include <ccafactory.h>
+#include <mccaconnection.h>
+#include <mccaparameter.h>
+#include "vimpstdetailsviewpluginuids.hrh"
+#include "mimcvenginemessagecontainerinfo.h"
+#include "mimcvenginemessageswriteinterface.h"
+#include "cimcvenginefactory.h"
+#include "mimcvenginefactory.h"
+#include <imconnectionproviderconsts.h>
+#include <e32property.h>
+
+// AIW Include Files 
+#include <AiwGenericParam.h>            
+#include <AiwContactAssignDataTypes.h>
+#include <aiwdialdataext.h>
+#include <AiwCommon.hrh>
+#include <AiwServiceHandler.h>
+#include <aiwdialdata.h>
+#include <commonphoneparser.h>
+
+
+// Dll Uid of vimpstui, to maintain uniqueness of help uid
+const TUid KHelpUid = { 0x2001FDC2 } ;  
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CIMCVAppView::CIMCVAppView()
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CIMCVAppView::CIMCVAppView()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppView::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppView::ConstructL( TInt aAvkonViewResourceId, TUid aViewId, 
+             CIMCVAppMessageExtensionsHandler& aMessageHandler )
+	{
+	IM_CV_LOGS(TXT("CIMCVAppView::ConstructL() start") );
+	
+	iRTContainerCache = CIMCVAppRichTextContainerCache::NewL();
+	
+	iViewId = aViewId;
+	
+	BaseConstructL( aAvkonViewResourceId );
+
+	iExtensionHandler = &aMessageHandler;
+    
+    iFindContextMenu = new( ELeave ) CEikMenuBar;
+    iFindContextMenu->ConstructL( this, 0, R_CONVERSATIONVIEW_MENUBAR_FINDITEMUI );
+		                  
+	iEngineFactory = CIMCVEngineFactory::InstanceL(); 
+	iEngineFactory->RegisterServiceObserver( this );
+		
+	iFindMenu = CFindItemMenu::NewL( EIMCVCmdFindMenuPlaceHolder ); 
+    iFindMenu->AttachItemFinderMenuL( R_CONVERSATIONVIEW_VIEW_MENU );
+    iFindMenu->AttachItemFinderMenuL( R_CONVERSATIONVIEW_MENUBAR_FINDITEMUI );
+    // automatic finder on by default
+    iFindMenu->HandleItemFinderCommandL( EFindItemCmdEnableAutoFind );
+    iItemFinder = CItemFinder::NewL();
+    
+	iAppUi = static_cast <CIMCVAppUi*> ( CCoeEnv::Static()->AppUi() );
+		
+	iRecipientUserId = HBufC::NewL(512);
+	
+	 // to set the tile, label icon in title pane
+    iStatusPane = CIMCVAppStatusPaneHandler::NewL(*iEngineFactory) ;
+	
+    if ( AknLayoutUtils::PenEnabled() )
+        {
+        Toolbar()->SetToolbarObserver(this);       
+        }    
+    iFromMe = NULL; 
+    iToMe = NULL;
+
+    //Creates manager for menu extension
+    iMenuExtManager = CIMCVMenuExtensionManager::NewL();
+        iAiwServiceHandler = CAiwServiceHandler::NewL();    
+    iAiwServiceHandler->AttachL( AIW_INTERNETCALL);
+    iAiwServiceHandler->AttachMenuL( R_CONVERSATIONVIEW_VIEW_MENU,AIW_INTERNETCALL );  
+
+    iConvViewDel = EFalse;
+    iDetailViewOpen = EFalse;
+	IM_CV_LOGS(TXT("CIMCVAppView::ConstructL() end") );	
+	}
+
+// ---------------------------------------------------------
+// CIMCVAppView::~CIMCVAppView()
+// ---------------------------------------------------------
+//
+CIMCVAppView::~CIMCVAppView()
+    {  
+    if( iEngineFactory )
+        {
+        iEngineFactory->UnRegisterServiceObserver();
+        iEngineFactory = NULL;
+        }
+   
+    if(iRTContainerCache)
+        {
+        delete iRTContainerCache;
+        }
+    delete iStatusPane;
+    if ( iContainer && iAppUi )
+        {
+        iAppUi->RemoveFromViewStack( *this, iContainer );
+        delete iContainer;
+        iContainer = NULL;
+        }
+    if ( iFindContextMenu && iAppUi )
+        {
+        iAppUi->RemoveFromStack( iFindContextMenu );
+        }
+    delete iFindContextMenu;
+
+    delete iFindMenu;
+    delete iItemFinder;
+    delete iRecipientUserId;
+
+    if(iParameter)
+        {
+        iParameter->Close();
+        iParameter = NULL;
+        }
+    if(iConnection)
+        {
+        iConnection->Close();
+        iConnection = NULL;
+        }
+    if(iFromMe)
+        {
+        delete iFromMe;
+        }
+    if(iToMe)
+        {
+        delete iToMe;
+        }
+    if(iMenuExtManager)
+        {
+        delete iMenuExtManager;
+        }
+    if (iAiwServiceHandler)
+        {
+        iAiwServiceHandler->Reset();
+        delete iAiwServiceHandler; 
+        iAiwServiceHandler = NULL;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CIMCVAppView::HandleCbaChangeL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppView::HandleCbaChangeL( TInt aResourceId )
+    {
+   	IM_CV_LOGS(TXT("CIMCVAppView::HandleCbaChangeL() start") );
+    Cba()->SetCommandSetL( aResourceId );
+    Cba()->DrawNow();
+    IM_CV_LOGS(TXT("CIMCVAppView::HandleCbaChangeL() end") );
+    }
+
+
+// ---------------------------------------------------------
+// CIMCVAppView::DynInitMenuPaneL
+// Called when menupane is about to be shown.
+// ---------------------------------------------------------
+//
+void CIMCVAppView::DynInitMenuPaneL( 
+                TInt aResourceId,CEikMenuPane* aMenuPane )
+    {    
+    IM_CV_LOGS(TXT("CIMCVAppView::DynInitMenuPaneL() start") );   
+    if( !iContainer )
+        {
+        return;
+        }
+    switch( aResourceId )
+	    {
+	    case R_CONVERSATIONVIEW_VIEW_MENU:
+		    {
+		    if(iActiveEngine->IsVoipServiceL())// internet call
+		        {
+		        aMenuPane->SetItemDimmed(KAiwCmdCall, EFalse);
+		        CAiwDialDataExt* dialDataExt = CAiwDialDataExt::NewL();
+		        CleanupStack::PushL( dialDataExt );
+		        dialDataExt->SetServiceId( iServiceId );
+		        CAiwGenericParamList& paramList = iAiwServiceHandler->InParamListL();
+		        dialDataExt->FillInParamListL( paramList );                          
+		        TAiwGenericParam param (EGenericParamSIPAddress);
+		        paramList.AppendL( param );
+		        iAiwServiceHandler->InitializeMenuPaneL( *aMenuPane, 
+		                R_CONVERSATIONVIEW_VIEW_MENU,EIMCVCmdInternetCall,paramList );
+		        CleanupStack::PopAndDestroy( dialDataExt ); 
+		        }
+		    else
+		        {
+		        aMenuPane->SetItemDimmed(KAiwCmdCall, ETrue);
+		        }
+		    if( iContainer->Editor().Editor().TextLength() > 0 )
+			    {
+			    aMenuPane->SetItemDimmed(EIMCVCmdSend, EFalse);	
+			    }
+		    else
+			    {
+			    aMenuPane->SetItemDimmed(EIMCVCmdSend, ETrue);	
+			    }
+			// "insert smiley"            
+		    if( !iContainer->Editor().Editor().IsFocused() )
+                {
+                aMenuPane->SetItemDimmed( 
+                                EIMCVCmdSmiley, ETrue );
+                }
+            else
+                {            
+                aMenuPane->SetItemDimmed( EIMCVCmdSmiley, EFalse );
+                }
+            // item finder menu
+            aMenuPane->SetItemDimmed( EIMCVCmdFindMenuPlaceHolder, ETrue);
+            
+            if( iContainer->IsStopped() )
+                {
+                UpdateItemTypeL();            
+                iFindMenu->AddItemFindMenuL( iItemFinder, aMenuPane, 
+                    EIMCVCmdFindMenuPlaceHolder, 
+                    KNullDesC ); // we can ignore the sender here
+                }   
+            //offers CV MenuPane to plugins to add their options
+            iMenuExtManager->OfferMenuPaneToPlugins(EIMCVCmdSmiley,*aMenuPane,iServiceId);
+		    break;	
+		    }
+	    case R_CONVERSATIONVIEW_FINDITEMUI_MENU :       
+	        {
+            if( iContainer->IsStopped() )
+                {
+                UpdateItemTypeL();            
+                iFindMenu->AddItemFindMenuL( iItemFinder, aMenuPane, 
+                    EIMCVCmdFindMenuPlaceHolder,
+                    KNullDesC, // we can ignore the sender here
+                    EFalse, ETrue ); // context menu
+                }
+            break;
+            }
+	    
+		default:
+            {
+            // update find menu
+            iFindMenu->UpdateItemFinderMenuL( aResourceId, aMenuPane );
+            break;
+            }
+	
+	    }
+    IM_CV_LOGS(TXT("CIMCVAppView::DynInitMenuPaneL() end") );
+    }
+    
+
+// --------------------------------------------------------------------------
+// CVIMPSTCmdCCA::LaunchCcaL
+// --------------------------------------------------------------------------
+//
+void CIMCVAppView::LaunchCcaL()
+    {   
+
+
+    if(!iConnection)
+        {
+        iConnection = TCCAFactory::NewConnectionL();
+        }
+
+    if ( iParameter )
+        {
+        iParameter->Close();
+        iParameter = NULL;
+        }
+
+    // The lifetime of this cmd object is too short to hold
+    // iParameterRef, caller of this must own it    
+    iParameter = TCCAFactory::NewParameterL();
+    iParameter->SetConnectionFlag(MCCAParameter::ENormal);
+    iParameter->SetContactDataFlag(MCCAParameter::EContactLink);
+
+    TUid uid( TUid::Null() );
+    uid.iUid = KVIMPSTDetailsViewPluginImplmentationUid  + iServiceId ; // service details view implementation uid
+    iParameter->SetLaunchedViewUid( uid );
+
+   // RProperty::Set(KMeCoPropertyUid, KMeCoConvViewServiceIdKey, iServiceId ); 
+    MIMCVEngineMessageReadInterface& readInterface = 
+        		iActiveChatInterface->MessageReadInterfaceL( iServiceId, *iRecipientUserId );
+    HBufC8* link8 = readInterface.ContactLink().AllocLC();
+    HBufC16* link16 = HBufC16::NewLC( link8->Length() );
+    link16->Des().Copy( *link8 );
+    iParameter->SetContactDataL( *link16 );
+    CleanupStack::PopAndDestroy( 2 );  //pop and destroy link8 and link16
+
+    // Sync call
+    iConnection->LaunchApplicationL(*iParameter);
+    
+    iDetailViewOpen = ETrue;
+    }
+// ---------------------------------------------------------
+// CIMCVAppView::HandleCommandL(TInt aCommand)
+// Handles commands
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppView::HandleCommandL( TInt aCommand )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppView::HandleCommandL() start") );
+    
+    //Offer commands to menu extension plugins
+    if(iMenuExtManager->OfferHandleCommandToPlugins(aCommand))
+        {
+        //command is executed, hence return.
+        return;
+        }
+    
+    switch ( aCommand )
+        {
+        case EIMCVCmdInternetCall:
+            {
+            // Truncating till ':' if exists - Extracting Userid from "ServiceName:Userid".
+            TInt indexposition = iRecipientUserId->Locate(':');
+            HBufC* phonenumber = NULL; // Phonenumber = Userid    
+            if ( KErrNotFound != indexposition )
+                {
+                phonenumber = iRecipientUserId->Right(iRecipientUserId->Length() - (indexposition+1)).AllocLC();
+                }
+            else
+                {
+                phonenumber = iRecipientUserId->AllocLC(); // does't contain ':'
+                }
+            TPtr phonenumberptr( phonenumber->Des ());
+            CommonPhoneParser::ParsePhoneNumber ( phonenumberptr,CommonPhoneParser::EPhoneClientNumber); 
+            CAiwDialDataExt* dialDataExt = CAiwDialDataExt::NewLC();
+            dialDataExt->SetPhoneNumberL ( phonenumber->Des ());
+            dialDataExt->SetServiceId(iServiceId);
+            dialDataExt->SetCallType( CAiwDialData::EAIWVoiP);
+            dialDataExt->SetWindowGroup ( CCoeEnv::Static()->RootWin().Identifier() );
+            CAiwGenericParamList& paramList = iAiwServiceHandler->InParamListL();
+            dialDataExt->FillInParamListL ( paramList);
+            iAiwServiceHandler->ExecuteServiceCmdL ( KAiwCmdCall,paramList,
+                    iAiwServiceHandler->OutParamListL(),0,NULL);
+            CleanupStack::PopAndDestroy(dialDataExt);
+            CleanupStack::PopAndDestroy(phonenumber);
+            break;
+            }
+        case EIMCVCmdToolbarDetails:
+    	    //Launch the cca
+    	    LaunchCcaL();
+    	    break;
+    	// flow through
+    	case EIMCVCmdSend:
+    	case EIMCVCmdToolbarSend:
+    	case EAknSoftkeySend:
+			{
+			if( iContainer )
+			    {
+			    iContainer->SendMessageL();
+			    }
+		   	break;
+        	}
+    	case EIMCVCmdToolbarInsertSmiley:	
+    	case EIMCVCmdSmiley	:
+			{			
+			TBool dialogCancelled = EFalse;
+			TSize size (iContainer->TextRect ().Height(), iContainer->TextRect ().Height() );
+			iContainer->SmileyDialogLaunched (ETrue);
+			iExtensionHandler->InsertExtensionL( iContainer->Editor().Editor(), 
+												iServiceId,
+	                                           EMessageExtensionSmiley,
+	                                           dialogCancelled,
+	                                           size);
+	        iContainer->UpdateCbaL();
+	        // Resize icons, use reading pane text line element as parent
+	        
+	        if ( !dialogCancelled )
+	            {
+	            iContainer->RefreshEditorL();
+	            iContainer->Editor().SetFocus(ETrue);
+	            }
+			iContainer->SmileyDialogLaunched (EFalse);
+			iContainer->UpdateChatViewL();
+	            
+			break;
+			}
+    	case EIMCVCmdCloseConversation:
+	    	{
+            HBufC* queryTxt = StringLoader::LoadLC( R_CHAT_CQUERY_CLOSE_CONV, *iRecipientUserId );
+            TInt response = DisplayQueryDialogL(
+                                                R_GENERIC_YES_NO_CONFIRMATION_QUERY,
+                                                *queryTxt );
+            CleanupStack::PopAndDestroy( queryTxt );                             
+            if(response)
+                { 
+                iViewDeactivated = ETrue;
+                TInt error = iContainer->CloseConversationL( *iRecipientUserId );
+                iActiveChatInterface->DeleteChatL( iServiceId, *iRecipientUserId );
+                ViewRefreshL();
+                // set this to KNullDesC since conversation is getting closed.
+                iRecipientUserId->Des().Copy( KNullDesC());
+                // after closing conversation application will go to servicetab
+                if( error== KErrNone )
+                    {
+                    iAppUi->HandleCommandL( EAknSoftkeyBack );
+                    }
+                }
+	    	break;	
+	    	} 
+        	// flow through
+        case EFindItemCmdEnableAutoFind:
+        case EFindItemCmdDisableAutoFind:
+            {
+            if( iContainer )
+                {
+                iContainer->SetItemHighlightL( 
+                        aCommand == EFindItemCmdEnableAutoFind );
+                iFindMenu->HandleItemFinderCommandL( aCommand );
+                if( MenuBar()->IsDisplayed() )
+                    {
+                    MenuBar()->StopDisplayingMenuBar();
+                    }
+                if( iFindContextMenu->IsDisplayed() )
+                    {
+                    iFindContextMenu->StopDisplayingMenuBar();
+                    }
+                }
+            break;
+            }
+        case EIMCVCmdCall:
+            {
+            UpdateItemTypeL();
+            CItemFinder::CFindItemExt& item = iItemFinder->CurrentItemExt();
+            if(item.iItemType == CItemFinder::EEmailAddress)
+                {
+                iFindMenu->HandleVoIPCallL( *iItemFinder->CurrentItemExt().iItemDescriptor );
+                }
+            else
+                {
+                iFindMenu->HandleCallL( *iItemFinder->CurrentItemExt().iItemDescriptor );
+                }
+            break;
+            }      
+	    case EAknCmdHelp:
+	    	{
+	    	LaunchHelpL( KSERVTAB_HLP_CONVERSATION );
+	    	break;	
+	    	} 
+
+	    case EEikCmdExit:
+	    case EAknSoftkeyExit:
+	    case EAknCmdExit:
+	    case EAknSoftkeyBack:
+			{
+			iViewDeactivated = ETrue;
+			if( iFindMenu->CommandIsValidL( aCommand ) )
+			    {
+			    iFindMenu->HandleItemFinderCommandL( aCommand );
+			    }
+			iContainer->StoreEditorMessageL();
+			ViewRefreshL();
+			iAppUi->HandleCommandL( aCommand );   		
+			break;	
+			}
+    
+        default:
+            {
+            //As per new UI spec change own status is not avilable in conversation
+            //view menu  
+             // check if it is find menu command
+            if( iFindMenu->CommandIsValidL( aCommand ) )
+                {
+                Toolbar()->HideItemsAndDrawOnlyBackground(ETrue);
+                iFindMenu->HandleItemFinderCommandL( aCommand );
+                Toolbar()->HideItemsAndDrawOnlyBackground(EFalse);
+
+                }
+            else
+	            {
+	            iAppUi->HandleCommandL( aCommand );
+	            }
+                           
+            break;
+            }
+    	}
+    IM_CV_LOGS(TXT("CIMCVAppView::HandleCommandL() end") );	
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppView::HandleForegroundEventL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppView::HandleForegroundEventL( TBool aForeground )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppView::HandleForegroundEventL() start") );   
+  
+    if(aForeground && iDetailViewOpen)
+        {
+        iDetailViewOpen = EFalse;
+        }
+    
+    if(iConvViewDel)
+        {
+        TApaTask task(iEikonEnv->WsSession());
+        task.SetWgId( CEikonEnv::Static()->RootWin().Identifier());
+        task.SendToBackground();
+        iConvViewDel = EFalse;
+        return;
+        }
+    
+    if (!aForeground)
+	    {	    
+	    if (iStatusPane)
+		    {
+		    iStatusPane->SendBackGroundL();
+		    }
+	    iViewDeactivated = ETrue;
+		}
+	else
+		{
+            iActiveEngine->MessageHandler().StartNewConversationL (*iRecipientUserId);
+            SetStatusPaneIconsL();
+            if (iStatusPane)
+                {
+                iStatusPane->BringToForegroundL();
+                }       
+            iViewDeactivated = EFalse;
+		}			    	
+    IM_CV_LOGS(TXT("CIMCVAppView::HandleForegroundEventL() end") );
+    }
+
+    
+
+// ---------------------------------------------------------
+// CIMCVAppView::DoActivateL(...)
+// Handles view activation
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppView::DoActivateL(
+        const TVwsViewId& /*aPrevViewId*/,TUid /*aCustomMessageId*/,
+        const TDesC8& aCustomMessage)
+    {
+    IM_CV_LOGS(TXT("CIMCVAppView::DoActivateL() start") );
+    // Register switch back if conversation view is opened from phonebook im service tab
+    // in case if something lost
+	
+    ActivateViewL(ViewId());    
+    
+    
+    TPckgBuf<TIMCVUiParams> params;
+    params.Copy( aCustomMessage );
+
+    //Get the service id  - this property is published by imcvlauncher
+     TInt error = RProperty::Get( KMeCoPropertyUid, KMeCoConvViewServiceIdKey, iServiceId );
+     User::LeaveIfError(error);
+      
+    TPtrC recieptId = params().iBuddyId;
+    TPtrC buddyName = params().iBuddyName;
+    TPtrC8 contactlinkPtr = params().iContactLink;
+    //CCH has logged in, but conversation is not binded to the connection
+    //so we need to login in conversation view, for the user to use this  view to 
+    //send the message  
+    iActiveEngine = &iEngineFactory->GetServiceEngineL( iServiceId );
+    iActiveEngine->ResolveServiceStateL();    
+	/* Get the active chat recipient id from the engine factory so that we check if 
+	   container should switch */
+	
+	TPtrC activeRecipientId = iEngineFactory->GetActiveItemL ();
+   	// store previous view details if launch from service tab
+    iAppUi->StorePreviousViewDetails(params().iAppUid, params().iViewUid ); 
+    
+	iRecipientUserId->Des().Copy(recieptId);
+    
+    // subscribe for presence notification
+    if ( iActiveEngine->IsLoggedIn() )
+	    {
+	    IM_CV_LOGS(TXT("CIMCVAppView::DoActivateL() LOGGED IN..  BEFORE subscribing.. *****************") );
+	    iActiveEngine->MessageHandler().SubscribePresenceL( recieptId );
+		IM_CV_LOGS(TXT("CIMCVAppView::DoActivateL() LOGGED IN..  AFTER subscribing.. *****************") );
+	    }
+    iActiveChatInterface = &iActiveEngine->ChatInterface();
+    // To prevent looping between this view and refresh view
+    // resolve message read interface
+    MIMCVEngineMessageReadInterface& readInterface = 
+        iActiveChatInterface->MessageReadInterfaceL( iServiceId, *iRecipientUserId, buddyName, contactlinkPtr );
+    MIMCVEngineMessageWriteInterface& writeInterface = 
+        iActiveChatInterface->MessageWriteInterfaceL( iServiceId, *iRecipientUserId, buddyName, contactlinkPtr );
+    
+    TPtrC displayId = readInterface.Name();   
+    
+    if (iStatusPane)
+		{		
+		iStatusPane->SetTitleL( displayId );
+		//hide navi pane decorators
+  
+    	iStatusPane->IMessageIndicator()->AddObserver( this );
+    	//if activation is from contact list and not from switching between
+	    //tabs then create tabs and show them
+		iStatusPane->ShowTabGroupL( iRecipientUserId->Des());
+		iStatusPane->AddObserver(this) ;	
+		}
+        SetStatusPaneIconsL();
+    // When forwarding from contact to contact DoDeactivate is never called.
+    // We have to cleanup the necessary stuff ourself.
+
+   	if( !iContainer )
+        {
+        iContainer = CIMCVAppViewContainer::NewL( ClientRect(),iActiveEngine,
+                                        &readInterface,&writeInterface, 
+                                        this, *iExtensionHandler,Cba(),
+                                        *iRecipientUserId,this, iRTContainerCache,
+                                        iFromMe, iToMe);    
+		iAppUi->AddToViewStackL( *this, iContainer );
+		iAppUi->AddToStackL( *this, iFindContextMenu, ECoeStackPriorityDefault, 
+							  ECoeStackFlagRefusesFocus );
+
+		IM_CV_LOGS(TXT("CIMCVAppView::DoActivateL() creating iContainer") );
+
+        }
+	else 
+		{
+			IM_CV_LOGS(TXT("CIMCVAppView::DoActivateL() CONTAINER exist******************************") );
+			// If the recipient ID does not match the active chat, then switch the container */
+			if (0 != recieptId.Compare(activeRecipientId))
+				{
+				IM_CV_LOGS(TXT("CIMCVAppView::DoActivateL() SWITCHING TAB ******************************") );
+				iContainer->SwitchViewL (&readInterface, &writeInterface, recieptId);
+				}
+		}
+	// Restore find state
+    TInt findState = IMCVUiAppUtils::CRKeyL( KCRUidCommonUi, KCuiAutomaticHighlight );
+    iContainer->SetItemHighlightL( findState );
+    
+
+    // start a conversation since we have single conversation at a time
+
+  	iContainer->StartConversationL ();
+
+   readInterface.SetActive (ETrue);
+   	if( recieptId == KNullDesC )
+	    {
+	    // open from idle 
+	    // not valid user id selected
+	    // Construct view identification for buddylist view activation
+		// launch servicetab for buddy list selection
+		TVwsViewId viewIdentification(KPhonebook2AppUid,KUidIMServiceTabViewUid );
+		ActivateViewL( viewIdentification );
+		// close cv ,no user defined for this
+	    iAppUi->ShutDownAndCloseApplicationL();	
+	    }
+   	MenuBar()->SetContextMenuTitleResourceId( R_CONVERSATIONVIEW_MENUBAR_FINDITEMUI );   
+   	UpdateToolbarButtonsStateL();
+    IM_CV_LOGS(TXT("CIMCVAppView::DoActivateL() end") );
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppView::HandleCommandL()
+// Handles view deactivation
+// ---------------------------------------------------------
+//
+void CIMCVAppView::DoDeactivate()
+    {
+    IM_CV_LOGS(TXT("CIMCVAppView::DoDeactivate() start") );	
+    //TSW bug Id - KBAA-6TM946
+	if (iStatusPane)
+		{
+		iStatusPane->RemoveObserver(this);
+		iStatusPane->IMessageIndicator()->AddObserver( NULL );
+	    iStatusPane->HideFadeText();		
+		}
+		
+    if ( iContainer )
+		{            
+		iAppUi->RemoveFromViewStack( *this, iContainer );
+		// not in a middle of sending message
+		delete iContainer;
+		iContainer = NULL;
+		      
+		}
+     if ( iFindContextMenu )
+        {
+        iAppUi->RemoveFromViewStack( *this, iFindContextMenu );
+        }
+   
+     IM_CV_LOGS(TXT("CIMCVAppView::DoDeactivate() end") );
+     }
+
+// ---------------------------------------------------------
+// CIMCVAPPView::Id()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TUid CIMCVAppView::Id() const
+	{
+	return iViewId;
+	}
+// ---------------------------------------------------------
+// CIMCVAppView::ActiveEngine()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CIMCVEngine& CIMCVAppView::ActiveEngine() const
+    {
+    return *iActiveEngine;
+    }
+// ---------------------------------------------------------
+// CIMCVAppView::SetStatusPaneIconsL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppView::SetStatusPaneIconsL()
+	{
+	IM_CV_LOGS(TXT("CIMCVAppView::SetStatusPaneIconsL() Start ") );
+	if(! iStatusPane )
+		{
+		return;			
+		}
+	
+	if (!iActiveEngine)
+		return;
+	// if the status is EServiceOut then no need to set the icon, only title needs to be set.
+	if(EServiceOut == iActiveEngine->MessageHandler().GetPresenceStatus())
+	    {
+	    return;
+	    }
+	// Load status icon
+	CGulIcon* connStatusIcon = 	LoadBitmapL( );
+	connStatusIcon->SetBitmapsOwnedExternally( EFalse );
+	CleanupStack::PushL( connStatusIcon );
+
+	// in portrait mode we are setting the status icon to status pane
+	iStatusPane->SetPicture( connStatusIcon->Bitmap(), 
+										 connStatusIcon->Mask() 
+										 );
+	// ownership was transferred
+	connStatusIcon->SetBitmapsOwnedExternally( ETrue );    
+
+	CleanupStack::PopAndDestroy( connStatusIcon );
+	
+	IM_CV_LOGS(TXT("CIMCVAppView::SetStatusPaneIconsL() End ") );
+	}
+
+// -----------------------------------------------------------------------------
+// CIMCVAppView::LoadDefaultBitmapL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CGulIcon* CIMCVAppView::LoadBitmapL( )
+	{
+	IM_CV_LOGS(TXT("CIMCVAppView::LoadBitmapL() Start ") );
+	CGulIcon* gulIcon;
+	HBufC8* brandIconId = HBufC8::NewLC(KVIMPSTUISPSMaxPropertyLength);
+	TPtr8 brandIconIdPtr = brandIconId->Des();
+	TIMCVOnlineStatus status = 	iActiveEngine->MessageHandler().GetPresenceStatus();
+	// default offline
+	switch( status ) 
+		{
+		case EOnline:
+			{
+			brandIconIdPtr.Copy(KEMbmConversationsQgnpropimfriendon);
+			break;	
+			}
+		case EInvisible:
+			{
+			brandIconIdPtr.Copy(KEMbmConversationsQgnpropimfriendinvisible);	
+			break;	
+			}
+		case EAway:
+			{
+			brandIconIdPtr.Copy(KEMbmConversationsQgnpropimfriendaway);		
+			break;	
+			}
+		case EBusy:
+		case EDoNotDisturb:
+			{
+			brandIconIdPtr.Copy(KEMbmConversationsQgnpropimfriendbusy);
+			break;	
+			}
+		case EOnPhone:
+			{
+			brandIconIdPtr.Copy(KEMbmConversationsQgnpropimfriendonmobile);
+			break;	
+			}
+		case EBlock:
+		    {
+		     brandIconIdPtr.Copy(KEMbmConversationsQgnpropimuserblocked);	 
+		    break;
+		    }
+		case ECallForward:
+		    {
+		    brandIconIdPtr.Copy(KEMbmConversationsQgnpropimusercallforward);  
+		    break;
+		    }
+		case EOffline :
+		default:
+			{
+			brandIconIdPtr.Copy(KEMbmConversationsQgnpropimfriendoff);
+			// offline only
+			}
+		}
+
+
+    IM_CV_LOGS(TXT("CIMCVAppView::LoadBitmapL()::if(iAppUi->BrandingAccess()) Start ") );    
+    gulIcon = iActiveEngine->GetPresenceIconL( *brandIconId );
+    IM_CV_LOGS(TXT("CIMCVAppView::LoadBitmapL()::if(iAppUi->BrandingAccess()) End ") );
+
+    CleanupStack::PopAndDestroy(brandIconId);
+    IM_CV_LOGS(TXT("CIMCVAppView::LoadBitmapL() End ") );
+    return gulIcon;
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppView::UpdateItemTypeL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppView::UpdateItemTypeL()
+    {    
+    if( !iContainer )
+        {
+        return;
+        }
+    CItemFinder::CFindItemExt& item = iItemFinder->CurrentItemExt();
+    switch(  iContainer->SelectedItemType() )
+        {
+        case CFindItemEngine::EFindItemSearchPhoneNumberBin:
+            {
+            item.iItemType = CItemFinder::EPhoneNumber;
+            break;
+            }                
+        case CFindItemEngine::EFindItemSearchMailAddressBin:
+            {
+            item.iItemType = CItemFinder::EEmailAddress;
+            break;
+            }
+        case CFindItemEngine::EFindItemSearchURLBin:
+            {
+            item.iItemType = CItemFinder::EUrlAddress;
+            break;
+            }
+        case CFindItemEngine::EFindItemSearchScheme:
+            {
+            item.iItemType = CItemFinder::EUriScheme;
+            break;
+            }
+        case KErrNotFound:  // flowthrough
+        default:
+            {
+            item.iItemType = CItemFinder::ENoneSelected;
+            break;
+            }    
+        }
+    delete item.iItemDescriptor;
+    item.iItemDescriptor = NULL;
+    item.iItemDescriptor = iContainer->SelectedItemL();  // takes the ownership
+    
+    // this logic comes from CItemFinder::ResolveAndSetItemTypeL.
+    // should be in ItemFinder engine, but for some reason it isn't,
+    // so, next few lines are copypasted from AknItemFinder.cpp..    
+    if( item.iItemType == CItemFinder::EUrlAddress ) 
+        { 
+        // old url types need prefix in order to work w/ schemehandler
+        const TDesC& pref = item.iItemDescriptor->Des().Left( 4 );
+        
+		//fix for bug id  TJUO-79NETM ( Instant Messaging - 
+		// IM opening rtsp link from message don't work)		
+		//To avoid adding :http://" to rtsp links, we check it before it is done
+		//and return. 
+        if (pref.CompareF (KIMRTSP().Left (4)) == 0)
+	        {
+        	return;
+	        }
+        
+        if ( pref.CompareF( KIMHTTPPREFIX().Left( 4 ) ) != 0 )
+            {
+            HBufC* tmp = item.iItemDescriptor->ReAlloc( 
+                        item.iItemDescriptor->Length() + KIMHTTPPREFIX().Length() );
+            if( tmp )
+                {
+                // realloc succeeded
+                item.iItemDescriptor = tmp;
+                item.iItemDescriptor->Des().Insert( 0, KIMHTTPPREFIX );
+                }
+            }        
+        }
+    if( item.iItemType == CItemFinder::EUriScheme )
+        {
+        // some schemes (ie. "old ones") have special handling 
+        const TDesC& pref = item.iItemDescriptor->Des().Left( 4 );
+        if ( pref.CompareF( KIMHTTPPREFIX().Left( 4 ) ) == 0 
+            || pref.CompareF( KIMRTSP ) == 0 )
+            {
+            item.iItemType = CItemFinder::EUrlAddress;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppView::DisplayQueryDialogL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CIMCVAppView::DisplayQueryDialogL( TInt aDialogResourceId, 
+            							const TDesC& aPrompt )
+	{
+	CAknQueryDialog* dlg = new (ELeave) CAknQueryDialog(
+											CAknQueryDialog::ENoTone );
+	CleanupStack::PushL( dlg );
+	if( aPrompt != KNullDesC )
+		{		
+		dlg->SetPromptL( aPrompt );		
+		}
+	CleanupStack::Pop( dlg );
+	return dlg->ExecuteLD( aDialogResourceId );
+	}
+    
+// ---------------------------------------------------------
+// CIMCVAppView::ShowPopUpMenuL()
+// This method shows popup menu
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppView::ShowPopUpMenuL( )
+    {
+    if( iContainer && iContainer->SelectedItemType() != KErrNotFound )
+        {
+#ifndef RD_30_DISABLE_TOUCH
+        MenuBar()->StopDisplayingMenuBar();
+        MenuBar()->TryDisplayContextMenuBarL();
+#else
+        iFindContextMenu->StopDisplayingMenuBar();
+        iFindContextMenu->TryDisplayMenuBarL();
+#endif
+        }
+    }
+
+// ---------------------------------------------------------
+// CIMCVAppView::SwitchTabL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppView::SwitchTabL(TInt aActiveServiceId ,const TDesC& aChatId, const TInt /*aTabIndex*/)
+	{
+	//change the contact id based on tteh currenttab    	
+	iRecipientUserId->Des().Copy(aChatId);
+    if( aActiveServiceId != iServiceId )
+        {
+        SwitchToValidServiceL( aActiveServiceId );
+        }
+    // subscribe for presence notification
+    if (iActiveEngine->IsLoggedIn())
+	    {
+	    iActiveEngine->MessageHandler().SubscribePresenceL( aChatId );
+	    }
+    // To prevent looping between this view and refresh view
+    // resolve message read interface
+    MIMCVEngineMessageReadInterface& readInterface = 
+        iActiveChatInterface->MessageReadInterfaceL( iServiceId, *iRecipientUserId );
+    MIMCVEngineMessageWriteInterface& writeInterface = 
+    iActiveChatInterface->MessageWriteInterfaceL( iServiceId, *iRecipientUserId );
+                
+   	TPtrC displayId = readInterface.Name();
+    
+    if (iStatusPane)
+	    {
+	    iStatusPane->SetTitleL( displayId );
+	    }
+    SetStatusPaneIconsL();
+    
+    //remove the controls from view stack
+    if ( iContainer )
+        {            
+        iAppUi->RemoveFromViewStack( *this, iContainer );        
+        }
+
+    if ( iFindContextMenu )
+        {
+        iAppUi->RemoveFromViewStack( *this, iFindContextMenu );
+        }
+	
+	//again add those controls to view stack
+	if ( iContainer )
+        {
+        iContainer->SwitchViewL(&readInterface, &writeInterface, *iRecipientUserId );            
+        iAppUi->AddToViewStackL( *this, iContainer );      
+        }
+    
+    if ( iFindContextMenu )
+        {
+        iAppUi->AddToStackL( *this, iFindContextMenu, ECoeStackPriorityDefault, 
+                          ECoeStackFlagRefusesFocus );
+        }
+    UpdateToolbarButtonsStateL();
+  	}    
+
+
+// ---------------------------------------------------------
+// CIMCVAppView::NotifyWhenCompleted()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppView::NotifyWhenCompleted()
+    {
+    MAknEditingStateIndicator* editStateIndicator = 
+                                    CAknEnv::Static()->EditingStateIndicator();                                   
+    
+    if ( editStateIndicator )
+        {
+        CAknIndicatorContainer* indicatorContainer = editStateIndicator->IndicatorContainer();
+              
+        if (( indicatorContainer ) && (iStatusPane))
+            {
+            iStatusPane->HideFadeText();
+            iStatusPane->HideNavipaneIndicators();            
+            }
+        }
+    
+    if ( iContainer )
+        {
+        CEikRichTextEditor& editor = iContainer->Editor().Editor();
+
+		if (!editor.IsFocused())
+			{
+			editor.SetAknEditorFlags( editor.AknEdwinFlags()|EAknEditorFlagNoEditIndicators );	
+			if (iStatusPane)
+				{
+				TRAP_IGNORE( iStatusPane->ShowTabL() );
+				}
+			}
+		else
+			{
+			editor.SetAknEditorFlags( editor.AknEdwinFlags()&~EAknEditorFlagNoEditIndicators );			
+			}
+        }
+    
+    
+    }
+
+
+// ---------------------------------------------------------
+// CIMCVAppView::NotifyWhenStarted()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CIMCVAppView::NotifyWhenStarted()
+    {    
+    if ( iContainer )
+        {
+        CEikRichTextEditor& editor = iContainer->Editor().Editor();
+		if (editor.IsFocused())
+			{
+			editor.SetAknEditorFlags( editor.AknEdwinFlags()|EAknEditorFlagNoEditIndicators );
+			}
+        }
+    }
+        
+// ---------------------------------------------------------
+// CIMCVAppView::ViewRefresh()
+// This method refreshes the view.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+void CIMCVAppView::ViewRefreshL()
+    {
+    IM_CV_LOGS(TXT("CIMCVAppView::ViewRefreshL() start") );
+    
+     if ( iContainer )
+        {            
+        iAppUi->RemoveFromViewStack( *this, iContainer );
+        // not in a middle of sending message
+        delete iContainer;
+        iContainer = NULL;                  
+        }
+     if ( iFindContextMenu )
+        {
+        iAppUi->RemoveFromViewStack( *this, iFindContextMenu );
+        }
+  
+     UpdateToolbarButtonsStateL();
+     IM_CV_LOGS(TXT("CIMCVAppView::ViewRefreshL() End") );
+    }
+    
+// ---------------------------------------------------------
+// CVIMPSTUiTabbedView::LaunchHelpL()
+// Function launches help application using the HlpLauncher.
+// @params: Reference to a descriptor, serves as context.
+// ---------------------------------------------------------
+//
+
+
+void CIMCVAppView::LaunchHelpL( const TDesC& aContext )
+    {
+    CArrayFix< TCoeHelpContext >* cntx = new( ELeave ) CArrayFixFlat< TCoeHelpContext >( KHelpContextSize );
+    CleanupStack::PushL( cntx );
+
+    cntx->AppendL( TCoeHelpContext( KHelpUid, aContext ) );
+    CleanupStack::Pop( cntx );
+    
+    //and launch help - takes ownership of context array
+    HlpLauncher::LaunchHelpApplicationL( CEikonEnv::Static()->WsSession(), cntx );    
+    }
+// ---------------------------------------------------------
+// CVIMPSTUiTabbedView::ShowMeL()
+// Function launches help application using the HlpLauncher.
+// @params: Reference to a descriptor, serves as context.
+// ---------------------------------------------------------
+//    
+void CIMCVAppView::ShowMeL( const TDesC8& aParamData )
+	{
+    IM_CV_LOGS(TXT("CIMCVAppView::ShowMeL() Start" ));
+	TPckgBuf<TIMCVUiParams> params;
+    params.Copy( aParamData );
+   
+    if(iAppUi) 
+        {
+        IM_CV_LOGS(TXT("CIMCVAppView::ShowMeL() Inside if(iAppUi)" ));
+        if(iConnection)
+            {
+            iConnection->Close();
+            iConnection = NULL;
+            }
+        // show me may called before ActivateViewL is called
+        //Get the service id  - this property is published by imcvlauncher
+        TInt error = RProperty::Get( KMeCoPropertyUid, KMeCoConvViewServiceIdKey, iServiceId );
+        User::LeaveIfError(error);
+        TInt serviceId = iActiveEngine->GetServiceId();
+		if( serviceId != iServiceId )
+			{
+			SwitchToValidServiceL( iServiceId );
+			}
+		/* Get the current active REcipient ID, if that is not matching, then launch cv */
+		TPtrC activeRecipientId = iEngineFactory->GetActiveItemL ();
+	//	IM_CV_LOGS(TXT("CIMCVAppView::SHOWMEL() ACTIVE RECIPIENT ID %S *****************"), &activeRecipientId );
+		
+        TPtrC recieptId = params().iBuddyId;  
+        TPtrC displayName = params().iBuddyName;
+        iRecipientUserId->Des().Copy(recieptId);
+        // show me may called before ActivateViewL is called
+        // if its only update, which is true only when a contact is edited.
+        IM_CV_LOGS(TXT("CIMCVAppView::ShowMeL() Inside if(iAppUi) : %d" ), params().iUpdate);
+
+        if(params().iUpdate )
+            {
+            IM_CV_LOGS(TXT("CIMCVAppView::ShowMeL() if(params().iUpdate)" ));
+
+            MIMCVEngineMessageWriteInterface& messageWriteInterface = iActiveChatInterface->
+                                                                        MessageWriteInterfaceL(params().iServiceId,recieptId);
+            messageWriteInterface.SetNameL(displayName);
+            if(iStatusPane)
+                {
+                // refresh the view if the update has tacke place when the conversation view is open.
+                IM_CV_LOGS(TXT("CIMCVAppView::ShowMeL() calling RefreshTabL)" ));
+                iStatusPane->RefreshTabL(recieptId,displayName);
+                }
+          
+            }
+        else
+            {
+            IM_CV_LOGS(TXT("CIMCVAppView::ShowMeL() else" ));
+            iAppUi->StorePreviousViewDetails(params().iAppUid, params().iViewUid );
+            if ( (!iViewDeactivated) && (iRecipientUserId) && 
+                   (serviceId == iServiceId) && 
+                   (0 == recieptId.Compare(activeRecipientId)) )
+                {       
+                SetStatusPaneIconsL();
+                if (iStatusPane)
+                    {
+                    iStatusPane->BringToForegroundL();  
+                    }
+                iAppUi->BringToForeground(TUid::Uid(KIMCVUIAPPEXEUID3));
+                // when view moved to background ,active conversation was deactivated
+                // comming to forground activate it
+                iActiveEngine->MessageHandler().StartNewConversationL( recieptId );           
+                }
+            else
+               {
+               IM_CV_LOGS(TXT("CIMCVAppView::ShowMeL() NOT MATCHING AT ALL" ));
+               iAppUi->ActivateLocalViewL(KUidConversationsView, KNullUid, aParamData);                
+               }
+            UpdateToolbarButtonsStateL();
+            }
+        }
+	IM_CV_LOGS(TXT("CIMCVAppView::ShowMeL() End" ));
+	}
+// ---------------------------------------------------------
+// CVIMPSTUiTabbedView::SwitchToValidServiceL()
+// Function launches help application using the HlpLauncher.
+// @params: Reference to a descriptor, serves as context.
+// ---------------------------------------------------------
+//    	
+void CIMCVAppView::SwitchToValidServiceL( TInt aServiceId )
+    {
+    if( aServiceId <= 0 )
+        {
+        return;
+        }
+    iServiceId = aServiceId;
+    iActiveEngine = &iEngineFactory->GetServiceEngineL( iServiceId );
+    iActiveEngine->ResolveServiceStateL();    
+    iActiveChatInterface = &iActiveEngine->ChatInterface();
+    if( iContainer )
+        {
+        // resolve message read interface
+        iContainer->SetServiceParametersL( iActiveEngine );
+        }
+    }
+// ---------------------------------------------------------
+// CVIMPSTUiTabbedView::OfferTabEventL()
+// Function launches help application using the HlpLauncher.
+// @params: Reference to a descriptor, serves as context.
+// ---------------------------------------------------------
+//    
+TKeyResponse CIMCVAppView::OfferTabEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+    {
+    TKeyResponse keyResponse = EKeyWasConsumed;
+     
+    CAknTabGroup* tabGroup= NULL;
+    if(iStatusPane)
+        {
+        tabGroup = iStatusPane->TabGroup();
+        
+    
+        if(tabGroup)
+            {
+            keyResponse = tabGroup->OfferKeyEventL(aKeyEvent,aType);
+            }
+        }
+    
+    return keyResponse;
+
+    }
+
+// ---------------------------------------------------------------------------
+// CIMCVAppView::UpdateToolbarButtonsState
+// ---------------------------------------------------------------------------
+//
+void CIMCVAppView::UpdateToolbarButtonsStateL()
+    {
+    if ( iContainer && iRecipientUserId )        
+        {
+        MIMCVEngineMessageReadInterface& readInterface = 
+            iActiveChatInterface->MessageReadInterfaceL( iServiceId, *iRecipientUserId );
+
+        if ( readInterface.ContactLink().Length()> 0 )
+            {
+            Toolbar()->SetItemDimmed(EIMCVCmdToolbarDetails, EFalse, ETrue);
+            }
+        else {
+            Toolbar()->SetItemDimmed(EIMCVCmdToolbarDetails, ETrue, ETrue);
+            }
+        
+        TBool needToDimSendBtn = ETrue;
+        if(iContainer->Editor().TextLength()> 0)
+            {
+            needToDimSendBtn = EFalse;    
+            } 
+        Toolbar()->SetItemDimmed( EIMCVCmdToolbarSend, needToDimSendBtn, ETrue );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppView: HandleNewServiceL
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppView::HandleNewServiceL( TInt aServiceId )  
+    {
+    if( iExtensionHandler )
+        {
+        iExtensionHandler->CreateServiceSmileyL( aServiceId );
+        }
+    }
+// -----------------------------------------------------------------------------
+// CIMCVAppView: HandleServiceDeletedL
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppView::HandleServiceDeletedL( TInt aServiceId ) 
+    {
+    if( iExtensionHandler )
+        {
+        iExtensionHandler->DeleteServiceSmileyL( aServiceId );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppView::HandlePresenceChangedL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppView::HandlePresenceChangedL(TInt aServiceId, const TDesC& aBuddyId )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppView::HandlePresenceChangedL() start") );
+    if ( (iServiceId == aServiceId ) && ( iRecipientUserId->Compare( aBuddyId ) == 0 ) )
+        {
+        SetStatusPaneIconsL();
+        }
+    if (iContainer)
+        {
+        CIMCVEngine& engine = iEngineFactory->GetServiceEngineL( aServiceId );
+        iContainer->InsertStatusChangedMessageL(engine, aServiceId, aBuddyId );
+        }
+    IM_CV_LOGS(TXT("CIMCVAppView::HandlePresenceChangedL() End") );
+    }
+// ---------------------------------------------------------
+// CIMCVAppView::HandleOperationCompletdL
+// Handles operation completion
+// ---------------------------------------------------------
+//
+void CIMCVAppView::HandleOperationCompletdL(TInt /*aServiceId*/, MIMCVEngineMessage::TMessagerType /*aType*/ , TInt aResult )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppView::HandleOperationCompletdL() start") ); 
+    
+    if( aResult!= KErrNone )
+        {
+        // show the corresponding error or information note
+        IMCVUiAppNoteMapper::ShowNoteL( aResult,*iRecipientUserId );    
+        }
+
+    IM_CV_LOGS(TXT("CIMCVAppView::HandleOperationCompletdL() end") );  
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppView::HandleConnectionTerminatedL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppView::HandleConnectionEventL( TInt aServiceId, TIMCVConnectionState aState, TInt aReason )
+    {
+    IM_CV_LOGS(TXT("CIMCVAppView::HandleConnectionEventL() start") );
+
+    switch (aState)
+        {
+        case EUnKnown:
+            break;
+        case ELoggedIn:
+            // Nothing to be done.
+            break;
+        case ELoggedOut:
+        case EForcedLoggedOut:
+            {
+            /*
+             * Only when the application is in Foreground, we need to show the note
+             * before closing the application. Once after that we need to shutdown the 
+             * application
+             */
+            if ( iAppUi->IsAppInForeground() && ( aServiceId == iServiceId ) )
+                {
+                // active service 
+                if (KErrNone != aReason)
+                    IMCVUiAppNoteMapper::ShowNoteL( aReason , KNullDesC );
+                }
+            // if application is in the background, then on logout
+            // clean up the container, and if the cca was open then close.
+            // only for the logged out service.
+            if( aServiceId == iServiceId )
+                {
+                if(iConnection)
+                       {
+                       iConnection->Close();
+                       iConnection = NULL;
+                       }
+                if(iViewDeactivated)
+                       {
+                       ViewRefreshL();
+                       // set this to KNullDesC since conversation is getting closed.
+                       iRecipientUserId->Des().Copy( KNullDesC());
+                       }
+                }
+           
+			break;
+            }
+        }
+    IM_CV_LOGS(TXT("CIMCVAppView::HandleConnectionEventL() End") );
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVAppView: HandleChatListEvent
+// -----------------------------------------------------------------------------
+//
+void CIMCVAppView::HandleChatListEvent(TInt aServiceId,TChatListEventType aEvent, 
+                                      MIMCVEngineMessageReadInterface* aContainerInfo
+                                     ) 
+    {
+    IM_CV_LOGS (TXT("CIMCVAPPVIEW "));
+    // Handles the close Conversation event triggered from service tab.    
+    switch (aEvent)
+        {
+        case EChatItemDeleted:
+            {               
+            DeleteContainerCache( aContainerInfo->TargetId().Target(),aServiceId );
+            break;
+            }
+        case EChatAllItemDeleted:
+            {               
+			IM_CV_LOGS (TXT("CIMCVAPPVIEW  :: DELETE ALL CHATS ***************************"));
+            
+			if(iViewDeactivated)
+			    {
+			    iRTContainerCache->DeleteAllServiceContainer( aServiceId );
+			    }
+			
+            break;
+            }
+        default:
+            break;
+        }
+    
+    }
+
+//--------------------------------------------------------------------------------
+//CIMCVAppView::DeleteContainerCache
+//--------------------------------------------------------------------------------
+void CIMCVAppView::DeleteContainerCache(const TDesC& aPrimaryKey, TInt aServiceId )
+    {
+    iRTContainerCache->DeleteContainer( aPrimaryKey,aServiceId );
+    //iActiveEngine->MessageHandler().CloseConversationL( *iRecipientUserId );
+    ViewRefreshL();
+    iRecipientUserId->Des().Copy( KNullDesC());
+
+    if( !iViewDeactivated ) //if conv. view is active, we should go back to ST..
+        {
+        //this will execute when Back operation from Detail view is performed before call back (xsp id deletion call back)
+        //reaches the conv. view.
+        //In this case Conv. view will be active view and Conv. view need to be closed in this scenario.
+        TApaTask task(iEikonEnv->WsSession());
+        task.SetWgId( CEikonEnv::Static()->RootWin().Identifier());
+        task.SendToBackground();
+        }
+    else    //if view is not active (Current view is detail view).
+        {
+        if(iDetailViewOpen)
+            {
+            //xsp id deleted from detail view.
+            //conv. view need to be closed when doing back operation from detail view.
+            iConvViewDel = ETrue;
+            }
+        }
+    
+    iViewDeactivated = ETrue;
+    }
+//  End of File