diff -r 0b696286a1b2 -r e1ad3c803639 imservices/instantmessagingcache/imcacheserver/src/ccacheserveractivehelper.cpp --- a/imservices/instantmessagingcache/imcacheserver/src/ccacheserveractivehelper.cpp Mon Mar 15 12:41:57 2010 +0200 +++ b/imservices/instantmessagingcache/imcacheserver/src/ccacheserveractivehelper.cpp Wed Mar 31 22:05:52 2010 +0300 @@ -430,7 +430,37 @@ { iActiveHeader = NULL; } - + // remove the universal indicator notification if there are no more unread messages, + // apart form whose conversation is closed. loop through + TInt headerCount = iHeaderArray.Count(); + headerIndex = KErrNotFound; + for( TInt i=0; i< headerCount; i++ ) + { + // note in this case reciepient is own user id + MIMCacheMessageHeader* header = iHeaderArray[i]; + TRACE(T_LIT( "CCacheServerActiveHelper::PublishMessageInfoL UnreadMessageCount -- %d"), header->UnreadMessageCount()); + if( header->ServiceId() == sericeId && header->UnreadMessageCount() ) + { + // this is required in the following scenario + // you receive 10 new messgaes form two parties(5, each) + // whne you close the conversation form one, the universal indicator is still + // for the other party's messages, and when clicked on universal indicator it should + // open the conversation view wiht the latest user id. + headerIndex = i; + } + } + // there are new messages received form only one party. + // hence the buddyid is required as conversation view will be openend. + if(KErrNone == headerIndex) + { + PublishMessageInfoL(iHeaderArray[headerIndex]->BuddyId(), sericeId); + } + // new messages are recieved from multiple parties, hence no need of the sender id + // as the service tab will be opened. + else + { + PublishMessageInfoL(KNullDesC(), sericeId); + } PackAndNotifyEventL( EIMOperationChatDeleted, sericeId, msgHeader, NULL ); delete msgHeader; @@ -469,6 +499,10 @@ } if( needToNotify ) { + // remove the universal indicator notification if there it was displayed, + // as when you logout all the ocnversations are removed. + PublishMessageInfoL(KNullDesC(), aServiceId); + PackAndNotifyEventL( EIMOperationAllChatDeleted, aServiceId, NULL, NULL ); } TRACE( T_LIT( "CCacheServerActiveHelper::CloseAllConversationL End") );