messagingappbase/ncnlist/src/NcnCRHandler.cpp
changeset 0 72b543305e3a
--- /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    <messagingvariant.hrh>      // Local variation flags
+#include    <centralrepository.h>
+#include    <LogsDomainCRKeys.h>
+#include    <NcnListInternalCRKeys.h>
+#include    <NcnListInternalPSKeys.h>
+#include    <messaginginternalcrkeys.h>
+#include    <ProfileEngineSDKCRKeys.h>
+#include    <telincallvolcntrlcrkeys.h>
+#include    <coreapplicationuisdomainpskeys.h>
+
+#include    <e32property.h>
+#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