--- /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