diff -r 000000000000 -r e686773b3f54 logsui/AocCtViewSrc/CLogsMMECallStatus.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/AocCtViewSrc/CLogsMMECallStatus.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,274 @@ +/* +* Copyright (c) 2002 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: +* Call active notifier: either for data or voice line, multi mode ETEL version. +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include "CLogsMMECallStatus.h" +#include "MLineStatusObserver.h" + +// CONSTANTS + +// ================= MEMBER FUNCTIONS ======================= + +// Standard creation function. +CLogsCallStatus* CLogsCallStatus::NewLC( const TLineStatus aLine ) + { + CLogsCallStatus* self = new ( ELeave ) CLogsCallStatus( aLine ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +CLogsCallStatus::~CLogsCallStatus() + { + Cancel(); + iLine.Close(); + CloseEtelConnection(); + delete iDataLine; + delete iSecondaryLine; + } + +void CLogsCallStatus::ConstructL() + { + CActiveScheduler::Add(this); + TInt ret = OpenEtelConnection(); + User::LeaveIfError( ret ); + + switch( iSelectedLine ) + { + case ECallAndDataLines: // FALLTHROUGH + { + // Voice and Data lines should be monitored, but only check data lines if they are + // supported by the TSY + TBool dataSupported(EFalse); + + // ignore errors... on error, dataSupported should remain EFalse + iServer.IsSupportedByModule( KMmTsyModuleName, KETelFuncMobileDataCall, dataSupported ); + + if ( dataSupported ) //For data we need another instance of this + { + CLogsCallStatus* tmp = CLogsCallStatus::NewLC( EDataLine ); + CleanupStack::Pop(); // tmp + iDataLine = tmp; + } + iSelectedLine = ECallLine; + } + case ECallLine: + { + TBool alsSupport(EFalse); //ALS alternate line service + // ignore errors... on error, alsSupport should remain EFalse + iServer.IsSupportedByModule( KMmTsyModuleName, KETelFuncMobileAlternateLineService, alsSupport ); + if ( alsSupport ) //For secondary line, we need yet another instance of this + { + CLogsCallStatus* tmp = CLogsCallStatus::NewLC( ESecondaryLine ); + CleanupStack::Pop(); // tmp + iSecondaryLine = tmp; + } + + + ret = iLine.Open( iPhone, KMmTsyVoice1LineName ); + break; + } + case ESecondaryLine: + { + ret = iLine.Open( iPhone, KMmTsyVoice2LineName ); + break; + } + case EDataLine: + { + ret = iLine.Open( iPhone, KMmTsyDataLineName ); + break; + } + default: + { + CloseEtelConnection(); + User::Leave( KErrCorrupt ); + break; + } + } + if( ret != KErrNone ) + { + CloseEtelConnection(); + User::LeaveIfError( ret ); + } + } + +// Default c++ constructor +CLogsCallStatus::CLogsCallStatus( const TLineStatus aLine ): + iSelectedLine( aLine ) + { + } + +void CLogsCallStatus::RunL() + { + if( iObserver ) + { + iObserver->LineStatusChangedL(); + } + if( !IsActive() ) + { + Cancel(); + iLine.NotifyMobileLineStatusChange( iStatus, iLineStatus ); + SetActive(); + } + } + +void CLogsCallStatus::DoCancel() + { + iLine.CancelAsyncRequest( EMobileLineNotifyMobileLineStatusChange ); + } + + +TInt CLogsCallStatus::CallIsActive( TBool& aCallIsActive ) + { + aCallIsActive = EFalse; + TInt ret( KErrNone ); + ret = iLine.GetMobileLineStatus( iLineStatus ); + + if( ret ) + { + return ret; + } + + if( iLineStatus == RMobileCall::EStatusConnected ) + { + aCallIsActive = ETrue; + } + + ////////////Fix for PNUN-666BDH + //Let's also check do we have active data call going on (e.g video calls are data calls, not voice calls) + TBool activeDataCall( EFalse ); + if( iDataLine ) + { + iDataLine->CallIsActive( activeDataCall ); + if ( activeDataCall ) + { + aCallIsActive = ETrue; + } + } + ////////////// + + ////////////Fix for MVHA-6YUEXZ + //Let's also check wether we have an active call on the secondary line (ALS) + TBool secondaryLineActive( EFalse ); + if( iSecondaryLine ) + { + iSecondaryLine->CallIsActive( secondaryLineActive ); + if ( secondaryLineActive ) + { + aCallIsActive = ETrue; + } + } + ////////////// + + return KErrNone; + } + + +//Called by observers wanting to receive line status change notifications +//(e.g CCtControlContainer) +void CLogsCallStatus::SetObserver( MLineStatusObserver* aObserver ) + { + /// composite objects //// + if( iDataLine ) + { + iDataLine->SetObserver( aObserver ); + } + if( iSecondaryLine ) + { + iSecondaryLine->SetObserver( aObserver ); + } + //////////////////////// + + if( aObserver ) + { + Cancel(); + iLine.NotifyMobileLineStatusChange( iStatus, iLineStatus ); + SetActive(); + iObserver = aObserver; + } + else + { + Cancel(); + iObserver = aObserver; + } + } + +//Returns duration of an ongoing call (in seconds) +TInt CLogsCallStatus::ActiveCallDuration(TTimeIntervalSeconds& aCallDuration) + { + TInt ret( KErrNone ); + + ret = iLine.GetMobileLineStatus( iLineStatus ); + + if( ret == KErrNone && iLineStatus == RMobileCall::EStatusConnected ) + { + switch( iSelectedLine ) + { + case ECallLine:// FALLTHROUGH + case EDataLine: + { + + TInt callCount; + ret = iLine.EnumerateCall( callCount ); + if( ret || callCount == 0) + { + break; + } + for(TInt i = 0; i < callCount; i++) + { + RLine::TCallInfo lineInfo; + ret = iLine.GetCallInfo( i , lineInfo ); + if( ret ) + { + break; + } + + if( lineInfo.iStatus == RCall::EStatusConnected ) + { + RMobileCall call; + ret = call.OpenExistingCall( iLine, lineInfo.iCallName ); + if( ret ) + { + call.Close(); + break; + } + + RMobileCall::TMobileCallInfoV1 callInfo; + RMobileCall::TMobileCallInfoV1Pckg callInfoPkg(callInfo); + ret = call.GetMobileCallInfo( callInfoPkg ); + call.Close(); + aCallDuration = callInfo.iDuration; + } + } + } + break; + + default: + ret = KErrCorrupt; + break; + } + } + return ret; + } + +// End of file