uiservicetab/vimpstengine/src/cvimpstengineimsubservice.cpp
changeset 0 5e5d6b214f4f
child 14 9fdee5e1da30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiservicetab/vimpstengine/src/cvimpstengineimsubservice.cpp	Tue Feb 02 10:12:18 2010 +0200
@@ -0,0 +1,661 @@
+/*
+* 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:  Class that capsulates single service data members
+*
+*/
+
+
+//  INCLUDES
+#include "cvimpstengineimsubservice.h"
+
+#include "cvimpstenginecchhandler.h"
+#include "cvimpstengineservicetablefetcher.h"
+#include "mvimpstengineimsubserviceeventobserver.h"
+#include "mvimpstengineserviceconnectioneventobserver.h"
+
+#include <e32std.h>
+#include <barsc.h>
+#include <gulutil.h>
+#include <coemain.h>
+#include <e32base.h>
+
+#include "tvimpstconsts.h"
+
+// imcache  related headers
+#include "cimcachefactory.h"
+#include "mimcacheaccessor.h"
+
+#include "vimpstdebugtrace.h"
+
+//system includes
+#include <e32property.h>
+
+// ================= MEMBER FUNCTIONS =======================
+// ---------------------------------------------------------
+// CVIMPSTEngineIMSubService::NewL
+// 
+// ---------------------------------------------------------
+CVIMPSTEngineIMSubService* CVIMPSTEngineIMSubService::NewL(
+								TUint aServiceId,
+								CVIMPSTEngineCchHandler& aCchHandler,
+								CVIMPSTEngineServiceTableFetcher& aTableFetcher,
+								MVIMPSTEngineServiceConnectionEventObserver& aObserver
+								 )
+    {
+    TRACE( T_LIT("CVIMPSTEngineIMSubService::NewL start"));
+    TRACE( T_LIT("NewL() ServiceId: %d"), aServiceId );
+    
+    CVIMPSTEngineIMSubService* self = CVIMPSTEngineIMSubService::NewLC(
+    												aServiceId,
+    												aCchHandler,
+    												aTableFetcher,    												
+    												aObserver );
+    CleanupStack::Pop( self );
+    
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::NewL end"));
+    return self;
+    }
+
+
+// ---------------------------------------------------------
+// CVIMPSTEngineIMSubService::NewLC
+// 
+// ---------------------------------------------------------
+    
+CVIMPSTEngineIMSubService* CVIMPSTEngineIMSubService::NewLC(
+								TUint aServiceId,
+								CVIMPSTEngineCchHandler& aCchHandler,
+								CVIMPSTEngineServiceTableFetcher& aTableFetcher,
+								MVIMPSTEngineServiceConnectionEventObserver& aObserver
+								 )
+	{
+	
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::NewLC start"));
+	TRACE( T_LIT("NewLC() ServiceId: %d"), aServiceId );
+	
+    CVIMPSTEngineIMSubService* self = new (ELeave) CVIMPSTEngineIMSubService(aServiceId, 
+    												aCchHandler, aTableFetcher,
+    												aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    
+    TRACE( T_LIT("CVIMPSTEngineIMSubService::NewLC end"));
+    return self;
+	}
+
+// ---------------------------------------------------------
+// CVIMPSTEngineIMSubService::~CVIMPSTEngineIMSubService
+// 
+// ---------------------------------------------------------
+
+CVIMPSTEngineIMSubService::~CVIMPSTEngineIMSubService()
+	{
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::~CVIMPSTEngineIMSubService start"));
+	
+	iChatObserver.Reset();
+    iChatObserver.Close();
+    
+	iCchHandler.UnRegisterCchObserver(ECCHIMSub);
+		
+	ReleaseIMCacheAccessor();	
+	
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::~CVIMPSTEngineIMSubService end"));
+ 	}
+
+
+// ---------------------------------------------------------
+// CVIMPSTEngineIMSubService::ConstructL
+// 
+// ---------------------------------------------------------
+
+void CVIMPSTEngineIMSubService::ConstructL()
+	{			
+	
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::ConstructL start"));
+	TCCHSubserviceState serviceState = ECCHUninitialized;    
+    TInt error = iCchHandler.GetServiceState( 
+        			iServiceId, ECCHIMSub, serviceState );
+	
+	iServiceState = ResolveServiceStateL(serviceState, error);    	
+	
+	iCchHandler.RegisterCchObserverL(this,ECCHIMSub);       
+	
+    TRACE( T_LIT("ConstructL() ResolveServiceStateL returned ServiceState: %d"), 
+							iServiceState );
+ 
+    TRACE( T_LIT("CVIMPSTEngineIMSubService::ConstructL end"));
+    
+    }
+
+
+// ---------------------------------------------------------
+// CVIMPSTEngineIMSubService::CVIMPSTEngine
+// 
+// ---------------------------------------------------------
+
+CVIMPSTEngineIMSubService::CVIMPSTEngineIMSubService( TUint aServiceId,
+								CVIMPSTEngineCchHandler& aCchHandler,
+								CVIMPSTEngineServiceTableFetcher& aTableFetcher,
+								MVIMPSTEngineServiceConnectionEventObserver& aObserver) :
+	iServiceId(aServiceId),
+	iCchHandler(aCchHandler),
+	iTableFetcher(aTableFetcher),	
+	iObserver(aObserver),
+	iType (TVIMPSTEnums::EIM)
+	{
+	}
+
+
+
+
+		
+// ---------------------------------------------------------
+// CVIMPSTEngineIMSubService::RegisterChatObserver
+// 
+// ---------------------------------------------------------	
+
+void CVIMPSTEngineIMSubService::RegisterChatObserver(MVIMPSTEngineIMSubServiceEventObserver* aObserver)
+	{
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::RegisterChatObserver start"));	
+	if (aObserver)
+		{
+		TInt index = iChatObserver.Find(aObserver);
+		        if( index == KErrNotFound )
+		            {
+		            iChatObserver.Append( aObserver );   
+		            }
+		}    	
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::RegisterChatObserver end"));
+	
+	}
+
+// ---------------------------------------------------------
+// CVIMPSTEngineIMSubService::UnRegisterChatObserver
+// 
+// ---------------------------------------------------------	
+
+void CVIMPSTEngineIMSubService::UnRegisterChatObserver(MVIMPSTEngineIMSubServiceEventObserver* aObserver)
+	{
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::UnRegisterChatObserver start"));
+	
+	if (aObserver)
+		{
+		
+		TInt index = iChatObserver.Find(aObserver);
+		        
+		        if( index >=0 )
+		            {
+		            iChatObserver.Remove( index );
+		            iChatObserver.Compress();
+		            }
+		        
+	    
+		}
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::UnRegisterChatObserver end"));
+			
+	}
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// CVIMPSTEngineIMSubService::HandleIMCacheEventL
+// ( Other items commented in header )
+//-----------------------------------------------------------------------------  
+
+void CVIMPSTEngineIMSubService::HandleIMCacheEventL(TIMCacheEventType aEventType, TAny* aChatMessage  )
+	{
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::HandleIMCacheEventL start"));
+	TRACE( T_LIT("HandleIMCacheEventL() TIMCacheEventType: %d"), aEventType );
+							
+	switch( aEventType )
+	    {
+	    case EIMCacheUnreadMessage :
+	        {
+	        if (!aChatMessage)
+	            {
+	            return;	
+	            }
+	        SIMCacheMessageData* chatData = static_cast<SIMCacheMessageData*>( aChatMessage ) ;
+	        // check that buddy id exists
+	        if ( chatData->iBuddyId )
+	            {
+	            TPtrC buddyId = chatData->iBuddyId->Des();
+	            TRACE( T_LIT("HandleIMCacheEventL() EIMCacheUnreadMessage for %S"), 
+	                    &buddyId );
+
+	            NotifyObserversL(TVIMPSTEnums::EIMUnreadMessage,buddyId);               
+	            }
+	        break;	
+	        }
+	    case EIMCacheUnreadChange :
+	        {
+	        TRACE( T_LIT("HandleIMCacheEventL() EIMCacheUnreadChange") );
+	        if (!aChatMessage)
+	            {
+	            return; 
+	            }
+	        SIMCacheChatItem* chatItem =  static_cast<SIMCacheChatItem*>( aChatMessage ) ;
+	        if( iServiceId != chatItem->iServiceId )
+	            {
+	            return;
+	            }
+	        TPtrC buddyId = chatItem->iBuddyId->Des();
+	        TRACE( T_LIT("HandleIMCacheEventL() EIMCacheChatClosed for %S"), 
+	                &buddyId );
+	        NotifyObserversL(TVIMPSTEnums::EIMUnreadChange, buddyId );  // ETrue for Closed conversation
+	        break;
+	        }
+	    case EIMCacheChatStarted :
+	        {
+	        if (!aChatMessage)
+	            {
+	            return; 
+	            }
+	        SIMCacheChatItem* chatItem =  static_cast<SIMCacheChatItem*>( aChatMessage ) ;
+	        if( iServiceId != chatItem->iServiceId )
+	            {
+	            return;
+	            }
+	        TPtrC buddyId = chatItem->iBuddyId->Des();
+	        TRACE( T_LIT("HandleIMCacheEventL() EIMCacheChatClosed for %S"), 
+	                &buddyId );
+	        NotifyObserversL(TVIMPSTEnums::EIMChatStarted, buddyId );  // ETrue for Closed conversation 
+	        break;  
+	        }
+	    case EIMCacheChatClosed:
+	        {
+	        if (!aChatMessage)
+	            {
+	            return; 
+	            }
+	        SIMCacheChatItem* chatItem =  static_cast<SIMCacheChatItem*>( aChatMessage ) ;
+	        if( iServiceId != chatItem->iServiceId )
+	            {
+	            return;
+	            }
+	        TPtrC buddyId = chatItem->iBuddyId->Des();
+	        TRACE( T_LIT("HandleIMCacheEventL() EIMCacheChatClosed for %S"), 
+	                &buddyId );
+	        NotifyObserversL(TVIMPSTEnums::EIMChatClosed, buddyId );                     
+	        break;  
+	        }
+	    case EIMCacheAllChatClosed:
+	        {
+	        NotifyObserversL(TVIMPSTEnums::EIMAllChatClosed, KNullDesC );                 
+	        break;  
+	        }
+	    case EIMCacheRequestCompleted:
+	        {
+	        NotifyObserversL(TVIMPSTEnums::EIMRequestCompleted, KNullDesC );  
+	        break;
+	        }
+	    default:
+	        {
+	        break;
+	        }
+	    }
+	
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::HandleIMCacheEventL end"));
+	
+	}
+
+//-----------------------------------------------------------------------------
+// CVIMPSTEngineIMSubService::GetUnreadCountL
+// ( Other items commented in header )
+//-----------------------------------------------------------------------------    
+TInt CVIMPSTEngineIMSubService::GetUnreadCountL(const TDesC& aBuddyId ) 
+	{
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::GetUnreadCountL start"));
+	TRACE( T_LIT("GetUnreadCountL() ServiceId: %d BuddyId: %S"), 
+							iServiceId, &aBuddyId );
+							
+	TInt count = 0;
+	if( iIMCacheAccessor )
+		{
+		count = iIMCacheAccessor->GetUnreadMessageCountL(aBuddyId);
+		TRACE( T_LIT("GetUnreadCountL() iIMCacheAccessor returns with %d"), count );
+		}
+	
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::GetUnreadCountL end"));
+	return count;
+	}
+
+
+// ---------------------------------------------------------
+// CVIMPSTEngineIMSubService::SubServiceState
+// ---------------------------------------------------------------------------
+// 
+TVIMPSTEnums::TVIMPSTRegistrationState CVIMPSTEngineIMSubService::SubServiceState() const
+	{
+	TRACE( T_LIT("SubServiceState() ServiceId: %d ServiceState: %d"), 
+							iServiceId, iServiceState );
+	return iServiceState;
+	}
+
+
+	
+//-----------------------------------------------------------------------------
+// CVIMPSTEngineIMSubService::IsConversationExistL
+// ( Other items commented in header )
+//-----------------------------------------------------------------------------    
+TBool CVIMPSTEngineIMSubService::IsConversationExistL(const TDesC& aBuddyId) const
+	{
+	
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::IsConversationExistL start"));
+	TRACE( T_LIT("IsConversationExistL() Buddy Id : %S"), &aBuddyId );
+	
+	TInt exist = EFalse;
+	
+	if( iIMCacheAccessor )
+		{
+		exist = iIMCacheAccessor->IsConversationExistL( aBuddyId );	
+		TRACE( T_LIT("IsConversationExistL() iIMCacheAccessor returns with %d"), exist );
+		}
+	
+	TRACE( T_LIT("IsConversationExistL() Exist: %d"), exist );	
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::IsConversationExistL end"));		
+	return exist; 
+  	}
+
+//-----------------------------------------------------------------------------
+// CVIMPSTEngineIMSubService::CloseConversationL
+// ( Other items commented in header )
+//-----------------------------------------------------------------------------
+void CVIMPSTEngineIMSubService::CloseConversationL( const TDesC& aContactId )
+    {
+    TRACE( T_LIT("CVIMPSTEngineIMSubService::CloseConversationL start"));
+    TRACE( T_LIT("CloseConversationL() Buddy Id : %S"), &aContactId  );
+    
+    if( IsConversationExistL(aContactId) )
+        {
+        TRACE( T_LIT("CloseConversationL() iIMCacheAccessor CloseConversationL to be called") );
+        iIMCacheAccessor->CloseConversationL( aContactId );
+       	TRACE( T_LIT("CloseConversationL() iIMCacheAccessor CloseConversationL Done") );
+        }
+    
+    TRACE( T_LIT("CVIMPSTEngineIMSubService::CloseConversationL end"));
+    }
+//-----------------------------------------------------------------------------
+// CVIMPSTEngineIMSubService::GetOpenChatListL
+// ( Other items commented in header )
+//-----------------------------------------------------------------------------
+RArray<SIMCacheChatItem> CVIMPSTEngineIMSubService::GetOpenChatListL()
+    {
+    TRACE( T_LIT("CloseConversationL() iIMCacheAccessor GetOpenChatListL called") );
+    RArray<SIMCacheChatItem> item;
+    if(iIMCacheAccessor)
+        {
+        item =  iIMCacheAccessor->GetChatListL( iServiceId );
+        }
+    return item;
+    }
+
+// ---------------------------------------------------------------------------
+// CVIMPSTEngineIMSubService::ResolveServiceStateL
+// ---------------------------------------------------------------------------
+// 
+TVIMPSTEnums::TVIMPSTRegistrationState CVIMPSTEngineIMSubService::ResolveServiceStateL(
+										TCCHSubserviceState aState, 
+            							TInt aServiceError )
+    {
+    
+    TRACE( T_LIT("CVIMPSTEngineIMSubService::ResolveServiceStateL start"));    
+        
+    TVIMPSTEnums::TVIMPSTRegistrationState state = TVIMPSTEnums::ESVCENotRegistered;       
+    
+    TRACE( T_LIT("ResolveServiceStateL() iServiceId: %d, ServiceState: %d"), 
+    							iServiceId, aState );    	
+
+    TBool handleServiceStates = ETrue;
+    if ( aServiceError && ECCHDisabled != aState )
+        {    
+		//Only if the Service supports ALR, the state can goto WaitingForNetwork
+		//Still API from CCH is required to know whether ALR is supported or not
+        if ( (KCCHErrorInvalidSettings != aServiceError) && (ECCHConnecting == aState) )        
+            {   
+            TRACE( T_LIT("ResolveServiceStateL() ESVCEWaitingForNetwork") );
+            handleServiceStates = EFalse;  
+            state = TVIMPSTEnums::ESVCEWaitingForNetwork;	           
+            }
+        }
+    
+    if ( handleServiceStates )
+        {        
+        switch ( aState )
+            {
+            case ECCHEnabled:
+                {
+                TRACE( T_LIT("ResolveServiceStateL() ESVCERegistered") );
+                CreateIMCacheAccessorL();
+                state = TVIMPSTEnums::ESVCERegistered;
+                }
+                break;
+
+            case ECCHDisconnecting:      
+                {
+                TRACE( T_LIT("ResolveServiceStateL() ESVCENetworkDisConnecting") );                
+                state = TVIMPSTEnums::ESVCENetworkDisConnecting;
+                }
+                break;
+
+            case ECCHUninitialized:
+            case ECCHDisabled:  
+                {
+                TRACE( T_LIT("ResolveServiceStateL() ESVCENotRegistered") );
+                ReleaseIMCacheAccessor();
+                state = TVIMPSTEnums::ESVCENotRegistered;
+                }
+                break;
+                
+            case ECCHConnecting:               
+                {
+                TRACE( T_LIT("ResolveServiceStateL() ESVCENetworkConnecting") );               
+                state = TVIMPSTEnums::ESVCENetworkConnecting;
+                }
+                break;
+            
+            default:
+                break;
+            }
+        }        
+        
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::ResolveServiceStateL end"));
+	        
+    return state;  
+	
+    }
+
+
+// ---------------------------------------------------------------------------
+// CVIMPSTEngineIMSubService::Type
+// ---------------------------------------------------------------------------
+//
+TVIMPSTEnums::SubServiceType CVIMPSTEngineIMSubService::Type() const	
+	{
+	TRACE( T_LIT("SubServiceType() Type : %d"), iType );
+	TRACE( T_LIT("CVIMPSTEngineIMSubService: [0x%x]"), this );		    	
+	return iType;	
+	}
+
+
+
+// ---------------------------------------------------------------------------
+// CVIMPSTEngineIMSubService::CchEventOccuredL
+// ---------------------------------------------------------------------------
+//
+void CVIMPSTEngineIMSubService::CchEventOccuredL( 
+            TUint /*aServiceId*/, 
+            TCCHSubserviceState aState, 
+            TInt aServiceError )
+	{
+	
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::CchEventOccuredL start"));
+	TRACE( T_LIT("CchEventOccuredL() TCCHSubserviceState : %d, ServiceErr: %d"), 
+									aState, aServiceError );
+	
+    if ( aServiceError && ECCHDisabled != aState )
+        {
+        //we might even end up in waiting for connection state for all
+        //those service which are ALR enabled
+        //So better check here if you get any CCH errors
+        iServiceState = ResolveServiceStateL( aState, aServiceError );
+        iObserver.HandleServceConnectionEventL();
+        DoHandleCchErrorL( aServiceError );
+        }
+    else
+        {
+        iServiceState = ResolveServiceStateL( aState, aServiceError );    
+        iObserver.HandleServceConnectionEventL();
+        }	
+	
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::CchEventOccuredL end"));
+	
+	}
+
+
+// ---------------------------------------------------------------------------
+// CVIMPSTEngineIMSubService::DoHandleCchErrorL()
+// ---------------------------------------------------------------------------
+// 
+void CVIMPSTEngineIMSubService::DoHandleCchErrorL( 
+    TInt aServiceError )
+    {
+    
+    TRACE( T_LIT("CVIMPSTEngineIMSubService::DoHandleCchErrorL start"));
+    TRACE( T_LIT("DoHandleCchErrorL() ServiceErr: %d"), 
+									aServiceError );
+									
+    switch ( aServiceError )
+        {
+        case KCCHErrorNetworkLost:
+        case KCCHErrorBandwidthInsufficient:
+        case KCCHErrorInvalidIap: 
+            {
+            //Should be fwded to CCHUI to show the appropriate Notes
+            //TBD
+            }
+            break;
+
+        case KCCHErrorAuthenticationFailed:
+            {
+            //Should be fwded to CCHUI to show the appropriate Notes
+            //TBD
+            }
+            break;
+            
+        case KCCHErrorLoginFailed:
+        case KCCHErrorServiceNotResponding:            
+            {
+            //Should be fwded to CCHUI to show the appropriate Notes
+            //TBD
+            }
+            break;                    
+        
+        case KCCHErrorInvalidSettings:
+            {
+            //Should be fwded to CCHUI to show the appropriate Notes
+            //TBD
+            }
+            break;
+            
+        case KCCHErrorAccessPointNotDefined:
+            {
+            //Should be fwded to CCHUI to show the appropriate Notes
+            //TBD
+            }
+            break;
+            
+        default:
+            {
+            //Should be fwded to CCHUI to show the appropriate Notes
+            //TBD
+            }
+            break;
+        }
+    
+    TRACE( T_LIT("CVIMPSTEngineIMSubService::DoHandleCchErrorL end"));
+    
+    }
+
+
+// ---------------------------------------------------------------------------
+// CVIMPSTEngineIMSubService::CreateIMCacheAccessorL()
+// ---------------------------------------------------------------------------
+//     
+void CVIMPSTEngineIMSubService::CreateIMCacheAccessorL()
+	{
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::CreateIMCacheAccessorL start"));
+	
+	if (!iIMCacheFactory)
+	    {
+	    HBufC* ownData = iCchHandler.GetConParametersL(ECchUsername);//
+	    CleanupStack::PushL(ownData);
+	    TPtr ownDataPtr = ownData->Des();
+	    TRACE( T_LIT("DoHandleCchErrorL() ServiceErr: %S"), 
+	            &ownDataPtr );
+	    // im cache factory
+	    iIMCacheFactory = CIMCacheFactory::InstanceL(); 
+
+	    // im cache update interface
+	    if (!iIMCacheAccessor)
+	        {				
+	        iIMCacheAccessor = iIMCacheFactory->CreateAccessorL(iServiceId, *ownData );
+
+	        iIMCacheAccessor->RegisterObserverL(*this);	
+	        }
+
+	    CleanupStack::PopAndDestroy(ownData);
+	    }
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::CreateIMCacheAccessorL end"));
+	}
+
+// ---------------------------------------------------------------------------
+// CVIMPSTEngineIMSubService::ReleaseIMCacheAccessor()
+// ---------------------------------------------------------------------------
+//	
+void CVIMPSTEngineIMSubService::ReleaseIMCacheAccessor()	
+	{
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::ReleaseIMCacheAccessor start"));
+	
+	if( iIMCacheAccessor )
+	  	{
+	  	iIMCacheAccessor->UnRegisterObserver(*this);		  	
+	  	}
+	  	
+	if( iIMCacheFactory )
+		{
+		CIMCacheFactory::Release();  	
+		iIMCacheAccessor = NULL;
+		iIMCacheFactory = NULL;
+		}
+	
+	TRACE( T_LIT("CVIMPSTEngineIMSubService::ReleaseIMCacheAccessor end"));
+	}
+
+
+// ---------------------------------------------------------------------------
+// CVIMPSTEngineIMSubService::NotifyObserversL()
+// ---------------------------------------------------------------------------
+//
+void CVIMPSTEngineIMSubService::NotifyObserversL( TVIMPSTEnums::TIMEventType aEventType ,const TDesC& aBuddyId )
+    {
+    TRACE( T_LIT("CVIMPSTEngineIMSubService::NotifyObserversL start"));
+    TInt count = iChatObserver.Count();
+    for (TInt index=0; index<count; index++)		
+        {
+        iChatObserver[index]->HandleChatMessageEventL(aEventType ,aBuddyId );
+        }	
+    TRACE( T_LIT("CVIMPSTEngineIMSubService::NotifyObserversL end"));
+    }
+
+//  End of File
+