telephonyserverplugins/multimodetsy/Multimode/Mimsi.cpp
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/multimodetsy/Multimode/Mimsi.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,206 @@
+// Copyright (c) 2000-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:
+// Deal with Network & Operator information
+// 
+//
+
+#include <et_phone.h>
+#include "mimsi.h"
+#include "mSLOGGER.H"
+#include "ATIO.H"
+#include "Matstd.h"
+
+
+// Get the IMSI for from the phone
+// NB - not supported by all phones.
+
+_LIT8(KGetSubscriberIdCommand,"AT+CIMI");
+
+inline CATSubscriberId::CATSubscriberId(CATIO* aIo, CTelObject* aTelObject, CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
+	: CATCommands(aIo,aTelObject,aInit,aPhoneGlobals)
+	{}
+
+CATSubscriberId* CATSubscriberId::NewL(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
+	{
+	CATSubscriberId* netInfo = new(ELeave) CATSubscriberId(aIo, aTelObject, aInit, aPhoneGlobals);
+	CleanupStack::PushL(netInfo);
+	netInfo->ConstructL();
+	CleanupStack::Pop();
+	return netInfo;
+	}
+
+CATSubscriberId::~CATSubscriberId()
+	{
+	iIo->RemoveExpectStrings(this);
+	}
+
+void CATSubscriberId::Start(TTsyReqHandle aTsyReqHandle,TAny* aParam)
+	{
+	LOGTEXT(_L8("MmTsy:\tCATSubscriberId:\tStarting Subscriber Id"));
+	iReturnPtr=static_cast<RMobilePhone::TMobilePhoneSubscriberId*>(aParam);
+	iReqHandle = aTsyReqHandle;
+	WriteExpectingResults(KGetSubscriberIdCommand, 3);
+	__ASSERT_ALWAYS(iIo->AddExpectString(this,KNotifyMeIfErrorString), Panic(EGeneral));
+	iState=EATImsiWaitForWriteComplete;
+	}
+
+void CATSubscriberId::EventSignal(TEventSource aSource)
+	{
+	if (aSource==ETimeOutCompletion)
+		{
+		LOGTEXT(_L8("MmTsy:\tCATSubscriberId:\tTimeout Error during IMSI read"));
+		RemoveStdExpectStrings();
+		Complete(KErrTimedOut,aSource);
+		return;
+		}
+
+	switch(iState)
+		{
+		case EATImsiWaitForWriteComplete:
+		__ASSERT_ALWAYS(aSource==EWriteCompletion,Panic(EATCommand_IllegalCompletionWriteExpected));
+			{
+			iIo->WriteAndTimerCancel(this);
+			StandardWriteCompletionHandler(aSource, 5);
+			iState=EATImsiReadComplete;
+			}
+		break;
+
+		case EATImsiReadComplete:
+		__ASSERT_ALWAYS(aSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected));
+			{
+			iIo->WriteAndTimerCancel(this);
+			TInt ret(ValidateExpectString());
+			RemoveStdExpectStrings();
+			if (ret==KErrNone)
+				TRAP(ret,ParseResponseL());
+			Complete(ret,aSource);
+			}
+			break;
+	
+		case EATWaitForStopState:
+			__ASSERT_ALWAYS(aSource==EReadCompletion, Panic(EATCommand_IllegalCompletionReadExpected));
+			{
+			iIo->WriteAndTimerCancel(this);
+			Complete(KErrCancel, aSource);
+			}
+			break;
+
+
+		default:
+			break;
+		}//switch
+	}//EventSignal
+
+void CATSubscriberId::Stop(TTsyReqHandle aTsyReqHandle)
+	{
+	__ASSERT_ALWAYS(aTsyReqHandle == iReqHandle, Panic(EIllegalTsyReqHandle));
+	LOGTEXT(_L8("MmTsy:\tCATSubscriberId:\tCancel called."));
+	switch(iState)
+		{
+		case EATNotInProgress:
+		case EATImsiWaitForWriteComplete:
+			{
+			LOGTEXT2(_L8("Current state TSY is cancelling from %d"), iState);
+			Complete(KErrCancel, EReadCompletion);
+			}
+			break;
+
+		default:
+			{
+			LOGTEXT(_L8("MmTsy:\tCATSubscriberId:\tStop, now waiting for expected modem response"));
+			AddStdExpectStrings();
+			iIo->SetTimeOut(this);
+			iState = EATWaitForStopState;
+			}
+			break;
+
+		}
+	}
+
+
+void CATSubscriberId::Complete(TInt aError,TEventSource aSource)
+	{
+	if (aError==KErrNone)
+		iState = EATCompleted;
+	else if (aError==KErrGeneral)
+		{	// +CIMI not supported by the phone, transmogrify into KErrNotSupported
+		iState = EATNotSupported;
+		aError = KErrNotSupported;
+		}
+	else
+		{
+// This flag is set in CATCommands::Complete now.
+//		iPhoneGlobals->iPhoneStatus.iInitStatus=EPhoneNotInitialised;
+		iState = EATNotInProgress;
+		}
+	iIo->WriteAndTimerCancel(this);
+	iIo->RemoveExpectStrings(this);
+	iOKExpectString = NULL;
+	iErrorExpectString = NULL;
+	CATCommands::Complete(aError,aSource);
+	LOGTEXT2(_L8("MmTsy:CATSubscriberId:\tCATSubscriberId completed with error code : %d"), aError);
+	if (iReqHandle)
+		iTelObject->ReqCompleted(iReqHandle, aError);
+	if (aSource==EWriteCompletion)
+		iIo->Read();
+	}
+
+void CATSubscriberId::CompleteWithIOError(TEventSource /*aSource*/,TInt aStatus)
+	{
+	if (iState!=EATNotInProgress)
+		{
+		iIo->WriteAndTimerCancel(this);
+		iState = EATNotInProgress;
+		if (iReqHandle)
+			iTelObject->ReqCompleted(iReqHandle, aStatus);
+		}
+	}
+
+void CATSubscriberId::ParseResponseL()
+/**
+ * This function parses the phone's response, copying it into the iImsi buffer.  This buffer is
+ * only 15 characters long, and the Siemens S25 returns a 16 character long IMSI.  Other phones
+ * return only the leftmost 15 characters.  This function takes this into account by returning
+ * only the leftmost 15 characters of the phone's response.
+**/
+	{
+	ParseBufferLC();
+	TDblQueIter<CATParamListEntry> iter(iRxResults);
+	CATParamListEntry* entry=iter++;
+	if (entry==NULL)
+		User::Leave(KErrGeneral);
+
+	if(entry->iResultPtr.Length() > RMobilePhone::KIMSISize)
+		iImsi.Copy(entry->iResultPtr.Left(RMobilePhone::KIMSISize));
+	else
+		iImsi.Copy(entry->iResultPtr);
+
+	if (iter++!=NULL)
+		User::Leave(KErrGeneral);
+	*iReturnPtr=iImsi;
+
+	CleanupStack::PopAndDestroy();
+	}
+
+TBool CATSubscriberId::CachedValue(TDes& aImsi)
+//
+// return the cached value if we have it
+//
+	{
+	if (iState!=EATCompleted)
+		return EFalse;
+	aImsi=iImsi;
+	return ETrue;
+	}
+