--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/ncnlist/src/NcnModel.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,338 @@
+/*
+* Copyright (c) 2004-2006 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 CNcnModel class.
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "NcnDebug.h"
+#include "NcnModel.h"
+#include "NcnCRHandler.h"
+#include "NcnSNNotifier.h"
+#include "CVoiceMailManager.h"
+
+#include <msgsimscnumberdetector.h>
+#include <RSatRefresh.h>
+#include <RSatSession.h>
+
+// ================= LOCAL CONSTANTS =======================
+namespace
+ {
+ }
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CNcnModelBase::NewL
+// Protocol specific class factory
+// ---------------------------------------------------------
+//
+CNcnModelBase* CNcnModelBase::NewL()
+ {
+ CNcnModelBase* self = CNcnModel::NewL();
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+
+ return self;
+ }
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code that
+// might leave.
+CNcnModel::CNcnModel()
+: iSatSession(NULL),
+ iSatRefresh(NULL)
+ {
+ }
+
+// Two-phased constructor.
+CNcnModelBase* CNcnModel::NewL()
+ {
+ CNcnModelBase* self = new (ELeave) CNcnModel();
+
+ return self;
+ }
+
+// Symbian OS default constructor can leave.
+void CNcnModel::ConstructL()
+ {
+ // Call base class's constructor
+ CNcnModelBase::ConstructL();
+
+ //Subscribe to SAT Refresh notifications
+ iSatSession = new ( ELeave ) RSatSession;
+ iSatSession->ConnectL();
+ iSatRefresh = new ( ELeave ) RSatRefresh( *this );
+ iSatRefresh->OpenL( *iSatSession );
+
+ //We subcribe the EF_SMSP file changes
+ TSatRefreshFiles file;
+ file.Append( KSmspEf );
+ iSatRefresh->NotifyFileChangeL( file );
+ }
+
+
+// Destructor
+CNcnModel::~CNcnModel()
+ {
+ //Cleanup for iSatRefresh
+ if ( iSatRefresh )
+ {
+ // Cancel notifications.
+ iSatRefresh->Cancel();
+ // Close SubSession.
+ iSatRefresh->Close();
+ }
+ delete iSatRefresh;
+ iSatRefresh = NULL;
+
+ //Cleanup for iSatSession
+ if ( iSatSession )
+ {
+ iSatSession->Close();
+ }
+ delete iSatSession;
+ iSatSession = NULL;
+ }
+
+// ---------------------------------------------------------
+// CNcnModel::SetSimChanged
+// ---------------------------------------------------------
+//
+void CNcnModel::SetSimChanged( const TBool aSimChanged )
+ {
+ NCN_RDEBUG_INT(_L("CNcnModel::SimChanged() %d"), aSimChanged);
+
+ aSimChanged ?
+ ( iNcnStatusBits |= KNcnSimChanged ) :
+ ( iNcnStatusBits &= ~KNcnSimChanged );
+
+ // If the sim card has been changed we notify some components
+ if( aSimChanged )
+ {
+ NCN_RDEBUG(_L("CNcnModel::SimChanged() ResetMissedCalls") );
+ // Reset the stored indicator status variable in the file.
+ iNcnCRHandler->ResetMissedCalls();
+
+ // Notify VoiceMailManager if it exists
+ // VM Manager does not exist in boot-up but will be
+ // available later
+ if ( iVoiceMailManager != NULL )
+ {
+ NCN_RDEBUG(_L("CNcnModel::SimChanged() iVoiceMailManager->NotifyAboutSIMChange") );
+ iVoiceMailManager->NotifyAboutSIMChange();
+ }
+ }
+ else
+ {
+ iNcnCRHandler->UpdateMissedCallsNotification();
+ }
+
+ // Check here if we should fetch the sms service center number
+ // from the sim card.
+ CheckIfSimSCOperationRequired();
+ }
+
+// ---------------------------------------------------------
+// CNcnModel::SetSmsInitialisationState
+// ---------------------------------------------------------
+//
+void CNcnModel::SetSmsInitialisationState(
+ const TInt aSmsInitialisationPhase )
+ {
+ iSmsInitialisationPhase = aSmsInitialisationPhase;
+
+ if ( iSmsInitialisationPhase != ESMSInitNone )
+ {
+ iNcnStatusBits |= KNcnSmsServicePresent;
+ }
+
+ // Check here if we should fetch the sms service center number
+ // from the sim card.
+ CheckIfSimSCOperationRequired();
+ }
+
+// ---------------------------------------------------------
+// CNcnModel::CheckIfSimSCOperationRequired
+// ---------------------------------------------------------
+//
+void CNcnModel::CheckIfSimSCOperationRequired()
+ {
+ NCN_RDEBUG(_L("CNcnModelBase::CheckIfSimSCOperationRequired()" ));
+
+ TBool servicePresent = (iNcnStatusBits & KNcnSmsServicePresent);
+ TBool simChanged = (iNcnStatusBits & KNcnSimChanged);
+#ifdef _DEBUG
+ TBool systemRefresh = (iNcnStatusBits & KNcnSystemRefresh);
+ TBool readSimSc = (iNcnStatusBits & KNcnReadSimSc);
+#endif
+ NCN_RDEBUG_INT( _L("iSmsInitialisationPhase %d"), iSmsInitialisationPhase );
+ NCN_RDEBUG_INT( _L("NCN status bit sms service present %d"), servicePresent );
+ NCN_RDEBUG_INT( _L("NCN status bit sim changed %d"), simChanged );
+ NCN_RDEBUG_INT( _L("NCN status bit system refresh %d"), systemRefresh );
+ NCN_RDEBUG_INT( _L("NCN read sim service center %d"), readSimSc );
+
+ // If SIM has been changed, we clear KNcnReadSimSc bit so
+ // that SIM won't be read twice.
+ if( ( iNcnStatusBits & KNcnReadSimSc ) &&
+ ( iNcnStatusBits & KNcnSimChanged ) )
+ {
+ iNcnStatusBits &= ~KNcnReadSimSc;
+ }
+
+ // If SIM service is present and SIM SC should be read
+ // in every boot, we enable KNcnSystemRefresh flag which will
+ // force SIM SC to be read.
+ if( ( iNcnStatusBits & KNcnReadSimSc ) &&
+ ( iNcnStatusBits & KNcnSmsServicePresent ) )
+ {
+ iNcnStatusBits &= ~KNcnReadSimSc;
+ iNcnStatusBits |= KNcnSystemRefresh;
+ }
+
+ // Read service centres from SIM
+ if( iSmsInitialisationPhase == ESMSInitNone )
+ {
+ NCN_RDEBUG(_L("CNcnModelBase::CheckIfSimSCOperationRequired() iSmsInitialisationPhase == ESMSInitNone" ));
+ if( servicePresent )
+ {
+ NCN_RDEBUG(_L("CNcnModelBase::CheckIfSimSCOperationRequired() servicePresent" ));
+ if( simChanged )
+ {
+ NCN_RDEBUG(_L("CNcnModelBase::CheckIfSimSCOperationRequired() simChanged" ));
+ PerformSimServiceCentreFetching();
+ }
+ }
+ return;
+ }
+ // Read service centres from SIM
+ if ((( iSmsInitialisationPhase == ESMSInitReadServiceCentre ) && servicePresent ) ||
+ // Initialisation complete
+ (( iSmsInitialisationPhase == ESMSInitComplete ) &&
+ ( simChanged || iNcnStatusBits & KNcnSystemRefresh )))
+ {
+ NCN_RDEBUG(_L("CNcnModelBase::CheckIfSimSCOperationRequired() second Read service centres from SIM" ));
+ PerformSimServiceCentreFetching();
+ }
+ }
+
+// ---------------------------------------------------------
+// CNcnModel::PerformSimServiceCentreFetching
+// ---------------------------------------------------------
+//
+void CNcnModel::PerformSimServiceCentreFetching()
+ {
+ NCN_RDEBUG(_L("CNcnModelBase::PerformSimServiceCentreFetching() :: Waiting until starting the SC operation" ));
+
+ // If the sms service center is not fetched yet, then we create a
+ // CMsgSimOperation class which does the fetching and then,
+ // when completed, returns the status as iStatus.
+ if( iNcnCRHandler &&
+ ( !( iNcnStatusBits & KNcnSimServiceCentreFetched )
+ || ( iNcnStatusBits & KNcnSystemRefresh ) ) )
+ {
+ // Read service centres from SIM
+ // 3 = read service centres from SIM
+ iNcnCRHandler->SetSmumFlag( ESMSInitReadServiceCentre );
+
+ iNcnStatusBits |= KNcnSimServiceCentreFetched;
+ iNcnStatusBits &= ~KNcnSystemRefresh;
+ if( IsActive() )
+ {
+ // Cancels the wait for completion of an outstanding request.
+ NCN_RDEBUG(_L("CNcnModelBase::PerformSimServiceCentreFetching() - cancelled outstanding request" ));
+ Cancel();
+ }
+
+ // Ignore error, but don't let it leave
+ TRAPD( err, iMsgSimOperation = CMsgSimOperation::NewL( iStatus ) );
+ NCN_RDEBUG_INT2(_L("CNcnModelBase::PerformSimServiceCentreFetching - created CMsgSimOperation with status: %d error code: %d"), iStatus.Int(), err );
+
+ if( err == KErrNone )
+ {
+ SetActive();
+ NCN_RDEBUG_INT(_L("CNcnModelBase::PerformSimServiceCentreFetching() - operation set active: %d"), iStatus.Int() );
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CNcnModel::ForceToPerformSimServiceCentreFetching
+// ---------------------------------------------------------
+//
+void CNcnModel::ForceToPerformSimServiceCentreFetching()
+ {
+ // Reset the sim service centre fetched information.
+ iNcnStatusBits |= KNcnSystemRefresh;
+ // Get the new sim service centre.
+ CheckIfSimSCOperationRequired();
+ }
+
+// ---------------------------------------------------------
+// CNcnModel::CreateCRConnectionL
+// ---------------------------------------------------------
+//
+void CNcnModel::CreateCRConnectionL()
+ {
+ // Create a handler for central repository information
+ iNcnCRHandler = CNcnCRHandler::NewL( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CNcnModel::AllowRefresh
+// Refresh query. Determines whether we allow the refresh to happen.
+// -----------------------------------------------------------------------------
+//
+#ifdef _DEBUG
+TBool CNcnModel::AllowRefresh( TSatRefreshType aType, const TSatRefreshFiles& /*aFiles*/ )
+#else
+TBool CNcnModel::AllowRefresh( TSatRefreshType /*aType*/, const TSatRefreshFiles& /*aFiles*/ )
+#endif
+ {
+ // Refresh is always allowed
+ NCN_RDEBUG( _L("CNcnModel::AllowRefresh()" ) );
+ NCN_RDEBUG_INT( _L("CNcnModel::AllowRefresh() Refresh type: %d"), aType );
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CNcnModel::Refresh
+// Notification about file refresh. We should launch the fetching of the SMS
+// service center in case the changed file is KSmspEf
+// -----------------------------------------------------------------------------
+//
+#ifdef _DEBUG
+void CNcnModel::Refresh( TSatRefreshType aType, const TSatRefreshFiles& /*aFiles*/ )
+#else
+void CNcnModel::Refresh( TSatRefreshType /*aType*/, const TSatRefreshFiles& /*aFiles*/ )
+#endif
+ {
+ // The only "file change" that we have subscribed is KSmspEf, so we don't need
+ // to examine the argument aFiles
+ NCN_RDEBUG( _L("CNcnModel::Refresh()"));
+ NCN_RDEBUG_INT( _L("CNcnModel::Refresh Type: %d"), aType );
+
+ //Load service center from SIM
+ ForceToPerformSimServiceCentreFetching();
+
+ // Notify SAT Server that refresh initiated file read is done
+ iSatRefresh->RefreshEFRead( EFalse );
+ }
+// End of File