--- a/telephonyserverplugins/common_tsy/commontsy/src/mmpacket/Cmmpacketcontexttsy.cpp Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmpacket/Cmmpacketcontexttsy.cpp Thu May 06 15:10:38 2010 +0100
@@ -1,2227 +1,2227 @@
-// Copyright (c) 2006-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 FILES
-#include "Cmmpacketcontexttsy.h"
-#include "Cmmpacketcontextlist.h"
-#include "cmmpacketservicegsmwcdmaext.h"
-#include "CMmPacketTsy.h"
-#include <ctsy/tflogger.h>
-#include "MmTsy_timeoutdefs.h"
-#include "MmTsy_numberOfSlots.h"
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-
-CMmPacketContextTsy::CMmPacketContextTsy():
- iReqHandleType(EMultimodePacketContextReqHandleUnknown)
- {
- }
-
-CMmPacketContextTsy* CMmPacketContextTsy::NewL(
- CMmPacketServiceTsy* const aMmPacketService,
- const TInfoName& aHostCID,
- const TDes& aName,
- const TUint8 aProxyId )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::NewL. Context name:%S", &aName );
-
- CMmPacketContextTsy* packetContext = new ( ELeave ) CMmPacketContextTsy();
-
- CleanupClosePushL( *packetContext );
- packetContext->iMmPacketService = aMmPacketService;
- packetContext->iContextName = aName;
- packetContext->iProxyId = aProxyId;
- packetContext->iHostCID = aHostCID;
- packetContext->ConstructL();
- CleanupStack::Pop();
-
- return packetContext;
- }
-
-void CMmPacketContextTsy::ConstructL()
- {
- InitModulesL();
- InitInternalAttributes();
- }
-
-CMmPacketContextTsy::~CMmPacketContextTsy()
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::~CMmPacketContextTsy. Context name: %S", &iContextName );
-
- if( iMmPacketService )
- {
-
- iMmPacketService->PacketContextList()->RemoveObject( this );
-
- // Set Dynamic Caps
- iMmPacketService->ActivePacketServiceExtension()->SetDynamicCapsFlag(
- RPacketService::KCapsActivate, EFalse );
-
- if ( iIsDialUpContext )
- {
- iMmPacketService->ResetPointerToDialUpContext( iContextName );
- }
-
- }
-
- delete iMmPacketContextGsmWcdmaExt;
- delete iTsyReqHandleStore;
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::InitModulesL
-// Initialises extension modules for CMmPacketContextTsy
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::InitModulesL()
- {
-
- iMmPacketContextGsmWcdmaExt =
- CMmPacketContextGsmWcdmaExt::NewL( this, iMmPacketService );
-
-#ifdef REQHANDLE_TIMER
- // Create req handle store
- iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this,
- iMmPacketService->PhoneTsy(), EMaxNumOfPacketContextRequests,
- iPacketContextReqHandles );
-
-#else
- // Create req handle store
- iTsyReqHandleStore = CMmTsyReqHandleStore::NewL(
- EMaxNumOfPacketContextRequests, iPacketContextReqHandles );
-
-#endif // REQHANDLE_TIMER
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::InitInternalAttributes
-// Initialises miscellaneous internal attributes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::InitInternalAttributes()
- {
- iQoSProfile = NULL;
- iQoSProfileName.Zero();
-
- iLastErrorCause = KErrNone;
- iContextStatus = RPacketContext::EStatusUnknown;
- iContextStatusBeforeSuspending = RPacketContext::EStatusUnknown;
- iConnectionSpeed = 0;
- iNotifyConnectionSpeed = 0;
- iIsDialUpContext = EFalse;
-
- if ( iContextName.Compare( KStringExternal )== 0
- || iContextName.Compare( KStringExternal2 )== 0 )
- {
- iIsDialUpContext = ETrue;
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::Init
-// Initialisation method that is called from ETel Server.
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::Init()
- {
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::ExtFunc
-// TRAP's all CMmPacketContextTsy related MM Packet API requests in case that
-// they fail. This method functions only as a centralized TRAP for the
-// DoExtFuncL method that does the actual mapping of IPC number to TSY method
-// call.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::ExtFunc(
- const TTsyReqHandle aTsyReqHandle,
- const TInt aIpc,
- const TDataPackage& aPackage )
- {
-TFLOGSTRING3( "TSY: CMmPacketContextTsy::ExtFunc. IPC: %d Context name:%S", aIpc, &iContextName );
-
- TInt ret( KErrNone );
- TInt trapError( KErrNone );
-
-#ifdef ADD_REMOVE_PACKETFILTER_DEFECT_FIXED // search for this up from bottom of file
- // Ensure the ReqHandleType is unset.
- // This will detect cases where this method indirectly calls itself
- // (e.g. servicing a client call that causes a self-reposting notification to complete and thus repost).
- // Such cases are not supported because iReqHandleType is in the context of this class instance,
- // not this request, and we don't want the values set by the inner request and the outer request
- // interfering with each other.
- __ASSERT_DEBUG(iReqHandleType==EMultimodePacketContextReqHandleUnknown, User::Invariant());
-#else
- // Reset last tsy request type
- iReqHandleType = EMultimodePacketContextReqHandleUnknown;
-#endif
-
- // Trap the call of DoExtFuncL
- TRAP( trapError, ret = DoExtFuncL( aTsyReqHandle, aIpc, aPackage ) );
-
- if ( KErrNone != trapError )
- {
- ReqCompleted( aTsyReqHandle, trapError );
- }
-
- else if ( KErrNone != ret )
- {
- ReqCompleted( aTsyReqHandle, ret );
- }
-
- if ( EMultimodePacketContextReqHandleUnknown != iReqHandleType )
- {
-#ifdef REQHANDLE_TIMER
- SetTypeOfResponse( iReqHandleType, aTsyReqHandle );
-#else
- iTsyReqHandleStore->SetTsyReqHandle( iReqHandleType, aTsyReqHandle );
-#endif // REQHANDLE_TIMER
-#ifdef ADD_REMOVE_PACKETFILTER_DEFECT_FIXED // search for this up from bottom of file
- // We've finished with this value now. Clear it so it doesn't leak
- // up to any other instances of this method down the call stack
- iReqHandleType = EMultimodePacketContextReqHandleUnknown;
-#endif
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::DoExtFuncL
-// Packet Data specific functionality of CMmPacketContextTsy::ExtFunc
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::DoExtFuncL(
- const TTsyReqHandle aTsyReqHandle,
- const TInt aIpc,
- const TDataPackage& aPackage )
- {
-TFLOGSTRING3( "TSY: CMmPacketContextTsy::DoExtFuncL. IPC: %d Handle:%d",
- aIpc, aTsyReqHandle );
-
- TInt ret( KErrNotSupported );
-
- TAny* dataPtr = aPackage.Ptr1();
- TAny* dataPtr2 = aPackage.Ptr2();
-
- switch ( aIpc )
- {
- case EPacketContextNotifyStatusChange:
- ret = NotifyStatusChange(
- REINTERPRET_CAST( RPacketContext::TContextStatus*, dataPtr ) );
- break;
- case EPacketContextNotifyConfigChanged:
- ret = NotifyConfigChanged(
- REINTERPRET_CAST( TPacketDataConfigBase*, dataPtr ) );
- break;
- case EPacketContextNotifyConnectionSpeedChange:
- ret = NotifyConnectionSpeedChange(
- REINTERPRET_CAST( TUint*, dataPtr ) );
- break;
- case EPacketContextInitialiseContext:
- {
- TDes8* paramData = aPackage.Des1n();
-
- if(paramData != NULL)
- {
- if(sizeof(RPacketContext::TDataChannelV2) > paramData->MaxLength())
- {
- ret = KErrArgument;
- }
- else
- {
- ret = InitialiseContextL( reinterpret_cast< RPacketContext::TDataChannelV2*>( dataPtr ));
- }
- }
- else
- {
- ret = KErrArgument;
- }
- break;
- }
- case EPacketContextSetConfig:
- ret = SetConfigL(
- REINTERPRET_CAST( TPacketDataConfigBase*, dataPtr ) );
- break;
- case EPacketContextActivate:
- ret = ActivateL();
- break;
- case EPacketContextDeactivate:
- ret = DeactivateL();
- break;
- case EPacketContextDelete:
- ret = DeleteL();
- break;
- case EPacketContextGetStatus:
- ret = GetStatus( aTsyReqHandle,
- REINTERPRET_CAST( RPacketContext::TContextStatus*, dataPtr ) );
- break;
- case EPacketContextGetConfig:
- ret = GetConfig( aTsyReqHandle,
- REINTERPRET_CAST( TPacketDataConfigBase*, dataPtr ) );
- break;
- case EPacketContextGetProfileName:
- ret = GetProfileName( aTsyReqHandle,
- REINTERPRET_CAST( TInfoName*, dataPtr ) );
- break;
- case EPacketContextGetConnectionSpeed:
- ret = GetConnectionSpeed( aTsyReqHandle,
- REINTERPRET_CAST( TUint*, dataPtr ) );
- break;
- case EPacketContextGetLastErrorCause:
- ret = GetLastErrorCause( aTsyReqHandle,
- REINTERPRET_CAST( TInt*, dataPtr ) );
- break;
- case EPacketContextGetDataVolumeTransferred:
- ret = GetDataVolumeTransferredL( aTsyReqHandle,
- REINTERPRET_CAST( RPacketContext::TDataVolume*, dataPtr ) );
- break;
- case EPacketContextEnumeratePacketFilters:
- ret = EnumeratePacketFilters( aTsyReqHandle,
- REINTERPRET_CAST( TInt*, dataPtr ) );
- break;
- case EPacketContextGetPacketFilterInfo:
- {
- TDes8* paramData = aPackage.Des2n();
-
- if (paramData)
- {
- TInt paramLength = paramData->MaxLength();
-
- RPacketContext::TPacketFilterV2 temp;
- RPacketContext::TPacketFilterV2Pckg tempPckg(temp);
-
- TInt expectedLength = tempPckg.MaxLength();
-
- if (paramLength == expectedLength)
- {
- ret = GetPacketFilterInfo( aTsyReqHandle, REINTERPRET_CAST( TInt*, dataPtr ), REINTERPRET_CAST( TPacketBase*, dataPtr2 ) );
- }
- else
- {
- ret = KErrArgument;
- }
- }
- else
- {
- ret = KErrArgument;
- }
-
- }
- break;
- case EPacketContextAddPacketFilter:
- ret = AddPacketFilterL( aTsyReqHandle, aPackage.Des1n() );
- break;
- case EPacketContextRemovePacketFilter:
-#ifdef USING_CTSY_DISPATCHER
- ret = RemovePacketFilter( REINTERPRET_CAST( TInt*, dataPtr ) );
-#else
- ret = RemovePacketFilter( aTsyReqHandle,
- REINTERPRET_CAST( TInt*, dataPtr ) );
-#endif
- break;
- case EPacketContextModifyActiveContext:
- ret = ModifyActiveContextL();
- break;
- case EPacketContextGetDNSInfo:
- ret = GetDnsInfo( aTsyReqHandle, aPackage.Des1n() );
- break;
- case EPacketAddMediaAuthorization:
- ret = AddMediaAuthorizationL( aTsyReqHandle, aPackage.Des1n() );
- break;
- case EPacketRemoveMediaAuthorization:
- ret = RemoveMediaAuthorization( aTsyReqHandle,
- REINTERPRET_CAST( RPacketContext::TAuthorizationToken*,
- dataPtr ) );
- break;
-#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
- case EPacketContextGetConnectionInfo:
- ret = GetConnectionInfo( aTsyReqHandle,
- reinterpret_cast<TConnectionInfoBase*>( dataPtr ) );
- break;
- case EPacketContextNotifyConnectionInfoChange:
- ret = NotifyConnectionInfoChange(
- reinterpret_cast<TConnectionInfoBase*>( dataPtr ) );
- break;
-#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
- // These requests currently not supported
- //case EPacketContextLoanCommPort:
- //case EPacketContextRecoverCommPort:
- //case EPacketContextNotifyDataTransferred:
- default:
- break;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::ReqModeL
-// Returns request mode for given IPC.
-// ---------------------------------------------------------------------------
-//
-CTelObject::TReqMode CMmPacketContextTsy::ReqModeL(
- const TInt aIpc )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::ReqModeL. IPC: %d", aIpc );
-
- CTelObject::TReqMode reqMode( 0 );
- TBool doLeave( EFalse );
-
- switch ( aIpc )
- {
- // All disabled
- // TSYs wishing to implement their own buffering algorithm will place
- // all requests in this category.
-
- // Get methods that do not use DOS and return immediately.
- // Flow control not required.
- case EPacketContextGetConnectionSpeed:
- case EPacketContextGetLastErrorCause:
- case EPacketContextGetProfileName:
- case EPacketContextEnumeratePacketFilters:
- case EPacketContextGetPacketFilterInfo:
-#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
- case EPacketContextGetConnectionInfo:
-#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
-
- // Other methods that do not use DOS and return immediately.
- // Flow control not required.
-
- // Methods that can propably take a long time and cannot therefore be
- // flow controlled. Solution: All these methods must check req handle
- // table before handling the request. In case that the request table
- // indicates that same method has been called and has not been
- // completed, the method should return KErrServerBusy.
- if ( iIsDialUpContext )
- {
- doLeave = ETrue;
- break;
- }
- case EPacketContextGetStatus:
- case EPacketContextGetConfig:
- break;
-
- // KReqModeFlowControlObeyed
- // Commands that change the state of the phone, e.g. clearing the AoC
- // counter, are commands that the TSY should only deal with one at
- // a time.
-
- case EPacketContextInitialiseContext:
- case EPacketContextActivate:
- case EPacketContextDelete:
- case EPacketContextSetConfig:
- case EPacketContextAddPacketFilter:
- case EPacketContextRemovePacketFilter:
- case EPacketContextModifyActiveContext:
- case EPacketContextGetDNSInfo:
- case EPacketAddMediaAuthorization:
- case EPacketRemoveMediaAuthorization:
- if ( iIsDialUpContext )
- {
- doLeave = ETrue;
- break;
- }
- case EPacketContextDeactivate:
- case EPacketContextGetDataVolumeTransferred:
-
- {
- reqMode = KReqModeFlowControlObeyed;
- break;
- }
-
- // KReqModeMultipleCompletionEnabled | ReqModePostImmediately
- // Requests that notify a client about a change of state.
- // Since these requests do not require the issuing of any modem
- // commands, they do not have to obey flow control.
- // The TSY never gets more than one of these outstanding.
- case EPacketContextNotifyConfigChanged:
- case EPacketContextNotifyConnectionSpeedChange:
- if ( iIsDialUpContext )
- {
- doLeave = ETrue;
- break;
- }
- case EPacketContextNotifyStatusChange:
-#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
- case EPacketContextNotifyConnectionInfoChange:
-#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
- reqMode = KReqModeMultipleCompletionEnabled |
- KReqModeRePostImmediately;
- break;
-
- // Cancel Requests
- // It's not necessary to include the Cancel methods in ReqModeL at all.
- // The ETel server never calls ReqModeL with a Cancel IPC.
-
- // Other variations of return values are unusable.
- // Following requests are not supported
- //case EPacketContextNotifyDataTransferred:
- //case EPacketContextLoanCommPort:
- //case EPacketContextRecoverCommPort:
- // Default
- default:
- doLeave = ETrue;
- break;
- }
-
- if ( doLeave )
- {
- User::Leave( KErrNotSupported );
- }
-
- return reqMode;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::NumberOfSlotsL
-// Returns number of slots to be used for given IPC.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::NumberOfSlotsL(
- const TInt aIpc )
- {
- TInt numberOfSlots( 0 );
-
- switch ( aIpc )
- {
- case EPacketContextNotifyStatusChange:
- numberOfSlots = KMmPacketContextNotifyStatusChangeSlots;
- break;
- case EPacketContextNotifyConfigChanged:
- numberOfSlots = KMmPacketContextNotifyConfigChangedSlots;
- break;
- case EPacketContextNotifyConnectionSpeedChange:
- numberOfSlots = KMmPacketContextNotifyConnectionSpeedChangeSlots;
- break;
-#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
- case EPacketContextNotifyConnectionInfoChange:
- numberOfSlots = KMmPacketContextNotifyConnectionInfoChangeSlots;
- break;
-#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
- default:
- // Unknown or invalid IPC
- User::Leave( KErrNotSupported );
- break;
-
- }
-TFLOGSTRING3( "TSY: CMmPacketContextTsy::NumberOfSlotsL. IPC: %d Number of slots: %d",
- aIpc, numberOfSlots );
-
- return numberOfSlots;
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::CancelService
-// Cancel the outstanding request.ETel Server when it is "cleaning-up" any
-// outstanding asynchronous requests before closing a client's sub-session.
-// This will happen if a client closes its R-class handle without cancelling
-// outstanding asynchronous requests. Only Packet API requests are handled
-// here. Client can also cancel a request by calling CancelAsyncRequest
-// (defined in etel.h). The ETel server passes this kind of cancel requests
-// to CancelService.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::CancelService(
- const TInt aIpc,
- const TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING3( "TSY: CMmPacketContextTsy::CancelService. IPC: %d Handle:%d",
- aIpc, aTsyReqHandle );
-
- TInt ret( KErrNone );
- TTsyReqHandle reqHandle( NULL );
-
-#ifdef ADD_REMOVE_PACKETFILTER_DEFECT_FIXED // search for this up from bottom of file
- // Ensure the ReqHandleType is unset.
- // This will detect cases where this method indirectly calls itself
- // (e.g. servicing a client call that causes a self-reposting notification to complete and thus repost).
- // Such cases are not supported because iReqHandleType is in the context of this class instance,
- // not this request, and we don't want the values set by the inner request and the outer request
- // interfering with each other.
- __ASSERT_DEBUG(iReqHandleType==EMultimodePacketContextReqHandleUnknown, User::Invariant());
-#else
- // Reset last tsy request type
- iReqHandleType = EMultimodePacketContextReqHandleUnknown;
-#endif
-
- switch ( aIpc )
- {
- // TSY has started a request and it is not possible to then cancel
- // this request. The best thing for the TSY to do in this case is to
- // proceed as though the Cancel never happened. The server's call to
- // the TSY cancel function will return synchronously. The TSY then
- // continues to wait for the original acknowledgement and when it
- // receives it, the TSY will complete the original request.
- case EPacketContextInitialiseContext:
- case EPacketContextActivate:
- case EPacketContextDeactivate:
- case EPacketContextDelete:
- case EPacketContextSetConfig:
- case EPacketContextGetConfig:
- case EPacketContextGetConnectionSpeed:
- case EPacketContextGetDataVolumeTransferred:
- case EPacketContextEnumeratePacketFilters:
- case EPacketContextGetPacketFilterInfo:
- case EPacketContextAddPacketFilter:
- case EPacketContextRemovePacketFilter:
- case EPacketContextModifyActiveContext:
- case EPacketContextGetDNSInfo:
- case EPacketAddMediaAuthorization:
- case EPacketRemoveMediaAuthorization:
-#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
- case EPacketContextGetConnectionInfo:
-#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
- break;
- // Notification Cancels, no special requirements.
- case EPacketContextNotifyStatusChange:
- iRetNotifyStatus = NULL;
- iReqHandleType = EMultimodePacketContextNotifyStatusChange;
- break;
- case EPacketContextNotifyConfigChanged:
- reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
- EMultimodePacketContextNotifyConfigChanged );
- if ( aTsyReqHandle == reqHandle )
- {
- iRetNotifyConfig = NULL;
- iReqHandleType = EMultimodePacketContextNotifyConfigChanged;
- }
- else
- {
- reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
- EMultimodePacketContextNotifyConfigChanged99 );
- if ( aTsyReqHandle == reqHandle )
- {
- iRetNotifyConfig2 = NULL;
- iReqHandleType =
- EMultimodePacketContextNotifyConfigChanged99;
- }
- }
- break;
- case EPacketContextNotifyConnectionSpeedChange:
- iRetNotifyConnectionSpeed = NULL;
- iReqHandleType =
- EMultimodePacketContextNotifyConnectionSpeedChange;
- break;
-#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
- case EPacketContextNotifyConnectionInfoChange:
- iRetNotifyConnectionInfo = NULL;
- iReqHandleType =
- EMultimodePacketContextNotifyConnectionInfoChange;
- break;
-#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
- // IPCs that are not supported
- //case EPacketContextLoanCommPort:
- //case EPacketContextRecoverCommPort:
- //case EPacketContextNotifyDataTransferred:
- // Default
- default:
- ret = KErrNotSupported;
- break;
- }
-
- if ( EMultimodePacketContextReqHandleUnknown != iReqHandleType )
- {
- // Reset tsy request handle
- iTsyReqHandleStore->ResetTsyReqHandle( iReqHandleType );
-
- // Complete request
- CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrCancel );
-#ifdef ADD_REMOVE_PACKETFILTER_DEFECT_FIXED // search for this up from bottom of file
- // We've finished with this value now. Clear it so it doesn't leak
- // up to any other instances of this method down the call stack
- iReqHandleType = EMultimodePacketContextReqHandleUnknown;
-#endif
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::RegisterNotification
-// Register notification. RegisterNotification is called when the ETel Server
-// recognises that this notification is being posted for the first time on
-// this subsession object.It enables the TSY to "turn on" any regular
-// notification messages that it may receive from DOS. If this object is
-// Dial-Up context only supported notification is
-// EPacketContextNotifyStatusChange.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::RegisterNotification(
- const TInt aIpc )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::RegisterNotification. IPC: %d", aIpc );
-
- TInt ret( KErrNone );
-
- switch ( aIpc )
- {
- case EPacketContextNotifyConfigChanged:
- case EPacketContextNotifyConnectionSpeedChange:
- if ( iIsDialUpContext )
- {
- ret = KErrNotSupported;
- break;
- }
- case EPacketContextNotifyStatusChange:
-#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
- case EPacketContextNotifyConnectionInfoChange:
-#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
- break;
- //case EPacketContextNotifyDataTransferred:
- default:
- // Not supported
- ret = KErrNotSupported;
- break;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::DeregisterNotification
-// Deregister notification. DeregisterNotification is called when the ETel
-// Server recognises that this notification will not be posted again because
-// the last client to have a handle on this sub-session object has just closed
-// the handle. It enables the TSY to "turn off" any regular notification
-// messages that it may receive from DOS. If this object is Dial-Up context
-// only supported notification is EPacketContextNotifyStatusChange.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::DeregisterNotification(
- const TInt aIpc )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::DeregisterNotification. IPC: %d", aIpc );
-
- TInt ret( KErrNone );
-
- switch ( aIpc )
- {
- case EPacketContextNotifyConfigChanged:
- case EPacketContextNotifyConnectionSpeedChange:
- if ( iIsDialUpContext )
- {
- ret = KErrNotSupported;
- break;
- }
- case EPacketContextNotifyStatusChange:
-#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
- case EPacketContextNotifyConnectionInfoChange:
-#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
- break;
- //case EPacketContextNotifyDataTransferred:
- default:
- // Not supported
- ret = KErrNotSupported;
- break;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::OpenNewObjectL
-// Create new QoS object and return a pointer to it.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject* CMmPacketContextTsy::OpenNewObjectL(
- TDes& aNewName )
- {
-TFLOGSTRING( "TSY: CMmPacketContextTsy::OpenNewObjectL." );
-
- // Each context can have only one QoS
- if ( NULL != iQoSProfile )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::OpenNewObjectL. Leaves with: %d", KErrAlreadyExists );
- User::Leave( KErrAlreadyExists );
- }
-
- else
- {
- // Create new QoS object
- iQoSProfile = CMmPacketQoSTsy::NewL( iMmPacketService, this );
-
- iQoSProfileName.Copy( iContextName );
- aNewName.Copy( iQoSProfileName );
- }
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::OpenNewObjectL. aNewName: %S", &aNewName );
-
- return iQoSProfile;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::OpenNewObjectByNameL
-// Return a pointer to QoS if it exists. The ETel Server calls this method
-// after some client has requested to open existing QoS object. The TSY
-// classes must not use this method.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CTelObject* CMmPacketContextTsy::OpenNewObjectByNameL(
- const TDesC& aName )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::OpenNewObjectByNameL. aName: %S", &aName );
-
- if ( aName != iQoSProfileName )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::OpenNewObjectByNameL. Leaves with: %d", KErrNotFound );
- User::Leave( KErrNotFound );
- }
-
- return iQoSProfile;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::InitialiseContextL
-// This function initialises the context created previously.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::InitialiseContextL(RPacketContext::TDataChannelV2* aDataChannel )
- {
-TFLOGSTRING( "TSY: CMmPacketContextTsy::InitialiseContextL." );
-
- TInt ret( KErrNone );
-
- // Initialise Context
- ret = iMmPacketContextGsmWcdmaExt->InitialiseContextL(aDataChannel);
-
- if ( KErrNone == ret )
- {
- // Store the request handle
- iReqHandleType = EMultimodePacketContextInitialiseContext;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::CompleteInitialiseContext
-// Complete the asynchronous InitialiseContext request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::CompleteInitialiseContext(const TInt aResult )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteInitialiseContext. Error: %d", aResult );
-
- // Reset the req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodePacketContextInitialiseContext );
-
- if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
- {
- // Complete the client request
- CMmPacketContextTsy::ReqCompleted( reqHandle, aResult );
- }
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::ActivateL
-// Activate a context. This function activates a context that has been
-// previously configured using the SetConfig() method from RPacketContext.
-// 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'.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::ActivateL()
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::ActivateL. Context name:%S", &iContextName );
-
- TInt ret( KErrGprsServicesNotAllowed );
-
- if ( iMmPacketService->IsActivationAllowed() )
- {
- // Call ActivateL
- ret = iMmPacketContextGsmWcdmaExt->ActivateL();
- }
-
- if ( KErrNone == ret )
- {
- // Store the request handle
- iReqHandleType = EMultimodePacketContextActivate;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::CompleteActivate
-// Complete the asynchronous Activate request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::CompleteActivate(
- const TInt aResult )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteActivate. Error: %d", aResult );
- // Reset the req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodePacketContextActivate );
-
- if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
- {
-
- // Complete the client request
- CMmPacketContextTsy::ReqCompleted( reqHandle, aResult );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::Deactivate
-// Deactivate a context previously configured on the phone.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::DeactivateL()
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::DeactivateL. Context name:%S", &iContextName );
- TInt ret( KErrNone );
-
- // Call Deactivate
- ret = iMmPacketContextGsmWcdmaExt->DeactivateL();
-
- if ( KErrNone == ret )
- {
- // Store the request handle
- iReqHandleType = EMultimodePacketContextDeactivate;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::CompleteDeactivate
-// Complete the asynchronous Deactivate request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::CompleteDeactivate(
- const TInt aResult )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteDeactivate. Error: %d", aResult );
- // Reset the req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodePacketContextDeactivate );
-
- if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
- {
-
- // Complete the client request
- CMmPacketContextTsy::ReqCompleted( reqHandle, aResult );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::DeleteL
-// Delete a context id previously created on the phone.
-// Note that although the context is considered as 'deleted', the
-// client's RPacketContext subsession remains. To remove this, a client must
-// call Close() from RPacketContext.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::DeleteL()
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::DeleteL. Context name:%S", &iContextName );
-
- TInt ret( KErrNone );
-
- // Call DeleteL
- ret = iMmPacketContextGsmWcdmaExt->DeleteL();
-
- if ( KErrNone == ret )
- {
- // Store the request handle
- iReqHandleType = EMultimodePacketContextDelete;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::CompleteDelete
-// Complete the asynchronous Delete request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::CompleteDelete(
- const TInt aResult )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteDelete. Error: %d", aResult );
- // Reset the req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodePacketContextDelete );
-
- if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
- {
- // Complete the client request
- CMmPacketContextTsy::ReqCompleted( reqHandle, aResult );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::GetConfig
-// Requests the current configuration of the context.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::GetConfig(
- const TTsyReqHandle aTsyReqHandle,
- TPacketDataConfigBase* const aConfig )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::GetConfig. Context name:%S", &iContextName );
-
- // Get config
- TInt ret = iMmPacketContextGsmWcdmaExt->GetConfig( aConfig );
-
- // Complete Request
- CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, ret );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::GetConnectionSpeed
-// Allows a client to get the current connection speed.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::GetConnectionSpeed(
- const TTsyReqHandle aTsyReqHandle,
- TUint* const aRate )
- {
-TFLOGSTRING3( "TSY: CMmPacketContextTsy::GetConnectionSpeed. Context name: %S Connection Speed:%d bps",
- &iContextName, iConnectionSpeed );
-
- // Get current connection speed rate
- *aRate = iConnectionSpeed;
-
- // Complete Request
- CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::GetDataVolumeTransferred
-// This function gets the data volume transferred.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::GetDataVolumeTransferredL(
- const TTsyReqHandle aTsyReqHandle,
- RPacketContext::TDataVolume* const aVolume )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::GetDataVolumeTransferredL. Context name:%S", &iContextName );
-
- TInt ret( KErrNone );
-
- if ( RPacketContext::EStatusDeleted != iContextStatus )
- {
- // Get data volume transferred
- ret = iMmPacketContextGsmWcdmaExt->GetDataVolumeTransferredL();
-
- if ( KErrNone == ret )
- {
- // Store pointer
- iRetDataVolume = aVolume;
- // Store the request handle type
- iReqHandleType = EMultimodePacketContextGetDataVolumeTransferred;
- }
- }
- else
- {
- // Get current data volume
- *aVolume = iDataVolume;
- // Complete request
- CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::CompleteGetDataVolumeTransferred
-// Complete the asynchronous GetDataVolumeTransferred request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::CompleteGetDataVolumeTransferred(
- const TInt aResult )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteGetDataVolumeTransferred. Error: %d", aResult );
-
- // Reset the req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodePacketContextGetDataVolumeTransferred );
-
- if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
- {
-
- if ( KErrNone == aResult )
- {
- *iRetDataVolume = iDataVolume;
- }
-
- // Null ret pointer
- iRetDataVolume = NULL;
-
- // Complete the client request
- CMmPacketContextTsy::ReqCompleted( reqHandle, aResult );
- }
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::GetLastErrorCause
-// This function retrieves the last error cause to have occurred.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::GetLastErrorCause(
- const TTsyReqHandle aTsyReqHandle,
- TInt* const aError )
- {
-TFLOGSTRING3( "TSY: CMmPacketContextTsy::GetLastErrorCause. Context name:%S Last error cause: %d",
- &iContextName, iLastErrorCause );
-
- *aError = iLastErrorCause;
- CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::GetProfileName
-// Allows a client to retrieve the name of the QoS profile. The QoS profile is
-// associated with the context. If no QoS profile has been defined by the
-// client, the name to be returned will be NULL.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::GetProfileName(
- const TTsyReqHandle aTsyReqHandle,
- TInfoName* const aQoSProfile )
- {
- if ( NULL != iQoSProfile )
- {
- *aQoSProfile = iQoSProfileName;
- }
- else
- {
- // QoS profile not found
- aQoSProfile->Zero();
- }
-
-TFLOGSTRING3( "TSY: CMmPacketContextTsy::GetProfileName. Context name: %S QoS Profile Name: %S",
- &iContextName, aQoSProfile );
-
- CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::GetStatus
-// Allows a client to get the current status of the context.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::GetStatus(
- const TTsyReqHandle aTsyReqHandle,
- RPacketContext::TContextStatus* const aContextStatus )
- {
-TFLOGSTRING3( "TSY: CMmPacketContextTsy::GetStatus. Context name: %S Context Status:%d",
- &iContextName, iContextStatus );
- *aContextStatus = iContextStatus;
- CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::NotifyConfigChanged
-// Requests notification when configuration of context changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::NotifyConfigChanged(
- TPacketDataConfigBase* const aConfig )
- {
-TFLOGSTRING( "TSY: CMmPacketContextTsy::NotifyConfigChanged." );
-
- // Call NotifyConfigChanged from extension
- TInt ret = iMmPacketContextGsmWcdmaExt->NotifyConfigChanged( *aConfig );
-
- if ( KErrNone == ret )
- {
- if ( TPacketDataConfigBase::KConfigGPRS == aConfig->ExtensionId() )
- {
- // Store pointer
- iRetNotifyConfig = aConfig;
- // Store req handle type
- iReqHandleType = EMultimodePacketContextNotifyConfigChanged;
- }
-
- else
- {
- // Store pointer
- iRetNotifyConfig2 = aConfig;
- // Store req handle type
- iReqHandleType = EMultimodePacketContextNotifyConfigChanged99;
- }
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::CompleteNotifyConfigChanged
-// Complete notification when the context configuration changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::CompleteNotifyConfigChanged()
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteNotifyConfigChanged. Context name:%S",
- &iContextName );
-
- // Get and reset req handle for R97/98 config notify
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodePacketContextNotifyConfigChanged );
-
- if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
- {
- // Get current configuration
- iMmPacketContextGsmWcdmaExt->GetConfig( iRetNotifyConfig );
- // Null ret pointer
- iRetNotifyConfig = NULL;
- // Complete the client request
- CMmPacketContextTsy::ReqCompleted( reqHandle, KErrNone );
- }
-
- // Get and reset req handle for R99_R4 config notify
- reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodePacketContextNotifyConfigChanged99 );
-
- if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
- {
- // Get current configuration
- iMmPacketContextGsmWcdmaExt->GetConfig( iRetNotifyConfig2 );
- // Null ret pointer
- iRetNotifyConfig2 = NULL;
- // Complete the client request
- CMmPacketContextTsy::ReqCompleted( reqHandle, KErrNone );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::NotifyConnectionSpeedChange
-// Requests notification when connection speed changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::NotifyConnectionSpeedChange(
- TUint* const aRate )
- {
-TFLOGSTRING( "TSY: CMmPacketContextTsy::NotifyConnectionSpeedChange." );
-
- // Store pointer
- iRetNotifyConnectionSpeed = aRate;
- // Store req handle type
- iReqHandleType = EMultimodePacketContextNotifyConnectionSpeedChange;
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::CompleteNotifyConnectionSpeedChange
-// Complete the notification when the connection speed changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::CompleteNotifyConnectionSpeedChange(
- TInt const aConnectionSpeed )
- {
- iConnectionSpeed = aConnectionSpeed;
-
- if ( iNotifyConnectionSpeed != iConnectionSpeed )
- {
-TFLOGSTRING3( "TSY: CMmPacketContextTsy::CompleteNotifyConnectionSpeedChange. Context name:%S Connection Speed:%d bps",
- &iContextName, iConnectionSpeed );
-
- // Store the connection speed internally
- iNotifyConnectionSpeed = iConnectionSpeed;
-
- // Get and reset req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodePacketContextNotifyConnectionSpeedChange );
-
- if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
- {
- // Get current connection speed
- *iRetNotifyConnectionSpeed = iNotifyConnectionSpeed;
- // Null ret pointer
- iRetNotifyConnectionSpeed = NULL;
- // Complete the client request
- CMmPacketContextTsy::ReqCompleted( reqHandle, KErrNone );
- }
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::NotifyStatusChange
-// Requests notification when the status of the context changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::NotifyStatusChange(
- RPacketContext::TContextStatus* const aContextStatus )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::NotifyStatusChange. Context name:%S", &iContextName );
- iRetNotifyStatus = aContextStatus;
- iReqHandleType = EMultimodePacketContextNotifyStatusChange;
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::CompleteNotifyStatusChange
-// Complete the notification when the context status changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::CompleteNotifyStatusChange(
- const RPacketContext::TContextStatus aContextStatus )
- {
-
- if ( aContextStatus != iContextStatus )
- {
- iContextStatus = aContextStatus;
-TFLOGSTRING3( "TSY: CMmPacketContextTsy::CompleteNotifyStatusChange. Context name: %S Context status:%d",
- &iContextName, iContextStatus );
-
- if ( RPacketContext::EStatusActive == iContextStatus ||
- RPacketContext::EStatusInactive == iContextStatus ||
- RPacketContext::EStatusDeleted == iContextStatus )
- {
- iMmPacketService->ContextStatusChanged( iContextStatus );
- if( RPacketContext::EStatusDeleted == iContextStatus )
- {
- iMmPacketContextGsmWcdmaExt->SetContextStatusBeforeDeactivation(
- RPacketContext::EStatusDeleted );
- }
- }
-
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodePacketContextNotifyStatusChange );
-
- if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
- {
- // Get current status
- *iRetNotifyStatus = aContextStatus;
- // Null ret pointer
- iRetNotifyStatus = NULL;
- // Complete the client request
- CMmPacketContextTsy::ReqCompleted( reqHandle, KErrNone );
- }
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::SetConfigL
-// Configure a context to the phone.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::SetConfigL(
- TPacketDataConfigBase* const aConfig )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::SetConfigL. Context name:%S", &iContextName );
-
- // Call SetConfigL
- TInt ret = iMmPacketContextGsmWcdmaExt->SetConfigL( aConfig );
-
- if ( KErrNone == ret )
- {
- // Store the request handle type
- iReqHandleType = EMultimodePacketContextSetConfig;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::CompleteSetConfig
-// Complete the asynchronous SetConfig request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::CompleteSetConfig(
- const TInt aError,
- TBool aIsAddMediaAuthorizationCalled )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteSetConfig. Error: %d", aError );
-
- TTsyReqHandle reqHandle( EMultimodePacketContextReqHandleUnknown );
- //if context exists eg. its name length is bigger than zero
- if( 0 == CMmPacketContextTsy::HostCID().Length() )
- {
- reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodePacketContextSetConfig );
- }
-
- else
- {
- if( aIsAddMediaAuthorizationCalled )
- {
- reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodePacketContextAddMediaAuthorization );
- }
- else
- {
-#ifdef USING_CTSY_DISPATCHER
- // Distinguish between RemovePacketFilter and AddPacketFilter..
-
-// There is a hang defect lurking here.
-//
-// To show the defect, add and run the following test case (you could
-// copy from CCTsyPacketServicesFU::TestUseCase0007L):
-// - Add a packet filter. Wait for the request to complete.
-// - Remove the packet filter. (don't wait for completion)
-// - Add another packet filter.
-// - Wait for removal to complete (WILL HANG but obviously shouldn't).
-//
-// The reason for this hang is that there's a single completion method
-// for both Add and Remove packet filter functions down in the CTSY
-// (dispatcher mode only).
-//
-// If a client calls RemovePacketFilter, then immediately
-// calls AddPacketFilter (before the RemovePacketFilter has
-// completed), the iReqHandleType data member will already have been
-// updated to be EMultimodePacketContextAddPacketFilter..
-// So the code under the else below (that searches for the
-// RemovePacketFilter reqHandle and completes it) will never get run.
-// Thus the RemovePacketFilter call will hang.
-//
-// Fixing this requires that some other variable (NOT iReqHandleType)
-// is used to record that an add or a remove action is outstanding.
-//
-// When this defect has been addressed, please treat all the sections marked
-// ADD_REMOVE_PACKETFILTER_DEFECT_FIXED above as defined, and delete any
-// else blocks. This will then assert that the iReqHandleType doesn't
-// leak between calls. Which will protect us against any other such hang
-// bugs in the future.
-// This is the change that I was trying to apply when I ran into this defect.
-// See Perforce CL#1755436
-// Rob Lundie Hill
-
- if (iReqHandleType == EMultimodePacketContextRemovePacketFilter)
- {
- reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( EMultimodePacketContextRemovePacketFilter );
- }
- else
- {
- reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( EMultimodePacketContextAddPacketFilter );
- }
-#else
- reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodePacketContextAddPacketFilter );
-#endif //USING_CTSY_DISPATCHER
- }
- }
-
- if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
- {
-
- // Complete the client request
- CMmPacketContextTsy::ReqCompleted( reqHandle, aError );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::SetDataVolume
-// Set the volume of transferred data.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::SetDataVolume(
- const TInt /* aResult */,
- RPacketContext::TDataVolume dataVolume )
- {
-
-TFLOGSTRING( "TSY: CMmPacketContextTsy::SetDataVolume" );
-
- if ( dataVolume.iBytesSent < iDataVolume.iBytesSent )
- {
- // The value of sent data has turned around the 4 GB
- iDataVolume.iOverflowCounterSent++;
- }
- iDataVolume.iBytesSent = dataVolume.iBytesSent;
-
-
- if ( dataVolume.iBytesReceived < iDataVolume.iBytesReceived )
- {
- // The value of received data has turned around the 4 GB
- iDataVolume.iOverflowCounterReceived++;
- }
- iDataVolume.iBytesReceived = dataVolume.iBytesReceived;
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::SetLastErrorCause
-// Set the last error cause.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::SetLastErrorCause(
- const TInt aErrorCause )
- {
- if ( RPacketContext::EStatusActivating == iContextStatus ||
- RPacketContext::EStatusDeactivating == iContextStatus )
- {
- iLastErrorCause = aErrorCause;
- }
-
-TFLOGSTRING3( "TSY: CMmPacketContextTsy::SetLastErrorCause. aErrorCause: %d iLastErrorCause:%d",
- aErrorCause, iLastErrorCause );
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::ContextStatus
-// Return current context status.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-RPacketContext::TContextStatus CMmPacketContextTsy::ContextStatus() const
- {
- return iContextStatus;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::ContextSuspended
-// Suspend the context.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::ContextSuspended()
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::ContextSuspended. Context status before suspending: %d",
- iContextStatus );
-
- if ( ( RPacketContext::EStatusActivating == iContextStatus ) ||
- ( RPacketContext::EStatusActive == iContextStatus ) ||
- ( RPacketContext::EStatusDeactivating == iContextStatus ) )
- {
- iContextStatusBeforeSuspending = iContextStatus;
- CMmPacketContextTsy::CompleteNotifyStatusChange(
- RPacketContext::EStatusSuspended );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::ContextResumed
-// Resume the suspended context.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::ContextResumed()
- {
- if ( RPacketContext::EStatusSuspended == iContextStatus )
- {
- CMmPacketContextTsy::CompleteNotifyStatusChange(
- iContextStatusBeforeSuspending );
- }
-
- iContextStatusBeforeSuspending = RPacketContext::EStatusUnknown;
-
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::ContextResumed. Context status when resumed: %d",
- iContextStatus );
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::PacketContextGsmWcdmaExt
-// Return pointer to the CMmPacketContextGsmWcdmaExt.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CMmPacketContextGsmWcdmaExt* CMmPacketContextTsy::PacketContextGsmWcdmaExt() const
- {
- return iMmPacketContextGsmWcdmaExt;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::PacketQoSTsy
-// Return a pointer to the PacketQoSTsy.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CMmPacketQoSTsy* CMmPacketContextTsy::PacketQoSTsy() const
- {
- return iQoSProfile;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::RemoveQoS
-// Remove the pointer to PacketQoSTsy.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::RemoveQoS()
- {
-TFLOGSTRING( "TSY: CMmPacketContextTsy::RemoveQoS." );
-
- iQoSProfile = NULL;
- iQoSProfileName.Zero();
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::ReqCompleted
-// Overloads CTelObject::ReqCompleted.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::ReqCompleted(
- const TTsyReqHandle aTsyReqHandle,
- const TInt aError )
- {
-TFLOGSTRING3( "TSY: CMmPacketContextTsy::ReqCompleted. Handle:%d Error:%d",
- aTsyReqHandle, aError );
-
- // Set last error cause
- if ( KErrNone != aError )
- {
- iLastErrorCause = aError;
- }
-
- CTelObject::ReqCompleted( aTsyReqHandle, aError );
-
- }
-
-#ifdef REQHANDLE_TIMER
-
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::SetTypeOfResponse
-// Sets the type of response for a given request handle. Automatic mode
-// includes an automatic response in case of non response from the DOS in a
-// specified time. This method is used only if REQHANDLE_TIMER is in use.
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::SetTypeOfResponse(
- const TInt aReqHandleType,
- const TTsyReqHandle aTsyReqHandle )
- {
- TInt timeOut( 0 );
-
- // Set timeout by req handle type
- switch ( aReqHandleType )
- {
- case EMultimodePacketContextInitialiseContext:
- timeOut = KMmPacketContextInitialiseContextTimeOut;
- break;
- case EMultimodePacketContextSetConfig:
- timeOut = KMmPacketContextSetConfigTimeOut;
- break;
- case EMultimodePacketContextActivate:
- timeOut = KMmPacketContextActivateTimeOut;
- break;
- case EMultimodePacketContextDeactivate:
- timeOut = KMmPacketContextDeactivateTimeOut;
- break;
- case EMultimodePacketContextDelete:
- timeOut = KMmPacketContextDeleteTimeOut;
- break;
- case EMultimodePacketContextGetDataVolumeTransferred:
- timeOut = KMmPacketContextGetDataVolumeTransferredTimeOut;
- break;
- case EMultimodePacketContextModifyActiveContext:
- timeOut = KMmPacketContextModifyActiveContext;
- break;
- case EMultimodePacketContextAddMediaAuthorization:
- timeOut = KMmPacketContextAddMediaAuthorization;
- break;
-
- // Can't use timer:
- // - all notifications
- //case EMultimodePacketContextNotifyConfigChanged:
- //case EMultimodePacketContextNotifyConnectionSpeedChange:
- //case EMultimodePacketContextNotifyStatusChange:
- default:
- // Do not use timer
- iTsyReqHandleStore->SetTsyReqHandle( aReqHandleType,
- aTsyReqHandle );
- break;
- }
-
- if ( 0 < timeOut )
- {
- // The timeout parameter is given in seconds.
- iTsyReqHandleStore->SetTsyReqHandle( aReqHandleType, aTsyReqHandle,
- timeOut );
- }
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::Complete
-// Completes the request due the timer expiration. This method is used only if
-// REQHANDLE_TIMER is in use.
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::Complete(
- const TInt aReqHandleType,
- const TInt aError )
- {
- // All possible TSY req handle types are listed in the
- // switch case below.
- switch ( aReqHandleType )
- {
- case EMultimodePacketContextInitialiseContext:
- CMmPacketContextTsy::CompleteInitialiseContext( aError );
- break;
- case EMultimodePacketContextSetConfig:
- CMmPacketContextTsy::CompleteSetConfig( aError );
- break;
- case EMultimodePacketContextActivate:
- CMmPacketContextTsy::CompleteActivate( aError );
- break;
- case EMultimodePacketContextDeactivate:
- CMmPacketContextTsy::CompleteDeactivate( aError );
- break;
- case EMultimodePacketContextDelete:
- CMmPacketContextTsy::CompleteDelete( aError );
- break;
- case EMultimodePacketContextGetDataVolumeTransferred:
- CMmPacketContextTsy::CompleteGetDataVolumeTransferred( aError );
- break;
- case EMultimodePacketContextModifyActiveContext:
- CMmPacketContextTsy::CompleteModifyActiveContext( aError );
- break;
- case EMultimodePacketContextAddMediaAuthorization:
- CMmPacketContextTsy::CompleteSetConfig( aError, ETrue );
- break;
-
- // Can't use timer:
- // - all notifications
- //case EMultimodePacketContextNotifyConfigChanged:
- //case EMultimodePacketContextNotifyConnectionSpeedChange:
- //case EMultimodePacketContextNotifyStatusChange:
- default:
- CMmPacketContextTsy::ReqCompleted( iTsyReqHandleStore->
- ResetTsyReqHandle( aReqHandleType ), aError );
- break;
- }
-
- }
-
-#endif // REQHANDLE_TIMER
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::IsDialUpContext
-// Return ETrue if this is dial-up context, otherwise EFalse.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CMmPacketContextTsy::IsDialUpContext(
- const TInfoName* const aContextName ) const
- {
-
- TBool ret( EFalse );
-
- if ( NULL != aContextName )
- {
- if ( *aContextName == iContextName )
- {
- ret = ETrue;
- }
- }
- else
- {
- ret = iIsDialUpContext;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::ResetDialUpContext
-// Reset the externally created dial-up context's data.
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::ResetDialUpContext()
- {
-
-TFLOGSTRING( "TSY: CMmPacketContextTsy::ResetDialUpContext." );
-
- iDataVolume.iOverflowCounterSent = 0;
- iDataVolume.iBytesSent = 0;
- iDataVolume.iOverflowCounterReceived = 0;
- iDataVolume.iBytesReceived = 0;
-
- iContextStatus = RPacketContext::EStatusInactive;
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::HostCID
-// Return the host context name
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInfoName CMmPacketContextTsy::HostCID() const
- {
-
- return iHostCID;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::AddPacketFilterL
-// This method sets up a packet filter in the TFT belonging to this context,
-// with the Id specified in the packet filter information. New packet filter
-// info is stored in CMmPacketContextGsmWcdmaExt. This method takes care of
-// adding packet filter info and storing this information.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::AddPacketFilterL(
- const TTsyReqHandle aTsyReqHandle,
- TDes8* const aPacketFilter )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::AddPacketFilterL. Context name:%S", &iContextName );
-
- TInt ret( KErrGeneral );
-
- if ( (0 < iHostCID.Length()) && (aPacketFilter->Length() > 0) )
- {
- ret = iMmPacketContextGsmWcdmaExt->AddPacketFilterL( aPacketFilter );
-
- if ( KErrNone == ret )
- {
- // if operation is meant for already configurated context
- if ( RPacketContext::EStatusUnknown != ContextStatus() &&
- RPacketContext::EStatusInactive != ContextStatus() )
- {
- // request must complete to client
- CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
- }
-
- // else operation is context configuration and complete method
- // handles request complete
- else
- {
- // Store the request handle type
- iReqHandleType = EMultimodePacketContextAddPacketFilter;
- }
- }
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::RemovePacketFilter
-// This method removes a packet filter from the TFT belonging to this context.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-#ifndef USING_CTSY_DISPATCHER
-TInt CMmPacketContextTsy::RemovePacketFilter(
- const TTsyReqHandle aTsyReqHandle,
- TInt *aID )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::RemovePacketFilter. RemovedFilter:%d", *aID );
-
- TInt ret( KErrArgument );
-
- // id must be value from 1 to 8
- if ( 0 < *aID && 8 >= *aID )
- {
- ret = iMmPacketContextGsmWcdmaExt->RemovePacketFilter( *aID );
- }
-
- CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, ret );
-
- return KErrNone;
- }
-#endif // #ifndef USING_CTSY_DISPATCHER
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::ModifyActiveContextL
-// Invokes context modification. This method invokes MS-initiated
-// modification of an active context in the network.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::ModifyActiveContextL()
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::ModifyActiveContextL. Context name:%S", &iContextName );
-
- TInt ret( KErrNotReady );
-
- if ( RPacketContext::EStatusUnknown != ContextStatus() &&
- RPacketContext::EStatusInactive != ContextStatus() &&
- RPacketContext::EStatusDeleted != ContextStatus() )
- {
- ret = iMmPacketContextGsmWcdmaExt->ModifyActiveContextL();
- }
-
- if ( KErrNone == ret )
- {
- // Store the request handle type
- iReqHandleType = EMultimodePacketContextModifyActiveContext;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::CompleteModifyActiveContext
-// When all Tft operations are done method completes to client
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::CompleteModifyActiveContext(
- const TInt aResult )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteModifyActiveContext. Context name:%S", &iContextName );
-
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodePacketContextModifyActiveContext );
-
- if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
- {
-
- CMmPacketContextTsy::ReqCompleted( reqHandle, aResult );
-
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::EnumeratePacketFilters
-// Returns number of defined packet filters to client
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::EnumeratePacketFilters(
- const TTsyReqHandle aTsyReqHandle,
- TInt *aCount )
- {
- TInt ret = iMmPacketContextGsmWcdmaExt->EnumeratePacketFilters ( aCount );
-
- CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, ret );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::GetPacketFilterInfo
-// Gives information about the packet filter specified by aIndex
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::GetPacketFilterInfo(
- const TTsyReqHandle aTsyReqHandle,
- TInt* aIndex,
- TPacketBase* aPacketFilterInfo )
- {
- TInt ret = iMmPacketContextGsmWcdmaExt->GetPacketFilterInfo ( *aIndex,
- aPacketFilterInfo);
-
- CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, ret );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::GetDnsInfo
-// This method gets the DNS info for Etel side request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::GetDnsInfo(
- const TTsyReqHandle aTsyReqHandle,
- TDes8* const aDnsInfo )
- {
- ASSERT(aDnsInfo);
-
- RPacketContext::TDnsInfoV2 temp;
- RPacketContext::TTDnsInfoV2Pckg tempPckg(temp);
-
- TInt ret = KErrArgument;
- if (tempPckg.MaxLength() == aDnsInfo->MaxLength() )
- {
- ret = iMmPacketContextGsmWcdmaExt->GetDnsInfoEtel( aDnsInfo );
- }
-
- CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, ret );
-
- return KErrNone;
- }
-
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::ContextName
-// This method returns name of this context
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInfoName CMmPacketContextTsy::ContextName() const
- {
- return iContextName;
- }
-
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::AddMediaAuthorizationL
-// Makes request for adding authorization params to licensee tsy
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::AddMediaAuthorizationL(
- const TTsyReqHandle aTsyReqHandle,
- TDes8* aMediaAuthorization )
- {
-
- TInt ret( KErrArgument );
- TBool hasMediaAuthorizationBeenCached=EFalse;
-
-
- //Can be done only for secondary context
- if ( 0 < iHostCID.Length() )
- {
-
- //Create buffers
- RPacketContext::CTFTMediaAuthorizationV3* mediaAuthorization =
- RPacketContext::CTFTMediaAuthorizationV3::NewL();
- CleanupStack::PushL( mediaAuthorization );
- mediaAuthorization->InternalizeL( *aMediaAuthorization );
-
- ret = iMmPacketContextGsmWcdmaExt->AddMediaAuthorizationL(
- mediaAuthorization, hasMediaAuthorizationBeenCached);
-
- //Cleanup created object. If it has been cached we do not delete it, because
- // the array (cache) will be cleaned in the destructor
- // If we were unable to cache it, we need to destroy it, otherwise we will leak
- // memory.
- if(hasMediaAuthorizationBeenCached)
- {
- CleanupStack::Pop(mediaAuthorization);
- }
- else
- {
- CleanupStack::PopAndDestroy(mediaAuthorization);
- }
-
- if ( KErrNone == ret )
- {
- //
- if ( RPacketContext::EStatusUnknown != ContextStatus() &&
- RPacketContext::EStatusInactive != ContextStatus() )
- {
- // request must complete to client
- CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
- }
-
- // else operation is context configuration and complete method
- // handles request complete
- else
- {
- // Store the request handle type
- iReqHandleType = EMultimodePacketContextAddMediaAuthorization;
- }
- }
- }
- return ret;
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::RemoveMediaAuthorization
-// Makes request for removing authorization params to licensee tsy
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::RemoveMediaAuthorization(
- const TTsyReqHandle aTsyReqHandle,
- RPacketContext::TAuthorizationToken* const aAuthorizationToken )
- {
- TInt ret( KErrGeneral );
-
- //Can be done only for secondary context
- if ( 0 < iHostCID.Length() )
- {
-
- ret = iMmPacketContextGsmWcdmaExt->RemoveMediaAuthorization(
- aAuthorizationToken );
-
- }
-
- CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, ret );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::ContextType
-// return the context type
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CMmPacketContextTsy::TPacketContextType CMmPacketContextTsy::ContextType() const
-{
- return EContextTypePacketContext;
-}
-
-#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::GetConnectionInfo
-// Gets the current connection information.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::GetConnectionInfo(
- const TTsyReqHandle aTsyReqHandle,
- TConnectionInfoBase* const aInfo )
- {
-TFLOGSTRING2( "TSY: CMmPacketContextTsy::GetConnectionInfo. Context name:%S", &iContextName );
-
- // Get config
- TInt ret = FillConnectionInfo( aInfo );
-
- // Complete Request
- CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, ret );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::NotifyConnectionInfoChange
-// Requests notification when connection information changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::NotifyConnectionInfoChange(
- TConnectionInfoBase* const aInfo )
- {
-TFLOGSTRING( "TSY: CMmPacketContextTsy::NotifyConnectionInfoChange." );
-
- // Store pointer
- iRetNotifyConnectionInfo = aInfo;
- // Store req handle type
- iReqHandleType = EMultimodePacketContextNotifyConnectionInfoChange;
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::CompleteNotifyConnectionInfoChange
-// Complete notification when the connection information changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmPacketContextTsy::CompleteNotifyConnectionInfoChange(
- TConnectionInfoBase* const aInfo )
- {
-TFLOGSTRING( "TSY: CMmPacketContextTsy::CompleteNotifyConnectionInfoChange." );
-
- if ( NULL != aInfo &&
- TConnectionInfoBase::KConnectionInfoV1 == aInfo->ExtensionId() )
- {
- RPacketContext::TConnectionInfoV1 connectionInfoV1;
- connectionInfoV1 = *( static_cast<RPacketContext::TConnectionInfoV1*>( aInfo ) );
-
- //Check if connection info has changed
- if ( iConnectionInfo.iHSDPACategory != connectionInfoV1.iHSDPACategory ||
- iConnectionInfo.iHSUPACategory != connectionInfoV1.iHSUPACategory ||
- iConnectionInfo.iValid != connectionInfoV1.iValid )
- {
- //Set new connection info
- iConnectionInfo = connectionInfoV1;
-
- //Get req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
- EMultimodePacketContextNotifyConnectionInfoChange );
-
- if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
- {
- // Fill current connection information
- TInt ret = FillConnectionInfo( iRetNotifyConnectionInfo );
-
- if ( KErrNone == ret )
- {
- //reset req handle
- iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodePacketContextNotifyConnectionInfoChange );
- // Null ret pointer
- iRetNotifyConnectionInfo = NULL;
- // Complete the client request
- CMmPacketContextTsy::ReqCompleted( reqHandle, KErrNone );
- }
- }
- }
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmPacketContextTsy::FillConnectionInfo
-// Fills the current connection information to TConnectionInfoXXX structure.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmPacketContextTsy::FillConnectionInfo(
- TConnectionInfoBase* const aInfo )
- {
-TFLOGSTRING( "TSY: CMmPacketContextTsy::FillConnectionInfo" );
-
- TInt ret = KErrNone;
-
- if ( NULL != aInfo &&
- TConnectionInfoBase::KConnectionInfoV1 == aInfo->ExtensionId() )
- {
- //Set connection info to ETel side memory
- *( static_cast<RPacketContext::TConnectionInfoV1*>( aInfo ) ) = iConnectionInfo;
- }
- else
- {
- ret = KErrArgument;
- }
-
- return ret;
- }
-#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
-// End of File
+// Copyright (c) 2006-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 FILES
+#include "Cmmpacketcontexttsy.h"
+#include "Cmmpacketcontextlist.h"
+#include "cmmpacketservicegsmwcdmaext.h"
+#include "CMmPacketTsy.h"
+#include <ctsy/tflogger.h>
+#include "MmTsy_timeoutdefs.h"
+#include "MmTsy_numberOfSlots.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+CMmPacketContextTsy::CMmPacketContextTsy():
+ iReqHandleType(EMultimodePacketContextReqHandleUnknown)
+ {
+ }
+
+CMmPacketContextTsy* CMmPacketContextTsy::NewL(
+ CMmPacketServiceTsy* const aMmPacketService,
+ const TInfoName& aHostCID,
+ const TDes& aName,
+ const TUint8 aProxyId )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::NewL. Context name:%S", &aName );
+
+ CMmPacketContextTsy* packetContext = new ( ELeave ) CMmPacketContextTsy();
+
+ CleanupClosePushL( *packetContext );
+ packetContext->iMmPacketService = aMmPacketService;
+ packetContext->iContextName = aName;
+ packetContext->iProxyId = aProxyId;
+ packetContext->iHostCID = aHostCID;
+ packetContext->ConstructL();
+ CleanupStack::Pop();
+
+ return packetContext;
+ }
+
+void CMmPacketContextTsy::ConstructL()
+ {
+ InitModulesL();
+ InitInternalAttributes();
+ }
+
+CMmPacketContextTsy::~CMmPacketContextTsy()
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::~CMmPacketContextTsy. Context name: %S", &iContextName );
+
+ if( iMmPacketService )
+ {
+
+ iMmPacketService->PacketContextList()->RemoveObject( this );
+
+ // Set Dynamic Caps
+ iMmPacketService->ActivePacketServiceExtension()->SetDynamicCapsFlag(
+ RPacketService::KCapsActivate, EFalse );
+
+ if ( iIsDialUpContext )
+ {
+ iMmPacketService->ResetPointerToDialUpContext( iContextName );
+ }
+
+ }
+
+ delete iMmPacketContextGsmWcdmaExt;
+ delete iTsyReqHandleStore;
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::InitModulesL
+// Initialises extension modules for CMmPacketContextTsy
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::InitModulesL()
+ {
+
+ iMmPacketContextGsmWcdmaExt =
+ CMmPacketContextGsmWcdmaExt::NewL( this, iMmPacketService );
+
+#ifdef REQHANDLE_TIMER
+ // Create req handle store
+ iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this,
+ iMmPacketService->PhoneTsy(), EMaxNumOfPacketContextRequests,
+ iPacketContextReqHandles );
+
+#else
+ // Create req handle store
+ iTsyReqHandleStore = CMmTsyReqHandleStore::NewL(
+ EMaxNumOfPacketContextRequests, iPacketContextReqHandles );
+
+#endif // REQHANDLE_TIMER
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::InitInternalAttributes
+// Initialises miscellaneous internal attributes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::InitInternalAttributes()
+ {
+ iQoSProfile = NULL;
+ iQoSProfileName.Zero();
+
+ iLastErrorCause = KErrNone;
+ iContextStatus = RPacketContext::EStatusUnknown;
+ iContextStatusBeforeSuspending = RPacketContext::EStatusUnknown;
+ iConnectionSpeed = 0;
+ iNotifyConnectionSpeed = 0;
+ iIsDialUpContext = EFalse;
+
+ if ( iContextName.Compare( KStringExternal )== 0
+ || iContextName.Compare( KStringExternal2 )== 0 )
+ {
+ iIsDialUpContext = ETrue;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::Init
+// Initialisation method that is called from ETel Server.
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::Init()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::ExtFunc
+// TRAP's all CMmPacketContextTsy related MM Packet API requests in case that
+// they fail. This method functions only as a centralized TRAP for the
+// DoExtFuncL method that does the actual mapping of IPC number to TSY method
+// call.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::ExtFunc(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aIpc,
+ const TDataPackage& aPackage )
+ {
+TFLOGSTRING3( "TSY: CMmPacketContextTsy::ExtFunc. IPC: %d Context name:%S", aIpc, &iContextName );
+
+ TInt ret( KErrNone );
+ TInt trapError( KErrNone );
+
+#ifdef ADD_REMOVE_PACKETFILTER_DEFECT_FIXED // search for this up from bottom of file
+ // Ensure the ReqHandleType is unset.
+ // This will detect cases where this method indirectly calls itself
+ // (e.g. servicing a client call that causes a self-reposting notification to complete and thus repost).
+ // Such cases are not supported because iReqHandleType is in the context of this class instance,
+ // not this request, and we don't want the values set by the inner request and the outer request
+ // interfering with each other.
+ __ASSERT_DEBUG(iReqHandleType==EMultimodePacketContextReqHandleUnknown, User::Invariant());
+#else
+ // Reset last tsy request type
+ iReqHandleType = EMultimodePacketContextReqHandleUnknown;
+#endif
+
+ // Trap the call of DoExtFuncL
+ TRAP( trapError, ret = DoExtFuncL( aTsyReqHandle, aIpc, aPackage ) );
+
+ if ( KErrNone != trapError )
+ {
+ ReqCompleted( aTsyReqHandle, trapError );
+ }
+
+ else if ( KErrNone != ret )
+ {
+ ReqCompleted( aTsyReqHandle, ret );
+ }
+
+ if ( EMultimodePacketContextReqHandleUnknown != iReqHandleType )
+ {
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( iReqHandleType, aTsyReqHandle );
+#else
+ iTsyReqHandleStore->SetTsyReqHandle( iReqHandleType, aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+#ifdef ADD_REMOVE_PACKETFILTER_DEFECT_FIXED // search for this up from bottom of file
+ // We've finished with this value now. Clear it so it doesn't leak
+ // up to any other instances of this method down the call stack
+ iReqHandleType = EMultimodePacketContextReqHandleUnknown;
+#endif
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::DoExtFuncL
+// Packet Data specific functionality of CMmPacketContextTsy::ExtFunc
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::DoExtFuncL(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aIpc,
+ const TDataPackage& aPackage )
+ {
+TFLOGSTRING3( "TSY: CMmPacketContextTsy::DoExtFuncL. IPC: %d Handle:%d",
+ aIpc, aTsyReqHandle );
+
+ TInt ret( KErrNotSupported );
+
+ TAny* dataPtr = aPackage.Ptr1();
+ TAny* dataPtr2 = aPackage.Ptr2();
+
+ switch ( aIpc )
+ {
+ case EPacketContextNotifyStatusChange:
+ ret = NotifyStatusChange(
+ REINTERPRET_CAST( RPacketContext::TContextStatus*, dataPtr ) );
+ break;
+ case EPacketContextNotifyConfigChanged:
+ ret = NotifyConfigChanged(
+ REINTERPRET_CAST( TPacketDataConfigBase*, dataPtr ) );
+ break;
+ case EPacketContextNotifyConnectionSpeedChange:
+ ret = NotifyConnectionSpeedChange(
+ REINTERPRET_CAST( TUint*, dataPtr ) );
+ break;
+ case EPacketContextInitialiseContext:
+ {
+ TDes8* paramData = aPackage.Des1n();
+
+ if(paramData != NULL)
+ {
+ if(sizeof(RPacketContext::TDataChannelV2) > paramData->MaxLength())
+ {
+ ret = KErrArgument;
+ }
+ else
+ {
+ ret = InitialiseContextL( reinterpret_cast< RPacketContext::TDataChannelV2*>( dataPtr ));
+ }
+ }
+ else
+ {
+ ret = KErrArgument;
+ }
+ break;
+ }
+ case EPacketContextSetConfig:
+ ret = SetConfigL(
+ REINTERPRET_CAST( TPacketDataConfigBase*, dataPtr ) );
+ break;
+ case EPacketContextActivate:
+ ret = ActivateL();
+ break;
+ case EPacketContextDeactivate:
+ ret = DeactivateL();
+ break;
+ case EPacketContextDelete:
+ ret = DeleteL();
+ break;
+ case EPacketContextGetStatus:
+ ret = GetStatus( aTsyReqHandle,
+ REINTERPRET_CAST( RPacketContext::TContextStatus*, dataPtr ) );
+ break;
+ case EPacketContextGetConfig:
+ ret = GetConfig( aTsyReqHandle,
+ REINTERPRET_CAST( TPacketDataConfigBase*, dataPtr ) );
+ break;
+ case EPacketContextGetProfileName:
+ ret = GetProfileName( aTsyReqHandle,
+ REINTERPRET_CAST( TInfoName*, dataPtr ) );
+ break;
+ case EPacketContextGetConnectionSpeed:
+ ret = GetConnectionSpeed( aTsyReqHandle,
+ REINTERPRET_CAST( TUint*, dataPtr ) );
+ break;
+ case EPacketContextGetLastErrorCause:
+ ret = GetLastErrorCause( aTsyReqHandle,
+ REINTERPRET_CAST( TInt*, dataPtr ) );
+ break;
+ case EPacketContextGetDataVolumeTransferred:
+ ret = GetDataVolumeTransferredL( aTsyReqHandle,
+ REINTERPRET_CAST( RPacketContext::TDataVolume*, dataPtr ) );
+ break;
+ case EPacketContextEnumeratePacketFilters:
+ ret = EnumeratePacketFilters( aTsyReqHandle,
+ REINTERPRET_CAST( TInt*, dataPtr ) );
+ break;
+ case EPacketContextGetPacketFilterInfo:
+ {
+ TDes8* paramData = aPackage.Des2n();
+
+ if (paramData)
+ {
+ TInt paramLength = paramData->MaxLength();
+
+ RPacketContext::TPacketFilterV2 temp;
+ RPacketContext::TPacketFilterV2Pckg tempPckg(temp);
+
+ TInt expectedLength = tempPckg.MaxLength();
+
+ if (paramLength == expectedLength)
+ {
+ ret = GetPacketFilterInfo( aTsyReqHandle, REINTERPRET_CAST( TInt*, dataPtr ), REINTERPRET_CAST( TPacketBase*, dataPtr2 ) );
+ }
+ else
+ {
+ ret = KErrArgument;
+ }
+ }
+ else
+ {
+ ret = KErrArgument;
+ }
+
+ }
+ break;
+ case EPacketContextAddPacketFilter:
+ ret = AddPacketFilterL( aTsyReqHandle, aPackage.Des1n() );
+ break;
+ case EPacketContextRemovePacketFilter:
+#ifdef USING_CTSY_DISPATCHER
+ ret = RemovePacketFilter( REINTERPRET_CAST( TInt*, dataPtr ) );
+#else
+ ret = RemovePacketFilter( aTsyReqHandle,
+ REINTERPRET_CAST( TInt*, dataPtr ) );
+#endif
+ break;
+ case EPacketContextModifyActiveContext:
+ ret = ModifyActiveContextL();
+ break;
+ case EPacketContextGetDNSInfo:
+ ret = GetDnsInfo( aTsyReqHandle, aPackage.Des1n() );
+ break;
+ case EPacketAddMediaAuthorization:
+ ret = AddMediaAuthorizationL( aTsyReqHandle, aPackage.Des1n() );
+ break;
+ case EPacketRemoveMediaAuthorization:
+ ret = RemoveMediaAuthorization( aTsyReqHandle,
+ REINTERPRET_CAST( RPacketContext::TAuthorizationToken*,
+ dataPtr ) );
+ break;
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ case EPacketContextGetConnectionInfo:
+ ret = GetConnectionInfo( aTsyReqHandle,
+ reinterpret_cast<TConnectionInfoBase*>( dataPtr ) );
+ break;
+ case EPacketContextNotifyConnectionInfoChange:
+ ret = NotifyConnectionInfoChange(
+ reinterpret_cast<TConnectionInfoBase*>( dataPtr ) );
+ break;
+#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ // These requests currently not supported
+ //case EPacketContextLoanCommPort:
+ //case EPacketContextRecoverCommPort:
+ //case EPacketContextNotifyDataTransferred:
+ default:
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::ReqModeL
+// Returns request mode for given IPC.
+// ---------------------------------------------------------------------------
+//
+CTelObject::TReqMode CMmPacketContextTsy::ReqModeL(
+ const TInt aIpc )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::ReqModeL. IPC: %d", aIpc );
+
+ CTelObject::TReqMode reqMode( 0 );
+ TBool doLeave( EFalse );
+
+ switch ( aIpc )
+ {
+ // All disabled
+ // TSYs wishing to implement their own buffering algorithm will place
+ // all requests in this category.
+
+ // Get methods that do not use DOS and return immediately.
+ // Flow control not required.
+ case EPacketContextGetConnectionSpeed:
+ case EPacketContextGetLastErrorCause:
+ case EPacketContextGetProfileName:
+ case EPacketContextEnumeratePacketFilters:
+ case EPacketContextGetPacketFilterInfo:
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ case EPacketContextGetConnectionInfo:
+#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+
+ // Other methods that do not use DOS and return immediately.
+ // Flow control not required.
+
+ // Methods that can propably take a long time and cannot therefore be
+ // flow controlled. Solution: All these methods must check req handle
+ // table before handling the request. In case that the request table
+ // indicates that same method has been called and has not been
+ // completed, the method should return KErrServerBusy.
+ if ( iIsDialUpContext )
+ {
+ doLeave = ETrue;
+ break;
+ }
+ case EPacketContextGetStatus:
+ case EPacketContextGetConfig:
+ break;
+
+ // KReqModeFlowControlObeyed
+ // Commands that change the state of the phone, e.g. clearing the AoC
+ // counter, are commands that the TSY should only deal with one at
+ // a time.
+
+ case EPacketContextInitialiseContext:
+ case EPacketContextActivate:
+ case EPacketContextDelete:
+ case EPacketContextSetConfig:
+ case EPacketContextAddPacketFilter:
+ case EPacketContextRemovePacketFilter:
+ case EPacketContextModifyActiveContext:
+ case EPacketContextGetDNSInfo:
+ case EPacketAddMediaAuthorization:
+ case EPacketRemoveMediaAuthorization:
+ if ( iIsDialUpContext )
+ {
+ doLeave = ETrue;
+ break;
+ }
+ case EPacketContextDeactivate:
+ case EPacketContextGetDataVolumeTransferred:
+
+ {
+ reqMode = KReqModeFlowControlObeyed;
+ break;
+ }
+
+ // KReqModeMultipleCompletionEnabled | ReqModePostImmediately
+ // Requests that notify a client about a change of state.
+ // Since these requests do not require the issuing of any modem
+ // commands, they do not have to obey flow control.
+ // The TSY never gets more than one of these outstanding.
+ case EPacketContextNotifyConfigChanged:
+ case EPacketContextNotifyConnectionSpeedChange:
+ if ( iIsDialUpContext )
+ {
+ doLeave = ETrue;
+ break;
+ }
+ case EPacketContextNotifyStatusChange:
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ case EPacketContextNotifyConnectionInfoChange:
+#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ reqMode = KReqModeMultipleCompletionEnabled |
+ KReqModeRePostImmediately;
+ break;
+
+ // Cancel Requests
+ // It's not necessary to include the Cancel methods in ReqModeL at all.
+ // The ETel server never calls ReqModeL with a Cancel IPC.
+
+ // Other variations of return values are unusable.
+ // Following requests are not supported
+ //case EPacketContextNotifyDataTransferred:
+ //case EPacketContextLoanCommPort:
+ //case EPacketContextRecoverCommPort:
+ // Default
+ default:
+ doLeave = ETrue;
+ break;
+ }
+
+ if ( doLeave )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ return reqMode;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::NumberOfSlotsL
+// Returns number of slots to be used for given IPC.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::NumberOfSlotsL(
+ const TInt aIpc )
+ {
+ TInt numberOfSlots( 0 );
+
+ switch ( aIpc )
+ {
+ case EPacketContextNotifyStatusChange:
+ numberOfSlots = KMmPacketContextNotifyStatusChangeSlots;
+ break;
+ case EPacketContextNotifyConfigChanged:
+ numberOfSlots = KMmPacketContextNotifyConfigChangedSlots;
+ break;
+ case EPacketContextNotifyConnectionSpeedChange:
+ numberOfSlots = KMmPacketContextNotifyConnectionSpeedChangeSlots;
+ break;
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ case EPacketContextNotifyConnectionInfoChange:
+ numberOfSlots = KMmPacketContextNotifyConnectionInfoChangeSlots;
+ break;
+#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ default:
+ // Unknown or invalid IPC
+ User::Leave( KErrNotSupported );
+ break;
+
+ }
+TFLOGSTRING3( "TSY: CMmPacketContextTsy::NumberOfSlotsL. IPC: %d Number of slots: %d",
+ aIpc, numberOfSlots );
+
+ return numberOfSlots;
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::CancelService
+// Cancel the outstanding request.ETel Server when it is "cleaning-up" any
+// outstanding asynchronous requests before closing a client's sub-session.
+// This will happen if a client closes its R-class handle without cancelling
+// outstanding asynchronous requests. Only Packet API requests are handled
+// here. Client can also cancel a request by calling CancelAsyncRequest
+// (defined in etel.h). The ETel server passes this kind of cancel requests
+// to CancelService.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::CancelService(
+ const TInt aIpc,
+ const TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING3( "TSY: CMmPacketContextTsy::CancelService. IPC: %d Handle:%d",
+ aIpc, aTsyReqHandle );
+
+ TInt ret( KErrNone );
+ TTsyReqHandle reqHandle( NULL );
+
+#ifdef ADD_REMOVE_PACKETFILTER_DEFECT_FIXED // search for this up from bottom of file
+ // Ensure the ReqHandleType is unset.
+ // This will detect cases where this method indirectly calls itself
+ // (e.g. servicing a client call that causes a self-reposting notification to complete and thus repost).
+ // Such cases are not supported because iReqHandleType is in the context of this class instance,
+ // not this request, and we don't want the values set by the inner request and the outer request
+ // interfering with each other.
+ __ASSERT_DEBUG(iReqHandleType==EMultimodePacketContextReqHandleUnknown, User::Invariant());
+#else
+ // Reset last tsy request type
+ iReqHandleType = EMultimodePacketContextReqHandleUnknown;
+#endif
+
+ switch ( aIpc )
+ {
+ // TSY has started a request and it is not possible to then cancel
+ // this request. The best thing for the TSY to do in this case is to
+ // proceed as though the Cancel never happened. The server's call to
+ // the TSY cancel function will return synchronously. The TSY then
+ // continues to wait for the original acknowledgement and when it
+ // receives it, the TSY will complete the original request.
+ case EPacketContextInitialiseContext:
+ case EPacketContextActivate:
+ case EPacketContextDeactivate:
+ case EPacketContextDelete:
+ case EPacketContextSetConfig:
+ case EPacketContextGetConfig:
+ case EPacketContextGetConnectionSpeed:
+ case EPacketContextGetDataVolumeTransferred:
+ case EPacketContextEnumeratePacketFilters:
+ case EPacketContextGetPacketFilterInfo:
+ case EPacketContextAddPacketFilter:
+ case EPacketContextRemovePacketFilter:
+ case EPacketContextModifyActiveContext:
+ case EPacketContextGetDNSInfo:
+ case EPacketAddMediaAuthorization:
+ case EPacketRemoveMediaAuthorization:
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ case EPacketContextGetConnectionInfo:
+#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ break;
+ // Notification Cancels, no special requirements.
+ case EPacketContextNotifyStatusChange:
+ iRetNotifyStatus = NULL;
+ iReqHandleType = EMultimodePacketContextNotifyStatusChange;
+ break;
+ case EPacketContextNotifyConfigChanged:
+ reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
+ EMultimodePacketContextNotifyConfigChanged );
+ if ( aTsyReqHandle == reqHandle )
+ {
+ iRetNotifyConfig = NULL;
+ iReqHandleType = EMultimodePacketContextNotifyConfigChanged;
+ }
+ else
+ {
+ reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
+ EMultimodePacketContextNotifyConfigChanged99 );
+ if ( aTsyReqHandle == reqHandle )
+ {
+ iRetNotifyConfig2 = NULL;
+ iReqHandleType =
+ EMultimodePacketContextNotifyConfigChanged99;
+ }
+ }
+ break;
+ case EPacketContextNotifyConnectionSpeedChange:
+ iRetNotifyConnectionSpeed = NULL;
+ iReqHandleType =
+ EMultimodePacketContextNotifyConnectionSpeedChange;
+ break;
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ case EPacketContextNotifyConnectionInfoChange:
+ iRetNotifyConnectionInfo = NULL;
+ iReqHandleType =
+ EMultimodePacketContextNotifyConnectionInfoChange;
+ break;
+#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ // IPCs that are not supported
+ //case EPacketContextLoanCommPort:
+ //case EPacketContextRecoverCommPort:
+ //case EPacketContextNotifyDataTransferred:
+ // Default
+ default:
+ ret = KErrNotSupported;
+ break;
+ }
+
+ if ( EMultimodePacketContextReqHandleUnknown != iReqHandleType )
+ {
+ // Reset tsy request handle
+ iTsyReqHandleStore->ResetTsyReqHandle( iReqHandleType );
+
+ // Complete request
+ CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrCancel );
+#ifdef ADD_REMOVE_PACKETFILTER_DEFECT_FIXED // search for this up from bottom of file
+ // We've finished with this value now. Clear it so it doesn't leak
+ // up to any other instances of this method down the call stack
+ iReqHandleType = EMultimodePacketContextReqHandleUnknown;
+#endif
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::RegisterNotification
+// Register notification. RegisterNotification is called when the ETel Server
+// recognises that this notification is being posted for the first time on
+// this subsession object.It enables the TSY to "turn on" any regular
+// notification messages that it may receive from DOS. If this object is
+// Dial-Up context only supported notification is
+// EPacketContextNotifyStatusChange.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::RegisterNotification(
+ const TInt aIpc )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::RegisterNotification. IPC: %d", aIpc );
+
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ case EPacketContextNotifyConfigChanged:
+ case EPacketContextNotifyConnectionSpeedChange:
+ if ( iIsDialUpContext )
+ {
+ ret = KErrNotSupported;
+ break;
+ }
+ case EPacketContextNotifyStatusChange:
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ case EPacketContextNotifyConnectionInfoChange:
+#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ break;
+ //case EPacketContextNotifyDataTransferred:
+ default:
+ // Not supported
+ ret = KErrNotSupported;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::DeregisterNotification
+// Deregister notification. DeregisterNotification is called when the ETel
+// Server recognises that this notification will not be posted again because
+// the last client to have a handle on this sub-session object has just closed
+// the handle. It enables the TSY to "turn off" any regular notification
+// messages that it may receive from DOS. If this object is Dial-Up context
+// only supported notification is EPacketContextNotifyStatusChange.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::DeregisterNotification(
+ const TInt aIpc )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::DeregisterNotification. IPC: %d", aIpc );
+
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ case EPacketContextNotifyConfigChanged:
+ case EPacketContextNotifyConnectionSpeedChange:
+ if ( iIsDialUpContext )
+ {
+ ret = KErrNotSupported;
+ break;
+ }
+ case EPacketContextNotifyStatusChange:
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ case EPacketContextNotifyConnectionInfoChange:
+#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+ break;
+ //case EPacketContextNotifyDataTransferred:
+ default:
+ // Not supported
+ ret = KErrNotSupported;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::OpenNewObjectL
+// Create new QoS object and return a pointer to it.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmPacketContextTsy::OpenNewObjectL(
+ TDes& aNewName )
+ {
+TFLOGSTRING( "TSY: CMmPacketContextTsy::OpenNewObjectL." );
+
+ // Each context can have only one QoS
+ if ( NULL != iQoSProfile )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::OpenNewObjectL. Leaves with: %d", KErrAlreadyExists );
+ User::Leave( KErrAlreadyExists );
+ }
+
+ else
+ {
+ // Create new QoS object
+ iQoSProfile = CMmPacketQoSTsy::NewL( iMmPacketService, this );
+
+ iQoSProfileName.Copy( iContextName );
+ aNewName.Copy( iQoSProfileName );
+ }
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::OpenNewObjectL. aNewName: %S", &aNewName );
+
+ return iQoSProfile;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::OpenNewObjectByNameL
+// Return a pointer to QoS if it exists. The ETel Server calls this method
+// after some client has requested to open existing QoS object. The TSY
+// classes must not use this method.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CTelObject* CMmPacketContextTsy::OpenNewObjectByNameL(
+ const TDesC& aName )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::OpenNewObjectByNameL. aName: %S", &aName );
+
+ if ( aName != iQoSProfileName )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::OpenNewObjectByNameL. Leaves with: %d", KErrNotFound );
+ User::Leave( KErrNotFound );
+ }
+
+ return iQoSProfile;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::InitialiseContextL
+// This function initialises the context created previously.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::InitialiseContextL(RPacketContext::TDataChannelV2* aDataChannel )
+ {
+TFLOGSTRING( "TSY: CMmPacketContextTsy::InitialiseContextL." );
+
+ TInt ret( KErrNone );
+
+ // Initialise Context
+ ret = iMmPacketContextGsmWcdmaExt->InitialiseContextL(aDataChannel);
+
+ if ( KErrNone == ret )
+ {
+ // Store the request handle
+ iReqHandleType = EMultimodePacketContextInitialiseContext;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::CompleteInitialiseContext
+// Complete the asynchronous InitialiseContext request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::CompleteInitialiseContext(const TInt aResult )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteInitialiseContext. Error: %d", aResult );
+
+ // Reset the req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePacketContextInitialiseContext );
+
+ if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
+ {
+ // Complete the client request
+ CMmPacketContextTsy::ReqCompleted( reqHandle, aResult );
+ }
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::ActivateL
+// Activate a context. This function activates a context that has been
+// previously configured using the SetConfig() method from RPacketContext.
+// 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'.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::ActivateL()
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::ActivateL. Context name:%S", &iContextName );
+
+ TInt ret( KErrGprsServicesNotAllowed );
+
+ if ( iMmPacketService->IsActivationAllowed() )
+ {
+ // Call ActivateL
+ ret = iMmPacketContextGsmWcdmaExt->ActivateL();
+ }
+
+ if ( KErrNone == ret )
+ {
+ // Store the request handle
+ iReqHandleType = EMultimodePacketContextActivate;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::CompleteActivate
+// Complete the asynchronous Activate request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::CompleteActivate(
+ const TInt aResult )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteActivate. Error: %d", aResult );
+ // Reset the req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePacketContextActivate );
+
+ if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
+ {
+
+ // Complete the client request
+ CMmPacketContextTsy::ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::Deactivate
+// Deactivate a context previously configured on the phone.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::DeactivateL()
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::DeactivateL. Context name:%S", &iContextName );
+ TInt ret( KErrNone );
+
+ // Call Deactivate
+ ret = iMmPacketContextGsmWcdmaExt->DeactivateL();
+
+ if ( KErrNone == ret )
+ {
+ // Store the request handle
+ iReqHandleType = EMultimodePacketContextDeactivate;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::CompleteDeactivate
+// Complete the asynchronous Deactivate request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::CompleteDeactivate(
+ const TInt aResult )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteDeactivate. Error: %d", aResult );
+ // Reset the req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePacketContextDeactivate );
+
+ if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
+ {
+
+ // Complete the client request
+ CMmPacketContextTsy::ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::DeleteL
+// Delete a context id previously created on the phone.
+// Note that although the context is considered as 'deleted', the
+// client's RPacketContext subsession remains. To remove this, a client must
+// call Close() from RPacketContext.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::DeleteL()
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::DeleteL. Context name:%S", &iContextName );
+
+ TInt ret( KErrNone );
+
+ // Call DeleteL
+ ret = iMmPacketContextGsmWcdmaExt->DeleteL();
+
+ if ( KErrNone == ret )
+ {
+ // Store the request handle
+ iReqHandleType = EMultimodePacketContextDelete;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::CompleteDelete
+// Complete the asynchronous Delete request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::CompleteDelete(
+ const TInt aResult )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteDelete. Error: %d", aResult );
+ // Reset the req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePacketContextDelete );
+
+ if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
+ {
+ // Complete the client request
+ CMmPacketContextTsy::ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::GetConfig
+// Requests the current configuration of the context.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::GetConfig(
+ const TTsyReqHandle aTsyReqHandle,
+ TPacketDataConfigBase* const aConfig )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::GetConfig. Context name:%S", &iContextName );
+
+ // Get config
+ TInt ret = iMmPacketContextGsmWcdmaExt->GetConfig( aConfig );
+
+ // Complete Request
+ CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, ret );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::GetConnectionSpeed
+// Allows a client to get the current connection speed.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::GetConnectionSpeed(
+ const TTsyReqHandle aTsyReqHandle,
+ TUint* const aRate )
+ {
+TFLOGSTRING3( "TSY: CMmPacketContextTsy::GetConnectionSpeed. Context name: %S Connection Speed:%d bps",
+ &iContextName, iConnectionSpeed );
+
+ // Get current connection speed rate
+ *aRate = iConnectionSpeed;
+
+ // Complete Request
+ CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::GetDataVolumeTransferred
+// This function gets the data volume transferred.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::GetDataVolumeTransferredL(
+ const TTsyReqHandle aTsyReqHandle,
+ RPacketContext::TDataVolume* const aVolume )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::GetDataVolumeTransferredL. Context name:%S", &iContextName );
+
+ TInt ret( KErrNone );
+
+ if ( RPacketContext::EStatusDeleted != iContextStatus )
+ {
+ // Get data volume transferred
+ ret = iMmPacketContextGsmWcdmaExt->GetDataVolumeTransferredL();
+
+ if ( KErrNone == ret )
+ {
+ // Store pointer
+ iRetDataVolume = aVolume;
+ // Store the request handle type
+ iReqHandleType = EMultimodePacketContextGetDataVolumeTransferred;
+ }
+ }
+ else
+ {
+ // Get current data volume
+ *aVolume = iDataVolume;
+ // Complete request
+ CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::CompleteGetDataVolumeTransferred
+// Complete the asynchronous GetDataVolumeTransferred request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::CompleteGetDataVolumeTransferred(
+ const TInt aResult )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteGetDataVolumeTransferred. Error: %d", aResult );
+
+ // Reset the req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePacketContextGetDataVolumeTransferred );
+
+ if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
+ {
+
+ if ( KErrNone == aResult )
+ {
+ *iRetDataVolume = iDataVolume;
+ }
+
+ // Null ret pointer
+ iRetDataVolume = NULL;
+
+ // Complete the client request
+ CMmPacketContextTsy::ReqCompleted( reqHandle, aResult );
+ }
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::GetLastErrorCause
+// This function retrieves the last error cause to have occurred.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::GetLastErrorCause(
+ const TTsyReqHandle aTsyReqHandle,
+ TInt* const aError )
+ {
+TFLOGSTRING3( "TSY: CMmPacketContextTsy::GetLastErrorCause. Context name:%S Last error cause: %d",
+ &iContextName, iLastErrorCause );
+
+ *aError = iLastErrorCause;
+ CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::GetProfileName
+// Allows a client to retrieve the name of the QoS profile. The QoS profile is
+// associated with the context. If no QoS profile has been defined by the
+// client, the name to be returned will be NULL.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::GetProfileName(
+ const TTsyReqHandle aTsyReqHandle,
+ TInfoName* const aQoSProfile )
+ {
+ if ( NULL != iQoSProfile )
+ {
+ *aQoSProfile = iQoSProfileName;
+ }
+ else
+ {
+ // QoS profile not found
+ aQoSProfile->Zero();
+ }
+
+TFLOGSTRING3( "TSY: CMmPacketContextTsy::GetProfileName. Context name: %S QoS Profile Name: %S",
+ &iContextName, aQoSProfile );
+
+ CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::GetStatus
+// Allows a client to get the current status of the context.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::GetStatus(
+ const TTsyReqHandle aTsyReqHandle,
+ RPacketContext::TContextStatus* const aContextStatus )
+ {
+TFLOGSTRING3( "TSY: CMmPacketContextTsy::GetStatus. Context name: %S Context Status:%d",
+ &iContextName, iContextStatus );
+ *aContextStatus = iContextStatus;
+ CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::NotifyConfigChanged
+// Requests notification when configuration of context changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::NotifyConfigChanged(
+ TPacketDataConfigBase* const aConfig )
+ {
+TFLOGSTRING( "TSY: CMmPacketContextTsy::NotifyConfigChanged." );
+
+ // Call NotifyConfigChanged from extension
+ TInt ret = iMmPacketContextGsmWcdmaExt->NotifyConfigChanged( *aConfig );
+
+ if ( KErrNone == ret )
+ {
+ if ( TPacketDataConfigBase::KConfigGPRS == aConfig->ExtensionId() )
+ {
+ // Store pointer
+ iRetNotifyConfig = aConfig;
+ // Store req handle type
+ iReqHandleType = EMultimodePacketContextNotifyConfigChanged;
+ }
+
+ else
+ {
+ // Store pointer
+ iRetNotifyConfig2 = aConfig;
+ // Store req handle type
+ iReqHandleType = EMultimodePacketContextNotifyConfigChanged99;
+ }
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::CompleteNotifyConfigChanged
+// Complete notification when the context configuration changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::CompleteNotifyConfigChanged()
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteNotifyConfigChanged. Context name:%S",
+ &iContextName );
+
+ // Get and reset req handle for R97/98 config notify
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePacketContextNotifyConfigChanged );
+
+ if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
+ {
+ // Get current configuration
+ iMmPacketContextGsmWcdmaExt->GetConfig( iRetNotifyConfig );
+ // Null ret pointer
+ iRetNotifyConfig = NULL;
+ // Complete the client request
+ CMmPacketContextTsy::ReqCompleted( reqHandle, KErrNone );
+ }
+
+ // Get and reset req handle for R99_R4 config notify
+ reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePacketContextNotifyConfigChanged99 );
+
+ if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
+ {
+ // Get current configuration
+ iMmPacketContextGsmWcdmaExt->GetConfig( iRetNotifyConfig2 );
+ // Null ret pointer
+ iRetNotifyConfig2 = NULL;
+ // Complete the client request
+ CMmPacketContextTsy::ReqCompleted( reqHandle, KErrNone );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::NotifyConnectionSpeedChange
+// Requests notification when connection speed changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::NotifyConnectionSpeedChange(
+ TUint* const aRate )
+ {
+TFLOGSTRING( "TSY: CMmPacketContextTsy::NotifyConnectionSpeedChange." );
+
+ // Store pointer
+ iRetNotifyConnectionSpeed = aRate;
+ // Store req handle type
+ iReqHandleType = EMultimodePacketContextNotifyConnectionSpeedChange;
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::CompleteNotifyConnectionSpeedChange
+// Complete the notification when the connection speed changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::CompleteNotifyConnectionSpeedChange(
+ TInt const aConnectionSpeed )
+ {
+ iConnectionSpeed = aConnectionSpeed;
+
+ if ( iNotifyConnectionSpeed != iConnectionSpeed )
+ {
+TFLOGSTRING3( "TSY: CMmPacketContextTsy::CompleteNotifyConnectionSpeedChange. Context name:%S Connection Speed:%d bps",
+ &iContextName, iConnectionSpeed );
+
+ // Store the connection speed internally
+ iNotifyConnectionSpeed = iConnectionSpeed;
+
+ // Get and reset req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePacketContextNotifyConnectionSpeedChange );
+
+ if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
+ {
+ // Get current connection speed
+ *iRetNotifyConnectionSpeed = iNotifyConnectionSpeed;
+ // Null ret pointer
+ iRetNotifyConnectionSpeed = NULL;
+ // Complete the client request
+ CMmPacketContextTsy::ReqCompleted( reqHandle, KErrNone );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::NotifyStatusChange
+// Requests notification when the status of the context changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::NotifyStatusChange(
+ RPacketContext::TContextStatus* const aContextStatus )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::NotifyStatusChange. Context name:%S", &iContextName );
+ iRetNotifyStatus = aContextStatus;
+ iReqHandleType = EMultimodePacketContextNotifyStatusChange;
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::CompleteNotifyStatusChange
+// Complete the notification when the context status changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::CompleteNotifyStatusChange(
+ const RPacketContext::TContextStatus aContextStatus )
+ {
+
+ if ( aContextStatus != iContextStatus )
+ {
+ iContextStatus = aContextStatus;
+TFLOGSTRING3( "TSY: CMmPacketContextTsy::CompleteNotifyStatusChange. Context name: %S Context status:%d",
+ &iContextName, iContextStatus );
+
+ if ( RPacketContext::EStatusActive == iContextStatus ||
+ RPacketContext::EStatusInactive == iContextStatus ||
+ RPacketContext::EStatusDeleted == iContextStatus )
+ {
+ iMmPacketService->ContextStatusChanged( iContextStatus );
+ if( RPacketContext::EStatusDeleted == iContextStatus )
+ {
+ iMmPacketContextGsmWcdmaExt->SetContextStatusBeforeDeactivation(
+ RPacketContext::EStatusDeleted );
+ }
+ }
+
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePacketContextNotifyStatusChange );
+
+ if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
+ {
+ // Get current status
+ *iRetNotifyStatus = aContextStatus;
+ // Null ret pointer
+ iRetNotifyStatus = NULL;
+ // Complete the client request
+ CMmPacketContextTsy::ReqCompleted( reqHandle, KErrNone );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::SetConfigL
+// Configure a context to the phone.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::SetConfigL(
+ TPacketDataConfigBase* const aConfig )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::SetConfigL. Context name:%S", &iContextName );
+
+ // Call SetConfigL
+ TInt ret = iMmPacketContextGsmWcdmaExt->SetConfigL( aConfig );
+
+ if ( KErrNone == ret )
+ {
+ // Store the request handle type
+ iReqHandleType = EMultimodePacketContextSetConfig;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::CompleteSetConfig
+// Complete the asynchronous SetConfig request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::CompleteSetConfig(
+ const TInt aError,
+ TBool aIsAddMediaAuthorizationCalled )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteSetConfig. Error: %d", aError );
+
+ TTsyReqHandle reqHandle( EMultimodePacketContextReqHandleUnknown );
+ //if context exists eg. its name length is bigger than zero
+ if( 0 == CMmPacketContextTsy::HostCID().Length() )
+ {
+ reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePacketContextSetConfig );
+ }
+
+ else
+ {
+ if( aIsAddMediaAuthorizationCalled )
+ {
+ reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePacketContextAddMediaAuthorization );
+ }
+ else
+ {
+#ifdef USING_CTSY_DISPATCHER
+ // Distinguish between RemovePacketFilter and AddPacketFilter..
+
+// There is a hang defect lurking here.
+//
+// To show the defect, add and run the following test case (you could
+// copy from CCTsyPacketServicesFU::TestUseCase0007L):
+// - Add a packet filter. Wait for the request to complete.
+// - Remove the packet filter. (don't wait for completion)
+// - Add another packet filter.
+// - Wait for removal to complete (WILL HANG but obviously shouldn't).
+//
+// The reason for this hang is that there's a single completion method
+// for both Add and Remove packet filter functions down in the CTSY
+// (dispatcher mode only).
+//
+// If a client calls RemovePacketFilter, then immediately
+// calls AddPacketFilter (before the RemovePacketFilter has
+// completed), the iReqHandleType data member will already have been
+// updated to be EMultimodePacketContextAddPacketFilter..
+// So the code under the else below (that searches for the
+// RemovePacketFilter reqHandle and completes it) will never get run.
+// Thus the RemovePacketFilter call will hang.
+//
+// Fixing this requires that some other variable (NOT iReqHandleType)
+// is used to record that an add or a remove action is outstanding.
+//
+// When this defect has been addressed, please treat all the sections marked
+// ADD_REMOVE_PACKETFILTER_DEFECT_FIXED above as defined, and delete any
+// else blocks. This will then assert that the iReqHandleType doesn't
+// leak between calls. Which will protect us against any other such hang
+// bugs in the future.
+// This is the change that I was trying to apply when I ran into this defect.
+// See Perforce CL#1755436
+// Rob Lundie Hill
+
+ if (iReqHandleType == EMultimodePacketContextRemovePacketFilter)
+ {
+ reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( EMultimodePacketContextRemovePacketFilter );
+ }
+ else
+ {
+ reqHandle = iTsyReqHandleStore->ResetTsyReqHandle( EMultimodePacketContextAddPacketFilter );
+ }
+#else
+ reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePacketContextAddPacketFilter );
+#endif //USING_CTSY_DISPATCHER
+ }
+ }
+
+ if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
+ {
+
+ // Complete the client request
+ CMmPacketContextTsy::ReqCompleted( reqHandle, aError );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::SetDataVolume
+// Set the volume of transferred data.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::SetDataVolume(
+ const TInt /* aResult */,
+ RPacketContext::TDataVolume dataVolume )
+ {
+
+TFLOGSTRING( "TSY: CMmPacketContextTsy::SetDataVolume" );
+
+ if ( dataVolume.iBytesSent < iDataVolume.iBytesSent )
+ {
+ // The value of sent data has turned around the 4 GB
+ iDataVolume.iOverflowCounterSent++;
+ }
+ iDataVolume.iBytesSent = dataVolume.iBytesSent;
+
+
+ if ( dataVolume.iBytesReceived < iDataVolume.iBytesReceived )
+ {
+ // The value of received data has turned around the 4 GB
+ iDataVolume.iOverflowCounterReceived++;
+ }
+ iDataVolume.iBytesReceived = dataVolume.iBytesReceived;
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::SetLastErrorCause
+// Set the last error cause.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::SetLastErrorCause(
+ const TInt aErrorCause )
+ {
+ if ( RPacketContext::EStatusActivating == iContextStatus ||
+ RPacketContext::EStatusDeactivating == iContextStatus )
+ {
+ iLastErrorCause = aErrorCause;
+ }
+
+TFLOGSTRING3( "TSY: CMmPacketContextTsy::SetLastErrorCause. aErrorCause: %d iLastErrorCause:%d",
+ aErrorCause, iLastErrorCause );
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::ContextStatus
+// Return current context status.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+RPacketContext::TContextStatus CMmPacketContextTsy::ContextStatus() const
+ {
+ return iContextStatus;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::ContextSuspended
+// Suspend the context.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::ContextSuspended()
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::ContextSuspended. Context status before suspending: %d",
+ iContextStatus );
+
+ if ( ( RPacketContext::EStatusActivating == iContextStatus ) ||
+ ( RPacketContext::EStatusActive == iContextStatus ) ||
+ ( RPacketContext::EStatusDeactivating == iContextStatus ) )
+ {
+ iContextStatusBeforeSuspending = iContextStatus;
+ CMmPacketContextTsy::CompleteNotifyStatusChange(
+ RPacketContext::EStatusSuspended );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::ContextResumed
+// Resume the suspended context.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::ContextResumed()
+ {
+ if ( RPacketContext::EStatusSuspended == iContextStatus )
+ {
+ CMmPacketContextTsy::CompleteNotifyStatusChange(
+ iContextStatusBeforeSuspending );
+ }
+
+ iContextStatusBeforeSuspending = RPacketContext::EStatusUnknown;
+
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::ContextResumed. Context status when resumed: %d",
+ iContextStatus );
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::PacketContextGsmWcdmaExt
+// Return pointer to the CMmPacketContextGsmWcdmaExt.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmPacketContextGsmWcdmaExt* CMmPacketContextTsy::PacketContextGsmWcdmaExt() const
+ {
+ return iMmPacketContextGsmWcdmaExt;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::PacketQoSTsy
+// Return a pointer to the PacketQoSTsy.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmPacketQoSTsy* CMmPacketContextTsy::PacketQoSTsy() const
+ {
+ return iQoSProfile;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::RemoveQoS
+// Remove the pointer to PacketQoSTsy.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::RemoveQoS()
+ {
+TFLOGSTRING( "TSY: CMmPacketContextTsy::RemoveQoS." );
+
+ iQoSProfile = NULL;
+ iQoSProfileName.Zero();
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::ReqCompleted
+// Overloads CTelObject::ReqCompleted.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::ReqCompleted(
+ const TTsyReqHandle aTsyReqHandle,
+ const TInt aError )
+ {
+TFLOGSTRING3( "TSY: CMmPacketContextTsy::ReqCompleted. Handle:%d Error:%d",
+ aTsyReqHandle, aError );
+
+ // Set last error cause
+ if ( KErrNone != aError )
+ {
+ iLastErrorCause = aError;
+ }
+
+ CTelObject::ReqCompleted( aTsyReqHandle, aError );
+
+ }
+
+#ifdef REQHANDLE_TIMER
+
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::SetTypeOfResponse
+// Sets the type of response for a given request handle. Automatic mode
+// includes an automatic response in case of non response from the DOS in a
+// specified time. This method is used only if REQHANDLE_TIMER is in use.
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::SetTypeOfResponse(
+ const TInt aReqHandleType,
+ const TTsyReqHandle aTsyReqHandle )
+ {
+ TInt timeOut( 0 );
+
+ // Set timeout by req handle type
+ switch ( aReqHandleType )
+ {
+ case EMultimodePacketContextInitialiseContext:
+ timeOut = KMmPacketContextInitialiseContextTimeOut;
+ break;
+ case EMultimodePacketContextSetConfig:
+ timeOut = KMmPacketContextSetConfigTimeOut;
+ break;
+ case EMultimodePacketContextActivate:
+ timeOut = KMmPacketContextActivateTimeOut;
+ break;
+ case EMultimodePacketContextDeactivate:
+ timeOut = KMmPacketContextDeactivateTimeOut;
+ break;
+ case EMultimodePacketContextDelete:
+ timeOut = KMmPacketContextDeleteTimeOut;
+ break;
+ case EMultimodePacketContextGetDataVolumeTransferred:
+ timeOut = KMmPacketContextGetDataVolumeTransferredTimeOut;
+ break;
+ case EMultimodePacketContextModifyActiveContext:
+ timeOut = KMmPacketContextModifyActiveContext;
+ break;
+ case EMultimodePacketContextAddMediaAuthorization:
+ timeOut = KMmPacketContextAddMediaAuthorization;
+ break;
+
+ // Can't use timer:
+ // - all notifications
+ //case EMultimodePacketContextNotifyConfigChanged:
+ //case EMultimodePacketContextNotifyConnectionSpeedChange:
+ //case EMultimodePacketContextNotifyStatusChange:
+ default:
+ // Do not use timer
+ iTsyReqHandleStore->SetTsyReqHandle( aReqHandleType,
+ aTsyReqHandle );
+ break;
+ }
+
+ if ( 0 < timeOut )
+ {
+ // The timeout parameter is given in seconds.
+ iTsyReqHandleStore->SetTsyReqHandle( aReqHandleType, aTsyReqHandle,
+ timeOut );
+ }
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::Complete
+// Completes the request due the timer expiration. This method is used only if
+// REQHANDLE_TIMER is in use.
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::Complete(
+ const TInt aReqHandleType,
+ const TInt aError )
+ {
+ // All possible TSY req handle types are listed in the
+ // switch case below.
+ switch ( aReqHandleType )
+ {
+ case EMultimodePacketContextInitialiseContext:
+ CMmPacketContextTsy::CompleteInitialiseContext( aError );
+ break;
+ case EMultimodePacketContextSetConfig:
+ CMmPacketContextTsy::CompleteSetConfig( aError );
+ break;
+ case EMultimodePacketContextActivate:
+ CMmPacketContextTsy::CompleteActivate( aError );
+ break;
+ case EMultimodePacketContextDeactivate:
+ CMmPacketContextTsy::CompleteDeactivate( aError );
+ break;
+ case EMultimodePacketContextDelete:
+ CMmPacketContextTsy::CompleteDelete( aError );
+ break;
+ case EMultimodePacketContextGetDataVolumeTransferred:
+ CMmPacketContextTsy::CompleteGetDataVolumeTransferred( aError );
+ break;
+ case EMultimodePacketContextModifyActiveContext:
+ CMmPacketContextTsy::CompleteModifyActiveContext( aError );
+ break;
+ case EMultimodePacketContextAddMediaAuthorization:
+ CMmPacketContextTsy::CompleteSetConfig( aError, ETrue );
+ break;
+
+ // Can't use timer:
+ // - all notifications
+ //case EMultimodePacketContextNotifyConfigChanged:
+ //case EMultimodePacketContextNotifyConnectionSpeedChange:
+ //case EMultimodePacketContextNotifyStatusChange:
+ default:
+ CMmPacketContextTsy::ReqCompleted( iTsyReqHandleStore->
+ ResetTsyReqHandle( aReqHandleType ), aError );
+ break;
+ }
+
+ }
+
+#endif // REQHANDLE_TIMER
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::IsDialUpContext
+// Return ETrue if this is dial-up context, otherwise EFalse.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CMmPacketContextTsy::IsDialUpContext(
+ const TInfoName* const aContextName ) const
+ {
+
+ TBool ret( EFalse );
+
+ if ( NULL != aContextName )
+ {
+ if ( *aContextName == iContextName )
+ {
+ ret = ETrue;
+ }
+ }
+ else
+ {
+ ret = iIsDialUpContext;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::ResetDialUpContext
+// Reset the externally created dial-up context's data.
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::ResetDialUpContext()
+ {
+
+TFLOGSTRING( "TSY: CMmPacketContextTsy::ResetDialUpContext." );
+
+ iDataVolume.iOverflowCounterSent = 0;
+ iDataVolume.iBytesSent = 0;
+ iDataVolume.iOverflowCounterReceived = 0;
+ iDataVolume.iBytesReceived = 0;
+
+ iContextStatus = RPacketContext::EStatusInactive;
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::HostCID
+// Return the host context name
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInfoName CMmPacketContextTsy::HostCID() const
+ {
+
+ return iHostCID;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::AddPacketFilterL
+// This method sets up a packet filter in the TFT belonging to this context,
+// with the Id specified in the packet filter information. New packet filter
+// info is stored in CMmPacketContextGsmWcdmaExt. This method takes care of
+// adding packet filter info and storing this information.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::AddPacketFilterL(
+ const TTsyReqHandle aTsyReqHandle,
+ TDes8* const aPacketFilter )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::AddPacketFilterL. Context name:%S", &iContextName );
+
+ TInt ret( KErrGeneral );
+
+ if ( (0 < iHostCID.Length()) && (aPacketFilter->Length() > 0) )
+ {
+ ret = iMmPacketContextGsmWcdmaExt->AddPacketFilterL( aPacketFilter );
+
+ if ( KErrNone == ret )
+ {
+ // if operation is meant for already configurated context
+ if ( RPacketContext::EStatusUnknown != ContextStatus() &&
+ RPacketContext::EStatusInactive != ContextStatus() )
+ {
+ // request must complete to client
+ CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
+ }
+
+ // else operation is context configuration and complete method
+ // handles request complete
+ else
+ {
+ // Store the request handle type
+ iReqHandleType = EMultimodePacketContextAddPacketFilter;
+ }
+ }
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::RemovePacketFilter
+// This method removes a packet filter from the TFT belonging to this context.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+#ifndef USING_CTSY_DISPATCHER
+TInt CMmPacketContextTsy::RemovePacketFilter(
+ const TTsyReqHandle aTsyReqHandle,
+ TInt *aID )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::RemovePacketFilter. RemovedFilter:%d", *aID );
+
+ TInt ret( KErrArgument );
+
+ // id must be value from 1 to 8
+ if ( 0 < *aID && 8 >= *aID )
+ {
+ ret = iMmPacketContextGsmWcdmaExt->RemovePacketFilter( *aID );
+ }
+
+ CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, ret );
+
+ return KErrNone;
+ }
+#endif // #ifndef USING_CTSY_DISPATCHER
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::ModifyActiveContextL
+// Invokes context modification. This method invokes MS-initiated
+// modification of an active context in the network.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::ModifyActiveContextL()
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::ModifyActiveContextL. Context name:%S", &iContextName );
+
+ TInt ret( KErrNotReady );
+
+ if ( RPacketContext::EStatusUnknown != ContextStatus() &&
+ RPacketContext::EStatusInactive != ContextStatus() &&
+ RPacketContext::EStatusDeleted != ContextStatus() )
+ {
+ ret = iMmPacketContextGsmWcdmaExt->ModifyActiveContextL();
+ }
+
+ if ( KErrNone == ret )
+ {
+ // Store the request handle type
+ iReqHandleType = EMultimodePacketContextModifyActiveContext;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::CompleteModifyActiveContext
+// When all Tft operations are done method completes to client
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::CompleteModifyActiveContext(
+ const TInt aResult )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::CompleteModifyActiveContext. Context name:%S", &iContextName );
+
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePacketContextModifyActiveContext );
+
+ if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
+ {
+
+ CMmPacketContextTsy::ReqCompleted( reqHandle, aResult );
+
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::EnumeratePacketFilters
+// Returns number of defined packet filters to client
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::EnumeratePacketFilters(
+ const TTsyReqHandle aTsyReqHandle,
+ TInt *aCount )
+ {
+ TInt ret = iMmPacketContextGsmWcdmaExt->EnumeratePacketFilters ( aCount );
+
+ CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, ret );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::GetPacketFilterInfo
+// Gives information about the packet filter specified by aIndex
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::GetPacketFilterInfo(
+ const TTsyReqHandle aTsyReqHandle,
+ TInt* aIndex,
+ TPacketBase* aPacketFilterInfo )
+ {
+ TInt ret = iMmPacketContextGsmWcdmaExt->GetPacketFilterInfo ( *aIndex,
+ aPacketFilterInfo);
+
+ CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, ret );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::GetDnsInfo
+// This method gets the DNS info for Etel side request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::GetDnsInfo(
+ const TTsyReqHandle aTsyReqHandle,
+ TDes8* const aDnsInfo )
+ {
+ ASSERT(aDnsInfo);
+
+ RPacketContext::TDnsInfoV2 temp;
+ RPacketContext::TTDnsInfoV2Pckg tempPckg(temp);
+
+ TInt ret = KErrArgument;
+ if (tempPckg.MaxLength() == aDnsInfo->MaxLength() )
+ {
+ ret = iMmPacketContextGsmWcdmaExt->GetDnsInfoEtel( aDnsInfo );
+ }
+
+ CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, ret );
+
+ return KErrNone;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::ContextName
+// This method returns name of this context
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInfoName CMmPacketContextTsy::ContextName() const
+ {
+ return iContextName;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::AddMediaAuthorizationL
+// Makes request for adding authorization params to licensee tsy
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::AddMediaAuthorizationL(
+ const TTsyReqHandle aTsyReqHandle,
+ TDes8* aMediaAuthorization )
+ {
+
+ TInt ret( KErrArgument );
+ TBool hasMediaAuthorizationBeenCached=EFalse;
+
+
+ //Can be done only for secondary context
+ if ( 0 < iHostCID.Length() )
+ {
+
+ //Create buffers
+ RPacketContext::CTFTMediaAuthorizationV3* mediaAuthorization =
+ RPacketContext::CTFTMediaAuthorizationV3::NewL();
+ CleanupStack::PushL( mediaAuthorization );
+ mediaAuthorization->InternalizeL( *aMediaAuthorization );
+
+ ret = iMmPacketContextGsmWcdmaExt->AddMediaAuthorizationL(
+ mediaAuthorization, hasMediaAuthorizationBeenCached);
+
+ //Cleanup created object. If it has been cached we do not delete it, because
+ // the array (cache) will be cleaned in the destructor
+ // If we were unable to cache it, we need to destroy it, otherwise we will leak
+ // memory.
+ if(hasMediaAuthorizationBeenCached)
+ {
+ CleanupStack::Pop(mediaAuthorization);
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy(mediaAuthorization);
+ }
+
+ if ( KErrNone == ret )
+ {
+ //
+ if ( RPacketContext::EStatusUnknown != ContextStatus() &&
+ RPacketContext::EStatusInactive != ContextStatus() )
+ {
+ // request must complete to client
+ CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
+ }
+
+ // else operation is context configuration and complete method
+ // handles request complete
+ else
+ {
+ // Store the request handle type
+ iReqHandleType = EMultimodePacketContextAddMediaAuthorization;
+ }
+ }
+ }
+ return ret;
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::RemoveMediaAuthorization
+// Makes request for removing authorization params to licensee tsy
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::RemoveMediaAuthorization(
+ const TTsyReqHandle aTsyReqHandle,
+ RPacketContext::TAuthorizationToken* const aAuthorizationToken )
+ {
+ TInt ret( KErrGeneral );
+
+ //Can be done only for secondary context
+ if ( 0 < iHostCID.Length() )
+ {
+
+ ret = iMmPacketContextGsmWcdmaExt->RemoveMediaAuthorization(
+ aAuthorizationToken );
+
+ }
+
+ CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, ret );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::ContextType
+// return the context type
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmPacketContextTsy::TPacketContextType CMmPacketContextTsy::ContextType() const
+{
+ return EContextTypePacketContext;
+}
+
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::GetConnectionInfo
+// Gets the current connection information.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::GetConnectionInfo(
+ const TTsyReqHandle aTsyReqHandle,
+ TConnectionInfoBase* const aInfo )
+ {
+TFLOGSTRING2( "TSY: CMmPacketContextTsy::GetConnectionInfo. Context name:%S", &iContextName );
+
+ // Get config
+ TInt ret = FillConnectionInfo( aInfo );
+
+ // Complete Request
+ CMmPacketContextTsy::ReqCompleted( aTsyReqHandle, ret );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::NotifyConnectionInfoChange
+// Requests notification when connection information changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::NotifyConnectionInfoChange(
+ TConnectionInfoBase* const aInfo )
+ {
+TFLOGSTRING( "TSY: CMmPacketContextTsy::NotifyConnectionInfoChange." );
+
+ // Store pointer
+ iRetNotifyConnectionInfo = aInfo;
+ // Store req handle type
+ iReqHandleType = EMultimodePacketContextNotifyConnectionInfoChange;
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::CompleteNotifyConnectionInfoChange
+// Complete notification when the connection information changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmPacketContextTsy::CompleteNotifyConnectionInfoChange(
+ TConnectionInfoBase* const aInfo )
+ {
+TFLOGSTRING( "TSY: CMmPacketContextTsy::CompleteNotifyConnectionInfoChange." );
+
+ if ( NULL != aInfo &&
+ TConnectionInfoBase::KConnectionInfoV1 == aInfo->ExtensionId() )
+ {
+ RPacketContext::TConnectionInfoV1 connectionInfoV1;
+ connectionInfoV1 = *( static_cast<RPacketContext::TConnectionInfoV1*>( aInfo ) );
+
+ //Check if connection info has changed
+ if ( iConnectionInfo.iHSDPACategory != connectionInfoV1.iHSDPACategory ||
+ iConnectionInfo.iHSUPACategory != connectionInfoV1.iHSUPACategory ||
+ iConnectionInfo.iValid != connectionInfoV1.iValid )
+ {
+ //Set new connection info
+ iConnectionInfo = connectionInfoV1;
+
+ //Get req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->GetTsyReqHandle(
+ EMultimodePacketContextNotifyConnectionInfoChange );
+
+ if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
+ {
+ // Fill current connection information
+ TInt ret = FillConnectionInfo( iRetNotifyConnectionInfo );
+
+ if ( KErrNone == ret )
+ {
+ //reset req handle
+ iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePacketContextNotifyConnectionInfoChange );
+ // Null ret pointer
+ iRetNotifyConnectionInfo = NULL;
+ // Complete the client request
+ CMmPacketContextTsy::ReqCompleted( reqHandle, KErrNone );
+ }
+ }
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmPacketContextTsy::FillConnectionInfo
+// Fills the current connection information to TConnectionInfoXXX structure.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmPacketContextTsy::FillConnectionInfo(
+ TConnectionInfoBase* const aInfo )
+ {
+TFLOGSTRING( "TSY: CMmPacketContextTsy::FillConnectionInfo" );
+
+ TInt ret = KErrNone;
+
+ if ( NULL != aInfo &&
+ TConnectionInfoBase::KConnectionInfoV1 == aInfo->ExtensionId() )
+ {
+ //Set connection info to ETel side memory
+ *( static_cast<RPacketContext::TConnectionInfoV1*>( aInfo ) ) = iConnectionInfo;
+ }
+ else
+ {
+ ret = KErrArgument;
+ }
+
+ return ret;
+ }
+#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+// End of File