// 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:
// Multimode Packet Data API
// GPRS, CDMAOne, CDMA2000
//
//
#include "Et_clsvr.h"
#include "ETELEXT.H"
// Packet header files
#include "pcktptr.h"
#include "pcktcs.h"
// Used by ETel to instruct TSY to create a name for the newly opened object
_LIT(KETelNewContextName, "::");
/*GLDEF_C TInt E32Dll(TDllReason)
//
// DLL entry point
//
{
return KErrNone;
}
*/
/***********************************************************************************/
//
// RPacketContext
//
/***********************************************************************************/
EXPORT_C RPacketContext::RPacketContext()
:iEtelPacketContextPtrHolder(NULL)
{
}
void RPacketContext::ConstructL()
/**
* This function creates an instance of CPacketContextPtrHolder & assigns the iEtelPacketContextPtrHolder
* pointer to it.
*/
{
__ASSERT_ALWAYS(iEtelPacketContextPtrHolder==NULL,PanicClient(EEtelPanicHandleNotClosed));
iEtelPacketContextPtrHolder = CPacketContextPtrHolder::NewL(CEtelPacketPtrHolder::EMaxNumPacketContextPtrSlots);
}
void RPacketContext::Destruct()
/**
* This function deletes & NULLs the iEtelPacketContextPtrHolder pointer.
*/
{
delete iEtelPacketContextPtrHolder;
iEtelPacketContextPtrHolder = NULL;
}
EXPORT_C TInt RPacketContext::OpenNewContext(RPacketService& aPacketNetwork,TDes& aContextName)
/**
* This function may be called by the client application.
* It creates a new 'context' (ie: RPacketContext)
*
* @param aPacketNetwork : An RPacketContext may only be opened from an existing RPacketService subsession. A client application must
* therefore pass a reference to their previously instantiated RPacketService object.
*
* @param aContextName : When the new context is created, the TSY will assign it a unique name & pass this name back to the client
* using this parameter. The client can use this name to uniquely identify the particular context.
*/
{
RSessionBase* session=&aPacketNetwork.SessionHandle();
__ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle)); // client has no existing session with ETel
TRAPD(ret,ConstructL());
if (ret)
{
return ret;
}
TInt subSessionHandle=aPacketNetwork.SubSessionHandle();
__ASSERT_ALWAYS(subSessionHandle!=0,PanicClient(EEtelPanicNullHandle)); // client has no existing sub-session!
TPtrC name(KETelNewContextName); // necessary so that server knows to ask TSY for new name
TIpcArgs args;
args.Set(0,&name);
args.Set(1,&aContextName);
args.Set(2,subSessionHandle);
SetSessionHandle(*session);
ret = CreateSubSession(*session,EEtelOpenFromSubSession,args);
if (ret)
Destruct();
return ret;
}
EXPORT_C TInt RPacketContext::OpenExistingContext(RPacketService& aPacketNetwork, const TDesC& aContextName)
/**
* This function may be called by the client application.
* It opens a handle on an existing RPacketContext object identified by a name. KErrNotFound is returned if the object does
* not exist
*
* @param aPacketNetwork : This identifies to which RPacketService the particular context to be opened belongs. All existing
* contexts must have an RPacketService parent.
*
* @param aContextName : This uniquely identifies to ETel which existing RPacketContext object the client wants to open. This name was
* previously assigned by the TSY when the specified RPacketContext was created using the RPacketContext::OpenNewContext() method.
*/
{
RSessionBase* session=&aPacketNetwork.SessionHandle();
__ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle));
TRAPD(ret,ConstructL());
if (ret)
{
Destruct();
return ret;
}
TInt subSessionHandle=aPacketNetwork.SubSessionHandle();
__ASSERT_ALWAYS(subSessionHandle!=0,PanicClient(EEtelPanicNullHandle));
__ASSERT_ALWAYS(aContextName.Length()!=0,PanicClient(KErrBadName));
TIpcArgs args;
args.Set(0,REINTERPRET_CAST(TAny*,CONST_CAST(TDesC*,&aContextName)));
args.Set(1,TIpcArgs::ENothing);
args.Set(2,REINTERPRET_CAST(TAny*,subSessionHandle));
SetSessionHandle(*session);
ret = CreateSubSession(*session,EEtelOpenByNameFromSubSession,args);
if (ret)
Destruct();
return ret;
}
EXPORT_C void RPacketContext::Close()
/**
* This function may be called by the client application.
*
* It closes the client's current sub-session with ETel. Any outstanding requests the client may
* have with ETel (notifications for example) will be automatically destroyed by ETel.
*/
{
CloseSubSession(EEtelClose);
Destruct();
}
EXPORT_C void RPacketContext::SetConfig(TRequestStatus& aStatus, const TDesC8& aConfig) const
/**
* This function may be called by the client application.
*
* It passes to the TSY all parameters necessary to configure the particular context.
* It is an asynchronous function.
*
* @param aStatus : a reference to a TRequestStatus, enabling the client to make this function call
* asynchronously.
*
* @param aConfig : this is a reference to a TContextConfigGPRS or TContextConfigCDMA class packaged
* inside a TPckg<> class. The TContextConfigGPRS/CDMA classes contain all the necessary parameters
* required to configure a context on a GPRS/CDMA network. In the case of this function call, the value
* for each parameter will be input by the client and probably obtained from CommDB.
*/
{
Set(EPacketContextSetConfig, aStatus, aConfig);
}
EXPORT_C void RPacketContext::GetConfig(TRequestStatus& aStatus, TDes8& aConfig) const
/**
* This function may be called by the client application.
*
* It requests the configuration of the current context.
* It is an asynchronous function.
*
* @param aStatus : this is a reference to a TRequestStatus.
*
* @param aConfig : this is a reference to a TContextConfigGPRS or TContextConfigCDMA class packaged
* inside a TPckg<> class. The TContextConfigGPRS/CDMA classes contain all the necessary parameters
* required to configure a context on a GPRS/CDMA network. In the case of this function call, the value
* for each parameter will be input by the TSY.
*/
{
Get(EPacketContextGetConfig, aStatus, aConfig);
}
EXPORT_C void RPacketContext::NotifyConfigChanged(TRequestStatus& aStatus, TDes8& aConfig) const
/**
* This function may be called by the client application.
*
* It notifies a client whenever a change in the current context is detected and passes back the
* updated configuration. It should be noted that once the notification completes, the client must
* then re-post the notification if they wish to continue receiving the notification.
*
* @param aStatus : this is a reference to a TRequestStatus.
*
* @param aConfig : this is a reference to a TContextConfigGPRS or TContextConfigCDMA class packaged
* inside a TPckg<> class. The TContextConfigGPRS/CDMA classes contain all the necessary parameters
* required to configure a context on a GPRS/CDMA network. In the case of this function call, the value
* for each parameter will be input by the TSY.
*/
{
Get(EPacketContextNotifyConfigChanged, aStatus, aConfig);
}
EXPORT_C void RPacketContext::Activate(TRequestStatus& aStatus) const
/**
* This function may be called by the client application.
*
* It activates a context that has been previously configured using the RPacketContext::SetConfig() method.
* Once this function completes, the context will remain in an 'Activating' state until PPP has been successfully
* negotiated between the phone & the packet network gateway. Once PPP is negotiated, the context
* can be considered to be 'Activated'.
*
* It is an asynchronous function.
*
* @param aStatus : this is a reference to a TRequestStatus.
*/
{
Blank(EPacketContextActivate,aStatus);
}
EXPORT_C void RPacketContext::Deactivate(TRequestStatus& aStatus) const
/**
* This function may be called by the client application.
*
* It deactivates a context previously configured on the phone.
*
* It is an asynchronous function.
*
* @param aStatus : this is a reference to a TRequestStatus.
*/
{
Blank(EPacketContextDeactivate, aStatus);
}
EXPORT_C void RPacketContext::Delete(TRequestStatus& aStatus) const
/**
* This function may be called by the client application.
*
* It deletes a context previously configured on the phone. Note that although the context is deleted
* from the TSY (and/or ME), the client's RPacketContext subsession remains. To remove this, a client
* must call RPacketContext::Close().
*
* It is an asynchronous function.
*
* @param aStatus : this is a reference to a TRequestStatus.
*/
{
Blank(EPacketContextDelete, aStatus);
}
EXPORT_C void RPacketContext::LoanCommPort(TRequestStatus& aStatus, RCall::TCommPort& aDataPort) const
/**
* This function may be called by the client application.
*
* It provides a client with details of the comm port to be used for sending/receiving user data.
* This comm port is used by Network Interfaces, NIFs, (for example: PPP.NIF) to send & receive data.
* In a 2-box device this port would generally be the same as that used by the TSY to setup/control the connection.
* In a 1-box device this port would generally be different to the port used by the TSY to setup/control the connection.
* It is an asynchronous function.
*
* @param aStatus : this is a reference to a TRequestStatus.
* @param aDataPort : this is a reference to a TCommPort class containing information on the port, including
* its name and the associated CSY used to access it.
*/
{
__ASSERT_ALWAYS(iEtelPacketContextPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
TPtr8& ptr1=iEtelPacketContextPtrHolder->Set(CEtelPacketPtrHolder::ESlotDataPort,aDataPort);
Get(EPacketContextLoanCommPort,aStatus,ptr1);
}
EXPORT_C void RPacketContext::RecoverCommPort(TRequestStatus& aStatus) const
/**
* This function may be called by the client application.
* It is an asynchronous function.
*
* It allows a client, who previously called RPacketContext::LoanCommPort, to inform ETel & hence the
* TSY that it has finished with the comm port.
*
* @param aStatus : this is a reference to a TRequestStatus.
*/
{
Blank(EPacketContextRecoverCommPort, aStatus);
}
EXPORT_C TInt RPacketContext::GetStatus(TContextStatus& aContextStatus) const
/**
* This function may be called by the client application.
* It is a synchronous function.
*
* It allows a client to get the current status of the context, as defined by the enum TContextStatus.
*
* @param aContextStatus : a reference to a enum value defined by TContextStatus.
*/
{
TPckg<TContextStatus> ptr1(aContextStatus);
return Get(EPacketContextGetStatus, ptr1);
}
EXPORT_C void RPacketContext::NotifyStatusChange(TRequestStatus& aStatus,TContextStatus& aContextStatus)
/**
* This function may be called by the client application.
* It is an asynchronous function.
*
* It allows a client to receive a notification whenever a change in the status of the context is detected.
* The new status is also passed back to the client. It should be noted that once the notification completes,
* the client must then re-post the notification if they wish to continue receiving further status change notifications.
*
* @param aStatus : this is reference to a TRequestStatus.
* @param aContextStatus : this is a reference to the new enum value defined by TContextStatus.
*/
{
__ASSERT_ALWAYS(iEtelPacketContextPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
TPtr8& ptr1=iEtelPacketContextPtrHolder->Set(CEtelPacketPtrHolder::ESlotContextStatus,aContextStatus);
Get(EPacketContextNotifyStatusChange,aStatus,ptr1);
}
EXPORT_C TInt RPacketContext::GetProfileName(TName& aQoSProfile) const
/**
* This function may be called by the client application.
* It is an asynchronous function.
*
* It allows a client to retrieve the name of the QoS profile (RPacketQoS) associated with the
* context (RPacketContext). If no QoS profile has been defined by the client, the name returned
* will be be NULL
*
* @param aQoSProfile : this is a reference to the name of the existing qos profile. If no profile
* has been defined then this name will be NULL.
*/
{
TPckg<TName> ptr1(aQoSProfile);
return Get(EPacketContextGetProfileName,ptr1);
}
EXPORT_C TInt RPacketContext::GetDataVolumeTransferred(TDataVolume& aVolume) const
/**
* This function may be called by the client application.
* It is a synchronous function.
*
* It allows a client to get details on the current amount of data transmitted & received over the airlink
* since the context was activated.
*
* @param aVolume : this is a reference to TDataVolume.
*/
{
TPckg<TDataVolume> ptr1(aVolume);
return Get(EPacketContextGetDataVolumeTransferred, ptr1);
}
EXPORT_C void RPacketContext::NotifyDataTransferred(TRequestStatus& aStatus, TDataVolume& aVolume, TUint aRcvdGranularity,TUint aSentGranularity) const
/**
* This function may be called by the client application.
* It is an asynchronous function.
*
* It allows a client to be notified of a change in the volume of data transmitted/received over the airlink since the
* context was activated. The new volume is also passed back to the client. It should be noted that once the
* notification completes, the client must then re-post the notification if they wish to continue
* receiving further notifications.
*
* The notification will only complete whenever the change in volume increases by a client-specified amount (granularity).
* The default granularity for each direction (rx/tx) is 4KB.
*
* @param aStatus : this is a reference to TRequestStatus.
* @param aVolume : this is a reference to TDataVolume.
* @param aRcvdGranularity : this is a reference to a TUint value defining the granularity for the volume of received data
* @param aSentGranularity : this is a reference to a TUint value defining the granularity for the volume of transmitted data
*/
{
__ASSERT_ALWAYS(iEtelPacketContextPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
iEtelPacketContextPtrHolder->iNotifyDataTransferRequest.iRcvdGranularity=aRcvdGranularity;
iEtelPacketContextPtrHolder->iNotifyDataTransferRequest.iSentGranularity=aSentGranularity;
TPtr8& ptr1=iEtelPacketContextPtrHolder->Set(CEtelPacketPtrHolder::ESlotDataVolume,aVolume);
TPtr8& ptr2=iEtelPacketContextPtrHolder->Set(CEtelPacketPtrHolder::ESlotGranularity,iEtelPacketContextPtrHolder->iNotifyDataTransferRequest);
Get(EPacketContextNotifyDataTransferred, aStatus, ptr1, ptr2);
}
EXPORT_C void RPacketContext::GetConnectionSpeed(TRequestStatus& aStatus, TUint& aRate) const
/**
* This function may be called by the client application.
* It is a synchronous function.
*
* Allows a client to get the current connection speed.
*
* @param aRate : reference to a TUint value that is the current connection bandwidth in bits per second.
*/
{
__ASSERT_ALWAYS(iEtelPacketContextPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
TPtr8& ptr1 = iEtelPacketContextPtrHolder->Set(CEtelPacketPtrHolder::ESlotGetSpeed, aRate);
Get(EPacketContextGetConnectionSpeed, aStatus, ptr1);
}
EXPORT_C void RPacketContext::NotifyConnectionSpeedChange(TRequestStatus& aStatus, TUint& aRate) const
/**
* This function may be called by the client application.
* It is an asynchronous function.
*
* Allows a client to be notified whenever the current connection speed available changes. The new value of connection
* speed availability is also passed back.
*
* @param aStatus : reference to a TReqStatus.
* @param aRate : reference to a TUint value that is the current connection bandwidth in bits per second.
*/
{
__ASSERT_ALWAYS(iEtelPacketContextPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
TPtr8& ptr1=iEtelPacketContextPtrHolder->Set(CEtelPacketPtrHolder::ESlotNotifySpeed, aRate);
Get(EPacketContextNotifyConnectionSpeedChange, aStatus, ptr1);
}
EXPORT_C TInt RPacketContext::GetLastErrorCause(TInt& aError) const
/**
* This function may be called by the client.
*
* This function will retrieve the most recent error to have occurred, passed back in the parameter aError.
* This may be used, for instance, to retrieve which error caused PPP to close down prematurely.
*
* @param aError : this is the last error received/generated by the TSY
*/
{
TPckg<TInt> ptr1(aError);
return Get(EPacketContextGetLastErrorCause, ptr1);
}
EXPORT_C RPacketContext::TContextConfigGPRS::TContextConfigGPRS()
: TPacketDataConfigBase()
/**
* Constructor for TContextConfigGPRS class
*
* This class contains member data compatible with parameters required for configuring a context
* on the GPRS packet network.
*
* The iExtensionId parameter, set automatically by ETel, is used by the TSY when unpacking this class from
* a TPckg<> to indicate it is to be unpacked as a TContextConfigGPRS class.
*
*/
{
iExtensionId = KConfigGPRS;
iAccessPointName.Zero();
iAnonymousAccessReqd = ENotRequired;
iPdpAddress.Zero();
iPdpCompression = 0;
iPdpType = EPdpTypeIPv4;
};
/***********************************************************************************/
//
// RPacketService
//
/***********************************************************************************/
EXPORT_C RPacketService::RPacketService()
:iEtelPacketPtrHolder(NULL)
/**
* Constructor for RPacketService class
*/
{
}
EXPORT_C void RPacketService::ConstructL()
/**
* ConstructL for the RPacketService class
*
*/
{
__ASSERT_ALWAYS(iEtelPacketPtrHolder==NULL,PanicClient(EEtelPanicHandleNotClosed));
iEtelPacketPtrHolder = CPacketPtrHolder::NewL(CEtelPacketPtrHolder::EMaxNumPacketPtrSlots);
}
EXPORT_C void RPacketService::Destruct()
/**
* Destruct() for the RPacketService class
*
*/
{
delete iEtelPacketPtrHolder;
iEtelPacketPtrHolder = NULL;
}
EXPORT_C TInt RPacketService::Open(RPhone& aPhone)
/**
* This function may be called by the client.
*
* It allows a client to create an RPacketService subsession from an existing RPhone session
*
* @param aPhone : a reference to an existing RPhone session the client has previously created.
*/
{
RSessionBase* session=&aPhone.SessionHandle();
__ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle));
TInt subSessionHandle=aPhone.SubSessionHandle();
__ASSERT_ALWAYS(subSessionHandle!=NULL,PanicClient(EEtelPanicNullHandle));
TRAPD(ret,ConstructL());
if (ret)
return ret;
TIpcArgs args;
args.Set(0,&KPacketName);
args.Set(1,TIpcArgs::ENothing);
args.Set(2,subSessionHandle);
SetSessionHandle(*session);
ret = CreateSubSession(*session,EEtelOpenFromSubSession,args);
if (ret)
Destruct();
return ret;
}
EXPORT_C void RPacketService::Close()
/**
* This function may be called by the client.
*
* It allows a client to close its RPacketService subsession
*/
{
CloseSubSession(EEtelClose);
Destruct();
}
EXPORT_C void RPacketService::NotifyContextAdded(TRequestStatus& aStatus, TDes& aContextId) const
/**
* This function may be called by the client.
*
* It allows a client to be notified whenever a new context (RPacketContext) is configured on the phone,
* by a client using RPacketContext::SetConfig(). It should be noted that once the notification completes,
* the client must then re-post the notification if they wish to continue receiving further notifications.
*
* @param aStatus : this is a reference to a TRequestStatus
* @param aContextId : this is the name of the newly added context. The name is assigned by the TSY &
* uniquely identifies the particular context.
*/
{
Get(EPacketNotifyContextAdded,aStatus,aContextId);
}
EXPORT_C void RPacketService::Attach(TRequestStatus& aStatus) const
/**
* This function may be called by the client.
*
* It is an asynchronous function.
*
* This function will cause the phone to attempt an attach to the packet network, if it is not already attached.
* If it is, the error KErrAlreadyExists should be returned. If the phone cannot attach to the network for some reason,
* the error KErrPacketNetworkFailure should be returned.
*
* This may not often need to be used, as there is a separate setting to tell the phone either to attach at start-up, or
* to attach when a context is created. It is intended that this function only be utilised if the user has an option
* to choose exactly when to attach and detach.
*
* This function is asynchronous since attachment may take anything up to one minute in the worst case scenario.
*
* @param aStatus : this is a reference to a TRequestStatus
*/
{
Blank(EPacketAttach,aStatus);
}
EXPORT_C void RPacketService::Detach(TRequestStatus& aStatus) const
/**
* This function may be called by the client.
*
* It is an asynchronous function.
*
* This function will cause the phone to attempt a detach from the packet network, if it is not already detached.
* If it is, the error KErrAlreadyExists should be returned. If at least one context is active the error KErrInUse
* should be returned.
*
* @param aStatus : this is a reference to a TRequestStatus
*/
{
Blank(EPacketDetach, aStatus);
}
EXPORT_C TInt RPacketService::GetStatus(TStatus& aPacketStatus) const
/**
* This function may be called by the client.
*
* It is a synchronous function that returns the status of the current packet service as defined
* by the enum TStatus.
*
* These states include :
* EStatusUnattached - Not attached to the packet network
* EStatusAttached - Attached to the packet network but without an active context
* EStatusActive - Attached to the packet network with an active context
* EStatusSuspended - Attached to the packet network but with a suspended context
*
* @param aPacketStatus : parameter whose value is one of the above
*/
{
TPckg<TStatus> ptr1(aPacketStatus);
return Get(EPacketGetStatus, ptr1);
}
EXPORT_C void RPacketService::NotifyStatusChange(TRequestStatus& aStatus,TStatus& aPacketStatus) const
/**
* This function may be called by the client.
*
* It is an asynchronous function.
*
* It allows a client to be notified of a change in the status of the connection to the packet service.
* The new status is passed back to the client via aPacketStatus parameter.
*
* These states include :
* EStatusUnattached - Not attached to the packet network
* EStatusAttached - Attached to the packet network but without an active context
* EStatusActive - Attached to the packet network with an active context
* EStatusSuspended - Attached to the packet network but with a suspended context
*
* @param aStatus : reference to a TRequestStatus
* @param aPacketStatus : parameter whose value is one of the above
*/
{
__ASSERT_ALWAYS(iEtelPacketPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
TPtr8& ptr1=iEtelPacketPtrHolder->Set(CEtelPacketPtrHolder::ESlotPacketStatus,aPacketStatus);
Get(EPacketNotifyStatusChange,aStatus,ptr1);
}
EXPORT_C void RPacketService::NotifyContextActivationRequested(TRequestStatus& aStatus, TDes8& aContextParameters) const
/**
* This function may be called by the client.
*
* This function will complete when the phone receives a request from the packet network to activate a PDP context.
* Depending on the type of network, this request may contain the PDP type requested, the PDP address for this context,
* and possibly the Access Point Name (APN) of the gateway to connect to.
*
* @param aStatus : a reference to a TRequestStatus
* @param aContextParameters : the relevant parameters as defined above, contained inside the approporiate TContextConfigGPRS or
* TContextConfigCDMA context config class, packaged inside a TPckg<> and passed back to the client as a descriptor reference.
*/
{
__ASSERT_ALWAYS(iEtelPacketPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
Get(EPacketNotifyContextActivationRequested, aStatus, aContextParameters);
}
EXPORT_C void RPacketService::RejectActivationRequest(TRequestStatus& aStatus) const
/**
* This function may be called by the client.
*
* It is an asynchronous function.
*
* This function will cause the phone to reject the network's request for a PDP context activation.
* Note, there is no corresponding "accept" message for the phone to send.
* To accept, the phone should simply begin to activate a PDP context with the appropriate IP address
* before the network's timer expires. On GPRS, this timer is between 5 and 8 seconds, but may
* effectively be between around 25 and 40 seconds as the specifications state that the activation
* request should be re-sent up to five times.
*
* @param aStatus : a reference to a TRequestStatus
*/
{
Blank(EPacketRejectActivationRequest, aStatus);
}
EXPORT_C void RPacketService::EnumerateContexts(TRequestStatus& aStatus, TInt& aCount, TInt& aMaxAllowed) const
/**
* This function may be called by the client.
*
* It is a synchronous function.
*
* This function will retrieve both the number of opened contexts in the TSY, the aCount
* parameter containing this value on completion of the function, and the maximum possible number of
* contexts, passed back in the aMaxAllowed parameter. Note that this is not the maximum number of
* simultaneously active contexts, but the total number allowed. (The maximum possible number of simultaneously
* active contexts is currently limited to 1)
*
* Clients are thus able to determine whether they can open a new context or not. If the actual value of
* aMaxAllowed is not available to the TSY its value should be set to -1.
*
* @param aStatus : a reference to a TRequestStatus
* @param aCount: the number of opened contexts existing in the TSY.
* @param aMaxAllowed : the maximum number of opened context that are allowed in the TSY.
*/
{
TPtr8& ptr1=iEtelPacketPtrHolder->Set(CEtelPacketPtrHolder::ESlotEnumerateCount,aCount);
TPtr8& ptr2=iEtelPacketPtrHolder->Set(CEtelPacketPtrHolder::ESlotEnumerateMaxCount,aMaxAllowed);
Get(EPacketEnumerateContexts, aStatus, ptr1, ptr2);
}
EXPORT_C void RPacketService::GetContextInfo(TRequestStatus& aStatus,TInt aIndex,TContextInfo& aInfo) const
/**
* This function may be called by the client.
*
* It is an asynchronous function.
*
* This function will retrieve information about a particular context, specified by the aIndex parameter.
* It is usual to use this function in conjunction with the EnumerateContexts() function, which returns
* the current number of opened contexts in 'aCount'.
*
* @param aStatus : a reference to a TRequestStatus
*
* @param aIndex : The valid range for aIndex will be between 0 and (n-1) where n is the number
* returned in aCount. If an invalid index is specified the function will return KErrArgument.
*
* @param aInfo : This contains the context information inside the TContextInfo struct. This struct contains
* member data to identify the name of the context (TName iName) & the current status of the context
* (RPacketContext::TContextStatus iStatus)
*/
{
__ASSERT_ALWAYS(iEtelPacketPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
iEtelPacketPtrHolder->iGetContextInfoIndex = aIndex;
TPtr8& ptr1=iEtelPacketPtrHolder->Set(CEtelPacketPtrHolder::ESlotContextInfoIndex,iEtelPacketPtrHolder->iGetContextInfoIndex);
TPtr8& ptr2=iEtelPacketPtrHolder->Set(CEtelPacketPtrHolder::ESlotContextInfo,aInfo);
Get(EPacketGetContextInfo,aStatus, ptr1, ptr2);
}
EXPORT_C void RPacketService::GetNtwkRegStatus(TRequestStatus& aStatus, TRegistrationStatus& aRegistrationStatus) const
/**
* This function may be called by the client.
*
* It is a synchronous function.
*
* This function allows the client to retrieve the current registration status of the phone on the packet network as
* defined by the enum TRegistrationStatus.
*
* @param aStatus : a reference to a TRequestStatus
*
* @param aRegistrationStatus : this is the current registration status of the phone on the packet network.
* It can be one of the following values
* ENotRegisteredNotSearching - The phone is not registered & not searching for a network. A network may or may not be available.
* ERegisteredOnHomeNetwork - The phone is registered on the home network.
* ENotRegisteredSearching - The phone is not registered but is searching for a network.
* ERegistrationDenied - The phone has been denied registration to the network.
* EUnknown - The registration status is unknown.
* ERegisteredRoaming - The phone is registered on a network which is not the home network.
* ENotRegisteredButAvailable - The phone is not registered and not searching for a network. However a network is available.
* ENotRegisteredAndNotAvailable - The phone is not registered and not searching for a network. There is no available network.
*
*/
{
TPtr8& ptr1=iEtelPacketPtrHolder->Set(CEtelPacketPtrHolder::ESlotGetNtwkReg,aRegistrationStatus);
Get(EPacketGetNtwkRegStatus, aStatus, ptr1);
}
EXPORT_C void RPacketService::NotifyChangeOfNtwkRegStatus(TRequestStatus& aStatus,TRegistrationStatus& aRegistrationStatus) const
/**
* This function may be called by the client.
*
* It is an asynchronous function.
*
* Allows a client to be notified whenever a change in the status of the packet network registration is detected.
*
* @param aStatus : reference to a TRequestStatus
* @param aRegistrationStatus : new value of the packet network registration status.
* It can be one of the following values
* ENotRegisteredNotSearching - The phone is not registered & not searching for a network. A network may or may not be available.
* ERegisteredOnHomeNetwork - The phone is registered on the home network.
* ENotRegisteredSearching - The phone is not registered but is searching for a network.
* ERegistrationDenied - The phone has been denied registration to the network.
* EUnknown - The registration status is unknown.
* ERegisteredRoaming - The phone is registered on a network which is not the home network.
* ENotRegisteredButAvailable - The phone is not registered and not searching for a network. However a network is available.
* ENotRegisteredAndNotAvailable - The phone is not registered and not searching for a network. There is no available network.
*/
{
__ASSERT_ALWAYS(iEtelPacketPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
TPtr8& ptr1=iEtelPacketPtrHolder->Set(CEtelPacketPtrHolder::ESlotRegStatus,aRegistrationStatus);
Get(EPacketNotifyChangeOfNtwkRegStatus,aStatus,ptr1);
}
EXPORT_C void RPacketService::GetMSClass(TRequestStatus& aStatus, TMSClass& aCurrentClass, TMSClass& aMaxClass) const
/**
* This function may be called by the client.
*
* It is an asynchronous function.
*
* This function will retrieve both the current class and the highest class of the mobile station.
* The parameters aCurrentClass and aMaxClass may take one of the following values which are ordered in
* terms of class from highest to lowest:
* EMSClassDualMode : Allows simultaneous attach on packet network & simultaneous active calls/contexts. This is the highest class possible.
* EMSClassSuspensionRequired : Allows simultaneous attach on packet network but not simultaneous traffic. An active GPRS/CDMA context can be suspended to allow a circuit-switched call.
* EMSClassAlternateMode : Does not allow simultaneous attach, but may swap betwen packet and circuit switched.
* EMSClassPacketSwitchedOnly : This limits the device to packet switched functionality only.
* EMSClassCircuitSwitchedOnly : This limits the device to circuit Switched functionality only. This is the lowest class possible.
* EMSClassUnknown : The class of the mobile station is unknown.
*
* @param aCurrentClass : current class of the phone.
* @param aMaxClass : highest possible class the phone can emulate.
*
*/
{
__ASSERT_ALWAYS(iEtelPacketPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
TPtr8& ptr1=iEtelPacketPtrHolder->Set(CEtelPacketPtrHolder::ESlotCurrentMsClass,aCurrentClass);
TPtr8& ptr2=iEtelPacketPtrHolder->Set(CEtelPacketPtrHolder::ESlotMaxMsClass,aMaxClass);
Get(EPacketGetMSClass, aStatus, ptr1, ptr2);
}
EXPORT_C void RPacketService::SetMSClass(TRequestStatus& aStatus, TMSClass aClass) const
/**
* This function may be called by the client.
*
* It is an asynchronous function.
*
* This function will set the current packet class of the mobile station; this should never be higher than the maximum
* packet class of the mobile station. If the requested class is higher than the maximum class supported by the phone,
* the error code KErrTooBig should be returned. The parameter aClass may take one of the values defined in Table 3-5.
*
* It is expected that this function will be used to force a ClassSuspensionRequired mobile into a Class C mode of
* operation, either packet or circuit-switched only. This is useful for instance in a situation where the user is billed
* for incoming circuit-switched calls (a practice of U.S. network operators) and does not wish to be available for
* incoming calls for long periods of time but does want to keep the packet side of the phone always on and always
* connected.
*
* @param aClass : the class to which the client wishes to set the phone
*/
{
__ASSERT_ALWAYS(iEtelPacketPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
iEtelPacketPtrHolder->iMSClass = aClass;
TPtr8& ptr1=iEtelPacketPtrHolder->Set(CEtelPacketPtrHolder::ESlotSetMsClass,iEtelPacketPtrHolder->iMSClass);
Set(EPacketSetMSClass,aStatus, ptr1);
}
EXPORT_C void RPacketService::NotifyMSClassChange(TRequestStatus& aStatus, TMSClass& aNewClass) const
/**
* This function may be called by the client.
*
* It is an asynchronous function.
*
*
*
*/
{
__ASSERT_ALWAYS(iEtelPacketPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
TPtr8& ptr1=iEtelPacketPtrHolder->Set(CEtelPacketPtrHolder::ESlotNtfMsClass,aNewClass);
Get(EPacketNotifyMSClassChange,aStatus,ptr1);
}
EXPORT_C TInt RPacketService::GetStaticCaps(TUint& aCaps, RPacketContext::TProtocolType aPdpType) const
/**
* This function may be called by the client.
*
* It is a synchronous function.
*
*
*
*/
{
TPckg<TUint> ptr1(aCaps);
TPckg<RPacketContext::TProtocolType> ptr2(aPdpType);
return Get(EPacketGetStaticCaps, ptr1, ptr2);
}
EXPORT_C TInt RPacketService::GetDynamicCaps(TDynamicCapsFlags& aCaps) const
{
TPckg<TDynamicCapsFlags> ptr1(aCaps);
return Get(EPacketGetDynamicCaps, ptr1);
}
EXPORT_C void RPacketService::NotifyDynamicCapsChange(TRequestStatus& aStatus, TDynamicCapsFlags& aCaps) const
/**
* This function may be called by the client.
*
* It is an asynchronous function.
*
*
*
*/
{
__ASSERT_ALWAYS(iEtelPacketPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
TPtr8& ptr1=iEtelPacketPtrHolder->Set(CEtelPacketPtrHolder::ESlotDynamicCaps,aCaps);
Get(EPacketNotifyDynamicCapsChange,aStatus,ptr1);
}
EXPORT_C void RPacketService::SetPreferredBearer(TRequestStatus& aStatus, TPreferredBearer aBearer) const
/**
* This function may be called by the client.
*
* It is an asynchronous function.
*
*
*
*/
{
__ASSERT_ALWAYS(iEtelPacketPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
iEtelPacketPtrHolder->iPrefBearer = aBearer;
TPtr8& ptr1=iEtelPacketPtrHolder->Set(CEtelPacketPtrHolder::ESlotSetPrefBearer,iEtelPacketPtrHolder->iPrefBearer);
Set(EPacketSetPrefBearer,aStatus, ptr1);
}
EXPORT_C TInt RPacketService::GetPreferredBearer(TPreferredBearer& aBearer) const
/**
* This function may be called by the client.
*
* It is a synchronous function.
*
*
*
*/
{
TPckg<TPreferredBearer> ptr1(aBearer);
return Get(EPacketGetPrefBearer, ptr1);
}
EXPORT_C TInt RPacketService::SetAttachMode(TAttachMode aMode) const
/**
* This function may be called by the client.
*
* It is a synchronous function.
*
*
*
*/
{
TPckg<TAttachMode> ptr1(aMode);
return Set(EPacketSetAttachMode, ptr1);
}
EXPORT_C TInt RPacketService::GetAttachMode(TAttachMode& aMode) const
/**
* This function may be called by the client.
*
* It is a synchronous function.
*
*
*
*/
{
TPckg<TAttachMode> ptr1(aMode);
return Get(EPacketGetAttachMode, ptr1);
}
EXPORT_C TInt RPacketService::SetDefaultContextParams(const TDesC8& aPckg) const
/**
* This function may be called by the client.
*
* It is a synchronous function.
*
*
*
*/
{
return Set(EPacketSetDefaultContextParams, aPckg);
}
EXPORT_C TInt RPacketService::GetDefaultContextParams(TDes8& aPckg) const
/**
* This function may be called by the client.
*
* It is a synchronous function.
*
*
*
*/
{
return Get(EPacketGetDefaultContextParams, aPckg);
}
TPacketBase::TPacketBase()
{}
EXPORT_C TInt TPacketBase::ExtensionId() const
/**
Returns the value of iExtensionId for the associated class.
e.g. iExtensionId=KETelExtPcktV2 for all the V2 classes.
@return The protected data member iExtensionId, which specifies the API version number.
*/
{
return iExtensionId;
}
RPacketContext::TProtocolConfigOptionV2::TProtocolConfigOptionV2()
: TPacketBase(), iChallenge(0), iResponse(0), iId(0), iDnsAddresses(),
iMiscBuffer(0)
/**
Constructor for TProtocolConfigOptionV2 class
This class will hold authentication data encapsulated in TAuthInfo as well as further data that
may be required for CHAP protocol authentication, such a challenge and response
*/
{
iExtensionId = KETelExtPcktV2;
//
// Initialise the TAuthInfo structure...
//
iAuthInfo.iProtocol = EProtocolNone;
iAuthInfo.iUsername.Zero();
iAuthInfo.iPassword.Zero();
};
EXPORT_C RPacketContext::TDnsInfoV2::TDnsInfoV2()
: TPacketBase(), iPrimaryDns(0), iSecondaryDns(0)
/**
Standard constructor since version 2 of the API.
@see KETelExtPcktV2
*/
{
iExtensionId = KETelExtPcktV2;
}