imservices/instantmessagingcache/imcacheclient/src/cimcacheeventhandler.cpp
changeset 0 e6b17d312c8b
child 1 b610b446cb01
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imservices/instantmessagingcache/imcacheclient/src/cimcacheeventhandler.cpp	Thu Dec 17 08:54:49 2009 +0200
@@ -0,0 +1,344 @@
+/*
+* 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:  cache message change observer
+*
+*/
+
+
+//  INCLUDE FILES
+
+#include "cimcacheeventhandler.h"
+#include "mimcacheclient.h"
+#include "mimcacheeventhandler.h"
+// logs
+#include "imcachedebugtrace.h"
+
+// -----------------------------------------------------------------------------
+// CIMCacheEventHandler::NewL
+// -----------------------------------------------------------------------------
+//
+CIMCacheEventHandler* CIMCacheEventHandler::NewL( 
+								MIMCacheClient& aRegistrar, 
+								MIMCacheEventHandler& aHandler)
+    {
+    TRACE( T_LIT("CIMCacheEventHandler::NewL() begin") );
+	CIMCacheEventHandler* self = new ( ELeave ) CIMCacheEventHandler( aRegistrar ,aHandler ) ;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );  //self
+	TRACE( T_LIT("CIMCacheEventHandler::NewL() end") );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCacheEventHandler::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CIMCacheEventHandler::ConstructL()
+    {
+    TRACE( T_LIT("CIMCacheEventHandler::ConstructL() begin") );
+    iContinueObserving = ETrue ;
+   	CActiveScheduler::Add( this );
+	iRegistrar.RegisterObserverToServerL( iStatus ,EIMCacheObserveMessageUpdateRegister );
+	SetActive();
+	TRACE( T_LIT("CIMCacheEventHandler::ConstructL() end") );
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCacheEventHandler::~CIMCacheEventHandler
+// -----------------------------------------------------------------------------
+//
+CIMCacheEventHandler::~CIMCacheEventHandler()
+	{
+	TRACE( T_LIT("CIMCacheEventHandler::~CIMCacheEventHandler() begin") );
+	Cancel();
+	TRACE( T_LIT("CIMCacheEventHandler::~CIMCacheEventHandler() end") );
+	}
+
+// -----------------------------------------------------------------------------
+// CIMCacheEventHandler::CIMCacheEventHandler(
+// -----------------------------------------------------------------------------
+//
+CIMCacheEventHandler::CIMCacheEventHandler(
+								 MIMCacheClient& aRegistrar , 
+								 MIMCacheEventHandler& aHandler ) :
+	CActive( CActive::EPriorityIdle ),
+  	iRegistrar( aRegistrar ),
+  	iUpdateHandler( aHandler )
+ 	{
+ 	TRACE( T_LIT("CIMCacheEventHandler::CIMCacheEventHandler()") );
+	}
+// -----------------------------------------------------------------------------
+// CIMCacheEventHandler::RunL
+// -----------------------------------------------------------------------------
+//
+void CIMCacheEventHandler::RunL()
+	{
+	TRACE( T_LIT("CIMCacheEventHandler::RunL() begin") );
+	TRACE( T_LIT("CIMCacheEventHandler::RunL() iStatus code = "),iStatus.Int()  );
+
+	switch( iStatus.Int() )
+		{
+		case EIMOperationUnreadMessage :
+		case EIMOperationDataAvailable :
+		case EIMOperationMessageAdded :
+			{
+			// message data available get the data	
+            GetBufferChatDataL();
+			break;	
+			}
+	   case EIMOperationCompleted :
+	   		{
+	   		iUpdateHandler.HandleIMCacheEventL( EIMCacheRequestCompleted, NULL );	
+	   		}
+	    case EIMOperationChatStarted :
+		    {
+		    iUpdateHandler.HandleIMCacheEventL( EIMCacheRequestCompleted, NULL );
+		    break;	
+		    }
+		case EIMOperationUnreadChange:
+			{
+			iUpdateHandler.HandleIMCacheEventL( EIMCacheRequestCompleted, NULL );
+			break;	
+			}
+		case EIMOperationChatAdded :
+			{
+			// chat information
+		    GetBufferedChatItemL(EIMCacheNewChat);
+			break;	
+			}
+		case EIMOperationChatDeleted :
+			{
+			// message data available get the data	
+            GetBufferedChatItemL(EIMCacheChatClosed );		
+			break;	
+			}
+		 case EIMOperationAllChatDeleted:
+		     {
+		     iUpdateHandler.HandleIMCacheEventL( EIMCacheAllChatClosed, NULL );
+		     break;
+		     }
+		case EIMOperationUnRegistered:
+			{
+			TRACE( T_LIT("CIMCacheEventHandler::RunL() EIMOperationUnRegistered") );
+			iContinueObserving = EFalse;	
+			break;	
+			}
+		default :
+		    {
+		    TRACE( T_LIT("CIMCacheEventHandler::RunL() default") );
+		    break;	
+		    }
+		}	
+		
+	TRACE( T_LIT("CIMCacheEventHandler::RunL() iContinueObserving iContinueObserving = %d") ,iContinueObserving);
+	// check need to continue observing to server
+	if( iContinueObserving )
+		{
+		iRegistrar.RegisterObserverToServerL( iStatus ,EIMCacheObserveMessageUpdateRegister );
+		SetActive();
+		}
+	TRACE( T_LIT("CIMCacheEventHandler::RunL() end") );
+	}
+// -----------------------------------------------------------------------------
+// CIMCacheEventHandler::DoCancel
+// -----------------------------------------------------------------------------
+//	
+void CIMCacheEventHandler::DoCancel()
+	{
+	TRACE( T_LIT("CIMCacheEventHandler::DoCancel() ") );
+	if( IsActive() )
+        {
+        TRAP_IGNORE(iRegistrar.CancelRequestL( iStatus ,EIMCacheCancelRequest ));
+        }
+	}
+// ---------------------------------------------------------
+// CIMCacheEventHandler::RunError()
+// ---------------------------------------------------------
+//
+TInt CIMCacheEventHandler::RunError( TInt /* aError */)
+    {
+    TRACE( T_LIT("CVIMPSTEngineCVListener::RunError() start"));
+    return KErrNone;
+    }
+// -----------------------------------------------------------------------------
+// CIMCacheEventHandler::UnRegisterObserver
+// -----------------------------------------------------------------------------
+//		
+void CIMCacheEventHandler::UnRegisterObserver()
+	{
+	TRACE( T_LIT("CIMCacheEventHandler::UnRegisterObserver() begin") );
+	if( IsActive() )
+		{
+		TRACE( T_LIT("CIMCacheEventHandler::UnRegisterObserver() active") );
+		TRAP_IGNORE(iRegistrar.UnRegisterObserverToServerL( iStatus ,EIMCacheObserveMessageUpdateUnRegister ));
+		}
+	TRACE( T_LIT("CIMCacheEventHandler::UnRegisterObserver() end") );	
+	}
+// -----------------------------------------------------------------------------
+// CIMCacheEventHandler::GetBufferChatDataL
+// -----------------------------------------------------------------------------
+//
+void CIMCacheEventHandler::GetBufferChatDataL( ) 
+    {
+    TRACE( T_LIT("CIMCacheEventHandler::GetBufferChatDataL() begin") );
+	TBool more = ETrue;
+    while(more)
+        {
+        TPtr8 bufferPtr = iRegistrar.GetBufferedDataL( EIMCacheGetBufferedPackets );
+        InternalizeChatDataL( bufferPtr , more );
+        }
+    TRACE( T_LIT("CIMCacheEventHandler::GetBufferChatDataL() end") );
+    }
+// -----------------------------------------------------------------------------
+// CIMCacheEventHandler::InternalizeChatDataL
+// -----------------------------------------------------------------------------     
+void CIMCacheEventHandler::InternalizeChatDataL( TPtr8 aChatDataBuffer , TBool& aMore )
+    {
+    TRACE( T_LIT("CIMCacheEventHandler::InternalizeChatDataL() Start") );
+    if( 0 == aChatDataBuffer.Length())
+        {
+        TRACE( T_LIT("CIMCacheEventHandler::InternalizeChatDataL()  aChatDataBuffer is zeor, hence returning ") );
+        return;
+        }
+   	RDesReadStream readAllStream ;
+	RDesReadStream readStream ;    
+
+	readAllStream.Open( aChatDataBuffer );
+	CleanupClosePushL(readAllStream);
+
+	TInt messageCount = readAllStream.ReadInt16L();
+
+	for( TInt i=0; i< messageCount; i++)
+		{
+		SIMCacheMessageData chatData =
+		    {
+		    TIMCacheMessageType(0),
+		    };
+		        
+		TInt size = readAllStream.ReadInt16L() ;
+		HBufC8* mBuffer  = HBufC8::NewLC( size );
+		TPtr8 mBufferPtr = mBuffer->Des();
+		        
+		readAllStream.ReadL( mBufferPtr , size );
+
+		readStream.Open( *mBuffer );        
+		CleanupClosePushL(readStream) ;
+
+		chatData.iMessageType   = static_cast<TIMCacheMessageType>( readStream.ReadInt16L() );
+		chatData.iMessagerType  = static_cast<TIMCacheMessagerType>( readStream.ReadInt16L() );
+		chatData.iContentType   = static_cast<TIMCacheContentType>( readStream.ReadInt16L() );
+		chatData.iTime          = static_cast<TReal64>( readStream.ReadReal64L() );
+
+		TInt buddyLength = readStream.ReadInt16L();
+		HBufC* buddy     = HBufC::NewLC( buddyLength );
+		TPtr buddyPtr    = buddy->Des();
+		readStream.ReadL( buddyPtr , buddyLength );
+		chatData.iBuddyId = buddy;
+
+		TInt textSize = readStream.ReadInt16L();
+		HBufC* text  = HBufC::NewLC( textSize );
+		TPtr textPtr = text->Des(); 
+		readStream.ReadL( textPtr , textSize);            
+		chatData.iText = text;
+		
+		iUpdateHandler.HandleIMCacheEventL(EIMCacheNewMessage , &chatData);
+		
+		CleanupStack::PopAndDestroy(4);//close read stream, delete mBuffer, text, buddy 
+		}
+
+	aMore = static_cast<TBool>( readAllStream.ReadInt16L() );
+
+	CleanupStack::PopAndDestroy();//readAllStream.    
+	
+    TRACE( T_LIT("CIMCacheEventHandler::InternalizeChatDataL() End") );
+    }
+
+// -----------------------------------------------------------------------------
+// CIMCacheEventHandler::GetBufferedChatItemL
+// -----------------------------------------------------------------------------
+//
+void CIMCacheEventHandler::GetBufferedChatItemL( TIMCacheEventType aEventType )
+    {
+    TRACE( T_LIT("CIMCacheAccessEventHandler::GetBufferedChatItemL() begin") );
+    
+    TPtr8 bufferPtr = iRegistrar.GetBufferedDataL( EIMCacheGetBufferedPackets );
+    
+    InternalizeChatItemL( aEventType, bufferPtr );
+    
+    TRACE( T_LIT("CIMCacheAccessEventHandler::GetBufferedChatItemL() end") );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CIMCacheEventHandler::InternalizeChatItemL
+// -----------------------------------------------------------------------------
+//
+void CIMCacheEventHandler::InternalizeChatItemL( TIMCacheEventType aEventType, 
+                                                 TPtr8 aContactBuffer )
+    {
+    TRACE( T_LIT("CIMCacheClient::InternalizeChatItemL() begin") );   
+    if( 0 == aContactBuffer.Length())
+          {
+          TRACE( T_LIT("CIMCacheEventHandler::InternalizeChatDataL()  aChatDataBuffer is zeor, hence returning ") );
+          return;
+          }
+    RDesReadStream readAllStream ;
+    RDesReadStream readStream ;    
+    
+    readAllStream.Open( aContactBuffer );
+    CleanupClosePushL(readAllStream);
+    
+    TInt messageCount = readAllStream.ReadInt16L();
+    
+    for( TInt i=0; i< messageCount; i++)
+        {
+        SIMCacheChatItem chatItem =
+          {
+          0,
+          };
+                
+        TInt size = readAllStream.ReadInt16L() ;
+        HBufC8* mBuffer  = HBufC8::NewLC( size );
+        TPtr8 mBufferPtr = mBuffer->Des();
+                
+        readAllStream.ReadL( mBufferPtr , size );
+        
+        readStream.Open( *mBuffer );        
+        CleanupClosePushL(readStream) ;
+        
+        chatItem.iServiceId  = static_cast<TInt>( readStream.ReadInt16L() );
+        
+        TInt textSize = readStream.ReadInt16L();
+        HBufC* buddyId = HBufC::NewLC( textSize );
+        TPtr buddyIdPtr = buddyId->Des(); 
+        readStream.ReadL( buddyIdPtr , textSize);
+        
+        chatItem.iBuddyId = buddyId;
+        
+        iUpdateHandler.HandleIMCacheEventL( aEventType , &chatItem );
+      
+        CleanupStack::PopAndDestroy(3);//buddyId , close read stream, delete mBuffer.      
+                  
+        }
+ 
+    CleanupStack::PopAndDestroy();//readAllStream.    
+    
+    TRACE( T_LIT("CIMCacheClient::InternalizeChatItemL() End") );
+    }
+
+
+
+//  end of file
+