diff -r 000000000000 -r 3553901f7fa8 telephonyserverplugins/multimodetsy/Multimode/gprs/atgprsntwkregstatuschange.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyserverplugins/multimodetsy/Multimode/gprs/atgprsntwkregstatuschange.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,181 @@ +// Copyright (c) 2001-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: +// + +#include // For CTelObject + +#include "atgprsntwkregstatuschange.h" // Header file for this source file +#include "mSLOGGER.H" // For LOGTEXT macros +#include "ATIO.H" // For CATIO class +#include "Matstd.h" // For AT command strings and timeout values +#include "gprs.h" // for CGprs class +#include "NOTIFY.H" // for CNotifications + +// Macro for logging text to the log file using the local class name and a simpler +// call style. +#ifdef __LOGDEB__ +_LIT8(KLogEntry,"CATGprsNtwkRegStatusChange::%S\t%S"); +#define LOCAL_LOGTEXT(function,text) {_LIT8(F,function);_LIT8(T,text);LOGTEXT3(KLogEntry,&F,&T);} +#else +#define LOCAL_LOGTEXT(function,text) +#endif + + +CATGprsNtwkRegStatusChange* CATGprsNtwkRegStatusChange::NewL(CATIO* aIo,CTelObject* aTelObject, CPhoneGlobals* aGlobals) +/** + * Standard class factory function + */ + { + return (new(ELeave) CATGprsNtwkRegStatusChange(aIo,aTelObject,aGlobals)); + // Currently no need for a ConstructL call, maybe we'll need one in the future... + } + +CATGprsNtwkRegStatusChange::CATGprsNtwkRegStatusChange(CATIO* aIo, CTelObject* aTelObject,CPhoneGlobals* aGlobals) + :CATBase(aIo,aTelObject,aGlobals) + { + Enable(); + } + +CATGprsNtwkRegStatusChange::~CATGprsNtwkRegStatusChange() + { + Disable(); + } + +void CATGprsNtwkRegStatusChange::Enable() +/** + * Adds the all important +CGREG:* expect string so that our ::EventSignal is called when + * we get an unsolicited network registration status changes. + */ + { + LOCAL_LOGTEXT("Enable","Adding +CGREG:* expect string"); + + // Ensure +CRING is not on the expect string stack before we add it. + // (Doing things this way means we do not have to maintain an expect string in our + // member data) + iIo->RemoveExpectStrings(this); + + // Add +CRING expect string + __ASSERT_ALWAYS(iIo->AddExpectString(this,KCGREGMatchString) != NULL, Panic(EGeneral)); + } + +void CATGprsNtwkRegStatusChange::Disable() +/** + * Removes all expect strings added by this object. + * This object will not process +CRING until ::Enable() is called. + */ + { + LOCAL_LOGTEXT("Disable","Removing all CATGprsNtwkRegStatusCchange expect strings"); + iIo->RemoveExpectStrings(this); + } + +void CATGprsNtwkRegStatusChange::EventSignal(TEventSource aSource) +/** + * Called when a '+CGREG:' is received. + * Parses the +CGREG:... string which we recieved from the phone and then triggers + * the EPacketNtwkRegStatusChange notification as appropriate. + */ + { + LOCAL_LOGTEXT("EventSignal","Enter function"); + + TInt ret(KErrNone); + RPacketService::TRegistrationStatus regStatus(RPacketService::EUnknown); + + __ASSERT_ALWAYS(aSource == EReadCompletion, Panic(EATCommand_IllegalCompletionReadExpected)); + TRAP(ret,ParseResponseL(regStatus)); + if(ret!=KErrNone) + { + LOCAL_LOGTEXT("EventSignal","Unable to parse CGREG response"); + } + else + { + // + // Trigger the notificaiton mechanism + LOCAL_LOGTEXT("EventSignal","Triggering EPacketNtwkRegStatusChange notification"); + ((CGprs*)iTelObject)->SetRegistrationStatus(regStatus); + iPhoneGlobals->iNotificationStore->CheckNotification(iTelObject, EPacketNtwkRegStatusChange); + + // We are done, but there is no client request to complete + // we just return and wait until we get our next +CGREG:* command + } + } + +void CATGprsNtwkRegStatusChange::ParseResponseL(RPacketService::TRegistrationStatus& aRegStatus) +/** + * Parses the +CGREG unsolicited string from the modem. + * An example response woulf be '+CGREG: 2' where the value denotes the + * current registration status. + * If parsing succeeds then aRegStatus is updated. + */ + { + ParseBufferLC(); + TDblQueIter iter(iRxResults); + CATParamListEntry* entry=iter++; + + // Validate we have +CGREG at the start + if((entry==NULL) ||(entry->iResultPtr!=KCGREGResponseString)) + { + LOCAL_LOGTEXT("ParseResponseL","Failed to find +CGREG:"); + User::Leave(KErrNotSupported); + } + + // Read in value + entry=iter++; + if(!entry) + { + LOCAL_LOGTEXT("ParseResponseL","Failed to find 1st parameter"); + User::Leave(KErrNotFound); + } + TInt etsiVal; + CATParamListEntry::EntryValL(entry,etsiVal); + + // Convert value to equivalent EtelMM enum + switch(etsiVal) + { + case 0: // ETSI value as defined in ETSI 07.07 section 10.1.14 + aRegStatus=RPacketService::ENotRegisteredNotSearching; + break; + case 1: // ETSI value as defined in ETSI 07.07 section 10.1.14 + aRegStatus=RPacketService::ERegisteredOnHomeNetwork; + break; + case 2: // ETSI value as defined in ETSI 07.07 section 10.1.14 + aRegStatus=RPacketService::ENotRegisteredSearching; + break; + case 3: // ETSI value as defined in ETSI 07.07 section 10.1.14 + aRegStatus=RPacketService::ERegistrationDenied; + break; + case 4: // ETSI value as defined in ETSI 07.07 section 10.1.14 + aRegStatus=RPacketService::EUnknown; + break; + case 5: // ETSI value as defined in ETSI 07.07 section 10.1.14 + aRegStatus=RPacketService::ERegisteredRoaming; + break; + default: + aRegStatus=RPacketService::EUnknown; + break; + } + CleanupStack::PopAndDestroy(); // Pop and destroy the object pushed by ParseBufferLC() + } + + +void CATGprsNtwkRegStatusChange::CompleteWithIOError(TEventSource /*aSource*/,TInt /*aStatus*/) + { + LOCAL_LOGTEXT("CATGprsNtwkRegStatusChange","CompleteWithIOError"); + // CATIO removes expect strings in event of IO error so don't do it here + // Also, CATErrorHandler::CleanUp completes notification with error + } + + + + +