phoneapp/phoneuiutils/src/cphonepubsubproxy.cpp
changeset 0 5f000ab63145
child 3 8871b09be73b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneapp/phoneuiutils/src/cphonepubsubproxy.cpp	Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,325 @@
+/*
+* Copyright (c) 2005 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:  Publish & Subscribe proxy.
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32base.h>     // TPriority::EPriorityHigh=20
+#include <PSVariables.h>
+#include <telinternalpskeys.h>
+#include <telephonydomainpstypes.h>
+#include <btengdomainpskeys.h>
+
+#include <startupdomainpskeys.h>
+#include <coreapplicationuisdomainpskeys.h>
+#include <hwrmdomainpskeys.h>
+#include <UikonInternalPSKeys.h>
+
+#include  "phoneui.pan"
+#include  "phoneconstants.h"
+#include  "phonelogger.h"
+
+#include  "cphonepubsubproxy.h"
+#include  "cphonepublishsubscriberao.h"
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+// ---------------------------------------------------------
+// CPhonePubSubProxy::Instance
+// Initializes the singleton object
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C CPhonePubSubProxy* CPhonePubSubProxy::Instance()
+    {
+    CPhonePubSubProxy* instance = static_cast<CPhonePubSubProxy*> 
+        ( CCoeEnv::Static ( KUidPubSubProxySingleton ) );
+    
+    if ( !instance )
+        {
+        TRAPD( err, instance = CPhonePubSubProxy::NewL() );
+        if ( err )
+	        {
+	        Panic( EPhoneUtilsCouldNotCreateSingleton );	
+	        }
+        }
+    return instance;
+    }
+
+// ---------------------------------------------------------
+// CPhonePubSubProxy::CancelAllNotifications
+// Cancel the notification if the singleton still exists.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void CPhonePubSubProxy::CancelAllNotifications( 
+    MPhonePubSubObserver* aObserver )
+    {
+    CPhonePubSubProxy* instance = static_cast<CPhonePubSubProxy*> 
+        ( CCoeEnv::Static( KUidPubSubProxySingleton ) );
+    
+    // Ignore the call since the singleton has already been destroyed and the
+    // notifications removed
+    if ( instance )
+        {
+        instance->CancelAllObserverNotifies( aObserver );
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CPhonePubSubProxy::NewL
+// ---------------------------------------------------------
+//
+CPhonePubSubProxy* CPhonePubSubProxy::NewL()
+    {
+    CPhonePubSubProxy* self = new (ELeave) CPhonePubSubProxy();
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+    
+// ---------------------------------------------------------
+// CPhonePubSubProxy::~CPhonePubSubProxy
+// ---------------------------------------------------------
+//
+EXPORT_C CPhonePubSubProxy::~CPhonePubSubProxy()
+    {
+    if ( iPublishSubscriberArray )
+        {
+        iPublishSubscriberArray->ResetAndDestroy();
+        }
+    delete iPublishSubscriberArray;
+    delete iObserverArray;
+    }
+
+// ---------------------------------------------------------
+// CPhonePubSubProxy::CPhonePubSubProxy
+// ---------------------------------------------------------
+//
+CPhonePubSubProxy::CPhonePubSubProxy() :
+    CCoeStatic( KUidPubSubProxySingleton, EThread )
+    {
+    }
+
+// ---------------------------------------------------------
+// CPhonePubSubProxy::ConstructL
+// ---------------------------------------------------------
+//
+void CPhonePubSubProxy::ConstructL()
+    {
+    iObserverArray = new ( ELeave ) CArrayFixFlat< TPubSubObserverTag >( 
+        KPhonePubSubProxyObserverArrayGranularity );
+
+    iPublishSubscriberArray = new ( ELeave ) 
+        CArrayPtrFlat< CPhonePublishSubscriberAO >( 
+            KPhonePubSubArrayGranularity );
+    }
+
+// ---------------------------------------------------------
+// CPhonePubSubProxy::Value
+// ---------------------------------------------------------
+//
+EXPORT_C TInt CPhonePubSubProxy::Value( 
+    const TUid& aCategory,
+    const TUint aKey )
+    {
+    TInt err( KErrNone );
+    TInt value( 0 );
+
+    err = RProperty::Get( aCategory, aKey, value );
+    if ( err != KErrNone )
+        {
+        value = err;
+
+        __PHONELOG1( 
+            EBasic, 
+            EPhonePhoneapp, 
+            "CPhonePubSubProxy::GetValue error: %d", 
+            err );
+        }
+
+    return value;
+    }
+
+// ---------------------------------------------------------
+// CPhonePubSubProxy::NotifyChangeL
+// ---------------------------------------------------------
+//
+EXPORT_C void CPhonePubSubProxy::NotifyChangeL( 
+    const TUid& aCategory,
+    const TUint aKey, 
+    MPhonePubSubObserver* aObserver )
+    {
+    __ASSERT_DEBUG( aObserver, Panic( EPhoneUtilsParameterNotInitialized ) );
+    __LOGMETHODSTARTEND(EPhoneUIUtils, "CPhonePubSubProxy::NotifyChangeL() ");
+    
+    // make sure this a new item in iObserverArray
+    TBool requestIssued = EFalse;
+    TBool sameRequestIssuedByObserver = EFalse;
+    TInt count = iObserverArray->Count();
+
+    // check if the request has already been issued
+    for ( TInt i = 0; i < count && !requestIssued; i++ ) 
+        {
+        const TPubSubObserverTag& observerTag = iObserverArray->At( i );
+        if ( ( observerTag.iCategory == aCategory ) &&
+            ( observerTag.iKey == aKey ) )
+            {
+            requestIssued = ETrue;
+            if ( observerTag.iObserver == aObserver )
+                {
+                sameRequestIssuedByObserver = ETrue;
+                }
+            }
+        }
+
+    // make sure the same request hasn't been issued by this observer
+    if ( !sameRequestIssuedByObserver )
+        {
+        //add new observer to the array
+        TPubSubObserverTag newObserver;
+        newObserver.iCategory = aCategory;
+        newObserver.iKey = aKey;
+        newObserver.iObserver = aObserver;
+        iObserverArray->AppendL( newObserver );
+        }
+
+    //make sure the request hasn't been issued before
+    if ( !requestIssued )
+        {
+        //issue a new request
+        CPhonePublishSubscriberAO* publishSubscriber = 
+            CPhonePublishSubscriberAO::NewL( this, aCategory, aKey );
+    
+        CleanupStack::PushL( publishSubscriber );
+        iPublishSubscriberArray->AppendL( publishSubscriber );
+        CleanupStack::Pop( publishSubscriber );
+        
+        //subscribe for property change notications
+        publishSubscriber->Subscribe();
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhonePubSubProxy::ChangePropertyValue
+// ---------------------------------------------------------
+//
+EXPORT_C void CPhonePubSubProxy::ChangePropertyValue( 
+    const TUid& aCategory,
+    const TUint aKey, 
+    const TInt aValue )
+    {
+    TInt err( KErrNone );
+
+    err = RProperty::Set( aCategory, aKey, aValue );
+    if ( err != KErrNone )
+        {
+        __PHONELOG1( 
+            EBasic, 
+            EPhonePhoneapp, 
+            "CPhonePubSubProxy::ChangePropertyValue error: %d", 
+            err );
+        }
+    }
+
+// ---------------------------------------------------------
+// CPhonePubSubProxy::HandlePropertyChangedL
+// ---------------------------------------------------------
+//
+void CPhonePubSubProxy::HandlePropertyChangedL( 
+    const TUid& aCategory, 
+    const TUint aKey,
+    const TInt aValue )
+    {
+    TInt count = iObserverArray->Count();
+    for ( TInt i = 0; i < count; )
+        {
+        // Take observer information.
+        TPubSubObserverTag observerTag = iObserverArray->At( i );
+        
+        if ( ( observerTag.iCategory == aCategory ) && 
+            ( observerTag.iKey == aKey ) ) 
+            {
+            observerTag.iObserver->HandlePropertyChangedL( 
+                aCategory, aKey, aValue );
+            }
+
+        // Update count variable - might have been modified by the
+        // HandlePropertyChangedL call.
+        count = iObserverArray->Count();
+
+        // If still in bounds, check if nothing changed. If so, then
+        // we can move to next observer.
+        if ( i < count )
+            {
+            const TPubSubObserverTag& obs = iObserverArray->At( i );
+
+            if ( ( obs.iObserver == observerTag.iObserver ) &&
+                 ( obs.iCategory == observerTag.iCategory ) &&
+                 ( obs.iKey == observerTag.iKey ) )
+                {
+                i++;
+                }
+            }
+        }
+    }
+               
+// ---------------------------------------------------------
+// CPhonePubSubProxy::CancelAllObserverNotifies
+// ---------------------------------------------------------
+//
+void CPhonePubSubProxy::CancelAllObserverNotifies( 
+    MPhonePubSubObserver* aObserver )
+    {
+    TInt count = iObserverArray->Count();
+
+    // Remove the observer and its subscriptions
+    TBool observerRemoved = EFalse;
+    for( TInt i = count - 1; i >= 0 && !observerRemoved; i-- ) 
+        {
+        const TPubSubObserverTag& observerTag = iObserverArray->At( i );
+        if ( observerTag.iObserver == aObserver )
+            {
+            // Remove observer 
+            observerRemoved = ETrue;
+            iObserverArray->Delete( i );
+
+            // Remove this observers' subscriptions
+            TInt pubSubCount = iPublishSubscriberArray->Count();
+     
+            for ( TInt j = pubSubCount - 1; j >= 0; j++ )
+                {
+                CPhonePublishSubscriberAO* publishSubscriber = 
+                    iPublishSubscriberArray->At( j );
+
+                if ( publishSubscriber->Category() == observerTag.iCategory && 
+                    publishSubscriber->Key() == observerTag.iKey )
+                    {
+                    iPublishSubscriberArray->Delete( i );
+                    delete publishSubscriber;
+                    }
+                }
+            }
+        }
+    }
+
+//  End of File  
+