messagingappbase/ncnlist/src/NcnPublishAndSubscribeObserver.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/ncnlist/src/NcnPublishAndSubscribeObserver.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,252 @@
+/*
+* 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 CNcnPublishAndSubscribeObserver class.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "NcnDebug.h"
+#include    "NcnPublishAndSubscribeObserver.h"
+#include    "NcnModelBase.h"
+#include    "NcnSubscriber.h"
+
+#include    <featmgr.h>
+#include    <bldvariant.hrh>
+#include    <startupdomainpskeys.h>
+#include    <avkondomainpskeys.h>
+#include    <coreapplicationuisdomainpskeys.h>
+#include    <ctsydomainpskeys.h>
+#include    "CNcnMsgWaitingManager.h"
+
+// ================= LOCAL CONSTANTS =======================
+namespace
+    {
+    }
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code that
+// might leave.
+//
+CNcnPublishAndSubscribeObserver::CNcnPublishAndSubscribeObserver( CNcnModelBase* aModel )
+    : iModel( aModel )
+    {
+    }
+
+// Symbian OS default constructor can leave.
+void CNcnPublishAndSubscribeObserver::ConstructL()
+    {
+    TInt value = 0;
+    TInt status = KErrNone;
+    
+	//Subscribe the SIM change status   
+	iSimChangedSubscriber = CNcnSubscriber::NewL( *this,
+	    KPSUidStartup,
+	    KPSSimChanged );
+	iSimChangedSubscriber->Subscribe();
+
+	iSimUsableSubscriber = CNcnSubscriber::NewL( *this,
+	    KPSUidStartup,
+	    KPSSimStatus );
+	iSimUsableSubscriber->Subscribe();
+	
+    status = RProperty::Get ( KPSUidStartup, KPSSimStatus, value );
+    if ( status ==KErrNone && value == ESimUsable )
+        {
+        iModel->MsgWaitingManager().GetFirstIndicatorStatus();
+        }
+
+	//And get the initial value
+	status = RProperty::Get ( KPSUidStartup, KPSSimChanged, value );
+	NCN_RDEBUG_INT2(_L("CNcnPublishAndSubscribeObserver : Requested SIM change! status: %d value: %d"), status, value );
+	    	    
+    if( status == KErrNone && value != KErrUnknown && iModel->IsSupported( KNcnIdSimCard ) )
+        {
+        iModel->SetSimChanged(
+            ( value == ESimChanged ) ? ETrue : EFalse );
+        }
+
+	//Subscribe Idle status. Avkon P&S key is used instead of Active Idle's P&S key.
+	//This prevents soft notifications to be deleted when screensaver activates.
+	iPhoneIdleSubscriber = CNcnSubscriber::NewL( *this, 
+		KPSUidAvkonDomain, // ActiveIdle state
+		KAknNotificationsInIdleAllowed );
+	iPhoneIdleSubscriber->Subscribe();
+	
+	//And get the initial value	
+	RProperty::Get ( KPSUidAvkonDomain, KAknNotificationsInIdleAllowed, iPhoneIdleState );
+	NCN_RDEBUG_INT2(_L("CNcnPublishAndSubscribeObserver : Requested idle! status: %d value: %d"), status, iPhoneIdleState );
+
+	    
+	//Subscribe Autolock status 	
+	iAutolockSubscriber = CNcnSubscriber::NewL( *this,
+	    KPSUidCoreApplicationUIs,
+	    KCoreAppUIsAutolockStatus );
+	iAutolockSubscriber->Subscribe();
+	
+	//And get the initial value		
+	RProperty::Get ( KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus, iAutolockStatus );
+	NCN_RDEBUG_INT2(_L("CNcnPublishAndSubscribeObserver : Requested auto lock! status: %d value: %d"), status, iAutolockStatus );
+
+	
+	//Subscribe Calls state	
+	iCurrentCallSubscriber = CNcnSubscriber::NewL( *this,
+	    KPSUidCtsyCallInformation,
+	    KCTsyCallState );
+	iCurrentCallSubscriber->Subscribe();		
+	
+	//And get the initial value	
+	RProperty::Get ( KPSUidCtsyCallInformation, KCTsyCallState, iCurrentCallStatus );
+	NCN_RDEBUG_INT2(_L("CNcnPublishAndSubscribeObserver : Requested call status! status: %d value: %d"), status, iCurrentCallStatus );
+
+	//Determine idle state
+    NCN_RDEBUG(_L("CNcnPublishAndSubscribeObserver Determine idle state in start-up"));
+	DetermineIdleState();
+	}
+
+// Two-phased constructor.
+CNcnPublishAndSubscribeObserver* CNcnPublishAndSubscribeObserver::NewL( CNcnModelBase* aModel )
+    {
+    CNcnPublishAndSubscribeObserver* self =
+        new (ELeave) CNcnPublishAndSubscribeObserver( aModel );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+
+// Destructor
+CNcnPublishAndSubscribeObserver::~CNcnPublishAndSubscribeObserver()
+    {
+    delete iSimUsableSubscriber;
+	delete iSimChangedSubscriber;
+	delete iPhoneIdleSubscriber;
+	delete iAutolockSubscriber;
+	delete iCurrentCallSubscriber;
+	
+    iModel = NULL;
+    }
+
+// ---------------------------------------------------------
+// CNcnPublishAndSubscribeObserver::HandlePropertyChangedL()
+// Handles the subscribed properties changes.
+// ---------------------------------------------------------
+//
+void CNcnPublishAndSubscribeObserver::HandlePropertyChangedL( const TUid& aCategory, TInt aKey )
+    {
+ 	TInt state = 0;
+
+    if( iModel->IsSupported( KNcnIdSimCard ) )
+        {
+        if ( aKey == KPSSimChanged )
+            {
+			RProperty::Get( KPSUidStartup, KPSSimChanged, state );
+            iModel->SetSimChanged(
+                ( state == ESimChanged ) ? ETrue : EFalse  );
+            return;
+            }
+        }
+
+    TBool ncnIdleRelatedEventReceived = EFalse;
+        
+    // idle status changed
+    if ( aCategory == KPSUidAvkonDomain && aKey == KAknNotificationsInIdleAllowed )
+        {
+        RProperty::Get( KPSUidAvkonDomain, KAknNotificationsInIdleAllowed, iPhoneIdleState );
+        ncnIdleRelatedEventReceived = ETrue;
+        }
+        
+    // autolock status changed
+	else if ( aCategory == KPSUidCoreApplicationUIs && aKey == KCoreAppUIsAutolockStatus )
+        {
+ 		RProperty::Get( KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus, iAutolockStatus );
+        ncnIdleRelatedEventReceived = ETrue;
+        }
+        
+    // call state status changed
+	else if ( aCategory == KPSUidCtsyCallInformation && aKey == KCTsyCallState )
+        {
+ 		RProperty::Get( KPSUidCtsyCallInformation, KCTsyCallState, iCurrentCallStatus );
+		ncnIdleRelatedEventReceived = ETrue;
+        }
+    else if ( aCategory == KPSUidStartup && aKey == KPSSimStatus )
+        {
+        RProperty::Get( KPSUidStartup, KPSSimStatus , state );
+        NCN_RDEBUG_INT(_L("CNcnPublishAndSubscribeObserver::HandlePropertyChangedL RProperty::KPSSimStatus %d"), state );
+        if ( state == ESimUsable )
+            {
+            iModel->MsgWaitingManager().GetFirstIndicatorStatus();
+            }
+        }
+          
+	//Determine idle state
+    if(  ncnIdleRelatedEventReceived  )
+        {
+		DetermineIdleState();
+        }
+    }
+    
+// ---------------------------------------------------------
+// CNcnPublishAndSubscribeObserver::NotifyPublishAndSubscribe
+// ---------------------------------------------------------
+//
+void CNcnPublishAndSubscribeObserver::NotifyPublishAndSubscribe(
+    const TUid&     aCategory,
+    const TUint     aVariable,
+    const TInt      aState )
+    {
+    NCN_RDEBUG_INT2(_L("CNcnPublishAndSubscribeObserver::NotifyPublishAndSubscribe : aCategory %d, aVariable: %d"), aCategory, aVariable );
+    NCN_RDEBUG_INT(_L("CNcnPublishAndSubscribeObserver::NotifyPublishAndSubscribe : aState: %d"), aState );
+    
+	int err = RProperty::Set( aCategory, aVariable, aState );
+	
+	if( err != KErrNone )
+	    {
+	    NCN_RDEBUG_INT(_L("CNcnPublishAndSubscribeObserver::NotifyPublishAndSubscribe RProperty::Set failed with %d"), err );
+	    }
+    }
+// ---------------------------------------------------------
+// CNcnPublishAndSubscribeObserver::DetermineIdleState
+// ---------------------------------------------------------
+//
+void CNcnPublishAndSubscribeObserver::DetermineIdleState()
+	{
+	//Determine idle state based on these three variables
+	TBool idleState = EFalse; // default
+    NCN_RDEBUG_INT(_L("CNcnPublishAndSubscribeObserver::DetermineIdleState AutoLockState::%d"), iAutolockStatus );
+    if( iAutolockStatus > EAutolockOff  )
+     {
+     NCN_RDEBUG( _L("Autolock is ON and. Setting idle to false") );
+     }
+	else
+	    {
+	    if( iPhoneIdleState )
+	        {
+	        NCN_RDEBUG( _L("Autolock is OFF and phone is in IDLE. Setting idle to true") );
+	        idleState = ETrue;
+	        }
+	    else
+	        {
+	        NCN_RDEBUG( _L("Autolock is OFF and phone is NOT in IDLE. Setting idle to false") );
+	        }
+	    }
+	iModel->SetIdleState( idleState );
+	}
+
+// End of File