diff -r 000000000000 -r 094583676ce7 PECengine/StorageManager2/ClientSrc/CPEngStorageManagerWatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/StorageManager2/ClientSrc/CPEngStorageManagerWatcher.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,401 @@ +/* +* Copyright (c) 2002 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: It is used to liste Storage Ids and session state +* changes +* +*/ + + + +// INCLUDE FILES +#include +#include "CPEngStorageManagerWatcher.h" + +#include "CPEngSessionSlotId.h" + +#include "CPEngSIdChangeListener.h" +#include "MPEngStorageFactory.h" + +#include "PEngMessagePacker.h" +#include "CPEngStorageManager.h" +#include "MPEngGlobalEventObserver.h" + +#include "PresenceDebugPrint.h" + + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::CPEngStorageManagerWatcher +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CPEngStorageManagerWatcher::CPEngStorageManagerWatcher( + MPEngStorageFactory& aStorageFactory ) + : iStorageManagerFactory( aStorageFactory ) + { + iAccessCount++; + iStorageManagerFactory.OpenWatcher(); + } + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPEngStorageManagerWatcher::ConstructL( + const CPEngSessionSlotId& aSessionSlot, + RPEngStorageClient& aStorageClient ) + { + iSessionSlotId = aSessionSlot.CloneL(); + HBufC8* sessionName = aSessionSlot.PackLC(); + User::LeaveIfError( iNotifyClient.Connect( aStorageClient, + *sessionName ) ); + CleanupStack::PopAndDestroy(); // sessionName + } + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngStorageManagerWatcher* CPEngStorageManagerWatcher::NewL( + const CPEngSessionSlotId& aSessionSlot, + RPEngStorageClient& aStorageClient, + MPEngStorageFactory& aStorageFactory ) + { + CPEngStorageManagerWatcher* self = NewLC( aSessionSlot, + aStorageClient, + aStorageFactory ); + + CleanupStack::Pop(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngStorageManagerWatcher* CPEngStorageManagerWatcher::NewLC( + const CPEngSessionSlotId& aSessionSlot, + RPEngStorageClient& aStorageClient, + MPEngStorageFactory& aStorageFactory ) + { + CPEngStorageManagerWatcher* self = new( ELeave ) + CPEngStorageManagerWatcher( aStorageFactory ); + // reference counted + CleanupClosePushL( *self ); + self->ConstructL( aSessionSlot, aStorageClient ); + return self; + } + + +// Destructor +CPEngStorageManagerWatcher::~CPEngStorageManagerWatcher() + { + // if we have not counter to zero, panic + __ASSERT_ALWAYS( iAccessCount == 0, + User::Panic( KPEngSMEuserCBasePanic, + KPEngSMEuserCBasePanicReason ) ); + + // close has canceled all async requests + delete iStorageIdListener; + delete iSessionSlotId; + iEventObservers.Reset(); + iNotifyClient.Close(); + + iStorageManagerFactory.CloseStorageWatcher( this ); + // signal to the Storage factory that this Watcher is dying + } + + + +// ============================================================================= +// =============== New public function of the class ============================ +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::NotifyGlobalEvent() +// ----------------------------------------------------------------------------- +// +void CPEngStorageManagerWatcher::NotifyGlobalEvent( + const CPEngSessionSlotEvent& aNewEvent ) + { + // notify observers + TInt count ( iEventObservers.Count() ); + for ( TInt x( 0 ) ; x < count ; x++ ) + { + TRAPD( e, iEventObservers[ x ]->HandleNewSessionSlotEventL( + aNewEvent ) ); + if ( e != KErrNone ) + { + iEventObservers[ x ]->HandleObserverError( e ); + } + } + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::NotifySessionSlotRemovalL() +// ----------------------------------------------------------------------------- +// +void CPEngStorageManagerWatcher::NotifyListenerError( + TInt aError ) + { + // notify observers + TInt count ( iEventObservers.Count() ); + for ( TInt x( 0 ) ; x < count ; x++ ) + { + iEventObservers[ x ]->HandleObserverError( aError ); + } + } + + +// ============================================================================= +// ============ Functions of the MPEngStorageManagerWatcher class=============== +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::Open() +// ----------------------------------------------------------------------------- +// +void CPEngStorageManagerWatcher::Open() + { + iAccessCount++; + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::RegisterListenEventObserverL() +// ----------------------------------------------------------------------------- +// +void CPEngStorageManagerWatcher::Close() + { + iAccessCount--; + if ( iAccessCount == 0 ) // 0 + { + delete this; + } + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::CreateStorageManagerL() +// ----------------------------------------------------------------------------- +// +MPEngStorageManager* CPEngStorageManagerWatcher::CreateStorageManagerL() + { + return CPEngStorageManager::NewL( + *this, + iStorageManagerFactory.MainClient() ); + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::RegisterListenEventObserverL() +// ----------------------------------------------------------------------------- +// +TPEngNWSessionSlotState CPEngStorageManagerWatcher::RegisterListenEventObserverL( + MPEngGlobalEventObserver& aEventObserver ) + { + User::LeaveIfError( iEventObservers.InsertInAddressOrder( + &aEventObserver ) ); + // increase reference counter + this->Open(); // CSI: 65 # + + return iSessionState; + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::UnregisterListenEventObserver() +// ----------------------------------------------------------------------------- +// +void CPEngStorageManagerWatcher::UnregisterListenEventObserver( + MPEngGlobalEventObserver& aEventObserver ) + { + TInt err ( iEventObservers.FindInAddressOrder( &aEventObserver ) ); + if ( err != KErrNotFound ) + { + iEventObservers.Remove( err ); + this->Close(); + // decrease reference counter + } + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::CurrentStateOfPresenceServerL() +// ----------------------------------------------------------------------------- +// +TPEngNWSessionSlotState CPEngStorageManagerWatcher::CurrentStateOfSessionSlot() + { + return iSessionState; + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::RegisterListenSIDsObserverL() +// ----------------------------------------------------------------------------- +// +void CPEngStorageManagerWatcher::RegisterListenSIDsObserverL( + const MDesCArray& aInterestedSIds, + MPEngSIDChangeObserver& aSIdChangeObserver, + TPEngObserverPriority aPriority, + TBool aKeepOldIds ) + { + LoadSIdListenerL(); + // ETrue if listener was existing -> decrease ref count + if ( iStorageIdListener->RegisterObserverL( aInterestedSIds, + aSIdChangeObserver, + aPriority, + aKeepOldIds ) ) + { + // increase reference counter + this->Open(); // CSI: 65 # + } + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::RemoveSIDsFromSIDsObserverL() +// ----------------------------------------------------------------------------- +// +void CPEngStorageManagerWatcher::RemoveSIDsFromSIDsObserver( + const MDesCArray& aSIdsToRemove, + const MPEngSIDChangeObserver& aSIdChangeObserver ) + { + if ( iStorageIdListener ) + { + iStorageIdListener->RemoveSIdsFromObserver( + aSIdsToRemove, + aSIdChangeObserver ); + } + } + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::RestartSIDsObserver() +// ----------------------------------------------------------------------------- +// +void CPEngStorageManagerWatcher::RestartSIDsObserver( + const MPEngSIDChangeObserver& aSIdChangeObserver ) + { + if ( iStorageIdListener ) + { + iStorageIdListener->RestartObserver( + aSIdChangeObserver ); + } + } + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::UnregisterListenSIDsObserver() +// ----------------------------------------------------------------------------- +// +void CPEngStorageManagerWatcher::UnregisterListenSIDsObserver( + const MPEngSIDChangeObserver& aSIDChangeObserver ) + { + if ( iStorageIdListener + && + ( iStorageIdListener->UnRegisterObserver( aSIDChangeObserver ) ) + ) + { + CleanStorageIdListener(); + this->Close(); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::SuspendListenSIDsObserver() +// ----------------------------------------------------------------------------- +// +TInt CPEngStorageManagerWatcher::SuspendListenSIDsObserver( + const MPEngSIDChangeObserver& aSIdChangeObserver ) + { + if ( iStorageIdListener ) + { + return iStorageIdListener->UpdateSuspendStateOfObserver( + aSIdChangeObserver, + ETrue ); + } + return KErrNotFound; + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::ResumeListenSIDsObserver() +// ----------------------------------------------------------------------------- +// +TInt CPEngStorageManagerWatcher::ResumeListenSIDsObserver( + const MPEngSIDChangeObserver& aSIdChangeObserver ) + { + if ( iStorageIdListener ) + { + return iStorageIdListener->UpdateSuspendStateOfObserver( + aSIdChangeObserver, + EFalse ); + } + return KErrNotFound; + } + + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::SessionSlotId() +// ----------------------------------------------------------------------------- +// +const CPEngSessionSlotId& CPEngStorageManagerWatcher::SessionSlotId() const + { + return *iSessionSlotId; + } + + +// ----------------------------------------------------------------------------- +// Private functions of the CPEngStorageManagerWatcher +// ----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::CleanStorageIdListener() +// Check if there is still some SId listener +// and deletes it if it's not needed +// ----------------------------------------------------------------------------- +// +void CPEngStorageManagerWatcher::CleanStorageIdListener() + { + if ( !iStorageIdListener->AnyActiveListener() ) + { + delete iStorageIdListener; + iStorageIdListener = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CPEngStorageManagerWatcher::LoadSIdListenerL() +// Get Storage ID listener, +// if it does not exists, it constructed +// ----------------------------------------------------------------------------- +// +void CPEngStorageManagerWatcher::LoadSIdListenerL() + { + if ( !iStorageIdListener ) + { + iStorageIdListener = CPEngSIdChangeListener::NewL( iNotifyClient ); + } + } + + +// End of File