messagingappbase/ncnlist/src/NcnModel.cpp
changeset 0 72b543305e3a
child 18 fbb813aef148
--- /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