--- a/telephonyserverplugins/multimodetsy/Multimode/gprs/GprsContext.cpp Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/multimodetsy/Multimode/gprs/GprsContext.cpp Thu May 06 15:10:38 2010 +0100
@@ -1,933 +1,933 @@
-// 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 "ATGprsContextActivate.H"
-#include "mSLOGGER.H"
-#include <pcktcs.h>
-#include "ATGprsConfig.h"
-#include "ATIO.H"
-#include "TSYCONFG.H"
-#include "NOTIFY.H"
-#include "ATSTD.H"
-#include "ATGprsContextDeactivate.H"
-#include "atgprscontextdelete.h" // for CATGprsContextDelete class
-#include "gprsqos.h"
-
-#include <commsdattypesv1_1.h>
-
-/**
- * @file
- * This file implements the CGprsContext class. Used to implement the RPacketContext API.
- */
-
-CGprs* CGprsContext::Parent()
- {return iParent;};
-
-CGprsContext* CGprsContext::NewL(CGprs* aParent,CATIO* aIo, CATInit* aInit, CPhoneGlobals* aPhoneGlobals, const TName& aName, TInt aCid, RPacketContext::TContextConfigGPRS* aContextConfigGPRS)
-/**
- * Standard 2 phase constructor.
- *
- * @param aTelObject pointer to parent.
- * @param aIo pointer to communication object.
- * @param aInit pointer to AT phone init object.
- * @param aPhoneGlobals pointer to phone global wide states.
- * @param aName new name for the context which this object will represent
- * @param aCid context ID of the context which this object will represent
- * @param aContextConfigGPRS configuration of the context which this object will represent
- */
- {
- CGprsContext* gprs=new(ELeave) CGprsContext(aParent, aIo, aInit, aPhoneGlobals, aCid);
- CleanupStack::PushL(gprs);
- gprs->ConstructL(aName, aContextConfigGPRS);
- CleanupStack::Pop();
- return gprs;
- }
-
-
-CGprsContext::CGprsContext(CGprs* aParent, CATIO* aIo, CATInit* aInit, CPhoneGlobals* aPhoneGlobals, TInt aCid)
- : CSubSessionExtBase(), iCid(aCid), iParent(aParent), iIo(aIo), iInit(aInit), iPhoneGlobals(aPhoneGlobals)
-/**
- * Constructor
- *
- * @param aParent pointer to parent.
- * @param aIo pointer to communication object.
- * @param aInit pointer to AT phone init object.
- * @param aPhoneGlobals pointer to phone global wide states.
- */
- {
- }
-
-
-void CGprsContext::ConstructL(const TName& aName, RPacketContext::TContextConfigGPRS* aContextConfigGPRS)
-/**
- * This function creates all objects on the heap that can leave.
- * @param aName Name of context.
- * @param aContextConfigV1 Default contest config.
- */
- {
- LOGTEXT(_L8("CGprsContext: Entered constructor"));
- iConfigGPRS = *aContextConfigGPRS;
- iInfo.iName.Copy(aName);
- iATGprsContextActivate = CATGprsContextActivate::NewL(iCid, iIo, this, iInit, iPhoneGlobals);
- iATGPRSSetConfig = CATGPRSSetConfig::NewL(iCid, iIo, this, iInit, iPhoneGlobals);
- iATGPRSGetConfig = CATGPRSGetConfig::NewL(iCid, iIo, this, iInit, iPhoneGlobals);
- iATGprsContextDeactivate = CATGprsContextDeactivate::NewL(iIo, this, iInit, iPhoneGlobals);
- iATGprsContextDelete = CATGprsContextDelete::NewL(iIo, this, iInit, iPhoneGlobals);
- }
-
-
-CGprsContext::~CGprsContext()
-/**
- * Destructor
- */
- {
- LOGTEXT(_L8("CGprsContext: Entered destructor"));
- iParent->RemoveContext(this);
- iPhoneGlobals->iNotificationStore->RemoveClientFromLastEvents(this);
- delete iATGprsContextDelete;
- delete iATGprsContextActivate;
- delete iATGPRSSetConfig;
- delete iATGPRSGetConfig;
- delete iATGprsContextDeactivate;
- }
-
-
-void CGprsContext::Init()
-/**
- * This is not used. Init is done from the CPhone class.
- */
- {
- LOGTEXT(_L8("CGprsContext: init()"));
- }
-
-
-CTelObject* CGprsContext::OpenNewObjectByNameL(const TDesC& /*aName*/)
-/**
- * This function is not used.
- */
- {
- LOGTEXT(_L8("CGprsContext::OpenNewObjectByNameL called"));
- User::Leave(KErrNotSupported);
- return NULL;
- }
-
-
-CTelObject* CGprsContext::OpenNewObjectL(TDes& aNewName)
-/**
- * This function returns a pointer to a new QoS profile objecft (CGprsQoS)
- */
- {
- GenerateNewProfileName(aNewName); // create a unique name for this qos profile
-#if defined __LOGDEB__
- TBuf8<40> tmpLog;
- tmpLog.Copy(aNewName);
- LOGTEXT2(_L8("CGprs::OpenNewObjectL(), %S"), &tmpLog);
-#endif
- CGprsQoS* qos = CGprsQoS::NewL(this, iCid, iIo, iInit, iPhoneGlobals, aNewName);
- return qos;
- }
-
-
-CTelObject::TReqMode CGprsContext::ReqModeL(const TInt aIpc)
-/**
- * This function is called from the framework and checks the flow control for a IPC call.
- * @param aIpc IPC call from client.
- */
- {
- CTelObject::TReqMode ret=0;
- switch (aIpc)
- {
- case EPacketContextActivate:
- case EPacketContextDeactivate:
- case EPacketContextSetConfig:
- case EPacketContextLoanCommPort:
- ret = KReqModeFlowControlObeyed;
- break;
-
- case EPacketContextDelete:
- case EPacketContextGetStatus:
- case EPacketContextGetLastErrorCause:
- case EPacketContextGetConfig:
- case EPacketContextGetDataVolumeTransferred:
- case EPacketContextRecoverCommPort:
- break;
-
- case EPacketContextNotifyConfigChanged:
- case EPacketContextNotifyStatusChange:
- ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
- break;
-
- default:
- User::Leave(KErrNotSupported);
- break;
- }
-
- // Check if the data port is currently loaned. If it is and the requested IPC
- // is flow controlled then block Etel calling the IPC by leaving with KErrInUse
- if((ret&KReqModeFlowControlObeyed) && iPhoneGlobals->iPhoneStatus.iDataPortLoaned)
- {
- LOGTEXT2(_L8("ReqModeL Leaving with KErrInUse as data port is loaned (aIpc=%d)"),aIpc);
- User::Leave(KErrInUse);
- }
-
- return ret;
- }
-
-
-TInt CGprsContext::RegisterNotification(const TInt aIpc)
-/**
- * This function is called from the framework.
- *
- * @param aIpc IPC call from client.
- */
- {
- LOGTEXT2(_L8("CGprsContext::RegisterNotification called with aIpc=%d"),aIpc);
- switch (aIpc)
- {
- case EPacketContextNotifyConfigChanged:
- case EPacketContextNotifyStatusChange:
- case EPacketContextNotifyDataTransferred:
- return KErrNone;
- default:
- // Unknown or invalid IPC
- LOGTEXT2(_L8("CGprsContext::RegisterNotification Error Unknown IPC, aIpc=%d"),aIpc);
- return KErrNotSupported;
- }
- }
-
-
-TInt CGprsContext::DeregisterNotification(const TInt aIpc)
-/**
- * This function is called when the there is no client listening to a notification anymore.
- *
- * @param aIpc IPC call from client.
- */
- {
- LOGTEXT2(_L8("CGprs::DeregisterNotification called with aIpc=%d"),aIpc);
- switch (aIpc)
- {
- case EPacketContextNotifyConfigChanged:
- case EPacketContextNotifyStatusChange:
- case EPacketContextNotifyDataTransferred:
- return KErrNone;
- default:
- // Unknown or invalid IPC
- LOGTEXT2(_L8("CGprsContext::DeregisterNotification Error Unknown IPC, aIpc=%d"),aIpc);
- return KErrNotSupported;
- }
- }
-
-
-TInt CGprsContext::NumberOfSlotsL(const TInt aIpc)
- {
- TInt numberOfSlots=0;
- switch (aIpc)
- {
- case EPacketContextNotifyConfigChanged:
- case EPacketContextNotifyStatusChange:
- case EPacketContextNotifyDataTransferred:
- LOGTEXT(_L8("CGprsContext: Registered with 5 slots"));
- numberOfSlots=5;
- break;
- default:
- // Unknown or invalid IPC
- LOGTEXT(_L8("CGprsContext: Number of Slots error, unknown IPC"));
- User::Leave(KErrNotSupported);
- break;
- }
- return numberOfSlots;
-
- }
-
-
-TInt CGprsContext::ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc,const TDataPackage& aPackage)
-/**
- * This function is called from the framework.
- *
- * @param aTsyReqHandle handle to client.
- * @param aIpc IPC call from client.
- * @param aPackage agruments with the IPC call.
- */
- {
- TAny* dataPtr=aPackage.Ptr1();
- TAny* dataPtr2=aPackage.Ptr2();
-
- if(ShouldNotProcessIpcCall(aIpc))
- {// If the context is in state deleted these calls should not be processed.
- ReqCompleted(aTsyReqHandle, KErrAccessDenied);
- return KErrNone;
- }
- if(ShouldNotProcessIpcCallWhenComportIsLoaned(aIpc))
- {// If the comport is loaned out ipcs that generate a at command shall be returned with KErrAccesssDenied
- ReqCompleted(aTsyReqHandle, KErrAccessDenied);
- return KErrNone;
- }
- switch (aIpc)
- {
- case EPacketContextSetConfig:
- return SetConfig(aTsyReqHandle, aPackage.Des1n());
- case EPacketContextGetConfig:
- return GetConfig(aTsyReqHandle, aPackage.Des1n());
- case EPacketContextNotifyConfigChanged:
- return NotifyConfigChanged(aTsyReqHandle, aPackage.Des1n());
- case EPacketContextActivate:
- return Activate(aTsyReqHandle);
- case EPacketContextDeactivate:
- return Deactivate(aTsyReqHandle);
- case EPacketContextDelete:
- return Delete(aTsyReqHandle);
- case EPacketContextLoanCommPort:
- return LoanCommPort(aTsyReqHandle,
- REINTERPRET_CAST(RCall::TCommPort*, dataPtr));
- case EPacketContextRecoverCommPort:
- return RecoverCommPort(aTsyReqHandle);
- case EPacketContextGetStatus:
- return GetStatus(aTsyReqHandle,
- REINTERPRET_CAST(RPacketContext::TContextStatus*, dataPtr));
- case EPacketContextNotifyStatusChange:
- return NotifyStatusChange(aTsyReqHandle,
- REINTERPRET_CAST(RPacketContext::TContextStatus*, dataPtr));
- case EPacketContextGetDataVolumeTransferred:
- return GetDataVolumeTransferred(aTsyReqHandle,
- REINTERPRET_CAST(RPacketContext::TDataVolume*, dataPtr));
- case EPacketContextNotifyDataTransferred:
- return NotifyDataTransferred(aTsyReqHandle,
- REINTERPRET_CAST(RPacketContext::TDataVolume*, dataPtr),
- REINTERPRET_CAST(RPacketContext::TNotifyDataTransferredRequest*, dataPtr2));
- case EPacketContextGetLastErrorCause:
- return GetLastErrorCause(aTsyReqHandle,
- REINTERPRET_CAST(TInt*, dataPtr));
- default:
- return KErrNotSupported;
- }
- }
-
-
-RPacketService::TContextInfo* CGprsContext::ContextInfo()
-/**
- * This function returns the current context info.
- */
- {
- return &iInfo;
- }
-
-
-TInt CGprsContext::Cid()
-/**
- * This function returns the context id.
- */
- {
- return iCid;
- }
-
-
-void CGprsContext::ContextInfo(RPacketService::TContextInfo* aInfo)
-/**
- * This function returns the current context info.
- * @param aInfo context info that is returned.
- */
- {
- aInfo->iName.Copy(iInfo.iName);
- aInfo->iStatus = iInfo.iStatus;
- }
-
-
-void CGprsContext::SetContextInfo(const RPacketService::TContextInfo* aContextInfo)
-/**
- * This function sets the current context info.
- * @param aContextInfo context into to set.
- */
- {
- iInfo.iName.Copy(aContextInfo->iName);
- iInfo.iStatus = aContextInfo->iStatus;
- }
-
-
-TDes* CGprsContext::ContextName()
-/**
- * This function returns the context name.
- */
-
- {
- return &iInfo.iName;
- }
-
-
-RPacketContext::TContextConfigGPRS* CGprsContext::Config()
-/**
- * This function returns the context configuration.
- *
- */
-
- {
- return &iConfigGPRS;
- }
-
-
-void CGprsContext::SetConfig(const RPacketContext::TContextConfigGPRS* aContextConfigGPRS)
-/**
- * This function sets the context configuration.
- * @param iContextConfigV10 Configuration to set.
- */
-
- {
- iConfigGPRS = *aContextConfigGPRS;
- }
-
-
-void CGprsContext::GenerateNewProfileName(TDes& aName)
-/**
- * This function generates a unique qos profile name and a free qosId number.
- *
- * @param aName New name of the profile that is generated.
- */
- {
- _LIT(KGprsName, "GPRS_QOS");
- aName.Append(KGprsName);
- aName.AppendNum(++iGprsQoSProfileCount);
- }
-
-TInt CGprsContext::CancelService(const TInt aIpc, const TTsyReqHandle aTsyReqHandle)
-/**
- * This function is called from the framework and cancels a outstanding request.
- * @param aIpc The IPC to cancel.
- * @param aTsyReqHandle the client handle to cancel.
- */
- {
- LOGTEXT(_L8("CGprsATContextTsy: - CancelService called"));
- switch (aIpc)
- {
- case EPacketContextSetConfig:
- return SetConfigCancel(aTsyReqHandle);
- case EPacketContextGetConfig:
- return GetConfigCancel(aTsyReqHandle);
- case EPacketContextNotifyConfigChanged:
- return NotifyConfigChangedCancel(aTsyReqHandle);
- case EPacketContextActivate:
- return ActivateCancel(aTsyReqHandle);
- case EPacketContextDeactivate:
- return DeactivateCancel(aTsyReqHandle);
- case EPacketContextDelete:
- return DeleteCancel(aTsyReqHandle);
- case EPacketContextLoanCommPort:
- return LoanCommPortCancel(aTsyReqHandle);
- case EPacketContextRecoverCommPort:
- return RecoverCommPortCancel(aTsyReqHandle);
- case EPacketContextNotifyStatusChange:
- return NotifyStatusChangeCancel(aTsyReqHandle);
- case EPacketContextNotifyDataTransferred:
- return NotifyDataTransferredCancel(aTsyReqHandle);
- default:
- return KErrNotSupported;
- }
- }
-
-
-
-TInt CGprsContext::SetConfig(const TTsyReqHandle aTsyReqHandle,const TDesC8* aConfig)
-/**
- * Called from a client via ExtFunc.
- * This function will start a chain of AT commands to the phone(AT+CGQMIN and AT+CGQREQ).
- *
- * @param aTsyReqHandle request handle that is completed when done with request.
- * @param aConfig Pointer to a RPacketContext::TContextConfigPckg.
- */
- {
- LOGTEXT(_L8("CGprsContext::SetConfig called"));
- iATGPRSSetConfig->ExecuteCommand(aTsyReqHandle, (TAny*)aConfig);
- return KErrNone;
- }
-
-
-TInt CGprsContext::SetConfigCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- *
- * @param aTsyReqHandle The handle to cancel
- */
- {
- LOGTEXT(_L8("CGprsContext::SetConfigCancel called"));
- iATGPRSSetConfig->CancelCommand(aTsyReqHandle);
- return KErrNone;
- }
-
-
-TInt CGprsContext::GetConfig(const TTsyReqHandle aTsyReqHandle,TDes8* aConfig)
-/**
- * Called from a client via ExtFunc.
- * This function will start a chain of AT commands to the phone(AT+CGQREQ?, AT+CGDCONT? and AT+CGQMIN?)
- * and query the settings in the phone.
- *
- * @param aTsyReqHandle request handle that is completed when done with request.
- * @param aConfig Pointer to a RPacketContext::TContextConfigPckg.
- */
- {
- LOGTEXT(_L8("CGprsContext::GetConfig called"));
- iATGPRSGetConfig->ExecuteCommand(aTsyReqHandle, aConfig);
- return KErrNone;
- }
-
-
-TInt CGprsContext::GetConfigCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- *
- * @param aTsyReqHandle The handle to cancel
- */
- {
- LOGTEXT(_L8("CGprsContext::GetConfigCancel called"));
- iATGPRSGetConfig->CancelCommand(aTsyReqHandle);
- return KErrNone;
- }
-
-
-
-TInt CGprsContext::NotifyConfigChanged(const TTsyReqHandle aTsyReqHandle, TDes8* aConfig)
-/**
- * Called from a client via ExtFunc.
- * This function will complete when EPacketContextConfigChange event is triggered.
- *
- * @param aTsyReqHandle request handle that is completed.
- * @param aConfig Pointer to a RPacketContext::TContextConfigPckg
- */
- {
- LOGTEXT(_L8("CGprsContext::NotifyConfigChanged called"));
- iPhoneGlobals->iNotificationStore->RegisterNotification(EPacketContextConfigChange, aTsyReqHandle, this, aConfig);
- return KErrNone;
- }
-
-
-TInt CGprsContext::NotifyConfigChangedCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- * @param aTsyReqHandle The handle to cancel
- */
- {
- LOGTEXT(_L8("CGprsContext::NotifyConfigChangedCancel called"));
- iPhoneGlobals->iNotificationStore->RemoveNotification(aTsyReqHandle);
- return KErrNone;
- }
-
-
-TInt CGprsContext::Deactivate(const TTsyReqHandle aTsyReqHandle)
-/**
- * Called from a client via ExtFunc.
- * This function will start the sending of a AT command(ATD*99# or ATD*99***1#).
- * @param aTsyReqHandle request handle that is completed when done with request.
- */
- {
- LOGTEXT(_L8("CGprsContext::Deactivate called"));
- iIo->DropDtr(); // Drops DTR
- RPacketService::TContextInfo iContextInfo;
- ContextInfo(&iContextInfo);
- iContextInfo.iStatus = RPacketContext::EStatusDeactivating;
- SetContextInfo(&iContextInfo);
- iPhoneGlobals->iNotificationStore->CheckNotification(this, EPacketContextStatusChanged);
-
- // Can not call ExecuteCommand as we do not want the
- // iATSetToOnlineCommandMode->StartEscapeSequence() to be called.
- iATGprsContextDeactivate->Start(aTsyReqHandle, NULL);
- return KErrNone;
- }
-
-
-TInt CGprsContext::DeactivateCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- *
- * @param aTsyReqHandle The handle to cancel
- */
- {
- LOGTEXT(_L8("CGprsContext::DeactivateCancel called"));
- iATGprsContextDeactivate->CancelCommand( aTsyReqHandle);
- return KErrNone;
- }
-
-
-TInt CGprsContext::Activate(const TTsyReqHandle aTsyReqHandle)
-/**
- * Called from a client via ExtFunc.
- * This function will start the sending of a AT command(AT+CGATT=1).
- *
- * @param aTsyReqHandle request handle that is completed when done with request.
- */
-
- {
- LOGTEXT(_L8("CGprsContext::Activate called"));
- RPacketService::TContextInfo iContextInfo;
- iContextInfo = *ContextInfo();
- iContextInfo.iStatus = RPacketContext::EStatusActivating;
- SetContextInfo(&iContextInfo);
- iPhoneGlobals->iNotificationStore->CheckNotification(this, EPacketContextStatusChanged);
- iATGprsContextActivate->ExecuteCommand(aTsyReqHandle,NULL);
- return KErrNone;
- }
-
-
-TInt CGprsContext::ActivateCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- *
- * @param aTsyReqHandle The handle to cancel
- */
- {
- LOGTEXT(_L8("CGprsContext::ActivateCancel called"));
- iATGprsContextActivate->CancelCommand(aTsyReqHandle);
- return KErrNone;
- }
-
-
-TInt CGprsContext::Delete(const TTsyReqHandle aTsyReqHandle)
-/**
- * Called from a client via ExtFunc.
- * This function will set a context as deleted, thus rendering it useless.
- * @param aTsyReqHandle request handle that is completed when done with request.
- */
- {
- LOGTEXT(_L8("CGprsContext::Delete called"));
- if(iInfo.iStatus!=RPacketContext::EStatusUnknown && iInfo.iStatus!=RPacketContext::EStatusInactive)
- {
- //
- // Complete with KErrGeneral as this context is not in a state
- // which will allow a deletion
- ReqCompleted(aTsyReqHandle, KErrGeneral);
- }
- else
- {
- //
- // Start an AT command state machine which
- // will delete the context from the phone
- iATGprsContextDelete->ExecuteCommand(aTsyReqHandle,&iCid);
- }
- return KErrNone;
- }
-
-
-TInt CGprsContext::DeleteCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- * @param aTsyReqHandle The handle to cancel
- */
- {
- LOGTEXT(_L8("CGprsContext::DeleteCancel called"));
- iATGprsContextDelete->CancelCommand(aTsyReqHandle);
- return KErrNone;
- }
-
-
-TInt CGprsContext::LoanCommPort(const TTsyReqHandle aTsyReqHandle,RCall::TCommPort* aDataPort)
-/**
- * Called from a client via ExtFunc.
- * This function will stop the TSY from using the comport and loan it to the client.
- *
- * @param aTsyReqHandle request handle that is completed when done with request.
- * @param aDataPort Pointer to a RCall::TCommPort
- */
- {
- LOGTEXT(_L8("CGprsContext::LoanCommPort called"));
-
- // Check that this context is active
- if(ContextInfo()->iStatus != RPacketContext::EStatusActive)
- {
- ReqCompleted(aTsyReqHandle,KErrNotReady);
- return KErrNone;
- }
-
- // Check we have not already loaned the port
- if(iPhoneGlobals->iPhoneStatus.iDataPortLoaned)
- {
- ReqCompleted(aTsyReqHandle,KErrEtelPortAlreadyLoaned);
- return KErrNone;
- }
-
- TFileName csy;
- TName port;
- TInt ret=iPhoneGlobals->iConfiguration->ConfigModemString(TPtrC(KCDTypeNameCsyName),csy);
- if (ret!=KErrNone)
- {
- ReqCompleted(aTsyReqHandle, ret);
- return KErrNone;
- }
- ret=iPhoneGlobals->iConfiguration->ConfigModemString(TPtrC(KCDTypeNamePortName),port);
- if (ret!=KErrNone)
- {
- ReqCompleted(aTsyReqHandle, ret);
- return KErrNone;
- }
- aDataPort->iCsy.Copy(csy);
- aDataPort->iPort.Copy(port);
-
- iPhoneGlobals->iPhoneStatus.iDataPortLoaned = ETrue;
- iPhoneGlobals->iNotificationStore->CheckNotification(this,EDataPortLoaned);
-
- // Cancel all reads and writes on the serial port
- iIo->Cancel();
- ReqCompleted(aTsyReqHandle,KErrNone);
- return KErrNone;
- }
-
-
-TInt CGprsContext::LoanCommPortCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- *
- * @param aTsyReqHandle The handle to cancel
- */
- {
- LOGTEXT(_L8("CGprsContext::LoanCommPortCancel called"));
- ReqCompleted(aTsyReqHandle,KErrCancel);
- return KErrNone;
- }
-
-
-TInt CGprsContext::RecoverCommPort(const TTsyReqHandle aTsyReqHandle)
-/**
- * Called from a client via ExtFunc.
- * This function will enable the TSY to use the comport again.
- *
- * @param aTsyReqHandle request handle that is completed when done with request.
- * @param aDataPort Pointer to a RCall::TCommPort
- */
- {
- LOGTEXT(_L8("CGprsContext::RecoverCommPort called"));
- if(iPhoneGlobals->iPhoneStatus.iDataPortLoaned)
- {
- iIo->Read(); // Queue a read again on the comm port
- iPhoneGlobals->iPhoneStatus.iDataPortLoaned = EFalse;
- LOGTEXT2(_L8("Comm signals : %x (hex)"),iIo->Signals());
- LOGTEXT2(_L8("Comm signals after ResetBuffers : %x (hex)"),iIo->Signals());
- }
- else
- {
- ReqCompleted(aTsyReqHandle,KErrEtelPortNotLoanedToClient);
- return KErrNone;
- }
- ReqCompleted(aTsyReqHandle,KErrNone);
- return KErrNone;
- }
-
-
-TInt CGprsContext::RecoverCommPortCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- *
- * @param aTsyReqHandle The handle to cancel
- */
- {
- LOGTEXT(_L8("CGprsContext::RecoverCommPortCancel called"));
- ReqCompleted(aTsyReqHandle,KErrCancel);
- return KErrNone;
- }
-
-
-TInt CGprsContext::GetStatus(const TTsyReqHandle aTsyReqHandle,RPacketContext::TContextStatus* aContextStatus)
-/**
- * Called from a client via ExtFunc.
- * This function will return the current state of the CGprsContext object.
- *
- * @param aTsyReqHandle request handle that is completed when done with request.
- * @param aContextStatus Pointer to a RPacketContext::TContextStatus.
- */
- {
- LOGTEXT(_L8("CGprsContext::GetStatus called"));
- *aContextStatus = ContextInfo()->iStatus;
- ReqCompleted(aTsyReqHandle,KErrNone);
- return KErrNone;
- }
-
-
-TInt CGprsContext::NotifyStatusChange(const TTsyReqHandle aTsyReqHandle,RPacketContext::TContextStatus* aContextStatus)
-/**
- * Called from a client via ExtFunc.
- * This function will complete when EPacketContextStatusChanged event is triggered.
- *
- * @param aTsyReqHandle request handle that is completed.
- * @param aConfig Pointer to a RPacketContext::TContextStatus
- */
- {
- LOGTEXT(_L8("CGprsContext::NotifyStatusChange called"));
- iPhoneGlobals->iNotificationStore->RegisterNotification(EPacketContextStatusChange, aTsyReqHandle, this, aContextStatus);
- return KErrNone;
- }
-
-
-TInt CGprsContext::NotifyStatusChangeCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding request. Called via CancelService.
- *
- * @param aTsyReqHandle The handle to cancel
- */
- {
- LOGTEXT(_L8("CGprsContext::NotifyStatusChangeCancel called"));
- iPhoneGlobals->iNotificationStore->RemoveNotification(aTsyReqHandle);
- return KErrNone;
- }
-
-
-TInt CGprsContext::GetDataVolumeTransferred(const TTsyReqHandle aTsyReqHandle,RPacketContext::TDataVolume* /*aVolume*/)
-/**
- * This function is not supported.
- *
- * @param aTsyReqHandle request handle that is completed.
- */
- {
- LOGTEXT(_L8("CGprsContext::GetDataVolumeTransferred called"));
- ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req67
- return KErrNone;
- }
-
-
-TInt CGprsContext::NotifyDataTransferred(const TTsyReqHandle aTsyReqHandle, RPacketContext::TDataVolume* /*aVolume*/, RPacketContext::TNotifyDataTransferredRequest* /*aData*/)
-/**
- * This function is not supported.
- *
- * @param aTsyReqHandle request handle that is completed.
- */
- {
- LOGTEXT(_L8("CGprsContext::NotifyStatusChange called"));
- ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req68
- return KErrNone;
- }
-
-
-TInt CGprsContext::NotifyDataTransferredCancel(const TTsyReqHandle aTsyReqHandle)
-/**
- * Cancels a outstanding notification. Called via CancelService.
- *
- * @param aTsyReqHandle The handle to cancel
- */
- {
- LOGTEXT(_L8("CGprsContext::NotifyDataTransferredCancel called"));
- ReqCompleted(aTsyReqHandle, KErrCancel); // Req69
- return KErrNone;
- }
-
-
-TInt CGprsContext::GetLastErrorCause(const TTsyReqHandle aTsyReqHandle,TInt* /*aError*/)
-/**
- * This function is not supported.
- *
- * @param aTsyReqHandle request handle that is completed.
- */
- {
- LOGTEXT(_L8("CGprsContext::GetLastErrorCause called"));
- ReqCompleted(aTsyReqHandle,KErrNotSupported); // Req70
- return KErrNone;
- }
-
-
-TBool CGprsContext::ShouldNotProcessIpcCall(TInt aIpc)
-/**
- * This function indicates if a IPC should not be handled.
- * @param aIPC A IPC call number.
- */
- {
- if(iInfo.iStatus != RPacketContext::EStatusDeleted)
- return EFalse;
-
- switch(aIpc)
- {
- case EPacketContextSetConfig:
- case EPacketContextGetConfig:
- case EPacketContextNotifyConfigChanged:
- case EPacketContextActivate:
- case EPacketContextDeactivate:
- case EPacketContextDelete:
- case EPacketContextLoanCommPort:
- case EPacketContextRecoverCommPort:
- LOGTEXT(_L8("CGprsContext::ShouldNotProcessIpcCall, context deleted. This ipc is not legal"));
- return ETrue;
- default:
- return EFalse;
- }
- }
-
-
-TBool CGprsContext::ShouldNotProcessIpcCallWhenComportIsLoaned(TInt aIpc)
-/**
- * This function indicates if a IPC should not be handled when comport is loaned.
- * @param aIPC A IPC call number.
- */
- {
- if(!iPhoneGlobals->iPhoneStatus.iDataPortLoaned)
- return EFalse;
- switch(aIpc)
- {
- case EPacketContextSetConfig:
- case EPacketContextGetConfig:
- case EPacketContextNotifyConfigChanged:
- case EPacketContextActivate:
- case EPacketContextDeactivate:
- case EPacketContextDelete:
- case EPacketContextLoanCommPort:
- LOGTEXT(_L8("CGprsContext::ShouldNotProcessIpcCallWhenComportIsLoaned, comport loaned out. This ipc is not legal"));
- return ETrue;
- default:
- return EFalse;
- }
- }
-
-void CGprsContext::RemoveQoSProfileIfFound(CGprsQoS* aProfile)
-/**
- * This function removes a QoS profile from the list.
- * @param aProfile The QoS profile to remove from linked list.
- */
- {
-#ifdef _DEBUG
- TBuf8<KMaxName> tmpLog;
- tmpLog.Copy(*(aProfile->GetProfileName())); // Convert 16bit string to 8bit so we can log it
- LOGTEXT2(_L8("CGprsContext::RemoveQoSProfileIfFound called, %S"), &tmpLog);
-#endif
- CGprsQoSEntry* profileEntry;
- TDblQueIter<CGprsQoSEntry> iter(iProfiles);
- while (profileEntry=iter++, profileEntry)
- {
- if (profileEntry->iProfile == aProfile)
- {
- profileEntry->Deque();
- delete profileEntry; // just deletes list entry, not the profile itself
- break;
- }
- }
- }
-
-//
-// CGprsQoSEntry class
-//
-
-CGprsQoSEntry::CGprsQoSEntry(CGprsQoS* aProfile)
-: iProfile(aProfile)
-/**
- * Constructor
- * @param aProfile QoS Profile to add to entry
- */
- {}
-
-
-CGprsQoSEntry::~CGprsQoSEntry()
-/**
- * Destructor
- */
- {}
-
-
-void CGprsQoSEntry::Deque()
-/**
- * Remove entry from TDblQue link
- */
- {
- iLink.Deque();
- iLink.iPrev=iLink.iNext=NULL;
- }
+// 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 "ATGprsContextActivate.H"
+#include "mSLOGGER.H"
+#include <pcktcs.h>
+#include "ATGprsConfig.h"
+#include "ATIO.H"
+#include "TSYCONFG.H"
+#include "NOTIFY.H"
+#include "ATSTD.H"
+#include "ATGprsContextDeactivate.H"
+#include "atgprscontextdelete.h" // for CATGprsContextDelete class
+#include "gprsqos.h"
+
+#include <commsdattypesv1_1.h>
+
+/**
+ * @file
+ * This file implements the CGprsContext class. Used to implement the RPacketContext API.
+ */
+
+CGprs* CGprsContext::Parent()
+ {return iParent;};
+
+CGprsContext* CGprsContext::NewL(CGprs* aParent,CATIO* aIo, CATInit* aInit, CPhoneGlobals* aPhoneGlobals, const TName& aName, TInt aCid, RPacketContext::TContextConfigGPRS* aContextConfigGPRS)
+/**
+ * Standard 2 phase constructor.
+ *
+ * @param aTelObject pointer to parent.
+ * @param aIo pointer to communication object.
+ * @param aInit pointer to AT phone init object.
+ * @param aPhoneGlobals pointer to phone global wide states.
+ * @param aName new name for the context which this object will represent
+ * @param aCid context ID of the context which this object will represent
+ * @param aContextConfigGPRS configuration of the context which this object will represent
+ */
+ {
+ CGprsContext* gprs=new(ELeave) CGprsContext(aParent, aIo, aInit, aPhoneGlobals, aCid);
+ CleanupStack::PushL(gprs);
+ gprs->ConstructL(aName, aContextConfigGPRS);
+ CleanupStack::Pop();
+ return gprs;
+ }
+
+
+CGprsContext::CGprsContext(CGprs* aParent, CATIO* aIo, CATInit* aInit, CPhoneGlobals* aPhoneGlobals, TInt aCid)
+ : CSubSessionExtBase(), iCid(aCid), iParent(aParent), iIo(aIo), iInit(aInit), iPhoneGlobals(aPhoneGlobals)
+/**
+ * Constructor
+ *
+ * @param aParent pointer to parent.
+ * @param aIo pointer to communication object.
+ * @param aInit pointer to AT phone init object.
+ * @param aPhoneGlobals pointer to phone global wide states.
+ */
+ {
+ }
+
+
+void CGprsContext::ConstructL(const TName& aName, RPacketContext::TContextConfigGPRS* aContextConfigGPRS)
+/**
+ * This function creates all objects on the heap that can leave.
+ * @param aName Name of context.
+ * @param aContextConfigV1 Default contest config.
+ */
+ {
+ LOGTEXT(_L8("CGprsContext: Entered constructor"));
+ iConfigGPRS = *aContextConfigGPRS;
+ iInfo.iName.Copy(aName);
+ iATGprsContextActivate = CATGprsContextActivate::NewL(iCid, iIo, this, iInit, iPhoneGlobals);
+ iATGPRSSetConfig = CATGPRSSetConfig::NewL(iCid, iIo, this, iInit, iPhoneGlobals);
+ iATGPRSGetConfig = CATGPRSGetConfig::NewL(iCid, iIo, this, iInit, iPhoneGlobals);
+ iATGprsContextDeactivate = CATGprsContextDeactivate::NewL(iIo, this, iInit, iPhoneGlobals);
+ iATGprsContextDelete = CATGprsContextDelete::NewL(iIo, this, iInit, iPhoneGlobals);
+ }
+
+
+CGprsContext::~CGprsContext()
+/**
+ * Destructor
+ */
+ {
+ LOGTEXT(_L8("CGprsContext: Entered destructor"));
+ iParent->RemoveContext(this);
+ iPhoneGlobals->iNotificationStore->RemoveClientFromLastEvents(this);
+ delete iATGprsContextDelete;
+ delete iATGprsContextActivate;
+ delete iATGPRSSetConfig;
+ delete iATGPRSGetConfig;
+ delete iATGprsContextDeactivate;
+ }
+
+
+void CGprsContext::Init()
+/**
+ * This is not used. Init is done from the CPhone class.
+ */
+ {
+ LOGTEXT(_L8("CGprsContext: init()"));
+ }
+
+
+CTelObject* CGprsContext::OpenNewObjectByNameL(const TDesC& /*aName*/)
+/**
+ * This function is not used.
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::OpenNewObjectByNameL called"));
+ User::Leave(KErrNotSupported);
+ return NULL;
+ }
+
+
+CTelObject* CGprsContext::OpenNewObjectL(TDes& aNewName)
+/**
+ * This function returns a pointer to a new QoS profile objecft (CGprsQoS)
+ */
+ {
+ GenerateNewProfileName(aNewName); // create a unique name for this qos profile
+#if defined __LOGDEB__
+ TBuf8<40> tmpLog;
+ tmpLog.Copy(aNewName);
+ LOGTEXT2(_L8("CGprs::OpenNewObjectL(), %S"), &tmpLog);
+#endif
+ CGprsQoS* qos = CGprsQoS::NewL(this, iCid, iIo, iInit, iPhoneGlobals, aNewName);
+ return qos;
+ }
+
+
+CTelObject::TReqMode CGprsContext::ReqModeL(const TInt aIpc)
+/**
+ * This function is called from the framework and checks the flow control for a IPC call.
+ * @param aIpc IPC call from client.
+ */
+ {
+ CTelObject::TReqMode ret=0;
+ switch (aIpc)
+ {
+ case EPacketContextActivate:
+ case EPacketContextDeactivate:
+ case EPacketContextSetConfig:
+ case EPacketContextLoanCommPort:
+ ret = KReqModeFlowControlObeyed;
+ break;
+
+ case EPacketContextDelete:
+ case EPacketContextGetStatus:
+ case EPacketContextGetLastErrorCause:
+ case EPacketContextGetConfig:
+ case EPacketContextGetDataVolumeTransferred:
+ case EPacketContextRecoverCommPort:
+ break;
+
+ case EPacketContextNotifyConfigChanged:
+ case EPacketContextNotifyStatusChange:
+ ret=KReqModeMultipleCompletionEnabled | KReqModeRePostImmediately;
+ break;
+
+ default:
+ User::Leave(KErrNotSupported);
+ break;
+ }
+
+ // Check if the data port is currently loaned. If it is and the requested IPC
+ // is flow controlled then block Etel calling the IPC by leaving with KErrInUse
+ if((ret&KReqModeFlowControlObeyed) && iPhoneGlobals->iPhoneStatus.iDataPortLoaned)
+ {
+ LOGTEXT2(_L8("ReqModeL Leaving with KErrInUse as data port is loaned (aIpc=%d)"),aIpc);
+ User::Leave(KErrInUse);
+ }
+
+ return ret;
+ }
+
+
+TInt CGprsContext::RegisterNotification(const TInt aIpc)
+/**
+ * This function is called from the framework.
+ *
+ * @param aIpc IPC call from client.
+ */
+ {
+ LOGTEXT2(_L8("CGprsContext::RegisterNotification called with aIpc=%d"),aIpc);
+ switch (aIpc)
+ {
+ case EPacketContextNotifyConfigChanged:
+ case EPacketContextNotifyStatusChange:
+ case EPacketContextNotifyDataTransferred:
+ return KErrNone;
+ default:
+ // Unknown or invalid IPC
+ LOGTEXT2(_L8("CGprsContext::RegisterNotification Error Unknown IPC, aIpc=%d"),aIpc);
+ return KErrNotSupported;
+ }
+ }
+
+
+TInt CGprsContext::DeregisterNotification(const TInt aIpc)
+/**
+ * This function is called when the there is no client listening to a notification anymore.
+ *
+ * @param aIpc IPC call from client.
+ */
+ {
+ LOGTEXT2(_L8("CGprs::DeregisterNotification called with aIpc=%d"),aIpc);
+ switch (aIpc)
+ {
+ case EPacketContextNotifyConfigChanged:
+ case EPacketContextNotifyStatusChange:
+ case EPacketContextNotifyDataTransferred:
+ return KErrNone;
+ default:
+ // Unknown or invalid IPC
+ LOGTEXT2(_L8("CGprsContext::DeregisterNotification Error Unknown IPC, aIpc=%d"),aIpc);
+ return KErrNotSupported;
+ }
+ }
+
+
+TInt CGprsContext::NumberOfSlotsL(const TInt aIpc)
+ {
+ TInt numberOfSlots=0;
+ switch (aIpc)
+ {
+ case EPacketContextNotifyConfigChanged:
+ case EPacketContextNotifyStatusChange:
+ case EPacketContextNotifyDataTransferred:
+ LOGTEXT(_L8("CGprsContext: Registered with 5 slots"));
+ numberOfSlots=5;
+ break;
+ default:
+ // Unknown or invalid IPC
+ LOGTEXT(_L8("CGprsContext: Number of Slots error, unknown IPC"));
+ User::Leave(KErrNotSupported);
+ break;
+ }
+ return numberOfSlots;
+
+ }
+
+
+TInt CGprsContext::ExtFunc(const TTsyReqHandle aTsyReqHandle,const TInt aIpc,const TDataPackage& aPackage)
+/**
+ * This function is called from the framework.
+ *
+ * @param aTsyReqHandle handle to client.
+ * @param aIpc IPC call from client.
+ * @param aPackage agruments with the IPC call.
+ */
+ {
+ TAny* dataPtr=aPackage.Ptr1();
+ TAny* dataPtr2=aPackage.Ptr2();
+
+ if(ShouldNotProcessIpcCall(aIpc))
+ {// If the context is in state deleted these calls should not be processed.
+ ReqCompleted(aTsyReqHandle, KErrAccessDenied);
+ return KErrNone;
+ }
+ if(ShouldNotProcessIpcCallWhenComportIsLoaned(aIpc))
+ {// If the comport is loaned out ipcs that generate a at command shall be returned with KErrAccesssDenied
+ ReqCompleted(aTsyReqHandle, KErrAccessDenied);
+ return KErrNone;
+ }
+ switch (aIpc)
+ {
+ case EPacketContextSetConfig:
+ return SetConfig(aTsyReqHandle, aPackage.Des1n());
+ case EPacketContextGetConfig:
+ return GetConfig(aTsyReqHandle, aPackage.Des1n());
+ case EPacketContextNotifyConfigChanged:
+ return NotifyConfigChanged(aTsyReqHandle, aPackage.Des1n());
+ case EPacketContextActivate:
+ return Activate(aTsyReqHandle);
+ case EPacketContextDeactivate:
+ return Deactivate(aTsyReqHandle);
+ case EPacketContextDelete:
+ return Delete(aTsyReqHandle);
+ case EPacketContextLoanCommPort:
+ return LoanCommPort(aTsyReqHandle,
+ REINTERPRET_CAST(RCall::TCommPort*, dataPtr));
+ case EPacketContextRecoverCommPort:
+ return RecoverCommPort(aTsyReqHandle);
+ case EPacketContextGetStatus:
+ return GetStatus(aTsyReqHandle,
+ REINTERPRET_CAST(RPacketContext::TContextStatus*, dataPtr));
+ case EPacketContextNotifyStatusChange:
+ return NotifyStatusChange(aTsyReqHandle,
+ REINTERPRET_CAST(RPacketContext::TContextStatus*, dataPtr));
+ case EPacketContextGetDataVolumeTransferred:
+ return GetDataVolumeTransferred(aTsyReqHandle,
+ REINTERPRET_CAST(RPacketContext::TDataVolume*, dataPtr));
+ case EPacketContextNotifyDataTransferred:
+ return NotifyDataTransferred(aTsyReqHandle,
+ REINTERPRET_CAST(RPacketContext::TDataVolume*, dataPtr),
+ REINTERPRET_CAST(RPacketContext::TNotifyDataTransferredRequest*, dataPtr2));
+ case EPacketContextGetLastErrorCause:
+ return GetLastErrorCause(aTsyReqHandle,
+ REINTERPRET_CAST(TInt*, dataPtr));
+ default:
+ return KErrNotSupported;
+ }
+ }
+
+
+RPacketService::TContextInfo* CGprsContext::ContextInfo()
+/**
+ * This function returns the current context info.
+ */
+ {
+ return &iInfo;
+ }
+
+
+TInt CGprsContext::Cid()
+/**
+ * This function returns the context id.
+ */
+ {
+ return iCid;
+ }
+
+
+void CGprsContext::ContextInfo(RPacketService::TContextInfo* aInfo)
+/**
+ * This function returns the current context info.
+ * @param aInfo context info that is returned.
+ */
+ {
+ aInfo->iName.Copy(iInfo.iName);
+ aInfo->iStatus = iInfo.iStatus;
+ }
+
+
+void CGprsContext::SetContextInfo(const RPacketService::TContextInfo* aContextInfo)
+/**
+ * This function sets the current context info.
+ * @param aContextInfo context into to set.
+ */
+ {
+ iInfo.iName.Copy(aContextInfo->iName);
+ iInfo.iStatus = aContextInfo->iStatus;
+ }
+
+
+TDes* CGprsContext::ContextName()
+/**
+ * This function returns the context name.
+ */
+
+ {
+ return &iInfo.iName;
+ }
+
+
+RPacketContext::TContextConfigGPRS* CGprsContext::Config()
+/**
+ * This function returns the context configuration.
+ *
+ */
+
+ {
+ return &iConfigGPRS;
+ }
+
+
+void CGprsContext::SetConfig(const RPacketContext::TContextConfigGPRS* aContextConfigGPRS)
+/**
+ * This function sets the context configuration.
+ * @param iContextConfigV10 Configuration to set.
+ */
+
+ {
+ iConfigGPRS = *aContextConfigGPRS;
+ }
+
+
+void CGprsContext::GenerateNewProfileName(TDes& aName)
+/**
+ * This function generates a unique qos profile name and a free qosId number.
+ *
+ * @param aName New name of the profile that is generated.
+ */
+ {
+ _LIT(KGprsName, "GPRS_QOS");
+ aName.Append(KGprsName);
+ aName.AppendNum(++iGprsQoSProfileCount);
+ }
+
+TInt CGprsContext::CancelService(const TInt aIpc, const TTsyReqHandle aTsyReqHandle)
+/**
+ * This function is called from the framework and cancels a outstanding request.
+ * @param aIpc The IPC to cancel.
+ * @param aTsyReqHandle the client handle to cancel.
+ */
+ {
+ LOGTEXT(_L8("CGprsATContextTsy: - CancelService called"));
+ switch (aIpc)
+ {
+ case EPacketContextSetConfig:
+ return SetConfigCancel(aTsyReqHandle);
+ case EPacketContextGetConfig:
+ return GetConfigCancel(aTsyReqHandle);
+ case EPacketContextNotifyConfigChanged:
+ return NotifyConfigChangedCancel(aTsyReqHandle);
+ case EPacketContextActivate:
+ return ActivateCancel(aTsyReqHandle);
+ case EPacketContextDeactivate:
+ return DeactivateCancel(aTsyReqHandle);
+ case EPacketContextDelete:
+ return DeleteCancel(aTsyReqHandle);
+ case EPacketContextLoanCommPort:
+ return LoanCommPortCancel(aTsyReqHandle);
+ case EPacketContextRecoverCommPort:
+ return RecoverCommPortCancel(aTsyReqHandle);
+ case EPacketContextNotifyStatusChange:
+ return NotifyStatusChangeCancel(aTsyReqHandle);
+ case EPacketContextNotifyDataTransferred:
+ return NotifyDataTransferredCancel(aTsyReqHandle);
+ default:
+ return KErrNotSupported;
+ }
+ }
+
+
+
+TInt CGprsContext::SetConfig(const TTsyReqHandle aTsyReqHandle,const TDesC8* aConfig)
+/**
+ * Called from a client via ExtFunc.
+ * This function will start a chain of AT commands to the phone(AT+CGQMIN and AT+CGQREQ).
+ *
+ * @param aTsyReqHandle request handle that is completed when done with request.
+ * @param aConfig Pointer to a RPacketContext::TContextConfigPckg.
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::SetConfig called"));
+ iATGPRSSetConfig->ExecuteCommand(aTsyReqHandle, (TAny*)aConfig);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::SetConfigCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ *
+ * @param aTsyReqHandle The handle to cancel
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::SetConfigCancel called"));
+ iATGPRSSetConfig->CancelCommand(aTsyReqHandle);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::GetConfig(const TTsyReqHandle aTsyReqHandle,TDes8* aConfig)
+/**
+ * Called from a client via ExtFunc.
+ * This function will start a chain of AT commands to the phone(AT+CGQREQ?, AT+CGDCONT? and AT+CGQMIN?)
+ * and query the settings in the phone.
+ *
+ * @param aTsyReqHandle request handle that is completed when done with request.
+ * @param aConfig Pointer to a RPacketContext::TContextConfigPckg.
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::GetConfig called"));
+ iATGPRSGetConfig->ExecuteCommand(aTsyReqHandle, aConfig);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::GetConfigCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ *
+ * @param aTsyReqHandle The handle to cancel
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::GetConfigCancel called"));
+ iATGPRSGetConfig->CancelCommand(aTsyReqHandle);
+ return KErrNone;
+ }
+
+
+
+TInt CGprsContext::NotifyConfigChanged(const TTsyReqHandle aTsyReqHandle, TDes8* aConfig)
+/**
+ * Called from a client via ExtFunc.
+ * This function will complete when EPacketContextConfigChange event is triggered.
+ *
+ * @param aTsyReqHandle request handle that is completed.
+ * @param aConfig Pointer to a RPacketContext::TContextConfigPckg
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::NotifyConfigChanged called"));
+ iPhoneGlobals->iNotificationStore->RegisterNotification(EPacketContextConfigChange, aTsyReqHandle, this, aConfig);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::NotifyConfigChangedCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ * @param aTsyReqHandle The handle to cancel
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::NotifyConfigChangedCancel called"));
+ iPhoneGlobals->iNotificationStore->RemoveNotification(aTsyReqHandle);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::Deactivate(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Called from a client via ExtFunc.
+ * This function will start the sending of a AT command(ATD*99# or ATD*99***1#).
+ * @param aTsyReqHandle request handle that is completed when done with request.
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::Deactivate called"));
+ iIo->DropDtr(); // Drops DTR
+ RPacketService::TContextInfo iContextInfo;
+ ContextInfo(&iContextInfo);
+ iContextInfo.iStatus = RPacketContext::EStatusDeactivating;
+ SetContextInfo(&iContextInfo);
+ iPhoneGlobals->iNotificationStore->CheckNotification(this, EPacketContextStatusChanged);
+
+ // Can not call ExecuteCommand as we do not want the
+ // iATSetToOnlineCommandMode->StartEscapeSequence() to be called.
+ iATGprsContextDeactivate->Start(aTsyReqHandle, NULL);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::DeactivateCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ *
+ * @param aTsyReqHandle The handle to cancel
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::DeactivateCancel called"));
+ iATGprsContextDeactivate->CancelCommand( aTsyReqHandle);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::Activate(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Called from a client via ExtFunc.
+ * This function will start the sending of a AT command(AT+CGATT=1).
+ *
+ * @param aTsyReqHandle request handle that is completed when done with request.
+ */
+
+ {
+ LOGTEXT(_L8("CGprsContext::Activate called"));
+ RPacketService::TContextInfo iContextInfo;
+ iContextInfo = *ContextInfo();
+ iContextInfo.iStatus = RPacketContext::EStatusActivating;
+ SetContextInfo(&iContextInfo);
+ iPhoneGlobals->iNotificationStore->CheckNotification(this, EPacketContextStatusChanged);
+ iATGprsContextActivate->ExecuteCommand(aTsyReqHandle,NULL);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::ActivateCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ *
+ * @param aTsyReqHandle The handle to cancel
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::ActivateCancel called"));
+ iATGprsContextActivate->CancelCommand(aTsyReqHandle);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::Delete(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Called from a client via ExtFunc.
+ * This function will set a context as deleted, thus rendering it useless.
+ * @param aTsyReqHandle request handle that is completed when done with request.
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::Delete called"));
+ if(iInfo.iStatus!=RPacketContext::EStatusUnknown && iInfo.iStatus!=RPacketContext::EStatusInactive)
+ {
+ //
+ // Complete with KErrGeneral as this context is not in a state
+ // which will allow a deletion
+ ReqCompleted(aTsyReqHandle, KErrGeneral);
+ }
+ else
+ {
+ //
+ // Start an AT command state machine which
+ // will delete the context from the phone
+ iATGprsContextDelete->ExecuteCommand(aTsyReqHandle,&iCid);
+ }
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::DeleteCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ * @param aTsyReqHandle The handle to cancel
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::DeleteCancel called"));
+ iATGprsContextDelete->CancelCommand(aTsyReqHandle);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::LoanCommPort(const TTsyReqHandle aTsyReqHandle,RCall::TCommPort* aDataPort)
+/**
+ * Called from a client via ExtFunc.
+ * This function will stop the TSY from using the comport and loan it to the client.
+ *
+ * @param aTsyReqHandle request handle that is completed when done with request.
+ * @param aDataPort Pointer to a RCall::TCommPort
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::LoanCommPort called"));
+
+ // Check that this context is active
+ if(ContextInfo()->iStatus != RPacketContext::EStatusActive)
+ {
+ ReqCompleted(aTsyReqHandle,KErrNotReady);
+ return KErrNone;
+ }
+
+ // Check we have not already loaned the port
+ if(iPhoneGlobals->iPhoneStatus.iDataPortLoaned)
+ {
+ ReqCompleted(aTsyReqHandle,KErrEtelPortAlreadyLoaned);
+ return KErrNone;
+ }
+
+ TFileName csy;
+ TName port;
+ TInt ret=iPhoneGlobals->iConfiguration->ConfigModemString(TPtrC(KCDTypeNameCsyName),csy);
+ if (ret!=KErrNone)
+ {
+ ReqCompleted(aTsyReqHandle, ret);
+ return KErrNone;
+ }
+ ret=iPhoneGlobals->iConfiguration->ConfigModemString(TPtrC(KCDTypeNamePortName),port);
+ if (ret!=KErrNone)
+ {
+ ReqCompleted(aTsyReqHandle, ret);
+ return KErrNone;
+ }
+ aDataPort->iCsy.Copy(csy);
+ aDataPort->iPort.Copy(port);
+
+ iPhoneGlobals->iPhoneStatus.iDataPortLoaned = ETrue;
+ iPhoneGlobals->iNotificationStore->CheckNotification(this,EDataPortLoaned);
+
+ // Cancel all reads and writes on the serial port
+ iIo->Cancel();
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::LoanCommPortCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ *
+ * @param aTsyReqHandle The handle to cancel
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::LoanCommPortCancel called"));
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::RecoverCommPort(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Called from a client via ExtFunc.
+ * This function will enable the TSY to use the comport again.
+ *
+ * @param aTsyReqHandle request handle that is completed when done with request.
+ * @param aDataPort Pointer to a RCall::TCommPort
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::RecoverCommPort called"));
+ if(iPhoneGlobals->iPhoneStatus.iDataPortLoaned)
+ {
+ iIo->Read(); // Queue a read again on the comm port
+ iPhoneGlobals->iPhoneStatus.iDataPortLoaned = EFalse;
+ LOGTEXT2(_L8("Comm signals : %x (hex)"),iIo->Signals());
+ LOGTEXT2(_L8("Comm signals after ResetBuffers : %x (hex)"),iIo->Signals());
+ }
+ else
+ {
+ ReqCompleted(aTsyReqHandle,KErrEtelPortNotLoanedToClient);
+ return KErrNone;
+ }
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::RecoverCommPortCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ *
+ * @param aTsyReqHandle The handle to cancel
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::RecoverCommPortCancel called"));
+ ReqCompleted(aTsyReqHandle,KErrCancel);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::GetStatus(const TTsyReqHandle aTsyReqHandle,RPacketContext::TContextStatus* aContextStatus)
+/**
+ * Called from a client via ExtFunc.
+ * This function will return the current state of the CGprsContext object.
+ *
+ * @param aTsyReqHandle request handle that is completed when done with request.
+ * @param aContextStatus Pointer to a RPacketContext::TContextStatus.
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::GetStatus called"));
+ *aContextStatus = ContextInfo()->iStatus;
+ ReqCompleted(aTsyReqHandle,KErrNone);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::NotifyStatusChange(const TTsyReqHandle aTsyReqHandle,RPacketContext::TContextStatus* aContextStatus)
+/**
+ * Called from a client via ExtFunc.
+ * This function will complete when EPacketContextStatusChanged event is triggered.
+ *
+ * @param aTsyReqHandle request handle that is completed.
+ * @param aConfig Pointer to a RPacketContext::TContextStatus
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::NotifyStatusChange called"));
+ iPhoneGlobals->iNotificationStore->RegisterNotification(EPacketContextStatusChange, aTsyReqHandle, this, aContextStatus);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::NotifyStatusChangeCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding request. Called via CancelService.
+ *
+ * @param aTsyReqHandle The handle to cancel
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::NotifyStatusChangeCancel called"));
+ iPhoneGlobals->iNotificationStore->RemoveNotification(aTsyReqHandle);
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::GetDataVolumeTransferred(const TTsyReqHandle aTsyReqHandle,RPacketContext::TDataVolume* /*aVolume*/)
+/**
+ * This function is not supported.
+ *
+ * @param aTsyReqHandle request handle that is completed.
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::GetDataVolumeTransferred called"));
+ ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req67
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::NotifyDataTransferred(const TTsyReqHandle aTsyReqHandle, RPacketContext::TDataVolume* /*aVolume*/, RPacketContext::TNotifyDataTransferredRequest* /*aData*/)
+/**
+ * This function is not supported.
+ *
+ * @param aTsyReqHandle request handle that is completed.
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::NotifyStatusChange called"));
+ ReqCompleted(aTsyReqHandle, KErrNotSupported); // Req68
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::NotifyDataTransferredCancel(const TTsyReqHandle aTsyReqHandle)
+/**
+ * Cancels a outstanding notification. Called via CancelService.
+ *
+ * @param aTsyReqHandle The handle to cancel
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::NotifyDataTransferredCancel called"));
+ ReqCompleted(aTsyReqHandle, KErrCancel); // Req69
+ return KErrNone;
+ }
+
+
+TInt CGprsContext::GetLastErrorCause(const TTsyReqHandle aTsyReqHandle,TInt* /*aError*/)
+/**
+ * This function is not supported.
+ *
+ * @param aTsyReqHandle request handle that is completed.
+ */
+ {
+ LOGTEXT(_L8("CGprsContext::GetLastErrorCause called"));
+ ReqCompleted(aTsyReqHandle,KErrNotSupported); // Req70
+ return KErrNone;
+ }
+
+
+TBool CGprsContext::ShouldNotProcessIpcCall(TInt aIpc)
+/**
+ * This function indicates if a IPC should not be handled.
+ * @param aIPC A IPC call number.
+ */
+ {
+ if(iInfo.iStatus != RPacketContext::EStatusDeleted)
+ return EFalse;
+
+ switch(aIpc)
+ {
+ case EPacketContextSetConfig:
+ case EPacketContextGetConfig:
+ case EPacketContextNotifyConfigChanged:
+ case EPacketContextActivate:
+ case EPacketContextDeactivate:
+ case EPacketContextDelete:
+ case EPacketContextLoanCommPort:
+ case EPacketContextRecoverCommPort:
+ LOGTEXT(_L8("CGprsContext::ShouldNotProcessIpcCall, context deleted. This ipc is not legal"));
+ return ETrue;
+ default:
+ return EFalse;
+ }
+ }
+
+
+TBool CGprsContext::ShouldNotProcessIpcCallWhenComportIsLoaned(TInt aIpc)
+/**
+ * This function indicates if a IPC should not be handled when comport is loaned.
+ * @param aIPC A IPC call number.
+ */
+ {
+ if(!iPhoneGlobals->iPhoneStatus.iDataPortLoaned)
+ return EFalse;
+ switch(aIpc)
+ {
+ case EPacketContextSetConfig:
+ case EPacketContextGetConfig:
+ case EPacketContextNotifyConfigChanged:
+ case EPacketContextActivate:
+ case EPacketContextDeactivate:
+ case EPacketContextDelete:
+ case EPacketContextLoanCommPort:
+ LOGTEXT(_L8("CGprsContext::ShouldNotProcessIpcCallWhenComportIsLoaned, comport loaned out. This ipc is not legal"));
+ return ETrue;
+ default:
+ return EFalse;
+ }
+ }
+
+void CGprsContext::RemoveQoSProfileIfFound(CGprsQoS* aProfile)
+/**
+ * This function removes a QoS profile from the list.
+ * @param aProfile The QoS profile to remove from linked list.
+ */
+ {
+#ifdef _DEBUG
+ TBuf8<KMaxName> tmpLog;
+ tmpLog.Copy(*(aProfile->GetProfileName())); // Convert 16bit string to 8bit so we can log it
+ LOGTEXT2(_L8("CGprsContext::RemoveQoSProfileIfFound called, %S"), &tmpLog);
+#endif
+ CGprsQoSEntry* profileEntry;
+ TDblQueIter<CGprsQoSEntry> iter(iProfiles);
+ while (profileEntry=iter++, profileEntry)
+ {
+ if (profileEntry->iProfile == aProfile)
+ {
+ profileEntry->Deque();
+ delete profileEntry; // just deletes list entry, not the profile itself
+ break;
+ }
+ }
+ }
+
+//
+// CGprsQoSEntry class
+//
+
+CGprsQoSEntry::CGprsQoSEntry(CGprsQoS* aProfile)
+: iProfile(aProfile)
+/**
+ * Constructor
+ * @param aProfile QoS Profile to add to entry
+ */
+ {}
+
+
+CGprsQoSEntry::~CGprsQoSEntry()
+/**
+ * Destructor
+ */
+ {}
+
+
+void CGprsQoSEntry::Deque()
+/**
+ * Remove entry from TDblQue link
+ */
+ {
+ iLink.Deque();
+ iLink.iPrev=iLink.iNext=NULL;
+ }