accessoryservices/accessoryremotecontrol/tsrc/remcontestcontrol/remcontestcontrolplugin/src/remconcontrol.cpp
changeset 0 4e1aa6a622a0
child 21 ccb4f6b3db21
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/accessoryremotecontrol/tsrc/remcontestcontrol/remcontestcontrolplugin/src/remconcontrol.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,575 @@
+/*
+* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  This module contains the implementation of CTFFactory class 
+*	             member functions.
+*
+*/
+
+
+// INCLUDE FILES
+#include "siftrace.h"
+#include "remconcontrol.h"
+#include "remconcontroltestcase.h"
+#include "ctffactory.h"
+#include "tftypes.h"
+#include "accremconpstypes.h"
+
+DECLARE_TRACE_ASSERT
+
+
+_LIT_SECURITY_POLICY_PASS( KWritePolicy );
+_LIT_SECURITY_POLICY_PASS( KReadPolicy );
+
+static TTFRemConkeyEvent MapRemConToTfKey( TRemConCoreApiOperationId aOperationId )
+    {
+    if ( aOperationId == ERemConCoreApiVolumeUp ) return ETFRemConEvent_VolumeUp;
+    if ( aOperationId == ERemConCoreApiVolumeDown ) return ETFRemConEvent_VolumeDown;
+    if ( aOperationId == ERemConCoreApiStop ) return ETFRemConEvent_CodeStop;
+    if ( aOperationId == ERemConCoreApiFastForward ) return ETFRemConEvent_CodeForward;
+    if ( aOperationId == ERemConCoreApiRewind ) return ETFRemConEvent_CodeBack;
+    if ( aOperationId == ERemConCoreApiForward ) return ETFRemConEvent_CodeForward;
+    if ( aOperationId == ERemConCoreApiBackward ) return ETFRemConEvent_CodeBack;
+    if ( aOperationId == ERemConCoreApiPausePlayFunction ) return  ETFRemConEvent_CoreApiPlaybackSpeedX1; //event not used in real implementation
+    if ( aOperationId == ERemConCoreApiMute )return ETFRemConEvent_Mute;
+
+    return ETFRemConEvent_None;
+    }
+
+
+MRemConControl* GetRemConControl( void )
+    {
+    CTFStub* stub = CTFFactory::Stub( KTFStubTypeRemConControl );
+    return STATIC_CAST( CRemConControl*, stub );
+    }
+
+MRemConControl::MRemConControl( void )
+    {
+    }
+    
+    
+MRemConControl::~MRemConControl( void )
+    {
+    }
+
+
+CRemConControl::CRemConControl( void )
+: CTFRemoteStub( KTFStubTypeRemConControl )
+    {
+    
+    iKeyEvent  = ETFRemConEvent_None;
+    iParameter = 0; 
+    iError     = 0;   
+    
+    iTargetInterfaceSelector = NULL; 
+    iPocTarget               = NULL;
+    iCoreTarget              = NULL;
+    iSyncTarget              = NULL;    
+    iCallTarget = NULL;
+    		
+    }
+    
+//lint -e1740 Pointer not directly deleted by destructor
+CRemConControl::~CRemConControl( void )
+    {
+    Finalize();
+    COMPONENT_TRACE( ( _L( "CRemConControl::~CRemConControl()" ) ) );
+    }
+//lint +e1740    
+
+
+void CRemConControl::InitializeL( void )
+    {
+    
+    TInt retval = KErrNone;
+    retval = RProperty::Define(KTFRemConTestProperty, KTFRemConTriggerCmdKey, RProperty::EByteArray, KReadPolicy, KWritePolicy);    
+	if(retval != KErrAlreadyExists)
+    	User::LeaveIfError(retval);           
+	
+    retval = RProperty::Define(KTFRemConTestProperty, KTFRemConTriggerNotifyCmdKey, RProperty::EByteArray, KReadPolicy, KWritePolicy);    
+	if(retval != KErrAlreadyExists)
+    	User::LeaveIfError(retval);       	
+	
+    User::LeaveIfError(iSubscribe.Attach(KTFRemConTestProperty, KTFRemConTriggerCmdKey));       
+    	
+	TInt retval1 = KErrNone;
+    retval1 = RProperty::Define(KPSUidCtsyCallInformation, KCTsyCallState, RProperty::EInt, KReadPolicy, KWritePolicy);    
+	if(retval1 != KErrAlreadyExists)
+		User::LeaveIfError(retval);           
+    
+    if ( iCmdReceiverFromStub == NULL)
+        {
+        iCmdReceiverFromStub = CRemConPSPCHObserver::NewL();
+	    iCmdReceiverFromStub->Start();    
+        }
+
+    retval = RProperty::Define(KTFRemConTestProperty, KTFRemConClientKey, RProperty::EByteArray, KReadPolicy, KWritePolicy);    
+    
+    if( retval != KErrAlreadyExists )
+        {
+        User::LeaveIfError(retval);
+        }
+    
+    COMPONENT_TRACE( ( _L( "CRemConControl::InitializeL - return" ) ) );
+    }
+
+void CRemConControl::SwapToNormalHandlerL( void )
+    {
+		
+	 if(iTargetInterfaceSelector == NULL)
+         {
+	     iTargetInterfaceSelector  = CRemConInterfaceSelector::NewL();
+         
+         if(iPocTarget == NULL)
+             {
+             iPocTarget = CRemConPoc::NewL(iTargetInterfaceSelector);
+             }
+        				
+         if(iSyncTarget == NULL)
+             {
+        	 iSyncTarget = CRemConSync::NewL(iTargetInterfaceSelector);
+        	 }
+         
+         if(iCallTarget == NULL)
+             {
+             iCallTarget = CRemConCall::NewL(iTargetInterfaceSelector);
+             }
+
+         if(iCoreTarget == NULL)
+            {
+            iCoreTarget = CRemConCore::NewL(iTargetInterfaceSelector);
+            }
+        
+         if( !iTargetInterfaceSelector->ControllerOpened() )
+            {
+            iTargetInterfaceSelector->OpenControllerL();
+            }
+            if( !iTargetInterfaceSelector->TargetOpened() )
+            {
+            iTargetInterfaceSelector->OpenTargetL();		 
+            }
+        }
+    }
+
+void CRemConControl::Finalize( void )
+    {
+    COMPONENT_TRACE( ( _L( "CRemConControl::Finalize()" ) ) );
+    
+       if ( iPocTarget != NULL )
+    		{
+    		delete iPocTarget;
+    		iPocTarget = NULL;
+    		}
+    		
+		if ( iCoreTarget != NULL )
+    		{
+    		delete iCoreTarget;
+    		iCoreTarget = NULL;
+    		}
+		
+		if ( iSyncTarget != NULL )
+    		{
+    		delete iSyncTarget;
+    		iSyncTarget = NULL;
+    		}
+		
+		if ( iCallTarget != NULL )
+		    {
+		    delete iCallTarget;
+		    iCallTarget = NULL;
+		    }
+	
+        if ( iCmdReceiverFromStub != NULL)
+    	    {
+    	    iCmdReceiverFromStub->Cancel();
+    		delete iCmdReceiverFromStub;
+    		iCmdReceiverFromStub = NULL;
+    		}    	    			    
+
+        if ( iTargetInterfaceSelector != NULL )
+	    	{
+	    	delete iTargetInterfaceSelector;
+	    	iTargetInterfaceSelector = NULL;
+	    	}
+        
+        if ( iAudioClientProc.Handle() )
+            {
+            iAudioClientProc.Kill( KErrNone );
+            }
+        
+        //Just increase test coverage!
+	    User::After(1000000);
+	    
+	    COMPONENT_TRACE( ( _L( "CRemConControl::Finalize() - Success" ) ) );
+	    }
+
+void CRemConControl::DeleteInstances( void )
+    {
+    COMPONENT_TRACE( ( _L( "CRemConControl::Finalize()" ) ) );
+		
+		if ( iPocTarget != NULL )
+    		{
+    		delete iPocTarget;
+    		iPocTarget = NULL;
+    		}
+    		
+		if ( iCoreTarget != NULL )
+    		{
+    		delete iCoreTarget;
+    		iCoreTarget = NULL;
+    		}
+		
+		if ( iSyncTarget != NULL )
+    		{
+    		delete iSyncTarget;
+    		iSyncTarget = NULL;
+    		}
+		
+		if( iCallTarget != NULL )
+		    {
+		    delete iCallTarget;
+		    iCallTarget = NULL;
+		    }
+	    }
+
+
+// This method calls API of module under test.
+void CRemConControl::CallApiFunctionL( TRemConControlTestCaseState& aParameter )
+    {
+    //COMPONENT_TRACE( ( _L( "CRemConControl::CallApiFunctionL(%d, %d, %d)" ), aParameter.iDosFunction, aParameter.iArg1, aParameter.iArg2 ) );
+    
+    TInt retval = KTFErrRemConEventMissing;
+    switch ( aParameter.iFunction )
+        {
+
+       	case ETFRemConEvent_NormalHandler:
+            	{
+            	    SwapToNormalHandlerL();
+    				retval = KErrNone;
+    			break;
+            	}
+            	                           
+    	case ETFRemConEvent_CmdHandler:
+            	{            	 
+    				retval = KErrNone;
+    			break;
+            	}
+        
+        case ETFRemCon_Subscribe:
+        	{
+        	
+		    	TPckgBuf<TRemConStubPSData> keyDatabuf;		
+		    	TRemConStubPSData psData;
+				psData.iKeyEvent     = aParameter.iKeyEvents;
+				psData.iOperationId  = aParameter.iArg1;
+				psData.iData.Copy( aParameter.iArg2 );
+				psData.iUseConverter = aParameter.iUseConverter;
+				keyDatabuf = psData;
+	    		retval = iSubscribe.Set(KTFRemConTestProperty, KTFRemConTriggerCmdKey,keyDatabuf);
+	    		retval = KErrNone;
+    
+	  		break;
+        	}         
+        	
+        case ETFRemCon_NotifyCommandSubscribe:
+        	{
+		    	TPckgBuf<TRemConStubPSData> keyDatabuf;		
+		    	TRemConStubPSData psData;
+				psData.iKeyEvent     = aParameter.iKeyEvents;
+				psData.iOperationId  = aParameter.iArg1;
+				psData.iData.Copy( aParameter.iArg2 );
+				psData.iUseConverter = aParameter.iUseConverter;
+				keyDatabuf = psData;
+	    		retval = RProperty::Set(KTFRemConTestProperty, KTFRemConTriggerNotifyCmdKey,keyDatabuf);
+	    		retval = KErrNone;
+    
+	  		break;
+        	}             
+		case ETFRemCon_PocButtonDownResponse:
+        	{
+				iPocTarget->APOCButtonDownResponse();
+				retval = KErrNone;
+			break;
+        	}
+
+		case ETFRemCon_PocButtonUpResponse:
+        	{
+				iPocTarget->APOCButtonUpResponse();
+				retval = KErrNone;
+			break;
+        	}
+		case ETFRemCon_SyncButtonResponse:
+        	{
+        		iSyncTarget->SynchronizeResponse();				
+        		retval = KErrNone;				
+			break;
+        	}
+       	
+       	case ETFRemCon_AddressOutgoingCommand:
+        	{
+        		iCoreTarget->Play();				
+        		retval = KErrNone;				
+			break;
+        	}
+
+       	case ETFRemCon_PermitOutgoingCommand:
+        	{        	
+        		iCoreTarget->Stop();				
+        		retval = KErrNone;				
+			break;
+        	}
+       	
+       	case ETFRemCon_CancelOutgoingCommand:
+        	{        	
+        		iCoreTarget->Cancel();				        		
+        		retval = KErrNone;				
+			break;
+        	}
+
+       	case ETFRemConEvent_CheckEvent:
+        	{   
+        	    retval = KErrNone;
+        	           	
+        		if( aParameter.iExpectedKeyEvent != iKeyEvent )
+        		    {
+        		    retval = KErrNotFound;
+        		    }
+                
+                if( aParameter.iArg1 != iParameter )
+                    {
+                    retval = KErrArgument;
+                    }
+                
+                ResetEventResult();                    
+                
+			break;
+        	}
+
+        case ETFRemConEvent_CheckResponse:
+        	{        	
+        		retval = KErrNone;
+        	           	
+        		if( aParameter.iExpectedKeyEvent != iKeyEvent )
+        		    {
+        		    retval = KErrNotFound;
+        		    }
+                
+                if( aParameter.iArg1 != iParameter )
+                    {
+                    retval = KErrArgument;
+                    }
+                
+                if( iError != KErrNone )    
+                    {
+                    retval = iError;
+                    }
+
+                ResetEventResult();                    
+                
+			break;
+        	}
+        case ETFRemConEvent_CheckOutgoingCommandResponse:
+        	{        	
+        		retval = KErrNone;
+        	           	
+        		if( aParameter.iExpectedKeyEvent != iKeyEvent && iKeyEvent != ETFRemConEvent_CoreApiPlaybackSpeedX1 )
+        		    {
+        		    retval = KErrNotFound;
+        		    }
+                
+                if( aParameter.iArg1 != iParameter && iParameter != ERemConCoreApiButtonClick )
+                    {
+                    retval = KErrArgument;
+                    }
+                
+                if( iError != KErrNone )    
+                    {
+                    retval = iError;
+                    }
+
+                ResetEventResult();                    
+                
+			break;
+        	}
+        	
+        case ETFRemConEvent_CheckCmdSource:
+            {
+            TRemConExtCmdSource source;
+            retval = KErrNone;
+            
+            iPocTarget->GetCommandSourceInfo( source );
+            
+            switch( source )
+                {
+                case ERemConExtCmdSourceBluetooth:
+                    {
+                    COMPONENT_TRACE( ( _L( "CRemConControl::CallApiFunctionL() ETFRemConEvent_CheckCmdSource - Bluetooth" ) ) );
+                    break;
+                    }
+                case ERemConExtCmdSourceWired:
+                    {
+                    COMPONENT_TRACE( ( _L( "CRemConControl::CallApiFunctionL() ETFRemConEvent_CheckCmdSource - Wired" ) ) );
+                    break;
+                    }
+                default:
+                    {
+                    COMPONENT_TRACE( ( _L( "CRemConControl::CallApiFunctionL() ETFRemConEvent_CheckCmdSource - UnKnown" ) ) );
+                    break;
+                    }
+                }
+            if( aParameter.iArg1 != source )
+                {
+                retval = KErrGeneral;
+                }
+                
+            // For coverage
+            if( retval == KErrNone )
+            {
+            	iCallTarget->GetCommandSourceInfo( source );
+	            if( source != ERemConExtCmdSourceUnKnown )
+	              {
+	              retval = KErrGeneral;
+	              }
+            }
+              
+            if( retval == KErrNone )
+            {
+	            iSyncTarget->GetCommandSourceInfo( source );
+	            if( source != ERemConExtCmdSourceUnKnown )
+	              {
+	              retval = KErrGeneral;
+	              }
+            }
+            
+            break;
+            }
+            
+        	case ETFRemConEvent_SetCallState:
+        	{        	
+        		retval = iSubscribe.Set(KPSUidCtsyCallInformation, KCTsyCallState, aParameter.iArg1);
+        		retval = KErrNone;				
+			break;
+        	}
+        	
+        case ETFRemConEvent_LoadPCH_NoAccFW:
+        	{
+        	if( !iTargetInterfaceSelector )
+        		{
+        		iTargetInterfaceSelector = CRemConInterfaceSelector::NewL();
+        		}        	        		
+        	retval = KErrNone;
+        	}
+        	break;                
+
+        case ETFRemCon_LaunchAudioClient:
+            // reset return channel
+            TRemConClientKeyDataBuf keyDatabuf;     
+            TRemConClientKeyData keyData;
+            keyData.iOperationId = ERemConCoreApiSelect; // if not changed by audio client maps to ETRemConEvent_None 
+            keyData.iButtonAct = ERemConCoreApiButtonPress; 
+            keyDatabuf = keyData;
+            
+            retval = RProperty::Set( KTFRemConTestProperty, KTFRemConClientKey, keyDatabuf );
+            
+            if ( retval == KErrNone )
+                {
+                retval = iAudioClientProc.Create( _L("audioclientstub.exe"), KNullDesC );
+                
+                // wait for start
+                if ( retval == KErrNone )
+                    {
+                    TRequestStatus status;
+                    iAudioClientProc.Rendezvous( status );
+                    iAudioClientProc.Resume();
+                    User::WaitForRequest( status );
+                    retval = status.Int();
+                    }
+                }
+            break;
+            
+        case ETFRemCon_CloseAudioClient:
+            if ( iAudioClientProc.Handle() )
+                {
+                iAudioClientProc.Kill( KErrNone );
+                retval = KErrNone;
+                }
+            break;
+
+        case ETFRemCon_CheckClientKey:
+            TRemConClientKeyDataBuf keyDataBuf;
+            retval = RProperty::Get( KTFRemConTestProperty, KTFRemConClientKey, keyDataBuf );
+            if ( retval == KErrNone )
+                {
+                if ( aParameter.iExpectedKeyEvent != MapRemConToTfKey( keyDataBuf().iOperationId ) )
+                    {
+                    retval = KErrNotFound;
+                    }
+                
+                if( aParameter.iArg1 != keyDataBuf().iButtonAct )
+                    {
+                    retval = KErrArgument;
+                    }
+                
+                }
+            break;
+            
+        default:
+	        //TRACE_ASSERT_FALSE();
+            break;
+        }
+    User::LeaveIfError( retval );
+    }
+
+
+void CRemConControl::ResetEventResult()
+    {
+    //Reset values   
+    iKeyEvent  = ETFRemConEvent_None;
+    iParameter = 0; 
+    iError     = 0;   
+    }
+// This method is used by DsyTest to ask the current test case id. Call from 
+// DsyTest to this method is delivered by SAA test framework's client server.
+void CRemConControl::ProcessMessageAndCompleteL( const RMessage2& aMessage )
+    {    
+    aMessage.Complete( KErrNone );
+    }
+
+// This method can be called by SAA test framework when the method above is 
+// completed. 
+void CRemConControl::MessageCompleteL( TInt /*aResult*/ )
+    {
+    }
+
+void CRemConControl::NotifyKeyEvent( TInt aEvent, TInt aParameter ) 
+{
+	COMPONENT_TRACE( ( _L( "REMCONTESTCONTROL -  CRemConControl::NotifyKeyEvent( %d, %d )" ), aEvent, aParameter ) );
+	
+	iKeyEvent      = aEvent; 
+	iParameter     = aParameter;
+
+    COMPONENT_TRACE( ( _L( "REMCONTESTCONTROL - CRemConControl::NotifyKeyEvent - return" ) ) );   	
+}
+
+void CRemConControl::CompleteKeyEventResponse( TInt aEvent, TInt aParam, TInt aError ) 
+{
+	COMPONENT_TRACE( ( _L( "REMCONTESTCONTROL -  CRemConControl::CompleteKeyEventResponse( %d, %d, %d )" ), aEvent, aParam, aError ) );
+	
+    iKeyEvent      = aEvent; 
+	iParameter     = aParam;
+	iError         = aError;
+
+    COMPONENT_TRACE( ( _L( "REMCONTESTCONTROL - CRemConControl::NotifyKeyEvent - return" ) ) );   	
+}
+
+