photosgallery/viewframework/tvout/src/glxtvconnectionmonitor.cpp
branchRCL_3
changeset 17 a60acebbbd9d
parent 15 191387a8b767
child 18 78ad99c24f08
equal deleted inserted replaced
15:191387a8b767 17:a60acebbbd9d
    27 //  EXTERNAL INCLUDES
    27 //  EXTERNAL INCLUDES
    28 
    28 
    29 //  INTERNAL INCLUDES
    29 //  INTERNAL INCLUDES
    30 
    30 
    31 #include <glxlog.h>
    31 #include <glxlog.h>
       
    32 #include <glxtracer.h>
    32 #include <glxpanic.h>
    33 #include <glxpanic.h>
    33 #include "glxtv.h"
    34 #include "glxtv.h"
    34 #include <AccPolGenericIdDefinitions.h>
    35 #include <AccPolGenericIdDefinitions.h>
    35 #include <AccPolSubblockNameArray.h>
    36 #include <AccPolSubblockNameArray.h>
    36 //-----------------------------------------------------------------------------
    37 //-----------------------------------------------------------------------------
    38 //-----------------------------------------------------------------------------
    39 //-----------------------------------------------------------------------------
    39 //
    40 //
    40 CGlxTvConnectionMonitor* CGlxTvConnectionMonitor::NewL(
    41 CGlxTvConnectionMonitor* CGlxTvConnectionMonitor::NewL(
    41                                MGlxTvConnectionObserver& aConnectionObserver ) 
    42                                MGlxTvConnectionObserver& aConnectionObserver ) 
    42     {
    43     {
    43     GLX_LOG_INFO("CGlxTvConnectionMonitor::NewL");
    44     TRACER("CGlxTvConnectionMonitor::NewL");
    44     CGlxTvConnectionMonitor* self = new (ELeave) 
    45     CGlxTvConnectionMonitor* self = new (ELeave) 
    45                 CGlxTvConnectionMonitor( aConnectionObserver );
    46                 CGlxTvConnectionMonitor( aConnectionObserver );
    46     CleanupStack::PushL( self );
    47     CleanupStack::PushL( self );
    47     self->ConstructL();
    48     self->ConstructL();
    48     CleanupStack::Pop( self );
    49     CleanupStack::Pop( self );
    54 // Destructor
    55 // Destructor
    55 //-----------------------------------------------------------------------------
    56 //-----------------------------------------------------------------------------
    56 //
    57 //
    57 CGlxTvConnectionMonitor::~CGlxTvConnectionMonitor()
    58 CGlxTvConnectionMonitor::~CGlxTvConnectionMonitor()
    58     {
    59     {
    59     GLX_LOG_INFO("~CGlxTvConnectionMonitor");
    60     TRACER("~CGlxTvConnectionMonitor");
    60     Cancel();
    61     Cancel();
    61     iTvAccCon.CloseSubSession();
    62     iTvAccCon.CloseSubSession();
    62     iTvAccServer.Disconnect();
    63     iTvAccServer.Disconnect();
    63     }
    64     }
    64 
    65 
    65 
    66 
    66 //-----------------------------------------------------------------------------
    67 //-----------------------------------------------------------------------------
    67 // Default C++ constructor
    68 // Default C++ constructor
    68 //-----------------------------------------------------------------------------
    69 //-----------------------------------------------------------------------------
    69 //
    70 //
    70 CGlxTvConnectionMonitor::CGlxTvConnectionMonitor
    71 CGlxTvConnectionMonitor::CGlxTvConnectionMonitor(
    71                            ( MGlxTvConnectionObserver& aConnectionObserver ) 
    72 		MGlxTvConnectionObserver& aConnectionObserver) :
    72                             :CActive(EPriorityStandard), 
    73 	CActive(EPriorityStandard), iConnectionObserver(aConnectionObserver),
    73                              iConnectionObserver ( aConnectionObserver )
    74 			iTvOutConnectionState(EFalse), iHDMIConnectionState(EFalse)
    74     {
    75 
    75     GLX_LOG_INFO("CGlxTvConnectionMonitor");
    76 	{
    76     CActiveScheduler::Add( this );
    77 	TRACER("CGlxTvConnectionMonitor");
    77     }
    78 	CActiveScheduler::Add(this);
       
    79 	}
    78 
    80 
    79 
    81 
    80 //-----------------------------------------------------------------------------
    82 //-----------------------------------------------------------------------------
    81 // Symbian second phase constructor
    83 // Symbian second phase constructor
    82 //-----------------------------------------------------------------------------
    84 //-----------------------------------------------------------------------------
    83 //
    85 //
    84 void CGlxTvConnectionMonitor::ConstructL()
    86 void CGlxTvConnectionMonitor::ConstructL()
    85     {
    87     {
    86     GLX_LOG_INFO("CGlxTvConnectionMonitor::ConstructL");
    88     TRACER("CGlxTvConnectionMonitor::ConstructL");
    87     User::LeaveIfError(iTvAccServer.Connect());
    89     User::LeaveIfError(iTvAccServer.Connect());
    88 	User::LeaveIfError(iTvAccCon.CreateSubSession(iTvAccServer));
    90 	User::LeaveIfError(iTvAccCon.CreateSubSession(iTvAccServer));
    89 	User::LeaveIfError(iTvAccCon.GetAccessoryConnectionStatus(iCurrentAccArray));
    91 
    90 	for (int i = 0; i < iCurrentAccArray.Count(); i++)
    92 	UpdateConnectionStatusL();
    91 		{
       
    92 		iTvOutConnectionState
       
    93 				= (iCurrentAccArray.GetGenericIDL(i).PhysicalConnectionCaps()
       
    94 						== KPCWired);
       
    95 		iHDMIConnectionState
       
    96 				= (iCurrentAccArray.GetGenericIDL(i).PhysicalConnectionCaps()
       
    97 						== KPCHDMI);
       
    98 		}
       
    99 	IssueRequest();  
    93 	IssueRequest();  
   100     }
    94     }
   101 
    95 
   102 //-----------------------------------------------------------------------------
    96 //-----------------------------------------------------------------------------
   103 // From class CActive.
    97 // From class CActive.
   104 // Receive notification of change in the connection state
    98 // Receive notification of change in the connection state
   105 //-----------------------------------------------------------------------------
    99 //-----------------------------------------------------------------------------
   106 //
   100 //
   107 void CGlxTvConnectionMonitor::RunL()
   101 void CGlxTvConnectionMonitor::RunL()
   108     {
   102     {
   109     GLX_LOG_INFO("CGlxTvConnectionMonitor::RunL");
   103     TRACER("CGlxTvConnectionMonitor::RunL");
   110     // Check for errors
   104     // Check for errors
   111     User::LeaveIfError( iStatus.Int() );
   105     User::LeaveIfError( iStatus.Int() );
   112     // Notify observers
   106     // Notify observers
   113     IssueNotificationL();
   107     IssueNotificationL();
   114     // Request the next event
   108     // Request the next event
   121 // DoCancel
   115 // DoCancel
   122 //-----------------------------------------------------------------------------
   116 //-----------------------------------------------------------------------------
   123 //
   117 //
   124 void CGlxTvConnectionMonitor::DoCancel()
   118 void CGlxTvConnectionMonitor::DoCancel()
   125     {
   119     {
   126     GLX_LOG_INFO("CGlxTvConnectionMonitor::DoCancel");
   120     TRACER("CGlxTvConnectionMonitor::DoCancel");
   127     iTvAccCon.CancelGetAccessoryConnectionStatus();
   121     iTvAccCon.CancelGetAccessoryConnectionStatus();
   128     iTvAccCon.CancelNotifyAccessoryConnectionStatusChanged();
   122     iTvAccCon.CancelNotifyAccessoryConnectionStatusChanged();
   129     }
   123     }
   130 
   124 
   131 
   125 
   146 // IsConnected
   140 // IsConnected
   147 //-----------------------------------------------------------------------------
   141 //-----------------------------------------------------------------------------
   148 //
   142 //
   149 TBool CGlxTvConnectionMonitor::IsConnected() const
   143 TBool CGlxTvConnectionMonitor::IsConnected() const
   150     {
   144     {
   151     GLX_LOG_INFO("CGlxTvConnectionMonitor::IsConnected");
   145     TRACER("CGlxTvConnectionMonitor::IsConnected");
   152     GLX_LOG_INFO1("CGlxTvConnectionMonitor::IsConnected iTvOutConnectionState=%d",iTvOutConnectionState);
   146     GLX_LOG_INFO1("CGlxTvConnectionMonitor::IsConnected iTvOutConnectionState=%d",iTvOutConnectionState);
   153     return iTvOutConnectionState;
   147     return iTvOutConnectionState;
   154     }
   148     }
   155 
   149 
   156 //-----------------------------------------------------------------------------
   150 //-----------------------------------------------------------------------------
   158 // IsConnected
   152 // IsConnected
   159 //-----------------------------------------------------------------------------
   153 //-----------------------------------------------------------------------------
   160 //
   154 //
   161 TBool CGlxTvConnectionMonitor::IsHDMIConnected() const
   155 TBool CGlxTvConnectionMonitor::IsHDMIConnected() const
   162     {
   156     {
   163     GLX_LOG_INFO("CGlxTvConnectionMonitor::IsHDMIConnected");
   157     TRACER("CGlxTvConnectionMonitor::IsHDMIConnected");
   164     GLX_LOG_INFO1("CGlxTvConnectionMonitor::IsHDMIConnected iHDMIConnectionState=%d",iHDMIConnectionState);
   158     GLX_LOG_INFO1("CGlxTvConnectionMonitor::IsHDMIConnected iHDMIConnectionState=%d",iHDMIConnectionState);
   165     return iHDMIConnectionState;
   159     return iHDMIConnectionState;
   166     }
   160     }
   167 
   161 
   168 //-----------------------------------------------------------------------------
   162 //-----------------------------------------------------------------------------
   169 // Request accessory server events
   163 // Request accessory server events
   170 //-----------------------------------------------------------------------------
   164 //-----------------------------------------------------------------------------
   171 //
   165 //
   172 void CGlxTvConnectionMonitor::IssueRequest()
   166 void CGlxTvConnectionMonitor::IssueRequest()
   173     {
   167     {
   174     GLX_LOG_INFO("CGlxTvConnectionMonitor::IssueRequest");
   168     TRACER("CGlxTvConnectionMonitor::IssueRequest");
   175     if (!IsActive()) // required for testing
   169     if (!IsActive()) // required for testing
   176         {
   170         {
   177         iTvAccCon.NotifyAccessoryConnectionStatusChanged(iStatus,iCurrentAccArray);
   171         iTvAccCon.NotifyAccessoryConnectionStatusChanged(iStatus,iCurrentAccArray);
   178         SetActive(); 
   172         SetActive(); 
   179         }
   173         }
   182 //-----------------------------------------------------------------------------
   176 //-----------------------------------------------------------------------------
   183 // Sends notification to observers if TV Out is connected
   177 // Sends notification to observers if TV Out is connected
   184 //-----------------------------------------------------------------------------
   178 //-----------------------------------------------------------------------------
   185 //
   179 //
   186 void CGlxTvConnectionMonitor::IssueNotificationL()
   180 void CGlxTvConnectionMonitor::IssueNotificationL()
   187     {
   181 	{
   188 	GLX_LOG_INFO("CGlxTvConnectionMonitor::IssueNotificationL");
   182 	TRACER("CGlxTvConnectionMonitor::IssueNotificationL");
   189 	TBool previousTvState = iTvOutConnectionState;
   183 	TBool previousTvState = iTvOutConnectionState;
   190 	TBool previousHDMIState = iHDMIConnectionState;
   184 	TBool previousHDMIState = iHDMIConnectionState;
   191 	GLX_LOG_INFO2("previousTvState = %d , previousHDMIState = %d",
   185 
   192 			previousTvState,previousHDMIState);
   186 	// Update the connection status
   193 
   187 	UpdateConnectionStatusL();
   194 	//gets the TV status in to the iCurrentAccArray and haves the Latest Accesory in 0-index
   188 
   195 	User::LeaveIfError(iTvAccCon.GetAccessoryConnectionStatus(iCurrentAccArray));
   189 	// trigger tvstatus change only when there is actually a change the in the connection and not 
   196 
   190 	// for spurious events
   197 	CAccPolSubblockNameArray* nameArray = CAccPolSubblockNameArray::NewL();
       
   198 	CleanupStack::PushL(nameArray);
       
   199 
       
   200 	//
       
   201 	//  Get the number of currently connected accessories
       
   202 	//  Loop through each connected accessory looking for
       
   203 	//  the desired capabilities
       
   204 	//
       
   205 	iTvOutConnectionState = EFalse;
       
   206 	iHDMIConnectionState = EFalse;
       
   207 	const TInt count = iCurrentAccArray.Count();
       
   208 	for (TInt index = 0; index < count; index++)
       
   209 		{
       
   210 		TAccPolGenericID genId = iCurrentAccArray.GetGenericIDL(index);
       
   211 		//  Get all supported capabilities for this connected accessory.
       
   212 		iTvAccCon.GetSubblockNameArrayL(genId, *nameArray);
       
   213 		//  Check if this connected accessory supports TV-Out capabality.
       
   214 		if (nameArray->HasName(KAccVideoOut))
       
   215 			{
       
   216 			GLX_LOG_INFO("TV-Out Capabilities Exist");
       
   217 			TAccPolNameRecord nameRecord;
       
   218 			nameRecord.SetNameL(KAccVideoOut);
       
   219 			TAccValueTypeTInt value;
       
   220 			iTvAccCon.GetValueL(genId, nameRecord, value);
       
   221 			if (value.iValue == EAccVideoOutEHDMI)
       
   222 				{
       
   223 				GLX_LOG_INFO("HDMI is connected Capabilities Exist");
       
   224 				iHDMIConnectionState = ETrue;
       
   225 				break;
       
   226 				}
       
   227 			else if (value.iValue == EAccVideoOutCVideo)
       
   228 				{
       
   229 				GLX_LOG_INFO("TV is connected Capabilities Exist");
       
   230 				iTvOutConnectionState = ETrue;
       
   231 				break;
       
   232 				}
       
   233 			}
       
   234 
       
   235 		}
       
   236 	CleanupStack::PopAndDestroy(nameArray);
       
   237 
       
   238 	if (previousTvState != iTvOutConnectionState || previousHDMIState
   191 	if (previousTvState != iTvOutConnectionState || previousHDMIState
   239 			!= iHDMIConnectionState)
   192 			!= iHDMIConnectionState)
   240 		{
   193 		{
   241 		GLX_LOG_INFO("CGlxTvConnectionMonitor::IssueNotificationL -"
   194 		GLX_LOG_INFO("CGlxTvConnectionMonitor::IssueNotificationL - Connection Altered");
   242 				" TvConnectionStatusChanged");
       
   243 		GLX_LOG_INFO2("CurrentTvState = %d , CurrentHDMIState = %d",
       
   244 				iTvOutConnectionState,iHDMIConnectionState);
       
   245 		iConnectionObserver.HandleTvConnectionStatusChangedL();
   195 		iConnectionObserver.HandleTvConnectionStatusChangedL();
   246 		}
   196 		}
   247 	}
   197 	}
   248 
   198 
       
   199 //-----------------------------------------------------------------------------
       
   200 // UpdateConnectionStatusL()
       
   201 //-----------------------------------------------------------------------------
       
   202 //
       
   203 void CGlxTvConnectionMonitor::UpdateConnectionStatusL()
       
   204     {
       
   205     TRACER("CGlxTvConnectionMonitor::UpdateConnectionStatusL()");
       
   206 
       
   207     GLX_LOG_INFO2("CGlxTvConnectionMonitor::UpdateConnectionStatusL previousTvState = %d , previousHDMIState = %d",
       
   208             iTvOutConnectionState,iHDMIConnectionState);
       
   209 
       
   210     // reset the states
       
   211     iHDMIConnectionState = EFalse;
       
   212     iTvOutConnectionState = EFalse;
       
   213 
       
   214     //gets the TV status in to the iCurrentAccArray and haves the Latest Accesory in 0-index
       
   215     User::LeaveIfError(iTvAccCon.GetAccessoryConnectionStatus(iCurrentAccArray));
       
   216 
       
   217     CAccPolSubblockNameArray* nameArray = CAccPolSubblockNameArray::NewL();
       
   218     CleanupStack::PushL(nameArray);
       
   219 
       
   220     //  Get the number of currently connected accessories
       
   221     //  Loop through each connected accessory looking for
       
   222     //  the desired capabilities
       
   223     //
       
   224     const TInt count = iCurrentAccArray.Count();
       
   225     GLX_LOG_INFO1("CGlxTvConnectionMonitor::UpdateConnectionStatusL current count value is %d",count);
       
   226     for (TInt index = 0; index < count; index++)
       
   227         {
       
   228         const TAccPolGenericID genId = iCurrentAccArray.GetGenericIDL(index);
       
   229         //  Check if this connected accessory supports TV-Out capabality.
       
   230         GLX_LOG_INFO1("CGlxTvConnectionMonitor::UpdateConnectionStatusL current index value is %d",index);
       
   231         GLX_LOG_INFO("CGlxTvConnectionMonitor::UpdateConnectionStatusL Video Accessory Supported");
       
   232         TAccPolNameRecord nameRecord;
       
   233         nameRecord.SetNameL(KAccVideoOut);
       
   234 
       
   235         if (genId.DeviceTypeCaps( KDTAVDevice ) &&
       
   236                 genId.PhysicalConnectionCaps( KPCHDMI ))
       
   237             {
       
   238             TAccValueTypeTInt value;
       
   239             TInt err = iTvAccCon.GetValueL(genId, nameRecord, value);
       
   240             if (err ==KErrNone)
       
   241                 {
       
   242                 if (value.iValue == EAccVideoOutEHDMI)
       
   243                     {
       
   244                     GLX_LOG_INFO("CGlxTvConnectionMonitor::UpdateConnectionStatusL HDMI is connected");
       
   245                     iHDMIConnectionState = ETrue;
       
   246                     }
       
   247                 }
       
   248             }
       
   249         else if (genId.DeviceTypeCaps( KDTAVDevice ) &&
       
   250                 genId.PhysicalConnectionCaps( KPCWired ))
       
   251             {
       
   252             TAccValueTypeTInt value;
       
   253             TInt err = iTvAccCon.GetValueL(genId, nameRecord, value);
       
   254             if (err ==KErrNone)
       
   255                 {
       
   256                 if (value.iValue == EAccVideoOutCVideo)
       
   257                     {
       
   258                     GLX_LOG_INFO("CGlxTvConnectionMonitor::UpdateConnectionStatusL Tv is connected");
       
   259                     iTvOutConnectionState = ETrue;
       
   260                     }
       
   261                 }
       
   262             }
       
   263         }
       
   264     CleanupStack::PopAndDestroy(nameArray);
       
   265 
       
   266     GLX_LOG_INFO2("CGlxTvConnectionMonitor::UpdateConnectionStatusL CurrentTvState = %d , CurrentHDMIState = %d",
       
   267             iTvOutConnectionState,iHDMIConnectionState);
       
   268     }