--- /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;
+ }
+