diff -r 2b7283837edb -r 3104fc151679 uiservicetab/vimpststorage/src/cvimpststorageserviceview.cpp --- a/uiservicetab/vimpststorage/src/cvimpststorageserviceview.cpp Thu Aug 19 09:41:53 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1275 +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: 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 "uiservicetabtracer.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 ) - { - TRACER_AUTO; - } - -// ----------------------------------------------------------------------------- -// 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) - { - TRACER_AUTO; - - iActiveHandler = CVIMPSTStorageActiveHandler::NewL(this); - - // create sorter for contacts - iContactSorter = CVIMPSTStorageContactSorter::NewL(); - - //set the sorting algorithem to order by presence. - iContactSorter->SetSortAlgorithm( MVIMPSTStorageContact::ECompareByPresence); - - TRACE( "SubServiceType() Type : %S", &aStoreName ); - //find whether its a local store or xsp store - if ( VPbkContactStoreUris::DefaultCntDbUri().CompareC( aStoreName, 1, NULL ) - != 0 ) - { - TRACE( " service store created" ); - //Create XSP Store - iVPbkContactStore = - CVIMPSTStorageVPbkServerStore::NewL(aStoreName,aServiceName ,*this ); - } - else - { - TRACE( "local store created " ); - //Create Local Contacts.cdb store - iVPbkContactStore = CVIMPSTStorageVPbkLocalStore::NewL(VPbkContactStoreUris::DefaultCntDbUri(), - aServiceName, - *this ); - } - } - - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -CVIMPSTStorageServiceView* CVIMPSTStorageServiceView::NewL(TUint32 aServiceId, - const TDesC& aStoreName, - const TDesC& aServiceName) - { - TRACER_AUTO; - - CVIMPSTStorageServiceView* self = new( ELeave ) CVIMPSTStorageServiceView(aServiceId); - CleanupStack::PushL( self ); - self->ConstructL(aStoreName, aServiceName); - CleanupStack::Pop( self ); - return self; - } -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::~CVIMPSTStorageServiceView -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// Destructor -CVIMPSTStorageServiceView::~CVIMPSTStorageServiceView() - { - TRACER_AUTO; - if( iActiveHandler ) - { - iActiveHandler->Cancel(); - delete iActiveHandler; - } - - iContactListArray.ResetAndDestroy(); - - delete iOwnContact; - delete iContactSorter; - delete iVPbkContactStore; - iContactObservers.Reset(); - iContactObservers.Close(); - - if(iUnNamedText) - { - delete iUnNamedText; - iUnNamedText = NULL; - } - - } -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::AddObserverL -// From MVIMPSTStorageServiceView -// ----------------------------------------------------------------------------- -// -void CVIMPSTStorageServiceView::AddObserverL( MVIMPSTStorageContactsObserver* - aObserver ) - { - TRACER_AUTO; - User::LeaveIfError( aObserver ? KErrNone : KErrArgument ); - TInt index = iContactObservers.Find( aObserver ); - if( index == KErrNotFound ) - { - TRACE( "aObserver added "); - User::LeaveIfError( iContactObservers.Append( aObserver ) ); - } - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::RemoveObserverL -// From MVIMPSTStorageServiceView -// ----------------------------------------------------------------------------- -void CVIMPSTStorageServiceView::RemoveObserver( MVIMPSTStorageContactsObserver* - aObserver ) - { - TRACER_AUTO; - __ASSERT_ALWAYS( aObserver, Panic( EObserverIsNull )); - const TInt index( iContactObservers.Find( aObserver ) ); - if ( index >=0) - { - TRACE( "aObserver found" ); - iContactObservers.Remove( index ); - iContactObservers.Compress(); - } - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::SetUnnamedTextL -// From MVIMPSTStorageServiceView -// ----------------------------------------------------------------------------- -void CVIMPSTStorageServiceView::SetUnnamedTextL(HBufC* aUnnamedText ) - { - // takes ownership - iUnNamedText = aUnnamedText; - } -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::CreateContactListL -// ----------------------------------------------------------------------------- -// -MVIMPSTStorageContactList* CVIMPSTStorageServiceView::CreateContactListL( - const TDesC& aContactListId, - const TDesC& aDisplayName ) - { - TRACER_AUTO; - CVIMPSTStorageContactList* contactList = - CVIMPSTStorageContactList::NewLC(*iContactSorter, - aContactListId, - aDisplayName ); - - TIdentityRelation< CVIMPSTStorageContactList > findBy( - CVIMPSTStorageServiceView::ContactListFindByContactListId); - TInt indexOfList( iContactListArray.Find( contactList, findBy ) ); - if( indexOfList == KErrNotFound ) - { - TRACE( "list not exist in list"); - TLinearOrder< CVIMPSTStorageContactList > order( - CVIMPSTStorageServiceView::ContactListOrderByDisplayName ); - iContactListArray.InsertInOrderAllowRepeats( contactList, order ); - CleanupStack::Pop( contactList ); - TRACE( " new list created"); - } - else - { - TRACE( " list already exist in list" ); - CleanupStack::PopAndDestroy( contactList ); - contactList = iContactListArray[ indexOfList ]; - } - return contactList; - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::RemoveContactList -// ----------------------------------------------------------------------------- -// -void CVIMPSTStorageServiceView::RemoveContactList( const TDesC& aContactListId ) - { - TRACER_AUTO; - TInt pos( FindContactListById( aContactListId ) ); - if( pos >= 0 ) - { - TRACE( "aContactListId found" ); - delete iContactListArray[ pos ]; - iContactListArray.Remove( pos ); - iContactListArray.Compress(); - } - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::ListCount -// Count of contactlists -// ----------------------------------------------------------------------------- -// -TInt CVIMPSTStorageServiceView::ListCount() const - { - TRACER_AUTO; - return iContactListArray.Count(); - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::ListAt -// Reference to contact list -// ----------------------------------------------------------------------------- -// -MVIMPSTStorageContactList& CVIMPSTStorageServiceView::ListAt( TInt aIndex ) const - { - TRACER_AUTO; - // User::LeaveIfError( aIndex < iContactListArray.Count() ? KErrNone : KErrArgument ); - __ASSERT_ALWAYS( (aIndex < iContactListArray.Count() && aIndex >=0 ), Panic( EContactsArrayOutOfSync )); - return *iContactListArray[ aIndex ]; - } -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::ContactCount -// Count of contacts -// ----------------------------------------------------------------------------- -// -TInt CVIMPSTStorageServiceView::ContactCount( TBool aSkipOfflineContacts ) const - { - TRACER_AUTO; - TInt contactCount( 0 ); - TInt count( iContactListArray.Count() ); - for( TInt a( 0 ); a < count; ++a ) - { - contactCount += iContactListArray[ a ]->ContactCount( aSkipOfflineContacts, - EFalse ); - } - TRACE(" contactCount = %d" ,contactCount ); - return contactCount; - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::UpdatepresenceL -// ----------------------------------------------------------------------------- -// -MVIMPSTStorageContact* CVIMPSTStorageServiceView::UpdatePresenceL( - const TDesC& aContactId, - TVIMPSTEnums::TOnlineStatus aStatus, - const TDesC& aStatusText, - const TDesC8& aAvatarData, - TBool aIsClearingAvatar /*= EFalse*/) - { - TRACER_AUTO; - MVIMPSTStorageContact* contact = NULL; - if( iOwnContact && ( aContactId.Compare( iOwnContact->UserId() ) == 0 ) ) - { - TRACE("own Item presence"); - if( aAvatarData.Compare(iOwnContact->AvatarContent() ) != 0 ) - { - if((aIsClearingAvatar)||(aAvatarData.Length() > 0)) - { - TRACE( "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( " own presene NotifyAllObserversL"); - NotifyAllObserversL(TVIMPSTEnums::EStorageOwnPresenceChange,NULL, iOwnContact,0); - } - contact = iOwnContact; - } - else - { - TRACE( "contact item "); - contact = FindContactByUserId( aContactId ); - if(contact) - { - TRACE( "contact exist " ); - TInt index = KErrNotFound; - TVIMPSTEnums::TOnlineStatus oldOnlineStatus = contact->OnlineStatus(); - TRACE( "contact oldOnlineStatus = %d", oldOnlineStatus ); - TRACE( "contact new presence = %d", aStatus ); - //status text can be different for the sam status hence not inside the if condition. - if( oldOnlineStatus != aStatus ) - { - TRACE( "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( "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("aStatusText = %S ", &aStatusText ); - TRACE( "NotifyAllObserversL called" ); - TRACE( "NotifyAllObserversL finish" ); - } - } - return contact; - } - - // ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::UpdateAvatarL -// ----------------------------------------------------------------------------- -// - MVIMPSTStorageContact* CVIMPSTStorageServiceView::UpdateAvatarL(const TDesC& aContactId, - const TDesC8& aAvatarData ) - { - TRACER_AUTO; - MVIMPSTStorageContact* contact = NULL; - if( iOwnContact && ( aContactId.Compare( iOwnContact->UserId() ) == 0 ) ) - { - TRACE( "own avatar" ); - iOwnContact->SetAvatarContentL( aAvatarData ,*iVPbkContactStore); - NotifyAllObserversL(TVIMPSTEnums::EStorageOwnPresenceChange,NULL, iOwnContact,0); - contact = iOwnContact; - } - else - { - TRACE( "buddy avatar" ); - contact = FindContactByUserId( aContactId ); - if(contact) - { - TRACE( "contact exit"); - contact->SetAvatarContentL( aAvatarData ,*iVPbkContactStore); - TInt index = IndexOfContact(contact); - NotifyAllObserversL(TVIMPSTEnums::EStorageAvatarChange,NULL, contact,index); - TRACE( " NotifyAllObserversL called" ); - } - } - return contact; - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::FindContactListInternal -// ----------------------------------------------------------------------------- -// -CVIMPSTStorageContactList* CVIMPSTStorageServiceView::FindContactListInternal( - const TDesC& aListId ) - { - TRACER_AUTO; - TInt contactListIndex( FindContactListById( aListId ) ); - return ( contactListIndex >= 0 ? iContactListArray[ contactListIndex ] : NULL ); - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::FindContactList -// ----------------------------------------------------------------------------- -// -MVIMPSTStorageContactList* CVIMPSTStorageServiceView::FindContactList( const TDesC& aListId ) - { - TRACER_AUTO; - return FindContactListInternal( aListId ); - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::FindContactListById -// ----------------------------------------------------------------------------- -// -TInt CVIMPSTStorageServiceView::FindContactListById(const TDesC& aListId ) - { - TRACER_AUTO; - TInt index = KErrNotFound; - TInt count( iContactListArray.Count() ); - TRACE( " count = %d", count ); - for( TInt i= 0 ; i < count ; i++ ) - { - if( KErrNone == VIMPSTStorageUtils::NeutralCompare( - aListId, - iContactListArray[ i ]->ListId(), EFalse ) ) - { - TRACE( " contact list found" ); - index = i; - break; - } - } - return index; - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::FindContactListById -// ----------------------------------------------------------------------------- -// -MVIMPSTStorageContact* CVIMPSTStorageServiceView::FindContactByLink(const MVPbkContactLink& aContactLink ) - { - TRACER_AUTO; - 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( " contact found = %d ", i ); - break; - } - } - return contact; - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::GetServiceId -// ----------------------------------------------------------------------------- -// -TUint32 CVIMPSTStorageServiceView::GetServiceId() - { - TRACER_AUTO; - return iServiceId; - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::LocalStore -// ----------------------------------------------------------------------------- -// -TBool CVIMPSTStorageServiceView::IsLocalStore() const - { - TRACER_AUTO; - return iVPbkContactStore->LocalStore(); - } -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::OwnContactL -// ----------------------------------------------------------------------------- -// -MVIMPSTStorageContact& CVIMPSTStorageServiceView::OwnContactL() - { - TRACER_AUTO; - if( !iOwnContact ) - { - iOwnContact = CVIMPSTStorageContact::NewL(KNullDesC, - KNullDesC ) ; - } - return *iOwnContact; - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::SetOwnUserIdL -// ----------------------------------------------------------------------------- -// -void CVIMPSTStorageServiceView::SetOwnUserIdL(const TDesC& aUserId ) - { - TRACER_AUTO; - if( !iOwnContact ) - { - iOwnContact = CVIMPSTStorageContact::NewL(aUserId, - KNullDesC - ) ; - TRACE( "iOwnContact created" ); - } - else if( aUserId.Compare( iOwnContact->UserId() ) != 0 ) - { - _LIT (KNullWithSpace, " "); - TRACE( "SetOwnUserIdL iOwnContact was existing" ); - if(KNullWithSpace ().Compare(iOwnContact->UserId())!=0) - { - iVPbkContactStore->RemoveAllVPbkContactsL(); // if user id is changed remove all contacts - RemoveAllCacheContactsL(); - } - iOwnContact->SetUserIdL( aUserId ); - iOwnContact->SetAvatarContentL(KNullDesC8,*iVPbkContactStore ); - - NotifyAllObserversL( TVIMPSTEnums::EStorageEventOwnUserChanged,NULL,iOwnContact,0 ); - TRACE( "NotifyAllObserversL delivered" ); - } - } -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::FindContactByUserId -// From MVIMPSTStorageServiceView. -// Try to load with given ID, return NULL if not found. -// ----------------------------------------------------------------------------- -MVIMPSTStorageContact* CVIMPSTStorageServiceView::FindContactByUserId( const TDesC& aUserId ) - { - TRACER_AUTO; - 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(" contact found " ); - break; - } - if(!contact) - { - TInt acount =contactList->Count(); - for( TInt i( 0 ); i < acount; ++i ) - { - MVIMPSTStorageContact* acontact = &(contactList->operator [](i)); - if( acontact->UserId().Compare( aUserId) == 0 ) - { - contact=acontact; - break; - } - } - } - } - - return contact; - } -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::FindContactByUserId -// From MVIMPSTStorageServiceView. -// Try to load with given ID, return NULL if not found. -// ----------------------------------------------------------------------------- -MVIMPSTStorageContact* CVIMPSTStorageServiceView::FindCacheContactByUserId( const TDesC& aUserId ) - { - TRACER_AUTO; - return FindContactByUserId( aUserId ); - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::FindCacheContactByLink -// From MVIMPSTStorageServiceView. -// Try to load with given ID, return NULL if not found. -// ----------------------------------------------------------------------------- -MVIMPSTStorageContact* CVIMPSTStorageServiceView::FindCacheContactByLink(const MVPbkContactLink& aContactLink ) - { - TRACER_AUTO; - return FindContactByLink( aContactLink ); - } -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::CreateContactL -// ----------------------------------------------------------------------------- -// -MVIMPSTStorageContact* CVIMPSTStorageServiceView::CreateNewContactL(const TDesC& aUserId, - const TDesC& aDisplayName /*= KNullDesC*/, - TBool aIsInvitationItem /*=EFalse*/, - TBool aInvitationAutoAccept /*= EFalse */) - { - TRACER_AUTO; - // 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( "contact does not exist in list" ); - iVPbkContactStore->CreateVPbkContactL( aUserId ,aDisplayName, aInvitationAutoAccept ); - TRACE( "new contact created"); - } - return contact; - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::CreateNewFetchContactsL -// ----------------------------------------------------------------------------- -// - void CVIMPSTStorageServiceView::CreateNewFetchContactsL( RArray &aFirstNameList, - RArray &aServiceField ) - { - TRACER_AUTO; - if( !iVPbkContactStore->LocalStore() ) - { - RemoveAllCacheContactsL(); - } - iVPbkContactStore->AddVPbkFetchContactsL( aFirstNameList, aServiceField ); - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::RemoveContactL -// From MVIMPSTStorageServiceView. -// Try to load with given ID, return NULL if not found. -// ----------------------------------------------------------------------------- - -TInt CVIMPSTStorageServiceView::RemoveContactL( MVIMPSTStorageContact* aContact ) - { - TRACER_AUTO; - TInt error = KErrArgument; - if( aContact ) - { - TRACE( "contact found" ); - error = iVPbkContactStore->RemoveVPbkContactL( *aContact->ContactLink() ); - } - return error; - } - - - // ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::RetriveLinkXSPIdsL -// ----------------------------------------------------------------------------- -// -TInt CVIMPSTStorageServiceView::RetriveLinkXSPIdsL(const TDesC8& aContactPackLink ) - { - TRACER_AUTO; - // return the no of retrived xsp of contacts - return iVPbkContactStore->RetrieveVPbkXSPIdL( aContactPackLink ); - } - - // --------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::GetRetrieveXSPIdL -// --------------------------------------------------------------------------- -// -const TDesC& CVIMPSTStorageServiceView::GetRetrieveXSPIdL(TInt aIndex ) - { - TRACER_AUTO; - TRACE( " aIndex = %d",aIndex ); - return iVPbkContactStore->GetRetrieveVPbkXSPIdL( aIndex ); - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::CreateNewContactFromRetrivedIdL -// ----------------------------------------------------------------------------- -// -TInt CVIMPSTStorageServiceView::CreateNewContactFromRetrivedIdL( TInt aIndexToUse ) - { - TRACER_AUTO; - TRACE( "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 ) - { - TRACER_AUTO; - TRACE( "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() - { - TRACER_AUTO; - iVPbkContactStore->DeleteDatabaseL(); - } - -//================================================== from writer interface======================= - // ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::UpdateCacheContactL -// ----------------------------------------------------------------------------- -// -MVIMPSTStorageContact* CVIMPSTStorageServiceView::UpdateCacheContactL(const MVPbkContactLink& aContactLink, - const TDesC& aUserId, - const TDesC& aDisplayName, - const TDesC8& aAvatarContent) - { - TRACER_AUTO; - MVIMPSTStorageContact* contact = FindContactByLink(aContactLink); - if( contact ) - { - TInt oldIndex = IndexOfContact( contact ); - TBool sortNeeded = EFalse; - if( contact->UserId().Compare( aUserId) != 0 ) - { - TRACE( "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( "NotifyAllObserversL delivered" ); - } - if(contact->Name().Compare(aDisplayName) != 0 ) - { - sortNeeded = ETrue; - TRACE( "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( "User id changed" ); - contact->SetAvatarContentL( aAvatarContent,*iVPbkContactStore ); - NotifyAllObserversL( TVIMPSTEnums::EStorageAvatarChange,NULL, contact, KErrNotFound); - TRACE( " NotifyAllObserversL delivered" ); - } - } - return contact; - } -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::AddContactToCacheL -// ----------------------------------------------------------------------------- -MVIMPSTStorageContact* CVIMPSTStorageServiceView::AddContactToCacheL (const MVPbkContactLink& aContactLink, - const TDesC& aUserId, - const TDesC& aDisplayName, - const TDesC8& aAvatarContent, - TVIMPSTEnums::TVIMPSTStorgaeEventType aType ) - { - TRACER_AUTO; - TRACE(" user id: %S", &aUserId); - TRACE( " storageeventtype: %d", aType ); - MVIMPSTStorageContactList* contactList = FindContactListInternal( KFriendList ); - if( !contactList ) - { - contactList = CreateContactListL(KFriendList,KNullDesC); - } - TRACE(" Before findcontactlink" ); - MVIMPSTStorageContact* contact = FindContactByLink(aContactLink); - TRACE( " After findcontactlink check for findcontactuserid" ); - if(!contact && aUserId.Length() ) - { - MVIMPSTStorageContact* contact = FindContactByUserId( aUserId ); - } - TRACE( " After findcontactuserid " ); - if( !contact ) - { - TRACE( " contact not exist "); - TInt error = KErrGeneral; - TInt index = KErrNotFound; - if( aDisplayName.Length() <= 0 && iUnNamedText ) - { - TRACE(" no display name " ); - contact = CVIMPSTStorageContact::NewLC( aUserId, *iUnNamedText , aContactLink ,aAvatarContent ); - } - else - { - TRACE( " 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( "AddStorageContactToCacheL error= %d ",error ); - if( error == KErrNone ) - { - TRACE( "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( " 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( " not success " ); - CleanupStack::PopAndDestroy(); // contact - contact = NULL; - } - } - iIsInvitationItem = EFalse; // reset the flag - return contact; - } -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::AddStorageContactToCacheL -// ----------------------------------------------------------------------------- -// -TInt CVIMPSTStorageServiceView::AddStorageContactToCacheL(MVIMPSTStorageContact* aContactToAdd ) - { - TRACER_AUTO; - 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( " 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( "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( "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( " error = %d ",error ); - 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) - { - TRACER_AUTO; - 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("error = %d ",error ); - return error; - } -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::RemoveAllCacheContactsL -// ----------------------------------------------------------------------------- -// -void CVIMPSTStorageServiceView::RemoveAllCacheContactsL() - { - TRACER_AUTO; - TRACE( " count = %d", iContactListArray.Count()); - iContactListArray.ResetAndDestroy(); - TRACE( " remove sucess" ); - NotifyAllObserversL(TVIMPSTEnums::EStorageAllContactRemoved,NULL,NULL,0 ); - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::GetDefaultContactListL -// ----------------------------------------------------------------------------- -// -MVIMPSTStorageContactList* CVIMPSTStorageServiceView::GetDefaultContactListL() - { - TRACER_AUTO; - MVIMPSTStorageContactList* contactList = FindContactListInternal( KFriendList ); - return contactList; - } -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::NotifyServiceViewL -// ----------------------------------------------------------------------------- -// -void CVIMPSTStorageServiceView::NotifyServiceViewL( TVIMPSTEnums::TVIMPSTStorgaeEventType aEventType, - MVIMPSTStorageContact* aContact /*= NULL */ ) - { - TRACER_AUTO; - NotifyAllObserversL(aEventType,NULL, aContact,0 ); - } - - //================================================== from writer interface end =========================== -// TLinearOrder -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::ContactListOrderByDisplayName -// ----------------------------------------------------------------------------- -// -TInt CVIMPSTStorageServiceView::ContactListOrderByDisplayName( - const CVIMPSTStorageContactList& aContactListA, - const CVIMPSTStorageContactList& aContactListB ) - { - TRACER_AUTO; - return aContactListA.DisplayName().CompareC( aContactListB.DisplayName() ); - } - -// TIdentityRelation -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::ContactListFindByContactListId -// ----------------------------------------------------------------------------- -// -TBool CVIMPSTStorageServiceView::ContactListFindByContactListId( - const CVIMPSTStorageContactList& aContactListA, - const CVIMPSTStorageContactList& aContactListB ) - { - TRACER_AUTO; - const MVIMPSTStorageContactList& listA = aContactListA; - const MVIMPSTStorageContactList& listB = aContactListB; - TRACE(" 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 - { - TRACER_AUTO; - // 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( "itemCount =%d",itemCount ); - return itemCount; - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::Item -// Returns item at given index -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -MVIMPSTStorageItemModel::SItem CVIMPSTStorageServiceView::Item( TInt aIndex ) const - { - TRACER_AUTO; - 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( "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( "Item end" ); - return item; - } - // add expanded list's contact count - count += contactCount; - } - } - // not found - return item; - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::IndexOfContact -// Gets index of contact in list -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TInt CVIMPSTStorageServiceView::IndexOfContact( MVIMPSTStorageContact* aContact ) const - { - TRACER_AUTO; - 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( " indexOfContact = %d", indexOfContact ); - 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 - { - TRACER_AUTO; - TInt listCount( ListCount() ); - TInt itemCount( 0 ); - for( TInt i(0); i sort all -// ----------------------------------------------------------------------------- -// -void CVIMPSTStorageServiceView::Sort( const TDesC& aContactListId /* = KNullDesC */ ) - { - TRACER_AUTO; - if( aContactListId.Length() != 0 ) - { - MVIMPSTStorageContactList* list = FindContactList( aContactListId ); - if( list ) - { - TRACE( " list sort" ); - list->Sort(); - } - } - else - { - TInt count( iContactListArray.Count() ); - for( TInt a( 0 ); a < count; ++a ) - { - MVIMPSTStorageContactList& list = *iContactListArray[ a ]; - TRACE( " all list sort" ); - list.Sort(); - } - } - } - - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::NotifyAllObservers -// ----------------------------------------------------------------------------- -// -void CVIMPSTStorageServiceView::NotifyAllObserversL( TVIMPSTEnums::TVIMPSTStorgaeEventType aType, - MVIMPSTStorageContactList *aList, - MVIMPSTStorageContact* aContact, - TInt aContactIndex ) - { - TRACER_AUTO; - TInt count = iContactObservers.Count(); - for( TInt i=0; iHandleStorageChangeL( aType, aList, aContact, aContactIndex ); - } - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::NotifyAllObserversWithDelay -// ----------------------------------------------------------------------------- -// -void CVIMPSTStorageServiceView::NotifyAllObserversWithDelay( TVIMPSTEnums::TVIMPSTStorgaeEventType aType, - MVIMPSTStorageContactList *aList, - MVIMPSTStorageContact* aContact, - TInt aContactIndex ) - { - TRACER_AUTO; - if(iActiveHandler->IsActive() ) - { - iActiveHandler->Cancel(); - } - iActiveHandler->IssueRequest( aType, aList, aContact, aContactIndex ); - } - -// ----------------------------------------------------------------------------- -// CVIMPSTStorageServiceView::HandleDelayedNotificationL -// ----------------------------------------------------------------------------- -// -void CVIMPSTStorageServiceView::HandleDelayedNotificationL(TVIMPSTEnums::TVIMPSTStorgaeEventType aType, - MVIMPSTStorageContactList *aList, - MVIMPSTStorageContact* aContact, - TInt aContactIndex) - { - TRACER_AUTO; - NotifyAllObserversL( aType, aList, aContact, aContactIndex ); - } -// End of File