--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmpacket/Cmmpacketcontexttsy.cpp Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,2161 @@
+// 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()
+ {
+ }
+
+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 );
+
+ // Reset last tsy request type
+ iReqHandleType = EMultimodePacketContextReqHandleUnknown;
+
+ // 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
+ }
+
+ 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 );
+ // Reset last tsy request type
+ iReqHandleType = EMultimodePacketContextReqHandleUnknown;
+
+ 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 );
+ }
+
+ 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
+ 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