vtengines/videoteleng/Src/Commands/CVtEngCommandHandler.cpp
changeset 0 ed9695c8bcbe
child 12 3e521e99f813
equal deleted inserted replaced
-1:000000000000 0:ed9695c8bcbe
       
     1 /*
       
     2 * Copyright (c) 2006 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:  Handles commands from user interface.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 
       
    22 #include    <e32std.h>
       
    23 #include    "CVtEngCommandHandler.h"
       
    24 #include    "CVtEngHandlerContainer.h"
       
    25 #include    "MVtEngCommandObserver.h"
       
    26 #include    "CVtEngOperation.h"
       
    27 #include    <cvtlogger.h>
       
    28 #include    "CVtEngStateManager.h"
       
    29 #include    <videotelephonyvariant.hrh>
       
    30 #include    "VtEngUtils.h"
       
    31 
       
    32 #include    "CVtEngStateIdle.h"
       
    33 #include    "CVtEngStateInitializing.h"
       
    34 #include    "CVtEngStateConnected.h"
       
    35 #include    "CVtEngStateRinging.h"
       
    36 #include    "CVtEngStateOpen.h"
       
    37 #include    "CVtEngStateNegotiating.h"
       
    38 #include    "CVtEngStateClearing.h"
       
    39 #include    "CVtEngStateAlerting.h"
       
    40 
       
    41 // CONSTANTS
       
    42 const TInt KVtEngCommandPoolCommands = 1;
       
    43 
       
    44 
       
    45 // ============================ MEMBER FUNCTIONS ===============================
       
    46 
       
    47 // -----------------------------------------------------------------------------
       
    48 // CVtEngCommandHandler::CVtEngCommandHandler
       
    49 // C++ constructor can NOT contain any code, that
       
    50 // might leave.
       
    51 // -----------------------------------------------------------------------------
       
    52 //
       
    53 CVtEngCommandHandler::CVtEngCommandHandler(
       
    54     CVtEngHandlerContainer& aHandlers ) :
       
    55     iObservers( 1 ),
       
    56     iHandlers( aHandlers )
       
    57     {
       
    58     }
       
    59 
       
    60 // -----------------------------------------------------------------------------
       
    61 // CVtEngCommandHandler::ConstructL
       
    62 // Symbian 2nd phase constructor can leave.
       
    63 // -----------------------------------------------------------------------------
       
    64 //
       
    65 void CVtEngCommandHandler::ConstructL()
       
    66     {
       
    67     __VTPRINTENTER( "CmdHlr.ConstructL" )
       
    68     iCommandPool = new ( ELeave ) CVtEngCmdPool( KVtEngCommandPoolCommands );
       
    69 
       
    70     // session termination
       
    71     AddToPoolL( KVtEngInitializeEngine );
       
    72     AddToPoolL( KVtEngInitializeEngineDiag );
       
    73     AddToPoolL( KVtEngInitializeEngineTest );
       
    74     AddToPoolL( KVtEngPrepareViewFinder );
       
    75     AddToPoolL( KVtEngPrepareRemoteRenderDSA );
       
    76     AddToPoolL( KVtEngPrepareRemoteRenderDP );
       
    77     AddToPoolL( KVtEngPrepareRemoteRenderNGA );
       
    78     AddToPoolL( KVtEngResetEngine );
       
    79     __VTPRINTEXIT( "CmdHlr.ConstructL" )
       
    80     }
       
    81 
       
    82 // -----------------------------------------------------------------------------
       
    83 // CVtEngCommandHandler::NewL
       
    84 // Two-phased constructor.
       
    85 // -----------------------------------------------------------------------------
       
    86 //
       
    87 CVtEngCommandHandler* CVtEngCommandHandler::NewL( CVtEngHandlerContainer& aHandlers )
       
    88     {
       
    89     __VTPRINT( DEBUG_GEN | DEBUG_CONSTRUCT, "CmdHlr.New")
       
    90     CVtEngCommandHandler* self = new( ELeave ) CVtEngCommandHandler( aHandlers );
       
    91 
       
    92     CleanupStack::PushL( self );
       
    93     self->ConstructL();
       
    94     CleanupStack::Pop();
       
    95 
       
    96     return self;
       
    97     }
       
    98 
       
    99 
       
   100 // Destructor
       
   101 CVtEngCommandHandler::~CVtEngCommandHandler()
       
   102     {
       
   103     __VTPRINTENTER( "CmdHlr.~" )
       
   104     iObservers.Close();
       
   105     if ( iActiveOp )
       
   106         {
       
   107         if ( iCommandPool->Get( iActiveOp->Command() ) == NULL )
       
   108             {
       
   109             delete iActiveOp;
       
   110             }
       
   111         }
       
   112     delete iCommandPool;
       
   113     __VTPRINTEXIT( "CmdHlr.~" )
       
   114     }
       
   115 
       
   116 // -----------------------------------------------------------------------------
       
   117 // CVtEngCommandHandler::ExecuteL
       
   118 //
       
   119 // -----------------------------------------------------------------------------
       
   120 //
       
   121 void CVtEngCommandHandler::ExecuteL(
       
   122             const TVtEngCommandId aCommandId,
       
   123             TDesC8* aParams )
       
   124     {
       
   125     __VTPRINTENTER( "CmdHlr.ExecuteL" )
       
   126 
       
   127     __VTPRINT2( DEBUG_GEN, "ComHlr:Exec cmdId=%d", aCommandId )
       
   128     ValidateL( aCommandId, aParams );
       
   129     CVtEngOperation* opFromPool = iCommandPool->Get( aCommandId );
       
   130     CVtEngOperation* op = opFromPool;
       
   131     if ( op == NULL )
       
   132         {
       
   133         op = CVtEngOperation::NewL( aCommandId, iHandlers, *this );
       
   134         CleanupStack::PushL( op );
       
   135         }
       
   136 
       
   137     switch ( aCommandId )
       
   138         {
       
   139         case KVtEngInitializeEngine:
       
   140         case KVtEngInitializeEngineTest:
       
   141         case KVtEngInitializeEngineDiag:
       
   142         case KVtEngResetEngine:
       
   143         case KVtEngTerminateSession:
       
   144         case KVtEngStartViewFinder:
       
   145         case KVtEngStopViewFinder:
       
   146         case KVtEngStartRenderRemote:
       
   147         case KVtEngStopRenderRemote:
       
   148         case KVtEngPauseRenderRemote:
       
   149         case KVtEngMuteOutgoingAudio:
       
   150         case KVtEngUnmuteOutgoingAudio:
       
   151         case KVtEngStopDtmfTone:
       
   152         case KVtEngRequestLastRemoteFrame:
       
   153         // Handling of different UIIs
       
   154         case KVtEngSetUIIDtmfSupport:
       
   155         case KVtEngSetUIIBasicStringSupport:
       
   156         case KVtEngSetUIIIA5StringSupport:
       
   157         case KVtEngSetUIIGeneralStringSupport:
       
   158         case KVtEngFreeze:
       
   159         case KVtEngUnfreeze:
       
   160         case KVtEngHandleLayoutChange:
       
   161 
       
   162         // Media object sharing (no parameters )
       
   163         case KVtEngStartShareImage:
       
   164         case KVtEngStopShareImage:
       
   165             op->ExecuteL( NULL );
       
   166             break;
       
   167         // Media
       
   168         case KVtEngSetUIForeground:
       
   169         case KVtEngPrepareCamera:
       
   170         case KVtEngPrepareViewFinder:
       
   171         case KVtEngPrepareViewFinderDSA:
       
   172         case KVtEngPrepareRemoteRenderDSA:
       
   173         case KVtEngPrepareViewFinderDP:
       
   174         case KVtEngPrepareRemoteRenderDP:
       
   175         case KVtEngPrepareRemoteRenderNGA:
       
   176         case KVtEngSetSource:
       
   177         case KVtEngSetZoomStep:
       
   178         case KVtEngSetAudioRouting:
       
   179         case KVtEngSetAudioVolume:
       
   180         case KVtEngIncreaseAudioVolume:
       
   181         case KVtEngDecreaseAudioVolume:
       
   182         case KVtEngSendDtmf:
       
   183         case KVtEngStartDtmfTone:
       
   184         case KVtEngSetVideoQuality:
       
   185         case KVtEngSwitchToVoice:
       
   186         // Extension commands
       
   187         case KVtEngSetContrast:
       
   188         case KVtEngSetBrightness:
       
   189         case KVtEngSetWhiteBalance:
       
   190         case KVtEngSetColorTone:
       
   191 #if defined ( RD_VT_RTF )
       
   192         case KVtEngStartRecord:
       
   193         case KVtEngStopRecord:
       
   194 #endif
       
   195         // Media object sharing (with parameters )
       
   196         case KVtEngInitializeShareImage:
       
   197             // Flow through, ok to execute
       
   198             op->ExecuteL( aParams );
       
   199             break;
       
   200         default:
       
   201             User::Leave( KErrNotSupported );
       
   202         }
       
   203     if ( opFromPool == NULL )
       
   204         {
       
   205         CleanupStack::Pop( ); // op (deletes itself)
       
   206         }
       
   207     CVtEngStateManager* states = CVtEngUtility::StateManager();
       
   208     states->Update();
       
   209     __VTPRINTEXIT( "CmdHlr.ExecuteL" )
       
   210     }
       
   211 
       
   212 
       
   213 // -----------------------------------------------------------------------------
       
   214 // CVtEngCommandHandler::CancelCommand
       
   215 //
       
   216 // -----------------------------------------------------------------------------
       
   217 //
       
   218 TInt CVtEngCommandHandler::CancelCommand( const TVtEngCommandId aCommandId )
       
   219     {
       
   220     __VTPRINTENTER( "CmdHlr.CancelCommand" )
       
   221 
       
   222     __VTPRINT2( DEBUG_GEN, "ComHlr.Cancel cmd=%d", aCommandId )
       
   223     TInt err( KErrGeneral );
       
   224     if ( iActiveOp &&
       
   225          iActiveOp->Command() == aCommandId &&
       
   226          aCommandId != KVtEngResetEngine &&
       
   227          aCommandId != KVtEngInitializeEngineTest &&
       
   228          aCommandId != KVtEngInitializeEngineDiag)
       
   229         {
       
   230         iActiveOp->Cancel();
       
   231         err = KErrNone;
       
   232         }
       
   233     __VTPRINT2( DEBUG_GEN | DEBUG_DETAIL, "ComHlr.Cancel res=%d",err )
       
   234     __VTPRINTEXIT( "CmdHlr.CancelCommand" )
       
   235     return err;
       
   236     }
       
   237 
       
   238 // -----------------------------------------------------------------------------
       
   239 // CVtEngCommandHandler::GetCommandCaps
       
   240 //
       
   241 // -----------------------------------------------------------------------------
       
   242 //
       
   243 TInt CVtEngCommandHandler::GetCommandCaps(
       
   244     const TVtEngCommandId aCommand )
       
   245     {
       
   246     TInt caps( 0 );
       
   247     CheckAsynchronity( aCommand, caps );
       
   248     CheckSupport( aCommand, caps );
       
   249     CheckState( aCommand, caps );
       
   250     return caps;
       
   251     }
       
   252 
       
   253 // -----------------------------------------------------------------------------
       
   254 // CVtEngCommandHandler::PendingCommand
       
   255 //
       
   256 // -----------------------------------------------------------------------------
       
   257 //
       
   258 TVtEngCommandId CVtEngCommandHandler::PendingCommand()
       
   259     {
       
   260     if ( iActiveOp )
       
   261         {
       
   262         return iActiveOp->Command();
       
   263         }
       
   264     return KVtEngCommandNone;
       
   265     }
       
   266 
       
   267 // -----------------------------------------------------------------------------
       
   268 // CVtEngCommandHandler::AddObserverL
       
   269 //
       
   270 // -----------------------------------------------------------------------------
       
   271 //
       
   272 void CVtEngCommandHandler::AddObserverL(
       
   273     MVtEngCommandObserver& aObserver )
       
   274     {
       
   275     User::LeaveIfError( iObservers.Append( &aObserver ) );
       
   276     }
       
   277 
       
   278 // -----------------------------------------------------------------------------
       
   279 // CVtEngCommandHandler::RemoveObserver
       
   280 //
       
   281 // -----------------------------------------------------------------------------
       
   282 //
       
   283 void CVtEngCommandHandler::RemoveObserver(
       
   284     MVtEngCommandObserver& aObserver )
       
   285     {
       
   286     const TInt pos( iObservers.Find( &aObserver ) );
       
   287     if ( pos >= 0 )
       
   288         {
       
   289         iObservers.Remove( pos );
       
   290         }
       
   291     }
       
   292 
       
   293 // -----------------------------------------------------------------------------
       
   294 // CVtEngCommandHandler::CommandCompleteL
       
   295 //
       
   296 // -----------------------------------------------------------------------------
       
   297 //
       
   298 void CVtEngCommandHandler::CommandCompleteL(
       
   299             const TVtEngCommandId aCommand,
       
   300             const TInt aResult )
       
   301     {
       
   302     __VTPRINTENTER( "CmdHlr.CommandCompleteL" )
       
   303     __VTPRINT3( DEBUG_GEN, " completed cmd=%d,res=%d", aCommand, aResult )
       
   304     TInt count( iObservers.Count() );
       
   305     while ( count-- )
       
   306         {
       
   307         MVtEngCommandObserver* observer = iObservers[ count ];
       
   308         observer->HandleVTCommandPerformedL( aCommand, aResult );
       
   309         }
       
   310     __VTPRINTEXIT( "CmdHlr.CommandCompleteL" )
       
   311     }
       
   312 
       
   313 // -----------------------------------------------------------------------------
       
   314 // CVtEngCommandHandler::SetOperation
       
   315 // Sets active operation
       
   316 //
       
   317 // -----------------------------------------------------------------------------
       
   318 //
       
   319 void CVtEngCommandHandler::SetOperation( CVtEngOperation* aActiveOp )
       
   320     {
       
   321     iActiveOp = aActiveOp;
       
   322     }
       
   323 
       
   324 // -----------------------------------------------------------------------------
       
   325 // CVtEngCommandHandler::AddToPoolL
       
   326 // Adds a command to command pool. Only commands without parameters and
       
   327 // that don't delete themselfs can currently be added.
       
   328 //
       
   329 // -----------------------------------------------------------------------------
       
   330 //
       
   331 void CVtEngCommandHandler::AddToPoolL( TVtEngCommandId aCommand )
       
   332     {
       
   333     CVtEngOperation* op = CVtEngOperation::NewL(
       
   334         aCommand, iHandlers, *this, EFalse );
       
   335     CleanupStack::PushL( op );
       
   336     iCommandPool->AppendL( op );
       
   337     CleanupStack::Pop(); // op
       
   338     }
       
   339 
       
   340 // -----------------------------------------------------------------------------
       
   341 // CVtEngCommandHandler::ValidateL
       
   342 // Checks if command can be performed.
       
   343 //
       
   344 // -----------------------------------------------------------------------------
       
   345 //
       
   346 void CVtEngCommandHandler::ValidateL(
       
   347             const TVtEngCommandId aCommandId,
       
   348             TDesC8* /*aParams*/ )
       
   349     {
       
   350     // check if async command is already pending and new
       
   351     // command is async
       
   352     TInt caps( 0 );
       
   353     CheckState( aCommandId, caps );
       
   354     if ( !(caps & EAttribEnabled ) )
       
   355         {
       
   356         User::Leave( KErrNotReady );
       
   357         }
       
   358     }
       
   359 
       
   360 // -----------------------------------------------------------------------------
       
   361 // CVtEngCommandHandler::CheckAsynchronity
       
   362 // Checks if command is async
       
   363 //
       
   364 // -----------------------------------------------------------------------------
       
   365 //
       
   366 void CVtEngCommandHandler::CheckAsynchronity(
       
   367             const TVtEngCommandId aCommandId,
       
   368             TInt& aCaps )
       
   369     {
       
   370     switch ( aCommandId )
       
   371         {
       
   372         case KVtEngInitializeEngine:
       
   373         case KVtEngInitializeEngineTest:
       
   374         case KVtEngInitializeEngineDiag:
       
   375         case KVtEngResetEngine:
       
   376         case KVtEngTerminateSession:
       
   377         case KVtEngSetSource:
       
   378         case KVtEngPrepareCamera:
       
   379         case KVtEngSetAudioRouting:
       
   380         case KVtEngMuteOutgoingAudio:
       
   381         case KVtEngUnmuteOutgoingAudio:
       
   382         case KVtEngSetAudioVolume:
       
   383         case KVtEngHandleLayoutChange:
       
   384         case KVtEngUnfreeze:
       
   385 
       
   386         // Media object sharing
       
   387         case KVtEngInitializeShareImage:
       
   388         case KVtEngStartShareImage:
       
   389         case KVtEngStopShareImage:
       
   390         case KVtEngSwitchToVoice:
       
   391             aCaps |= EAttribAsync;
       
   392             break;
       
   393         default:
       
   394             aCaps &= (~EAttribAsync);
       
   395             break;
       
   396         }
       
   397     __VTPRINT3( DEBUG_GEN | DEBUG_RETURN, "ComHlr:capsA cmd=%d,caps=%d", aCommandId, aCaps )
       
   398     }
       
   399 
       
   400 // -----------------------------------------------------------------------------
       
   401 // CVtEngCommandHandler::CheckSupport
       
   402 // Checks if command is supported
       
   403 //
       
   404 // -----------------------------------------------------------------------------
       
   405 //
       
   406 void CVtEngCommandHandler::CheckSupport(
       
   407             const TVtEngCommandId aCommandId,
       
   408             TInt& aCaps )
       
   409     {
       
   410     switch ( aCommandId )
       
   411         {
       
   412         case KVtEngInitializeEngine:
       
   413         case KVtEngInitializeEngineTest:
       
   414         case KVtEngInitializeEngineDiag:
       
   415         case KVtEngResetEngine:
       
   416         case KVtEngTerminateSession:
       
   417         case KVtEngStartViewFinder:
       
   418         case KVtEngStopViewFinder:
       
   419         case KVtEngPrepareViewFinder:
       
   420         case KVtEngPrepareRemoteRenderDSA:
       
   421         case KVtEngPrepareRemoteRenderDP:
       
   422         case KVtEngPrepareRemoteRenderNGA:
       
   423         case KVtEngStartRenderRemote:
       
   424         case KVtEngStopRenderRemote:
       
   425         case KVtEngSetAudioRouting:
       
   426         case KVtEngSetAudioVolume:
       
   427         case KVtEngIncreaseAudioVolume:
       
   428         case KVtEngDecreaseAudioVolume:        
       
   429         case KVtEngPauseRenderRemote:
       
   430         case KVtEngMuteOutgoingAudio:
       
   431         case KVtEngUnmuteOutgoingAudio:
       
   432         case KVtEngSetSource:
       
   433         case KVtEngPrepareCamera:
       
   434         case KVtEngStartDtmfTone:
       
   435         case KVtEngStopDtmfTone:
       
   436         case KVtEngFreeze:
       
   437         case KVtEngUnfreeze:
       
   438         case KVtEngSetVideoQuality:
       
   439         case KVtEngHandleLayoutChange:
       
   440         // Handling of different UIIs, support is there
       
   441         case KVtEngSetUIIDtmfSupport:
       
   442         case KVtEngSetUIIBasicStringSupport:
       
   443         case KVtEngSetUIIIA5StringSupport:
       
   444         case KVtEngSetUIIGeneralStringSupport:
       
   445         case KVtEngSetUIForeground:
       
   446         case KVtEngRequestLastRemoteFrame:
       
   447 
       
   448         // Media object sharing
       
   449         case KVtEngInitializeShareImage:
       
   450         case KVtEngStartShareImage:
       
   451         case KVtEngStopShareImage:
       
   452         case KVtEngSwitchToVoice:
       
   453             aCaps |= EAttribSupported;
       
   454             break;
       
   455 
       
   456         // Extension commands
       
   457 	    case KVtEngSetContrast:
       
   458 	    case KVtEngSetBrightness:
       
   459 	    case KVtEngSetWhiteBalance:
       
   460 	    case KVtEngSetColorTone:
       
   461 #if defined ( RD_VT_RTF )
       
   462 	    case KVtEngStartRecord:
       
   463 	    case KVtEngStopRecord:
       
   464 #endif
       
   465             aCaps |= EAttribSupported;
       
   466             break;
       
   467 
       
   468         default:
       
   469             aCaps &= (~EAttribSupported);
       
   470             __VTPRINT( DEBUG_GEN, "ComHlr.NOT SUPPORTED" )
       
   471             break;
       
   472         }
       
   473     __VTPRINT3( DEBUG_GEN | DEBUG_DETAIL, "  capsSupport cmd=%d,caps=%d", aCommandId, aCaps )
       
   474     }
       
   475 
       
   476 // -----------------------------------------------------------------------------
       
   477 // CVtEngCommandHandler::CheckState
       
   478 // Checks if command is possible in current state.
       
   479 //
       
   480 // -----------------------------------------------------------------------------
       
   481 //
       
   482 void CVtEngCommandHandler::CheckState(
       
   483     const TVtEngCommandId aCommandId,
       
   484     TInt& aCaps )
       
   485     {
       
   486     aCaps &= (~EAttribEnabled);
       
   487     if ( !(iActiveOp && ( aCaps & EAttribAsync ) ) )
       
   488         {
       
   489         const CVtEngStateManager* states = CVtEngUtility::StateManager();
       
   490         if ( states->IsCommandPossible( aCommandId ) )
       
   491             {
       
   492             aCaps |= EAttribEnabled;
       
   493             }
       
   494 #ifdef VTDEBUG
       
   495         else
       
   496             {
       
   497             __VTPRINT( DEBUG_GEN, "ComHlr.ChkState INVALID" )
       
   498             }
       
   499 #endif // VTDEBUG
       
   500         }
       
   501     __VTPRINT3( DEBUG_GEN | DEBUG_DETAIL, "  capsState cmd=%d,caps=%d", aCommandId, aCaps )
       
   502     }
       
   503 
       
   504 // -----------------------------------------------------------------------------
       
   505 // CVtEngCommandHandler::CVtEngCmdPool::CVtEngCmdPool
       
   506 // C++ constructor
       
   507 //
       
   508 // -----------------------------------------------------------------------------
       
   509 //
       
   510 CVtEngCommandHandler::CVtEngCmdPool::CVtEngCmdPool( TInt aGranularity ) :
       
   511     CArrayPtrFlat<CVtEngOperation>( aGranularity )
       
   512     {
       
   513     }
       
   514 
       
   515 // -----------------------------------------------------------------------------
       
   516 // CVtEngCommandHandler::CVtEngCmdPool::CVtEngCmdPool
       
   517 // Destructor - deletes operations in the pool.
       
   518 //
       
   519 // -----------------------------------------------------------------------------
       
   520 //
       
   521 CVtEngCommandHandler::CVtEngCmdPool::~CVtEngCmdPool( )
       
   522     {
       
   523     ResetAndDestroy();
       
   524     }
       
   525 
       
   526 // -----------------------------------------------------------------------------
       
   527 // CVtEngCommandHandler::CVtEngCmdPool::Get
       
   528 // Returns pointer to an operation in the pool.
       
   529 //
       
   530 // -----------------------------------------------------------------------------
       
   531 //
       
   532 CVtEngOperation* CVtEngCommandHandler::CVtEngCmdPool::Get(
       
   533             const TVtEngCommandId aId )
       
   534     {
       
   535     TInt count( Count() );
       
   536     CVtEngOperation* ret = NULL;
       
   537     while ( count-- )
       
   538         {
       
   539         CVtEngOperation* op = At( count );
       
   540         if ( op->Command() == aId )
       
   541             {
       
   542             ret = op;
       
   543             count = 0; // break
       
   544             }
       
   545         }
       
   546     return ret;
       
   547     }
       
   548 
       
   549 //  End of File