phoneapp/phonemediatorcenter/src/cphonemediatorsender.cpp
changeset 37 ba76fc04e6c2
child 51 f39ed5e045e0
child 74 d1c62c765e48
equal deleted inserted replaced
36:2eacb6118286 37:ba76fc04e6c2
       
     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 "phoneui.pan"
       
    28 #include "tphonecmdparamcallheaderdata.h"
       
    29 #include "tphonecmdparamboolean.h"
       
    30 #include "mphoneenginemessagesender.h"
       
    31 #include "pevirtualengine.h"
       
    32 #include "mphoneshutdowncommand.h"
       
    33 
       
    34 // ================= MEMBER FUNCTIONS =======================
       
    35 
       
    36 // ---------------------------------------------------------
       
    37 // CPhoneMediatorSender::Instance
       
    38 // Initializes the singleton object
       
    39 // (other items were commented in a header).
       
    40 // ---------------------------------------------------------
       
    41 //
       
    42 EXPORT_C CPhoneMediatorSender* CPhoneMediatorSender::Instance()
       
    43     {
       
    44     CPhoneMediatorSender* instance = static_cast<CPhoneMediatorSender*> 
       
    45         ( CCoeEnv::Static ( KUidMediatorSenderSingleton ) );
       
    46     
       
    47     if ( !instance )
       
    48         {
       
    49         TRAPD( err, instance = CPhoneMediatorSender::NewL() );
       
    50         if ( err )
       
    51             {
       
    52             Panic( EPhoneMediatorCenterCouldNotCreateSingleton );   
       
    53             }
       
    54         }
       
    55     return instance;
       
    56     }
       
    57 
       
    58 // -----------------------------------------------------------------------------
       
    59 // CPhoneMediatorSender::CPhoneMediatorSender
       
    60 // C++ default constructor can NOT contain any code, that
       
    61 // might leave.
       
    62 // -----------------------------------------------------------------------------
       
    63 //
       
    64 CPhoneMediatorSender::CPhoneMediatorSender() :
       
    65     CCoeStatic( KUidMediatorSenderSingleton )
       
    66     {
       
    67     }
       
    68 
       
    69 // Destructor
       
    70 CPhoneMediatorSender::~CPhoneMediatorSender()
       
    71     {
       
    72     delete iCommandInitiator;
       
    73     iEvents.Close();
       
    74     iGenericEvents.Close(); 
       
    75     delete iEventSender;
       
    76     }
       
    77 
       
    78 // -----------------------------------------------------------------------------
       
    79 // CPhoneMediatorSender::ConstructL
       
    80 // Symbian 2nd phase constructor can leave.
       
    81 // -----------------------------------------------------------------------------
       
    82 //
       
    83 void CPhoneMediatorSender::ConstructL()
       
    84     {
       
    85     __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::ConstructL( ) ");
       
    86     iCommandInitiator = CMediatorCommandInitiator::NewL( this );
       
    87     iEventSender = CMediatorEventProvider::NewL();
       
    88     ResetCommandBuffer();
       
    89     
       
    90     RegisterGenericEvents();        
       
    91     }
       
    92 
       
    93 // -----------------------------------------------------------
       
    94 // CPhoneMediatorSender::NewL()
       
    95 // Constructor
       
    96 // (other items were commented in a header).
       
    97 // -----------------------------------------------------------
       
    98 //
       
    99 CPhoneMediatorSender* CPhoneMediatorSender::NewL()
       
   100     {
       
   101     __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::NewL( ) ");
       
   102     
       
   103     CPhoneMediatorSender* self = new ( ELeave ) CPhoneMediatorSender;
       
   104     CleanupStack::PushL( self );
       
   105     self->ConstructL();
       
   106     CleanupStack::Pop( self );
       
   107 
       
   108     return self;
       
   109     }
       
   110 
       
   111 // -----------------------------------------------------------------------------
       
   112 // CPhoneMediatorSender::RegisterGenericEvents
       
   113 // -----------------------------------------------------------------------------
       
   114 //
       
   115 void CPhoneMediatorSender::RegisterGenericEvents()
       
   116     {
       
   117     __LOGMETHODSTARTEND( EPhoneMediatorCenter, "CPhoneMediatorSender::RegisterGenericEvents( ) ");
       
   118     TCapabilitySet caps;
       
   119     caps.SetEmpty();
       
   120     
       
   121     MediatorService::TEvent newEvent;
       
   122     newEvent.iEventId = EPhoneEventCallData;
       
   123     newEvent.iVersion = TVersion( KTelephonyEventsVersionMajor,
       
   124                                   KTelephonyEventsVersionMinor, 
       
   125                                   KTelephonyEventsVersionBuild );
       
   126     newEvent.iCaps = caps;
       
   127     
       
   128     TRAPD( errorCode, iGenericEvents.AppendL( newEvent ));
       
   129     if( errorCode == ECCPErrorNone )
       
   130         {
       
   131         TInt res = iEventSender->RegisterEvent( KMediatorTelephonyDomain,
       
   132                                      KCatEventsFromTelephony,
       
   133                                      iGenericEvents );  
       
   134         __ASSERT_DEBUG( !res, Panic( EPhoneMediatorCenterRegistrationFailed ) );
       
   135         }
       
   136     }
       
   137 
       
   138 // -----------------------------------------------------------------------------
       
   139 // CPhoneMediatorSender::SendEvent
       
   140 // -----------------------------------------------------------------------------
       
   141 //
       
   142 EXPORT_C void CPhoneMediatorSender::SendEvent( 
       
   143     const TPhoneViewCommandId /*aCommandId*/ ) const
       
   144     {
       
   145     // No one yet intereseted this event.
       
   146     }
       
   147 
       
   148 // -----------------------------------------------------------------------------
       
   149 // CPhoneMediatorSender::SendEvent
       
   150 // -----------------------------------------------------------------------------
       
   151 //
       
   152 EXPORT_C void CPhoneMediatorSender::SendEvent( const TPhoneViewCommandId aCommandId, 
       
   153     const TInt aCallId ) const
       
   154     {
       
   155     switch( aCommandId )
       
   156         {
       
   157         case EPhoneViewRemoveCallHeader:
       
   158             {
       
   159             __PHONELOG1( EBasic, EPhoneMediatorCenter, 
       
   160                 "CPhoneMediatorSender::SendEvent - EPhoneEventCallData iCallId:%d" ,aCallId );
       
   161             TTelephonyCallDataParam callDataParam;
       
   162             callDataParam.iCallId = aCallId;
       
   163             callDataParam.iCallState = ECallStateIdle;
       
   164             TTelephonyCallDataParamPackage callDataParamPackage( callDataParam );
       
   165             iEventSender->RaiseEvent( KMediatorTelephonyDomain,
       
   166                                       KCatEventsFromTelephony,
       
   167                                       EPhoneEventCallData,
       
   168                                       TVersion( KTelephonyEventsVersionMajor,
       
   169                                         KTelephonyEventsVersionMinor, 
       
   170                                         KTelephonyEventsVersionBuild ),
       
   171                                       callDataParamPackage );   
       
   172             }
       
   173             break;
       
   174             
       
   175         default:
       
   176             break;
       
   177         }
       
   178     }
       
   179 
       
   180 // -----------------------------------------------------------------------------
       
   181 // CPhoneMediatorSender::SendEvent
       
   182 // -----------------------------------------------------------------------------
       
   183 //
       
   184 EXPORT_C void CPhoneMediatorSender::SendEvent( const TPhoneViewCommandId aCommandId, 
       
   185     TPhoneCommandParam& aCommandParam )
       
   186     {
       
   187     switch( aCommandId )
       
   188         {
       
   189         case EPhoneViewActivateMuteUIChanges:
       
   190             {
       
   191             TPhoneCmdParamBoolean& booleanParam = static_cast<TPhoneCmdParamBoolean&>( aCommandParam );
       
   192             const TBool audioMute( booleanParam.Boolean() );
       
   193             TInt response = KErrNone;
       
   194 
       
   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