--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imservices/instantmessagingcache/imcacheserver/src/ccacheserveractivehelper.cpp Wed Nov 03 09:32:20 2010 +0530
@@ -0,0 +1,778 @@
+/*
+* 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: active helper for server ,owns the main cache arrray
+*
+*/
+
+ // INCLUDE FILES
+#include "ccacheserveractivehelper.h"
+
+#include "cimcachesession.h"
+#include <imcachedefs.h>
+#include "mimcachemessageheader.h"
+#include "cimcacheserver.h"
+#include "timcachemessagefactory.h"
+#include "cimcachemessageheader.h"
+#include "cimcachemessagebase.h"
+#include <ecom/ecom.h>
+ //logs
+#include "imcachedebugtrace.h"
+// ---------------------------------------------------------------------------
+// CCacheServerActiveHelper::NewL()
+// ---------------------------------------------------------------------------
+//
+CCacheServerActiveHelper* CCacheServerActiveHelper::NewL(CIMCacheServer& aServer)
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::NewL begin") );
+ CCacheServerActiveHelper* self = new(ELeave) CCacheServerActiveHelper(aServer);
+ CleanupStack::PushL( self );
+ self->ConstructL( );
+ CleanupStack::Pop( self );
+ TRACE( T_LIT( "CCacheServerActiveHelper::NewL end") );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCacheServerActiveHelper::~CCacheServerActiveHelper()
+// ---------------------------------------------------------------------------
+//
+CCacheServerActiveHelper::~CCacheServerActiveHelper( )
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::~CCacheServerActiveHelper begin") );
+
+ iHeaderArray.ResetAndDestroy();
+ //all items are there in iHeaderArray so no need to call ResetAndDestroy
+ iPluginInfo.ResetAndDestroy();
+ iPluginInfo.Close();
+ TRACE( T_LIT( "CCacheServerActiveHelper::~CCacheServerActiveHelper end") );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CCacheServerActiveHelper::CCacheServerActiveHelper()
+// ---------------------------------------------------------------------------
+//
+CCacheServerActiveHelper::CCacheServerActiveHelper(CIMCacheServer& aServer )
+ :iServer(aServer )
+
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::CCacheServerActiveHelper begin") );
+ TRACE( T_LIT( "CCacheServerActiveHelper::CCacheServerActiveHelper end") );
+ }
+
+// ---------------------------------------------------------------------------
+// CCacheServerActiveHelper::ConstructL()
+// ---------------------------------------------------------------------------
+//
+void CCacheServerActiveHelper::ConstructL()
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::ConstructL begin") );
+ iMessageFactory = new ( ELeave ) TIMCacheMessageFactory;
+ LoadPluginL( );
+ TRACE( T_LIT( "CCacheServerActiveHelper::ConstructL end") );
+ }
+
+// ---------------------------------------------------------------------------
+// CCacheServerActiveHelper::ResetHeaderInoformation()
+// ---------------------------------------------------------------------------
+//
+void CCacheServerActiveHelper::ResetHeaderInoformation()
+
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::ResetHeaderInoformation begin") );
+ TInt count = iHeaderArray.Count() ;
+ for ( TInt i= 0; i< count; i++ )
+ {
+ MIMCacheMessageHeader* header = iHeaderArray[ i ];
+ header->SetChatStarted(EFalse);
+ }
+ TRACE( T_LIT( "CCacheServerActiveHelper::ResetHeaderInoformation end") );
+ }
+// ---------------------------------------------------------
+// CCacheServerActiveHelper::GetUnreadMessageCountL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCacheServerActiveHelper::GetUnreadMessageCountL(const RMessage2& aMessage )
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::GetUnreadMessageCountL start") );
+ // at zero place service id was appended
+ TInt sericeId = aMessage.Int0();
+
+ // at index 1 sender was appended
+ TInt bufferSize( aMessage.GetDesLength( 1 ) );
+ HBufC* buddyId = HBufC::NewLC( bufferSize );
+ TPtr buddyIdPtr = buddyId->Des();
+ aMessage.ReadL( 1, buddyIdPtr );
+
+ TInt headerIndex = iMessageFactory->FindHeaderIndexL(iHeaderArray, sericeId, buddyIdPtr );
+ TInt unreadCount = 0;
+ if( headerIndex != KErrNotFound ) //if match is found
+ {
+ MIMCacheMessageHeader* newHeader = iHeaderArray[ headerIndex ];
+
+ unreadCount = newHeader->UnreadMessageCount();
+
+ }
+ TPckgC<TInt> pack( unreadCount );
+ aMessage.WriteL( 2, pack );
+
+ CleanupStack::PopAndDestroy(buddyId);
+ TRACE( T_LIT( "CCacheServerActiveHelper::GetUnreadMessageCountL end") );
+ }
+// ---------------------------------------------------------
+// CCacheServerActiveHelper::GetAllUnreadMessageCountL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCacheServerActiveHelper::GetAllUnreadMessageCountL(const RMessage2& aMessage )
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::GetAllUnreadMessageCountL start") );
+ // at zero place service id was appended
+ TInt sericeId = aMessage.Int0();
+
+ TInt unreadCount = 0;
+
+ TInt headerCount = iHeaderArray.Count();
+
+ for( TInt i=0; i< headerCount; i++ )
+ {
+ // note in this case reciepient is own user id
+ MIMCacheMessageHeader* header = iHeaderArray[i];
+ if( header->ServiceId() == sericeId )
+ {
+ unreadCount = unreadCount + header->UnreadMessageCount();
+ }
+ }
+
+ TPckgC<TInt> pack( unreadCount );
+ aMessage.WriteL( 1, pack );
+
+
+ TRACE( T_LIT( "CCacheServerActiveHelper::GetAllUnreadMessageCountL end") );
+ }
+// ---------------------------------------------------------
+// CCacheServerActiveHelper::StartNewConversationL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCacheServerActiveHelper::StartNewConversationL( const RMessage2& aMessage )
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::StartNewConversationL start") );
+ // at zero place service id was appended
+ TInt sericeId = aMessage.Int0();
+
+ // at index 1 sender was appended
+ TInt bufferSize( aMessage.GetDesLength( 1 ) );
+ HBufC* buddyId = HBufC::NewLC( bufferSize );
+ TPtr buddyIdPtr = buddyId->Des();
+ aMessage.ReadL( 1, buddyIdPtr );
+
+ TInt messageCount = 0;
+
+ MIMCacheMessageHeader* chatHeader = ChatHeaderL( sericeId, buddyIdPtr );
+
+ if( chatHeader == NULL ) //if match is not found
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::StartNewConversationL Fresh conversation") );
+ chatHeader = iMessageFactory->CreateIMCacheMessageHeaderL(sericeId, buddyIdPtr );
+ // insert always on top
+ iHeaderArray.InsertL(chatHeader , 0);
+
+ iActiveHeader = chatHeader;
+
+ chatHeader->SetChatStarted(ETrue);
+
+ PackAndNotifyEventL( EIMOperationChatStarted, sericeId, iActiveHeader , NULL );
+ }
+ else if( !chatHeader->IsChatStarted() ) //if match is found
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::StartNewConversationL existing conversation") );
+
+ chatHeader->SetChatStarted(ETrue);
+
+ iActiveHeader = chatHeader ;
+
+ iActiveHeader->MarkAllRead();
+
+ messageCount = iActiveHeader->MessageCount();
+
+ if( messageCount )
+ {
+ PackAndNotifyEventL(EIMOperationFetchAll, sericeId, iActiveHeader, NULL );
+ // still fetching is not completed, until EIMOperationCompleted
+ }
+ TRACE( T_LIT( "CCacheServerActiveHelper::StartNewConversationL start fetching") );
+ }
+ else
+ {
+ iActiveHeader = chatHeader;
+
+ iActiveHeader->MarkAllRead();
+
+ PackAndNotifyEventL(EIMOperationUnreadChange, sericeId, iActiveHeader , NULL );
+ // once request is completed, mark as fetch completed
+ }
+ // if there are no unread messages then reset the status pane indicator.
+ TInt unreadCount = 0;
+ TInt currentContactUnReadCount = 0;
+ TInt headerCount = iHeaderArray.Count();
+ TInt id = 0;
+ for( TInt i=0; i< headerCount; i++ )
+ {
+ // note in this case reciepient is own user id
+ MIMCacheMessageHeader* header = iHeaderArray[i];
+ if( header->ServiceId() == sericeId )
+ {
+ if(buddyId->Compare(iHeaderArray[i]->BuddyId()) == 0)
+ {
+ currentContactUnReadCount = header->UnreadMessageCount();
+ }
+ if(header->UnreadMessageCount())
+ {
+ id = i;
+ }
+
+ }
+ }
+
+ if(!currentContactUnReadCount)
+ {
+ PublishMessageInfoL(iHeaderArray[id]->BuddyId(),sericeId);
+ }
+
+ CleanupStack::PopAndDestroy(buddyId);
+
+ TRACE( T_LIT( "CCacheServerActiveHelper::StartNewConversationL end") );
+ }
+
+
+// ---------------------------------------------------------
+// CCacheServerActiveHelper::AppendReceiveMessageL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCacheServerActiveHelper::AppendReceiveMessageL( const RMessage2 &aMessage )
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::AppendReceiveMessageL start") );
+ // at zero pace service id was apended
+ TInt sericeId = aMessage.Int0();
+
+ // at index 1 sender was appended
+ TInt bufferSize( aMessage.GetDesLength( 1 ) );
+ HBufC* buddyId = HBufC::NewLC( bufferSize );
+ TPtr buddyIdPtr = buddyId->Des();
+ aMessage.ReadL( 1, buddyIdPtr );
+
+ // at index 2 text was appended
+ bufferSize = aMessage.GetDesLength( 2 ) ;
+ HBufC* text = HBufC::NewLC( bufferSize );
+ TPtr textPtr = text->Des();
+ aMessage.ReadL( 2, textPtr );
+
+ TRACE( T_LIT( "CCacheServerActiveHelper::AppendReceiveMessageL Msg %S"), &textPtr );
+
+ MIMCacheMessageHeader* chatHeader = ChatHeaderL( sericeId, buddyIdPtr );
+
+ CIMCacheMessageBase* newmessage = NULL;
+
+ if( chatHeader == NULL ) //if match is not found
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::AppendReceiveMessageL Fresh conversation") );
+ chatHeader = iMessageFactory->CreateIMCacheMessageHeaderL(sericeId, buddyIdPtr);
+ // insert always on top
+ iHeaderArray.InsertL(chatHeader , 0);
+
+ newmessage = iMessageFactory->CreateCacheMessageL( textPtr );
+ newmessage->SetMessageType( EIMCMessagePTOP );
+ newmessage->SetMessagerType( EIMCMessageReceived );
+
+ chatHeader->AppendMessageL(newmessage);
+
+ PublishMessageInfoL(*buddyId,sericeId);
+
+ // no notification so for this is for servicetab
+ // here need to notify for all session
+ // fresh conversation started
+
+ PackAndNotifyEventL( EIMOperationChatAdded, sericeId, chatHeader ,newmessage );
+
+ }
+ else // chat found
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::AppendReceiveMessageL existing conversation") );
+ // this is called from network side
+ // here we dont know about ui client wheather this active conversation is active or not.
+
+ newmessage = iMessageFactory->CreateCacheMessageL( textPtr );
+ newmessage->SetMessageType( EIMCMessagePTOP );
+ newmessage->SetMessagerType( EIMCMessageReceived );
+ chatHeader->AppendMessageL(newmessage);
+
+ // notify all registeed session about this changed
+ // this has happened on active conversation
+
+ if( chatHeader == iActiveHeader )
+ {
+ //cv tab is active notify it.
+ PackAndNotifyEventL( EIMOperationMessageAdded, sericeId, chatHeader, newmessage );
+ }
+ else
+ {
+ PublishMessageInfoL(*buddyId,sericeId);
+ //cv tab is not active notify it.
+ PackAndNotifyEventL( EIMOperationUnreadMessage, sericeId, chatHeader , newmessage );
+ }
+ }
+ CleanupStack::PopAndDestroy(2);//text,buddyId
+ // else TODO mark unread messagesinto buffer
+ TRACE( T_LIT( "CCacheServerActiveHelper::AppendReceiveMessageL end") );
+ }
+// ---------------------------------------------------------
+// CCacheServerActiveHelper::AppendSendMessageL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCacheServerActiveHelper::AppendSendMessageL( const RMessage2 &aMessage )
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::AppendSendMessageL start") );
+
+ // at index 0 text was appended
+ TInt bufferSize = aMessage.GetDesLength( 0 ) ;
+ HBufC* text = HBufC::NewLC( bufferSize );
+ TPtr textPtr = text->Des();
+ aMessage.ReadL( 0, textPtr );
+
+ TRACE( T_LIT( "CCacheServerActiveHelper::AppendSendMessageL Msg %S"), &textPtr );
+
+ if( iActiveHeader )
+ {
+ CIMCacheMessageBase* message = iMessageFactory->CreateCacheMessageL( textPtr );
+ message->SetMessageType( EIMCMessagePTOP );
+ message->SetMessagerType( EIMCMessageSent );
+ message->SetRead();
+
+ iActiveHeader->AppendMessageL(message);
+ }
+ CleanupStack::PopAndDestroy(text); // text
+
+ TRACE( T_LIT( "CCacheServerActiveHelper::AppendSendMessageL end") );
+ }
+
+// ---------------------------------------------------------
+// CCacheServerActiveHelper::AppendMessageL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCacheServerActiveHelper::AppendMessageL( const RMessage2 &aMessage )
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::AppendMessageL start") );
+ // this is get called from active conversation only.
+ // this append the normal information message ,
+ // please note, this is not sent/recieved message
+ // at 0 place text was appended
+ // this is get called from conversation only system emssage
+ // will get addded when buddy presence changes.
+ TInt sericeId = aMessage.Int0();
+
+ // at index 1 sender was appended
+ TInt bufferSize( aMessage.GetDesLength( 1 ) );
+ HBufC* buddyId = HBufC::NewLC( bufferSize );
+ TPtr buddyIdPtr = buddyId->Des();
+ aMessage.ReadL( 1, buddyIdPtr );
+
+ // at index 2 text was appended
+ bufferSize = aMessage.GetDesLength( 2 ) ;
+ HBufC* text = HBufC::NewLC( bufferSize );
+ TPtr textPtr = text->Des();
+ aMessage.ReadL( 2, textPtr );
+
+ TRACE( T_LIT( "CCacheServerActiveHelper::AppendSendMessageL Msg %S"), &textPtr );
+
+ MIMCacheMessageHeader* chatHeader = ChatHeaderL( sericeId, buddyIdPtr );
+
+ if( chatHeader != NULL )
+ {
+ CIMCacheMessageBase* message = iMessageFactory->CreateCacheMessageL( textPtr );
+ message->SetMessageType( EIMCMessageSystem );
+ message->SetMessagerType( EIMCMessageOther );
+ message->SetRead();
+ chatHeader->AppendMessageL(message);
+ }
+ CleanupStack::PopAndDestroy(2); //buddyId, text
+
+ TRACE( T_LIT( "CCacheServerActiveHelper::AppendMessageL end") );
+ }
+// ---------------------------------------------------------
+// CCacheServerActiveHelper::CloseConversationL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCacheServerActiveHelper::CloseConversationL( const RMessage2 &aMessage )
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::CloseConversationL start") );
+ // at zero pace service id was apended
+ TInt sericeId = aMessage.Int0();
+
+ // at index 1 sender was appended
+ TInt bufferSize( aMessage.GetDesLength( 1 ) );
+ HBufC* buddyId = HBufC::NewLC( bufferSize );
+ TPtr buddyIdPtr = buddyId->Des();
+ aMessage.ReadL( 1, buddyIdPtr );
+
+ TInt headerIndex = iMessageFactory->FindHeaderIndexL(iHeaderArray, sericeId, buddyIdPtr ) ;
+
+ if( headerIndex != KErrNotFound ) //if match is found
+ {
+ MIMCacheMessageHeader* msgHeader = iHeaderArray[headerIndex];
+ iHeaderArray.Remove(headerIndex);
+ if(msgHeader == iActiveHeader)
+ {
+ 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, ETrue);
+ }
+ // 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,ETrue);
+ }
+ PackAndNotifyEventL( EIMOperationChatDeleted, sericeId, msgHeader, NULL );
+
+ delete msgHeader;
+ iHeaderArray.Compress();
+
+ }
+ CleanupStack::PopAndDestroy(buddyId); // buddyId
+
+ TRACE( T_LIT( "CCacheServerActiveHelper::CloseConversationL end") );
+ }
+// ---------------------------------------------------------
+// CCacheServerActiveHelper::CloseAllConversationL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCacheServerActiveHelper::CloseAllConversationL( TInt aServiceId )
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::CloseAllConversationL start") );
+ TBool needToNotify = EFalse;
+ for( TInt index=0; index<iHeaderArray.Count();index++ )
+ {
+ MIMCacheMessageHeader* msgHeader = iHeaderArray[index];
+ if( msgHeader->ServiceId() == aServiceId )
+ {
+ iHeaderArray.Remove(index);
+ if(msgHeader == iActiveHeader)
+ {
+ iActiveHeader = NULL;
+ }
+ delete msgHeader;
+ msgHeader = NULL;
+ iHeaderArray.Compress();
+ index = index-1;// start from same index again
+ needToNotify = ETrue;
+ }
+ }
+ if( needToNotify )
+ {
+ // remove the universal indicator notification if there it was displayed,
+ // as when you logout all the ocnversations are removed.
+ PublishMessageInfoL(KNullDesC(), aServiceId, ETrue);
+
+ PackAndNotifyEventL( EIMOperationAllChatDeleted, aServiceId, NULL, NULL );
+ }
+ TRACE( T_LIT( "CCacheServerActiveHelper::CloseAllConversationL End") );
+ }
+// ---------------------------------------------------------
+// CCacheServerActiveHelper::DeactivateConversationL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCacheServerActiveHelper::DeactivateConversationL()
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::DeactivateConversationL start") );
+ // this is get called from active conversation only.
+ if( iActiveHeader )
+ {
+ iActiveHeader->MarkAllRead();
+ }
+ iActiveHeader = NULL;
+ TRACE( T_LIT( "CCacheServerActiveHelper::DeactivateConversationL end") );
+ }
+
+// ---------------------------------------------------------
+// CCacheServerActiveHelper::CheckConversationExistL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCacheServerActiveHelper::CheckConversationExistL( const RMessage2& aMessage )
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::CheckConversationExistL start") );
+ // at zero place service id was appended
+ TInt sericeId = aMessage.Int0();
+
+ // at index 1 sender was appended
+ TInt bufferSize( aMessage.GetDesLength( 1 ) );
+ HBufC* buddyId = HBufC::NewLC( bufferSize );
+ TPtr buddyIdPtr = buddyId->Des();
+ aMessage.ReadL( 1, buddyIdPtr );
+
+ TInt headerIndex = iMessageFactory->FindHeaderIndexL(iHeaderArray, sericeId, buddyIdPtr ) ;
+
+ TBool conversationExist = EFalse;
+
+ if( headerIndex != KErrNotFound ) //if match is found
+ {
+ conversationExist = ETrue;
+ }
+ TPckgC<TBool> pack( conversationExist );
+ aMessage.WriteL(2, pack );
+
+ CleanupStack::PopAndDestroy(buddyId); // buddyId
+
+ TRACE( T_LIT( "CCacheServerActiveHelper::CheckConversationExistL end") );
+ }
+
+// ---------------------------------------------------------
+// CCacheServerActiveHelper::PackAndNotifyEventL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCacheServerActiveHelper::PackAndNotifyEventL( TIMCacheOperationsCode aNotification,
+ TInt aServiceId,
+ MIMCacheMessageHeader* aChatHeader /*=NULL*/,
+ CIMCacheMessageBase* aMessage /*=NULL*/)
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::PackAndNotifyEventL start") );
+
+ iServer.PackAndNotifyEventL( aNotification, aServiceId, aChatHeader, aMessage );
+
+ TRACE( T_LIT( "CCacheServerActiveHelper::PackAndNotifyEventL end") );
+ }
+
+
+// ---------------------------------------------------------
+// CCacheServerActiveHelper::GetServiceChatHeaderArrayL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCacheServerActiveHelper::GetServiceChatHeaderArrayL(TInt aServiceId , RPointerArray<MIMCacheMessageHeader>& aServiceHeaderArray)
+ {
+ TRACE( T_LIT( "CCacheServerActiveHelper::GetServiceChatHeaderArrayL start") );
+
+ CleanupClosePushL(aServiceHeaderArray);
+
+ if( -1 == aServiceId )
+ {
+ aServiceHeaderArray = iHeaderArray;
+ }
+ else
+ {
+ for( TInt i= 0 ; i < iHeaderArray.Count() ; i++ )
+ {
+ MIMCacheMessageHeader* header = iHeaderArray[i];
+ if( header->ServiceId() == aServiceId )
+ {
+ aServiceHeaderArray.AppendL(header);
+ }
+ }
+ }
+ CleanupStack::Pop(&aServiceHeaderArray);
+ TRACE( T_LIT( "CCacheServerActiveHelper::GetServiceChatHeaderArrayL end") );
+ }
+
+// ---------------------------------------------------------
+// CCacheServerActiveHelper::ChatHeaderL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+MIMCacheMessageHeader* CCacheServerActiveHelper::ChatHeaderL(const TInt& aServiceId, const TDesC& aBuddyId )
+ {
+ MIMCacheMessageHeader* header = NULL;
+ TInt headerCount = iHeaderArray.Count();
+
+ for( TInt index = 0 ; index < headerCount ; index++ )
+ {
+ header = iHeaderArray[index];
+ if( header )
+ {
+ if( ( aServiceId == header->ServiceId() ) && ( aBuddyId.CompareC( header->BuddyId() ) == 0 ) )
+ {
+ break;
+ }
+ }
+ header = NULL;
+ }
+ return header;
+ }
+// -----------------------------------------------------------------------------
+// CCacheServerActiveHelper::ChatHeaderAt
+// name of history data
+// -----------------------------------------------------------------------------
+//
+MIMCacheMessageHeader* CCacheServerActiveHelper::ChatHeaderAt( TInt aIndex )
+ {
+ if( aIndex >= ChatHeadersCount() )
+ {
+ return NULL;
+ }
+ return iHeaderArray[aIndex];
+ }
+
+// -----------------------------------------------------------------------------
+// CCacheServerActiveHelper::ChatHeadersCount
+// name of history data
+// -----------------------------------------------------------------------------
+//
+TInt CCacheServerActiveHelper::ChatHeadersCount()
+ {
+ return iHeaderArray.Count();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCacheServerActiveHelper::PublishMessageInfoL()
+// name of history data
+// -----------------------------------------------------------------------------
+//
+void CCacheServerActiveHelper::PublishMessageInfoL(const TDesC& aSenderId,TInt aServiceId,
+ TBool aCloseConversation /*= EFalse*/ )
+ {
+ // set/reset the status pane indicator here
+ // based on the unread count.
+ // as we need to show the indicator only for the received messages
+ TInt unreadCount = 0;
+ TInt multipleSender = 0;
+ TInt headerCount = iHeaderArray.Count();
+ TRACE(T_LIT( "CCacheServerActiveHelper::PublishMessageInfoL headerCount -- %d"), headerCount);
+ 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() == aServiceId && header->UnreadMessageCount() )
+ {
+ unreadCount = unreadCount + header->UnreadMessageCount();
+ multipleSender ++;
+ }
+ }
+ TRACE(T_LIT( "CCacheServerActiveHelper::PublishMessageInfoL multipleSender -- %d"), multipleSender);
+ // Get the number of plugins
+ const TInt count = iPluginInfo.Count();
+ // Loop though all the command handlers, If DynInitMenuPaneL leaves for one plugin, a plugin
+ // error message will be displayed and the loop will continue with
+ // the next command handler. If none of the plugins leave, there will
+ // be only one TRAP used.
+ for ( TInt index = 0; index < count; ++index )
+ {
+ //trap is required if one plugin leaves then it should continue with other plugins.
+ TRAP_IGNORE(iPluginInfo[index]->Plugin().MessageInfoL(unreadCount,aServiceId,aSenderId,multipleSender,aCloseConversation));
+ }
+ }
+ // -----------------------------------------------------------------------------
+ // CCacheServerActiveHelper::LoadPluginL
+ // -----------------------------------------------------------------------------
+ //
+ void CCacheServerActiveHelper::LoadPluginL( )
+ {
+ // plugininfo array, Owned
+ RImplInfoPtrArray pluginInfo;
+ iPluginInfo.ResetAndDestroy();
+ REComSession::ListImplementationsL( KINSTANTMSGINTERFACEUID,pluginInfo );
+ TInt pluginCount = pluginInfo.Count();
+ for ( TInt pluginIndex(0); pluginIndex < pluginCount; ++pluginIndex )
+ {
+ TUid pluginUid = pluginInfo[pluginIndex]->ImplementationUid();
+ // Creates the plugin and transfers ownership of the services
+ // object to the plugin.
+ CInstantMsgIndicator* plugin = NULL;
+ TRAPD(error, plugin = CInstantMsgIndicator::CreateImplementationL( pluginUid ));
+
+ if(KErrNone != error)
+ {
+ // handle the error here.
+ // error loading the plugin
+ }
+ else
+ {
+ // plugin loaded sucessfully
+ //if its here its sure that plugin is not null;
+ //add the plugin to the array
+ CPluginInfo* newPlugin = new ( ELeave ) CCacheServerActiveHelper::CPluginInfo( plugin, pluginUid);
+ CleanupStack::PushL( newPlugin );
+ iPluginInfo.AppendL( newPlugin );
+ CleanupStack::Pop( newPlugin );
+
+ }
+
+ }
+ pluginInfo.ResetAndDestroy();
+ pluginInfo.Close();
+ }
+ // ----------------------------------------------------------------------------
+ // CCacheServerActiveHelper::CPluginInfo::CPluginInfo(
+ // C++ constructor
+ // (other items were commented in a header).
+ // ----------------------------------------------------------------------------
+ //
+ CCacheServerActiveHelper::CPluginInfo::CPluginInfo(
+ CInstantMsgIndicator* aPlugin,
+ TUid aPluginUid )
+ : iPlugin( aPlugin ),
+ iPluginUid( aPluginUid )
+ {
+
+ }
+ // ----------------------------------------------------------------------------
+ // CCacheServerActiveHelper::CPluginInfo::~CPluginInfo(
+ // C++ destructor
+ // (other items were commented in a header).
+ // ----------------------------------------------------------------------------
+ //
+ CCacheServerActiveHelper::CPluginInfo::~CPluginInfo()
+ {
+ delete iPlugin;
+ }
+ // -----------------------------------------------------------------------------
+ // CCacheServerActiveHelper::LoadPluginL
+ // -----------------------------------------------------------------------------
+ //
+ CInstantMsgIndicator& CCacheServerActiveHelper::CPluginInfo::Plugin()
+ {
+ return *iPlugin;
+ }
+/// end of file