diff -r cd2816114bd1 -r e64954c2c8e2 emailservices/emailserver/cmailhandlerplugin/src/cmailcpssettings.cpp --- a/emailservices/emailserver/cmailhandlerplugin/src/cmailcpssettings.cpp Wed Apr 14 15:42:15 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/src/cmailcpssettings.cpp Tue Apr 27 16:20:14 2010 +0300 @@ -122,45 +122,104 @@ void CMailCpsSettings::LoadSettingsL() { FUNC_LOG; - // Clean up local settings cache - iMailboxArray.Reset(); TInt ret( KErrNone ); - - // Load mailbox array - RArray keys; + + // mailbox keys + RArray cenrepMailboxes; + CleanupClosePushL( cenrepMailboxes ); + RArray cenrepMailboxesExistence; + CleanupClosePushL( cenrepMailboxesExistence ); + + // cenrep keys + RArray keys; CleanupClosePushL( keys ); GetMailboxNonZeroKeysL( keys ); - const TInt iiMax( keys.Count() ); - for ( TInt ii = 0; ii < iiMax; ii++ ) + TInt dMax( keys.Count() ); + + cenrepMailboxes.ReserveL( dMax ); + cenrepMailboxesExistence.ReserveL( dMax ); + + // make array of mailbox keys + TInt value( 0 ); + TInt i; + for ( i = 0; i < dMax; i++ ) + { + User::LeaveIfError( ret = iCenRep->Get( keys[i], value )); + cenrepMailboxes.AppendL( static_cast(value) ); + cenrepMailboxesExistence.AppendL( EFalse ); + } + CleanupStack::PopAndDestroy(&keys); + + // Sync array of cenrep keys with iMailboxArray + // remove from array what is not in cenrep + TInt dFound( KErrNotFound ); + for ( i = iMailboxArray.Count()-1; i >= 0; i -- ) { - TInt value( 0 ); - ret = iCenRep->Get( keys[ii], value ); - if ( ret ) - { - User::Leave( ret ); + dFound = cenrepMailboxes.Find( iMailboxArray[i].Id() ); + if ( KErrNotFound != dFound ) + { + // mailbox is in iMailboxArray and in cenrep => check provider + INFO_1("Mailbox both in cenrep and iMailboxArray: i = %d ", i ); + ret = CheckMailboxExistence( iMailboxArray[i] ); + if ( KErrNotFound == ret) + { + // mailbox was removed from provider => remove from cenrep also + // cenrepMailboxes indexed the same way as keys => finding key not needed + ret = iCenRep->Reset( KCMailMailboxIdBase + i ); + ret = iCenRep->Reset( KCMailPluginIdBase + i ); + ret = iCenRep->Reset( KCMailWidgetContentIdBase + i ); + INFO_1("Mailbox removed from cenrep: dFound %d ", dFound ); + } + else + { + User::LeaveIfError(ret); // for instance if no memory + INFO_1("Mailbox provider check ok: dFound = %d ", dFound ); + } + cenrepMailboxesExistence[dFound] = ETrue; // not remove to ensure indexes are the same as in keys } else { + // mailbox was removed from cenrep => remove from array + iMailboxArray.Remove(i); + INFO_1("Mailbox removed from iMailboxArray: i = %d ", i ); + } + } + // Check order and new mailboxes + TInt j(0); + for ( i = 0; i < dMax; i++ ) + { + // new mailboxes in cenrep needs to be added to iMailboxArray + if ( ! cenrepMailboxesExistence[i] ) + { TFSMailMsgId mailbox; - ret = ResolveMailbox( value, mailbox ); - if ( ret ) + // Find mailbox by this function because cenrep does not hold pluginID + if ( KErrNone == ResolveMailbox( cenrepMailboxes[i], mailbox ) ) { - INFO("CMailCpsSettings::LoadSettingsL(): Error: ignore this entry"); - // Resolving encountered error, ignore this entry - ret = iCenRep->Reset( KCMailMailboxIdBase+ii ); - ret = iCenRep->Reset( KCMailPluginIdBase+ii ); - ret = iCenRep->Reset( KCMailWidgetContentIdBase+ii ); - if ( ret ) + iMailboxArray.Insert( mailbox, i ); + INFO_1("Mailbox added to iMailboxArray: i = %d ", i ); + } + } + // Check if order is OK + if ( iMailboxArray[i].Id() != cenrepMailboxes[i] ) + { + TInt jMax( iMailboxArray.Count() ); + for ( j = i+1; j <= jMax; j++ ) + { + if ( iMailboxArray[j].Id() == cenrepMailboxes[i]) { + iMailboxArray.Insert( iMailboxArray[j], i ); + iMailboxArray.Remove( j+1 );// insertion increased indices + break; } } - else + if (j == jMax) // arrays not in sync error { - iMailboxArray.AppendL( mailbox ); + User::Leave( KErrNotFound ); } } } - CleanupStack::PopAndDestroy(); // CleanupClosePushL( keys ) + CleanupStack::PopAndDestroy(&cenrepMailboxesExistence); + CleanupStack::PopAndDestroy(&cenrepMailboxes); } // --------------------------------------------------------------------------- @@ -217,7 +276,7 @@ FUNC_LOG; RPointerArray mailboxarray; TInt err = iMailClient.ListMailBoxes( TFSMailMsgId(), mailboxarray ); - INFO_1("CMailCpsSettings::ResolveMailbox(): : ListMailBoxes() returns %d", err); + INFO_1("CMailCpsSettings::ResolveMailbox():: ListMailBoxes() returns %d", err); if( !err ) // KErrNone = 0 { err = KErrNotFound; @@ -238,6 +297,28 @@ return err; } +TInt CMailCpsSettings::CheckMailboxExistence( TFSMailMsgId& aMsg ) + { + FUNC_LOG; + CFSMailBox *mbox( NULL ); + TRAPD(err, mbox = iMailClient.GetMailBoxByUidL(aMsg)); + if ( mbox ) // mail box exists + { + delete mbox; + return KErrNone; + } + if ( ( KErrNotFound == err ) || ( KErrNone == err ) ) + { + // mail box not exists, chek if it is not in different plugin + // very safe, maybe return KErrNotFound would be enough + return ResolveMailbox( aMsg.Id(), aMsg ); + } + return err; + } + + + + // --------------------------------------------------------------------------- // CMailCpsSettings::StartObservingL // --------------------------------------------------------------------------- @@ -305,7 +386,7 @@ CleanupStack::Pop( account ); } - CleanupStack::PopAndDestroy(); // keys + CleanupStack::PopAndDestroy(&keys); // keys } // --------------------------------------------------------------------------- @@ -370,7 +451,7 @@ { } - CleanupStack::PopAndDestroy(); // CleanupClosePushL( keys ); + CleanupStack::PopAndDestroy( &keys ); // keys } @@ -547,6 +628,27 @@ } // --------------------------------------------------------------------------- +// CMailCpsSettings::WidgetCountByMailbox +// --------------------------------------------------------------------------- +// +TInt CMailCpsSettings::WidgetCountByMailbox( TInt aMailboxId ) + { + FUNC_LOG; + TInt ret(0); + for (TInt i = 0; i < KMaxMailboxCount; i++) + { + TInt value; + TUint32 mailboxKey(KCMailMailboxIdBase+i); + iCenRep->Get( mailboxKey, value ); + if (aMailboxId == value) + { + ret++; + } + } + return ret; + } + +// --------------------------------------------------------------------------- // CMailCpsSettings::IsSelected // --------------------------------------------------------------------------- // @@ -636,6 +738,7 @@ RPointerArray mailboxarray; iMailClient.ListMailBoxes( TFSMailMsgId(), mailboxarray ); TInt ret = mailboxarray.Count(); + mailboxarray.ResetAndDestroy(); return ret; } @@ -678,28 +781,35 @@ } // ----------------------------------------------------------------------------- -// CMailCpsSettings::GetNewMailState +// CMailCpsSettings::GetNewMailStateL // ----------------------------------------------------------------------------- -TBool CMailCpsSettings::GetNewMailState( const TFSMailMsgId& aMailBox ) +TBool CMailCpsSettings::GetNewMailStateL( const TFSMailMsgId& aMailBox, TInt aUnreadCount ) { FUNC_LOG; TBool ret(EFalse); - TBuf mailbox; - mailbox.Num(aMailBox.Id()); + if ( aUnreadCount ) + { + TBuf mailbox; + mailbox.Num(aMailBox.Id()); - TBuf str; - str.Copy(KStartSeparator); - str.Append(mailbox); - str.Append(KEndSeparator); + TBuf str; + str.Copy(KStartSeparator); + str.Append(mailbox); + str.Append(KEndSeparator); - TBuf stored; - TUint32 key(KCMailMailboxesWithNewMail); - iCenRep->Get( key, stored ); + TBuf stored; + TUint32 key(KCMailMailboxesWithNewMail); + iCenRep->Get( key, stored ); - TInt result = stored.Find(str); - if (result >= 0) + TInt result = stored.Find(str); + if (result >= 0) + { + ret = ETrue; + } + } + else { - ret = ETrue; + ToggleWidgetNewMailIconL( EFalse, aMailBox ); } return ret; }