diff -r 000000000000 -r 094583676ce7 wvuing/IMPSConnectionUI/NotifySrc/CIMPSConnUiPresEventNotifierImpBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/IMPSConnectionUI/NotifySrc/CIMPSConnUiPresEventNotifierImpBase.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,246 @@ +/* +* 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: Event notifier implementation base +* +*/ + +// INCLUDE FILES +#include +#include +#include +#include "CIMPSConnUiPresEventNotifierImpBase.h" +#include "CnUiEventMapper.h" +#include "CnUiPanics.h" +#include "IMPSCommonUiDebugPrint.h" + +// ================= MEMBER FUNCTIONS ======================= +// Destructor +CIMPSConnUiPresEventNotifierImpBase::~CIMPSConnUiPresEventNotifierImpBase() + { + iObserverArray.Close(); + delete iSessionSlotID; + } + + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CIMPSConnUiPresEventNotifierImpBase::CIMPSConnUiPresEventNotifierImpBase( + CIMPSConnUiPresEventNotifier& aInterface ) + : iInterface( aInterface ), + iStarted( EFalse ), + iDying( EFalse ) + { + } + + +// ----------------------------------------------------------------------------- +// CIMPSConnUiPresEventNotifierImpBase::StartL() +// ----------------------------------------------------------------------------- +// +void CIMPSConnUiPresEventNotifierImpBase::StartL() + { + //make here sanity checks to encapsulate + //real notifiers behaviour + if ( iDying ) + { + //if dying, the notifier restart is silently ignored + //notifier is evidently going down anyway + return; + } + + if ( iStarted ) + { + User::Leave( KErrInUse ); + } + + if ( iObserverArray.Count() == 0 ) + { + User::Leave( KErrNotReady ); + } + + RArray< TPEngNWSessionSlotEvent > pecEvents; + CleanupClosePushL( pecEvents ); + CnUiEventMapper::AddAllKnownPecEventsL( pecEvents ); + TRAPD( err, DoStartL( pecEvents.Array() ) ); + if ( err != KErrNone ) + { + DoStop(); + User::Leave( err ); + } + + CleanupStack::PopAndDestroy(); //pecEvents + iStarted = ETrue; + } + + +// ----------------------------------------------------------------------------- +// CIMPSConnUiPresEventNotifierImpBase::Stop() +// ----------------------------------------------------------------------------- +// +void CIMPSConnUiPresEventNotifierImpBase::Stop() + { + StopAndNotifyObserversFromError( KErrCancel ); + } + + +// ----------------------------------------------------------------------------- +// CIMPSConnUiPresEventNotifierImpBase::Dying() +// ----------------------------------------------------------------------------- +// +void CIMPSConnUiPresEventNotifierImpBase::Dying() + { + iDying = ETrue; + if ( iStarted ) + { + iStarted = EFalse; + DoStop(); + } + } + + +// ----------------------------------------------------------------------------- +// CIMPSConnUiPresEventNotifierImpBase::AddObserverL() +// ----------------------------------------------------------------------------- +// +void CIMPSConnUiPresEventNotifierImpBase::AddObserverL( + MIMPSConnUiPresenceEventObserver* aObserver ) + { + __ASSERT_ALWAYS( aObserver, + CnUiPanicOrLeaveL( EIMPSConn_NULLPtr, + KErrArgument ) ); + + iObserverArray.AddObserverL( aObserver ); + } + + +// ----------------------------------------------------------------------------- +// CIMPSConnUiPresEventNotifierImpBase::RemoveObserver() +// ----------------------------------------------------------------------------- +// +TInt CIMPSConnUiPresEventNotifierImpBase::RemoveObserver( + MIMPSConnUiPresenceEventObserver* aObserver ) + { + return iObserverArray.RemoveObserver( aObserver ); + } + + +// ----------------------------------------------------------------------------- +// CIMPSConnUiPresEventNotifierImpBase::NotifyObserversFromEvent() +// ----------------------------------------------------------------------------- +// +void CIMPSConnUiPresEventNotifierImpBase::NotifyObserversFromEvent( + const CPEngNWSessionSlotID2& aSessionSlotID, + TIMPSConnectionClient aClient, + TIMPSPresenceServiceEvent aEvent ) + { + //if not running, don't notify the clients + if ( !iStarted ) + { + return; + } + + CPEngNWSessionSlotID2* tempSlot = NULL; + if ( &aSessionSlotID ) + { + TRAPD( err, tempSlot = aSessionSlotID.CloneL() ); + if ( err ) + { + return; + } + delete iSessionSlotID; + iSessionSlotID = tempSlot; + iClient = aClient; + } + + IMPSCUI_DP( D_IMPSCUI_LIT( "CIMPSConnUiPresEventNotifierImpBase::NotifyObserversFromEvent() [%d]" ), aEvent ); + iObserverArray.NotifyObservers( *this, aEvent ); + } + + + +// ----------------------------------------------------------------------------- +// CIMPSConnUiPresEventNotifierImpBase::StopAndNotifyObserversFromError() +// ----------------------------------------------------------------------------- +// +void CIMPSConnUiPresEventNotifierImpBase::StopAndNotifyObserversFromError( TInt aError ) + { + //if not running, don't notify the clients + if ( !iStarted ) + { + return; + } + + //Error propagating from the underlying implementation + //causes the notifier to stop. However, flag & actual + //stopping must be done before notifying the clients + //since some client may wan't to restart this notifier + //in the notification callback... + + //Also the state must be set to "not started" before + //actual stopping since the stopping of some event + //sources cause further KErrCancel events + //(==>those will be filtered on !started check on above.) + iStarted = EFalse; + DoStop(); + + //do the notify + IMPSCUI_DP( D_IMPSCUI_LIT( "CIMPSConnUiPresEventNotifierImpBase::StopAndNotifyObserversFromError() [%d]" ), aError ); + iObserverArray.NotifyObserversFromError( *this, aError ); + } + + +// ----------------------------------------------------------------------------- +// CIMPSConnUiPresEventNotifierImpBase::MediateNotifyL() +// From MGenObserverNotifyMediator +// ----------------------------------------------------------------------------- +// +void CIMPSConnUiPresEventNotifierImpBase::MediateNotifyL( + MIMPSConnUiPresenceEventObserver& aObserverToNotify, + TIMPSPresenceServiceEvent& aNotifyData ) + + { + aObserverToNotify.HandlePresenceEventL( &iInterface, *iSessionSlotID, iClient, aNotifyData ); + } + +// ----------------------------------------------------------------------------- +// CIMPSConnUiPresEventNotifierImpBase::MediateNotifyError() +// From MGenObserverNotifyMediator +// Forwards any error propagated from MediateNotifyL() to +// observer handle error. +// ----------------------------------------------------------------------------- +// +void CIMPSConnUiPresEventNotifierImpBase::MediateNotifyError( + MIMPSConnUiPresenceEventObserver& aObserverToNotify, + TInt aLeaveError ) + { + aObserverToNotify.HandlePresenceEventNotifyError( &iInterface, aLeaveError ); + } + + +// ----------------------------------------------------------------------------- +// CIMPSConnUiPresEventNotifierImpBase::MediateError() +// From MGenObserverNotifyMediator +// Forwards error to observer. +// ----------------------------------------------------------------------------- +// +void CIMPSConnUiPresEventNotifierImpBase::MediateError( + MIMPSConnUiPresenceEventObserver& aObserverToNotify, + TInt aError ) + { + aObserverToNotify.HandlePresenceEventNotifyError( &iInterface, aError ); + } + +// End of File +