diff -r 000000000000 -r 5e5d6b214f4f uiservicetab/vimpststorage/src/cvimpststorageserviceview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiservicetab/vimpststorage/src/cvimpststorageserviceview.cpp Tue Feb 02 10:12:18 2010 +0200 @@ -0,0 +1,1281 @@ +/* +* 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: Storage service view implementation +* +*/ + + +// INCLUDE FILES +#include "cvimpststorageserviceview.h" + +#include "cvimpststoragecontactlist.h" +#include "cvimpststoragecontact.h" +#include "mvimpststoragevpbkcontactstore.h" +#include "cvimpststoragevpbkserverstore.h" +#include "cvimpststoragevpbklocalstore.h" +#include "cvimpststoragecontactsorter.h" +#include "cvimpststorageactivehandler.h" +#include "mvimpststoragecontactsobserver.h" +#include "vimpststorageutils.h" + +#include +#include +#include +#include "vimpstdebugtrace.h" +#include "tvimpstconsts.h" +#include "mvimpststoragecontact.h" + + +// ============================ MEMBER FUNCTIONS =============================== + + +// panic handler +GLDEF_C void Panic( TVIMPSTStoragePanics aPanic ) + { + User::Panic( KPanicCategory, aPanic ); + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::CVIMPSTStorageServiceView +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVIMPSTStorageServiceView::CVIMPSTStorageServiceView(TUint32 aServiceId) : + iServiceId(aServiceId), + iOwnContact( NULL ), + iUnNamedText( NULL ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::CVIMPSTStorageServiceView()") ); + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::ConstructL +// Symbian 2nd phase constructor can leave. +// The constructor also does synchronizing with Phone Book by removing the +// deleted elements from the persistent storage +// ----------------------------------------------------------------------------- +// +void CVIMPSTStorageServiceView::ConstructL(const TDesC& aStoreName, const TDesC& aServiceName) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::ConstructL() begin") ); + + iActiveHandler = CVIMPSTStorageActiveHandler::NewL(this); + + // create sorter for contacts + iContactSorter = CVIMPSTStorageContactSorter::NewL(); + + //set the sorting algorithem to order by presence. + iContactSorter->SetSortAlgorithm( MVIMPSTStorageContact::ECompareByPresence); + + TRACE( T_LIT("SubServiceType() Type : %S"), &aStoreName ); + //find whether its a local store or xsp store + if ( VPbkContactStoreUris::DefaultCntDbUri().CompareC( aStoreName, 1, NULL ) + != 0 ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::ConstructL() service store created") ); + //Create XSP Store + iVPbkContactStore = + CVIMPSTStorageVPbkServerStore::NewL(aStoreName,aServiceName ,*this ); + } + else + { + TRACE( T_LIT("CVIMPSTStorageServiceView::ConstructL() local store created ") ); + //Create Local Contacts.cdb store + iVPbkContactStore = CVIMPSTStorageVPbkLocalStore::NewL(VPbkContactStoreUris::DefaultCntDbUri(), + aServiceName, + *this ); + } + TRACE( T_LIT("CVIMPSTStorageServiceView::ConstructL() end") );; + } + + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVIMPSTStorageServiceView* CVIMPSTStorageServiceView::NewL(TUint32 aServiceId, + const TDesC& aStoreName, + const TDesC& aServiceName) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::NewL() begin") ); + + CVIMPSTStorageServiceView* self = new( ELeave ) CVIMPSTStorageServiceView(aServiceId); + CleanupStack::PushL( self ); + self->ConstructL(aStoreName, aServiceName); + CleanupStack::Pop( self ); + TRACE( T_LIT("CVIMPSTStorageServiceView::NewL() end") ); + return self; + } +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::~CVIMPSTStorageServiceView +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// Destructor +CVIMPSTStorageServiceView::~CVIMPSTStorageServiceView() + { + TRACE( T_LIT("CVIMPSTStorageServiceView::~CVIMPSTStorageServiceView() begin") ); + if( iActiveHandler ) + { + iActiveHandler->Cancel(); + delete iActiveHandler; + } + + iContactListArray.ResetAndDestroy(); + + delete iOwnContact; + delete iContactSorter; + delete iVPbkContactStore; + iContactObservers.Reset(); + iContactObservers.Close(); + + if(iUnNamedText) + { + delete iUnNamedText; + iUnNamedText = NULL; + } + + TRACE( T_LIT("CVIMPSTStorageServiceView::~CVIMPSTStorageServiceView() end") ); + } +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::AddObserverL +// From MVIMPSTStorageServiceView +// ----------------------------------------------------------------------------- +// +void CVIMPSTStorageServiceView::AddObserverL( MVIMPSTStorageContactsObserver* + aObserver ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::AddObserverL() begin") ); + User::LeaveIfError( aObserver ? KErrNone : KErrArgument ); + TInt index = iContactObservers.Find( aObserver ); + if( index == KErrNotFound ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::AddObserverL() aObserver added ") ); + User::LeaveIfError( iContactObservers.Append( aObserver ) ); + } + TRACE( T_LIT("CVIMPSTStorageServiceView::AddObserverL() end") ); + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::RemoveObserverL +// From MVIMPSTStorageServiceView +// ----------------------------------------------------------------------------- +void CVIMPSTStorageServiceView::RemoveObserver( MVIMPSTStorageContactsObserver* + aObserver ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveObserver() begin") ); + __ASSERT_ALWAYS( aObserver, Panic( EObserverIsNull )); + const TInt index( iContactObservers.Find( aObserver ) ); + if ( index >=0) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveObserver() aObserver found") ); + iContactObservers.Remove( index ); + iContactObservers.Compress(); + } + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveObserver() begin") ); + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::SetUnnamedTextL +// From MVIMPSTStorageServiceView +// ----------------------------------------------------------------------------- +void CVIMPSTStorageServiceView::SetUnnamedTextL(HBufC* aUnnamedText ) + { + // takes ownership + iUnNamedText = aUnnamedText; + } +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::CreateContactListL +// ----------------------------------------------------------------------------- +// +MVIMPSTStorageContactList* CVIMPSTStorageServiceView::CreateContactListL( + const TDesC& aContactListId, + const TDesC& aDisplayName ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::CreateContactListL() begin") ); + CVIMPSTStorageContactList* contactList = + CVIMPSTStorageContactList::NewLC(*iContactSorter, + aContactListId, + aDisplayName ); + + TIdentityRelation< CVIMPSTStorageContactList > findBy( + CVIMPSTStorageServiceView::ContactListFindByContactListId); + TInt indexOfList( iContactListArray.Find( contactList, findBy ) ); + if( indexOfList == KErrNotFound ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::CreateContactListL() list not exist in list") ); + TLinearOrder< CVIMPSTStorageContactList > order( + CVIMPSTStorageServiceView::ContactListOrderByDisplayName ); + iContactListArray.InsertInOrderAllowRepeats( contactList, order ); + CleanupStack::Pop( contactList ); + TRACE( T_LIT("CVIMPSTStorageServiceView::CreateContactListL() new list created") ); + } + else + { + TRACE( T_LIT("CVIMPSTStorageServiceView::CreateContactListL() list already exist in list") ); + CleanupStack::PopAndDestroy( contactList ); + contactList = iContactListArray[ indexOfList ]; + } + TRACE( T_LIT("CVIMPSTStorageServiceView::CreateContactListL() end") ); + return contactList; + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::RemoveContactList +// ----------------------------------------------------------------------------- +// +void CVIMPSTStorageServiceView::RemoveContactList( const TDesC& aContactListId ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveContactList() begin") ); + TInt pos( FindContactListById( aContactListId ) ); + if( pos >= 0 ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveContactList() aContactListId found") ); + delete iContactListArray[ pos ]; + iContactListArray.Remove( pos ); + iContactListArray.Compress(); + } + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveContactList() end") ); + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::ListCount +// Count of contactlists +// ----------------------------------------------------------------------------- +// +TInt CVIMPSTStorageServiceView::ListCount() const + { + TRACE( T_LIT("CVIMPSTStorageServiceView::ListCount()") ); + return iContactListArray.Count(); + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::ListAt +// Reference to contact list +// ----------------------------------------------------------------------------- +// +MVIMPSTStorageContactList& CVIMPSTStorageServiceView::ListAt( TInt aIndex ) const + { + TRACE( T_LIT("CVIMPSTStorageServiceView::ListAt() begin") ); + // User::LeaveIfError( aIndex < iContactListArray.Count() ? KErrNone : KErrArgument ); + __ASSERT_ALWAYS( (aIndex < iContactListArray.Count() && aIndex >=0 ), Panic( EContactsArrayOutOfSync )); + TRACE( T_LIT("CVIMPSTStorageServiceView::ListAt() end") ); + return *iContactListArray[ aIndex ]; + } +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::ContactCount +// Count of contacts +// ----------------------------------------------------------------------------- +// +TInt CVIMPSTStorageServiceView::ContactCount( TBool aSkipOfflineContacts ) const + { + TRACE( T_LIT("CVIMPSTStorageServiceView::ListAt() begin") ); + TInt contactCount( 0 ); + TInt count( iContactListArray.Count() ); + for( TInt a( 0 ); a < count; ++a ) + { + contactCount += iContactListArray[ a ]->ContactCount( aSkipOfflineContacts, + EFalse ); + } + TRACE( T_LIT("CVIMPSTStorageServiceView::ListAt() contactCount = %d") ,contactCount ); + TRACE( T_LIT("CVIMPSTStorageServiceView::ListAt() end") ); + return contactCount; + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::UpdatepresenceL +// ----------------------------------------------------------------------------- +// +MVIMPSTStorageContact* CVIMPSTStorageServiceView::UpdatePresenceL( + const TDesC& aContactId, + TVIMPSTEnums::TOnlineStatus aStatus, + const TDesC& aStatusText, + const TDesC8& aAvatarData, + TBool aIsClearingAvatar /*= EFalse*/) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdatePresenceL() begin") ); + MVIMPSTStorageContact* contact = NULL; + if( iOwnContact && ( aContactId.Compare( iOwnContact->UserId() ) == 0 ) ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdatePresenceL() own Item presence") ); + if( aAvatarData.Compare(iOwnContact->AvatarContent() ) != 0 ) + { + if((aIsClearingAvatar)||(aAvatarData.Length() > 0)) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdatePresenceL() own avatar change NotifyAllObserversL") ); + iOwnContact->SetAvatarContentL( aAvatarData ,*iVPbkContactStore ); + NotifyAllObserversL(TVIMPSTEnums::EStorageAvatarChange,NULL,iOwnContact,0); + } + } + if( ( iOwnContact->OnlineStatus() != aStatus ) || ( aStatusText.Compare( iOwnContact->StatusText() ) != 0 ) ) + { + // own presence has changes + // update to own presence + iOwnContact->SetOnlineStatus( aStatus ); + iOwnContact->SetStatusTextL(aStatusText); + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdatePresenceL() own presene NotifyAllObserversL") ); + NotifyAllObserversL(TVIMPSTEnums::EStorageOwnPresenceChange,NULL, iOwnContact,0); + } + contact = iOwnContact; + } + else + { + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdatePresenceL() contact item ") ); + contact = FindContactByUserId( aContactId ); + if(contact) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdatePresenceL() contact exist ") ); + TInt index = KErrNotFound; + TVIMPSTEnums::TOnlineStatus oldOnlineStatus = contact->OnlineStatus(); + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdatePresenceL() contact oldOnlineStatus = %d"), oldOnlineStatus ); + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdatePresenceL() contact new presence = %d"), aStatus ); + //status text can be different for the sam status hence not inside the if condition. + if( oldOnlineStatus != aStatus ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdatePresenceL() contact presence change ") ); + contact->SetOnlineStatus( aStatus ); + TInt count = iContactListArray.Count(); + for(TInt i = 0; i < count; i++) + { + index = iContactListArray[i]->FindIndexOfContact(contact); + if(KErrNotFound != index ) + { + iContactListArray[i]->ResortContact(contact); + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdatePresenceL() contact ResortContact ") ); + // get the index of the sorted contact, as after sorting the + // index would have changed based on presence. + // break after the contact list is found and the contact is found + break; + } + } + contact->SetStatusTextL(aStatusText); + if(aAvatarData.Length()>0) + { + TInt oldIndex = IndexOfContact (contact); + contact->SetAvatarContentL( aAvatarData ,*iVPbkContactStore); + NotifyAllObserversL(TVIMPSTEnums::EStorageAvatarChange,NULL, contact, oldIndex ); + } + + // once this event occued ,apply the sorting + NotifyAllObserversWithDelay(TVIMPSTEnums::EStorageMultiplePresenceChange,NULL, contact, -1); + } + else if( aStatusText.Compare( contact->StatusText() ) != 0 ) + { + TInt oldIndex = IndexOfContact (contact); + contact->SetStatusTextL(aStatusText); + NotifyAllObserversL(TVIMPSTEnums::EStoragePresenceChange,NULL, contact, oldIndex ); + } + else if( aAvatarData.Length() && aAvatarData.Compare( contact->AvatarContent() ) != 0 ) + { + TInt oldIndex = IndexOfContact (contact); + contact->SetAvatarContentL( aAvatarData ,*iVPbkContactStore); + NotifyAllObserversL(TVIMPSTEnums::EStorageAvatarChange,NULL, contact, oldIndex ); + } + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdatePresenceL() aStatusText = %S "), &aStatusText ); + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdatePresenceL() NotifyAllObserversL called") ); + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdatePresenceL() NotifyAllObserversL finish") ); + } + } + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdatePresenceL() end") ); + return contact; + } + + // ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::UpdateAvatarL +// ----------------------------------------------------------------------------- +// + MVIMPSTStorageContact* CVIMPSTStorageServiceView::UpdateAvatarL(const TDesC& aContactId, + const TDesC8& aAvatarData ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdateAvatarL() begin") ); + MVIMPSTStorageContact* contact = NULL; + if( iOwnContact && ( aContactId.Compare( iOwnContact->UserId() ) == 0 ) ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdateAvatarL() own avatar") ); + iOwnContact->SetAvatarContentL( aAvatarData ,*iVPbkContactStore); + NotifyAllObserversL(TVIMPSTEnums::EStorageOwnPresenceChange,NULL, iOwnContact,0); + contact = iOwnContact; + } + else + { + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdateAvatarL() buddy avatar") ); + contact = FindContactByUserId( aContactId ); + if(contact) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdateAvatarL() contact exit") ); + contact->SetAvatarContentL( aAvatarData ,*iVPbkContactStore); + TInt index = IndexOfContact(contact); + NotifyAllObserversL(TVIMPSTEnums::EStorageAvatarChange,NULL, contact,index); + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdateAvatarL() NotifyAllObserversL called") ); + } + } + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdateAvatarL() end") ); + return contact; + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::FindContactListInternal +// ----------------------------------------------------------------------------- +// +CVIMPSTStorageContactList* CVIMPSTStorageServiceView::FindContactListInternal( + const TDesC& aListId ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::FindContactListInternal begin") ); + TInt contactListIndex( FindContactListById( aListId ) ); + TRACE( T_LIT("CVIMPSTStorageServiceView::FindContactListInternal end ") ); + return ( contactListIndex >= 0 ? iContactListArray[ contactListIndex ] : NULL ); + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::FindContactList +// ----------------------------------------------------------------------------- +// +MVIMPSTStorageContactList* CVIMPSTStorageServiceView::FindContactList( const TDesC& aListId ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::FindContactList") ); + return FindContactListInternal( aListId ); + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::FindContactListById +// ----------------------------------------------------------------------------- +// +TInt CVIMPSTStorageServiceView::FindContactListById(const TDesC& aListId ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::FindContactList begin") ); + TInt index = KErrNotFound; + TInt count( iContactListArray.Count() ); + TRACE( T_LIT("CVIMPSTStorageServiceView::FindContactList count = %d"), count ); + for( TInt i= 0 ; i < count ; i++ ) + { + if( KErrNone == VIMPSTStorageUtils::NeutralCompare( + aListId, + iContactListArray[ i ]->ListId(), EFalse ) ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::FindContactList contact list found") ); + index = i; + break; + } + } + TRACE( T_LIT("CVIMPSTStorageServiceView::FindContactList end") ); + return index; + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::FindContactListById +// ----------------------------------------------------------------------------- +// +MVIMPSTStorageContact* CVIMPSTStorageServiceView::FindContactByLink(const MVPbkContactLink& aContactLink ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::FindContactByLink begin") ); + MVIMPSTStorageContact* contact = NULL; + TInt count( iContactListArray.Count() ); + for( TInt i= 0 ; i < count ; i++ ) + { + CVIMPSTStorageContactList* contactList = iContactListArray[ i ]; + contact = contactList->FindContactByContactLink( aContactLink ); + if( contact ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::FindContactByLink contact found = %d "), i ); + break; + } + } + TRACE( T_LIT("CVIMPSTStorageServiceView::FindContactByLink end") ); + return contact; + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::GetServiceId +// ----------------------------------------------------------------------------- +// +TUint32 CVIMPSTStorageServiceView::GetServiceId() + { + TRACE( T_LIT("CVIMPSTStorageServiceView::GetServiceId") ); + return iServiceId; + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::LocalStore +// ----------------------------------------------------------------------------- +// +TBool CVIMPSTStorageServiceView::IsLocalStore() const + { + TRACE( T_LIT("CVIMPSTStorageServiceView::IsLocalStore") ); + return iVPbkContactStore->LocalStore(); + } +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::OwnContactL +// ----------------------------------------------------------------------------- +// +MVIMPSTStorageContact& CVIMPSTStorageServiceView::OwnContactL() + { + TRACE( T_LIT("CVIMPSTStorageServiceView::OwnContact begin") ); + if( !iOwnContact ) + { + iOwnContact = CVIMPSTStorageContact::NewL(KNullDesC, + KNullDesC ) ; + } + TRACE( T_LIT("CVIMPSTStorageServiceView::OwnContact end") ); + return *iOwnContact; + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::SetOwnUserIdL +// ----------------------------------------------------------------------------- +// +void CVIMPSTStorageServiceView::SetOwnUserIdL(const TDesC& aUserId ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::SetOwnUserIdL begin") ); + if( !iOwnContact ) + { + iOwnContact = CVIMPSTStorageContact::NewL(aUserId, + KNullDesC + ) ; + TRACE( T_LIT("CVIMPSTStorageServiceView::SetOwnUserIdL iOwnContact created") ); + } + else if( aUserId.Compare( iOwnContact->UserId() ) != 0 ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::SetOwnUserIdL iOwnContact was existing") ); + iOwnContact->SetUserIdL( aUserId ); + iOwnContact->SetAvatarContentL(KNullDesC8,*iVPbkContactStore ); + iVPbkContactStore->RemoveAllVPbkContactsL(); // if user id is changed remove all contacts + NotifyAllObserversL( TVIMPSTEnums::EStorageEventOwnUserChanged,NULL,iOwnContact,0 ); + TRACE( T_LIT("CVIMPSTStorageServiceView::SetOwnUserIdL NotifyAllObserversL delivered") ); + } + TRACE( T_LIT("CVIMPSTStorageServiceView::SetOwnUserIdL end") ); + } +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::FindContactByUserId +// From MVIMPSTStorageServiceView. +// Try to load with given ID, return NULL if not found. +// ----------------------------------------------------------------------------- +MVIMPSTStorageContact* CVIMPSTStorageServiceView::FindContactByUserId( const TDesC& aUserId ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::FindContactByUserId begin") ); + MVIMPSTStorageContact* contact = NULL; + CVIMPSTStorageContactList* contactList = NULL; + TInt count( iContactListArray.Count() ); + for( TInt a( 0 ); a < count; ++a ) + { + contactList = iContactListArray[ a ]; + contact = contactList->FindContact( aUserId ); + if( contact ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::FindContactByUserId contact found ") ); + break; + } + } + TRACE( T_LIT("CVIMPSTStorageServiceView::FindContactByUserId end") ); + return contact; + } +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::FindContactByUserId +// From MVIMPSTStorageServiceView. +// Try to load with given ID, return NULL if not found. +// ----------------------------------------------------------------------------- +MVIMPSTStorageContact* CVIMPSTStorageServiceView::FindCacheContactByUserId( const TDesC& aUserId ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::FindCacheContactByUserId") ); + return FindContactByUserId( aUserId ); + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::FindCacheContactByLink +// From MVIMPSTStorageServiceView. +// Try to load with given ID, return NULL if not found. +// ----------------------------------------------------------------------------- +MVIMPSTStorageContact* CVIMPSTStorageServiceView::FindCacheContactByLink(const MVPbkContactLink& aContactLink ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::FindCacheContactByLink ") ); + return FindContactByLink( aContactLink ); + } +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::CreateContactL +// ----------------------------------------------------------------------------- +// +MVIMPSTStorageContact* CVIMPSTStorageServiceView::CreateNewContactL(const TDesC& aUserId, + const TDesC& aDisplayName /*= KNullDesC*/, + TBool aIsInvitationItem /*=EFalse*/, + TBool aInvitationAutoAccept /*= EFalse */) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::CreateNewContactL begin") ); + // This will create a contact in the CDB file. It returns MVPbkContactLink link to the CDB file. + MVIMPSTStorageContact* contact = FindCacheContactByUserId( aUserId ); + if( !contact ) + { + iIsInvitationItem = aIsInvitationItem; + TRACE( T_LIT("CVIMPSTStorageServiceView::CreateNewContactL contact does not exist in list") ); + iVPbkContactStore->CreateVPbkContactL( aUserId ,aDisplayName, aInvitationAutoAccept ); + TRACE( T_LIT("CVIMPSTStorageServiceView::CreateNewContactL new contact created") ); + } + TRACE( T_LIT("CVIMPSTStorageServiceView::CreateNewContactL end") ); + return contact; + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::CreateNewFetchContactsL +// ----------------------------------------------------------------------------- +// + void CVIMPSTStorageServiceView::CreateNewFetchContactsL( RArray &aFirstNameList, + RArray &aServiceField ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::CreateNewFetchContactsL begin") ); + if( !iVPbkContactStore->LocalStore() ) + { + RemoveAllCacheContactsL(); + } + iVPbkContactStore->AddVPbkFetchContactsL( aFirstNameList, aServiceField ); + TRACE( T_LIT("CVIMPSTStorageServiceView::CreateNewFetchContactsL end") ); + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::RemoveContactL +// From MVIMPSTStorageServiceView. +// Try to load with given ID, return NULL if not found. +// ----------------------------------------------------------------------------- + +TInt CVIMPSTStorageServiceView::RemoveContactL( MVIMPSTStorageContact* aContact ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveContactL begin") ); + TInt error = KErrArgument; + if( aContact ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveContactL contact found") ); + error = iVPbkContactStore->RemoveVPbkContactL( *aContact->ContactLink() ); + } + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveContactL end") ); + return error; + } + + + // ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::RetriveLinkXSPIdsL +// ----------------------------------------------------------------------------- +// +TInt CVIMPSTStorageServiceView::RetriveLinkXSPIdsL(const TDesC8& aContactPackLink ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::RetriveLinkXSPIdsL") ); + // return the no of retrived xsp of contacts + return iVPbkContactStore->RetrieveVPbkXSPIdL( aContactPackLink ); + } + + // --------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::GetRetrieveXSPIdL +// --------------------------------------------------------------------------- +// +const TDesC& CVIMPSTStorageServiceView::GetRetrieveXSPIdL(TInt aIndex ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::GetRetrieveXSPIdL aIndex = %d"),aIndex ); + return iVPbkContactStore->GetRetrieveVPbkXSPIdL( aIndex ); + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::CreateNewContactFromRetrivedIdL +// ----------------------------------------------------------------------------- +// +TInt CVIMPSTStorageServiceView::CreateNewContactFromRetrivedIdL( TInt aIndexToUse ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::CreateNewContactFromRetrivedIdL aIndexToUse = %d"),aIndexToUse ); + // This will create a contact in the CDB file. It returns MVPbkContactLink link to the CDB file. + return iVPbkContactStore->CreateRetriveVPbkContactL( aIndexToUse ); + } +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::DeleteNewContactFromRetrivedIdL +// ----------------------------------------------------------------------------- +// +TInt CVIMPSTStorageServiceView::DeleteNewContactFromRetrivedIdL( TInt aIndexToUse ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::DeleteNewContactFromRetrivedIdL aIndexToUse = %d"),aIndexToUse ); + // This will create a contact in the CDB file. It returns MVPbkContactLink link to the CDB file. + return iVPbkContactStore->deleteRetriveVPbkContactL( aIndexToUse ); + } + + // ---------------------------------------------------------- +// CVIMPSTStorageServiceView::DeleteDatabaseL +// ---------------------------------------------------------- +void CVIMPSTStorageServiceView::DeleteDatabaseL() + { + TRACE( T_LIT("CVIMPSTStorageServiceView::DeleteDatabaseL") ); + iVPbkContactStore->DeleteDatabaseL(); + } + +//================================================== from writer interface======================= + // ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::UpdateCacheContactL +// ----------------------------------------------------------------------------- +// +MVIMPSTStorageContact* CVIMPSTStorageServiceView::UpdateCacheContactL(const MVPbkContactLink& aContactLink, + const TDesC& aUserId, + const TDesC& aDisplayName, + const TDesC8& aAvatarContent) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdateCacheContactL begin") ); + MVIMPSTStorageContact* contact = FindContactByLink(aContactLink); + if( contact ) + { + TInt oldIndex = IndexOfContact( contact ); + TBool sortNeeded = EFalse; + if( contact->UserId().Compare( aUserId) != 0 ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdateCacheContactL user id changed") ); + NotifyAllObserversL( TVIMPSTEnums::EStorageEventUserIdPreChange,NULL, contact,oldIndex); + contact->SetUserIdL( aUserId ); + if(aUserId.Length()== 0) + { + sortNeeded = ETrue; + contact->SetOnlineStatus(TVIMPSTEnums::EUnknown); + } + NotifyAllObserversL( TVIMPSTEnums::EStorageEventUserIdPostChange,NULL, contact,oldIndex); + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdateCacheContactL NotifyAllObserversL delivered") ); + } + if(contact->Name().Compare(aDisplayName) != 0 ) + { + sortNeeded = ETrue; + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdateCacheContactL display name changed") ); + if( aDisplayName.Length() <= 0 && iUnNamedText ) + { + contact->SetNameL( *iUnNamedText ); + } + else + { + contact->SetNameL( aDisplayName ); + } + } + if(sortNeeded) + { + TInt index = KErrNotFound; + TInt count = iContactListArray.Count(); + for(TInt i = 0; i < count; i++) + { + index = iContactListArray[i]->FindIndexOfContact(contact); + if(KErrNotFound != index ) + { + iContactListArray[i]->ResortContact(contact); + // get the index of the sorted contact, as after sorting the + // index would have changed based on presence. + // break after the contact list is found and the contact is found + break; + } + } + NotifyAllObserversL( TVIMPSTEnums::EStorageEventContactChange,NULL,contact, oldIndex ); + } + if( contact->AvatarContent().Compare( aAvatarContent ) != 0 ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdateCacheContactL user id changed") ); + contact->SetAvatarContentL( aAvatarContent,*iVPbkContactStore ); + NotifyAllObserversL( TVIMPSTEnums::EStorageAvatarChange,NULL, contact, KErrNotFound); + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdateCacheContactL NotifyAllObserversL delivered") ); + } + } + TRACE( T_LIT("CVIMPSTStorageServiceView::UpdateCacheContactL end") ); + return contact; + } +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::AddContactToCacheL +// ----------------------------------------------------------------------------- +MVIMPSTStorageContact* CVIMPSTStorageServiceView::AddContactToCacheL (const MVPbkContactLink& aContactLink, + const TDesC& aUserId, + const TDesC& aDisplayName, + const TDesC8& aAvatarContent, + TVIMPSTEnums::TVIMPSTStorgaeEventType aType ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::AddContactToCacheL begin") ); + TRACE( T_LIT("CVIMPSTStorageServiceView::AddContactToCacheL user id: %S"), &aUserId); + TRACE( T_LIT("CVIMPSTStorageServiceView::AddContactToCacheL storageeventtype: %d"), aType ); + MVIMPSTStorageContactList* contactList = FindContactListInternal( KFriendList ); + if( !contactList ) + { + contactList = CreateContactListL(KFriendList,KNullDesC); + } + TRACE( T_LIT("CVIMPSTStorageServiceView::AddContactToCacheL before findcontactlink") ); + MVIMPSTStorageContact* contact = FindContactByLink(aContactLink); + TRACE( T_LIT("CVIMPSTStorageServiceView::AddContactToCacheL after findcontactlink ") ); + if( !contact ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::AddContactToCacheL contact not exist ") ); + TInt error = KErrGeneral; + TInt index = KErrNotFound; + if( aDisplayName.Length() <= 0 && iUnNamedText ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::AddContactToCacheL no display name ") ); + contact = CVIMPSTStorageContact::NewLC( aUserId, *iUnNamedText , aContactLink ,aAvatarContent ); + } + else + { + TRACE( T_LIT("CVIMPSTStorageServiceView::AddContactToCacheL has display name ") ); + contact = CVIMPSTStorageContact::NewLC( aUserId, aDisplayName , aContactLink, aAvatarContent); + } + // if the xsp id is numm, then the presence state should be EUnknown; + if(0 == aUserId.Length()) + { + contact->SetOnlineStatus(TVIMPSTEnums::EUnknown); + } + else if( aType == TVIMPSTEnums::EStorageEventContactAddition && !iIsInvitationItem ) + { + // if a invitation item getting accepted do not set to pending again + // if user has choosen add contact set the default status as pending + // to avoid any kind of flickering + contact->SetOnlineStatus(TVIMPSTEnums::EPending); + } + error = contactList->AddStorageContactToCacheL( contact, index ); + TRACE( T_LIT("CVIMPSTStorageServiceView::AddContactToCacheL AddStorageContactToCacheL error= %d "),error ); + if( error == KErrNone ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::AddContactToCacheL success ") ); + CleanupStack::Pop(); // contact + TInt count = iContactListArray.Count(); + for(TInt i = 0; i < count; i++) + { + index = iContactListArray[i]->FindIndexOfContact(contact); + if(KErrNotFound != index ) + { + iContactListArray[i]->ResortContact(contact); + TRACE( T_LIT("CVIMPSTStorageServiceView::AddContactToCacheL() contact ResortContact ") ); + // get the index of the sorted contact, as after sorting the + // index would have changed based on presence. + // break after the contact list is found and the contact is found + break; + } + } + index = IndexOfContact(contact); + NotifyAllObserversL( aType,NULL, contact, index ); + } + else + { + TRACE( T_LIT("CVIMPSTStorageServiceView::AddContactToCacheL not success ") ); + CleanupStack::PopAndDestroy(); // contact + contact = NULL; + } + } + iIsInvitationItem = EFalse; // reset the flag + TRACE( T_LIT("CVIMPSTStorageServiceView::AddContactToCacheL end") ); + return contact; + } +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::AddStorageContactToCacheL +// ----------------------------------------------------------------------------- +// +TInt CVIMPSTStorageServiceView::AddStorageContactToCacheL(MVIMPSTStorageContact* aContactToAdd ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::AddStorageContactToCacheL begin") ); + TInt error = KErrGeneral; + MVIMPSTStorageContactList* contactList = FindContactListInternal( KFriendList ); + if( !contactList ) + { + contactList = CreateContactListL(KFriendList,KNullDesC); // create the default list :TODO chnage to proper sol + } + if( aContactToAdd ) + { + if( aContactToAdd->Name().Length() <= 0 && iUnNamedText ) + { + aContactToAdd->SetNameL( *iUnNamedText ); + } + TInt index = KErrNotFound; + TRACE( T_LIT("CVIMPSTStorageServiceView::AddStorageContactToCacheL online status = %d "), TVIMPSTEnums::EPending); + // if the userid(xsp field is null then the presence is unknown.) + if(aContactToAdd->UserId().Length() == 0) + { + aContactToAdd->SetOnlineStatus(TVIMPSTEnums::EUnknown); + } + else + { + aContactToAdd->SetOnlineStatus(TVIMPSTEnums::EPending); + } + error = contactList->AddStorageContactToCacheL( aContactToAdd, index ); // aContactToAdd ownership is transfered + TRACE( T_LIT("CVIMPSTStorageServiceView::AddStorageContactToCacheL index = %d "),index ); + if( error == KErrNone ) + { + TInt count = iContactListArray.Count(); + for(TInt i = 0; i < count; i++) + { + index = iContactListArray[i]->FindIndexOfContact(aContactToAdd); + if(KErrNotFound != index ) + { + iContactListArray[i]->ResortContact(aContactToAdd); + TRACE( T_LIT("CVIMPSTStorageServiceView::AddContactToCacheL() contact ResortContact ") ); + // get the index of the sorted contact, as after sorting the + // index would have changed based on presence. + // break after the contact list is found and the contact is found + break; + } + } + index = IndexOfContact(aContactToAdd); + NotifyAllObserversL( TVIMPSTEnums::EStorageEventContactAddition,NULL, aContactToAdd, index ); + } + } + TRACE( T_LIT("CVIMPSTStorageServiceView::AddStorageContactToCacheL error = %d "),error ); + TRACE( T_LIT("CVIMPSTStorageServiceView::AddStorageContactToCacheL end") ); + return error; + } +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::RemoveContactFromCacheL +// From MVIMPSTStorageServiceView. +// Try to load with given ID, return NULL if not found. +// ----------------------------------------------------------------------------- + +TInt CVIMPSTStorageServiceView::RemoveContactFromCacheL(const MVPbkContactLink& aContactLink, + TVIMPSTEnums::TVIMPSTStorgaeEventType aType) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveContactFromCacheL begin") ); + TInt error = KErrNotFound; + MVIMPSTStorageContactList* contactList = FindContactListInternal( KFriendList ); + if( !contactList ) + { + contactList = CreateContactListL( KFriendList,KNullDesC ); // create the default list :TODO chnage to proper sol + } + MVIMPSTStorageContact* contact = FindContactByLink(aContactLink); + if( contact ) + { + // do not change the order of below line + // contact can be access just before deletion but not after delete from cache + if( aType == TVIMPSTEnums::EStorageEventDeleteFromPbk ) + { + // in EStorageEventDeleteFromPbk event ,caller should not remove from his local list + // this just to inform that if user caller want to do any pre operation like unsubscriibtion etc + NotifyAllObserversL( aType ,NULL,contact,0); //contact is still valid + } + TInt index = 0; + error = contactList->RemoveContactFromCacheL( aContactLink, index ); + NotifyAllObserversL( TVIMPSTEnums::EStorageEventContactDelete ,NULL,NULL,index); //contact is not valid ,deleted + } + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveContactFromCacheL error = %d "),error ); + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveContactFromCacheL begin") ); + return error; + } +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::RemoveAllCacheContactsL +// ----------------------------------------------------------------------------- +// +void CVIMPSTStorageServiceView::RemoveAllCacheContactsL() + { + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveContactFromCacheL begin") ); + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveContactFromCacheL count = %d"), iContactListArray.Count()); + iContactListArray.ResetAndDestroy(); + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveContactFromCacheL remove sucess") ); + NotifyAllObserversL(TVIMPSTEnums::EStorageAllContactRemoved,NULL,NULL,0 ); + TRACE( T_LIT("CVIMPSTStorageServiceView::RemoveContactFromCacheL begin") ); + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::GetDefaultContactListL +// ----------------------------------------------------------------------------- +// +MVIMPSTStorageContactList* CVIMPSTStorageServiceView::GetDefaultContactListL() + { + TRACE( T_LIT("CVIMPSTStorageServiceView::GetDefaultContactListL begin") ); + MVIMPSTStorageContactList* contactList = FindContactListInternal( KFriendList ); + TRACE( T_LIT("CVIMPSTStorageServiceView::GetDefaultContactListL end") ); + return contactList; + } +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::NotifyServiceViewL +// ----------------------------------------------------------------------------- +// +void CVIMPSTStorageServiceView::NotifyServiceViewL( TVIMPSTEnums::TVIMPSTStorgaeEventType aEventType, + MVIMPSTStorageContact* aContact /*= NULL */ ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::NotifyServiceViewL begin") ); + NotifyAllObserversL(aEventType,NULL, aContact,0 ); + TRACE( T_LIT("CVIMPSTStorageServiceView::NotifyServiceViewL end") ); + } + + //================================================== from writer interface end =========================== +// TLinearOrder +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::ContactListOrderByDisplayName +// ----------------------------------------------------------------------------- +// +TInt CVIMPSTStorageServiceView::ContactListOrderByDisplayName( + const CVIMPSTStorageContactList& aContactListA, + const CVIMPSTStorageContactList& aContactListB ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::ContactListOrderByDisplayName") ); + return aContactListA.DisplayName().CompareC( aContactListB.DisplayName() ); + } + +// TIdentityRelation +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::ContactListFindByContactListId +// ----------------------------------------------------------------------------- +// +TBool CVIMPSTStorageServiceView::ContactListFindByContactListId( + const CVIMPSTStorageContactList& aContactListA, + const CVIMPSTStorageContactList& aContactListB ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::ContactListFindByContactListId start") ); + const MVIMPSTStorageContactList& listA = aContactListA; + const MVIMPSTStorageContactList& listB = aContactListB; + TRACE( T_LIT("CVIMPSTStorageServiceView::ContactListFindByContactListId return") ); + return ( VIMPSTStorageUtils::NeutralCompare( listA.ListId(), + listB.ListId(), EFalse ) == 0 ); + } +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::Count +// Returns item count +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CVIMPSTStorageServiceView::Count() const + { + TRACE( T_LIT("CVIMPSTStorageServiceView::Count start") ); + // fetch contact list count from storage + // and add contact counts from expanded contact lists + TInt listCount( ListCount() ); + TInt itemCount( 0 ); + TInt contactCount = 0; + for( TInt i(0); i 0 ) + { + // if list is expanded, add count of count of contacts + // in this list to item count + itemCount += contactCount; + //check for this + } + } + TRACE( T_LIT("CVIMPSTStorageServiceView::itemCount =%d"),itemCount ); + TRACE( T_LIT("CVIMPSTStorageServiceView::Count end") ); + return itemCount; + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::Item +// Returns item at given index +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +MVIMPSTStorageItemModel::SItem CVIMPSTStorageServiceView::Item( TInt aIndex ) const + { + TRACE( T_LIT("CVIMPSTStorageServiceView::Item start") ); + MVIMPSTStorageItemModel::SItem item; + item.iType = MVIMPSTStorageItemModel::EInvalid; + item.iContactList = NULL; + item.iContact = NULL; + TInt contactCount = 0; + TInt count( 0 ); + TInt listCount( ListCount() ); + for( TInt i( 0 ); i < listCount; ++i ) + { + MVIMPSTStorageContactList& list = ListAt( i ); + item.iContactList = &list; + + ++count; + if( count > aIndex ) + { + // there's a list in given index + item.iType = MVIMPSTStorageItemModel::EContactList; + TRACE( T_LIT("CVIMPSTStorageServiceView::Item end") ); + return item; + } + contactCount = list.Count() ; + if( contactCount > 0 ) + { + // list is expanded, consider also contacts in this list + if( count + contactCount > aIndex ) + { + // there's a contact in given index + TInt contactIndex( aIndex - count ); + item.iType = MVIMPSTStorageItemModel::EContactItem; + item.iContact = &list[contactIndex]; + TRACE( T_LIT("CVIMPSTStorageServiceView::Item end") ); + return item; + } + // add expanded list's contact count + count += contactCount; + } + } + // not found + TRACE( T_LIT("CVIMPSTStorageServiceView::Item end") ); + return item; + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::IndexOfContact +// Gets index of contact in list +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CVIMPSTStorageServiceView::IndexOfContact( MVIMPSTStorageContact* aContact ) const + { + TRACE( T_LIT("CVIMPSTStorageServiceView::IndexOfContact begin") ); + TInt listCount( ListCount() ); + TInt itemCount( 0 ); + TInt contactCount = 0; + TInt indexOfContact = KErrNotFound; + for( TInt i(0); i < listCount; ++i ) + { + MVIMPSTStorageContactList& list = ListAt(i); + contactCount = list.Count( ) ; + indexOfContact = list.FindIndexOfContact( aContact ); + // if we're showing all contacts or + // there are online contacts in this list, + // the list-item is shown => increase count check this? + //itemCount; //++itemCount; + if( indexOfContact != KErrNotFound ) + { + // add earlier items to index. + indexOfContact += itemCount; + break; + } + else + { + itemCount += contactCount; + } + //add the code for if contact not found in first list + } + TRACE( T_LIT("CVIMPSTStorageServiceView::IndexOfContact indexOfContact = %d"), indexOfContact ); + TRACE( T_LIT("CVIMPSTStorageServiceView::IndexOfContact end") ); + return indexOfContact; + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::IndexOfList +// Gets index of contact in list +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CVIMPSTStorageServiceView::IndexOfList( MVIMPSTStorageContactList* aList, + TBool /*aIgnoreOwnItem = EFalse*/, + TBool /*aIgnoreEmptyLists = ETrue*/ ) const + { + TRACE( T_LIT("CVIMPSTStorageServiceView::IndexOfList begin") ); + TInt listCount( ListCount() ); + TInt itemCount( 0 ); + for( TInt i(0); i sort all +// ----------------------------------------------------------------------------- +// +void CVIMPSTStorageServiceView::Sort( const TDesC& aContactListId /* = KNullDesC */ ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::Sort() begin") ); + if( aContactListId.Length() != 0 ) + { + MVIMPSTStorageContactList* list = FindContactList( aContactListId ); + if( list ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::Sort() list sort") ); + list->Sort(); + } + } + else + { + TInt count( iContactListArray.Count() ); + for( TInt a( 0 ); a < count; ++a ) + { + MVIMPSTStorageContactList& list = *iContactListArray[ a ]; + TRACE( T_LIT("CVIMPSTStorageServiceView::Sort() all list sort") ); + list.Sort(); + } + } + TRACE( T_LIT("CVIMPSTStorageServiceView::Sort() end") ); + } + + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::NotifyAllObservers +// ----------------------------------------------------------------------------- +// +void CVIMPSTStorageServiceView::NotifyAllObserversL( TVIMPSTEnums::TVIMPSTStorgaeEventType aType, + MVIMPSTStorageContactList *aList, + MVIMPSTStorageContact* aContact, + TInt aContactIndex ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::NotifyAllObserversL() begin") ); + TInt count = iContactObservers.Count(); + for( TInt i=0; iHandleStorageChangeL( aType, aList, aContact, aContactIndex ); + } + TRACE( T_LIT("CVIMPSTStorageServiceView::NotifyAllObserversL() end") ); + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::NotifyAllObserversWithDelay +// ----------------------------------------------------------------------------- +// +void CVIMPSTStorageServiceView::NotifyAllObserversWithDelay( TVIMPSTEnums::TVIMPSTStorgaeEventType aType, + MVIMPSTStorageContactList *aList, + MVIMPSTStorageContact* aContact, + TInt aContactIndex ) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::NotifyAllObserversWithDelay() begin") ); + if(iActiveHandler->IsActive() ) + { + iActiveHandler->Cancel(); + } + iActiveHandler->IssueRequest( aType, aList, aContact, aContactIndex ); + TRACE( T_LIT("CVIMPSTStorageServiceView::NotifyAllObserversWithDelay() end") ); + } + +// ----------------------------------------------------------------------------- +// CVIMPSTStorageServiceView::HandleDelayedNotificationL +// ----------------------------------------------------------------------------- +// +void CVIMPSTStorageServiceView::HandleDelayedNotificationL(TVIMPSTEnums::TVIMPSTStorgaeEventType aType, + MVIMPSTStorageContactList *aList, + MVIMPSTStorageContact* aContact, + TInt aContactIndex) + { + TRACE( T_LIT("CVIMPSTStorageServiceView::HandleDelayedNotificationL() begin") ); + NotifyAllObserversL( aType, aList, aContact, aContactIndex ); + TRACE( T_LIT("CVIMPSTStorageServiceView::HandleDelayedNotificationL() end") ); + } +// End of File