diff -r 000000000000 -r 72b543305e3a messagingappbase/ncnlist/src/NcnPublishAndSubscribeObserver.cpp --- /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 +#include +#include +#include +#include +#include +#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