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