diff -r 000000000000 -r 72b543305e3a messagingappbase/ncnlist/src/CNcnMsvSessionHandler.cpp --- /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 // 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( aArg1 ); + + HandleMsvEntriesCreatedL( *selection ); + break; + } + // Entries deleted + case EMsvEntriesDeleted: + { + CMsvEntrySelection* selection = + static_cast( aArg1 ); + + HandleMsvEntriesDeletedL( *selection ); + break; + } + // Messages are moved to MMC + case EMsvMediaChanged: + { + TDriveNumber* newDriveNumber = static_cast( aArg1 ); + HandleMsvMediaChangedL( *newDriveNumber ); + break; + } + // Message server is again available + case EMsvMediaAvailable: + { + TDriveNumber* driveNumber = static_cast( 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