smsprotocols/smsstack/smsprot/Src/smspmodm.cpp
changeset 0 3553901f7fa8
child 19 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/smsprotocols/smsstack/smsprot/Src/smspmodm.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,477 @@
+// Copyright (c) 1997-2009 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 CSmsPhoneInitialization and CSmsModemNotification
+// 
+//
+
+/**
+ @file
+*/
+
+#include "smspmodm.h"
+#include "smsuset.h"
+#include "smspmain.h"
+#include "SmsuTimer.h"
+#include "smspread.h"
+
+
+//
+// implementation of CSmsPhoneInitialization
+//
+
+
+/**
+ *  D'tor
+ */
+CSmsPhoneInitialization::~CSmsPhoneInitialization()
+	{
+	Cancel();
+	} // CSmsPhoneInitialization::~CSmsPhoneInitialization
+
+
+/**
+ *  start initializing the phone
+ */
+void CSmsPhoneInitialization::Start()
+	{
+	LOGSMSPROT1("CSmsPhoneInitialization::Start  Start initializing the phone");
+
+	Cancel();
+
+	iInitialized = KErrNotReady;
+	iNetworkInfoAvailable =EFalse;
+
+	iState=ESmsPhoneInitializationPhoneInit;
+	iGsmPhone.Initialise(iStatus);
+	SetActive();
+	} // CSmsPhoneInitialization::Start
+
+
+void CSmsPhoneInitialization::DoRunL()
+	{
+	LOGSMSPROT3("CSmsPhoneInitialization::DoRunL [iStatus=%d, iState=%d]", iStatus.Int(), iState);
+
+	switch (iState)
+		{
+		case ESmsPhoneInitializationPhoneInit:
+			{
+			AfterPhoneInitialize(iStatus.Int());
+			}
+			break;
+
+		case ESmsPhoneInitializationSettingMoBearer:
+			{
+			if (iStatus.Int() != KErrNone)
+				{
+				LOGSMSPROT1("ERROR - TSY failed to set bearer but initialisation will continue; bearer setting may be successful during send");
+				}
+
+			iState=ESmsPhoneInitializationGettingRegistrationStatus;
+			iGsmPhone.GetNetworkRegistrationStatus(iStatus, iRegistrationStatus);
+			SetActive();
+			}
+			break;
+
+		case ESmsPhoneInitializationGettingRegistrationStatus:
+			{
+			if(iStatus == KErrNone)
+				{
+				LOGSMSPROT2("CSmsPhoneInitialization::DoRunL registration status  : >%d<",iRegistrationStatus);
+				if (iRegistrationStatus==RMobilePhone::ERegisteredOnHomeNetwork  ||
+					iRegistrationStatus == RMobilePhone::ERegisteredRoaming)
+					{
+					iState=ESmsPhoneInitializationGettingCurrentNetworkInfo;
+					iGsmPhone.GetCurrentNetwork(iStatus, iNetworkInfoPckg);
+					SetActive();
+					}
+				else
+					{
+					iState=ESmsPhoneInitializationWaitingForCurrentNetwork;
+					iGsmPhone.NotifyCurrentNetworkChange(iStatus,iNetworkInfoPckg);
+					SetActive();
+					}
+				}
+			else
+				{
+				iState=ESmsPhoneInitializationCompleted;
+				iNetworkInfoAvailable =EFalse;
+				LOGSMSPROT2("CSmsPhoneInitialization::DoRunL NETWORK INFO NOT available due %d",iStatus.Int());
+				iSmsPDURead.Start();
+				}
+			}
+			break;
+
+		case ESmsPhoneInitializationWaitingForCurrentNetwork:
+			{
+			if(iStatus == KErrNone)
+				{
+				iState=ESmsPhoneInitializationGettingCurrentNetworkInfo;
+				iGsmPhone.GetCurrentNetwork(iStatus, iNetworkInfoPckg);
+				SetActive();
+				}
+			else
+				{
+				iState=ESmsPhoneInitializationCompleted;
+				iNetworkInfoAvailable =EFalse;
+				LOGSMSPROT2("CSmsPhoneInitialization::DoRunL NETWORK INFO NOT available due %d",iStatus.Int());
+				iSmsPDURead.Start();
+				}
+			}
+			break;
+
+		case ESmsPhoneInitializationGettingCurrentNetworkInfo:
+			{
+			iState=ESmsPhoneInitializationCompleted;
+			if(iStatus == KErrNone)
+				{
+				iNetworkInfoAvailable =ETrue;
+				LOGSMSPROT2("CSmsPhoneInitialization::DoRunL network longname : >%S<",&iNetworkInfo.iLongName);
+				LOGSMSPROT2("CSmsPhoneInitialization::DoRunL network shortname : >%S<",&iNetworkInfo.iShortName);
+				LOGSMSPROT2("CSmsPhoneInitialization::DoRunL network shortname : >%S<",&iNetworkInfo.iDisplayTag);
+				}
+			else
+				{
+				iNetworkInfoAvailable =EFalse;
+				LOGSMSPROT2("CSmsPhoneInitialization::DoRunL NETWORK INFO NOT available due %d",iStatus.Int());
+				}
+			iSmsPDURead.Start();
+			}
+			break;
+
+		default:
+			{
+			SmspPanic(KSmspPanicUnexpectedState);
+			}
+			break;
+		}
+
+	//
+	// DoRunL() will now return to CSmsuActiveBase which if the object
+	// is not active, will call Complete().
+	//
+	} // CSmsPhoneInitialization::DoRunL
+
+
+/**
+ *  cancel the initialization
+ */
+void CSmsPhoneInitialization::DoCancel()
+	{
+	LOGSMSPROT1("CSmsPhoneInitialization::DoCancel()");
+
+	switch (iState)
+		{
+		case ESmsPhoneInitializationPhoneInit:
+			{
+			iGsmPhone.InitialiseCancel();
+			}
+			break;
+
+		case ESmsPhoneInitializationSettingMoBearer:
+			{
+			iInitialisationSetBearer->Cancel();
+			}
+			break;
+
+		case ESmsPhoneInitializationGettingRegistrationStatus:
+			{
+			iGsmPhone.CancelAsyncRequest(EMobilePhoneGetNetworkRegistrationStatus);
+			}
+			break;
+
+		case ESmsPhoneInitializationWaitingForCurrentNetwork:
+			{
+			iGsmPhone.CancelAsyncRequest(EMobilePhoneNotifyCurrentNetworkNoLocationChange);
+			}
+			break;
+
+		case ESmsPhoneInitializationGettingCurrentNetworkInfo:
+			{
+			iGsmPhone.CancelAsyncRequest(EMobilePhoneGetCurrentNetwork);
+			}
+			break;
+
+		case ESmsPhoneInitializationCompleted:
+		case ESmsPhoneInitializationIdle:
+			{
+			// NOP
+			}
+			break;
+
+		default:
+ 			{
+			SmspPanic(KSmspPanicUnexpectedState);
+			}
+			break;
+       }
+
+	iInitialized = KErrNotReady;
+	} // CSmsPhoneInitialization::DoCancel
+
+
+/**
+ *  Completes the phone initialization request
+ *  
+ *  @param aStatus a status value
+ */
+void CSmsPhoneInitialization::Complete(TInt aStatus)
+	{
+	LOGSMSPROT1("CSmsPhoneInitialization::Complete()");
+
+	//
+	// Call the base function to perform the actual complete...
+	//
+	CSmsuActiveBase::Complete(aStatus);
+	} // CSmsPhoneInitialization::Complete
+
+
+/**
+ *  Read the TSY caps and start CSmsPDURead if aStatus == KErrNone
+ *  Otherwise, issue another asynchronous Initialize request.
+ *  
+ *  @param aStatus An error code indicating the status returned on the
+ *  previous call to RPhone::Initialise().
+ */
+void CSmsPhoneInitialization::AfterPhoneInitialize(TInt aStatus)
+	{
+    LOGSMSPROT2("CSmsPhoneInitialization::AfterPhoneIntialize [status=%d]", aStatus);
+
+	if (aStatus == KErrNone)
+		{
+		RMobileSmsMessaging::TMobileSmsCapsV1Pckg smsCapsPckg(iMobileSmsCaps);
+		aStatus = iSmsMessaging.GetCaps(smsCapsPckg);
+		}
+
+	if (aStatus == KErrNone)
+		{
+		if (iMobileSmsCaps.iSmsMode != RMobileSmsMessaging::KCapsGsmSms)
+			{
+		    LOGSMSPROT1("TSY does not support GsmSms");
+			aStatus = KErrNotSupported;
+			}
+		else
+			{
+			// Initialisation of phone is complete and phone supports GSM SMS.
+			// Therefore, set the MO SMS bearer.
+			iState=ESmsPhoneInitializationSettingMoBearer;
+			iInitialisationSetBearer->NotifyBearerSet(iStatus);
+			SetActive();
+			}
+		}
+	else
+		{
+	    if (++iNumberOfAttempts < iMaxNumberOfAttempts)
+			{
+			LOGSMSPROT2("CSmsPhoneInitialization Restarting [aStatus=%d]", aStatus);
+			iGsmPhone.Initialise(iStatus);
+			SetActive();
+			}
+		else
+			{
+			LOGSMSPROT3("CSmsPhoneInitialization Failed after %d attempts [aStatus=%d]", iNumberOfAttempts, aStatus);
+			}
+		}
+
+	iInitialized = aStatus;
+	} // CSmsPhoneInitialization::AfterPhoneInitialize
+
+
+/**
+ *  Default constructor.
+ */
+CSmsPhoneInitialization::CSmsPhoneInitialization(RMobileSmsMessaging& aSmsMessaging, RMobilePhone& aGsmPhone, CSmsPDURead& aSmsPDURead,
+                                                 RMobileSmsMessaging::TMobileSmsCapsV1& aMobileSmsCaps, TInt aPriority, CSmspSetBearer* aInitialisationSetBearer)
+	:CSmsuActiveBase(aPriority)
+	,iState(ESmsPhoneInitializationPhoneInit)
+	,iSmsMessaging(aSmsMessaging)
+	,iGsmPhone(aGsmPhone)
+	,iSmsPDURead(aSmsPDURead)
+	,iMobileSmsCaps(aMobileSmsCaps)
+	,iMaxNumberOfAttempts(KMaxNumberOfInitiaisationAttempts)
+	,iNetworkInfoPckg(iNetworkInfo)
+	,iInitialisationSetBearer(aInitialisationSetBearer)
+	{
+	} // RMobileSmsMessaging::TMobileSmsCapsV1
+
+//
+// implementation of CSmsModemNotification
+//
+
+
+/**
+ *  2 phase constructor - safely create a CSmsModemNotification object
+ */
+CSmsModemNotification* CSmsModemNotification::NewL(MSmsComm& aSmsComm)
+	{
+	LOGSMSPROT1("CSmsModemNotification::NewL");
+
+	CSmsModemNotification*	self=new(ELeave) CSmsModemNotification(aSmsComm);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+
+	return self;
+	} // CSmsModemNotification::NewL
+
+
+void CSmsModemNotification::ConstructL()
+	{
+	LOGSMSPROT1("CSmsModemNotification::ConstructL()");
+
+	User::LeaveIfError(iPhonePowerProperty.Attach(KUidSystemCategory, KUidPhonePwr.iUid));
+	
+	ConstructTimeoutL();
+	} // CSmsModemNotification::ConstructL
+
+
+/**
+ *  D'tor
+ */
+CSmsModemNotification::~CSmsModemNotification()
+	{
+	Cancel();
+	iPhonePowerProperty.Close();
+	} // CSmsModemNotification::~CSmsModemNotification
+
+
+RPhone::TModemDetection CSmsModemNotification::ModemState()
+	{
+	LOGSMSPROT1("CSmsModemNotification::ModemState()");
+
+	//
+	// Get the phone power state.
+	//
+	TInt phonePowerState;
+
+	if (iPhonePowerProperty.Get(phonePowerState) != KErrNone)
+		{
+		phonePowerState = ESAPhoneOff;
+		}
+
+	if (phonePowerState == ESAPhoneOn)
+		{
+		return RPhone::EDetectedPresent;
+		}
+	else
+		{
+		return RPhone::EDetectedNotPresent;
+		}
+	} // CSmsModemNotification::ModemState
+
+
+/**
+ *  start the modem notification
+ */
+void CSmsModemNotification::Start()
+	{
+	LOGSMSPROT1("CSmsModemNotification::Start");
+
+	__ASSERT_DEBUG(iState==ESmsModemNotificationIdle,SmspPanic(KSmspPanicUnexpectedState));
+
+	//
+	// Subscribe to the power property...
+	//
+	iState = ESmsModemNotificationWaitingForNotification;
+	iPhonePowerProperty.Subscribe(iStatus);
+
+	SetActive();
+	} // CSmsModemNotification::Start
+
+
+/**
+ *  asyncronous completion - called by ActiveScheduler when modem notification completed
+ */
+void CSmsModemNotification::DoRunL()
+	{
+    LOGSMSPROT2("CSmsModemNotification::RunL [iStatus=%d]", iStatus.Int() );
+
+	__ASSERT_DEBUG(iState==ESmsModemNotificationWaitingForNotification,SmspPanic(KSmspPanicUnexpectedState));
+
+	//
+	// DoRunL() will now return to CSmsuActiveBase which if the object
+	// is not active, will call Complete().
+	//
+	} // CSmsModemNotification::DoRunL
+
+
+/**
+ *  cancel the modem notification
+ */
+void CSmsModemNotification::DoCancel()
+	{
+	LOGSMSPROT1("CSmsModemNotification::DoCancel()");
+
+	__ASSERT_DEBUG(iState==ESmsModemNotificationWaitingForNotification,SmspPanic(KSmspPanicUnexpectedState));
+	
+	//
+	// Cancel the request...
+	//
+	iPhonePowerProperty.Cancel();
+
+	//
+	// Handle completion of this Active Object. Note that the object
+	// may well still be active at this point...
+	//
+	if (TimedOut())
+		{
+		Complete(KErrTimedOut);
+		}
+	else
+		{
+		Complete(KErrCancel);
+		}
+	} // CSmsModemNotification::DoCancel
+
+
+/**
+ *  C'tor
+ */
+CSmsModemNotification::CSmsModemNotification(MSmsComm& aSmsComm)
+  : CSmsuActiveBase(KSmsSessionPriority),
+	iState(ESmsModemNotificationIdle),
+	iSmsComm(aSmsComm)
+	{
+	} // CSmsModemNotification::CSmsModemNotification
+
+
+/**
+ *  complete the modem notification - inform the observer
+ */
+void CSmsModemNotification::Complete(TInt aStatus)
+	{
+	LOGSMSPROT1("CSmsModemNotification::Complete()");
+
+	//
+	// Call the base function to perform the actual complete...
+	//
+	CSmsuActiveBase::Complete(aStatus);
+
+	iState = ESmsModemNotificationIdle;
+
+	//
+	// If the request was not cancelled, then restart ourselves ready
+	// for the next event...
+	//
+	if (aStatus != KErrCancel  &&  aStatus != KErrTimedOut)
+		{
+		Start(); // starting here to ensure no states are missed
+		}
+
+	//
+	// Notify our client that the event occured...
+	//
+	RPhone::TModemDetection  modemDetection = ModemState();
+
+	iSmsComm.ModemNotificationCompleted(aStatus, modemDetection);
+	} // CSmsModemNotification::Complete