diff -r 000000000000 -r 72b543305e3a messagingappbase/ncnlist/src/NcnCRHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/ncnlist/src/NcnCRHandler.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,435 @@ +/* +* 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 CNcnCRHandler class. +* +*/ + + + +// INCLUDE FILES +#include "NcnDebug.h" +#include "NcnModelBase.h" +#include "NcnModel.h" +#include "NcnCRHandler.h" +#include "CNcnCRRepositoryHandler.h" + +#include // Local variation flags +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "NcnSubscriber.h" +#include "MNcnMsgWaitingManager.h" + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code that +// might leave. +// +CNcnCRHandler::CNcnCRHandler( CNcnModelBase* aModel ) : + iModel( aModel ), + iLogsSDAssignedOk( EFalse ), iSysApSDAssignedOk( EFalse ) + { + } + +// Symbian OS default constructor can leave. +void CNcnCRHandler::ConstructL() + { + iLogsSession = CRepository::NewL( KCRUidLogs ); + iNcnSession = CRepository::NewL( KCRUidNcnList ); + iMuiuSession = CRepository::NewL( KCRUidMuiuVariation ); + iSmumSession = CRepository::NewL( KCRUidSmum ); + iProfileSession = CRepository::NewL( KCRUidProfileEngine ); + iTelephonySession = CRepository::NewL( KCRUidInCallVolume ); + + iLogsSDAssignedOk = ETrue; + + TInt missedCalls = 0; + + // Get the amount of missed calls. If it is not initialised then initialise it to zero. + TInt err = iLogsSession->Get( KLogsNewMissedCalls, missedCalls ); + if( err == KErrNotFound || err == KErrUnknown || missedCalls < 0 ) + { + iLogsSession->Set( KLogsNewMissedCalls, 0 ); + } + + NCN_RDEBUG_INT(_L("CNcnCRHandler::ConstructL : CR Missed Calls:%d" ), missedCalls ); + + // Request shared data server to notify on missed call variable changes. + iLogsNotifyHandler = + CNcnCRRepositoryHandler::NewL( *this, *iLogsSession, CCenRepNotifyHandler::EIntKey, KLogsNewMissedCalls ); + iLogsNotifyHandler->StartListeningL(); + + // update missed calls notification + iModel->NcnNotifier().SetNotification( + MNcnNotifier::ENcnMissedCallsNotification, + 0 ); + + // For observing outside command to play sound + err = RProperty::Define( KPSUidNcnList, + KNcnPlayAlertTone, + RProperty::EInt, + ECapability_None, + ECapabilityWriteUserData ); + + if ( err == KErrNone ) + { + RProperty::Set( KPSUidNcnList, KNcnPlayAlertTone, 0 ); + } + iAlertToneSubscriber = CNcnSubscriber::NewL( *this, KPSUidNcnList, KNcnPlayAlertTone ); + iAlertToneSubscriber->Subscribe(); + + + // Add listener for smum events + if( iModel->IsSupported( KNcnIdSimCard ) ) + { + TInt smsInitialisationPhase = 0; //default value, not informative state + err = iSmumSession->Get( KSmumSmsStatus, smsInitialisationPhase ); + + if( err == KErrNone ) + { + iModel->SetSmsInitialisationState( smsInitialisationPhase ); + } + + if ( !iSmumNotifyHandler ) + { + //iSmumNotifyHandler = + // CCenRepNotifyHandler::NewL( *this, *iSmumSession, CCenRepNotifyHandler::EIntKey, KSmumSmsStatus ); + //iSmumNotifyHandler->StartListeningL(); + iSmumNotifyHandler = + CNcnCRRepositoryHandler::NewL( *this, *iSmumSession, CCenRepNotifyHandler::EIntKey, KSmumSmsStatus ); + iSmumNotifyHandler->StartListeningL(); + } + } + + // Assign tone listener + iMsgToneSubscriber = CNcnSubscriber::NewL( + *this, KPSUidCoreApplicationUIs, KCoreAppUIsMessageToneQuit ); + iMsgToneSubscriber->Subscribe(); + iSysApSDAssignedOk = ETrue; + } + +// Two-phased constructor. +CNcnCRHandler* CNcnCRHandler::NewL( CNcnModelBase* aModel ) + { + CNcnCRHandler* self = new (ELeave) CNcnCRHandler( aModel ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + + +// Destructor +CNcnCRHandler::~CNcnCRHandler() + { + if( iLogsNotifyHandler ) + { + iLogsNotifyHandler->StopListening(); + delete iLogsNotifyHandler; + } + + delete iLogsSession; + delete iNcnSession; + delete iMuiuSession; + + if ( iSmumNotifyHandler ) + { + iSmumNotifyHandler->StopListening(); + delete iSmumNotifyHandler; + } + + delete iSmumSession; + + if ( iMuiuSettingsNotifyHandler ) + { + iMuiuSettingsNotifyHandler->StopListening(); + delete iMuiuSettingsNotifyHandler; + } + + delete iProfileSession; + delete iTelephonySession; + + delete iAlertToneSubscriber; + delete iMsgToneSubscriber; + } + +// ---------------------------------------------------- +// CNcnCRHandler::HandleRepositoryNotifyInt +// ---------------------------------------------------- +// +void CNcnCRHandler::HandleRepositoryNotifyInt( + CRepository& aRepository, + const TUint32 aID, + const TInt aNewValue ) + { + // logs repository key changes + if( &aRepository == iLogsSession ) + { + NCN_RDEBUG_INT2(_L("CNcnCRHandler::HandleRepositoryNotifyInt - LOGS repository key change (aID = %d, aNewValue = %d)" ), aID, aNewValue ); + + // if key was missed calls + if( aID == KLogsNewMissedCalls ) + { + // update amount of missed calls + iModel->NcnNotifier().SetNotification( + MNcnNotifier::ENcnMissedCallsNotification, + aNewValue ); + } + } + // smum repository key changes + else if( &aRepository == iSmumSession ) + { + NCN_RDEBUG_INT2(_L("CNcnCRHandler::HandleRepositoryNotifyInt - SMUM repository key change (aID = %d, aNewValue = %d)" ), aID, aNewValue ); + + // if key was sms status + if( aID == KSmumSmsStatus && iModel->IsSupported( KNcnIdSimCard ) ) + { + iModel->SetSmsInitialisationState( aNewValue ); + } + } + + else + { + NCN_RDEBUG(_L("CNcnCRHandler::HandleRepositoryNotifyInt - Unknown repository" )); + } + } + +// --------------------------------------------------------- +// CNcnCRHandler::HandlePropertyChangedL() +// Handles the subscribed properties changes. +// --------------------------------------------------------- +// +void CNcnCRHandler::HandlePropertyChangedL( const TUid& aCategory, TInt aKey ) + { + TInt state = 0; + + if ( aCategory == KPSUidCoreApplicationUIs && aKey == KCoreAppUIsMessageToneQuit ) + { + RProperty::Get( KPSUidCoreApplicationUIs, KCoreAppUIsMessageToneQuit, state ); + + NCN_RDEBUG_INT(_L("CNcnCRHandler::HandlePropertyChangedL - KCoreAppUIsMessageToneQuit changed to %d" ), state ); + + if( state == ECoreAppUIsStopTonePlaying ) + { + iModel->StopMsgReceivedTonePlaying(); + } + } + else if ( aCategory == KPSUidNcnList && aKey == KNcnPlayAlertTone ) + { + RProperty::Get( KPSUidNcnList, KNcnPlayAlertTone, state ); + // Check if alert tone asked to be played + if( state ) + { + iModel->PlayAlertToneL( state ); + } + } + } + + +// --------------------------------------------------------- +// CNcnCRHandler::ResetMissedCalls +// --------------------------------------------------------- +// +void CNcnCRHandler::ResetMissedCalls() + { + // Clear all the bits. + NCN_RDEBUG(_L("CNcnCRHandler::ResetMissedCalls()" )); + if( iLogsSDAssignedOk ) + { + iLogsSession->Set( KLogsNewMissedCalls, 0 ); + } + } +// --------------------------------------------------------- +// CNcnCRHandler::SetSmumFlag( const TInt aNewFlagValue ) +// --------------------------------------------------------- +// +void CNcnCRHandler::SetSmumFlag( const TInt aNewFlagValue ) + { + iSmumSession->Set( KSmumSmsStatus, aNewFlagValue ); + } + +// --------------------------------------------------------- +// CNcnCRHandler::MsgReceivedTonePlaying +// --------------------------------------------------------- +// +void CNcnCRHandler::MsgReceivedTonePlaying( const TUint aPlaying ) + { + // Through this the System Application can detect whether we are playing + // the message received ringing tone or not. + NCN_RDEBUG(_L("CNcnCRHandler::MsgReceivedTonePlaying( const TBool aPlaying )")); + if( iSysApSDAssignedOk ) + { + if( aPlaying ) + { + RProperty::Set( KPSUidCoreApplicationUIs, KCoreAppUIsMessageToneQuit, ECoreAppUIsTonePlaying ); + } + else + { + RProperty::Set( KPSUidCoreApplicationUIs, KCoreAppUIsMessageToneQuit, ECoreAppUIsStopTonePlaying ); + } + } + } + +// --------------------------------------------------------- +// CNcnCRHandler::GetString +// --------------------------------------------------------- +// +TInt CNcnCRHandler::GetString( + const TUid& aUid, + const TUint32 aKey, + TDes& aString ) const + { + // Prepare and get client + CRepository* client = NULL; + + TInt err = GetClientForUid( aUid, client ); + + // Check if problems with getting the client + if( err == KErrNone ) + { + err = client->Get( aKey, aString ); + } + + // Return result + return err; + } + +// --------------------------------------------------------- +// CNcnCRHandler::GetPSString +// --------------------------------------------------------- +// +TInt CNcnCRHandler::GetPSString( + const TUid& aUid, + const TUint32 aKey, + TDes& aString ) const + { + TInt err = RProperty::Get( aUid, aKey, aString ); + + // Return result + return err; + } + +// --------------------------------------------------------- +// CNcnCRHandler::GetCRInt +// --------------------------------------------------------- +// +TInt CNcnCRHandler::GetCRInt( + const TUid& aUid, + const TUint32 aKey, + TInt& aValue ) const + { + // Prepare and get client + CRepository* client = NULL; + + TInt err = GetClientForUid( aUid, client ); + + // Check if problems with getting the client + if( err == KErrNone ) + { + err = client->Get( aKey, aValue ); + } + + // Return result + return err; + } + +// --------------------------------------------------------- +// CNcnCRHandler::SetCRInt +// --------------------------------------------------------- +// +TInt CNcnCRHandler::SetCRInt( + const TUid& aUid, + const TUint32 aKey, + const TInt aValue, + const TBool /*aSave*/ ) const + { + // Prepare and get client + CRepository* client = NULL; + + TInt err = GetClientForUid( aUid, client ); + + // Check if problems with getting the client + if( err == KErrNone ) + { + err = client->Set( aKey, aValue ); + } + + // Return result + return err; + } + +// --------------------------------------------------------- +// CNcnCRHandler::UpdateMissedCallsNotification +// --------------------------------------------------------- +// +void CNcnCRHandler::UpdateMissedCallsNotification() + { + TInt missedCalls; + TInt err = iLogsSession->Get( KLogsNewMissedCalls, missedCalls ); + if( ( err == KErrNone ) && ( missedCalls > 0 ) ) + { + iModel->NcnNotifier().SetNotification( + MNcnNotifier::ENcnMissedCallsNotification, missedCalls ); + } + } + +// --------------------------------------------------------- +// CNcnCRHandler::GetClientForUid +// --------------------------------------------------------- +// +TInt CNcnCRHandler::GetClientForUid( + const TUid& aUid, + CRepository*& aClient ) const + { + TInt error = KErrNone; + + if( aUid == KCRUidNcnList ) + { + // Get ncn session + aClient = iNcnSession; + } + else if( aUid == KCRUidProfileEngine ) + { + // Get default tone + aClient = iProfileSession; + } + else if( aUid == KCRUidInCallVolume ) + { + // Get default tone + aClient = iTelephonySession; + } + else if ( aUid == KCRUidMuiuVariation ) + { + aClient = iMuiuSession; + } + else + { + // Return error + error = KErrNotFound; + } + + return error; + } + + +// End of File