messagingappbase/ncnlist/src/NcnModelBase.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/ncnlist/src/NcnModelBase.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,518 @@
+/*
+* 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:   Implements the class
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    <msgsimscnumberdetector.h>
+#include    <featmgr.h>
+#include    <bldvariant.hrh>
+#include    <messagingvariant.hrh>
+#include    <MNcnNotification.h>
+#include	<messaginginternalcrkeys.h>
+#include    <startupdomainpskeys.h>
+
+#include    "NcnDebug.h"
+#include    "NcnSNNotifier.h"
+#include    "NcnMsvSessionObserverBase.h"
+#include    "NcnCRHandler.h"
+
+#include    "CVoiceMailManager.h"
+#include    "NcnOutboxObserver.h"
+#include	"MNcnNotificationObserver.h"
+#include    "CNcnNotifApiObserver.h"
+#include    "NcnHandlerAudio.h"
+#include    "NcnModelBase.h"
+#include    "CNcnMsvSessionHandler.h"
+#include    "CNcnUI.h"
+#include    "CNcnNotifier.h"
+
+#include    "NcnPublishAndSubscribeObserver.h"
+#include	"CNcnMsgWaitingManager.h"
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code that
+// might leave.
+//
+CNcnModelBase::CNcnModelBase()  :
+    CActive( EPriorityStandard ), iVoiceMailManager(NULL),
+    iMsgSimOperation( NULL ), iSmsInitialisationPhase( 0 ), 
+    iNcnStatusBits( 0 ), iNcnFeatureFlags( 0 )
+    {
+	CActiveScheduler::Add( this );
+    }
+
+// Symbian OS default constructor can leave.
+
+void CNcnModelBase::ConstructL()
+    {
+    // instantiate Msv session handler
+    iMsvSessionHandler = CNcnMsvSessionHandler::NewL();
+    
+    // Set bootstate active
+    iNcnStatusBits |= KNcnBootPhase;
+
+    // Get available features from feature manager
+    FeatureManager::InitializeLibL();
+    
+    //Is offline mode supported?
+    iNcnFeatureFlags = FeatureManager::FeatureSupported( KFeatureIdOfflineMode );
+
+    //Is automatic opening of the received sms/mms enabled?
+    //Received SMS/MMS is opened automatically during active call if the sender
+    //is the same as the caller
+    FeatureManager::FeatureSupported( KFeatureIdSendFileInCall ) ? iNcnFeatureFlags |= KNcnSendFileInCall : 0;
+    
+    //Is Audio messaging feature enabled?
+    FeatureManager::FeatureSupported( KFeatureIdAudioMessaging ) ? iNcnFeatureFlags |= KNcnAudioMessaging : 0;
+
+	FetchInitialSimSupportStateL();
+    
+    // instantiate ncn ui    
+    iNcnUI = CNcnUI::NewL( *this );
+    
+    // we're in boot phase, inform UI
+    iNcnUI->SetBootPhase( ETrue );
+    
+    // insantiate ncn notifier with UI
+    iNcnNotifier = CNcnNotifier::NewL( *iNcnUI, *this );
+
+	// Create MsgWaitingManager which manages indicators
+	// and message counts
+	iMsgWaitingManager = CNcnMsgWaitingManager::NewL( *this );
+
+	//Connect to CR keys
+	CreateCRConnectionL();
+
+	// Check if SIM service center number should be read 
+	// in boot
+	CheckIfSimSCShouldBeRead();			
+
+	// Create publish and subscribe observer to receive events
+    NCN_RDEBUG( _L("CNcnModelBase::ConstructL - Constructing CNcnPublishAndSubscribeObserver") );
+	iNcnPublishAndSubscribeObserver = CNcnPublishAndSubscribeObserver::NewL( this );
+
+	//Create a manager for voice mail messages
+	iVoiceMailManager = CVoiceMailManager::NewL( *this );
+	
+	// Create MsvSession observer to receive message and email events
+	// It takes the voice mail manager as a reference so it can
+	// notify it directly when new voice mail messages are received
+    NCN_RDEBUG( _L("CNcnModelBase::ConstructL - Constructing CNcnMsvSessionObserverBase") ); 
+    iNcnMsvSessionObserver = CNcnMsvSessionObserverBase::NewL( this, *iVoiceMailManager );         
+
+    // Check if Service Centres should be fetched
+    CheckIfSimSCOperationRequired();
+    
+    // Create outbox observer
+    NCN_RDEBUG( _L("CNcnModelBase::ConstructL - Constructing CNcnOutboxObserver") );
+    iNcnOutboxObserver = CNcnOutboxObserver::NewL( this );
+
+    // Create NCN Notification API observer(ECOM API)
+    RImplInfoPtrArray implInfoArray;
+    CleanupClosePushL( implInfoArray );
+    REComSession::ListImplementationsL( KNcnNotificationInterfaceUid,
+                                        implInfoArray );
+    if ( implInfoArray.Count() > 0 )
+        {
+        NCN_RDEBUG( _L("CNcnModelBase::ConstructL - Creating CNcnNotifApiObserver") );
+        iNcnNotificationObserver = CNcnNotifApiObserver::NewL( *this );
+        }
+    else
+        {
+        NCN_RDEBUG( _L("CNcnModelBase::ConstructL - ERROR! CNcnNotifApiObserver ECOM Plug-in not found!") );      
+        }
+    CleanupStack::PopAndDestroy(); // implInfoArray                                                                           
+    
+    // start the session handler
+    iMsvSessionHandler->StartSessionHandlerL();
+    
+    // Reset the boot phase bit.
+    iNcnStatusBits &= ~KNcnBootPhase;
+    
+    // we're finished with boot phase, inform UI
+    iNcnUI->SetBootPhase( EFalse );
+    }
+
+// Destructor
+CNcnModelBase::~CNcnModelBase()
+    {
+    FeatureManager::UnInitializeLib();
+
+    Cancel();
+    // Free allocated resources.
+    
+    delete iNcnOutboxObserver;    
+	delete iNcnCRHandler;
+	delete iNcnPublishAndSubscribeObserver;
+    delete iNcnMsvSessionObserver;
+    delete iMsgSimOperation;
+    delete iNcnNotificationObserver;          
+    delete iVoiceMailManager;
+        
+    delete iNcnNotifier;
+    delete iNcnUI;
+    
+    delete iMsvSessionHandler;
+    
+    delete iMsgWaitingManager;
+    }
+
+// ---------------------------------------------------------
+// CNcnModel::SetIdleStateL
+// Informs the soft notification about the current phone idle state status.
+// ---------------------------------------------------------
+//
+void CNcnModelBase::SetIdleState( const TBool aCurrentState )
+    {
+    // delegate to UI
+    iNcnUI->SetIdleState( aCurrentState );
+    }
+// ---------------------------------------------------------
+// CNcnModel::NotifyPublishAndSubscribe
+// ---------------------------------------------------------
+//
+void CNcnModelBase::NotifyPublishAndSubscribe(
+    const TUid&     aVariable,
+    const TInt      aState )
+    {
+    iNcnPublishAndSubscribeObserver->NotifyPublishAndSubscribe( KUidSystemCategory, aVariable.iUid, aState );
+    }
+    
+// ---------------------------------------------------------
+// CNcnModel::NotifyPublishAndSubscribe
+// ---------------------------------------------------------
+//
+void CNcnModelBase::NotifyPublishAndSubscribe(
+    const TUid&     aCategory,
+    const TUid&     aVariable,
+    const TInt      aState )
+    {
+    iNcnPublishAndSubscribeObserver->NotifyPublishAndSubscribe( aCategory, aVariable.iUid, aState );
+    }
+    
+// ---------------------------------------------------------
+// CNcnModel::NotifyPublishAndSubscribe
+// ---------------------------------------------------------
+//
+void CNcnModelBase::NotifyPublishAndSubscribe(
+    const TUid&     aCategory,
+    const TUint     aVariable,
+    const TInt      aState )
+    {
+    iNcnPublishAndSubscribeObserver->NotifyPublishAndSubscribe( aCategory, aVariable, aState );
+    }
+
+// ---------------------------------------------------------
+// CNcnModel::SmsServicePresent
+// ---------------------------------------------------------
+//
+void CNcnModelBase::SmsServicePresent( const TBool aSmsServicePresent )
+    {
+    aSmsServicePresent ?
+        ( iNcnStatusBits |= KNcnSmsServicePresent ) :
+        ( iNcnStatusBits &= ~KNcnSmsServicePresent );
+
+    // Check here if we should fetch the sms service center number
+    // from the sim card.
+    CheckIfSimSCOperationRequired();
+    }
+
+// ---------------------------------------------------------
+// CNcnModelBase::DoCancel
+// ---------------------------------------------------------
+//
+void CNcnModelBase::DoCancel()
+    {
+    // Destroy the outstanding request (delete the active object).
+    delete iMsgSimOperation;
+    iMsgSimOperation = NULL;
+    }
+
+// ---------------------------------------------------------
+// CNcnModelBase::RunL
+// ---------------------------------------------------------
+//
+void CNcnModelBase::RunL()
+    {
+    NCN_RDEBUG_INT(_L("CNcnModelBase::RunL(): SC operation completed with status:%d" ), iStatus.Int() );
+
+    if ( IsSupported( KNcnIdSimCard ))
+        {
+        // Now we have performed the SIM sc fetching so we can close the shared data session...
+	    iNcnCRHandler->SetSmumFlag( 2 ); // Initialisation complete
+		delete iMsgSimOperation;
+        iMsgSimOperation = NULL;
+        }
+    }
+
+// ---------------------------------------------------------
+// CNcnModelBase::StopMsgReceivedTonePlaying
+// ---------------------------------------------------------
+//
+void CNcnModelBase::StopMsgReceivedTonePlaying()
+    {
+    iNcnUI->AbortAlertTonePlayback();
+    }
+
+// ---------------------------------------------------------
+// CNcnModelBase::MsgReceivedTonePlaying
+// ---------------------------------------------------------
+//
+void CNcnModelBase::MsgReceivedTonePlaying( TUint aAlertTonePlaying )
+    {
+    if( iNcnCRHandler )
+        {
+        iNcnCRHandler->MsgReceivedTonePlaying( aAlertTonePlaying );
+        }    
+    }
+
+// ---------------------------------------------------------
+// CNcnModelBase::IsSupported
+// ---------------------------------------------------------
+//
+TBool CNcnModelBase::IsSupported( TUint aFeature ) const
+    {
+    return iNcnFeatureFlags & aFeature;
+    }
+
+// ---------------------------------------------------------
+// CNcnModelBase::AddLocalVariationSupport
+// ---------------------------------------------------------
+//
+void CNcnModelBase::AddLocalVariationSupport( TUint aFeature )
+    {
+    iNcnFeatureFlags |= aFeature;
+    }
+
+// ---------------------------------------------------------
+// CNcnModelBase::NotifyOfflineSenderL
+// ---------------------------------------------------------
+//
+void CNcnModelBase::NotifyOfflineSenderL( const TInt& aNetworkBars )
+    {
+    NCN_RDEBUG_INT(_L("CNcnModelBase::NotifyOfflineSenderL(): aNetworkBars:%d" ), aNetworkBars );
+    iNcnOutboxObserver->InformOutboxSenderL( aNetworkBars );
+    }
+
+// ---------------------------------------------------------
+// CNcnModelBase::GetCRString
+// ---------------------------------------------------------
+//
+TInt CNcnModelBase::GetCRString(
+    const TUid&     aUid,
+    const TUint32   aKey,
+    TDes&           aString ) const
+    {
+    // Fetch value from shared data
+    return iNcnCRHandler->GetString( aUid, aKey, aString );
+    }
+
+// ---------------------------------------------------------
+// CNcnModelBase::GetPSString
+// ---------------------------------------------------------
+//
+TInt CNcnModelBase::GetPSString(
+    const TUid&     aUid,
+    const TUint32   aKey,
+    TDes&           aString ) const
+    {
+    // Fetch value from shared data
+    return iNcnCRHandler->GetPSString( aUid, aKey, aString );
+    }
+
+// ---------------------------------------------------------
+// CNcnModelBase::GetCRInteger
+// ---------------------------------------------------------
+//
+TInt CNcnModelBase::GetCRInteger(
+    const TUid&     aUid,
+    const TUint32   aKey,
+    TInt&           aValue) const
+    {
+    // Fetch value from shared data
+    return iNcnCRHandler->GetCRInt( aUid, aKey, aValue );
+    }
+
+// ---------------------------------------------------------
+// CNcnModelBase::SetCRInt
+// ---------------------------------------------------------
+//
+TInt CNcnModelBase::SetCRInt( const TUid& aUid,
+                        const TUint32& aKey, 
+                        TInt& aValue ) const
+    {
+    return iNcnCRHandler->SetCRInt( aUid, aKey, aValue );
+    }
+                        
+// ---------------------------------------------------------
+// CNcnModel::PlayAlertTone
+// ---------------------------------------------------------
+//
+TInt CNcnModelBase::PlayAlertToneL( const TUint aAlertTone ) const
+    {
+    if( aAlertTone == CNcnModelBase::EIndexNewEmails )
+        {
+        iNcnUI->PlayEMailAlertTone();
+        }
+    else
+        {
+        iNcnUI->PlayMessageAlertTone();        
+        }
+        
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// CNcnModelBase::SetSimSupported
+// ---------------------------------------------------------
+//
+void CNcnModelBase::SetSimSupported( const TBool aSimSupported )
+    {
+    NCN_RDEBUG_INT(_L("CNcnModelBase::SetSimSupported:%d" ), aSimSupported );
+
+    if ( aSimSupported )
+        {
+        iNcnFeatureFlags |= KNcnIdSimCard;
+        }
+    else
+        {
+        iNcnFeatureFlags &= ~KNcnIdSimCard;
+        }
+    }
+
+// ---------------------------------------------------------
+// CNcnModelBase::IsSIMPresent
+// ---------------------------------------------------------
+//
+TBool CNcnModelBase::IsSIMPresent()
+	{
+	TInt status = KErrNone;
+	TInt value = 0;
+	
+	status = RProperty::Get ( KPSUidStartup, KPSSimStatus, value );
+    NCN_RDEBUG_INT2(_L("CNcnModelBase::IsSIMPresent! status %d, value %d" ), status, value );
+    
+	if ( status == KErrNone && value != ESimNotPresent )
+        {
+        NCN_RDEBUG(_L("SIM present") );
+		return TRUE;
+        }
+    else
+    	{
+    	NCN_RDEBUG(_L("SIM not present") );
+    	return FALSE;
+    	}
+	}
+		
+// ---------------------------------------------------------
+// CNcnModelBase::NotificationObserver
+// ---------------------------------------------------------
+//
+MNcnNotificationObserver& CNcnModelBase::NotificationObserver()
+    {
+    __ASSERT_DEBUG( iNcnNotificationObserver, User::Invariant() );
+    return *iNcnNotificationObserver;
+    }
+    
+// ---------------------------------------------------------
+// CNcnModelBase::FetchInitialSimSupportStateL
+// ---------------------------------------------------------
+//
+void CNcnModelBase::FetchInitialSimSupportStateL()
+	{
+	TInt state = 0;
+
+    RProperty::Get ( KPSUidStartup, KPSSimStatus, state );
+    
+	if ( state != KErrUnknown )
+        {
+		SetSimSupported( ETrue );
+        SetSimSupported(
+            ( state == ESimNotSupported ) ? EFalse : ETrue );
+        }
+	}
+
+// ---------------------------------------------------------
+// CNcnModelBase::MsvSessionHandler
+// ---------------------------------------------------------
+//
+CNcnMsvSessionHandler& CNcnModelBase::MsvSessionHandler()
+    {
+    __ASSERT_DEBUG( iMsvSessionHandler, User::Invariant() );
+    return *iMsvSessionHandler;
+    }
+    
+// ---------------------------------------------------------
+// CNcnModelBase::NcnUI
+// ---------------------------------------------------------
+//
+MNcnUI& CNcnModelBase::NcnUI()
+    {
+    __ASSERT_DEBUG( iNcnUI, User::Invariant() );
+    return *iNcnUI;
+    }
+
+// ---------------------------------------------------------
+// CNcnModelBase::NcnNotifier
+// ---------------------------------------------------------
+//    
+MNcnNotifier& CNcnModelBase::NcnNotifier()
+    {
+    __ASSERT_DEBUG( iNcnNotifier, User::Invariant() );
+    return *iNcnNotifier;
+    }
+
+// ---------------------------------------------------------
+// CNcnModelBase::NcnNotifier
+// ---------------------------------------------------------
+//    
+MNcnMsgWaitingManager& CNcnModelBase::MsgWaitingManager()
+	{
+    __ASSERT_DEBUG( iMsgWaitingManager, User::Invariant() );
+	return *iMsgWaitingManager;		
+	}
+
+// ---------------------------------------------------------
+// CNcnModelBase::VoiceMailManager
+// ---------------------------------------------------------
+//    
+CVoiceMailManager& CNcnModelBase::VoiceMailManager()
+	{
+    __ASSERT_DEBUG( iVoiceMailManager, User::Invariant() );
+	return *iVoiceMailManager;		
+	}
+
+// ---------------------------------------------------------
+// CNcnModelBase::CheckIfSimSCShouldBeRead
+// ---------------------------------------------------------
+//    
+void CNcnModelBase::CheckIfSimSCShouldBeRead()
+	{
+	TInt value = 0;
+	TInt ret = GetCRInteger( KCRUidMuiuVariation, KMuiuSmsFeatures, value );
+	NCN_RDEBUG_INT(_L("CNcnModelBase::CheckIfSimSCShouldBeRead: GetCRInteger returned %d" ), ret );			
+	if( ret == KErrNone && ( value & KSmsFeatureIdCheckSimAlways ) )
+		{
+		iNcnStatusBits |= KNcnReadSimSc;
+		}
+		
+	NCN_RDEBUG_INT(_L("CNcnModelBase::CheckIfSimSCShouldBeRead: reading SMS SC from SIM %d" ), ( iNcnStatusBits & KNcnReadSimSc ) ? ETrue : EFalse );		
+	}
+    
+//  End of File