messagingappbase/ncnlist/src/CNcnMsvSessionHandler.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/ncnlist/src/CNcnMsvSessionHandler.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,452 @@
+/*
+* Copyright (c) 2004 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:   Methods for CNcnMsvSessionHandler class.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "NcnDebug.h"
+#include    "CNcnMsvSessionHandler.h"
+#include    "MNcnMsvSessionHandlerObserver.h"
+#include    <msvapi.h>                          // For CMsvSession
+
+// ================= LOCAL CONSTANTS =======================
+namespace
+    {
+    }
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::CNcnMsvSessionHandler
+// ----------------------------------------------------
+//
+CNcnMsvSessionHandler::CNcnMsvSessionHandler( ) :
+    iObservers( 2 )
+    {
+    // empty
+    }
+
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::ConstructL
+// ----------------------------------------------------
+//
+void CNcnMsvSessionHandler::ConstructL()
+    {
+    // empty
+    }
+    
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::NewL
+// ----------------------------------------------------
+//
+CNcnMsvSessionHandler* CNcnMsvSessionHandler::NewL( )
+    {
+    CNcnMsvSessionHandler* self = new (ELeave) CNcnMsvSessionHandler();
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    
+    return self;
+    }
+
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::~CNcnMsvSessionHandler
+// ----------------------------------------------------
+//
+CNcnMsvSessionHandler::~CNcnMsvSessionHandler()
+    {
+    // stop sessino handler
+    StopSessionHandler();
+    }
+
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::HandleSessionEventL
+// ----------------------------------------------------
+//
+void CNcnMsvSessionHandler::HandleSessionEventL(
+            TMsvSessionEvent aEvent,
+            TAny* aArg1,
+            TAny* /*aArg2*/,
+            TAny* /*aArg3*/ )
+    {
+    // determine event type
+    switch ( aEvent )
+        {
+
+        case EMsvMediaUnavailable:
+            {
+            // If the Unavailable Memory is External Memory then set it back to Phone Memory .
+            NCN_RDEBUG( _L( "CNcnMsvSessionHandler::HandleSessionEventL - EMsvMediaUnavailable." ));
+           	HandleMsvMediaUnAvailableL();
+            break;
+            }
+
+    	case EMsvServerReady:
+            {
+            // Ignored. Session was initialized already in StartSessionHandlerL .
+            // If message store medium changes, then "old" messages are deleted from the CMsvEntry index
+            // and the index is kept valid without re-creating it.
+            NCN_RDEBUG( _L( "CNcnMsvSessionHandler::HandleSessionEventL - EMsvSessionReady, ignored" ));
+            NotifyMsvSessionReady();
+            break;
+            }
+        // Msv server terminated
+        case EMsvServerTerminated:
+            {            
+            HandleMsvTerminatedL();
+            break;
+            }
+        // Msv session close event
+        case EMsvCloseSession:
+            {
+            HandleMsvClosed();
+            break;
+            }
+        // Entries created
+        case EMsvEntriesCreated:
+            {
+            CMsvEntrySelection* selection =
+                static_cast<CMsvEntrySelection*>( aArg1 );
+                
+            HandleMsvEntriesCreatedL( *selection );
+            break;
+            }
+        // Entries deleted
+        case EMsvEntriesDeleted:
+            {
+            CMsvEntrySelection* selection =
+                static_cast<CMsvEntrySelection*>( aArg1 );
+                
+            HandleMsvEntriesDeletedL( *selection );
+            break;
+            }
+        // Messages are moved to MMC
+        case EMsvMediaChanged:
+            {
+            TDriveNumber* newDriveNumber = static_cast<TDriveNumber*>( aArg1 );
+            HandleMsvMediaChangedL( *newDriveNumber );
+            break;
+            }
+ 		// Message server is again available    
+        case EMsvMediaAvailable:
+        	{
+        	TDriveNumber* driveNumber = static_cast<TDriveNumber*>( aArg1 );
+            HandleMsvMediaAvailableL( *driveNumber );
+            break;            		
+        	}
+        // other events, ignore
+        default:
+            {
+           	NCN_RDEBUG_INT( _L( "CNcnMsvSessionHandler::HandleSessionEventL - unknown event %d!" ), aEvent );
+            break;
+            }
+        }
+    }
+    
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::AddObserver
+// ----------------------------------------------------
+//
+void CNcnMsvSessionHandler::AddObserverL(
+    MNcnMsvSessionHandlerObserver* aObserver )
+    {
+    // append observer to array
+    iObservers.AppendL( aObserver );    
+    }
+
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::RemoveObserver
+// ----------------------------------------------------
+//
+void CNcnMsvSessionHandler::RemoveObserver(
+    MNcnMsvSessionHandlerObserver* aObserver )
+    {
+    TInt count = iObservers.Count();
+    TInt index = -1;
+    
+    // search for observer
+    while( count-- )
+        {
+        MNcnMsvSessionHandlerObserver* observer =
+            iObservers.At( count );
+            
+        // if pointer found    
+        if( observer == aObserver )
+            {
+            index = count;
+            break;
+            }
+        }
+    
+    // if observer was found delete it    
+    if( index != -1 )
+        {
+        iObservers.Delete( index );
+        iObservers.Compress();
+        }
+    }
+
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::IsMsvSessionReady
+// ----------------------------------------------------
+//
+TBool CNcnMsvSessionHandler::IsMsvSessionReady() const
+    {
+    return ( iMsvSession != 0 );
+    }
+
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::MsvSessionL
+// ----------------------------------------------------
+//
+CMsvSession& CNcnMsvSessionHandler::MsvSessionL()
+    {
+    // leave if session is not ready
+    if( !IsMsvSessionReady() )
+        {
+        User::Leave( KErrGeneral );
+        }
+        
+    // return the session instance    
+    return *iMsvSession;
+    }
+
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::StartSessionHandlerL
+// ----------------------------------------------------
+//        
+void CNcnMsvSessionHandler::StartSessionHandlerL()
+    {
+    if( !iMsvSession )
+        {
+        // open msv session
+        iMsvSession = CMsvSession::OpenSyncL( *this );
+        
+        // notity that msv session is ready
+        NotifyMsvSessionReady();
+        }
+    }
+        
+
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::StopSessionHandler
+// ----------------------------------------------------
+//    
+void CNcnMsvSessionHandler::StopSessionHandler()
+    {
+    // just delegate to close handler
+    HandleMsvClosed();
+    }
+
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::HandleMsvTerminatedL
+// ----------------------------------------------------
+//    
+void CNcnMsvSessionHandler::HandleMsvTerminatedL()
+    {
+    // handle msv close normally
+    HandleMsvClosed();
+    
+    // re-start session handler
+    StartSessionHandlerL();
+    }
+    
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::HandleMsvClosed
+// ----------------------------------------------------
+//
+void CNcnMsvSessionHandler::HandleMsvClosed()
+    {
+    // only handle close if session is ready
+    if( iMsvSession )
+        {
+        // set temporary pointer
+        CMsvSession* tmpMsvSession = iMsvSession;
+        
+        // clear instance variable since it's used
+        // for tracking instance state
+        iMsvSession = 0;        
+        
+        // notify observers that session was closed
+        NotifyMsvSessionClosed();
+        
+        // finally delete the session
+        delete tmpMsvSession;
+        }    
+    }
+
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::HandleEntriesCreatedL
+// ----------------------------------------------------
+//    
+void CNcnMsvSessionHandler::HandleMsvEntriesCreatedL(
+    const CMsvEntrySelection& aSelection )
+    {
+    TInt count = aSelection.Count();
+    
+    while( count-- )
+        {
+        TMsvId id = aSelection.At( count );
+        NotifyMsvEntryCreated( id );
+        }
+    }
+    
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::HandleEntriesDeletedL
+// ----------------------------------------------------
+//    
+void CNcnMsvSessionHandler::HandleMsvEntriesDeletedL(
+    const CMsvEntrySelection& aSelection )
+    {
+    TInt count = aSelection.Count();
+    
+    while( count-- )
+        {
+        TMsvId id = aSelection.At( count );
+        NotifyMsvEntryDeleted( id );
+        }
+    }
+
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::NotifyMsvSessionReady
+// ----------------------------------------------------
+//    
+void CNcnMsvSessionHandler::NotifyMsvSessionReady()
+    {
+    TInt count = iObservers.Count();
+    
+    // process all observers
+    while( count-- )
+        {        
+        MNcnMsvSessionHandlerObserver* observer =
+            iObservers.At( count );
+        
+        TRAP_IGNORE( observer->HandleMsvSessionReadyL( *iMsvSession ) );
+        }
+    }
+  
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::NotifyMsvSessionClosed
+// ----------------------------------------------------
+//        
+void CNcnMsvSessionHandler::NotifyMsvSessionClosed()
+    {
+    TInt count = iObservers.Count();
+    
+    // process all observers
+    while( count-- )
+        {        
+        MNcnMsvSessionHandlerObserver* observer =
+            iObservers.At( count );
+        
+        TRAP_IGNORE( observer->HandleMsvSessionClosedL() );
+        }
+    }
+
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::NotifyMsvEntryCreated
+// ----------------------------------------------------
+//    
+void CNcnMsvSessionHandler::NotifyMsvEntryCreated( const TMsvId& aMsvId )
+    {
+    TInt count = iObservers.Count();
+    
+    // process all observers
+    while( count-- )
+        {        
+        MNcnMsvSessionHandlerObserver* observer =
+            iObservers.At( count );
+        
+        TRAP_IGNORE( observer->HandleMsvEntryCreatedL( aMsvId ) );
+        }
+    }
+  
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::NotifyMsvSessionClosed
+// ----------------------------------------------------
+//        
+void CNcnMsvSessionHandler::NotifyMsvEntryDeleted( const TMsvId& aMsvId )
+    {
+    TInt count = iObservers.Count();
+    
+    // process all observers
+    while( count-- )
+        {        
+        MNcnMsvSessionHandlerObserver* observer =
+            iObservers.At( count );
+        
+        TRAP_IGNORE( observer->HandleMsvEntryDeletedL( aMsvId ) );
+        }
+    }
+    
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::HandleMsvMediaChangedL
+// ----------------------------------------------------
+//  
+void CNcnMsvSessionHandler::HandleMsvMediaChangedL( const TDriveNumber& aDriveNumber )
+	{
+    TInt count = iObservers.Count();
+    
+    // process all observers
+    while( count-- )
+        {        
+        MNcnMsvSessionHandlerObserver* observer =
+            iObservers.At( count );
+        
+        TRAP_IGNORE( observer->HandleMsvMediaChangedL( aDriveNumber ) );
+        }		
+	}
+	
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::HandleMsvMediaAvailableL
+// ----------------------------------------------------
+//  
+void CNcnMsvSessionHandler::HandleMsvMediaAvailableL( const TDriveNumber& aDriveNumber )
+	{
+    TInt count = iObservers.Count();
+    
+    // process all observers
+    while( count-- )
+        {        
+        MNcnMsvSessionHandlerObserver* observer =
+            iObservers.At( count );
+        
+        TRAP_IGNORE( observer->HandleMsvMediaAvailableL( aDriveNumber ) );
+        }		
+	}
+	
+// ----------------------------------------------------
+//  CNcnMsvSessionHandler::HandleMsvMediaUnAvailableL
+//  Call the corresponding observer to handle MediaUnAvailable event
+// ----------------------------------------------------
+//  
+void CNcnMsvSessionHandler::HandleMsvMediaUnAvailableL( )
+	{
+    TInt count = iObservers.Count();
+    
+    // process all observers
+    while( count != 0 )
+        {     
+        count--;   
+        MNcnMsvSessionHandlerObserver* observer =
+            iObservers.At( count );
+        
+        TRAP_IGNORE( observer->HandleMsvMediaUnavailableL() );
+        }		
+	}
+//  End of File