uiservicetab/vimpstcmdprocess/src/cvimpstprocessArray.cpp
branchRCL_3
changeset 28 3104fc151679
parent 27 2b7283837edb
child 29 9a48e301e94b
--- a/uiservicetab/vimpstcmdprocess/src/cvimpstprocessArray.cpp	Thu Aug 19 09:41:53 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1981 +0,0 @@
-/*
-* 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 command process array
-*
-*/
-
-
-// INCLUDE FILES
-#include <coemain.h>
-
-#include "uiservicetabtracer.h"
-
-#include "cvimpstprocessarray.h"
-
-#include "mvimpstprocessArrayobserver.h"
-#include "cvimpststoragemanagerfactory.h"
-#include "mvimpststorageserviceview.h"
-#include "tvimpstenums.h"
-#include "cvimpstprocessarrayitem.h"
-#include "mvimpststorageitemmodel.h"
-#include "tvimpstconsts.h"
-#include "mvimpststoragecontactlist.h"
-#include "mvimpststoragevpbkstorehandler.h"
-#include "mvimpstengine.h"
-#include "cvimpstprocessfriendrequestitem.h"
-#include "mvimpstenginesubservice.h"
-#include <MVPbkFieldType.h>
-#include <MVPbkContactFieldUriData.h>
-#include <MVPbkContactFieldTextData.h>
-//rsg file for resource id
-#include <vimpstuires.rsg>
-#include "vimpstutils.h"
-#include <MVPbkContactLink.h>
-#include <VPbkEng.rsg>
-#include "mvimpstengineimsubservice.h"
-#include "mvimpstenginepresencesubservice.h"
-
-#include <apgtask.h> 
-#include "imcvuiparams.h"
-
-// --------------------------------------------------------------------------
-// CVIMPSTProcessArray::CIMArrayProcess
-// --------------------------------------------------------------------------
-//
-CVIMPSTProcessArray::CVIMPSTProcessArray( MVIMPSTEngine& aEngine)
-:iOwnDataIndex(KOwnDataIndex),
-iContactListIndex(KOwnDataIndex),
-iEngine(aEngine)
-        {
-        iServiceId = iEngine.ServiceId();
-        }
-
-// --------------------------------------------------------------------------
-// CVIMPSTProcessArray::~CVIMPSTProcessArray
-// --------------------------------------------------------------------------
-//
-CVIMPSTProcessArray::~CVIMPSTProcessArray()
-    {
-   
-    TRACER_AUTO;
-    if(iContactInterface)
-        {
-        iContactInterface->RemoveObserver( this );	
-        }
-    iItemArray.ResetAndDestroy();
-    //iItemArray.Close();
-    
-    
-    iUnKnownContactArray.Close();
-    iAddRequestArray.Close();
-    
-    if(iData)
-        {
-        delete iData;
-        iData = NULL;
-        }
-    //Get IM SubService     
-    MVIMPSTEngineSubService* subService1 =    	   
-    (iEngine.SubService(TVIMPSTEnums::EIM));
-
-    if(subService1)
-        {
-        MVIMPSTEngineIMSubService& imSubService = 
-        MVIMPSTEngineIMSubService::Cast (*subService1);
-        imSubService.UnRegisterChatObserver(this);
-        }
-
-    //subscribe for ownpresencechangeevent    			
-    MVIMPSTEngineSubService* subService =    	   
-    (iEngine.SubService(TVIMPSTEnums::EPresence));
-
-    if(subService)
-        {
-        MVIMPSTEnginePresenceSubService& presence = 
-        MVIMPSTEnginePresenceSubService::Cast (*subService);
-        presence.UnRegisterPresenceEventObserver(this);
-        } 
-
-    
-    }
-
-// --------------------------------------------------------------------------
-// CVIMPSTProcessArray::NewL
-// --------------------------------------------------------------------------
-//
-CVIMPSTProcessArray* CVIMPSTProcessArray::NewL(
-        MVIMPSTEngine& aEngine)
-    {
-    TRACER_AUTO;
-    CVIMPSTProcessArray* self = new(ELeave) CVIMPSTProcessArray(aEngine);
-    CleanupStack::PushL(self);
-    self->ConstructL();
-    CleanupStack::Pop(self);   
-    return self;
-    
-    }
-
-// --------------------------------------------------------------------------
-// CVIMPSTProcessArray::ConstructL
-// --------------------------------------------------------------------------
-//
-void CVIMPSTProcessArray::ConstructL()
-    {
-   
-    TRACER_AUTO;
-    iContactInterface = CVIMPSTStorageManagerFactory::ContactListInterfaceL(iServiceId);
-    if(iContactInterface)
-        {        
-        iContactInterface->AddObserverL( this );// listen these events..        
-        HBufC* unnamed = VIMPSTUtils::LoadResourceL( R_SERVTAB_UNNAMED );
-        if( unnamed )
-            {
-            CleanupStack::PushL( unnamed );
-            iContactInterface->SetUnnamedTextL(unnamed); // takes ownership
-            CleanupStack::Pop( unnamed );	
-            }
-        }
-    iContactListModel = CVIMPSTStorageManagerFactory::ItemModelInterfaceL(iServiceId);
-    iLoginState = iEngine.ServiceState();
-    
-    iIMSupported = EFalse;
-    iPresenceSupported = EFalse;
-    //Get IM SubService     
-    MVIMPSTEngineSubService* subService1 =(iEngine.SubService(TVIMPSTEnums::EIM));
-    if(subService1)
-        {
-        MVIMPSTEngineIMSubService& imSubService = 
-        MVIMPSTEngineIMSubService::Cast (*subService1);
-        imSubService.RegisterChatObserver(this);
-        iIMSupported = ETrue;
-        }
-    iData = HBufC::NewL(512);
-    iAddRequestArray.Reset();
-    iUnKnownContactArray.Reset();
-    //subscribe for ownpresencechangeevent
-    MVIMPSTEngineSubService* subService =    	   
-    (iEngine.SubService(TVIMPSTEnums::EPresence));
-    if(subService)
-        {        
-        MVIMPSTEnginePresenceSubService& presence = 
-        MVIMPSTEnginePresenceSubService::Cast (*subService);
-        presence.RegisterPresenceEventObserverL(this);     
-        iPresenceSupported = ETrue;
-        }
-	ResetArray();
-	
-    }
-// --------------------------------------------------------------------------
-// CVIMPSTProcessArray::HandleStorageChangeL
-// --------------------------------------------------------------------------
-//
-void CVIMPSTProcessArray::HandleStorageChangeL( TVIMPSTEnums::TVIMPSTStorgaeEventType aEventType,
-			         							MVIMPSTStorageContactList* /*aList*/, 
-				        						MVIMPSTStorageContact* aContact,
-				        						TInt aContactIndex )
-    {
-   
-    TRACER_AUTO;
-    // 0th index OwnItem + unknow contacts + add request
-    aContactIndex = aContactIndex + 1 + iUnKnownContactArray.Count() + iAddRequestArray.Count();
-    
-    switch( aEventType )
-        {
-        case TVIMPSTEnums::EStorageContactReadComplete:
-            {           
-            TRACE("EStorageContactReadComplete");
-            if(iProcessObservers)
-                {
-                /* passing 0 so that the focus is on owndata item */
-                iProcessObservers->HandleAdditionL(TVIMPSTEnums::EOwnStatusItem, 0 ); // focus own item
-                }           
-            break;
-            }
-        case TVIMPSTEnums::EStorageContactFetchComplete:
-            {            
-            TRACE("EStorageContactFetchComplete");
-            TRACE( " iItemArray Count: %d", iItemArray.Count() );
-
-            if(iProcessObservers)
-                {
-                /* passing 0 so that the focus is on owndata item */
-                iProcessObservers->HandleAdditionL(TVIMPSTEnums::EOwnStatusItem, 0 ); // focus own item
-                }
-
-            ResetArray();
-            iFetchCompleted = ETrue;
-            GetAndCreateOpenChatListL();
-            TRACE( "EStorageContactFetchComplete End" );
-            break; 	
-            }
-        case TVIMPSTEnums::EStorageContactReading:
-        case TVIMPSTEnums::EStorageContactFetching:
-        case TVIMPSTEnums::EStorageContactSynchronizing:
-            {
-            TRACE( "EStorageContactFetching/EStorageContactFetching" );
-            /*
-             *	This event occurs whenever we have contacts added to contactlist. This happens in the following scenarios
-             *	1. At the time of login, when we fetch contacts, contact-by-contact is added to the storage. so we get this event.
-             * 	2. When we add a contact manually (either from phonebook, or manu adding etc.. ) we get this callback.
-             */
-            TRACE( "contactindex = %d",aContactIndex );
-            CVIMPSTProcessContactItem* contactItem = CVIMPSTProcessContactItem::NewL (*this, const_cast<TDesC&>(aContact->Name() ),
-                    const_cast<TDesC&>(aContact->UserId() ),
-                    aContact->ContactLink(),
-                    const_cast<TDesC&>(aContact->StatusText()),
-                    aContact->OnlineStatus());
-            
-            contactItem->SetAvatarIndex(aContact->AvatarIndex());
-
-            /* All the time the index should be less than the item array's count, but during the fetch of contacts from cdb file to the view, 
-             * if we havent got a contactviewready, and during that if I get contactaddition, before getting contactFetchComplete, we should keep 
-             * appending the items to the array for display, once we get the entire list, its sorted anyway while insertion, and when presence occurs
-             * the contacts are re-sorted. 
-             */
-            TRACE( "itemarraycount = %d",iItemArray.Count() );
-            if (aContactIndex >= iItemArray.Count() )
-                {                
-                TRACE( "append contact item %d", contactItem);
-                iItemArray.Append(contactItem);
-                }
-            else
-                {              
-                TRACE( "Insert at index = %d", aContactIndex);
-                iItemArray.Insert(contactItem, aContactIndex );
-                }               
-            if(iProcessObservers)
-                {
-                /* passing 0 so that the focus is on owndata item */
-                iProcessObservers->HandleAdditionL(TVIMPSTEnums::EOwnStatusItem, 0);
-                }
-            if( aContact->AvatarContent().Length() && iProcessObservers )
-                {
-                iProcessObservers->HandleAvatarChangeL( aContact->UserId() );
-                }
-           
-            break;
-            }
-        case TVIMPSTEnums::EStorageEventContactAddition:
-            {            
-            TRACE("EStorageEventContactAddition");
-
-            TBool removed = RemoveFromUnknonOrInvitationListL( aContact->UserId(), EFalse );
-            if( removed )
-                {
-                aContactIndex = aContactIndex - 1; // one contact is removed from iUnknownContactArray 
-                }
-            /*
-             *	This event occurs whenever we have contacts added to contactlist. This happens in the following scenarios
-             *	1. At the time of login, when we fetch contacts, contact-by-contact is added to the storage. so we get this event.
-             * 	2. When we add a contact manually (either from phonebook, or manu adding etc.. ) we get this callback.
-                 */
-            TPtrC userId = aContact->UserId();
-                TRACE( "contactindex = %d",aContactIndex );
-                CVIMPSTProcessContactItem* contactItem = CVIMPSTProcessContactItem::NewL ( *this, aContact->Name() ,
-                                                                                            userId,
-                                                                                            aContact->ContactLink(),
-                                                                                            const_cast<TDesC&>(aContact->StatusText()),
-                                                                                            aContact->OnlineStatus() );
-
-                contactItem->SetAvatarIndex(aContact->AvatarIndex());
-            /* All the time the index should be less than the item array's count, but during the fetch of contacts from cdb file to the view, 
-             * if we havent got a contactviewready, and during that if I get contactaddition, before getting contactFetchComplete, we should keep 
-             * appending the items to the array for display, once we get the entire list, its sorted anyway while insertion, and when presence occurs
-             * the contacts are re-sorted. 
-             */
-            TRACE( "itemarraycount = %d",iItemArray.Count() );
-            if (aContactIndex >= iItemArray.Count() )
-                {                
-                TRACE( "append contact item = %d", contactItem);
-                iItemArray.Append(contactItem);
-                }                
-            else
-                {                
-                TRACE( "Insert at index = %d", aContactIndex);
-                iItemArray.Insert(contactItem, aContactIndex );
-                }                
-             // check if  pending message exist
-            if( TVIMPSTEnums::ESVCERegistered == iLoginState && userId.Length() )
-                {
-                if( IsConversationExistL( userId ) )
-                    {
-                    contactItem->SetConversationOpen(ETrue);
-                    }
-                if( IsUnreadMessageExistsL( userId ) )
-                    {
-                    contactItem->SetMsgPending(ETrue);
-                    }
-                }
-
-            if(iProcessObservers)
-                {
-                if (aContact->AvatarContent().Length())
-                    {
-                    iProcessObservers->HandleAvatarChangeL(aContact->UserId());
-                    }
-                /* passing aContactIndex so that the focus is on owndata item */
-                iProcessObservers->HandleAdditionL(TVIMPSTEnums::EContactItem, aContactIndex );
-                }   
-           
-            break;
-            }
-        case TVIMPSTEnums::EStorageEventContactDelete:
-            {
-            TRACE( " EStorageEventContactDelete" );
-            TRACE( "contactindex = %d",aContactIndex );
-            TRACE( "itemarraycount = %d",iItemArray.Count() );
-            if( aContactIndex < iItemArray.Count() )
-                {
-                MVIMPSTProcessArrayItem* deletedItem = iItemArray[ aContactIndex ];               
-                TRACE( "contact removed in item array of index = %d",aContactIndex );
-                iItemArray.Remove (aContactIndex);
-                delete deletedItem;
-                iItemArray.Compress();
-                TRACE( "contactindex = %d",aContactIndex );
-                }
-            if(iProcessObservers)
-                {
-                iProcessObservers->HandleDeletionL(TVIMPSTEnums::EContactItem, aContactIndex);
-                }            
-            break;
-            }
-        case TVIMPSTEnums::EStorageAvatarChange:
-            {           
-            TRACE("EStorageAvatarChange");
-            if(iProcessObservers  && aContact )
-                {               
-                TRACE( "EStorageAvatarChange inside if" );
-                TPtrC aUserId = aContact->UserId();                
-                TRACE( "EStorageAvatarChange aUserId = %S", &aUserId );
-                iProcessObservers->HandleAvatarChangeL( aContact->UserId() );
-                }           
-            break;            
-            }
-        case TVIMPSTEnums::EStorageOwnPresenceChange:
-            {
-            TRACE( "EStorageOwnPresenceChange" );
-            if(iProcessObservers)
-                {
-                /* passing index as 0, so thta focus remains at the owndata item */
-                iProcessObservers->HandleAdditionL(TVIMPSTEnums::EOwnStatusItem, KErrNotFound );
-                }           
-            break;
-            }
-        case TVIMPSTEnums::EStorageMultiplePresenceChange:
-	        {	        
-	        TRACE("EStorageMultiplePresenceChange " );
-	        // mostly this will get called after just login and fetch time
-	        ResetArray();
-            if(iProcessObservers )
-                {
-                iProcessObservers->HandleAdditionL(TVIMPSTEnums::EContactItem, KErrNotFound );
-                }            
-	        break;	
-	        }
-        case TVIMPSTEnums::EStoragePresenceChange:
-            {           
-            TRACE( " EStoragePresenceChange" );
-            /* 
-             *	After Sort we get the new index... So first we need to remove the contact from the old position, 
-             *	and then re-insert it at the correct obtained position (newIndex in this case)
-             */
-            TRACE("contactindex = %d",aContactIndex );
-            TRACE( "itemarraycount = %d",iItemArray.Count() );
-            if( aContactIndex < iItemArray.Count() )
-                {                
-                TInt newIndex = iContactListModel->IndexOfContact( aContact );               
-                TRACE( "new index = %d",newIndex );
-                CVIMPSTProcessContactItem* newItem = CVIMPSTProcessContactItem::NewL(*this, const_cast<TDesC&>(aContact->Name() ),
-                        const_cast<TDesC&>(aContact->UserId() ),
-                        aContact->ContactLink(),
-                        const_cast<TDesC&>(aContact->StatusText()),
-                        aContact->OnlineStatus() );
-                
-                
-                MVIMPSTProcessArrayItem* oldItem = iItemArray[ aContactIndex ]; 
-                newItem->SetAvatarIndex(aContact->AvatarIndex()); // copy the avatar index too.
-                
-                TBool isOldConversationExists(EFalse);
-                TBool isOldMsgPending(EFalse);
-                // checking if previously chat/msgs were existing
-                if( TVIMPSTEnums::ESVCERegistered == iLoginState && aContact->UserId().Length() )
-                    {
-
-                    if( IsConversationExistL( aContact->UserId() ) )
-                        {
-                        isOldConversationExists = ETrue;
-                        }
-                    if( IsUnreadMessageExistsL( aContact->UserId() ) )
-                        {
-                        isOldMsgPending = ETrue;
-                        }
-                   }
-                TRACE( "contact removed in item array of index = %d",aContactIndex );
-                iItemArray.Remove(aContactIndex );
-                delete oldItem;
-                iItemArray.Compress();
-                
-                // restoring if previously chat/msgs were existing
-                if( TVIMPSTEnums::ESVCERegistered == iLoginState && aContact->UserId().Length() )
-                    {
-                    if( isOldConversationExists )
-                        {
-                        newItem->SetConversationOpen(ETrue);
-                        }
-                    if( isOldMsgPending )
-                        {
-                        newItem->SetMsgPending(ETrue);
-                        }
-                    }
-                // Add it in the new index
-                newIndex = newIndex + 1 + iUnKnownContactArray.Count()+ iAddRequestArray.Count();
-                if (newIndex >= iItemArray.Count())
-                    {                   
-                    TRACE( "append contact item = %d", newIndex);
-                    iItemArray.Append (newItem);
-                    }
-                else
-                    {                    
-                    TRACE( "Insert at index = %d", newItem);
-                    iItemArray.Insert (newItem, newIndex);
-                    }   
-                }
-            if(iProcessObservers )
-                {
-                iProcessObservers->HandleAdditionL(TVIMPSTEnums::EContactItem, KErrNotFound );
-                }
-            
-            break;
-            }
-        case TVIMPSTEnums::EStorageEventOwnUserChanged:
-            {
-            TRACE( "EStorageEventOwnUserChanged " );
-            TRACE( " start Event = %d",aEventType );
-            ResetArray();
-            if(iProcessObservers )
-                {
-                iProcessObservers->HandleDeletionL(TVIMPSTEnums::EOwnStatusItem, 0 ); // focus own item
-
-                if( aContact )
-                    {
-                    iProcessObservers->HandleAvatarChangeL( aContact->UserId() );
-                    }
-                }
-            
-
-            break;
-            }
-        case TVIMPSTEnums::EStorageAllContactRemoved:
-            {           
-            TRACE("EStorageAllContactRemoved");
-            TRACE( "EStorageAllContactRemoved count = %d", iItemArray.Count() );
-            ResetArray();
-            if(iProcessObservers )
-                {
-                iProcessObservers->HandleDeletionL(TVIMPSTEnums::EOwnStatusItem, 0 ); // focus own item
-                }
-          
-            break;
-            }
-        case TVIMPSTEnums::EStorageEventContactChange: 
-	        {
-	        TRACE("EStorageEventContactChange");	        
-	        // display name is changed ,might be contact is re-arranged
-            TRACE( "contactindex = %d",aContactIndex );
-            TRACE( "itemarraycount = %d",iItemArray.Count() );
-            if( aContactIndex < iItemArray.Count() )
-                {
-                if ( aContact )
-                     {
-                    CVIMPSTProcessContactItem* newItem = CVIMPSTProcessContactItem::NewL(*this, const_cast<TDesC&>(aContact->Name() ),
-                            const_cast<TDesC&>(aContact->UserId() ),
-                            aContact->ContactLink(),
-                            const_cast<TDesC&>(aContact->StatusText()),
-                            aContact->OnlineStatus() );
-                    
-                    
-                    MVIMPSTProcessArrayItem* oldItem = iItemArray[ aContactIndex ];
-                    newItem->SetAvatarIndex(aContact->AvatarIndex()); // copy the avatar index too.
-                TRACE("contact removed in item array of index = %d",aContactIndex );
-                    // set the conversation open flag from old contact, as only the display name would have changed.
-                    newItem->SetConversationOpen(oldItem->IsConversationOpen());
-                    newItem->SetMsgPending( oldItem->IsMsgPending() );
-                    iItemArray.Remove(aContactIndex );
-                    delete oldItem;
-                    iItemArray.Compress();
-                TRACE( "Insert at index = %d", aContactIndex);
-                    TInt newIndex = iContactListModel->IndexOfContact( aContact );
-                     // Add it in the new index
-                    newIndex = newIndex + 1 + iUnKnownContactArray.Count() + iAddRequestArray.Count();
-                    if (newIndex >= iItemArray.Count())
-                        {
-                    TRACE("append contact item = %d", newIndex);
-                        iItemArray.Append (newItem);
-                        }
-                    else
-                        {
-                    TRACE( "Insert at index = %d", newItem);
-                        iItemArray.Insert(newItem, newIndex);
-                        } 
-                    // inform the cv about the display name changes
-                    if(aContact && aContact->UserId().Length() && newItem->IsConversationOpen())
-                        {
-                    TRACE("EStorageEventContactChange ");
-                        TApaTaskList taskList( CCoeEnv::Static()->WsSession() );
-                        TApaTask task( taskList.FindApp( KConversationViewAppUid ) );
-                    
-                        if ( task.Exists() )
-                            {
-                        TRACE("EStorageEventContactChange - task exists");                       
-                            // packing of data ,passed to conversation view
-                            TPckgBuf< TIMCVUiParams > params;
-                            params().iBuddyId = aContact->UserId();
-                            params().iBuddyName = aContact->Name();
-                            params().iServiceId = iServiceId;
-                            params().iUpdate = ETrue;
-                            task.SendMessage( 
-                                    TUid::Uid( KUidApaMessageSwitchOpenFileValue ), params );
-                            }
-                        }
-                    } 
-                
-              }
-            if(iProcessObservers )
-                {
-                iProcessObservers->HandleAdditionL(TVIMPSTEnums::EContactItem, aContactIndex );
-                }           
-	        break;	
-	        }          
-        case TVIMPSTEnums::EStorageEventUserIdPostChange:
-            {
-            TRACE( "EStorageEventUserIdPostChange" );
-            TRACE( "contactindex = %d",aContactIndex );
-            TRACE( "itemarraycount = %d",iItemArray.Count() );
-            if( aContactIndex < iItemArray.Count() )
-                {
-                CVIMPSTProcessContactItem* newItem = CVIMPSTProcessContactItem::NewL(*this, const_cast<TDesC&>(aContact->Name() ),
-                        const_cast<TDesC&>(aContact->UserId() ),
-                        aContact->ContactLink(),
-                        const_cast<TDesC&>(aContact->StatusText()),
-                        aContact->OnlineStatus() );
-                
-                
-                MVIMPSTProcessArrayItem* oldItem = iItemArray[ aContactIndex ];
-                newItem->SetAvatarIndex(aContact->AvatarIndex()); // copy the avatar index too.
-                TRACE( "contact removed in item array of index = %d",aContactIndex );
-                iItemArray.Remove(aContactIndex );
-                delete oldItem;
-                iItemArray.Compress();
-                TRACE( "Insert at index = %d", aContactIndex);
-                iItemArray.InsertL (newItem, aContactIndex);
-                }
-            if(iProcessObservers )
-                {
-                iProcessObservers->HandleAdditionL(TVIMPSTEnums::EContactItem, aContactIndex );
-                }
-            TRACE( "EStorageEventUserIdPostChange" );
-            break;
-            }
-        default:
-            {
-            TRACE("default");          
-            break;
-            }
-        }
-    
-    }
-
-// --------------------------------------------------------------------------
-// CVIMPSTProcessArray::AddObserver
-// --------------------------------------------------------------------------
-//
-void CVIMPSTProcessArray::AddObserver( MVIMPSTProcessArrayObserver* aObserver ) 
-    {
-    iProcessObservers = aObserver;
-    }
-// --------------------------------------------------------------------------
-// CVIMPSTProcessArray::RemoveObserver
-// --------------------------------------------------------------------------
-//
-void CVIMPSTProcessArray::RemoveObserver( ) 
-    {
-    iProcessObservers = NULL;
-    }
-
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::GetItemNameTextL
-// -----------------------------------------------------------------------------
-
-TPtrC CVIMPSTProcessArray::GetItemNameText(TInt aIndex)
-    {
-    TVIMPSTEnums::TItem itemtype = GetType( aIndex );
-	MVIMPSTProcessArrayItem* arrayItem = NULL;
-    /* Codescanner warning is ignored, since Bound check is done 
-     * inside the GetType()
-     * method*/
-    switch(itemtype)
-        {
-        case TVIMPSTEnums::EOwnStatusItem:
-            {
-            MVIMPSTProcessArrayItem *arrayItem = (MVIMPSTProcessArrayItem *)iItemArray[aIndex];
-            return arrayItem->GetItemUserId(); // no name for own user	
-            }
-        case TVIMPSTEnums::EContactListItem:
-        case TVIMPSTEnums::EContactItem:
-            { 
-            arrayItem = (MVIMPSTProcessArrayItem *)iItemArray[aIndex];
-           	break;	
-            }
-        case TVIMPSTEnums::EFriendRequestItem:
-            {
-            arrayItem = (MVIMPSTProcessArrayItem *)iItemArray[aIndex];
-            break;
-            }
-       case TVIMPSTEnums::EUnknonContactItem:
-           {
-           arrayItem = (MVIMPSTProcessArrayItem *)iItemArray[aIndex];
-           break;
-           }
-        case TVIMPSTEnums::EInvalid:
-        default:
-            {
-            break;
-            }
-        }
-	if( arrayItem )
-		{
-		return arrayItem->GetItemNameText();	
-		}
-	return KNullDesC();
-    }
-
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::GetItemUserId
-// -----------------------------------------------------------------------------
-
-TPtrC CVIMPSTProcessArray::GetItemUserId(TInt aIndex)
-    {
-    TVIMPSTEnums::TItem itemtype = GetType( aIndex );
-
-    /* Codescanner warning is ignored, since Bound check is done 
-     * inside the GetType()
-     * method*/
-    switch(itemtype)    
-        {
-        case TVIMPSTEnums::EContactItem:
-        case TVIMPSTEnums::EFriendRequestItem:
-        case TVIMPSTEnums::EUnknonContactItem:
-        case TVIMPSTEnums::EOwnStatusItem:
-            {
-            MVIMPSTProcessArrayItem *arrayItem = (MVIMPSTProcessArrayItem *)iItemArray[aIndex];
-            return arrayItem->GetItemUserId(); // no name for own user	
-            }
-        default:
-            {
-            return KNullDesC(); 
-            }
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::ContactLink
-// -----------------------------------------------------------------------------
-
-MVPbkContactLink* CVIMPSTProcessArray::ContactLink(TInt aIndex)
-    {
-    TVIMPSTEnums::TItem itemtype = GetType( aIndex );
-
-    /* Codescanner warning is ignored, since Bound check is done 
-     * inside the GetType()
-     * method*/
-    switch(itemtype)
-        {
-        case TVIMPSTEnums::EOwnStatusItem:
-            {
-            return NULL;	
-            }
-        case TVIMPSTEnums::EContactListItem:
-        case TVIMPSTEnums::EContactItem:
-            { 	
-            MVIMPSTProcessArrayItem *arrayItem = (MVIMPSTProcessArrayItem *)iItemArray[aIndex];
-            return arrayItem->ContactLink();	
-            }
-        case TVIMPSTEnums::EInvalid:
-        default:
-            {
-            }
-        }
-    return NULL;
-    }
-
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::Count
-// -----------------------------------------------------------------------------
-
-TInt CVIMPSTProcessArray::Count() const
-	{
-	// return the total count here.
-	return iItemArray.Count() ;
-	}
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::IsSubServiceSupportedL
-// -----------------------------------------------------------------------------
-
-TBool CVIMPSTProcessArray::IsSubServiceSupportedL(TVIMPSTEnums::SubServiceType aType ) const
-	{
-	return iEngine.IsSubServiceSupportedL(aType );
-	}
-
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::IsIMSupported
-// -----------------------------------------------------------------------------
-TBool CVIMPSTProcessArray::IsIMSupported()
-    {
-    return iIMSupported;
-    }
-
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::IsPresenceSupported
-// -----------------------------------------------------------------------------
-TBool CVIMPSTProcessArray::IsPresenceSupported()
-    {
-    return iPresenceSupported;
-    }
-
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::GetType
-// Get the type from engine and return the type
-// -----------------------------------------------------------------------------
-
-TVIMPSTEnums::TItem CVIMPSTProcessArray::GetType(TInt aIndex) const
-	{
-	TInt itemArrayCount = iItemArray.Count();
-	if(itemArrayCount <=0 || (aIndex < 0 || aIndex >= itemArrayCount) )
-	    {
-	    return TVIMPSTEnums::EInvalid;
-	    }
-
-	else if(itemArrayCount>0)
-	    {
-	    TInt index = aIndex <= 0 ? 0 : aIndex;
-	    MVIMPSTProcessArrayItem* item = iItemArray[ index ];	
-	    return item->Type();
-	    }
-	else
-	    {
-	    return TVIMPSTEnums::EInvalid;
-	    }	
-	}
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::FillItemL
-// Fill up the complete array one item at a time
-// -----------------------------------------------------------------------------
-
-void CVIMPSTProcessArray::FillItemL()
-    {
-    TRACER_AUTO;
-    TInt count = 0;
-    if(iContactListModel)
-        {
-        count = iContactListModel->Count();
-        }
-
-    // the index is starting from 1, because we already added owndata item to the list.......
-    for ( TInt index = 0; index < count ; index++)
-        {
-        // fetch the item and process correct type
-        MVIMPSTStorageItemModel::SItem item = iContactListModel->Item( index );
-        switch( item.iType )
-            {
-            case MVIMPSTStorageItemModel::EContactList:
-                break;
-            case MVIMPSTStorageItemModel::EContactItem:
-                {
-                // contact item
-                // add this items to contact item -- CONTACT 
-                // create an object of this type and append this to the rpointerarray
-                MVIMPSTStorageContact* contact = item.iContact;							   
-                TPtrC userId = contact->UserId();
-                CVIMPSTProcessContactItem* contactItem = 
-                CVIMPSTProcessContactItem::NewL(*this, contact->Name(),
-                								userId ,
-                        						contact->ContactLink(),
-                        			            const_cast<TDesC&>(contact->StatusText()),
-                        			            contact->OnlineStatus() );
-                
-                contactItem->SetAvatarIndex(contact->AvatarIndex());
-                
-                TInt otherCount = 1 + iUnKnownContactArray.Count() + iAddRequestArray.Count();
-                contactItem->SetItemIndex(index + otherCount );
-                //append this to the array
-                iItemArray.AppendL(contactItem);
-                if( TVIMPSTEnums::ESVCERegistered == iLoginState && userId.Length() )
-                    {
-                    if( IsUnreadMessageExistsL( userId ) )
-                        {
-                        contactItem->SetMsgPending(ETrue);
-                        }
-                    if( IsConversationExistL( userId ) )
-                        {
-                        contactItem->SetConversationOpen(ETrue);
-                        }
-                    }
-                break;
-                }
-            default:
-                {
-                // the call shouldn't be here
-                break;
-                }
-            }
-        }
-
-    }
-
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::FillOwnDataL
-// FillOwnDataL implementation
-// -----------------------------------------------------------------------------
-// fill the owndata at the begining of array.....
-TBool CVIMPSTProcessArray::FillOwnDataL()
-    {
-    TRACER_AUTO;
-    TBool ownDataAdded = EFalse;
-    TPtr dataPtr = iData->Des();    
-    // Check whether the user has logged in before, if has
-    // then dont update anything just return   
-    //check if its logged in or not.
-    // 1. if not logged in append 
-    switch(iLoginState)
-        {
-        case TVIMPSTEnums::ESVCERegistered:
-            {
-            TPtrC userId = iContactInterface->OwnContactL().UserId();
-            dataPtr.Copy(userId);
-            break;
-            }
-        case TVIMPSTEnums::ESVCENetworkConnecting:
-            {
-            HBufC* tempStr = VIMPSTUtils::LoadResourceL( R_QTN_SERVTAB_LOGGING_LIST_ITEM );
-            if(tempStr)
-                {
-                dataPtr.Copy(*tempStr);     
-                delete tempStr; 
-                }
-
-            break;
-            }
-        case TVIMPSTEnums::ESVCEUpdatingContacts:
-            {
-            HBufC* tempStr = VIMPSTUtils::LoadResourceL( R_QTN_SERVTAB_UPDATING_LIST_ITEM );
-            if(tempStr)
-                {
-                dataPtr.Copy(*tempStr);     
-                delete tempStr; 
-                }
-
-            break;
-            }
-        case TVIMPSTEnums::ESVCEWaitingForNetwork:
-            {
-            HBufC* tempStr = VIMPSTUtils::LoadResourceL( R_QTN_SERVTAB_WAITING_LIST_ITEM );
-            if(tempStr)
-                {
-                dataPtr.Copy(*tempStr);     
-                delete tempStr; 
-                }
-			break;	
-            }
-        case TVIMPSTEnums::ESVCENetworkDisConnecting:
-            {
-            HBufC* tempStr = NULL;
-            if ( iEngine.IsSubServiceSupportedL(TVIMPSTEnums::EPresence) ) 
-                {
-                // if presence enabled use double line listbox string
-                tempStr= VIMPSTUtils::LoadResourceL( R_QTN_SERVTAB_LOGGINGOUT_LIST_ITEM );
-                }
-            else
-                { 
-                // if  presence is not enabled use  single line listbox string
-                tempStr= VIMPSTUtils::LoadResourceL( R_QTN_SERVTAB_SINGLE_LINE_LOGGINGOUT_LIST_ITEM );
-                }
-
-            if(tempStr)
-                {
-                dataPtr.Copy(*tempStr);     
-                delete tempStr;
-                }			
-
-            break;
-            }
-        case TVIMPSTEnums::ESVCENotRegistered:
-        default:
-            {
-            HBufC* str = NULL;
-            if ( iEngine.SubService( TVIMPSTEnums::EPresence) ) 
-                {
-                // if presence enabled use double line listbox string
-                str = VIMPSTUtils::LoadResourceL( R_QTN_SERVTAB_LOGIN_LIST_ITEM );
-                }
-            else
-                { 
-                // if  presence is not enabled use  single line listbox string
-                // get  the username from settings
-                TPtrC ownUserId = iContactInterface->OwnContactL().UserId();
-                if ( ownUserId.Length() )
-                    { 
-                    // if username is available then show with login item
-                    // remove domain part and give it to resource laoder
-                    str= VIMPSTUtils::LoadResourceL( R_QTN_SERVTAB_SINGLE_LINE_LOGIN_LIST_ITEM_WITH_USERNAME , VIMPSTUtils::DisplayId( ownUserId ) );
-                    }
-                else
-                    {
-                    // this condition occures when there is allocated memory for username with NO data (length =0 )
-                    // just make sure "no memory leak" without depending on the Function  LoginUserNameFromSettingsL()
-                    // since that would return the allocated memory without Data (length=0 ) 
-                    // just show login item since no username is available in the settings
-                    str= VIMPSTUtils::LoadResourceL( R_QTN_SERVTAB_SINGLE_LINE_LOGIN_LIST_ITEM );
-                    }
-                }
-            if( str )
-                {
-                dataPtr.Copy(*str);		
-                delete str;		
-                }
-            break;
-            }
-        }
-    if( iItemArray.Count() )
-	    {
-	    // own item is already exist delete it before adding a fresh one
-	    MVIMPSTProcessArrayItem* arrayItem = iItemArray[ 0 ]; // should be own data
-	    if( arrayItem->Type() == TVIMPSTEnums::EOwnStatusItem )
-		    {
-	    	iItemArray.Remove(0);   //iItemArray takes ownership of owndataItem, do not delete here
-	    	delete arrayItem;
-	    	iItemArray.Compress();
-	    	}
-	    }
-    //common code for all the above cases to update the owndata item to list at index 0
-    CVIMPSTProcessOwnDataItem* owndataItem = CVIMPSTProcessOwnDataItem::NewL(*this, *iData);
-    owndataItem->SetItemIndex(0);
-    //append this to the array
-    iItemArray.InsertL( owndataItem,0 );   //iItemArray takes ownership of owndataItem, do not delete here
-    iContactListIndex = 0;
-    ownDataAdded = ETrue;     
-    return ownDataAdded;
-    }
-
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::FillArrayL
-// -----------------------------------------------------------------------------
-
-void CVIMPSTProcessArray::FillArrayL()
-    {
-    if(FillOwnDataL() )
-        {
-        // then fill the conversations..or open chats....	
-        }
-    else
-        {
-        iContactListIndex = 0; // we have not added any thing to main array..so index is zero...
-        }
-    FillUnknownContactsL(); //will fill all unknown contact from iUnknownContactArray to iItemArray.
-    FillAddRequestDataL();//will fill all requests from iAddRequestArray to iItemArray.
-    FillItemL();   
-    }
-
-
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::ResetArray
-// -----------------------------------------------------------------------------
-
-void CVIMPSTProcessArray::ResetArray()
-    {
-    RemoveUnKnownContacts(); //will remove all the unknown contacts from iItemArray.
-    RemoveAddRequestData();//will remove all the requests from iItemArray.
-    iItemArray.ResetAndDestroy();
-    TRAPD( err, FillArrayL());
-    if ( err != KErrNone )
-        {
-        CActiveScheduler::Current()->Error( err );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::SetLoginState
-// -----------------------------------------------------------------------------
-
-void CVIMPSTProcessArray::SetLoginStateL(TVIMPSTEnums::TVIMPSTRegistrationState aLoginState)
-    {
-    TRACER_AUTO;
-    iLoginState = aLoginState;
-    if(aLoginState != TVIMPSTEnums::ESVCERegistered )
-        {
-        iFetchCompleted = EFalse;
-        RemoveUnKnownContacts();
-        RemoveAddRequestData();
-        iUnKnownContactArray.ResetAndDestroy();// delete all items
-        iUnKnownContactArray.Reset();
-        iAddRequestArray.ResetAndDestroy();// delete all items
-        iAddRequestArray.Reset();
-        
-        // Reset contact list array (append the contacts to contact list array 
-        // by getting from contactlist model) before contacts update.  
-        if(aLoginState == TVIMPSTEnums::ESVCENotRegistered )
-        	{
-			ResetArray();
-        	}
-        
-        // reset the status of all the contacts.
-        // no need to check the item type here. by the time its here all the other 
-        // type except contact item are removed.
-        TInt count = iItemArray.Count();
-        for(TInt i = 0; i < count ; i++)
-            {
-             iItemArray[i]->DoFormatStringL();
-            }
-        }
-    FillOwnDataL(); // this will change the own item based on connection status
-    }
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::GetLoginState
-// -----------------------------------------------------------------------------
-
-TVIMPSTEnums::TVIMPSTRegistrationState CVIMPSTProcessArray::GetLoginState()
-    {
-    return iLoginState;
-    }
-
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::GetOnlineStatus
-// -----------------------------------------------------------------------------
-
-TVIMPSTEnums::TOnlineStatus CVIMPSTProcessArray::GetOnlineStatusL(TInt aIndex)
-    {
-    TRACER_AUTO;
-    TVIMPSTEnums::TItem itemtype = GetType( aIndex );
-    TVIMPSTEnums::TOnlineStatus status = TVIMPSTEnums::EUnknown;
-    switch(itemtype)
-        {
-        case TVIMPSTEnums::EOwnStatusItem:
-            {
-            if( iContactInterface )
-	            {
-                 status = iContactInterface->OwnContactL().OnlineStatus();
-	            }
-            break;
-            }
-        case TVIMPSTEnums::EContactItem:
-            { 
-
-            status = iItemArray[aIndex]->OnlineStatus();
-            break;
-            }
-        case TVIMPSTEnums::EInvalid:
-        default:
-            {
-            break;
-            }
-        }
-    return status;
-    }
-//-----------------------------------------------------------
-//CVIMPSTProcessArray::StatusText
-//-----------------------------------------------------------
-// 
-const TDesC&  CVIMPSTProcessArray::StatusTextL(TInt aIndex ) 
-    {
-    TRACER_AUTO;
-    TVIMPSTEnums::TItem itemtype = GetType( aIndex );
-    switch(itemtype)
-        {
-        case TVIMPSTEnums::EOwnStatusItem:
-            {
-            if( iContactInterface )
-	            {
-	            return iContactInterface->OwnContactL().StatusText();	
-	            }
-            break;
-            }
-        case TVIMPSTEnums::EContactItem:
-            { 
-            return iItemArray[aIndex]->StatusText();
-            }
-        case TVIMPSTEnums::EInvalid:
-        default:
-            {
-            break;
-            }
-        }
-    return KNullDesC;
-    }
-//-----------------------------------------------------------
-//CVIMPSTProcessArray::RemoveFromUnknonOrInvitationListL
-//-----------------------------------------------------------
-//
-TBool CVIMPSTProcessArray::RemoveFromUnknonOrInvitationListL( const TDesC& aAddedUserId ,TBool aBlocked )
-    {
-    TRACER_AUTO;
-    TBool found = RemoveFromUnknonListL( aAddedUserId );
-    if( !found )
-        {
-        found = RemoveFromInvitationListL( aAddedUserId );
-        }
-    //Get IM SubService  
-    if( aBlocked && found && aAddedUserId.Length() )
-        {
-        MVIMPSTEngineSubService* subService =         
-        (iEngine.SubService(TVIMPSTEnums::EIM));
-
-        if(subService )
-            {
-            MVIMPSTEngineIMSubService& imSubService = 
-            MVIMPSTEngineIMSubService::Cast (*subService);
-            imSubService.CloseConversationL( aAddedUserId );
-            }
-        }
-    return found;
-    }
-//-----------------------------------------------------------
-//CVIMPSTProcessArray::RemoveFromUnknonListL
-//-----------------------------------------------------------
-//
-TBool CVIMPSTProcessArray::RemoveFromUnknonListL( const TDesC& aAddedUserId )
-    {
-   
-    TRACER_AUTO;
-    TPtrC addedUserId = VIMPSTUtils::DisplayId( aAddedUserId );
-    TBool found = EFalse;
-    TInt count = iUnKnownContactArray.Count();
-    CVIMPSTProcessUnknownContactItem* unknownItem = NULL;
-    TInt index = KErrNotFound;
-    TInt itemIndex = KErrNotFound;
-    // check in unknon array
-    for(index = 0 ; index < count ; index++)
-        {
-        unknownItem = iUnKnownContactArray[index];
-        TPtrC contactId = VIMPSTUtils::DisplayId( unknownItem->GetItemUserId() );
-        if( addedUserId.Compare(  contactId ) == 0 )
-            {
-            itemIndex = iItemArray.Find(unknownItem);
-            if( itemIndex > -1 )
-                {
-                found = ETrue;
-                }
-            break;
-            }
-       
-        }
-    if( found )
-        {
-        iItemArray.Remove(itemIndex);
-        iUnKnownContactArray.Remove( index );
-        delete unknownItem;
-        unknownItem = NULL;
-        iItemArray.Compress();
-        iUnKnownContactArray.Compress();
-        if( iProcessObservers )
-            {
-            // this is to refresh the list box
-            // KErrNotFound , focus remain at same position
-            iProcessObservers->HandleDeletionL(TVIMPSTEnums::EUnknonContactItem, KErrNotFound );
-            }
-        }
-  
-    return found;
-    }
-//-----------------------------------------------------------
-//CVIMPSTProcessArray::RemoveFromInvitationListL
-//-----------------------------------------------------------
-//
-TBool CVIMPSTProcessArray::RemoveFromInvitationListL( const TDesC& aAddedUserId )
-    {
-    TRACER_AUTO;
-    TPtrC addedUserId = VIMPSTUtils::DisplayId( aAddedUserId );
-    TBool found = EFalse;
-    TInt index = KErrNotFound;
-    TInt itemIndex = KErrNotFound;
-    // item not foun in unknown list
-    // check in invitation item array
-    TInt count = iAddRequestArray.Count();
-    CVIMPSTProcessFriendRequestItem* requestItem = NULL;
-    for(index = 0 ; index < count ; index++)
-        {
-        requestItem = iAddRequestArray[index];
-        TPtrC contactId = VIMPSTUtils::DisplayId( requestItem->GetItemUserId() );
-        if( addedUserId.Compare( contactId ) == 0 )
-            {
-            itemIndex = iItemArray.Find(requestItem);
-            if( itemIndex > -1 )
-                {
-                found = ETrue;
-                }
-            break;
-            }
-        }
-    if( found )
-        {
-        iItemArray.Remove(itemIndex);
-        iAddRequestArray.Remove( index );
-        delete requestItem;
-        requestItem = NULL;
-        iItemArray.Compress();
-        iAddRequestArray.Compress();
-        if( iProcessObservers )
-            {
-            // this is to refresh the list box
-            // KErrNotFound , focus remain at same position
-            iProcessObservers->HandleDeletionL(TVIMPSTEnums::EFriendRequestItem, KErrNotFound );
-            }
-        }
-    return found;
-    }
-//-----------------------------------------------------------
-//CVIMPSTProcessArray::MapContactListPositions
-//-----------------------------------------------------------
-//
-void CVIMPSTProcessArray::MapContactListPositions(RArray<TInt>& aPos )
-    {
-    // add conversation also this list ..and return..
-    RArray<TInt> listPos; 
-
-    //	iContactListModel->MapContactListPositions(listPos);
-    TInt positionIndex = 0;
-    // if count is more than 0..fill the maparray...
-    if(iItemArray.Count()  + iContactListIndex > 0) 
-        {
-
-        TInt count = listPos.Count();
-
-        for(TInt posIndex = 0; posIndex < count; posIndex++, positionIndex++)
-            {
-            aPos.Append( listPos[posIndex] + iContactListIndex );
-            }
-        }
-    listPos.Close();	
-    }
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::GetAndCreateOpenChatListL
-// return contact index including friend request.
-// -----------------------------------------------------------------------------
-void CVIMPSTProcessArray::GetAndCreateOpenChatListL() 
-    {
-    TRACER_AUTO;
-    //Get IM SubService     
-    MVIMPSTEngineSubService* subService =         
-                (iEngine.SubService(TVIMPSTEnums::EIM));
-    RArray<SIMCacheChatItem> openChats;
-    openChats.Reset();
-    if(subService)
-        {
-        MVIMPSTEngineIMSubService& imSubService = 
-            MVIMPSTEngineIMSubService::Cast (*subService);
-        openChats = imSubService.GetOpenChatListL();
-        }
-    while( openChats.Count() )
-        {
-        SIMCacheChatItem chat = openChats[ 0 ]; // first item 
-        TPtrC contactId = *chat.iBuddyId;
-        MVIMPSTProcessArrayItem* arrayItem = FindArrayItem( contactId );
-        TBool msgPending = EFalse;
-        if( contactId.Length() )
-            {
-            if( IsUnreadMessageExistsL( contactId ) )
-                {
-                msgPending = ETrue;
-                }
-            }
-        if( arrayItem )
-            {
-            arrayItem->SetConversationOpen( ETrue );
-            arrayItem->SetMsgPending( msgPending );
-            }
-        else
-            {
-            // not in buddy List
-            DoHandleUnKnownContactMessageL( contactId ,msgPending );
-            }
-        openChats.Remove( 0 );
-        delete chat.iBuddyId;
-        chat.iBuddyId = NULL;
-        openChats.Compress();
-        }
-    }
-//-----------------------------------------------------------
-//CVIMPSTProcessArray::FindArrayItem
-//-----------------------------------------------------------
-// 
-MVIMPSTProcessArrayItem* CVIMPSTProcessArray::FindArrayItem( const TDesC& aSenderId )
-    {
-    TPtrC senderId = VIMPSTUtils::DisplayId( aSenderId );
-    MVIMPSTProcessArrayItem* arrayItem = NULL;
-    TInt count = iItemArray.Count();
-    for( TInt i = 1; i < count; i++ )
-        {
-        MVIMPSTProcessArrayItem* contactItem = (MVIMPSTProcessArrayItem *)iItemArray[i];
-        TPtrC contactId = VIMPSTUtils::DisplayId( contactItem->GetItemUserId() );
-        if( senderId.Compare(  contactId ) == 0 )
-            {
-            arrayItem = contactItem;
-            break;
-            }
-        }
-    return arrayItem;
-    }
-//-----------------------------------------------------------
-//CVIMPSTProcessArray::HandleChatMessageEventL
-//-----------------------------------------------------------
-// 
-void CVIMPSTProcessArray::HandleChatMessageEventL( TVIMPSTEnums::TIMEventType aEventType ,
-                                                    const TDesC& aSender )
-    {
-    TRACER_AUTO;
-    if( !iFetchCompleted )
-        {
-        // contact matching will not be correct until fetching completed
-        // hence return 
-        return;
-        }
-    switch( aEventType )
-        {
-        case TVIMPSTEnums::EIMUnreadMessage:
-            {
-            if( FindAndMarkContactAsOpenChat( aSender , ETrue ) )
-                {
-                if(iProcessObservers)
-                    {
-                    iProcessObservers->HandleAdditionL(TVIMPSTEnums::EContactItem, KErrNotFound );
-                    }
-                }
-            else 
-                {
-                DoHandleUnKnownContactMessageL( aSender , ETrue );
-                }
-            break;
-            }
-        case TVIMPSTEnums::EIMUnreadChange:
-            {
-            FindAndMarkContactAsOpenChat( aSender , EFalse ) ;
-            if(iProcessObservers)
-                {
-                iProcessObservers->HandleAdditionL(TVIMPSTEnums::EContactItem,KErrNotFound );
-                }
-            break;
-            }
-        case TVIMPSTEnums::EIMChatStarted:
-            {
-            if( FindAndMarkContactAsOpenChat( aSender , EFalse ) )
-                {
-                if(iProcessObservers)
-                    {
-                    iProcessObservers->HandleAdditionL(TVIMPSTEnums::EContactItem, KErrNotFound );
-                    }
-                }
-            else 
-                {
-                DoHandleUnKnownContactMessageL( aSender, EFalse );
-                }
-            break;
-            }
-        case TVIMPSTEnums::EIMChatClosed:
-            {
-            if( !RemoveFromUnknonListL( aSender ) )
-                {
-                MVIMPSTProcessArrayItem* arrayItem = FindArrayItem( aSender );
-                if( arrayItem )
-                    {
-                    arrayItem->SetConversationOpen( EFalse );
-                    arrayItem->SetMsgPending( EFalse );
-                    }
-                }
-            if(iProcessObservers)
-                {
-                iProcessObservers->HandleAdditionL(TVIMPSTEnums::EContactItem, KErrNotFound );
-                }
-            break;
-            }
-        case TVIMPSTEnums::EIMAllChatClosed:
-            {
-            RemoveUnKnownContacts();
-            iUnKnownContactArray.ResetAndDestroy();// delete all items
-            ResetOpenConversationPendingMsg();
-            if(iProcessObservers)
-                {
-                iProcessObservers->HandleAdditionL(TVIMPSTEnums::EContactItem, KErrNotFound );
-                }
-            break;
-            }
-        case TVIMPSTEnums::EIMRequestCompleted:
-            {
-            if(iProcessObservers)
-                {
-                iProcessObservers->HandleAdditionL(TVIMPSTEnums::EContactItem, KErrNotFound );
-                }
-            break;
-            }
-        default:
-            {
-            // do nothing
-            }
-        }
-    }
-//-----------------------------------------------------------
-//CVIMPSTProcessArray::HandleAddRequestEventL
-//-----------------------------------------------------------
-// 
-void  CVIMPSTProcessArray::HandleAddRequestEventL(TVIMPSTEnums::TOperationType aType, const TDesC& aRequesterId,
-                                                    const TDesC& aRequestorDisplayName )
-    {
-    TRACER_AUTO;
-  	//add new add request item at top of list(i.e at index 1, as 0 is own id).
-    //when request is entertained remove item from list.
-    switch( aType )
-	    {
-		case TVIMPSTEnums::EAddItem :
-			{
-			if( (!FindAnyAddRequest(aRequesterId ) )&& ( !FindAnyContactServiceField( aRequesterId ) ) && !(IsContactBlocked( aRequesterId )) )
-				{
-				CVIMPSTProcessFriendRequestItem* addRequestItem = CVIMPSTProcessFriendRequestItem::NewL(*this, aRequesterId,aRequestorDisplayName);
-				/* Add it as the first Item of IAddRequestARray as its like stack */
-				iAddRequestArray.Insert(addRequestItem,0); 
-				/*
-				*	always the new friend request will be shown in the beginning, so 0th item is own item, 1st item is new friendrequest
-				*	and remaining remains same.. 
-				*/
-				// ownership is in iItemArray
-				TInt invitationIndex = iUnKnownContactArray.Count()+1;
-				iItemArray.Insert(addRequestItem, invitationIndex); 
-				if(iProcessObservers)
-					{
-					iProcessObservers->HandleAdditionL( TVIMPSTEnums::EFriendRequestItem ,KErrNotFound );
-					}
-				}
-			break;
-			}
-		case TVIMPSTEnums::ERemoveItem :
-			{
-			TInt count = iAddRequestArray.Count();
-			CVIMPSTProcessFriendRequestItem* requestItem = NULL;
-			for(TInt i = 0 ; i < count ; i++)
-				{
-				requestItem = iAddRequestArray[i];
-				if( aRequesterId.Compare(requestItem->GetItemUserId()) == 0 )
-					{
-					TInt index = iItemArray.Find(requestItem);
-					if(index != KErrNotFound)
-						{
-						iItemArray.Remove(index);
-						iItemArray.Compress();
-						}
-					iAddRequestArray.Remove(i);        
-					delete requestItem;
-					iAddRequestArray.Compress();
-					break;
-					}        
-				}    
-			if(iProcessObservers)
-				{
-				iProcessObservers->HandleDeletionL(TVIMPSTEnums::EFriendRequestItem, KErrNotFound );
-				}
-			break;
-			} 
-		default :
-			break;
-		}
-    }
-//-----------------------------------------------------------
-//CVIMPSTProcessArray::DoHandleUnKnownContactMessageL
-//-----------------------------------------------------------
-// 
-void CVIMPSTProcessArray::DoHandleUnKnownContactMessageL( const TDesC& aSenderId ,TBool aIsMsgPending )
-    {
-    TRACER_AUTO;
-    TBool contactExist = EFalse ;
-    TInt count = iUnKnownContactArray.Count();
-    CVIMPSTProcessUnknownContactItem* unknownItem = NULL;
-    for( TInt i=0; i<count; i++ )
-        {
-        unknownItem = iUnKnownContactArray[i];
-        if( aSenderId.Compare( unknownItem->GetItemUserId() ) == 0 )
-            {
-            contactExist = ETrue;
-            unknownItem->SetConversationOpen(ETrue);
-            unknownItem->SetMsgPending( aIsMsgPending );
-            break;
-            }
-        }
-    if( !contactExist )
-        {
-        CVIMPSTProcessUnknownContactItem* addItem = CVIMPSTProcessUnknownContactItem::NewL(*this, aSenderId);
-        /* Add it as the first Item of IAddRequestARray as its like stack */
-        iUnKnownContactArray.Insert(addItem,0); 
-        // ownership is in iItemArray
-        iItemArray.Insert(addItem, 1);  // just after own Item
-        addItem->SetMsgPending( aIsMsgPending );
-        addItem->SetConversationOpen(ETrue);
-        }
-    if(iProcessObservers)
-        {
-        iProcessObservers->HandleAdditionL( TVIMPSTEnums::EUnknonContactItem ,KErrNotFound );
-        }
-    }
-//-----------------------------------------------------------
-//CVIMPSTProcessArray::IsMsgPending
-//-----------------------------------------------------------
-// 
-TBool CVIMPSTProcessArray::IsMsgPending(TInt aIndex)
-    {
-    if( aIndex < iItemArray.Count() && aIndex >= 0 )
-        {
-        MVIMPSTProcessArrayItem* item = (MVIMPSTProcessArrayItem *)iItemArray[aIndex];
-        if(item)
-            {   
-            return item->IsMsgPending();
-            }   
-        }
-    return EFalse;
-    }
-
-//-----------------------------------------------------------
-//CVIMPSTProcessArray::IsConversationExist
-//-----------------------------------------------------------
-// 
-TBool CVIMPSTProcessArray::IsConversationExist(TInt aIndex)
-    {
-    if( aIndex < iItemArray.Count() && aIndex >= 0 )
-        {
-        MVIMPSTProcessArrayItem* item = (MVIMPSTProcessArrayItem *)iItemArray[aIndex];
-        if(item)
-            {   
-            return item->IsConversationOpen();
-            }   
-        }
-    return EFalse;
-    }
-
-//-----------------------------------------------------------
-//CVIMPSTProcessArray::ResetPendingMsg
-//-----------------------------------------------------------
-// 
-void CVIMPSTProcessArray::ResetPendingMsg(TInt aIndex)
-    {
-    if( aIndex < iItemArray.Count() && aIndex >= 0 )
-        {
-        MVIMPSTProcessArrayItem* item = (MVIMPSTProcessArrayItem *)iItemArray[aIndex];
-        if(item)
-            {   
-            item->SetMsgPending( EFalse );
-            }   
-        }
-    }
-//-----------------------------------------------------------
-//CVIMPSTProcessArray::ResetOpenConversationPendingMsg
-//-----------------------------------------------------------
-// 
-void CVIMPSTProcessArray::ResetOpenConversationPendingMsg()
-    {
-    for( TInt index  = 0; index < iItemArray.Count() ;index++ )
-        {
-        MVIMPSTProcessArrayItem* item = (MVIMPSTProcessArrayItem *)iItemArray[index];
-        if(item)
-            {   
-            item->SetConversationOpen( EFalse );
-            item->SetMsgPending( EFalse );
-            }   
-        }
-    }
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::FindAnyContact
-// Try to load with given ID, return NULL if not found.
-// -----------------------------------------------------------------------------
-TBool CVIMPSTProcessArray::FindAnyContact( const TDesC& aContactId )
-    {
-    if(aContactId.Length() != 0)
-        {
-        MVIMPSTStorageContact* contact = iContactInterface->FindContactByUserId(aContactId);
-        if( contact )
-            {
-            return ETrue;
-            }
-        }
-    return EFalse;
-    }
-
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::FindAnyContactServiceField
-// Try to load with given ID, return NULL if not found.
-// -----------------------------------------------------------------------------
-TBool CVIMPSTProcessArray::FindAnyContactServiceField( const TDesC& aContactId )
-    {
-    if(aContactId.Length() != 0)
-        {
-        MVIMPSTStorageContact* contact = iContactInterface->FindContactByUserId(aContactId);
-        if( contact )
-            {
-            return ETrue;
-            }
-        }
-    return EFalse;
-    }
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::FindAndMarkContactAsOpenChat
-// Try to load with given ID, return NULL if not found.
-// -----------------------------------------------------------------------------
-TBool CVIMPSTProcessArray::FindAndMarkContactAsOpenChat( const TDesC& aContactId, TBool aMesssagePending )
-    {
-    TPtrC senderId = VIMPSTUtils::DisplayId( aContactId );
-    TBool ret = EFalse;
-    TInt count = iItemArray.Count();
-    for( TInt i = 1; i < count; i++ )
-        {
-        MVIMPSTProcessArrayItem* contactItem = (MVIMPSTProcessArrayItem *)iItemArray[i];
-        TPtrC contactId = VIMPSTUtils::DisplayId( contactItem->GetItemUserId() );
-        if( senderId.Compare(  contactId ) == 0 )
-            {
-            contactItem->SetConversationOpen( ETrue );
-            contactItem->SetMsgPending( aMesssagePending );
-            ret = ETrue;
-            break;
-            }
-        }
-    return ret;
-    }
-//-----------------------------------------------------------------------------
-// CVIMPSTProcessArray::IsUnreadMessageExists
-// ( Other items commented in header )
-//-----------------------------------------------------------------------------    
-TBool CVIMPSTProcessArray::IsUnreadMessageExistsL(const TDesC& aRecipientId) 
-    {
-    TBool ret = EFalse;
-    TInt unreaMsgCount = KErrNone;
-    //Get IM SubService     
-    MVIMPSTEngineSubService* subService =         
-            (iEngine.SubService(TVIMPSTEnums::EIM));
-    if(subService)
-        {
-        MVIMPSTEngineIMSubService& imSubService = 
-        MVIMPSTEngineIMSubService::Cast (*subService);
-        unreaMsgCount = imSubService.GetUnreadCountL( aRecipientId );
-        }
-    if( unreaMsgCount )
-        {
-        ret = ETrue;
-        }
-    return ret; 
-    }
-//-----------------------------------------------------------------------------
-// CVIMPSTProcessArray::IsConversationExistL
-// ( Other items commented in header )
-//-----------------------------------------------------------------------------    
-TBool CVIMPSTProcessArray::IsConversationExistL(const TDesC& aRecipientId) 
-    {
-    //Get IM SubService     
-    MVIMPSTEngineSubService* subService1 =    	   
-                (iEngine.SubService(TVIMPSTEnums::EIM));
-    if(subService1)
-        {
-        MVIMPSTEngineIMSubService& imSubService = 
-                    MVIMPSTEngineIMSubService::Cast (*subService1);
-        return imSubService.IsConversationExistL( aRecipientId );
-        }
-    return EFalse; 
-    }
-//-----------------------------------------------------------------------------
-// CVIMPSTProcessArray::FindContactIndexL
-// ( Other items commented in header )
-//-----------------------------------------------------------------------------    
-TInt CVIMPSTProcessArray::FindContactIndexL( const TDesC& aContactId )
-    {
-    MVIMPSTStorageContact* newContact = iContactInterface->FindContactByUserId( aContactId );
-    if(newContact)
-        {
-        // return the index of contact rather bool value..
-        // 1 is for own data item.
-        return (iContactListIndex + 1 + iContactListModel->IndexOfContact( newContact ));
-        }
-    return KErrNotFound;
-    }
-
-
-//-----------------------------------------------------------------------------
-// CVIMPSTProcessArray::FillUnknownContactsL
-// ( Other items commented in header )
-//------------------------------------------------------------------------------
-void CVIMPSTProcessArray::FillUnknownContactsL()
-    {
-    TInt count = iUnKnownContactArray.Count();
-    /* 
-     * Index = 1 cos 0th index will be OwnData, and 1 - n where n is the number of friend requests, will be friend requests 
-     */
-    TInt index = 1; 
-    for(TInt i = 0 ; i < count ; i++)
-        {
-        // all friend request item ownership is transfered to iItemArray
-        CVIMPSTProcessUnknownContactItem* unknownItem = iUnKnownContactArray[i];
-        unknownItem->SetItemIndex(index);        
-        iItemArray.Insert(unknownItem, index);        
-        index ++;
-        }
-    }
-
-//-----------------------------------------------------------------------------
-// CVIMPSTProcessArray::FillAddRequestDataL
-// ( Other items commented in header )
-//------------------------------------------------------------------------------
-void CVIMPSTProcessArray::FillAddRequestDataL()
-    {
-    TInt count = iAddRequestArray.Count();
-	/* 
-	 * Index = unknowncontacts are tops so after that 1 cos 0th index will be OwnData, and 1 - n where n is the number of friend requests, will be friend requests 
-	 */
-	TInt index = iUnKnownContactArray.Count() +1 ; 
-    for(TInt i = 0 ; i < count ; i++)
-        {
-        // all friend request item ownership is transfered to iItemArray
-        CVIMPSTProcessFriendRequestItem* requestItem = iAddRequestArray[i];
-        requestItem->SetItemIndex(index );        
-        iItemArray.Insert(requestItem, index);        
-		index ++;
-        }
-    }
-
-//-----------------------------------------------------------------------------
-// CVIMPSTProcessArray::RemoveUnKnownContacts
-// ( Other items commented in header )
-//------------------------------------------------------------------------------
-void CVIMPSTProcessArray::RemoveUnKnownContacts()
-    {
-    TInt count = iUnKnownContactArray.Count();
-    for(TInt i = 0 ; i < count ; i++)
-        {
-        CVIMPSTProcessUnknownContactItem* unknownItem = iUnKnownContactArray[i];
-        TInt index = iItemArray.Find(unknownItem);
-        if(index > -1)
-            {            
-            iItemArray.Remove(index);
-            iItemArray.Compress();
-            }       
-        }
-    }
-//-----------------------------------------------------------------------------
-// CVIMPSTProcessArray::RemoveAddRequestData
-// ( Other items commented in header )
-//------------------------------------------------------------------------------
-void CVIMPSTProcessArray::RemoveAddRequestData()
-    {
-    TInt count = iAddRequestArray.Count();
-    for(TInt i = 0 ; i < count ; i++)
-        {
-        CVIMPSTProcessFriendRequestItem* requestItem = iAddRequestArray[i];
-        TInt index = iItemArray.Find(requestItem);
-        if(index > -1)
-            {            
-            iItemArray.Remove(index);
-            iItemArray.Compress();
-            }       
-        }
-    
-    }
-//-----------------------------------------------------------------------------
-// CVIMPSTProcessArray::LoginUserIdFromStoreL
-// ( Other items commented in header )
-//------------------------------------------------------------------------------
-
-const TDesC& CVIMPSTProcessArray::LoginUserIdFromStoreL() const
-    {
-    if( iContactInterface )
-		{
-		// most of the time this get called 
-		return iContactInterface->OwnContactL().UserId();
-		}
-    return KNullDesC;
-    }
-
-//-----------------------------------------------------------------------------
-// CVIMPSTProcessArray::AvatarIndex
-// ( Other items commented in header )
-//------------------------------------------------------------------------------
-
-TInt CVIMPSTProcessArray::AvatarIndex(TInt aContactIndex)
-    {
-    TVIMPSTEnums::TItem itemtype = GetType( aContactIndex );
-    /* Codescanner warning is ignored, since Bound check is done 
-     * inside the GetType()   method*/
-
-    if( TVIMPSTEnums::EContactItem == itemtype )
-        {
-       // if the type is a contact item then return the index
-        MVIMPSTStorageContact* contact = iContactInterface->FindContactByUserId( GetItemUserId(aContactIndex) );
-        if(contact)
-            {
-            // if any contact is found then return the index
-            return contact->AvatarIndex();
-            }
-        }
-    return KErrNone;
-    }
-//-----------------------------------------------------------------------------
-// CVIMPSTProcessArray::SetAvatarIndex
-// ( Other items commented in header )
-//------------------------------------------------------------------------------
-
-void CVIMPSTProcessArray::SetAvatarIndex( TInt aContactIndex ,TInt aAvatarIndex )
-    {
-    TVIMPSTEnums::TItem itemtype = GetType( aContactIndex );
-    if( TVIMPSTEnums::EContactItem == itemtype )
-        {
-        // if the type is a contact item then set the index 
-        MVIMPSTStorageContact* contact = iContactInterface->FindContactByUserId(GetItemUserId(aContactIndex));
-        if(contact)
-            {
-            // if any contact is found then set the index
-            contact->SetAvatarIndex( aAvatarIndex );
-            }           
-            
-        iItemArray[aContactIndex]->SetAvatarIndex(aAvatarIndex);
-        }
-
-    }
-
-//-----------------------------------------------------------------------------
-// CVIMPSTProcessArray::AvatarContent
-// ( Other items commented in header )
-//------------------------------------------------------------------------------
-
-const TDesC8& CVIMPSTProcessArray::AvatarContent(TInt aContactIndex)
-    {   
-    TVIMPSTEnums::TItem itemtype = GetType( aContactIndex );
-
-    if(  itemtype == TVIMPSTEnums::EContactItem )
-        {
-        // if the type is a contact item then get the avatar content from strorage
-        MVIMPSTStorageContact* contact = iContactInterface->FindContactByUserId(GetItemUserId(aContactIndex));
-        if(contact)
-            {
-            // if any contact is found then get the content
-            return contact->AvatarContent();
-            }
-        }
-    return KNullDesC8();
-    }
-//-----------------------------------------------------------------------------
-// CVIMPSTProcessArray::OwnAvatarContentL
-// ( Other items commented in header )
-//------------------------------------------------------------------------------
-
-const TDesC8& CVIMPSTProcessArray::OwnAvatarContentL( ) const
-	{   
-    MVIMPSTStorageContact& contact = iContactInterface->OwnContactL();             
-    // if any contact is found then get the content
-    return contact.AvatarContent();
-	}
-//-----------------------------------------------------------------------------
-// CVIMPSTProcessArray::OwnAvatarIndexL
-// ( Other items commented in header )
-//------------------------------------------------------------------------------
-
-TInt CVIMPSTProcessArray::OwnAvatarIndexL( )
-    {
-    MVIMPSTStorageContact& contact = iContactInterface->OwnContactL();  
-    return contact.AvatarIndex();           
-    }
-//-----------------------------------------------------------------------------
-// CVIMPSTProcessArray::SetOwnAvatarIndexL
-// ( Other items commented in header )
-//------------------------------------------------------------------------------
-
-void CVIMPSTProcessArray::SetOwnAvatarIndexL( TInt aAvatarIndex )
-    {
-    MVIMPSTStorageContact& contact = iContactInterface->OwnContactL();             
-    contact.SetAvatarIndex( aAvatarIndex );
-    }
-
-//-----------------------------------------------------------------------------
-// CVIMPSTProcessArray::FindAnyAddRequest
-// ( Other items commented in header )
-//------------------------------------------------------------------------------
-
-TInt CVIMPSTProcessArray::FindAnyAddRequest( const TDesC& aRequesterId )
-    {
-    TInt count = iAddRequestArray.Count();
-    for(TInt i=0; i<count; i++)
-        {   
-        if((aRequesterId.Compare(iAddRequestArray[i]->GetItemUserId()))==0 )                
-            {
-            return ETrue;
-            }
-        }
-    return EFalse;
-    }
-
-// -----------------------------------------------------------------------------
-// CVIMPSTProcessArray::GetSelectedItemIndex
-// return contact index including friend request.
-// -----------------------------------------------------------------------------
-TInt CVIMPSTProcessArray::GetSelectedItemIndex(const TDesC& aContactId) 
-	{
-	TInt itemArrayCount = iItemArray.Count();
-	for(TInt index=0; index<itemArrayCount; index++)
-		{
-		MVIMPSTProcessArrayItem* item = iItemArray[ index ];
-		if(0 == aContactId.Compare(item->GetItemUserId()))
-		    {
-		    return index; 
-		    }
-		}
-	return KErrNotFound;
-	}
-
-// --------------------------------------------------------------------------
-// CVIMPSTProcessArray::IsContactBlocked
-// --------------------------------------------------------------------------
-TBool CVIMPSTProcessArray::IsContactBlocked(const TDesC& aUserId)
-    {
-    MVIMPSTEngineSubService* subService =          
-                        (iEngine.SubService(TVIMPSTEnums::EPresence));
-    if(subService)
-        {
-        MVIMPSTEnginePresenceSubService& presence = 
-                MVIMPSTEnginePresenceSubService::Cast (*subService);
-                
-        RPointerArray<HBufC> *blockedlist = presence .GetBlockedList();
-        
-        if(blockedlist)
-            {
-            for(TInt i=0; i<blockedlist->Count(); ++i)
-                {
-                if(0 == aUserId.CompareC((*blockedlist)[i]->Des()))
-                    {
-                    return ETrue;
-                    }
-                }
-            }
-        }
-    return EFalse;  
-    }       
-
-
-// --------------------------------------------------------------------------
-// CVIMPSTProcessArray::GetFormattedString
-// --------------------------------------------------------------------------
-TPtrC16 CVIMPSTProcessArray::GetFormattedString(TInt aIndex)
-    {
-    if((aIndex >= 0) && (aIndex< iItemArray.Count()))
-        return iItemArray[aIndex]->FormattedItemString();
-    else
-        return KNullDesC();
-    }
-
-//END OF FILE