imstutils/imconversationview/imcvuiengine/src/cimcvengineopenchats.cpp
changeset 0 5e5d6b214f4f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imstutils/imconversationview/imcvuiengine/src/cimcvengineopenchats.cpp	Tue Feb 02 10:12:18 2010 +0200
@@ -0,0 +1,386 @@
+/*
+* Copyright (c) 2006 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:  Implementation for Open ConversationList 
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "cimcvengineopenchats.h"
+#include "cimcvenginemessagehandler.h"
+#include "mimcvenginechatinterface.h"
+#include "mimcvenginemessagecontainerinfo.h"
+
+#include <escapeutils.h>
+#include <collate.h>
+#include "imcvuiliterals.h"
+#include "imcvlogger.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats : Ctor
+//
+// -----------------------------------------------------------------------------
+//
+CIMCVEngineOpenChats::CIMCVEngineOpenChats(CIMCVEngineMessageHandler& aMessageHandler, 
+								MIMCVEngineChatInterface& aChatInterface) :    
+     iActiveItem(-1),
+     iMessageHandler(aMessageHandler),
+     iChatInterface(aChatInterface)
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats : NewL
+//
+// -----------------------------------------------------------------------------
+//
+CIMCVEngineOpenChats* CIMCVEngineOpenChats::NewL(CIMCVEngineMessageHandler& aMessageHandler,
+								MIMCVEngineChatInterface& aChatInterface,TInt aServiceId )
+    {
+    CIMCVEngineOpenChats* self = new ( ELeave ) CIMCVEngineOpenChats(aMessageHandler, aChatInterface);     
+    self->ConstructL(aServiceId);       
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats : Destructor
+//
+// -----------------------------------------------------------------------------
+//
+CIMCVEngineOpenChats::~CIMCVEngineOpenChats()
+    {
+    iChatInterface.UnregisterNewMsgObserver();  
+    iChatInterface.UnregisterChatListObserver(this);  
+    iOpenChatsArray.Reset();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats: GetDisplayNameL
+// -----------------------------------------------------------------------------
+//
+TPtrC CIMCVEngineOpenChats::GetDisplayNameL(TInt aIndex) const
+	{
+	if ( (aIndex >= iOpenChatsArray.Count()) || (aIndex <0) )
+	    {	      
+	    User::LeaveIfError(KErrArgument);
+	    }
+    else 
+		{		
+		
+		MIMCVEngineMessageReadInterface* arrayItem = 
+						(MIMCVEngineMessageReadInterface*) iOpenChatsArray[aIndex];
+		
+		if (arrayItem)
+			{
+			return arrayItem->Name();				
+			}			
+		}
+		
+		return TPtrC(KNullDesC);
+	}
+	
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats: GetTargetIdL
+// -----------------------------------------------------------------------------
+//
+const TDesC& CIMCVEngineOpenChats::GetTargetIdL(TInt aIndex) const
+	{
+	if ( ( aIndex < iOpenChatsArray.Count() ) && (aIndex >= 0 ) )
+	    {	      
+			MIMCVEngineMessageReadInterface* arrayItem = 
+						(MIMCVEngineMessageReadInterface *)iOpenChatsArray[aIndex];
+			if (arrayItem)
+				{
+				return arrayItem->TargetId().Target();	
+				}     
+			}
+	return (KNullDesC);		
+	}
+
+
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats: FindIndexL
+// -----------------------------------------------------------------------------
+//
+TInt CIMCVEngineOpenChats::FindIndexL(const TDesC& aItem)
+	{
+	
+	HBufC* decodedItemId = EscapeUtils::EscapeDecodeL( aItem );	
+	
+	// Create custom collation method to ignore punctuations
+    // index 0 gets the default method
+    TCollationMethod collation =
+        *Mem::CollationMethodByIndex( 0 );
+        
+    collation.iFlags |= TCollationMethod::EIgnoreNone;
+	
+	for (TInt index=0; index<iOpenChatsArray.Count(); index++)
+		{
+		TPtrC ptrId1( GetTargetIdL(index) );
+		TPtrC ptrId2( decodedItemId->Des() );
+
+	    // domains are compared only when it is really needed
+	    // check if userid part is the same in both ids   
+	    TInt idResult = ptrId1.CompareC( ptrId2, KCollationLevel, &collation );
+
+		if( !idResult )
+			{
+			delete decodedItemId;
+			return index;
+			}
+		}
+	
+	delete decodedItemId;
+	return KErrNotFound;
+	}
+	
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats: Count
+// -----------------------------------------------------------------------------
+//
+TInt CIMCVEngineOpenChats::Count() const
+	{
+	return iOpenChatsArray.Count();
+	}
+
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats: SetActiveItemL
+// -----------------------------------------------------------------------------
+//
+void CIMCVEngineOpenChats::SetActiveItemL( const TInt aIndex )
+	{
+	
+	if ( (aIndex >= iOpenChatsArray.Count()) || (aIndex <0) )
+	    {	      
+	    User::LeaveIfError(KErrArgument);
+	    }
+	    
+	iActiveItem = aIndex;
+
+	}
+
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats: GetActiveItem
+// -----------------------------------------------------------------------------
+//
+const TDesC& CIMCVEngineOpenChats::GetActiveItem() const
+	{
+	
+	if ( (iActiveItem < iOpenChatsArray.Count()) && (iActiveItem >= 0) )
+	    {	      
+	    MIMCVEngineMessageReadInterface *arrayItem = 
+	    (MIMCVEngineMessageReadInterface *)iOpenChatsArray[iActiveItem];
+	    if (arrayItem)
+	        {
+	        return arrayItem->TargetId().Target();	
+	        }
+	    }
+	return (KNullDesC); 
+	
+	}
+
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats: IsMsgPendingL
+// -----------------------------------------------------------------------------
+//
+TBool CIMCVEngineOpenChats::IsMsgPendingL( const TInt aIndex ) const
+	{
+	if(aIndex >= (iOpenChatsArray.Count()) || aIndex <0)
+	    {	      
+	    User::LeaveIfError(KErrArgument);
+	    }
+    else 
+		{
+		MIMCVEngineMessageReadInterface *arrayItem = 
+								(MIMCVEngineMessageReadInterface *)iOpenChatsArray[aIndex];
+		if (arrayItem)
+			{
+			return arrayItem->UnreadCount();        	
+			}
+		}
+	return EFalse;			
+	}
+
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats: ConstructL
+// -----------------------------------------------------------------------------
+//
+void CIMCVEngineOpenChats::ConstructL( TInt aServiceId )
+	{
+	IM_CV_LOGS(TXT("CIMCVEngineOpenChats ::CONSTRUCTL () ") );
+	iChatInterface.RegisterNewMsgObserver( this ); 
+	iChatInterface.RegisterChatListObserver( this );	
+
+	RArray<SIMCacheChatItem> chatItem = iMessageHandler.GetChatListL( aServiceId ); 
+	IM_CV_LOGS(TXT("CIMCVEngineOpenChats :: CHAT ITEMS COUNT %d"), chatItem.Count () );
+	
+	for (int index=0; index<chatItem.Count(); index++)
+		{
+		
+		iChatInterface.MessageReadInterfaceL(chatItem[index].iServiceId,
+		                                           *chatItem[index].iBuddyId );
+		
+		delete chatItem[index].iBuddyId;	    
+    			
+		}
+	chatItem.Reset();
+	chatItem.Close();
+	}
+	
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats: Insert
+// -----------------------------------------------------------------------------
+//
+void CIMCVEngineOpenChats::Insert( MIMCVEngineMessageReadInterface* aContainerInfo )
+	{	
+    iOpenChatsArray.Append( aContainerInfo );
+    
+    if (iChatObserver)
+	    {    
+	    TRAP_IGNORE( iChatObserver->HandleChangeL(iMessageHandler.ServiceId(), iOpenChatsArray.Count()-1, ENewChat) );	  
+	    }
+	}
+
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats: RemoveL
+// -----------------------------------------------------------------------------
+//
+void CIMCVEngineOpenChats::RemoveL( MIMCVEngineMessageReadInterface& aContainerInfo )
+	{
+	TInt index = FindIndexL(aContainerInfo.TargetId().Target());
+	
+	if (KErrNotFound != index)
+		{
+		iOpenChatsArray.Remove(index);
+		iOpenChatsArray.Compress();
+		if (iChatObserver)
+			{
+			iChatObserver->HandleChangeL(iMessageHandler.ServiceId(), index, EChatClosed);		
+			}
+		}
+	}
+
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats: RegisterObserver
+// -----------------------------------------------------------------------------
+//
+void CIMCVEngineOpenChats::RegisterObserver(MIMCVEngineOpenChatsObserver* aChatObserver)
+	{
+	iChatObserver = aChatObserver;
+	}
+
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats: UnRegisterObserver
+// -----------------------------------------------------------------------------
+//
+void CIMCVEngineOpenChats::UnRegisterObserver()
+	{
+	iChatObserver = NULL;
+ 	}
+
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats: HandleChatEventL
+// -----------------------------------------------------------------------------
+//
+void CIMCVEngineOpenChats::HandleChatEventL( TChatEventType /*aEvent*/, 
+											MIMCVEngineMessage* aMessage /*= NULL*/ ) 
+	{
+	if (aMessage)
+		{
+		TInt index = KErrNotFound;
+		
+		 index = FindIndexL(aMessage->Recipient()) ;
+		
+		if (KErrNotFound != index)
+			{
+			MIMCVEngineMessageReadInterface *arrayItem = 
+								(MIMCVEngineMessageReadInterface *)iOpenChatsArray[index];
+			if (arrayItem && iChatObserver)
+				{
+				TInt serviceId = iMessageHandler.ServiceId();
+				iChatObserver->SetStatusMsgL(serviceId, index,aMessage->Text());
+				iChatObserver->HandleChangeL(serviceId, index, EUnReadCountChanged);			
+				}	
+			}		
+		}	
+	}
+
+
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats: HandleChatListEvent
+// -----------------------------------------------------------------------------
+//
+void CIMCVEngineOpenChats::HandleChatListEvent( TInt aServiceId ,TChatListEventType aEvent, 
+									MIMCVEngineMessageReadInterface* aContainerInfo
+									) 
+	{
+		
+	switch (aEvent)
+		{
+		case EChatItemAdded:
+			{				
+			Insert(aContainerInfo);
+			break;
+			}
+
+		case EChatItemDeleted:
+			{				
+			TRAP_IGNORE(RemoveL(*aContainerInfo));
+			break;
+			}
+		case EChatAllItemDeleted:
+		    {
+		    // not owns
+		    iOpenChatsArray.Reset();
+		    if (iChatObserver)
+		        {
+		        TRAP_IGNORE( iChatObserver->HandleChangeL( aServiceId, KErrNotFound, EChatAllClosed ) );      
+		        }
+		    }
+		default:
+			break;
+		}
+	
+	}
+	
+// -----------------------------------------------------------------------------
+// CIMCVEngineOpenChats: ResetL
+// -----------------------------------------------------------------------------
+//
+void CIMCVEngineOpenChats::ResetL()
+	{
+	iOpenChatsArray.Reset();
+	iActiveItem = -1;		
+	}
+		
+// End of File
+