--- a/telephonyserverplugins/common_tsy/commontsy/src/mmpacket/cmmmbmscontexttsy.cpp Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmpacket/cmmmbmscontexttsy.cpp Thu May 06 15:10:38 2010 +0100
@@ -1,1643 +1,1643 @@
-// 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 "cmmmbmscontexttsy.h"
-#include "cmmmbmscontextlist.h"
-#include "CMmPacketTsy.h"
-#include <ctsy/tflogger.h>
-#include "mbmstypes.h"
-#include "MmTsy_timeoutdefs.h"
-#include "MmTsy_numberOfSlots.h"
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-CMmMBMSContextTsy::CMmMBMSContextTsy()
- {
- }
-
-CMmMBMSContextTsy* CMmMBMSContextTsy::NewL(
- CMmPacketServiceTsy* aMmPacketService,
- const TDes& aName,
- const TUint8 aProxyId )
- {
-TFLOGSTRING( "TSY: CMmMBMSContextTsy::NewL" );
-
- CMmMBMSContextTsy* packetContext = new ( ELeave ) CMmMBMSContextTsy();
- CleanupClosePushL( *packetContext );
- packetContext->ConstructL( aMmPacketService, aName, aProxyId );
- CleanupStack::Pop();
-
- return packetContext;
- }
-
-void CMmMBMSContextTsy::ConstructL(CMmPacketServiceTsy* const aMmPacketService,
- const TDes& aName,
- TUint8 aProxyId)
- {
- iMmPacketService = aMmPacketService;
- iContextName = aName;
- iObjectId = aProxyId;
-
- iConfig = new ( ELeave ) RPacketMbmsContext::TContextConfigMbmsV1();
-
-#ifdef REQHANDLE_TIMER
- // Create req handle store
- iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this,
- iMmPacketService->PhoneTsy(), EMaxNumOfMBMSContextRequests,
- iPacketContextReqHandles );
-
-#else
- // Create req handle store
- iTsyReqHandleStore = CMmTsyReqHandleStore::NewL(
- EMaxNumOfMBMSContextRequests, iPacketContextReqHandles );
-
-#endif // REQHANDLE_TIMER
- iIsInitialiseAllowed = ETrue;
- iServicesArray = RPacketMbmsContext::CMbmsSession::NewL();
- iContextStatus = RPacketContext::EStatusUnknown;
- }
-
-CMmMBMSContextTsy::~CMmMBMSContextTsy()
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::~CMmMBMSContextTsy Context name: %S", &iContextName );
-
- if( iMmPacketService )
- {
- iMmPacketService->MBMSContextList()->RemoveObject( this );
-
- // Set Dynamic Caps
- iMmPacketService->ActivePacketServiceExtension()->SetDynamicCapsFlag(
- RPacketService::KCapsActivate, EFalse );
- }
-
- delete iServicesArray;
- iServicesArray = NULL;
-
- delete iTsyReqHandleStore;
- iTsyReqHandleStore = NULL;
-
- delete iConfig;
- iConfig = NULL;
-
- delete iTempConfig;
- iTempConfig = NULL;
-
- }
-
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::ExtFunc
-// TRAP's all CMmMBMSContextTsy 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 CMmMBMSContextTsy::ExtFunc(
- TTsyReqHandle aTsyReqHandle,
- TInt aIpc,
- const TDataPackage& aPackage )
- {
-TFLOGSTRING3( "TSY: CMmMBMSContextTsy::ExtFunc. IPC: %d Context name:%S", aIpc, &iContextName );
-
- TInt ret( KErrNone );
- TInt trapError( KErrNone );
-
- // Reset last tsy request type
- iReqHandleType = EMultimodePacketMbmsReqHandleUnknown;
-
- // Set tsy request handle
- iTsyReqHandle = aTsyReqHandle;
-
- // 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 ( EMultimodePacketMbmsReqHandleUnknown != iReqHandleType )
- {
-#ifdef REQHANDLE_TIMER
- SetTypeOfResponse( iReqHandleType, aTsyReqHandle );
-#else
- iTsyReqHandleStore->SetTsyReqHandle( iReqHandleType, aTsyReqHandle );
-#endif // REQHANDLE_TIMER
- }
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::DoExtFuncL
-// Packet Data specific functionality of CMmMBMSContextTsy::ExtFunc
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::DoExtFuncL(
- TTsyReqHandle aTsyReqHandle,
- TInt aIpc,
- const TDataPackage& aPackage )
- {
-TFLOGSTRING3( "TSY: CMmMBMSContextTsy::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 EPacketContextInitialiseContext:
- ret = InitialiseContextL( reinterpret_cast< RPacketContext::TDataChannelV2*>( dataPtr ));
- 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 EPacketContextGetLastErrorCause:
- ret = GetLastErrorCause( aTsyReqHandle,
- reinterpret_cast< TInt*>( dataPtr ) );
- break;
- case EPacketContextUpdateMbmsSessionList:
- ret = UpdateMbmsSessionList(
- reinterpret_cast< TMbmsAction*>( dataPtr ),
- reinterpret_cast< TMbmsSessionId*>( dataPtr2 ) );
- break;
- case EPacketGetMbmsSessionListPhase1:
- ret = GetMbmsActiveServicesPhase1L( aTsyReqHandle,
- reinterpret_cast< RMobilePhone::TClientId*>( dataPtr ),
- reinterpret_cast< TInt*>( dataPtr2 ) );
- break;
-
- case EPacketGetMbmsSessionListPhase2:
- ret = GetMbmsActiveServicesPhase2L( aTsyReqHandle,
- reinterpret_cast< RMobilePhone::TClientId*>( dataPtr ),
- aPackage.Des2n() );
- break;
- // These requests currently not supported
- case EPacketContextLoanCommPort:
- case EPacketContextRecoverCommPort:
- case EPacketContextNotifyDataTransferred:
- case EPacketContextGetProfileName:
- case EPacketContextGetConnectionSpeed:
- case EPacketContextGetDataVolumeTransferred:
- case EPacketContextEnumeratePacketFilters:
- case EPacketContextGetPacketFilterInfo:
- case EPacketContextAddPacketFilter:
- case EPacketContextRemovePacketFilter:
- case EPacketContextModifyActiveContext:
- case EPacketContextGetDNSInfo:
- case EPacketAddMediaAuthorization:
- case EPacketRemoveMediaAuthorization:
- default:
- break;
- }
-
- return ret;
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::ReqModeL
-// Returns request mode for given IPC.
-// ---------------------------------------------------------------------------
-//
-CTelObject::TReqMode CMmMBMSContextTsy::ReqModeL(
- TInt aIpc )
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::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 EPacketContextGetLastErrorCause:
-
- // 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.
-
- 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 EPacketContextUpdateMbmsSessionList:
- case EPacketContextInitialiseContext:
- case EPacketContextActivate:
- case EPacketContextDelete:
- case EPacketContextSetConfig:
- case EPacketContextAddPacketFilter:
- case EPacketContextRemovePacketFilter:
-
- case EPacketContextDeactivate:
- {
- 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 EPacketContextNotifyStatusChange:
- reqMode = KReqModeMultipleCompletionEnabled |
- KReqModeRePostImmediately;
- break;
-
- case EPacketGetMbmsSessionListPhase1:
- case EPacketGetMbmsSessionListPhase2:
- reqMode = 0;
- 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:
- //case EPacketContextModifyActiveContext:
- // Default
- default:
- doLeave = ETrue;
- break;
- }
-
- if ( doLeave )
- {
- User::Leave( KErrNotSupported );
- }
-
- return reqMode;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::NumberOfSlotsL
-// Returns number of slots to be used for given IPC.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::NumberOfSlotsL(
- TInt aIpc )
- {
- TInt numberOfSlots( 0 );
-
- switch ( aIpc )
- {
- case EPacketContextNotifyStatusChange:
- numberOfSlots = KMmPacketContextNotifyStatusChangeSlots;
- break;
- case EPacketContextNotifyConfigChanged:
- numberOfSlots = KMmPacketContextNotifyConfigChangedSlots;
- break;
-
- default:
- // Unknown or invalid IPC
- User::Leave( KErrNotSupported );
- break;
-
- }
-TFLOGSTRING3( "TSY: CMmMBMSContextTsy::NumberOfSlotsL. IPC: %d Number of slots: %d", aIpc, numberOfSlots );
-
- return numberOfSlots;
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::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 CMmMBMSContextTsy::CancelService(
- TInt aIpc,
- TTsyReqHandle aTsyReqHandle )
- {
-TFLOGSTRING3( "TSY: CMmMBMSContextTsy::CancelService. IPC: %d Handle:%d", aIpc, aTsyReqHandle );
-
- TInt ret( KErrNone );
- //TTsyReqHandle reqHandle( NULL );
- // Reset last tsy request type
- iReqHandleType = EMultimodePacketMbmsReqHandleUnknown;
-
- 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 EPacketContextUpdateMbmsSessionList:
- case EPacketContextInitialiseContext:
- case EPacketContextActivate:
- case EPacketContextDeactivate:
- case EPacketContextDelete:
- case EPacketContextSetConfig:
- case EPacketContextGetConfig:
- break;
- case EPacketGetMbmsSessionListPhase1:
- ret = CancelGetMbmsActiveServicesPhase1();
- break;
- // Notification Cancels, no special requirements.
- case EPacketContextNotifyStatusChange:
- iRetNotifyStatus = NULL;
- iReqHandleType = EMultimodeMbmsContextNotifyStatusChange;
- break;
- case EPacketContextNotifyConfigChanged:
- iRetNotifyConfig = NULL;
- iReqHandleType = EMultimodeMbmsContextNotifyConfigChanged;
- break;
-
- // IPCs that are not supported
- //case EPacketContextLoanCommPort:
- //case EPacketContextRecoverCommPort:
- //case EPacketContextNotifyDataTransferred:
- //case EPacketContextModifyActiveContext:
- // Default
- default:
- ret = KErrNotSupported;
- break;
- }
-
- if ( EMultimodePacketMbmsReqHandleUnknown != iReqHandleType )
- {
- // Reset tsy request handle
- iTsyReqHandleStore->ResetTsyReqHandle( iReqHandleType );
-
- // Complete request
- CMmMBMSContextTsy::ReqCompleted( aTsyReqHandle, KErrCancel );
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::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 CMmMBMSContextTsy::RegisterNotification(
- TInt aIpc )
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::RegisterNotification. IPC: %d", aIpc );
-
- TInt ret( KErrNone );
-
- switch ( aIpc )
- {
- case EPacketContextNotifyConfigChanged:
- case EPacketContextNotifyStatusChange:
- break;
- //case EPacketContextNotifyDataTransferred:
- default:
- // Not supported
- ret = KErrNotSupported;
- break;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::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 CMmMBMSContextTsy::DeregisterNotification(
- TInt aIpc )
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::DeregisterNotification. IPC: %d", aIpc );
-
- TInt ret( KErrNone );
-
- switch ( aIpc )
- {
- case EPacketContextNotifyConfigChanged:
- case EPacketContextNotifyStatusChange:
- break;
- //case EPacketContextNotifyDataTransferred:
- default:
- // Not supported
- ret = KErrNotSupported;
- break;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::InitialiseContextL
-// This function initialises the context created previously.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::InitialiseContextL( RPacketContext::TDataChannelV2* aDataChannel )
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::InitialiseContextL. %S", &iContextName );
-
- TInt ret( KErrArgument );
-
- if ( iIsInitialiseAllowed )
- {
- CMmDataPackage dataPackage;
- dataPackage.PackData( &iContextName);
- iDataChannelV2 = aDataChannel;
-
- ret = iMmPacketService->MessageManager()->HandleRequestL(
- ECtsyPacketMbmsInitialiseContextReq, &dataPackage );
-
- if( KErrNone == ret )
- {
- iIsInitialiseAllowed = EFalse;
- }
- }
-
- if ( KErrNone == ret )
- {
- // Store the request handle
- iReqHandleType = EMultimodePacketMbmsInitialiseContext;
- }
-
-
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::CompleteInitialiseContext
-// Complete the asynchronous InitialiseContext request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-
-void CMmMBMSContextTsy::CompleteInitialiseContext(TInt aResult, RPacketContext::TDataChannelV2* aDataChannel )
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::CompleteInitialiseContext. Error: %d", aResult );
-
- iIsActivateAllowed = ETrue;
- if (KErrNone == aResult )
- {
- CompleteNotifyStatusChange( RPacketContext::EStatusInactive );
- if((aDataChannel != NULL) && (iDataChannelV2 != NULL))
- {
- *iDataChannelV2 = *aDataChannel;
- iDataChannelV2 = NULL;
- }
- // Set Dynamic Caps
- iMmPacketService->ActivePacketServiceExtension()->SetDynamicCapsFlag(
- RPacketService::KCapsActivate, iIsActivateAllowed );
- }
- else
- {
- iIsInitialiseAllowed = ETrue;
- }
-
- // Reset the req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodePacketContextInitialiseContext );
-
- if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
- {
- // Complete the client request
- ReqCompleted( reqHandle, aResult );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::ActivateL
-// Activate a context. This function activates a context that has been
-// previously configured using the SetConfig() method from RPacketMbmsContext.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::ActivateL()
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::ActivateL. Context name:%S", &iContextName );
-
- TInt ret( KErrNotReady );
-
- if ( iIsActivateAllowed )
- {
- // verify that max activate context is not exceed
- if( iMmPacketService->MaximumActiveServices() >
- iMmPacketService->EnumerateMbmsActiveServices() )
- {
- // mbmscontext activation
- CMmDataPackage data;
- data.PackData( &iContextName );
-
- ret = iMmPacketService->MessageManager()->HandleRequestL(
- EPacketContextActivate, &data );
- }
- else
- {
- // max number of possible active context exceed
- ret = KErrUmtsMaxNumOfContextExceededByPhone;
- }
- if ( KErrNone == ret )
- {
- iIsActivateAllowed = EFalse;
- CompleteNotifyStatusChange( RPacketContext::EStatusActivating );
- }
- }
-
- if ( KErrNone == ret )
- {
- // Store the request handle
- iReqHandleType = EMultimodeMbmsContextActivate;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::CompleteActivate
-// Complete the asynchronous Activate request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmMBMSContextTsy::CompleteActivate(TInt aResult)
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::CompleteActivate. Error: %d", aResult );
-
- // Reset the req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeMbmsContextActivate );
-
- if ( KErrNone == aResult )
- {
-
- CompleteNotifyConfigChanged();
-
- // Notify status change
- CompleteNotifyStatusChange( RPacketContext::EStatusActive );
- }
- else
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::CompleteActivate. ErrorCause: %d",
- aResult );
- // Re-activation is allowed because activation has not succeeded
- iIsActivateAllowed = ETrue;
- }
-
-
- if ( EMultimodePacketMbmsReqHandleUnknown != reqHandle )
- {
-
- // Complete the client request
- CMmMBMSContextTsy::ReqCompleted( reqHandle, aResult );
- }
- }
-
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::Deactivate
-// Deactivate a context previously configured on the phone.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::DeactivateL()
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::DeactivateL. Context name:%S", &iContextName );
-
- TInt ret( KErrArgument );
-
- CMmDataPackage data;
- data.PackData( &iContextName, &iServicesArray );
- ret = iMmPacketService->MessageManager()->HandleRequestL(
- EPacketContextDeactivate, &data );
-
- if ( KErrNone == ret )
- {
- iContextStatusBeforeDeactivation = ContextStatus();
- // Notify status change
- CompleteNotifyStatusChange( RPacketContext::EStatusDeactivating );
-
- // Store the request handle
- iReqHandleType = EMultimodeMbmsContextDeactivate;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::CompleteDeactivate
-// Complete the asynchronous Deactivate request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-
-void CMmMBMSContextTsy::CompleteDeactivate(
- CMmDataPackage* aDataPackage,
- TInt aResult )
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::CompleteDeactivate. Error: %d", aResult );
- // Reset the req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeMbmsContextDeactivate );
-
- // Notify status change
- if ( KErrNone == aResult )
- {
- CompleteNotifyStatusChange( RPacketContext::EStatusInactive );
- // and reset possible session list
- if( iServicesArray )
- {
- iServicesArray->iSessionIdList.Reset();
- iServicesArray->iSessionIdList.Compress();
- }
- }
- else
- {
- CompleteNotifyStatusChange( iContextStatusBeforeDeactivation );
-
- // remove only entries which were succesfully removed
- if( (aDataPackage) && (aResult == KErrMbmsImpreciseServiceEntries) )
- {
- TInfoName* contextName = NULL;
- RPacketMbmsContext::CMbmsSession* listOfFailedEntries = NULL;
- aDataPackage->UnPackData( &contextName, &listOfFailedEntries);
- if( listOfFailedEntries )
- {
- for( TInt i = 0; i < listOfFailedEntries->iSessionIdList.Count(); i++ )
- {
- for( TInt ii = 0; ii < iServicesArray->iSessionIdList.Count(); ii++ )
- {
- if( listOfFailedEntries->iSessionIdList[i] == iServicesArray->iSessionIdList[ii] )
- {
- iServicesArray->iSessionIdList.Remove(ii);
- iServicesArray->iSessionIdList.Compress();
- ii = iServicesArray->iSessionIdList.Count();
- }
- }
- }
- }
- }
- }
-
- // Complete the client request
- if ( EMultimodePacketMbmsReqHandleUnknown != reqHandle )
- {
- CMmMBMSContextTsy::ReqCompleted( reqHandle, aResult );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::DeleteL
-// Delete a context id previously created on the phone.
-// Note that although the context is considered as 'deleted', the
-// client's RPacketMbmsContext subsession remains. To remove this, a client must
-// call Close() from RPacketMbmsContext.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::DeleteL()
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::DeleteL. Context name:%S", &iContextName );
-
- TInt ret( KErrNotReady );
- if( RPacketContext::EStatusUnknown != ContextStatus() )
- {
- CMmDataPackage data;
- data.PackData( &iContextName );
-
- ret = iMmPacketService->MessageManager()->HandleRequestL(
- EPacketContextDelete, &data );
-
- }
-
- if ( KErrNone == ret )
- {
- // Store the request handle
- iReqHandleType = EMultimodeMbmsContextDelete;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::CompleteDelete
-// Complete the asynchronous Delete request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-
-void CMmMBMSContextTsy::CompleteDelete(
- TInt aResult )
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::CompleteDelete. Error: %d", aResult );
-
- if( KErrNone == aResult )
- {
- iContextStatusBeforeDeactivation = RPacketContext::EStatusDeleted;
-
- // Notify status change
- CompleteNotifyStatusChange( RPacketContext::EStatusDeleted );
-
- delete iConfig;
- iConfig = NULL;
- }
-
- // Reset the req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeMbmsContextDelete );
-
- if ( EMultimodePacketMbmsReqHandleUnknown != reqHandle )
- {
- // Complete the client request
- CMmMBMSContextTsy::ReqCompleted( reqHandle, aResult );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::GetConfig
-// Requests the current configuration of the context.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::GetConfig(
- TTsyReqHandle aTsyReqHandle,
- TPacketDataConfigBase* aConfig )
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::GetConfig. Context name:%S", &iContextName );
- TInt ret( KErrNone );
-
- // Check that the mode given in aConfig is KConfigMBMS
- if ( TPacketDataConfigBase::KConfigMBMS == aConfig->ExtensionId() )
- {
- // Set configuration data to ETel side memory
- *( RPacketMbmsContext::TContextConfigMbmsV1* )aConfig =
- *iConfig;
- }
- else
- {
- // Given mode is not supported
- ret = KErrArgument;
- }
-
- // Complete Request
- CMmMBMSContextTsy::ReqCompleted( aTsyReqHandle, ret );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::GetLastErrorCause
-// This function retrieves the last error cause to have occurred.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::GetLastErrorCause(
- TTsyReqHandle aTsyReqHandle,
- TInt* aError )
- {
-TFLOGSTRING3( "TSY: CMmMBMSContextTsy::GetLastErrorCause. Context name:%S Last error cause: %d", &iContextName, iLastErrorCause );
-
- *aError = iLastErrorCause;
- CMmMBMSContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::SetLastErrorCause
-// Set the last error cause.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmMBMSContextTsy::SetLastErrorCause(
- TInt aErrorCause )
- {
-
- iLastErrorCause = aErrorCause;
-
-TFLOGSTRING3( "TSY: CMmMBMSContextTsy::SetLastErrorCause. aErrorCause: %d iLastErrorCause:%d",
- aErrorCause, iLastErrorCause );
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::GetStatus
-// Allows a client to get the current status of the context.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::GetStatus(
- TTsyReqHandle aTsyReqHandle,
- RPacketContext::TContextStatus* aContextStatus )
- {
-TFLOGSTRING3( "TSY: CMmMBMSContextTsy::GetStatus. Context name: %S Context Status:%d", &iContextName, iContextStatus );
- *aContextStatus = iContextStatus;
- CMmMBMSContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::NotifyConfigChanged
-// Requests notification when configuration of context changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::NotifyConfigChanged(
- TPacketDataConfigBase* aConfig )
- {
-TFLOGSTRING( "TSY: CMmMBMSContextTsy::NotifyConfigChanged." );
-
- // Check that used mode is MBMS
- if ( TPacketDataConfigBase::KConfigMBMS != aConfig->ExtensionId() )
- {
- return KErrArgument;
- }
-
- // Store pointer
- iRetNotifyConfig = aConfig;
- // Store req handle type
- iReqHandleType = EMultimodeMbmsContextNotifyConfigChanged;
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::CompleteNotifyConfigChanged
-// Complete notification when the context configuration changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmMBMSContextTsy::CompleteNotifyConfigChanged(const CMmDataPackage* aDataPackage,
- TInt aResult)
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::CompleteNotifyConfigChanged. Context name:%S",
- &iContextName );
- if(aDataPackage != NULL)
- {
- if ( KErrNone == aResult )
- {
- RPacketMbmsContext::TContextConfigMbmsV1* aConfig = NULL;
- TInfoName* name = NULL;
- aDataPackage->UnPackData( &name, &aConfig );
-
- if( NULL != aConfig )
- {
- iConfig->iTmgi = aConfig->iTmgi;
- iConfig->iMbmsAccessBearer = aConfig->iMbmsAccessBearer;
- iConfig->iMbmsServicePriority = aConfig->iMbmsServicePriority;
- iConfig->iMbmsServiceMode = aConfig->iMbmsServiceMode;
- iConfig->iMbmsSessionFlag = aConfig->iMbmsSessionFlag;
-
- }
- }
- }
-
- // Get and reset req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeMbmsContextNotifyConfigChanged );
-
- if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
- {
-#ifdef USING_CTSY_DISPATCHER
- //CTSY defect, request is completed with KErrNone, aResult ignored.
- if( (iConfig) && (aResult == KErrNone) )
-#else
- if( NULL != iConfig )
-#endif //USING_CTSY_DISPATCHER
- {
-
- *( RPacketMbmsContext::TContextConfigMbmsV1* )iRetNotifyConfig = *iConfig;
- // Null ret pointer
- iRetNotifyConfig = NULL;
- }
-
- // Complete the client request
-#ifdef USING_CTSY_DISPATCHER
- CMmMBMSContextTsy::ReqCompleted( reqHandle, aResult );
-#else
- CMmMBMSContextTsy::ReqCompleted( reqHandle, KErrNone );
-#endif //USING_CTSY_DISPATCHER
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::NotifyStatusChange
-// Requests notification when the status of the context changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::NotifyStatusChange(
- RPacketContext::TContextStatus* aContextStatus )
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::NotifyStatusChange. Context name:%S", &iContextName );
- iRetNotifyStatus = aContextStatus;
- iReqHandleType = EMultimodeMbmsContextNotifyStatusChange;
-
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::CompleteNotifyStatusChange
-// Complete the notification when the context status changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmMBMSContextTsy::CompleteNotifyStatusChange(
- RPacketContext::TContextStatus aContextStatus )
- {
- if ( aContextStatus != iContextStatus )
- {
- iContextStatus = aContextStatus;
-TFLOGSTRING3( "TSY: CMmMBMSContextTsy::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 )
- {
- iContextStatusBeforeDeactivation = RPacketContext::EStatusDeleted;
- }
- }
-
- // if context status is receiving, update dynamic caps
- if ( RPacketContext::EStatusReceiving == iContextStatus)
- {
- iMmPacketService->ActivePacketServiceExtension()->SetDynamicCapsFlag( RPacketService::KCapsMBMS, ETrue );
- }
- // context status is changing from receiving to something else
- else
- {
- iMmPacketService->ActivePacketServiceExtension()->SetDynamicCapsFlag( RPacketService::KCapsMBMS, EFalse );
- }
-
- // Reset req handle. Returns the deleted req handle
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeMbmsContextNotifyStatusChange );
-
- if (( EMultimodePacketMbmsReqHandleUnknown != reqHandle ) && (iRetNotifyStatus != NULL))
- {
- // Get current status
- *iRetNotifyStatus = aContextStatus;
- // Null ret pointer
- iRetNotifyStatus = NULL;
- // Complete the client request
- CMmMBMSContextTsy::ReqCompleted( reqHandle, KErrNone );
- }
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::CompleteNotifyStatusChange
-// Complete the notification when the context status changes.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmMBMSContextTsy::CompleteNotifyStatusChange(
- const CMmDataPackage* aDataPackage,
- TInt aResult )
- {
- if( KErrNone != aResult )
- {
- SetLastErrorCause( aResult );
- }
- else
- {
- TInfoName* null= NULL;
- RPacketContext::TContextStatus contextStatus;
-
- //initialise struct for completion params
- TContextMisc misc;
-
- aDataPackage->UnPackData( null, misc );
- contextStatus = misc.iStatus;
-
- CMmMBMSContextTsy::CompleteNotifyStatusChange(contextStatus);
- }
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::SetConfigL
-// Configure a context to the phone.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::SetConfigL(
- TPacketDataConfigBase* aConfig )
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::SetConfigL. Context name:%S", &iContextName );
-
- TInt ret( KErrArgument );
-
- if ( TPacketDataConfigBase::KConfigMBMS == aConfig->ExtensionId() )
- {
- if( !iIsInitialiseAllowed )
- {
-
- RPacketMbmsContext::TContextConfigMbmsV1* configMbms =
- ( RPacketMbmsContext::TContextConfigMbmsV1* )aConfig;
-
- if ( NULL == iTempConfig )
- {
- // Allocate memory for iTempConfig
- iTempConfig =
- new ( ELeave ) RPacketMbmsContext::TContextConfigMbmsV1();
- }
-
- // Temporary store the configMBMS
- *iTempConfig = *configMbms;
-
- CMmDataPackage data;
- data.PackData( &( *aConfig ), &iContextName );
-
-TFLOGSTRING2("TSY: CMmMBMSContextTsy::SetConfigL. Context: %S", &iContextName);
-
- ret = iMmPacketService->MessageManager()->HandleRequestL(
- EPacketContextSetConfig, &data );
-
- if ( KErrNone != ret )
- {
- // Release the memory allocated for iTempConfig
- delete iTempConfig;
- iTempConfig = NULL;
- }
- }
- else
- {
- ret = KErrNotReady;
- }
- }
-
- if ( KErrNone == ret )
- {
- // Store the request handle type
- iReqHandleType = EMultimodePacketMbmsContextSetConfig;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::CompleteSetConfig
-// Complete the asynchronous SetConfig request.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmMBMSContextTsy::CompleteSetConfig(
- TInt aError )
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::CompleteSetConfig. Error: %d", aError );
-
- if( (KErrNone == aError) && (iConfig) && (iTempConfig) )
- {
- *iConfig = *iTempConfig;
- // Release the memory allocated for iTempConfig
- delete iTempConfig;
- iTempConfig = NULL;
- CompleteNotifyConfigChanged();
- }
-
- TTsyReqHandle reqHandle( EMultimodePacketMbmsReqHandleUnknown );
- reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(EMultimodePacketMbmsContextSetConfig );
-
- if ( EMultimodePacketMbmsReqHandleUnknown != reqHandle )
- {
- // Complete the client request
- CMmMBMSContextTsy::ReqCompleted( reqHandle, aError );
- }
-
- }
-
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::ContextStatus
-// Return current context status.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-RPacketContext::TContextStatus CMmMBMSContextTsy::ContextStatus() const
- {
- return iContextStatus;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::ReqCompleted
-// Overloads CTelObject::ReqCompleted.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-
-void CMmMBMSContextTsy::ReqCompleted(
- TTsyReqHandle aTsyReqHandle,
- TInt aError )
- {
-TFLOGSTRING3( "TSY: CMmMBMSContextTsy::ReqCompleted. Handle:%d Error:%d", aTsyReqHandle, aError );
-
- // Set last error cause
- if ( KErrNone != aError )
- {
- iLastErrorCause = aError;
- }
-
- CTelObject::ReqCompleted( aTsyReqHandle, aError );
-
- }
-
-#ifdef REQHANDLE_TIMER
-
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::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 CMmMBMSContextTsy::SetTypeOfResponse(
- TInt aReqHandleType,
- TTsyReqHandle aTsyReqHandle )
- {
- TInt timeOut( 0 );
-
- // Set timeout by req handle type
- switch ( aReqHandleType )
- {
- case EMultimodePacketMbmsInitialiseContext:
- timeOut = KMmPacketContextInitialiseContextTimeOut;
- break;
- case EMultimodePacketMbmsContextSetConfig:
- timeOut = KMmPacketContextSetConfigTimeOut;
- break;
- case EMultimodeMbmsContextActivate:
- timeOut = KMmPacketContextActivateTimeOut;
- break;
- case EMultimodeMbmsContextDeactivate:
- timeOut = KMmPacketContextDeactivateTimeOut;
- break;
- case EMultimodeMbmsContextDelete:
- timeOut = KMmPacketContextDeleteTimeOut;
- break;
- case EMultimodeMbmsContextUpdateMbmsSessionList:
- timeOut = KMmPacketContextModifyActiveContext;
- 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 );
- }
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::Complete
-// Completes the request due the timer expiration. This method is used only if
-// REQHANDLE_TIMER is in use.
-// ---------------------------------------------------------------------------
-//
-void CMmMBMSContextTsy::Complete(
- const TInt aReqHandleType,
- const TInt aError )
- {
-TFLOGSTRING2( "TSY: CMmMBMSContextTsy::Complete. Req type %d", aReqHandleType );
-
-
- // All possible TSY req handle types are listed in the
- // switch case below.
- switch ( aReqHandleType )
- {
- case EMultimodePacketMbmsInitialiseContext:
- CMmMBMSContextTsy::CompleteInitialiseContext( aError, NULL );
- break;
- case EMultimodePacketMbmsContextSetConfig:
- CMmMBMSContextTsy::CompleteSetConfig( aError );
- break;
- case EMultimodeMbmsContextActivate:
- CMmMBMSContextTsy::CompleteActivate( aError );
- break;
- case EMultimodeMbmsContextDeactivate:
- CMmMBMSContextTsy::CompleteDeactivate( NULL, aError );
- break;
- case EMultimodeMbmsContextDelete:
- CMmMBMSContextTsy::CompleteDelete( aError );
- break;
- case EMultimodeMbmsContextUpdateMbmsSessionList:
- CMmMBMSContextTsy::CompleteUpdateMbmsSessionList( aError );
- break;
- // Can't use timer:
- // - all notifications
- //case EMultimodePacketContextNotifyConfigChanged:
- //case EMultimodePacketContextNotifyConnectionSpeedChange:
- //case EMultimodePacketContextNotifyStatusChange:
- default:
- CMmMBMSContextTsy::ReqCompleted( iTsyReqHandleStore->
- ResetTsyReqHandle( aReqHandleType ), aError );
- break;
- }
-
- }
-
-#endif // REQHANDLE_TIMER
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::IsContextActivationAllowed
-// Tells if context activation is allowed.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TBool CMmMBMSContextTsy::IsContextActivationAllowed() const
- {
- return iIsActivateAllowed;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::ContextName
-// This method returns name of this context
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-const TInfoName &CMmMBMSContextTsy::ContextName() const
- {
- return iContextName;
- }
-
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::ContextIndex
-// This method returns name of this context
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::ContextIndex() const
- {
- return iObjectId;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::UpdateMbmsSessionList
-// Method to change content of session list
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::UpdateMbmsSessionList(
- TMbmsAction* aAction,
- TMbmsSessionId* aSession )
- {
-TFLOGSTRING3("TSY: CMmMBMSContextTsy::UpdateMbmsSessionList. Context: %S, action: %d", &iContextName, aAction);
- TInt ret( KErrNone );
-
- if( iConfig->iMbmsSessionFlag )
- {
- iAction = *aAction;
- iSession = *aSession;
-
- // changes send to LTSY
- TMmMbmsActiveServiceListParams activeServiceList;
- activeServiceList.iActionType = iAction;
- activeServiceList.iServiceList = iServicesArray;
- activeServiceList.iChangedItem = iSession;
-
- CMmDataPackage data;
- data.PackData( &iContextName, &activeServiceList );
-
- TRAPD(err, ret = iMmPacketService->MessageManager()->HandleRequestL(
- EPacketContextUpdateMbmsSessionList, &data ));
- if(err !=KErrNone)
- {
- ret = err;
- }
- }
- else
- // this context does not support sessions
- {
- ret = KErrNotSupported;
- }
-
- if ( KErrNone == ret )
- {
- // Store the request handle type
- iReqHandleType = EMultimodeMbmsContextUpdateMbmsSessionList;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::CompleteUpdateMbmsSessionList
-// Complete change in content of session list to client
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-void CMmMBMSContextTsy::CompleteUpdateMbmsSessionList(
- const TInt aResult )
- {
-TFLOGSTRING3("TSY: CMmMBMSContextTsy::CompleteUpdateMbmsSessionList. Context: %S, result: %d", &iContextName, aResult);
-
- TInt ret( aResult );
-
- if( iMmPacketService->MaximumActiveServices() > iMmPacketService->EnumerateMbmsActiveServices() )
- {
- if( KErrNone == ret )
- {
- switch( iAction )
- {
- case EAddEntries:
- {
- // verify that item id does not exists
- for( TInt i=0; i<iServicesArray->iSessionIdList.Count(); i++ )
- {
- if( iServicesArray->iSessionIdList[i] == iSession )
- {
- // item already exists
- ret = KErrAlreadyExists;
- i = iServicesArray->iSessionIdList.Count();
- }
- }
- // if ID is a new one; add it to array
- if( KErrNone == ret )
- {
- iServicesArray->iSessionIdList.Append(iSession);
- iServicesArray->iSessionIdList.Compress();
- }
- break;
- }
- case ERemoveEntries:
- {
- TInt idx( -1 );
- // find index of item to remove
- for( TInt i=0; i<iServicesArray->iSessionIdList.Count(); i++ )
- {
- if( iServicesArray->iSessionIdList[i] == iSession )
- {
- idx = i;
- i = iServicesArray->iSessionIdList.Count();
- }
- }
- // item is in array, remove it
- if( 0 <= idx )
- {
- iServicesArray->iSessionIdList.Remove(idx);
- iServicesArray->iSessionIdList.Compress();
- }
- else
- {
- ret = KErrNotFound;
- }
- break;
-
- }
- case ERemoveAllEntries:
- {
- // just empty array
- iServicesArray->iSessionIdList.Reset();
- iServicesArray->iSessionIdList.Compress();
- break;
- }
- default:
- break;
- }
- }
- }
- else
- {
- ret = KErrOverflow;
- }
-
- TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
- EMultimodeMbmsContextUpdateMbmsSessionList );
-
- if ( EMultimodePacketMbmsReqHandleUnknown != reqHandle )
- {
- // Complete the client request
- CMmMBMSContextTsy::ReqCompleted( reqHandle, ret );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::GetMbmsActiveServicesPhase1L
-// First phase of MBMS session retrieval
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::GetMbmsActiveServicesPhase1L(
- TTsyReqHandle aTsyReqHandle,
- RMobilePhone::TClientId* aClient,
- TInt* aBufSize )
- {
- TInt ret( KErrNone );
-TFLOGSTRING("TSY: CMmMBMSContextTsy::GetMbmsActiveServicesPhase1L");
-
- if (iServicesArray->iSessionIdList.Count() > 0)
- {
- // Presently internal attribute, used only by this method.
- iClientId = *aClient;
-
- // Serialize data (RPacketMbmsContext::CMbmsSession)
- // into iActiveSessionInfoBuffer
- iServicesArray->ExternalizeL( iActiveSessionInfoBuffer );
-
- *aBufSize = iActiveSessionInfoBuffer->Length();
-
- ReqCompleted( aTsyReqHandle, KErrNone );
- }
- else
- {
- ret = KErrNotFound;
- }
-
- return ret;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::GetMbmsActiveServicesPhase2L
-// Second phase of MBMS session retrieval
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::GetMbmsActiveServicesPhase2L(
- TTsyReqHandle aTsyReqHandle,
- RMobilePhone::TClientId* aClient,
- TDes8* aBuffer )
- {
-TFLOGSTRING("TSY: CMmMBMSContextTsy::GetMbmsActiveServicesPhase2L");
-
- TInt error = KErrNone;
-
- // Check client id
- if (( aClient->iSessionHandle != iClientId.iSessionHandle
- || aClient->iSubSessionHandle !=
- iClientId.iSubSessionHandle ) || (iActiveSessionInfoBuffer == NULL))
- {
- error = KErrBadHandle;
- }
- else
- {
- // Copy data to client buffer
- TPtr8 bufPtr = iActiveSessionInfoBuffer->Des();
- if ( bufPtr.Length() <= aBuffer->Length() )
- {
- aBuffer->Copy( bufPtr );
- }
- else
- {
- error = KErrArgument;
- }
-
- // delete the buffer
- if ( iActiveSessionInfoBuffer )
- {
- delete iActiveSessionInfoBuffer;
- iActiveSessionInfoBuffer = NULL;
- }
- }
- ReqCompleted( aTsyReqHandle, error );
- return KErrNone;
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::CancelGetMbmsActiveServicesPhase1
-// Cancelling MBMS session retrieval
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::CancelGetMbmsActiveServicesPhase1()
- {
- // delete the buffer
- if ( iActiveSessionInfoBuffer )
- {
- delete iActiveSessionInfoBuffer;
- iActiveSessionInfoBuffer = NULL;
- }
-
- ReqCompleted( iTsyReqHandle, KErrCancel );
- return KErrNone;
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::SessionCount
-// Returns the session count to a MBMS context
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-TInt CMmMBMSContextTsy::SessionCount()
- {
-
- return iServicesArray->iSessionIdList.Count();
-
- }
-
-// ---------------------------------------------------------------------------
-// CMmMBMSContextTsy::ContextType
-// return the context type
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-CMmPacketContextTsy::TPacketContextType CMmMBMSContextTsy::ContextType() const
-{
- return EContextTypeMBMS;
-}
-
-// 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 "cmmmbmscontexttsy.h"
+#include "cmmmbmscontextlist.h"
+#include "CMmPacketTsy.h"
+#include <ctsy/tflogger.h>
+#include "mbmstypes.h"
+#include "MmTsy_timeoutdefs.h"
+#include "MmTsy_numberOfSlots.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+CMmMBMSContextTsy::CMmMBMSContextTsy()
+ {
+ }
+
+CMmMBMSContextTsy* CMmMBMSContextTsy::NewL(
+ CMmPacketServiceTsy* aMmPacketService,
+ const TDes& aName,
+ const TUint8 aProxyId )
+ {
+TFLOGSTRING( "TSY: CMmMBMSContextTsy::NewL" );
+
+ CMmMBMSContextTsy* packetContext = new ( ELeave ) CMmMBMSContextTsy();
+ CleanupClosePushL( *packetContext );
+ packetContext->ConstructL( aMmPacketService, aName, aProxyId );
+ CleanupStack::Pop();
+
+ return packetContext;
+ }
+
+void CMmMBMSContextTsy::ConstructL(CMmPacketServiceTsy* const aMmPacketService,
+ const TDes& aName,
+ TUint8 aProxyId)
+ {
+ iMmPacketService = aMmPacketService;
+ iContextName = aName;
+ iObjectId = aProxyId;
+
+ iConfig = new ( ELeave ) RPacketMbmsContext::TContextConfigMbmsV1();
+
+#ifdef REQHANDLE_TIMER
+ // Create req handle store
+ iTsyReqHandleStore = CMmTsyReqHandleStore::NewL( this,
+ iMmPacketService->PhoneTsy(), EMaxNumOfMBMSContextRequests,
+ iPacketContextReqHandles );
+
+#else
+ // Create req handle store
+ iTsyReqHandleStore = CMmTsyReqHandleStore::NewL(
+ EMaxNumOfMBMSContextRequests, iPacketContextReqHandles );
+
+#endif // REQHANDLE_TIMER
+ iIsInitialiseAllowed = ETrue;
+ iServicesArray = RPacketMbmsContext::CMbmsSession::NewL();
+ iContextStatus = RPacketContext::EStatusUnknown;
+ }
+
+CMmMBMSContextTsy::~CMmMBMSContextTsy()
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::~CMmMBMSContextTsy Context name: %S", &iContextName );
+
+ if( iMmPacketService )
+ {
+ iMmPacketService->MBMSContextList()->RemoveObject( this );
+
+ // Set Dynamic Caps
+ iMmPacketService->ActivePacketServiceExtension()->SetDynamicCapsFlag(
+ RPacketService::KCapsActivate, EFalse );
+ }
+
+ delete iServicesArray;
+ iServicesArray = NULL;
+
+ delete iTsyReqHandleStore;
+ iTsyReqHandleStore = NULL;
+
+ delete iConfig;
+ iConfig = NULL;
+
+ delete iTempConfig;
+ iTempConfig = NULL;
+
+ }
+
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::ExtFunc
+// TRAP's all CMmMBMSContextTsy 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 CMmMBMSContextTsy::ExtFunc(
+ TTsyReqHandle aTsyReqHandle,
+ TInt aIpc,
+ const TDataPackage& aPackage )
+ {
+TFLOGSTRING3( "TSY: CMmMBMSContextTsy::ExtFunc. IPC: %d Context name:%S", aIpc, &iContextName );
+
+ TInt ret( KErrNone );
+ TInt trapError( KErrNone );
+
+ // Reset last tsy request type
+ iReqHandleType = EMultimodePacketMbmsReqHandleUnknown;
+
+ // Set tsy request handle
+ iTsyReqHandle = aTsyReqHandle;
+
+ // 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 ( EMultimodePacketMbmsReqHandleUnknown != iReqHandleType )
+ {
+#ifdef REQHANDLE_TIMER
+ SetTypeOfResponse( iReqHandleType, aTsyReqHandle );
+#else
+ iTsyReqHandleStore->SetTsyReqHandle( iReqHandleType, aTsyReqHandle );
+#endif // REQHANDLE_TIMER
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::DoExtFuncL
+// Packet Data specific functionality of CMmMBMSContextTsy::ExtFunc
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::DoExtFuncL(
+ TTsyReqHandle aTsyReqHandle,
+ TInt aIpc,
+ const TDataPackage& aPackage )
+ {
+TFLOGSTRING3( "TSY: CMmMBMSContextTsy::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 EPacketContextInitialiseContext:
+ ret = InitialiseContextL( reinterpret_cast< RPacketContext::TDataChannelV2*>( dataPtr ));
+ 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 EPacketContextGetLastErrorCause:
+ ret = GetLastErrorCause( aTsyReqHandle,
+ reinterpret_cast< TInt*>( dataPtr ) );
+ break;
+ case EPacketContextUpdateMbmsSessionList:
+ ret = UpdateMbmsSessionList(
+ reinterpret_cast< TMbmsAction*>( dataPtr ),
+ reinterpret_cast< TMbmsSessionId*>( dataPtr2 ) );
+ break;
+ case EPacketGetMbmsSessionListPhase1:
+ ret = GetMbmsActiveServicesPhase1L( aTsyReqHandle,
+ reinterpret_cast< RMobilePhone::TClientId*>( dataPtr ),
+ reinterpret_cast< TInt*>( dataPtr2 ) );
+ break;
+
+ case EPacketGetMbmsSessionListPhase2:
+ ret = GetMbmsActiveServicesPhase2L( aTsyReqHandle,
+ reinterpret_cast< RMobilePhone::TClientId*>( dataPtr ),
+ aPackage.Des2n() );
+ break;
+ // These requests currently not supported
+ case EPacketContextLoanCommPort:
+ case EPacketContextRecoverCommPort:
+ case EPacketContextNotifyDataTransferred:
+ case EPacketContextGetProfileName:
+ case EPacketContextGetConnectionSpeed:
+ case EPacketContextGetDataVolumeTransferred:
+ case EPacketContextEnumeratePacketFilters:
+ case EPacketContextGetPacketFilterInfo:
+ case EPacketContextAddPacketFilter:
+ case EPacketContextRemovePacketFilter:
+ case EPacketContextModifyActiveContext:
+ case EPacketContextGetDNSInfo:
+ case EPacketAddMediaAuthorization:
+ case EPacketRemoveMediaAuthorization:
+ default:
+ break;
+ }
+
+ return ret;
+ }
+
+
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::ReqModeL
+// Returns request mode for given IPC.
+// ---------------------------------------------------------------------------
+//
+CTelObject::TReqMode CMmMBMSContextTsy::ReqModeL(
+ TInt aIpc )
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::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 EPacketContextGetLastErrorCause:
+
+ // 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.
+
+ 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 EPacketContextUpdateMbmsSessionList:
+ case EPacketContextInitialiseContext:
+ case EPacketContextActivate:
+ case EPacketContextDelete:
+ case EPacketContextSetConfig:
+ case EPacketContextAddPacketFilter:
+ case EPacketContextRemovePacketFilter:
+
+ case EPacketContextDeactivate:
+ {
+ 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 EPacketContextNotifyStatusChange:
+ reqMode = KReqModeMultipleCompletionEnabled |
+ KReqModeRePostImmediately;
+ break;
+
+ case EPacketGetMbmsSessionListPhase1:
+ case EPacketGetMbmsSessionListPhase2:
+ reqMode = 0;
+ 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:
+ //case EPacketContextModifyActiveContext:
+ // Default
+ default:
+ doLeave = ETrue;
+ break;
+ }
+
+ if ( doLeave )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ return reqMode;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::NumberOfSlotsL
+// Returns number of slots to be used for given IPC.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::NumberOfSlotsL(
+ TInt aIpc )
+ {
+ TInt numberOfSlots( 0 );
+
+ switch ( aIpc )
+ {
+ case EPacketContextNotifyStatusChange:
+ numberOfSlots = KMmPacketContextNotifyStatusChangeSlots;
+ break;
+ case EPacketContextNotifyConfigChanged:
+ numberOfSlots = KMmPacketContextNotifyConfigChangedSlots;
+ break;
+
+ default:
+ // Unknown or invalid IPC
+ User::Leave( KErrNotSupported );
+ break;
+
+ }
+TFLOGSTRING3( "TSY: CMmMBMSContextTsy::NumberOfSlotsL. IPC: %d Number of slots: %d", aIpc, numberOfSlots );
+
+ return numberOfSlots;
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::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 CMmMBMSContextTsy::CancelService(
+ TInt aIpc,
+ TTsyReqHandle aTsyReqHandle )
+ {
+TFLOGSTRING3( "TSY: CMmMBMSContextTsy::CancelService. IPC: %d Handle:%d", aIpc, aTsyReqHandle );
+
+ TInt ret( KErrNone );
+ //TTsyReqHandle reqHandle( NULL );
+ // Reset last tsy request type
+ iReqHandleType = EMultimodePacketMbmsReqHandleUnknown;
+
+ 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 EPacketContextUpdateMbmsSessionList:
+ case EPacketContextInitialiseContext:
+ case EPacketContextActivate:
+ case EPacketContextDeactivate:
+ case EPacketContextDelete:
+ case EPacketContextSetConfig:
+ case EPacketContextGetConfig:
+ break;
+ case EPacketGetMbmsSessionListPhase1:
+ ret = CancelGetMbmsActiveServicesPhase1();
+ break;
+ // Notification Cancels, no special requirements.
+ case EPacketContextNotifyStatusChange:
+ iRetNotifyStatus = NULL;
+ iReqHandleType = EMultimodeMbmsContextNotifyStatusChange;
+ break;
+ case EPacketContextNotifyConfigChanged:
+ iRetNotifyConfig = NULL;
+ iReqHandleType = EMultimodeMbmsContextNotifyConfigChanged;
+ break;
+
+ // IPCs that are not supported
+ //case EPacketContextLoanCommPort:
+ //case EPacketContextRecoverCommPort:
+ //case EPacketContextNotifyDataTransferred:
+ //case EPacketContextModifyActiveContext:
+ // Default
+ default:
+ ret = KErrNotSupported;
+ break;
+ }
+
+ if ( EMultimodePacketMbmsReqHandleUnknown != iReqHandleType )
+ {
+ // Reset tsy request handle
+ iTsyReqHandleStore->ResetTsyReqHandle( iReqHandleType );
+
+ // Complete request
+ CMmMBMSContextTsy::ReqCompleted( aTsyReqHandle, KErrCancel );
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::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 CMmMBMSContextTsy::RegisterNotification(
+ TInt aIpc )
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::RegisterNotification. IPC: %d", aIpc );
+
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ case EPacketContextNotifyConfigChanged:
+ case EPacketContextNotifyStatusChange:
+ break;
+ //case EPacketContextNotifyDataTransferred:
+ default:
+ // Not supported
+ ret = KErrNotSupported;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::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 CMmMBMSContextTsy::DeregisterNotification(
+ TInt aIpc )
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::DeregisterNotification. IPC: %d", aIpc );
+
+ TInt ret( KErrNone );
+
+ switch ( aIpc )
+ {
+ case EPacketContextNotifyConfigChanged:
+ case EPacketContextNotifyStatusChange:
+ break;
+ //case EPacketContextNotifyDataTransferred:
+ default:
+ // Not supported
+ ret = KErrNotSupported;
+ break;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::InitialiseContextL
+// This function initialises the context created previously.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::InitialiseContextL( RPacketContext::TDataChannelV2* aDataChannel )
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::InitialiseContextL. %S", &iContextName );
+
+ TInt ret( KErrArgument );
+
+ if ( iIsInitialiseAllowed )
+ {
+ CMmDataPackage dataPackage;
+ dataPackage.PackData( &iContextName);
+ iDataChannelV2 = aDataChannel;
+
+ ret = iMmPacketService->MessageManager()->HandleRequestL(
+ ECtsyPacketMbmsInitialiseContextReq, &dataPackage );
+
+ if( KErrNone == ret )
+ {
+ iIsInitialiseAllowed = EFalse;
+ }
+ }
+
+ if ( KErrNone == ret )
+ {
+ // Store the request handle
+ iReqHandleType = EMultimodePacketMbmsInitialiseContext;
+ }
+
+
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::CompleteInitialiseContext
+// Complete the asynchronous InitialiseContext request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+
+void CMmMBMSContextTsy::CompleteInitialiseContext(TInt aResult, RPacketContext::TDataChannelV2* aDataChannel )
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::CompleteInitialiseContext. Error: %d", aResult );
+
+ iIsActivateAllowed = ETrue;
+ if (KErrNone == aResult )
+ {
+ CompleteNotifyStatusChange( RPacketContext::EStatusInactive );
+ if((aDataChannel != NULL) && (iDataChannelV2 != NULL))
+ {
+ *iDataChannelV2 = *aDataChannel;
+ iDataChannelV2 = NULL;
+ }
+ // Set Dynamic Caps
+ iMmPacketService->ActivePacketServiceExtension()->SetDynamicCapsFlag(
+ RPacketService::KCapsActivate, iIsActivateAllowed );
+ }
+ else
+ {
+ iIsInitialiseAllowed = ETrue;
+ }
+
+ // Reset the req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodePacketContextInitialiseContext );
+
+ if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
+ {
+ // Complete the client request
+ ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::ActivateL
+// Activate a context. This function activates a context that has been
+// previously configured using the SetConfig() method from RPacketMbmsContext.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::ActivateL()
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::ActivateL. Context name:%S", &iContextName );
+
+ TInt ret( KErrNotReady );
+
+ if ( iIsActivateAllowed )
+ {
+ // verify that max activate context is not exceed
+ if( iMmPacketService->MaximumActiveServices() >
+ iMmPacketService->EnumerateMbmsActiveServices() )
+ {
+ // mbmscontext activation
+ CMmDataPackage data;
+ data.PackData( &iContextName );
+
+ ret = iMmPacketService->MessageManager()->HandleRequestL(
+ EPacketContextActivate, &data );
+ }
+ else
+ {
+ // max number of possible active context exceed
+ ret = KErrUmtsMaxNumOfContextExceededByPhone;
+ }
+ if ( KErrNone == ret )
+ {
+ iIsActivateAllowed = EFalse;
+ CompleteNotifyStatusChange( RPacketContext::EStatusActivating );
+ }
+ }
+
+ if ( KErrNone == ret )
+ {
+ // Store the request handle
+ iReqHandleType = EMultimodeMbmsContextActivate;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::CompleteActivate
+// Complete the asynchronous Activate request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmMBMSContextTsy::CompleteActivate(TInt aResult)
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::CompleteActivate. Error: %d", aResult );
+
+ // Reset the req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeMbmsContextActivate );
+
+ if ( KErrNone == aResult )
+ {
+
+ CompleteNotifyConfigChanged();
+
+ // Notify status change
+ CompleteNotifyStatusChange( RPacketContext::EStatusActive );
+ }
+ else
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::CompleteActivate. ErrorCause: %d",
+ aResult );
+ // Re-activation is allowed because activation has not succeeded
+ iIsActivateAllowed = ETrue;
+ }
+
+
+ if ( EMultimodePacketMbmsReqHandleUnknown != reqHandle )
+ {
+
+ // Complete the client request
+ CMmMBMSContextTsy::ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::Deactivate
+// Deactivate a context previously configured on the phone.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::DeactivateL()
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::DeactivateL. Context name:%S", &iContextName );
+
+ TInt ret( KErrArgument );
+
+ CMmDataPackage data;
+ data.PackData( &iContextName, &iServicesArray );
+ ret = iMmPacketService->MessageManager()->HandleRequestL(
+ EPacketContextDeactivate, &data );
+
+ if ( KErrNone == ret )
+ {
+ iContextStatusBeforeDeactivation = ContextStatus();
+ // Notify status change
+ CompleteNotifyStatusChange( RPacketContext::EStatusDeactivating );
+
+ // Store the request handle
+ iReqHandleType = EMultimodeMbmsContextDeactivate;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::CompleteDeactivate
+// Complete the asynchronous Deactivate request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+
+void CMmMBMSContextTsy::CompleteDeactivate(
+ CMmDataPackage* aDataPackage,
+ TInt aResult )
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::CompleteDeactivate. Error: %d", aResult );
+ // Reset the req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeMbmsContextDeactivate );
+
+ // Notify status change
+ if ( KErrNone == aResult )
+ {
+ CompleteNotifyStatusChange( RPacketContext::EStatusInactive );
+ // and reset possible session list
+ if( iServicesArray )
+ {
+ iServicesArray->iSessionIdList.Reset();
+ iServicesArray->iSessionIdList.Compress();
+ }
+ }
+ else
+ {
+ CompleteNotifyStatusChange( iContextStatusBeforeDeactivation );
+
+ // remove only entries which were succesfully removed
+ if( (aDataPackage) && (aResult == KErrMbmsImpreciseServiceEntries) )
+ {
+ TInfoName* contextName = NULL;
+ RPacketMbmsContext::CMbmsSession* listOfFailedEntries = NULL;
+ aDataPackage->UnPackData( &contextName, &listOfFailedEntries);
+ if( listOfFailedEntries )
+ {
+ for( TInt i = 0; i < listOfFailedEntries->iSessionIdList.Count(); i++ )
+ {
+ for( TInt ii = 0; ii < iServicesArray->iSessionIdList.Count(); ii++ )
+ {
+ if( listOfFailedEntries->iSessionIdList[i] == iServicesArray->iSessionIdList[ii] )
+ {
+ iServicesArray->iSessionIdList.Remove(ii);
+ iServicesArray->iSessionIdList.Compress();
+ ii = iServicesArray->iSessionIdList.Count();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Complete the client request
+ if ( EMultimodePacketMbmsReqHandleUnknown != reqHandle )
+ {
+ CMmMBMSContextTsy::ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::DeleteL
+// Delete a context id previously created on the phone.
+// Note that although the context is considered as 'deleted', the
+// client's RPacketMbmsContext subsession remains. To remove this, a client must
+// call Close() from RPacketMbmsContext.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::DeleteL()
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::DeleteL. Context name:%S", &iContextName );
+
+ TInt ret( KErrNotReady );
+ if( RPacketContext::EStatusUnknown != ContextStatus() )
+ {
+ CMmDataPackage data;
+ data.PackData( &iContextName );
+
+ ret = iMmPacketService->MessageManager()->HandleRequestL(
+ EPacketContextDelete, &data );
+
+ }
+
+ if ( KErrNone == ret )
+ {
+ // Store the request handle
+ iReqHandleType = EMultimodeMbmsContextDelete;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::CompleteDelete
+// Complete the asynchronous Delete request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+
+void CMmMBMSContextTsy::CompleteDelete(
+ TInt aResult )
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::CompleteDelete. Error: %d", aResult );
+
+ if( KErrNone == aResult )
+ {
+ iContextStatusBeforeDeactivation = RPacketContext::EStatusDeleted;
+
+ // Notify status change
+ CompleteNotifyStatusChange( RPacketContext::EStatusDeleted );
+
+ delete iConfig;
+ iConfig = NULL;
+ }
+
+ // Reset the req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeMbmsContextDelete );
+
+ if ( EMultimodePacketMbmsReqHandleUnknown != reqHandle )
+ {
+ // Complete the client request
+ CMmMBMSContextTsy::ReqCompleted( reqHandle, aResult );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::GetConfig
+// Requests the current configuration of the context.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::GetConfig(
+ TTsyReqHandle aTsyReqHandle,
+ TPacketDataConfigBase* aConfig )
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::GetConfig. Context name:%S", &iContextName );
+ TInt ret( KErrNone );
+
+ // Check that the mode given in aConfig is KConfigMBMS
+ if ( TPacketDataConfigBase::KConfigMBMS == aConfig->ExtensionId() )
+ {
+ // Set configuration data to ETel side memory
+ *( RPacketMbmsContext::TContextConfigMbmsV1* )aConfig =
+ *iConfig;
+ }
+ else
+ {
+ // Given mode is not supported
+ ret = KErrArgument;
+ }
+
+ // Complete Request
+ CMmMBMSContextTsy::ReqCompleted( aTsyReqHandle, ret );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::GetLastErrorCause
+// This function retrieves the last error cause to have occurred.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::GetLastErrorCause(
+ TTsyReqHandle aTsyReqHandle,
+ TInt* aError )
+ {
+TFLOGSTRING3( "TSY: CMmMBMSContextTsy::GetLastErrorCause. Context name:%S Last error cause: %d", &iContextName, iLastErrorCause );
+
+ *aError = iLastErrorCause;
+ CMmMBMSContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::SetLastErrorCause
+// Set the last error cause.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmMBMSContextTsy::SetLastErrorCause(
+ TInt aErrorCause )
+ {
+
+ iLastErrorCause = aErrorCause;
+
+TFLOGSTRING3( "TSY: CMmMBMSContextTsy::SetLastErrorCause. aErrorCause: %d iLastErrorCause:%d",
+ aErrorCause, iLastErrorCause );
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::GetStatus
+// Allows a client to get the current status of the context.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::GetStatus(
+ TTsyReqHandle aTsyReqHandle,
+ RPacketContext::TContextStatus* aContextStatus )
+ {
+TFLOGSTRING3( "TSY: CMmMBMSContextTsy::GetStatus. Context name: %S Context Status:%d", &iContextName, iContextStatus );
+ *aContextStatus = iContextStatus;
+ CMmMBMSContextTsy::ReqCompleted( aTsyReqHandle, KErrNone );
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::NotifyConfigChanged
+// Requests notification when configuration of context changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::NotifyConfigChanged(
+ TPacketDataConfigBase* aConfig )
+ {
+TFLOGSTRING( "TSY: CMmMBMSContextTsy::NotifyConfigChanged." );
+
+ // Check that used mode is MBMS
+ if ( TPacketDataConfigBase::KConfigMBMS != aConfig->ExtensionId() )
+ {
+ return KErrArgument;
+ }
+
+ // Store pointer
+ iRetNotifyConfig = aConfig;
+ // Store req handle type
+ iReqHandleType = EMultimodeMbmsContextNotifyConfigChanged;
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::CompleteNotifyConfigChanged
+// Complete notification when the context configuration changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmMBMSContextTsy::CompleteNotifyConfigChanged(const CMmDataPackage* aDataPackage,
+ TInt aResult)
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::CompleteNotifyConfigChanged. Context name:%S",
+ &iContextName );
+ if(aDataPackage != NULL)
+ {
+ if ( KErrNone == aResult )
+ {
+ RPacketMbmsContext::TContextConfigMbmsV1* aConfig = NULL;
+ TInfoName* name = NULL;
+ aDataPackage->UnPackData( &name, &aConfig );
+
+ if( NULL != aConfig )
+ {
+ iConfig->iTmgi = aConfig->iTmgi;
+ iConfig->iMbmsAccessBearer = aConfig->iMbmsAccessBearer;
+ iConfig->iMbmsServicePriority = aConfig->iMbmsServicePriority;
+ iConfig->iMbmsServiceMode = aConfig->iMbmsServiceMode;
+ iConfig->iMbmsSessionFlag = aConfig->iMbmsSessionFlag;
+
+ }
+ }
+ }
+
+ // Get and reset req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeMbmsContextNotifyConfigChanged );
+
+ if ( EMultimodePacketContextReqHandleUnknown != reqHandle )
+ {
+#ifdef USING_CTSY_DISPATCHER
+ //CTSY defect, request is completed with KErrNone, aResult ignored.
+ if( (iConfig) && (aResult == KErrNone) )
+#else
+ if( NULL != iConfig )
+#endif //USING_CTSY_DISPATCHER
+ {
+
+ *( RPacketMbmsContext::TContextConfigMbmsV1* )iRetNotifyConfig = *iConfig;
+ // Null ret pointer
+ iRetNotifyConfig = NULL;
+ }
+
+ // Complete the client request
+#ifdef USING_CTSY_DISPATCHER
+ CMmMBMSContextTsy::ReqCompleted( reqHandle, aResult );
+#else
+ CMmMBMSContextTsy::ReqCompleted( reqHandle, KErrNone );
+#endif //USING_CTSY_DISPATCHER
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::NotifyStatusChange
+// Requests notification when the status of the context changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::NotifyStatusChange(
+ RPacketContext::TContextStatus* aContextStatus )
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::NotifyStatusChange. Context name:%S", &iContextName );
+ iRetNotifyStatus = aContextStatus;
+ iReqHandleType = EMultimodeMbmsContextNotifyStatusChange;
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::CompleteNotifyStatusChange
+// Complete the notification when the context status changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmMBMSContextTsy::CompleteNotifyStatusChange(
+ RPacketContext::TContextStatus aContextStatus )
+ {
+ if ( aContextStatus != iContextStatus )
+ {
+ iContextStatus = aContextStatus;
+TFLOGSTRING3( "TSY: CMmMBMSContextTsy::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 )
+ {
+ iContextStatusBeforeDeactivation = RPacketContext::EStatusDeleted;
+ }
+ }
+
+ // if context status is receiving, update dynamic caps
+ if ( RPacketContext::EStatusReceiving == iContextStatus)
+ {
+ iMmPacketService->ActivePacketServiceExtension()->SetDynamicCapsFlag( RPacketService::KCapsMBMS, ETrue );
+ }
+ // context status is changing from receiving to something else
+ else
+ {
+ iMmPacketService->ActivePacketServiceExtension()->SetDynamicCapsFlag( RPacketService::KCapsMBMS, EFalse );
+ }
+
+ // Reset req handle. Returns the deleted req handle
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeMbmsContextNotifyStatusChange );
+
+ if (( EMultimodePacketMbmsReqHandleUnknown != reqHandle ) && (iRetNotifyStatus != NULL))
+ {
+ // Get current status
+ *iRetNotifyStatus = aContextStatus;
+ // Null ret pointer
+ iRetNotifyStatus = NULL;
+ // Complete the client request
+ CMmMBMSContextTsy::ReqCompleted( reqHandle, KErrNone );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::CompleteNotifyStatusChange
+// Complete the notification when the context status changes.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmMBMSContextTsy::CompleteNotifyStatusChange(
+ const CMmDataPackage* aDataPackage,
+ TInt aResult )
+ {
+ if( KErrNone != aResult )
+ {
+ SetLastErrorCause( aResult );
+ }
+ else
+ {
+ TInfoName* null= NULL;
+ RPacketContext::TContextStatus contextStatus;
+
+ //initialise struct for completion params
+ TContextMisc misc;
+
+ aDataPackage->UnPackData( null, misc );
+ contextStatus = misc.iStatus;
+
+ CMmMBMSContextTsy::CompleteNotifyStatusChange(contextStatus);
+ }
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::SetConfigL
+// Configure a context to the phone.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::SetConfigL(
+ TPacketDataConfigBase* aConfig )
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::SetConfigL. Context name:%S", &iContextName );
+
+ TInt ret( KErrArgument );
+
+ if ( TPacketDataConfigBase::KConfigMBMS == aConfig->ExtensionId() )
+ {
+ if( !iIsInitialiseAllowed )
+ {
+
+ RPacketMbmsContext::TContextConfigMbmsV1* configMbms =
+ ( RPacketMbmsContext::TContextConfigMbmsV1* )aConfig;
+
+ if ( NULL == iTempConfig )
+ {
+ // Allocate memory for iTempConfig
+ iTempConfig =
+ new ( ELeave ) RPacketMbmsContext::TContextConfigMbmsV1();
+ }
+
+ // Temporary store the configMBMS
+ *iTempConfig = *configMbms;
+
+ CMmDataPackage data;
+ data.PackData( &( *aConfig ), &iContextName );
+
+TFLOGSTRING2("TSY: CMmMBMSContextTsy::SetConfigL. Context: %S", &iContextName);
+
+ ret = iMmPacketService->MessageManager()->HandleRequestL(
+ EPacketContextSetConfig, &data );
+
+ if ( KErrNone != ret )
+ {
+ // Release the memory allocated for iTempConfig
+ delete iTempConfig;
+ iTempConfig = NULL;
+ }
+ }
+ else
+ {
+ ret = KErrNotReady;
+ }
+ }
+
+ if ( KErrNone == ret )
+ {
+ // Store the request handle type
+ iReqHandleType = EMultimodePacketMbmsContextSetConfig;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::CompleteSetConfig
+// Complete the asynchronous SetConfig request.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmMBMSContextTsy::CompleteSetConfig(
+ TInt aError )
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::CompleteSetConfig. Error: %d", aError );
+
+ if( (KErrNone == aError) && (iConfig) && (iTempConfig) )
+ {
+ *iConfig = *iTempConfig;
+ // Release the memory allocated for iTempConfig
+ delete iTempConfig;
+ iTempConfig = NULL;
+ CompleteNotifyConfigChanged();
+ }
+
+ TTsyReqHandle reqHandle( EMultimodePacketMbmsReqHandleUnknown );
+ reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(EMultimodePacketMbmsContextSetConfig );
+
+ if ( EMultimodePacketMbmsReqHandleUnknown != reqHandle )
+ {
+ // Complete the client request
+ CMmMBMSContextTsy::ReqCompleted( reqHandle, aError );
+ }
+
+ }
+
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::ContextStatus
+// Return current context status.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+RPacketContext::TContextStatus CMmMBMSContextTsy::ContextStatus() const
+ {
+ return iContextStatus;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::ReqCompleted
+// Overloads CTelObject::ReqCompleted.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+
+void CMmMBMSContextTsy::ReqCompleted(
+ TTsyReqHandle aTsyReqHandle,
+ TInt aError )
+ {
+TFLOGSTRING3( "TSY: CMmMBMSContextTsy::ReqCompleted. Handle:%d Error:%d", aTsyReqHandle, aError );
+
+ // Set last error cause
+ if ( KErrNone != aError )
+ {
+ iLastErrorCause = aError;
+ }
+
+ CTelObject::ReqCompleted( aTsyReqHandle, aError );
+
+ }
+
+#ifdef REQHANDLE_TIMER
+
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::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 CMmMBMSContextTsy::SetTypeOfResponse(
+ TInt aReqHandleType,
+ TTsyReqHandle aTsyReqHandle )
+ {
+ TInt timeOut( 0 );
+
+ // Set timeout by req handle type
+ switch ( aReqHandleType )
+ {
+ case EMultimodePacketMbmsInitialiseContext:
+ timeOut = KMmPacketContextInitialiseContextTimeOut;
+ break;
+ case EMultimodePacketMbmsContextSetConfig:
+ timeOut = KMmPacketContextSetConfigTimeOut;
+ break;
+ case EMultimodeMbmsContextActivate:
+ timeOut = KMmPacketContextActivateTimeOut;
+ break;
+ case EMultimodeMbmsContextDeactivate:
+ timeOut = KMmPacketContextDeactivateTimeOut;
+ break;
+ case EMultimodeMbmsContextDelete:
+ timeOut = KMmPacketContextDeleteTimeOut;
+ break;
+ case EMultimodeMbmsContextUpdateMbmsSessionList:
+ timeOut = KMmPacketContextModifyActiveContext;
+ 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 );
+ }
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::Complete
+// Completes the request due the timer expiration. This method is used only if
+// REQHANDLE_TIMER is in use.
+// ---------------------------------------------------------------------------
+//
+void CMmMBMSContextTsy::Complete(
+ const TInt aReqHandleType,
+ const TInt aError )
+ {
+TFLOGSTRING2( "TSY: CMmMBMSContextTsy::Complete. Req type %d", aReqHandleType );
+
+
+ // All possible TSY req handle types are listed in the
+ // switch case below.
+ switch ( aReqHandleType )
+ {
+ case EMultimodePacketMbmsInitialiseContext:
+ CMmMBMSContextTsy::CompleteInitialiseContext( aError, NULL );
+ break;
+ case EMultimodePacketMbmsContextSetConfig:
+ CMmMBMSContextTsy::CompleteSetConfig( aError );
+ break;
+ case EMultimodeMbmsContextActivate:
+ CMmMBMSContextTsy::CompleteActivate( aError );
+ break;
+ case EMultimodeMbmsContextDeactivate:
+ CMmMBMSContextTsy::CompleteDeactivate( NULL, aError );
+ break;
+ case EMultimodeMbmsContextDelete:
+ CMmMBMSContextTsy::CompleteDelete( aError );
+ break;
+ case EMultimodeMbmsContextUpdateMbmsSessionList:
+ CMmMBMSContextTsy::CompleteUpdateMbmsSessionList( aError );
+ break;
+ // Can't use timer:
+ // - all notifications
+ //case EMultimodePacketContextNotifyConfigChanged:
+ //case EMultimodePacketContextNotifyConnectionSpeedChange:
+ //case EMultimodePacketContextNotifyStatusChange:
+ default:
+ CMmMBMSContextTsy::ReqCompleted( iTsyReqHandleStore->
+ ResetTsyReqHandle( aReqHandleType ), aError );
+ break;
+ }
+
+ }
+
+#endif // REQHANDLE_TIMER
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::IsContextActivationAllowed
+// Tells if context activation is allowed.
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CMmMBMSContextTsy::IsContextActivationAllowed() const
+ {
+ return iIsActivateAllowed;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::ContextName
+// This method returns name of this context
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+const TInfoName &CMmMBMSContextTsy::ContextName() const
+ {
+ return iContextName;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::ContextIndex
+// This method returns name of this context
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::ContextIndex() const
+ {
+ return iObjectId;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::UpdateMbmsSessionList
+// Method to change content of session list
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::UpdateMbmsSessionList(
+ TMbmsAction* aAction,
+ TMbmsSessionId* aSession )
+ {
+TFLOGSTRING3("TSY: CMmMBMSContextTsy::UpdateMbmsSessionList. Context: %S, action: %d", &iContextName, aAction);
+ TInt ret( KErrNone );
+
+ if( iConfig->iMbmsSessionFlag )
+ {
+ iAction = *aAction;
+ iSession = *aSession;
+
+ // changes send to LTSY
+ TMmMbmsActiveServiceListParams activeServiceList;
+ activeServiceList.iActionType = iAction;
+ activeServiceList.iServiceList = iServicesArray;
+ activeServiceList.iChangedItem = iSession;
+
+ CMmDataPackage data;
+ data.PackData( &iContextName, &activeServiceList );
+
+ TRAPD(err, ret = iMmPacketService->MessageManager()->HandleRequestL(
+ EPacketContextUpdateMbmsSessionList, &data ));
+ if(err !=KErrNone)
+ {
+ ret = err;
+ }
+ }
+ else
+ // this context does not support sessions
+ {
+ ret = KErrNotSupported;
+ }
+
+ if ( KErrNone == ret )
+ {
+ // Store the request handle type
+ iReqHandleType = EMultimodeMbmsContextUpdateMbmsSessionList;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::CompleteUpdateMbmsSessionList
+// Complete change in content of session list to client
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CMmMBMSContextTsy::CompleteUpdateMbmsSessionList(
+ const TInt aResult )
+ {
+TFLOGSTRING3("TSY: CMmMBMSContextTsy::CompleteUpdateMbmsSessionList. Context: %S, result: %d", &iContextName, aResult);
+
+ TInt ret( aResult );
+
+ if( iMmPacketService->MaximumActiveServices() > iMmPacketService->EnumerateMbmsActiveServices() )
+ {
+ if( KErrNone == ret )
+ {
+ switch( iAction )
+ {
+ case EAddEntries:
+ {
+ // verify that item id does not exists
+ for( TInt i=0; i<iServicesArray->iSessionIdList.Count(); i++ )
+ {
+ if( iServicesArray->iSessionIdList[i] == iSession )
+ {
+ // item already exists
+ ret = KErrAlreadyExists;
+ i = iServicesArray->iSessionIdList.Count();
+ }
+ }
+ // if ID is a new one; add it to array
+ if( KErrNone == ret )
+ {
+ iServicesArray->iSessionIdList.Append(iSession);
+ iServicesArray->iSessionIdList.Compress();
+ }
+ break;
+ }
+ case ERemoveEntries:
+ {
+ TInt idx( -1 );
+ // find index of item to remove
+ for( TInt i=0; i<iServicesArray->iSessionIdList.Count(); i++ )
+ {
+ if( iServicesArray->iSessionIdList[i] == iSession )
+ {
+ idx = i;
+ i = iServicesArray->iSessionIdList.Count();
+ }
+ }
+ // item is in array, remove it
+ if( 0 <= idx )
+ {
+ iServicesArray->iSessionIdList.Remove(idx);
+ iServicesArray->iSessionIdList.Compress();
+ }
+ else
+ {
+ ret = KErrNotFound;
+ }
+ break;
+
+ }
+ case ERemoveAllEntries:
+ {
+ // just empty array
+ iServicesArray->iSessionIdList.Reset();
+ iServicesArray->iSessionIdList.Compress();
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+ else
+ {
+ ret = KErrOverflow;
+ }
+
+ TTsyReqHandle reqHandle = iTsyReqHandleStore->ResetTsyReqHandle(
+ EMultimodeMbmsContextUpdateMbmsSessionList );
+
+ if ( EMultimodePacketMbmsReqHandleUnknown != reqHandle )
+ {
+ // Complete the client request
+ CMmMBMSContextTsy::ReqCompleted( reqHandle, ret );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::GetMbmsActiveServicesPhase1L
+// First phase of MBMS session retrieval
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::GetMbmsActiveServicesPhase1L(
+ TTsyReqHandle aTsyReqHandle,
+ RMobilePhone::TClientId* aClient,
+ TInt* aBufSize )
+ {
+ TInt ret( KErrNone );
+TFLOGSTRING("TSY: CMmMBMSContextTsy::GetMbmsActiveServicesPhase1L");
+
+ if (iServicesArray->iSessionIdList.Count() > 0)
+ {
+ // Presently internal attribute, used only by this method.
+ iClientId = *aClient;
+
+ // Serialize data (RPacketMbmsContext::CMbmsSession)
+ // into iActiveSessionInfoBuffer
+ iServicesArray->ExternalizeL( iActiveSessionInfoBuffer );
+
+ *aBufSize = iActiveSessionInfoBuffer->Length();
+
+ ReqCompleted( aTsyReqHandle, KErrNone );
+ }
+ else
+ {
+ ret = KErrNotFound;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::GetMbmsActiveServicesPhase2L
+// Second phase of MBMS session retrieval
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::GetMbmsActiveServicesPhase2L(
+ TTsyReqHandle aTsyReqHandle,
+ RMobilePhone::TClientId* aClient,
+ TDes8* aBuffer )
+ {
+TFLOGSTRING("TSY: CMmMBMSContextTsy::GetMbmsActiveServicesPhase2L");
+
+ TInt error = KErrNone;
+
+ // Check client id
+ if (( aClient->iSessionHandle != iClientId.iSessionHandle
+ || aClient->iSubSessionHandle !=
+ iClientId.iSubSessionHandle ) || (iActiveSessionInfoBuffer == NULL))
+ {
+ error = KErrBadHandle;
+ }
+ else
+ {
+ // Copy data to client buffer
+ TPtr8 bufPtr = iActiveSessionInfoBuffer->Des();
+ if ( bufPtr.Length() <= aBuffer->Length() )
+ {
+ aBuffer->Copy( bufPtr );
+ }
+ else
+ {
+ error = KErrArgument;
+ }
+
+ // delete the buffer
+ if ( iActiveSessionInfoBuffer )
+ {
+ delete iActiveSessionInfoBuffer;
+ iActiveSessionInfoBuffer = NULL;
+ }
+ }
+ ReqCompleted( aTsyReqHandle, error );
+ return KErrNone;
+ }
+
+
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::CancelGetMbmsActiveServicesPhase1
+// Cancelling MBMS session retrieval
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::CancelGetMbmsActiveServicesPhase1()
+ {
+ // delete the buffer
+ if ( iActiveSessionInfoBuffer )
+ {
+ delete iActiveSessionInfoBuffer;
+ iActiveSessionInfoBuffer = NULL;
+ }
+
+ ReqCompleted( iTsyReqHandle, KErrCancel );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::SessionCount
+// Returns the session count to a MBMS context
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSContextTsy::SessionCount()
+ {
+
+ return iServicesArray->iSessionIdList.Count();
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSContextTsy::ContextType
+// return the context type
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+CMmPacketContextTsy::TPacketContextType CMmMBMSContextTsy::ContextType() const
+{
+ return EContextTypeMBMS;
+}
+
+// End of File