--- /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" ) ) );
+}
+
+