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