phoneapp/phonemediatorcenter/src/cphonemediatorsender.cpp
changeset 0 5f000ab63145
child 21 92ab7f8d0eab
child 61 41a7f70b3818
equal deleted inserted replaced
-1:000000000000 0:5f000ab63145
       
     1 /*
       
     2 * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: Implementation of CPhoneMediatorSender class.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include <MediatorDomainUIDs.h>
       
    21 #include <videotelcontrolmediatorapi.h>
       
    22 #include "phoneui.hrh"
       
    23 #include "cphonemediatorsender.h"
       
    24 #include "phonelogger.h"
       
    25 #include "phoneconstants.h"
       
    26 #include "phonemediatorpackagetypes.h"
       
    27 #include "mphonecoveruiobserver.h"
       
    28 #include "phoneui.pan"
       
    29 #include "tphonecmdparamcallheaderdata.h"
       
    30 #include "tphonecmdparamboolean.h"
       
    31 #include "mphoneenginemessagesender.h"
       
    32 #include "pevirtualengine.h"
       
    33 #include "mphoneshutdowncommand.h"
       
    34 
       
    35 // ================= MEMBER FUNCTIONS =======================
       
    36 
       
    37 // ---------------------------------------------------------
       
    38 // CPhoneMediatorSender::Instance
       
    39 // Initializes the singleton object
       
    40 // (other items were commented in a header).
       
    41 // ---------------------------------------------------------
       
    42 //
       
    43 EXPORT_C CPhoneMediatorSender* CPhoneMediatorSender::Instance()
       
    44     {
       
    45     CPhoneMediatorSender* instance = static_cast<CPhoneMediatorSender*> 
       
    46         ( CCoeEnv::Static ( KUidMediatorSenderSingleton ) );
       
    47     
       
    48     if ( !instance )
       
    49         {
       
    50         TRAPD( err, instance = CPhoneMediatorSender::NewL() );
       
    51         if ( err )
       
    52 	        {
       
    53 	        Panic( EPhoneMediatorCenterCouldNotCreateSingleton );	
       
    54 	        }
       
    55         }
       
    56     return instance;
       
    57     }
       
    58 
       
    59 // -----------------------------------------------------------------------------
       
    60 // CPhoneMediatorSender::CPhoneMediatorSender
       
    61 // C++ default constructor can NOT contain any code, that
       
    62 // might leave.
       
    63 // -----------------------------------------------------------------------------
       
    64 //
       
    65 CPhoneMediatorSender::CPhoneMediatorSender() :
       
    66     CCoeStatic( KUidMediatorSenderSingleton )
       
    67     {
       
    68     }
       
    69 
       
    70 // Destructor
       
    71 CPhoneMediatorSender::~CPhoneMediatorSender()
       
    72     {
       
    73     delete iCommandInitiator;
       
    74     iEvents.Close();
       
    75     iGenericEvents.Close(); 
       
    76     delete iEventSender;
       
    77     }
       
    78 
       
    79 // -----------------------------------------------------------------------------
       
    80 // CPhoneMediatorSender::ConstructL
       
    81 // Symbian 2nd phase constructor can leave.
       
    82 // -----------------------------------------------------------------------------
       
    83 //
       
    84 void CPhoneMediatorSender::ConstructL()
       
    85     {
       
    86     __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::ConstructL( ) ");
       
    87     iCommandInitiator = CMediatorCommandInitiator::NewL( this );
       
    88     iEventSender = CMediatorEventProvider::NewL();
       
    89 	ResetCommandBuffer();
       
    90     
       
    91     RegisterGenericEvents();        
       
    92     }
       
    93 
       
    94 // -----------------------------------------------------------
       
    95 // CPhoneMediatorSender::NewL()
       
    96 // Constructor
       
    97 // (other items were commented in a header).
       
    98 // -----------------------------------------------------------
       
    99 //
       
   100 CPhoneMediatorSender* CPhoneMediatorSender::NewL()
       
   101     {
       
   102     __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::NewL( ) ");
       
   103     
       
   104     CPhoneMediatorSender* self = new ( ELeave ) CPhoneMediatorSender;
       
   105     CleanupStack::PushL( self );
       
   106     self->ConstructL();
       
   107     CleanupStack::Pop( self );
       
   108 
       
   109     return self;
       
   110     }
       
   111 
       
   112 // -----------------------------------------------------------------------------
       
   113 // CPhoneMediatorSender::RegisterGenericEvents
       
   114 // -----------------------------------------------------------------------------
       
   115 //
       
   116 void CPhoneMediatorSender::RegisterGenericEvents()
       
   117 	{
       
   118     __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::RegisterGenericEvents( ) ");
       
   119 	TCapabilitySet caps;
       
   120 	caps.SetEmpty();
       
   121 	
       
   122 	MediatorService::TEvent newEvent;
       
   123 	newEvent.iEventId = EPhoneEventCallData;
       
   124 	newEvent.iVersion = TVersion( KTelephonyEventsVersionMajor,
       
   125                               	  KTelephonyEventsVersionMinor, 
       
   126                               	  KTelephonyEventsVersionBuild );
       
   127     newEvent.iCaps = caps;
       
   128     
       
   129     TRAPD( errorCode, iGenericEvents.AppendL( newEvent ));
       
   130     if( errorCode == ECCPErrorNone )
       
   131         {
       
   132         TInt res = iEventSender->RegisterEvent( KMediatorTelephonyDomain,
       
   133                                      KCatEventsFromTelephony,
       
   134                                      iGenericEvents );  
       
   135         __ASSERT_DEBUG( !res, Panic( EPhoneMediatorCenterRegistrationFailed ) );
       
   136         }
       
   137 	}
       
   138 
       
   139 // -----------------------------------------------------------------------------
       
   140 // CPhoneMediatorSender::SendEvent
       
   141 // -----------------------------------------------------------------------------
       
   142 //
       
   143 EXPORT_C void CPhoneMediatorSender::SendEvent( 
       
   144     const TPhoneViewCommandId /*aCommandId*/ ) const
       
   145     {
       
   146     // No one yet intereseted this event.
       
   147     }
       
   148 
       
   149 // -----------------------------------------------------------------------------
       
   150 // CPhoneMediatorSender::SendEvent
       
   151 // -----------------------------------------------------------------------------
       
   152 //
       
   153 EXPORT_C void CPhoneMediatorSender::SendEvent( const TPhoneViewCommandId aCommandId, 
       
   154 	const TInt aCallId ) const
       
   155 	{
       
   156 	switch( aCommandId )
       
   157 		{
       
   158 		case EPhoneViewRemoveCallHeader:
       
   159 		    {
       
   160             __PHONELOG1( EBasic, EPhoneMediatorCenter, 
       
   161                 "CPhoneMediatorSender::SendEvent - EPhoneEventCallData iCallId:%d" ,aCallId );
       
   162 			TTelephonyCallDataParam callDataParam;
       
   163 			callDataParam.iCallId = aCallId;
       
   164 			callDataParam.iCallState = ECallStateIdle;
       
   165 			TTelephonyCallDataParamPackage callDataParamPackage( callDataParam );
       
   166 			iEventSender->RaiseEvent( KMediatorTelephonyDomain,
       
   167 							          KCatEventsFromTelephony,
       
   168 							          EPhoneEventCallData,
       
   169                                 	  TVersion( KTelephonyEventsVersionMajor,
       
   170                               	      	KTelephonyEventsVersionMinor, 
       
   171                               	      	KTelephonyEventsVersionBuild ),
       
   172                                 	  callDataParamPackage );	
       
   173             }
       
   174 			break;
       
   175 			
       
   176 		default:
       
   177 			break;
       
   178 		}
       
   179 	}
       
   180 
       
   181 // -----------------------------------------------------------------------------
       
   182 // CPhoneMediatorSender::SendEvent
       
   183 // -----------------------------------------------------------------------------
       
   184 //
       
   185 EXPORT_C void CPhoneMediatorSender::SendEvent( const TPhoneViewCommandId aCommandId, 
       
   186 	TPhoneCommandParam& aCommandParam )
       
   187 	{
       
   188 	switch( aCommandId )
       
   189 	    {
       
   190 		case EPhoneViewActivateMuteUIChanges:
       
   191             {
       
   192             TPhoneCmdParamBoolean& booleanParam = static_cast<TPhoneCmdParamBoolean&>( aCommandParam );
       
   193             const TBool audioMute( booleanParam.Boolean() );
       
   194             TInt response = KErrNone;
       
   195             TInt command = -1;
       
   196             if( audioMute )
       
   197                 {
       
   198                 __PHONELOG( EBasic, EPhoneMediatorCenter, 
       
   199                     "CPhoneMediatorSender::SendEvent - transformed to Mediator Command EVtCmdMute" );
       
   200                 command = EVtCmdMute;
       
   201 			    response = IssueCommand( KMediatorVideoTelephonyDomain,
       
   202 			                  			 KCatPhoneToVideotelCommands, 
       
   203 			                  			 command,
       
   204                               			 TVersion( KPhoneToVideotelCmdVersionMajor,
       
   205                               	        		   KPhoneToVideotelCmdVersionMinor, 
       
   206                               	        		   KPhoneToVideotelCmdVersionBuild ),
       
   207                               			 KNullDesC8 );
       
   208                 }
       
   209             else
       
   210                 {
       
   211                 __PHONELOG( EBasic, EPhoneMediatorCenter, 
       
   212                     "CPhoneMediatorSender::SendEvent - transformed to Mediator Command EVtCmdUnmute" );
       
   213                 command = EVtCmdUnmute;
       
   214 			    response = IssueCommand( KMediatorVideoTelephonyDomain,
       
   215 			                  			 KCatPhoneToVideotelCommands, 
       
   216 			                  			 command,
       
   217                               			 TVersion( KPhoneToVideotelCmdVersionMajor,
       
   218                               	        		   KPhoneToVideotelCmdVersionMinor, 
       
   219                               	        		   KPhoneToVideotelCmdVersionBuild ),
       
   220                               			 KNullDesC8 );
       
   221                 }
       
   222                 
       
   223             if( ( response == KErrInUse ) && ( iCommandBuffer.iCommandId == KErrNotFound ) )
       
   224 	            {
       
   225 				// Previous command wasn't handled yet so buffer the last unhandled command.
       
   226 				// This command will be sent after we get response to the previous command
       
   227 				iCommandBuffer.iCommandId = command;
       
   228 				iCommandBuffer.iDomainUid = KMediatorVideoTelephonyDomain;
       
   229 				iCommandBuffer.iCategoryUid = KCatPhoneToVideotelCommands;
       
   230 				iCommandBuffer.iVersion = TVersion( KPhoneToVideotelCmdVersionMajor,
       
   231                               	        		    KPhoneToVideotelCmdVersionMinor, 
       
   232                               	        		    KPhoneToVideotelCmdVersionBuild );
       
   233 	            }
       
   234             }
       
   235 			break;
       
   236             
       
   237         default:
       
   238             break;    
       
   239 	    }	
       
   240 	}
       
   241 
       
   242 // -----------------------------------------------------------------------------
       
   243 // CPhoneMediatorSender::SendEvent
       
   244 // -----------------------------------------------------------------------------
       
   245 //
       
   246 EXPORT_C void CPhoneMediatorSender::SendEvent( const TPhoneViewCommandId aCommandId, 
       
   247  	const TInt aCallId, TPhoneCommandParam& aCommandParam ) const
       
   248 	{
       
   249 	switch( aCommandId )
       
   250 		{
       
   251 		case EPhoneViewCreateCallHeader:
       
   252             {
       
   253             TPhoneCmdParamCallHeaderData& callHeaderParam = static_cast<TPhoneCmdParamCallHeaderData&>( aCommandParam );
       
   254             __PHONELOG2( EBasic, EPhoneMediatorCenter, 
       
   255                 "CPhoneMediatorSender::SendEvent - EPhoneEventCallData iCallId:%d iCLIText:%S",
       
   256                 aCallId, &callHeaderParam.CLIText() );
       
   257 			TTelephonyCallDataParam callDataParam;
       
   258 			callDataParam.iCallId = aCallId;
       
   259 			callDataParam.iCLIText = callHeaderParam.CLIText();
       
   260 			callDataParam.iCallState = MapCallState( callHeaderParam.CallState() );
       
   261 			callDataParam.iRemotePhoneNumber = callHeaderParam.RemotePhoneNumber();
       
   262 			callDataParam.iCallType = MapCallType( callHeaderParam.CallType() );
       
   263 			TTelephonyCallDataParamPackage callDataParamPackage( callDataParam );
       
   264 			iEventSender->RaiseEvent( KMediatorTelephonyDomain,
       
   265 							          KCatEventsFromTelephony,
       
   266 							          EPhoneEventCallData,
       
   267                                 	  TVersion( KTelephonyEventsVersionMajor,
       
   268                               	      	KTelephonyEventsVersionMinor, 
       
   269                               	      	KTelephonyEventsVersionBuild ),
       
   270                                 	  callDataParamPackage );	
       
   271             }
       
   272 			break;
       
   273 			
       
   274 		default:
       
   275 			break;
       
   276 		}
       
   277 	}
       
   278 
       
   279 // -----------------------------------------------------------------------------
       
   280 // CPhoneMediatorSender::SendEvent
       
   281 // -----------------------------------------------------------------------------
       
   282 //
       
   283 EXPORT_C void CPhoneMediatorSender::SendEvent( 
       
   284     const TPhoneViewCommandId /*aCommandId*/, 
       
   285     const TInt /*aCallId*/, const TDesC* /*aMessage*/ ) const
       
   286     {
       
   287     // No one interested yet from these events.
       
   288     }
       
   289 
       
   290 // -----------------------------------------------------------------------------
       
   291 // CPhoneMediatorSender::IssueCommand
       
   292 // -----------------------------------------------------------------------------
       
   293 //
       
   294 EXPORT_C TInt CPhoneMediatorSender::IssueCommand( const TUid aDomain, const TUid aCategory, 
       
   295     const TInt aCommandId, const TVersion aVersion, const TDesC8& aData, 
       
   296     MPhoneShutdownCommand* aShutdownCommand  )
       
   297     {
       
   298     __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::IssueCommand( ) ");
       
   299     __PHONELOG3( EBasic, EPhoneMediatorCenter, 
       
   300             "aCommandId = %d, aDomain = %d, aCategory = %d", aCommandId, aDomain, aCategory );
       
   301 	if( aShutdownCommand )
       
   302     	{
       
   303         iShutdownCommand = aShutdownCommand;    	    
       
   304     	}
       
   305 
       
   306 	return iCommandInitiator->IssueCommand( 
       
   307 		aDomain, 
       
   308 		aCategory, 
       
   309 		aCommandId, 
       
   310 		aVersion, 
       
   311         aData );		
       
   312 	}
       
   313 
       
   314 // -----------------------------------------------------------------------------
       
   315 // CPhoneMediatorSender::CommandResponseL
       
   316 // -----------------------------------------------------------------------------
       
   317 //
       
   318 void CPhoneMediatorSender::CommandResponseL( TUid aDomain, TUid aCategory, 
       
   319 	TInt aCommandId, TInt /*aStatus*/, const TDesC8& /*aData*/ )
       
   320 	{
       
   321     // First check for buffered command
       
   322 	if( iCommandBuffer.iCommandId != KErrNotFound )
       
   323 		{
       
   324 		// We have a buffered command waiting
       
   325         __PHONELOG( EBasic, EPhoneMediatorCenter, 
       
   326             "CPhoneMediatorSender::VideoTelephonyCommandResponse - Buffered Command waiting" );
       
   327 		if( iCommandBuffer.iCommandId != aCommandId )
       
   328 			{
       
   329 			// And it's not identical to the command which response we now received
       
   330 			// so it's necessary to re-send it
       
   331 	        __PHONELOG1( EBasic, EPhoneMediatorCenter, 
       
   332 	            "CPhoneMediatorSender::VideoTelephonyCommandResponse - Resending command %d", iCommandBuffer.iCommandId );
       
   333 			IssueCommand( iCommandBuffer.iDomainUid,
       
   334 			              iCommandBuffer.iCategoryUid, 
       
   335 			              iCommandBuffer.iCommandId,
       
   336                           iCommandBuffer.iVersion,
       
   337                           KNullDesC8 );
       
   338                           
       
   339 			ResetCommandBuffer();
       
   340 			}
       
   341 		}
       
   342 
       
   343 	if( ( aDomain == KMediatorVideoTelephonyDomain ) &&
       
   344 	    ( aCategory == KCatPhoneToVideotelCommands ) )
       
   345     	{
       
   346         VideoTelephonyCommandResponse( aCommandId );  	    
       
   347     	}
       
   348 	}
       
   349 
       
   350 // -----------------------------------------------------------------------------
       
   351 // CPhoneMediatorSender::VideoTelephonyCommandResponse
       
   352 // -----------------------------------------------------------------------------
       
   353 //
       
   354 void CPhoneMediatorSender::VideoTelephonyCommandResponse( TInt aCommandId )
       
   355     {
       
   356     __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::VideoTelephonyCommandResponse( ) ");
       
   357     __PHONELOG1( EBasic, EPhoneMediatorCenter, 
       
   358         "VideoTelephonyCommandResponse aCommandId = %d", aCommandId );
       
   359 
       
   360     switch( aCommandId )
       
   361         {
       
   362         case EVtCmdReleaseDataport:
       
   363 		    __ASSERT_DEBUG( iShutdownCommand, Panic( EPhoneMediatorCenterParameterNotInitialized ) );
       
   364             TRAP_IGNORE( iShutdownCommand->ExecuteLD());
       
   365             break;
       
   366             
       
   367         default:
       
   368             break;
       
   369         }     
       
   370     }
       
   371 
       
   372 // -----------------------------------------------------------------------------
       
   373 // CPhoneMediatorSender::MapCallState
       
   374 // -----------------------------------------------------------------------------
       
   375 //
       
   376 TCallState CPhoneMediatorSender::MapCallState( const TInt aCallState ) const
       
   377     {
       
   378     __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::MapCallState( ) ");
       
   379     TCallState callState( ECallStateUnknown );
       
   380     
       
   381     switch( aCallState )
       
   382         {
       
   383         case EPEStateUnknown:
       
   384             callState = ECallStateUnknown;
       
   385             break;
       
   386             
       
   387         case EPEStateIdle:
       
   388             callState = ECallStateIdle;
       
   389             break;
       
   390             
       
   391         case EPEStateDialing:
       
   392             callState = ECallStateDialling;
       
   393             break;
       
   394             
       
   395         case EPEStateEmergencyDialing:
       
   396             callState = ECallStateEmergencyDialling;
       
   397             break;
       
   398             
       
   399         case EPEStateRinging:
       
   400             callState = ECallStateRinging;
       
   401             break;
       
   402             
       
   403         case EPEStateConnecting:
       
   404             callState = ECallStateConnecting;
       
   405             break;
       
   406             
       
   407         case EPEStateConnected:
       
   408             callState = ECallStateConnected;
       
   409             break;
       
   410             
       
   411         case EPEStateHangingUp:
       
   412             callState = ECallStateHangingUp;
       
   413             break;
       
   414             
       
   415         case EPEStateHeld:
       
   416             callState = ECallStateHeld;
       
   417             break;
       
   418             
       
   419         case EPEStateAnswering:
       
   420             callState = ECallStateAnswering;
       
   421             break;
       
   422             
       
   423         case EPEStateRejecting:
       
   424             callState = ECallStateRejecting;
       
   425             break;
       
   426             
       
   427         case EPEStateDisconnecting:
       
   428             callState = ECallStateDisconnecting;
       
   429             break;
       
   430             
       
   431         default:
       
   432             break;
       
   433         }
       
   434         
       
   435     return callState;
       
   436     }
       
   437 
       
   438 // -----------------------------------------------------------------------------
       
   439 // CPhoneMediatorSender::MapCallType
       
   440 // -----------------------------------------------------------------------------
       
   441 //
       
   442 TCallType CPhoneMediatorSender::MapCallType( const TInt aCallType ) const
       
   443     {
       
   444     __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::MapCallType( ) ");
       
   445     TCallType callType( ECallTypeUninitialized );
       
   446     
       
   447     switch( aCallType )
       
   448         {
       
   449         case EPECallTypeUninitialized:
       
   450             callType = ECallTypeUninitialized;
       
   451             break;
       
   452             
       
   453         case EPECallTypeCSVoice:
       
   454             callType = ECallTypeCSVoice;
       
   455             break;
       
   456             
       
   457         case EPECallTypeVideo:
       
   458             callType = ECallTypeVideo;
       
   459             break;
       
   460             
       
   461         case EPECallTypeVoIP:
       
   462             callType = ECallTypeVoIP;
       
   463             break;
       
   464             
       
   465         default:
       
   466             break;
       
   467         }
       
   468         
       
   469     return callType;
       
   470     }
       
   471 
       
   472 // -----------------------------------------------------------------------------
       
   473 // CPhoneMediatorSender::ResetCommandBuffer
       
   474 // -----------------------------------------------------------------------------
       
   475 //
       
   476 void CPhoneMediatorSender::ResetCommandBuffer()
       
   477     {
       
   478     __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::ResetCommandBuffer( ) ");
       
   479     TUid nullUid = TUid::Null();
       
   480     iCommandBuffer.iCommandId = KErrNotFound;
       
   481     iCommandBuffer.iDomainUid = nullUid;
       
   482     iCommandBuffer.iCategoryUid = nullUid;
       
   483     iCommandBuffer.iVersion = TVersion( KErrNotFound, KErrNotFound, KErrNotFound );
       
   484     }
       
   485 
       
   486 // End of File