diff -r 000000000000 -r 5f000ab63145 phoneapp/phonemediatorcenter/src/cphonemediatorsender.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneapp/phonemediatorcenter/src/cphonemediatorsender.cpp Mon Jan 18 20:18:27 2010 +0200 @@ -0,0 +1,486 @@ +/* +* Copyright (c) 2008 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: Implementation of CPhoneMediatorSender class. +* +*/ + + +// INCLUDE FILES +#include +#include +#include "phoneui.hrh" +#include "cphonemediatorsender.h" +#include "phonelogger.h" +#include "phoneconstants.h" +#include "phonemediatorpackagetypes.h" +#include "mphonecoveruiobserver.h" +#include "phoneui.pan" +#include "tphonecmdparamcallheaderdata.h" +#include "tphonecmdparamboolean.h" +#include "mphoneenginemessagesender.h" +#include "pevirtualengine.h" +#include "mphoneshutdowncommand.h" + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CPhoneMediatorSender::Instance +// Initializes the singleton object +// (other items were commented in a header). +// --------------------------------------------------------- +// +EXPORT_C CPhoneMediatorSender* CPhoneMediatorSender::Instance() + { + CPhoneMediatorSender* instance = static_cast + ( CCoeEnv::Static ( KUidMediatorSenderSingleton ) ); + + if ( !instance ) + { + TRAPD( err, instance = CPhoneMediatorSender::NewL() ); + if ( err ) + { + Panic( EPhoneMediatorCenterCouldNotCreateSingleton ); + } + } + return instance; + } + +// ----------------------------------------------------------------------------- +// CPhoneMediatorSender::CPhoneMediatorSender +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPhoneMediatorSender::CPhoneMediatorSender() : + CCoeStatic( KUidMediatorSenderSingleton ) + { + } + +// Destructor +CPhoneMediatorSender::~CPhoneMediatorSender() + { + delete iCommandInitiator; + iEvents.Close(); + iGenericEvents.Close(); + delete iEventSender; + } + +// ----------------------------------------------------------------------------- +// CPhoneMediatorSender::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPhoneMediatorSender::ConstructL() + { + __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::ConstructL( ) "); + iCommandInitiator = CMediatorCommandInitiator::NewL( this ); + iEventSender = CMediatorEventProvider::NewL(); + ResetCommandBuffer(); + + RegisterGenericEvents(); + } + +// ----------------------------------------------------------- +// CPhoneMediatorSender::NewL() +// Constructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +CPhoneMediatorSender* CPhoneMediatorSender::NewL() + { + __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::NewL( ) "); + + CPhoneMediatorSender* self = new ( ELeave ) CPhoneMediatorSender; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CPhoneMediatorSender::RegisterGenericEvents +// ----------------------------------------------------------------------------- +// +void CPhoneMediatorSender::RegisterGenericEvents() + { + __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::RegisterGenericEvents( ) "); + TCapabilitySet caps; + caps.SetEmpty(); + + MediatorService::TEvent newEvent; + newEvent.iEventId = EPhoneEventCallData; + newEvent.iVersion = TVersion( KTelephonyEventsVersionMajor, + KTelephonyEventsVersionMinor, + KTelephonyEventsVersionBuild ); + newEvent.iCaps = caps; + + TRAPD( errorCode, iGenericEvents.AppendL( newEvent )); + if( errorCode == ECCPErrorNone ) + { + TInt res = iEventSender->RegisterEvent( KMediatorTelephonyDomain, + KCatEventsFromTelephony, + iGenericEvents ); + __ASSERT_DEBUG( !res, Panic( EPhoneMediatorCenterRegistrationFailed ) ); + } + } + +// ----------------------------------------------------------------------------- +// CPhoneMediatorSender::SendEvent +// ----------------------------------------------------------------------------- +// +EXPORT_C void CPhoneMediatorSender::SendEvent( + const TPhoneViewCommandId /*aCommandId*/ ) const + { + // No one yet intereseted this event. + } + +// ----------------------------------------------------------------------------- +// CPhoneMediatorSender::SendEvent +// ----------------------------------------------------------------------------- +// +EXPORT_C void CPhoneMediatorSender::SendEvent( const TPhoneViewCommandId aCommandId, + const TInt aCallId ) const + { + switch( aCommandId ) + { + case EPhoneViewRemoveCallHeader: + { + __PHONELOG1( EBasic, EPhoneMediatorCenter, + "CPhoneMediatorSender::SendEvent - EPhoneEventCallData iCallId:%d" ,aCallId ); + TTelephonyCallDataParam callDataParam; + callDataParam.iCallId = aCallId; + callDataParam.iCallState = ECallStateIdle; + TTelephonyCallDataParamPackage callDataParamPackage( callDataParam ); + iEventSender->RaiseEvent( KMediatorTelephonyDomain, + KCatEventsFromTelephony, + EPhoneEventCallData, + TVersion( KTelephonyEventsVersionMajor, + KTelephonyEventsVersionMinor, + KTelephonyEventsVersionBuild ), + callDataParamPackage ); + } + break; + + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CPhoneMediatorSender::SendEvent +// ----------------------------------------------------------------------------- +// +EXPORT_C void CPhoneMediatorSender::SendEvent( const TPhoneViewCommandId aCommandId, + TPhoneCommandParam& aCommandParam ) + { + switch( aCommandId ) + { + case EPhoneViewActivateMuteUIChanges: + { + TPhoneCmdParamBoolean& booleanParam = static_cast( aCommandParam ); + const TBool audioMute( booleanParam.Boolean() ); + TInt response = KErrNone; + TInt command = -1; + if( audioMute ) + { + __PHONELOG( EBasic, EPhoneMediatorCenter, + "CPhoneMediatorSender::SendEvent - transformed to Mediator Command EVtCmdMute" ); + command = EVtCmdMute; + response = IssueCommand( KMediatorVideoTelephonyDomain, + KCatPhoneToVideotelCommands, + command, + TVersion( KPhoneToVideotelCmdVersionMajor, + KPhoneToVideotelCmdVersionMinor, + KPhoneToVideotelCmdVersionBuild ), + KNullDesC8 ); + } + else + { + __PHONELOG( EBasic, EPhoneMediatorCenter, + "CPhoneMediatorSender::SendEvent - transformed to Mediator Command EVtCmdUnmute" ); + command = EVtCmdUnmute; + response = IssueCommand( KMediatorVideoTelephonyDomain, + KCatPhoneToVideotelCommands, + command, + TVersion( KPhoneToVideotelCmdVersionMajor, + KPhoneToVideotelCmdVersionMinor, + KPhoneToVideotelCmdVersionBuild ), + KNullDesC8 ); + } + + if( ( response == KErrInUse ) && ( iCommandBuffer.iCommandId == KErrNotFound ) ) + { + // Previous command wasn't handled yet so buffer the last unhandled command. + // This command will be sent after we get response to the previous command + iCommandBuffer.iCommandId = command; + iCommandBuffer.iDomainUid = KMediatorVideoTelephonyDomain; + iCommandBuffer.iCategoryUid = KCatPhoneToVideotelCommands; + iCommandBuffer.iVersion = TVersion( KPhoneToVideotelCmdVersionMajor, + KPhoneToVideotelCmdVersionMinor, + KPhoneToVideotelCmdVersionBuild ); + } + } + break; + + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CPhoneMediatorSender::SendEvent +// ----------------------------------------------------------------------------- +// +EXPORT_C void CPhoneMediatorSender::SendEvent( const TPhoneViewCommandId aCommandId, + const TInt aCallId, TPhoneCommandParam& aCommandParam ) const + { + switch( aCommandId ) + { + case EPhoneViewCreateCallHeader: + { + TPhoneCmdParamCallHeaderData& callHeaderParam = static_cast( aCommandParam ); + __PHONELOG2( EBasic, EPhoneMediatorCenter, + "CPhoneMediatorSender::SendEvent - EPhoneEventCallData iCallId:%d iCLIText:%S", + aCallId, &callHeaderParam.CLIText() ); + TTelephonyCallDataParam callDataParam; + callDataParam.iCallId = aCallId; + callDataParam.iCLIText = callHeaderParam.CLIText(); + callDataParam.iCallState = MapCallState( callHeaderParam.CallState() ); + callDataParam.iRemotePhoneNumber = callHeaderParam.RemotePhoneNumber(); + callDataParam.iCallType = MapCallType( callHeaderParam.CallType() ); + TTelephonyCallDataParamPackage callDataParamPackage( callDataParam ); + iEventSender->RaiseEvent( KMediatorTelephonyDomain, + KCatEventsFromTelephony, + EPhoneEventCallData, + TVersion( KTelephonyEventsVersionMajor, + KTelephonyEventsVersionMinor, + KTelephonyEventsVersionBuild ), + callDataParamPackage ); + } + break; + + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CPhoneMediatorSender::SendEvent +// ----------------------------------------------------------------------------- +// +EXPORT_C void CPhoneMediatorSender::SendEvent( + const TPhoneViewCommandId /*aCommandId*/, + const TInt /*aCallId*/, const TDesC* /*aMessage*/ ) const + { + // No one interested yet from these events. + } + +// ----------------------------------------------------------------------------- +// CPhoneMediatorSender::IssueCommand +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CPhoneMediatorSender::IssueCommand( const TUid aDomain, const TUid aCategory, + const TInt aCommandId, const TVersion aVersion, const TDesC8& aData, + MPhoneShutdownCommand* aShutdownCommand ) + { + __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::IssueCommand( ) "); + __PHONELOG3( EBasic, EPhoneMediatorCenter, + "aCommandId = %d, aDomain = %d, aCategory = %d", aCommandId, aDomain, aCategory ); + if( aShutdownCommand ) + { + iShutdownCommand = aShutdownCommand; + } + + return iCommandInitiator->IssueCommand( + aDomain, + aCategory, + aCommandId, + aVersion, + aData ); + } + +// ----------------------------------------------------------------------------- +// CPhoneMediatorSender::CommandResponseL +// ----------------------------------------------------------------------------- +// +void CPhoneMediatorSender::CommandResponseL( TUid aDomain, TUid aCategory, + TInt aCommandId, TInt /*aStatus*/, const TDesC8& /*aData*/ ) + { + // First check for buffered command + if( iCommandBuffer.iCommandId != KErrNotFound ) + { + // We have a buffered command waiting + __PHONELOG( EBasic, EPhoneMediatorCenter, + "CPhoneMediatorSender::VideoTelephonyCommandResponse - Buffered Command waiting" ); + if( iCommandBuffer.iCommandId != aCommandId ) + { + // And it's not identical to the command which response we now received + // so it's necessary to re-send it + __PHONELOG1( EBasic, EPhoneMediatorCenter, + "CPhoneMediatorSender::VideoTelephonyCommandResponse - Resending command %d", iCommandBuffer.iCommandId ); + IssueCommand( iCommandBuffer.iDomainUid, + iCommandBuffer.iCategoryUid, + iCommandBuffer.iCommandId, + iCommandBuffer.iVersion, + KNullDesC8 ); + + ResetCommandBuffer(); + } + } + + if( ( aDomain == KMediatorVideoTelephonyDomain ) && + ( aCategory == KCatPhoneToVideotelCommands ) ) + { + VideoTelephonyCommandResponse( aCommandId ); + } + } + +// ----------------------------------------------------------------------------- +// CPhoneMediatorSender::VideoTelephonyCommandResponse +// ----------------------------------------------------------------------------- +// +void CPhoneMediatorSender::VideoTelephonyCommandResponse( TInt aCommandId ) + { + __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::VideoTelephonyCommandResponse( ) "); + __PHONELOG1( EBasic, EPhoneMediatorCenter, + "VideoTelephonyCommandResponse aCommandId = %d", aCommandId ); + + switch( aCommandId ) + { + case EVtCmdReleaseDataport: + __ASSERT_DEBUG( iShutdownCommand, Panic( EPhoneMediatorCenterParameterNotInitialized ) ); + TRAP_IGNORE( iShutdownCommand->ExecuteLD()); + break; + + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CPhoneMediatorSender::MapCallState +// ----------------------------------------------------------------------------- +// +TCallState CPhoneMediatorSender::MapCallState( const TInt aCallState ) const + { + __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::MapCallState( ) "); + TCallState callState( ECallStateUnknown ); + + switch( aCallState ) + { + case EPEStateUnknown: + callState = ECallStateUnknown; + break; + + case EPEStateIdle: + callState = ECallStateIdle; + break; + + case EPEStateDialing: + callState = ECallStateDialling; + break; + + case EPEStateEmergencyDialing: + callState = ECallStateEmergencyDialling; + break; + + case EPEStateRinging: + callState = ECallStateRinging; + break; + + case EPEStateConnecting: + callState = ECallStateConnecting; + break; + + case EPEStateConnected: + callState = ECallStateConnected; + break; + + case EPEStateHangingUp: + callState = ECallStateHangingUp; + break; + + case EPEStateHeld: + callState = ECallStateHeld; + break; + + case EPEStateAnswering: + callState = ECallStateAnswering; + break; + + case EPEStateRejecting: + callState = ECallStateRejecting; + break; + + case EPEStateDisconnecting: + callState = ECallStateDisconnecting; + break; + + default: + break; + } + + return callState; + } + +// ----------------------------------------------------------------------------- +// CPhoneMediatorSender::MapCallType +// ----------------------------------------------------------------------------- +// +TCallType CPhoneMediatorSender::MapCallType( const TInt aCallType ) const + { + __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::MapCallType( ) "); + TCallType callType( ECallTypeUninitialized ); + + switch( aCallType ) + { + case EPECallTypeUninitialized: + callType = ECallTypeUninitialized; + break; + + case EPECallTypeCSVoice: + callType = ECallTypeCSVoice; + break; + + case EPECallTypeVideo: + callType = ECallTypeVideo; + break; + + case EPECallTypeVoIP: + callType = ECallTypeVoIP; + break; + + default: + break; + } + + return callType; + } + +// ----------------------------------------------------------------------------- +// CPhoneMediatorSender::ResetCommandBuffer +// ----------------------------------------------------------------------------- +// +void CPhoneMediatorSender::ResetCommandBuffer() + { + __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::ResetCommandBuffer( ) "); + TUid nullUid = TUid::Null(); + iCommandBuffer.iCommandId = KErrNotFound; + iCommandBuffer.iDomainUid = nullUid; + iCommandBuffer.iCategoryUid = nullUid; + iCommandBuffer.iVersion = TVersion( KErrNotFound, KErrNotFound, KErrNotFound ); + } + +// End of File