PECengine/StorageManager2/ClientSrc/CPEngStorageManagerWatcher.cpp
changeset 0 094583676ce7
--- /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    <e32std.h>
+#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