diff -r 000000000000 -r f0cf47e981f9 mmshplugins/mmshaoplugin/src/muscallmonitorbase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmshplugins/mmshaoplugin/src/muscallmonitorbase.cpp Thu Dec 17 08:44:37 2009 +0200 @@ -0,0 +1,323 @@ +/* +* Copyright (c) 2005-2006 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: Monitor the events of CS call +* +*/ + + +#include "mussesseioninformationapi.h" +#include "muscallmonitorbase.h" +#include "muslogger.h" +#include "mussettings.h" + +#include +#include +#include +#include +#include + +_LIT( KDoNotSendOwnNumber, "#31#" ); +_LIT( KDoSendOwnNumber, "*31#" ); + + +// ----------------------------------------------------------------------------- +// C++ destructor. +// ----------------------------------------------------------------------------- +// +CMusCallMonitorBase::~CMusCallMonitorBase() + { + MUS_LOG( "mus: [MUSAO] -> CMusCallMonitorBase::~CMusCallMonitorBase" ) + MUS_LOG( "mus: [MUSAO] <- CMusCallMonitorBase::~CMusCallMonitorBase" ) + } + +// ----------------------------------------------------------------------------- +// C++ constructor. +// ----------------------------------------------------------------------------- +// +CMusCallMonitorBase::CMusCallMonitorBase(const RMobileCall& aCall, MMusTsyPropertyObserver& aObserver ) + : CActive( EPriorityNormal ),iCall(aCall),iTsyObserver( aObserver ) + + { + // Intialize the remote call event state to Resume , means connected. + iRemoteCallEvent = RMobileCall::ERemoteResume; + // Intialize the local call event state to Resume , means connected. + iLocalCallEvent = RMobileCall::ELocalResume; + } + +// ----------------------------------------------------------------------------- +// CMusCallMonitorBase::SetStateL( TInt aError ) +// Sets the Call State to Property +// ----------------------------------------------------------------------------- +// +void CMusCallMonitorBase::SetStateL(NMusSessionInformationApi::TMusCallEvent aVal) + { + MUS_LOG1( "mus: [MUSAO] -> CMusCallMonitorBase::SetStateL, aVal %d", aVal ) + TInt callCount = 0; + User::LeaveIfError(RProperty::Get( NMusSessionInformationApi::KCategoryUid, + NMusSessionInformationApi::KMusCallCount,callCount)); + MUS_LOG1( "mus: [MUSAO] - CallCount = %d",callCount ) + /* + * CountOfCallMonitors is number of CallMonitor Objects.Static Reference Count. + * = No of active calls . + * React one and only if one call is present -> Mush Call criteria. + * if call count is more than one , should be taken care by conference call or + * multicall criteria. + */ + if( callCount == 1) + { + TInt currentVal; + User::LeaveIfError(RProperty::Get( NMusSessionInformationApi::KCategoryUid, + NMusSessionInformationApi::KMusCallEvent,currentVal)); + MUS_LOG1( "mus: [MUSAO] - Remote State = %d",iRemoteCallEvent ) + /* If current event is callconnected and remote is not in hold set the + property value to CallConnected.Else set it to CallHold. + Note : We can be sure about Local is connected when it goes to + CallConnected State. But remote call events are just notified + in call event monitor. So this stores the last remotecall event + and checks it now. + */ + if( aVal==NMusSessionInformationApi::ECallConnected + && iRemoteCallEvent!=RMobileCall::ERemoteHold) + { + /* If the current property value is same of new value, there is no + point of setting it since it will cause lot of other processes. + */ + if(currentVal != (TInt)aVal) + { + User::LeaveIfError(RProperty::Set( NMusSessionInformationApi::KCategoryUid, + NMusSessionInformationApi::KMusCallEvent, + aVal )); + } + } + else if( aVal==NMusSessionInformationApi::ECallHold || iRemoteCallEvent==RMobileCall::ERemoteHold ) + { + User::LeaveIfError(RProperty::Set( NMusSessionInformationApi::KCategoryUid, + NMusSessionInformationApi::KMusCallEvent, + NMusSessionInformationApi::ECallHold )); + } + if( aVal != NMusSessionInformationApi::ENoCall) + { + RMobileCall::TMobileCallInfoV3 callInfo; + RMobileCall::TMobileCallInfoV3Pckg pckg( callInfo ); + + User::LeaveIfError(iCall.GetMobileCallInfo( pckg )); + if( callInfo.iEmergency ) + { + User::LeaveIfError(RProperty::Set( NMusSessionInformationApi::KCategoryUid, + NMusSessionInformationApi::KMusCallEvent, + ( TInt ) NMusSessionInformationApi::ENoCall )); + } + } + /* + If Call is Connected then set the Call info. + */ + if( aVal==NMusSessionInformationApi::ECallConnected ) + { + SetCallInfoL(); + } + + } + + MUS_LOG( "mus: [MUSAO] <- CMusCallMonitorBase::SetStateL" ) + } + +///----------------------------------------------------------------------------- +// CMusCallMonitorBase::SetCallInfoL( TInt aError ) +// ----------------------------------------------------------------------------- +// +void CMusCallMonitorBase::SetCallInfoL() + { + MUS_LOG( "mus: [MUSAO] -> CMusCallMonitorBase::SetCallInfoL ") + RMobileCall::TMobileCallInfoV3 callInfo; + RMobileCall::TMobileCallInfoV3Pckg callInfoPckg( callInfo ); + User::LeaveIfError(iCall.GetMobileCallInfo( callInfoPckg )); + RMobilePhone::TMobileAddress remoteNumber = + callInfo.iRemoteParty.iRemoteNumber; + // Set telephone number + HBufC* telNo( NULL ); + HBufC* cleanTelNo( NULL ); + if( remoteNumber.iTelNumber.Length() > 0 ) + { + MUS_LOG( "mus: [MUSAO] remoteNumber.iTelNumber.Lenght > 0" ) + telNo = remoteNumber.iTelNumber.AllocLC(); + } + else + { + MUS_LOG( "mus: [MUSAO] remoteNumber.iTelNumber.Lenght =< 0" ) + RMobilePhone::TMobileAddress dialledParty = callInfo.iDialledParty; + telNo = dialledParty.iTelNumber.AllocLC(); + + } + if ( MultimediaSharingSettings::PrivacySetting() ) + { + SetClirSetting( *telNo ); + } + cleanTelNo = RemovePrefix( *telNo ); + CleanupStack::PushL( cleanTelNo ); + + User::LeaveIfError(RProperty::Set( + NMusSessionInformationApi::KCategoryUid, + NMusSessionInformationApi::KMusTelNumber, + *cleanTelNo )); + MUS_LOG_TDESC("mus: [MUSAO] telNo = ", (*cleanTelNo)) + CleanupStack::PopAndDestroy(cleanTelNo); + CleanupStack::PopAndDestroy(telNo); + + // Set call direction. + RMobileCall::TMobileCallDirection direction = + callInfo.iRemoteParty.iDirection; + MUS_LOG1( "mus: [MUSAO] Call Direction = %d",direction ) + if( direction == RMobileCall::EMobileOriginated ) + { + User::LeaveIfError(RProperty::Set( + NMusSessionInformationApi::KCategoryUid, + NMusSessionInformationApi::KMusCallDirection, + ( TInt ) NMusSessionInformationApi::ECallOrginated )); + } + else if ( direction == RMobileCall::EMobileTerminated ) + { + SetTerminatingPrivacy( iCall ); + User::LeaveIfError(RProperty::Set( + NMusSessionInformationApi::KCategoryUid, + NMusSessionInformationApi::KMusCallDirection, + ( TInt ) NMusSessionInformationApi::ECallTerminated )); + } + else + { + User::LeaveIfError(RProperty::Set( + NMusSessionInformationApi::KCategoryUid, + NMusSessionInformationApi::KMusCallDirection, + ( TInt ) NMusSessionInformationApi::ENoDirection )); + } + + + MUS_LOG( "mus: [MUSAO] <- CMusCallMonitorBase::SetCallInfoL" ) + } + +// ----------------------------------------------------------------------------- +// CMusCallMonitorBase::RunError( TInt aError ) +// Implemented for CActive. +// Will be called automatically by framework when RunL Leaves. +// ----------------------------------------------------------------------------- +// + +TInt CMusCallMonitorBase::RunError( TInt aError ) + { + MUS_LOG1( "mus: [MUSAO] -> CMusCallMonitorBase::RunError, aError %d",\ + aError ) + aError = KErrNone; // just to avoid warnings. + MUS_LOG( "mus: [MUSAO] <- CMusCallMonitorBase::RunError" ) + return aError; + } + +// ----------------------------------------------------------------------------- +// CMusCallMonitorBase::NotifyCallStateChanged() +// Notify TSYobserver that our call status or call event state changed +// ----------------------------------------------------------------------------- +// +void CMusCallMonitorBase::NotifyCallStateChanged( NMusSessionInformationApi::TMusCallEvent aVal ) + { + RCall::TCallInfo callInfo; + iCall.GetInfo(callInfo); + iTsyObserver.NotifyCallStateChanged( aVal, callInfo.iCallName ); + } + +// -------------------------------------------------------------------------- +// void CMusCallMonitorBase::SetClirSetting() +// Determine CLIR setting from dialled digits +// -------------------------------------------------------------------------- +// +void CMusCallMonitorBase::SetClirSetting( const TDesC& aDialledNumber ) const + { + MUS_LOG( "mus: [MUSAO] -> CMusCallMonitorBase::SetClirSetting" ); + + NMusSessionInformationApi::TMusClirSetting + sendNumber( NMusSessionInformationApi::ESendOwnNumber ); + + TPtrC prefix = aDialledNumber.Left( KDoNotSendOwnNumber().Length() ); + if ( prefix == KDoNotSendOwnNumber() ) + { + sendNumber = NMusSessionInformationApi::EDoNotSendOwnNumber; + } + RProperty::Set( NMusSessionInformationApi::KCategoryUid, + NMusSessionInformationApi::KMusClirSetting, sendNumber ); + MUS_LOG1( "mus: [MUSAO] <- CMusCallMonitorBase::SetClirSetting send nbr=%d", + sendNumber == NMusSessionInformationApi::ESendOwnNumber ); + } + + +// -------------------------------------------------------------------------- +// void CMusCallMonitorBase::RemovePrefix() +// -------------------------------------------------------------------------- +// +HBufC* CMusCallMonitorBase::RemovePrefix( const TDesC& aOriginator ) const + { + MUS_LOG( "mus: [MUSAO] -> CMusCallMonitorBase::removePrefix" ); + + HBufC * withoutPrefix(NULL); + + TPtrC prefix = aOriginator.Left( KDoNotSendOwnNumber().Length() ); + if ( prefix == KDoNotSendOwnNumber()|| prefix == KDoSendOwnNumber() ) + { + MUS_LOG( "Number have a prefix" ); + withoutPrefix = aOriginator.AllocL(); + *withoutPrefix = aOriginator; + TPtr ptr = withoutPrefix->Des(); + ptr.Delete(0,KDoNotSendOwnNumber().Length()); + } + else + { + withoutPrefix = aOriginator.AllocL(); + } + + MUS_LOG( "mus: [MUSAO] <- CMusCallMonitorBase::RemovePrefix" ); + return withoutPrefix; + } + + +// -------------------------------------------------------------------------- +// void CMusCallMonitorBase::SetTerminatingPrivacy() +// -------------------------------------------------------------------------- +// +void CMusCallMonitorBase::SetTerminatingPrivacy( const RMobileCall& aCall ) const + { + MUS_LOG( "mus: [MUSAO] -> CMusCallMonitorBase::SetTerminatingPrivacy" ) + RMobileCall::TMobileCallInfoV3 callInfo; + RMobileCall::TMobileCallInfoV3Pckg callInfoPckg( callInfo ); + if( aCall.GetMobileCallInfo( callInfoPckg ) != KErrNone ) + { + return; // error cannot do + } + MUS_LOG( "mus: [MUSAO] Get remote status" ) + RMobileCall::TMobileCallRemoteIdentityStatus remoteStatus = + callInfo.iRemoteParty.iRemoteIdStatus; + + if( remoteStatus == RMobileCall::ERemoteIdentitySuppressed ) + { + RProperty::Set( NMusSessionInformationApi::KCategoryUid, + NMusSessionInformationApi::KMUSPrivacy, + ( TInt ) NMusSessionInformationApi::EPrivacyOn ); + } + else + { + RProperty::Set( NMusSessionInformationApi::KCategoryUid, + NMusSessionInformationApi::KMUSPrivacy, + ( TInt ) NMusSessionInformationApi::EPrivacyOff ); + } + MUS_LOG1( "mus: [MUSAO] Remote status = %d",remoteStatus ) + MUS_LOG( "mus: [MUSAO] <- CMusCallMonitorBase::SetTerminatingPrivacy" ) + } + +// End of file +