emailservices/emailstore/message_store/client/src/MsgStoreObserverHandler.cpp
changeset 0 8466d47a6819
child 8 e1b6206813b4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailstore/message_store/client/src/MsgStoreObserverHandler.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,377 @@
+/*
+* 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:  Message store observer handler client implementation.
+*
+*/
+
+
+#include "MsgStoreObserverHandler.h"
+#include "RMessageStoreSession.h"
+//<cmail>
+#include "MsgStoreObserver.h"
+//</cmail>
+
+
+
+// ------------------------
+// CMsgStoreObserverHandler
+// ------------------------
+
+// ==========================================================================
+// FUNCTION: NewL
+// ==========================================================================
+CMsgStoreObserverHandler* CMsgStoreObserverHandler::NewL( RMessageStoreSession& aSession )
+	{
+    CMsgStoreObserverHandler* self = new( ELeave ) CMsgStoreObserverHandler( aSession );
+    return self;
+	} // end NewL
+
+// ==========================================================================
+// FUNCTION: Constructor
+// ==========================================================================
+CMsgStoreObserverHandler::CMsgStoreObserverHandler( RMessageStoreSession& aSession ) : 
+	CActive( EPriorityStandard ),
+	iSession( aSession )
+	{
+	__LOG_CONSTRUCT( "MsgClient", "CMsgStoreObserverHandler" )
+	} // end constructor
+
+// ==========================================================================
+// FUNCTION: Destructor
+// ==========================================================================
+CMsgStoreObserverHandler::~CMsgStoreObserverHandler()
+	{
+	Cancel();
+	
+	iMailBoxObservers.Close();
+	iObservers.Close();
+		
+	__LOG_DESTRUCT
+	} // end destructor
+
+// ==========================================================================
+// FUNCTION: AddObserverL
+// ==========================================================================
+void CMsgStoreObserverHandler::AddObserverL( MMsgStoreObserver* aObserver )
+	{
+    __LOG_ENTER_SUPPRESS( "AddObserverL (system)" )
+    __LOG_WRITE8_FORMAT1_INFO( "aObserver=%08x", aObserver )
+    
+	if( !IsAdded() )
+		{		
+    	CActiveScheduler::Add(this);    
+		} // end if
+		
+	iObservers.AppendL( aObserver );
+	
+	if( (iObservers.Count() + iMailBoxObservers.Count()) == 1 )
+		{
+		iSession.StartObservingL();
+		
+		iSession.GetEvents( iStatus, iEventBuffer );
+		SetActive();
+		} // end if
+		
+    __LOG_WRITE8_FORMAT1_INFO( "System observers = %d", iObservers.Count() )
+    
+	} // end AddObserverL
+
+// ==========================================================================
+// FUNCTION: RemoveObserverL
+// ==========================================================================
+void CMsgStoreObserverHandler::RemoveObserverL( MMsgStoreObserver* aObserver )
+	{
+    __LOG_ENTER_SUPPRESS( "RemoveObserverL (system)" )
+    __LOG_WRITE8_FORMAT1_INFO( "aObserver=%08x", aObserver )
+    
+	TBool found = EFalse;
+	
+	TInt index = 0;
+	
+	while( !found && index < iObservers.Count() )
+		{
+		if( iObservers[index] == aObserver )
+			{
+			found = ETrue;
+			iObservers.Remove( index );
+			}
+		else
+			{
+			index++;
+			} // end if		
+		} // end while
+	
+	if( !found )
+		{
+		User::Leave( KErrNotFound );
+		} // end if
+		
+	if( (iObservers.Count() + iMailBoxObservers.Count()) == 0 )
+		{
+		Cancel();
+		} // end if
+		
+    __LOG_WRITE8_FORMAT1_INFO( "System observers = %d", iObservers.Count() )
+    
+	} // end RemoveObserverL
+
+
+// ==========================================================================
+// FUNCTION: AddObserverL
+// ==========================================================================
+void CMsgStoreObserverHandler::AddObserverL( MMsgStoreMailBoxObserver* aObserver, TMsgStoreId aMailBoxId )
+	{
+    __LOG_ENTER_SUPPRESS( "AddObserverL (mailbox)" )
+    __LOG_WRITE8_FORMAT2_INFO( "maibBoxId=%d, aObserver=%08x", aMailBoxId, aObserver )
+    
+	if( !IsAdded() )
+		{		
+    	CActiveScheduler::Add(this);    
+		} // end if
+
+	TMailBoxObserverInfo info;
+	info.iObserver = aObserver;
+	info.iMailBoxId = aMailBoxId;
+	
+	iMailBoxObservers.AppendL( info );
+	
+	if( (iObservers.Count() + iMailBoxObservers.Count()) == 1 )
+		{
+		iSession.StartObservingL();
+		
+		iSession.GetEvents( iStatus, iEventBuffer );
+		SetActive();
+		} // end if
+		
+    __LOG_WRITE8_FORMAT1_INFO( "Mailbox observers = %d", iMailBoxObservers.Count() )
+	} // end AddObserverL
+
+// ==========================================================================
+// FUNCTION: RemoveObserverL
+// ==========================================================================
+void CMsgStoreObserverHandler::RemoveObserverL( MMsgStoreMailBoxObserver* aObserver, TMsgStoreId aMailBoxId )
+	{
+    __LOG_ENTER_SUPPRESS( "RemoveObserverL (mailbox)" )
+    __LOG_WRITE8_FORMAT2_INFO( "maibBoxId=%d, aObserver=%08x", aMailBoxId, aObserver )
+    
+	TBool found = EFalse;
+	
+	TInt index = 0;
+	
+	while( !found && index < iMailBoxObservers.Count() )
+		{
+		if( iMailBoxObservers[index].iObserver == aObserver && 
+		    iMailBoxObservers[index].iMailBoxId == aMailBoxId )
+			{
+			found = ETrue;
+			iMailBoxObservers.Remove( index );
+			}
+		else
+			{
+			index++;
+			} // end if		
+		} // end while
+	
+	if( !found )
+		{
+		User::Leave( KErrNotFound );
+		} // end if
+		
+	if( ( iObservers.Count() + iMailBoxObservers.Count()) == 0 )
+		{
+		Cancel();
+		} // end if
+	
+    __LOG_WRITE8_FORMAT1_INFO( "Mailbox observers = %d", iMailBoxObservers.Count() )
+		
+	} // end RemoveObserverL
+
+// ==========================================================================
+// FUNCTION: RunL
+// ==========================================================================
+void CMsgStoreObserverHandler::RunL()
+	{
+	__LOG_ENTER( "RunL" )
+	
+    if( iStatus == KErrNone )
+    	{
+        TInt eventCount = iEventBuffer.Length() / sizeof(TMsgStoreEvent);
+    	
+		__LOG_WRITE8_FORMAT1_INFO( "RunL %i events received", eventCount )
+
+        const TMsgStoreEvent* eventPtr = reinterpret_cast<const TMsgStoreEvent *>( iEventBuffer.Ptr() );
+        
+        for( TUint i = 0; i < eventCount; i++ )
+            {
+    		if( eventPtr->iType < KMsgStoreSystemEventMin )
+    			{
+    			//just in case the observer's handler method leaves, we still want to get next event    			
+    			ModificationNotify( *eventPtr );
+    			}		
+    		else if ( eventPtr->iType < KMsgStoreAccountEventMin )
+    			{
+                //just in case the observer's handler method leaves, we still want to get next event                
+    			SystemEventNotify( *eventPtr );								
+    	    	}
+    		else
+    			{
+                //just in case the observer's handler method leaves, we still want to get next event                
+    			AccountEventNotify( *eventPtr );
+    			}
+    	    	
+    	    eventPtr++;
+            }
+            
+    	// Get the next event(s).    	
+    	iSession.GetEvents( iStatus, iEventBuffer );
+    	SetActive();
+	    }
+    else
+    	{
+        __LOG_WRITE8_FORMAT1_ERROR( "error, iStatus=%d", iStatus.Int() );
+    	} // end if
+
+    __LOG_EXIT
+	} // end RunL
+	
+// ==========================================================================
+// FUNCTION: RunError
+// ==========================================================================
+TInt CMsgStoreObserverHandler::RunError( TInt __LOG_BLOCK(aError) )
+    {
+    // This should never happen if the client's are properly coded and do not
+    // leave during ModificationNotify or SystemEventNotify.  Disregard the
+    // error, if it occurs.
+    
+    __LOG_ENTER_SUPPRESS( "RunError" )
+    
+    __LOG_WRITE8_FORMAT1_ERROR( "aError=%i", aError )
+    
+    return KErrNone;
+    
+    } // end RunError
+
+// ==========================================================================
+// FUNCTION: ModificationNotify
+// ==========================================================================
+void CMsgStoreObserverHandler::ModificationNotify( const TMsgStoreEvent& aEvent )
+	{
+	__LOG_ENTER( "ModificationNotify" )
+	
+	TMsgStoreContainerType type;
+	TBool                  notify = ETrue;
+	
+	switch( aEvent.iId & EMsgStoreContainerMask )
+		{
+		case EMsgStoreMailBoxBits:			
+			type = EMsgStoreMailboxContainer;
+			break;
+		case EMsgStoreFolderBits:			
+			type = EMsgStoreFolderContainer;
+			break;
+		case EMsgStoreMessageBits:			
+			type = EMsgStoreMessageContainer;
+			break;
+		case EMsgStorePartBits:			
+			type = EMsgStorePartContainer;
+			break;
+		default:
+			// this shouldn't happen!
+			__LOG_WRITE_ERROR( "Invalid type" );
+			notify = EFalse;
+			break;			
+		}; // end switch
+		
+	if( notify )
+		{
+		for( TInt index = 0; index < iMailBoxObservers.Count(); index++ )
+			{
+			TMailBoxObserverInfo info = iMailBoxObservers[index];
+			if ( aEvent.iMailBoxId == info.iMailBoxId )
+				{
+		        __LOG_WRITE8_FORMAT1_INFO( "Notifying event for MailboxId %d", aEvent.iMailBoxId )
+				info.iObserver->ModificationNotify( aEvent.iMailBoxId,
+												static_cast<TMsgStoreOperation>(aEvent.iType), 
+												type,
+												aEvent.iFlags,
+												aEvent.iId, 
+												aEvent.iParentId, 
+												aEvent.iOtherId );
+				}
+			} // end for
+		} // end if
+		
+    __LOG_EXIT		
+	} // end ModificationNotify
+
+// ==========================================================================
+// FUNCTION: SystemEventNotify
+// ==========================================================================
+void CMsgStoreObserverHandler::SystemEventNotify( const TMsgStoreEvent& aEvent )
+	{
+	__LOG_ENTER_SUPPRESS( "SystemEventNotify" )
+	
+	__LOG_WRITE8_FORMAT1_INFO( "Notifying %d observers", iObservers.Count() )
+	for( TInt index = 0; index < iObservers.Count(); index++ )
+		{
+		iObservers[index]->SystemEventNotify( static_cast<TMsgStoreSystemEvent>(aEvent.iType) );
+		} // end for
+		
+	} // end SystemEventNotify
+
+// ==========================================================================
+// FUNCTION: AccountEventNotify
+// ==========================================================================
+void CMsgStoreObserverHandler::AccountEventNotify( const TMsgStoreEvent& aEvent )
+	{
+	__LOG_ENTER_SUPPRESS( "AccountEventNotify" )
+	
+	TPtrC16 name16;
+	const TUint16* valuePtr16 = reinterpret_cast<const TUint16*>( aEvent.iAccountName.Ptr() );
+	name16.Set( valuePtr16, aEvent.iAccountName.Length() / 2 );
+	
+	TPtrC16 newName16;
+	valuePtr16 = reinterpret_cast<const TUint16*>( aEvent.iNewAccountName.Ptr() );
+	newName16.Set( valuePtr16, aEvent.iNewAccountName.Length() / 2 );
+	
+    __LOG_WRITE8_FORMAT1_INFO( "Notifying %d observers", iObservers.Count() )
+    
+	for( TInt index = 0; index < iObservers.Count(); index++ )
+		{
+
+		
+		
+		iObservers[index]->AccountEventNotify( static_cast<TMsgStoreAccountEvent>(aEvent.iType),
+				                               static_cast<TInt32>(aEvent.iId),
+				                               name16,
+				                               newName16,
+                                               aEvent.iMailBoxId );
+		} // end for
+		
+	} // end AccountEventNotify
+
+
+
+// ==========================================================================
+// FUNCTION: DoCancel
+// ==========================================================================
+void CMsgStoreObserverHandler::DoCancel()
+	{
+    __LOG_ENTER( "DoCancel" )
+
+    iSession.StopObserving();
+
+    __LOG_EXIT
+	} // end DoCancel
+