accessoryservices/pluggeddisplay/pluggeddisplayengine/src/tvoutconfigforhdmi.cpp
changeset 0 4e1aa6a622a0
child 8 6bb05bdcbe09
equal deleted inserted replaced
-1:000000000000 0:4e1aa6a622a0
       
     1 /*
       
     2  * Copyright (c) 2009 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:
       
    15  * CPDConfigurationForHDMI class implementation.
       
    16  *
       
    17  */
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include <tvoutconfig.h>
       
    22 #include <e32base.h>
       
    23 #include "pdeconstants.h"
       
    24 #include "tvoutconfigforhdmi.h"
       
    25 #include "multifinitestatemachine.h"
       
    26 #include "hdmicablestatusfsm.h"
       
    27 #include "myasynconeshottimer.h"
       
    28 #include "trace.h"
       
    29 
       
    30 // EXTERNAL DATA STRUCTURES
       
    31 
       
    32 // EXTERNAL FUNCTION PROTOTYPES
       
    33 
       
    34 // CONSTANTS
       
    35 
       
    36 // MACROS
       
    37 
       
    38 // LOCAL CONSTANTS AND MACROS
       
    39 
       
    40 // MODULE DATA STRUCTURES
       
    41 
       
    42 // LOCAL FUNCTION PROTOTYPES
       
    43 
       
    44 // FORWARD DECLARATIONS
       
    45 
       
    46 
       
    47 // ============================= LOCAL FUNCTIONS ===============================
       
    48 
       
    49 // ============================ MEMBER FUNCTIONS ===============================
       
    50 
       
    51 // -----------------------------------------------------------------------------
       
    52 //
       
    53 // Two-phased constructor.
       
    54 // -----------------------------------------------------------------------------
       
    55 //
       
    56 // ----------------------------------------------------------------------------
       
    57 // CTVOutConfigListenerForHDMI::NewL
       
    58 //
       
    59 // ----------------------------------------------------------------------------
       
    60 //
       
    61 CTVOutConfigForHDMI* CTVOutConfigForHDMI::NewL(
       
    62         MFSMForBody& aFSM )
       
    63     {
       
    64     FUNC_LOG;
       
    65     CTVOutConfigForHDMI* self = new(ELeave) CTVOutConfigForHDMI( aFSM );
       
    66 
       
    67     CleanupStack::PushL( self );
       
    68     self->ConstructL();
       
    69     CleanupStack::Pop( self);
       
    70 
       
    71     return self;
       
    72     }
       
    73 
       
    74 // ----------------------------------------------------------------------------
       
    75 // CTVOutConfigForHDMI::CTVOutConfigForHDMI
       
    76 //
       
    77 // ----------------------------------------------------------------------------
       
    78 //
       
    79 CTVOutConfigForHDMI::CTVOutConfigForHDMI(
       
    80         MFSMForBody& aFSM )
       
    81     : CActive( CActive::EPriorityLow ),
       
    82     iTvConfig ( NULL ),
       
    83     iFSM( aFSM )
       
    84     {
       
    85     FUNC_LOG;
       
    86     // Nothing
       
    87     }
       
    88 
       
    89 // ----------------------------------------------------------------------------
       
    90 // CTVOutConfigForHDMI::ListenHDMICableStatusIfNoMissedEvents
       
    91 //
       
    92 // ----------------------------------------------------------------------------
       
    93 //
       
    94 TFSMEventId CTVOutConfigForHDMI::ListenHDMICableStatusIfNoMissedEvents()
       
    95     {
       
    96     FUNC_LOG;
       
    97     TFSMEventId retEvent( EIfTVOutConfigEventUndefined );
       
    98     TFSMState currentStateId = iFSM.CurrentStateID();
       
    99 
       
   100     if  ( ( EHDMICableStateIdle == currentStateId ) && ( iTvConfig->HdmiCableConnected() ) )
       
   101         {
       
   102         INFO("Cable connected while disconnect actions were going on in ASY or is already connected when ASY starts.");
       
   103         retEvent = EIfTVOutConfigEventCableConnected;
       
   104         }
       
   105     else if ( ( EHDMICableStateConnected == currentStateId ) && ( !iTvConfig->HdmiCableConnected() ) )
       
   106         {
       
   107         INFO("Cable disconnected while connect actions were going on in ASY.");
       
   108         retEvent = EIfTVOutConfigEventCableDisconnected;
       
   109         }
       
   110     else if ( !IsActive() )
       
   111         {
       
   112         iStatus = KRequestPending;
       
   113         iNextOpt = EOptStartListenHdmiCable;
       
   114         SetActive();
       
   115         TRequestStatus* status = &iStatus;
       
   116         User::RequestComplete( status, KErrNone );                  
       
   117         }
       
   118     INFO_1("Returning event id: %d", retEvent);
       
   119     return retEvent;
       
   120     }
       
   121 
       
   122 // ----------------------------------------------------------------------------
       
   123 // CTVOutConfigForHDMI::SetAvailableTvConfigList
       
   124 //
       
   125 // ----------------------------------------------------------------------------
       
   126 //
       
   127 TInt CTVOutConfigForHDMI::SetAvailableTvConfigList(
       
   128         const RArray<TTvSettings>& aAnalogConfigs, 
       
   129         const RArray<THdmiDviTimings>& aHdmiConfigs )
       
   130     {
       
   131     FUNC_LOG;
       
   132     TInt retVal( KErrNotFound );
       
   133     if ( iTvConfig )
       
   134         {
       
   135         retVal = iTvConfig->SetAvailableTvConfigList(
       
   136                 aAnalogConfigs,
       
   137                 aHdmiConfigs );
       
   138         }
       
   139     
       
   140     return retVal;
       
   141     }
       
   142 
       
   143 // ----------------------------------------------------------------------------
       
   144 // CTVOutConfigForHDMI::Enable
       
   145 //
       
   146 // ----------------------------------------------------------------------------
       
   147 //
       
   148 void CTVOutConfigForHDMI::Enable()
       
   149     {
       
   150     FUNC_LOG;
       
   151     Cancel();
       
   152     iStatus = KRequestPending;
       
   153     iNextOpt = EOptEnableTv;
       
   154     SetActive();
       
   155     TRequestStatus* status = &iStatus;
       
   156     User::RequestComplete( status, KErrNone );        
       
   157     }
       
   158 
       
   159 // ----------------------------------------------------------------------------
       
   160 // CTVOutConfigForHDMI::Disable
       
   161 //
       
   162 // ----------------------------------------------------------------------------
       
   163 //
       
   164 void CTVOutConfigForHDMI::Disable()
       
   165     {
       
   166     FUNC_LOG;
       
   167     Cancel();
       
   168     iStatus = KRequestPending;
       
   169     iNextOpt = EOptDisableTv;
       
   170     SetActive();
       
   171     TRequestStatus* status = &iStatus;
       
   172     User::RequestComplete( status, KErrNone );        
       
   173     }
       
   174 
       
   175 
       
   176 // ----------------------------------------------------------------------------
       
   177 // CTVOutConfigForHDMI::Disable
       
   178 //
       
   179 // ----------------------------------------------------------------------------
       
   180 //
       
   181 void CTVOutConfigForHDMI::ListenForDisconnection()
       
   182     {
       
   183     Cancel();
       
   184     iNextOpt = EOptStartListenForDisconnection;
       
   185     iStatus = KRequestPending;
       
   186     SetActive();
       
   187     TRequestStatus* status = &iStatus;
       
   188     User::RequestComplete( status, KErrNone );        
       
   189     }
       
   190 
       
   191 // ----------------------------------------------------------------------------
       
   192 // CTVOutConfigForHDMI::GetTvOutConfig
       
   193 //
       
   194 // ----------------------------------------------------------------------------
       
   195 //
       
   196 CTvOutConfig* CTVOutConfigForHDMI::GetTvOutConfig()
       
   197     {
       
   198     FUNC_LOG;
       
   199     return iTvConfig;
       
   200     }
       
   201 
       
   202 
       
   203 // ----------------------------------------------------------------------------
       
   204 // CTVOutConfigForHDMI::ListenCopyProtectionIfNoMissedEvents
       
   205 //
       
   206 // ----------------------------------------------------------------------------
       
   207 //
       
   208 TCopyProtctListenRetValues CTVOutConfigForHDMI::ListenCopyProtectionIfNoMissedEvents()
       
   209     {
       
   210     FUNC_LOG;
       
   211     TCopyProtctListenRetValues retStruct;
       
   212     retStruct.iFSMEventId = EIfTVOutConfigEventUndefined;
       
   213     retStruct.iError = KErrNone;
       
   214     TBool currentCopyProtectStatus = iTvConfig->CopyProtectionStatus();
       
   215 
       
   216     if  ( iLastRecordedCopyProtectEnabledStatus != currentCopyProtectStatus )
       
   217         {
       
   218         INFO("Copy Protection status changed while not listening.");
       
   219         retStruct.iFSMEventId = EIfTVOutConfigEventSetCopyProtectStatusChanged;
       
   220         }
       
   221     else if ( !IsActive() )
       
   222         {
       
   223         iLastRecordedCopyProtectEnabledStatus = currentCopyProtectStatus;
       
   224         iStatus = KRequestPending;
       
   225         TInt err = iTvConfig->CopyProtectionStatusListener( iStatus );
       
   226         if ( KErrNone == err )
       
   227             {
       
   228             SetActive();
       
   229             iNextOpt = EOptListenCopyProtection;
       
   230             }
       
   231         else
       
   232             {
       
   233             iStatus = KErrNone;
       
   234             INFO_1("Error status %d", err);
       
   235             INFO("Copy Protection Status listening failed.");
       
   236             retStruct.iError = err;
       
   237             retStruct.iFSMEventId = EIfTVOutConfigEventCopyProtectionListenFailed;            
       
   238             }
       
   239         }
       
   240     return retStruct;
       
   241     }
       
   242 
       
   243 // ----------------------------------------------------------------------------
       
   244 // CTVOutConfigForHDMI::GetLatestRecordedCopyProtectionStatus
       
   245 //
       
   246 // ----------------------------------------------------------------------------
       
   247 //
       
   248 TBool CTVOutConfigForHDMI::GetLatestRecordedCopyProtectionStatus() const
       
   249     {
       
   250     FUNC_LOG;
       
   251     return iLastRecordedCopyProtectEnabledStatus;
       
   252     }
       
   253 
       
   254 // ----------------------------------------------------------------------------
       
   255 // CTVOutConfigForHDMI::ResetLatestRecordedCopyProtectionStatus
       
   256 //
       
   257 // ----------------------------------------------------------------------------
       
   258 //
       
   259 void CTVOutConfigForHDMI::ResetLatestRecordedCopyProtectionStatus()
       
   260     {
       
   261     FUNC_LOG;
       
   262     iLastRecordedCopyProtectEnabledStatus = EFalse;
       
   263     }
       
   264 
       
   265 // ----------------------------------------------------------------------------
       
   266 // CTVOutConfigForHDMI::ListenSettingsChanges
       
   267 //
       
   268 // ----------------------------------------------------------------------------
       
   269 //
       
   270 void CTVOutConfigForHDMI::ListenSettingsChanges()
       
   271     {
       
   272     FUNC_LOG;
       
   273     Cancel();    
       
   274     iNextOpt = EOptStartListenForSettingsChanges;
       
   275     iStatus = KRequestPending;
       
   276     SetActive();
       
   277     TRequestStatus* status = &iStatus;
       
   278     User::RequestComplete( status, KErrNone );        
       
   279     
       
   280     }
       
   281 
       
   282 // ----------------------------------------------------------------------------
       
   283 // CTVOutConfigForHDMI::GetSupportedHdmiModes
       
   284 //
       
   285 // ----------------------------------------------------------------------------
       
   286 //
       
   287 TInt CTVOutConfigForHDMI::GetSupportedHdmiModes( RArray<TSupportedHdmiDviMode>& asupportedModes )
       
   288     {
       
   289     FUNC_LOG;
       
   290 
       
   291 	TUint count;
       
   292 	TInt  retVal( KErrNone );
       
   293 	
       
   294 	retVal = iTvConfig->GetNumberOfHdmiModes( count );
       
   295 	ERROR( retVal, "Getting supported hdmi modes failed" );
       
   296 
       
   297 	if( KErrNone == retVal )
       
   298 		{
       
   299 		for( TInt i = 0; (i < count); i++)
       
   300 			{
       
   301 			TSupportedHdmiDviMode mode;			
       
   302 			iTvConfig->GetSupportedHdmiMode( i, mode );
       
   303 			TInt err = asupportedModes.Append( mode );
       
   304 			if(KErrNone != err)
       
   305 			    {
       
   306 			    ERROR( err, "Failed to append supported modes in array" );
       
   307 			    retVal = err;
       
   308 			    break;
       
   309 			    }
       
   310 			}
       
   311 		}
       
   312 
       
   313 	return retVal;
       
   314     }
       
   315 
       
   316 // ----------------------------------------------------------------------------
       
   317 // CTVOutConfigForHDMI::ConstructL
       
   318 //
       
   319 // ----------------------------------------------------------------------------
       
   320 //
       
   321 void CTVOutConfigForHDMI::ConstructL()
       
   322     {
       
   323     FUNC_LOG;
       
   324      // Tv out config
       
   325     iTvConfig = CTvOutConfig::NewL();
       
   326     iMyAsyncOneShotTimer = new (ELeave) CMyAsyncOneShotTimer( CActive::EPriorityLow, *this );
       
   327     CActiveScheduler::Add( this );
       
   328     }
       
   329 
       
   330 // ----------------------------------------------------------------------------
       
   331 // CTVOutConfigForHDMI::~CTVOutConfigForHDMI
       
   332 //
       
   333 // ----------------------------------------------------------------------------
       
   334 //
       
   335 CTVOutConfigForHDMI::~CTVOutConfigForHDMI()
       
   336     {
       
   337     FUNC_LOG;
       
   338     if ( iTvConfig )
       
   339         {
       
   340         Cancel();
       
   341         delete iTvConfig;        
       
   342         }
       
   343     if ( iMyAsyncOneShotTimer )
       
   344         {
       
   345         if ( iMyAsyncOneShotTimer->IsActive() )
       
   346             {
       
   347             iMyAsyncOneShotTimer->Cancel();      
       
   348             }
       
   349         delete iMyAsyncOneShotTimer;
       
   350         }
       
   351     }
       
   352 
       
   353 // ----------------------------------------------------------------------------
       
   354 // CTVOutConfigForHDMI::DoCancel
       
   355 //
       
   356 // ----------------------------------------------------------------------------
       
   357 //
       
   358 void CTVOutConfigForHDMI::DoCancel()
       
   359     {
       
   360     FUNC_LOG;
       
   361     TInt err( KErrNone );
       
   362     iLastRecordedCopyProtectEnabledStatus = EFalse;
       
   363     if (    ( EOptListenHdmiCable == iNextOpt )||
       
   364             ( EOptListenForDisconnection == iNextOpt ) )
       
   365         {
       
   366         err = iTvConfig->HdmiCableListenerCancel();            
       
   367         }
       
   368     else if ( EOptListenCopyProtection == iNextOpt )
       
   369         {
       
   370         err = iTvConfig->CopyProtectionStatusCancel();            
       
   371         }
       
   372     else if ( EOptListenForSettingsChanges == iNextOpt )
       
   373         {
       
   374         err = iTvConfig->SettingsChangedListenerCancel();
       
   375         }
       
   376     if ( iMyAsyncOneShotTimer )
       
   377         {
       
   378         iMyAsyncOneShotTimer->Cancel();
       
   379         }
       
   380     iNextOpt = EOptIdle;
       
   381     if ( KErrNone != err )
       
   382         {
       
   383         INFO_1("Error status %d", err);
       
   384         }
       
   385     }
       
   386 
       
   387 // ----------------------------------------------------------------------------
       
   388 // CTVOutConfigForHDMI::RunL
       
   389 //
       
   390 // ----------------------------------------------------------------------------
       
   391 //
       
   392 void CTVOutConfigForHDMI::RunL()
       
   393     {
       
   394     FUNC_LOG;
       
   395 
       
   396     switch ( iNextOpt )
       
   397         {
       
   398         case EOptStartListenHdmiCable:
       
   399             {
       
   400             INFO("EOptStartListenHdmiCable");
       
   401             iStatus = KRequestPending;
       
   402             TInt err = iTvConfig->HdmiCableListener( iStatus );
       
   403             INFO_1("Error status %d", err);
       
   404             if(err == KErrNone)
       
   405                 {
       
   406                 SetActive();
       
   407                 iNextOpt = EOptListenHdmiCable;
       
   408                 }
       
   409             else
       
   410                 {
       
   411                 iStatus = KErrNone;
       
   412                 User::LeaveIfError( err );
       
   413                 }       
       
   414             break;
       
   415             }
       
   416         case EOptListenHdmiCable:
       
   417             {
       
   418             INFO("EOptListenHdmiCable");
       
   419             if ( KErrNone != iStatus.Int())
       
   420                 {
       
   421                 if ( EHDMICableStateIdle == iFSM.CurrentStateID() )
       
   422                     {
       
   423                     // HDMI Cable FSM may not fail in idle state.
       
   424                     // Try to listen after a while, and do this again (possibly) forever
       
   425                     iTimeOutReason = EOptStartListenHdmiCable;
       
   426                     iNextOpt = EOptIdle;
       
   427                     iMyAsyncOneShotTimer->Call();
       
   428                     }
       
   429                 else
       
   430                     {
       
   431                     iFSM.Input( 
       
   432                             EPDEIfTVOutConfig, 
       
   433                             EIfTVOutConfigEventCableStatusListenFailed );
       
   434                     }
       
   435                 }
       
   436             else if ( iTvConfig->HdmiCableConnected() )
       
   437                 {
       
   438                 iFSM.Input( 
       
   439                         EPDEIfTVOutConfig, 
       
   440                         EIfTVOutConfigEventCableConnected );
       
   441                 }
       
   442             else
       
   443                 {
       
   444                 iFSM.Input(
       
   445                         EPDEIfTVOutConfig,
       
   446                         EIfTVOutConfigEventCableDisconnected );
       
   447                 }
       
   448             break;
       
   449             }
       
   450         case EOptListenCopyProtection:
       
   451             {
       
   452             INFO("EOptListenCopyProtection");
       
   453             iNextOpt = EOptIdle;
       
   454             if ( KErrNone != iStatus.Int())
       
   455                 {
       
   456                 iFSM.Input(
       
   457                         EPDEIfTVOutConfig,
       
   458                         EIfTVOutConfigEventCopyProtectionListenFailed );                
       
   459                 }
       
   460             else
       
   461                 {
       
   462                 iLastRecordedCopyProtectEnabledStatus = iTvConfig->CopyProtectionStatus();
       
   463                 iFSM.Input(
       
   464                         EPDEIfTVOutConfig,
       
   465                         EIfTVOutConfigEventSetCopyProtectStatusChanged );                
       
   466                 }
       
   467             break;
       
   468             }
       
   469          case EOptEnableTv:
       
   470             {
       
   471             INFO("EOptEnableTv");
       
   472             TInt retVal = iTvConfig->Enable();
       
   473             INFO_1("iTvConfig->Enable() retVal: %d", retVal);
       
   474             switch ( retVal )
       
   475                 {
       
   476                 case KErrNone:
       
   477                 case KErrAlreadyExists:    
       
   478                     {
       
   479                     iFSM.Input(
       
   480                             EPDEIfTVOutConfig,
       
   481                             EIfTVOutConfigEventEnabled );                                             
       
   482                     }
       
   483                     break;
       
   484                 case KErrServerBusy:
       
   485                     {
       
   486                     iTimeOutReason = iNextOpt;
       
   487                     iNextOpt = EOptIdle;
       
   488                     iMyAsyncOneShotTimer->Call();
       
   489                     }
       
   490                     break;
       
   491                 case KErrNotSupported:
       
   492                 case KErrNotReady:
       
   493                 default:
       
   494                     {
       
   495                         iFSM.Input(
       
   496                                 EPDEIfTVOutConfig,
       
   497                                 EIfTVOutConfigEventEnableFailed );                                             
       
   498                     }
       
   499                     break;
       
   500                 }            
       
   501             break;
       
   502             }
       
   503         case EOptDisableTv:
       
   504             {
       
   505             INFO("EOptDisableTv");
       
   506             TInt retVal = iTvConfig->Disable();
       
   507             INFO_1("iTvConfig->Disable() retVal: %d", retVal);
       
   508             switch ( retVal )
       
   509                 {
       
   510                 case KErrNone:
       
   511                 case KErrAlreadyExists:    
       
   512                     {
       
   513                     iFSM.Input(
       
   514                             EPDEIfTVOutConfig,
       
   515                             EIfTVOutConfigEventDisabled );                                             
       
   516                     }
       
   517                     break;
       
   518                 case KErrServerBusy:
       
   519                     {
       
   520                     iTimeOutReason = iNextOpt;
       
   521                     iNextOpt = EOptIdle;
       
   522                     iMyAsyncOneShotTimer->Call();
       
   523                     }
       
   524                     break;
       
   525                 case KErrNotSupported:
       
   526                 case KErrNotReady:
       
   527                 default:
       
   528                     {
       
   529                     iFSM.Input(
       
   530                             EPDEIfTVOutConfig,
       
   531                             EIfTVOutConfigEventDisableFailed );                                             
       
   532                     }
       
   533                     break;
       
   534                 }            
       
   535             break;
       
   536             }
       
   537         case EOptStartListenForDisconnection:
       
   538             {
       
   539             INFO("EOptStartListenForDisconnection");
       
   540             iStatus = KRequestPending;
       
   541             TInt err = iTvConfig->HdmiCableListener( iStatus );
       
   542             if(err == KErrNone)
       
   543                 {
       
   544                 SetActive();
       
   545                 if(iTvConfig->HdmiCableConnected())
       
   546                     {
       
   547                     iNextOpt = EOptListenForDisconnection;
       
   548                     }
       
   549                 else
       
   550                     {
       
   551                     Cancel();
       
   552                     iFSM.Input( 
       
   553                             EPDEIfTVOutConfig, 
       
   554                             EIfTVOutConfigEventCableDisconnected );                    
       
   555                     }
       
   556                 }
       
   557             else
       
   558                 {
       
   559                 iStatus = KErrNone;
       
   560                 User::LeaveIfError( err );
       
   561                 }
       
   562             break;
       
   563             }
       
   564         case EOptListenForDisconnection:
       
   565             {
       
   566             INFO("EOptListenForDisconnection");
       
   567             TInt err( iStatus.Int() );
       
   568             if ( KErrNone != err )
       
   569                 {
       
   570                 INFO_1("Error status %d", err);
       
   571                 iFSM.Input(
       
   572                             EPDEIfTVOutConfig,
       
   573                             EIfTVOutConfigEventCableStatusListenFailed );
       
   574                 }
       
   575             else if ( iTvConfig->HdmiCableConnected() )
       
   576                 {
       
   577                 // This should not come at all, because waiting for the first occurred
       
   578                 // disconnection since entering this state.
       
   579                 ListenForDisconnection();
       
   580                 }
       
   581             else
       
   582                 {
       
   583                 iFSM.Input(
       
   584                         EPDEIfTVOutConfig,
       
   585                         EIfTVOutConfigEventCableDisconnected );
       
   586                 }
       
   587             break;
       
   588             }
       
   589         case EOptStartListenForSettingsChanges:
       
   590             {
       
   591             INFO("EOptStartListenForSettingsChanges");
       
   592             iStatus = KRequestPending;
       
   593             TInt err = iTvConfig->SettingsChangedListener( iStatus );
       
   594             if ( KErrNone != err )
       
   595                 {
       
   596                 INFO_1("iTvConfig->SettingsChangedListener( iStatus ) error status %i", err);
       
   597                 iStatus = KErrNone;
       
   598                 iFSM.Input(
       
   599                         EPDEIfTVOutConfig,
       
   600                         EIfTVOutConfigEventSettingsChangesListenFailed );
       
   601                 }
       
   602             else
       
   603                 {
       
   604                 SetActive();
       
   605                 iNextOpt = EOptListenForSettingsChanges;
       
   606                 iFSM.Input(
       
   607                         EPDEIfTVOutConfig,
       
   608                         EIfTVOutConfigEventSettingsChangesListenStarted );
       
   609                 }
       
   610             break;
       
   611             }
       
   612         case EOptListenForSettingsChanges:
       
   613             {
       
   614             INFO("EOptListenForSettingsChanges");
       
   615             iNextOpt = EOptIdle;
       
   616             TInt err( iStatus.Int() );
       
   617             if ( KErrNone != err )
       
   618                 {
       
   619                 INFO_1("Error status %d", err);
       
   620                 iFSM.Input(
       
   621                         EPDEIfTVOutConfig,
       
   622                         EIfTVOutConfigEventSettingsChangesListenFailed );
       
   623                 }
       
   624             else
       
   625                 {
       
   626                 iFSM.Input(
       
   627                         EPDEIfTVOutConfig,
       
   628                         EIfTVOutConfigEventSettingsChanged );
       
   629                 }
       
   630             break;
       
   631             }
       
   632         default:
       
   633             INFO_1("Default case, iNextOpt = %i", iNextOpt);
       
   634             break;
       
   635         }
       
   636     }
       
   637 
       
   638 // ----------------------------------------------------------------------------
       
   639 // CTVOutConfigForHDMI::RunError
       
   640 //
       
   641 // ----------------------------------------------------------------------------
       
   642 //
       
   643 TInt CTVOutConfigForHDMI::RunError( TInt aError )
       
   644     {
       
   645     FUNC_LOG;
       
   646 
       
   647     switch ( iNextOpt )
       
   648         {
       
   649         case EOptStartListenHdmiCable:
       
   650         case EOptStartListenForDisconnection:
       
   651             {
       
   652             iFSM.Input( 
       
   653                         EPDEIfTVOutConfig,
       
   654                         EIfTVOutConfigEventCableStatusListenFailed );
       
   655             }
       
   656             break;
       
   657           
       
   658         default:
       
   659             break;
       
   660         }
       
   661     
       
   662     return KErrNone; 
       
   663     }
       
   664 
       
   665 // ----------------------------------------------------------------------------
       
   666 // CTVOutConfigForHDMI::OneShotTimeout
       
   667 //
       
   668 // ----------------------------------------------------------------------------
       
   669 //
       
   670 void CTVOutConfigForHDMI::OneShotTimeout()
       
   671     {
       
   672     iNextOpt = iTimeOutReason;
       
   673     iTimeOutReason = EOptIdle;
       
   674     RunL();
       
   675     }